Part 2 of removing PlatformString.h, remove PlatformString.h
[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 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 <windows.h>
31 #include <wtf/text/AtomicString.h>
32 #include <wtf/text/WTFString.h>
33
34 #if USE(CF)
35 #include <CoreFoundation/CoreFoundation.h>
36 #endif
37
38 using namespace JSC;
39
40 namespace WebCore {
41
42 BString::BString()
43     : m_bstr(0)
44 {
45 }
46
47 BString::BString(const wchar_t* characters)
48 {
49     if (!characters)
50         m_bstr = 0;
51     else
52         m_bstr = SysAllocString(characters);
53 }
54
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
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
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
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
87 #if USE(CF)
88 BString::BString(CFStringRef cfstr)
89     : m_bstr(0)
90 {
91     if (!cfstr)
92         return;
93
94     const UniChar* uniChars = CFStringGetCharactersPtr(cfstr);
95     if (uniChars) {
96         m_bstr = SysAllocStringLen((LPCWSTR)uniChars, CFStringGetLength(cfstr));
97         return;
98     }
99
100     CFIndex length = CFStringGetLength(cfstr);
101     m_bstr = SysAllocStringLen(0, length);
102     CFStringGetCharacters(cfstr, CFRangeMake(0, length), (UniChar*)m_bstr);
103     m_bstr[length] = 0;
104 }
105 #endif
106
107 BString::~BString()
108 {
109     SysFreeString(m_bstr);
110 }
111
112 BString::BString(const BString& other)
113 {
114     if (!other.m_bstr)
115         m_bstr = 0;
116     else
117         m_bstr = SysAllocString(other.m_bstr);
118 }
119
120 void BString::adoptBSTR(BSTR bstr)
121 {
122     if (m_bstr)
123         SysFreeString(m_bstr);
124     m_bstr = bstr;
125 }
126
127 BString& BString::operator=(const BString& other)
128 {
129     if (this != &other)
130         *this = other.m_bstr;
131     return *this;
132 }
133
134 BString& BString::operator=(const BSTR& other)
135 {
136     if (other != m_bstr) {
137         SysFreeString(m_bstr);
138         m_bstr = other ? SysAllocString(other) : 0;
139     }
140
141     return *this;
142 }
143
144 bool operator ==(const BString& a, const BString& b)
145 {
146     if (SysStringLen((BSTR)a) != SysStringLen((BSTR)b))
147         return false;
148     if (!(BSTR)a && !(BSTR)b)
149         return true;
150     if (!(BSTR)a || !(BSTR)b)
151         return false;
152     return !wcscmp((BSTR)a, (BSTR)b);
153 }
154
155 bool operator !=(const BString& a, const BString& b)
156 {
157     return !(a==b);
158 }
159
160 bool operator ==(const BString& a, BSTR b)
161 {
162     if (SysStringLen((BSTR)a) != SysStringLen(b))
163         return false;
164     if (!(BSTR)a && !b)
165         return true;
166     if (!(BSTR)a || !b)
167         return false;
168     return !wcscmp((BSTR)a, b);
169 }
170
171 bool operator !=(const BString& a, BSTR b)
172 {
173     return !(a==b);
174 }
175
176 bool operator ==(BSTR a, const BString& b)
177 {
178     if (SysStringLen(a) != SysStringLen((BSTR)b))
179         return false;
180     if (!a && !(BSTR)b)
181         return true;
182     if (!a || !(BSTR)b)
183         return false;
184     return !wcscmp(a, (BSTR)b);
185 }
186
187 bool operator !=(BSTR a, const BString& b)
188 {
189     return !(a==b);
190 }
191
192 }