1c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved.
2c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Use of this source code is governed by a BSD-style license that can be
3c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// found in the LICENSE file.
4c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
5c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "base/sys_string_conversions.h"
6c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
7c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <windows.h>
8c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
9c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "base/string_piece.h"
10c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
11c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottnamespace base {
12c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
13c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Do not assert in this function since it is used by the asssertion code!
14c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstd::string SysWideToUTF8(const std::wstring& wide) {
15c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  return SysWideToMultiByte(wide, CP_UTF8);
16c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
17c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
18c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Do not assert in this function since it is used by the asssertion code!
19c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstd::wstring SysUTF8ToWide(const StringPiece& utf8) {
20c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  return SysMultiByteToWide(utf8, CP_UTF8);
21c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
22c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
23c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstd::string SysWideToNativeMB(const std::wstring& wide) {
24c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  return SysWideToMultiByte(wide, CP_ACP);
25c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
26c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
27c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstd::wstring SysNativeMBToWide(const StringPiece& native_mb) {
28c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  return SysMultiByteToWide(native_mb, CP_ACP);
29c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
30c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
31c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Do not assert in this function since it is used by the asssertion code!
32c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstd::wstring SysMultiByteToWide(const StringPiece& mb, uint32 code_page) {
33c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  if (mb.empty())
34c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    return std::wstring();
35c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
36c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  int mb_length = static_cast<int>(mb.length());
37c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Compute the length of the buffer.
38c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  int charcount = MultiByteToWideChar(code_page, 0,
39c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                      mb.data(), mb_length, NULL, 0);
40c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  if (charcount == 0)
41c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    return std::wstring();
42c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
43c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  std::wstring wide;
44c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  wide.resize(charcount);
45c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  MultiByteToWideChar(code_page, 0, mb.data(), mb_length, &wide[0], charcount);
46c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
47c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  return wide;
48c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
49c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
50c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Do not assert in this function since it is used by the asssertion code!
51c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstd::string SysWideToMultiByte(const std::wstring& wide, uint32 code_page) {
52c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  int wide_length = static_cast<int>(wide.length());
53c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  if (wide_length == 0)
54c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    return std::string();
55c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
56c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Compute the length of the buffer we'll need.
57c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  int charcount = WideCharToMultiByte(code_page, 0, wide.data(), wide_length,
58c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                      NULL, 0, NULL, NULL);
59c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  if (charcount == 0)
60c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    return std::string();
61c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
62c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  std::string mb;
63c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  mb.resize(charcount);
64c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  WideCharToMultiByte(code_page, 0, wide.data(), wide_length,
65c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                      &mb[0], charcount, NULL, NULL);
66c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
67c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  return mb;
68c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
69c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
70c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}  // namespace base
71