From f30d5ea76f36f2a45157bde690909213f661359a Mon Sep 17 00:00:00 2001 From: Christoph von Wittich Date: Sat, 6 Jun 2009 15:45:10 +0000 Subject: [PATCH] import SHGetNewLinkInfoA/W from wine svn path=/trunk/; revision=41308 --- reactos/dll/win32/shell32/shell32_main.h | 3 +- reactos/dll/win32/shell32/shellord.c | 62 ++++++++++++++++++++++-- reactos/include/psdk/shellapi.h | 14 ++++++ 3 files changed, 73 insertions(+), 6 deletions(-) diff --git a/reactos/dll/win32/shell32/shell32_main.h b/reactos/dll/win32/shell32/shell32_main.h index 3a262237a8a..4bda7616b3f 100644 --- a/reactos/dll/win32/shell32/shell32_main.h +++ b/reactos/dll/win32/shell32/shell32_main.h @@ -38,9 +38,10 @@ #include "shlobj.h" #include "shellapi.h" #include "wine/windef16.h" +*/ #include "wine/unicode.h" -*/ + /******************************************* * global SHELL32.DLL variables */ diff --git a/reactos/dll/win32/shell32/shellord.c b/reactos/dll/win32/shell32/shellord.c index c5539d4da61..7220067e2dc 100644 --- a/reactos/dll/win32/shell32/shellord.c +++ b/reactos/dll/win32/shell32/shellord.c @@ -1972,20 +1972,72 @@ BOOL WINAPI SHObjectProperties(HWND hwnd, DWORD dwType, LPCWSTR szObject, LPCWST BOOL WINAPI SHGetNewLinkInfoA(LPCSTR pszLinkTo, LPCSTR pszDir, LPSTR pszName, BOOL *pfMustCopy, UINT uFlags) { - FIXME("%s, %s, %p, %p, 0x%08x - stub\n", debugstr_a(pszLinkTo), debugstr_a(pszDir), - pszName, pfMustCopy, uFlags); + WCHAR wszLinkTo[MAX_PATH]; + WCHAR wszDir[MAX_PATH]; + WCHAR wszName[MAX_PATH]; + BOOL res; - return FALSE; + MultiByteToWideChar(CP_ACP, 0, pszLinkTo, -1, wszLinkTo, MAX_PATH); + MultiByteToWideChar(CP_ACP, 0, pszDir, -1, wszDir, MAX_PATH); + + res = SHGetNewLinkInfoW(wszLinkTo, wszDir, wszName, pfMustCopy, uFlags); + + if (res) + WideCharToMultiByte(CP_ACP, 0, wszName, -1, pszName, MAX_PATH, NULL, NULL); + + return res; } BOOL WINAPI SHGetNewLinkInfoW(LPCWSTR pszLinkTo, LPCWSTR pszDir, LPWSTR pszName, BOOL *pfMustCopy, UINT uFlags) { - FIXME("%s, %s, %p, %p, 0x%08x - stub\n", debugstr_w(pszLinkTo), debugstr_w(pszDir), + const WCHAR *basename; + WCHAR *dst_basename; + int i=2; + static const WCHAR lnkformat[] = {'%','s','.','l','n','k',0}; + static const WCHAR lnkformatnum[] = {'%','s',' ','(','%','d',')','.','l','n','k',0}; + + TRACE("(%s, %s, %p, %p, 0x%08x)\n", debugstr_w(pszLinkTo), debugstr_w(pszDir), pszName, pfMustCopy, uFlags); - return FALSE; + *pfMustCopy = FALSE; + + if (uFlags & SHGNLI_PIDL) + { + FIXME("SHGNLI_PIDL flag unsupported\n"); + return FALSE; + } + + if (uFlags) + FIXME("ignoring flags: 0x%08x\n", uFlags); + + /* FIXME: should test if the file is a shortcut or DOS program */ + if (GetFileAttributesW(pszLinkTo) == INVALID_FILE_ATTRIBUTES) + return FALSE; + + basename = strrchrW(pszLinkTo, '\\'); + if (basename) + basename = basename+1; + else + basename = pszLinkTo; + + lstrcpynW(pszName, pszDir, MAX_PATH); + if (!PathAddBackslashW(pszName)) + return FALSE; + + dst_basename = pszName + strlenW(pszName); + + snprintfW(dst_basename, pszName + MAX_PATH - dst_basename, lnkformat, basename); + + while (GetFileAttributesW(pszName) != INVALID_FILE_ATTRIBUTES) + { + snprintfW(dst_basename, pszName + MAX_PATH - dst_basename, lnkformatnum, basename, i); + i++; + } + + return TRUE; } + /************************************************************************* * SHStartNetConnectionDialog (SHELL32.@) */ diff --git a/reactos/include/psdk/shellapi.h b/reactos/include/psdk/shellapi.h index 8b8e91444d9..f71b3003e1b 100644 --- a/reactos/include/psdk/shellapi.h +++ b/reactos/include/psdk/shellapi.h @@ -319,6 +319,18 @@ typedef struct _SHNAMEMAPPINGW { #define SHERB_NOPROGRESSUI 0x2 #define SHERB_NOSOUND 0x4 +/****************************************** + * Links + */ + +#define SHGNLI_PIDL 0x01 +#define SHGNLI_PREFIXNAME 0x02 +#define SHGNLI_NOUNIQUE 0x04 +#define SHGNLI_NOLNK 0x08 + +BOOL WINAPI SHGetNewLinkInfoA(LPCSTR,LPCSTR,LPSTR,BOOL*,UINT); +BOOL WINAPI SHGetNewLinkInfoW(LPCWSTR,LPCWSTR,LPWSTR,BOOL*,UINT); + LPWSTR * WINAPI CommandLineToArgvW(LPCWSTR,int*); void WINAPI DragAcceptFiles(HWND,BOOL); void WINAPI DragFinish(HDROP); @@ -379,6 +391,7 @@ typedef LPSHNAMEMAPPINGW LPSHNAMEMAPPING; #define SHGetNewLinkInfo SHGetNewLinkInfoW #define SHQueryRecycleBin SHQueryRecycleBinW #define SHEmptyRecycleBin SHEmptyRecycleBinW +#define SHGetNewLinkInfo SHGetNewLinkInfoW #else #define NOTIFYICONDATA_V1_SIZE NOTIFYICONDATAA_V1_SIZE @@ -404,6 +417,7 @@ typedef LPSHNAMEMAPPINGA LPSHNAMEMAPPING; #define SHGetNewLinkInfo SHGetNewLinkInfoA #define SHQueryRecycleBin SHQueryRecycleBinA #define SHEmptyRecycleBin SHEmptyRecycleBinA +#define SHGetNewLinkInfo SHGetNewLinkInfoA #endif #ifdef __cplusplus }