1545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch/*
2545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch * Copyright (C) Research In Motion Limited 2010. All rights reserved.
3545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch * Copyright (C) 2009 Google Inc. All rights reserved.
4545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch *
5545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch * This library is free software; you can redistribute it and/or
6545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch * modify it under the terms of the GNU Library General Public
7545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch * License as published by the Free Software Foundation; either
8545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch * version 2 of the License, or (at your option) any later version.
9545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch *
10545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch * This library is distributed in the hope that it will be useful,
11545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch * but WITHOUT ANY WARRANTY; without even the implied warranty of
12545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch * Library General Public License for more details.
14545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch *
15545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch * You should have received a copy of the GNU Library General Public License
16545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch * along with this library; see the file COPYING.LIB.  If not, write to
17545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch * Boston, MA 02110-1301, USA.
19545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch */
20545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
21545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch#include "config.h"
22545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch#include "WebDOMString.h"
23545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
24545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch#include "WebDOMCString.h"
25545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch#include <wtf/text/AtomicString.h>
26545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch#include <wtf/text/CString.h>
27545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch#include <wtf/text/WTFString.h>
28545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
29dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdochclass WebDOMStringPrivate : public WTF::StringImpl {
30545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch};
31545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
32545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdochvoid WebDOMString::reset()
33545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch{
34545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    if (m_private) {
35545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        m_private->deref();
36545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        m_private = 0;
37545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    }
38545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch}
39545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
40545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdochvoid WebDOMString::assign(const WebDOMString& other)
41545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch{
42545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    assign(const_cast<WebDOMStringPrivate*>(other.m_private));
43545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch}
44545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
45545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdochvoid WebDOMString::assign(const WebUChar* data, size_t length)
46545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch{
47545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    assign(static_cast<WebDOMStringPrivate*>(
48dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        WTF::StringImpl::create(data, length).get()));
49545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch}
50545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
51545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdochsize_t WebDOMString::length() const
52545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch{
53545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    return m_private ? const_cast<WebDOMStringPrivate*>(m_private)->length() : 0;
54545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch}
55545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
56545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdochconst WebUChar* WebDOMString::data() const
57545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch{
58545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    return m_private ? const_cast<WebDOMStringPrivate*>(m_private)->characters() : 0;
59545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch}
60545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
61545e470e52f0ac6a3a072bf559c796b42c6066b6Ben MurdochWebDOMCString WebDOMString::utf8() const
62545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch{
63dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    return WTF::String(m_private).utf8();
64545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch}
65545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
66545e470e52f0ac6a3a072bf559c796b42c6066b6Ben MurdochWebDOMString WebDOMString::fromUTF8(const char* data, size_t length)
67545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch{
68dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    return WTF::String::fromUTF8(data, length);
69545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch}
70545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
71545e470e52f0ac6a3a072bf559c796b42c6066b6Ben MurdochWebDOMString WebDOMString::fromUTF8(const char* data)
72545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch{
73dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    return WTF::String::fromUTF8(data);
74545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch}
75545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
76dd8bb3de4f353a81954234999f1fea748aee2ea9Ben MurdochWebDOMString::WebDOMString(const WTF::String& s)
77545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    : m_private(static_cast<WebDOMStringPrivate*>(s.impl()))
78545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch{
79545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    if (m_private)
80545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        m_private->ref();
81545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch}
82545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
83dd8bb3de4f353a81954234999f1fea748aee2ea9Ben MurdochWebDOMString& WebDOMString::operator=(const WTF::String& s)
84545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch{
85545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    assign(static_cast<WebDOMStringPrivate*>(s.impl()));
86545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    return *this;
87545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch}
88545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
89dd8bb3de4f353a81954234999f1fea748aee2ea9Ben MurdochWebDOMString::operator WTF::String() const
90545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch{
91545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    return m_private;
92545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch}
93545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
94dd8bb3de4f353a81954234999f1fea748aee2ea9Ben MurdochWebDOMString::WebDOMString(const WTF::AtomicString& s)
95545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    : m_private(0)
96545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch{
97545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    assign(s.string());
98545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch}
99545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
100dd8bb3de4f353a81954234999f1fea748aee2ea9Ben MurdochWebDOMString& WebDOMString::operator=(const WTF::AtomicString& s)
101545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch{
102545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    assign(s.string());
103545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    return *this;
104545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch}
105545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
106dd8bb3de4f353a81954234999f1fea748aee2ea9Ben MurdochWebDOMString::operator WTF::AtomicString() const
107545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch{
108dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    return WTF::AtomicString(static_cast<WTF::StringImpl *>(m_private));
109545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch}
110545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
111545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdochbool WebDOMString::equals(const char* string) const
112545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch{
113f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    return WTF::equal(m_private, string);
114545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch}
115545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
116545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdochvoid WebDOMString::assign(WebDOMStringPrivate* p)
117545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch{
118545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    // Take care to handle the case where m_private == p
119545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    if (p)
120545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        p->ref();
121545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    if (m_private)
122545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        m_private->deref();
123545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    m_private = p;
124545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch}
125