|
- /*
- * 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 <stdarg.h>
-
- #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;
- }
|