Home | History | Annotate | Download | only in Shared
      1 /*
      2  * Copyright (C) 2010 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. AND ITS CONTRIBUTORS ``AS IS''
     14  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
     15  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     16  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
     17  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     18  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     19  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     20  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     21  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     22  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
     23  * THE POSSIBILITY OF SUCH DAMAGE.
     24  */
     25 
     26 #ifndef WebString_h
     27 #define WebString_h
     28 
     29 #include "APIObject.h"
     30 #include <JavaScriptCore/JSStringRef.h>
     31 #include <wtf/PassRefPtr.h>
     32 #include <wtf/text/WTFString.h>
     33 #include <wtf/unicode/UTF8.h>
     34 
     35 namespace WebKit {
     36 
     37 // WebString - A string type suitable for vending to an API.
     38 
     39 class WebString : public APIObject {
     40 public:
     41     static const Type APIType = TypeString;
     42 
     43     static PassRefPtr<WebString> create(const String& string)
     44     {
     45         return adoptRef(new WebString(string));
     46     }
     47 
     48     static PassRefPtr<WebString> create(JSStringRef jsStringRef)
     49     {
     50         return adoptRef(new WebString(String(JSStringGetCharactersPtr(jsStringRef), JSStringGetLength(jsStringRef))));
     51     }
     52 
     53     static PassRefPtr<WebString> createFromUTF8String(const char* string)
     54     {
     55         return adoptRef(new WebString(String::fromUTF8(string)));
     56     }
     57 
     58     bool isNull() const { return m_string.isNull(); }
     59     bool isEmpty() const { return m_string.isEmpty(); }
     60 
     61     size_t length() const { return m_string.length(); }
     62     size_t getCharacters(UChar* buffer, size_t bufferLength) const
     63     {
     64         if (!bufferLength)
     65             return 0;
     66         bufferLength = std::min(bufferLength, static_cast<size_t>(m_string.length()));
     67         memcpy(buffer, m_string.characters(), bufferLength * sizeof(UChar));
     68         return bufferLength;
     69     }
     70 
     71     size_t maximumUTF8CStringSize() const { return m_string.length() * 3 + 1; }
     72     size_t getUTF8CString(char* buffer, size_t bufferSize)
     73     {
     74         if (!bufferSize)
     75             return 0;
     76         char* p = buffer;
     77         const UChar* d = m_string.characters();
     78         WTF::Unicode::ConversionResult result = WTF::Unicode::convertUTF16ToUTF8(&d, d + m_string.length(), &p, p + bufferSize - 1, /* strict */ true);
     79         *p++ = '\0';
     80         if (result != WTF::Unicode::conversionOK && result != WTF::Unicode::targetExhausted)
     81             return 0;
     82         return p - buffer;
     83     }
     84 
     85     bool equal(WebString* other) { return m_string == other->m_string; }
     86     bool equalToUTF8String(const char* other) { return m_string == String::fromUTF8(other); }
     87     bool equalToUTF8StringIgnoringCase(const char* other) { return equalIgnoringCase(m_string, other); }
     88 
     89     const String& string() const { return m_string; }
     90 
     91     JSStringRef createJSString() const { return JSStringCreateWithCharacters(m_string.characters(), m_string.length()); }
     92 
     93 private:
     94     WebString(const String& string)
     95         : m_string(!string.impl() ? String(StringImpl::empty()) : string)
     96     {
     97     }
     98 
     99     virtual Type type() const { return APIType; }
    100 
    101     String m_string;
    102 };
    103 
    104 } // namespace WebKit
    105 
    106 #endif // WebString_h
    107