]>
git.saurik.com Git - wxWidgets.git/blob - src/msw/mslu.cpp
   1 ///////////////////////////////////////////////////////////////////////////// 
   3 // Purpose:     Fixes for bugs in MSLU 
   4 // Author:      Vaclav Slavik 
   8 // Copyright:   (c) 2002 Vaclav Slavik 
   9 // Licence:     wxWindows licence 
  10 ///////////////////////////////////////////////////////////////////////////// 
  12 #if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) 
  13 #pragma implementation 
  16 // For compilers that support precompilation, includes "wx.h". 
  17 #include "wx/wxprec.h" 
  28 #if wxUSE_UNICODE_MSLU 
  30 //------------------------------------------------------------------------ 
  32 // NB: MSLU only covers Win32 API, it doesn't provide Unicode implementation of 
  33 //     libc functions. Unfortunately, some of MSVCRT wchar_t functions 
  34 //     (e.g. _wopen) don't work on Windows 9x, so we have to workaround it 
  35 //     by calling the char version. We still want to use wchar_t version on 
  36 //     NT/2000/XP, though, because they allow for Unicode file names. 
  38 //     Moreover, there are bugs in unicows.dll, of course. We have to 
  39 //     workaround them, too. 
  41 //------------------------------------------------------------------------ 
  43 #include "wx/msw/private.h" 
  44 #include "wx/msw/mslu.h" 
  54 // Undef redirection macros defined in wx/msw/mslu.h: 
  56 #undef GetOpenFileNameW 
  57 #undef GetSaveFileNameW 
  59 //------------------------------------------------------------------------ 
  60 // Wrongly implemented functions from unicows.dll 
  61 //------------------------------------------------------------------------ 
  65 WXDLLEXPORT 
int  wxMSLU_DrawStateW(WXHDC dc
, WXHBRUSH br
, WXFARPROC outputFunc
, 
  66                                    WXLPARAM lData
, WXWPARAM wData
, 
  67                                    int x
, int y
, int cx
, int cy
, 
  70     // VS: There's yet another bug in MSLU: DrawStateW behaves like if it was 
  71     //     expecting char*, not wchar_t* input. We have to use DrawStateA 
  74     if ( wxUsingUnicowsDll() ) 
  76         return DrawStateA((HDC
)dc
, (HBRUSH
)br
, (DRAWSTATEPROC
)outputFunc
, 
  78                                 wxConvLocal
.cWX2MB((const wxChar
*)lData
), 
  79                           wData
, x
, y
, cx
, cy
, flags
); 
  83         return DrawStateW((HDC
)dc
, (HBRUSH
)br
, (DRAWSTATEPROC
)outputFunc
, 
  84                           lData
, wData
, x
, y
, cx
, cy
, flags
); 
  88 static void wxFixOPENFILENAME(LPOPENFILENAME ofn
) 
  91     // VS: there's a bug in unicows.dll - when multiple files are selected, 
  92     //     of.nFileOffset doesn't point to the first filename but rather to 
  93     //     the last component of directory name. This bug is known to MSLU 
  94     //     developers, but they are not going to fix it: "this is a true 
  95     //     limitation, that we have decided to live with" and "working 
  96     //     harder on this case just did not seem worth the effort"... 
  98     //     Our only option is to try to fix it ourselves: 
 100     if ( (ofn
->Flags 
& OFN_ALLOWMULTISELECT
) && 
 101          ofn
->lpstrFile
[ofn
->nFileOffset
-1] != wxT('\0') ) 
 103         if ( wxDirExists(ofn
->lpstrFile
) ) 
 105             // 1st component is dir => multiple files selected 
 106             ofn
->nFileOffset 
= wxStrlen(ofn
->lpstrFile
)+1; 
 112 WXDLLEXPORT 
int wxMSLU_GetOpenFileNameW(void *ofn
) 
 114     int ret 
= GetOpenFileName((LPOPENFILENAME
)ofn
); 
 115     if ( wxUsingUnicowsDll() && ret 
!= 0 ) 
 116         wxFixOPENFILENAME((LPOPENFILENAME
)ofn
); 
 120 WXDLLEXPORT 
int wxMSLU_GetSaveFileNameW(void *ofn
) 
 122     int ret 
= GetSaveFileName((LPOPENFILENAME
)ofn
); 
 123     if ( wxUsingUnicowsDll() && ret 
!= 0 ) 
 124         wxFixOPENFILENAME((LPOPENFILENAME
)ofn
); 
 130 //------------------------------------------------------------------------ 
 131 // Missing libc file manipulation functions in Win9x 
 132 //------------------------------------------------------------------------ 
 136 WXDLLEXPORT 
int wxMSLU__trename(const wxChar 
*oldname
, const wxChar 
*newname
) 
 138     if ( wxUsingUnicowsDll() ) 
 139         return rename(wxConvFile
.cWX2MB(oldname
), wxConvFile
.cWX2MB(newname
)); 
 141         return _trename(oldname
, newname
); 
 144 WXDLLEXPORT 
int wxMSLU__tremove(const wxChar 
*name
) 
 146     if ( wxUsingUnicowsDll() ) 
 147         return remove(wxConvFile
.cWX2MB(name
)); 
 149         return _tremove(name
); 
 152 #if defined( __VISUALC__ ) \ 
 153     || ( defined(__MINGW32__) && wxCHECK_W32API_VERSION( 0, 5 ) ) \ 
 154     || ( defined(__MWERKS__) && defined(__WXMSW__) ) \ 
 155     || ( defined(__BORLANDC__) && (__BORLANDC__ > 0x460) ) 
 157 WXDLLEXPORT 
int wxMSLU__wopen(const wxChar 
*name
, int flags
, int mode
) 
 159     if ( wxUsingUnicowsDll() ) 
 161         return open(wxConvFile
.cWX2MB(name
), flags
, mode
); 
 163         return _open(wxConvFile
.cWX2MB(name
), flags
, mode
); 
 166         return _wopen(name
, flags
, mode
); 
 169 WXDLLEXPORT 
int wxMSLU__waccess(const wxChar 
*name
, int mode
) 
 171     if ( wxUsingUnicowsDll() ) 
 172         return _access(wxConvFile
.cWX2MB(name
), mode
); 
 174         return _waccess(name
, mode
); 
 177 WXDLLEXPORT 
int wxMSLU__wmkdir(const wxChar 
*name
) 
 179     if ( wxUsingUnicowsDll() ) 
 180         return _mkdir(wxConvFile
.cWX2MB(name
)); 
 182         return _wmkdir(name
); 
 185 WXDLLEXPORT 
int wxMSLU__wrmdir(const wxChar 
*name
) 
 187     if ( wxUsingUnicowsDll() ) 
 188         return _rmdir(wxConvFile
.cWX2MB(name
)); 
 190         return _wrmdir(name
); 
 193 WXDLLEXPORT 
int wxMSLU__wstat(const wxChar 
*name
, struct _stat 
*buffer
) 
 195     if ( wxUsingUnicowsDll() ) 
 196         return _stat((const char*)wxConvFile
.cWX2MB(name
), buffer
); 
 198         return _wstat(name
, buffer
); 
 201 #endif // compilers having wopen() &c 
 205 #endif // wxUSE_UNICODE_MSLU