11ed7008c34205d4f606ed4436c3bdd8902c4428akjellander@webrtc.org/*
21ed7008c34205d4f606ed4436c3bdd8902c4428akjellander@webrtc.org *  Copyright (c) 2014 The WebRTC project authors. All Rights Reserved.
31ed7008c34205d4f606ed4436c3bdd8902c4428akjellander@webrtc.org *
41ed7008c34205d4f606ed4436c3bdd8902c4428akjellander@webrtc.org *  Use of this source code is governed by a BSD-style license
51ed7008c34205d4f606ed4436c3bdd8902c4428akjellander@webrtc.org *  that can be found in the LICENSE file in the root of the source
61ed7008c34205d4f606ed4436c3bdd8902c4428akjellander@webrtc.org *  tree. An additional intellectual property rights grant can be found
71ed7008c34205d4f606ed4436c3bdd8902c4428akjellander@webrtc.org *  in the file PATENTS.  All contributing project authors may
81ed7008c34205d4f606ed4436c3bdd8902c4428akjellander@webrtc.org *  be found in the AUTHORS file in the root of the source tree.
91ed7008c34205d4f606ed4436c3bdd8902c4428akjellander@webrtc.org */
101ed7008c34205d4f606ed4436c3bdd8902c4428akjellander@webrtc.org
111ed7008c34205d4f606ed4436c3bdd8902c4428akjellander@webrtc.org// Conversion functions for UTF-8 and UTF-16 strings on Windows.
121ed7008c34205d4f606ed4436c3bdd8902c4428akjellander@webrtc.org// Duplicated from talk/base/win32.h.
131ed7008c34205d4f606ed4436c3bdd8902c4428akjellander@webrtc.org#ifndef WEBRTC_SYSTEM_WRAPPERS_INTERFACE_UTF_UTIL_H_
141ed7008c34205d4f606ed4436c3bdd8902c4428akjellander@webrtc.org#define WEBRTC_SYSTEM_WRAPPERS_INTERFACE_UTF_UTIL_H_
151ed7008c34205d4f606ed4436c3bdd8902c4428akjellander@webrtc.org
161ed7008c34205d4f606ed4436c3bdd8902c4428akjellander@webrtc.org#ifdef WIN32
171ed7008c34205d4f606ed4436c3bdd8902c4428akjellander@webrtc.org#include <windows.h>
181ed7008c34205d4f606ed4436c3bdd8902c4428akjellander@webrtc.org#include <string>
191ed7008c34205d4f606ed4436c3bdd8902c4428akjellander@webrtc.org
201ed7008c34205d4f606ed4436c3bdd8902c4428akjellander@webrtc.org#include "webrtc/system_wrappers/interface/scoped_ptr.h"
211ed7008c34205d4f606ed4436c3bdd8902c4428akjellander@webrtc.org
221ed7008c34205d4f606ed4436c3bdd8902c4428akjellander@webrtc.orgnamespace webrtc {
231ed7008c34205d4f606ed4436c3bdd8902c4428akjellander@webrtc.org
241ed7008c34205d4f606ed4436c3bdd8902c4428akjellander@webrtc.orginline std::wstring ToUtf16(const char* utf8, size_t len) {
251ed7008c34205d4f606ed4436c3bdd8902c4428akjellander@webrtc.org  int len16 = ::MultiByteToWideChar(CP_UTF8, 0, utf8, static_cast<int>(len),
261ed7008c34205d4f606ed4436c3bdd8902c4428akjellander@webrtc.org                                    NULL, 0);
271ed7008c34205d4f606ed4436c3bdd8902c4428akjellander@webrtc.org  scoped_ptr<wchar_t[]> ws(new wchar_t[len16]);
281ed7008c34205d4f606ed4436c3bdd8902c4428akjellander@webrtc.org  ::MultiByteToWideChar(CP_UTF8, 0, utf8, static_cast<int>(len), ws.get(),
291ed7008c34205d4f606ed4436c3bdd8902c4428akjellander@webrtc.org                        len16);
301ed7008c34205d4f606ed4436c3bdd8902c4428akjellander@webrtc.org  return std::wstring(ws.get(), len16);
311ed7008c34205d4f606ed4436c3bdd8902c4428akjellander@webrtc.org}
321ed7008c34205d4f606ed4436c3bdd8902c4428akjellander@webrtc.org
331ed7008c34205d4f606ed4436c3bdd8902c4428akjellander@webrtc.orginline std::wstring ToUtf16(const std::string& str) {
341ed7008c34205d4f606ed4436c3bdd8902c4428akjellander@webrtc.org  return ToUtf16(str.data(), str.length());
351ed7008c34205d4f606ed4436c3bdd8902c4428akjellander@webrtc.org}
361ed7008c34205d4f606ed4436c3bdd8902c4428akjellander@webrtc.org
371ed7008c34205d4f606ed4436c3bdd8902c4428akjellander@webrtc.orginline std::string ToUtf8(const wchar_t* wide, size_t len) {
381ed7008c34205d4f606ed4436c3bdd8902c4428akjellander@webrtc.org  int len8 = ::WideCharToMultiByte(CP_UTF8, 0, wide, static_cast<int>(len),
391ed7008c34205d4f606ed4436c3bdd8902c4428akjellander@webrtc.org                                   NULL, 0, NULL, NULL);
401ed7008c34205d4f606ed4436c3bdd8902c4428akjellander@webrtc.org  scoped_ptr<char[]> ns(new char[len8]);
411ed7008c34205d4f606ed4436c3bdd8902c4428akjellander@webrtc.org  ::WideCharToMultiByte(CP_UTF8, 0, wide, static_cast<int>(len), ns.get(), len8,
421ed7008c34205d4f606ed4436c3bdd8902c4428akjellander@webrtc.org                        NULL, NULL);
431ed7008c34205d4f606ed4436c3bdd8902c4428akjellander@webrtc.org  return std::string(ns.get(), len8);
441ed7008c34205d4f606ed4436c3bdd8902c4428akjellander@webrtc.org}
451ed7008c34205d4f606ed4436c3bdd8902c4428akjellander@webrtc.org
461ed7008c34205d4f606ed4436c3bdd8902c4428akjellander@webrtc.orginline std::string ToUtf8(const wchar_t* wide) {
471ed7008c34205d4f606ed4436c3bdd8902c4428akjellander@webrtc.org  return ToUtf8(wide, wcslen(wide));
481ed7008c34205d4f606ed4436c3bdd8902c4428akjellander@webrtc.org}
491ed7008c34205d4f606ed4436c3bdd8902c4428akjellander@webrtc.org
501ed7008c34205d4f606ed4436c3bdd8902c4428akjellander@webrtc.orginline std::string ToUtf8(const std::wstring& wstr) {
511ed7008c34205d4f606ed4436c3bdd8902c4428akjellander@webrtc.org  return ToUtf8(wstr.data(), wstr.length());
521ed7008c34205d4f606ed4436c3bdd8902c4428akjellander@webrtc.org}
531ed7008c34205d4f606ed4436c3bdd8902c4428akjellander@webrtc.org
541ed7008c34205d4f606ed4436c3bdd8902c4428akjellander@webrtc.org}  // namespace webrtc
551ed7008c34205d4f606ed4436c3bdd8902c4428akjellander@webrtc.org
561ed7008c34205d4f606ed4436c3bdd8902c4428akjellander@webrtc.org#endif  // WIN32
571ed7008c34205d4f606ed4436c3bdd8902c4428akjellander@webrtc.org#endif  // WEBRTC_SYSTEM_WRAPPERS_INTERFACE_UTF_UTIL_H_
58