mirror of
https://github.com/reactos/reactos.git
synced 2025-07-04 05:21:22 +00:00
prepare for WINE UNICODE patch
svn path=/trunk/; revision=16392
This commit is contained in:
parent
5c050fc41f
commit
d46e87dfdb
2 changed files with 122 additions and 89 deletions
|
@ -155,52 +155,6 @@ typedef struct {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef __WINE__
|
|
||||||
|
|
||||||
/* functions in unixcalls.c */
|
|
||||||
|
|
||||||
extern void call_getcwd(char* buffer, size_t len);
|
|
||||||
extern void* call_opendir(const char* path);
|
|
||||||
extern int call_readdir(void* pdir, char* name, unsigned* pinode);
|
|
||||||
extern void call_closedir(void* pdir);
|
|
||||||
|
|
||||||
extern int call_stat(
|
|
||||||
const char* path, int* pis_dir,
|
|
||||||
unsigned long* psize_low, unsigned long* psize_high,
|
|
||||||
time_t* patime, time_t* pmtime,
|
|
||||||
unsigned long* plinks
|
|
||||||
);
|
|
||||||
|
|
||||||
/* call vswprintf() in msvcrt.dll */
|
|
||||||
int swprintf(wchar_t* buffer, const wchar_t* fmt, ...)
|
|
||||||
{
|
|
||||||
static int (__cdecl *vswprintf)(wchar_t*, const wchar_t*, va_list);
|
|
||||||
|
|
||||||
va_list ap;
|
|
||||||
int ret;
|
|
||||||
|
|
||||||
if (!vswprintf) {
|
|
||||||
HMODULE hmod = LoadLibraryA("msvcrt");
|
|
||||||
vswprintf = (int(__cdecl*)(wchar_t*,const wchar_t*,va_list)) GetProcAddress(hmod, "vswprintf");
|
|
||||||
}
|
|
||||||
|
|
||||||
va_start(ap, fmt);
|
|
||||||
ret = vswprintf(buffer, fmt, ap);
|
|
||||||
va_end(ap);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
// ugly hack to use alloca() while keeping Wine's developers happy
|
|
||||||
#define HeapAlloc(h,f,s) alloca(s)
|
|
||||||
#define HeapFree(h,f,p)
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
static void read_directory(Entry* dir, LPCTSTR path, SORT_ORDER sortOrder, HWND hwnd);
|
static void read_directory(Entry* dir, LPCTSTR path, SORT_ORDER sortOrder, HWND hwnd);
|
||||||
static void set_curdir(ChildWnd* child, Entry* entry, int idx, HWND hwnd);
|
static void set_curdir(ChildWnd* child, Entry* entry, int idx, HWND hwnd);
|
||||||
static void refresh_child(ChildWnd* child);
|
static void refresh_child(ChildWnd* child);
|
||||||
|
@ -278,6 +232,53 @@ static void display_network_error(HWND hwnd)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef __WINE__
|
||||||
|
|
||||||
|
#ifdef UNICODE
|
||||||
|
|
||||||
|
/* call vswprintf() in msvcrt.dll */
|
||||||
|
/*TODO: fix swprintf() in non-msvcrt mode, so that this dynamic linking function can be removed */
|
||||||
|
static int msvcrt_swprintf(WCHAR* buffer, const WCHAR* fmt, ...)
|
||||||
|
{
|
||||||
|
static int (__cdecl *pvswprintf)(WCHAR*, const WCHAR*, va_list) = NULL;
|
||||||
|
va_list ap;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
if (!pvswprintf) {
|
||||||
|
HMODULE hModMsvcrt = LoadLibraryA("msvcrt");
|
||||||
|
pvswprintf = (int(__cdecl*)(WCHAR*,const WCHAR*,va_list)) GetProcAddress(hModMsvcrt, "vswprintf");
|
||||||
|
}
|
||||||
|
|
||||||
|
va_start(ap, fmt);
|
||||||
|
ret = (*pvswprintf)(buffer, fmt, ap);
|
||||||
|
va_end(ap);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
static LPCWSTR my_wcsrchr(LPCWSTR str, WCHAR c)
|
||||||
|
{
|
||||||
|
LPCWSTR p = str;
|
||||||
|
|
||||||
|
while(*p)
|
||||||
|
++p;
|
||||||
|
|
||||||
|
do {
|
||||||
|
if (--p < str)
|
||||||
|
return NULL;
|
||||||
|
} while(*p != c);
|
||||||
|
|
||||||
|
return p;
|
||||||
|
}
|
||||||
|
|
||||||
|
#define _tcsrchr my_wcsrchr
|
||||||
|
#else /* UNICODE */
|
||||||
|
#define _tcsrchr strrchr
|
||||||
|
#endif /* UNICODE */
|
||||||
|
|
||||||
|
#endif /* __WINE__ */
|
||||||
|
|
||||||
|
|
||||||
/* allocate and initialise a directory entry */
|
/* allocate and initialise a directory entry */
|
||||||
static Entry* alloc_entry(void)
|
static Entry* alloc_entry(void)
|
||||||
{
|
{
|
||||||
|
@ -677,7 +678,6 @@ static LPWSTR wcscpyn(LPWSTR dest, LPCWSTR source, size_t count)
|
||||||
return dest;
|
return dest;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void get_strretA(STRRET* str, const SHITEMID* shiid, LPSTR buffer, int len)
|
static void get_strretA(STRRET* str, const SHITEMID* shiid, LPSTR buffer, int len)
|
||||||
{
|
{
|
||||||
switch(str->uType) {
|
switch(str->uType) {
|
||||||
|
@ -694,6 +694,35 @@ static void get_strretA(STRRET* str, const SHITEMID* shiid, LPSTR buffer, int le
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static HRESULT path_from_pidlA(IShellFolder* folder, LPITEMIDLIST pidl, LPSTR buffer, int len)
|
||||||
|
{
|
||||||
|
STRRET str;
|
||||||
|
|
||||||
|
/* SHGDN_FORPARSING: get full path of id list */
|
||||||
|
HRESULT hr = (*folder->lpVtbl->GetDisplayNameOf)(folder, pidl, SHGDN_FORPARSING, &str);
|
||||||
|
|
||||||
|
if (SUCCEEDED(hr)) {
|
||||||
|
get_strretA(&str, &pidl->mkid, buffer, len);
|
||||||
|
free_strret(&str);
|
||||||
|
} else
|
||||||
|
buffer[0] = '\0';
|
||||||
|
|
||||||
|
return hr;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static LPWSTR wcscpyn(LPWSTR dest, LPCWSTR source, size_t count)
|
||||||
|
{
|
||||||
|
LPCWSTR s;
|
||||||
|
LPWSTR d = dest;
|
||||||
|
|
||||||
|
for(s=source; count&&(*d++=*s++); )
|
||||||
|
count--;
|
||||||
|
|
||||||
|
return dest;
|
||||||
|
}
|
||||||
|
|
||||||
static void get_strretW(STRRET* str, const SHITEMID* shiid, LPWSTR buffer, int len)
|
static void get_strretW(STRRET* str, const SHITEMID* shiid, LPWSTR buffer, int len)
|
||||||
{
|
{
|
||||||
switch(str->uType) {
|
switch(str->uType) {
|
||||||
|
@ -711,13 +740,6 @@ static void get_strretW(STRRET* str, const SHITEMID* shiid, LPWSTR buffer, int l
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void free_strret(STRRET* str)
|
|
||||||
{
|
|
||||||
if (str->uType == STRRET_WSTR)
|
|
||||||
(*Globals.iMalloc->lpVtbl->Free)(Globals.iMalloc, str->UNION_MEMBER(pOleStr));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static HRESULT name_from_pidl(IShellFolder* folder, LPITEMIDLIST pidl, LPTSTR buffer, int len, SHGDNF flags)
|
static HRESULT name_from_pidl(IShellFolder* folder, LPITEMIDLIST pidl, LPTSTR buffer, int len, SHGDNF flags)
|
||||||
{
|
{
|
||||||
STRRET str;
|
STRRET str;
|
||||||
|
@ -734,22 +756,6 @@ static HRESULT name_from_pidl(IShellFolder* folder, LPITEMIDLIST pidl, LPTSTR bu
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static HRESULT path_from_pidlA(IShellFolder* folder, LPITEMIDLIST pidl, LPSTR buffer, int len)
|
|
||||||
{
|
|
||||||
STRRET str;
|
|
||||||
|
|
||||||
/* SHGDN_FORPARSING: get full path of id list */
|
|
||||||
HRESULT hr = (*folder->lpVtbl->GetDisplayNameOf)(folder, pidl, SHGDN_FORPARSING, &str);
|
|
||||||
|
|
||||||
if (SUCCEEDED(hr)) {
|
|
||||||
get_strretA(&str, &pidl->mkid, buffer, len);
|
|
||||||
free_strret(&str);
|
|
||||||
} else
|
|
||||||
buffer[0] = '\0';
|
|
||||||
|
|
||||||
return hr;
|
|
||||||
}
|
|
||||||
|
|
||||||
static HRESULT path_from_pidlW(IShellFolder* folder, LPITEMIDLIST pidl, LPWSTR buffer, int len)
|
static HRESULT path_from_pidlW(IShellFolder* folder, LPITEMIDLIST pidl, LPWSTR buffer, int len)
|
||||||
{
|
{
|
||||||
STRRET str;
|
STRRET str;
|
||||||
|
@ -2697,12 +2703,12 @@ static BOOL pattern_match(LPCTSTR str, LPCTSTR pattern)
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
||||||
for(; *str; str++)
|
for(; *str; str++)
|
||||||
if (_totupper(*str)==_totupper(*pattern) && pattern_match(str, pattern))
|
if (*str==*pattern && pattern_match(str, pattern))
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
else if (_totupper(*str)!=_totupper(*pattern) && *pattern!='?')
|
else if (*str!=*pattern && *pattern!='?')
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2713,6 +2719,18 @@ static BOOL pattern_match(LPCTSTR str, LPCTSTR pattern)
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static BOOL pattern_match_ncase(LPCTSTR str, LPCTSTR pattern)
|
||||||
|
{
|
||||||
|
TCHAR b1[BUFFER_LEN], b2[BUFFER_LEN];
|
||||||
|
|
||||||
|
lstrcpy(b1, str);
|
||||||
|
lstrcpy(b2, pattern);
|
||||||
|
CharUpper(b1);
|
||||||
|
CharUpper(b2);
|
||||||
|
|
||||||
|
return pattern_match(b1, b2);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
enum FILE_TYPE {
|
enum FILE_TYPE {
|
||||||
FT_OTHER = 0,
|
FT_OTHER = 0,
|
||||||
|
@ -2757,7 +2775,7 @@ static int insert_entries(Pane* pane, Entry* dir, LPCTSTR pattern, int filter_fl
|
||||||
|
|
||||||
/* filter using the file name pattern */
|
/* filter using the file name pattern */
|
||||||
if (pattern)
|
if (pattern)
|
||||||
if (!pattern_match(entry->data.cFileName, pattern))
|
if (!pattern_match_ncase(entry->data.cFileName, pattern))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
/* filter system and hidden files */
|
/* filter system and hidden files */
|
||||||
|
@ -3826,20 +3844,6 @@ static BOOL launch_file(HWND hwnd, LPCTSTR cmd, UINT nCmdShow)
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef UNICODE
|
|
||||||
static BOOL launch_fileA(HWND hwnd, LPSTR cmd, UINT nCmdShow)
|
|
||||||
{
|
|
||||||
HINSTANCE hinst = ShellExecuteA(hwnd, NULL/*operation*/, cmd, NULL/*parameters*/, NULL/*dir*/, nCmdShow);
|
|
||||||
|
|
||||||
if ((int)hinst <= 32) {
|
|
||||||
display_error(hwnd, GetLastError());
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
static BOOL launch_entry(Entry* entry, HWND hwnd, UINT nCmdShow)
|
static BOOL launch_entry(Entry* entry, HWND hwnd, UINT nCmdShow)
|
||||||
{
|
{
|
||||||
|
|
|
@ -36,17 +36,20 @@
|
||||||
|
|
||||||
#ifdef UNICODE
|
#ifdef UNICODE
|
||||||
#define _UNICODE
|
#define _UNICODE
|
||||||
#include <wchar.h>
|
|
||||||
#endif
|
#endif
|
||||||
#include <tchar.h>
|
|
||||||
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
#include <locale.h>
|
#include <locale.h>
|
||||||
|
#include <time.h>
|
||||||
|
|
||||||
#ifndef __WINE__
|
#ifndef __WINE__
|
||||||
#include <malloc.h> /* for alloca() */
|
#include <malloc.h> /* for alloca() */
|
||||||
|
|
||||||
|
// ugly hack to use alloca() while keeping Wine's developers happy
|
||||||
|
#define HeapAlloc(h,f,s) alloca(s)
|
||||||
|
#define HeapFree(h,f,p)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <shellapi.h> /* for ShellExecute() */
|
#include <shellapi.h> /* for ShellExecute() */
|
||||||
|
@ -145,12 +148,38 @@ typedef struct
|
||||||
extern WINEFILE_GLOBALS Globals;
|
extern WINEFILE_GLOBALS Globals;
|
||||||
|
|
||||||
#ifdef __WINE__
|
#ifdef __WINE__
|
||||||
|
|
||||||
extern void WineLicense(HWND hwnd);
|
extern void WineLicense(HWND hwnd);
|
||||||
extern void WineWarranty(HWND hwnd);
|
extern void WineWarranty(HWND hwnd);
|
||||||
|
|
||||||
|
|
||||||
#ifdef UNICODE
|
#ifdef UNICODE
|
||||||
extern void _wsplitpath(const WCHAR* path, WCHAR* drv, WCHAR* dir, WCHAR* name, WCHAR* ext);
|
extern void _wsplitpath(const WCHAR* path, WCHAR* drv, WCHAR* dir, WCHAR* name, WCHAR* ext);
|
||||||
|
#define _tsplitpath _wsplitpath
|
||||||
|
#define _stprintf msvcrt_swprintf
|
||||||
#else
|
#else
|
||||||
extern void _splitpath(const CHAR* path, CHAR* drv, CHAR* dir, CHAR* name, CHAR* ext);
|
extern void _splitpath(const CHAR* path, CHAR* drv, CHAR* dir, CHAR* name, CHAR* ext);
|
||||||
|
#define _tsplitpath _splitpath
|
||||||
|
#define _stprintf sprintf
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/* functions in unixcalls.c */
|
||||||
|
|
||||||
|
extern void call_getcwd(char* buffer, size_t len);
|
||||||
|
extern void* call_opendir(const char* path);
|
||||||
|
extern int call_readdir(void* pdir, char* name, unsigned* pinode);
|
||||||
|
extern void call_closedir(void* pdir);
|
||||||
|
|
||||||
|
extern int call_stat(
|
||||||
|
const char* path, int* pis_dir,
|
||||||
|
unsigned long* psize_low, unsigned long* psize_high,
|
||||||
|
time_t* patime, time_t* pmtime,
|
||||||
|
unsigned long* plinks
|
||||||
|
);
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
#include <tchar.h> /* for _tsplitpath() */
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue