VirtualBox

source: vbox/trunk/src/VBox/Main/cbinding/VBoxXPCOMC.cpp@ 28770

Last change on this file since 28770 was 21525, checked in by vboxsync, 15 years ago

cbinding: added support for VBox 3.0

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 6.7 KB
Line 
1/* $Id: VBoxXPCOMC.cpp 21525 2009-07-13 10:07:01Z vboxsync $ */
2/** @file VBoxXPCOMC.cpp
3 * Utility functions to use with the C binding for XPCOM.
4 */
5
6/*
7 * Copyright (C) 2009 Sun Microsystems, Inc.
8 *
9 * This file is part of VirtualBox Open Source Edition (OSE), as
10 * available from http://www.virtualbox.org. This file is free software;
11 * you can redistribute it and/or modify it under the terms of the GNU
12 * General Public License (GPL) as published by the Free Software
13 * Foundation, in version 2 as it comes in the "COPYING" file of the
14 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
15 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
16 *
17 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
18 * Clara, CA 95054 USA or visit http://www.sun.com if you need
19 * additional information or have any questions.
20 */
21
22#define LOG_GROUP LOG_GROUP_MAIN
23#include <nsMemory.h>
24#include <nsIServiceManager.h>
25#include <nsEventQueueUtils.h>
26
27#include <iprt/string.h>
28#include <iprt/env.h>
29#include <VBox/log.h>
30
31#include "VBoxCAPI_v3_1.h"
32#include "VBox/com/com.h"
33#include "VBox/version.h"
34
35using namespace std;
36
37static ISession *Session = NULL;
38static IVirtualBox *Ivirtualbox = NULL;
39static nsIComponentManager *manager = NULL;
40static nsIEventQueue *eventQ = NULL;
41
42static void VBoxComUninitialize(void);
43
44static int
45VBoxUtf16ToUtf8(const PRUnichar *pwszString, char **ppszString)
46{
47 return RTUtf16ToUtf8(pwszString, ppszString);
48}
49
50static int
51VBoxUtf8ToUtf16(const char *pszString, PRUnichar **ppwszString)
52{
53 return RTStrToUtf16(pszString, ppwszString);
54}
55
56static void
57VBoxUtf16Free(PRUnichar *pwszString)
58{
59 RTUtf16Free(pwszString);
60}
61
62static void
63VBoxUtf8Free(char *pszString)
64{
65 RTStrFree(pszString);
66}
67
68static void
69VBoxComUnallocMem(void *ptr)
70{
71 if (ptr)
72 {
73 nsMemory::Free(ptr);
74 }
75}
76
77static void
78VBoxComInitialize(const char *pszVirtualBoxIID, IVirtualBox **ppVirtualBox,
79 const char *pszSessionIID, ISession **ppSession)
80{
81 nsresult rc;
82 nsID virtualBoxIID;
83 nsID sessionIID;
84
85 *ppSession = NULL;
86 *ppVirtualBox = NULL;
87
88 /* convert the string representation of UUID to nsIID type */
89 if (!(virtualBoxIID.Parse(pszVirtualBoxIID) && sessionIID.Parse(pszSessionIID)))
90 return;
91
92 rc = com::Initialize();
93 if (NS_FAILED(rc))
94 {
95 Log(("Cbinding: XPCOM could not be initialized! rc=%Rhrc\n", rc));
96 VBoxComUninitialize();
97 return;
98 }
99
100 rc = NS_GetComponentManager (&manager);
101 if (NS_FAILED(rc))
102 {
103 Log(("Cbinding: Could not get component manager! rc=%Rhrc\n", rc));
104 VBoxComUninitialize();
105 return;
106 }
107
108 rc = NS_GetMainEventQ (&eventQ);
109 if (NS_FAILED(rc))
110 {
111 Log(("Cbinding: Could not get xpcom event queue! rc=%Rhrc\n", rc));
112 VBoxComUninitialize();
113 return;
114 }
115
116 rc = manager->CreateInstanceByContractID(NS_VIRTUALBOX_CONTRACTID,
117 nsnull,
118 virtualBoxIID,
119 (void **)ppVirtualBox);
120 if (NS_FAILED(rc))
121 {
122 Log(("Cbinding: Could not instantiate VirtualBox object! rc=%Rhrc\n",rc));
123 VBoxComUninitialize();
124 return;
125 }
126
127 Log(("Cbinding: IVirtualBox object created.\n"));
128
129 rc = manager->CreateInstanceByContractID (NS_SESSION_CONTRACTID,
130 nsnull,
131 sessionIID,
132 (void **)ppSession);
133 if (NS_FAILED(rc))
134 {
135 Log(("Cbinding: Could not instantiate Session object! rc=%Rhrc\n",rc));
136 VBoxComUninitialize();
137 return;
138 }
139
140 Log(("Cbinding: ISession object created.\n"));
141
142 /* Store ppSession & ppVirtualBox so that VBoxComUninitialize
143 * can later take care of them while cleanup
144 */
145 Session = *ppSession;
146 Ivirtualbox = *ppVirtualBox;
147
148}
149
150static void
151VBoxComInitializeV1(IVirtualBox **ppVirtualBox, ISession **ppSession)
152{
153 /* stub that always fails. */
154 *ppVirtualBox = NULL;
155 *ppSession = NULL;
156}
157
158static void
159VBoxComUninitialize(void)
160{
161 if (Session)
162 NS_RELEASE(Session); // decrement refcount
163 if (Ivirtualbox)
164 NS_RELEASE(Ivirtualbox); // decrement refcount
165 if (eventQ)
166 NS_RELEASE(eventQ); // decrement refcount
167 if (manager)
168 NS_RELEASE(manager); // decrement refcount
169 com::Shutdown();
170 Log(("Cbinding: Cleaned up the created IVirtualBox and ISession Objects.\n"));
171}
172
173static void
174VBoxGetEventQueue(nsIEventQueue **eventQueue)
175{
176 *eventQueue = eventQ;
177}
178
179static uint32_t
180VBoxVersion(void)
181{
182 uint32_t version = 0;
183
184 version = (VBOX_VERSION_MAJOR * 1000 * 1000) + (VBOX_VERSION_MINOR * 1000) + (VBOX_VERSION_BUILD);
185
186 return version;
187}
188
189VBOXXPCOMC_DECL(PCVBOXXPCOM)
190VBoxGetXPCOMCFunctions(unsigned uVersion)
191{
192 /*
193 * The current interface version.
194 */
195 static const VBOXXPCOMC s_Functions =
196 {
197 sizeof(VBOXXPCOMC),
198 VBOX_XPCOMC_VERSION,
199
200 VBoxVersion,
201
202 VBoxComInitialize,
203 VBoxComUninitialize,
204
205 VBoxComUnallocMem,
206 VBoxUtf16Free,
207 VBoxUtf8Free,
208
209 VBoxUtf16ToUtf8,
210 VBoxUtf8ToUtf16,
211
212 VBoxGetEventQueue,
213
214 VBOX_XPCOMC_VERSION
215 };
216
217 if ((uVersion & 0xffff0000U) == (VBOX_XPCOMC_VERSION & 0xffff0000U))
218 return &s_Functions;
219
220 /*
221 * Legacy interface version 1.0.
222 */
223 static const struct VBOXXPCOMCV1
224 {
225 /** The size of the structure. */
226 unsigned cb;
227 /** The structure version. */
228 unsigned uVersion;
229
230 unsigned int (*pfnGetVersion)(void);
231
232 void (*pfnComInitialize)(IVirtualBox **virtualBox, ISession **session);
233 void (*pfnComUninitialize)(void);
234
235 void (*pfnComUnallocMem)(void *pv);
236 void (*pfnUtf16Free)(PRUnichar *pwszString);
237 void (*pfnUtf8Free)(char *pszString);
238
239 int (*pfnUtf16ToUtf8)(const PRUnichar *pwszString, char **ppszString);
240 int (*pfnUtf8ToUtf16)(const char *pszString, PRUnichar **ppwszString);
241
242 /** Tail version, same as uVersion. */
243 unsigned uEndVersion;
244 } s_Functions_v1_0 =
245 {
246 sizeof(s_Functions_v1_0),
247 0x00010000U,
248
249 VBoxVersion,
250
251 VBoxComInitializeV1,
252 VBoxComUninitialize,
253
254 VBoxComUnallocMem,
255 VBoxUtf16Free,
256 VBoxUtf8Free,
257
258 VBoxUtf16ToUtf8,
259 VBoxUtf8ToUtf16,
260
261 0x00010000U
262 };
263
264 if ((uVersion & 0xffff0000U) == 0x00010000U)
265 return (PCVBOXXPCOM)&s_Functions_v1_0;
266
267 /*
268 * Unsupported interface version.
269 */
270 return NULL;
271}
272
273/* vim: set ts=4 sw=4 et: */
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