[SHLWAPI] Partly revert SHLWAPI Wine 3.0 sync b725032 .

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.
This commit is contained in:
Hermès Bélusca-Maïto 2018-01-22 20:54:31 +01:00
parent c22c6e3ba3
commit 9e07da5ccb
No known key found for this signature in database
GPG key ID: 3B2539C65E7B93D0
2 changed files with 265 additions and 1 deletions

View 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
}
/*************************************************************************

View 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;