1/*
2 * Copyright (C) 2012 Intel Corporation. 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#include "config.h"
27#include "WKEinaSharedString.h"
28
29#include <WebKit2/WKAPICast.h>
30#include <WebKit2/WKString.h>
31#include <WebKit2/WKURL.h>
32#include <wtf/text/CString.h>
33
34using namespace WebKit;
35
36template <typename WKRefType>
37ALWAYS_INLINE const char* fromRefType(WKRefType strRef, bool adopt = false)
38{
39    const char* res = 0;
40    if (strRef) {
41        res = eina_stringshare_add(toImpl(strRef)->string().utf8().data());
42        ASSERT(res);
43        if (adopt)
44            WKRelease(strRef);
45    }
46
47    return res;
48}
49
50WKEinaSharedString::WKEinaSharedString(const WKEinaSharedString& other)
51    : m_string(eina_stringshare_ref(other.m_string))
52{
53}
54
55WKEinaSharedString::WKEinaSharedString(const char* str)
56    : m_string(eina_stringshare_add(str))
57{
58}
59
60WKEinaSharedString::WKEinaSharedString(WKAdoptTag adoptTag, WKStringRef stringRef)
61    : m_string(fromRefType(stringRef, /*adopt*/ true))
62{
63    ASSERT_UNUSED(adoptTag, adoptTag == AdoptWK); // Guard for future enum changes.
64}
65
66WKEinaSharedString::WKEinaSharedString(WKStringRef stringRef)
67    : m_string(fromRefType(stringRef))
68{
69}
70
71WKEinaSharedString::WKEinaSharedString(WKAdoptTag adoptTag, WKURLRef urlRef)
72    : m_string(fromRefType(urlRef, /*adopt*/ true))
73{
74    ASSERT_UNUSED(adoptTag, adoptTag == AdoptWK); // Guard for future enum changes.
75}
76
77WKEinaSharedString::WKEinaSharedString(WKURLRef urlRef)
78    : m_string(fromRefType(urlRef))
79{
80}
81
82WKEinaSharedString::~WKEinaSharedString()
83{
84    if (m_string)
85        eina_stringshare_del(m_string);
86}
87
88WKEinaSharedString& WKEinaSharedString::operator=(const WKEinaSharedString& other)
89{
90    if (this != &other) {
91        if (m_string)
92            eina_stringshare_del(m_string);
93        m_string = eina_stringshare_ref(other.m_string);
94    }
95    return *this;
96}
97
98WKEinaSharedString& WKEinaSharedString::operator=(const char* str)
99{
100    eina_stringshare_replace(&m_string, str);
101    return *this;
102}
103
104bool WKEinaSharedString::operator==(const char* str) const
105{
106    return (!str || !m_string) ? (str == m_string) : !strcmp(m_string, str);
107}
108
109WKEinaSharedString WKEinaSharedString::adopt(Eina_Stringshare* string)
110{
111    WKEinaSharedString sharedString;
112    sharedString.m_string = static_cast<const char*>(string);
113    return sharedString;
114}
115
116Eina_Stringshare* WKEinaSharedString::leakString()
117{
118    Eina_Stringshare* sharedString = m_string;
119    m_string = 0;
120
121    return sharedString;
122}
123