mirror of
https://github.com/reactos/reactos.git
synced 2024-12-31 19:42:51 +00:00
[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 r73565a05881c
and r739767b6b597
) or added in r680429a78054
. To that aim I add explicit #if(n)def __REACTOS__ guards around the code.
This commit is contained in:
parent
c22c6e3ba3
commit
9e07da5ccb
2 changed files with 265 additions and 1 deletions
|
@ -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
|
||||
}
|
||||
|
||||
/*************************************************************************
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in a new issue