diff --git a/configure b/configure index edc03ea072d..a946c14e51f 100755 --- a/configure +++ b/configure @@ -1169,6 +1169,7 @@ enable_olethk32 enable_openal32 enable_opencl enable_opengl32 +enable_packager enable_pdh enable_photometadatahandler enable_pidgen @@ -17100,6 +17101,7 @@ wine_fn_config_dll openal32 enable_openal32 wine_fn_config_dll opencl enable_opencl wine_fn_config_dll opengl32 enable_opengl32 implib wine_fn_config_test dlls/opengl32/tests opengl32_test +wine_fn_config_dll packager enable_packager clean wine_fn_config_dll pdh enable_pdh implib wine_fn_config_test dlls/pdh/tests pdh_test wine_fn_config_dll photometadatahandler enable_photometadatahandler diff --git a/configure.ac b/configure.ac index eccf19c9d56..6478c946bff 100644 --- a/configure.ac +++ b/configure.ac @@ -3075,6 +3075,7 @@ WINE_CONFIG_DLL(openal32) WINE_CONFIG_DLL(opencl) WINE_CONFIG_DLL(opengl32,,[implib]) WINE_CONFIG_TEST(dlls/opengl32/tests) +WINE_CONFIG_DLL(packager,,[clean]) WINE_CONFIG_DLL(pdh,,[implib]) WINE_CONFIG_TEST(dlls/pdh/tests) WINE_CONFIG_DLL(photometadatahandler) diff --git a/dlls/packager/Makefile.in b/dlls/packager/Makefile.in new file mode 100644 index 00000000000..ffbc2dc98ea --- /dev/null +++ b/dlls/packager/Makefile.in @@ -0,0 +1,8 @@ +MODULE = packager.dll +IMPORTS = uuid + +C_SRCS = \ + packager_main.c + +RC_SRCS = packager.rc +IDL_SRCS = packager_classes.idl diff --git a/dlls/packager/packager.rc b/dlls/packager/packager.rc new file mode 100644 index 00000000000..30a595e5189 --- /dev/null +++ b/dlls/packager/packager.rc @@ -0,0 +1,24 @@ +/* + * Copyright 2014 Andrew Eikum 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 + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL + +/* @makedep: packager.rgs */ +1 WINE_REGISTRY packager.rgs diff --git a/dlls/packager/packager.rgs b/dlls/packager/packager.rgs new file mode 100644 index 00000000000..44d667689c7 --- /dev/null +++ b/dlls/packager/packager.rgs @@ -0,0 +1,15 @@ +HKCR +{ + NoRemove CLSID + { + NoRemove '{0003000C-0000-0000-C000-000000000046}' + { + TreatAs = s '{F20DA720-C02F-11CE-927B-0800095AE340}' + NotInsertable + } + NoRemove '{F20DA720-C02F-11CE-927B-0800095AE340}' + { + Insertable + } + } +} diff --git a/dlls/packager/packager.spec b/dlls/packager/packager.spec new file mode 100644 index 00000000000..5baed04ed66 --- /dev/null +++ b/dlls/packager/packager.spec @@ -0,0 +1,4 @@ +@ stdcall DllCanUnloadNow() +@ stdcall DllGetClassObject(ptr ptr ptr) +@ stdcall DllRegisterServer() +@ stdcall DllUnregisterServer() diff --git a/dlls/packager/packager_classes.idl b/dlls/packager/packager_classes.idl new file mode 100644 index 00000000000..d57ac298797 --- /dev/null +++ b/dlls/packager/packager_classes.idl @@ -0,0 +1,26 @@ +/* + * Copyright 2014 Andrew Eikum 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 + */ + +#pragma makedep register + +[ + helpstring("Package"), + threading(apartment), + uuid(F20DA720-C02F-11CE-927B-0800095AE340) +] +coclass Package { interface IOleObject; } diff --git a/dlls/packager/packager_main.c b/dlls/packager/packager_main.c new file mode 100644 index 00000000000..c8fdc0cc627 --- /dev/null +++ b/dlls/packager/packager_main.c @@ -0,0 +1,369 @@ +/* + * Copyright 2014 Andrew Eikum 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 + +#define COBJMACROS +#include "initguid.h" +#include "windef.h" +#include "winbase.h" +#include "ole2.h" +#include "rpcproxy.h" +#include "wine/debug.h" + +#include "packager_classes.h" + +WINE_DEFAULT_DEBUG_CHANNEL(packager); + +static HINSTANCE g_instance; + +struct Package { + IOleObject IOleObject_iface; + + LONG ref; +}; + +static inline struct Package *impl_from_IOleObject(IOleObject *iface) +{ + return CONTAINING_RECORD(iface, struct Package, IOleObject_iface); +} + +static HRESULT WINAPI OleObject_QueryInterface(IOleObject *iface, REFIID riid, void **obj) +{ + struct Package *This = impl_from_IOleObject(iface); + + if(IsEqualGUID(riid, &IID_IUnknown) || + IsEqualGUID(riid, &IID_IOleObject)) { + TRACE("(%p)->(IID_IOleObject, %p)\n", This, obj); + *obj = &This->IOleObject_iface; + }else { + FIXME("(%p)->(%s, %p)\n", This, debugstr_guid(riid), obj); + *obj = NULL; + return E_NOINTERFACE; + } + + IUnknown_AddRef((IUnknown*)*obj); + return S_OK; +} + +static ULONG WINAPI OleObject_AddRef(IOleObject *iface) +{ + struct Package *This = impl_from_IOleObject(iface); + LONG ref = InterlockedIncrement(&This->ref); + + TRACE("(%p) ref=%d\n", This, ref); + + return ref; +} + +static ULONG WINAPI OleObject_Release(IOleObject *iface) +{ + struct Package *This = impl_from_IOleObject(iface); + LONG ref = InterlockedDecrement(&This->ref); + + TRACE("(%p) ref=%d\n", This, ref); + + if(!ref) + HeapFree(GetProcessHeap(), 0, This); + + return ref; +} + +static HRESULT WINAPI OleObject_SetClientSite(IOleObject *iface, IOleClientSite *pClientSite) +{ + struct Package *This = impl_from_IOleObject(iface); + FIXME("(%p)->(%p)\n", This, pClientSite); + return E_NOTIMPL; +} + +static HRESULT WINAPI OleObject_GetClientSite(IOleObject *iface, IOleClientSite **ppClientSite) +{ + struct Package *This = impl_from_IOleObject(iface); + FIXME("(%p)->(%p)\n", This, ppClientSite); + return E_NOTIMPL; +} + +static HRESULT WINAPI OleObject_SetHostNames(IOleObject *iface, LPCOLESTR szContainerApp, LPCOLESTR szContainerObj) +{ + struct Package *This = impl_from_IOleObject(iface); + FIXME("(%p)->(%s, %s)\n", This, debugstr_w(szContainerApp), debugstr_w(szContainerObj)); + return E_NOTIMPL; +} + +static HRESULT WINAPI OleObject_Close(IOleObject *iface, DWORD dwSaveOption) +{ + struct Package *This = impl_from_IOleObject(iface); + FIXME("(%p)->(0x%x)\n", This, dwSaveOption); + return E_NOTIMPL; +} + +static HRESULT WINAPI OleObject_SetMoniker(IOleObject *iface, DWORD dwWhichMoniker, IMoniker *pmk) +{ + struct Package *This = impl_from_IOleObject(iface); + FIXME("(%p)->(%d, %p)\n", This, dwWhichMoniker, pmk); + return E_NOTIMPL; +} + +static HRESULT WINAPI OleObject_GetMoniker(IOleObject *iface, DWORD dwAssign, DWORD dwWhichMoniker, IMoniker **ppmk) +{ + struct Package *This = impl_from_IOleObject(iface); + FIXME("(%p)->(%d, %d, %p)\n", This, dwAssign, dwWhichMoniker, ppmk); + return E_NOTIMPL; +} + +static HRESULT WINAPI OleObject_InitFromData(IOleObject *iface, IDataObject *pDataObject, BOOL fCreation, + DWORD dwReserved) +{ + struct Package *This = impl_from_IOleObject(iface); + FIXME("(%p)->(%p, 0x%x, %d)\n", This, pDataObject, fCreation, dwReserved); + return E_NOTIMPL; +} + +static HRESULT WINAPI OleObject_GetClipboardData(IOleObject *iface, DWORD dwReserved, IDataObject **ppDataObject) +{ + struct Package *This = impl_from_IOleObject(iface); + FIXME("(%p)->(%d, %p)\n", This, dwReserved, ppDataObject); + return E_NOTIMPL; +} + +static HRESULT WINAPI OleObject_DoVerb(IOleObject *iface, LONG iVerb, LPMSG lpmsg, IOleClientSite *pActiveSite, + LONG lindex, HWND hwndParent, LPCRECT lprcPosRect) +{ + struct Package *This = impl_from_IOleObject(iface); + FIXME("(%p)->(%d)\n", This, iVerb); + return E_NOTIMPL; +} + +static HRESULT WINAPI OleObject_EnumVerbs(IOleObject *iface, IEnumOLEVERB **ppEnumOleVerb) +{ + struct Package *This = impl_from_IOleObject(iface); + FIXME("(%p)->(%p)\n", This, ppEnumOleVerb); + return E_NOTIMPL; +} + +static HRESULT WINAPI OleObject_Update(IOleObject *iface) +{ + struct Package *This = impl_from_IOleObject(iface); + FIXME("(%p)\n", This); + return E_NOTIMPL; +} + +static HRESULT WINAPI OleObject_IsUpToDate(IOleObject *iface) +{ + struct Package *This = impl_from_IOleObject(iface); + FIXME("(%p)\n", This); + return E_NOTIMPL; +} + +static HRESULT WINAPI OleObject_GetUserClassID(IOleObject *iface, CLSID *pClsid) +{ + struct Package *This = impl_from_IOleObject(iface); + FIXME("(%p)->(%p)\n", This, pClsid); + return E_NOTIMPL; +} + +static HRESULT WINAPI OleObject_GetUserType(IOleObject *iface, DWORD dwFormOfType, LPOLESTR *pszUserType) +{ + struct Package *This = impl_from_IOleObject(iface); + FIXME("(%p)->(%d, %p)\n", This, dwFormOfType, pszUserType); + return E_NOTIMPL; +} + +static HRESULT WINAPI OleObject_SetExtent(IOleObject *iface, DWORD dwDrawAspect, SIZEL *psizel) +{ + struct Package *This = impl_from_IOleObject(iface); + FIXME("(%p)->(%d, %p)\n", This, dwDrawAspect, psizel); + return E_NOTIMPL; +} + +static HRESULT WINAPI OleObject_GetExtent(IOleObject *iface, DWORD dwDrawAspect, SIZEL *psizel) +{ + struct Package *This = impl_from_IOleObject(iface); + FIXME("(%p)->(%d, %p)\n", This, dwDrawAspect, psizel); + return E_NOTIMPL; +} + +static HRESULT WINAPI OleObject_Advise(IOleObject *iface, IAdviseSink *pAdvSink, DWORD *pdwConnection) +{ + struct Package *This = impl_from_IOleObject(iface); + FIXME("(%p)->(%p, %p)\n", This, pAdvSink, pdwConnection); + return E_NOTIMPL; +} + +static HRESULT WINAPI OleObject_Unadvise(IOleObject *iface, DWORD dwConnection) +{ + struct Package *This = impl_from_IOleObject(iface); + FIXME("(%p)->(%d)\n", This, dwConnection); + return E_NOTIMPL; +} + +static HRESULT WINAPI OleObject_EnumAdvise(IOleObject *iface, IEnumSTATDATA **ppenumAdvise) +{ + struct Package *This = impl_from_IOleObject(iface); + FIXME("(%p)->(%p)\n", This, ppenumAdvise); + return E_NOTIMPL; +} + +static HRESULT WINAPI OleObject_GetMiscStatus(IOleObject *iface, DWORD dwAspect, DWORD *pdwStatus) +{ + struct Package *This = impl_from_IOleObject(iface); + FIXME("(%p)->(%d, %p)\n", This, dwAspect, pdwStatus); + return E_NOTIMPL; +} + +static HRESULT WINAPI OleObject_SetColorScheme(IOleObject *iface, LOGPALETTE *pLogpal) +{ + struct Package *This = impl_from_IOleObject(iface); + FIXME("(%p)->(%p)\n", This, pLogpal); + return E_NOTIMPL; +} + +static const IOleObjectVtbl OleObject_Vtbl = { + OleObject_QueryInterface, + OleObject_AddRef, + OleObject_Release, + OleObject_SetClientSite, + OleObject_GetClientSite, + OleObject_SetHostNames, + OleObject_Close, + OleObject_SetMoniker, + OleObject_GetMoniker, + OleObject_InitFromData, + OleObject_GetClipboardData, + OleObject_DoVerb, + OleObject_EnumVerbs, + OleObject_Update, + OleObject_IsUpToDate, + OleObject_GetUserClassID, + OleObject_GetUserType, + OleObject_SetExtent, + OleObject_GetExtent, + OleObject_Advise, + OleObject_Unadvise, + OleObject_EnumAdvise, + OleObject_GetMiscStatus, + OleObject_SetColorScheme +}; + +static HRESULT WINAPI PackageCF_QueryInterface(IClassFactory *iface, REFIID riid, void **obj) +{ + TRACE("(static)->(%s, %p)\n", debugstr_guid(riid), obj); + + if(IsEqualGUID(&IID_IUnknown, riid) || + IsEqualGUID(&IID_IClassFactory, riid)) + *obj = iface; + else + *obj = NULL; + + if(*obj){ + IUnknown_AddRef((IUnknown*)*obj); + return S_OK; + } + + FIXME("Unknown interface: %s\n", debugstr_guid(riid)); + return E_NOINTERFACE; +} + +static ULONG WINAPI PackageCF_AddRef(IClassFactory *iface) +{ + TRACE("(static)\n"); + return 2; +} + +static ULONG WINAPI PackageCF_Release(IClassFactory *iface) +{ + TRACE("(static)\n"); + return 1; +} + +static HRESULT WINAPI PackageCF_CreateInstance(IClassFactory *iface, IUnknown *outer, + REFIID iid, void **obj) +{ + struct Package *package; + + TRACE("(static)->(%p, %s, %p)\n", outer, wine_dbgstr_guid(iid), obj); + + package = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*package)); + if(!package) + return E_OUTOFMEMORY; + + package->IOleObject_iface.lpVtbl = &OleObject_Vtbl; + + return IOleObject_QueryInterface(&package->IOleObject_iface, iid, obj); +} + +static HRESULT WINAPI PackageCF_LockServer(IClassFactory *iface, BOOL fLock) +{ + TRACE("(%p)->(%x)\n", iface, fLock); + return S_OK; +} + +static const IClassFactoryVtbl PackageCF_Vtbl = { + PackageCF_QueryInterface, + PackageCF_AddRef, + PackageCF_Release, + PackageCF_CreateInstance, + PackageCF_LockServer +}; + +static IClassFactory PackageCF = { + &PackageCF_Vtbl +}; + +HRESULT WINAPI DllGetClassObject(REFCLSID clsid, REFIID iid, void **obj) +{ + TRACE("(%s, %s, %p)\n", wine_dbgstr_guid(clsid), wine_dbgstr_guid(iid), obj); + + if(IsEqualGUID(clsid, &CLSID_Package)) + return IClassFactory_QueryInterface(&PackageCF, iid, obj); + + FIXME("Unknown CLSID: %s\n", wine_dbgstr_guid(clsid)); + + return CLASS_E_CLASSNOTAVAILABLE; +} + +HRESULT WINAPI DllCanUnloadNow(void) +{ + return S_OK; +} + +HRESULT WINAPI DllRegisterServer(void) +{ + return __wine_register_resources(g_instance); +} + +HRESULT WINAPI DllUnregisterServer(void) +{ + return __wine_unregister_resources(g_instance); +} + +BOOL WINAPI DllMain(HINSTANCE instance, DWORD reason, void *reserved) +{ + TRACE("(%p, %u, %p)\n", instance, reason, reserved); + + switch(reason){ + case DLL_PROCESS_ATTACH: + g_instance = instance; + DisableThreadLibraryCalls(instance); + break; + } + + return TRUE; +}