1999-06-29 03:41:02 +04:00
|
|
|
/* -*- Mode: C++; tab-width: 3; indent-tabs-mode: nil; c-basic-offset: 3 -*-
|
|
|
|
*
|
|
|
|
* 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 __nsProxiedServiceManager_h_
|
|
|
|
#define __nsProxiedServiceManager_h_
|
|
|
|
|
|
|
|
#include "nsIServiceManager.h"
|
|
|
|
#include "nsProxyObjectManager.h"
|
|
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
// NS_WITH_PROXIED_SERVICE: macro to make using services that need to be proxied
|
1999-10-13 02:29:43 +04:00
|
|
|
// before using them easier.
|
1999-06-29 03:41:02 +04:00
|
|
|
// Now you can replace this:
|
|
|
|
// {
|
1999-10-13 02:29:43 +04:00
|
|
|
// nsresult rv;
|
|
|
|
// NS_WITH_SERVICE(nsIMyService, pIMyService, kMyServiceCID, &rv);
|
|
|
|
// if(NS_FAILED(rv))
|
|
|
|
// return;
|
|
|
|
// NS_WITH_SERVICE(nsIProxyObjectManager, pIProxyObjectManager, kProxyObjectManagerCID, &rv);
|
|
|
|
// if(NS_FAILED(rv))
|
|
|
|
// return;
|
|
|
|
// nsIMyService pIProxiedObject = NULL;
|
|
|
|
// rv = pIProxyObjectManager->GetProxyObject(pIProxyQueue,
|
|
|
|
// nsIMyService::GetIID(),
|
|
|
|
// pIMyService, PROXY_SYNC,
|
|
|
|
// (void**)&pIProxiedObject);
|
|
|
|
// pIProxiedObject->DoIt(...); // Executed on same thread as pIProxyQueue
|
|
|
|
// ...
|
|
|
|
// pIProxiedObject->Release(); // Must be done as not managed for you.
|
|
|
|
// }
|
|
|
|
// with this:
|
|
|
|
// {
|
|
|
|
// nsresult rv;
|
|
|
|
// NS_WITH_PROXIED_SERVICE(nsIMyService, pIMyService, kMyServiceCID,
|
|
|
|
// pIProxyQueue, &rv);
|
|
|
|
// if(NS_FAILED(rv))
|
|
|
|
// return;
|
|
|
|
// pIMyService->DoIt(...); // Executed on the same thread as pIProxyQueue
|
|
|
|
// }
|
1999-06-29 03:41:02 +04:00
|
|
|
// and the automatic destructor will take care of releasing the service and
|
|
|
|
// the proxied object for you.
|
|
|
|
//
|
|
|
|
// Note that this macro requires you to link with the xpcom DLL to pick up the
|
|
|
|
// static member functions from nsServiceManager.
|
|
|
|
|
1999-10-13 02:29:43 +04:00
|
|
|
#define NS_WITH_PROXIED_SERVICE(T, var, cid, Q, rvAddr) \
|
|
|
|
nsProxiedService _serv##var(cid, T::GetIID(), Q, rvAddr); \
|
|
|
|
T* var = (T*)(nsISupports*)_serv##var;
|
1999-06-29 03:41:02 +04:00
|
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
// nsProxiedService
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
class nsProxiedService : public nsService
|
|
|
|
{
|
|
|
|
protected:
|
1999-10-13 02:29:43 +04:00
|
|
|
nsISupports* mProxiedService;
|
1999-06-29 03:41:02 +04:00
|
|
|
public:
|
|
|
|
nsProxiedService(const nsCID &aClass, const nsIID &aIID,
|
1999-10-13 02:29:43 +04:00
|
|
|
nsIEventQueue* pIProxyQueue, nsresult*rv): nsService(aClass, aIID, rv),
|
|
|
|
mProxiedService(nsnull)
|
|
|
|
{
|
|
|
|
static NS_DEFINE_IID(kProxyObjectManagerCID, NS_PROXYEVENT_MANAGER_CID);
|
1999-06-29 03:41:02 +04:00
|
|
|
|
1999-10-13 02:29:43 +04:00
|
|
|
if(NS_FAILED(*rv))
|
|
|
|
return;
|
|
|
|
NS_WITH_SERVICE(nsIProxyObjectManager, pIProxyObjectManager,
|
|
|
|
kProxyObjectManagerCID, rv);
|
|
|
|
if(NS_FAILED(*rv))
|
|
|
|
{
|
|
|
|
nsServiceManager::ReleaseService(mCID, mService);
|
|
|
|
mService = nsnull;
|
|
|
|
return;
|
|
|
|
}
|
1999-06-29 03:41:02 +04:00
|
|
|
|
1999-10-13 02:29:43 +04:00
|
|
|
*rv = pIProxyObjectManager->GetProxyObject(pIProxyQueue,
|
|
|
|
aIID,
|
|
|
|
mService,
|
|
|
|
PROXY_SYNC,
|
|
|
|
(void**)&mProxiedService);
|
|
|
|
if(NS_FAILED(*rv))
|
|
|
|
{
|
|
|
|
nsServiceManager::ReleaseService(mCID, mService);
|
|
|
|
mService = nsnull;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
~nsProxiedService()
|
|
|
|
{
|
|
|
|
if(mProxiedService)
|
|
|
|
NS_RELEASE(mProxiedService);
|
|
|
|
// Base class will free mService
|
|
|
|
}
|
1999-06-29 03:41:02 +04:00
|
|
|
|
1999-10-13 02:29:43 +04:00
|
|
|
nsISupports* operator->() const
|
|
|
|
{
|
|
|
|
NS_PRECONDITION(mProxiedService != 0, "Your code should test the error result from the constructor.");
|
|
|
|
return mProxiedService;
|
|
|
|
}
|
1999-06-29 03:41:02 +04:00
|
|
|
|
1999-10-13 02:29:43 +04:00
|
|
|
PRBool operator==(const nsISupports* other)
|
|
|
|
{
|
|
|
|
return ((mProxiedService == other) || (mService == other));
|
|
|
|
}
|
1999-06-29 03:41:02 +04:00
|
|
|
|
1999-10-13 02:29:43 +04:00
|
|
|
operator nsISupports*() const
|
|
|
|
{
|
|
|
|
return mProxiedService;
|
|
|
|
}
|
1999-06-29 03:41:02 +04:00
|
|
|
};
|
|
|
|
|
|
|
|
|
1999-09-03 14:43:00 +04:00
|
|
|
#endif //__nsProxiedServiceManager_h_
|