1 //  filesystem windows_file_codecvt.cpp  -----------------------------------------//
2 
3 //  Copyright Beman Dawes 2009
4 
5 //  Distributed under the Boost Software License, Version 1.0.
6 //  See http://www.boost.org/LICENSE_1_0.txt
7 
8 //  Library home page: http://www.boost.org/libs/filesystem
9 
10 //--------------------------------------------------------------------------------------//
11 
12 // define BOOST_FILESYSTEM_SOURCE so that <boost/system/config.hpp> knows
13 // the library is being built (possibly exporting rather than importing code)
14 #define BOOST_FILESYSTEM_SOURCE
15 
16 #ifndef BOOST_SYSTEM_NO_DEPRECATED
17 # define BOOST_SYSTEM_NO_DEPRECATED
18 #endif
19 
20 #include <boost/filesystem/config.hpp>
21 #include <cwchar>  // for mbstate_t
22 
23 #ifdef BOOST_WINDOWS_API
24 
25 #include "windows_file_codecvt.hpp"
26 
27 // Versions of MinGW prior to GCC 4.6 requires this
28 #ifndef WINVER
29 # define WINVER 0x0500
30 #endif
31 
32 #include <windows.h>
33 
do_in(std::mbstate_t &,const char * from,const char * from_end,const char * & from_next,wchar_t * to,wchar_t * to_end,wchar_t * & to_next) const34   std::codecvt_base::result windows_file_codecvt::do_in(
35     std::mbstate_t &,
36     const char* from, const char* from_end, const char*& from_next,
37     wchar_t* to, wchar_t* to_end, wchar_t*& to_next) const
38   {
39     UINT codepage = AreFileApisANSI() ? CP_ACP : CP_OEMCP;
40 
41     int count;
42     if ((count = ::MultiByteToWideChar(codepage, MB_PRECOMPOSED, from,
43       from_end - from, to, to_end - to)) == 0)
44     {
45       return error;  // conversion failed
46     }
47 
48     from_next = from_end;
49     to_next = to + count;
50     *to_next = L'\0';
51     return ok;
52  }
53 
do_out(std::mbstate_t &,const wchar_t * from,const wchar_t * from_end,const wchar_t * & from_next,char * to,char * to_end,char * & to_next) const54   std::codecvt_base::result windows_file_codecvt::do_out(
55     std::mbstate_t &,
56     const wchar_t* from, const wchar_t* from_end, const wchar_t*  & from_next,
57     char* to, char* to_end, char* & to_next) const
58   {
59     UINT codepage = AreFileApisANSI() ? CP_ACP : CP_OEMCP;
60 
61     int count;
62     if ((count = ::WideCharToMultiByte(codepage, WC_NO_BEST_FIT_CHARS, from,
63       from_end - from, to, to_end - to, 0, 0)) == 0)
64     {
65       return error;  // conversion failed
66     }
67 
68     from_next = from_end;
69     to_next = to + count;
70     *to_next = '\0';
71     return ok;
72   }
73 
74   # endif  // BOOST_WINDOWS_API
75 
76