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