From b7250325e41ef8bef91bf696e64fa03ab31809f7 Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Sat, 20 Jan 2018 13:15:19 +0100 Subject: [PATCH] [SHLWAPI] Sync with Wine 3.0. CORE-14225 --- dll/win32/shlwapi/assoc.c | 227 ++---------------------------------- dll/win32/shlwapi/clist.c | 14 +-- dll/win32/shlwapi/ordinal.c | 6 - dll/win32/shlwapi/path.c | 28 +++-- dll/win32/shlwapi/url.c | 9 +- media/doc/README.WINE | 2 +- 6 files changed, 36 insertions(+), 250 deletions(-) diff --git a/dll/win32/shlwapi/assoc.c b/dll/win32/shlwapi/assoc.c index d4f886e5432..b34c2724551 100644 --- a/dll/win32/shlwapi/assoc.c +++ b/dll/win32/shlwapi/assoc.c @@ -89,174 +89,6 @@ HRESULT WINAPI AssocCreate(CLSID clsid, REFIID refiid, void **lpInterface) return SHCoCreateInstance( NULL, &clsid, NULL, refiid, lpInterface ); } - -struct AssocPerceivedInfo -{ - PCWSTR Type; - PERCEIVED Perceived; - INT FlagHardcoded; - INT FlagSoftcoded; - PCWSTR Extensions; -}; - -static const WCHAR unspecified_exts[] = { - '.','l','n','k',0, - '.','s','e','a','r','c','h','-','m','s',0, - 0 -}; - -static const WCHAR image_exts[] = { - '.','b','m','p',0, - '.','d','i','b',0, - '.','e','m','f',0, - '.','g','i','f',0, - '.','i','c','o',0, - '.','j','f','i','f',0, - '.','j','p','e',0, - '.','j','p','e','g',0, - '.','j','p','g',0, - '.','p','n','g',0, - '.','r','l','e',0, - '.','t','i','f',0, - '.','t','i','f','f',0, - '.','w','m','f',0, - 0 -}; - -static const WCHAR audio_exts[] = { - '.','a','i','f',0, - '.','a','i','f','c',0, - '.','a','i','f','f',0, - '.','a','u',0, - '.','m','3','u',0, - '.','m','i','d',0, - '.','m','i','d','i',0, -#if _WIN32_WINNT > 0x602 - '.','m','p','2',0, -#endif - '.','m','p','3',0, - '.','r','m','i',0, - '.','s','n','d',0, - '.','w','a','v',0, - '.','w','a','x',0, - '.','w','m','a',0, - 0 -}; - -static const WCHAR video_exts[] = { - '.','a','s','f',0, - '.','a','s','x',0, - '.','a','v','i',0, - '.','d','v','r','-','m','s',0, - '.','I','V','F',0, - '.','m','1','v',0, -#if _WIN32_WINNT <= 0x602 - '.','m','p','2',0, -#endif - '.','m','p','2','v',0, - '.','m','p','a',0, - '.','m','p','e',0, - '.','m','p','e','g',0, - '.','m','p','g',0, - '.','m','p','v','2',0, - '.','w','m',0, - '.','w','m','v',0, - '.','w','m','x',0, - '.','w','v','x',0, - 0 -}; - -static const WCHAR compressed_exts[] = { - '.','z','i','p',0, - 0 -}; - -static const WCHAR document_exts[] = { -#if _WIN32_WINNT >= 0x600 - '.','h','t','m',0, - '.','h','t','m','l',0, -#endif - '.','m','h','t',0, - 0 -}; - -static const WCHAR system_exts[] = { - '.','c','p','l',0, - 0 -}; - -static const WCHAR application_exts[] = { - '.','b','a','s',0, - '.','b','a','t',0, - '.','c','m','d',0, - '.','c','o','m',0, - '.','e','x','e',0, - '.','h','t','a',0, - '.','m','s','i',0, - '.','p','i','f',0, - '.','r','e','g',0, - '.','s','c','r',0, - '.','v','b',0, - 0 -}; - -const WCHAR type_text[] = {'t','e','x','t',0}; -const WCHAR type_image[] = {'i','m','a','g','e',0}; -const WCHAR type_audio[] = {'a','u','d','i','o',0}; -const WCHAR type_video[] = {'v','i','d','e','o',0}; -const WCHAR type_compressed[] = {'c','o','m','p','r','e','s','s','e','d',0}; -const WCHAR type_document[] = {'d','o','c','u','m','e','n','t',0}; -const WCHAR type_system[] = {'s','y','s','t','e','m',0}; -const WCHAR type_application[] = {'a','p','p','l','i','c','a','t','i','o','n',0}; - -#define HARDCODED_NATIVE_WMSDK (PERCEIVEDFLAG_HARDCODED | PERCEIVEDFLAG_NATIVESUPPORT | PERCEIVEDFLAG_WMSDK) -#define HARDCODED_NATIVE_GDIPLUS (PERCEIVEDFLAG_HARDCODED | PERCEIVEDFLAG_NATIVESUPPORT | PERCEIVEDFLAG_GDIPLUS) -#define HARDCODED_NATIVE_ZIPFLDR (PERCEIVEDFLAG_HARDCODED | PERCEIVEDFLAG_NATIVESUPPORT | PERCEIVEDFLAG_ZIPFOLDER) -#define SOFTCODED_NATIVESUPPORT (PERCEIVEDFLAG_SOFTCODED | PERCEIVEDFLAG_NATIVESUPPORT) - -static const struct AssocPerceivedInfo known_types[] = { - { NULL, PERCEIVED_TYPE_UNSPECIFIED, PERCEIVEDFLAG_HARDCODED, PERCEIVEDFLAG_SOFTCODED, unspecified_exts }, - { type_text, PERCEIVED_TYPE_TEXT, PERCEIVEDFLAG_HARDCODED, SOFTCODED_NATIVESUPPORT, NULL }, - { type_image, PERCEIVED_TYPE_IMAGE, HARDCODED_NATIVE_GDIPLUS, PERCEIVEDFLAG_SOFTCODED, image_exts }, - { type_audio, PERCEIVED_TYPE_AUDIO, HARDCODED_NATIVE_WMSDK, PERCEIVEDFLAG_SOFTCODED, audio_exts }, - { type_video, PERCEIVED_TYPE_VIDEO, HARDCODED_NATIVE_WMSDK, PERCEIVEDFLAG_SOFTCODED, video_exts }, - { type_compressed, PERCEIVED_TYPE_COMPRESSED, HARDCODED_NATIVE_ZIPFLDR, PERCEIVEDFLAG_SOFTCODED, compressed_exts }, - { type_document, PERCEIVED_TYPE_DOCUMENT, PERCEIVEDFLAG_HARDCODED, PERCEIVEDFLAG_SOFTCODED, document_exts }, - { type_system, PERCEIVED_TYPE_SYSTEM, PERCEIVEDFLAG_HARDCODED, PERCEIVEDFLAG_SOFTCODED, system_exts }, - { type_application, PERCEIVED_TYPE_APPLICATION, PERCEIVEDFLAG_HARDCODED, PERCEIVEDFLAG_SOFTCODED, application_exts }, -}; - -static const struct AssocPerceivedInfo* AssocFindByBuiltinExtension(LPCWSTR pszExt) -{ - UINT n; - for (n = 0; n < sizeof(known_types) / sizeof(known_types[0]); ++n) - { - PCWSTR Ext = known_types[n].Extensions; - while (Ext && *Ext) - { - if (!StrCmpIW(Ext, pszExt)) - return &known_types[n]; - Ext += (strlenW(Ext) + 1); - } - } - return NULL; -} - -static const struct AssocPerceivedInfo* AssocFindByType(LPCWSTR pszType) -{ - UINT n; - for (n = 0; n < sizeof(known_types) / sizeof(known_types[0]); ++n) - { - if (known_types[n].Type) - { - if (!StrCmpIW(known_types[n].Type, pszType)) - return &known_types[n]; - } - } - return NULL; -} - - /************************************************************************* * AssocGetPerceivedType [SHLWAPI.@] * @@ -278,64 +110,19 @@ static const struct AssocPerceivedInfo* AssocFindByType(LPCWSTR pszType) * lppszType is optional and it can be NULL. * if lpType or lpFlag are NULL, the function will crash. * if lpszExt is NULL, an error is returned. + * + * BUGS + * Unimplemented. */ HRESULT WINAPI AssocGetPerceivedType(LPCWSTR lpszExt, PERCEIVED *lpType, INT *lpFlag, LPWSTR *lppszType) { - static const WCHAR PerceivedTypeKey[] = {'P','e','r','c','e','i','v','e','d','T','y','p','e',0}; - static const WCHAR SystemFileAssociationsKey[] = {'S','y','s','t','e','m','F','i','l','e', - 'A','s','s','o','c','i','a','t','i','o','n','s','\\','%','s',0}; - const struct AssocPerceivedInfo *Info; + FIXME("(%s, %p, %p, %p) not supported\n", debugstr_w(lpszExt), lpType, lpFlag, lppszType); - TRACE("(%s,%p,%p,%p)\n", debugstr_w(lpszExt), lpType, lpFlag, lppszType); - - Info = AssocFindByBuiltinExtension(lpszExt); - if (Info) - { - *lpType = Info->Perceived; - *lpFlag = Info->FlagHardcoded; - } - else - { - WCHAR Buffer[100] = { 0 }; - DWORD Size = sizeof(Buffer); - if (RegGetValueW(HKEY_CLASSES_ROOT, lpszExt, PerceivedTypeKey, - RRF_RT_REG_SZ, NULL, Buffer, &Size) == ERROR_SUCCESS) - { - Info = AssocFindByType(Buffer); - } - if (!Info) - { - WCHAR KeyName[MAX_PATH] = { 0 }; - snprintfW(KeyName, MAX_PATH, SystemFileAssociationsKey, lpszExt); - Size = sizeof(Buffer); - if (RegGetValueW(HKEY_CLASSES_ROOT, KeyName, PerceivedTypeKey, - RRF_RT_REG_SZ, NULL, Buffer, &Size) == ERROR_SUCCESS) - { - Info = AssocFindByType(Buffer); - } - } - if (Info) - { - *lpType = Info->Perceived; - *lpFlag = Info->FlagSoftcoded; - } - } - - if (Info) - { - if (lppszType && Info->Type) - { - return SHStrDupW(Info->Type, lppszType); - } - return Info->Type ? S_OK : E_FAIL; - } - else - { - *lpType = PERCEIVED_TYPE_UNSPECIFIED; - *lpFlag = 0; - } + if (lpszExt == NULL) return HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND); + + return E_NOTIMPL; } /************************************************************************* diff --git a/dll/win32/shlwapi/clist.c b/dll/win32/shlwapi/clist.c index 2913adf6f5f..763a40e3498 100644 --- a/dll/win32/shlwapi/clist.c +++ b/dll/win32/shlwapi/clist.c @@ -54,19 +54,19 @@ static inline LPDATABLOCK_HEADER NextItem(LPDBLIST lpList) * the call returns S_OK but does not actually add the element. * See SHWriteDataBlockList. */ -BOOL WINAPI SHAddDataBlock(LPDBLIST* lppList, const DATABLOCK_HEADER *lpNewItem) +HRESULT WINAPI SHAddDataBlock(LPDBLIST* lppList, const DATABLOCK_HEADER *lpNewItem) { LPDATABLOCK_HEADER lpInsertAt = NULL; ULONG ulSize; TRACE("(%p,%p)\n", lppList, lpNewItem); - if(!lppList || !lpNewItem) - return FALSE; + if(!lppList || !lpNewItem ) + return E_INVALIDARG; if (lpNewItem->cbSize < sizeof(DATABLOCK_HEADER) || lpNewItem->dwSignature == CLIST_ID_CONTAINER) - return FALSE; + return S_OK; ulSize = lpNewItem->cbSize; @@ -123,9 +123,9 @@ BOOL WINAPI SHAddDataBlock(LPDBLIST* lppList, const DATABLOCK_HEADER *lpNewItem) lpInsertAt = NextItem(lpInsertAt); lpInsertAt->cbSize = 0; - return TRUE; + return lpNewItem->cbSize; } - return FALSE; + return S_OK; } /************************************************************************* @@ -343,7 +343,7 @@ VOID WINAPI SHFreeDataBlockList(LPDBLIST lpList) */ BOOL WINAPI SHRemoveDataBlock(LPDBLIST* lppList, DWORD dwSignature) { - LPDATABLOCK_HEADER lpList = NULL; + LPDATABLOCK_HEADER lpList = 0; LPDATABLOCK_HEADER lpItem = NULL; LPDATABLOCK_HEADER lpNext; ULONG ulNewSize; diff --git a/dll/win32/shlwapi/ordinal.c b/dll/win32/shlwapi/ordinal.c index 4e331f48006..b2543d41540 100644 --- a/dll/win32/shlwapi/ordinal.c +++ b/dll/win32/shlwapi/ordinal.c @@ -78,12 +78,6 @@ HANDLE WINAPI SHMapHandle(HANDLE hShared, DWORD dwSrcProcId, DWORD dwDstProcId, TRACE("(%p,%d,%d,%08x,%08x)\n", hShared, dwDstProcId, dwSrcProcId, dwAccess, dwOptions); - if (!hShared) - { - TRACE("Returning handle NULL\n"); - return NULL; - } - /* Get dest process handle */ if (dwDstProcId == dwMyProcId) hDst = GetCurrentProcess(); diff --git a/dll/win32/shlwapi/path.c b/dll/win32/shlwapi/path.c index 4d3c5cf1521..342ef46e54d 100644 --- a/dll/win32/shlwapi/path.c +++ b/dll/win32/shlwapi/path.c @@ -527,17 +527,25 @@ int WINAPI PathGetDriveNumberA(LPCSTR lpszPath) * * See PathGetDriveNumberA. */ -int WINAPI PathGetDriveNumberW(LPCWSTR lpszPath) +int WINAPI PathGetDriveNumberW(const WCHAR *path) { - TRACE ("(%s)\n",debugstr_w(lpszPath)); + WCHAR drive; - if (lpszPath) - { - WCHAR tl = tolowerW(lpszPath[0]); - if (tl >= 'a' && tl <= 'z' && lpszPath[1] == ':') - return tl - 'a'; - } - return -1; + static const WCHAR nt_prefixW[] = {'\\','\\','?','\\'}; + + TRACE("(%s)\n", debugstr_w(path)); + + if (!path) + return -1; + + if (!strncmpW(path, nt_prefixW, 4)) + path += 4; + + drive = tolowerW(path[0]); + if (drive < 'a' || drive > 'z' || path[1] != ':') + return -1; + + return drive - 'a'; } /************************************************************************* @@ -1643,7 +1651,7 @@ BOOL WINAPI PathIsRootW(LPCWSTR lpszPath) * Although this function is prototyped as returning a BOOL, it returns * FILE_ATTRIBUTE_DIRECTORY for success. This means that code such as: * - *| if (PathIsDirectoryA("c:\\windows\\") != FALSE) + *| if (PathIsDirectoryA("c:\\windows\\") == TRUE) *| ... * * will always fail. diff --git a/dll/win32/shlwapi/url.c b/dll/win32/shlwapi/url.c index 9bb8df4d221..ed34aa73a5b 100644 --- a/dll/win32/shlwapi/url.c +++ b/dll/win32/shlwapi/url.c @@ -154,7 +154,7 @@ HRESULT WINAPI ParseURLA(LPCSTR x, PARSEDURLA *y) if(y->cbSize != sizeof(*y)) return E_INVALIDARG; - while(*ptr && (isalnum(*ptr) || *ptr == '-')) + while(*ptr && (isalnum(*ptr) || *ptr == '-' || *ptr == '+' || *ptr == '.')) ptr++; if (*ptr != ':' || ptr <= x+1) { @@ -188,7 +188,7 @@ HRESULT WINAPI ParseURLW(LPCWSTR x, PARSEDURLW *y) if(y->cbSize != sizeof(*y)) return E_INVALIDARG; - while(*ptr && (isalnumW(*ptr) || *ptr == '-')) + while(*ptr && (isalnumW(*ptr) || *ptr == '-' || *ptr == '+' || *ptr == '.')) ptr++; if (*ptr != ':' || ptr <= x+1) { @@ -902,10 +902,7 @@ HRESULT WINAPI UrlCombineW(LPCWSTR pszBase, LPCWSTR pszRelative, work = preliminary + base.cchProtocol+1+base.cchSuffix - 1; if (*work++ != '/') *(work++) = '/'; - if (relative.pszSuffix[0] == '.' && relative.pszSuffix[1] == 0) - *work = 0; - else - strcpyW(work, relative.pszSuffix); + strcpyW(work, relative.pszSuffix); break; default: diff --git a/media/doc/README.WINE b/media/doc/README.WINE index 44d037d760b..a4f3a1397d3 100644 --- a/media/doc/README.WINE +++ b/media/doc/README.WINE @@ -174,7 +174,7 @@ reactos/dll/win32/shdoclc # Synced to WineStaging-2.9 reactos/dll/win32/shdocvw # Synced to Wine-3.0 reactos/dll/win32/shell32 # Forked at Wine-20071011 reactos/dll/win32/shfolder # Synced to WineStaging-2.9 -reactos/dll/win32/shlwapi # Synced to WineStaging-2.16 +reactos/dll/win32/shlwapi # Synced to Wine-3.0 reactos/dll/win32/slbcsp # Synced to WineStaging-2.9 reactos/dll/win32/snmpapi # Synced to WineStaging-2.9 reactos/dll/win32/softpub # Synced to WineStaging-2.9