diff options
Diffstat (limited to 'WebCore/platform/win/BString.cpp')
-rw-r--r-- | WebCore/platform/win/BString.cpp | 201 |
1 files changed, 201 insertions, 0 deletions
diff --git a/WebCore/platform/win/BString.cpp b/WebCore/platform/win/BString.cpp new file mode 100644 index 0000000..618ecf3 --- /dev/null +++ b/WebCore/platform/win/BString.cpp @@ -0,0 +1,201 @@ +/* + * Copyright (C) 2006, 2007, 2008 Apple Inc. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "config.h" +#include "BString.h" + +#include "AtomicString.h" +#include "KURL.h" +#include "PlatformString.h" +#include <tchar.h> +#include <windows.h> + +#if PLATFORM(CF) +#include <CoreFoundation/CoreFoundation.h> +#endif + +using namespace JSC; + +namespace WebCore { + +BString::BString() + : m_bstr(0) +{ +} + +BString::BString(const wchar_t* characters) +{ + if (!characters) + m_bstr = 0; + else + m_bstr = SysAllocString(characters); +} + +BString::BString(const wchar_t* characters, size_t length) +{ + if (!characters) + m_bstr = 0; + else + m_bstr = SysAllocStringLen(characters, length); +} + +BString::BString(const String& s) +{ + if (s.isNull()) + m_bstr = 0; + else + m_bstr = SysAllocStringLen(s.characters(), s.length()); +} + +BString::BString(const KURL& url) +{ + if (url.isNull()) + m_bstr = 0; + else + m_bstr = SysAllocStringLen(url.string().characters(), url.string().length()); +} + +BString::BString(const AtomicString& s) +{ + if (s.isNull()) + m_bstr = 0; + else + m_bstr = SysAllocStringLen(s.characters(), s.length()); +} + +BString::BString(const UString& s) +{ + if (s.isNull()) + m_bstr = 0; + else + m_bstr = SysAllocStringLen(s.data(), s.size()); +} + +#if PLATFORM(CF) +BString::BString(CFStringRef cfstr) + : m_bstr(0) +{ + if (!cfstr) + return; + + const UniChar* uniChars = CFStringGetCharactersPtr(cfstr); + if (uniChars) { + m_bstr = SysAllocStringLen((LPCTSTR)uniChars, CFStringGetLength(cfstr)); + return; + } + + CFIndex length = CFStringGetLength(cfstr); + m_bstr = SysAllocStringLen(0, length); + CFStringGetCharacters(cfstr, CFRangeMake(0, length), (UniChar*)m_bstr); + m_bstr[length] = 0; +} +#endif + +BString::~BString() +{ + SysFreeString(m_bstr); +} + +BString::BString(const BString& other) +{ + if (!other.m_bstr) + m_bstr = 0; + else + m_bstr = SysAllocString(other.m_bstr); +} + +void BString::adoptBSTR(BSTR bstr) +{ + if (m_bstr) + SysFreeString(m_bstr); + m_bstr = bstr; +} + +BString& BString::operator=(const BString& other) +{ + if (this != &other) + *this = other.m_bstr; + return *this; +} + +BString& BString::operator=(const BSTR& other) +{ + if (other != m_bstr) { + SysFreeString(m_bstr); + m_bstr = other ? SysAllocString(other) : 0; + } + + return *this; +} + +bool operator ==(const BString& a, const BString& b) +{ + if (SysStringLen((BSTR)a) != SysStringLen((BSTR)b)) + return false; + if (!(BSTR)a && !(BSTR)b) + return true; + if (!(BSTR)a || !(BSTR)b) + return false; + return !_tcscmp((BSTR)a, (BSTR)b); +} + +bool operator !=(const BString& a, const BString& b) +{ + return !(a==b); +} + +bool operator ==(const BString& a, BSTR b) +{ + if (SysStringLen((BSTR)a) != SysStringLen(b)) + return false; + if (!(BSTR)a && !b) + return true; + if (!(BSTR)a || !b) + return false; + return !_tcscmp((BSTR)a, b); +} + +bool operator !=(const BString& a, BSTR b) +{ + return !(a==b); +} + +bool operator ==(BSTR a, const BString& b) +{ + if (SysStringLen(a) != SysStringLen((BSTR)b)) + return false; + if (!a && !(BSTR)b) + return true; + if (!a || !(BSTR)b) + return false; + return !_tcscmp(a, (BSTR)b); +} + +bool operator !=(BSTR a, const BString& b) +{ + return !(a==b); +} + +} |