/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * The contents of this file are subject to the Netscape Public License * Version 1.0 (the "NPL"); you may not use this file except in * compliance with the NPL. You may obtain a copy of the NPL at * http://www.mozilla.org/NPL/ * * Software distributed under the NPL is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL * for the specific language governing rights and limitations under the * NPL. * * The Initial Developer of this code under the NPL is Netscape * Communications Corporation. Portions created by Netscape are * Copyright (C) 1998 Netscape Communications Corporation. All Rights * Reserved. */ #ifndef nsIServiceManager_h___ #define nsIServiceManager_h___ #include "nsRepository.h" class nsIShutdownListener; /** * The nsIServiceManager manager interface provides a means to obtain * global services in an application. The service manager depends on the * repository to find and instantiate factories to obtain services. * * Users of the service manager must first obtain a pointer to the global * service manager by calling NS_GetGlobalServiceManager. After that, * they can request specific services by calling GetService. When they are * finished with a service the release it by calling ReleaseService (instead * of releasing the service object directly): * * nsICacheManager* cm; * nsServiceManager::GetService(kCacheManagerCID, kICacheManagerIID, (nsISupports**)&cm); * * ... use cm, and then sometime later ... * * nsServiceManager::ReleaseService(kCacheManagerCID, cm); * * A user of a service may keep references to particular services indefinitely * and only must call ReleaseService when it shuts down. However if the user * wishes to voluntarily cooperate with the shutdown of the service it is * using, it may supply an nsIShutdownListener to provide for asynchronous * release of the services it is using. The shutdown listener's OnShutdown * method will be called for a service that is being shut down, and it is * its responsiblity to release references obtained from that service if at * all possible. * * The process of shutting down a particular service is initiated by calling * the service manager's ShutdownService method. This will iterate through * all the registered shutdown listeners for the service being shut down, and * then will attempt to unload the library associated with the service if * possible. The status result of ShutdownService indicates whether the * service was successfully shut down, failed, or was not in service. * * XXX QUESTIONS: * - Should a "service" be more than nsISupports? Should it be a factory * and/or have Startup(), Shutdown(), etc. * - If the asynchronous OnShutdown operation gets called, does the user * of a service still need to call ReleaseService? (Or should they _not_ * call it?) */ class nsIServiceManager : public nsISupports { public: NS_IMETHOD GetService(const nsCID& aClass, const nsIID& aIID, nsISupports* *result, nsIShutdownListener* shutdownListener = NULL) = 0; NS_IMETHOD ReleaseService(const nsCID& aClass, nsISupports* service, nsIShutdownListener* shutdownListener = NULL) = 0; /** * Requests a service to be shut down, possibly unloading its DLL. * * @returns NS_OK - if shutdown was successful and service was unloaded, * @returns NS_ERROR_SERVICE_NOT_FOUND - if shutdown failed because * the service was not currently loaded * @returns NS_ERROR_SERVICE_IN_USE - if shutdown failed because some * user of the service wouldn't voluntarily release it by using * a shutdown listener. */ NS_IMETHOD ShutdownService(const nsCID& aClass) = 0; }; #define NS_ISERVICEMANAGER_IID \ { /* cf0df3b0-3401-11d2-8163-006008119d7a */ \ 0xcf0df3b0, \ 0x3401, \ 0x11d2, \ {0x81, 0x63, 0x00, 0x60, 0x08, 0x11, 0x9d, 0x7a} \ } #define NS_ERROR_SERVICE_NOT_FOUND NS_ERROR_GENERATE_SUCCESS(NS_ERROR_MODULE_XPCOM, 22) #define NS_ERROR_SERVICE_IN_USE NS_ERROR_GENERATE_SUCCESS(NS_ERROR_MODULE_XPCOM, 23) //////////////////////////////////////////////////////////////////////////////// class nsIShutdownListener : public nsISupports { public: NS_IMETHOD OnShutdown(const nsCID& aClass, nsISupports* service) = 0; }; #define NS_ISHUTDOWNLISTENER_IID \ { /* 56decae0-3406-11d2-8163-006008119d7a */ \ 0x56decae0, \ 0x3406, \ 0x11d2, \ {0x81, 0x63, 0x00, 0x60, 0x08, 0x11, 0x9d, 0x7a} \ } //////////////////////////////////////////////////////////////////////////////// // Interface to Global Services class NS_COM nsServiceManager { public: static nsresult GetService(const nsCID& aClass, const nsIID& aIID, nsISupports* *result, nsIShutdownListener* shutdownListener = NULL); static nsresult ReleaseService(const nsCID& aClass, nsISupports* service, nsIShutdownListener* shutdownListener = NULL); static nsresult ShutdownService(const nsCID& aClass); // Since the global Service Manager is truly global, there's no need to // release it. static nsresult GetGlobalServiceManager(nsIServiceManager* *result); protected: static nsIServiceManager* globalServiceManager; }; //////////////////////////////////////////////////////////////////////////////// #endif /* nsIServiceManager_h___ */