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/aclmult…
==============================================================================
--- 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/browseu…
==============================================================================
--- 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/browseu…
==============================================================================
--- 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/browseu…
==============================================================================
--- 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/browseu…
==============================================================================
--- 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/browseu…
==============================================================================
--- 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.…
==============================================================================
--- 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