From 22455ed2019134554d567cef46c1b3fda1b9020f Mon Sep 17 00:00:00 2001 From: "waterson%netscape.com" Date: Tue, 2 Mar 1999 01:38:34 +0000 Subject: [PATCH] General clean-up. Use RDF containers instead of multi-attributes. --- rdf/datasource/src/nsBookmarkDataSource.cpp | 207 ++++++++++++++------ 1 file changed, 152 insertions(+), 55 deletions(-) diff --git a/rdf/datasource/src/nsBookmarkDataSource.cpp b/rdf/datasource/src/nsBookmarkDataSource.cpp index 19654c4c534..1c43439d192 100644 --- a/rdf/datasource/src/nsBookmarkDataSource.cpp +++ b/rdf/datasource/src/nsBookmarkDataSource.cpp @@ -49,6 +49,7 @@ static const char kURINC_BookmarksRoot[] = "NC:BookmarksRoot"; // XXX? static const char kURINC_PersonalToolbarFolder[] = "NC:PersonalToolbarFolder"; // XXX? DEFINE_RDF_VOCAB(NC_NAMESPACE_URI, NC, child); +DEFINE_RDF_VOCAB(NC_NAMESPACE_URI, NC, Bookmark); DEFINE_RDF_VOCAB(NC_NAMESPACE_URI, NC, BookmarkAddDate); DEFINE_RDF_VOCAB(NC_NAMESPACE_URI, NC, Description); DEFINE_RDF_VOCAB(NC_NAMESPACE_URI, NC, Folder); @@ -59,6 +60,7 @@ DEFINE_RDF_VOCAB(WEB_NAMESPACE_URI, WEB, LastVisitDate); DEFINE_RDF_VOCAB(WEB_NAMESPACE_URI, WEB, LastModifiedDate); DEFINE_RDF_VOCAB(RDF_NAMESPACE_URI, RDF, instanceOf); +DEFINE_RDF_VOCAB(RDF_NAMESPACE_URI, RDF, type); static const char kPersonalToolbar[] = "Personal Toolbar"; @@ -71,6 +73,8 @@ static const char kPersonalToolbar[] = "Personal Toolbar"; */ class BookmarkParser { protected: + static PRInt32 gRefCnt; + static const char* kBRString; static const char* kCloseDLString; static const char* kDDString; @@ -80,6 +84,16 @@ protected: static const char* kOpenTitleString; static const char* kSeparatorString; + static nsIRDFService* gRDFService; + static nsIRDFResource* kNC_Bookmark; + static nsIRDFResource* kNC_BookmarkAddDate; + static nsIRDFResource* kNC_Description; + static nsIRDFResource* kNC_Folder; + static nsIRDFResource* kNC_Name; + static nsIRDFResource* kRDF_type; + static nsIRDFResource* kWEB_LastModifiedDate; + static nsIRDFResource* kWEB_LastVisitDate; + enum BookmarkParserState { eBookmarkParserState_Initial, eBookmarkParserState_InTitle, @@ -88,7 +102,6 @@ protected: eBookmarkParserState_InItemDescription }; - nsIRDFService* mRDFService; nsIRDFDataSource* mDataSource; nsVoidArray mStack; nsIRDFResource* mLastItem; @@ -97,14 +110,14 @@ protected: nsAutoString mFolderDate; BookmarkParserState mState; - void Tokenize(const char* buf, PRInt32 size); - void NextToken(void); - void DoStateTransition(void); - void CreateBookmark(void); + nsresult Tokenize(const char* buf, PRInt32 size); + nsresult NextToken(void); + nsresult DoStateTransition(void); + nsresult CreateBookmark(void); - nsresult AssertTime(nsIRDFResource* subject, - const nsString& predicateURI, - const nsString& time); + nsresult AssertTime(nsIRDFResource* aSubject, + nsIRDFResource* aPredicate, + const nsString& aTime); public: BookmarkParser(void); @@ -123,36 +136,71 @@ const char* BookmarkParser::kOpenH3String = "GetResource(kURINC_Bookmark, &kNC_Bookmark); + gRDFService->GetResource(kURINC_BookmarkAddDate, &kNC_BookmarkAddDate); + gRDFService->GetResource(kURINC_Description, &kNC_Description); + gRDFService->GetResource(kURINC_Folder, &kNC_Folder); + gRDFService->GetResource(kURINC_Name, &kNC_Name); + gRDFService->GetResource(kURIRDF_type, &kRDF_type); + gRDFService->GetResource(kURIWEB_LastModifiedDate, &kWEB_LastModifiedDate); + gRDFService->GetResource(kURIWEB_LastVisitDate, &kWEB_LastVisitDate); + } } BookmarkParser::~BookmarkParser(void) { - if (mRDFService) - nsServiceManager::ReleaseService(kRDFServiceCID, mRDFService); + if (--gRefCnt == 0) { + if (gRDFService) + nsServiceManager::ReleaseService(kRDFServiceCID, gRDFService); + + NS_IF_RELEASE(kNC_Bookmark); + NS_IF_RELEASE(kNC_BookmarkAddDate); + NS_IF_RELEASE(kNC_Description); + NS_IF_RELEASE(kNC_Folder); + NS_IF_RELEASE(kNC_Name); + NS_IF_RELEASE(kRDF_type); + NS_IF_RELEASE(kWEB_LastModifiedDate); + NS_IF_RELEASE(kWEB_LastVisitDate); + } } nsresult BookmarkParser::Parse(PRFileDesc* file, nsIRDFDataSource* dataSource) { - NS_PRECONDITION(file && dataSource && mRDFService, "null ptr"); + NS_PRECONDITION(file != nsnull, "null ptr"); if (! file) return NS_ERROR_NULL_POINTER; + NS_PRECONDITION(dataSource != nsnull, "null ptr"); if (! dataSource) return NS_ERROR_NULL_POINTER; - if (! mRDFService) + NS_PRECONDITION(gRDFService != nsnull, "not initialized"); + if (! gRDFService) return NS_ERROR_NOT_INITIALIZED; // Initialize the parser for a run... @@ -165,42 +213,50 @@ BookmarkParser::Parse(PRFileDesc* file, nsIRDFDataSource* dataSource) char buf[1024]; PRInt32 len; - while ((len = PR_Read(file, buf, sizeof(buf))) > 0) - Tokenize(buf, len); + nsresult rv; + while ((len = PR_Read(file, buf, sizeof(buf))) > 0) { + if (NS_FAILED(rv = Tokenize(buf, len))) { + NS_ERROR("error tokenizing"); + break; + } + } NS_IF_RELEASE(mLastItem); - return NS_OK; + return rv; } -void +nsresult BookmarkParser::Tokenize(const char* buf, PRInt32 size) { + nsresult rv; for (PRInt32 i = 0; i < size; ++i) { char c = buf[i]; if (c == '<') { if (mLine.Length() > 0) { - NextToken(); + rv = NextToken(); mLine.Truncate(); } } mLine.Append(c); if (c == '>') { if (mLine.Length() > 0) { - NextToken(); + rv = NextToken(); mLine.Truncate(); } } } + return rv; } -void +nsresult BookmarkParser::NextToken(void) { + nsresult rv; + if (mLine[0] == '<') { - DoStateTransition(); - return; + return DoStateTransition(); } // ok, we have a piece of content. can be the title, or a @@ -222,20 +278,27 @@ BookmarkParser::NextToken(void) folderURI.Append(++mCounter, 10); } - if (NS_FAILED(mRDFService->GetUnicodeResource(folderURI, &folder))) - return; + if (NS_FAILED(rv = gRDFService->GetUnicodeResource(folderURI, &folder))) { + NS_ERROR("unable to get resource"); + return rv; + } nsIRDFResource* parent = (nsIRDFResource*) mStack[mStack.Count() - 1]; - rdf_Assert(mDataSource, parent, kURINC_Folder, folder); + rdf_ContainerAppendElement(mDataSource, parent, folder); } else { // it's the root - if (NS_FAILED(mRDFService->GetResource(kURINC_BookmarksRoot, &folder))) - return; + if (NS_FAILED(rv = gRDFService->GetResource(kURINC_BookmarksRoot, &folder))) { + NS_ERROR("unable to get resource"); + return rv; + } } + rdf_MakeSeq(mDataSource, folder); + mDataSource->Assert(folder, kRDF_type, kNC_Folder, PR_TRUE); + if (mFolderDate.Length()) { - AssertTime(folder, kURINC_BookmarkAddDate, mFolderDate); + AssertTime(folder, kNC_BookmarkAddDate, mFolderDate); mFolderDate.Truncate(); } @@ -245,25 +308,36 @@ BookmarkParser::NextToken(void) //NS_ADDREF(mLastItem); //NS_RELEASE(folder); - if (mState != eBookmarkParserState_InTitle) - rdf_Assert(mDataSource, mLastItem, kURINC_Name, mLine); + if (mState != eBookmarkParserState_InTitle) { + nsIRDFLiteral* literal; + gRDFService->GetLiteral(mLine, &literal); + mDataSource->Assert(mLastItem, kNC_Name, literal, PR_TRUE); + NS_RELEASE(literal); + } } else if (mState == eBookmarkParserState_InItemTitle) { - PR_ASSERT(mLastItem); + NS_ASSERTION(mLastItem != nsnull, "no last item!"); if (! mLastItem) - return; + return NS_ERROR_UNEXPECTED; - rdf_Assert(mDataSource, mLastItem, kURINC_Name, mLine); - NS_IF_RELEASE(mLastItem); + nsIRDFLiteral* literal; + gRDFService->GetLiteral(mLine, &literal); + mDataSource->Assert(mLastItem, kNC_Name, literal, PR_TRUE); + NS_RELEASE(literal); + NS_RELEASE(mLastItem); } else if (mState == eBookmarkParserState_InItemDescription) { - rdf_Assert(mDataSource, mLastItem, kURINC_Description, mLine); + nsIRDFLiteral* literal; + gRDFService->GetLiteral(mLine, &literal); + mDataSource->Assert(mLastItem, kNC_Description, literal, PR_TRUE); + NS_RELEASE(literal); } + return NS_OK; } -void +nsresult BookmarkParser::DoStateTransition(void) { if (mLine.Find(kOpenAnchorString) == 0) { @@ -311,19 +385,25 @@ BookmarkParser::DoStateTransition(void) (mLine.Find(kBRString) == 0)) { // XXX in the original bmk2rdf.c, we only added the // description in the case that it wasn't set already...why? - rdf_Assert(mDataSource, mLastItem, kURINC_Description, mLine); + nsIRDFLiteral* literal; + gRDFService->GetLiteral(mLine, &literal); + mDataSource->Assert(mLastItem, kNC_Description, literal, PR_TRUE); + NS_RELEASE(literal); } else { mState = eBookmarkParserState_Initial; } + return NS_OK; } -void +nsresult BookmarkParser::CreateBookmark(void) { + nsresult rv; + enum { eBmkAttribute_URL = 0, eBmkAttribute_AddDate = 1, @@ -350,45 +430,62 @@ BookmarkParser::CreateBookmark(void) } if (values[eBmkAttribute_URL].Length() == 0) - return; + return NS_OK; nsIRDFResource* bookmark; - if (NS_FAILED(mRDFService->GetUnicodeResource(values[eBmkAttribute_URL], &bookmark))) - return; + if (NS_FAILED(rv = gRDFService->GetUnicodeResource(values[eBmkAttribute_URL], &bookmark))) + return rv; + mDataSource->Assert(bookmark, kRDF_type, kNC_Bookmark, PR_TRUE); + + NS_ASSERTION(mStack.Count() > 0, "no enclosing folder"); if (! mStack.Count()) - return; + return NS_ERROR_UNEXPECTED; nsIRDFResource* parent = (nsIRDFResource*) mStack[mStack.Count() - 1]; + NS_ASSERTION(parent != nsnull, "stack corruption"); if (! parent) - return; + return NS_ERROR_UNEXPECTED; - rdf_Assert(mDataSource, parent, kURINC_child, bookmark); + rdf_ContainerAppendElement(mDataSource, parent, bookmark); if (values[eBmkAttribute_AddDate].Length() > 0) - AssertTime(bookmark, kURINC_BookmarkAddDate, values[eBmkAttribute_AddDate]); + AssertTime(bookmark, kNC_BookmarkAddDate, values[eBmkAttribute_AddDate]); if (values[eBmkAttribute_LastVisit].Length() > 0) - AssertTime(bookmark, kURIWEB_LastVisitDate, values[eBmkAttribute_LastVisit]); + AssertTime(bookmark, kWEB_LastVisitDate, values[eBmkAttribute_LastVisit]); if (values[eBmkAttribute_LastModified].Length() > 0) - AssertTime(bookmark, kURIWEB_LastModifiedDate, values[eBmkAttribute_LastModified]); + AssertTime(bookmark, kWEB_LastModifiedDate, values[eBmkAttribute_LastModified]); NS_IF_RELEASE(mLastItem); mLastItem = bookmark; // XXX Implied //NS_ADDREF(mLastItem); //NS_RELEASE(bookmark); + + return NS_OK; } nsresult BookmarkParser::AssertTime(nsIRDFResource* object, - const nsString& predicateURI, + nsIRDFResource* predicate, const nsString& time) { - // XXX - return rdf_Assert(mDataSource, object, predicateURI, time); + // XXX Convert to a time + nsresult rv; + nsIRDFLiteral* literal; + if (NS_FAILED(rv = gRDFService->GetLiteral(time, &literal))) { + NS_ERROR("unable to get literal for time"); + return rv; + } + + rv = mDataSource->Assert(object, predicate, literal, PR_TRUE); + NS_ASSERTION(NS_SUCCEEDED(rv), "unable to assert time"); + + NS_RELEASE(literal); + return rv; } ////////////////////////////////////////////////////////////////////////