VirtualBox

source: vbox/trunk/include/VBox/com/defs.h@ 2734

Last change on this file since 2734 was 612, checked in by vboxsync, 18 years ago

iprt/types.h first (see comment)

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 10.7 KB
Line 
1/** @file
2 *
3 * MS COM / XPCOM Abstraction Layer:
4 * Common definitions
5 */
6
7/*
8 * Copyright (C) 2006 InnoTek Systemberatung GmbH
9 *
10 * This file is part of VirtualBox Open Source Edition (OSE), as
11 * available from http://www.virtualbox.org. This file is free software;
12 * you can redistribute it and/or modify it under the terms of the GNU
13 * General Public License as published by the Free Software Foundation,
14 * in version 2 as it comes in the "COPYING" file of the VirtualBox OSE
15 * distribution. VirtualBox OSE is distributed in the hope that it will
16 * be useful, but WITHOUT ANY WARRANTY of any kind.
17 *
18 * If you received this file as part of a commercial VirtualBox
19 * distribution, then only the terms of your commercial VirtualBox
20 * license agreement apply instead of the previous paragraph.
21 */
22
23#ifndef __VBox_com_defs_h__
24#define __VBox_com_defs_h__
25
26/*
27 * Include iprt/types.h now to make sure iprt get to stdint.h first,
28 * otherwise a system/xpcom header might beat us and we'll be without
29 * the macros that are optional in C++.
30 */
31#include <iprt/types.h>
32
33#if defined (__WIN__)
34
35// Windows COM
36/////////////////////////////////////////////////////////////////////////////
37
38#include <objbase.h>
39#ifndef VBOX_COM_NO_ATL
40#include <atlbase.h>
41#endif
42
43#define NS_DECL_ISUPPORTS
44#define NS_IMPL_ISUPPORTS1_CI(a, b)
45
46// these are XPCOM only, one for every interface implemented
47#define NS_DECL_ISUPPORTS
48#define NS_DECL_IVIRTUALBOX
49#define NS_DECL_IMACHINECOLLECTION
50#define NS_DECL_IMACHINE
51
52// input pointer argument to method
53#define INPTR
54
55// makes the name of the getter interface function (n must be capitalized)
56#define COMGETTER(n) get_##n
57// makes the name of the setter interface function (n must be capitalized)
58#define COMSETTER(n) put_##n
59
60// a type for an input GUID parameter in the interface method declaration
61#define GUIDPARAM GUID
62// a type for an output GUID parameter in the interface method declaration
63#define GUIDPARAMOUT GUID*
64
65/**
66 * Returns the const reference to the IID (i.e., |const GUID &|) of the given
67 * interface.
68 *
69 * @param i interface class
70 */
71#define COM_IIDOF(I) _ATL_IIDOF (I)
72
73#else // !defined (__WIN__)
74
75// XPCOM
76/////////////////////////////////////////////////////////////////////////////
77
78#include <nsID.h>
79
80#define ATL_NO_VTABLE
81#define DECLARE_CLASSFACTORY(a)
82#define DECLARE_CLASSFACTORY_SINGLETON(a)
83#define DECLARE_REGISTRY_RESOURCEID(a)
84#define DECLARE_NOT_AGGREGATABLE(a)
85#define DECLARE_PROTECT_FINAL_CONSTRUCT(a)
86#define BEGIN_COM_MAP(a)
87#define COM_INTERFACE_ENTRY(a)
88#define COM_INTERFACE_ENTRY2(a,b)
89#define END_COM_MAP(a)
90
91#define HRESULT nsresult
92#define SUCCEEDED NS_SUCCEEDED
93#define FAILED NS_FAILED
94#define NS_NULL nsnull
95
96#define IUnknown nsISupports
97
98#define BOOL PRBool
99#define BYTE PRUint8
100#define SHORT PRInt16
101#define USHORT PRUint16
102#define LONG PRInt32
103#define ULONG PRUint32
104#define LONG64 PRInt64
105#define ULONG64 PRUint64
106
107#define BSTR PRUnichar *
108#define LPBSTR BSTR *
109#define OLECHAR wchar_t
110
111#define FALSE PR_FALSE
112#define TRUE PR_TRUE
113
114// makes the name of the getter interface function (n must be capitalized)
115#define COMGETTER(n) Get##n
116// makes the name of the setter interface function (n must be capitalized)
117#define COMSETTER(n) Set##n
118
119// a type to define a raw GUID variable (better to use the Guid class)
120#define GUID nsID
121// a type for an input GUID parameter in the interface method declaration
122#define GUIDPARAM nsID &
123// a type for an output GUID parameter in the interface method declaration
124#define GUIDPARAMOUT nsID **
125
126// CLSID and IID for compatibility with Win32
127typedef nsCID CLSID;
128typedef nsIID IID;
129
130// OLE error codes
131#define S_OK NS_OK
132#define E_UNEXPECTED NS_ERROR_UNEXPECTED
133#define E_NOTIMPL NS_ERROR_NOT_IMPLEMENTED
134#define E_OUTOFMEMORY NS_ERROR_OUT_OF_MEMORY
135#define E_INVALIDARG NS_ERROR_INVALID_ARG
136#define E_NOINTERFACE NS_ERROR_NO_INTERFACE
137#define E_POINTER NS_ERROR_NULL_POINTER
138#define E_ABORT NS_ERROR_ABORT
139#define E_FAIL NS_ERROR_FAILURE
140#define E_ACCESSDENIED ((nsresult) 0x80070005L)
141
142#define STDMETHOD(a) NS_IMETHOD a
143#define STDMETHODIMP NS_IMETHODIMP
144
145#define COM_IIDOF(I) NS_GET_IID (I)
146
147// two very simple ATL emulator classes to provide
148// FinalConstruct()/FinalRelease() functionality on Linux
149
150class CComObjectRootEx
151{
152public:
153 HRESULT FinalConstruct() { return S_OK; }
154 void FinalRelease() {}
155};
156
157template <class Base> class CComObject : public Base
158{
159public:
160 virtual ~CComObject() { this->FinalRelease(); }
161};
162
163// input pointer argument to method
164#define INPTR const
165
166// helper functions
167extern "C"
168{
169BSTR SysAllocString (const OLECHAR* sz);
170BSTR SysAllocStringByteLen (char *psz, unsigned int len);
171BSTR SysAllocStringLen (const OLECHAR *pch, unsigned int cch);
172void SysFreeString (BSTR bstr);
173int SysReAllocString (BSTR *pbstr, const OLECHAR *psz);
174int SysReAllocStringLen (BSTR *pbstr, const OLECHAR *psz, unsigned int cch);
175unsigned int SysStringByteLen (BSTR bstr);
176unsigned int SysStringLen (BSTR bstr);
177}
178
179/**
180 * 'Constructor' for the component class.
181 * This constructor, as opposed to NS_GENERIC_FACTORY_CONSTRUCTOR,
182 * assumes that the component class is derived from the CComObjectRootEx<>
183 * template, so it calls FinalConstruct() right after object creation
184 * and ensures that FinalRelease() will be called right before destruction.
185 * The result from FinalConstruct() is returned to the caller.
186 */
187#define NS_GENERIC_FACTORY_CONSTRUCTOR_WITH_RC(_InstanceClass) \
188static NS_IMETHODIMP \
189_InstanceClass##Constructor(nsISupports *aOuter, REFNSIID aIID, \
190 void **aResult) \
191{ \
192 nsresult rv; \
193 \
194 *aResult = NULL; \
195 if (NULL != aOuter) { \
196 rv = NS_ERROR_NO_AGGREGATION; \
197 return rv; \
198 } \
199 \
200 CComObject <_InstanceClass> *inst = new CComObject <_InstanceClass>(); \
201 if (NULL == inst) { \
202 rv = NS_ERROR_OUT_OF_MEMORY; \
203 return rv; \
204 } \
205 \
206 NS_ADDREF(inst); /* protect FinalConstruct() */ \
207 rv = inst->FinalConstruct(); \
208 if (NS_SUCCEEDED(rv)) \
209 rv = inst->QueryInterface(aIID, aResult); \
210 NS_RELEASE(inst); \
211 \
212 return rv; \
213}
214
215/**
216 * 'Constructor' that uses an existing getter function that gets a singleton.
217 * The getter function must have the following prototype:
218 * nsresult _GetterProc (_InstanceClass **inst)
219 * This constructor, as opposed to NS_GENERIC_FACTORY_SINGLETON_CONSTRUCTOR,
220 * lets the getter function return a result code that is passed back to the
221 * caller that tries to instantiate the object.
222 * NOTE: assumes that getter does an AddRef - so additional AddRef is not done.
223 */
224#define NS_GENERIC_FACTORY_SINGLETON_CONSTRUCTOR_WITH_RC(_InstanceClass, _GetterProc) \
225static NS_IMETHODIMP \
226_InstanceClass##Constructor(nsISupports *aOuter, REFNSIID aIID, \
227 void **aResult) \
228{ \
229 nsresult rv; \
230 \
231 _InstanceClass * inst; \
232 \
233 *aResult = NULL; \
234 if (NULL != aOuter) { \
235 rv = NS_ERROR_NO_AGGREGATION; \
236 return rv; \
237 } \
238 \
239 rv = _GetterProc(&inst); \
240 if (NS_FAILED(rv)) \
241 return rv; \
242 \
243 /* sanity check */ \
244 if (NULL == inst) \
245 return NS_ERROR_OUT_OF_MEMORY; \
246 \
247 /* NS_ADDREF(inst); */ \
248 if (NS_SUCCEEDED(rv)) { \
249 rv = inst->QueryInterface(aIID, aResult); \
250 } \
251 NS_RELEASE(inst); \
252 \
253 return rv; \
254}
255
256#endif // !defined (__WIN__)
257
258/**
259 * Declares a whar_t string literal from the argument.
260 * Necessary to overcome MSC / GCC differences.
261 * @param s expression to stringify
262 */
263#if defined (_MSC_VER)
264# define WSTR_LITERAL(s) L#s
265#elif defined (__GNUC__)
266# define WSTR_LITERAL(s) L""#s
267#else
268# error "Unsupported compiler!"
269#endif
270
271#endif // __VBox_com_defs_h__
272
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