diff --git a/mozilla/content/xul/templates/src/nsXULTemplateBuilder.cpp b/mozilla/content/xul/templates/src/nsXULTemplateBuilder.cpp index 0c73f8e7670..b8f304cc51c 100644 --- a/mozilla/content/xul/templates/src/nsXULTemplateBuilder.cpp +++ b/mozilla/content/xul/templates/src/nsXULTemplateBuilder.cpp @@ -756,7 +756,9 @@ RDFGenericBuilderImpl::OnSetAttribute(nsIDOMElement* aElement, const nsString& a } if ((rv == NS_CONTENT_ATTR_NO_VALUE) || (rv == NS_CONTENT_ATTR_NOT_THERE) || - ((rv == NS_CONTENT_ATTR_HAS_VALUE) && (! attrValue.EqualsIgnoreCase(aValue)))) { + ((rv == NS_CONTENT_ATTR_HAS_VALUE) && (! attrValue.EqualsIgnoreCase(aValue))) || + PR_TRUE // XXX just always allow this to fire. + ) { // Okay, it's really changing. // This is a "transient" property, so we _don't_ go to the diff --git a/mozilla/rdf/base/public/nsIRDFNode.h b/mozilla/rdf/base/public/nsIRDFNode.h index f89560a1a30..dddfb39c9c5 100644 --- a/mozilla/rdf/base/public/nsIRDFNode.h +++ b/mozilla/rdf/base/public/nsIRDFNode.h @@ -29,7 +29,7 @@ #include "nscore.h" #include "rdf.h" #include "nsISupports.h" - +#include "prtime.h" // {0F78DA50-8321-11d2-8EAC-00805F29F370} #define NS_IRDFNODE_IID \ { 0xf78da50, 0x8321, 0x11d2, { 0x8e, 0xac, 0x0, 0x80, 0x5f, 0x29, 0xf3, 0x70 } } @@ -57,12 +57,6 @@ class NS_RDF nsIRDFNode : public nsISupports { public: static const nsIID& GetIID() { static nsIID iid = NS_IRDFNODE_IID; return iid; } - /** - * Called by nsIRDFService after constructing a resource object to - * initialize it's URI. - */ - NS_IMETHOD Init(const char* uri) = 0; - /** * Determine if two nodes are identical */ @@ -82,6 +76,12 @@ class NS_RDF nsIRDFResource : public nsIRDFNode { public: static const nsIID& GetIID() { static nsIID iid = NS_IRDFRESOURCE_IID; return iid; } + /** + * Called by nsIRDFService after constructing a resource object to + * initialize it's URI. + */ + NS_IMETHOD Init(const char* uri) = 0; + /** * Get the 8-bit string value of the node. */ @@ -118,6 +118,44 @@ public: NS_IMETHOD EqualsLiteral(const nsIRDFLiteral* literal, PRBool* result) const = 0; }; +// {E13A24E1-C77A-11d2-80BE-006097B76B8E} +#define NS_IRDFDATE_IID \ +{ 0xe13a24e1, 0xc77a, 0x11d2, { 0x80, 0xbe, 0x0, 0x60, 0x97, 0xb7, 0x6b, 0x8e } }; + + +class nsIRDFDate : public nsIRDFNode { +public: + static const nsIID& IID() { static nsIID iid = NS_IRDFDATE_IID; return iid; } + + /** + * Get the PRTime value of the node. + */ + NS_IMETHOD GetValue(PRTime *value) const = 0; + + /** + * Determine if two ints are identical. + */ + NS_IMETHOD EqualsDate(const nsIRDFDate* literal, PRBool* result) const = 0; +}; + +// {E13A24E3-C77A-11d2-80BE-006097B76B8E} +#define NS_IRDFINT_IID \ +{ 0xe13a24e3, 0xc77a, 0x11d2, { 0x80, 0xbe, 0x0, 0x60, 0x97, 0xb7, 0x6b, 0x8e } }; + +class nsIRDFInt : public nsIRDFNode { +public: + static const nsIID& IID() { static nsIID iid = NS_IRDFINT_IID; return iid; } + + /** + * Get the int32 value of the node. + */ + NS_IMETHOD GetValue(int32 *value) const = 0; + + /** + * Determine if two ints are identical. + */ + NS_IMETHOD EqualsInt(const nsIRDFInt* literal, PRBool* result) const = 0; +}; #endif // nsIRDFNode_h__ diff --git a/mozilla/rdf/base/public/nsIRDFService.h b/mozilla/rdf/base/public/nsIRDFService.h index 294e1c68930..ded747a1ae0 100644 --- a/mozilla/rdf/base/public/nsIRDFService.h +++ b/mozilla/rdf/base/public/nsIRDFService.h @@ -37,10 +37,14 @@ #include "nscore.h" #include "nsISupports.h" +#include "prtime.h" class nsIRDFDataBase; class nsIRDFDataSource; class nsIRDFLiteral; class nsIRDFResource; +class nsIRDFResourceFactory; +class nsIRDFDate; +class nsIRDFInt; // {BFD05261-834C-11d2-8EAC-00805F29F370} #define NS_IRDFSERVICE_IID \ @@ -56,9 +60,11 @@ public: /** * Construct an RDF resource from a single-byte URI. nsIRDFSerivce * caches resources that are in-use, so multiple calls to GetResource() - * for the same uri will return identical pointers. + * for the same uri will return identical pointers. FindResource + * is used to find out whether there already exists a resource corresponding to that url. */ NS_IMETHOD GetResource(const char* uri, nsIRDFResource** resource) = 0; + NS_IMETHOD FindResource(const char* uri, nsIRDFResource** resource, PRBool* found) = 0; /** * Construct an RDF resource from a Unicode URI. This is provided @@ -74,6 +80,18 @@ public: NS_IMETHOD GetLiteral(const PRUnichar* value, nsIRDFLiteral** literal) = 0; /** + + * Construct an RDF literal from a PRTime. + */ + NS_IMETHOD GetDateLiteral(const PRTime value, nsIRDFDate** date) = 0; + + /** + * Construct an RDF literal from an int. + */ + NS_IMETHOD GetIntLiteral(const int32 value, nsIRDFInt** intLiteral) = 0; + + /** + * Registers a resource with the RDF system, making it unique w.r.t. * GetResource. * @@ -100,6 +118,7 @@ public: NS_IMETHOD RegisterResource(nsIRDFResource* aResource, PRBool replace = PR_FALSE) = 0; /** + * Called to notify the resource manager that a resource is no * longer in use. This method should only be called from the * destructor of a "custom" resource implementation to notify the diff --git a/mozilla/rdf/base/public/rdf.h b/mozilla/rdf/base/public/rdf.h index 5c83472b201..5ab75189c94 100644 --- a/mozilla/rdf/base/public/rdf.h +++ b/mozilla/rdf/base/public/rdf.h @@ -66,6 +66,9 @@ static const char* kTag##prefix##_##name = #name #define NS_ERROR_RDF_CURSOR_EMPTY NS_ERROR_GENERATE_FAILURE(NS_ERROR_MODULE_RDF, 1) #define NS_ERROR_RDF_NO_VALUE NS_ERROR_GENERATE_FAILURE(NS_ERROR_MODULE_RDF, 2) + + + /* ProgID prefixes for RDF DLL registration. */ #define NS_RDF_PROGID "component:||netscape|rdf" #define NS_RDF_DATASOURCE_PROGID NS_RDF_PROGID "|datasource" @@ -73,6 +76,7 @@ static const char* kTag##prefix##_##name = #name #define NS_RDF_RESOURCE_FACTORY_PROGID "component:||netscape|rdf|resource-factory" #define NS_RDF_RESOURCE_FACTORY_PROGID_PREFIX NS_RDF_RESOURCE_FACTORY_PROGID "?name#" + /*@}*/ #ifdef _IMPL_NS_RDF diff --git a/mozilla/rdf/base/src/nsRDFService.cpp b/mozilla/rdf/base/src/nsRDFService.cpp index a45e3a5571a..4df0c07756e 100644 --- a/mozilla/rdf/base/src/nsRDFService.cpp +++ b/mozilla/rdf/base/src/nsRDFService.cpp @@ -25,6 +25,8 @@ 1) Implement the CreateDataBase() methods. + 2) Cache date and int literals. + */ #include "nsIAtom.h" @@ -69,6 +71,8 @@ static NS_DEFINE_CID(kRDFDefaultResourceCID, NS_RDFDEFAULTRESOURCE_CID); static NS_DEFINE_IID(kIRDFServiceIID, NS_IRDFSERVICE_IID); static NS_DEFINE_IID(kIRDFLiteralIID, NS_IRDFLITERAL_IID); +static NS_DEFINE_IID(kIRDFDateIID, NS_IRDFDATE_IID); +static NS_DEFINE_IID(kIRDFIntIID, NS_IRDFINT_IID); static NS_DEFINE_IID(kIRDFResourceIID, NS_IRDFRESOURCE_IID); static NS_DEFINE_IID(kIRDFNodeIID, NS_IRDFNODE_IID); static NS_DEFINE_IID(kISupportsIID, NS_ISUPPORTS_IID); @@ -97,8 +101,11 @@ public: // nsIRDFService NS_IMETHOD GetResource(const char* uri, nsIRDFResource** resource); + NS_IMETHOD FindResource(const char* uri, nsIRDFResource** resource, PRBool *found); NS_IMETHOD GetUnicodeResource(const PRUnichar* uri, nsIRDFResource** resource); NS_IMETHOD GetLiteral(const PRUnichar* value, nsIRDFLiteral** literal); + NS_IMETHOD GetDateLiteral(const PRTime value, nsIRDFDate** date) ; + NS_IMETHOD GetIntLiteral(const int32 value, nsIRDFInt** intLiteral); NS_IMETHOD RegisterResource(nsIRDFResource* aResource, PRBool replace = PR_FALSE); NS_IMETHOD UnregisterResource(nsIRDFResource* aResource); NS_IMETHOD RegisterDataSource(nsIRDFDataSource* dataSource, PRBool replace = PR_FALSE); @@ -131,7 +138,6 @@ public: NS_DECL_ISUPPORTS // nsIRDFNode - NS_IMETHOD Init(const char* uri); NS_IMETHOD EqualsNode(nsIRDFNode* node, PRBool* result) const; // nsIRDFLiteral @@ -175,15 +181,6 @@ LiteralImpl::QueryInterface(REFNSIID iid, void** result) return NS_NOINTERFACE; } -NS_IMETHODIMP -LiteralImpl::Init(const char* uri) -{ - // Literals should always be constructed by calling nsIRDFService::GetLiteral, - // so this method should never get called. - NS_NOTREACHED("RDF LiteralImpl::Init"); - return NS_ERROR_FAILURE; -} - NS_IMETHODIMP LiteralImpl::EqualsNode(nsIRDFNode* node, PRBool* result) const { @@ -230,6 +227,203 @@ LiteralImpl::EqualsLiteral(const nsIRDFLiteral* literal, PRBool* result) const return NS_OK; } + +//////////////////////////////////////////////////////////////////////// +// DateImpl +// + +class DateImpl : public nsIRDFDate { +public: + DateImpl(const PRTime s); + virtual ~DateImpl(void); + + // nsISupports + NS_DECL_ISUPPORTS + + // nsIRDFNode + NS_IMETHOD EqualsNode(nsIRDFNode* node, PRBool* result) const; + + // nsIRDFDate + NS_IMETHOD GetValue(PRTime *value) const; + NS_IMETHOD EqualsDate(const nsIRDFDate* date, PRBool* result) const; + +private: + PRTime mValue; +}; + + +DateImpl::DateImpl(const PRTime s) + : mValue(s) +{ + NS_INIT_REFCNT(); +} + +DateImpl::~DateImpl(void) +{ +} + +NS_IMPL_ADDREF(DateImpl); +NS_IMPL_RELEASE(DateImpl); + +nsresult +DateImpl::QueryInterface(REFNSIID iid, void** result) +{ + if (! result) + return NS_ERROR_NULL_POINTER; + + *result = nsnull; + if (iid.Equals(kIRDFDateIID) || + iid.Equals(kIRDFNodeIID) || + iid.Equals(kISupportsIID)) { + *result = NS_STATIC_CAST(nsIRDFDate*, this); + AddRef(); + return NS_OK; + } + return NS_NOINTERFACE; +} + +NS_IMETHODIMP +DateImpl::EqualsNode(nsIRDFNode* node, PRBool* result) const +{ + nsresult rv; + nsIRDFDate* date; + if (NS_SUCCEEDED(node->QueryInterface(kIRDFDateIID, (void**) &date))) { + rv = EqualsDate(date, result); + NS_RELEASE(date); + } + else { + *result = PR_FALSE; + rv = NS_OK; + } + return rv; +} + +NS_IMETHODIMP +DateImpl::GetValue(PRTime *value) const +{ + NS_ASSERTION(value, "null ptr"); + if (! value) + return NS_ERROR_NULL_POINTER; + + *value = mValue; + return NS_OK; +} + + +NS_IMETHODIMP +DateImpl::EqualsDate(const nsIRDFDate* date, PRBool* result) const +{ + NS_ASSERTION(date && result, "null ptr"); + if (!date || !result) + return NS_ERROR_NULL_POINTER; + + nsresult rv; + PRTime p; + if (NS_FAILED(rv = date->GetValue(&p))) + return rv; + + *result = LL_EQ(p, mValue); + return NS_OK; +} + +//////////////////////////////////////////////////////////////////////// +// IntImpl +// + +class IntImpl : public nsIRDFInt { +public: + IntImpl(const int32 s); + virtual ~IntImpl(void); + + // nsISupports + NS_DECL_ISUPPORTS + + // nsIRDFNode + NS_IMETHOD EqualsNode(nsIRDFNode* node, PRBool* result) const; + + // nsIRDFInt + NS_IMETHOD GetValue(int32 *value) const; + NS_IMETHOD EqualsInt(const nsIRDFInt* value, PRBool* result) const; + +private: + int32 mValue; +}; + + +IntImpl::IntImpl(const int32 s) + : mValue(s) +{ + NS_INIT_REFCNT(); +} + +IntImpl::~IntImpl(void) +{ +} + +NS_IMPL_ADDREF(IntImpl); +NS_IMPL_RELEASE(IntImpl); + +nsresult +IntImpl::QueryInterface(REFNSIID iid, void** result) +{ + if (! result) + return NS_ERROR_NULL_POINTER; + + *result = nsnull; + if (iid.Equals(kIRDFIntIID) || + iid.Equals(kIRDFNodeIID) || + iid.Equals(kISupportsIID)) { + *result = NS_STATIC_CAST(nsIRDFInt*, this); + AddRef(); + return NS_OK; + } + return NS_NOINTERFACE; +} + +NS_IMETHODIMP +IntImpl::EqualsNode(nsIRDFNode* node, PRBool* result) const +{ + nsresult rv; + nsIRDFInt* intValue; + if (NS_SUCCEEDED(node->QueryInterface(kIRDFIntIID, (void**) &intValue))) { + rv = EqualsInt(intValue, result); + NS_RELEASE(intValue); + } + else { + *result = PR_FALSE; + rv = NS_OK; + } + return rv; +} + +NS_IMETHODIMP +IntImpl::GetValue(int32 *value) const +{ + NS_ASSERTION(value, "null ptr"); + if (! value) + return NS_ERROR_NULL_POINTER; + + *value = mValue; + return NS_OK; +} + + +NS_IMETHODIMP +IntImpl::EqualsInt(const nsIRDFInt* intValue, PRBool* result) const +{ + NS_ASSERTION(intValue && result, "null ptr"); + if (!intValue || !result) + return NS_ERROR_NULL_POINTER; + + nsresult rv; + int32 p; + if (NS_FAILED(rv = intValue->GetValue(&p))) + return rv; + + *result = (p == mValue); + return NS_OK; +} + //////////////////////////////////////////////////////////////////////// // ServiceImpl @@ -443,6 +637,21 @@ ServiceImpl::GetResource(const char* aURI, nsIRDFResource** aResource) return rv; } +NS_IMETHODIMP +ServiceImpl::FindResource(const char* uri, nsIRDFResource** resource, PRBool *found) +{ + nsIRDFResource* result = + NS_STATIC_CAST(nsIRDFResource*, PL_HashTableLookup(mResources, uri)); + + if (result) { + *resource = result; + *found = 1; + } else { + *found = 0; + } + return NS_OK; +} + NS_IMETHODIMP ServiceImpl::GetUnicodeResource(const PRUnichar* aURI, nsIRDFResource** aResource) { @@ -495,6 +704,32 @@ ServiceImpl::GetLiteral(const PRUnichar* aValue, nsIRDFLiteral** aLiteral) return NS_OK; } +NS_IMETHODIMP +ServiceImpl::GetDateLiteral(const PRTime time, nsIRDFDate** literal) +{ + // XXX how do we cache these? should they live in their own hashtable? + DateImpl* result = new DateImpl(time); + if (! result) + return NS_ERROR_OUT_OF_MEMORY; + + *literal = result; + NS_ADDREF(result); + return NS_OK; +} + +NS_IMETHODIMP +ServiceImpl::GetIntLiteral(const int32 value, nsIRDFInt** literal) +{ + // XXX how do we cache these? should they live in their own hashtable? + IntImpl* result = new IntImpl(value); + if (! result) + return NS_ERROR_OUT_OF_MEMORY; + + *literal = result; + NS_ADDREF(result); + return NS_OK; +} + NS_IMETHODIMP ServiceImpl::RegisterResource(nsIRDFResource* aResource, PRBool replace) { diff --git a/mozilla/rdf/base/src/rdfutil.h b/mozilla/rdf/base/src/rdfutil.h index 84252381716..e7346557196 100644 --- a/mozilla/rdf/base/src/rdfutil.h +++ b/mozilla/rdf/base/src/rdfutil.h @@ -36,6 +36,7 @@ class nsIRDFArcsOutCursor; class nsIRDFAssertionCursor; class nsIRDFCursor; class nsIRDFDataSource; +class nsIRDFResource; class nsIRDFNode; class nsIRDFResource; class nsString; @@ -235,7 +236,7 @@ NS_NewEmptyRDFArcsInCursor(nsIRDFArcsInCursor** result); PR_EXTERN(nsresult) NS_NewEmptyRDFArcsOutCursor(nsIRDFArcsOutCursor** result); - +PR_EXTERN(void) SHTtest (); // XXX need to move nsEmptyCursor stuff here. #endif // rdfutil_h__ diff --git a/mozilla/rdf/build/Makefile.in b/mozilla/rdf/build/Makefile.in index 99df5b53ad8..35d55b98928 100644 --- a/mozilla/rdf/build/Makefile.in +++ b/mozilla/rdf/build/Makefile.in @@ -73,3 +73,4 @@ install:: $(TARGETS) $(INSTALL) $(srcdir)/../resources/bookmarks.xul $(DIST)/bin/res/rdf $(INSTALL) $(srcdir)/../resources/bookmarks.css $(DIST)/bin/res/rdf $(INSTALL) $(srcdir)/../resources/bookmarks.html $(DIST)/bin/res/rdf + $(INSTALL) $(srcdir)/../resources/History/h1.hst $(DIST)/bin/res/rdf/History diff --git a/mozilla/rdf/build/makefile.win b/mozilla/rdf/build/makefile.win index 92197e4d870..9d979f74cf1 100644 --- a/mozilla/rdf/build/makefile.win +++ b/mozilla/rdf/build/makefile.win @@ -74,6 +74,8 @@ install:: $(DLL) $(MAKE_INSTALL) ..\resources\bookmarks.xul $(DIST)\bin\res\rdf $(MAKE_INSTALL) ..\resources\bookmarks.css $(DIST)\bin\res\rdf $(MAKE_INSTALL) ..\resources\bookmarks.html $(DIST)\bin\res\rdf + $(MAKE_INSTALL) ..\resources\History\h1.hst $(DIST)\bin\res\rdf\History + diff --git a/mozilla/rdf/build/nsRDFCID.h b/mozilla/rdf/build/nsRDFCID.h index dca282b540a..14d0b1748cd 100644 --- a/mozilla/rdf/build/nsRDFCID.h +++ b/mozilla/rdf/build/nsRDFCID.h @@ -94,4 +94,8 @@ #define NS_XULDOCUMENT_CID \ { 0x541afcb2, 0xa9a3, 0x11d2, { 0x8e, 0xc5, 0x0, 0x80, 0x5f, 0x29, 0xf3, 0x70 } } +// {1EAAFD60-D596-11d2-80BE-006097B76B8E} +#define NS_RDFHISTORYDATASOURCE_CID \ +{ 0x1eaafd60, 0xd596, 0x11d2, { 0x80, 0xbe, 0x0, 0x60, 0x97, 0xb7, 0x6b, 0x8e } } + #endif // nsRDFCID_h__ diff --git a/mozilla/rdf/build/nsRDFFactory.cpp b/mozilla/rdf/build/nsRDFFactory.cpp index d6b2d897c51..d54103fb3a5 100644 --- a/mozilla/rdf/build/nsRDFFactory.cpp +++ b/mozilla/rdf/build/nsRDFFactory.cpp @@ -43,21 +43,22 @@ static NS_DEFINE_IID(kISupportsIID, NS_ISUPPORTS_IID); static NS_DEFINE_IID(kIFactoryIID, NS_IFACTORY_IID); static NS_DEFINE_CID(kRDFBookmarkDataSourceCID, NS_RDFBOOKMARKDATASOURCE_CID); -static NS_DEFINE_CID(kRDFFileSystemDataSourceCID,NS_RDFFILESYSTEMDATASOURCE_CID); static NS_DEFINE_CID(kRDFCompositeDataSourceCID, NS_RDFCOMPOSITEDATASOURCE_CID); static NS_DEFINE_CID(kRDFContentSinkCID, NS_RDFCONTENTSINK_CID); +static NS_DEFINE_CID(kRDFDefaultResourceCID, NS_RDFDEFAULTRESOURCE_CID); +static NS_DEFINE_CID(kRDFFileSystemDataSourceCID,NS_RDFFILESYSTEMDATASOURCE_CID); static NS_DEFINE_CID(kRDFHTMLBuilderCID, NS_RDFHTMLBUILDER_CID); +static NS_DEFINE_CID(kRDFHistoryDataSourceCID, NS_RDFHISTORYDATASOURCE_CID); static NS_DEFINE_CID(kRDFInMemoryDataSourceCID, NS_RDFINMEMORYDATASOURCE_CID); -static NS_DEFINE_CID(kRDFServiceCID, NS_RDFSERVICE_CID); static NS_DEFINE_CID(kRDFMenuBuilderCID, NS_RDFMENUBUILDER_CID); +static NS_DEFINE_CID(kRDFServiceCID, NS_RDFSERVICE_CID); static NS_DEFINE_CID(kRDFToolbarBuilderCID, NS_RDFTOOLBARBUILDER_CID); static NS_DEFINE_CID(kRDFTreeBuilderCID, NS_RDFTREEBUILDER_CID); static NS_DEFINE_CID(kRDFXMLDataSourceCID, NS_RDFXMLDATASOURCE_CID); static NS_DEFINE_CID(kRDFXULBuilderCID, NS_RDFXULBUILDER_CID); static NS_DEFINE_CID(kXULContentSinkCID, NS_XULCONTENTSINK_CID); -static NS_DEFINE_CID(kXULDataSourceCID, NS_XULDATASOURCE_CID); +static NS_DEFINE_CID(kXULDataSourceCID, NS_XULDATASOURCE_CID); static NS_DEFINE_CID(kXULDocumentCID, NS_XULDOCUMENT_CID); -static NS_DEFINE_CID(kRDFDefaultResourceCID, NS_RDFDEFAULTRESOURCE_CID); static NS_DEFINE_CID(kXULSortServiceCID, NS_XULSORTSERVICE_CID); class RDFFactoryImpl : public nsIFactory @@ -140,7 +141,7 @@ RDFFactoryImpl::CreateInstance(nsISupports *aOuter, *aResult = nsnull; nsresult rv; - PRBool wasRefCounted = PR_TRUE; + nsISupports *inst = nsnull; if (mClassID.Equals(kRDFServiceCID)) { if (NS_FAILED(rv = NS_NewRDFService((nsIRDFService**) &inst))) @@ -171,6 +172,10 @@ RDFFactoryImpl::CreateInstance(nsISupports *aOuter, if (NS_FAILED(rv = NS_NewRDFCompositeDataSource((nsIRDFCompositeDataSource**) &inst))) return rv; } + else if (mClassID.Equals(kRDFHistoryDataSourceCID)) { + if (NS_FAILED(rv = NS_NewRDFHistoryDataSource((nsIRDFDataSource**) &inst))) + return rv; + } else if (mClassID.Equals(kXULDocumentCID)) { if (NS_FAILED(rv = NS_NewXULDocument((nsIRDFDocument**) &inst))) return rv; @@ -218,13 +223,12 @@ RDFFactoryImpl::CreateInstance(nsISupports *aOuter, if (! inst) return NS_ERROR_OUT_OF_MEMORY; - if (NS_FAILED(rv = inst->QueryInterface(aIID, aResult))) - // We didn't get the right interface, so clean up - delete inst; - - if (wasRefCounted) - NS_IF_RELEASE(inst); + if (NS_FAILED(rv = inst->QueryInterface(aIID, aResult))) { + // We didn't get the right interface. + NS_ERROR("didn't support the interface you wanted"); + } + NS_IF_RELEASE(inst); return rv; } @@ -276,6 +280,10 @@ NSRegisterSelf(nsISupports* serviceMgr, const char* aPath) "RDF File System Data Source", NS_RDF_DATASOURCE_PROGID_PREFIX "files", aPath, PR_TRUE, PR_TRUE); + rv = nsRepository::RegisterComponent(kRDFHistoryDataSourceCID, + "RDF History Data Source", + NS_RDF_DATASOURCE_PROGID_PREFIX "history", + aPath, PR_TRUE, PR_TRUE); rv = nsRepository::RegisterComponent(kRDFCompositeDataSourceCID, "RDF Composite Data Source", NS_RDF_DATASOURCE_PROGID_PREFIX "composite-datasource", @@ -352,6 +360,7 @@ NSUnregisterSelf(nsISupports* serviceMgr, const char* aPath) rv = nsRepository::UnregisterComponent(kRDFBookmarkDataSourceCID, aPath); rv = nsRepository::UnregisterComponent(kRDFFileSystemDataSourceCID,aPath); + rv = nsRepository::UnregisterComponent(kRDFHistoryDataSourceCID, aPath); rv = nsRepository::UnregisterComponent(kRDFCompositeDataSourceCID, aPath); rv = nsRepository::UnregisterComponent(kRDFInMemoryDataSourceCID, aPath); rv = nsRepository::UnregisterComponent(kRDFXMLDataSourceCID, aPath); diff --git a/mozilla/rdf/content/src/nsRDFGenericBuilder.cpp b/mozilla/rdf/content/src/nsRDFGenericBuilder.cpp index 0c73f8e7670..b8f304cc51c 100644 --- a/mozilla/rdf/content/src/nsRDFGenericBuilder.cpp +++ b/mozilla/rdf/content/src/nsRDFGenericBuilder.cpp @@ -756,7 +756,9 @@ RDFGenericBuilderImpl::OnSetAttribute(nsIDOMElement* aElement, const nsString& a } if ((rv == NS_CONTENT_ATTR_NO_VALUE) || (rv == NS_CONTENT_ATTR_NOT_THERE) || - ((rv == NS_CONTENT_ATTR_HAS_VALUE) && (! attrValue.EqualsIgnoreCase(aValue)))) { + ((rv == NS_CONTENT_ATTR_HAS_VALUE) && (! attrValue.EqualsIgnoreCase(aValue))) || + PR_TRUE // XXX just always allow this to fire. + ) { // Okay, it's really changing. // This is a "transient" property, so we _don't_ go to the diff --git a/mozilla/rdf/content/src/nsRDFTreeBuilder.cpp b/mozilla/rdf/content/src/nsRDFTreeBuilder.cpp index 5a08ab1c98c..87419ba051a 100644 --- a/mozilla/rdf/content/src/nsRDFTreeBuilder.cpp +++ b/mozilla/rdf/content/src/nsRDFTreeBuilder.cpp @@ -360,8 +360,8 @@ RDFTreeBuilderImpl::AddWidgetItem(nsIContent* aElement, return rv; } - // Ignore ordinal properties - if (rdf_IsOrdinalProperty(property)) + // Ignore properties that are used to indicate "tree-ness" + if (IsWidgetProperty(aElement, property)) continue; PRInt32 nameSpaceID; diff --git a/mozilla/rdf/content/src/nsXULTemplateBuilder.cpp b/mozilla/rdf/content/src/nsXULTemplateBuilder.cpp index 0c73f8e7670..b8f304cc51c 100644 --- a/mozilla/rdf/content/src/nsXULTemplateBuilder.cpp +++ b/mozilla/rdf/content/src/nsXULTemplateBuilder.cpp @@ -756,7 +756,9 @@ RDFGenericBuilderImpl::OnSetAttribute(nsIDOMElement* aElement, const nsString& a } if ((rv == NS_CONTENT_ATTR_NO_VALUE) || (rv == NS_CONTENT_ATTR_NOT_THERE) || - ((rv == NS_CONTENT_ATTR_HAS_VALUE) && (! attrValue.EqualsIgnoreCase(aValue)))) { + ((rv == NS_CONTENT_ATTR_HAS_VALUE) && (! attrValue.EqualsIgnoreCase(aValue))) || + PR_TRUE // XXX just always allow this to fire. + ) { // Okay, it's really changing. // This is a "transient" property, so we _don't_ go to the diff --git a/mozilla/rdf/datasource/public/MANIFEST b/mozilla/rdf/datasource/public/MANIFEST index c1f19f50bf1..336f55ea291 100644 --- a/mozilla/rdf/datasource/public/MANIFEST +++ b/mozilla/rdf/datasource/public/MANIFEST @@ -1,2 +1,3 @@ +nsIRDFHistory.h nsIRDFFileSystem.h nsIXULContentSink.h diff --git a/mozilla/rdf/datasource/public/Makefile.in b/mozilla/rdf/datasource/public/Makefile.in index 26e9d429f9e..16b46252b26 100644 --- a/mozilla/rdf/datasource/public/Makefile.in +++ b/mozilla/rdf/datasource/public/Makefile.in @@ -25,8 +25,9 @@ include $(DEPTH)/config/autoconf.mk MODULE = rdf EXPORTS = \ - nsIXULContentSink.h \ nsIRDFFileSystem.h \ + nsIRDFHistory.h \ + nsIXULContentSink.h \ $(NULL) EXPORTS := $(addprefix $(srcdir)/, $(EXPORTS)) diff --git a/mozilla/rdf/datasource/public/makefile.win b/mozilla/rdf/datasource/public/makefile.win index a6a8fa5ee61..885be07a5d7 100644 --- a/mozilla/rdf/datasource/public/makefile.win +++ b/mozilla/rdf/datasource/public/makefile.win @@ -21,8 +21,9 @@ MODULE=rdf DEPTH=..\..\.. EXPORTS = \ - nsIXULContentSink.h \ - nsIRDFFileSystem.h \ + nsIRDFFileSystem.h \ + nsIRDFHistory.h \ + nsIXULContentSink.h \ $(NULL) include <$(DEPTH)/config/rules.mak> diff --git a/mozilla/rdf/datasource/public/nsIRDFHistory.h b/mozilla/rdf/datasource/public/nsIRDFHistory.h index 2b44825bb48..caadf48e64b 100644 --- a/mozilla/rdf/datasource/public/nsIRDFHistory.h +++ b/mozilla/rdf/datasource/public/nsIRDFHistory.h @@ -24,20 +24,21 @@ // {115CE051-A59D-11d2-80B6-006097B76B8E} #define NS_IRDFWEBPAGE_IID \ -{ 0x115ce051, 0xa59d, 0x11d2, { 0x80, 0xb6, 0x0, 0x60, 0x97, 0xb7, 0x6b, 0x8e } }; +{ 0x115ce051, 0xa59d, 0x11d2, { 0x80, 0xb6, 0x0, 0x60, 0x97, 0xb7, 0x6b, 0x8e } } // {1A880051-A59D-11d2-80B6-006097B76B8E} #define NS_IRDFHISTORYDATASOURCE_IID \ -{ 0x1a880051, 0xa59d, 0x11d2, { 0x80, 0xb6, 0x0, 0x60, 0x97, 0xb7, 0x6b, 0x8e } }; +{ 0x1a880051, 0xa59d, 0x11d2, { 0x80, 0xb6, 0x0, 0x60, 0x97, 0xb7, 0x6b, 0x8e } } class nsIRDFHistoryDataSource : public nsIRDFDataSource { public: + static const nsIID& GetIID() { static nsIID iid = NS_IRDFHISTORYDATASOURCE_IID; return iid; } /** * Add the specified item to history */ - NS_IMETHOD AddPage (const char* uri) = 0; + NS_IMETHOD AddPage (const char* uri, const char* referer, PRTime date) = 0; /** * Set the title of the page @@ -52,5 +53,19 @@ public: /** * Get the uri's last visit date */ - NS_IMETHOD LastVisitDate (const char* uri, unit32 *date) = 0; + NS_IMETHOD LastVisitDate (const char* uri, uint32 *date) = 0; + + /** + * Get the preferred completion + */ + NS_IMETHOD CompleteURL (const char* prefix, char** preferredCompletion) = 0; }; + +#endif nsIRDFHistory_h + + + + + + + diff --git a/mozilla/rdf/datasource/src/Makefile.in b/mozilla/rdf/datasource/src/Makefile.in index f6b8ca6e184..3caccee17dd 100644 --- a/mozilla/rdf/datasource/src/Makefile.in +++ b/mozilla/rdf/datasource/src/Makefile.in @@ -29,6 +29,7 @@ LIBRARY_NAME = rdfdatasource_s CPPSRCS = \ nsBookmarkDataSource.cpp \ nsFileSystemDataSource.cpp \ + nsHistoryDataSource.cpp \ nsXULContentSink.cpp \ nsXULDataSource.cpp \ $(NULL) diff --git a/mozilla/rdf/datasource/src/makefile.win b/mozilla/rdf/datasource/src/makefile.win index 95665abd1f7..e9eea90627e 100644 --- a/mozilla/rdf/datasource/src/makefile.win +++ b/mozilla/rdf/datasource/src/makefile.win @@ -21,6 +21,7 @@ LIBRARY_NAME=rdfdatasource_s CPP_OBJS=\ .\$(OBJDIR)\nsBookmarkDataSource.obj \ + .\$(OBJDIR)\nsHistoryDataSource.obj \ .\$(OBJDIR)\nsFileSystemDataSource.obj \ .\$(OBJDIR)\nsXULContentSink.obj \ .\$(OBJDIR)\nsXULDataSource.obj \ diff --git a/mozilla/rdf/datasource/src/nsFileSystemDataSource.cpp b/mozilla/rdf/datasource/src/nsFileSystemDataSource.cpp index d4f38ca15d7..586a3a94cdc 100644 --- a/mozilla/rdf/datasource/src/nsFileSystemDataSource.cpp +++ b/mozilla/rdf/datasource/src/nsFileSystemDataSource.cpp @@ -82,6 +82,19 @@ DEFINE_RDF_VOCAB(RDF_NAMESPACE_URI, RDF, Seq); static nsIRDFService *gRDFService = nsnull; static FileSystemDataSource *gFileSystemDataSource = nsnull; +PRInt32 FileSystemDataSource::gRefCnt; + +nsIRDFResource *FileSystemDataSource::kNC_FileSystemRoot; +nsIRDFResource *FileSystemDataSource::kNC_Child; +nsIRDFResource *FileSystemDataSource::kNC_Name; +nsIRDFResource *FileSystemDataSource::kNC_URL; +nsIRDFResource *FileSystemDataSource::kNC_Columns; +nsIRDFResource *FileSystemDataSource::kNC_Folder; + +nsIRDFResource *FileSystemDataSource::kRDF_InstanceOf; +nsIRDFResource *FileSystemDataSource::kRDF_type; +nsIRDFResource *FileSystemDataSource::kRDF_Seq; + static PRBool @@ -124,46 +137,62 @@ FileSystemDataSource::FileSystemDataSource(void) : mURI(nsnull), mObservers(nsnull) { - NS_INIT_REFCNT(); - nsresult rv = nsServiceManager::GetService(kRDFServiceCID, - kIRDFServiceIID, (nsISupports**) &gRDFService); - PR_ASSERT(NS_SUCCEEDED(rv)); - gFileSystemDataSource = this; + NS_INIT_REFCNT(); + + if (gRefCnt++ == 0) { + nsresult rv = nsServiceManager::GetService(kRDFServiceCID, + kIRDFServiceIID, + (nsISupports**) &gRDFService); + + PR_ASSERT(NS_SUCCEEDED(rv)); + + gRDFService->GetResource(kURINC_FileSystemRoot, &kNC_FileSystemRoot); + gRDFService->GetResource(kURINC_child, &kNC_Child); + gRDFService->GetResource(kURINC_Name, &kNC_Name); + gRDFService->GetResource(kURINC_URL, &kNC_URL); + gRDFService->GetResource(kURINC_Folder, &kNC_Folder); + + gRDFService->GetResource(kURIRDF_instanceOf, &kRDF_InstanceOf); + gRDFService->GetResource(kURIRDF_type, &kRDF_type); + gRDFService->GetResource(kURIRDF_Seq, &kRDF_Seq); + + gFileSystemDataSource = this; + } } FileSystemDataSource::~FileSystemDataSource (void) { - gRDFService->UnregisterDataSource(this); + gRDFService->UnregisterDataSource(this); - PL_strfree(mURI); - if (nsnull != mObservers) + PL_strfree(mURI); + if (nsnull != mObservers) { - for (PRInt32 i = mObservers->Count(); i >= 0; --i) + for (PRInt32 i = mObservers->Count(); i >= 0; --i) { - nsIRDFObserver* obs = (nsIRDFObserver*) mObservers->ElementAt(i); - NS_RELEASE(obs); + nsIRDFObserver* obs = (nsIRDFObserver*) mObservers->ElementAt(i); + NS_RELEASE(obs); } - delete mObservers; - mObservers = nsnull; + delete mObservers; + mObservers = nsnull; } - nsrefcnt refcnt; - NS_RELEASE2(kNC_FileSystemRoot, refcnt); - NS_RELEASE2(kNC_Child, refcnt); - NS_RELEASE2(kNC_Name, refcnt); - NS_RELEASE2(kNC_URL, refcnt); -// NS_RELEASE2(kNC_Columns, refcnt); - NS_RELEASE2(kNC_Folder, refcnt); + if (--gRefCnt == 0) { + NS_RELEASE(kNC_FileSystemRoot); + NS_RELEASE(kNC_Child); + NS_RELEASE(kNC_Name); + NS_RELEASE(kNC_URL); + NS_RELEASE(kNC_Folder); - NS_RELEASE2(kRDF_InstanceOf, refcnt); - NS_RELEASE2(kRDF_type, refcnt); - NS_RELEASE2(kRDF_Seq, refcnt); + NS_RELEASE(kRDF_InstanceOf); + NS_RELEASE(kRDF_type); + NS_RELEASE(kRDF_Seq); - gFileSystemDataSource = nsnull; - nsServiceManager::ReleaseService(kRDFServiceCID, gRDFService); - gRDFService = nsnull; + gFileSystemDataSource = nsnull; + nsServiceManager::ReleaseService(kRDFServiceCID, gRDFService); + gRDFService = nsnull; + } } @@ -181,18 +210,6 @@ FileSystemDataSource::Init(const char *uri) if ((mURI = PL_strdup(uri)) == nsnull) return rv; - gRDFService->GetResource(kURINC_FileSystemRoot, &kNC_FileSystemRoot); - gRDFService->GetResource(kURINC_child, &kNC_Child); - gRDFService->GetResource(kURINC_Name, &kNC_Name); - gRDFService->GetResource(kURINC_URL, &kNC_URL); -// gRDFService->GetResource(kURINC_Columns, &kNC_Columns); - gRDFService->GetResource(kURINC_Folder, &kNC_Folder); - - gRDFService->GetResource(kURIRDF_instanceOf, &kRDF_InstanceOf); - gRDFService->GetResource(kURIRDF_type, &kRDF_type); - gRDFService->GetResource(kURIRDF_Seq, &kRDF_Seq); - - // if (NS_FAILED(rv = AddColumns())) // return rv; @@ -623,7 +640,7 @@ FileSystemCursor::FileSystemCursor(nsIRDFResource *source, mTarget(nsnull), mValue(nsnull) { -// NS_INIT_REFCNT(); + NS_INIT_REFCNT(); NS_ADDREF(mSource); NS_ADDREF(mProperty); } @@ -654,6 +671,7 @@ FileSystemCursor::Advance(void) NS_IF_RELEASE(mValue); mTarget = mValue = (nsIRDFNode *)mArray->ElementAt(mCount++); NS_ADDREF(mValue); + NS_ADDREF(mTarget); return NS_OK; } diff --git a/mozilla/rdf/datasource/src/nsFileSystemDataSource.h b/mozilla/rdf/datasource/src/nsFileSystemDataSource.h index 1cf2c87abed..da02319a40c 100644 --- a/mozilla/rdf/datasource/src/nsFileSystemDataSource.h +++ b/mozilla/rdf/datasource/src/nsFileSystemDataSource.h @@ -77,16 +77,19 @@ private: char *mURI; nsVoidArray *mObservers; - nsIRDFResource *kNC_FileSystemRoot; - nsIRDFResource *kNC_Child; - nsIRDFResource *kNC_Name; - nsIRDFResource *kNC_URL; - nsIRDFResource *kNC_Columns; - nsIRDFResource *kNC_Folder; + static PRInt32 gRefCnt; - nsIRDFResource *kRDF_InstanceOf; - nsIRDFResource *kRDF_type; - nsIRDFResource *kRDF_Seq; + // pseudo-constants + static nsIRDFResource *kNC_FileSystemRoot; + static nsIRDFResource *kNC_Child; + static nsIRDFResource *kNC_Name; + static nsIRDFResource *kNC_URL; + static nsIRDFResource *kNC_Columns; + static nsIRDFResource *kNC_Folder; + + static nsIRDFResource *kRDF_InstanceOf; + static nsIRDFResource *kRDF_type; + static nsIRDFResource *kRDF_Seq; public: diff --git a/mozilla/rdf/datasource/src/nsHistoryDataSource.cpp b/mozilla/rdf/datasource/src/nsHistoryDataSource.cpp index 764aa4c84e8..7dc697e854c 100644 --- a/mozilla/rdf/datasource/src/nsHistoryDataSource.cpp +++ b/mozilla/rdf/datasource/src/nsHistoryDataSource.cpp @@ -29,15 +29,15 @@ #include "nsVoidArray.h" // XXX introduces dependency on raptorbase #include "nsRDFCID.h" #include "rdfutil.h" -#include "nsIRDFMail.h" +#include "nsIRDFHistory.h" #include "nsIRDFService.h" #include "plhash.h" #include "plstr.h" #include "prmem.h" #include "prprf.h" #include "prio.h" +#include "prtime.h" -#include "nsMailDataSource.h" //////////////////////////////////////////////////////////////////////// // Interface IDs @@ -48,10 +48,9 @@ static NS_DEFINE_IID(kIRDFAssertionCursorIID, NS_IRDFASSERTIONCURSOR_IID); static NS_DEFINE_IID(kIRDFCursorIID, NS_IRDFCURSOR_IID); static NS_DEFINE_IID(kIRDFDataSourceIID, NS_IRDFDATASOURCE_IID); static NS_DEFINE_IID(kIRDFLiteralIID, NS_IRDFLITERAL_IID); -static NS_DEFINE_IID(kIRDFHistoryDataSourceIID, NS_IRDFHISTORYDATAOURCE_IID); +static NS_DEFINE_IID(kIRDFHistoryDataSourceIID, NS_IRDFHISTORYDATASOURCE_IID); static NS_DEFINE_IID(kIRDFNodeIID, NS_IRDFNODE_IID); static NS_DEFINE_IID(kIRDFResourceIID, NS_IRDFRESOURCE_IID); -static NS_DEFINE_IID(kIRDFResourceFactoryIID, NS_IRDFRESOURCEFACTORY_IID); static NS_DEFINE_IID(kIRDFServiceIID, NS_IRDFSERVICE_IID); static NS_DEFINE_IID(kISupportsIID, NS_ISUPPORTS_IID); static NS_DEFINE_CID(kRDFServiceCID, NS_RDFSERVICE_CID); @@ -61,25 +60,74 @@ static NS_DEFINE_CID(kRDFInMemoryDataSourceCID, NS_RDFINMEMORYDATASOURCE_CID) // RDF property & resource declarations static const char kURIHistoryRoot[] = "HistoryRoot"; +static nsIRDFService* gRDFService = nsnull; + + +DEFINE_RDF_VOCAB(RDF_NAMESPACE_URI, RDF, instanceOf); DEFINE_RDF_VOCAB(NC_NAMESPACE_URI, NC, child); DEFINE_RDF_VOCAB(NC_NAMESPACE_URI, NC, Name); DEFINE_RDF_VOCAB(NC_NAMESPACE_URI, NC, Folder); -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_RDF_VOCAB(NC_NAMESPACE_URI, NC, Page); +DEFINE_RDF_VOCAB(NC_NAMESPACE_URI, NC, Date); +DEFINE_RDF_VOCAB(NC_NAMESPACE_URI, NC, Referer); DEFINE_RDF_VOCAB(WEB_NAMESPACE_URI, WEB, LastVisitDate); DEFINE_RDF_VOCAB(WEB_NAMESPACE_URI, WEB, LastModifiedDate); +typedef struct _HistoryEntry { + PRTime date; + char* url; + char* referer; +} HistoryEntry; +typedef HistoryEntry* HE; -class nsHistoryDataSource : public nsIHistoryDataSource { - nsIRDFDataSource** mInner; +static PLHashNumber +rdf_HashPointer(const void* key) +{ + return (PLHashNumber) key; +} + +class nsHistoryDataSource : public nsIRDFHistoryDataSource { +protected: + nsIRDFDataSource* mInner; nsVoidArray mFiles; - + char* mCurrentFilePath; + FILE* mCurrentFile; + nsVoidArray mPendingWrites; + PLHashTable* mLastVisitDateHash; + PRExplodedTime mSessionTime; + + nsIRDFResource* mResourcePage; + nsIRDFResource* mResourceDate; + nsIRDFResource* mResourceTitle; + nsIRDFResource* mResourceReferer; + nsIRDFResource* mResourceChild; + nsIRDFResource* mResourceHistoryBySite; + + nsresult ReadHistory(void); + nsresult ReadOneHistoryFile(const char* uri); + nsresult AddPageToGraph(char* url, char* title, char* referer, PRTime date); + nsresult AddToDateHierarchy (PRTime date, nsIRDFResource* resource) ; + nsresult getSiteOfURL(char* url, nsIRDFResource** resource) ; + public: + // nsISupports + NS_DECL_ISUPPORTS + + nsHistoryDataSource(void) { + NS_INIT_REFCNT(); + } + + virtual ~nsHistoryDataSource(void) { + NS_RELEASE(mInner); + nsServiceManager::ReleaseService(kRDFServiceCID, gRDFService); + } + NS_IMETHOD Init(const char* uri) ; + NS_IMETHOD GetURI(const char* *uri) { return mInner->GetURI(uri); } @@ -159,4 +207,298 @@ public: return mInner->DoCommand(aCommand, aCommandTarget); } + NS_IMETHOD GetURI(const char* *uri) const { + return mInner->GetURI(uri); + } + + NS_IMETHOD GetAllResources(nsIRDFResourceCursor** aCursor) { + return mInner->GetAllResources(aCursor); + } + + NS_IMETHOD AddPage (const char* uri, const char* referer, PRTime time); + + NS_IMETHOD SetPageTitle (const char* uri, PRUnichar* title) ; + + NS_IMETHOD RemovePage (nsIRDFResource* page) { + return NS_OK; + } + + NS_IMETHOD LastVisitDate (const char* uri, uint32 *date) { + nsIRDFResource* res; + PRBool found = 0; + *date = 0; + gRDFService->FindResource(uri, &res, &found); + if (found) *date = (uint32)PL_HashTableLookup(mLastVisitDateHash, res); + return NS_OK; + } + + nsresult UpdateLastVisitDate (nsIRDFResource* res, uint32 date) { + uint32 edate = (uint32) PL_HashTableLookup(mLastVisitDateHash, res); + if (edate && (edate > date)) return NS_OK; + PL_HashTableAdd(mLastVisitDateHash, res, (void*)date); + return NS_OK; + } + + NS_IMETHOD CompleteURL (const char* prefix, char** preferredCompletion) { + return NS_OK; + } + }; + +NS_IMPL_ADDREF(nsHistoryDataSource); +NS_IMPL_RELEASE(nsHistoryDataSource); + +NS_IMETHODIMP +nsHistoryDataSource::QueryInterface(REFNSIID aIID, void** aResult) +{ + NS_PRECONDITION(aResult != nsnull, "null ptr"); + if (! aResult) + return NS_ERROR_NULL_POINTER; + + if (aIID.Equals(nsIRDFHistoryDataSource::GetIID()) || + aIID.Equals(nsIRDFDataSource::GetIID()) || + aIID.Equals(nsISupports::GetIID())) { + *aResult = NS_STATIC_CAST(nsIRDFHistoryDataSource*, this); + NS_ADDREF(this); + return NS_OK; + } + else { + *aResult = nsnull; + return NS_NOINTERFACE; + } +} + +NS_IMETHODIMP +nsHistoryDataSource::Init(const char* uri) +{ + nsresult rv; + if (NS_FAILED(rv = nsRepository::CreateInstance(kRDFInMemoryDataSourceCID, + nsnull, kIRDFDataSourceIID, + (void**) &mInner))) + return rv; + + if (NS_FAILED(rv = mInner->Init(uri))) + return rv; + + + rv = nsServiceManager::GetService(kRDFServiceCID, + kIRDFServiceIID, + (nsISupports**) &gRDFService); + + PR_ASSERT(NS_SUCCEEDED(rv)); + + // register this as a named data source with the RDF service + gRDFService->RegisterDataSource(this); + + gRDFService->GetResource(kURINC_Page, &mResourcePage); + gRDFService->GetResource(kURINC_Date, &mResourceDate); + gRDFService->GetResource(kURINC_Name, &mResourceTitle); + gRDFService->GetResource(kURINC_Referer, &mResourceReferer); + gRDFService->GetResource(kURINC_child, &mResourceChild); + gRDFService->GetResource("NC:HistoryBySite", &mResourceHistoryBySite); + + mLastVisitDateHash = PL_NewHashTable(400, rdf_HashPointer, + PL_CompareValues, + PL_CompareValues, + nsnull, nsnull); + + PR_ExplodeTime(PR_Now(), PR_LocalTimeParameters, &mSessionTime); + + if (NS_FAILED(rv = ReadHistory())) + return rv; + + if (!mCurrentFile) { + char fileurl[256]; + PR_snprintf(fileurl, sizeof(fileurl), "res\\rdf\\History\\%i.hst", PR_Now()); + } + return NS_OK; +} + +NS_IMETHODIMP +nsHistoryDataSource::AddPage (const char* uri, const char* referer, PRTime time) { + HE he = (HE) PR_Malloc(sizeof(HistoryEntry)); + he->date = time; + he->url = (char*) uri; + he->referer = (char*) referer; + mPendingWrites.AppendElement(he); + return NS_OK; +} + +NS_IMETHODIMP +nsHistoryDataSource::SetPageTitle (const char* uri, PRUnichar* title) { + for (PRInt32 i = mPendingWrites.Count() - 1; i >= 0; --i) { + HE wr = (HE) mPendingWrites.ElementAt(i); + if (strcmp(wr->url, uri) == 0) { + char timeBuffer[256]; + PRExplodedTime etime; + PR_ExplodeTime(wr->date, PR_LocalTimeParameters, &etime); + PR_FormatTimeUSEnglish(timeBuffer, 256, "%a %b %d %H:%M:%S %Y", &etime); + fprintf(mCurrentFile, "%s\t%s\t%s\t%s\n", wr->url, title, wr->referer, timeBuffer); + mPendingWrites.RemoveElement(wr); + AddPageToGraph(wr->url, (char*) title, wr->referer, PR_Now()) ; + PR_Free(wr); + return NS_OK; + } + } + return NS_OK; +} + + + +PRBool +endsWith (const char* pattern, const char* uuid) +{ + short l1 = strlen(pattern); + short l2 = strlen(uuid); + short index; + if (l2 < l1) return false; + for (index = 1; index <= l1; index++) { + if (pattern[l1-index] != uuid[l2-index]) return false; + } + return true; +} + +nsresult +nsHistoryDataSource::ReadHistory(void) +{ + nsresult rv = NS_ERROR_FAILURE; + char fileurl[256]; + PRInt32 n = PR_SKIP_BOTH; + PRDirEntry *de; + PRDir* dir; + PR_snprintf(fileurl, sizeof(fileurl), "res\\rdf\\History"); + dir = PR_OpenDir(fileurl); + while ((dir != NULL) && ((de = PR_ReadDir(dir, (PRDirFlags)(n++))) != NULL)) { + if (endsWith(".hst", de->name)) ReadOneHistoryFile(de->name); + } + if (dir) PR_CloseDir(dir); + return NS_OK; +} + + +nsresult +nsHistoryDataSource::ReadOneHistoryFile(const char* fileName) +{ + nsresult rv = NS_ERROR_FAILURE; + char fileurl[256]; + FILE* f; + PR_snprintf(fileurl, sizeof(fileurl), "res\\rdf\\History\\%s", fileName); + if ((f = fopen(fileurl, "rw")) != nsnull) { + char* buffer = (char*) PR_Malloc(1024 * 4); + int n = 0; + char *title, *url, *referer, *date; + PRTime time; + PRTime fileTime = LL_ZERO; + while (fgets(buffer, 1024 * 4, f) != 0) { + // urltitlerefererdate + url = buffer; + buffer[strlen(buffer)-1] = '\0'; + title = strchr(buffer, '\t') + 1; + *(title - 1) = '\0'; + referer = strchr(title, '\t') + 1; + *(referer - 1) = '\0'; + date = strchr(referer, '\t') + 1; + *(date -1 ) = '\0'; + PR_ParseTimeString (date, 0, &time); + if (LL_IS_ZERO(fileTime)) { + PRExplodedTime etime; + fileTime = time; + PR_ExplodeTime(time, PR_LocalTimeParameters, &etime); + if (etime.tm_yday == mSessionTime.tm_yday) mCurrentFile = f; + } + AddPageToGraph(url, title, referer, time); + } + PR_Free(buffer); + if (f != mCurrentFile) fclose(f); + } + return rv; +} + +nsresult +nsHistoryDataSource::getSiteOfURL(char* url, nsIRDFResource** resource) { + char* str = strstr(url, "://"); + char buff[256]; + nsIRDFLiteral *titleLiteral; + PRBool foundp; + if (!str) return NS_ERROR_FAILURE; + str = str + 3; + if (str[0] == '/') str++; + char* estr = strchr(str, '/'); + if (!estr) estr = str + strlen(str); + if ((estr - str) > 256) return NS_ERROR_FAILURE; + memset(buff, '\0', 256); + static const char kHistoryURLPrefix[] = "hst:site?"; + strcpy(buff, kHistoryURLPrefix); + strncat(buff, str, (estr-str)); + if (NS_OK != gRDFService->FindResource(buff, resource, &foundp)) return NS_ERROR_FAILURE; + if (foundp) return NS_OK; + if (NS_OK != gRDFService->GetResource(buff, resource)) return NS_ERROR_FAILURE; + mInner->Assert(mResourceHistoryBySite, mResourceChild, *resource, 1); + nsAutoString ptitle(buff + sizeof(kHistoryURLPrefix) - 1); + gRDFService->GetLiteral(ptitle, &titleLiteral); + mInner->Assert(*resource, mResourceTitle, titleLiteral, 1); + return NS_OK; +} + +nsresult +nsHistoryDataSource::AddPageToGraph(char* url, char* title, + char* referer, PRTime date) { + char* histURL = (char*) PR_Malloc(strlen(url) + 7); + nsIRDFResource *pageResource, *refererResource, *histResource, *siteResource; + nsIRDFLiteral *titleLiteral; + nsIRDFDate *dateLiteral; + PR_snprintf(histURL, strlen(histURL), "hst://%s", url); + nsresult rv = getSiteOfURL(url, &siteResource); + if (rv != NS_OK) return rv; + gRDFService->GetResource(url, &pageResource); + gRDFService->GetResource(histURL, &histResource); + gRDFService->GetResource(referer, &refererResource); + gRDFService->GetDateLiteral(date, &dateLiteral); + nsAutoString ptitle(title); + gRDFService->GetLiteral(ptitle, &titleLiteral); + mInner->Assert(histResource, mResourcePage, pageResource, 1); + mInner->Assert(histResource, mResourceDate, dateLiteral, 1); + mInner->Assert(pageResource, mResourceTitle, titleLiteral, 1); + mInner->Assert(histResource, mResourceReferer, refererResource, 1); + mInner->Assert(siteResource, mResourceChild, pageResource, 1); + AddToDateHierarchy(date, histResource); + UpdateLastVisitDate (pageResource, 1/* date */) ; + NS_RELEASE(histResource); + NS_RELEASE(siteResource); + NS_RELEASE(pageResource); + NS_RELEASE(refererResource); + NS_RELEASE(dateLiteral); + NS_RELEASE(titleLiteral); + PR_Free(histURL); + return NS_OK; +} + +nsresult +nsHistoryDataSource::AddToDateHierarchy (PRTime date, nsIRDFResource* resource) { + return NS_OK; +} + +nsresult +NS_NewRDFHistoryDataSource(nsIRDFDataSource** result) +{ + nsHistoryDataSource* ds = new nsHistoryDataSource(); + + if (! ds) + return NS_ERROR_NULL_POINTER; + + *result = ds; + NS_ADDREF(*result); + return NS_OK; +} + + + + + + + + + + + + diff --git a/mozilla/rdf/datasource/src/nsRDFBuiltInDataSources.h b/mozilla/rdf/datasource/src/nsRDFBuiltInDataSources.h index f9fd08c8b27..992f9c6da31 100644 --- a/mozilla/rdf/datasource/src/nsRDFBuiltInDataSources.h +++ b/mozilla/rdf/datasource/src/nsRDFBuiltInDataSources.h @@ -46,6 +46,9 @@ nsresult NS_NewRDFInMemoryDataSource(nsIRDFDataSource** result); // in nsStreamDataSource.cpp nsresult NS_NewRDFStreamDataSource(nsIRDFDataSource** result); +// in nsHistoryDataSource.cpp +nsresult NS_NewRDFHistoryDataSource(nsIRDFDataSource** result); + #endif // nsBuiltinDataSources_h__ diff --git a/mozilla/rdf/macbuild/rdf.mcp b/mozilla/rdf/macbuild/rdf.mcp index 9a3be803ac6..6fce35f365e 100644 Binary files a/mozilla/rdf/macbuild/rdf.mcp and b/mozilla/rdf/macbuild/rdf.mcp differ diff --git a/mozilla/rdf/opendir/query.c b/mozilla/rdf/opendir/query.c index 68637bd90f8..ef9582954d5 100644 --- a/mozilla/rdf/opendir/query.c +++ b/mozilla/rdf/opendir/query.c @@ -73,7 +73,7 @@ parseQuery (char* query, RDF_Resource *root, int *numSegments) { freeMem(surl); ans[count] = nq; if (nquery) { - query = nquery+1; + query = nquery+1; } else break; } return ans; @@ -112,7 +112,7 @@ processRDFQuery (char* query) { currentValArray = newValArray; newValArray = (char**) getMem(4096 * sizeof(RDF_Resource)); } - freeMem(newValArray); + freeMem(newValArray); if (count > 0) { ans = (char**)getMem((count+1) * sizeof(char*)); memcpy(ans, currentValArray, (count * sizeof(char*))); diff --git a/mozilla/rdf/resources/History/h1.hst b/mozilla/rdf/resources/History/h1.hst new file mode 100644 index 00000000000..122330b1f44 --- /dev/null +++ b/mozilla/rdf/resources/History/h1.hst @@ -0,0 +1,3 @@ +http://www.netscape.com/ Netscape Home http://www.mozilla.org 22-AUG-1993 12:59am +http://www.microsoft.com/ Microsoft Home http://www.mozilla.org Friday, August 04, 1995 3:54 PM +http://www.whatever.com/baz.html Baz http://www.netscape.com 20/06/95 21:07 diff --git a/mozilla/rdf/resources/sidebar.xul b/mozilla/rdf/resources/sidebar.xul index 483eedbf89e..6332a02f2fa 100644 --- a/mozilla/rdf/resources/sidebar.xul +++ b/mozilla/rdf/resources/sidebar.xul @@ -57,7 +57,7 @@ function doSort(sortColName) - + @@ -98,6 +98,12 @@ function doSort(sortColName) + + History By Site + + + + diff --git a/mozilla/rdf/util/public/nsRDFResource.h b/mozilla/rdf/util/public/nsRDFResource.h index f50452ec0c9..bb9702ce7b2 100644 --- a/mozilla/rdf/util/public/nsRDFResource.h +++ b/mozilla/rdf/util/public/nsRDFResource.h @@ -33,10 +33,10 @@ public: NS_DECL_ISUPPORTS // nsIRDFNode methods: - NS_IMETHOD Init(const char* uri); NS_IMETHOD EqualsNode(nsIRDFNode* node, PRBool* result) const; // nsIRDFResource methods: + NS_IMETHOD Init(const char* uri); NS_IMETHOD GetValue(const char* *uri) const; NS_IMETHOD EqualsResource(const nsIRDFResource* resource, PRBool* result) const; NS_IMETHOD EqualsString(const char* uri, PRBool* result) const;