[Win] Remove -DUCHAR_TYPE=wchar_t stopgap and learn to live with char16_t.
[WebKit-https.git] / Source / WebCore / platform / win / BString.cpp
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 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 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 <windows.h>
30 #include <wtf/URL.h>
31 #include <wtf/text/AtomicString.h>
32 #include <wtf/text/StringView.h>
33 #include <wtf/text/win/WCharStringExtras.h>
34
35 #if USE(CF)
36 #include <CoreFoundation/CoreFoundation.h>
37 #endif
38
39
40 namespace WebCore {
41 using namespace JSC;
42
43 BString::BString()
44     : m_bstr(0)
45 {
46 }
47
48 BString::BString(const wchar_t* characters)
49 {
50     if (!characters)
51         m_bstr = 0;
52     else
53         m_bstr = SysAllocString(characters);
54 }
55
56 BString::BString(const wchar_t* characters, size_t length)
57 {
58     if (!characters)
59         m_bstr = 0;
60     else
61         m_bstr = SysAllocStringLen(characters, length);
62 }
63
64 BString::BString(const String& s)
65 {
66     if (s.isNull())
67         m_bstr = 0;
68     else
69         m_bstr = SysAllocStringLen(wcharFrom(StringView(s).upconvertedCharacters()), s.length());
70 }
71
72 BString::BString(const URL& url)
73 {
74     if (url.isNull())
75         m_bstr = 0;
76     else
77         m_bstr = SysAllocStringLen(wcharFrom(StringView(url.string()).upconvertedCharacters()), url.string().length());
78 }
79
80 BString::BString(const AtomicString& s)
81 {
82     if (s.isNull())
83         m_bstr = 0;
84     else
85         m_bstr = SysAllocStringLen(wcharFrom(StringView(s.string()).upconvertedCharacters()), s.length());
86 }
87
88 #if USE(CF)
89 BString::BString(CFStringRef cfstr)
90     : m_bstr(0)
91 {
92     if (!cfstr)
93         return;
94
95     const UniChar* uniChars = CFStringGetCharactersPtr(cfstr);
96     if (uniChars) {
97         m_bstr = SysAllocStringLen((LPCWSTR)uniChars, CFStringGetLength(cfstr));
98         return;
99     }
100
101     CFIndex length = CFStringGetLength(cfstr);
102     m_bstr = SysAllocStringLen(0, length);
103     CFStringGetCharacters(cfstr, CFRangeMake(0, length), (UniChar*)m_bstr);
104     m_bstr[length] = 0;
105 }
106 #endif
107
108 BString::~BString()
109 {
110     SysFreeString(m_bstr);
111 }
112
113 BString::BString(const BString& other)
114 {
115     if (!other.m_bstr)
116         m_bstr = 0;
117     else
118         m_bstr = SysAllocString(other.m_bstr);
119 }
120
121 void BString::adoptBSTR(BSTR bstr)
122 {
123     SysFreeString(m_bstr);
124     m_bstr = bstr;
125 }
126
127 void BString::clear()
128 {
129     SysFreeString(m_bstr);
130     m_bstr = 0;
131 }
132
133 BString& BString::operator=(const BString& other)
134 {
135     if (this != &other)
136         *this = other.m_bstr;
137     return *this;
138 }
139
140 BString& BString::operator=(const BSTR& other)
141 {
142     if (other != m_bstr) {
143         SysFreeString(m_bstr);
144         m_bstr = other ? SysAllocString(other) : 0;
145     }
146
147     return *this;
148 }
149
150 bool operator ==(const BString& a, const BString& b)
151 {
152     if (SysStringLen((BSTR)a) != SysStringLen((BSTR)b))
153         return false;
154     if (!(BSTR)a && !(BSTR)b)
155         return true;
156     if (!(BSTR)a || !(BSTR)b)
157         return false;
158     return !wcscmp((BSTR)a, (BSTR)b);
159 }
160
161 bool operator !=(const BString& a, const BString& b)
162 {
163     return !(a==b);
164 }
165
166 bool operator ==(const BString& a, BSTR b)
167 {
168     if (SysStringLen((BSTR)a) != SysStringLen(b))
169         return false;
170     if (!(BSTR)a && !b)
171         return true;
172     if (!(BSTR)a || !b)
173         return false;
174     return !wcscmp((BSTR)a, b);
175 }
176
177 bool operator !=(const BString& a, BSTR b)
178 {
179     return !(a==b);
180 }
181
182 bool operator ==(BSTR a, const BString& b)
183 {
184     if (SysStringLen(a) != SysStringLen((BSTR)b))
185         return false;
186     if (!a && !(BSTR)b)
187         return true;
188     if (!a || !(BSTR)b)
189         return false;
190     return !wcscmp(a, (BSTR)b);
191 }
192
193 bool operator !=(BSTR a, const BString& b)
194 {
195     return !(a==b);
196 }
197
198 }