diff --git a/mozilla/rdf/base/public/nsIRDFNode.h b/mozilla/rdf/base/public/nsIRDFNode.h index f55af4336fc..7a2acbba256 100644 --- a/mozilla/rdf/base/public/nsIRDFNode.h +++ b/mozilla/rdf/base/public/nsIRDFNode.h @@ -75,6 +75,10 @@ public: * Determine if two resources are identical. */ NS_IMETHOD EqualsResource(const nsIRDFResource* resource, PRBool* result) const = 0; + + /** + * Determine if two resources are identical. + */ NS_IMETHOD EqualsString(const char* uri, PRBool* result) const = 0; }; diff --git a/mozilla/rdf/base/public/rdf.h b/mozilla/rdf/base/public/rdf.h index 225dd00a6d5..4f003664df9 100644 --- a/mozilla/rdf/base/public/rdf.h +++ b/mozilla/rdf/base/public/rdf.h @@ -47,6 +47,13 @@ static const char* kURI##prefix##_##name = ##namespace #name ;\ static const char* kTag##prefix##_##name = kURI##prefix##_##name## + sizeof(##namespace) - 1 +/** + * Core RDF vocabularies that we use to infer semantic actions + */ +#define RDF_NAMESPACE_URI "http://www.w3.org/TR/WD-rdf-syntax#" +#define WEB_NAMESPACE_URI "http://home.netscape.com/WEB-rdf#" +#define NC_NAMESPACE_URI "http://home.netscape.com/NC-rdf#" + /** * @name Standard RDF error codes diff --git a/mozilla/rdf/base/src/nsContainerCursor.cpp b/mozilla/rdf/base/src/nsContainerCursor.cpp index f16610ec31b..14d4a158c21 100644 --- a/mozilla/rdf/base/src/nsContainerCursor.cpp +++ b/mozilla/rdf/base/src/nsContainerCursor.cpp @@ -63,7 +63,6 @@ static NS_DEFINE_CID(kRDFServiceCID, NS_RDFSERVICE_CID); //////////////////////////////////////////////////////////////////////// -#define RDF_NAMESPACE_URI "http://www.w3.org/TR/WD-rdf-syntax#" static const char kRDFNameSpaceURI[] = RDF_NAMESPACE_URI; DEFINE_RDF_VOCAB(RDF_NAMESPACE_URI, RDF, nextVal); // ad hoc way to make containers fast diff --git a/mozilla/rdf/base/src/nsRDFContentSink.cpp b/mozilla/rdf/base/src/nsRDFContentSink.cpp index 4c58be2c57d..e73682d1fc7 100644 --- a/mozilla/rdf/base/src/nsRDFContentSink.cpp +++ b/mozilla/rdf/base/src/nsRDFContentSink.cpp @@ -42,8 +42,6 @@ does namespaces: should we storing tag/namespace pairs instead of the entire URI in the elements? - 3) Write a test harness. - */ #include "nsIContentSink.h" @@ -71,7 +69,6 @@ static const char kNameSpaceDef[] = "xmlns"; // RDF core vocabulary #include "rdf.h" -#define RDF_NAMESPACE_URI "http://www.w3.org/TR/WD-rdf-syntax#" DEFINE_RDF_VOCAB(RDF_NAMESPACE_URI, RDF, Alt); DEFINE_RDF_VOCAB(RDF_NAMESPACE_URI, RDF, Bag); DEFINE_RDF_VOCAB(RDF_NAMESPACE_URI, RDF, Description); @@ -121,7 +118,7 @@ rdf_EntityToUnicode(const char* buf) (buf[2] == 'p' || buf[2] == 'P')) return PRUnichar('&'); - PR_ASSERT(0); // XXX this is a named entity that I can't handle... + NS_NOTYETIMPLEMENTED("this is a named entity that I can't handle..."); return PRUnichar('?'); } @@ -245,6 +242,7 @@ rdf_StripAndConvert(nsString& aResult) else if (e == '{') { // Convert a script entity // XXX write me! + NS_NOTYETIMPLEMENTED("convert a script entity"); } } } @@ -307,13 +305,6 @@ rdf_FullyQualifyURI(const nsIURL* base, nsString& spec) //////////////////////////////////////////////////////////////////////// -class nsIURL; -class nsVoidArray; -class nsIRDFResource; -class nsIRDFDataSource; -class nsIRDFService; -class nsINameSpaceManager; - typedef enum { eRDFContentSinkState_InProlog, eRDFContentSinkState_InDocumentElement, @@ -386,8 +377,8 @@ protected: nsString& rProperty); // RDF-specific parsing - nsresult GetIdAboutAttribute(const nsIParserNode& aNode, nsString& rResource); - nsresult GetResourceAttribute(const nsIParserNode& aNode, nsString& rResource); + nsresult GetIdAboutAttribute(const nsIParserNode& aNode, nsIRDFResource** aResource); + nsresult GetResourceAttribute(const nsIParserNode& aNode, nsIRDFResource** aResource); nsresult AddProperties(const nsIParserNode& aNode, nsIRDFResource* aSubject); virtual nsresult OpenRDF(const nsIParserNode& aNode); @@ -931,8 +922,8 @@ RDFContentSinkImpl::FlushText(PRBool aCreateTextNode, PRBool* aDidFlush) void RDFContentSinkImpl::SplitQualifiedName(const nsString& aQualifiedName, - PRInt32& rNameSpaceID, - nsString& rProperty) + PRInt32& rNameSpaceID, + nsString& rProperty) { rProperty = aQualifiedName; nsIAtom* prefix = CutNameSpacePrefix(rProperty); @@ -943,13 +934,14 @@ RDFContentSinkImpl::SplitQualifiedName(const nsString& aQualifiedName, nsresult RDFContentSinkImpl::GetIdAboutAttribute(const nsIParserNode& aNode, - nsString& rResource) + nsIRDFResource** aResource) { // This corresponds to the dirty work of production [6.5] nsAutoString k; nsAutoString attr; PRInt32 nameSpaceID; PRInt32 ac = aNode.GetAttributeCount(); + nsresult rv; for (PRInt32 i = 0; i < ac; i++) { // Get upper-cased key @@ -963,44 +955,47 @@ RDFContentSinkImpl::GetIdAboutAttribute(const nsIParserNode& aNode, // first thing that was specified and ignore the other. if (attr.Equals(kTagRDF_about)) { - rResource = aNode.GetValueAt(i); - rdf_StripAndConvert(rResource); + nsAutoString uri = aNode.GetValueAt(i); + rdf_StripAndConvert(uri); - return NS_OK; + return mRDFService->GetUnicodeResource(uri, aResource); } if (attr.Equals(kTagRDF_ID)) { - PRUnichar* str; - mDocumentURL->ToString(&str); - rResource = str; - delete str; + const char* docURI; + mDocumentURL->GetSpec(&docURI); + + if (NS_FAILED(rv = mRDFService->GetResource(docURI, aResource))) + return rv; + + nsAutoString uri(docURI); nsAutoString tag = aNode.GetValueAt(i); rdf_StripAndConvert(tag); - if (rResource.Last() != '#' && tag.First() != '#') - rResource.Append('#'); + if (uri.Last() != '#' && tag.First() != '#') + uri.Append('#'); - rResource.Append(tag); - return NS_OK; + uri.Append(tag); + + return mRDFService->GetUnicodeResource(uri, aResource); } - // XXX we don't deal with aboutEach... + if (attr.Equals(kTagRDF_aboutEach)) { + // XXX we don't deal with aboutEach... + NS_NOTYETIMPLEMENTED("RDF:aboutEach is not understood at this time"); + } } // Otherwise, we couldn't find anything, so just gensym one... - PRUnichar* str; - mDocumentURL->ToString(&str); - rResource = str; - delete str; - rResource.Append("#anonymous$"); - rResource.Append(mGenSym++, 10); - return NS_OK; + const char* url; + mDocumentURL->GetSpec(&url); + return rdf_CreateAnonymousResource(url, aResource); } nsresult RDFContentSinkImpl::GetResourceAttribute(const nsIParserNode& aNode, - nsString& rResource) + nsIRDFResource** aResource) { nsAutoString k; nsAutoString attr; @@ -1019,15 +1014,15 @@ RDFContentSinkImpl::GetResourceAttribute(const nsIParserNode& aNode, // first thing that was specified and ignore the other. if (attr.Equals(kTagRDF_resource)) { - rResource = aNode.GetValueAt(i); - rdf_StripAndConvert(rResource); + nsAutoString uri = aNode.GetValueAt(i); + rdf_StripAndConvert(uri); // XXX Take the URI and make it fully qualified by // sticking it into the document's URL. This may not be // appropriate... - rdf_FullyQualifyURI(mDocumentURL, rResource); + rdf_FullyQualifyURI(mDocumentURL, uri); - return NS_OK; + return mRDFService->GetUnicodeResource(uri, aResource); } } return NS_ERROR_FAILURE; @@ -1035,7 +1030,7 @@ RDFContentSinkImpl::GetResourceAttribute(const nsIParserNode& aNode, nsresult RDFContentSinkImpl::AddProperties(const nsIParserNode& aNode, - nsIRDFResource* aSubject) + nsIRDFResource* aSubject) { // Add tag attributes to the content attributes nsAutoString k, v; @@ -1113,12 +1108,8 @@ RDFContentSinkImpl::OpenObject(const nsIParserNode& aNode) // Figure out the URI of this object, and create an RDF node for it. nsresult rv; - nsAutoString uri; - if (NS_FAILED(rv = GetIdAboutAttribute(aNode, uri))) - return rv; - nsIRDFResource* rdfResource; - if (NS_FAILED(rv = mRDFService->GetUnicodeResource(uri, &rdfResource))) + if (NS_FAILED(rv = GetIdAboutAttribute(aNode, &rdfResource))) return rv; // If we're in a member or property element, then this is the cue @@ -1223,29 +1214,27 @@ RDFContentSinkImpl::OpenProperty(const nsIParserNode& aNode) if (NS_FAILED(rv = mRDFService->GetUnicodeResource(ns, &rdfProperty))) return rv; - nsAutoString resourceURI; - if (NS_SUCCEEDED(GetResourceAttribute(aNode, resourceURI))) { + nsIRDFResource* rdfResource; + if (NS_SUCCEEDED(GetResourceAttribute(aNode, &rdfResource))) { // They specified an inline resource for the value of this // property. Create an RDF resource for the inline resource // URI, add the properties to it, and attach the inline // resource to its parent. - nsIRDFResource* rdfResource; - if (NS_SUCCEEDED(rv = mRDFService->GetUnicodeResource(resourceURI, &rdfResource))) { - if (NS_SUCCEEDED(rv = AddProperties(aNode, rdfResource))) { - rv = rdf_Assert(mDataSource, - GetContextElement(0), - rdfProperty, - rdfResource); - } + if (NS_SUCCEEDED(rv = AddProperties(aNode, rdfResource))) { + rv = rdf_Assert(mDataSource, + GetContextElement(0), + rdfProperty, + rdfResource); } // XXX ignore any failure from above... - PR_ASSERT(rv == NS_OK); + NS_ASSERTION(NS_SUCCEEDED(rv), "problem adding properties"); // XXX Technically, we should _not_ fall through here and push // the element onto the stack: this is supposed to be a closed // node. But right now I'm lazy and the code will just Do The // Right Thing so long as the RDF is well-formed. + NS_RELEASE(rdfResource); } // Push the element onto the context stack and change state. @@ -1280,20 +1269,17 @@ RDFContentSinkImpl::OpenMember(const nsIParserNode& aNode) return NS_ERROR_NULL_POINTER; nsresult rv; - nsAutoString resourceURI; - if (NS_SUCCEEDED(rv = GetResourceAttribute(aNode, resourceURI))) { + nsIRDFResource* resource; + if (NS_SUCCEEDED(rv = GetResourceAttribute(aNode, &resource))) { // Okay, this node has an RDF:resource="..." attribute. That // means that it's a "referenced item," as covered in [6.29]. - - nsIRDFResource* resource; - if (NS_SUCCEEDED(rv = mRDFService->GetUnicodeResource(resourceURI, &resource))) { - rv = rdf_ContainerAddElement(mDataSource, container, resource); - } + rv = rdf_ContainerAddElement(mDataSource, container, resource); // XXX Technically, we should _not_ fall through here and push // the element onto the stack: this is supposed to be a closed // node. But right now I'm lazy and the code will just Do The // Right Thing so long as the RDF is well-formed. + NS_RELEASE(resource); } // Change state. Pushing a null context element is a bit weird, diff --git a/mozilla/rdf/base/src/nsRDFXMLDataSource.cpp b/mozilla/rdf/base/src/nsRDFXMLDataSource.cpp index b63e02dc351..3f9ecf15f02 100644 --- a/mozilla/rdf/base/src/nsRDFXMLDataSource.cpp +++ b/mozilla/rdf/base/src/nsRDFXMLDataSource.cpp @@ -31,10 +31,7 @@ open an arbitrary nsIOutputStream on *any* URL, and Netlib could just do the magic. - 2) This does not currently output RDF container constructs - properly. To do this, we just need to implement SerializeContainer(). - - 3) Implement a more terse output for "typed" nodes; that is, instead + 2) Implement a more terse output for "typed" nodes; that is, instead of "RDF:Description RDF:type='ns:foo'", just output "ns:foo". */ @@ -88,6 +85,13 @@ static NS_DEFINE_CID(kRDFContentSinkCID, NS_RDFCONTENTSINK_CID); static NS_DEFINE_CID(kRDFServiceCID, NS_RDFSERVICE_CID); static NS_DEFINE_CID(kWellFormedDTDCID, NS_WELLFORMEDDTD_CID); +//////////////////////////////////////////////////////////////////////// +// Vocabulary stuff +#include "rdf.h" +DEFINE_RDF_VOCAB(RDF_NAMESPACE_URI, RDF, instanceOf); +DEFINE_RDF_VOCAB(RDF_NAMESPACE_URI, RDF, nextVal); + + //////////////////////////////////////////////////////////////////////// // FileOutputStreamImpl @@ -414,7 +418,11 @@ RDFXMLDataSourceImpl::RDFXMLDataSourceImpl(void) // Initialize the name space stuff to know about any "standard" // namespaces that we want to look the same in all the RDF/XML we // generate. - AddNameSpace(NS_NewAtom("RDF"), "http://www.w3.org/TR/WD-rdf-syntax#"); + // + // XXX this is a bit of a hack, because technically, the document + // should've defined the RDF namespace to be _something_, and we + // should just look at _that_ and use it. Oh well. + AddNameSpace(NS_NewAtom("RDF"), RDF_NAMESPACE_URI); } @@ -1058,8 +1066,6 @@ RDFXMLDataSourceImpl::SerializeAssertion(nsIOutputStream* aStream, rdf_BlockingWrite(aStream, "\"", 1); } - rdf_BlockingWrite(aStream, ">", 1); - nsIRDFResource* resource; nsIRDFLiteral* literal; @@ -1070,7 +1076,14 @@ RDFXMLDataSourceImpl::SerializeAssertion(nsIOutputStream* aStream, nsAutoString escaped(uri); rdf_EscapeAmpersands(escaped); + const char* docURI; + mInner->GetURI(&docURI); + rdf_PossiblyMakeRelative(docURI, escaped); + + rdf_BlockingWrite(aStream, " RDF:resource=\""); rdf_BlockingWrite(aStream, escaped); + rdf_BlockingWrite(aStream, "\"/>\n", 4); + NS_RELEASE(resource); } else if (NS_SUCCEEDED(aValue->QueryInterface(kIRDFLiteralIID, (void**) &literal))) { @@ -1081,7 +1094,11 @@ RDFXMLDataSourceImpl::SerializeAssertion(nsIOutputStream* aStream, rdf_EscapeAmpersands(s); // do these first! rdf_EscapeAngleBrackets(s); + rdf_BlockingWrite(aStream, ">", 1); rdf_BlockingWrite(aStream, s); + rdf_BlockingWrite(aStream, "\n", 2); NS_RELEASE(literal); } @@ -1090,10 +1107,6 @@ RDFXMLDataSourceImpl::SerializeAssertion(nsIOutputStream* aStream, NS_ASSERTION(PR_FALSE, "huh?"); } - rdf_BlockingWrite(aStream, "\n", 2); - return NS_OK; } @@ -1222,7 +1235,7 @@ RDFXMLDataSourceImpl::SerializeMember(nsIOutputStream* aStream, if (NS_SUCCEEDED(rv = literal->GetValue(&value))) { rdf_BlockingWrite(aStream, " "); rdf_BlockingWrite(aStream, value); - rdf_BlockingWrite(aStream, " \n"); + rdf_BlockingWrite(aStream, "\n"); } NS_RELEASE(literal); } @@ -1247,24 +1260,57 @@ nsresult RDFXMLDataSourceImpl::SerializeContainer(nsIOutputStream* aStream, nsIRDFResource* aContainer) { -static const char kRDFOpenSeq[] = " GetURI(&docURI); + + const char* s; + if (NS_SUCCEEDED(aContainer->GetValue(&s))) { + nsAutoString uri(s); + rdf_PossiblyMakeRelative(docURI, uri); + rdf_BlockingWrite(aStream, " RDF:ID=\"", 9); + rdf_BlockingWrite(aStream, uri); + rdf_BlockingWrite(aStream, "\"", 1); + } + + rdf_BlockingWrite(aStream, ">\n", 2); - // XXX decide if it's an anonymous bag, or a named one. If it's - // named, then print out its identity HERE. // We iterate through all of the arcs, in case someone has applied // properties to the bag itself. + nsIRDFArcsOutCursor* arcs; if (NS_FAILED(rv = mInner->ArcLabelsOut(aContainer, &arcs))) return rv; @@ -1281,9 +1327,26 @@ static const char kRDFCloseAlt[] = " \n"; rv = SerializeMember(aStream, aContainer, property); } else { - rv = SerializeProperty(aStream, aContainer, property); - } + do { + PRBool eq; + // don't serialize RDF:instanceOf -- it's implicit in the tag + if (NS_FAILED(rv = property->EqualsString(kURIRDF_instanceOf, &eq))) + break; + + if (eq) + break; + + // don't serialize RDF:nextVal -- it's internal state + if (NS_FAILED(rv = property->EqualsString(kURIRDF_nextVal, &eq))) + break; + + if (eq) + break; + + rv = SerializeProperty(aStream, aContainer, property); + } while (0); + } NS_RELEASE(property); if (NS_FAILED(rv)) @@ -1294,6 +1357,13 @@ static const char kRDFCloseAlt[] = " \n"; rv = NS_OK; NS_RELEASE(arcs); + + + // close the container tag + rdf_BlockingWrite(aStream, " \n", 2); + return rv; } diff --git a/mozilla/rdf/base/src/rdfutil.cpp b/mozilla/rdf/base/src/rdfutil.cpp index 902fc659bee..64eeb9ca0b4 100644 --- a/mozilla/rdf/base/src/rdfutil.cpp +++ b/mozilla/rdf/base/src/rdfutil.cpp @@ -32,13 +32,13 @@ #include "nsIServiceManager.h" #include "nsRDFCID.h" #include "nsString.h" +#include "plstr.h" #include "rdfutil.h" //////////////////////////////////////////////////////////////////////// // RDF core vocabulary #include "rdf.h" -#define RDF_NAMESPACE_URI "http://www.w3.org/TR/WD-rdf-syntax#" static const char kRDFNameSpaceURI[] = RDF_NAMESPACE_URI; DEFINE_RDF_VOCAB(RDF_NAMESPACE_URI, RDF, Alt); DEFINE_RDF_VOCAB(RDF_NAMESPACE_URI, RDF, Bag); @@ -65,17 +65,56 @@ static NS_DEFINE_CID(kRDFServiceCID, NS_RDFSERVICE_CID); //////////////////////////////////////////////////////////////////////// +// XXX This'll permanently leak static nsIRDFService* gRDFService = nsnull; +static nsIRDFResource* kRDF_instanceOf = nsnull; +static nsIRDFResource* kRDF_Bag = nsnull; +static nsIRDFResource* kRDF_Seq = nsnull; +static nsIRDFResource* kRDF_Alt = nsnull; +static nsIRDFResource* kRDF_nextVal = nsnull; + static nsresult rdf_EnsureRDFService(void) { if (gRDFService) return NS_OK; - return nsServiceManager::GetService(kRDFServiceCID, - kIRDFServiceIID, - (nsISupports**) &gRDFService); + nsresult rv; + + if (NS_FAILED(rv = nsServiceManager::GetService(kRDFServiceCID, + kIRDFServiceIID, + (nsISupports**) &gRDFService))) + goto done; + + if (NS_FAILED(rv = gRDFService->GetResource(kURIRDF_instanceOf, &kRDF_instanceOf))) + goto done; + + if (NS_FAILED(rv = gRDFService->GetResource(kURIRDF_Bag, &kRDF_Bag))) + goto done; + + if (NS_FAILED(rv = gRDFService->GetResource(kURIRDF_Seq, &kRDF_Seq))) + goto done; + + if (NS_FAILED(rv = gRDFService->GetResource(kURIRDF_Alt, &kRDF_Alt))) + goto done; + + if (NS_FAILED(rv = gRDFService->GetResource(kURIRDF_nextVal, &kRDF_nextVal))) + goto done; + +done: + if (NS_FAILED(rv)) { + NS_IF_RELEASE(kRDF_nextVal); + NS_IF_RELEASE(kRDF_Alt); + NS_IF_RELEASE(kRDF_Seq); + NS_IF_RELEASE(kRDF_Bag); + + if (gRDFService) { + nsServiceManager::ReleaseService(kRDFServiceCID, gRDFService); + gRDFService = nsnull; + } + } + return rv; } //////////////////////////////////////////////////////////////////////// @@ -107,72 +146,70 @@ rdf_IsOrdinalProperty(const nsIRDFResource* property) } -// XXX This'll permanently leak RDF_Alt, RDF_Seq, RDF_Bag, and -// RDF_instanceOf. Since we do it a lot, it seems like it's worth it. - PRBool rdf_IsContainer(nsIRDFDataSource* ds, nsIRDFResource* resource) { - PRBool result = PR_FALSE; + if (rdf_IsBag(ds, resource) || + rdf_IsSeq(ds, resource) || + rdf_IsAlt(ds, resource)) { + return PR_TRUE; + } + else { + return PR_FALSE; + } +} -static nsIRDFResource* RDF_instanceOf = nsnull; -static nsIRDFResource* RDF_Bag = nsnull; -static nsIRDFResource* RDF_Seq = nsnull; -static nsIRDFResource* RDF_Alt = nsnull; +PRBool +rdf_IsBag(nsIRDFDataSource* aDataSource, + nsIRDFResource* aResource) +{ + PRBool result = PR_FALSE; nsresult rv; if (NS_FAILED(rv = rdf_EnsureRDFService())) goto done; - if (! RDF_instanceOf) { - if (NS_FAILED(rv = gRDFService->GetResource(kURIRDF_instanceOf, &RDF_instanceOf))) - goto done; - } - - // bag? - if (! RDF_Bag) { - if (NS_FAILED(rv = gRDFService->GetResource(kURIRDF_Bag, &RDF_Bag))) - goto done; - } - - if (NS_FAILED(rv = ds->HasAssertion(resource, RDF_instanceOf, RDF_Bag, PR_TRUE, &result))) - goto done; - - if (result) - goto done; - - // sequence? - if (! RDF_Seq) { - if (NS_FAILED(rv = gRDFService->GetResource(kURIRDF_Seq, &RDF_Seq))) - goto done; - } - - if (NS_FAILED(rv = ds->HasAssertion(resource, RDF_instanceOf, RDF_Seq, PR_TRUE, &result))) - goto done; - - if (result) - goto done; - - // alternation? - if (! RDF_Alt) { - if (NS_FAILED(rv = gRDFService->GetResource(kURIRDF_Alt, &RDF_Alt))) - goto done; - } - - if (NS_FAILED(rv = ds->HasAssertion(resource, RDF_instanceOf, RDF_Alt, PR_TRUE, &result))) - goto done; + rv = aDataSource->HasAssertion(aResource, kRDF_instanceOf, kRDF_Bag, PR_TRUE, &result); done: - // XXX permanent leak - //NS_IF_RELEASE(RDF_Alt); - //NS_IF_RELEASE(RDF_Seq); - //NS_IF_RELEASE(RDF_Bag); - //NS_IF_RELEASE(RDF_instanceOf); return result; } +PRBool +rdf_IsSeq(nsIRDFDataSource* aDataSource, + nsIRDFResource* aResource) +{ + PRBool result = PR_FALSE; + + nsresult rv; + if (NS_FAILED(rv = rdf_EnsureRDFService())) + goto done; + + rv = aDataSource->HasAssertion(aResource, kRDF_instanceOf, kRDF_Seq, PR_TRUE, &result); + +done: + return result; +} + + +PRBool +rdf_IsAlt(nsIRDFDataSource* aDataSource, + nsIRDFResource* aResource) +{ + PRBool result = PR_FALSE; + + nsresult rv; + if (NS_FAILED(rv = rdf_EnsureRDFService())) + goto done; + + rv = aDataSource->HasAssertion(aResource, kRDF_instanceOf, kRDF_Alt, PR_TRUE, &result); + +done: + return result; +} + // A complete hack that looks at the string value of a node and // guesses if it's a resource static PRBool @@ -377,20 +414,83 @@ rdf_Assert(nsIRDFDataSource* ds, nsresult -rdf_CreateAnonymousResource(nsIRDFResource** result) +rdf_CreateAnonymousResource(const nsString& aContextURI, nsIRDFResource** result) { - static PRUint32 gCounter = 0; - - nsAutoString s = "$"; - s.Append(++gCounter, 10); +static PRUint32 gCounter = 0; nsresult rv; if (NS_FAILED(rv = rdf_EnsureRDFService())) return rv; - return gRDFService->GetUnicodeResource(s, result); + do { + nsAutoString s(aContextURI); + s.Append('$'); + s.Append(++gCounter, 10); + + nsIRDFResource* resource; + if (NS_FAILED(rv = gRDFService->GetUnicodeResource(s, &resource))) + return rv; + + // XXX an ugly but effective way to make sure that this + // resource is really unique in the world. + nsrefcnt refcnt = resource->AddRef(); + resource->Release(); + + if (refcnt == 2) { + *result = resource; + break; + } + } while (1); + + return NS_OK; } +PRBool +rdf_IsAnonymousResource(const nsString& aContextURI, nsIRDFResource* aResource) +{ + nsresult rv; + const char* s; + if (NS_FAILED(rv = aResource->GetValue(&s))) { + NS_ASSERTION(PR_FALSE, "unable to get resource URI"); + return PR_FALSE; + } + + nsAutoString uri(s); + + // Make sure that they have the same context (prefix) + if (uri.Find(aContextURI) != 0) + return PR_FALSE; + + uri.Cut(0, aContextURI.Length()); + + // Anonymous resources look like the regexp "\$[0-9]+" + if (uri[0] != '$') + return PR_FALSE; + + for (PRInt32 i = uri.Length() - 1; i >= 1; --i) { + if (uri[i] < '0' || uri[i] > '9') + return PR_FALSE; + } + + return PR_TRUE; +} + + +PR_EXTERN(nsresult) +rdf_PossiblyMakeRelative(const nsString& aContextURI, nsString& aURI) +{ + // This implementation is extremely simple: no ".." or anything + // fancy like that. If the context URI is not a prefix of the URI + // in question, we'll just bail. + if (aURI.Find(aContextURI) != 0) + return NS_OK; + + // Otherwise, pare down the target URI, removing the context URI. + aURI.Cut(0, aContextURI.Length()); + return NS_OK; +} + + nsresult rdf_MakeBag(nsIRDFDataSource* ds, nsIRDFResource* bag) @@ -466,7 +566,6 @@ rdf_ContainerGetNextValue(nsIRDFDataSource* ds, if (NS_FAILED(rv = rdf_EnsureRDFService())) return rv; - nsIRDFResource* RDF_nextVal = nsnull; nsIRDFNode* nextValNode = nsnull; nsIRDFLiteral* nextValLiteral = nsnull; const PRUnichar* s; @@ -476,10 +575,7 @@ rdf_ContainerGetNextValue(nsIRDFDataSource* ds, // Get the next value, which hangs off of the bag via the // RDF:nextVal property. - if (NS_FAILED(rv = gRDFService->GetResource(kURIRDF_nextVal, &RDF_nextVal))) - goto done; - - if (NS_FAILED(rv = ds->GetTarget(container, RDF_nextVal, PR_TRUE, &nextValNode))) + if (NS_FAILED(rv = ds->GetTarget(container, kRDF_nextVal, PR_TRUE, &nextValNode))) goto done; if (NS_FAILED(rv = nextValNode->QueryInterface(kIRDFLiteralIID, (void**) &nextValLiteral))) @@ -502,7 +598,7 @@ rdf_ContainerGetNextValue(nsIRDFDataSource* ds, goto done; // Now increment the RDF:nextVal property. - if (NS_FAILED(rv = ds->Unassert(container, RDF_nextVal, nextValLiteral))) + if (NS_FAILED(rv = ds->Unassert(container, kRDF_nextVal, nextValLiteral))) goto done; NS_RELEASE(nextValLiteral); @@ -514,13 +610,12 @@ rdf_ContainerGetNextValue(nsIRDFDataSource* ds, if (NS_FAILED(rv = gRDFService->GetLiteral(nextValStr, &nextValLiteral))) goto done; - if (NS_FAILED(rv = rdf_Assert(ds, container, RDF_nextVal, nextValLiteral))) + if (NS_FAILED(rv = rdf_Assert(ds, container, kRDF_nextVal, nextValLiteral))) goto done; done: NS_IF_RELEASE(nextValLiteral); NS_IF_RELEASE(nextValNode); - NS_IF_RELEASE(RDF_nextVal); return rv; } diff --git a/mozilla/rdf/base/src/rdfutil.h b/mozilla/rdf/base/src/rdfutil.h index cbf467b3df2..32639fd8ce3 100644 --- a/mozilla/rdf/base/src/rdfutil.h +++ b/mozilla/rdf/base/src/rdfutil.h @@ -53,6 +53,17 @@ PR_EXTERN(PRBool) rdf_IsContainer(nsIRDFDataSource* db, nsIRDFResource* resource); +PR_EXTERN(PRBool) +rdf_IsBag(nsIRDFDataSource* aDataSource, + nsIRDFResource* aResource); + +PR_EXTERN(PRBool) +rdf_IsSeq(nsIRDFDataSource* aDataSource, + nsIRDFResource* aResource); + +PR_EXTERN(PRBool) +rdf_IsAlt(nsIRDFDataSource* aDataSource, + nsIRDFResource* aResource); /** * Various utilities routines for making assertions in a data source @@ -105,8 +116,20 @@ rdf_Assert(nsIRDFDataSource* ds, * resource URI. */ PR_EXTERN(nsresult) -rdf_CreateAnonymousResource(nsIRDFResource** result); +rdf_CreateAnonymousResource(const nsString& aContextURI, nsIRDFResource** result); +/** + * Determine if a resource is an "anonymous" resource that we've constructed + * ourselves. + */ +PR_EXTERN(PRBool) +rdf_IsAnonymousResource(const nsString& aContextURI, nsIRDFResource* aResource); + +/** + * Try to convert the absolute URL into a relative URL. + */ +PR_EXTERN(nsresult) +rdf_PossiblyMakeRelative(const nsString& aContextURI, nsString& aURI); /** * Create a bag resource. diff --git a/mozilla/rdf/content/src/nsRDFDocument.cpp b/mozilla/rdf/content/src/nsRDFDocument.cpp index a4b8b0e272b..e30417abe0e 100644 --- a/mozilla/rdf/content/src/nsRDFDocument.cpp +++ b/mozilla/rdf/content/src/nsRDFDocument.cpp @@ -1658,8 +1658,8 @@ RDFDocumentImpl::IsTreeProperty(nsIRDFResource* aProperty, PRBool* aResult) cons const char* p; aProperty->GetValue(&p); nsAutoString s(p); - if (s.Equals("http://home.netscape.com/NC-rdf#child") || - s.Equals("http://home.netscape.com/NC-rdf#Folder")) { + if (s.Equals(NC_NAMESPACE_URI "child") || + s.Equals(NC_NAMESPACE_URI "Folder")) { *aResult = PR_TRUE; return NS_OK; } diff --git a/mozilla/rdf/content/src/nsRDFTreeBuilder.cpp b/mozilla/rdf/content/src/nsRDFTreeBuilder.cpp index e6728a18461..5bfd722b8ce 100644 --- a/mozilla/rdf/content/src/nsRDFTreeBuilder.cpp +++ b/mozilla/rdf/content/src/nsRDFTreeBuilder.cpp @@ -45,7 +45,6 @@ //////////////////////////////////////////////////////////////////////// -#define NC_NAMESPACE_URI "http://home.netscape.com/NC-rdf#" DEFINE_RDF_VOCAB(NC_NAMESPACE_URI, NC, Columns); DEFINE_RDF_VOCAB(NC_NAMESPACE_URI, NC, Column); DEFINE_RDF_VOCAB(NC_NAMESPACE_URI, NC, Title); diff --git a/mozilla/rdf/datasource/src/nsBookmarkDataSource.cpp b/mozilla/rdf/datasource/src/nsBookmarkDataSource.cpp index ab9cbc3f411..c041dbadcb3 100644 --- a/mozilla/rdf/datasource/src/nsBookmarkDataSource.cpp +++ b/mozilla/rdf/datasource/src/nsBookmarkDataSource.cpp @@ -47,7 +47,6 @@ static NS_DEFINE_CID(kRDFServiceCID, NS_RDFSERVICE_CID); static const char kURINC_BookmarksRoot[] = "NC:BookmarksRoot"; // XXX? -#define NC_NAMESPACE_URI "http://home.netscape.com/NC-rdf#" DEFINE_RDF_VOCAB(NC_NAMESPACE_URI, NC, child); DEFINE_RDF_VOCAB(NC_NAMESPACE_URI, NC, BookmarkAddDate); DEFINE_RDF_VOCAB(NC_NAMESPACE_URI, NC, Description); @@ -55,13 +54,9 @@ DEFINE_RDF_VOCAB(NC_NAMESPACE_URI, NC, Folder); DEFINE_RDF_VOCAB(NC_NAMESPACE_URI, NC, Name); DEFINE_RDF_VOCAB(NC_NAMESPACE_URI, NC, PersonalToolbarFolderCategory); - -#define WEB_NAMESPACE_URI "http://home.netscape.com/WEB-rdf#" DEFINE_RDF_VOCAB(WEB_NAMESPACE_URI, WEB, LastVisitDate); DEFINE_RDF_VOCAB(WEB_NAMESPACE_URI, WEB, LastModifiedDate); - -#define RDF_NAMESPACE_URI "http://www.w3.org/TR/WD-rdf-syntax#" DEFINE_RDF_VOCAB(RDF_NAMESPACE_URI, RDF, instanceOf); static const char kPersonalToolbar[] = "Personal Toolbar"; diff --git a/mozilla/rdf/datasource/src/nsHistoryDataSource.cpp b/mozilla/rdf/datasource/src/nsHistoryDataSource.cpp index a511e1a542e..764aa4c84e8 100644 --- a/mozilla/rdf/datasource/src/nsHistoryDataSource.cpp +++ b/mozilla/rdf/datasource/src/nsHistoryDataSource.cpp @@ -62,7 +62,6 @@ static NS_DEFINE_CID(kRDFInMemoryDataSourceCID, NS_RDFINMEMORYDATASOURCE_CID) static const char kURIHistoryRoot[] = "HistoryRoot"; -#define NC_NAMESPACE_URI "http://home.netscape.com/NC-rdf#" DEFINE_RDF_VOCAB(NC_NAMESPACE_URI, NC, child); DEFINE_RDF_VOCAB(NC_NAMESPACE_URI, NC, Name); DEFINE_RDF_VOCAB(NC_NAMESPACE_URI, NC, Folder); @@ -70,7 +69,6 @@ DEFINE_RDF_VOCAB(NC_NAMESPACE_URI, NC, Column); DEFINE_RDF_VOCAB(NC_NAMESPACE_URI, NC, Columns); DEFINE_RDF_VOCAB(NC_NAMESPACE_URI, NC, Title); -#define WEB_NAMESPACE_URI "http://home.netscape.com/WEB-rdf#" DEFINE_RDF_VOCAB(WEB_NAMESPACE_URI, WEB, LastVisitDate); DEFINE_RDF_VOCAB(WEB_NAMESPACE_URI, WEB, LastModifiedDate); diff --git a/mozilla/rdf/datasource/src/nsMailDataSource.cpp b/mozilla/rdf/datasource/src/nsMailDataSource.cpp index f0361729fca..279e1a05feb 100644 --- a/mozilla/rdf/datasource/src/nsMailDataSource.cpp +++ b/mozilla/rdf/datasource/src/nsMailDataSource.cpp @@ -110,7 +110,6 @@ static NS_DEFINE_CID(kRDFInMemoryDataSourceCID, NS_RDFINMEMORYDATASOURCE_CID); static const char kURINC_MailRoot[] = "NC:MailRoot"; -#define NC_NAMESPACE_URI "http://home.netscape.com/NC-rdf#" DEFINE_RDF_VOCAB(NC_NAMESPACE_URI, NC, child); DEFINE_RDF_VOCAB(NC_NAMESPACE_URI, NC, subject); DEFINE_RDF_VOCAB(NC_NAMESPACE_URI, NC, from); diff --git a/mozilla/rdf/tests/localfile/localfile.cpp b/mozilla/rdf/tests/localfile/localfile.cpp index 1ae61d182da..c1885c9e208 100644 --- a/mozilla/rdf/tests/localfile/localfile.cpp +++ b/mozilla/rdf/tests/localfile/localfile.cpp @@ -209,7 +209,7 @@ main(int argc, char** argv) if (NS_FAILED(rv = theRDFService->GetResource("http://home.netscape.com", &theHomePage))) goto done; - if (NS_FAILED(rv = theRDFService->GetResource("http://home.nescape.com/NC-rdf#title", &NC_title))) + if (NS_FAILED(rv = theRDFService->GetResource(NC_NAMESPACE_URI "title", &NC_title))) goto done; if (NS_FAILED(rv = theRDFService->GetLiteral(nsAutoString("Netscape's Home Page"), &theTitle)))