Wine-20041201 vendor drop
Added: vendor/wine/dlls/shlwapi/
Added: vendor/wine/dlls/shlwapi/current/
Added: vendor/wine/dlls/shlwapi/current/Makefile.in
Added: vendor/wine/dlls/shlwapi/current/assoc.c
Added: vendor/wine/dlls/shlwapi/current/clist.c
Added: vendor/wine/dlls/shlwapi/current/istream.c
Added: vendor/wine/dlls/shlwapi/current/msgbox.c
Added: vendor/wine/dlls/shlwapi/current/ordinal.c
Added: vendor/wine/dlls/shlwapi/current/path.c
Added: vendor/wine/dlls/shlwapi/current/reg.c
Added: vendor/wine/dlls/shlwapi/current/regstream.c
Added: vendor/wine/dlls/shlwapi/current/resource.h
Added: vendor/wine/dlls/shlwapi/current/shlwapi.rc
Added: vendor/wine/dlls/shlwapi/current/shlwapi.spec
Added: vendor/wine/dlls/shlwapi/current/shlwapi_De.rc
Added: vendor/wine/dlls/shlwapi/current/shlwapi_En.rc
Added: vendor/wine/dlls/shlwapi/current/shlwapi_Es.rc
Added: vendor/wine/dlls/shlwapi/current/shlwapi_It.rc
Added: vendor/wine/dlls/shlwapi/current/shlwapi_Ja.rc
Added: vendor/wine/dlls/shlwapi/current/shlwapi_Nl.rc
Added: vendor/wine/dlls/shlwapi/current/shlwapi_Pt.rc
Added: vendor/wine/dlls/shlwapi/current/shlwapi_main.c
Added: vendor/wine/dlls/shlwapi/current/stopwatch.c
Added: vendor/wine/dlls/shlwapi/current/string.c
Added: vendor/wine/dlls/shlwapi/current/thread.c
Added: vendor/wine/dlls/shlwapi/current/url.c
Added: vendor/wine/dlls/shlwapi/current/wsprintf.c
_____
Added: vendor/wine/dlls/shlwapi/current/Makefile.in
--- vendor/wine/dlls/shlwapi/current/Makefile.in 2004-12-31
16:07:59 UTC (rev 12603)
+++ vendor/wine/dlls/shlwapi/current/Makefile.in 2004-12-31
16:09:02 UTC (rev 12604)
@@ -0,0 +1,34 @@
+EXTRADEFS = -D_SHLWAPI_
+TOPSRCDIR = @top_srcdir@
+TOPOBJDIR = ../..
+SRCDIR = @srcdir@
+VPATH = @srcdir@
+MODULE = shlwapi.dll
+IMPORTS = ole32 user32 gdi32 advapi32 kernel32 ntdll
+DELAYIMPORTS = oleaut32
+EXTRALIBS = -luuid $(LIBUNICODE)
+
+C_SRCS = \
+ assoc.c \
+ clist.c \
+ istream.c \
+ msgbox.c \
+ ordinal.c \
+ path.c \
+ reg.c \
+ regstream.c \
+ shlwapi_main.c \
+ stopwatch.c \
+ string.c \
+ thread.c \
+ url.c \
+ wsprintf.c
+
+RC_SRCS = \
+ shlwapi.rc
+
+SUBDIRS = tests
+
+@MAKE_DLL_RULES@
+
+### Dependencies:
_____
Added: vendor/wine/dlls/shlwapi/current/assoc.c
--- vendor/wine/dlls/shlwapi/current/assoc.c 2004-12-31 16:07:59 UTC
(rev 12603)
+++ vendor/wine/dlls/shlwapi/current/assoc.c 2004-12-31 16:09:02 UTC
(rev 12604)
@@ -0,0 +1,704 @@
+/*
+ * IQueryAssociations object and helper functions
+ *
+ * Copyright 2002 Jon Griffiths
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
USA
+ */
+#include <stdarg.h>
+
+#include "windef.h"
+#include "winbase.h"
+#include "winnls.h"
+#include "winreg.h"
+#include "objbase.h"
+#include "shlguid.h"
+#include "shlwapi.h"
+#include "wine/debug.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(shell);
+
+/**********************************************************************
****
+ * IQueryAssociations {SHLWAPI}
+ *
+ * DESCRIPTION
+ * This object provides a layer of abstraction over the system
registry in
+ * order to simplify the process of parsing associations between
files.
+ * Associations in this context means the registry entries that link
(for
+ * example) the extension of a file with its description, list of
+ * applications to open the file with, and actions that can be
performed on it
+ * (the shell displays such information in the context menu of
explorer
+ * when you right-click on a file).
+ *
+ * HELPERS
+ * You can use this object tranparently by calling the helper functions
+ * AssocQueryKeyA(), AssocQueryStringA() and AssocQueryStringByKeyA().
These
+ * create an IQueryAssociations object, perform the requested actions
+ * and then dispose of the object. Alternatively, you can create an
instance
+ * of the object using AssocCreate() and call the following methods on
it:
+ *
+ * METHODS
+ */
+
+/* Default IQueryAssociations::Init() flags */
+#define SHLWAPI_DEF_ASSOCF
(ASSOCF_INIT_BYEXENAME|ASSOCF_INIT_DEFAULTTOSTAR| \
+ ASSOCF_INIT_DEFAULTTOFOLDER)
+
+typedef struct
+{
+ IQueryAssociationsVtbl *lpVtbl;
+ LONG ref;
+ HKEY hkeySource;
+ HKEY hkeyProgID;
+} IQueryAssociationsImpl;
+
+static struct IQueryAssociationsVtbl IQueryAssociations_vtbl;
+
+/**********************************************************************
****
+ * IQueryAssociations_Constructor [internal]
+ *
+ * Construct a new IQueryAssociations object.
+ */
+static IQueryAssociations* IQueryAssociations_Constructor(void)
+{
+ IQueryAssociationsImpl* iface;
+
+ iface = HeapAlloc(GetProcessHeap(),0,sizeof(IQueryAssociationsImpl));
+ iface->lpVtbl = &IQueryAssociations_vtbl;
+ iface->ref = 1;
+ iface->hkeySource = NULL;
+ iface->hkeyProgID = NULL;
+
+ TRACE("Returning IQueryAssociations* %p\n", iface);
+ return (IQueryAssociations*)iface;
+}
+
+/**********************************************************************
***
+ * SHLWAPI_ParamAToW
+ *
+ * Internal helper function: Convert ASCII parameter to Unicode.
+ */
+static BOOL SHLWAPI_ParamAToW(LPCSTR lpszParam, LPWSTR lpszBuff, DWORD
dwLen,
+ LPWSTR* lpszOut)
+{
+ if (lpszParam)
+ {
+ DWORD dwStrLen = MultiByteToWideChar(CP_ACP, 0, lpszParam, -1,
NULL, 0);
+
+ if (dwStrLen < dwLen)
+ {
+ *lpszOut = lpszBuff; /* Use Buffer, it is big enough */
+ }
+ else
+ {
+ /* Create a new buffer big enough for the string */
+ *lpszOut = HeapAlloc(GetProcessHeap(), 0,
+ dwStrLen * sizeof(WCHAR));
+ if (!*lpszOut)
+ return FALSE;
+ }
+ MultiByteToWideChar(CP_ACP, 0, lpszParam, -1, *lpszOut, dwStrLen);
+ }
+ else
+ *lpszOut = NULL;
+ return TRUE;
+}
+
+/**********************************************************************
***
+ * AssocCreate [SHLWAPI.@]
+ *
+ * Create a new IQueryAssociations object.
+ *
+ * PARAMS
+ * clsid [I] CLSID of object
+ * refiid [I] REFIID of interface
+ * lpInterface [O] Destination for the created IQueryAssociations
object
+ *
+ * RETURNS
+ * Success: S_OK. lpInterface contains the new object.
+ * Failure: An HRESULT error code indicating the error.
+ *
+ * NOTES
+ * refiid must be equal to IID_IQueryAssociations, or this function
will fail.
+ */
+HRESULT WINAPI AssocCreate(CLSID clsid, REFIID refiid, void
**lpInterface)
+{
+ HRESULT hRet;
+ IQueryAssociations* lpAssoc;
+
+ TRACE("(%s,%s,%p)\n", debugstr_guid(&clsid), debugstr_guid(refiid),
+ lpInterface);
+
+ if (!lpInterface)
+ return E_INVALIDARG;
+
+ *(DWORD*)lpInterface = 0;
+
+ if (!IsEqualGUID(&clsid, &IID_IQueryAssociations))
+ return E_NOTIMPL;
+
+ lpAssoc = IQueryAssociations_Constructor();
+
+ if (!lpAssoc)
+ return E_OUTOFMEMORY;
+
+ hRet = IQueryAssociations_QueryInterface(lpAssoc, refiid,
lpInterface);
+ IQueryAssociations_Release(lpAssoc);
+ return hRet;
+}
+
+/**********************************************************************
***
+ * AssocQueryKeyW [SHLWAPI.@]
+ *
+ * See AssocQueryKeyA.
+ */
+HRESULT WINAPI AssocQueryKeyW(ASSOCF cfFlags, ASSOCKEY assockey,
LPCWSTR pszAssoc,
+ LPCWSTR pszExtra, HKEY *phkeyOut)
+{
+ HRESULT hRet;
+ IQueryAssociations* lpAssoc;
+
+ TRACE("(0x%8lx,0x%8x,%s,%s,%p)\n", cfFlags, assockey,
debugstr_w(pszAssoc),
+ debugstr_w(pszExtra), phkeyOut);
+
+ lpAssoc = IQueryAssociations_Constructor();
+
+ if (!lpAssoc)
+ return E_OUTOFMEMORY;
+
+ cfFlags &= SHLWAPI_DEF_ASSOCF;
+ hRet = IQueryAssociations_Init(lpAssoc, cfFlags, pszAssoc, NULL,
NULL);
+
+ if (SUCCEEDED(hRet))
+ hRet = IQueryAssociations_GetKey(lpAssoc, cfFlags, assockey,
pszExtra, phkeyOut);
+
+ IQueryAssociations_Release(lpAssoc);
+ return hRet;
+}
+
+/**********************************************************************
***
+ * AssocQueryKeyA [SHLWAPI.@]
+ *
+ * Get a file association key from the registry.
+ *
+ * PARAMS
+ * cfFlags [I] ASSOCF_ flags from "shlwapi.h"
+ * assockey [I] Type of key to get
+ * pszAssoc [I] Key name to search below
+ * pszExtra [I] Extra information about the key location
+ * phkeyOut [O] Destination for the association key
+ *
+ * RETURNS
+ * Success: S_OK. phkeyOut contains the key.
+ * Failure: An HRESULT error code indicating the error.
+ */
+HRESULT WINAPI AssocQueryKeyA(ASSOCF cfFlags, ASSOCKEY assockey, LPCSTR
pszAssoc,
+ LPCSTR pszExtra, HKEY *phkeyOut)
+{
+ WCHAR szAssocW[MAX_PATH], *lpszAssocW = NULL;
+ WCHAR szExtraW[MAX_PATH], *lpszExtraW = NULL;
+ HRESULT hRet = E_OUTOFMEMORY;
+
+ TRACE("(0x%8lx,0x%8x,%s,%s,%p)\n", cfFlags, assockey,
debugstr_a(pszAssoc),
+ debugstr_a(pszExtra), phkeyOut);
+
+ if (SHLWAPI_ParamAToW(pszAssoc, szAssocW, MAX_PATH, &lpszAssocW) &&
+ SHLWAPI_ParamAToW(pszExtra, szExtraW, MAX_PATH, &lpszExtraW))
+ {
+ hRet = AssocQueryKeyW(cfFlags, assockey, lpszAssocW, lpszExtraW,
phkeyOut);
+ }
+
+ if (lpszAssocW && lpszAssocW != szAssocW)
+ HeapFree(GetProcessHeap(), 0, lpszAssocW);
+
+ if (lpszExtraW && lpszExtraW != szExtraW)
+ HeapFree(GetProcessHeap(), 0, lpszExtraW);
+
+ return hRet;
+}
+
+/**********************************************************************
***
+ * AssocQueryStringW [SHLWAPI.@]
+ *
+ * See AssocQueryStringA.
+ */
+HRESULT WINAPI AssocQueryStringW(ASSOCF cfFlags, ASSOCSTR str, LPCWSTR
pszAssoc,
+ LPCWSTR pszExtra, LPWSTR pszOut, DWORD
*pcchOut)
+{
+ HRESULT hRet;
+ IQueryAssociations* lpAssoc;
+
+ TRACE("(0x%8lx,0x%8x,%s,%s,%p,%p)\n", cfFlags, str,
debugstr_w(pszAssoc),
+ debugstr_w(pszExtra), pszOut, pcchOut);
+
+ if (!pcchOut)
+ return E_INVALIDARG;
+
+ lpAssoc = IQueryAssociations_Constructor();
+
+ if (!lpAssoc)
+ return E_OUTOFMEMORY;
+
+ hRet = IQueryAssociations_Init(lpAssoc, cfFlags & SHLWAPI_DEF_ASSOCF,
+ pszAssoc, NULL, NULL);
+
+ if (SUCCEEDED(hRet))
+ hRet = IQueryAssociations_GetString(lpAssoc, cfFlags, str,
pszExtra,
+ pszOut, pcchOut);
+
+ IQueryAssociations_Release(lpAssoc);
+ return hRet;
+}
+
+/**********************************************************************
***
+ * AssocQueryStringA [SHLWAPI.@]
+ *
+ * Get a file association string from the registry.
+ *
+ * PARAMS
+ * cfFlags [I] ASSOCF_ flags from "shlwapi.h"
+ * str [I] Type of string to get (ASSOCSTR enum from "shlwapi.h")
+ * pszAssoc [I] Key name to search below
+ * pszExtra [I] Extra information about the string location
+ * pszOut [O] Destination for the association string
+ * pcchOut [O] Length of pszOut
+ *
+ * RETURNS
+ * Success: S_OK. pszOut contains the string, pcchOut contains its
length.
+ * Failure: An HRESULT error code indicating the error.
+ */
+HRESULT WINAPI AssocQueryStringA(ASSOCF cfFlags, ASSOCSTR str, LPCSTR
pszAssoc,
+ LPCSTR pszExtra, LPSTR pszOut, DWORD
*pcchOut)
+{
+ WCHAR szAssocW[MAX_PATH], *lpszAssocW = NULL;
+ WCHAR szExtraW[MAX_PATH], *lpszExtraW = NULL;
+ HRESULT hRet = E_OUTOFMEMORY;
+
+ TRACE("(0x%8lx,0x%8x,%s,%s,%p,%p)\n", cfFlags, str,
debugstr_a(pszAssoc),
+ debugstr_a(pszExtra), pszOut, pcchOut);
+
+ if (!pcchOut)
+ hRet = E_INVALIDARG;
+ else if (SHLWAPI_ParamAToW(pszAssoc, szAssocW, MAX_PATH, &lpszAssocW)
&&
+ SHLWAPI_ParamAToW(pszExtra, szExtraW, MAX_PATH,
&lpszExtraW))
+ {
+ WCHAR szReturnW[MAX_PATH], *lpszReturnW = szReturnW;
+ DWORD dwLenOut = *pcchOut;
+
+ if (dwLenOut >= MAX_PATH)
+ lpszReturnW = HeapAlloc(GetProcessHeap(), 0,
+ (dwLenOut + 1) * sizeof(WCHAR));
+
+ if (!lpszReturnW)
+ hRet = E_OUTOFMEMORY;
+ else
+ {
+ hRet = AssocQueryStringW(cfFlags, str, lpszAssocW, lpszExtraW,
+ lpszReturnW, &dwLenOut);
+
+ if (SUCCEEDED(hRet))
+ WideCharToMultiByte(CP_ACP,0,szReturnW,-1,pszOut,dwLenOut,0,0);
+ *pcchOut = dwLenOut;
+
+ if (lpszReturnW && lpszReturnW != szReturnW)
+ HeapFree(GetProcessHeap(), 0, lpszReturnW);
+ }
+ }
+
+ if (lpszAssocW && lpszAssocW != szAssocW)
+ HeapFree(GetProcessHeap(), 0, lpszAssocW);
+ if (lpszExtraW && lpszExtraW != szExtraW)
+ HeapFree(GetProcessHeap(), 0, lpszExtraW);
+ return hRet;
+}
+
+/**********************************************************************
***
+ * AssocQueryStringByKeyW [SHLWAPI.@]
+ *
+ * See AssocQueryStringByKeyA.
+ */
+HRESULT WINAPI AssocQueryStringByKeyW(ASSOCF cfFlags, ASSOCSTR str,
HKEY hkAssoc,
+ LPCWSTR pszExtra, LPWSTR pszOut,
+ DWORD *pcchOut)
+{
+ HRESULT hRet;
+ IQueryAssociations* lpAssoc;
+
+ TRACE("(0x%8lx,0x%8x,%p,%s,%p,%p)\n", cfFlags, str, hkAssoc,
+ debugstr_w(pszExtra), pszOut, pcchOut);
+
+ lpAssoc = IQueryAssociations_Constructor();
+
+ if (!lpAssoc)
+ return E_OUTOFMEMORY;
+
+ cfFlags &= SHLWAPI_DEF_ASSOCF;
+ hRet = IQueryAssociations_Init(lpAssoc, cfFlags, 0, hkAssoc, NULL);
+
+ if (SUCCEEDED(hRet))
+ hRet = IQueryAssociations_GetString(lpAssoc, cfFlags, str,
pszExtra,
+ pszOut, pcchOut);
+
+ IQueryAssociations_Release(lpAssoc);
+ return hRet;
+}
+
+/**********************************************************************
***
+ * AssocQueryStringByKeyA [SHLWAPI.@]
+ *
+ * Get a file association string from the registry, given a starting
key.
+ *
+ * PARAMS
+ * cfFlags [I] ASSOCF_ flags from "shlwapi.h"
+ * str [I] Type of string to get
+ * hkAssoc [I] Key to search below
+ * pszExtra [I] Extra information about the string location
+ * pszOut [O] Destination for the association string
+ * pcchOut [O] Length of pszOut
+ *
+ * RETURNS
+ * Success: S_OK. pszOut contains the string, pcchOut contains its
length.
+ * Failure: An HRESULT error code indicating the error.
+ */
+HRESULT WINAPI AssocQueryStringByKeyA(ASSOCF cfFlags, ASSOCSTR str,
HKEY hkAssoc,
+ LPCSTR pszExtra, LPSTR pszOut,
+ DWORD *pcchOut)
+{
+ WCHAR szExtraW[MAX_PATH], *lpszExtraW;
+ WCHAR szReturnW[MAX_PATH], *lpszReturnW = szReturnW;
+ HRESULT hRet = E_OUTOFMEMORY;
+
+ TRACE("(0x%8lx,0x%8x,%p,%s,%p,%p)\n", cfFlags, str, hkAssoc,
+ debugstr_a(pszExtra), pszOut, pcchOut);
+
+ if (!pcchOut)
+ hRet = E_INVALIDARG;
+ else if (SHLWAPI_ParamAToW(pszExtra, szExtraW, MAX_PATH,
&lpszExtraW))
+ {
+ DWORD dwLenOut = *pcchOut;
+ if (dwLenOut >= MAX_PATH)
+ lpszReturnW = HeapAlloc(GetProcessHeap(), 0,
+ (dwLenOut + 1) * sizeof(WCHAR));
+
+ if (lpszReturnW)
+ {
+ hRet = AssocQueryStringByKeyW(cfFlags, str, hkAssoc, lpszExtraW,
+ lpszReturnW, &dwLenOut);
+
+ if (SUCCEEDED(hRet))
+ WideCharToMultiByte(CP_ACP,0,szReturnW,-1,pszOut,dwLenOut,0,0);
+ *pcchOut = dwLenOut;
+
+ if (lpszReturnW != szReturnW)
+ HeapFree(GetProcessHeap(), 0, lpszReturnW);
+ }
+ }
+
+ if (lpszExtraW && lpszExtraW != szExtraW)
+ HeapFree(GetProcessHeap(), 0, lpszExtraW);
+ return hRet;
+}
+
+
+/**********************************************************************
****
+ * AssocIsDangerous (SHLWAPI.@)
+ *
+ * Determine if a file association is dangerous (potentially malware).
+ *
+ * PARAMS
+ * lpszAssoc [I] Name of file or file extension to check.
+ *
+ * RETURNS
+ * TRUE, if lpszAssoc may potentially be malware (executable),
+ * FALSE, Otherwise.
+ */
+BOOL WINAPI AssocIsDangerous(LPCWSTR lpszAssoc)
+{
+ FIXME("%s\n", debugstr_w(lpszAssoc));
+ return FALSE;
+}
+
+/**********************************************************************
****
+ * IQueryAssociations_QueryInterface {SHLWAPI}
+ *
+ * See IUnknown_QueryInterface.
+ */
+static HRESULT WINAPI IQueryAssociations_fnQueryInterface(
+ IQueryAssociations* iface,
+ REFIID riid,
+ LPVOID *ppvObj)
+{
+ IQueryAssociationsImpl *This = (IQueryAssociationsImpl *)iface;
+
+ TRACE("(%p,%s,%p)\n",This, debugstr_guid(riid), ppvObj);
+
+ *ppvObj = NULL;
+
+ if (IsEqualIID(riid, &IID_IUnknown) ||
+ IsEqualIID(riid, &IID_IQueryAssociations))
+ {
+ *ppvObj = (IQueryAssociations*)This;
+
+ IQueryAssociations_AddRef((IQueryAssociations*)*ppvObj);
+ TRACE("Returning IQueryAssociations (%p)\n", *ppvObj);
+ return S_OK;
+ }
+ TRACE("Returning E_NOINTERFACE\n");
+ return E_NOINTERFACE;
+}
+
+/**********************************************************************
****
+ * IQueryAssociations_AddRef {SHLWAPI}
+ *
+ * See IUnknown_AddRef.
+ */
+static ULONG WINAPI IQueryAssociations_fnAddRef(IQueryAssociations
*iface)
+{
+ IQueryAssociationsImpl *This = (IQueryAssociationsImpl *)iface;
+
+ TRACE("(%p)->(ref before=%lu)\n",This, This->ref);
+
+ return InterlockedIncrement(&This->ref);
+}
+
+/**********************************************************************
****
+ * IQueryAssociations_Release {SHLWAPI}
+ *
+ * See IUnknown_Release.
+ */
+static ULONG WINAPI IQueryAssociations_fnRelease(IQueryAssociations
*iface)
+{
+ IQueryAssociationsImpl *This = (IQueryAssociationsImpl *)iface;
+ ULONG ulRet;
+
+ TRACE("(%p)->(ref before=%lu)\n",This, This->ref);
+
+ if (!(ulRet = InterlockedDecrement(&This->ref)))
+ {
+ TRACE("Destroying IQueryAssociations (%p)\n", This);
+ HeapFree(GetProcessHeap(), 0, This);
+ }
+ return ulRet;
+}
+
+/**********************************************************************
****
+ * IQueryAssociations_Init {SHLWAPI}
+ *
+ * Initialise an IQueryAssociations object.
+ *
+ * PARAMS
+ * iface [I] IQueryAssociations interface to initialise
+ * cfFlags [I] ASSOCF_ flags from "shlwapi.h"
+ * pszAssoc [I] String for the root key name, or NULL if hkProgid is
given
+ * hkeyProgid [I] Handle for the root key, or NULL if pszAssoc is
given
+ * hWnd [I] Reserved, must be NULL.
+ *
+ * RETURNS
+ * Success: S_OK. iface is initialised with the parameters given.
+ * Failure: An HRESULT error code indicating the error.
+ */
+static HRESULT WINAPI IQueryAssociations_fnInit(
+ IQueryAssociations *iface,
+ ASSOCF cfFlags,
+ LPCWSTR pszAssoc,
+ HKEY hkeyProgid,
+ HWND hWnd)
+{
+ static const WCHAR szProgID[] =
{'P','r','o','g','I','D',0};
+ IQueryAssociationsImpl *This = (IQueryAssociationsImpl *)iface;
+ HRESULT hr;
+
+ TRACE("(%p)->(%ld,%s,%p,%p)\n", iface,
+ cfFlags,
+ debugstr_w(pszAssoc),
+ hkeyProgid,
+ hWnd);
+ if (hWnd != NULL)
+ FIXME("hwnd != NULL not supported\n");
+ if (cfFlags != 0)
+ FIXME("unsupported flags: %lx\n", cfFlags);
+ if (pszAssoc != NULL)
+ {
+ hr = RegOpenKeyExW(HKEY_CLASSES_ROOT,
+ pszAssoc,
+ 0,
+ KEY_READ,
+ &This->hkeySource);
+ if (FAILED(hr))
+ return HRESULT_FROM_WIN32(ERROR_NO_ASSOCIATION);
+ /* if this is not a prog id */
+ if ((*pszAssoc == '.') || (*pszAssoc == '{'))
+ {
+ hr = RegOpenKeyExW(This->hkeySource,
+ szProgID,
+ 0,
+ KEY_READ,
+ &This->hkeyProgID);
+ if (FAILED(hr))
+ FIXME("Don't know what to return\n");
+ }
+ else
+ This->hkeyProgID = This->hkeySource;
+ return S_OK;
+ }
+ else if (hkeyProgid != NULL)
+ {
+ This->hkeyProgID = hkeyProgid;
+ return S_OK;
+ }
+ else
+ return E_FAIL;
+}
+
+/**********************************************************************
****
+ * IQueryAssociations_GetString {SHLWAPI}
+ *
+ * Get a file association string from the registry.
+ *
+ * PARAMS
+ * iface [I] IQueryAssociations interface to query
+ * cfFlags [I] ASSOCF_ flags from "shlwapi.h"
+ * str [I] Type of string to get (ASSOCSTR enum from
"shlwapi.h")
+ * pszExtra [I] Extra information about the string location
+ * pszOut [O] Destination for the association string
+ * pcchOut [I/O] Length of pszOut
+ *
+ * RETURNS
+ * Success: S_OK. pszOut contains the string, pcchOut contains its
length.
+ * Failure: An HRESULT error code indicating the error.
+ */
+static HRESULT WINAPI IQueryAssociations_fnGetString(
+ IQueryAssociations *iface,
+ ASSOCF cfFlags,
+ ASSOCSTR str,
+ LPCWSTR pszExtra,
+ LPWSTR pszOut,
+ DWORD *pcchOut)
+{
+ IQueryAssociationsImpl *This = (IQueryAssociationsImpl *)iface;
+
+ FIXME("(%p,0x%8lx,0x%8x,%s,%p,%p)-stub!\n", This, cfFlags, str,
+ debugstr_w(pszExtra), pszOut, pcchOut);
+ return E_NOTIMPL;
+}
+
+/**********************************************************************
****
+ * IQueryAssociations_GetKey {SHLWAPI}
+ *
+ * Get a file association key from the registry.
+ *
+ * PARAMS
+ * iface [I] IQueryAssociations interface to query
+ * cfFlags [I] ASSOCF_ flags from "shlwapi.h"
+ * assockey [I] Type of key to get (ASSOCKEY enum from "shlwapi.h")
+ * pszExtra [I] Extra information about the key location
+ * phkeyOut [O] Destination for the association key
+ *
+ * RETURNS
+ * Success: S_OK. phkeyOut contains a handle to the key.
+ * Failure: An HRESULT error code indicating the error.
+ */
+static HRESULT WINAPI IQueryAssociations_fnGetKey(
+ IQueryAssociations *iface,
+ ASSOCF cfFlags,
+ ASSOCKEY assockey,
+ LPCWSTR pszExtra,
+ HKEY *phkeyOut)
+{
+ IQueryAssociationsImpl *This = (IQueryAssociationsImpl *)iface;
+
+ FIXME("(%p,0x%8lx,0x%8x,%s,%p)-stub!\n", This, cfFlags, assockey,
+ debugstr_w(pszExtra), phkeyOut);
+ return E_NOTIMPL;
+}
+
+/**********************************************************************
****
+ * IQueryAssociations_GetData {SHLWAPI}
+ *
+ * Get the data for a file association key from the registry.
+ *
+ * PARAMS
+ * iface [I] IQueryAssociations interface to query
+ * cfFlags [I] ASSOCF_ flags from "shlwapi.h"
+ * assocdata [I] Type of data to get (ASSOCDATA enum from
"shlwapi.h")
+ * pszExtra [I] Extra information about the data location
+ * pvOut [O] Destination for the association key
+ * pcbOut [I/O] Size of pvOut
+ *
+ * RETURNS
+ * Success: S_OK. pszOut contains the data, pcbOut contains its
length.
+ * Failure: An HRESULT error code indicating the error.
+ */
+static HRESULT WINAPI IQueryAssociations_fnGetData(
+ IQueryAssociations *iface,
+ ASSOCF cfFlags,
+ ASSOCDATA assocdata,
+ LPCWSTR pszExtra,
+ LPVOID pvOut,
+ DWORD *pcbOut)
+{
+ IQueryAssociationsImpl *This = (IQueryAssociationsImpl *)iface;
+
+ FIXME("(%p,0x%8lx,0x%8x,%s,%p,%p)-stub!\n", This, cfFlags, assocdata,
+ debugstr_w(pszExtra), pvOut, pcbOut);
+ return E_NOTIMPL;
+}
+
+/**********************************************************************
****
+ * IQueryAssociations_GetEnum {SHLWAPI}
+ *
+ * Not yet implemented in native Win32.
+ *
+ * PARAMS
+ * iface [I] IQueryAssociations interface to query
+ * cfFlags [I] ASSOCF_ flags from "shlwapi.h"
+ * assocenum [I] Type of enum to get (ASSOCENUM enum from "shlwapi.h")
+ * pszExtra [I] Extra information about the enum location
+ * riid [I] REFIID to look for
+ * ppvOut [O] Destination for the interface.
+ *
+ * RETURNS
+ * Success: S_OK.
+ * Failure: An HRESULT error code indicating the error.
+ *
+ * NOTES
+ * Presumably this function returns an enumerator object.
+ */
+static HRESULT WINAPI IQueryAssociations_fnGetEnum(
+ IQueryAssociations *iface,
+ ASSOCF cfFlags,
+ ASSOCENUM assocenum,
+ LPCWSTR pszExtra,
+ REFIID riid,
+ LPVOID *ppvOut)
+{
+ IQueryAssociationsImpl *This = (IQueryAssociationsImpl *)iface;
+
+ FIXME("(%p,0x%8lx,0x%8x,%s,%s,%p)-stub!\n", This, cfFlags, assocenum,
+ debugstr_w(pszExtra), debugstr_guid(riid), ppvOut);
+ return E_NOTIMPL;
+}
+
+static struct IQueryAssociationsVtbl IQueryAssociations_vtbl =
+{
+ IQueryAssociations_fnQueryInterface,
+ IQueryAssociations_fnAddRef,
+ IQueryAssociations_fnRelease,
+ IQueryAssociations_fnInit,
+ IQueryAssociations_fnGetString,
+ IQueryAssociations_fnGetKey,
+ IQueryAssociations_fnGetData,
+ IQueryAssociations_fnGetEnum
+};
_____
Added: vendor/wine/dlls/shlwapi/current/clist.c
--- vendor/wine/dlls/shlwapi/current/clist.c 2004-12-31 16:07:59 UTC
(rev 12603)
+++ vendor/wine/dlls/shlwapi/current/clist.c 2004-12-31 16:09:02 UTC
(rev 12604)
@@ -0,0 +1,455 @@
+/*
+ * SHLWAPI DataBlock List functions
+ *
+ * Copyright 2002 Jon Griffiths
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
USA
+ */
+#include <stdarg.h>
+#include <string.h>
+
+#define COBJMACROS
+
+#include "windef.h"
+#include "winbase.h"
+#include "objbase.h"
+#include "wine/debug.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(shell);
+
+/* DataBlock list element (ordinals 17-22) */
+typedef struct tagSHLWAPI_CLIST
+{
+ ULONG ulSize; /* Size of this list element and its data */
+ ULONG ulId; /* If 0xFFFFFFFF, The real element follows
*/
+ /* Item data (or a contained SHLWAPI_CLIST) follows... */
+} SHLWAPI_CLIST, *LPSHLWAPI_CLIST;
+
+typedef const SHLWAPI_CLIST* LPCSHLWAPI_CLIST;
+
+/* ulId for contained SHLWAPI_CLIST items */
+#define CLIST_ID_CONTAINER (~0UL)
+
+HRESULT WINAPI SHAddDataBlock(LPSHLWAPI_CLIST*,LPCSHLWAPI_CLIST);
+
+/**********************************************************************
***
+ * NextItem
+ *
+ * Internal helper: move a DataBlock pointer to the next item.
+ */
+inline static LPSHLWAPI_CLIST NextItem(LPCSHLWAPI_CLIST lpList)
+{
+ const char* address = (const char*)lpList;
+ address += lpList->ulSize;
+ return (LPSHLWAPI_CLIST)address;
+}
+
+/**********************************************************************
***
+ * @ [SHLWAPI.17]
+ *
+ * Write a DataBlock list to an IStream object.
+ *
+ * PARAMS
+ * lpStream [I] IStream object to write the list to
+ * lpList [I] List of items to write
+ *
+ * RETURNS
+ * Success: S_OK. The object is written to the stream.
+ * Failure: An HRESULT error code
+ *
+ * NOTES
+ * Ordinals 17,18,19,20,21 and 22 are related and together provide a
compact
+ * list structure (a "DataBlock List"), which may be stored and
retrieved from
+ * an IStream object.
+ *
+ * The exposed API consists of:
+ *
+ * - SHWriteDataBlockList() - Write a DataBlock list to a stream,
+ * - SHReadDataBlockList() - Read and create a list from a stream,
+ * - SHFreeDataBlockList() - Free a list,
+ * - SHAddDataBlock() - Insert a new item into a list,
+ * - SHRemoveDataBlock() - Remove an item from a list,
+ * - SHFindDataBlock() - Find an item in a list.
+ *
+ * The DataBlock list is stored packed into a memory array. Each
element has a
+ * size and an associated ID. Elements must be less than 64k if the
list is
+ * to be subsequently read from a stream.
+ *
+ * Elements are aligned on DWORD boundaries. If an elements data size
is not
+ * a DWORD size multiple, the element is wrapped by inserting a
surrounding
+ * element with an Id of 0xFFFFFFFF, and size sufficient to pad to a
DWORD boundary.
+ *
+ * These functions are slow for large objects and long lists.
+ */
+HRESULT WINAPI SHWriteDataBlockList(IStream* lpStream, LPSHLWAPI_CLIST
lpList)
+{
+ ULONG ulSize;
+ HRESULT hRet = E_FAIL;
+
+ TRACE("(%p,%p)\n", lpStream, lpList);
+
+ if(lpList)
+ {
+ while (lpList->ulSize)
+ {
+ LPSHLWAPI_CLIST lpItem = lpList;
+
+ if(lpList->ulId == CLIST_ID_CONTAINER)
+ lpItem++;
+
+ hRet = IStream_Write(lpStream,lpItem,lpItem->ulSize,&ulSize);
+ if (FAILED(hRet))
+ return hRet;
+
+ if(lpItem->ulSize != ulSize)
+ return STG_E_MEDIUMFULL;
+
+ lpList = NextItem(lpList);
+ }
+ }
+
+ if(SUCCEEDED(hRet))
+ {
+ ULONG ulDummy;
+ ulSize = 0;
+
+ /* Write a terminating list entry with zero size */
+ hRet = IStream_Write(lpStream, &ulSize,sizeof(ulSize),&ulDummy);
+ }
+
+ return hRet;
+}
+
+/**********************************************************************
***
+ * @ [SHLWAPI.18]
+ *
+ * Read and create a DataBlock list from an IStream object.
+ *
+ * PARAMS
+ * lpStream [I] Stream to read the list from
+ * lppList [0] Pointer to receive the new List
+ *
+ * RETURNS
+ * Success: S_OK
+ * Failure: An HRESULT error code
+ *
+ * NOTES
+ * When read from a file, list objects are limited in size to 64k.
+ * See SHWriteDataBlockList.
+ */
+HRESULT WINAPI SHReadDataBlockList(IStream* lpStream, LPSHLWAPI_CLIST*
lppList)
+{
+ SHLWAPI_CLIST bBuff[128]; /* Temporary storage for new list item */
+ ULONG ulBuffSize = sizeof(bBuff);
+ LPSHLWAPI_CLIST pItem = bBuff;
+ ULONG ulRead, ulSize;
+ HRESULT hRet = S_OK;
+
+ TRACE("(%p,%p)\n", lpStream, lppList);
+
+ if(*lppList)
+ {
+ /* Free any existing list */
+ LocalFree((HLOCAL)*lppList);
+ *lppList = NULL;
+ }
+
+ do
+ {
+ /* Read the size of the next item */
+ hRet = IStream_Read(lpStream, &ulSize,sizeof(ulSize),&ulRead);
+
+ if(FAILED(hRet) || ulRead != sizeof(ulSize) || !ulSize)
+ break; /* Read failed or read zero size (the end of the list) */
+
+ if(ulSize > 0xFFFF)
+ {
+ LARGE_INTEGER liZero;
+ ULARGE_INTEGER ulPos;
+
+ liZero.QuadPart = 0;
+
+ /* Back the stream up; this object is too big for the list */
+ if(SUCCEEDED(IStream_Seek(lpStream, liZero, STREAM_SEEK_CUR,
&ulPos)))
+ {
+ liZero.QuadPart = ulPos.QuadPart - sizeof(ULONG);
+ IStream_Seek(lpStream, liZero, STREAM_SEEK_SET, NULL);
+ }
+ break;
+ }
+ else if (ulSize >= sizeof(SHLWAPI_CLIST))
+ {
+ /* Add this new item to the list */
+ if(ulSize > ulBuffSize)
+ {
+ /* We need more buffer space, allocate it */
+ LPSHLWAPI_CLIST lpTemp;
+
+ if (pItem == bBuff)
+ lpTemp = (LPSHLWAPI_CLIST)LocalAlloc(LMEM_ZEROINIT, ulSize);
+ else
+ lpTemp = (LPSHLWAPI_CLIST)LocalReAlloc((HLOCAL)pItem, ulSize,
+
LMEM_ZEROINIT|LMEM_MOVEABLE);
+
+ if(!lpTemp)
+ {
+ hRet = E_OUTOFMEMORY;
+ break;
+ }
+ ulBuffSize = ulSize;
+ pItem = lpTemp;
+ }
+
+ pItem->ulSize = ulSize;
+ ulSize -= sizeof(pItem->ulSize); /* already read this member */
+
+ /* Read the item Id and data */
+ hRet = IStream_Read(lpStream, &pItem->ulId, ulSize, &ulRead);
+
+ if(FAILED(hRet) || ulRead != ulSize)
+ break;
+
+ SHAddDataBlock(lppList, pItem); /* Insert Item */
+ }
+ } while(1);
+
+ /* If we allocated space, free it */
+ if(pItem != bBuff)
+ LocalFree((HLOCAL)pItem);
+
+ return hRet;
+}
+
+/**********************************************************************
***
+ * @ [SHLWAPI.19]
+ *
+ * Free a DataBlock list.
+ *
+ * PARAMS
+ * lpList [I] List to free
+ *
+ * RETURNS
+ * Nothing.
+ *
+ * NOTES
+ * See SHWriteDataBlockList.
[truncated at 1000 lines; 19759 more skipped]