VirtualBox

source: vbox/trunk/src/VBox/Main/xpcom/helpers.cpp@ 20992

Last change on this file since 20992 was 8768, checked in by vboxsync, 17 years ago

while I'm at it - moving the non-linux stuff to xpcom.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 4.9 KB
Line 
1/** @file
2 *
3 * COM helper functions for XPCOM
4 */
5
6/*
7 * Copyright (C) 2006-2007 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#include "VBox/com/defs.h"
23
24#include <nsMemory.h>
25
26#include <iprt/string.h>
27
28
29//
30// OLE Automation string APIs
31//
32
33// Note: on Windows, every BSTR stores its length in the
34// byte just before the pointer you get. If we do it like this,
35// the caller cannot just use nsMemory::Free() on our strings.
36// Therefore we'll try to implement it differently and hope that
37// we don't run into problems.
38
39/**
40 * Copies a string into a new memory block including the terminating UCS2 NULL
41 * @param sz source string to copy
42 * @returns BSTR new string buffer
43 */
44BSTR SysAllocString(const OLECHAR* sz)
45{
46 if (!sz)
47 {
48 return NULL;
49 }
50 return SysAllocStringLen(sz, SysStringLen((BSTR)sz));
51}
52
53/**
54 * Copies len OLECHARs of a string into a new memory block and
55 * adds a terminating UCS2 NULL
56 * @param psz source string to copy
57 * @param len length of the source string in bytes
58 * @returns BSTR new string buffer
59 */
60BSTR SysAllocStringByteLen(char *psz, unsigned int len)
61{
62 unsigned int *newBuffer;
63 char *newString;
64
65 newBuffer = (unsigned int*)nsMemory::Alloc(len + sizeof(OLECHAR));
66 if (!newBuffer)
67 {
68 return NULL;
69 }
70 if (psz)
71 {
72 memcpy(newBuffer, psz, len);
73 }
74 // make sure there is a trailing UCS2 NULL
75 newString = (char*)newBuffer;
76 newString[len] = '\0';
77 newString[len + 1] = '\0';
78 return (BSTR)newString;
79}
80
81/**
82 * Create a BSTR from the OLECHAR string with a given length in UCS2 characters
83 * @param pch pointer to the source string
84 * @param cch length of the source string in UCS2 characters
85 * @returns BSTR new string buffer
86 */
87BSTR SysAllocStringLen(const OLECHAR *pch, unsigned int cch)
88{
89 unsigned int bufferSize;
90 unsigned int *newBuffer;
91 OLECHAR *newString;
92
93 // add the trailing UCS2 NULL
94 bufferSize = cch * sizeof(OLECHAR);
95 newBuffer = (unsigned int*)nsMemory::Alloc(bufferSize + sizeof(OLECHAR));
96 if (!newBuffer)
97 {
98 return NULL;
99 }
100 // copy the string, a NULL input string is allowed
101 if (pch)
102 {
103 memcpy(newBuffer, pch, bufferSize);
104
105 } else
106 {
107 memset(newBuffer, 0, bufferSize);
108 }
109 // make sure there is a trailing UCS2 NULL
110 newString = (OLECHAR*)newBuffer;
111 newString[cch] = L'\0';
112
113 return (BSTR)newString;
114}
115
116/**
117 * Frees the memory associated with the BSTR given
118 * @param bstr source string to free
119 */
120void SysFreeString(BSTR bstr)
121{
122 if (bstr)
123 {
124 nsMemory::Free(bstr);
125 }
126}
127
128/**
129 * Reallocates a string by freeing the old string and copying
130 * a new string into a new buffer.
131 * @param pbstr old string to free
132 * @param psz source string to copy into the new string
133 * @returns success indicator
134 */
135int SysReAllocString(BSTR *pbstr, const OLECHAR *psz)
136{
137 if (!pbstr)
138 {
139 return 0;
140 }
141 SysFreeString(*pbstr);
142 *pbstr = SysAllocString(psz);
143 return 1;
144}
145
146/**
147 * Changes the length of a previous created BSTR
148 * @param pbstr string to change the length of
149 * @param psz source string to copy into the adjusted pbstr
150 * @param cch length of the source string in UCS2 characters
151 * @returns int success indicator
152 */
153int SysReAllocStringLen(BSTR *pbstr, const OLECHAR *psz, unsigned int cch)
154{
155 if (SysStringLen(*pbstr) > 0)
156 {
157 unsigned int newByteLen;
158 unsigned int *newBuffer;
159 newByteLen = cch * sizeof(OLECHAR);
160 newBuffer = (unsigned int*)nsMemory::Realloc((void*)*pbstr,
161 newByteLen + sizeof(OLECHAR));
162 if (psz)
163 {
164 memcpy(*pbstr, psz, newByteLen);
165 *pbstr[cch] = 0;
166 }
167 } else
168 {
169 // allocate a new string
170 *pbstr = SysAllocStringLen(psz, cch);
171 }
172 return 1;
173}
174
175/**
176 * Returns the string length in bytes without the terminator
177 * @returns unsigned int length in bytes
178 * @param bstr source string
179 */
180unsigned int SysStringByteLen(BSTR bstr)
181{
182 return RTUtf16Len(bstr) * sizeof(OLECHAR);
183}
184
185/**
186 * Returns the string length in OLECHARs without the terminator
187 * @returns unsigned int length in OLECHARs
188 * @param bstr source string
189 */
190unsigned int SysStringLen(BSTR bstr)
191{
192 return RTUtf16Len(bstr);
193}
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