VirtualBox

source: vbox/trunk/src/VBox/Main/glue/string.cpp@ 34837

Last change on this file since 34837 was 34837, checked in by vboxsync, 14 years ago

Main/Settings: always use forward slashes in media & snapshot folder paths to make things more portable between windows & other OSes

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 3.9 KB
Line 
1/* $Id: string.cpp 34837 2010-12-08 14:37:42Z vboxsync $ */
2
3/** @file
4 *
5 * MS COM / XPCOM Abstraction Layer:
6 * UTF-8 and UTF-16 string classes
7 */
8
9/*
10 * Copyright (C) 2006-2007 Oracle Corporation
11 *
12 * This file is part of VirtualBox Open Source Edition (OSE), as
13 * available from http://www.virtualbox.org. This file is free software;
14 * you can redistribute it and/or modify it under the terms of the GNU
15 * General Public License (GPL) as published by the Free Software
16 * Foundation, in version 2 as it comes in the "COPYING" file of the
17 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
18 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
19 */
20
21#include "VBox/com/string.h"
22
23#include <iprt/err.h>
24#include <iprt/path.h>
25
26namespace com
27{
28
29// BSTR representing a null wide char with 32 bits of length prefix (0);
30// this will work on Windows as well as other platforms where BSTR does
31// not use length prefixes
32const OLECHAR g_achEmptyBstr[3] = { 0, 0, 0 };
33const BSTR g_bstrEmpty = (BSTR)(&g_achEmptyBstr[2]);
34
35/* static */
36const Bstr Bstr::Empty; /* default ctor is OK */
37
38/* static */
39const Utf8Str Utf8Str::Empty; /* default ctor is OK */
40
41#if defined (VBOX_WITH_XPCOM)
42void Utf8Str::cloneTo(char **pstr) const
43{
44 size_t cb = length() + 1;
45 *pstr = (char*)nsMemory::Alloc(cb);
46 if (!*pstr)
47 throw std::bad_alloc();
48 memcpy(*pstr, c_str(), cb);
49}
50#endif
51
52Utf8Str& Utf8Str::stripTrailingSlash()
53{
54 if (length())
55 {
56 ::RTPathStripTrailingSlash(m_psz);
57 jolt();
58 }
59 return *this;
60}
61
62Utf8Str& Utf8Str::stripFilename()
63{
64 if (length())
65 {
66 RTPathStripFilename(m_psz);
67 jolt();
68 }
69 return *this;
70}
71
72Utf8Str& Utf8Str::stripPath()
73{
74 if (length())
75 {
76 char *pszName = ::RTPathFilename(m_psz);
77 if (pszName)
78 {
79 size_t cchName = length() - (pszName - m_psz);
80 memmove(m_psz, pszName, cchName + 1);
81 jolt();
82 }
83 else
84 cleanup();
85 }
86 return *this;
87}
88
89Utf8Str& Utf8Str::stripExt()
90{
91 if (length())
92 {
93 RTPathStripExt(m_psz);
94 jolt();
95 }
96 return *this;
97}
98
99Utf8Str& Utf8Str::useForwardSlashes()
100{
101 for (size_t i = 0; i < length(); ++i)
102 {
103 char *p = &m_psz[i];
104 if (*p == '\\')
105 *p = '/';
106 }
107
108 return *this;
109}
110
111/**
112 * Internal function used in Utf8Str copy constructors and assignment when
113 * copying from a UTF-16 string.
114 *
115 * As with the iprt::ministring::copyFrom() variants, this unconditionally
116 * sets the members to a copy of the given other strings and makes
117 * no assumptions about previous contents. This can therefore be used
118 * both in copy constructors, when member variables have no defined
119 * value, and in assignments after having called cleanup().
120 *
121 * This variant converts from a UTF-16 string, most probably from
122 * a Bstr assignment.
123 *
124 * @param s
125 */
126void Utf8Str::copyFrom(CBSTR s)
127{
128 if (s && *s)
129 {
130 int vrc = RTUtf16ToUtf8Ex((PRTUTF16)s, // PCRTUTF16 pwszString
131 RTSTR_MAX, // size_t cwcString: translate entire string
132 &m_psz, // char **ppsz: output buffer
133 0, // size_t cch: if 0, func allocates buffer in *ppsz
134 &m_cch); // size_t *pcch: receives the size of the output string, excluding the terminator.
135 if (RT_FAILURE(vrc))
136 {
137 if ( vrc == VERR_NO_STR_MEMORY
138 || vrc == VERR_NO_MEMORY
139 )
140 throw std::bad_alloc();
141
142 // @todo what do we do with bad input strings? throw also? for now just keep an empty string
143 m_cch = 0;
144 m_cbAllocated = 0;
145 m_psz = NULL;
146 }
147 else
148 m_cbAllocated = m_cch + 1;
149 }
150 else
151 {
152 m_cch = 0;
153 m_cbAllocated = 0;
154 m_psz = NULL;
155 }
156}
157
158} /* 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