[SHLWAPI] Partly revert SHLWAPI Wine 3.0 sync b725032 .
authorHermès Bélusca-Maïto <hermes.belusca-maito@reactos.org>
Mon, 22 Jan 2018 19:54:31 +0000 (20:54 +0100)
committerHermès Bélusca-Maïto <hermes.belusca-maito@reactos.org>
Mon, 22 Jan 2018 20:07:21 +0000 (21:07 +0100)
This Wine sync (that was not done against WineStaging) erased code
that had been submitted to WineStaging by the ReactOS team (clist.c
fixes, see r73565 a05881c and r73976 7b6b597) or added in r68042 9a78054.

To that aim I add explicit #if(n)def __REACTOS__ guards around the code.

dll/win32/shlwapi/assoc.c
dll/win32/shlwapi/clist.c

index b34c272..a6d03a1 100644 (file)
@@ -89,6 +89,177 @@ HRESULT WINAPI AssocCreate(CLSID clsid, REFIID refiid, void **lpInterface)
   return SHCoCreateInstance( NULL, &clsid, NULL, refiid, lpInterface );
 }
 
+#ifdef __REACTOS__
+
+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;
+}
+
+#endif
+
+
 /*************************************************************************
  * AssocGetPerceivedType  [SHLWAPI.@]
  *
@@ -111,18 +282,81 @@ HRESULT WINAPI AssocCreate(CLSID clsid, REFIID refiid, void **lpInterface)
  *  if lpType or lpFlag are NULL, the function will crash.
  *  if lpszExt is NULL, an error is returned.
  *
+#ifndef __REACTOS__
  * BUGS
  *   Unimplemented.
+#endif
  */
 HRESULT WINAPI AssocGetPerceivedType(LPCWSTR lpszExt, PERCEIVED *lpType,
                                      INT *lpFlag, LPWSTR *lppszType)
 {
+#ifndef __REACTOS__
+
   FIXME("(%s, %p, %p, %p) not supported\n", debugstr_w(lpszExt), lpType, lpFlag, lppszType);
 
   if (lpszExt == NULL)
     return HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND);
 
   return E_NOTIMPL;
+
+#else
+
+    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;
+
+    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;
+    }
+    return HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND);
+
+#endif
 }
 
 /*************************************************************************
index 763a40e..52c5f61 100644 (file)
@@ -45,8 +45,13 @@ static inline LPDATABLOCK_HEADER NextItem(LPDBLIST lpList)
  *  lpNewItem [I] The new item to add to the list
  *
  * RETURNS
+#ifndef __REACTOS__
  *  Success: S_OK. The item is added to the list.
  *  Failure: An HRESULT error code.
+#else
+ *  Success: TRUE. The item is added to the list.
+ *  Failure: FALSE.
+#endif
  *
  * NOTES
  *  If the size of the element to be inserted is less than the size of a
@@ -54,7 +59,12 @@ static inline LPDATABLOCK_HEADER NextItem(LPDBLIST lpList)
  *  the call returns S_OK but does not actually add the element.
  *  See SHWriteDataBlockList.
  */
-HRESULT WINAPI SHAddDataBlock(LPDBLIST* lppList, const DATABLOCK_HEADER *lpNewItem)
+#ifndef __REACTOS__
+HRESULT
+#else
+BOOL
+#endif
+WINAPI SHAddDataBlock(LPDBLIST* lppList, const DATABLOCK_HEADER *lpNewItem)
 {
   LPDATABLOCK_HEADER lpInsertAt = NULL;
   ULONG ulSize;
@@ -62,11 +72,19 @@ HRESULT WINAPI SHAddDataBlock(LPDBLIST* lppList, const DATABLOCK_HEADER *lpNewIt
   TRACE("(%p,%p)\n", lppList, lpNewItem);
 
   if(!lppList || !lpNewItem )
+#ifndef __REACTOS__
     return E_INVALIDARG;
+#else
+    return FALSE;
+#endif
 
   if (lpNewItem->cbSize < sizeof(DATABLOCK_HEADER) ||
       lpNewItem->dwSignature == CLIST_ID_CONTAINER)
+#ifndef __REACTOS__
     return S_OK;
+#else
+    return FALSE;
+#endif
 
   ulSize = lpNewItem->cbSize;
 
@@ -123,9 +141,17 @@ HRESULT WINAPI SHAddDataBlock(LPDBLIST* lppList, const DATABLOCK_HEADER *lpNewIt
     lpInsertAt = NextItem(lpInsertAt);
     lpInsertAt->cbSize = 0;
 
+#ifndef __REACTOS__
     return lpNewItem->cbSize;
+#else
+    return TRUE;
+#endif
   }
+#ifndef __REACTOS__
   return S_OK;
+#else
+  return FALSE;
+#endif
 }
 
 /*************************************************************************
@@ -343,7 +369,11 @@ VOID WINAPI SHFreeDataBlockList(LPDBLIST lpList)
  */
 BOOL WINAPI SHRemoveDataBlock(LPDBLIST* lppList, DWORD dwSignature)
 {
+#ifndef __REACTOS__
   LPDATABLOCK_HEADER lpList = 0;
+#else
+  LPDATABLOCK_HEADER lpList = NULL;
+#endif
   LPDATABLOCK_HEADER lpItem = NULL;
   LPDATABLOCK_HEADER lpNext;
   ULONG ulNewSize;