Author: hpoussin Date: Mon Oct 1 23:09:53 2007 New Revision: 29336
URL: http://svn.reactos.org/svn/reactos?rev=29336&view=rev Log: Autosyncing with Wine HEAD
Added: trunk/reactos/dll/win32/browseui/aclmulti.c (with props) trunk/reactos/dll/win32/browseui/browseui.h (with props) trunk/reactos/dll/win32/browseui/browseui.rbuild (with props) trunk/reactos/dll/win32/browseui/browseui.spec (with props) trunk/reactos/dll/win32/browseui/browseui_main.c (with props) trunk/reactos/dll/win32/browseui/browseui_ros.diff (with props) trunk/reactos/dll/win32/browseui/regsvr.c (with props) trunk/reactos/dll/win32/browseui/version.rc (with props)
Added: trunk/reactos/dll/win32/browseui/aclmulti.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/browseui/aclmulti... ============================================================================== --- trunk/reactos/dll/win32/browseui/aclmulti.c (added) +++ trunk/reactos/dll/win32/browseui/aclmulti.c Mon Oct 1 23:09:53 2007 @@ -1,0 +1,331 @@ +/* + * Multisource AutoComplete list + * + * Copyright 2007 Mikolaj Zalewski + * + * 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include "config.h" + +#include <stdarg.h> + +#define COBJMACROS + +#include "wine/debug.h" +#include "windef.h" +#include "winbase.h" +#include "winreg.h" +#include "winuser.h" +#include "shlwapi.h" +#include "winerror.h" +#include "objbase.h" + +#include "shlguid.h" +#include "shlobj.h" + +#include "wine/unicode.h" + +#include "browseui.h" + +WINE_DEFAULT_DEBUG_CHANNEL(browseui); + +struct ACLMultiSublist { + IUnknown *punk; + IEnumString *pEnum; + IACList *pACL; +}; + +typedef struct tagACLMulti { + const IEnumStringVtbl *vtbl; + const IACListVtbl *aclVtbl; + const IObjMgrVtbl *objmgrVtbl; + LONG refCount; + INT nObjs; + INT currObj; + struct ACLMultiSublist *objs; +} ACLMulti; + +static const IEnumStringVtbl ACLMultiVtbl; +static const IACListVtbl ACLMulti_ACListVtbl; +static const IObjMgrVtbl ACLMulti_ObjMgrVtbl; + +static inline ACLMulti *impl_from_IACList(IACList *iface) +{ + return (ACLMulti *)((char *)iface - FIELD_OFFSET(ACLMulti, aclVtbl)); +} + +static inline ACLMulti *impl_from_IObjMgr(IObjMgr *iface) +{ + return (ACLMulti *)((char *)iface - FIELD_OFFSET(ACLMulti, objmgrVtbl)); +} + +static void release_obj(struct ACLMultiSublist *obj) +{ + IUnknown_Release(obj->punk); + if (obj->pEnum) + IEnumString_Release(obj->pEnum); + if (obj->pACL) + IACList_Release(obj->pACL); +} + +HRESULT WINAPI ACLMulti_Constructor(IUnknown *pUnkOuter, IUnknown **ppOut) +{ + ACLMulti *This; + if (pUnkOuter) + return CLASS_E_NOAGGREGATION; + + This = CoTaskMemAlloc(sizeof(ACLMulti)); + if (This == NULL) + return E_OUTOFMEMORY; + ZeroMemory(This, sizeof(*This)); + This->vtbl = &ACLMultiVtbl; + This->aclVtbl = &ACLMulti_ACListVtbl; + This->objmgrVtbl = &ACLMulti_ObjMgrVtbl; + This->refCount = 1; + + TRACE("returning %p\n", This); + *ppOut = (IUnknown *)This; + BROWSEUI_refCount++; + return S_OK; +} + +static void WINAPI ACLMulti_Destructor(ACLMulti *This) +{ + int i; + TRACE("destroying %p\n", This); + for (i = 0; i < This->nObjs; i++) + release_obj(&This->objs[i]); + CoTaskMemFree(This->objs); + CoTaskMemFree(This); + BROWSEUI_refCount--; +} + +static HRESULT WINAPI ACLMulti_QueryInterface(IEnumString *iface, REFIID iid, LPVOID *ppvOut) +{ + ACLMulti *This = (ACLMulti *)iface; + *ppvOut = NULL; + + if (IsEqualIID(iid, &IID_IUnknown) || IsEqualIID(iid, &IID_IEnumString)) + { + *ppvOut = This; + } + else if (IsEqualIID(iid, &IID_IACList)) + { + *ppvOut = &This->aclVtbl; + } + else if (IsEqualIID(iid, &IID_IObjMgr)) + { + *ppvOut = &This->objmgrVtbl; + } + + if (*ppvOut) + { + IUnknown_AddRef(iface); + return S_OK; + } + + WARN("unsupported interface: %s\n", debugstr_guid(iid)); + return E_NOINTERFACE; +} + +static ULONG WINAPI ACLMulti_AddRef(IEnumString *iface) +{ + ACLMulti *This = (ACLMulti *)iface; + return InterlockedIncrement(&This->refCount); +} + +static ULONG WINAPI ACLMulti_Release(IEnumString *iface) +{ + ACLMulti *This = (ACLMulti *)iface; + ULONG ret; + + ret = InterlockedDecrement(&This->refCount); + if (ret == 0) + ACLMulti_Destructor(This); + return ret; +} + +static HRESULT WINAPI ACLMulti_Append(IObjMgr *iface, IUnknown *obj) +{ + ACLMulti *This = impl_from_IObjMgr(iface); + + TRACE("(%p, %p)\n", This, obj); + if (obj == NULL) + return E_FAIL; + + This->objs = CoTaskMemRealloc(This->objs, sizeof(This->objs[0]) * (This->nObjs+1)); + This->objs[This->nObjs].punk = obj; + IUnknown_AddRef(obj); + if (FAILED(IUnknown_QueryInterface(obj, &IID_IEnumString, (LPVOID *)&This->objs[This->nObjs].pEnum))) + This->objs[This->nObjs].pEnum = NULL; + if (FAILED(IUnknown_QueryInterface(obj, &IID_IACList, (LPVOID *)&This->objs[This->nObjs].pACL))) + This->objs[This->nObjs].pACL = NULL; + This->nObjs++; + return S_OK; +} + +static HRESULT WINAPI ACLMulti_Remove(IObjMgr *iface, IUnknown *obj) +{ + ACLMulti *This = impl_from_IObjMgr(iface); + int i; + + TRACE("(%p, %p)\n", This, obj); + for (i = 0; i < This->nObjs; i++) + if (This->objs[i].punk == obj) + { + release_obj(&This->objs[i]); + memmove(&This->objs[i], &This->objs[i+1], (This->nObjs-i-1)*sizeof(struct ACLMultiSublist)); + This->nObjs--; + This->objs = CoTaskMemRealloc(This->objs, sizeof(This->objs[0]) * This->nObjs); + return S_OK; + } + + return E_FAIL; +} + +static HRESULT WINAPI ACLMulti_Next(IEnumString *iface, ULONG celt, LPOLESTR *rgelt, ULONG *pceltFetched) +{ + ACLMulti *This = (ACLMulti *)iface; + + TRACE("(%p, %d, %p, %p)\n", iface, celt, rgelt, pceltFetched); + while (This->currObj < This->nObjs) + { + if (This->objs[This->currObj].pEnum) + { + /* native browseui 6.0 also returns only one element */ + HRESULT ret = IEnumString_Next(This->objs[This->currObj].pEnum, 1, rgelt, pceltFetched); + if (ret != S_FALSE) + return ret; + } + This->currObj++; + } + + if (pceltFetched) + *pceltFetched = 0; + *rgelt = NULL; + return S_FALSE; +} + +static HRESULT WINAPI ACLMulti_Reset(IEnumString *iface) +{ + ACLMulti *This = (ACLMulti *)iface; + int i; + + This->currObj = 0; + for (i = 0; i < This->nObjs; i++) + { + if (This->objs[i].pEnum) + IEnumString_Reset(This->objs[i].pEnum); + } + return S_OK; +} + +static HRESULT WINAPI ACLMulti_Skip(IEnumString *iface, ULONG celt) +{ + /* native browseui 6.0 returns this: */ + return E_NOTIMPL; +} + +static HRESULT WINAPI ACLMulti_Clone(IEnumString *iface, IEnumString **ppOut) +{ + *ppOut = NULL; + /* native browseui 6.0 returns this: */ + return E_OUTOFMEMORY; +} + +static HRESULT WINAPI ACLMulti_Expand(IACList *iface, LPCWSTR wstr) +{ + ACLMulti *This = impl_from_IACList(iface); + HRESULT res = S_OK; + int i; + + for (i = 0; i < This->nObjs; i++) + { + if (!This->objs[i].pACL) + continue; + res = IACList_Expand(This->objs[i].pACL, wstr); + if (res == S_OK) + break; + } + return res; +} + +static const IEnumStringVtbl ACLMultiVtbl = +{ + ACLMulti_QueryInterface, + ACLMulti_AddRef, + ACLMulti_Release, + + ACLMulti_Next, + ACLMulti_Skip, + ACLMulti_Reset, + ACLMulti_Clone +}; + +static HRESULT WINAPI ACLMulti_IObjMgr_QueryInterface(IObjMgr *iface, REFIID iid, LPVOID *ppvOut) +{ + ACLMulti *This = impl_from_IObjMgr(iface); + return ACLMulti_QueryInterface((IEnumString *)This, iid, ppvOut); +} + +static ULONG WINAPI ACLMulti_IObjMgr_AddRef(IObjMgr *iface) +{ + ACLMulti *This = impl_from_IObjMgr(iface); + return ACLMulti_AddRef((IEnumString *)This); +} + +static ULONG WINAPI ACLMulti_IObjMgr_Release(IObjMgr *iface) +{ + ACLMulti *This = impl_from_IObjMgr(iface); + return ACLMulti_Release((IEnumString *)This); +} + +static const IObjMgrVtbl ACLMulti_ObjMgrVtbl = +{ + ACLMulti_IObjMgr_QueryInterface, + ACLMulti_IObjMgr_AddRef, + ACLMulti_IObjMgr_Release, + + ACLMulti_Append, + ACLMulti_Remove +}; + +static HRESULT WINAPI ACLMulti_IACList_QueryInterface(IACList *iface, REFIID iid, LPVOID *ppvOut) +{ + ACLMulti *This = impl_from_IACList(iface); + return ACLMulti_QueryInterface((IEnumString *)This, iid, ppvOut); +} + +static ULONG WINAPI ACLMulti_IACList_AddRef(IACList *iface) +{ + ACLMulti *This = impl_from_IACList(iface); + return ACLMulti_AddRef((IEnumString *)This); +} + +static ULONG WINAPI ACLMulti_IACList_Release(IACList *iface) +{ + ACLMulti *This = impl_from_IACList(iface); + return ACLMulti_Release((IEnumString *)This); +} + +static const IACListVtbl ACLMulti_ACListVtbl = +{ + ACLMulti_IACList_QueryInterface, + ACLMulti_IACList_AddRef, + ACLMulti_IACList_Release, + + ACLMulti_Expand +};
Propchange: trunk/reactos/dll/win32/browseui/aclmulti.c ------------------------------------------------------------------------------ svn:eol-style = native
Added: trunk/reactos/dll/win32/browseui/browseui.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/browseui/browseui... ============================================================================== --- trunk/reactos/dll/win32/browseui/browseui.h (added) +++ trunk/reactos/dll/win32/browseui/browseui.h Mon Oct 1 23:09:53 2007 @@ -1,0 +1,28 @@ +/* + * Internal header for browseui.dll + * + * Copyright 2007 Mikolaj Zalewski + * + * 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#ifndef __WINE_BROWSEUI_H +#define __WINE_BROWSEUI_H + +extern LONG BROWSEUI_refCount; + +HRESULT WINAPI ACLMulti_Constructor(IUnknown *punkOuter, IUnknown **ppOut); + +#endif /* __WINE_SHDOCVW_H */
Propchange: trunk/reactos/dll/win32/browseui/browseui.h ------------------------------------------------------------------------------ svn:eol-style = native
Added: trunk/reactos/dll/win32/browseui/browseui.rbuild URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/browseui/browseui... ============================================================================== --- trunk/reactos/dll/win32/browseui/browseui.rbuild (added) +++ trunk/reactos/dll/win32/browseui/browseui.rbuild Mon Oct 1 23:09:53 2007 @@ -1,0 +1,26 @@ +<?xml version="1.0"?> +<!DOCTYPE module SYSTEM "../../../tools/rbuild/project.dtd"> +<module name="browseui" type="win32dll" baseaddress="${BASEADDRESS_BROWSEUI}" installbase="system32" installname="browseui.dll" allowwarnings="true"> + <autoregister infsection="OleControlDlls" type="Both" /> + <importlibrary definition="browseui.spec.def" /> + <include base="browseui">.</include> + <include base="ReactOS">include/reactos/wine</include> + <define name="__REACTOS__" /> + <define name="__WINESRC__" /> + <define name="__USE_W32API" /> + <define name="_WIN32_IE">0x600</define> + <define name="_WIN32_WINNT">0x600</define> + <define name="WINVER">0x600</define> + <library>wine</library> + <library>ole32</library> + <library>user32</library> + <library>advapi32</library> + <library>kernel32</library> + <library>uuid</library> + <library>ntdll</library> + <file>aclmulti.c</file> + <file>browseui_main.c</file> + <file>regsvr.c</file> + <file>version.rc</file> + <file>browseui.spec</file> +</module>
Propchange: trunk/reactos/dll/win32/browseui/browseui.rbuild ------------------------------------------------------------------------------ svn:eol-style = native
Added: trunk/reactos/dll/win32/browseui/browseui.spec URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/browseui/browseui... ============================================================================== --- trunk/reactos/dll/win32/browseui/browseui.spec (added) +++ trunk/reactos/dll/win32/browseui/browseui.spec Mon Oct 1 23:09:53 2007 @@ -1,0 +1,6 @@ +@ stdcall -private DllCanUnloadNow() +@ stdcall -private DllGetClassObject(ptr ptr ptr) +@ stdcall -private DllGetVersion(ptr) +@ stub DllInstall +@ stdcall -private DllRegisterServer() +@ stdcall -private DllUnregisterServer()
Propchange: trunk/reactos/dll/win32/browseui/browseui.spec ------------------------------------------------------------------------------ svn:eol-style = native
Added: trunk/reactos/dll/win32/browseui/browseui_main.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/browseui/browseui... ============================================================================== --- trunk/reactos/dll/win32/browseui/browseui_main.c (added) +++ trunk/reactos/dll/win32/browseui/browseui_main.c Mon Oct 1 23:09:53 2007 @@ -1,0 +1,211 @@ +/* + * browseui - Internet Explorer / Windows Explorer standard UI + * + * Copyright 2001 John R. Sheets (for CodeWeavers) + * Copyright 2004 Mike McCormack (for CodeWeavers) + * + * 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include "config.h" + +#include <stdarg.h> +#include <stdio.h> + +#define COBJMACROS + +#include "wine/debug.h" +#include "windef.h" +#include "winbase.h" +#include "winreg.h" +#include "shlwapi.h" +#include "shlguid.h" + +#include "initguid.h" + +#include "browseui.h" + +WINE_DEFAULT_DEBUG_CHANNEL(browseui); + +LONG BROWSEUI_refCount = 0; + +HINSTANCE browseui_hinstance = 0; + +typedef HRESULT (WINAPI *LPFNCONSTRUCTOR)(IUnknown *pUnkOuter, IUnknown **ppvOut); + +static const struct { + REFCLSID clsid; + LPFNCONSTRUCTOR ctor; +} ClassesTable[] = { + {&CLSID_ACLMulti, ACLMulti_Constructor}, + {NULL, NULL} +}; + +typedef struct tagClassFactory +{ + const IClassFactoryVtbl *vtbl; + LONG ref; + LPFNCONSTRUCTOR ctor; +} ClassFactory; +static const IClassFactoryVtbl ClassFactoryVtbl; + +static HRESULT ClassFactory_Constructor(LPFNCONSTRUCTOR ctor, LPVOID *ppvOut) +{ + ClassFactory *This = CoTaskMemAlloc(sizeof(ClassFactory)); + This->vtbl = &ClassFactoryVtbl; + This->ref = 1; + This->ctor = ctor; + *ppvOut = (LPVOID)This; + TRACE("Created class factory %p\n", This); + BROWSEUI_refCount++; + return S_OK; +} + +static void ClassFactory_Destructor(ClassFactory *This) +{ + TRACE("Destroying class factory %p\n", This); + CoTaskMemFree(This); + BROWSEUI_refCount--; +} + +static HRESULT WINAPI ClassFactory_QueryInterface(IClassFactory *iface, REFIID riid, LPVOID *ppvOut) +{ + *ppvOut = NULL; + if (IsEqualIID(riid, &IID_IClassFactory) || IsEqualIID(riid, &IID_IUnknown)) { + IClassFactory_AddRef(iface); + *ppvOut = iface; + return S_OK; + } + + WARN("Unknown interface %s\n", debugstr_guid(riid)); + return E_NOINTERFACE; +} + +static ULONG WINAPI ClassFactory_AddRef(IClassFactory *iface) +{ + ClassFactory *This = (ClassFactory *)iface; + return InterlockedIncrement(&This->ref); +} + +static ULONG WINAPI ClassFactory_Release(IClassFactory *iface) +{ + ClassFactory *This = (ClassFactory *)iface; + ULONG ret = InterlockedDecrement(&This->ref); + + if (ret == 0) + ClassFactory_Destructor(This); + return ret; +} + +static HRESULT WINAPI ClassFactory_CreateInstance(IClassFactory *iface, IUnknown *punkOuter, REFIID iid, LPVOID *ppvOut) +{ + ClassFactory *This = (ClassFactory *)iface; + HRESULT ret; + IUnknown *obj; + + TRACE("(%p, %p, %s, %p)\n", iface, punkOuter, debugstr_guid(iid), ppvOut); + ret = This->ctor(punkOuter, &obj); + if (FAILED(ret)) + return ret; + ret = IUnknown_QueryInterface(obj, iid, ppvOut); + IUnknown_Release(obj); + return ret; +} + +static HRESULT WINAPI ClassFactory_LockServer(IClassFactory *iface, BOOL fLock) +{ + ClassFactory *This = (ClassFactory *)iface; + + TRACE("(%p)->(%x)\n", This, fLock); + + if(fLock) + InterlockedIncrement(&BROWSEUI_refCount); + else + InterlockedDecrement(&BROWSEUI_refCount); + + return S_OK; +} + +static const IClassFactoryVtbl ClassFactoryVtbl = { + /* IUnknown */ + ClassFactory_QueryInterface, + ClassFactory_AddRef, + ClassFactory_Release, + + /* IClassFactory*/ + ClassFactory_CreateInstance, + ClassFactory_LockServer +}; + +/************************************************************************* + * BROWSEUI DllMain + */ +BOOL WINAPI DllMain(HINSTANCE hinst, DWORD fdwReason, LPVOID fImpLoad) +{ + TRACE("%p 0x%x %p\n", hinst, fdwReason, fImpLoad); + switch (fdwReason) + { + case DLL_WINE_PREATTACH: + return FALSE; /* prefer native version */ + case DLL_PROCESS_ATTACH: + DisableThreadLibraryCalls(hinst); + browseui_hinstance = hinst; + break; + } + return TRUE; +} + +/************************************************************************* + * DllCanUnloadNow (BROWSEUI.@) + */ +HRESULT WINAPI DllCanUnloadNow(void) +{ + return BROWSEUI_refCount ? S_FALSE : S_OK; +} + +/*********************************************************************** + * DllGetVersion (BROWSEUI.@) + */ +HRESULT WINAPI DllGetVersion(DLLVERSIONINFO *info) +{ + if (info->cbSize != sizeof(DLLVERSIONINFO)) FIXME("support DLLVERSIONINFO2\n"); + + /* this is what IE6 on Windows 98 reports */ + info->dwMajorVersion = 6; + info->dwMinorVersion = 0; + info->dwBuildNumber = 2600; + info->dwPlatformID = DLLVER_PLATFORM_WINDOWS; + + return NOERROR; +} + +/*********************************************************************** + * DllGetClassObject (BROWSEUI.@) + */ +HRESULT WINAPI DllGetClassObject(REFCLSID clsid, REFIID iid, LPVOID *ppvOut) +{ + int i; + + *ppvOut = NULL; + if (!IsEqualIID(iid, &IID_IUnknown) && !IsEqualIID(iid, &IID_IClassFactory)) + return E_NOINTERFACE; + + for (i = 0; ClassesTable[i].clsid != NULL; i++) + if (IsEqualCLSID(ClassesTable[i].clsid, clsid)) { + return ClassFactory_Constructor(ClassesTable[i].ctor, ppvOut); + } + FIXME("CLSID %s not supported\n", debugstr_guid(clsid)); + return CLASS_E_CLASSNOTAVAILABLE; +}
Propchange: trunk/reactos/dll/win32/browseui/browseui_main.c ------------------------------------------------------------------------------ svn:eol-style = native
Added: trunk/reactos/dll/win32/browseui/browseui_ros.diff URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/browseui/browseui... ============================================================================== --- trunk/reactos/dll/win32/browseui/browseui_ros.diff (added) +++ trunk/reactos/dll/win32/browseui/browseui_ros.diff Mon Oct 1 23:09:53 2007 @@ -1,0 +1,15 @@ +Index: browseui.rbuild +=================================================================== +--- browseui.rbuild (revision 23123) ++++ browseui.rbuild (working copy) +@@ -9,8 +9,8 @@ + <define name="__WINESRC__" /> + <define name="__USE_W32API" /> + <define name="_WIN32_IE">0x600</define> +- <define name="_WIN32_WINNT">0x501</define> +- <define name="WINVER">0x501</define> ++ <define name="_WIN32_WINNT">0x600</define> ++ <define name="WINVER">0x600</define> + <library>wine</library> + <library>ole32</library> + <library>user32</library>
Propchange: trunk/reactos/dll/win32/browseui/browseui_ros.diff ------------------------------------------------------------------------------ svn:eol-style = native
Added: trunk/reactos/dll/win32/browseui/regsvr.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/browseui/regsvr.c... ============================================================================== --- trunk/reactos/dll/win32/browseui/regsvr.c (added) +++ trunk/reactos/dll/win32/browseui/regsvr.c Mon Oct 1 23:09:53 2007 @@ -1,0 +1,489 @@ +/* + * self-registerable dll functions for browseui.dll + * + * Copyright (C) 2004 Stefan Leichter + * + * 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include <stdarg.h> +#include <string.h> + +#include "windef.h" +#include "winbase.h" +#include "winuser.h" +#include "wingdi.h" +#include "winreg.h" +#include "winerror.h" + +#include "ole2.h" +#include "shlguid.h" + +#include "wine/debug.h" + +WINE_DEFAULT_DEBUG_CHANNEL(browseui); + +/* + * Near the bottom of this file are the exported DllRegisterServer and + * DllUnregisterServer, which make all this worthwhile. + */ + +/*********************************************************************** + * interface for self-registering + */ +struct regsvr_interface +{ + IID const *iid; /* NULL for end of list */ + LPCSTR name; /* can be NULL to omit */ + IID const *base_iid; /* can be NULL to omit */ + int num_methods; /* can be <0 to omit */ + CLSID const *ps_clsid; /* can be NULL to omit */ + CLSID const *ps_clsid32; /* can be NULL to omit */ +}; + +static HRESULT register_interfaces(struct regsvr_interface const *list); +static HRESULT unregister_interfaces(struct regsvr_interface const *list); + +struct regsvr_coclass +{ + CLSID const *clsid; /* NULL for end of list */ + LPCSTR name; /* can be NULL to omit */ + LPCSTR ips; /* can be NULL to omit */ + LPCSTR ips32; /* can be NULL to omit */ + LPCSTR ips32_tmodel; /* can be NULL to omit */ + LPCSTR progid; /* can be NULL to omit */ + LPCSTR viprogid; /* can be NULL to omit */ + LPCSTR progid_extra; /* can be NULL to omit */ +}; + +static HRESULT register_coclasses(struct regsvr_coclass const *list); +static HRESULT unregister_coclasses(struct regsvr_coclass const *list); + +/*********************************************************************** + * static string constants + */ +static WCHAR const interface_keyname[10] = { + 'I', 'n', 't', 'e', 'r', 'f', 'a', 'c', 'e', 0 }; +static WCHAR const base_ifa_keyname[14] = { + 'B', 'a', 's', 'e', 'I', 'n', 't', 'e', 'r', 'f', 'a', 'c', + 'e', 0 }; +static WCHAR const num_methods_keyname[11] = { + 'N', 'u', 'm', 'M', 'e', 't', 'h', 'o', 'd', 's', 0 }; +static WCHAR const ps_clsid_keyname[15] = { + 'P', 'r', 'o', 'x', 'y', 'S', 't', 'u', 'b', 'C', 'l', 's', + 'i', 'd', 0 }; +static WCHAR const ps_clsid32_keyname[17] = { + 'P', 'r', 'o', 'x', 'y', 'S', 't', 'u', 'b', 'C', 'l', 's', + 'i', 'd', '3', '2', 0 }; +static WCHAR const clsid_keyname[6] = { + 'C', 'L', 'S', 'I', 'D', 0 }; +static WCHAR const curver_keyname[7] = { + 'C', 'u', 'r', 'V', 'e', 'r', 0 }; +static WCHAR const ips_keyname[13] = { + 'I', 'n', 'P', 'r', 'o', 'c', 'S', 'e', 'r', 'v', 'e', 'r', + 0 }; +static WCHAR const ips32_keyname[15] = { + 'I', 'n', 'P', 'r', 'o', 'c', 'S', 'e', 'r', 'v', 'e', 'r', + '3', '2', 0 }; +static WCHAR const progid_keyname[7] = { + 'P', 'r', 'o', 'g', 'I', 'D', 0 }; +static WCHAR const viprogid_keyname[25] = { + 'V', 'e', 'r', 's', 'i', 'o', 'n', 'I', 'n', 'd', 'e', 'p', + 'e', 'n', 'd', 'e', 'n', 't', 'P', 'r', 'o', 'g', 'I', 'D', + 0 }; +static char const tmodel_valuename[] = "ThreadingModel"; + +/*********************************************************************** + * static helper functions + */ +static LONG register_key_guid(HKEY base, WCHAR const *name, GUID const *guid); +static LONG register_key_defvalueW(HKEY base, WCHAR const *name, + WCHAR const *value); +static LONG register_key_defvalueA(HKEY base, WCHAR const *name, + char const *value); +static LONG register_progid(WCHAR const *clsid, + char const *progid, char const *curver_progid, + char const *name, char const *extra); + +/*********************************************************************** + * register_interfaces + */ +static HRESULT register_interfaces(struct regsvr_interface const *list) +{ + LONG res = ERROR_SUCCESS; + HKEY interface_key; + + res = RegCreateKeyExW(HKEY_CLASSES_ROOT, interface_keyname, 0, NULL, 0, + KEY_READ | KEY_WRITE, NULL, &interface_key, NULL); + if (res != ERROR_SUCCESS) goto error_return; + + for (; res == ERROR_SUCCESS && list->iid; ++list) { + WCHAR buf[39]; + HKEY iid_key; + + StringFromGUID2(list->iid, buf, 39); + res = RegCreateKeyExW(interface_key, buf, 0, NULL, 0, + KEY_READ | KEY_WRITE, NULL, &iid_key, NULL); + if (res != ERROR_SUCCESS) goto error_close_interface_key; + + if (list->name) { + res = RegSetValueExA(iid_key, NULL, 0, REG_SZ, + (CONST BYTE*)(list->name), + strlen(list->name) + 1); + if (res != ERROR_SUCCESS) goto error_close_iid_key; + } + + if (list->base_iid) { + res = register_key_guid(iid_key, base_ifa_keyname, list->base_iid); + if (res != ERROR_SUCCESS) goto error_close_iid_key; + } + + if (0 <= list->num_methods) { + static WCHAR const fmt[3] = { '%', 'd', 0 }; + HKEY key; + + res = RegCreateKeyExW(iid_key, num_methods_keyname, 0, NULL, 0, + KEY_READ | KEY_WRITE, NULL, &key, NULL); + if (res != ERROR_SUCCESS) goto error_close_iid_key; + + wsprintfW(buf, fmt, list->num_methods); + res = RegSetValueExW(key, NULL, 0, REG_SZ, + (CONST BYTE*)buf, + (lstrlenW(buf) + 1) * sizeof(WCHAR)); + RegCloseKey(key); + + if (res != ERROR_SUCCESS) goto error_close_iid_key; + } + + if (list->ps_clsid) { + res = register_key_guid(iid_key, ps_clsid_keyname, list->ps_clsid); + if (res != ERROR_SUCCESS) goto error_close_iid_key; + } + + if (list->ps_clsid32) { + res = register_key_guid(iid_key, ps_clsid32_keyname, list->ps_clsid32); + if (res != ERROR_SUCCESS) goto error_close_iid_key; + } + + error_close_iid_key: + RegCloseKey(iid_key); + } + +error_close_interface_key: + RegCloseKey(interface_key); +error_return: + return res != ERROR_SUCCESS ? HRESULT_FROM_WIN32(res) : S_OK; +} + +/*********************************************************************** + * unregister_interfaces + */ +static HRESULT unregister_interfaces(struct regsvr_interface const *list) +{ + LONG res = ERROR_SUCCESS; + HKEY interface_key; + + res = RegOpenKeyExW(HKEY_CLASSES_ROOT, interface_keyname, 0, + KEY_READ | KEY_WRITE, &interface_key); + if (res == ERROR_FILE_NOT_FOUND) return S_OK; + if (res != ERROR_SUCCESS) goto error_return; + + for (; res == ERROR_SUCCESS && list->iid; ++list) { + WCHAR buf[39]; + + StringFromGUID2(list->iid, buf, 39); + res = RegDeleteTreeW(interface_key, buf); + if (res == ERROR_FILE_NOT_FOUND) res = ERROR_SUCCESS; + } + + RegCloseKey(interface_key); +error_return: + return res != ERROR_SUCCESS ? HRESULT_FROM_WIN32(res) : S_OK; +} + +/*********************************************************************** + * register_coclasses + */ +static HRESULT register_coclasses(struct regsvr_coclass const *list) +{ + LONG res = ERROR_SUCCESS; + HKEY coclass_key; + + res = RegCreateKeyExW(HKEY_CLASSES_ROOT, clsid_keyname, 0, NULL, 0, + KEY_READ | KEY_WRITE, NULL, &coclass_key, NULL); + if (res != ERROR_SUCCESS) goto error_return; + + for (; res == ERROR_SUCCESS && list->clsid; ++list) { + WCHAR buf[39]; + HKEY clsid_key; + + StringFromGUID2(list->clsid, buf, 39); + res = RegCreateKeyExW(coclass_key, buf, 0, NULL, 0, + KEY_READ | KEY_WRITE, NULL, &clsid_key, NULL); + if (res != ERROR_SUCCESS) goto error_close_coclass_key; + + if (list->name) { + res = RegSetValueExA(clsid_key, NULL, 0, REG_SZ, + (CONST BYTE*)(list->name), + strlen(list->name) + 1); + if (res != ERROR_SUCCESS) goto error_close_clsid_key; + } + + if (list->ips) { + res = register_key_defvalueA(clsid_key, ips_keyname, list->ips); + if (res != ERROR_SUCCESS) goto error_close_clsid_key; + } + + if (list->ips32) { + HKEY ips32_key; + + res = RegCreateKeyExW(clsid_key, ips32_keyname, 0, NULL, 0, + KEY_READ | KEY_WRITE, NULL, + &ips32_key, NULL); + if (res != ERROR_SUCCESS) goto error_close_clsid_key; + + res = RegSetValueExA(ips32_key, NULL, 0, REG_SZ, + (CONST BYTE*)list->ips32, + lstrlenA(list->ips32) + 1); + if (res == ERROR_SUCCESS && list->ips32_tmodel) + res = RegSetValueExA(ips32_key, tmodel_valuename, 0, REG_SZ, + (CONST BYTE*)list->ips32_tmodel, + strlen(list->ips32_tmodel) + 1); + RegCloseKey(ips32_key); + if (res != ERROR_SUCCESS) goto error_close_clsid_key; + } + + if (list->progid) { + res = register_key_defvalueA(clsid_key, progid_keyname, + list->progid); + if (res != ERROR_SUCCESS) goto error_close_clsid_key; + + res = register_progid(buf, list->progid, NULL, + list->name, list->progid_extra); + if (res != ERROR_SUCCESS) goto error_close_clsid_key; + } + + if (list->viprogid) { + res = register_key_defvalueA(clsid_key, viprogid_keyname, + list->viprogid); + if (res != ERROR_SUCCESS) goto error_close_clsid_key; + + res = register_progid(buf, list->viprogid, list->progid, + list->name, list->progid_extra); + if (res != ERROR_SUCCESS) goto error_close_clsid_key; + } + + error_close_clsid_key: + RegCloseKey(clsid_key); + } + +error_close_coclass_key: + RegCloseKey(coclass_key); +error_return: + return res != ERROR_SUCCESS ? HRESULT_FROM_WIN32(res) : S_OK; +} + +/*********************************************************************** + * unregister_coclasses + */ +static HRESULT unregister_coclasses(struct regsvr_coclass const *list) +{ + LONG res = ERROR_SUCCESS; + HKEY coclass_key; + + res = RegOpenKeyExW(HKEY_CLASSES_ROOT, clsid_keyname, 0, + KEY_READ | KEY_WRITE, &coclass_key); + if (res == ERROR_FILE_NOT_FOUND) return S_OK; + if (res != ERROR_SUCCESS) goto error_return; + + for (; res == ERROR_SUCCESS && list->clsid; ++list) { + WCHAR buf[39]; + + StringFromGUID2(list->clsid, buf, 39); + res = RegDeleteTreeW(coclass_key, buf); + if (res == ERROR_FILE_NOT_FOUND) res = ERROR_SUCCESS; + if (res != ERROR_SUCCESS) goto error_close_coclass_key; + + if (list->progid) { + res = RegDeleteTreeA(HKEY_CLASSES_ROOT, list->progid); + if (res == ERROR_FILE_NOT_FOUND) res = ERROR_SUCCESS; + if (res != ERROR_SUCCESS) goto error_close_coclass_key; + } + + if (list->viprogid) { + res = RegDeleteTreeA(HKEY_CLASSES_ROOT, list->viprogid); + if (res == ERROR_FILE_NOT_FOUND) res = ERROR_SUCCESS; + if (res != ERROR_SUCCESS) goto error_close_coclass_key; + } + } + +error_close_coclass_key: + RegCloseKey(coclass_key); +error_return: + return res != ERROR_SUCCESS ? HRESULT_FROM_WIN32(res) : S_OK; +} + +/*********************************************************************** + * regsvr_key_guid + */ +static LONG register_key_guid(HKEY base, WCHAR const *name, GUID const *guid) +{ + WCHAR buf[39]; + + StringFromGUID2(guid, buf, 39); + return register_key_defvalueW(base, name, buf); +} + +/*********************************************************************** + * regsvr_key_defvalueW + */ +static LONG register_key_defvalueW( + HKEY base, + WCHAR const *name, + WCHAR const *value) +{ + LONG res; + HKEY key; + + res = RegCreateKeyExW(base, name, 0, NULL, 0, + KEY_READ | KEY_WRITE, NULL, &key, NULL); + if (res != ERROR_SUCCESS) return res; + res = RegSetValueExW(key, NULL, 0, REG_SZ, (CONST BYTE*)value, + (lstrlenW(value) + 1) * sizeof(WCHAR)); + RegCloseKey(key); + return res; +} + +/*********************************************************************** + * regsvr_key_defvalueA + */ +static LONG register_key_defvalueA( + HKEY base, + WCHAR const *name, + char const *value) +{ + LONG res; + HKEY key; + + res = RegCreateKeyExW(base, name, 0, NULL, 0, + KEY_READ | KEY_WRITE, NULL, &key, NULL); + if (res != ERROR_SUCCESS) return res; + res = RegSetValueExA(key, NULL, 0, REG_SZ, (CONST BYTE*)value, + lstrlenA(value) + 1); + RegCloseKey(key); + return res; +} + +/*********************************************************************** + * regsvr_progid + */ +static LONG register_progid( + WCHAR const *clsid, + char const *progid, + char const *curver_progid, + char const *name, + char const *extra) +{ + LONG res; + HKEY progid_key; + + res = RegCreateKeyExA(HKEY_CLASSES_ROOT, progid, 0, + NULL, 0, KEY_READ | KEY_WRITE, NULL, + &progid_key, NULL); + if (res != ERROR_SUCCESS) return res; + + if (name) { + res = RegSetValueExA(progid_key, NULL, 0, REG_SZ, + (CONST BYTE*)name, strlen(name) + 1); + if (res != ERROR_SUCCESS) goto error_close_progid_key; + } + + if (clsid) { + res = register_key_defvalueW(progid_key, clsid_keyname, clsid); + if (res != ERROR_SUCCESS) goto error_close_progid_key; + } + + if (curver_progid) { + res = register_key_defvalueA(progid_key, curver_keyname, + curver_progid); + if (res != ERROR_SUCCESS) goto error_close_progid_key; + } + + if (extra) { + HKEY extra_key; + + res = RegCreateKeyExA(progid_key, extra, 0, + NULL, 0, KEY_READ | KEY_WRITE, NULL, + &extra_key, NULL); + if (res == ERROR_SUCCESS) + RegCloseKey(extra_key); + } + +error_close_progid_key: + RegCloseKey(progid_key); + return res; +} + +/*********************************************************************** + * coclass list + */ +static struct regsvr_coclass const coclass_list[] = { + { + &CLSID_ACLMulti, + "Multiple AutoComplete List Container", + NULL, + "browseui.dll", + "Apartment" + }, + { NULL } /* list terminator */ +}; + +/*********************************************************************** + * interface list + */ + +static struct regsvr_interface const interface_list[] = { + { NULL } /* list terminator */ +}; + +/*********************************************************************** + * DllRegisterServer (HHCTRL.@) + */ +HRESULT WINAPI DllRegisterServer(void) +{ + HRESULT hr; + + TRACE("\n"); + + hr = register_coclasses(coclass_list); + if (SUCCEEDED(hr)) + hr = register_interfaces(interface_list); + return hr; +} + +/*********************************************************************** + * DllUnregisterServer (HHCTRL.@) + */ +HRESULT WINAPI DllUnregisterServer(void) +{ + HRESULT hr; + + TRACE("\n"); + + hr = unregister_coclasses(coclass_list); + if (SUCCEEDED(hr)) + hr = unregister_interfaces(interface_list); + return hr; +}
Propchange: trunk/reactos/dll/win32/browseui/regsvr.c ------------------------------------------------------------------------------ svn:eol-style = native
Added: trunk/reactos/dll/win32/browseui/version.rc URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/browseui/version.... ============================================================================== --- trunk/reactos/dll/win32/browseui/version.rc (added) +++ trunk/reactos/dll/win32/browseui/version.rc Mon Oct 1 23:09:53 2007 @@ -1,0 +1,27 @@ +/* + * Copyright 2003 Francois Gouget (for CodeWeavers) + * + * 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#define WINE_OLESELFREGISTER +#define WINE_FILEDESCRIPTION_STR "Wine core dll" +#define WINE_FILENAME_STR "browseui.dll" +#define WINE_FILEVERSION 6,0,2900,2180 +#define WINE_FILEVERSION_STR "6.0.2900.2180" +#define WINE_PRODUCTVERSION 6,0,2900,2180 +#define WINE_PRODUCTVERSION_STR "6.0.2900.2180" + +#include "wine/wine_common_ver.rc"
Propchange: trunk/reactos/dll/win32/browseui/version.rc ------------------------------------------------------------------------------ svn:eol-style = native