diff --git a/mailnews/base/build/nsMsgFactory.cpp b/mailnews/base/build/nsMsgFactory.cpp index 347aa0351f1b..e586d7f95935 100644 --- a/mailnews/base/build/nsMsgFactory.cpp +++ b/mailnews/base/build/nsMsgFactory.cpp @@ -19,6 +19,8 @@ #include "nsIFactory.h" #include "nsISupports.h" #include "msgCore.h" +#include "nsIModule.h" +#include "nsIGenericFactory.h" #include "nsMsgBaseCID.h" #include "pratom.h" #include "nsIComponentManager.h" @@ -78,7 +80,6 @@ static NS_DEFINE_CID(kCMsgGroupRecordCID, NS_MSGGROUPRECORD_CID); static NS_DEFINE_CID(kMailNewsFolderDataSourceCID, NS_MAILNEWSFOLDERDATASOURCE_CID); static NS_DEFINE_CID(kMailNewsMessageDataSourceCID, NS_MAILNEWSMESSAGEDATASOURCE_CID); -static NS_DEFINE_CID(kCMessageViewDataSourceCID, NS_MESSAGEVIEWDATASOURCE_CID); // account manager stuff static NS_DEFINE_CID(kMsgAccountManagerCID, NS_MSGACCOUNTMANAGER_CID); @@ -110,279 +111,325 @@ static NS_DEFINE_CID(kMsgStatusFeedbackCID, NS_MSGSTATUSFEEDBACK_CID); //MessageView static NS_DEFINE_CID(kMessageViewCID, NS_MESSAGEVIEW_CID); -//////////////////////////////////////////////////////////// -// -//////////////////////////////////////////////////////////// -static PRInt32 g_InstanceCount = 0; -static PRInt32 g_LockCount = 0; -class nsMsgFactory : public nsIFactory -{ + +// private factory declarations for each component we know how to produce + +NS_GENERIC_FACTORY_CONSTRUCTOR(nsMessengerBootstrap) +NS_GENERIC_FACTORY_CONSTRUCTOR(nsUrlListenerManager) +NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(nsMsgMailSession, Init) +NS_GENERIC_FACTORY_CONSTRUCTOR(nsMessenger) +NS_GENERIC_FACTORY_CONSTRUCTOR(nsMsgAccountManager) +NS_GENERIC_FACTORY_CONSTRUCTOR(nsMsgAccount) +NS_GENERIC_FACTORY_CONSTRUCTOR(nsMsgIdentity) +NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(nsMsgFolderDataSource, Init) +NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(nsMsgMessageDataSource, Init) +NS_GENERIC_FACTORY_CONSTRUCTOR(nsMsgAccountManagerDataSource) +NS_GENERIC_FACTORY_CONSTRUCTOR(nsMsgFilterService) +NS_GENERIC_FACTORY_CONSTRUCTOR(nsMsgBiffManager) +NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(nsMsgNotificationManager, Init) +NS_GENERIC_FACTORY_CONSTRUCTOR(nsCopyMessageStreamListener) +NS_GENERIC_FACTORY_CONSTRUCTOR(nsMsgCopyService) +NS_GENERIC_FACTORY_CONSTRUCTOR(nsMsgFolderCache) +NS_GENERIC_FACTORY_CONSTRUCTOR(nsMsgStatusFeedback) +NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(nsMessageView,Init) + +// Module implementation for the sample library +class nsMsgBaseModule : public nsIModule +{ public: - // nsISupports methods - NS_DECL_ISUPPORTS + nsMsgBaseModule(); + virtual ~nsMsgBaseModule(); - nsMsgFactory(const nsCID &aClass, - const char* aClassName, - const char* aProgID); + NS_DECL_ISUPPORTS - // nsIFactory methods - NS_IMETHOD CreateInstance(nsISupports *aOuter, const nsIID &aIID, void **aResult); - NS_IMETHOD LockFactory(PRBool aLock); + NS_DECL_NSIMODULE protected: - virtual ~nsMsgFactory(); + nsresult Initialize(); - nsCID mClassID; - char* mClassName; - char* mProgID; -}; + void Shutdown(); -nsMsgFactory::nsMsgFactory(const nsCID &aClass, - const char* aClassName, - const char* aProgID) - : mClassID(aClass), - mClassName(nsCRT::strdup(aClassName)), - mProgID(nsCRT::strdup(aProgID)) + PRBool mInitialized; + + nsCOMPtr mMessengerBootstrapFactory; + nsCOMPtr mUrlListenerManagerFactory; + nsCOMPtr mMsgMailSessionFactory; + nsCOMPtr mMessengerFactory; + nsCOMPtr mMsgAccountManagerFactory; + nsCOMPtr mMsgAccountFactory; + nsCOMPtr mMsgIdentityFactory; + nsCOMPtr mMsgFolderDataSourceFactory; + nsCOMPtr mMsgMessageDataSourceFactory; + nsCOMPtr mMsgAccountManagerDataSourceFactory; + nsCOMPtr mMsgFilterServiceFactory; + nsCOMPtr mMsgBiffManagerFactory; + nsCOMPtr mMsgNotificationManagerFactory; + nsCOMPtr mCopyMessageStreamListenerFactory; + nsCOMPtr mMsgCopyServiceFactory; + nsCOMPtr mMsgFolderCacheFactory; + nsCOMPtr mMsgStatusFeedbackFactory; + nsCOMPtr mMessageViewFactory; +}; + +nsMsgBaseModule::nsMsgBaseModule() + : mInitialized(PR_FALSE) { - NS_INIT_REFCNT(); + NS_INIT_ISUPPORTS(); +} -} - -nsMsgFactory::~nsMsgFactory() +nsMsgBaseModule::~nsMsgBaseModule() { + Shutdown(); +} - NS_ASSERTION(mRefCnt == 0, "non-zero refcnt at destruction"); - - PL_strfree(mClassName); - PL_strfree(mProgID); -} +NS_IMPL_ISUPPORTS(nsMsgBaseModule, NS_GET_IID(nsIModule)) -nsresult -nsMsgFactory::QueryInterface(const nsIID &aIID, void **aResult) -{ - if (aResult == NULL) - return NS_ERROR_NULL_POINTER; - - // Always NULL result, in case of failure - *aResult = NULL; - - // we support two interfaces....nsISupports and nsFactory..... - if (aIID.Equals(nsCOMTypeInfo::GetIID())) - *aResult = (void *)NS_STATIC_CAST(nsISupports*,this); - else if (aIID.Equals(nsCOMTypeInfo::GetIID())) - *aResult = (void *)NS_STATIC_CAST(nsIFactory*,this); - - if (*aResult == NULL) - return NS_NOINTERFACE; - - NS_ADDREF_THIS(); // Increase reference count for caller - return NS_OK; -} - -NS_IMPL_ADDREF(nsMsgFactory) -NS_IMPL_RELEASE(nsMsgFactory) - -nsresult -nsMsgFactory::CreateInstance(nsISupports * aOuter, - const nsIID &aIID, - void **aResult) +// Perform our one-time intialization for this module +nsresult nsMsgBaseModule::Initialize() { - nsresult rv = NS_ERROR_NO_INTERFACE; - if (aResult == NULL) - return NS_ERROR_NULL_POINTER; + if (mInitialized) + return NS_OK; - *aResult = NULL; - + mInitialized = PR_TRUE; + return NS_OK; +} - // ClassID check happens here - // Whenever you add a new class that supports an interface, plug it in here!!! - - if (mClassID.Equals(kCMsgFolderEventCID)) - { - NS_NOTREACHED("hello? what happens here?"); - rv = NS_OK; - } - else if (mClassID.Equals(kCMessengerBootstrapCID)) - { - rv = NS_NewMessengerBootstrap(aIID, aResult); - } - else if (mClassID.Equals(kCUrlListenerManagerCID)) - { - nsUrlListenerManager * listener = nsnull; - listener = new nsUrlListenerManager(); - if (listener == nsnull) - rv = NS_ERROR_OUT_OF_MEMORY; - else { - rv = listener->QueryInterface(aIID, aResult); - if (NS_FAILED(rv)) - delete listener; +// Shutdown this module, releasing all of the module resources +void nsMsgBaseModule::Shutdown() +{ + // Release the factory object + mMessengerBootstrapFactory = null_nsCOMPtr(); + mUrlListenerManagerFactory = null_nsCOMPtr(); + mMsgMailSessionFactory = null_nsCOMPtr(); + mMessengerFactory = null_nsCOMPtr(); + mMsgAccountManagerFactory = null_nsCOMPtr(); + mMsgAccountFactory = null_nsCOMPtr(); + mMsgIdentityFactory = null_nsCOMPtr(); + mMsgFolderDataSourceFactory = null_nsCOMPtr(); + mMsgMessageDataSourceFactory = null_nsCOMPtr(); + mMsgAccountManagerDataSourceFactory = null_nsCOMPtr(); + mMsgFilterServiceFactory = null_nsCOMPtr(); + mMsgBiffManagerFactory = null_nsCOMPtr(); + mMsgNotificationManagerFactory = null_nsCOMPtr(); + mCopyMessageStreamListenerFactory = null_nsCOMPtr(); + mMsgCopyServiceFactory = null_nsCOMPtr(); + mMsgFolderCacheFactory = null_nsCOMPtr(); + mMsgStatusFeedbackFactory = null_nsCOMPtr(); + mMessageViewFactory = null_nsCOMPtr(); +} + +// Create a factory object for creating instances of aClass. +NS_IMETHODIMP nsMsgBaseModule::GetClassObject(nsIComponentManager *aCompMgr, + const nsCID& aClass, + const nsIID& aIID, + void** r_classObj) +{ + nsresult rv; + + // Defensive programming: Initialize *r_classObj in case of error below + if (!r_classObj) + return NS_ERROR_INVALID_POINTER; + + *r_classObj = NULL; + + // Do one-time-only initialization if necessary + if (!mInitialized) + { + rv = Initialize(); + if (NS_FAILED(rv)) // Initialization failed! yikes! + return rv; } - } - else if (mClassID.Equals(kCMsgMailSessionCID)) - { - rv = NS_NewMsgMailSession(aIID, aResult); - } - else if (mClassID.Equals(kCMessengerCID)) - { - rv = NS_NewMessenger(aIID, aResult); - } + // Choose the appropriate factory, based on the desired instance + // class type (aClass). + nsCOMPtr fact; - else if (mClassID.Equals(kMsgAccountManagerCID)) - { - rv = NS_NewMsgAccountManager(aIID, aResult); - } - - else if (mClassID.Equals(kMsgAccountCID)) - { - rv = NS_NewMsgAccount(aIID, aResult); - } - - else if (mClassID.Equals(kMsgIdentityCID)) { - nsMsgIdentity* identity = new nsMsgIdentity(); + if (aClass.Equals(kCMessengerBootstrapCID)) + { + if (!mMessengerBootstrapFactory) + rv = NS_NewGenericFactory(getter_AddRefs(mMessengerBootstrapFactory), &nsMessengerBootstrapConstructor); + fact = mMessengerBootstrapFactory; + } + else if (aClass.Equals(kCUrlListenerManagerCID)) + { + if (!mUrlListenerManagerFactory) + rv = NS_NewGenericFactory(getter_AddRefs(mUrlListenerManagerFactory), &nsUrlListenerManagerConstructor); + fact = mUrlListenerManagerFactory; + } + else if (aClass.Equals(kCMsgMailSessionCID)) + { + if (!mMsgMailSessionFactory) + rv = NS_NewGenericFactory(getter_AddRefs(mMsgMailSessionFactory), &nsMsgMailSessionConstructor); + fact = mMsgMailSessionFactory; + } + else if (aClass.Equals(kCMessengerCID)) + { + if (!mMessengerFactory) + rv = NS_NewGenericFactory(getter_AddRefs(mMessengerFactory), &nsMessengerConstructor); + fact = mMessengerFactory; + } + + else if (aClass.Equals(kMsgAccountManagerCID)) + { + if (!mMsgAccountManagerFactory) + rv = NS_NewGenericFactory(getter_AddRefs(mMsgAccountManagerFactory), &nsMsgAccountManagerConstructor); + fact = mMsgAccountManagerFactory; + } + else if (aClass.Equals(kMsgAccountCID)) + { + if (!mMsgAccountFactory) + rv = NS_NewGenericFactory(getter_AddRefs(mMsgAccountFactory), &nsMsgAccountConstructor); + fact = mMsgAccountFactory; + } + else if (aClass.Equals(kMsgIdentityCID)) + { + if (!mMsgIdentityFactory) + rv = NS_NewGenericFactory(getter_AddRefs(mMsgIdentityFactory), &nsMsgIdentityConstructor); + fact = mMsgIdentityFactory; + } + else if (aClass.Equals(kMailNewsFolderDataSourceCID)) + { + if (!mMsgFolderDataSourceFactory) + rv = NS_NewGenericFactory(getter_AddRefs(mMsgFolderDataSourceFactory), &nsMsgFolderDataSourceConstructor); + fact = mMsgFolderDataSourceFactory; + } + else if (aClass.Equals(kMailNewsMessageDataSourceCID)) + { + if (!mMsgMessageDataSourceFactory) + rv = NS_NewGenericFactory(getter_AddRefs(mMsgMessageDataSourceFactory), &nsMsgMessageDataSourceConstructor); + fact = mMsgMessageDataSourceFactory; + } + else if (aClass.Equals(kMsgAccountManagerDataSourceCID)) + { + if (!mMsgAccountManagerDataSourceFactory) + rv = NS_NewGenericFactory(getter_AddRefs(mMsgAccountManagerDataSourceFactory), &nsMsgAccountManagerDataSourceConstructor); + fact = mMsgAccountManagerDataSourceFactory; + } + else if (aClass.Equals(kMsgFilterServiceCID)) + { + if (!mMsgFilterServiceFactory) + rv = NS_NewGenericFactory(getter_AddRefs(mMsgFilterServiceFactory), &nsMsgFilterServiceConstructor); + fact = mMsgFilterServiceFactory; + } + else if (aClass.Equals(kMsgBiffManagerCID)) + { + if (!mMsgBiffManagerFactory) + rv = NS_NewGenericFactory(getter_AddRefs(mMsgBiffManagerFactory), &nsMsgBiffManagerConstructor); + fact = mMsgBiffManagerFactory; + } + else if (aClass.Equals(kMsgNotificationManagerCID)) + { + if (!mMsgNotificationManagerFactory) + rv = NS_NewGenericFactory(getter_AddRefs(mMsgNotificationManagerFactory), &nsMsgNotificationManagerConstructor); + fact = mMsgNotificationManagerFactory; + } + else if (aClass.Equals(kCopyMessageStreamListenerCID)) + { + if (!mCopyMessageStreamListenerFactory) + rv = NS_NewGenericFactory(getter_AddRefs(mCopyMessageStreamListenerFactory), &nsCopyMessageStreamListenerConstructor); + fact = mCopyMessageStreamListenerFactory; + } + else if (aClass.Equals(kMsgCopyServiceCID)) + { + if (!mMsgCopyServiceFactory) + rv = NS_NewGenericFactory(getter_AddRefs(mMsgCopyServiceFactory), &nsMsgCopyServiceConstructor); + fact = mMsgCopyServiceFactory; + } + else if (aClass.Equals(kMsgFolderCacheCID)) + { + if (!mMsgFolderCacheFactory) + rv = NS_NewGenericFactory(getter_AddRefs(mMsgFolderCacheFactory), &nsMsgFolderCacheConstructor); + fact = mMsgFolderCacheFactory; + } + else if (aClass.Equals(kMsgStatusFeedbackCID)) + { + if (!mMsgStatusFeedbackFactory) + rv = NS_NewGenericFactory(getter_AddRefs(mMsgStatusFeedbackFactory), &nsMsgStatusFeedbackConstructor); + fact = mMsgStatusFeedbackFactory; + } + else if (aClass.Equals(kMessageViewCID)) + { + if (!mMessageViewFactory) + rv = NS_NewGenericFactory(getter_AddRefs(mMessageViewFactory), &nsMessageViewConstructor); + fact = mMessageViewFactory; + } - if (identity == nsnull) - rv = NS_ERROR_OUT_OF_MEMORY; - else { - rv = identity->QueryInterface(aIID, aResult); - if (NS_FAILED(rv)) - delete identity; - } - } -#if 0 - else if (mClassID.Equals(kMsgIncomingServerCID)) { - nsMsgIncomingServer *server = new nsMsgIncomingServer(); - if (!server) - rv = NS_ERROR_OUT_OF_MEMORY; - else { - rv = server->QueryInterface(aIID, aResult); - if (NS_FAILED(rv)) - delete server; - } - } -#endif - else if (mClassID.Equals(kMailNewsFolderDataSourceCID)) - { - rv = NS_NewMsgFolderDataSource(aIID, aResult); - } - else if (mClassID.Equals(kMailNewsMessageDataSourceCID)) - { - rv = NS_NewMsgMessageDataSource(aIID, aResult); - } - else if (mClassID.Equals(kCMessageViewDataSourceCID)) - { - rv = NS_NewMessageViewDataSource(aIID, aResult); - } + + if (fact) + rv = fact->QueryInterface(aIID, r_classObj); - // account manager RDF datasources - else if (mClassID.Equals(kMsgAccountManagerDataSourceCID)) { - rv = NS_NewMsgAccountManagerDataSource(aIID, aResult); - } - else if (mClassID.Equals(kMsgFilterServiceCID)) { - rv = NS_NewMsgFilterService(aIID, aResult); - } - else if (mClassID.Equals(kMsgBiffManagerCID)){ - rv = NS_NewMsgBiffManager(aIID, aResult); - } - else if (mClassID.Equals(kMsgNotificationManagerCID)){ - rv = NS_NewMsgNotificationManager(aIID, aResult); - } - else if (mClassID.Equals(kCopyMessageStreamListenerCID)){ - rv = NS_NewCopyMessageStreamListener(aIID, aResult); - } - else if (mClassID.Equals(kMsgCopyServiceCID)) { - rv = NS_NewMsgCopyService(aIID, aResult); - } - else if (mClassID.Equals(kMsgFolderCacheCID)) { - nsMsgFolderCache * folderCache = nsnull; - folderCache = new nsMsgFolderCache (); - if (folderCache == nsnull) - rv = NS_ERROR_OUT_OF_MEMORY; - else - { - rv = folderCache->QueryInterface(aIID, aResult); - if (NS_FAILED(rv)) - delete folderCache; - } - } - else if (mClassID.Equals(kMsgStatusFeedbackCID)) { - rv = NS_NewMsgStatusFeedback(aIID, aResult); - } - else if (mClassID.Equals(kMessageViewCID)) { - rv = NS_NewMessageView(aIID, aResult); - } - - if (NS_SUCCEEDED(rv)) - PR_AtomicIncrement(&g_InstanceCount); - return rv; -} - -nsresult -nsMsgFactory::LockFactory(PRBool aLock) -{ - if (aLock) - PR_AtomicIncrement(&g_LockCount); - else - PR_AtomicDecrement(&g_LockCount); - - return NS_OK; -} - -//////////////////////////////////////////////////////////////////////////////// - -// return the proper factory to the caller. -extern "C" NS_EXPORT nsresult NSGetFactory(nsISupports* /*aServMgr */, - const nsCID &aClass, - const char *aClassName, - const char *aProgID, - nsIFactory **aFactory) -{ - if (nsnull == aFactory) - return NS_ERROR_NULL_POINTER; - - *aFactory = new nsMsgFactory(aClass, aClassName, aProgID); - if (aFactory) - return (*aFactory)->QueryInterface(nsCOMTypeInfo::GetIID(), - (void**)aFactory); - else - return NS_ERROR_OUT_OF_MEMORY; + return rv; } -extern "C" NS_EXPORT PRBool NSCanUnload(nsISupports* /* aServMgr */) +struct Components { + const char* mDescription; + const nsID* mCID; + const char* mProgID; +}; + +// The list of components we register +static Components gComponents[] = { + { "Netscape Messenger Bootstrapper", &kCMessengerBootstrapCID, + NS_MESSENGERBOOTSTRAP_PROGID }, + { "UrlListenerManager", &kCUrlListenerManagerCID, + NS_URLLISTENERMANAGER_PROGID }, + { "Mail Session", &kCMsgMailSessionCID, + NS_MSGMAILSESSION_PROGID }, + { "Messenger DOM interaction object", &kCMessengerCID, + NS_MESSENGER_PROGID }, + { "Messenger Account Manager", &kMsgAccountManagerCID, + NS_MSGACCOUNTMANAGER_PROGID }, + { "Messenger User Account", &kMsgAccountCID, + NS_MSGACCOUNT_PROGID }, + { "Messenger User Identity", &kMsgIdentityCID, + NS_MSGIDENTITY_PROGID }, + { "Mail/News Folder Data Source", &kMailNewsFolderDataSourceCID, + NS_MAILNEWSFOLDERDATASOURCE_PROGID }, + { "Mail/News Message Data Source", &kMailNewsMessageDataSourceCID, + NS_MAILNEWSMESSAGEDATASOURCE_PROGID}, + { "Mail/News Account Manager Data Source", &kMsgAccountManagerDataSourceCID, + NS_RDF_DATASOURCE_PROGID_PREFIX "msgaccountmanager"}, + { "Message Filter Service", &kMsgFilterServiceCID, + NS_MSGFILTERSERVICE_PROGID}, + { "Messenger Biff Manager", &kMsgBiffManagerCID, + NS_MSGBIFFMANAGER_PROGID}, + { "Mail/News Notification Manager", &kMsgNotificationManagerCID, + NS_MSGNOTIFICATIONMANAGER_PROGID}, + { "Mail/News CopyMessage Stream Listener", &kCopyMessageStreamListenerCID, + NS_COPYMESSAGESTREAMLISTENER_PROGID}, + { "Mail/News Message Copy Service", &kMsgCopyServiceCID, + NS_MSGCOPYSERVICE_PROGID}, + { "Mail/News Folder Cache", &kMsgFolderCacheCID, + NS_MSGFOLDERCACHE_PROGID}, + { "Mail/News Status Feedback", &kMsgStatusFeedbackCID, + NS_MSGSTATUSFEEDBACK_PROGID}, + { "Mail/News MessageView", &kMessageViewCID, + NS_MESSAGEVIEW_PROGID} + +}; + +#define NUM_COMPONENTS (sizeof(gComponents) / sizeof(gComponents[0])) + +NS_IMETHODIMP nsMsgBaseModule::RegisterSelf(nsIComponentManager *aCompMgr, + nsIFileSpec* aPath, + const char* registryLocation, + const char* componentType) { - return PRBool(g_InstanceCount == 0 && g_LockCount == 0); -} + nsresult rv = NS_OK; -//////////////////////////////////////////////////////////////////////////////// + Components* cp = gComponents; + Components* end = cp + NUM_COMPONENTS; + while (cp < end) + { + rv = aCompMgr->RegisterComponentSpec(*cp->mCID, cp->mDescription, + cp->mProgID, aPath, PR_TRUE, + PR_TRUE); + if (NS_FAILED(rv)) + break; + cp++; + } -extern "C" NS_EXPORT nsresult -NSRegisterSelf(nsISupports* aServMgr, const char* path) -{ - nsresult rv; - nsresult finalResult = NS_OK; - - NS_WITH_SERVICE1(nsIComponentManager, compMgr, aServMgr, kComponentManagerCID, &rv); - if (NS_FAILED(rv)) return rv; - - // register the message folder factory - rv = compMgr->RegisterComponent(kCMsgFolderEventCID, - "Folder Event", - nsnull, - path, PR_TRUE, PR_TRUE); - if (NS_FAILED(rv)) finalResult = rv; - rv = compMgr->RegisterComponent(kCUrlListenerManagerCID, - "UrlListenerManager", - NS_URLLISTENERMANAGER_PROGID, - path, PR_TRUE, PR_TRUE); - if (NS_FAILED(rv)) finalResult = rv; - - rv = compMgr->RegisterComponent(kCMessengerBootstrapCID, - "Netscape Messenger Bootstrapper", - NS_MESSENGERBOOTSTRAP_PROGID, - path, - PR_TRUE, PR_TRUE); - if ( NS_SUCCEEDED( rv ) ) { - /* Add to appshell component list. */ + /* Add to MessengerBootstrap appshell component list. */ NS_WITH_SERVICE(nsIRegistry, registry, NS_REGISTRY_PROGID, &rv); if ( NS_SUCCEEDED( rv ) ) { @@ -398,189 +445,61 @@ NSRegisterSelf(nsISupports* aServMgr, const char* path) nsRegistryKey key; rv = registry->AddSubtree( nsIRegistry::Common, buffer, - &key ); - } - } - else finalResult = rv; - - rv = compMgr->RegisterComponent(kCMessengerCID, - "Messenger DOM interaction object", - NS_MESSENGER_PROGID, - path, - PR_TRUE, PR_TRUE); - if (NS_FAILED(rv)) finalResult = rv; - - - rv = compMgr->RegisterComponent(kMsgAccountManagerCID, - "Messenger Account Manager", - NS_MSGACCOUNTMANAGER_PROGID, - path, - PR_TRUE, PR_TRUE); - if (NS_FAILED(rv)) finalResult = rv; - - - - - rv = compMgr->RegisterComponent(kMsgAccountCID, - "Messenger User Account", - NS_MSGACCOUNT_PROGID, - path, - PR_TRUE, PR_TRUE); - if (NS_FAILED(rv)) finalResult = rv; - - rv = compMgr->RegisterComponent(kMsgIdentityCID, - "Messenger User Identity", - NS_MSGIDENTITY_PROGID, - path, - PR_TRUE, PR_TRUE); - if (NS_FAILED(rv)) finalResult = rv; -#if 0 - rv = compMgr->RegisterComponent(kMsgIncomingServerCID, - "Messenger Incoming Server", - NS_MSGINCOMINGSERVER_PROGID, - path, - PR_TRUE, PR_TRUE); - if (NS_FAILED(rv)) finalResult = rv; -#endif - rv = compMgr->RegisterComponent(kCMsgMailSessionCID, - "Mail Session", - NS_MSGMAILSESSION_PROGID, - path, - PR_TRUE, PR_TRUE); - if (NS_FAILED(rv)) finalResult = rv; - - // register our RDF datasources: - rv = compMgr->RegisterComponent(kMailNewsFolderDataSourceCID, - "Mail/News Folder Data Source", - NS_MAILNEWSFOLDERDATASOURCE_PROGID, - path, PR_TRUE, PR_TRUE); - if (NS_FAILED(rv)) finalResult = rv; - - // register our RDF datasources: - rv = compMgr->RegisterComponent(kMailNewsMessageDataSourceCID, - "Mail/News Message Data Source", - NS_MAILNEWSMESSAGEDATASOURCE_PROGID, - path, PR_TRUE, PR_TRUE); - if (NS_FAILED(rv)) finalResult = rv; - - rv = compMgr->RegisterComponent(kCMessageViewDataSourceCID, - "Mail/News Message View Data Source", - NS_MESSAGEVIEWDATASOURCE_PROGID, - path, PR_TRUE, PR_TRUE); - if (NS_FAILED(rv)) finalResult = rv; - - rv = compMgr->RegisterComponent(kMsgAccountManagerDataSourceCID, - "Mail/News Account Manager Data Source", - NS_RDF_DATASOURCE_PROGID_PREFIX "msgaccountmanager", - path, PR_TRUE, PR_TRUE); - if (NS_FAILED(rv)) finalResult = rv; - - rv = compMgr->RegisterComponent(kMsgFilterServiceCID, - "Message Filter Service", - NS_MSGFILTERSERVICE_PROGID, - path, PR_TRUE, PR_TRUE); - if (NS_FAILED(rv)) finalResult = rv; - - rv = compMgr->RegisterComponent(kMsgBiffManagerCID, - "Messenger Biff Manager", - NS_MSGBIFFMANAGER_PROGID, - path, - PR_TRUE, PR_TRUE); - if (NS_FAILED(rv)) finalResult = rv; - - rv = compMgr->RegisterComponent(kMsgNotificationManagerCID, - "Mail/News Notification Manager", - NS_MSGNOTIFICATIONMANAGER_PROGID, - path, PR_TRUE, PR_TRUE); - if (NS_FAILED(rv)) finalResult = rv; - - rv = compMgr->RegisterComponent(kCopyMessageStreamListenerCID, - "Mail/News CopyMessage Stream Listener", - NS_COPYMESSAGESTREAMLISTENER_PROGID, - path, PR_TRUE, PR_TRUE); - if (NS_FAILED(rv)) finalResult = rv; - - rv = compMgr->RegisterComponent(kMsgCopyServiceCID, - "Mail/News Message Copy Service", - NS_MSGCOPYSERVICE_PROGID, - path, PR_TRUE, PR_TRUE); - if (NS_FAILED(rv)) finalResult = rv; - - rv = compMgr->RegisterComponent(kMsgFolderCacheCID, - "Mail/News Folder Cache", - NS_MSGFOLDERCACHE_PROGID, - path, PR_TRUE, PR_TRUE); - if (NS_FAILED(rv)) finalResult = rv; - - rv = compMgr->RegisterComponent(kMsgStatusFeedbackCID, - "Mail/News Status Feedback", - NS_MSGSTATUSFEEDBACK_PROGID, - path, PR_TRUE, PR_TRUE); - if (NS_FAILED(rv)) finalResult = rv; - rv = compMgr->RegisterComponent(kMessageViewCID, - "Mail/News MessageView", - NS_MESSAGEVIEW_PROGID, - path, PR_TRUE, PR_TRUE); - if (NS_FAILED(rv)) finalResult = rv; - return finalResult; + &key ); + } + + return rv; } -extern "C" NS_EXPORT nsresult -NSUnregisterSelf(nsISupports* aServMgr, const char* path) +NS_IMETHODIMP nsMsgBaseModule::UnregisterSelf(nsIComponentManager* aCompMgr, + nsIFileSpec* aPath, + const char* registryLocation) { - nsresult rv = NS_OK; - nsresult finalResult = NS_OK; + Components* cp = gComponents; + Components* end = cp + NUM_COMPONENTS; + while (cp < end) + { + aCompMgr->UnregisterComponentSpec(*cp->mCID, aPath); + cp++; + } - NS_WITH_SERVICE1(nsIComponentManager, compMgr, aServMgr, kComponentManagerCID, &rv); - if (NS_FAILED(rv)) return rv; - - rv = compMgr->UnregisterComponent(kCUrlListenerManagerCID, path); - if (NS_FAILED(rv)) finalResult = rv; - - rv = compMgr->UnregisterComponent(kCMessengerBootstrapCID, path); - if (NS_FAILED(rv)) finalResult = rv; - - rv = compMgr->UnregisterComponent(kCMsgFolderEventCID, path); - if (NS_FAILED(rv)) finalResult = rv; - - rv = compMgr->UnregisterComponent(kCMsgMailSessionCID, path); - if (NS_FAILED(rv)) finalResult = rv; - rv = compMgr->UnregisterComponent(kMailNewsFolderDataSourceCID, path); - if (NS_FAILED(rv)) finalResult = rv; - rv = compMgr->UnregisterComponent(kMailNewsMessageDataSourceCID, path); - if (NS_FAILED(rv)) finalResult = rv; - rv = compMgr->UnregisterComponent(kCMessageViewDataSourceCID, path); - if (NS_FAILED(rv)) finalResult = rv; - - // Account Manager RDF stuff - rv = compMgr->UnregisterComponent(kMsgAccountManagerDataSourceCID, path); - if (NS_FAILED(rv)) finalResult = rv; - rv = compMgr->UnregisterComponent(kMsgFilterServiceCID, path); - if (NS_FAILED(rv)) finalResult = rv; - - //Biff - rv = compMgr->UnregisterComponent(kMsgBiffManagerCID, path); - if (NS_FAILED(rv)) finalResult = rv; - rv = compMgr->UnregisterComponent(kMsgNotificationManagerCID, path); - if (NS_FAILED(rv)) finalResult = rv; - - rv = compMgr->UnregisterComponent(kCopyMessageStreamListenerCID, path); - if (NS_FAILED(rv)) finalResult = rv; - - rv = compMgr->UnregisterComponent(kMsgCopyServiceCID, path); - if (NS_FAILED(rv)) finalResult = rv; - - rv = compMgr->UnregisterComponent(kMsgFolderCacheCID, path); - if (NS_FAILED(rv)) finalResult = rv; - - rv = compMgr->UnregisterComponent(kMsgStatusFeedbackCID, path); - if (NS_FAILED(rv)) finalResult = rv; - - rv = compMgr->UnregisterComponent(kMessageViewCID, path); - if (NS_FAILED(rv)) finalResult = rv; - - return finalResult; + return NS_OK; } -//////////////////////////////////////////////////////////////////////////////// +NS_IMETHODIMP nsMsgBaseModule::CanUnload(nsIComponentManager *aCompMgr, PRBool *okToUnload) +{ + if (!okToUnload) + return NS_ERROR_INVALID_POINTER; + *okToUnload = PR_FALSE; + return NS_ERROR_FAILURE; +} + +//---------------------------------------------------------------------- + +static nsMsgBaseModule *gModule = NULL; + +extern "C" NS_EXPORT nsresult NSGetModule(nsIComponentManager *servMgr, + nsIFileSpec* location, + nsIModule** return_cobj) +{ + nsresult rv = NS_OK; + + NS_ASSERTION(return_cobj, "Null argument"); + NS_ASSERTION(gModule == NULL, "nsMsgBaseModule: Module already created."); + + // Create an initialize the imap module instance + nsMsgBaseModule *module = new nsMsgBaseModule(); + if (!module) + return NS_ERROR_OUT_OF_MEMORY; + + // Increase refcnt and store away nsIModule interface to m in return_cobj + rv = module->QueryInterface(nsIModule::GetIID(), (void**)return_cobj); + if (NS_FAILED(rv)) + { + delete module; + module = nsnull; + } + gModule = module; // WARNING: Weak Reference + return rv; +} diff --git a/mailnews/base/src/nsCopyMessageStreamListener.cpp b/mailnews/base/src/nsCopyMessageStreamListener.cpp index 959a7fd25bc1..f83d36a6fc6d 100644 --- a/mailnews/base/src/nsCopyMessageStreamListener.cpp +++ b/mailnews/base/src/nsCopyMessageStreamListener.cpp @@ -28,18 +28,6 @@ static NS_DEFINE_CID(kRDFServiceCID, NS_RDFSERVICE_CID); static NS_DEFINE_IID(kISupportsIID, NS_ISUPPORTS_IID); -NS_BEGIN_EXTERN_C - -nsresult -NS_NewCopyMessageStreamListener(const nsIID& iid, void **result) -{ - nsCopyMessageStreamListener *listener = new nsCopyMessageStreamListener(); - if(!listener) - return NS_ERROR_OUT_OF_MEMORY; - return listener->QueryInterface(iid, result); -} - -NS_END_EXTERN_C /* the following macros actually implement addref, release and query interface for our component. */ NS_IMPL_ADDREF(nsCopyMessageStreamListener) diff --git a/mailnews/base/src/nsCopyMessageStreamListener.h b/mailnews/base/src/nsCopyMessageStreamListener.h index d44fb2760159..41943359e98f 100644 --- a/mailnews/base/src/nsCopyMessageStreamListener.h +++ b/mailnews/base/src/nsCopyMessageStreamListener.h @@ -44,11 +44,6 @@ protected: }; -NS_BEGIN_EXTERN_C -nsresult -NS_NewCopyMessageStreamListener(const nsIID& iid, void **result); - -NS_END_EXTERN_C #endif diff --git a/mailnews/base/src/nsMessageView.cpp b/mailnews/base/src/nsMessageView.cpp index 7200b34067a3..9251250ace84 100644 --- a/mailnews/base/src/nsMessageView.cpp +++ b/mailnews/base/src/nsMessageView.cpp @@ -18,25 +18,7 @@ #include "nsMessageView.h" -NS_BEGIN_EXTERN_C -nsresult -NS_NewMessageView(const nsIID& iid, void **result) -{ - nsMessageView *messageView = new nsMessageView(); - if(!messageView) - return NS_ERROR_OUT_OF_MEMORY; - nsresult rv = messageView->Init(); - if(NS_FAILED(rv)) - { - delete messageView; - return rv; - } - - return messageView->QueryInterface(iid, result); -} - -NS_END_EXTERN_C NS_IMPL_ISUPPORTS(nsMessageView, nsCOMTypeInfo::GetIID()) diff --git a/mailnews/base/src/nsMessageView.h b/mailnews/base/src/nsMessageView.h index d3a35b0b547c..70ee7342b628 100644 --- a/mailnews/base/src/nsMessageView.h +++ b/mailnews/base/src/nsMessageView.h @@ -38,11 +38,6 @@ protected: }; -NS_BEGIN_EXTERN_C -nsresult -NS_NewMessageView(const nsIID& iid, void **result); - -NS_END_EXTERN_C #endif diff --git a/mailnews/base/src/nsMessenger.cpp b/mailnews/base/src/nsMessenger.cpp index 686378dc9cfb..66302ad2901c 100644 --- a/mailnews/base/src/nsMessenger.cpp +++ b/mailnews/base/src/nsMessenger.cpp @@ -18,14 +18,11 @@ #include "prsystem.h" -#include "nsIMessenger.h" #include "nsMessenger.h" /* rhp - for access to webshell */ -#include "nsCOMPtr.h" #include "nsIDOMWindow.h" #include "nsIBrowserWindow.h" -#include "nsIWebShell.h" #include "nsIWebShellWindow.h" #include "nsIScriptGlobalObject.h" #include "nsAppShellCIDs.h" @@ -36,7 +33,6 @@ #include "nsIDocument.h" #include "nsIDocumentViewer.h" #include "nsIDOMXULDocument.h" -#include "nsIDocumentLoaderObserver.h" #include "nsIMsgMailSession.h" #include "nsIMsgIncomingServer.h" @@ -44,7 +40,6 @@ #include "nsINoIncomingServer.h" #include "nsIMsgMessageService.h" #include "nsIFileSpecWithUI.h" -#include "nsFileSpec.h" #include "nsFileStream.h" #include "nsIMessage.h" @@ -72,7 +67,6 @@ #include "nsIComponentManager.h" #include "nsTransactionManagerCID.h" -#include "nsITransactionManager.h" #include "nsIMsgSendLater.h" #include "nsMsgCompCID.h" @@ -149,38 +143,6 @@ public: }; -class nsMessenger : public nsIMessenger -{ - -public: - nsMessenger(); - virtual ~nsMessenger(); - - NS_DECL_ISUPPORTS - - NS_DECL_NSIMESSENGER - -protected: - nsresult DoDelete(nsIRDFCompositeDataSource* db, nsISupportsArray *srcArray, nsISupportsArray *deletedArray); - nsresult DoCommand(nsIRDFCompositeDataSource *db, char * command, nsISupportsArray *srcArray, - nsISupportsArray *arguments); - nsresult DoMarkMessagesRead(nsIRDFCompositeDataSource *database, nsISupportsArray *resourceArray, PRBool markRead); - nsresult DoMarkMessagesFlagged(nsIRDFCompositeDataSource *database, nsISupportsArray *resourceArray, PRBool markFlagged); -private: - - nsString mId; - void *mScriptObject; - nsCOMPtr mTxnMgr; - - /* rhp - need this to drive message display */ - nsIDOMWindow *mWindow; - nsIWebShell *mWebShell; - - nsCOMPtr m_docLoaderObserver; - // mscott: temporary variable used to support running urls through the 'Demo' menu.... - nsFileSpec m_folderPath; - void InitializeFolderRoot(); -}; static nsresult ConvertDOMListToResourceArray(nsIDOMNodeList *nodeList, nsISupportsArray **resourceArray) { @@ -305,19 +267,6 @@ nsMessenger::GetNewMessages(nsIRDFCompositeDataSource *db, nsIDOMXULElement *fol return rv; } -extern "C" -nsresult -NS_NewMessenger(const nsIID &aIID, void **aResult) -{ - if (!aResult) return NS_ERROR_NULL_POINTER; - - nsMessenger *appcore = new nsMessenger(); - if (appcore) - return appcore->QueryInterface(aIID, (void **)aResult); - else - return NS_ERROR_NOT_INITIALIZED; -} - NS_IMETHODIMP nsMessenger::SetWindow(nsIDOMWindow *aWin, nsIMsgStatusFeedback *aStatusFeedback) diff --git a/mailnews/base/src/nsMessenger.h b/mailnews/base/src/nsMessenger.h index a6030f5fe5f6..4c8bb4b7c23a 100644 --- a/mailnews/base/src/nsMessenger.h +++ b/mailnews/base/src/nsMessenger.h @@ -21,17 +21,50 @@ #include "nsCom.h" #include "nscore.h" +#include "nsIMessenger.h" +#include "nsCOMPtr.h" +#include "nsITransactionManager.h" +#include "nsIDocumentLoaderObserver.h" +#include "nsFileSpec.h" +#include "nsIWebShell.h" + +class nsMessenger : public nsIMessenger +{ + +public: + nsMessenger(); + virtual ~nsMessenger(); + + NS_DECL_ISUPPORTS + + NS_DECL_NSIMESSENGER + +protected: + nsresult DoDelete(nsIRDFCompositeDataSource* db, nsISupportsArray *srcArray, nsISupportsArray *deletedArray); + nsresult DoCommand(nsIRDFCompositeDataSource *db, char * command, nsISupportsArray *srcArray, + nsISupportsArray *arguments); + nsresult DoMarkMessagesRead(nsIRDFCompositeDataSource *database, nsISupportsArray *resourceArray, PRBool markRead); + nsresult DoMarkMessagesFlagged(nsIRDFCompositeDataSource *database, nsISupportsArray *resourceArray, PRBool markFlagged); +private: + + nsString mId; + void *mScriptObject; + nsCOMPtr mTxnMgr; + + /* rhp - need this to drive message display */ + nsIDOMWindow *mWindow; + nsIWebShell *mWebShell; + + nsCOMPtr m_docLoaderObserver; + // mscott: temporary variable used to support running urls through the 'Demo' menu.... + nsFileSpec m_folderPath; + void InitializeFolderRoot(); +}; #define NS_MESSENGER_CID \ { /* 3f181950-c14d-11d2-b7f2-00805f05ffa5 */ \ 0x3f181950, 0xc14d, 0x11d2, \ {0xb7, 0xf2, 0x0, 0x80, 0x5f, 0x05, 0xff, 0xa5}} -NS_BEGIN_EXTERN_C - -nsresult -NS_NewMessenger(const nsIID &aIID, void **); - -NS_END_EXTERN_C #endif diff --git a/mailnews/base/src/nsMessengerBootstrap.cpp b/mailnews/base/src/nsMessengerBootstrap.cpp index 3e2346df45ec..bb15e94a474d 100644 --- a/mailnews/base/src/nsMessengerBootstrap.cpp +++ b/mailnews/base/src/nsMessengerBootstrap.cpp @@ -17,22 +17,11 @@ */ #include "nsMessengerBootstrap.h" -#include "nsIAppShellComponent.h" #include "nsCOMPtr.h" #include "nsDOMCID.h" -class nsMessengerBootstrap : public nsIAppShellComponent { - -public: - nsMessengerBootstrap(); - virtual ~nsMessengerBootstrap(); - - NS_DECL_ISUPPORTS - - NS_DECL_NSIAPPSHELLCOMPONENT - -}; + NS_IMPL_ISUPPORTS(nsMessengerBootstrap, nsCOMTypeInfo::GetIID()) @@ -74,17 +63,4 @@ nsMessengerBootstrap::Shutdown() return finalrv; } -nsresult -NS_NewMessengerBootstrap(const nsIID &aIID, void ** msgboot) -{ - if (!msgboot) return NS_ERROR_NULL_POINTER; - - nsMessengerBootstrap *bootstrap = - new nsMessengerBootstrap(); - - if (!bootstrap) return NS_ERROR_OUT_OF_MEMORY; - - - return bootstrap->QueryInterface(aIID, msgboot); -} diff --git a/mailnews/base/src/nsMessengerBootstrap.h b/mailnews/base/src/nsMessengerBootstrap.h index 567d09fe4bca..7a6d66e0c981 100644 --- a/mailnews/base/src/nsMessengerBootstrap.h +++ b/mailnews/base/src/nsMessengerBootstrap.h @@ -23,6 +23,7 @@ #include "nscore.h" #include "nsIServiceManager.h" #include "nsIAppShellService.h" +#include "nsIAppShellComponent.h" #define NS_MESSENGERBOOTSTRAP_CID \ { /* 4a85a5d0-cddd-11d2-b7f6-00805f05ffa5 */ \ @@ -30,10 +31,17 @@ {0xb7, 0xf6, 0x00, 0x80, 0x5f, 0x05, 0xff, 0xa5}} -NS_BEGIN_EXTERN_C +class nsMessengerBootstrap : public nsIAppShellComponent { + +public: + nsMessengerBootstrap(); + virtual ~nsMessengerBootstrap(); + + NS_DECL_ISUPPORTS + + NS_DECL_NSIAPPSHELLCOMPONENT + +}; -nsresult NS_NewMessengerBootstrap(const nsIID &aIID, void ** inst); - -NS_END_EXTERN_C #endif diff --git a/mailnews/base/src/nsMsgAccount.cpp b/mailnews/base/src/nsMsgAccount.cpp index 7ffe4aed9740..fe574f5328e5 100644 --- a/mailnews/base/src/nsMsgAccount.cpp +++ b/mailnews/base/src/nsMsgAccount.cpp @@ -39,33 +39,6 @@ static NS_DEFINE_CID(kMsgIdentityCID, NS_MSGIDENTITY_CID); static NS_DEFINE_CID(kPrefServiceCID, NS_PREF_CID); -class nsMsgAccount : public nsIMsgAccount, - public nsIShutdownListener -{ - -public: - nsMsgAccount(); - virtual ~nsMsgAccount(); - - NS_DECL_ISUPPORTS - - NS_DECL_NSIMSGACCOUNT - // nsIShutdownListener - - NS_IMETHOD OnShutdown(const nsCID& aClass, nsISupports *service); - -private: - char *m_accountKey; - nsIPref *m_prefs; - nsCOMPtr m_incomingServer; - - nsCOMPtr m_defaultIdentity; - nsCOMPtr m_identities; - - nsresult getPrefService(); - nsresult createIncomingServer(); - nsresult createIdentities(); -}; @@ -424,15 +397,4 @@ nsMsgAccount::OnShutdown(const nsCID& aClass, nsISupports *service) return NS_OK; } -nsresult -NS_NewMsgAccount(const nsIID& iid, void **result) -{ - if (!result) return NS_ERROR_NULL_POINTER; - - nsMsgAccount *account = new nsMsgAccount; - if (!account) return NS_ERROR_OUT_OF_MEMORY; - - return account->QueryInterface(iid, result); -} - diff --git a/mailnews/base/src/nsMsgAccount.h b/mailnews/base/src/nsMsgAccount.h index 246f65817b65..91bcb3f78e63 100644 --- a/mailnews/base/src/nsMsgAccount.h +++ b/mailnews/base/src/nsMsgAccount.h @@ -19,9 +19,31 @@ #include "nscore.h" #include "nsIMsgAccount.h" -NS_BEGIN_EXTERN_C +class nsMsgAccount : public nsIMsgAccount, + public nsIShutdownListener +{ + +public: + nsMsgAccount(); + virtual ~nsMsgAccount(); + + NS_DECL_ISUPPORTS + + NS_DECL_NSIMSGACCOUNT + // nsIShutdownListener -nsresult -NS_NewMsgAccount(const nsIID& iid, void **result); + NS_IMETHOD OnShutdown(const nsCID& aClass, nsISupports *service); + +private: + char *m_accountKey; + nsIPref *m_prefs; + nsCOMPtr m_incomingServer; + + nsCOMPtr m_defaultIdentity; + nsCOMPtr m_identities; + + nsresult getPrefService(); + nsresult createIncomingServer(); + nsresult createIdentities(); +}; -NS_END_EXTERN_C diff --git a/mailnews/base/src/nsMsgAccountManager.cpp b/mailnews/base/src/nsMsgAccountManager.cpp index 89f1cc3bcf7a..3cffd704be2e 100644 --- a/mailnews/base/src/nsMsgAccountManager.cpp +++ b/mailnews/base/src/nsMsgAccountManager.cpp @@ -16,16 +16,12 @@ * Reserved. */ -#include "nsIMsgAccountManager.h" #include "nsIComponentManager.h" #include "nsIServiceManager.h" #include "nsISupportsArray.h" #include "nsMsgAccountManager.h" -#include "nsHashtable.h" #include "nsMsgBaseCID.h" #include "nsMsgCompCID.h" -#include "nsIPref.h" -#include "nsCOMPtr.h" #include "prmem.h" #include "plstr.h" #include "nsString.h" @@ -47,7 +43,6 @@ #include "nsFileLocations.h" #include "nsIURL.h" #include "nsISmtpService.h" -#include "nsISmtpServer.h" // this should eventually be moved to the pop3 server for upgrading #include "nsIPop3IncomingServer.h" @@ -303,139 +298,6 @@ typedef struct _findAccountByKeyEntry { -class nsMsgAccountManager : public nsIMsgAccountManager, - public nsIShutdownListener -{ -public: - - nsMsgAccountManager(); - virtual ~nsMsgAccountManager(); - - NS_DECL_ISUPPORTS - - /* nsIShutdownListener methods */ - - NS_IMETHOD OnShutdown(const nsCID& aClass, nsISupports *service); - - /* nsIMsgAccountManager methods */ - - NS_DECL_NSIMSGACCOUNTMANAGER - - //Add/remove an account to/from the Biff Manager if it has Biff turned on. - nsresult AddServerToBiff(nsIMsgIncomingServer *account); - nsresult RemoveServerFromBiff(nsIMsgIncomingServer *account); -private: - - PRBool m_accountsLoaded; - PRBool m_alreadySetNntpDefaultLocalPath; - PRBool m_alreadySetImapDefaultLocalPath; - - nsISupportsArray *m_accounts; - nsHashtable m_identities; - nsHashtable m_incomingServers; - nsCOMPtr m_defaultAccount; - - nsCAutoString accountKeyList; - - /* internal creation routines - updates m_identities and m_incomingServers */ - nsresult createKeyedAccount(const char* key, - nsIMsgAccount **_retval); - nsresult createKeyedServer(const char*key, - const char* type, - nsIMsgIncomingServer **_retval); - - nsresult createKeyedIdentity(const char* key, - nsIMsgIdentity **_retval); - - // hash table enumerators - - - // - static PRBool hashElementToArray(nsHashKey *aKey, void *aData, - void *closure); - - // called by EnumerateRemove to release all elements - static PRBool hashElementRelease(nsHashKey *aKey, void *aData, - void *closure); - - // remove all of the servers from the Biff Manager - static PRBool removeServerFromBiff(nsHashKey *aKey, void *aData, - void *closure); - - // - // account enumerators - // ("element" is always an account) - // - - // append the account keys to the given string - static PRBool getAccountList(nsISupports *aKey, void *aData); - - // find the identities that correspond to the given server - static PRBool findIdentitiesForServer(nsISupports *element, void *aData); - - // find the servers that correspond to the given identity - static PRBool findServersForIdentity (nsISupports *element, void *aData); - - static PRBool findServerIndexByServer(nsISupports *element, void *aData); - // find the account with the given key - static PRBool findAccountByKey (nsISupports *element, void *aData); - - static PRBool findAccountByServerKey (nsISupports *element, void *aData); - - // load up the servers into the given nsISupportsArray - static PRBool getServersToArray(nsISupports *element, void *aData); - - // load up the identities into the given nsISupportsArray - static PRBool getIdentitiesToArray(nsISupports *element, void *aData); - - // add identities if they don't alreadby exist in the given nsISupportsArray - static PRBool addIdentityIfUnique(nsISupports *element, void *aData); - - // - // server enumerators - // ("element" is always a server) - // - - // find the server given by {username, hostname, type} - static PRBool findServer(nsISupports *aElement, void *data); - - // write out the server's cache through the given folder cache - static PRBool writeFolderCache(nsHashKey *aKey, void *aData, void *closure); - static PRBool closeCachedConnections(nsHashKey *aKey, void *aData, void *closure); - - // methods for migration / upgrading - nsresult MigrateIdentity(nsIMsgIdentity *identity); - nsresult MigrateSmtpServer(nsISmtpServer *server); - nsresult CopyIdentity(nsIMsgIdentity *srcIdentity, nsIMsgIdentity *destIdentity); - nsresult SetNewsCcAndFccValues(nsIMsgIdentity *identity); - nsresult SetMailCcAndFccValues(nsIMsgIdentity *identity); - - nsresult MigrateImapAccounts(nsIMsgIdentity *identity); - nsresult MigrateImapAccount(nsIMsgIdentity *identity, const char *hostname); - - nsresult MigrateOldImapPrefs(nsIMsgIncomingServer *server, const char *hostname); - - nsresult MigratePopAccount(nsIMsgIdentity *identity); - - nsresult CreateLocalMailAccount(nsIMsgIdentity *identity); - nsresult MigrateLocalMailAccount(nsIMsgIdentity *identity); - nsresult MigrateOldPopPrefs(nsIMsgIncomingServer *server, const char *hostname); - - nsresult MigrateNewsAccounts(nsIMsgIdentity *identity); - nsresult MigrateNewsAccount(nsIMsgIdentity *identity, const char *hostname, nsFileSpec &newsrcfile, nsFileSpec &newsHostsDir); - nsresult MigrateOldNntpPrefs(nsIMsgIncomingServer *server, const char *hostname, nsFileSpec &newsrcfile); - - nsresult ProceedWithMigration(PRInt32 oldMailType); - - static char *getUniqueKey(const char* prefix, nsHashtable *hashTable); - static char *getUniqueAccountKey(const char* prefix, - nsISupportsArray *accounts); - - nsresult Convert4XUri(const char *old_uri, const char *default_folder_name, char **new_uri); - - nsresult getPrefService(); - nsIPref *m_prefs; -}; NS_IMPL_ADDREF(nsMsgAccountManager) @@ -2779,13 +2641,3 @@ nsMsgAccountManager::findServersForIdentity(nsISupports *element, void *aData) return PR_TRUE; } -nsresult -NS_NewMsgAccountManager(const nsIID& iid, void **result) -{ - nsMsgAccountManager* manager; - if (!result) return NS_ERROR_NULL_POINTER; - - manager = new nsMsgAccountManager(); - - return manager->QueryInterface(iid, result); -} diff --git a/mailnews/base/src/nsMsgAccountManager.h b/mailnews/base/src/nsMsgAccountManager.h index bc3dd9828d94..bb7907665703 100644 --- a/mailnews/base/src/nsMsgAccountManager.h +++ b/mailnews/base/src/nsMsgAccountManager.h @@ -18,6 +18,10 @@ #include "nscore.h" #include "nsIMsgAccountManager.h" +#include "nsCOMPtr.h" +#include "nsHashtable.h" +#include "nsISmtpServer.h" +#include "nsIPref.h" /* * some platforms (like Windows and Mac) use a map file, because of @@ -47,10 +51,137 @@ #endif /* XP_UNIX || XP_BEOS */ +class nsMsgAccountManager : public nsIMsgAccountManager, + public nsIShutdownListener +{ +public: -NS_BEGIN_EXTERN_C + nsMsgAccountManager(); + virtual ~nsMsgAccountManager(); + + NS_DECL_ISUPPORTS -nsresult -NS_NewMsgAccountManager(const nsIID& iid, void **result); + /* nsIShutdownListener methods */ + + NS_IMETHOD OnShutdown(const nsCID& aClass, nsISupports *service); + + /* nsIMsgAccountManager methods */ + + NS_DECL_NSIMSGACCOUNTMANAGER + + //Add/remove an account to/from the Biff Manager if it has Biff turned on. + nsresult AddServerToBiff(nsIMsgIncomingServer *account); + nsresult RemoveServerFromBiff(nsIMsgIncomingServer *account); +private: + + PRBool m_accountsLoaded; + PRBool m_alreadySetNntpDefaultLocalPath; + PRBool m_alreadySetImapDefaultLocalPath; + + nsISupportsArray *m_accounts; + nsHashtable m_identities; + nsHashtable m_incomingServers; + nsCOMPtr m_defaultAccount; + + nsCAutoString accountKeyList; + + /* internal creation routines - updates m_identities and m_incomingServers */ + nsresult createKeyedAccount(const char* key, + nsIMsgAccount **_retval); + nsresult createKeyedServer(const char*key, + const char* type, + nsIMsgIncomingServer **_retval); + + nsresult createKeyedIdentity(const char* key, + nsIMsgIdentity **_retval); + + // hash table enumerators + + + // + static PRBool hashElementToArray(nsHashKey *aKey, void *aData, + void *closure); + + // called by EnumerateRemove to release all elements + static PRBool hashElementRelease(nsHashKey *aKey, void *aData, + void *closure); + + // remove all of the servers from the Biff Manager + static PRBool removeServerFromBiff(nsHashKey *aKey, void *aData, + void *closure); + + // + // account enumerators + // ("element" is always an account) + // + + // append the account keys to the given string + static PRBool getAccountList(nsISupports *aKey, void *aData); + + // find the identities that correspond to the given server + static PRBool findIdentitiesForServer(nsISupports *element, void *aData); + + // find the servers that correspond to the given identity + static PRBool findServersForIdentity (nsISupports *element, void *aData); + + static PRBool findServerIndexByServer(nsISupports *element, void *aData); + // find the account with the given key + static PRBool findAccountByKey (nsISupports *element, void *aData); + + static PRBool findAccountByServerKey (nsISupports *element, void *aData); + + // load up the servers into the given nsISupportsArray + static PRBool getServersToArray(nsISupports *element, void *aData); + + // load up the identities into the given nsISupportsArray + static PRBool getIdentitiesToArray(nsISupports *element, void *aData); + + // add identities if they don't alreadby exist in the given nsISupportsArray + static PRBool addIdentityIfUnique(nsISupports *element, void *aData); + + // + // server enumerators + // ("element" is always a server) + // + + // find the server given by {username, hostname, type} + static PRBool findServer(nsISupports *aElement, void *data); + + // write out the server's cache through the given folder cache + static PRBool writeFolderCache(nsHashKey *aKey, void *aData, void *closure); + static PRBool closeCachedConnections(nsHashKey *aKey, void *aData, void *closure); + + // methods for migration / upgrading + nsresult MigrateIdentity(nsIMsgIdentity *identity); + nsresult MigrateSmtpServer(nsISmtpServer *server); + nsresult CopyIdentity(nsIMsgIdentity *srcIdentity, nsIMsgIdentity *destIdentity); + nsresult SetNewsCcAndFccValues(nsIMsgIdentity *identity); + nsresult SetMailCcAndFccValues(nsIMsgIdentity *identity); + + nsresult MigrateImapAccounts(nsIMsgIdentity *identity); + nsresult MigrateImapAccount(nsIMsgIdentity *identity, const char *hostname); + + nsresult MigrateOldImapPrefs(nsIMsgIncomingServer *server, const char *hostname); + + nsresult MigratePopAccount(nsIMsgIdentity *identity); + + nsresult CreateLocalMailAccount(nsIMsgIdentity *identity); + nsresult MigrateLocalMailAccount(nsIMsgIdentity *identity); + nsresult MigrateOldPopPrefs(nsIMsgIncomingServer *server, const char *hostname); + + nsresult MigrateNewsAccounts(nsIMsgIdentity *identity); + nsresult MigrateNewsAccount(nsIMsgIdentity *identity, const char *hostname, nsFileSpec &newsrcfile, nsFileSpec &newsHostsDir); + nsresult MigrateOldNntpPrefs(nsIMsgIncomingServer *server, const char *hostname, nsFileSpec &newsrcfile); + + nsresult ProceedWithMigration(PRInt32 oldMailType); + + static char *getUniqueKey(const char* prefix, nsHashtable *hashTable); + static char *getUniqueAccountKey(const char* prefix, + nsISupportsArray *accounts); + + nsresult Convert4XUri(const char *old_uri, const char *default_folder_name, char **new_uri); + + nsresult getPrefService(); + nsIPref *m_prefs; +}; -NS_END_EXTERN_C diff --git a/mailnews/base/src/nsMsgAccountManagerDS.cpp b/mailnews/base/src/nsMsgAccountManagerDS.cpp index 00ede08da085..31d39ef79e10 100644 --- a/mailnews/base/src/nsMsgAccountManagerDS.cpp +++ b/mailnews/base/src/nsMsgAccountManagerDS.cpp @@ -21,9 +21,7 @@ */ #include "nsMsgAccountManagerDS.h" -#include "nsMsgRDFDataSource.h" -#include "nsIMsgAccountManager.h" #include "rdf.h" #include "nsRDFCID.h" @@ -32,7 +30,6 @@ #include "nsIServiceManager.h" #include "nsIMsgMailSession.h" -#include "nsCOMPtr.h" #include "nsXPIDLString.h" #include "nsMsgRDFUtils.h" @@ -54,63 +51,6 @@ static NS_DEFINE_CID(kRDFServiceCID, NS_RDFSERVICE_CID); #define NC_RDF_ACCOUNTROOT "msgaccounts:/" -class nsMsgAccountManagerDataSource : public nsMsgRDFDataSource -{ - -public: - - nsMsgAccountManagerDataSource(); - virtual ~nsMsgAccountManagerDataSource(); - virtual nsresult Init(); - - // service manager shutdown method - - // RDF datasource methods - - /* nsIRDFNode GetTarget (in nsIRDFResource aSource, in nsIRDFResource property, in boolean aTruthValue); */ - NS_IMETHOD GetTarget(nsIRDFResource *source, - nsIRDFResource *property, - PRBool aTruthValue, - nsIRDFNode **_retval); - - /* nsISimpleEnumerator GetTargets (in nsIRDFResource aSource, in nsIRDFResource property, in boolean aTruthValue); */ - NS_IMETHOD GetTargets(nsIRDFResource *source, - nsIRDFResource *property, - PRBool aTruthValue, - nsISimpleEnumerator **_retval); - /* nsISimpleEnumerator ArcLabelsOut (in nsIRDFResource aSource); */ - NS_IMETHOD ArcLabelsOut(nsIRDFResource *source, nsISimpleEnumerator **_retval); - -protected: - - static nsIRDFResource* kNC_Name; - static nsIRDFResource* kNC_NameSort; - static nsIRDFResource* kNC_PageTag; - static nsIRDFResource* kNC_Child; - static nsIRDFResource* kNC_AccountRoot; - - static nsIRDFResource* kNC_Account; - static nsIRDFResource* kNC_Server; - static nsIRDFResource* kNC_Identity; - static nsIRDFResource* kNC_Settings; - - static nsIRDFResource* kNC_PageTitleMain; - static nsIRDFResource* kNC_PageTitleServer; - static nsIRDFResource* kNC_PageTitleCopies; - static nsIRDFResource* kNC_PageTitleAdvanced; - static nsIRDFResource* kNC_PageTitleSMTP; - - static nsrefcnt gAccountManagerResourceRefCnt; - -private: - // enumeration function to convert each server (element) - // to an nsIRDFResource and append it to the array (in data) - static PRBool createServerResources(nsISupports *element, void *data); - - nsCOMPtr mAccountManager; - -}; - typedef struct _serverCreationParams { nsISupportsArray *serverArray; nsIRDFService *rdfService; @@ -503,10 +443,4 @@ nsMsgAccountManagerDataSource::ArcLabelsOut(nsIRDFResource *source, return NS_OK; } -nsresult -NS_NewMsgAccountManagerDataSource(const nsIID& iid, void ** result) -{ - nsMsgAccountManagerDataSource *amds = new nsMsgAccountManagerDataSource(); - if (!amds) return NS_ERROR_OUT_OF_MEMORY; - return amds->QueryInterface(iid, result); -} + diff --git a/mailnews/base/src/nsMsgAccountManagerDS.h b/mailnews/base/src/nsMsgAccountManagerDS.h index 89f91f063057..d3c9cb930b49 100644 --- a/mailnews/base/src/nsMsgAccountManagerDS.h +++ b/mailnews/base/src/nsMsgAccountManagerDS.h @@ -22,18 +22,72 @@ #include "nscore.h" #include "nsError.h" #include "nsIID.h" +#include "nsMsgRDFDataSource.h" +#include "nsCOMPtr.h" +#include "nsIMsgAccountManager.h" /* {3f989ca4-f77a-11d2-969d-006008948010} */ #define NS_MSGACCOUNTMANAGERDATASOURCE_CID \ {0x3f989ca4, 0xf77a, 0x11d2, \ {0x96, 0x9d, 0x00, 0x60, 0x08, 0x94, 0x80, 0x10}} -NS_BEGIN_EXTERN_C +class nsMsgAccountManagerDataSource : public nsMsgRDFDataSource +{ -nsresult -NS_NewMsgAccountManagerDataSource(const nsIID& iid, void ** result); +public: + + nsMsgAccountManagerDataSource(); + virtual ~nsMsgAccountManagerDataSource(); + virtual nsresult Init(); + + // service manager shutdown method + + // RDF datasource methods + + /* nsIRDFNode GetTarget (in nsIRDFResource aSource, in nsIRDFResource property, in boolean aTruthValue); */ + NS_IMETHOD GetTarget(nsIRDFResource *source, + nsIRDFResource *property, + PRBool aTruthValue, + nsIRDFNode **_retval); + + /* nsISimpleEnumerator GetTargets (in nsIRDFResource aSource, in nsIRDFResource property, in boolean aTruthValue); */ + NS_IMETHOD GetTargets(nsIRDFResource *source, + nsIRDFResource *property, + PRBool aTruthValue, + nsISimpleEnumerator **_retval); + /* nsISimpleEnumerator ArcLabelsOut (in nsIRDFResource aSource); */ + NS_IMETHOD ArcLabelsOut(nsIRDFResource *source, nsISimpleEnumerator **_retval); + +protected: + + static nsIRDFResource* kNC_Name; + static nsIRDFResource* kNC_NameSort; + static nsIRDFResource* kNC_PageTag; + static nsIRDFResource* kNC_Child; + static nsIRDFResource* kNC_AccountRoot; + + static nsIRDFResource* kNC_Account; + static nsIRDFResource* kNC_Server; + static nsIRDFResource* kNC_Identity; + static nsIRDFResource* kNC_Settings; + + static nsIRDFResource* kNC_PageTitleMain; + static nsIRDFResource* kNC_PageTitleServer; + static nsIRDFResource* kNC_PageTitleCopies; + static nsIRDFResource* kNC_PageTitleAdvanced; + static nsIRDFResource* kNC_PageTitleSMTP; + + static nsrefcnt gAccountManagerResourceRefCnt; + +private: + // enumeration function to convert each server (element) + // to an nsIRDFResource and append it to the array (in data) + static PRBool createServerResources(nsISupports *element, void *data); + + nsCOMPtr mAccountManager; + +}; -NS_END_EXTERN_C #endif diff --git a/mailnews/base/src/nsMsgBiffManager.cpp b/mailnews/base/src/nsMsgBiffManager.cpp index 97d41553a937..ce8a47928e25 100644 --- a/mailnews/base/src/nsMsgBiffManager.cpp +++ b/mailnews/base/src/nsMsgBiffManager.cpp @@ -19,18 +19,7 @@ #include "nsMsgBiffManager.h" #include "nsCRT.h" -NS_BEGIN_EXTERN_C -nsresult -NS_NewMsgBiffManager(const nsIID& iid, void **result) -{ - nsMsgBiffManager *biffManager = new nsMsgBiffManager(); - if(!biffManager) - return NS_ERROR_OUT_OF_MEMORY; - return biffManager->QueryInterface(iid, result); -} - -NS_END_EXTERN_C NS_IMPL_ADDREF(nsMsgBiffManager) NS_IMPL_RELEASE(nsMsgBiffManager) diff --git a/mailnews/base/src/nsMsgBiffManager.h b/mailnews/base/src/nsMsgBiffManager.h index 26d7a6a8a015..224b8715f6e0 100644 --- a/mailnews/base/src/nsMsgBiffManager.h +++ b/mailnews/base/src/nsMsgBiffManager.h @@ -57,12 +57,7 @@ protected: nsVoidArray *mBiffArray; }; -NS_BEGIN_EXTERN_C -nsresult -NS_NewMsgBiffManager(const nsIID& iid, void **result); - -NS_END_EXTERN_C #endif diff --git a/mailnews/base/src/nsMsgCopyService.cpp b/mailnews/base/src/nsMsgCopyService.cpp index f5ba3ac90f4a..ad4059e62736 100644 --- a/mailnews/base/src/nsMsgCopyService.cpp +++ b/mailnews/base/src/nsMsgCopyService.cpp @@ -17,98 +17,21 @@ */ #include "nsMsgCopyService.h" -#include "nsCOMPtr.h" #include "nsVoidArray.h" #include "nsMsgKeyArray.h" #include "nspr.h" -#include "nsIMessage.h" -#include "nsIMsgFolder.h" - -typedef enum _nsCopyRequestType -{ - nsCopyMessagesType = 0x0, - nsCopyFileMessageType = 0x1 -} nsCopyRequestType; - -class nsCopyRequest; - -class nsCopySource -{ -public: - nsCopySource(); - nsCopySource(nsIMsgFolder* srcFolder); - ~nsCopySource(); - void AddMessage(nsIMessage* aMsg); - - nsCOMPtr m_msgFolder; - nsCOMPtr m_messageArray; - PRBool m_processed; -}; - -class nsCopyRequest -{ -public: - nsCopyRequest(); - ~nsCopyRequest(); - - nsresult Init(nsCopyRequestType type, nsISupports* aSupport, - nsIMsgFolder* dstFolder, - PRBool bVal, nsIMsgCopyServiceListener* listener, - nsITransactionManager* txnMgr); - nsCopySource* AddNewCopySource(nsIMsgFolder* srcFolder); - - nsCOMPtr m_srcSupport; // ui source folder or file spec - nsCOMPtr m_dstFolder; - nsCOMPtr m_txnMgr; - nsCOMPtr m_listener; - nsCopyRequestType m_requestType; - PRBool m_isMoveOrDraftOrTemplate; - PRBool m_processed; - nsVoidArray m_copySourceArray; // array of nsCopySource -}; - -class nsMsgCopyService : public nsIMsgCopyService -{ -public: - nsMsgCopyService(); - virtual ~nsMsgCopyService(); - - NS_DECL_ISUPPORTS - - // nsIMsgCopyService interface - NS_IMETHOD CopyMessages(nsIMsgFolder* srcFolder, /* UI src foler */ - nsISupportsArray* messages, - nsIMsgFolder* dstFolder, - PRBool isMove, - nsIMsgCopyServiceListener* listener, - nsITransactionManager* txnMgr); - - NS_IMETHOD CopyFileMessage(nsIFileSpec* fileSpec, - nsIMsgFolder* dstFolder, - nsIMessage* msgToReplace, - PRBool isDraftOrTemplate, - nsIMsgCopyServiceListener* listener, - nsITransactionManager* txnMgr); - - NS_IMETHOD NotifyCompletion(nsISupports* aSupport, /* store src folder */ - nsIMsgFolder* dstFolder, - nsresult result); -private: - nsresult ClearRequest(nsCopyRequest* aRequest, nsresult rv); - nsresult DoCopy(nsCopyRequest* aRequest); - nsresult DoNextCopy(); - nsCopyRequest* FindRequest(nsISupports* aSupport, nsIMsgFolder* dstFolder); - - nsVoidArray m_copyRequests; -}; // ******************** nsCopySource ****************** // + +MOZ_DECL_CTOR_COUNTER(nsCopySource); + nsCopySource::nsCopySource() : m_processed(PR_FALSE) { + MOZ_COUNT_CTOR(nsCopySource); nsresult rv; rv = NS_NewISupportsArray(getter_AddRefs(m_messageArray)); } @@ -116,6 +39,7 @@ nsCopySource::nsCopySource() : m_processed(PR_FALSE) nsCopySource::nsCopySource(nsIMsgFolder* srcFolder) : m_processed(PR_FALSE) { + MOZ_COUNT_CTOR(nsCopySource); nsresult rv; rv = NS_NewISupportsArray(getter_AddRefs(m_messageArray)); m_msgFolder = do_QueryInterface(srcFolder, &rv); @@ -123,6 +47,7 @@ nsCopySource::nsCopySource(nsIMsgFolder* srcFolder) : nsCopySource::~nsCopySource() { + MOZ_COUNT_DTOR(nsCopySource); } void nsCopySource::AddMessage(nsIMessage* aMsg) @@ -134,16 +59,22 @@ void nsCopySource::AddMessage(nsIMessage* aMsg) // ************ nsCopyRequest ***************** // + +MOZ_DECL_CTOR_COUNTER(nsCopyRequest); + nsCopyRequest::nsCopyRequest() : m_requestType(nsCopyMessagesType), m_isMoveOrDraftOrTemplate(PR_FALSE), m_processed(PR_FALSE) { + MOZ_COUNT_CTOR(nsCopyRequest); } nsCopyRequest::~nsCopyRequest() { - PRInt32 j; + MOZ_COUNT_DTOR(nsCopyRequest); + + PRInt32 j; nsCopySource* ncs; j = m_copySourceArray.Count(); @@ -187,6 +118,7 @@ nsCopyRequest::AddNewCopySource(nsIMsgFolder* srcFolder) // ************* nsMsgCopyService **************** // + nsMsgCopyService::nsMsgCopyService() { NS_INIT_REFCNT(); @@ -194,6 +126,7 @@ nsMsgCopyService::nsMsgCopyService() nsMsgCopyService::~nsMsgCopyService() { + PRInt32 i; nsCopyRequest* copyRequest; diff --git a/mailnews/base/src/nsMsgCopyService.h b/mailnews/base/src/nsMsgCopyService.h index a44313f45c1c..9297751cb4fd 100644 --- a/mailnews/base/src/nsMsgCopyService.h +++ b/mailnews/base/src/nsMsgCopyService.h @@ -21,6 +21,91 @@ #include "nscore.h" #include "nsIMsgCopyService.h" +#include "nsCOMPtr.h" +#include "nsIMsgFolder.h" +#include "nsIMessage.h" + +typedef enum _nsCopyRequestType +{ + nsCopyMessagesType = 0x0, + nsCopyFileMessageType = 0x1 +} nsCopyRequestType; + +class nsCopyRequest; + +class nsCopySource +{ +public: + nsCopySource(); + nsCopySource(nsIMsgFolder* srcFolder); + ~nsCopySource(); + void AddMessage(nsIMessage* aMsg); + + nsCOMPtr m_msgFolder; + nsCOMPtr m_messageArray; + PRBool m_processed; +}; + +class nsCopyRequest +{ +public: + nsCopyRequest(); + ~nsCopyRequest(); + + nsresult Init(nsCopyRequestType type, nsISupports* aSupport, + nsIMsgFolder* dstFolder, + PRBool bVal, nsIMsgCopyServiceListener* listener, + nsITransactionManager* txnMgr); + nsCopySource* AddNewCopySource(nsIMsgFolder* srcFolder); + + nsCOMPtr m_srcSupport; // ui source folder or file spec + nsCOMPtr m_dstFolder; + nsCOMPtr m_txnMgr; + nsCOMPtr m_listener; + nsCopyRequestType m_requestType; + PRBool m_isMoveOrDraftOrTemplate; + PRBool m_processed; + nsVoidArray m_copySourceArray; // array of nsCopySource +}; + +class nsMsgCopyService : public nsIMsgCopyService +{ +public: + nsMsgCopyService(); + virtual ~nsMsgCopyService(); + + NS_DECL_ISUPPORTS + + // nsIMsgCopyService interface + NS_IMETHOD CopyMessages(nsIMsgFolder* srcFolder, /* UI src foler */ + nsISupportsArray* messages, + nsIMsgFolder* dstFolder, + PRBool isMove, + nsIMsgCopyServiceListener* listener, + nsITransactionManager* txnMgr); + + NS_IMETHOD CopyFileMessage(nsIFileSpec* fileSpec, + nsIMsgFolder* dstFolder, + nsIMessage* msgToReplace, + PRBool isDraftOrTemplate, + nsIMsgCopyServiceListener* listener, + nsITransactionManager* txnMgr); + + NS_IMETHOD NotifyCompletion(nsISupports* aSupport, /* store src folder */ + nsIMsgFolder* dstFolder, + nsresult result); + + +private: + + nsresult ClearRequest(nsCopyRequest* aRequest, nsresult rv); + nsresult DoCopy(nsCopyRequest* aRequest); + nsresult DoNextCopy(); + nsCopyRequest* FindRequest(nsISupports* aSupport, nsIMsgFolder* dstFolder); + + nsVoidArray m_copyRequests; +}; + NS_BEGIN_EXTERN_C diff --git a/mailnews/base/src/nsMsgFolderDataSource.cpp b/mailnews/base/src/nsMsgFolderDataSource.cpp index 1c98f675b864..13f6e91d280f 100644 --- a/mailnews/base/src/nsMsgFolderDataSource.cpp +++ b/mailnews/base/src/nsMsgFolderDataSource.cpp @@ -1267,23 +1267,4 @@ nsresult nsMsgFolderDataSource::GetFolderSortOrder(nsIMsgFolder *folder, PRInt32 } -nsresult -NS_NewMsgFolderDataSource(const nsIID& iid, void **result) -{ - NS_PRECONDITION(result != nsnull, "null ptr"); - if (! result) - return NS_ERROR_NULL_POINTER; - nsMsgFolderDataSource* datasource = new nsMsgFolderDataSource(); - if (! datasource) - return NS_ERROR_OUT_OF_MEMORY; - - nsresult rv; - rv = datasource->Init(); - if (NS_FAILED(rv)) { - delete datasource; - return rv; - } - - return datasource->QueryInterface(iid, result); -} diff --git a/mailnews/base/src/nsMsgFolderDataSource.h b/mailnews/base/src/nsMsgFolderDataSource.h index aab0740aa929..07dfc07df416 100644 --- a/mailnews/base/src/nsMsgFolderDataSource.h +++ b/mailnews/base/src/nsMsgFolderDataSource.h @@ -182,5 +182,4 @@ protected: }; -PR_EXTERN(nsresult) -NS_NewMsgFolderDataSource(const nsIID& iid, void **result); + diff --git a/mailnews/base/src/nsMsgMailSession.cpp b/mailnews/base/src/nsMsgMailSession.cpp index 2729a2397d69..d1835cd64c5c 100644 --- a/mailnews/base/src/nsMsgMailSession.cpp +++ b/mailnews/base/src/nsMsgMailSession.cpp @@ -297,20 +297,5 @@ NS_IMETHODIMP nsMsgMailSession::NotifyFolderLoaded(nsIFolder *folder) } -nsresult -NS_NewMsgMailSession(const nsIID& iid, void **result) -{ - if (!result) return NS_ERROR_NULL_POINTER; - - nsMsgMailSession *mailSession = new nsMsgMailSession; - if (!mailSession) return NS_ERROR_OUT_OF_MEMORY; - - nsresult rv = mailSession->Init(); - if(NS_FAILED(rv)) - { - delete mailSession; - return rv; - } - return mailSession->QueryInterface(iid, result); -} + diff --git a/mailnews/base/src/nsMsgMailSession.h b/mailnews/base/src/nsMsgMailSession.h index 90e5a30cd9e7..06d54fed5308 100644 --- a/mailnews/base/src/nsMsgMailSession.h +++ b/mailnews/base/src/nsMsgMailSession.h @@ -57,11 +57,5 @@ protected: }; -NS_BEGIN_EXTERN_C - -nsresult -NS_NewMsgMailSession(const nsIID& iid, void **result); - -NS_END_EXTERN_C #endif /* nsMsgMailSession_h__ */ diff --git a/mailnews/base/src/nsMsgMessageDataSource.cpp b/mailnews/base/src/nsMsgMessageDataSource.cpp index f04112df66b0..9fd95c237492 100644 --- a/mailnews/base/src/nsMsgMessageDataSource.cpp +++ b/mailnews/base/src/nsMsgMessageDataSource.cpp @@ -1182,25 +1182,6 @@ nsresult nsMsgMessageDataSource::GetMessagesAndFirstFolder(nsISupportsArray *mes } -nsresult -NS_NewMsgMessageDataSource(const nsIID& iid, void **result) -{ - NS_PRECONDITION(result != nsnull, "null ptr"); - if (! result) - return NS_ERROR_NULL_POINTER; - - nsMsgMessageDataSource* datasource = new nsMsgMessageDataSource(); - if (! datasource) - return NS_ERROR_OUT_OF_MEMORY; - - nsresult rv; - rv = datasource->Init(); - if (NS_FAILED(rv)) { - delete datasource; - return rv; - } - - return datasource->QueryInterface(iid, result); -} + diff --git a/mailnews/base/src/nsMsgMessageDataSource.h b/mailnews/base/src/nsMsgMessageDataSource.h index a74a248be117..690e3a02262a 100644 --- a/mailnews/base/src/nsMsgMessageDataSource.h +++ b/mailnews/base/src/nsMsgMessageDataSource.h @@ -204,5 +204,4 @@ protected: }; -PR_EXTERN(nsresult) -NS_NewMsgMessageDataSource(const nsIID& iid, void **result); + diff --git a/mailnews/base/src/nsMsgNotificationManager.cpp b/mailnews/base/src/nsMsgNotificationManager.cpp index f8c6755ca911..e432100f6efd 100644 --- a/mailnews/base/src/nsMsgNotificationManager.cpp +++ b/mailnews/base/src/nsMsgNotificationManager.cpp @@ -53,24 +53,7 @@ nsIRDFResource* nsMsgNotificationManager::kNC_NewMessages = nsnull; #define NC_RDF_NEWMESSAGES "http://home.netscape.com/NC-rdf#MsgNewMessages" -NS_BEGIN_EXTERN_C -nsresult -NS_NewMsgNotificationManager(const nsIID& iid, void **result) -{ - nsresult rv; - nsMsgNotificationManager *notificationManager = new nsMsgNotificationManager(); - if(!notificationManager) - return NS_ERROR_OUT_OF_MEMORY; - - rv = notificationManager->Init(); - - if(!NS_SUCCEEDED(rv)) - return rv; - return notificationManager->QueryInterface(iid, result); -} - -NS_END_EXTERN_C nsMsgNotificationManager::nsMsgNotificationManager() { diff --git a/mailnews/base/src/nsMsgNotificationManager.h b/mailnews/base/src/nsMsgNotificationManager.h index 985e2c378ada..4631a5c0aa79 100644 --- a/mailnews/base/src/nsMsgNotificationManager.h +++ b/mailnews/base/src/nsMsgNotificationManager.h @@ -57,11 +57,6 @@ protected: }; -NS_BEGIN_EXTERN_C -nsresult -NS_NewMsgNotificationManager(const nsIID& iid, void **result); - -NS_END_EXTERN_C #endif diff --git a/mailnews/base/src/nsMsgStatusFeedback.cpp b/mailnews/base/src/nsMsgStatusFeedback.cpp index de736410df9a..224a5870ac30 100644 --- a/mailnews/base/src/nsMsgStatusFeedback.cpp +++ b/mailnews/base/src/nsMsgStatusFeedback.cpp @@ -25,18 +25,7 @@ #include "nsIDOMElement.h" #include "nsIDOMXULDocument.h" -NS_BEGIN_EXTERN_C -nsresult -NS_NewMsgStatusFeedback(const nsIID& iid, void **result) -{ - nsMsgStatusFeedback *statusFeedback = new nsMsgStatusFeedback(); - if(!statusFeedback) - return NS_ERROR_OUT_OF_MEMORY; - return statusFeedback->QueryInterface(iid, result); -} - -NS_END_EXTERN_C nsMsgStatusFeedback::nsMsgStatusFeedback() { diff --git a/mailnews/base/src/nsMsgStatusFeedback.h b/mailnews/base/src/nsMsgStatusFeedback.h index 8842c7f8bd75..7ede2f3fc33e 100644 --- a/mailnews/base/src/nsMsgStatusFeedback.h +++ b/mailnews/base/src/nsMsgStatusFeedback.h @@ -57,12 +57,7 @@ protected: }; -NS_BEGIN_EXTERN_C -nsresult -NS_NewMsgStatusFeedback(const nsIID& iid, void **result); - -NS_END_EXTERN_C #endif // _nsMsgStatusFeedback_h