VirtualBox

source: vbox/trunk/src/VBox/Main/glue/com.cpp@ 25942

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

*: RTEnv usage cleanup - avoid RTEnvGet() as it doesn't necessarily return UTF-8 encoded strings.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 5.8 KB
Line 
1/* $Id: com.cpp 25942 2010-01-20 17:26:22Z vboxsync $ */
2
3/** @file
4 * MS COM / XPCOM Abstraction Layer
5 */
6
7/*
8 * Copyright (C) 2006-2007 Sun Microsystems, Inc.
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 (GPL) as published by the Free Software
14 * Foundation, in version 2 as it comes in the "COPYING" file of the
15 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
16 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
17 *
18 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
19 * Clara, CA 95054 USA or visit http://www.sun.com if you need
20 * additional information or have any questions.
21 */
22
23#if !defined (VBOX_WITH_XPCOM)
24
25#include <objbase.h>
26
27#else /* !defined (VBOX_WITH_XPCOM) */
28
29#include <stdlib.h>
30
31#include <nsCOMPtr.h>
32#include <nsIServiceManagerUtils.h>
33
34#include <nsIInterfaceInfo.h>
35#include <nsIInterfaceInfoManager.h>
36
37#endif /* !defined (VBOX_WITH_XPCOM) */
38
39#include "VBox/com/com.h"
40#include "VBox/com/assert.h"
41
42#include "VBox/com/Guid.h"
43#include "VBox/com/array.h"
44
45#include <iprt/param.h>
46#include <iprt/path.h>
47#include <iprt/dir.h>
48#include <iprt/env.h>
49#include <iprt/string.h>
50
51#include <VBox/err.h>
52
53#ifdef RT_OS_DARWIN
54#define VBOX_USER_HOME_SUFFIX "Library/VirtualBox"
55#else
56#define VBOX_USER_HOME_SUFFIX ".VirtualBox"
57#endif
58
59#include "Logging.h"
60
61namespace com
62{
63
64void GetInterfaceNameByIID (const GUID &aIID, BSTR *aName)
65{
66 Assert (aName);
67 if (!aName)
68 return;
69
70 *aName = NULL;
71
72#if !defined (VBOX_WITH_XPCOM)
73
74 LONG rc;
75 LPOLESTR iidStr = NULL;
76 if (StringFromIID (aIID, &iidStr) == S_OK)
77 {
78 HKEY ifaceKey;
79 rc = RegOpenKeyExW (HKEY_CLASSES_ROOT, L"Interface",
80 0, KEY_QUERY_VALUE, &ifaceKey);
81 if (rc == ERROR_SUCCESS)
82 {
83 HKEY iidKey;
84 rc = RegOpenKeyExW (ifaceKey, iidStr, 0, KEY_QUERY_VALUE, &iidKey);
85 if (rc == ERROR_SUCCESS)
86 {
87 /* determine the size and type */
88 DWORD sz, type;
89 rc = RegQueryValueExW (iidKey, NULL, NULL, &type, NULL, &sz);
90 if (rc == ERROR_SUCCESS && type == REG_SZ)
91 {
92 /* query the value to BSTR */
93 *aName = SysAllocStringLen (NULL, (sz + 1) /
94 sizeof (TCHAR) + 1);
95 rc = RegQueryValueExW (iidKey, NULL, NULL, NULL,
96 (LPBYTE) *aName, &sz);
97 if (rc != ERROR_SUCCESS)
98 {
99 SysFreeString (*aName);
100 aName = NULL;
101 }
102 }
103 RegCloseKey (iidKey);
104 }
105 RegCloseKey (ifaceKey);
106 }
107 CoTaskMemFree (iidStr);
108 }
109
110#else /* !defined (VBOX_WITH_XPCOM) */
111
112 nsresult rv;
113 nsCOMPtr <nsIInterfaceInfoManager> iim =
114 do_GetService (NS_INTERFACEINFOMANAGER_SERVICE_CONTRACTID, &rv);
115 if (NS_SUCCEEDED(rv))
116 {
117 nsCOMPtr <nsIInterfaceInfo> iinfo;
118 rv = iim->GetInfoForIID (&aIID, getter_AddRefs (iinfo));
119 if (NS_SUCCEEDED(rv))
120 {
121 const char *iname = NULL;
122 iinfo->GetNameShared (&iname);
123 char *utf8IName = NULL;
124 if (RT_SUCCESS(RTStrCurrentCPToUtf8 (&utf8IName, iname)))
125 {
126 PRTUTF16 utf16IName = NULL;
127 if (RT_SUCCESS(RTStrToUtf16 (utf8IName, &utf16IName)))
128 {
129 *aName = SysAllocString ((OLECHAR *) utf16IName);
130 RTUtf16Free (utf16IName);
131 }
132 RTStrFree (utf8IName);
133 }
134 }
135 }
136
137#endif /* !defined (VBOX_WITH_XPCOM) */
138}
139
140int GetVBoxUserHomeDirectory(char *aDir, size_t aDirLen)
141{
142 AssertReturn(aDir, VERR_INVALID_POINTER);
143 AssertReturn(aDirLen > 0, VERR_BUFFER_OVERFLOW);
144
145 /* start with null */
146 *aDir = 0;
147
148 const char *VBoxUserHome = RTEnvGet("VBOX_USER_HOME");
149
150 char path [RTPATH_MAX];
151 int vrc = VINF_SUCCESS;
152
153 if (VBoxUserHome)
154 {
155 /* get the full path name */
156 char *VBoxUserHomeUtf8 = NULL;
157 vrc = RTStrCurrentCPToUtf8(&VBoxUserHomeUtf8, VBoxUserHome);
158 if (RT_SUCCESS(vrc))
159 {
160 vrc = RTPathAbs(VBoxUserHomeUtf8, path, sizeof (path));
161 if (RT_SUCCESS(vrc))
162 {
163 if (aDirLen < strlen(path) + 1)
164 vrc = VERR_BUFFER_OVERFLOW;
165 else
166 strcpy(aDir, path);
167 }
168 RTStrFree(VBoxUserHomeUtf8);
169 }
170 }
171 else
172 {
173 /* compose the config directory (full path) */
174 vrc = RTPathUserHome(path, sizeof(path));
175 if (RT_SUCCESS(vrc))
176 {
177 size_t len = RTStrPrintf(aDir, aDirLen, "%s%c%s",
178 path, RTPATH_DELIMITER, VBOX_USER_HOME_SUFFIX);
179 if (len != strlen(path) + 1 + strlen (VBOX_USER_HOME_SUFFIX))
180 vrc = VERR_BUFFER_OVERFLOW;
181 }
182 }
183
184 /* ensure the home directory exists */
185 if (RT_SUCCESS(vrc))
186 if (!RTDirExists(aDir))
187 vrc = RTDirCreateFullPath(aDir, 0777);
188
189 return vrc;
190}
191
192/* static */
193const Guid Guid::Empty; /* default ctor is OK */
194
195#if defined (VBOX_WITH_XPCOM)
196
197/* static */
198const nsID *SafeGUIDArray::nsIDRef::Empty = (const nsID *) Guid::Empty.raw();
199
200#endif /* (VBOX_WITH_XPCOM) */
201
202/**
203 * Used by ComPtr and friends to log details about reference counting.
204 * @param pcszFormat
205 */
206void LogRef(const char *pcszFormat, ...)
207{
208 char *pszNewMsg;
209 va_list args;
210 va_start(args, pcszFormat);
211 RTStrAPrintfV(&pszNewMsg, pcszFormat, args);
212 LogDJ((pszNewMsg));
213 RTStrFree(pszNewMsg);
214 va_end(args);
215}
216
217} /* namespace com */
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