• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2006, 2007, 2008 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24  */
25 
26 #include "config.h"
27 #include "BString.h"
28 
29 #include "KURL.h"
30 #include "PlatformString.h"
31 #include <windows.h>
32 #include <wtf/text/AtomicString.h>
33 
34 #if USE(CF)
35 #include <CoreFoundation/CoreFoundation.h>
36 #endif
37 
38 using namespace JSC;
39 
40 namespace WebCore {
41 
BString()42 BString::BString()
43     : m_bstr(0)
44 {
45 }
46 
BString(const wchar_t * characters)47 BString::BString(const wchar_t* characters)
48 {
49     if (!characters)
50         m_bstr = 0;
51     else
52         m_bstr = SysAllocString(characters);
53 }
54 
BString(const wchar_t * characters,size_t length)55 BString::BString(const wchar_t* characters, size_t length)
56 {
57     if (!characters)
58         m_bstr = 0;
59     else
60         m_bstr = SysAllocStringLen(characters, length);
61 }
62 
BString(const String & s)63 BString::BString(const String& s)
64 {
65     if (s.isNull())
66         m_bstr = 0;
67     else
68         m_bstr = SysAllocStringLen(s.characters(), s.length());
69 }
70 
BString(const KURL & url)71 BString::BString(const KURL& url)
72 {
73     if (url.isNull())
74         m_bstr = 0;
75     else
76         m_bstr = SysAllocStringLen(url.string().characters(), url.string().length());
77 }
78 
BString(const AtomicString & s)79 BString::BString(const AtomicString& s)
80 {
81     if (s.isNull())
82         m_bstr = 0;
83     else
84         m_bstr = SysAllocStringLen(s.characters(), s.length());
85 }
86 
BString(const UString & s)87 BString::BString(const UString& s)
88 {
89     if (s.isNull())
90         m_bstr = 0;
91     else
92         m_bstr = SysAllocStringLen(s.characters(), s.length());
93 }
94 
95 #if USE(CF)
BString(CFStringRef cfstr)96 BString::BString(CFStringRef cfstr)
97     : m_bstr(0)
98 {
99     if (!cfstr)
100         return;
101 
102     const UniChar* uniChars = CFStringGetCharactersPtr(cfstr);
103     if (uniChars) {
104         m_bstr = SysAllocStringLen((LPCWSTR)uniChars, CFStringGetLength(cfstr));
105         return;
106     }
107 
108     CFIndex length = CFStringGetLength(cfstr);
109     m_bstr = SysAllocStringLen(0, length);
110     CFStringGetCharacters(cfstr, CFRangeMake(0, length), (UniChar*)m_bstr);
111     m_bstr[length] = 0;
112 }
113 #endif
114 
~BString()115 BString::~BString()
116 {
117     SysFreeString(m_bstr);
118 }
119 
BString(const BString & other)120 BString::BString(const BString& other)
121 {
122     if (!other.m_bstr)
123         m_bstr = 0;
124     else
125         m_bstr = SysAllocString(other.m_bstr);
126 }
127 
adoptBSTR(BSTR bstr)128 void BString::adoptBSTR(BSTR bstr)
129 {
130     if (m_bstr)
131         SysFreeString(m_bstr);
132     m_bstr = bstr;
133 }
134 
operator =(const BString & other)135 BString& BString::operator=(const BString& other)
136 {
137     if (this != &other)
138         *this = other.m_bstr;
139     return *this;
140 }
141 
operator =(const BSTR & other)142 BString& BString::operator=(const BSTR& other)
143 {
144     if (other != m_bstr) {
145         SysFreeString(m_bstr);
146         m_bstr = other ? SysAllocString(other) : 0;
147     }
148 
149     return *this;
150 }
151 
operator ==(const BString & a,const BString & b)152 bool operator ==(const BString& a, const BString& b)
153 {
154     if (SysStringLen((BSTR)a) != SysStringLen((BSTR)b))
155         return false;
156     if (!(BSTR)a && !(BSTR)b)
157         return true;
158     if (!(BSTR)a || !(BSTR)b)
159         return false;
160     return !wcscmp((BSTR)a, (BSTR)b);
161 }
162 
operator !=(const BString & a,const BString & b)163 bool operator !=(const BString& a, const BString& b)
164 {
165     return !(a==b);
166 }
167 
operator ==(const BString & a,BSTR b)168 bool operator ==(const BString& a, BSTR b)
169 {
170     if (SysStringLen((BSTR)a) != SysStringLen(b))
171         return false;
172     if (!(BSTR)a && !b)
173         return true;
174     if (!(BSTR)a || !b)
175         return false;
176     return !wcscmp((BSTR)a, b);
177 }
178 
operator !=(const BString & a,BSTR b)179 bool operator !=(const BString& a, BSTR b)
180 {
181     return !(a==b);
182 }
183 
operator ==(BSTR a,const BString & b)184 bool operator ==(BSTR a, const BString& b)
185 {
186     if (SysStringLen(a) != SysStringLen((BSTR)b))
187         return false;
188     if (!a && !(BSTR)b)
189         return true;
190     if (!a || !(BSTR)b)
191         return false;
192     return !wcscmp(a, (BSTR)b);
193 }
194 
operator !=(BSTR a,const BString & b)195 bool operator !=(BSTR a, const BString& b)
196 {
197     return !(a==b);
198 }
199 
200 }
201