00001
00002
00003
00004
00005
00006
00007
00008
00009 #ifndef __DAE_URI_H__
00010 #define __DAE_URI_H__
00011
00012 #include <string>
00013 #include <dae/daeTypes.h>
00014 #include <dae/daeElement.h>
00015 #include <dae/daeUtils.h>
00016 class DAE;
00017
00061 class DLLSPEC daeURI
00062 {
00063 private:
00064 daeElement* internalResolveElement() const;
00065
00066 public:
00072 enum ResolveState{
00074 uri_empty,
00076 uri_loaded,
00078 uri_pending,
00080 uri_success,
00082 uri_failed_unsupported_protocol,
00084 uri_failed_file_not_found,
00086 uri_failed_id_not_found,
00088 uri_failed_invalid_id,
00090 uri_resolve_local,
00092 uri_resolve_relative,
00094 uri_resolve_absolute,
00096 uri_failed_invalid_reference,
00098 uri_failed_externalization,
00100 uri_failed_missing_container,
00102 uri_failed_external_document
00103 };
00104
00105 private:
00106
00107 mutable DAE* dae;
00108
00110 std::string uriString;
00111
00113 std::string originalURIString;
00114
00116 std::string _scheme;
00118 std::string _authority;
00120 std::string _path;
00122 std::string _query;
00124 std::string _fragment;
00126 daeElement* container;
00127
00128 public:
00134 daeURI(DAE& dae);
00138 ~daeURI();
00139
00146 daeURI(DAE& dae, const std::string& URIString, daeBool nofrag = false);
00147
00154 daeURI(const daeURI& baseURI, const std::string& URIString);
00155
00160 daeURI(const daeURI& constructFromURI);
00161
00167 daeURI(daeElement& container, const std::string& uriString = "");
00168
00169
00170
00171 daeURI(DAE& dae, daeElement& container, const std::string& uriString = "");
00172
00177 DAE* getDAE() const;
00178
00179
00180 const std::string& str() const;
00181
00182 const std::string& originalStr() const;
00183
00184
00185 daeString getURI() const;
00186 daeString getOriginalURI() const;
00187
00188
00189 void set(const std::string& uriStr, const daeURI* baseURI = NULL);
00190
00191 void set(const std::string& scheme,
00192 const std::string& authority,
00193 const std::string& path,
00194 const std::string& query,
00195 const std::string& fragment,
00196 const daeURI* baseURI = NULL);
00197
00198
00199 void setURI(daeString uriStr, const daeURI* baseURI = NULL);
00200
00201
00202 const std::string& scheme() const;
00203 const std::string& authority() const;
00204 const std::string& path() const;
00205 const std::string& query() const;
00206 const std::string& fragment() const;
00207 const std::string& id() const;
00208
00209
00210
00211
00212
00213 void scheme(const std::string& scheme);
00214 void authority(const std::string& authority);
00215 void path(const std::string& path);
00216 void query(const std::string& query);
00217 void fragment(const std::string& fragment);
00218 void id(const std::string& id);
00219
00220
00221
00222 void pathComponents(std::string& dir, std::string& baseName, std::string& ext) const;
00223
00224
00225
00226 std::string pathDir() const;
00227 std::string pathFileBase() const;
00228 std::string pathExt() const;
00229 std::string pathFile() const;
00230
00231
00232 void path(const std::string& dir, const std::string& baseName, const std::string& ext);
00233
00234
00235
00236 void pathDir(const std::string& dir);
00237 void pathFileBase(const std::string& baseName);
00238 void pathExt(const std::string& ext);
00239 void pathFile(const std::string& file);
00240
00241
00242 daeString getScheme() const;
00243 daeString getProtocol() const;
00244 daeString getAuthority() const;
00245 daeString getPath() const;
00246 daeString getQuery() const;
00247 daeString getFragment() const;
00248 daeString getID() const;
00249
00250
00251 daeBool getPath(daeChar* dest, daeInt size) const;
00252
00257 daeElementRef getElement() const;
00258
00259
00260
00261 daeDocument* getReferencedDocument() const;
00262
00267 inline daeElement* getContainer() const {return(container);};
00268
00273 void setContainer(daeElement* container);
00274
00279 daeBool isExternalReference() const;
00280
00286 void copyFrom(const daeURI& from);
00287
00292 void print();
00293
00299 int makeRelativeTo(const daeURI* uri);
00300
00305 inline bool operator==(const daeURI& other) const {
00306 return uriString == other.uriString;
00307 }
00308
00309 daeURI& operator=(const daeURI& other);
00310 daeURI& operator=(const std::string& uri);
00311
00312
00313 void resolveElement();
00314 void validate(const daeURI* baseURI = NULL);
00315 ResolveState getState() const;
00316 void setState(ResolveState newState);
00317
00318 private:
00323 void reset();
00324
00328 void initialize();
00329 public:
00334 static void normalizeURIPath(char* path);
00335 };
00336
00337 class daeURIResolver;
00338 typedef daeTArray<daeURIResolver*> daeURIResolverPtrArray;
00339
00348 class DLLSPEC daeURIResolver
00349 {
00350 public:
00355 daeURIResolver(DAE& dae);
00356
00360 virtual ~daeURIResolver();
00361
00368 static void setAutoLoadExternalDocuments( daeBool load );
00369
00376 static daeBool getAutoLoadExternalDocuments();
00377
00384 virtual daeElement* resolveElement(const daeURI& uri) = 0;
00385
00390 virtual daeString getName() = 0;
00391
00392 protected:
00393 static daeBool _loadExternalDocuments;
00394 DAE* dae;
00395 };
00396
00397
00398
00399 class DLLSPEC daeURIResolverList {
00400 public:
00401 daeURIResolverList();
00402 ~daeURIResolverList();
00403
00404 daeTArray<daeURIResolver*>& list();
00405 daeElement* resolveElement(const daeURI& uri);
00406
00407 private:
00408
00409 daeURIResolverList(const daeURIResolverList& resolverList) { };
00410 daeURIResolverList& operator=(const daeURIResolverList& resolverList) { return *this; };
00411
00412 daeTArray<daeURIResolver*> resolvers;
00413 };
00414
00415
00416
00417 namespace cdom {
00418
00419 DLLSPEC bool parseUriRef(const std::string& uriRef,
00420 std::string& scheme,
00421 std::string& authority,
00422 std::string& path,
00423 std::string& query,
00424 std::string& fragment);
00425
00426
00427
00428
00429
00430
00431
00432
00433
00434
00435
00436
00437
00438
00439
00440 DLLSPEC std::string assembleUri(const std::string& scheme,
00441 const std::string& authority,
00442 const std::string& path,
00443 const std::string& query,
00444 const std::string& fragment,
00445 bool forceLibxmlCompatible = false);
00446
00447
00448
00449 DLLSPEC std::string fixUriForLibxml(const std::string& uriRef);
00450
00451
00452
00453
00454
00455
00456
00457
00458
00459
00460
00461
00462
00463
00464
00465
00466
00467 DLLSPEC std::string nativePathToUri(const std::string& nativePath,
00468 systemType type = getSystemType());
00469
00470
00471
00472
00473
00474
00475
00476
00477
00478
00479
00480
00481
00482
00483
00484
00485
00486 DLLSPEC std::string uriToNativePath(const std::string& uriRef,
00487 systemType type = getSystemType());
00488
00489 DLLSPEC std::string filePathToUri(const std::string& filePath);
00490 DLLSPEC std::string uriToFilePath(const std::string& uriRef);
00491 }
00492
00493 #endif //__DAE_URI_H__