1643ca7872b450ea4efacab6188849e5aac2ba161Steve Block/*
2643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * Copyright (C) 2009 Google Inc. All rights reserved.
3643ca7872b450ea4efacab6188849e5aac2ba161Steve Block *
4643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * Redistribution and use in source and binary forms, with or without
5643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * modification, are permitted provided that the following conditions are
6643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * met:
7643ca7872b450ea4efacab6188849e5aac2ba161Steve Block *
8643ca7872b450ea4efacab6188849e5aac2ba161Steve Block *     * Redistributions of source code must retain the above copyright
9643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * notice, this list of conditions and the following disclaimer.
10643ca7872b450ea4efacab6188849e5aac2ba161Steve Block *     * Redistributions in binary form must reproduce the above
11643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * copyright notice, this list of conditions and the following disclaimer
12643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * in the documentation and/or other materials provided with the
13643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * distribution.
14643ca7872b450ea4efacab6188849e5aac2ba161Steve Block *     * Neither the name of Google Inc. nor the names of its
15643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * contributors may be used to endorse or promote products derived from
16643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * this software without specific prior written permission.
17643ca7872b450ea4efacab6188849e5aac2ba161Steve Block *
18643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29643ca7872b450ea4efacab6188849e5aac2ba161Steve Block */
30643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
31643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#ifndef WebString_h
32643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#define WebString_h
33643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
34643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "WebCommon.h"
35643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
36643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#if WEBKIT_IMPLEMENTATION
37dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch#include <wtf/Forward.h>
38643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#else
39643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include <base/nullable_string16.h>
40643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include <base/string16.h>
41643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#endif
42643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
43643ca7872b450ea4efacab6188849e5aac2ba161Steve Blocknamespace WebKit {
44643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
45643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockclass WebCString;
46643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockclass WebStringPrivate;
47643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
48643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// A UTF-16 string container.  It is inexpensive to copy a WebString
49643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// object.
50643ca7872b450ea4efacab6188849e5aac2ba161Steve Block//
51643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// WARNING: It is not safe to pass a WebString across threads!!!
52643ca7872b450ea4efacab6188849e5aac2ba161Steve Block//
53643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockclass WebString {
54643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockpublic:
55643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    ~WebString() { reset(); }
56643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
57643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    WebString() : m_private(0) { }
58643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
59643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    WebString(const WebUChar* data, size_t len) : m_private(0)
60643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    {
61643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        assign(data, len);
62643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    }
63643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
64643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    WebString(const WebString& s) : m_private(0) { assign(s); }
65643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
66643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    WebString& operator=(const WebString& s)
67643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    {
68643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        assign(s);
69643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        return *this;
70643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    }
71643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
72643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    WEBKIT_API void reset();
73643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    WEBKIT_API void assign(const WebString&);
74643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    WEBKIT_API void assign(const WebUChar* data, size_t len);
75643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
76d0825bca7fe65beaee391d30da42e937db621564Steve Block    WEBKIT_API bool equals(const WebString& s) const;
77d0825bca7fe65beaee391d30da42e937db621564Steve Block
78643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    WEBKIT_API size_t length() const;
79643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    WEBKIT_API const WebUChar* data() const;
80643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
81643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    bool isEmpty() const { return !length(); }
82643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    bool isNull() const { return !m_private; }
83643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
84643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    WEBKIT_API WebCString utf8() const;
85643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
86643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    WEBKIT_API static WebString fromUTF8(const char* data, size_t length);
87643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    WEBKIT_API static WebString fromUTF8(const char* data);
88643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
89d0825bca7fe65beaee391d30da42e937db621564Steve Block    template <int N> WebString(const char (&data)[N])
90d0825bca7fe65beaee391d30da42e937db621564Steve Block        : m_private(0)
91d0825bca7fe65beaee391d30da42e937db621564Steve Block    {
92d0825bca7fe65beaee391d30da42e937db621564Steve Block        assign(fromUTF8(data, N - 1));
93d0825bca7fe65beaee391d30da42e937db621564Steve Block    }
94d0825bca7fe65beaee391d30da42e937db621564Steve Block
95d0825bca7fe65beaee391d30da42e937db621564Steve Block    template <int N> WebString& operator=(const char (&data)[N])
96d0825bca7fe65beaee391d30da42e937db621564Steve Block    {
97d0825bca7fe65beaee391d30da42e937db621564Steve Block        assign(fromUTF8(data, N - 1));
98d0825bca7fe65beaee391d30da42e937db621564Steve Block        return *this;
99d0825bca7fe65beaee391d30da42e937db621564Steve Block    }
100d0825bca7fe65beaee391d30da42e937db621564Steve Block
101643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#if WEBKIT_IMPLEMENTATION
102dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    WebString(const WTF::String&);
103dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    WebString& operator=(const WTF::String&);
104dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    operator WTF::String() const;
105643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
106dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    WebString(const WTF::AtomicString&);
107dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    WebString& operator=(const WTF::AtomicString&);
108dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    operator WTF::AtomicString() const;
109643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#else
110d0825bca7fe65beaee391d30da42e937db621564Steve Block
111643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    WebString(const string16& s) : m_private(0)
112643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    {
113643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        assign(s.data(), s.length());
114643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    }
115643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
116643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    WebString& operator=(const string16& s)
117643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    {
118643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        assign(s.data(), s.length());
119643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        return *this;
120643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    }
121643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
122643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    operator string16() const
123643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    {
124643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        size_t len = length();
125643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        return len ? string16(data(), len) : string16();
126643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    }
127643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
128643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    WebString(const NullableString16& s) : m_private(0)
129643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    {
130643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        if (s.is_null())
131ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            reset();
132643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        else
133643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            assign(s.string().data(), s.string().length());
134643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    }
135643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
136643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    WebString& operator=(const NullableString16& s)
137643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    {
138643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        if (s.is_null())
139ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            reset();
140643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        else
141643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            assign(s.string().data(), s.string().length());
142643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        return *this;
143643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    }
144643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
145643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    operator NullableString16() const
146643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    {
147643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        if (!m_private)
148643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            return NullableString16(string16(), true);
149643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        size_t len = length();
150643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        return NullableString16(len ? string16(data(), len) : string16(), false);
151643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    }
152643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
153643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    template <class UTF8String>
154643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    static WebString fromUTF8(const UTF8String& s)
155643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    {
156643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        return fromUTF8(s.data(), s.length());
157643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    }
158643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#endif
159643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
160643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockprivate:
161643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    void assign(WebStringPrivate*);
162643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    WebStringPrivate* m_private;
163643ca7872b450ea4efacab6188849e5aac2ba161Steve Block};
164643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
165d0825bca7fe65beaee391d30da42e937db621564Steve Blockinline bool operator==(const WebString& a, const WebString& b)
166d0825bca7fe65beaee391d30da42e937db621564Steve Block{
167d0825bca7fe65beaee391d30da42e937db621564Steve Block    return a.equals(b);
168d0825bca7fe65beaee391d30da42e937db621564Steve Block}
169d0825bca7fe65beaee391d30da42e937db621564Steve Block
170d0825bca7fe65beaee391d30da42e937db621564Steve Blockinline bool operator!=(const WebString& a, const WebString& b)
171d0825bca7fe65beaee391d30da42e937db621564Steve Block{
172d0825bca7fe65beaee391d30da42e937db621564Steve Block    return !(a == b);
173d0825bca7fe65beaee391d30da42e937db621564Steve Block}
174d0825bca7fe65beaee391d30da42e937db621564Steve Block
175643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} // namespace WebKit
176643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
177643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#endif
178