https://git.reactos.org/?p=reactos.git;a=commitdiff;h=b7250325e41ef8bef91bf…
commit b7250325e41ef8bef91bf696e64fa03ab31809f7
Author: Amine Khaldi <amine.khaldi(a)reactos.org>
AuthorDate: Sat Jan 20 13:15:19 2018 +0100
Commit: Amine Khaldi <amine.khaldi(a)reactos.org>
CommitDate: Sat Jan 20 13:15:19 2018 +0100
[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 d4f886e543..b34c272455 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 2913adf6f5..763a40e349 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 4e331f4800..b2543d4154 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 4d3c5cf152..342ef46e54 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 9bb8df4d22..ed34aa73a5 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 44d037d760..a4f3a1397d 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