kernel32: Update version to Win 10.
[wine.git] / dlls / dpnet / client.c
blob4459373a14cbf8d2eaaddcf2237b1dce6ce0e7c6
1 /*
2 * DirectPlay8 Client
3 *
4 * Copyright 2004 Raphael Junqueira
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
23 #include <stdarg.h>
25 #define COBJMACROS
26 #include "windef.h"
27 #include "winbase.h"
28 #include "wingdi.h"
29 #include "winuser.h"
30 #include "objbase.h"
31 #include "wine/debug.h"
33 #include "dpnet_private.h"
35 WINE_DEFAULT_DEBUG_CHANNEL(dpnet);
37 typedef struct IDirectPlay8LobbyClientImpl
39 IDirectPlay8LobbyClient IDirectPlay8LobbyClient_iface;
40 LONG ref;
42 PFNDPNMESSAGEHANDLER msghandler;
43 DWORD flags;
44 void *usercontext;
45 } IDirectPlay8LobbyClientImpl;
47 static inline IDirectPlay8LobbyClientImpl *impl_from_IDirectPlay8LobbyClient(IDirectPlay8LobbyClient *iface)
49 return CONTAINING_RECORD(iface, IDirectPlay8LobbyClientImpl, IDirectPlay8LobbyClient_iface);
52 static inline IDirectPlay8ClientImpl *impl_from_IDirectPlay8Client(IDirectPlay8Client *iface)
54 return CONTAINING_RECORD(iface, IDirectPlay8ClientImpl, IDirectPlay8Client_iface);
57 /* IDirectPlay8Client IUnknown parts follow: */
58 static HRESULT WINAPI IDirectPlay8ClientImpl_QueryInterface(IDirectPlay8Client *iface, REFIID riid,
59 void **ppobj)
61 IDirectPlay8ClientImpl *This = impl_from_IDirectPlay8Client(iface);
63 if (IsEqualGUID(riid, &IID_IUnknown)
64 || IsEqualGUID(riid, &IID_IDirectPlay8Client)) {
65 IUnknown_AddRef(iface);
66 *ppobj = This;
67 return DPN_OK;
70 WARN("(%p)->(%s,%p),not found\n",This,debugstr_guid(riid),ppobj);
71 return E_NOINTERFACE;
74 static ULONG WINAPI IDirectPlay8ClientImpl_AddRef(IDirectPlay8Client *iface)
76 IDirectPlay8ClientImpl *This = impl_from_IDirectPlay8Client(iface);
77 ULONG ref = InterlockedIncrement(&This->ref);
79 TRACE("(%p) ref=%u\n", This, ref);
81 return ref;
84 static ULONG WINAPI IDirectPlay8ClientImpl_Release(IDirectPlay8Client *iface)
86 IDirectPlay8ClientImpl *This = impl_from_IDirectPlay8Client(iface);
87 ULONG ref = InterlockedDecrement(&This->ref);
89 TRACE("(%p) ref=%u\n", This, ref);
91 if (!ref)
93 heap_free(This->username);
94 heap_free(This->data);
95 heap_free(This);
97 return ref;
100 /* IDirectPlay8Client Interface follow: */
102 static HRESULT WINAPI IDirectPlay8ClientImpl_Initialize(IDirectPlay8Client *iface,
103 void * const pvUserContext, const PFNDPNMESSAGEHANDLER pfn, const DWORD dwFlags)
105 IDirectPlay8ClientImpl *This = impl_from_IDirectPlay8Client(iface);
107 TRACE("(%p):(%p,%p,%x)\n", This, pvUserContext, pfn, dwFlags);
109 if(!pfn)
110 return DPNERR_INVALIDPARAM;
112 This->usercontext = pvUserContext;
113 This->msghandler = pfn;
114 This->flags = dwFlags;
116 init_winsock();
118 return DPN_OK;
121 static HRESULT WINAPI IDirectPlay8ClientImpl_EnumServiceProviders(IDirectPlay8Client *iface,
122 const GUID * const pguidServiceProvider, const GUID * const pguidApplication,
123 DPN_SERVICE_PROVIDER_INFO * const pSPInfoBuffer, PDWORD const pcbEnumData,
124 PDWORD const pcReturned, const DWORD dwFlags)
126 IDirectPlay8ClientImpl *This = impl_from_IDirectPlay8Client(iface);
127 TRACE("(%p)->(%s,%s,%p,%p,%p,%x)\n", This, debugstr_guid(pguidServiceProvider), debugstr_guid(pguidApplication),
128 pSPInfoBuffer, pcbEnumData, pcReturned, dwFlags);
130 if(dwFlags)
131 FIXME("Unhandled flags %x\n", dwFlags);
133 if(pguidApplication)
134 FIXME("Application guid %s is currently being ignored\n", debugstr_guid(pguidApplication));
136 return enum_services_providers(pguidServiceProvider, pSPInfoBuffer, pcbEnumData, pcReturned);
139 static HRESULT WINAPI IDirectPlay8ClientImpl_EnumHosts(IDirectPlay8Client *iface,
140 PDPN_APPLICATION_DESC const pApplicationDesc, IDirectPlay8Address * const pAddrHost,
141 IDirectPlay8Address * const pDeviceInfo, void * const pUserEnumData,
142 const DWORD dwUserEnumDataSize, const DWORD dwEnumCount, const DWORD dwRetryInterval,
143 const DWORD dwTimeOut, void * const pvUserContext, DPNHANDLE * const pAsyncHandle,
144 const DWORD dwFlags)
146 IDirectPlay8ClientImpl *This = impl_from_IDirectPlay8Client(iface);
148 FIXME("(%p):(%p,%p,%p,%p,%u,%u,%u,%u,%p,%p,%x)\n", This, pApplicationDesc, pAddrHost, pDeviceInfo, pUserEnumData,
149 dwUserEnumDataSize, dwEnumCount, dwRetryInterval, dwTimeOut, pvUserContext, pAsyncHandle, dwFlags);
151 if(!This->msghandler)
152 return DPNERR_UNINITIALIZED;
154 if((dwFlags & DPNENUMHOSTS_SYNC) && pAsyncHandle)
155 return DPNERR_INVALIDPARAM;
157 if(dwUserEnumDataSize > This->spcaps.dwMaxEnumPayloadSize)
158 return DPNERR_ENUMQUERYTOOLARGE;
160 return (dwFlags & DPNENUMHOSTS_SYNC) ? DPN_OK : DPNSUCCESS_PENDING;
163 static HRESULT WINAPI IDirectPlay8ClientImpl_CancelAsyncOperation(IDirectPlay8Client *iface,
164 const DPNHANDLE hAsyncHandle, const DWORD dwFlags)
166 IDirectPlay8ClientImpl *This = impl_from_IDirectPlay8Client(iface);
167 FIXME("(%p):(%u,%x): Stub\n", This, hAsyncHandle, dwFlags);
168 return DPN_OK;
171 static HRESULT WINAPI IDirectPlay8ClientImpl_Connect(IDirectPlay8Client *iface,
172 const DPN_APPLICATION_DESC * const pdnAppDesc, IDirectPlay8Address * const pHostAddr,
173 IDirectPlay8Address * const pDeviceInfo, const DPN_SECURITY_DESC * const pdnSecurity,
174 const DPN_SECURITY_CREDENTIALS * const pdnCredentials, const void * const pvUserConnectData,
175 const DWORD dwUserConnectDataSize, void * const pvAsyncContext,
176 DPNHANDLE * const phAsyncHandle, const DWORD dwFlags)
178 IDirectPlay8ClientImpl *This = impl_from_IDirectPlay8Client(iface);
179 FIXME("(%p):(%p,%p,%x): Stub\n", This, pvAsyncContext, phAsyncHandle, dwFlags);
180 return DPN_OK;
183 static HRESULT WINAPI IDirectPlay8ClientImpl_Send(IDirectPlay8Client *iface,
184 const DPN_BUFFER_DESC * const prgBufferDesc, const DWORD cBufferDesc, const DWORD dwTimeOut,
185 void * const pvAsyncContext, DPNHANDLE * const phAsyncHandle, const DWORD dwFlags)
187 IDirectPlay8ClientImpl *This = impl_from_IDirectPlay8Client(iface);
188 FIXME("(%p):(%p,%p,%x): Stub\n", This, pvAsyncContext, phAsyncHandle, dwFlags);
189 return DPN_OK;
192 static HRESULT WINAPI IDirectPlay8ClientImpl_GetSendQueueInfo(IDirectPlay8Client *iface,
193 DWORD * const pdwNumMsgs, DWORD * const pdwNumBytes, const DWORD dwFlags)
195 IDirectPlay8ClientImpl *This = impl_from_IDirectPlay8Client(iface);
196 FIXME("(%p):(%x): Stub\n", This, dwFlags);
197 return DPN_OK;
200 static HRESULT WINAPI IDirectPlay8ClientImpl_GetApplicationDesc(IDirectPlay8Client *iface,
201 DPN_APPLICATION_DESC * const pAppDescBuffer, DWORD * const pcbDataSize, const DWORD dwFlags)
203 IDirectPlay8ClientImpl *This = impl_from_IDirectPlay8Client(iface);
204 FIXME("(%p):(%x): Stub\n", This, dwFlags);
205 return DPN_OK;
208 static HRESULT WINAPI IDirectPlay8ClientImpl_SetClientInfo(IDirectPlay8Client *iface,
209 const DPN_PLAYER_INFO * const pdpnPlayerInfo, void * const pvAsyncContext,
210 DPNHANDLE * const phAsyncHandle, const DWORD dwFlags)
212 IDirectPlay8ClientImpl *This = impl_from_IDirectPlay8Client(iface);
213 FIXME("(%p):(%p,%p,%x): Semi-stub.\n", This, pvAsyncContext, phAsyncHandle, dwFlags);
215 if(!pdpnPlayerInfo)
216 return E_POINTER;
218 if(phAsyncHandle)
219 FIXME("Async handle currently not supported.\n");
221 if (pdpnPlayerInfo->dwInfoFlags & DPNINFO_NAME)
223 heap_free(This->username);
224 This->username = NULL;
226 if(pdpnPlayerInfo->pwszName)
228 This->username = heap_strdupW(pdpnPlayerInfo->pwszName);
229 if (!This->username)
230 return E_OUTOFMEMORY;
234 if (pdpnPlayerInfo->dwInfoFlags & DPNINFO_DATA)
236 heap_free(This->data);
237 This->data = NULL;
238 This->datasize = 0;
240 if(!pdpnPlayerInfo->pvData && pdpnPlayerInfo->dwDataSize)
241 return E_POINTER;
243 if(pdpnPlayerInfo->dwDataSize && pdpnPlayerInfo->pvData)
245 This->data = heap_alloc(pdpnPlayerInfo->dwDataSize);
246 if (!This->data)
247 return E_OUTOFMEMORY;
249 This->datasize = pdpnPlayerInfo->dwDataSize;
251 memcpy(This->data, pdpnPlayerInfo->pvData, pdpnPlayerInfo->dwDataSize);
255 return DPN_OK;
258 static HRESULT WINAPI IDirectPlay8ClientImpl_GetServerInfo(IDirectPlay8Client *iface,
259 DPN_PLAYER_INFO * const pdpnPlayerInfo, DWORD * const pdwSize, const DWORD dwFlags)
261 IDirectPlay8ClientImpl *This = impl_from_IDirectPlay8Client(iface);
262 FIXME("(%p):(%x): Stub\n", This, dwFlags);
263 return DPN_OK;
266 static HRESULT WINAPI IDirectPlay8ClientImpl_GetServerAddress(IDirectPlay8Client *iface,
267 IDirectPlay8Address ** const pAddress, const DWORD dwFlags)
269 IDirectPlay8ClientImpl *This = impl_from_IDirectPlay8Client(iface);
270 FIXME("(%p):(%x): Stub\n", This, dwFlags);
271 return DPN_OK;
274 static HRESULT WINAPI IDirectPlay8ClientImpl_Close(IDirectPlay8Client *iface, const DWORD dwFlags)
276 IDirectPlay8ClientImpl *This = impl_from_IDirectPlay8Client(iface);
277 FIXME("(%p):(%x): Stub\n", This, dwFlags);
279 This->msghandler = NULL;
281 return DPN_OK;
284 static HRESULT WINAPI IDirectPlay8ClientImpl_ReturnBuffer(IDirectPlay8Client *iface,
285 const DPNHANDLE hBufferHandle, const DWORD dwFlags)
287 IDirectPlay8ClientImpl *This = impl_from_IDirectPlay8Client(iface);
288 FIXME("(%p):(%x): Stub\n", This, dwFlags);
289 return DPN_OK;
292 static HRESULT WINAPI IDirectPlay8ClientImpl_GetCaps(IDirectPlay8Client *iface,
293 DPN_CAPS * const pdpCaps, const DWORD dwFlags)
295 IDirectPlay8ClientImpl *This = impl_from_IDirectPlay8Client(iface);
296 FIXME("(%p):(%x): Stub\n", This, dwFlags);
297 return DPN_OK;
300 static HRESULT WINAPI IDirectPlay8ClientImpl_SetCaps(IDirectPlay8Client *iface,
301 const DPN_CAPS * const pdpCaps, const DWORD dwFlags)
303 IDirectPlay8ClientImpl *This = impl_from_IDirectPlay8Client(iface);
304 FIXME("(%p):(%x): Stub\n", This, dwFlags);
305 return DPN_OK;
308 static HRESULT WINAPI IDirectPlay8ClientImpl_SetSPCaps(IDirectPlay8Client *iface,
309 const GUID * const pguidSP, const DPN_SP_CAPS * const pdpspCaps, const DWORD dwFlags)
311 IDirectPlay8ClientImpl *This = impl_from_IDirectPlay8Client(iface);
313 TRACE("(%p)->(%p,%p,%x): stub\n", iface, pguidSP, pdpspCaps, dwFlags);
315 if(!This->msghandler || pdpspCaps->dwSize != sizeof(DPN_SP_CAPS))
316 return DPNERR_INVALIDPARAM;
318 /* Only dwSystemBufferSize is set by this call. */
319 This->spcaps.dwSystemBufferSize = pdpspCaps->dwSystemBufferSize;
321 return DPN_OK;
324 static HRESULT WINAPI IDirectPlay8ClientImpl_GetSPCaps(IDirectPlay8Client *iface,
325 const GUID * const pguidSP, DPN_SP_CAPS * const pdpspCaps, const DWORD dwFlags)
327 IDirectPlay8ClientImpl *This = impl_from_IDirectPlay8Client(iface);
329 TRACE("(%p)->(%p,%p,%x)\n", This, pguidSP, pdpspCaps, dwFlags);
331 if(!This->msghandler)
332 return DPNERR_UNINITIALIZED;
334 if(pdpspCaps->dwSize != sizeof(DPN_SP_CAPS))
336 return DPNERR_INVALIDPARAM;
339 *pdpspCaps = This->spcaps;
341 return DPN_OK;
344 static HRESULT WINAPI IDirectPlay8ClientImpl_GetConnectionInfo(IDirectPlay8Client *iface,
345 DPN_CONNECTION_INFO * const pdpConnectionInfo, const DWORD dwFlags)
347 IDirectPlay8ClientImpl *This = impl_from_IDirectPlay8Client(iface);
348 FIXME("(%p):(%x): Stub\n", This, dwFlags);
349 return DPN_OK;
352 static HRESULT WINAPI IDirectPlay8ClientImpl_RegisterLobby(IDirectPlay8Client *iface,
353 const DPNHANDLE dpnHandle,
354 struct IDirectPlay8LobbiedApplication * const pIDP8LobbiedApplication, const DWORD dwFlags)
356 IDirectPlay8ClientImpl *This = impl_from_IDirectPlay8Client(iface);
357 FIXME("(%p):(%x): Stub\n", This, dwFlags);
358 return DPN_OK;
361 static const IDirectPlay8ClientVtbl DirectPlay8Client_Vtbl =
363 IDirectPlay8ClientImpl_QueryInterface,
364 IDirectPlay8ClientImpl_AddRef,
365 IDirectPlay8ClientImpl_Release,
366 IDirectPlay8ClientImpl_Initialize,
367 IDirectPlay8ClientImpl_EnumServiceProviders,
368 IDirectPlay8ClientImpl_EnumHosts,
369 IDirectPlay8ClientImpl_CancelAsyncOperation,
370 IDirectPlay8ClientImpl_Connect,
371 IDirectPlay8ClientImpl_Send,
372 IDirectPlay8ClientImpl_GetSendQueueInfo,
373 IDirectPlay8ClientImpl_GetApplicationDesc,
374 IDirectPlay8ClientImpl_SetClientInfo,
375 IDirectPlay8ClientImpl_GetServerInfo,
376 IDirectPlay8ClientImpl_GetServerAddress,
377 IDirectPlay8ClientImpl_Close,
378 IDirectPlay8ClientImpl_ReturnBuffer,
379 IDirectPlay8ClientImpl_GetCaps,
380 IDirectPlay8ClientImpl_SetCaps,
381 IDirectPlay8ClientImpl_SetSPCaps,
382 IDirectPlay8ClientImpl_GetSPCaps,
383 IDirectPlay8ClientImpl_GetConnectionInfo,
384 IDirectPlay8ClientImpl_RegisterLobby
387 HRESULT DPNET_CreateDirectPlay8Client(IClassFactory *iface, IUnknown *pUnkOuter, REFIID riid, void **ppv)
389 IDirectPlay8ClientImpl* client;
390 HRESULT hr;
392 TRACE("(%p, %s, %p)\n", pUnkOuter, debugstr_guid(riid), ppv);
394 *ppv = NULL;
396 if(pUnkOuter)
397 return CLASS_E_NOAGGREGATION;
399 client = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirectPlay8ClientImpl));
400 if (!client)
401 return E_OUTOFMEMORY;
403 client->IDirectPlay8Client_iface.lpVtbl = &DirectPlay8Client_Vtbl;
404 client->ref = 1;
406 init_dpn_sp_caps(&client->spcaps);
408 hr = IDirectPlay8ClientImpl_QueryInterface(&client->IDirectPlay8Client_iface, riid, ppv);
409 IDirectPlay8ClientImpl_Release(&client->IDirectPlay8Client_iface);
411 return hr;
414 static HRESULT WINAPI lobbyclient_QueryInterface(IDirectPlay8LobbyClient *iface, REFIID riid, void **obj)
416 IDirectPlay8LobbyClientImpl *This = impl_from_IDirectPlay8LobbyClient(iface);
418 TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), obj);
420 *obj = NULL;
422 if (IsEqualGUID(riid, &IID_IUnknown) ||
423 IsEqualGUID(riid, &IID_IDirectPlay8LobbyClient))
425 *obj = &This->IDirectPlay8LobbyClient_iface;
426 IUnknown_AddRef( (IUnknown*)*obj);
428 return DPN_OK;
431 WARN("(%p)->(%s,%p),not found\n",This,debugstr_guid(riid),obj);
432 return E_NOINTERFACE;
435 static ULONG WINAPI lobbyclient_AddRef(IDirectPlay8LobbyClient *iface)
437 IDirectPlay8LobbyClientImpl *This = impl_from_IDirectPlay8LobbyClient(iface);
438 ULONG ref = InterlockedIncrement(&This->ref);
440 TRACE("(%p) ref=%u\n", This, ref);
442 return ref;
445 static ULONG WINAPI lobbyclient_Release(IDirectPlay8LobbyClient *iface)
447 IDirectPlay8LobbyClientImpl *This = impl_from_IDirectPlay8LobbyClient(iface);
448 ULONG ref = InterlockedDecrement(&This->ref);
450 TRACE("(%p) ref=%u\n", This, ref);
452 if (!ref)
454 HeapFree(GetProcessHeap(), 0, This);
457 return ref;
460 static HRESULT WINAPI lobbyclient_Initialize(IDirectPlay8LobbyClient *iface, void *context,
461 PFNDPNMESSAGEHANDLER msghandler, DWORD flags)
463 IDirectPlay8LobbyClientImpl *This = impl_from_IDirectPlay8LobbyClient(iface);
465 TRACE("(%p):(%p,%p,%x)\n", This, context, msghandler, flags);
467 if(!msghandler)
468 return E_POINTER;
470 This->usercontext = context;
471 This->msghandler = msghandler;
472 This->flags = flags;
474 init_winsock();
476 return DPN_OK;
479 static HRESULT WINAPI lobbyclient_EnumLocalPrograms(IDirectPlay8LobbyClient *iface, GUID* guidapplication,
480 BYTE *enumdata, DWORD *enumDataSize, DWORD *items, DWORD flags)
482 IDirectPlay8LobbyClientImpl *This = impl_from_IDirectPlay8LobbyClient(iface);
484 FIXME("(%p)->(%p %p %p %p 0x%08x)\n", This, guidapplication, enumdata, enumDataSize, items, flags);
486 if(enumDataSize)
487 *enumDataSize = 0;
489 return S_OK;
492 static HRESULT WINAPI lobbyclient_ConnectApplication(IDirectPlay8LobbyClient *iface, DPL_CONNECT_INFO *connectioninfo,
493 void *connectioncontext, DPNHANDLE *application, DWORD timeout,
494 DWORD flags)
496 IDirectPlay8LobbyClientImpl *This = impl_from_IDirectPlay8LobbyClient(iface);
498 FIXME("(%p)->(%p %p %p %u 0x%08x)\n", This, connectioninfo, connectioncontext, application, timeout, flags);
500 return E_NOTIMPL;
503 static HRESULT WINAPI lobbyclient_Send(IDirectPlay8LobbyClient *iface, DPNHANDLE connection, BYTE *buffer, DWORD buffersize, DWORD flags)
505 IDirectPlay8LobbyClientImpl *This = impl_from_IDirectPlay8LobbyClient(iface);
507 FIXME("(%p)->(%u %p %u 0x%08x)\n", This, connection, buffer, buffersize, flags);
509 return E_NOTIMPL;
512 static HRESULT WINAPI lobbyclient_ReleaseApplication(IDirectPlay8LobbyClient *iface, DPNHANDLE connection, DWORD flags)
514 IDirectPlay8LobbyClientImpl *This = impl_from_IDirectPlay8LobbyClient(iface);
516 FIXME("(%p)->(%u 0x%08x)\n", This, connection, flags);
518 return E_NOTIMPL;
521 static HRESULT WINAPI lobbyclient_Close(IDirectPlay8LobbyClient *iface, DWORD flags)
523 IDirectPlay8LobbyClientImpl *This = impl_from_IDirectPlay8LobbyClient(iface);
525 FIXME("(%p)->(0x%08x)\n", This, flags);
527 return E_NOTIMPL;
530 static HRESULT WINAPI lobbyclient_GetConnectionSettings(IDirectPlay8LobbyClient *iface, DPNHANDLE connection, DPL_CONNECTION_SETTINGS *sessioninfo, DWORD *infosize, DWORD flags)
532 IDirectPlay8LobbyClientImpl *This = impl_from_IDirectPlay8LobbyClient(iface);
534 FIXME("(%p)->(%u %p %p 0x%08x)\n", This, connection, sessioninfo, infosize, flags);
536 return E_NOTIMPL;
539 static HRESULT WINAPI lobbyclient_SetConnectionSettings(IDirectPlay8LobbyClient *iface, DPNHANDLE connection, const DPL_CONNECTION_SETTINGS *sessioninfo, DWORD flags)
541 IDirectPlay8LobbyClientImpl *This = impl_from_IDirectPlay8LobbyClient(iface);
543 FIXME("(%p)->(%u %p 0x%08x)\n", This, connection, sessioninfo, flags);
545 return E_NOTIMPL;
548 static const IDirectPlay8LobbyClientVtbl DirectPlay8LobbiedClient_Vtbl =
550 lobbyclient_QueryInterface,
551 lobbyclient_AddRef,
552 lobbyclient_Release,
553 lobbyclient_Initialize,
554 lobbyclient_EnumLocalPrograms,
555 lobbyclient_ConnectApplication,
556 lobbyclient_Send,
557 lobbyclient_ReleaseApplication,
558 lobbyclient_Close,
559 lobbyclient_GetConnectionSettings,
560 lobbyclient_SetConnectionSettings
563 HRESULT DPNET_CreateDirectPlay8LobbyClient(IClassFactory *iface, IUnknown *outer, REFIID riid, void **obj)
565 IDirectPlay8LobbyClientImpl *client;
566 HRESULT ret;
568 TRACE("%p (%p, %s, %p)\n", iface, outer, debugstr_guid(riid), obj);
570 client = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*client));
571 if (!client)
573 *obj = NULL;
574 return E_OUTOFMEMORY;
577 client->IDirectPlay8LobbyClient_iface.lpVtbl = &DirectPlay8LobbiedClient_Vtbl;
578 client->ref = 1;
580 ret = lobbyclient_QueryInterface(&client->IDirectPlay8LobbyClient_iface, riid, obj);
581 lobbyclient_Release(&client->IDirectPlay8LobbyClient_iface);
583 return ret;