/* * Copyright (C) 2006 Robert Reif * * 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 #include "windef.h" #include "winbase.h" #include "winuser.h" #include "winreg.h" #include "objbase.h" #include "wine/debug.h" WINE_DEFAULT_DEBUG_CHANNEL(asio); /* {48D0C522-BFCC-45cc-8B84-17F25F33E6E8} */ static GUID const CLSID_WineASIO = { 0x48d0c522, 0xbfcc, 0x45cc, { 0x8b, 0x84, 0x17, 0xf2, 0x5f, 0x33, 0xe6, 0xe8 } }; typedef struct { const IClassFactoryVtbl * lpVtbl; LONG ref; } IClassFactoryImpl; extern HRESULT WINAPI WineASIOCreateInstance(REFIID riid, LPVOID *ppobj); /******************************************************************************* * ClassFactory */ static HRESULT WINAPI CF_QueryInterface(LPCLASSFACTORY iface, REFIID riid, LPVOID *ppobj) { IClassFactoryImpl *This = (IClassFactoryImpl *)iface; FIXME("(%p, %s, %p) stub!\n", This, debugstr_guid(riid), ppobj); if (ppobj == NULL) return E_POINTER; return E_NOINTERFACE; } static ULONG WINAPI CF_AddRef(LPCLASSFACTORY iface) { IClassFactoryImpl *This = (IClassFactoryImpl *)iface; ULONG ref = InterlockedIncrement(&(This->ref)); TRACE("iface: %p, ref has been set to %x\n", This, ref); return ref; } static ULONG WINAPI CF_Release(LPCLASSFACTORY iface) { IClassFactoryImpl *This = (IClassFactoryImpl *)iface; ULONG ref = InterlockedDecrement(&(This->ref)); TRACE("iface %p, ref has been set to %x\n", This, ref); /* static class, won't be freed */ return ref; } static HRESULT WINAPI CF_CreateInstance(LPCLASSFACTORY iface, LPUNKNOWN pOuter, REFIID riid, LPVOID *ppobj) { IClassFactoryImpl *This = (IClassFactoryImpl *)iface; TRACE("iface: %p, pOuter: %p, riid: %s, ppobj: %p)\n", This, pOuter, debugstr_guid(riid), ppobj); if (pOuter) return CLASS_E_NOAGGREGATION; if (ppobj == NULL) { WARN("invalid parameter\n"); return E_INVALIDARG; } *ppobj = NULL; TRACE("Creating the WineASIO object\n"); return WineASIOCreateInstance(riid, ppobj); } static HRESULT WINAPI CF_LockServer(LPCLASSFACTORY iface, BOOL dolock) { IClassFactoryImpl *This = (IClassFactoryImpl *)iface; FIXME("iface: %p, dolock: %d) stub!\n", This, dolock); return S_OK; } static const IClassFactoryVtbl CF_Vtbl = { CF_QueryInterface, CF_AddRef, CF_Release, CF_CreateInstance, CF_LockServer }; static IClassFactoryImpl WINEASIO_CF = { &CF_Vtbl, 1 }; /******************************************************************************* * DllGetClassObject [DSOUND.@] * Retrieves class object from a DLL object * * NOTES * Docs say returns STDAPI * * PARAMS * rclsid [I] CLSID for the class object * riid [I] Reference to identifier of interface for class object * ppv [O] Address of variable to receive interface pointer for riid * * RETURNS * Success: S_OK * Failure: CLASS_E_CLASSNOTAVAILABLE, E_OUTOFMEMORY, E_INVALIDARG, * E_UNEXPECTED */ HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID *ppv) { TRACE("rclsid: %s, riid: %s, ppv: %p)\n", debugstr_guid(rclsid), debugstr_guid(riid), ppv); if (ppv == NULL) { WARN("invalid parameter\n"); return E_INVALIDARG; } *ppv = NULL; if (!IsEqualIID(riid, &IID_IClassFactory) && !IsEqualIID(riid, &IID_IUnknown)) { WARN("no interface for %s\n", debugstr_guid(riid)); return E_NOINTERFACE; } if (IsEqualGUID(rclsid, &CLSID_WineASIO)) { CF_AddRef((IClassFactory*) &WINEASIO_CF); *ppv = &WINEASIO_CF; return S_OK; } WARN("rclsid: %s, riid: %s, ppv: %p): no class found.\n", debugstr_guid(rclsid), debugstr_guid(riid), ppv); return CLASS_E_CLASSNOTAVAILABLE; } /******************************************************************************* * DllCanUnloadNow * Determines whether the DLL is in use. * * RETURNS * Success: S_OK * Failure: S_FALSE */ HRESULT WINAPI DllCanUnloadNow(void) { FIXME("(void): stub\n"); return S_FALSE; } /*********************************************************************** * DllMain (ASIO.init) */ BOOL WINAPI DllMain(HINSTANCE hInstDLL, DWORD fdwReason, LPVOID lpvReserved) { TRACE("hInstDLL: %p, fdwReason: %x lpvReserved: %p)\n", hInstDLL, fdwReason, lpvReserved); switch (fdwReason) { case DLL_PROCESS_ATTACH: /* TRACE("DLL_PROCESS_ATTACH\n"); */ break; case DLL_PROCESS_DETACH: /* TRACE("DLL_PROCESS_DETACH\n"); */ break; case DLL_THREAD_ATTACH: /* TRACE("DLL_THREAD_ATTACH\n"); */ break; case DLL_THREAD_DETACH: /* TRACE("DLL_THREAD_DETACH\n"); */ break; default: /* TRACE("UNKNOWN REASON\n"); */ break; } return TRUE; }