VirtualBox

source: vbox/trunk/src/libs/xpcom18a4/xpcom/proxy/public/nsProxiedService.h@ 3337

Last change on this file since 3337 was 1, checked in by vboxsync, 55 years ago

import

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 6.3 KB
Line 
1/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2/* ***** BEGIN LICENSE BLOCK *****
3 * Version: MPL 1.1/GPL 2.0/LGPL 2.1
4 *
5 * The contents of this file are subject to the Mozilla Public License Version
6 * 1.1 (the "License"); you may not use this file except in compliance with
7 * the License. You may obtain a copy of the License at
8 * http://www.mozilla.org/MPL/
9 *
10 * Software distributed under the License is distributed on an "AS IS" basis,
11 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
12 * for the specific language governing rights and limitations under the
13 * License.
14 *
15 * The Original Code is mozilla.org code.
16 *
17 * The Initial Developer of the Original Code is
18 * Netscape Communications Corporation.
19 * Portions created by the Initial Developer are Copyright (C) 1998
20 * the Initial Developer. All Rights Reserved.
21 *
22 * Contributor(s):
23 * Pierre Phaneuf <[email protected]>
24 *
25 * Alternatively, the contents of this file may be used under the terms of
26 * either of the GNU General Public License Version 2 or later (the "GPL"),
27 * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
28 * in which case the provisions of the GPL or the LGPL are applicable instead
29 * of those above. If you wish to allow use of your version of this file only
30 * under the terms of either the GPL or the LGPL, and not to allow others to
31 * use your version of this file under the terms of the MPL, indicate your
32 * decision by deleting the provisions above and replace them with the notice
33 * and other provisions required by the GPL or the LGPL. If you do not delete
34 * the provisions above, a recipient may use your version of this file under
35 * the terms of any one of the MPL, the GPL or the LGPL.
36 *
37 * ***** END LICENSE BLOCK ***** */
38
39#ifndef __nsProxiedServiceManager_h_
40#define __nsProxiedServiceManager_h_
41
42#include "nsIServiceManager.h"
43#include "nsIProxyObjectManager.h"
44
45////////////////////////////////////////////////////////////////////////////////
46// NS_WITH_PROXIED_SERVICE: macro to make using services that need to be proxied
47// before using them easier.
48// Now you can replace this:
49// {
50// nsresult rv;
51// nsCOMPtr<nsIMyService> pIMyService =
52// do_GetService(kMyServiceCID, &rv);
53// if(NS_FAILED(rv))
54// return;
55// nsCOMPtr<nsIProxyObjectManager> pIProxyObjectManager =
56// do_GetService(kProxyObjectManagerCID, &rv);
57// if(NS_FAILED(rv))
58// return;
59// nsIMyService pIProxiedObject = NULL;
60// rv = pIProxyObjectManager->GetProxyForObject(pIProxyQueue,
61// NS_GET_IID(nsIMyService),
62// pIMyService, PROXY_SYNC,
63// (void**)&pIProxiedObject);
64// pIProxiedObject->DoIt(...); // Executed on same thread as pIProxyQueue
65// ...
66// pIProxiedObject->Release(); // Must be done as not managed for you.
67// }
68// with this:
69// {
70// nsresult rv;
71// NS_WITH_PROXIED_SERVICE(nsIMyService, pIMyService, kMyServiceCID,
72// pIProxyQueue, &rv);
73// if(NS_FAILED(rv))
74// return;
75// pIMyService->DoIt(...); // Executed on the same thread as pIProxyQueue
76// }
77// and the automatic destructor will take care of releasing the service and
78// the proxied object for you.
79//
80// Note that this macro requires you to link with the xpcom DLL to pick up the
81// static member functions from nsServiceManager.
82
83#define NS_WITH_PROXIED_SERVICE(T, var, cid, Q, rvAddr) \
84 nsProxiedService _serv##var(cid, NS_GET_IID(T), Q, PR_FALSE, rvAddr); \
85 T* var = (T*)(nsISupports*)_serv##var;
86
87#define NS_WITH_ALWAYS_PROXIED_SERVICE(T, var, cid, Q, rvAddr) \
88 nsProxiedService _serv##var(cid, NS_GET_IID(T), Q, PR_TRUE, rvAddr); \
89 T* var = (T*)(nsISupports*)_serv##var;
90
91////////////////////////////////////////////////////////////////////////////////
92// nsProxiedService
93////////////////////////////////////////////////////////////////////////////////
94
95class nsProxiedService
96{
97 public:
98
99 nsProxiedService(const nsCID &aClass, const nsIID &aIID,
100 nsIEventQueue* pIProxyQueue, PRBool always, nsresult*rv)
101 {
102 *rv = nsServiceManager::GetService(aClass,
103 aIID,
104 getter_AddRefs(mService));
105 if (NS_FAILED(*rv)) return;
106 InitProxy(aIID, pIProxyQueue, always, rv);
107 }
108
109 nsProxiedService(const char* aContractID, const nsIID &aIID,
110 nsIEventQueue* pIProxyQueue, PRBool always, nsresult*rv)
111 {
112 *rv = nsServiceManager::GetService(aContractID,
113 aIID,
114 getter_AddRefs(mService));
115 if (NS_FAILED(*rv)) return;
116 InitProxy(aIID, pIProxyQueue, always, rv);
117 }
118
119 void InitProxy(const nsIID &aIID, nsIEventQueue* pIProxyQueue,
120 PRBool always, nsresult*rv)
121 {
122 static NS_DEFINE_CID(kProxyObjectManagerCID, NS_PROXYEVENT_MANAGER_CID);
123
124 nsCOMPtr<nsIProxyObjectManager> pIProxyObjectManager =
125 do_GetService(kProxyObjectManagerCID, rv);
126 if (NS_FAILED(*rv)) return;
127
128 PRInt32 proxyType = PROXY_SYNC;
129 if (always) proxyType |= PROXY_ALWAYS;
130 *rv = pIProxyObjectManager->GetProxyForObject(pIProxyQueue,
131 aIID,
132 mService,
133 proxyType,
134 getter_AddRefs(mProxiedService));
135 }
136
137 ~nsProxiedService()
138 {
139 }
140
141 nsISupports* operator->() const
142 {
143 NS_PRECONDITION(mProxiedService != 0, "Your code should test the error result from the constructor.");
144 return mProxiedService;
145 }
146
147 PRBool operator==(const nsISupports* other)
148 {
149 return ((mProxiedService == other) || (mService == other));
150 }
151
152 operator nsISupports*() const
153 {
154 return mProxiedService;
155 }
156
157 protected:
158 nsCOMPtr<nsISupports> mProxiedService;
159 nsCOMPtr<nsISupports> mService;
160
161 };
162
163
164#endif //__nsProxiedServiceManager_h_
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette