From 4edcc0174aadc5433465bcd0ff2b7563a6972db0 Mon Sep 17 00:00:00 2001 From: "radha%netscape.com" Date: Thu, 1 Apr 1999 20:21:41 +0000 Subject: [PATCH] Global history introduced as a service and appropriate changes to Appshell service and Factory git-svn-id: svn://10.0.0.236/trunk@25912 18797224-902f-48f8-a5cc-f745e15eee43 --- mozilla/xpfe/appshell/src/Makefile.in | 1 + mozilla/xpfe/appshell/src/makefile.win | 6 +- .../xpfe/appshell/src/nsAppShellFactory.cpp | 7 + .../xpfe/appshell/src/nsAppShellService.cpp | 14 +- mozilla/xpfe/appshell/src/nsGlobalHistory.cpp | 271 ++++++++++++++++++ 5 files changed, 297 insertions(+), 2 deletions(-) create mode 100644 mozilla/xpfe/appshell/src/nsGlobalHistory.cpp diff --git a/mozilla/xpfe/appshell/src/Makefile.in b/mozilla/xpfe/appshell/src/Makefile.in index 1c2bc15b848..3c30c84ec8a 100644 --- a/mozilla/xpfe/appshell/src/Makefile.in +++ b/mozilla/xpfe/appshell/src/Makefile.in @@ -37,6 +37,7 @@ CPPSRCS= \ nsJSXPConnectFactory.cpp \ nsAppShellNameSet.cpp \ nsFileLocations.cpp \ + nsGlobalHistory.cpp \ $(NULL) include $(topsrcdir)/config/config.mk diff --git a/mozilla/xpfe/appshell/src/makefile.win b/mozilla/xpfe/appshell/src/makefile.win index e5291c85d1b..02c33c8e7a9 100644 --- a/mozilla/xpfe/appshell/src/makefile.win +++ b/mozilla/xpfe/appshell/src/makefile.win @@ -31,6 +31,7 @@ CPPSRCS= \ nsJSXPConnectFactory.cpp \ nsAppShellNameSet.cpp \ nsFileLocations.cpp \ + nsGlobalHistory.cpp \ $(NULL) CPP_OBJS= \ @@ -43,6 +44,8 @@ CPP_OBJS= \ .\$(OBJDIR)\nsJSXPConnectFactory.obj \ .\$(OBJDIR)\nsAppShellNameSet.obj \ .\$(OBJDIR)\nsFileLocations.obj \ + .\$(OBJDIR)\nsGlobalHistory.obj \ + $(NULL) LINCS=-I$(PUBLIC)\raptor \ @@ -52,7 +55,8 @@ LINCS=-I$(PUBLIC)\raptor \ -I$(PUBLIC)\js \ -I$(PUBLIC)\pref \ -I$(PUBLIC)\appcores \ - -I$(PUBLIC)\netlib + -I$(PUBLIC)\netlib \ + -I$(PUBLIC)\rdf MAKE_OBJ_TYPE = DLL DLLNAME = nsappshell diff --git a/mozilla/xpfe/appshell/src/nsAppShellFactory.cpp b/mozilla/xpfe/appshell/src/nsAppShellFactory.cpp index 1336b4f2863..6b488731cdd 100644 --- a/mozilla/xpfe/appshell/src/nsAppShellFactory.cpp +++ b/mozilla/xpfe/appshell/src/nsAppShellFactory.cpp @@ -22,6 +22,7 @@ #include "nsIComponentManager.h" #include "nsAppShellCIDs.h" #include "nsICmdLineService.h" +#include "nsIGlobalHistory.h" /* extern the factory entry points for each component... */ nsresult NS_NewAppShellServiceFactory(nsIFactory** aFactory); @@ -35,6 +36,7 @@ static NS_DEFINE_IID(kAppShellServiceCID, NS_APPSHELL_SERVICE_CID); static NS_DEFINE_IID(kCmdLineServiceCID, NS_COMMANDLINE_SERVICE_CID); static NS_DEFINE_IID(kProtocolHelperCID, NS_PROTOCOL_HELPER_CID); static NS_DEFINE_IID(kXPConnectFactoryCID, NS_XPCONNECTFACTORY_CID); +static NS_DEFINE_IID(kGlobalHistoryCID, NS_GLOBALHISTORY_CID); /* * Global entry point to register all components in the registry... @@ -46,6 +48,7 @@ NSRegisterSelf(nsISupports* serviceMgr, const char *path) nsComponentManager::RegisterComponent(kCmdLineServiceCID, NULL, NULL, path, PR_TRUE, PR_TRUE); nsComponentManager::RegisterComponent(kProtocolHelperCID, NULL, NULL, path, PR_TRUE, PR_TRUE); nsComponentManager::RegisterComponent(kXPConnectFactoryCID, NULL, NULL, path, PR_TRUE, PR_TRUE); + nsComponentManager::RegisterComponent(kGlobalHistoryCID, NULL, NULL, path, PR_TRUE, PR_TRUE); return NS_OK; } @@ -59,6 +62,7 @@ NSUnregisterSelf(nsISupports* serviceMgr, const char *path) nsComponentManager::UnregisterFactory(kCmdLineServiceCID, path); nsComponentManager::UnregisterFactory(kProtocolHelperCID, path); nsComponentManager::UnregisterFactory(kXPConnectFactoryCID, path); + nsComponentManager::UnregisterFactory(kGlobalHistoryCID, path); return NS_OK; } @@ -99,6 +103,9 @@ NSGetFactory(nsISupports* serviceMgr, else if (aClass.Equals(kXPConnectFactoryCID)) { rv = NS_NewXPConnectFactoryFactory(aFactory); } + else if (aClass.Equals(kGlobalHistoryCID)) { + rv = NS_NewGlobalHistoryFactory(aFactory); + } #if 0 else if (aClass.Equals(kProtocolHelperCID)) { diff --git a/mozilla/xpfe/appshell/src/nsAppShellService.cpp b/mozilla/xpfe/appshell/src/nsAppShellService.cpp index 9e148676d8f..8dfa288dcc3 100644 --- a/mozilla/xpfe/appshell/src/nsAppShellService.cpp +++ b/mozilla/xpfe/appshell/src/nsAppShellService.cpp @@ -31,6 +31,7 @@ #include "nsIWidget.h" #include "nsIWebShellWindow.h" #include "nsWebShellWindow.h" +#include "nsIGlobalHistory.h" /* For Javascript Namespace Access */ #include "nsDOMCID.h" @@ -48,6 +49,7 @@ static NS_DEFINE_IID(kAppShellCID, NS_APPSHELL_CID); static NS_DEFINE_IID(kEventQueueServiceCID, NS_EVENTQUEUESERVICE_CID); static NS_DEFINE_IID(kCScriptNameSetRegistryCID, NS_SCRIPT_NAMESET_REGISTRY_CID); +static NS_DEFINE_IID(kCGlobalHistoryCID, NS_GLOBALHISTORY_CID); /* Define Interface IDs */ @@ -57,7 +59,7 @@ static NS_DEFINE_IID(kIAppShellServiceIID, NS_IAPPSHELL_SERVICE_IID); static NS_DEFINE_IID(kIAppShellIID, NS_IAPPSHELL_IID); static NS_DEFINE_IID(kIWebShellWindowIID, NS_IWEBSHELL_WINDOW_IID); static NS_DEFINE_IID(kIScriptNameSetRegistryIID, NS_ISCRIPTNAMESETREGISTRY_IID); - +static NS_DEFINE_IID(kIGlobalHistoryIID, NS_IGLOBALHISTORY_IID); class nsAppShellService : public nsIAppShellService @@ -154,6 +156,16 @@ nsAppShellService::Initialize(void) goto done; } + // Initialise the global History + nsIGlobalHistory * gHistory; + rv = nsServiceManager::GetService(kCGlobalHistoryCID, + kIGlobalHistoryIID, + (nsISupports **)&gHistory); + if (NS_FAILED(rv)) { + goto done; + } + gHistory->Init(); + // Create widget application shell rv = nsComponentManager::CreateInstance(kAppShellCID, nsnull, kIAppShellIID, (void**)&mAppShell); diff --git a/mozilla/xpfe/appshell/src/nsGlobalHistory.cpp b/mozilla/xpfe/appshell/src/nsGlobalHistory.cpp new file mode 100644 index 00000000000..b4146658a34 --- /dev/null +++ b/mozilla/xpfe/appshell/src/nsGlobalHistory.cpp @@ -0,0 +1,271 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- + * + * The contents of this file are subject to the Netscape Public License + * Version 1.0 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/NPL/ + * + * Software distributed under the License is distributed on an "AS IS" + * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + * the License for the specific language governing rights and limitations + * under the License. + * + * The Original Code is Mozilla Communicator client code. + * + * The Initial Developer of the Original Code is Netscape Communications + * Corporation. Portions created by Netscape are Copyright (C) 1998 + * Netscape Communications Corporation. All Rights Reserved. + */ + +/** Wrapper class for Global History implementation. This class + * primarily passes on the data to the nsIHistoryDataSource interface + */ + +#include "nsIGlobalHistory.h" +#include "nsIRDFDataSource.h" +#include "nsIRDFService.h" +#include "nsIServiceManager.h" +#include "nsIHistoryDataSource.h" +#include "nsCOMPtr.h" +#include "nsRDFCID.h" +#include "nsString.h" +#include "plstr.h" + + + +/* Define Class IDs */ +static NS_DEFINE_CID(kGlobalHistoryCID, NS_GLOBALHISTORY_CID); +static NS_DEFINE_CID(kRDFServiceCID, NS_RDFSERVICE_CID); + +/* Define Interface IDs */ + +static NS_DEFINE_IID(kIFactoryIID, NS_IFACTORY_IID); +static NS_DEFINE_IID(kIGlobalHistoryIID, NS_IGLOBALHISTORY_IID); +static NS_DEFINE_IID(kIRDFDataSourceIID, NS_IRDFDATASOURCE_IID); +static NS_DEFINE_IID(kIRDFServiceIID, NS_IRDFSERVICE_IID); + + +class nsGlobalHistory : public nsIGlobalHistory +{ +public: + nsGlobalHistory(void); + + // nsISupports methods + NS_DECL_ISUPPORTS + + // nsIGlobalHistory + NS_IMETHOD AddPage (const char* aURI, const char* aRefererURI, PRTime aDate); + NS_IMETHOD SetPageTitle (const char* aURI, const PRUnichar* aTitle); + NS_IMETHOD RemovePage (const char* aURI); + NS_IMETHOD GetLastVisitDate (const char* aURI, uint32 *aDate); + NS_IMETHOD CompleteURL (const char* aPrefix, char** aPreferredCompletions); + NS_IMETHOD Init(void); + +private: + virtual ~nsGlobalHistory(); + nsIHistoryDataSource * mGHistory; + +}; + + +nsGlobalHistory::nsGlobalHistory() +{ + NS_INIT_REFCNT(); + mGHistory = nsnull; +} + +nsGlobalHistory::~nsGlobalHistory() +{ + mGHistory = nsnull; +} + + +/* + * Implement the nsISupports methods... + */ +NS_IMPL_ISUPPORTS(nsGlobalHistory, kIGlobalHistoryIID); + + +NS_IMETHODIMP +nsGlobalHistory::Init(void) +{ + + /* Create a RDF Data source for history */ + nsIRDFService* rdf; + if (NS_SUCCEEDED(nsServiceManager::GetService(kRDFServiceCID, + nsIRDFService::GetIID(), + (nsISupports**) &rdf))) { + nsCOMPtr ds; + static const char* kHistoryDataSourceURI = "rdf:history"; + if (NS_SUCCEEDED(rdf->GetDataSource(kHistoryDataSourceURI, + getter_AddRefs(ds)))) { + ds->QueryInterface(nsIHistoryDataSource::GetIID(), (void**) &mGHistory); + } + nsServiceManager::ReleaseService(kRDFServiceCID, rdf); + } + + return NS_OK; +} + +NS_IMETHODIMP +nsGlobalHistory::AddPage(const char * aURI, const char * aRefererURI, PRTime aDate) +{ + nsresult rv = NS_OK; + if (NS_FAILED(rv = mGHistory->AddPage(aURI, /* XXX referrer? */ (char *) nsnull, PR_Now()))) { + NS_ERROR("unable to add page to history"); + return rv; + } + else + printf("Added page %s to the rdf:history datasource\n", aURI); + return rv; + +} + +NS_IMETHODIMP +nsGlobalHistory::SetPageTitle (const char* aURI, const PRUnichar* aTitle) +{ + nsresult rv=nsnull; + if (NS_FAILED(rv = mGHistory->SetPageTitle(aURI, aTitle))) { + NS_ERROR("unable to set doc title"); + return rv; + } + return rv; + +} + + +NS_IMETHODIMP +nsGlobalHistory::RemovePage (const char* aURI) +{ + nsresult rv = NS_OK; + mGHistory->RemovePage(aURI); + return rv; + +} + +NS_IMETHODIMP +nsGlobalHistory::GetLastVisitDate (const char* aURI, uint32 *aResult) +{ + + if (nsnull == aResult) + return NS_ERROR_NULL_POINTER; + + mGHistory->GetLastVisitDate(aURI, aResult); + return NS_OK; +} + +NS_IMETHODIMP +nsGlobalHistory::CompleteURL (const char* aPrefix, char** aResult) +{ + if (nsnull == aResult) + return NS_ERROR_NULL_POINTER; + mGHistory->CompleteURL(aPrefix, aResult); + + return NS_OK; +} + + +NS_EXPORT nsresult NS_NewGlobalHistory(nsIGlobalHistory** aResult) +{ + if (nsnull == aResult) { + return NS_ERROR_NULL_POINTER; + } + + *aResult = new nsGlobalHistory(); + if (nsnull == *aResult) { + return NS_ERROR_OUT_OF_MEMORY; + } + + NS_ADDREF(*aResult); + return NS_OK; +} + + + +//---------------------------------------------------------------------- + +// Factory code for creating nsGlobalHistory + +class nsGlobalHistoryFactory : public nsIFactory +{ +public: + nsGlobalHistoryFactory(); + NS_DECL_ISUPPORTS + + // nsIFactory methods + NS_IMETHOD CreateInstance(nsISupports *aOuter, + const nsIID &aIID, + void **aResult); + + NS_IMETHOD LockFactory(PRBool aLock); +protected: + virtual ~nsGlobalHistoryFactory(); +}; + + +nsGlobalHistoryFactory::nsGlobalHistoryFactory() +{ + NS_INIT_REFCNT(); +} + +nsresult +nsGlobalHistoryFactory::LockFactory(PRBool lock) +{ + + return NS_OK; +} + +nsGlobalHistoryFactory::~nsGlobalHistoryFactory() +{ + NS_ASSERTION(mRefCnt == 0, "non-zero refcnt at destruction"); +} + +NS_IMPL_ISUPPORTS(nsGlobalHistoryFactory, kIFactoryIID); + + +nsresult +nsGlobalHistoryFactory::CreateInstance(nsISupports *aOuter, + const nsIID &aIID, + void **aResult) +{ + nsresult rv; + nsGlobalHistory* inst; + + if (aResult == NULL) { + return NS_ERROR_NULL_POINTER; + } + *aResult = NULL; + if (nsnull != aOuter) { + rv = NS_ERROR_NO_AGGREGATION; + goto done; + } + + NS_NEWXPCOM(inst, nsGlobalHistory); + if (inst == NULL) { + rv = NS_ERROR_OUT_OF_MEMORY; + goto done; + } + + NS_ADDREF(inst); + rv = inst->QueryInterface(aIID, aResult); + NS_RELEASE(inst); + +done: + return rv; +} + + +nsresult +NS_NewGlobalHistoryFactory(nsIFactory** aFactory) +{ + nsresult rv = NS_OK; + nsIFactory* inst = new nsGlobalHistoryFactory(); + if (nsnull == inst) { + rv = NS_ERROR_OUT_OF_MEMORY; + } + else { + NS_ADDREF(inst); + } + *aFactory = inst; + return rv; +}