2010-11-23 15:46:01 +01:00
|
|
|
// Copyright (c) 2010 Marshall A. Greenblatt. All rights reserved.
|
|
|
|
//
|
|
|
|
// Redistribution and use in source and binary forms, with or without
|
|
|
|
// modification, are permitted provided that the following conditions are
|
|
|
|
// met:
|
|
|
|
//
|
|
|
|
// * Redistributions of source code must retain the above copyright
|
|
|
|
// notice, this list of conditions and the following disclaimer.
|
|
|
|
// * Redistributions in binary form must reproduce the above
|
|
|
|
// copyright notice, this list of conditions and the following disclaimer
|
|
|
|
// in the documentation and/or other materials provided with the
|
|
|
|
// distribution.
|
|
|
|
// * Neither the name of Google Inc. nor the name Chromium Embedded
|
|
|
|
// Framework nor the names of its contributors may be used to endorse
|
|
|
|
// or promote products derived from this software without specific prior
|
|
|
|
// written permission.
|
|
|
|
//
|
|
|
|
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
|
|
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
|
|
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
|
|
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
|
|
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
|
|
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
|
|
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
|
|
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
|
|
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
|
|
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
|
|
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
|
|
|
2012-01-10 00:46:23 +01:00
|
|
|
#ifndef CEF_INCLUDE_INTERNAL_CEF_STRING_WRAPPERS_H_
|
|
|
|
#define CEF_INCLUDE_INTERNAL_CEF_STRING_WRAPPERS_H_
|
|
|
|
#pragma once
|
|
|
|
|
|
|
|
#include <memory.h>
|
|
|
|
#include <string>
|
|
|
|
#include "include/internal/cef_string_types.h"
|
2010-11-23 15:46:01 +01:00
|
|
|
|
|
|
|
#ifdef BUILDING_CEF_SHARED
|
|
|
|
#include "base/string16.h"
|
|
|
|
#endif
|
2012-01-10 00:46:23 +01:00
|
|
|
|
2010-11-23 15:46:01 +01:00
|
|
|
|
2011-05-31 19:12:37 +02:00
|
|
|
///
|
2010-11-23 15:46:01 +01:00
|
|
|
// Traits implementation for wide character strings.
|
2011-05-31 19:12:37 +02:00
|
|
|
///
|
2010-11-23 15:46:01 +01:00
|
|
|
struct CefStringTraitsWide {
|
|
|
|
typedef wchar_t char_type;
|
|
|
|
typedef cef_string_wide_t struct_type;
|
|
|
|
typedef cef_string_userfree_wide_t userfree_struct_type;
|
2012-01-10 00:46:23 +01:00
|
|
|
|
2010-11-23 15:46:01 +01:00
|
|
|
static inline void clear(struct_type *s) { cef_string_wide_clear(s); }
|
|
|
|
static inline int set(const char_type* src, size_t src_size,
|
2012-01-10 00:46:23 +01:00
|
|
|
struct_type* output, int copy) {
|
|
|
|
return cef_string_wide_set(src, src_size, output, copy);
|
|
|
|
}
|
|
|
|
static inline int compare(const struct_type* s1, const struct_type* s2) {
|
|
|
|
return cef_string_wide_cmp(s1, s2);
|
|
|
|
}
|
|
|
|
static inline userfree_struct_type userfree_alloc() {
|
|
|
|
return cef_string_userfree_wide_alloc();
|
|
|
|
}
|
|
|
|
static inline void userfree_free(userfree_struct_type ufs) {
|
|
|
|
return cef_string_userfree_wide_free(ufs);
|
|
|
|
}
|
2010-11-23 15:46:01 +01:00
|
|
|
|
|
|
|
// Conversion methods.
|
2012-01-10 00:46:23 +01:00
|
|
|
static inline bool from_ascii(const char* str, size_t len, struct_type *s) {
|
2010-11-23 15:46:01 +01:00
|
|
|
return cef_string_ascii_to_wide(str, len, s) ? true : false;
|
|
|
|
}
|
2012-01-10 00:46:23 +01:00
|
|
|
static inline std::string to_string(const struct_type *s) {
|
2010-11-23 15:46:01 +01:00
|
|
|
cef_string_utf8_t cstr;
|
|
|
|
memset(&cstr, 0, sizeof(cstr));
|
|
|
|
cef_string_wide_to_utf8(s->str, s->length, &cstr);
|
|
|
|
std::string str;
|
|
|
|
if (cstr.length > 0)
|
|
|
|
str = std::string(cstr.str, cstr.length);
|
|
|
|
cef_string_utf8_clear(&cstr);
|
|
|
|
return str;
|
|
|
|
}
|
2012-01-10 00:46:23 +01:00
|
|
|
static inline bool from_string(const std::string& str, struct_type *s) {
|
2010-11-23 15:46:01 +01:00
|
|
|
return cef_string_utf8_to_wide(str.c_str(), str.length(), s) ? true : false;
|
|
|
|
}
|
2012-01-10 00:46:23 +01:00
|
|
|
static inline std::wstring to_wstring(const struct_type *s) {
|
2010-11-23 15:46:01 +01:00
|
|
|
return std::wstring(s->str, s->length);
|
|
|
|
}
|
2012-01-10 00:46:23 +01:00
|
|
|
static inline bool from_wstring(const std::wstring& str, struct_type *s) {
|
2010-11-23 15:46:01 +01:00
|
|
|
return cef_string_wide_set(str.c_str(), str.length(), s, true) ?
|
|
|
|
true : false;
|
|
|
|
}
|
|
|
|
#if defined(BUILDING_CEF_SHARED)
|
|
|
|
#if defined(WCHAR_T_IS_UTF32)
|
2012-01-10 00:46:23 +01:00
|
|
|
static inline string16 to_string16(const struct_type *s) {
|
2010-11-23 15:46:01 +01:00
|
|
|
cef_string_utf16_t cstr;
|
|
|
|
memset(&cstr, 0, sizeof(cstr));
|
|
|
|
cef_string_wide_to_utf16(s->str, s->length, &cstr);
|
|
|
|
string16 str;
|
|
|
|
if (cstr.length > 0)
|
|
|
|
str = string16(cstr.str, cstr.length);
|
|
|
|
cef_string_utf16_clear(&cstr);
|
|
|
|
return str;
|
|
|
|
}
|
2012-01-10 00:46:23 +01:00
|
|
|
static inline bool from_string16(const string16& str, struct_type *s) {
|
2010-11-23 15:46:01 +01:00
|
|
|
return cef_string_utf16_to_wide(str.c_str(), str.length(), s) ?
|
|
|
|
true : false;
|
|
|
|
}
|
2012-01-10 00:46:23 +01:00
|
|
|
#else // WCHAR_T_IS_UTF32
|
|
|
|
static inline string16 to_string16(const struct_type *s) {
|
2010-11-23 15:46:01 +01:00
|
|
|
return string16(s->str, s->length);
|
|
|
|
}
|
2012-01-10 00:46:23 +01:00
|
|
|
static inline bool from_string16(const string16& str, struct_type *s) {
|
2010-11-23 15:46:01 +01:00
|
|
|
return cef_string_wide_set(str.c_str(), str.length(), s, true) ?
|
|
|
|
true : false;
|
|
|
|
}
|
2012-01-10 00:46:23 +01:00
|
|
|
#endif // WCHAR_T_IS_UTF32
|
|
|
|
#endif // BUILDING_CEF_SHARED
|
2010-11-23 15:46:01 +01:00
|
|
|
};
|
|
|
|
|
2011-05-31 19:12:37 +02:00
|
|
|
///
|
2010-11-23 15:46:01 +01:00
|
|
|
// Traits implementation for utf8 character strings.
|
2011-05-31 19:12:37 +02:00
|
|
|
///
|
2010-11-23 15:46:01 +01:00
|
|
|
struct CefStringTraitsUTF8 {
|
|
|
|
typedef char char_type;
|
|
|
|
typedef cef_string_utf8_t struct_type;
|
|
|
|
typedef cef_string_userfree_utf8_t userfree_struct_type;
|
2012-01-10 00:46:23 +01:00
|
|
|
|
2010-11-23 15:46:01 +01:00
|
|
|
static inline void clear(struct_type *s) { cef_string_utf8_clear(s); }
|
|
|
|
static inline int set(const char_type* src, size_t src_size,
|
2012-01-10 00:46:23 +01:00
|
|
|
struct_type* output, int copy) {
|
|
|
|
return cef_string_utf8_set(src, src_size, output, copy);
|
|
|
|
}
|
|
|
|
static inline int compare(const struct_type* s1, const struct_type* s2) {
|
|
|
|
return cef_string_utf8_cmp(s1, s2);
|
|
|
|
}
|
|
|
|
static inline userfree_struct_type userfree_alloc() {
|
|
|
|
return cef_string_userfree_utf8_alloc();
|
|
|
|
}
|
|
|
|
static inline void userfree_free(userfree_struct_type ufs) {
|
|
|
|
return cef_string_userfree_utf8_free(ufs);
|
|
|
|
}
|
2010-11-23 15:46:01 +01:00
|
|
|
|
|
|
|
// Conversion methods.
|
2012-01-10 00:46:23 +01:00
|
|
|
static inline bool from_ascii(const char* str, size_t len, struct_type* s) {
|
2010-11-23 15:46:01 +01:00
|
|
|
return cef_string_utf8_copy(str, len, s) ? true : false;
|
|
|
|
}
|
2012-01-10 00:46:23 +01:00
|
|
|
static inline std::string to_string(const struct_type* s) {
|
2010-11-23 15:46:01 +01:00
|
|
|
return std::string(s->str, s->length);
|
|
|
|
}
|
2012-01-10 00:46:23 +01:00
|
|
|
static inline bool from_string(const std::string& str, struct_type* s) {
|
2010-11-23 15:46:01 +01:00
|
|
|
return cef_string_utf8_copy(str.c_str(), str.length(), s) ? true : false;
|
|
|
|
}
|
2012-01-10 00:46:23 +01:00
|
|
|
static inline std::wstring to_wstring(const struct_type* s) {
|
2010-11-23 15:46:01 +01:00
|
|
|
cef_string_wide_t cstr;
|
|
|
|
memset(&cstr, 0, sizeof(cstr));
|
|
|
|
cef_string_utf8_to_wide(s->str, s->length, &cstr);
|
|
|
|
std::wstring str;
|
|
|
|
if (cstr.length > 0)
|
|
|
|
str = std::wstring(cstr.str, cstr.length);
|
|
|
|
cef_string_wide_clear(&cstr);
|
|
|
|
return str;
|
|
|
|
}
|
2012-01-10 00:46:23 +01:00
|
|
|
static inline bool from_wstring(const std::wstring& str, struct_type* s) {
|
2010-11-23 15:46:01 +01:00
|
|
|
return cef_string_wide_to_utf8(str.c_str(), str.length(), s) ? true : false;
|
|
|
|
}
|
|
|
|
#if defined(BUILDING_CEF_SHARED)
|
2012-01-10 00:46:23 +01:00
|
|
|
static inline string16 to_string16(const struct_type* s) {
|
2010-11-23 15:46:01 +01:00
|
|
|
cef_string_utf16_t cstr;
|
|
|
|
memset(&cstr, 0, sizeof(cstr));
|
|
|
|
cef_string_utf8_to_utf16(s->str, s->length, &cstr);
|
|
|
|
string16 str;
|
|
|
|
if (cstr.length > 0)
|
|
|
|
str = string16(cstr.str, cstr.length);
|
|
|
|
cef_string_utf16_clear(&cstr);
|
|
|
|
return str;
|
|
|
|
}
|
2012-01-10 00:46:23 +01:00
|
|
|
static inline bool from_string16(const string16& str, struct_type* s) {
|
2010-11-23 15:46:01 +01:00
|
|
|
return cef_string_utf16_to_utf8(str.c_str(), str.length(), s) ?
|
|
|
|
true : false;
|
|
|
|
}
|
2012-01-10 00:46:23 +01:00
|
|
|
#endif // BUILDING_CEF_SHARED
|
2010-11-23 15:46:01 +01:00
|
|
|
};
|
|
|
|
|
2011-05-31 19:12:37 +02:00
|
|
|
///
|
2010-11-23 15:46:01 +01:00
|
|
|
// Traits implementation for utf16 character strings.
|
2011-05-31 19:12:37 +02:00
|
|
|
///
|
2010-11-23 15:46:01 +01:00
|
|
|
struct CefStringTraitsUTF16 {
|
2011-09-18 03:07:28 +02:00
|
|
|
typedef char16 char_type;
|
2010-11-23 15:46:01 +01:00
|
|
|
typedef cef_string_utf16_t struct_type;
|
|
|
|
typedef cef_string_userfree_utf16_t userfree_struct_type;
|
2012-01-10 00:46:23 +01:00
|
|
|
|
2010-11-23 15:46:01 +01:00
|
|
|
static inline void clear(struct_type *s) { cef_string_utf16_clear(s); }
|
|
|
|
static inline int set(const char_type* src, size_t src_size,
|
2012-01-10 00:46:23 +01:00
|
|
|
struct_type* output, int copy) {
|
|
|
|
return cef_string_utf16_set(src, src_size, output, copy);
|
|
|
|
}
|
|
|
|
static inline int compare(const struct_type* s1, const struct_type* s2) {
|
|
|
|
return cef_string_utf16_cmp(s1, s2);
|
|
|
|
}
|
|
|
|
static inline userfree_struct_type userfree_alloc() {
|
|
|
|
return cef_string_userfree_utf16_alloc();
|
|
|
|
}
|
|
|
|
static inline void userfree_free(userfree_struct_type ufs) {
|
|
|
|
return cef_string_userfree_utf16_free(ufs);
|
|
|
|
}
|
2010-11-23 15:46:01 +01:00
|
|
|
|
|
|
|
// Conversion methods.
|
2012-01-10 00:46:23 +01:00
|
|
|
static inline bool from_ascii(const char* str, size_t len, struct_type* s) {
|
2010-11-23 15:46:01 +01:00
|
|
|
return cef_string_ascii_to_utf16(str, len, s) ? true : false;
|
|
|
|
}
|
2012-01-10 00:46:23 +01:00
|
|
|
static inline std::string to_string(const struct_type* s) {
|
2010-11-23 15:46:01 +01:00
|
|
|
cef_string_utf8_t cstr;
|
|
|
|
memset(&cstr, 0, sizeof(cstr));
|
|
|
|
cef_string_utf16_to_utf8(s->str, s->length, &cstr);
|
|
|
|
std::string str;
|
|
|
|
if (cstr.length > 0)
|
|
|
|
str = std::string(cstr.str, cstr.length);
|
|
|
|
cef_string_utf8_clear(&cstr);
|
|
|
|
return str;
|
|
|
|
}
|
2012-01-10 00:46:23 +01:00
|
|
|
static inline bool from_string(const std::string& str, struct_type* s) {
|
2010-11-23 15:46:01 +01:00
|
|
|
return cef_string_utf8_to_utf16(str.c_str(), str.length(), s) ?
|
|
|
|
true : false;
|
|
|
|
}
|
|
|
|
#if defined(WCHAR_T_IS_UTF32)
|
2012-01-10 00:46:23 +01:00
|
|
|
static inline std::wstring to_wstring(const struct_type* s) {
|
2010-11-23 15:46:01 +01:00
|
|
|
cef_string_wide_t cstr;
|
|
|
|
memset(&cstr, 0, sizeof(cstr));
|
|
|
|
cef_string_utf16_to_wide(s->str, s->length, &cstr);
|
|
|
|
std::wstring str;
|
|
|
|
if (cstr.length > 0)
|
|
|
|
str = std::wstring(cstr.str, cstr.length);
|
|
|
|
cef_string_wide_clear(&cstr);
|
|
|
|
return str;
|
|
|
|
}
|
2012-01-10 00:46:23 +01:00
|
|
|
static inline bool from_wstring(const std::wstring& str, struct_type* s) {
|
2010-11-23 15:46:01 +01:00
|
|
|
return cef_string_wide_to_utf16(str.c_str(), str.length(), s) ?
|
|
|
|
true : false;
|
|
|
|
}
|
2012-01-10 00:46:23 +01:00
|
|
|
#else // WCHAR_T_IS_UTF32
|
|
|
|
static inline std::wstring to_wstring(const struct_type* s) {
|
2010-11-23 15:46:01 +01:00
|
|
|
return std::wstring(s->str, s->length);
|
|
|
|
}
|
2012-01-10 00:46:23 +01:00
|
|
|
static inline bool from_wstring(const std::wstring& str, struct_type* s) {
|
2010-11-23 15:46:01 +01:00
|
|
|
return cef_string_utf16_set(str.c_str(), str.length(), s, true) ?
|
|
|
|
true : false;
|
|
|
|
}
|
2012-01-10 00:46:23 +01:00
|
|
|
#endif // WCHAR_T_IS_UTF32
|
2010-11-23 15:46:01 +01:00
|
|
|
#if defined(BUILDING_CEF_SHARED)
|
2012-01-10 00:46:23 +01:00
|
|
|
static inline string16 to_string16(const struct_type* s) {
|
2010-11-23 15:46:01 +01:00
|
|
|
return string16(s->str, s->length);
|
|
|
|
}
|
2012-01-10 00:46:23 +01:00
|
|
|
static inline bool from_string16(const string16& str, struct_type* s) {
|
2010-11-23 15:46:01 +01:00
|
|
|
return cef_string_utf16_set(str.c_str(), str.length(), s, true) ?
|
|
|
|
true : false;
|
|
|
|
}
|
2012-01-10 00:46:23 +01:00
|
|
|
#endif // BUILDING_CEF_SHARED
|
2010-11-23 15:46:01 +01:00
|
|
|
};
|
|
|
|
|
2011-05-31 19:12:37 +02:00
|
|
|
///
|
|
|
|
// CEF string classes can convert between all supported string types. For
|
|
|
|
// example, the CefStringWide class uses wchar_t as the underlying character
|
|
|
|
// type and provides two approaches for converting data to/from a UTF8 string
|
|
|
|
// (std::string).
|
|
|
|
// <p>
|
|
|
|
// 1. Implicit conversion using the assignment operator overload.
|
|
|
|
// <pre>
|
|
|
|
// CefStringWide aCefString;
|
|
|
|
// std::string aUTF8String;
|
|
|
|
// aCefString = aUTF8String; // Assign std::string to CefStringWide
|
|
|
|
// aUTF8String = aCefString; // Assign CefStringWide to std::string
|
|
|
|
// </pre>
|
|
|
|
// 2. Explicit conversion using the FromString/ToString methods.
|
|
|
|
// <pre>
|
|
|
|
// CefStringWide aCefString;
|
|
|
|
// std::string aUTF8String;
|
|
|
|
// aCefString.FromString(aUTF8String); // Assign std::string to CefStringWide
|
|
|
|
// aUTF8String = aCefString.ToString(); // Assign CefStringWide to std::string
|
|
|
|
// </pre>
|
|
|
|
// Conversion will only occur if the assigned value is a different string type.
|
|
|
|
// Assigning a std::string to a CefStringUTF8, for example, will copy the data
|
|
|
|
// without performing a conversion.
|
|
|
|
// </p>
|
|
|
|
// CEF string classes are safe for reading from multiple threads but not for
|
|
|
|
// modification. It is the user's responsibility to provide synchronization if
|
|
|
|
// modifying CEF strings from multiple threads.
|
|
|
|
///
|
2010-11-23 15:46:01 +01:00
|
|
|
template <class traits>
|
|
|
|
class CefStringBase {
|
2012-01-10 00:46:23 +01:00
|
|
|
public:
|
2010-11-23 15:46:01 +01:00
|
|
|
typedef typename traits::char_type char_type;
|
|
|
|
typedef typename traits::struct_type struct_type;
|
|
|
|
typedef typename traits::userfree_struct_type userfree_struct_type;
|
|
|
|
|
2011-05-31 19:12:37 +02:00
|
|
|
///
|
2010-11-23 15:46:01 +01:00
|
|
|
// Default constructor.
|
2011-05-31 19:12:37 +02:00
|
|
|
///
|
2010-11-23 15:46:01 +01:00
|
|
|
CefStringBase() : string_(NULL), owner_(false) {}
|
2012-01-10 00:46:23 +01:00
|
|
|
|
2011-05-31 19:12:37 +02:00
|
|
|
///
|
2010-11-23 15:46:01 +01:00
|
|
|
// Create a new string from an existing string. Data will always be copied.
|
2011-05-31 19:12:37 +02:00
|
|
|
///
|
2012-01-10 00:46:23 +01:00
|
|
|
CefStringBase(const CefStringBase& str)
|
|
|
|
: string_(NULL), owner_(false) {
|
|
|
|
FromString(str.c_str(), str.length(), true);
|
|
|
|
}
|
|
|
|
|
2011-05-31 19:12:37 +02:00
|
|
|
///
|
2010-11-23 15:46:01 +01:00
|
|
|
// Create a new string from an existing std::string. Data will be always
|
|
|
|
// copied. Translation will occur if necessary based on the underlying string
|
|
|
|
// type.
|
2011-05-31 19:12:37 +02:00
|
|
|
///
|
2012-01-10 00:46:23 +01:00
|
|
|
CefStringBase(const std::string& src) // NOLINT(runtime/explicit)
|
|
|
|
: string_(NULL), owner_(false) {
|
|
|
|
FromString(src);
|
|
|
|
}
|
|
|
|
CefStringBase(const char* src) // NOLINT(runtime/explicit)
|
|
|
|
: string_(NULL), owner_(false) {
|
|
|
|
FromString(std::string(src));
|
|
|
|
}
|
|
|
|
|
2011-05-31 19:12:37 +02:00
|
|
|
///
|
2010-11-23 15:46:01 +01:00
|
|
|
// Create a new string from an existing std::wstring. Data will be always
|
|
|
|
// copied. Translation will occur if necessary based on the underlying string
|
|
|
|
// type.
|
2011-05-31 19:12:37 +02:00
|
|
|
///
|
2012-01-10 00:46:23 +01:00
|
|
|
CefStringBase(const std::wstring& src) // NOLINT(runtime/explicit)
|
|
|
|
: string_(NULL), owner_(false) {
|
|
|
|
FromWString(src);
|
|
|
|
}
|
|
|
|
CefStringBase(const wchar_t* src) // NOLINT(runtime/explicit)
|
|
|
|
: string_(NULL), owner_(false) {
|
|
|
|
FromWString(std::wstring(src));
|
|
|
|
}
|
2010-11-23 15:46:01 +01:00
|
|
|
|
|
|
|
#if (defined(BUILDING_CEF_SHARED) && defined(WCHAR_T_IS_UTF32))
|
2011-05-31 19:12:37 +02:00
|
|
|
///
|
2010-11-23 15:46:01 +01:00
|
|
|
// Create a new string from an existing string16. Data will be always
|
|
|
|
// copied. Translation will occur if necessary based on the underlying string
|
|
|
|
// type.
|
2011-05-31 19:12:37 +02:00
|
|
|
///
|
2012-01-10 00:46:23 +01:00
|
|
|
CefStringBase(const string16& src) // NOLINT(runtime/explicit)
|
|
|
|
: string_(NULL), owner_(false) {
|
|
|
|
FromString16(src);
|
|
|
|
}
|
|
|
|
CefStringBase(const char16* src) // NOLINT(runtime/explicit)
|
|
|
|
: string_(NULL), owner_(false) {
|
|
|
|
FromString16(string16(src));
|
|
|
|
}
|
|
|
|
#endif // BUILDING_CEF_SHARED && WCHAR_T_IS_UTF32
|
|
|
|
|
2011-05-31 19:12:37 +02:00
|
|
|
///
|
2010-11-23 15:46:01 +01:00
|
|
|
// Create a new string from an existing character array. If |copy| is true
|
|
|
|
// this class will copy the data. Otherwise, this class will reference the
|
|
|
|
// existing data. Referenced data must exist for the lifetime of this class
|
|
|
|
// and will not be freed by this class.
|
2011-05-31 19:12:37 +02:00
|
|
|
///
|
2010-11-23 15:46:01 +01:00
|
|
|
CefStringBase(const char_type* src, size_t src_len, bool copy)
|
2012-01-10 00:46:23 +01:00
|
|
|
: string_(NULL), owner_(false) {
|
|
|
|
FromString(src, src_len, copy);
|
|
|
|
}
|
|
|
|
|
2011-05-31 19:12:37 +02:00
|
|
|
///
|
2010-11-23 15:46:01 +01:00
|
|
|
// Create a new string referencing an existing string structure without taking
|
|
|
|
// ownership. Referenced structures must exist for the lifetime of this class
|
|
|
|
// and will not be freed by this class.
|
2011-05-31 19:12:37 +02:00
|
|
|
///
|
2012-01-10 00:46:23 +01:00
|
|
|
CefStringBase(const struct_type* src) // NOLINT(runtime/explicit)
|
|
|
|
: string_(NULL), owner_(false) {
|
2010-11-23 15:46:01 +01:00
|
|
|
if (!src)
|
|
|
|
return;
|
|
|
|
// Reference the existing structure without taking ownership.
|
|
|
|
Attach(const_cast<struct_type*>(src), false);
|
|
|
|
}
|
|
|
|
|
|
|
|
virtual ~CefStringBase() { ClearAndFree(); }
|
|
|
|
|
|
|
|
|
|
|
|
// The following methods are named for compatibility with the standard library
|
|
|
|
// string template types.
|
|
|
|
|
2011-05-31 19:12:37 +02:00
|
|
|
///
|
2010-11-23 15:46:01 +01:00
|
|
|
// Return a read-only pointer to the string data.
|
2011-05-31 19:12:37 +02:00
|
|
|
///
|
2010-11-23 15:46:01 +01:00
|
|
|
const char_type* c_str() const { return (string_ ? string_->str : NULL); }
|
2012-01-10 00:46:23 +01:00
|
|
|
|
2011-05-31 19:12:37 +02:00
|
|
|
///
|
2010-11-23 15:46:01 +01:00
|
|
|
// Return the length of the string data.
|
2011-05-31 19:12:37 +02:00
|
|
|
///
|
2010-11-23 15:46:01 +01:00
|
|
|
size_t length() const { return (string_ ? string_->length : 0); }
|
2012-01-10 00:46:23 +01:00
|
|
|
|
2011-05-31 19:12:37 +02:00
|
|
|
///
|
2010-11-23 15:46:01 +01:00
|
|
|
// Return the length of the string data.
|
2011-05-31 19:12:37 +02:00
|
|
|
///
|
2010-11-23 15:46:01 +01:00
|
|
|
inline size_t size() const { return length(); }
|
2012-01-10 00:46:23 +01:00
|
|
|
|
2011-05-31 19:12:37 +02:00
|
|
|
///
|
2010-11-23 15:46:01 +01:00
|
|
|
// Returns true if the string is empty.
|
2011-05-31 19:12:37 +02:00
|
|
|
///
|
2010-11-23 15:46:01 +01:00
|
|
|
bool empty() const { return (string_ == NULL || string_->length == 0); }
|
|
|
|
|
2011-05-31 19:12:37 +02:00
|
|
|
///
|
2010-11-23 15:46:01 +01:00
|
|
|
// Compare this string to the specified string.
|
2011-05-31 19:12:37 +02:00
|
|
|
///
|
2012-01-10 00:46:23 +01:00
|
|
|
int compare(const CefStringBase& str) const {
|
2010-11-23 15:46:01 +01:00
|
|
|
if (empty() && str.empty())
|
|
|
|
return 0;
|
|
|
|
if (empty())
|
|
|
|
return -1;
|
|
|
|
if (str.empty())
|
|
|
|
return 1;
|
|
|
|
return traits::compare(string_, str.GetStruct());
|
|
|
|
}
|
2012-01-10 00:46:23 +01:00
|
|
|
|
2011-05-31 19:12:37 +02:00
|
|
|
///
|
2010-11-23 15:46:01 +01:00
|
|
|
// Clear the string data.
|
2011-05-31 19:12:37 +02:00
|
|
|
///
|
2012-01-10 00:46:23 +01:00
|
|
|
void clear() {
|
2010-11-23 15:46:01 +01:00
|
|
|
if (!empty())
|
|
|
|
traits::clear(string_);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// The following methods are unique to CEF string template types.
|
|
|
|
|
2011-05-31 19:12:37 +02:00
|
|
|
///
|
2010-11-23 15:46:01 +01:00
|
|
|
// Returns true if this class owns the underlying string structure.
|
2011-05-31 19:12:37 +02:00
|
|
|
///
|
2010-11-23 15:46:01 +01:00
|
|
|
bool IsOwner() const { return owner_; }
|
2012-01-10 00:46:23 +01:00
|
|
|
|
2011-05-31 19:12:37 +02:00
|
|
|
///
|
2010-11-23 15:46:01 +01:00
|
|
|
// Returns a read-only pointer to the underlying string structure. May return
|
|
|
|
// NULL if no structure is currently allocated.
|
2011-05-31 19:12:37 +02:00
|
|
|
///
|
2010-11-23 15:46:01 +01:00
|
|
|
const struct_type* GetStruct() const { return string_; }
|
2012-01-10 00:46:23 +01:00
|
|
|
|
2011-05-31 19:12:37 +02:00
|
|
|
///
|
2010-11-23 15:46:01 +01:00
|
|
|
// Returns a writable pointer to the underlying string structure. Will never
|
|
|
|
// return NULL.
|
2011-05-31 19:12:37 +02:00
|
|
|
///
|
2012-01-10 00:46:23 +01:00
|
|
|
struct_type* GetWritableStruct() {
|
2010-11-23 15:46:01 +01:00
|
|
|
AllocIfNeeded();
|
|
|
|
return string_;
|
|
|
|
}
|
2012-01-10 00:46:23 +01:00
|
|
|
|
2011-05-31 19:12:37 +02:00
|
|
|
///
|
2010-11-23 15:46:01 +01:00
|
|
|
// Clear the state of this class. The underlying string structure and data
|
|
|
|
// will be freed if this class owns the structure.
|
2011-05-31 19:12:37 +02:00
|
|
|
///
|
2012-01-10 00:46:23 +01:00
|
|
|
void ClearAndFree() {
|
2010-11-23 15:46:01 +01:00
|
|
|
if (!string_)
|
|
|
|
return;
|
|
|
|
if (owner_) {
|
|
|
|
clear();
|
|
|
|
delete string_;
|
|
|
|
}
|
|
|
|
string_ = NULL;
|
|
|
|
owner_ = false;
|
|
|
|
}
|
|
|
|
|
2011-05-31 19:12:37 +02:00
|
|
|
///
|
2010-11-23 15:46:01 +01:00
|
|
|
// Attach to the specified string structure. If |owner| is true this class
|
|
|
|
// will take ownership of the structure.
|
2011-05-31 19:12:37 +02:00
|
|
|
///
|
2012-01-10 00:46:23 +01:00
|
|
|
void Attach(struct_type* str, bool owner) {
|
2010-11-23 15:46:01 +01:00
|
|
|
// Free the previous structure and data, if any.
|
|
|
|
ClearAndFree();
|
2012-01-10 00:46:23 +01:00
|
|
|
|
2010-11-23 15:46:01 +01:00
|
|
|
string_ = str;
|
|
|
|
owner_ = owner;
|
|
|
|
}
|
|
|
|
|
2011-05-31 19:12:37 +02:00
|
|
|
///
|
2010-11-23 15:46:01 +01:00
|
|
|
// Take ownership of the specified userfree structure's string data. The
|
|
|
|
// userfree structure itself will be freed. Only use this method with userfree
|
|
|
|
// structures.
|
2011-05-31 19:12:37 +02:00
|
|
|
///
|
2012-01-10 00:46:23 +01:00
|
|
|
void AttachToUserFree(userfree_struct_type str) {
|
2010-11-23 15:46:01 +01:00
|
|
|
// Free the previous structure and data, if any.
|
|
|
|
ClearAndFree();
|
|
|
|
|
|
|
|
if (!str)
|
|
|
|
return;
|
|
|
|
|
|
|
|
AllocIfNeeded();
|
|
|
|
owner_ = true;
|
|
|
|
memcpy(string_, str, sizeof(struct_type));
|
2012-01-10 00:46:23 +01:00
|
|
|
|
2010-11-23 15:46:01 +01:00
|
|
|
// Free the |str| structure but not the data.
|
|
|
|
memset(str, 0, sizeof(struct_type));
|
|
|
|
traits::userfree_free(str);
|
|
|
|
}
|
|
|
|
|
2011-05-31 19:12:37 +02:00
|
|
|
///
|
2010-11-23 15:46:01 +01:00
|
|
|
// Detach from the underlying string structure. To avoid memory leaks only use
|
|
|
|
// this method if you already hold a pointer to the underlying string
|
|
|
|
// structure.
|
2011-05-31 19:12:37 +02:00
|
|
|
///
|
2012-01-10 00:46:23 +01:00
|
|
|
void Detach() {
|
2010-11-23 15:46:01 +01:00
|
|
|
string_ = NULL;
|
|
|
|
owner_ = false;
|
|
|
|
}
|
|
|
|
|
2011-05-31 19:12:37 +02:00
|
|
|
///
|
2010-11-23 15:46:01 +01:00
|
|
|
// Create a userfree structure and give it ownership of this class' string
|
|
|
|
// data. This class will be disassociated from the data. May return NULL if
|
|
|
|
// this string class currently contains no data.
|
2011-05-31 19:12:37 +02:00
|
|
|
///
|
2012-01-10 00:46:23 +01:00
|
|
|
userfree_struct_type DetachToUserFree() {
|
2010-11-23 15:46:01 +01:00
|
|
|
if (empty())
|
|
|
|
return NULL;
|
2012-01-10 00:46:23 +01:00
|
|
|
|
2010-11-23 15:46:01 +01:00
|
|
|
userfree_struct_type str = traits::userfree_alloc();
|
|
|
|
memcpy(str, string_, sizeof(struct_type));
|
2012-01-10 00:46:23 +01:00
|
|
|
|
2010-11-23 15:46:01 +01:00
|
|
|
// Free this class' structure but not the data.
|
|
|
|
memset(string_, 0, sizeof(struct_type));
|
|
|
|
ClearAndFree();
|
|
|
|
|
|
|
|
return str;
|
|
|
|
}
|
|
|
|
|
2011-05-31 19:12:37 +02:00
|
|
|
///
|
2010-11-23 15:46:01 +01:00
|
|
|
// Set this string's data to the specified character array. If |copy| is true
|
|
|
|
// this class will copy the data. Otherwise, this class will reference the
|
|
|
|
// existing data. Referenced data must exist for the lifetime of this class
|
|
|
|
// and will not be freed by this class.
|
2011-05-31 19:12:37 +02:00
|
|
|
///
|
2012-01-10 00:46:23 +01:00
|
|
|
bool FromString(const char_type* src, size_t src_len, bool copy) {
|
2010-11-23 15:46:01 +01:00
|
|
|
if (src == NULL || src_len == 0) {
|
|
|
|
clear();
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
AllocIfNeeded();
|
|
|
|
return traits::set(src, src_len, string_, copy) ? true : false;
|
|
|
|
}
|
2012-01-10 00:46:23 +01:00
|
|
|
|
2011-05-31 19:12:37 +02:00
|
|
|
///
|
2010-11-23 15:46:01 +01:00
|
|
|
// Set this string's data from an existing ASCII string. Data will be always
|
|
|
|
// copied. Translation will occur if necessary based on the underlying string
|
|
|
|
// type.
|
2011-05-31 19:12:37 +02:00
|
|
|
///
|
2012-01-10 00:46:23 +01:00
|
|
|
bool FromASCII(const char* str) {
|
2010-11-23 15:46:01 +01:00
|
|
|
size_t len = str ? strlen(str) : 0;
|
|
|
|
if (len == 0) {
|
|
|
|
clear();
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
AllocIfNeeded();
|
|
|
|
return traits::from_ascii(str, len, string_);
|
|
|
|
}
|
2012-01-10 00:46:23 +01:00
|
|
|
|
2011-05-31 19:12:37 +02:00
|
|
|
///
|
2010-11-23 15:46:01 +01:00
|
|
|
// Return this string's data as a std::string. Translation will occur if
|
|
|
|
// necessary based on the underlying string type.
|
2011-05-31 19:12:37 +02:00
|
|
|
///
|
2012-01-10 00:46:23 +01:00
|
|
|
std::string ToString() const {
|
2010-11-23 15:46:01 +01:00
|
|
|
if (empty())
|
|
|
|
return std::string();
|
|
|
|
return traits::to_string(string_);
|
|
|
|
}
|
2012-01-10 00:46:23 +01:00
|
|
|
|
2011-05-31 19:12:37 +02:00
|
|
|
///
|
2010-11-23 15:46:01 +01:00
|
|
|
// Set this string's data from an existing std::string. Data will be always
|
|
|
|
// copied. Translation will occur if necessary based on the underlying string
|
|
|
|
// type.
|
2011-05-31 19:12:37 +02:00
|
|
|
///
|
2012-01-10 00:46:23 +01:00
|
|
|
bool FromString(const std::string& str) {
|
2010-11-23 15:46:01 +01:00
|
|
|
if (str.empty()) {
|
|
|
|
clear();
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
AllocIfNeeded();
|
|
|
|
return traits::from_string(str, string_);
|
|
|
|
}
|
2012-01-10 00:46:23 +01:00
|
|
|
|
2011-05-31 19:12:37 +02:00
|
|
|
///
|
2010-11-23 15:46:01 +01:00
|
|
|
// Return this string's data as a std::wstring. Translation will occur if
|
|
|
|
// necessary based on the underlying string type.
|
2011-05-31 19:12:37 +02:00
|
|
|
///
|
2012-01-10 00:46:23 +01:00
|
|
|
std::wstring ToWString() const {
|
2010-11-23 15:46:01 +01:00
|
|
|
if (empty())
|
|
|
|
return std::wstring();
|
|
|
|
return traits::to_wstring(string_);
|
|
|
|
}
|
2012-01-10 00:46:23 +01:00
|
|
|
|
2011-05-31 19:12:37 +02:00
|
|
|
///
|
2010-11-23 15:46:01 +01:00
|
|
|
// Set this string's data from an existing std::wstring. Data will be always
|
|
|
|
// copied. Translation will occur if necessary based on the underlying string
|
|
|
|
// type.
|
2011-05-31 19:12:37 +02:00
|
|
|
///
|
2012-01-10 00:46:23 +01:00
|
|
|
bool FromWString(const std::wstring& str) {
|
2010-11-23 15:46:01 +01:00
|
|
|
if (str.empty()) {
|
|
|
|
clear();
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
AllocIfNeeded();
|
|
|
|
return traits::from_wstring(str, string_);
|
|
|
|
}
|
|
|
|
#if defined(BUILDING_CEF_SHARED)
|
2011-05-31 19:12:37 +02:00
|
|
|
///
|
2010-11-23 15:46:01 +01:00
|
|
|
// Return this string's data as a string16. Translation will occur if
|
|
|
|
// necessary based on the underlying string type.
|
2011-05-31 19:12:37 +02:00
|
|
|
///
|
2012-01-10 00:46:23 +01:00
|
|
|
string16 ToString16() const {
|
2010-11-23 15:46:01 +01:00
|
|
|
if (empty())
|
|
|
|
return string16();
|
|
|
|
return traits::to_string16(string_);
|
|
|
|
}
|
2012-01-10 00:46:23 +01:00
|
|
|
|
2011-05-31 19:12:37 +02:00
|
|
|
///
|
2010-11-23 15:46:01 +01:00
|
|
|
// Set this string's data from an existing string16. Data will be always
|
|
|
|
// copied. Translation will occur if necessary based on the underlying string
|
|
|
|
// type.
|
2011-05-31 19:12:37 +02:00
|
|
|
///
|
2012-01-10 00:46:23 +01:00
|
|
|
bool FromString16(const string16& str) {
|
2010-11-23 15:46:01 +01:00
|
|
|
if (str.empty()) {
|
|
|
|
clear();
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
AllocIfNeeded();
|
|
|
|
return traits::from_string16(str, string_);
|
|
|
|
}
|
2012-01-10 00:46:23 +01:00
|
|
|
#endif // BUILDING_CEF_SHARED
|
2010-11-23 15:46:01 +01:00
|
|
|
|
2011-05-31 19:12:37 +02:00
|
|
|
///
|
2010-11-23 15:46:01 +01:00
|
|
|
// Comparison operator overloads.
|
2011-05-31 19:12:37 +02:00
|
|
|
///
|
2012-01-10 00:46:23 +01:00
|
|
|
bool operator<(const CefStringBase& str) const {
|
|
|
|
return (compare(str) < 0);
|
|
|
|
}
|
|
|
|
bool operator<=(const CefStringBase& str) const {
|
|
|
|
return (compare(str) <= 0);
|
|
|
|
}
|
|
|
|
bool operator>(const CefStringBase& str) const {
|
|
|
|
return (compare(str) > 0);
|
|
|
|
}
|
|
|
|
bool operator>=(const CefStringBase& str) const {
|
|
|
|
return (compare(str) >= 0);
|
|
|
|
}
|
|
|
|
bool operator==(const CefStringBase& str) const {
|
|
|
|
return (compare(str) == 0);
|
|
|
|
}
|
|
|
|
bool operator!=(const CefStringBase& str) const {
|
|
|
|
return (compare(str) != 0);
|
|
|
|
}
|
|
|
|
|
2011-05-31 19:12:37 +02:00
|
|
|
///
|
2010-11-23 15:46:01 +01:00
|
|
|
// Assignment operator overloads.
|
2011-05-31 19:12:37 +02:00
|
|
|
///
|
2012-01-10 00:46:23 +01:00
|
|
|
CefStringBase& operator=(const CefStringBase& str) {
|
|
|
|
FromString(str.c_str(), str.length(), true);
|
|
|
|
return *this;
|
|
|
|
}
|
|
|
|
operator std::string() const {
|
|
|
|
return ToString();
|
|
|
|
}
|
|
|
|
CefStringBase& operator=(const std::string& str) {
|
|
|
|
FromString(str);
|
|
|
|
return *this;
|
|
|
|
}
|
|
|
|
CefStringBase& operator=(const char* str) {
|
|
|
|
FromString(std::string(str));
|
|
|
|
return *this;
|
|
|
|
}
|
|
|
|
operator std::wstring() const {
|
|
|
|
return ToWString();
|
|
|
|
}
|
|
|
|
CefStringBase& operator=(const std::wstring& str) {
|
|
|
|
FromWString(str);
|
|
|
|
return *this;
|
|
|
|
}
|
|
|
|
CefStringBase& operator=(const wchar_t* str) {
|
|
|
|
FromWString(std::wstring(str));
|
|
|
|
return *this;
|
|
|
|
}
|
2010-11-23 15:46:01 +01:00
|
|
|
#if (defined(BUILDING_CEF_SHARED) && defined(WCHAR_T_IS_UTF32))
|
2012-01-10 00:46:23 +01:00
|
|
|
operator string16() const {
|
|
|
|
return ToString16();
|
|
|
|
}
|
|
|
|
CefStringBase& operator=(const string16& str) {
|
|
|
|
FromString16(str);
|
|
|
|
return *this;
|
|
|
|
}
|
|
|
|
CefStringBase& operator=(const char16* str) {
|
|
|
|
FromString16(string16(str));
|
|
|
|
return *this;
|
|
|
|
}
|
|
|
|
#endif // BUILDING_CEF_SHARED && WCHAR_T_IS_UTF32
|
|
|
|
|
|
|
|
private:
|
2010-11-23 15:46:01 +01:00
|
|
|
// Allocate the string structure if it doesn't already exist.
|
2012-01-10 00:46:23 +01:00
|
|
|
void AllocIfNeeded() {
|
2010-11-23 15:46:01 +01:00
|
|
|
if (string_ == NULL) {
|
|
|
|
string_ = new struct_type;
|
|
|
|
memset(string_, 0, sizeof(struct_type));
|
|
|
|
owner_ = true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
struct_type* string_;
|
|
|
|
bool owner_;
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
typedef CefStringBase<CefStringTraitsWide> CefStringWide;
|
|
|
|
typedef CefStringBase<CefStringTraitsUTF8> CefStringUTF8;
|
|
|
|
typedef CefStringBase<CefStringTraitsUTF16> CefStringUTF16;
|
|
|
|
|
2012-01-10 00:46:23 +01:00
|
|
|
#endif // CEF_INCLUDE_INTERNAL_CEF_STRING_WRAPPERS_H_
|