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