Changed some string-shell32 functions to 32AW, parameter are

os depending 32A or 32W (-winver nt351 or nt40), some new functions.
Some fixes in ole2nls.
New OLE2NLS_CheckLocale() to handle Locale_User_Default and
Locale_System_Default.
Shell32 now dynamicly links to DPA_*(), comdlg32 works again
(comctl32 heap alloc patch broke it).
This commit is contained in:
Juergen Schmied 1998-10-24 09:22:57 +00:00 committed by Alexandre Julliard
parent a29dab2ee8
commit e8d281d45a
13 changed files with 554 additions and 247 deletions

View File

@ -313,9 +313,11 @@ static HRESULT WINAPI IDataObject_GetData (LPDATAOBJECT this, LPFORMATETC32 pfor
{ return(E_UNEXPECTED);
}
pidl = this->lpill->lpvtbl->fnGetElement(this->lpill, 0);
pdump(this->pidl);
pdump(pidl);
/*hack*/
/*hack consider only the first item*/
cItems = 2;
size = sizeof(CIDA) + sizeof (UINT32)*(cItems-1);
size1 = ILGetSize (this->pidl);

View File

@ -220,7 +220,7 @@ static BOOL32 WINAPI IEnumIDList_CreateEnumList(LPENUMIDLIST this, LPCSTR lpszPa
if (lpszPath && lpszPath[0]!='\0')
{ strcpy(szPath, lpszPath);
PathAddBackslash(szPath);
PathAddBackslash32A(szPath);
strcat(szPath,"*.*");
}

View File

@ -22,6 +22,7 @@
#include "winnls.h"
#include "winproc.h"
#include "commctrl.h"
#include "winversion.h"
#include "shell32_main.h"
#include "pidl.h"
@ -313,17 +314,21 @@ DWORD WINAPI ILFree(LPVOID pidl)
* ILCreateFromPath [SHELL32.157]
*
*/
LPITEMIDLIST WINAPI ILCreateFromPath(LPSTR path)
LPITEMIDLIST WINAPI ILCreateFromPath(LPVOID path)
{ LPSHELLFOLDER shellfolder;
LPITEMIDLIST pidlnew;
CHAR pszTemp[MAX_PATH*2];
LPWSTR lpszDisplayName = (LPWSTR)&pszTemp[0];
WCHAR lpszDisplayName[MAX_PATH];
DWORD pchEaten;
TRACE(pidl,"(path=%s)\n",path);
LocalToWideChar32(lpszDisplayName, path, MAX_PATH);
if ( !VERSION_OsIsUnicode())
{ TRACE(pidl,"(path=%s)\n",(LPSTR)path);
LocalToWideChar32(lpszDisplayName, path, MAX_PATH);
}
else
{ TRACE(pidl,"(path=L%s)\n",debugstr_w(path));
lstrcpy32W(lpszDisplayName, path);
}
if (SHGetDesktopFolder(&shellfolder)==S_OK)
{ shellfolder->lpvtbl->fnParseDisplayName(shellfolder,0, NULL,lpszDisplayName,&pchEaten,&pidlnew,NULL);
shellfolder->lpvtbl->fnRelease(shellfolder);
@ -532,7 +537,7 @@ DWORD WINAPI _ILGetFolderText(LPCITEMIDLIST pidl,LPSTR lpszPath, DWORD dwSize)
}
pText = _ILGetTextPointer(pData->type,pData);
strcat(lpszPath, pText);
PathAddBackslash(lpszPath);
PathAddBackslash32A(lpszPath);
dwCopied += strlen(pText) + 1;
pidlTemp = ILGetNext(pidlTemp);
@ -873,7 +878,7 @@ static UINT32 WINAPI IDLList_GetState(LPIDLLIST this)
}
static LPITEMIDLIST WINAPI IDLList_GetElement(LPIDLLIST this, UINT32 nIndex)
{ TRACE (shell,"(%p)->(index=%u)\n",this, nIndex);
return((LPITEMIDLIST)DPA_GetPtr(this->dpa, nIndex));
return((LPITEMIDLIST)pDPA_GetPtr(this->dpa, nIndex));
}
static UINT32 WINAPI IDLList_GetCount(LPIDLLIST this)
{ TRACE (shell,"(%p)\n",this);
@ -882,7 +887,7 @@ static UINT32 WINAPI IDLList_GetCount(LPIDLLIST this)
static BOOL32 WINAPI IDLList_StoreItem(LPIDLLIST this, LPITEMIDLIST pidl)
{ TRACE (shell,"(%p)->(pidl=%p)\n",this, pidl);
if (pidl)
{ if (IDLList_InitList(this) && DPA_InsertPtr(this->dpa, 0x7fff, (LPSTR)pidl)>=0)
{ if (IDLList_InitList(this) && pDPA_InsertPtr(this->dpa, 0x7fff, (LPSTR)pidl)>=0)
return(TRUE);
ILFree(pidl);
}
@ -910,7 +915,7 @@ static BOOL32 WINAPI IDLList_InitList(LPIDLLIST this)
case State_UnInit:
default:
this->dpa = DPA_Create(this->uStep);
this->dpa = pDPA_Create(this->uStep);
this->uStep = 0;
return(IDLList_InitList(this));
}
@ -933,6 +938,6 @@ static void WINAPI IDLList_CleanList(LPIDLLIST this)
{ ILFree(IDLList_GetElement(this,i));
}
DPA_Destroy(this->dpa);
pDPA_Destroy(this->dpa);
this->dpa=NULL;
}

View File

@ -483,6 +483,7 @@ HRESULT WINAPI SHGetSpecialFolderLocation(HWND32 hwndOwner, INT32 nFolder, LPITE
tFolder=FT_DESKTOP;
break;
case CSIDL_DESKTOPDIRECTORY:
case CSIDL_COMMON_DESKTOPDIRECTORY:
strcpy (buffer,"Desktop");
break;
case CSIDL_DRIVES:
@ -496,11 +497,17 @@ HRESULT WINAPI SHGetSpecialFolderLocation(HWND32 hwndOwner, INT32 nFolder, LPITE
case CSIDL_NETHOOD:
strcpy (buffer,"NetHood");
break;
case CSIDL_PRINTHOOD:
strcpy (buffer,"PrintHood");
break;
case CSIDL_NETWORK:
strcpy (buffer,"xxx"); /*virtual folder*/
TRACE (shell,"looking for Network\n");
tFolder=FT_UNKNOWN;
break;
case CSIDL_APPDATA:
strcpy (buffer,"Appdata");
break;
case CSIDL_PERSONAL:
strcpy (buffer,"Personal");
break;
@ -510,6 +517,7 @@ HRESULT WINAPI SHGetSpecialFolderLocation(HWND32 hwndOwner, INT32 nFolder, LPITE
case CSIDL_PRINTERS:
strcpy (buffer,"PrintHood");
break;
case CSIDL_COMMON_PROGRAMS:
case CSIDL_PROGRAMS:
strcpy (buffer,"Programs");
break;
@ -519,9 +527,11 @@ HRESULT WINAPI SHGetSpecialFolderLocation(HWND32 hwndOwner, INT32 nFolder, LPITE
case CSIDL_SENDTO:
strcpy (buffer,"SendTo");
break;
case CSIDL_COMMON_STARTMENU:
case CSIDL_STARTMENU:
strcpy (buffer,"Start Menu");
break;
case CSIDL_COMMON_STARTUP:
case CSIDL_STARTUP:
strcpy (buffer,"Startup");
break;
@ -529,7 +539,7 @@ HRESULT WINAPI SHGetSpecialFolderLocation(HWND32 hwndOwner, INT32 nFolder, LPITE
strcpy (buffer,"Templates");
break;
default:
ERR (shell,"unknown CSIDL\n");
ERR (shell,"unknown CSIDL 0x%08x\n", nFolder);
tFolder=FT_UNKNOWN;
break;
}
@ -544,9 +554,10 @@ HRESULT WINAPI SHGetSpecialFolderLocation(HWND32 hwndOwner, INT32 nFolder, LPITE
create it and the directory*/
if (RegQueryValueEx32A(key,buffer,NULL,&type,tpath,&tpathlen))
{ GetWindowsDirectory32A(npath,MAX_PATH);
PathAddBackslash(npath);
PathAddBackslash32A(npath);
switch (nFolder)
{ case CSIDL_DESKTOPDIRECTORY:
case CSIDL_COMMON_DESKTOPDIRECTORY:
strcat (npath,"Desktop");
break;
case CSIDL_FONTS:
@ -555,6 +566,12 @@ HRESULT WINAPI SHGetSpecialFolderLocation(HWND32 hwndOwner, INT32 nFolder, LPITE
case CSIDL_NETHOOD:
strcat (npath,"NetHood");
break;
case CSIDL_PRINTHOOD:
strcat (npath,"PrintHood");
break;
case CSIDL_APPDATA:
strcat (npath,"Appdata");
break;
case CSIDL_PERSONAL:
strcpy (npath,"C:\\Personal");
break;
@ -564,6 +581,7 @@ HRESULT WINAPI SHGetSpecialFolderLocation(HWND32 hwndOwner, INT32 nFolder, LPITE
case CSIDL_PRINTERS:
strcat (npath,"PrintHood");
break;
case CSIDL_COMMON_PROGRAMS:
case CSIDL_PROGRAMS:
strcat (npath,"Start Menu");
CreateDirectory32A(npath,NULL);
@ -575,9 +593,11 @@ HRESULT WINAPI SHGetSpecialFolderLocation(HWND32 hwndOwner, INT32 nFolder, LPITE
case CSIDL_SENDTO:
strcat (npath,"SendTo");
break;
case CSIDL_COMMON_STARTMENU:
case CSIDL_STARTMENU:
strcat (npath,"Start Menu");
break;
case CSIDL_COMMON_STARTUP:
case CSIDL_STARTUP:
strcat (npath,"Start Menu");
CreateDirectory32A(npath,NULL);
@ -887,7 +907,7 @@ DWORD WINAPI SHGetPathFromIDList32A (LPCITEMIDLIST pidl,LPSTR pszPath)
strcpy (buffer,"Desktop"); /*registry name*/
if ( RegQueryValueEx32A(key,buffer,NULL,&type,tpath,&tpathlen))
{ GetWindowsDirectory32A(tpath,MAX_PATH);
PathAddBackslash(tpath);
PathAddBackslash32A(tpath);
strcat (tpath,"Desktop"); /*folder name*/
RegSetValueEx32A(key,buffer,0,REG_SZ,tpath,tpathlen);
CreateDirectory32A(tpath,NULL);
@ -927,6 +947,11 @@ INT32 (CALLBACK* pImageList_AddIcon) (HIMAGELIST himl, HICON32 hIcon);
INT32(CALLBACK* pImageList_ReplaceIcon) (HIMAGELIST, INT32, HICON32);
HIMAGELIST (CALLBACK * pImageList_Create) (INT32,INT32,UINT32,INT32,INT32);
HICON32 (CALLBACK * pImageList_GetIcon) (HIMAGELIST, INT32, UINT32);
HDPA (CALLBACK* pDPA_Create) (INT32);
INT32 (CALLBACK* pDPA_InsertPtr) (const HDPA, INT32, LPVOID);
BOOL32 (CALLBACK* pDPA_Sort) (const HDPA, PFNDPACOMPARE, LPARAM);
LPVOID (CALLBACK* pDPA_GetPtr) (const HDPA, INT32);
BOOL32 (CALLBACK* pDPA_Destroy) (const HDPA);
/*************************************************************************
* SHELL32 LibMain
@ -950,7 +975,7 @@ BOOL32 WINAPI Shell32LibMain(HINSTANCE32 hinstDLL, DWORD fdwReason, LPVOID lpvRe
shell32_hInstance = hinstDLL;
GetWindowsDirectory32A(szShellPath,MAX_PATH);
PathAddBackslash(szShellPath);
PathAddBackslash32A(szShellPath);
strcat(szShellPath,"system\\shell32.dll");
if (fdwReason==DLL_PROCESS_ATTACH)
@ -964,6 +989,13 @@ BOOL32 WINAPI Shell32LibMain(HINSTANCE32 hinstDLL, DWORD fdwReason, LPVOID lpvRe
pImageList_AddIcon=GetProcAddress32(hComctl32,"ImageList_AddIcon");
pImageList_ReplaceIcon=GetProcAddress32(hComctl32,"ImageList_ReplaceIcon");
pImageList_GetIcon=GetProcAddress32(hComctl32,"ImageList_GetIcon");
/* imports by ordinal, pray that it works*/
pDPA_Create=GetProcAddress32(hComctl32, (LPCSTR)328L);
pDPA_Destroy=GetProcAddress32(hComctl32, (LPCSTR)329L);
pDPA_GetPtr=GetProcAddress32(hComctl32, (LPCSTR)332L);
pDPA_InsertPtr=GetProcAddress32(hComctl32, (LPCSTR)334L);
pDPA_Sort=GetProcAddress32(hComctl32, (LPCSTR)338L);
FreeLibrary32(hComctl32);
}
else

View File

@ -21,7 +21,11 @@ extern INT32 (CALLBACK* pImageList_AddIcon) (HIMAGELIST himl, HICON32 hIcon);
extern INT32(CALLBACK* pImageList_ReplaceIcon) (HIMAGELIST, INT32, HICON32);
extern HIMAGELIST (CALLBACK * pImageList_Create) (INT32,INT32,UINT32,INT32,INT32);
extern HICON32 (CALLBACK * pImageList_GetIcon) (HIMAGELIST, INT32, UINT32);
extern HDPA (CALLBACK* pDPA_Create) (INT32);
extern INT32 (CALLBACK* pDPA_InsertPtr) (const HDPA, INT32, LPVOID);
extern BOOL32 (CALLBACK* pDPA_Sort) (const HDPA, PFNDPACOMPARE, LPARAM);
extern LPVOID (CALLBACK* pDPA_GetPtr) (const HDPA, INT32);
extern BOOL32 (CALLBACK* pDPA_Destroy) (const HDPA);
/* FIXME should be moved to a header file. IsEqualGUID
is declared but not exported in compobj.c !!!*/
#define IsEqualGUID(rguid1, rguid2) (!memcmp(rguid1, rguid2, sizeof(GUID)))

View File

@ -30,6 +30,8 @@
#include "shlobj.h"
#include "debug.h"
#include "winreg.h"
#include "winnls.h"
#include "winversion.h"
#include "shell32_main.h"
/*************************************************************************
@ -62,25 +64,48 @@ SHChangeNotifyDeregister(LONG x1,LONG x2)
/*************************************************************************
* PathIsRoot [SHELL32.29]
*/
BOOL32 WINAPI PathIsRoot(LPCSTR x) {
TRACE(shell,"%s\n",x);
if (!strcmp(x+1,":\\")) /* "X:\" */
return 1;
if (!strcmp(x,"\\")) /* "\" */
return 1;
if (x[0]=='\\' && x[1]=='\\') { /* UNC "\\<xx>\" */
int foundbackslash = 0;
x=x+2;
while (*x) {
if (*x++=='\\')
foundbackslash++;
}
if (foundbackslash<=1) /* max 1 \ more ... */
return 1;
BOOL32 WINAPI PathIsRoot32A(LPCSTR x)
{ TRACE(shell,"%s\n",x);
if (*(x+1)==':' && *(x+2)=='\\') /* "X:\" */
return 1;
if (*x=='\\') /* "\" */
return 0;
if (x[0]=='\\' && x[1]=='\\') /* UNC "\\<xx>\" */
{ int foundbackslash = 0;
x=x+2;
while (*x)
{ if (*x++=='\\')
foundbackslash++;
}
if (foundbackslash<=1) /* max 1 \ more ... */
return 1;
}
return 0;
}
BOOL32 WINAPI PathIsRoot32W(LPCWSTR x)
{ TRACE(shell,"%s\n",debugstr_w(x));
if (*(x+1)==':' && *(x+2)=='\\') /* "X:\" */
return 1;
if (*x == (WCHAR) '\\') /* "\" */
return 0;
if (x[0]==(WCHAR)'\\' && x[1]==(WCHAR)'\\') /* UNC "\\<xx>\" */
{ int foundbackslash = 0;
x=x+2;
while (*x)
{ if (*x++==(WCHAR)'\\')
foundbackslash++;
}
if (foundbackslash<=1) /* max 1 \ more ... */
return 1;
}
return 0;
}
BOOL32 WINAPI PathIsRoot32AW(LPCVOID x)
{ if (VERSION_OsIsUnicode())
return PathIsRoot32W(x);
return PathIsRoot32A(x);
}
/*************************************************************************
* PathBuildRoot [SHELL32.30]
*/
@ -97,17 +122,35 @@ LPSTR WINAPI PathBuildRoot(LPSTR root,BYTE drive) {
* NOTES
* returns pointer to last . in last pathcomponent or at \0.
*/
LPSTR WINAPI PathFindExtension(LPSTR path) {
LPSTR lastpoint = NULL;
TRACE(shell,"%p %s\n",path,path);
while (*path) {
if (*path=='\\'||*path==' ')
LPCSTR WINAPI PathFindExtension32A(LPCSTR path)
{ LPCSTR lastpoint = NULL;
TRACE(shell,"%p %s\n",path,path);
while (*path)
{ if (*path=='\\'||*path==' ')
lastpoint=NULL;
if (*path=='.')
if (*path=='.')
lastpoint=path;
path++;
}
return lastpoint?lastpoint:path;
path++;
}
return lastpoint?lastpoint:path;
}
LPCWSTR WINAPI PathFindExtension32W(LPCWSTR path)
{ LPCWSTR lastpoint = NULL;
TRACE(shell,"%p L%s\n",path,debugstr_w(path));
while (*path)
{ if (*path==(WCHAR)'\\'||*path==(WCHAR)' ')
lastpoint=NULL;
if (*path==(WCHAR)'.')
lastpoint=path;
path++;
}
return lastpoint?lastpoint:path;
}
LPCVOID WINAPI PathFindExtension32AW(LPCVOID path)
{ if (VERSION_OsIsUnicode())
return PathFindExtension32W(path);
return PathFindExtension32A(path);
}
/*************************************************************************
@ -116,7 +159,7 @@ LPSTR WINAPI PathFindExtension(LPSTR path) {
* NOTES
* append \ if there is none
*/
LPSTR WINAPI PathAddBackslash(LPSTR path)
LPSTR WINAPI PathAddBackslash32A(LPSTR path)
{ int len;
TRACE(shell,"%p->%s\n",path,path);
@ -128,6 +171,23 @@ LPSTR WINAPI PathAddBackslash(LPSTR path)
}
return path+len;
}
LPWSTR WINAPI PathAddBackslash32W(LPWSTR path)
{ int len;
TRACE(shell,"%p->%s\n",path,debugstr_w(path));
len = lstrlen32W(path);
if (len && path[len-1]!=(WCHAR)'\\')
{ path[len] = (WCHAR)'\\';
path[len+1]= 0x00;
return path+len+1;
}
return path+len;
}
LPVOID WINAPI PathAddBackslash32AW(LPVOID path)
{ if(VERSION_OsIsUnicode())
return PathAddBackslash32W(path);
return PathAddBackslash32A(path);
}
/*************************************************************************
* PathRemoveBlanks [SHELL32.33]
@ -158,16 +218,28 @@ LPSTR WINAPI PathRemoveBlanks(LPSTR str)
* NOTES
* basename(char *fn);
*/
LPSTR WINAPI PathFindFilename(LPSTR fn)
{ LPSTR basefn;
TRACE(shell,"%s\n",fn);
basefn = fn;
while (fn[0])
{ if (((fn[0]=='\\') || (fn[0]==':')) && fn[1] && fn[1]!='\\')
basefn = fn+1;
fn++;
}
return basefn;
LPVOID WINAPI PathFindFilename(LPVOID fn)
{ LPSTR aslash,aptr;
LPWSTR wslash,wptr;
if(VERSION_OsIsUnicode())
{ wslash = wptr = (LPWSTR) fn;
TRACE(shell,"L%s\n",debugstr_w(wslash));
while (wptr[0])
{ if (((wptr[0]=='\\') || (wptr[0]==':')) && wptr[1] && wptr[1]!='\\')
wslash = wptr+1;
wptr++;
}
return (LPVOID) wslash;
}
aslash = aptr = (LPSTR) fn;
TRACE(shell,"%s\n",aslash);
while (aptr[0])
{ if (((aptr[0]=='\\') || (aptr[0]==':')) && aptr[1] && aptr[1]!='\\')
aslash = aptr+1;
aptr++;
}
return (LPVOID) aslash;
}
/*************************************************************************
@ -224,7 +296,7 @@ DWORD WINAPI PathRemoveFileSpec(LPSTR fn) {
LPSTR WINAPI PathAppend(LPSTR x1,LPSTR x2) {
TRACE(shell,"%s %s\n",x1,x2);
while (x2[0]=='\\') x2++;
return PathCombine(x1,x1,x2);
return PathCombine32A(x1,x1,x2);
}
/*************************************************************************
@ -234,25 +306,52 @@ LPSTR WINAPI PathAppend(LPSTR x1,LPSTR x2) {
* if lpszFile='.' skip it
* szDest can be equal to lpszFile. Thats why we use sTemp
*/
LPSTR WINAPI PathCombine(LPSTR szDest, LPCSTR lpszDir, LPCSTR lpszFile)
LPSTR WINAPI PathCombine32A(LPSTR szDest, LPCSTR lpszDir, LPCSTR lpszFile)
{ char sTemp[MAX_PATH];
TRACE(shell,"%p %p->%s %p->%s\n",szDest, lpszDir, lpszDir, lpszFile, lpszFile);
if (!lpszFile || !lpszFile[0] || (lpszFile[0]=='.' && !lpszFile[1]) )
{ strcpy(szDest,lpszDir);
return szDest;
}
/* if lpszFile is a complete path don't care about lpszDir */
if (PathIsRoot(lpszFile))
if (PathIsRoot32A(lpszFile))
{ strcpy(szDest,lpszFile);
}
strcpy(sTemp,lpszDir);
PathAddBackslash(sTemp);
PathAddBackslash32A(sTemp);
strcat(sTemp,lpszFile);
strcpy(szDest,sTemp);
return szDest;
}
LPWSTR WINAPI PathCombine32W(LPWSTR szDest, LPCWSTR lpszDir, LPCWSTR lpszFile)
{ WCHAR sTemp[MAX_PATH];
TRACE(shell,"%p %p->%s %p->%s\n",szDest, lpszDir, debugstr_w(lpszDir),
lpszFile, debugstr_w(lpszFile));
if (!lpszFile || !lpszFile[0] || (lpszFile[0]==(WCHAR)'.' && !lpszFile[1]) )
{ lstrcpy32W(szDest,lpszDir);
return szDest;
}
/* if lpszFile is a complete path don't care about lpszDir */
if (PathIsRoot32W(lpszFile))
{ lstrcpy32W(szDest,lpszFile);
}
lstrcpy32W(sTemp,lpszDir);
PathAddBackslash32W(sTemp);
lstrcat32W(sTemp,lpszFile);
lstrcpy32W(szDest,sTemp);
return szDest;
}
LPVOID WINAPI PathCombine32AW(LPVOID szDest, LPCVOID lpszDir, LPCVOID lpszFile)
{ if (VERSION_OsIsUnicode())
return PathCombine32W( szDest, lpszDir, lpszFile );
return PathCombine32A( szDest, lpszDir, lpszFile );
}
/*************************************************************************
* PathIsUNC [SHELL32.39]
@ -315,17 +414,33 @@ DWORD WINAPI PathResolve(LPCSTR s,DWORD x2,DWORD x3) {
* look for next arg in string. handle "quoted" strings
* returns pointer to argument *AFTER* the space. Or to the \0.
*/
LPSTR WINAPI PathGetArgs(LPSTR cmdline) {
BOOL32 qflag = FALSE;
TRACE(shell,"%s\n",cmdline);
while (*cmdline) {
if ((*cmdline==' ') && !qflag)
return cmdline+1;
if (*cmdline=='"')
LPVOID WINAPI PathGetArgs(LPVOID cmdline)
{ BOOL32 qflag = FALSE;
LPWSTR wptr;
LPSTR aptr;
if (VERSION_OsIsUnicode())
{ TRACE(shell,"%sL\n",debugstr_w((LPWSTR)cmdline));
wptr=(LPWSTR) cmdline;
while (*wptr)
{ if ((*wptr==' ') && !qflag)
return wptr+1;
if (*wptr=='"')
qflag=!qflag;
cmdline++;
}
return cmdline;
wptr++;
}
return (LPVOID) wptr;
}
TRACE(shell,"%s\n",(LPSTR)cmdline);
aptr=(LPSTR) cmdline;
while (*aptr)
{ if ((*aptr==' ') && !qflag)
return aptr+1;
if (*aptr=='"')
qflag=!qflag;
aptr++;
}
return (LPVOID) aptr;
}
/*************************************************************************
@ -395,8 +510,13 @@ DWORD WINAPI SHGetSettings(DWORD x,DWORD y,DWORD z) {
* Shell_GetCachedImageIndex [SHELL32.72]
*
*/
void WINAPI Shell_GetCachedImageIndex(LPSTR x,DWORD y,DWORD z)
{ FIXME(shell,"(%s,%08lx,%08lx):stub.\n",x,y,z);
void WINAPI Shell_GetCachedImageIndex(LPVOID x,DWORD y,DWORD z)
{ if( VERSION_OsIsUnicode())
{ FIXME(shell,"(L%s,%08lx,%08lx):stub.\n",debugstr_w((LPWSTR)x),y,z);
}
else
{ FIXME(shell,"(%s,%08lx,%08lx):stub.\n",debugstr_a((LPSTR)x),y,z);
}
}
/*************************************************************************
@ -606,10 +726,21 @@ DWORD WINAPI SHRestricted (DWORD pol) {
* NOTES
* exported by ordinal
*/
LPSTR WINAPI PathGetExtension(LPSTR path,DWORD y,DWORD z)
{ TRACE(shell,"(%s,%08lx,%08lx)\n",path,y,z);
path = PathFindExtension(path);
return *path?(path+1):path;
LPCSTR WINAPI PathGetExtension32A(LPCSTR path,DWORD y,DWORD z)
{ TRACE(shell,"(%s,%08lx,%08lx)\n",path,y,z);
path = PathFindExtension32A(path);
return *path?(path+1):path;
}
LPCWSTR WINAPI PathGetExtension32W(LPCWSTR path,DWORD y,DWORD z)
{ TRACE(shell,"(L%s,%08lx,%08lx)\n",debugstr_w(path),y,z);
path = PathFindExtension32W(path);
return *path?(path+1):path;
}
LPCVOID WINAPI PathGetExtension32AW(LPCVOID path,DWORD y,DWORD z)
{ if (VERSION_OsIsUnicode())
return PathGetExtension32W(path,y,z);
return PathGetExtension32A(path,y,z);
}
/*************************************************************************
@ -1094,20 +1225,67 @@ HRESULT WINAPI IsUserAdmin()
* at the moment only CSTR
* the pidl is for STRRET OFFSET
*/
HRESULT WINAPI StrRetToStrN (LPSTR dest, DWORD len, LPSTRRET src, LPITEMIDLIST x)
{ FIXME(shell,"dest=0x%p len=0x%lx strret=0x%p pidl=%p stub\n",dest,len,src,x);
strncpy(dest,src->u.cStr,len);
return S_OK;
HRESULT WINAPI StrRetToStrN (LPVOID dest, DWORD len, LPSTRRET src, LPITEMIDLIST pidl)
{ TRACE(shell,"dest=0x%p len=0x%lx strret=0x%p pidl=%p stub\n",dest,len,src,pidl);
switch (src->uType)
{ case STRRET_WSTR:
WideCharToMultiByte(CP_ACP, 0, src->u.pOleStr, -1, (LPSTR)dest, len, NULL, NULL);
SHFree(src->u.pOleStr);
break;
case STRRET_CSTRA:
if (VERSION_OsIsUnicode())
lstrcpynAtoW((LPWSTR)dest, src->u.cStr, len);
else
strncpy((LPSTR)dest, src->u.cStr, len);
break;
case STRRET_OFFSETA:
if (pidl)
{ if(VERSION_OsIsUnicode())
lstrcpynAtoW((LPWSTR)dest, ((LPCSTR)&pidl->mkid)+src->u.uOffset, len);
else
strncpy((LPSTR)dest, ((LPCSTR)&pidl->mkid)+src->u.uOffset, len);
break;
}
default:
FIXME(shell,"unknown type!\n");
if (len)
{ *(LPSTR)dest = '\0';
}
return(FALSE);
}
return(TRUE);
}
/*************************************************************************
* StrChrW [NT 4.0:SHELL32.651]
*
*/
HRESULT WINAPI StrChrW (LPWSTR u, DWORD v)
{ FIXME(shell,"%s 0x%lx stub\n",debugstr_w(u),v);
LPWSTR WINAPI StrChrW (LPWSTR str, WCHAR x )
{ LPWSTR ptr=str;
TRACE(shell,"%s 0x%04x\n",debugstr_w(str),x);
do
{ if (*ptr==x)
{ return ptr;
}
ptr++;
} while (*ptr);
return NULL;
}
/*************************************************************************
* StrCmpNIW [NT 4.0:SHELL32.*]
*
*/
INT32 WINAPI StrCmpNIW ( LPWSTR wstr1, LPWSTR wstr2, INT32 len)
{ FIXME( shell,"%s %s %i stub\n", debugstr_w(wstr1),debugstr_w(wstr2),len);
return 0;
}
/*************************************************************************
* SHAllocShared [SHELL32.520]
*
@ -1368,3 +1546,33 @@ HRESULT WINAPI SHFlushClipboard()
{ FIXME(shell,"stub\n");
return 1;
}
/*************************************************************************
* SheGetDirW [SHELL32.281]
*
*/
HRESULT WINAPI SheGetDirW(LPWSTR u, LPWSTR v)
{ FIXME(shell,"%s %s stub\n",debugstr_w(u),debugstr_w(v) );
return 0;
}
/*************************************************************************
* StrRChrW [SHELL32.320]
*
*/
LPWSTR WINAPI StrRChrW(LPWSTR lpStart, LPWSTR lpEnd, DWORD wMatch)
{ LPWSTR wptr=NULL;
TRACE(shell,"%s %s 0x%04x\n",debugstr_w(lpStart),debugstr_w(lpEnd), (WCHAR)wMatch );
/* if the end not given, search*/
if (!lpEnd)
{ lpEnd=lpStart;
while (*lpEnd)
lpEnd++;
}
do
{ if (*lpStart==(WCHAR)wMatch)
wptr = lpStart;
lpStart++;
} while ( lpStart<=lpEnd );
return wptr;
}

View File

@ -126,7 +126,7 @@ LPSHELLFOLDER IShellFolder_Constructor(LPSHELLFOLDER pParent,LPITEMIDLIST pidl)
{ *(sf->mlpszFolder)=0x00;
if(sf->mpSFParent->mlpszFolder) /* if the parent has a path, get it*/
{ strcpy(sf->mlpszFolder, sf->mpSFParent->mlpszFolder);
PathAddBackslash (sf->mlpszFolder);
PathAddBackslash32A (sf->mlpszFolder);
}
_ILGetFolderText(sf->mpidl, sf->mlpszFolder+strlen(sf->mlpszFolder), dwSize-strlen(sf->mlpszFolder));
TRACE(shell,"-- (%p)->(my path=%s)\n",sf, debugstr_a(sf->mlpszFolder));
@ -218,21 +218,23 @@ static HRESULT WINAPI IShellFolder_ParseDisplayName(
LPSHELLFOLDER this,
HWND32 hwndOwner,
LPBC pbcReserved,
LPOLESTR32 lpszDisplayName,
DWORD *pchEaten,
LPITEMIDLIST *ppidl,
LPOLESTR32 lpszDisplayName,
DWORD *pchEaten,
LPITEMIDLIST *ppidl,
DWORD *pdwAttributes)
{ HRESULT hr=E_OUTOFMEMORY;
LPITEMIDLIST pidlFull=NULL, pidlTemp = NULL, pidlOld = NULL;
LPSTR pszNext=NULL;
CHAR szElement[MAX_PATH];
BOOL32 bType;
DWORD dwChars=lstrlen32W(lpszDisplayName) + 1;
LPSTR pszTemp=(LPSTR)HeapAlloc(GetProcessHeap(),0,dwChars * sizeof(CHAR));
LPITEMIDLIST pidlFull=NULL, pidlTemp = NULL, pidlOld = NULL;
LPSTR pszTemp, pszNext=NULL;
CHAR szElement[MAX_PATH];
BOOL32 bType;
DWORD dwChars;
TRACE(shell,"(%p)->(HWND=0x%08x,%p,%p=%s,%p,pidl=%p,%p)\n",
this,hwndOwner,pbcReserved,lpszDisplayName,debugstr_w(lpszDisplayName),pchEaten,ppidl,pdwAttributes);
TRACE(shell,"(%p)->(HWND=0x%08x,%p,%p=%s,%p,pidl=%p,%p)\n",
this,hwndOwner,pbcReserved,lpszDisplayName,
debugstr_w(lpszDisplayName),pchEaten,ppidl,pdwAttributes);
dwChars=lstrlen32W(lpszDisplayName) + 1;
pszTemp=(LPSTR)HeapAlloc(GetProcessHeap(),0,dwChars);
if(pszTemp)
{ hr = E_FAIL;
@ -647,7 +649,7 @@ static HRESULT WINAPI IShellFolder_GetDisplayNameOf( LPSHELLFOLDER this, LPCITEM
strcat (szDrive,")");
}
else
{ PathAddBackslash (szTemp);
{ PathAddBackslash32A (szTemp);
strcpy(szDrive,szTemp);
}
}
@ -673,7 +675,7 @@ static HRESULT WINAPI IShellFolder_GetDisplayNameOf( LPSHELLFOLDER this, LPCITEM
if (this->mlpszFolder && strlen (this->mlpszFolder))
{ if (strcmp(this->mlpszFolder,"My Computer"))
{ strcpy (szText,this->mlpszFolder);
PathAddBackslash (szText);
PathAddBackslash32A (szText);
}
}
pidlTemp = ILFindLastID(pidl);
@ -704,7 +706,7 @@ static HRESULT WINAPI IShellFolder_GetDisplayNameOf( LPSHELLFOLDER this, LPCITEM
if(!(lpName))
{ return E_OUTOFMEMORY;
}
lpName->uType = STRRET_CSTR;
lpName->uType = STRRET_CSTRA;
strcpy(lpName->u.cStr,szText);
return S_OK;
}

View File

@ -283,25 +283,25 @@ static HRESULT ShellView_FillList(LPSHELLVIEW this)
}
/* create a pointer array */
hdpa = DPA_Create(16);
hdpa = pDPA_Create(16);
if (!hdpa)
{ return(E_OUTOFMEMORY);
}
/* copy the items into the array*/
while((S_OK == pEnumIDList->lpvtbl->fnNext(pEnumIDList,1, &pidl, &dwFetched)) && dwFetched)
{ if (DPA_InsertPtr(hdpa, 0x7fff, pidl) == -1)
{ if (pDPA_InsertPtr(hdpa, 0x7fff, pidl) == -1)
{ SHFree(pidl);
}
}
/*sort the array*/
DPA_Sort(hdpa, ShellView_CompareItems, (LPARAM)this->pSFParent);
pDPA_Sort(hdpa, ShellView_CompareItems, (LPARAM)this->pSFParent);
/*turn the listview's redrawing off*/
SendMessage32A(this->hWndList, WM_SETREDRAW, FALSE, 0);
for (i=0; i < DPA_GetPtrCount(hdpa); ++i)
for (i=0; i < DPA_GetPtrCount(hdpa); ++i) /* DPA_GetPtrCount is a macro*/
{ pidl = (LPITEMIDLIST)DPA_GetPtr(hdpa, i);
if (IncludeObject(this, pidl) == S_OK) /* in a commdlg this works as a filemask*/
{ ZeroMemory(&lvItem, sizeof(lvItem)); /* create the listviewitem*/
@ -322,7 +322,7 @@ static HRESULT ShellView_FillList(LPSHELLVIEW this)
UpdateWindow32(this->hWndList);
pEnumIDList->lpvtbl->fnRelease(pEnumIDList); /* destroy the list*/
DPA_Destroy(hdpa);
pDPA_Destroy(hdpa);
return S_OK;
}
@ -727,26 +727,21 @@ LRESULT ShellView_OnSettingChange(LPSHELLVIEW this, LPCSTR lpszSection)
}
return 0;
}
/**************************************************************************
* ShellView_DoContextMenu()
* ShellView_GetSelections()
*
* RETURNS
* number of selected items
*/
void ShellView_DoContextMenu(LPSHELLVIEW this, WORD x, WORD y, BOOL32 fDefault)
{ UINT32 uCommand, i;
DWORD wFlags;
HMENU32 hMenu;
BOOL32 fExplore = FALSE;
HWND32 hwndTree = 0;
INT32 nMenuIndex;
LVITEM32A lvItem;
MENUITEMINFO32A mii;
LPCONTEXTMENU pContextMenu = NULL;
CMINVOKECOMMANDINFO32 cmi;
TRACE(shell,"(%p)->(0x%08x 0x%08x 0x%08x) stub\n",this, x, y, fDefault);
UINT32 ShellView_GetSelections(LPSHELLVIEW this)
{ LVITEM32A lvItem;
UINT32 i;
this->uSelected = ListView_GetSelectedCount(this->hWndList);
this->aSelectedItems = (LPITEMIDLIST*)SHAlloc(this->uSelected * sizeof(LPITEMIDLIST));
TRACE(shell,"selected=%i\n", this->uSelected);
if(this->aSelectedItems)
{ TRACE(shell,"-- Items selected =%u\n", this->uSelected);
ZeroMemory(&lvItem, sizeof(lvItem));
@ -764,8 +759,30 @@ void ShellView_DoContextMenu(LPSHELLVIEW this, WORD x, WORD y, BOOL32 fDefault)
}
lvItem.iItem++;
}
}
return this->uSelected;
this->pSFParent->lpvtbl->fnGetUIObjectOf( this->pSFParent,
}
/**************************************************************************
* ShellView_DoContextMenu()
*/
void ShellView_DoContextMenu(LPSHELLVIEW this, WORD x, WORD y, BOOL32 fDefault)
{ UINT32 uCommand;
DWORD wFlags;
HMENU32 hMenu;
BOOL32 fExplore = FALSE;
HWND32 hwndTree = 0;
INT32 nMenuIndex;
MENUITEMINFO32A mii;
LPCONTEXTMENU pContextMenu = NULL;
CMINVOKECOMMANDINFO32 cmi;
TRACE(shell,"(%p)->(0x%08x 0x%08x 0x%08x) stub\n",this, x, y, fDefault);
this->uSelected = ListView_GetSelectedCount(this->hWndList);
this->aSelectedItems = (LPITEMIDLIST*)SHAlloc(this->uSelected * sizeof(LPITEMIDLIST));
if(ShellView_GetSelections(this))
{ this->pSFParent->lpvtbl->fnGetUIObjectOf( this->pSFParent,
this->hWndParent,
this->uSelected,
this->aSelectedItems,
@ -953,9 +970,12 @@ LRESULT ShellView_OnNotify(LPSHELLVIEW this, UINT32 CtlID, LPNMHDR lpnmh)
{ WideCharToLocal32(lpdi->item.pszText, str.u.pOleStr, lpdi->item.cchTextMax);
SHFree(str.u.pOleStr);
}
if(STRRET_CSTR == str.uType)
else if(STRRET_CSTRA == str.uType)
{ strncpy(lpdi->item.pszText, str.u.cStr, lpdi->item.cchTextMax);
}
else
{ FIXME(shell,"type wrong\n");
}
}
}
@ -980,8 +1000,9 @@ LRESULT ShellView_OnNotify(LPSHELLVIEW this, UINT32 CtlID, LPNMHDR lpnmh)
break;
case LVN_ITEMCHANGED:
WARN(shell,"-- LVN_ITEMCHANGED %p\n",this);
OnStateChange(this, CDBOSC_SELCHANGE);
TRACE(shell,"-- LVN_ITEMCHANGED %p\n",this);
ShellView_GetSelections(this);
OnStateChange(this, CDBOSC_SELCHANGE); /* the browser will get the IDataObject now */
break;
case LVN_DELETEALLITEMS:
@ -1234,10 +1255,11 @@ static HRESULT WINAPI IShellView_ContextSensitiveHelp(LPSHELLVIEW this,BOOL32 fE
*/
static HRESULT WINAPI IShellView_TranslateAccelerator(LPSHELLVIEW this,LPMSG32 lpmsg)
{ FIXME(shell,"(%p)->(%p: hwnd=%x msg=%x lp=%lx wp=%x) stub\n",this,lpmsg, lpmsg->hwnd, lpmsg->message, lpmsg->lParam, lpmsg->wParam);
/* switch (lpmsg->message)
{ case WM_RBUTTONDOWN:
return SendMessage32A ( lpmsg->hwnd, WM_NOTIFY, );
}*/
switch (lpmsg->message)
{ case WM_KEYDOWN: TRACE(shell,"-- key=0x04%x",lpmsg->wParam) ;
}
return S_FALSE;
}
static HRESULT WINAPI IShellView_EnableModeless(LPSHELLVIEW this,BOOL32 fEnable)
@ -1395,21 +1417,25 @@ static HRESULT WINAPI IShellView_SelectItem(LPSHELLVIEW this, LPCITEMIDLIST pidl
return E_NOTIMPL;
}
static HRESULT WINAPI IShellView_GetItemObject(LPSHELLVIEW this, UINT32 uItem, REFIID riid, LPVOID *ppvOut)
{ LPDATAOBJECT pDataObject;
{ LPUNKNOWN pObj = NULL;
char xriid[50];
HRESULT hr;
WINE_StringFromCLSID((LPCLSID)riid,xriid);
TRACE(shell,"(%p)->(uItem=0x%08x,\n\tIID=%s, ppv=%p)\n",this, uItem, xriid, ppvOut);
*ppvOut = NULL;
pDataObject = IDataObject_Constructor(this->hWndParent, this->pSFParent,this->aSelectedItems,this->uSelected);
if(!pDataObject)
return E_OUTOFMEMORY;
hr = pDataObject->lpvtbl->fnQueryInterface(pDataObject, riid, ppvOut);
pDataObject->lpvtbl->fnRelease(pDataObject);
if(IsEqualIID(riid, &IID_IContextMenu))
{ TRACE(shell,"-- (%p)->IID_IContextMenu not implemented\n",this);
return(E_NOTIMPL);
}
else if (IsEqualIID(riid, &IID_IDataObject))
{ pObj =(LPUNKNOWN)IDataObject_Constructor(this->hWndParent, this->pSFParent,this->aSelectedItems,this->uSelected);
}
TRACE(shell,"-- (%p)->(interface=%p)\n",this, ppvOut);
return hr;
if(!pObj)
return E_OUTOFMEMORY;
*ppvOut = pObj;
return S_OK;
}

View File

@ -227,10 +227,28 @@ HRESULT WINAPI SHGetSpecialFolderLocation(HWND32, INT32, LPITEMIDLIST *);
/****************************************************************************
* string and path functions
*/
LPSTR WINAPI PathAddBackslash(LPSTR path);
LPSTR WINAPI PathCombine(LPSTR szDest, LPCSTR lpszDir, LPCSTR lpszFile);
LPSTR WINAPI PathAddBackslash32A(LPSTR path);
LPWSTR WINAPI PathAddBackslash32W(LPWSTR path);
#define PathAddBackslash WINELIB_NAME_AW(PathAddBackslash)
LPVOID WINAPI PathAddBackslash32AW(LPVOID path);
LPSTR WINAPI PathCombine32A(LPSTR szDest, LPCSTR lpszDir, LPCSTR lpszFile);
LPWSTR WINAPI PathCombine32W(LPWSTR szDest, LPCWSTR lpszDir, LPCWSTR lpszFile);
#define PathCombine WINELIB_NAME_AW(PathCombine)
LPVOID WINAPI PathCombine32AW(LPVOID szDest, LPCVOID lpszDir, LPCVOID lpszFile);
LPCSTR WINAPI PathFindExtension32A(LPCSTR path);
LPCWSTR WINAPI PathFindExtension32W(LPCWSTR path);
#define PathFindExtension WINELIB_NAME_AW(PathFindExtension)
LPCVOID WINAPI PathFindExtension32AW(LPCVOID path);
LPCSTR WINAPI PathGetExtension32A(LPCSTR path, DWORD y, DWORD x);
LPCWSTR WINAPI PathGetExtension32W(LPCWSTR path, DWORD y, DWORD x);
#define PathGetExtension WINELIB_NAME_AW(PathGetExtension)
LPCVOID WINAPI PathGetExtension32AW(LPCVOID path, DWORD y, DWORD x);
LPSTR WINAPI PathRemoveBlanks(LPSTR str);
LPSTR WINAPI PathFindFilename(LPSTR fn);
LPVOID WINAPI PathFindFilename(LPVOID fn);
/****************************************************************************
* other functions
*/
@ -261,6 +279,12 @@ DWORD WINAPI SHFree(LPVOID x);
#define CSIDL_NETHOOD 0x0013
#define CSIDL_FONTS 0x0014
#define CSIDL_TEMPLATES 0x0015
#define CSIDL_COMMON_STARTMENU 0x0016
#define CSIDL_COMMON_PROGRAMS 0X0017
#define CSIDL_COMMON_STARTUP 0x0018
#define CSIDL_COMMON_DESKTOPDIRECTORY 0x0019
#define CSIDL_APPDATA 0x001a
#define CSIDL_PRINTHOOD 0x001b
#endif /* __WINE_SHELL_H */

View File

@ -108,16 +108,22 @@ DEFINE_SHLGUID(IID_IShellCopyHookW, 0x000214FCL, 0, 0);
/****************************************************************************
* STRRET
*/
#define STRRET_WSTR 0x0000
#define STRRET_OFFSET 0x0001
#define STRRET_CSTR 0x0002
#define STRRET_WSTR 0x0000
#define STRRET_OFFSETA 0x0001
#define STRRET_CSTRA 0x0002
#define STRRET_ASTR 0X0003
#define STRRET_OFFSETW 0X0004
#define STRRET_CSTRW 0X0005
typedef struct _STRRET
{ UINT32 uType; /* STRRET_xxx */
union
{ LPWSTR pOleStr; /* OLESTR that will be freed */
LPSTR pStr;
UINT32 uOffset; /* OffsetINT32o SHITEMID (ANSI) */
char cStr[MAX_PATH]; /* Buffer to fill in */
WCHAR cStrW[MAX_PATH];
}u;
} STRRET,*LPSTRRET;

View File

@ -408,6 +408,9 @@ INT32 WINAPI lstrncmpi32W( LPCWSTR str1, LPCWSTR str2, INT32 n )
LPWSTR WINAPI lstrcpyAtoW( LPWSTR dst, LPCSTR src )
{
register LPWSTR p = dst;
TRACE(string,"%s\n",src);
while ((*p++ = (WCHAR)(unsigned char)*src++));
return dst;
}
@ -419,6 +422,9 @@ LPWSTR WINAPI lstrcpyAtoW( LPWSTR dst, LPCSTR src )
LPSTR WINAPI lstrcpyWtoA( LPSTR dst, LPCWSTR src )
{
register LPSTR p = dst;
TRACE(string,"L%s\n",debugstr_w(src));
while ((*p++ = (CHAR)*src++));
return dst;
}
@ -432,6 +438,9 @@ LPSTR WINAPI lstrcpyWtoA( LPSTR dst, LPCWSTR src )
LPWSTR WINAPI lstrcpynAtoW( LPWSTR dst, LPCSTR src, INT32 n )
{
LPWSTR p = dst;
TRACE(string,"%s %i\n",src, n);
while ((n-- > 1) && *src) *p++ = (WCHAR)(unsigned char)*src++;
if (n >= 0) *p = 0;
return dst;
@ -446,6 +455,9 @@ LPWSTR WINAPI lstrcpynAtoW( LPWSTR dst, LPCSTR src, INT32 n )
LPSTR WINAPI lstrcpynWtoA( LPSTR dst, LPCWSTR src, INT32 n )
{
LPSTR p = dst;
TRACE(string,"L%s %i\n",debugstr_w(src), n);
while ((n-- > 1) && *src) *p++ = (CHAR)*src++;
if (n >= 0) *p = 0;
return dst;
@ -631,7 +643,7 @@ INT32 WINAPI WideCharToLocal32(
LPWSTR pWide,
INT32 dwChars)
{ *pLocal = 0;
TRACE(string,"(%p, %s, %li)\n", pLocal, debugstr_w(pWide),dwChars);
TRACE(string,"(%p, %s, %i)\n", pLocal, debugstr_w(pWide),dwChars);
WideCharToMultiByte(CP_ACP,0,pWide,-1,pLocal,dwChars,NULL,NULL);
return strlen(pLocal);
}
@ -647,7 +659,7 @@ INT32 WINAPI LocalToWideChar32(
LPSTR pLocal,
INT32 dwChars)
{ *pWide = 0;
TRACE(string,"(%p, %s, %li)\n",pWide, pLocal, dwChars);
TRACE(string,"(%p, %s, %i)\n",pWide, pLocal, dwChars);
MultiByteToWideChar(CP_ACP,0,pLocal,-1,pWide,dwChars);
return lstrlen32W(pWide);
}

View File

@ -362,7 +362,6 @@ LANGID WINAPI GetUserDefaultLangID()
{
/* caching result, if defined from environment, which should (?) not change during a WINE session */
static LANGID userLCID = 0;
if (Options.language) {
return Languages[Options.language].langid;
}
@ -2233,8 +2232,9 @@ INT32 WINAPI OLE_GetFormatA(LCID locale,
DWORD flags,
DWORD tflags,
LPSYSTEMTIME xtime,
LPCSTR _format,
LPSTR date, INT32 datelen)
LPCSTR _format, /*in*/
LPSTR date, /*out*/
INT32 datelen)
{
INT32 inpos, outpos;
int count, type, inquote, Overflow;
@ -2247,10 +2247,10 @@ INT32 WINAPI OLE_GetFormatA(LCID locale,
const char ** dgfmt = _dgfmt - 1;
/* report, for debugging */
TRACE(ole, "(0x%lx,0x%lx, 0x%lx, time(d=%d,h=%d,m=%d,s=%d), fmt:\'%s\' (at %p), %p (%s), len=%d)\n",
TRACE(ole, "(0x%lx,0x%lx, 0x%lx, time(d=%d,h=%d,m=%d,s=%d), fmt=%p \'%s\' , %p, len=%d)\n",
locale, flags, tflags,
xtime->wDay, xtime->wHour, xtime->wMinute, xtime->wSecond,
format, format, date, date, datelen);
_format, _format, date, datelen);
/* initalize state variables and output buffer */
inpos = outpos = 0;
@ -2443,21 +2443,19 @@ INT32 WINAPI OLE_GetFormatW(LCID locale, DWORD flags, DWORD tflags,
INT32 inpos, outpos;
int count, type=0, inquote;
int Overflow; /* loop check */
int usedate, usetime;
WCHAR buf[40];
int buflen=0;
char abuf[40];
WCHAR arg0[] = {0}, arg1[] = {'%','d',0};
WCHAR arg2[] = {'%','0','2','d',0};
WCHAR *argarr[] = {arg0, arg1, arg2};
int datevars=0, timevars=0;
/* make a debug report */
lstrcpynWtoA(abuf, format, sizeof(format));
TRACE(ole, "args: 0x%lx, 0x%lx, 0x%lx, time(d=%d,h=%d,m=%d,s=%d), fmt:\'%s\' (at %p), %p with max len %d\n",
TRACE(ole, "args: 0x%lx, 0x%lx, 0x%lx, time(d=%d,h=%d,m=%d,s=%d), fmt:%s (at %p),
%p with max len %d\n",
locale, flags, tflags,
xtime->wDay, xtime->wHour, xtime->wMinute, xtime->wSecond,
abuf, format, output, outlen);
debugstr_w(format), format, output, outlen);
/* initialize state variables */
@ -2466,10 +2464,6 @@ INT32 WINAPI OLE_GetFormatW(LCID locale, DWORD flags, DWORD tflags,
inquote = Overflow = 0;
/* this is really just a sanity check */
output[0] = buf[0] = 0;
abuf[0] = '\0';
/* for compatibility with official Windows behavior */
usedate = flags & DATE_DATEVARSONLY;
usetime = flags & TIME_TIMEVARSONLY;
/* this loop is the core of the function */
for (inpos = 0; /* we have several break points */ ; inpos++) {
@ -2631,8 +2625,7 @@ INT32 WINAPI OLE_GetFormatW(LCID locale, DWORD flags, DWORD tflags,
if (outpos > outlen-1) outpos = outlen-1;
output[outpos] = '0';
lstrcpynWtoA(abuf, output, sizeof(abuf) );
TRACE(ole, " returning string \'%s\'\n", abuf);
TRACE(ole, " returning %s\n", debugstr_w(output));
return (!Overflow) ? outlen : 0;
@ -2671,7 +2664,6 @@ INT32 WINAPI GetDateFormat32A(LCID locale,DWORD flags,
SYSTEMTIME t;
LPSYSTEMTIME thistime;
LCID thislocale;
INT32 ret;
TRACE(ole,"(0x%04lx,0x%08lx,%p,%s,%p,%d)\n",
@ -2847,9 +2839,25 @@ INT32 WINAPI GetNumberFormat32A(LCID locale, DWORD dwflags,
}
return n;
}
/******************************************************************************
* OLE2NLS_CheckLocale [intern]
*/
static LCID OLE2NLS_CheckLocale (LCID locale)
{
if (!locale)
{ locale = LOCALE_SYSTEM_DEFAULT;
}
if (locale == LOCALE_SYSTEM_DEFAULT)
{ return GetSystemDefaultLCID();
}
else if (locale == LOCALE_USER_DEFAULT)
{ return GetUserDefaultLCID();
}
else
{ return locale;
}
}
/******************************************************************************
* GetTimeFormat32A [KERNEL32.422]
* Makes an ASCII string of the time
@ -2881,27 +2889,17 @@ GetTimeFormat32A(LCID locale, /* in */
SYSTEMTIME t;
LPSYSTEMTIME thistime;
LCID thislocale=0;
DWORD thisflags=LOCALE_STIMEFORMAT; /* standart timeformat */;
DWORD thisflags=LOCALE_STIMEFORMAT; /* standart timeformat */
INT32 ret;
TRACE(ole,"GetTimeFormat(0x%04lx,0x%08lx,%p,%s,%p,%d)\n",locale,flags,xtime,format,timestr,timelen);
if (!locale)
{ locale = LOCALE_SYSTEM_DEFAULT;
}
if (locale == LOCALE_SYSTEM_DEFAULT)
{ thislocale = GetSystemDefaultLCID();
}
else if (locale == LOCALE_USER_DEFAULT)
{ thislocale = GetUserDefaultLCID();
}
else
{ thislocale = locale;
}
thislocale = OLE2NLS_CheckLocale ( locale );
if ( flags & (TIME_NOTIMEMARKER | TIME_FORCE24HOURFORMAT ))
{ FIXME(ole,"TIME_NOTIMEMARKER or TIME_FORCE24HOURFORMAT not implemented\n");
}
flags &= (TIME_NOSECONDS | TIME_NOMINUTESORSECONDS); /* mask for OLE_GetFormatA*/
if (format == NULL)
@ -2922,7 +2920,10 @@ GetTimeFormat32A(LCID locale, /* in */
else
{ thistime = xtime;
}
return OLE_GetFormatA(thislocale, thisflags, flags, thistime, thisformat, timestr, timelen);
ret = OLE_GetFormatA(thislocale, thisflags, flags, thistime, thisformat,
timestr, timelen);
SetLastError(ret);
return ret;
}
@ -2931,67 +2932,52 @@ GetTimeFormat32A(LCID locale, /* in */
* Makes a Unicode string of the time
*/
INT32 WINAPI
GetTimeFormat32W(LCID locale,DWORD flags,
LPSYSTEMTIME xtime,
LPCWSTR format,
LPWSTR timestr,INT32 timelen)
{
char debugbuf[40];
WCHAR buf[20];
LPCWSTR realformat=0;
SYSTEMTIME t;
LPSYSTEMTIME realtime;
WCHAR * fmt_buf = NULL;
int fmt_buf_size = 0; /* units of WCHARs */
INT32 retval;
lstrcpynWtoA(debugbuf, format, (sizeof(buf))/2);
TRACE(ole, "GetTimeFormatW len %d flags 0x%lX format >%s<\n",
timelen, flags, debugbuf);
GetTimeFormat32W(LCID locale, /* in */
DWORD flags, /* in */
LPSYSTEMTIME xtime, /* in */
LPCWSTR format, /* in */
LPWSTR timestr, /* out */
INT32 timelen /* in */)
{ WCHAR format_buf[40];
LPCWSTR thisformat;
SYSTEMTIME t;
LPSYSTEMTIME thistime;
LCID thislocale=0;
DWORD thisflags=LOCALE_STIMEFORMAT; /* standart timeformat */
INT32 ret;
TRACE(ole,"GetTimeFormat(0x%04lx,0x%08lx,%p,%s,%p,%d)\n",locale,flags,
xtime,debugstr_w(format),timestr,timelen);
/* Enforce the Windows behavior */
flags |= ~LOCALE_TIMEDATEBOTH;
flags |= TIME_TIMEVARSONLY;
thislocale = OLE2NLS_CheckLocale ( locale );
/* take care of the format or locale not being given */
if (format) {
realformat = format;
} else if (locale) {
/* allocate memory */
retval = ERROR_INSUFFICIENT_BUFFER;
fmt_buf = malloc((fmt_buf_size+=7) * sizeof(WCHAR));
if (!fmt_buf)
goto out_nomem;
if ( flags & (TIME_NOTIMEMARKER | TIME_FORCE24HOURFORMAT ))
{ FIXME(ole,"TIME_NOTIMEMARKER or TIME_FORCE24HOURFORMAT not implemented\n");
}
flags &= (TIME_NOSECONDS | TIME_NOMINUTESORSECONDS); /* mask for OLE_GetFormatA*/
while(!GetLocaleInfo32W(locale, LOCALE_STIMEFORMAT,
fmt_buf, fmt_buf_size)) {
retval = ERROR_OUTOFMEMORY;
fmt_buf = realloc(fmt_buf,
(fmt_buf_size += 10) * sizeof(WCHAR));
if (!fmt_buf)
goto out_nomem;
}
realformat = fmt_buf;
} else {
FIXME(ole, "caller gave no locale, no format; what should we do?\n");
SetLastError(ERROR_BAD_FORMAT);
}
if (!locale)
locale = GetSystemDefaultLCID();
if (format == NULL)
{ if (flags & LOCALE_NOUSEROVERRIDE) /*use system default*/
{ thislocale = GetSystemDefaultLCID();
}
GetLocaleInfo32W(thislocale, thisflags, format_buf, 40);
thisformat = format_buf;
}
else
{ thisformat = format;
}
if (xtime == NULL) /* NULL means use the current local time*/
{ GetSystemTime(&t);
thistime = &t;
}
else
{ thistime = xtime;
}
realtime = xtime;
if (!realtime) {
realtime = &t;
GetSystemTime(realtime);
}
retval = OLE_GetFormatW(locale, flags, 0, realtime, realformat, timestr, timelen);
if (fmt_buf)
free(fmt_buf);
return retval;
out_nomem:
SetLastError(retval);
WARN(ole, "could not allocate %d chars of memory\n", fmt_buf_size);
return 0;
ret = OLE_GetFormatW(thislocale, thisflags, flags, thistime, thisformat,
timestr, timelen);
SetLastError(ret);
return ret;
}

View File

@ -34,15 +34,15 @@ init Shell32LibMain
26 stub ILLoadFromStream@8
27 stub ILSaveToStream@8
28 stub SHILCreateFromPath@12
29 stdcall PathIsRoot(str) PathIsRoot
29 stdcall PathIsRoot(str) PathIsRoot32AW
30 stdcall PathBuildRoot(ptr long) PathBuildRoot
31 stdcall PathFindExtension(str) PathFindExtension
32 stdcall PathAddBackslash(str) PathAddBackslash
31 stdcall PathFindExtension(str) PathFindExtension32AW
32 stdcall PathAddBackslash(str) PathAddBackslash32AW
33 stdcall PathRemoveBlanks(str) PathRemoveBlanks
34 stdcall PathFindFilename(str) PathFindFilename
35 stdcall PathRemoveFileSpec(str) PathRemoveFileSpec
36 stdcall PathAppend(str str) PathAppend
37 stdcall PathCombine(ptr str str) PathCombine
37 stdcall PathCombine(ptr str str) PathCombine32AW
38 stub PathStripPath
39 stdcall PathIsUNC(str) PathIsUNC
40 stub PathIsRelative
@ -163,7 +163,7 @@ init Shell32LibMain
155 stdcall ILFree(ptr) ILFree
156 stub ILGlobalFree
157 stdcall ILCreateFromPath (ptr) ILCreateFromPath
158 stdcall PathGetExtension(str long long) PathGetExtension
158 stdcall PathGetExtension(str long long) PathGetExtension32AW
159 stub PathIsDirectory
160 stub SHNetConnectionDialog
161 stdcall SHRunControlPanel (long long) SHRunControlPanel
@ -285,9 +285,9 @@ init Shell32LibMain
276 stub SheFullPathA
277 stub SheFullPathW
278 stub SheGetCurDrive
279 stub SheGetDirA
280 stub SheGetDirExW
281 stub SheGetDirW
279 stub SheGetDirA@8
280 stub SheGetDirExW@12
281 stdcall SheGetDirW (long long) SheGetDirW
282 stub SheGetPathOffsetW
283 stub SheRemoveQuotesA
284 stub SheRemoveQuotesW
@ -313,7 +313,7 @@ init Shell32LibMain
304 stdcall StrChrW (ptr ptr) StrChrW # proper ordinal unknown
305 stub StrCmpNA # proper ordinal unknown
306 stub StrCmpNIA # proper ordinal unknown
307 stub StrCmpNIW # proper ordinal unknown
307 stdcall StrCmpNIW (wstr wstr long) StrCmpNIW # proper ordinal unknown
308 stub StrCmpNW # proper ordinal unknown
309 stub StrCpyNA # proper ordinal unknown
310 stub StrCpyNW # proper ordinal unknown
@ -326,7 +326,7 @@ init Shell32LibMain
317 stub StrRChrA # proper ordinal unknown
318 stub StrRChrIA # proper ordinal unknown
319 stub StrRChrIW # proper ordinal unknown
320 stub StrRChrW # proper ordinal unknown
320 stdcall StrRChrW (wstr wstr long) StrRChrW # proper ordinal unknown
321 stub StrRStrA # proper ordinal unknown
322 stub StrRStrIA # proper ordinal unknown
323 stub StrRStrIW # proper ordinal unknown