From 4d88b6ec56db8ae3f1c84f1d91b5806334e17d65 Mon Sep 17 00:00:00 2001 From: Jon Griffiths Date: Wed, 4 Sep 2002 23:32:19 +0000 Subject: [PATCH] Added Assoc* funcs (but not underlying IQueryAssociations object). --- dlls/shlwapi/Makefile.in | 2 +- dlls/shlwapi/assoc.c | 355 ++++++++++++++++++++++++++++++++++++++ dlls/shlwapi/shlwapi.spec | 14 +- 3 files changed, 363 insertions(+), 8 deletions(-) create mode 100644 dlls/shlwapi/assoc.c diff --git a/dlls/shlwapi/Makefile.in b/dlls/shlwapi/Makefile.in index fa8e77cded2..ba9b494c107 100644 --- a/dlls/shlwapi/Makefile.in +++ b/dlls/shlwapi/Makefile.in @@ -4,7 +4,6 @@ TOPOBJDIR = ../.. SRCDIR = @srcdir@ VPATH = @srcdir@ MODULE = shlwapi.dll -# fixme: avoid ole32.dll import IMPORTS = ole32 user32 gdi32 advapi32 kernel32 EXTRALIBS = $(LIBUUID) $(LIBUNICODE) @@ -12,6 +11,7 @@ LDDLLFLAGS = @LDDLLFLAGS@ SYMBOLFILE = $(MODULE).tmp.o C_SRCS = \ + assoc.c \ clist.c \ istream.c \ ordinal.c \ diff --git a/dlls/shlwapi/assoc.c b/dlls/shlwapi/assoc.c new file mode 100644 index 00000000000..d9abe9c5217 --- /dev/null +++ b/dlls/shlwapi/assoc.c @@ -0,0 +1,355 @@ +/* + * SHLWAPI IQueryAssociations 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 + * + * NOTES + * These function simplify the process of using the IQueryAssociations + * interface, primarily by providing the means to get an interface pointer. + * For those not interested in the object, the AssocQuery* functions hide + * the object completely and simply provide the functionality. + * + * We require the implementation from shell32 because there is no interface + * for exporting an IQueryAssociations object available from that dll - + * as it is, we need the constructor. + */ +#include "windef.h" +#include "winnls.h" +#include "winreg.h" +#include "shlguid.h" +#include "shlwapi.h" +#include "wine/debug.h" + +WINE_DEFAULT_DEBUG_CHANNEL(shell); + +/* Default IQueryAssociations::Init() flags */ +#define SHLWAPI_DEF_ASSOCF (ASSOCF_INIT_BYEXENAME|ASSOCF_INIT_DEFAULTTOSTAR| \ + ASSOCF_INIT_DEFAULTTOFOLDER) + +/* FIXME: + * This is a temporary placeholder. We need the whole IQueryAssociations object. + */ +static IQueryAssociations* IQueryAssociations_Constructor() +{ + FIXME("() stub!\n"); + return NULL; +} + +/************************************************************************* + * 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 = lstrlenA(lpszParam); + + if (dwStrLen < dwLen) + { + *lpszOut = lpszBuff; /* Use Buffer, it is big enough */ + } + else + { + /* Create a new buffer big enough for the string */ + *lpszOut = (LPWSTR)HeapAlloc(GetProcessHeap(), 0, + (dwStrLen + 1) * sizeof(WCHAR)); + if (!*lpszOut) + return FALSE; + } + MultiByteToWideChar(0, 0, lpszParam, -1, *lpszOut, -1); + } + else + *lpszOut = NULL; + return TRUE; +} + +/************************************************************************* + * AssocCreate [SHLWAPI.253] + * + * 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 value + */ +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.255] + * + * See AssocQueryKeyA. + */ +HRESULT WINAPI AssocQueryKeyW(ASSOCF flags, ASSOCKEY key, LPCWSTR pszAssoc, + LPCWSTR pszExtra, HKEY *phkeyOut) +{ + HRESULT hRet; + IQueryAssociations* lpAssoc; + + lpAssoc = IQueryAssociations_Constructor(); + + if (!lpAssoc) + return E_OUTOFMEMORY; + + flags &= SHLWAPI_DEF_ASSOCF; + hRet = IQueryAssociations_Init(lpAssoc, flags, pszAssoc, (HKEY)0, (HWND)0); + + if (SUCCEEDED(hRet)) + hRet = IQueryAssociations_GetKey(lpAssoc, flags, key, pszExtra, phkeyOut); + + IQueryAssociations_Release(lpAssoc); + return hRet; +} + +/************************************************************************* + * AssocQueryKeyA [SHLWAPI.254] + * + * Get a file association key from the registry. + * + * PARAMS + * flags [I] Flags for the search + * key [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 + */ +HRESULT WINAPI AssocQueryKeyA(ASSOCF flags, ASSOCKEY key, LPCSTR pszAssoc, + LPCSTR pszExtra, HKEY *phkeyOut) +{ + WCHAR szAssocW[MAX_PATH], *lpszAssocW = NULL; + WCHAR szExtraW[MAX_PATH], *lpszExtraW = NULL; + HRESULT hRet = E_OUTOFMEMORY; + + if (SHLWAPI_ParamAToW(pszAssoc, szAssocW, MAX_PATH, &lpszAssocW) && + SHLWAPI_ParamAToW(pszExtra, szExtraW, MAX_PATH, &lpszExtraW)) + { + hRet = AssocQueryKeyW(flags, key, lpszAssocW, lpszExtraW, phkeyOut); + } + + if (lpszAssocW && lpszAssocW != szAssocW) + HeapFree(GetProcessHeap(), 0, lpszAssocW); + + if (lpszExtraW && lpszExtraW != szExtraW) + HeapFree(GetProcessHeap(), 0, lpszExtraW); + + return hRet; +} + +/************************************************************************* + * AssocQueryStringW [SHLWAPI.384] + * + * See AssocQueryStringA. + */ +HRESULT WINAPI AssocQueryStringW(ASSOCF flags, ASSOCSTR str, LPCWSTR pszAssoc, + LPCWSTR pszExtra, LPWSTR pszOut, DWORD *pcchOut) +{ + HRESULT hRet; + IQueryAssociations* lpAssoc; + + if (!pcchOut) + return E_INVALIDARG; + + lpAssoc = IQueryAssociations_Constructor(); + + if (!lpAssoc) + return E_OUTOFMEMORY; + + hRet = IQueryAssociations_Init(lpAssoc, flags & SHLWAPI_DEF_ASSOCF, + pszAssoc, (HKEY)0, (HWND)0); + + if (SUCCEEDED(hRet)) + hRet = IQueryAssociations_GetString(lpAssoc, flags, str, pszExtra, + pszOut, pcchOut); + + IQueryAssociations_Release(lpAssoc); + return hRet; +} + +/************************************************************************* + * AssocQueryStringA [SHLWAPI.381] + * + * Get a file association string from the registry. + * + * PARAMS + * flags [I] Flags for the search + * str [I] Type of string to get + * 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. + * Failure: An HRESULT error code. + */ +HRESULT WINAPI AssocQueryStringA(ASSOCF flags, 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; + + 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 = (LPWSTR)HeapAlloc(GetProcessHeap(), 0, + (dwLenOut + 1) * sizeof(WCHAR)); + + if (!lpszReturnW) + hRet = E_OUTOFMEMORY; + else + { + hRet = AssocQueryStringW(flags, 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.383] + * + * See AssocQueryStringByKeyA. + */ +HRESULT WINAPI AssocQueryStringByKeyW(ASSOCF flags, ASSOCSTR str, HKEY hkAssoc, + LPCWSTR pszExtra, LPWSTR pszOut, + DWORD *pcchOut) +{ + HRESULT hRet; + IQueryAssociations* lpAssoc; + + lpAssoc = IQueryAssociations_Constructor(); + + if (!lpAssoc) + return E_OUTOFMEMORY; + + flags &= SHLWAPI_DEF_ASSOCF; + hRet = IQueryAssociations_Init(lpAssoc, flags, 0, hkAssoc, (HWND)0); + + if (SUCCEEDED(hRet)) + hRet = IQueryAssociations_GetString(lpAssoc, flags, str, pszExtra, + pszOut, pcchOut); + + IQueryAssociations_Release(lpAssoc); + return hRet; +} + +/************************************************************************* + * AssocQueryStringByKeyA [SHLWAPI.382] + * + * Get a file association string from the registry, given a starting key. + * + * PARAMS + * flags [I] Flags for the search + * 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. + * Failure: An HRESULT error code. + */ +HRESULT WINAPI AssocQueryStringByKeyA(ASSOCF flags, 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; + + if (!pcchOut) + hRet = E_INVALIDARG; + else if (SHLWAPI_ParamAToW(pszExtra, szExtraW, MAX_PATH, &lpszExtraW)) + { + DWORD dwLenOut = *pcchOut; + if (dwLenOut >= MAX_PATH) + lpszReturnW = (LPWSTR)HeapAlloc(GetProcessHeap(), 0, + (dwLenOut + 1) * sizeof(WCHAR)); + + if (lpszReturnW) + { + hRet = AssocQueryStringByKeyW(flags, 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; +} diff --git a/dlls/shlwapi/shlwapi.spec b/dlls/shlwapi/shlwapi.spec index defab8f03d6..6784b743de0 100644 --- a/dlls/shlwapi/shlwapi.spec +++ b/dlls/shlwapi/shlwapi.spec @@ -252,9 +252,9 @@ init SHLWAPI_LibMain 250 stub @ 251 stub @ 252 stub @ -253 stub AssocCreate -254 stub AssocQueryKeyA -255 stub AssocQueryKeyW +253 stdcall AssocCreate(long ptr ptr) AssocCreate +254 stdcall AssocQueryKeyA(long long str ptr ptr) AssocQueryKeyA +255 stdcall AssocQueryKeyW(long long wstr ptr ptr) AssocQueryKeyW 256 stub @ 257 stub @ 258 stub @ @@ -380,10 +380,10 @@ init SHLWAPI_LibMain 378 stdcall @(wstr long long) SHLWAPI_378 379 stub @ 380 stub @ -381 stub AssocQueryStringA -382 stub AssocQueryStringByKeyA -383 stub AssocQueryStringByKeyW -384 stub AssocQueryStringW +381 stdcall AssocQueryStringA(long long ptr ptr str ptr) AssocQueryStringA +382 stdcall AssocQueryStringByKeyA(long long ptr ptr str ptr) AssocQueryStringByKeyA +383 stdcall AssocQueryStringByKeyW(long long ptr ptr wstr ptr) AssocQueryStringByKeyW +384 stdcall AssocQueryStringW(long long ptr ptr wstr ptr) AssocQueryStringW 385 stdcall ChrCmpIA(long long) ChrCmpIA 386 stdcall ChrCmpIW(long long) ChrCmpIW 387 stub ColorAdjustLuma