cmd: DIR command outputs free space for the path.
[wine.git] / dlls / dpnet / server.c
blob923d0d5bfa5da931047cbf890533c1efffc31d5c
1 /*
2 * DirectPlay8 Server
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 "ocidl.h"
32 #include "wine/debug.h"
34 #include "dpnet_private.h"
36 typedef struct IDirectPlay8ServerImpl
38 IDirectPlay8Server IDirectPlay8Server_iface;
39 LONG ref;
41 PFNDPNMESSAGEHANDLER msghandler;
42 DWORD flags;
43 void *usercontext;
45 WCHAR *servername;
46 void *data;
47 DWORD datasize;
48 } IDirectPlay8ServerImpl;
50 WINE_DEFAULT_DEBUG_CHANNEL(dpnet);
52 static inline IDirectPlay8ServerImpl *impl_from_IDirectPlay8Server(IDirectPlay8Server *iface)
54 return CONTAINING_RECORD(iface, IDirectPlay8ServerImpl, IDirectPlay8Server_iface);
57 static HRESULT WINAPI IDirectPlay8ServerImpl_QueryInterface(IDirectPlay8Server *iface, REFIID riid, void **ppv)
59 IDirectPlay8ServerImpl *This = impl_from_IDirectPlay8Server(iface);
61 TRACE("%p %s %p\n", This, debugstr_guid(riid), ppv);
63 if (IsEqualGUID(riid, &IID_IUnknown) ||
64 IsEqualGUID(riid, &IID_IDirectPlay8Server))
66 TRACE("(%p)->(IID_IDirectPlay8Server %p)\n", This, ppv);
67 *ppv = &This->IDirectPlay8Server_iface;
69 else {
70 WARN("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppv);
71 *ppv = NULL;
72 return E_NOINTERFACE;
75 IUnknown_AddRef((IUnknown*)*ppv);
76 return S_OK;
79 static ULONG WINAPI IDirectPlay8ServerImpl_AddRef(IDirectPlay8Server *iface)
81 IDirectPlay8ServerImpl *This = impl_from_IDirectPlay8Server(iface);
82 ULONG ref = InterlockedIncrement(&This->ref);
84 TRACE("(%p) ref=%ld\n", This, ref);
86 return ref;
89 static ULONG WINAPI IDirectPlay8ServerImpl_Release(IDirectPlay8Server *iface)
91 IDirectPlay8ServerImpl *This = impl_from_IDirectPlay8Server(iface);
92 ULONG ref = InterlockedDecrement(&This->ref);
94 TRACE("(%p) ref=%ld\n", This, ref);
96 if (!ref)
98 free(This->servername);
99 free(This->data);
100 free(This);
103 return ref;
106 static HRESULT WINAPI IDirectPlay8ServerImpl_Initialize(IDirectPlay8Server *iface, PVOID pvUserContext,
107 PFNDPNMESSAGEHANDLER pfn, DWORD dwFlags)
109 IDirectPlay8ServerImpl *This = impl_from_IDirectPlay8Server(iface);
110 TRACE("(%p)->(%p %p %ld)\n", This, pvUserContext, pfn, dwFlags);
112 if(!pfn)
113 return DPNERR_INVALIDPARAM;
115 This->usercontext = pvUserContext;
116 This->msghandler = pfn;
117 This->flags = dwFlags;
119 init_winsock();
121 return DPN_OK;
124 static HRESULT WINAPI IDirectPlay8ServerImpl_EnumServiceProviders(IDirectPlay8Server *iface, const GUID *pguidServiceProvider,
125 const GUID *pguidApplication, DPN_SERVICE_PROVIDER_INFO *pSPInfoBuffer, PDWORD pcbEnumData,
126 PDWORD pcReturned, DWORD dwFlags)
128 IDirectPlay8ServerImpl *This = impl_from_IDirectPlay8Server(iface);
129 TRACE("(%p)->(%s %s %p %p %p %ld)\n", This, debugstr_guid(pguidServiceProvider), debugstr_guid(pguidApplication),
130 pSPInfoBuffer, pcbEnumData, pcReturned, dwFlags);
132 if(!This->msghandler)
133 return DPNERR_UNINITIALIZED;
135 if(dwFlags)
136 FIXME("Unhandled flags %lx\n", dwFlags);
138 if(pguidApplication)
139 FIXME("Application guid %s is currently being ignored\n", debugstr_guid(pguidApplication));
141 return enum_services_providers(pguidServiceProvider, pSPInfoBuffer, pcbEnumData, pcReturned);
144 static HRESULT WINAPI IDirectPlay8ServerImpl_CancelAsyncOperation(IDirectPlay8Server *iface, DPNHANDLE hAsyncHandle, DWORD dwFlags)
146 IDirectPlay8ServerImpl *This = impl_from_IDirectPlay8Server(iface);
147 FIXME("(%p)->(%ld %ld)\n", This, hAsyncHandle, dwFlags);
148 return E_NOTIMPL;
151 static HRESULT WINAPI IDirectPlay8ServerImpl_GetSendQueueInfo(IDirectPlay8Server *iface, DPNID dpnid, DWORD *pdwNumMsgs,
152 DWORD *pdwNumBytes, DWORD dwFlags)
154 IDirectPlay8ServerImpl *This = impl_from_IDirectPlay8Server(iface);
155 FIXME("(%p)->(%ld %p %p %ld)\n", This, dpnid, pdwNumMsgs, pdwNumBytes, dwFlags);
156 return E_NOTIMPL;
159 static HRESULT WINAPI IDirectPlay8ServerImpl_GetApplicationDesc(IDirectPlay8Server *iface, DPN_APPLICATION_DESC *pAppDescBuffer,
160 DWORD *pcbDataSize, DWORD dwFlags)
162 IDirectPlay8ServerImpl *This = impl_from_IDirectPlay8Server(iface);
163 FIXME("(%p)->(%p %p %ld)\n", This, pAppDescBuffer, pcbDataSize, dwFlags);
164 return E_NOTIMPL;
167 static HRESULT WINAPI IDirectPlay8ServerImpl_SetServerInfo(IDirectPlay8Server *iface, const DPN_PLAYER_INFO *pdpnPlayerInfo,
168 PVOID pvAsyncContext, DPNHANDLE *phAsyncHandle, DWORD dwFlags)
170 IDirectPlay8ServerImpl *This = impl_from_IDirectPlay8Server(iface);
172 FIXME("(%p)->(%p %p %p %lx) Semi-stub\n", This, pdpnPlayerInfo, pvAsyncContext, phAsyncHandle, dwFlags);
174 if(!pdpnPlayerInfo)
175 return E_POINTER;
177 if(!This->msghandler)
178 return DPNERR_UNINITIALIZED;
180 if(phAsyncHandle)
181 FIXME("Async handle currently not supported.\n");
183 if (pdpnPlayerInfo->dwInfoFlags & DPNINFO_NAME)
185 free(This->servername);
186 This->servername = NULL;
188 if(pdpnPlayerInfo->pwszName)
190 This->servername = wcsdup(pdpnPlayerInfo->pwszName);
191 if (!This->servername)
192 return E_OUTOFMEMORY;
196 if (pdpnPlayerInfo->dwInfoFlags & DPNINFO_DATA)
198 free(This->data);
199 This->data = NULL;
200 This->datasize = 0;
202 if(!pdpnPlayerInfo->pvData && pdpnPlayerInfo->dwDataSize)
203 return E_POINTER;
205 if(pdpnPlayerInfo->dwDataSize && pdpnPlayerInfo->pvData)
207 This->data = malloc(pdpnPlayerInfo->dwDataSize);
208 if (!This->data)
209 return E_OUTOFMEMORY;
211 This->datasize = pdpnPlayerInfo->dwDataSize;
213 memcpy(This->data, pdpnPlayerInfo->pvData, pdpnPlayerInfo->dwDataSize);
217 /* TODO: Send DPN_MSGID_SERVER_INFO message to all players. */
218 return S_OK;
221 static HRESULT WINAPI IDirectPlay8ServerImpl_GetClientInfo(IDirectPlay8Server *iface, DPNID dpnid, DPN_PLAYER_INFO *pdpnPlayerInfo,
222 DWORD *pdwSize, DWORD dwFlags)
224 IDirectPlay8ServerImpl *This = impl_from_IDirectPlay8Server(iface);
225 FIXME("(%p)->(%ld %p %p %ld)\n", This, dpnid, pdpnPlayerInfo, pdwSize, dwFlags);
226 return E_NOTIMPL;
229 static HRESULT WINAPI IDirectPlay8ServerImpl_GetClientAddress(IDirectPlay8Server *iface, DPNID dpnid, IDirectPlay8Address **pAddress,
230 DWORD dwFlags)
232 IDirectPlay8ServerImpl *This = impl_from_IDirectPlay8Server(iface);
233 FIXME("(%p)->(%ld %p %ld)\n", This, dpnid, pAddress, dwFlags);
234 return E_NOTIMPL;
237 static HRESULT WINAPI IDirectPlay8ServerImpl_GetLocalHostAddresses(IDirectPlay8Server *iface, IDirectPlay8Address **prgpAddress,
238 DWORD *pcAddress, DWORD dwFlags)
240 IDirectPlay8ServerImpl *This = impl_from_IDirectPlay8Server(iface);
241 FIXME("(%p)->(%p %p %ld)\n", This, prgpAddress, pcAddress, dwFlags);
242 return E_NOTIMPL;
245 static HRESULT WINAPI IDirectPlay8ServerImpl_SetApplicationDesc(IDirectPlay8Server *iface, const DPN_APPLICATION_DESC *pad, DWORD dwFlags)
247 IDirectPlay8ServerImpl *This = impl_from_IDirectPlay8Server(iface);
248 FIXME("(%p)->(%p %ld)\n", This, pad, dwFlags);
249 return E_NOTIMPL;
252 static HRESULT WINAPI IDirectPlay8ServerImpl_Host(IDirectPlay8Server *iface, const DPN_APPLICATION_DESC *pdnAppDesc,
253 IDirectPlay8Address **prgpDeviceInfo, DWORD cDeviceInfo, const DPN_SECURITY_DESC *pdnSecurity,
254 const DPN_SECURITY_CREDENTIALS *pdnCredentials, void *pvPlayerContext, DWORD dwFlags)
256 IDirectPlay8ServerImpl *This = impl_from_IDirectPlay8Server(iface);
257 FIXME("(%p)->(%p %p %ld %p %p %p %ld)\n", This, pdnAppDesc, prgpDeviceInfo, cDeviceInfo, pdnSecurity, pdnCredentials,
258 pvPlayerContext, dwFlags);
259 return E_NOTIMPL;
262 static HRESULT WINAPI IDirectPlay8ServerImpl_SendTo(IDirectPlay8Server *iface, DPNID dpnid, const DPN_BUFFER_DESC *prgBufferDesc,
263 DWORD cBufferDesc, DWORD dwTimeOut, void *pvAsyncContext, DPNHANDLE *phAsyncHandle, DWORD dwFlags)
265 IDirectPlay8ServerImpl *This = impl_from_IDirectPlay8Server(iface);
266 FIXME("(%p)->(%ld %p %ld %ld %p %p %ld)\n", This, dpnid, prgBufferDesc, cBufferDesc, dwTimeOut, pvAsyncContext, phAsyncHandle,
267 dwFlags);
268 return E_NOTIMPL;
271 static HRESULT WINAPI IDirectPlay8ServerImpl_CreateGroup(IDirectPlay8Server *iface, const DPN_GROUP_INFO *pdpnGroupInfo,
272 void *pvGroupContext, void *pvAsyncContext, DPNHANDLE *phAsyncHandle, DWORD dwFlags)
274 IDirectPlay8ServerImpl *This = impl_from_IDirectPlay8Server(iface);
275 FIXME("(%p)->(%p %p %p %p %ld)\n", This, pdpnGroupInfo, pvGroupContext, pvAsyncContext, phAsyncHandle, dwFlags);
276 return E_NOTIMPL;
279 static HRESULT WINAPI IDirectPlay8ServerImpl_DestroyGroup(IDirectPlay8Server *iface, DPNID idGroup, PVOID pvAsyncContext,
280 DPNHANDLE *phAsyncHandle, DWORD dwFlags)
282 IDirectPlay8ServerImpl *This = impl_from_IDirectPlay8Server(iface);
283 FIXME("(%p)->(%ld %p %p %ld)\n", This, idGroup, pvAsyncContext, phAsyncHandle, dwFlags);
284 return E_NOTIMPL;
287 static HRESULT WINAPI IDirectPlay8ServerImpl_AddPlayerToGroup(IDirectPlay8Server *iface, DPNID idGroup, DPNID idClient,
288 PVOID pvAsyncContext, DPNHANDLE *phAsyncHandle, DWORD dwFlags)
290 IDirectPlay8ServerImpl *This = impl_from_IDirectPlay8Server(iface);
291 FIXME("(%p)->(%ld %ld %p %p %ld)\n", This, idGroup, idClient, pvAsyncContext, phAsyncHandle, dwFlags);
292 return E_NOTIMPL;
295 static HRESULT WINAPI IDirectPlay8ServerImpl_RemovePlayerFromGroup(IDirectPlay8Server *iface, DPNID idGroup, DPNID idClient,
296 PVOID pvAsyncContext, DPNHANDLE *phAsyncHandle, DWORD dwFlags)
298 IDirectPlay8ServerImpl *This = impl_from_IDirectPlay8Server(iface);
299 FIXME("(%p)->(%ld %ld %p %p %ld)\n", This, idGroup, idClient, pvAsyncContext, phAsyncHandle, dwFlags);
300 return E_NOTIMPL;
303 static HRESULT WINAPI IDirectPlay8ServerImpl_SetGroupInfo(IDirectPlay8Server *iface, DPNID dpnid, DPN_GROUP_INFO *pdpnGroupInfo,
304 PVOID pvAsyncContext, DPNHANDLE *phAsyncHandle, DWORD dwFlags)
306 IDirectPlay8ServerImpl *This = impl_from_IDirectPlay8Server(iface);
307 FIXME("(%p)->(%ld %p %p %p %ld)\n", This, dpnid, pdpnGroupInfo, pvAsyncContext, phAsyncHandle, dwFlags);
308 return E_NOTIMPL;
311 static HRESULT WINAPI IDirectPlay8ServerImpl_GetGroupInfo(IDirectPlay8Server *iface, DPNID dpnid, DPN_GROUP_INFO *pdpnGroupInfo,
312 DWORD *pdwSize, DWORD dwFlags)
314 IDirectPlay8ServerImpl *This = impl_from_IDirectPlay8Server(iface);
315 FIXME("(%p)->(%ld %p %p %ld)\n", This, dpnid, pdpnGroupInfo, pdwSize, dwFlags);
316 return E_NOTIMPL;
319 static HRESULT WINAPI IDirectPlay8ServerImpl_EnumPlayersAndGroups(IDirectPlay8Server *iface, DPNID *prgdpnid, DWORD *pcdpnid, DWORD dwFlags)
321 IDirectPlay8ServerImpl *This = impl_from_IDirectPlay8Server(iface);
322 FIXME("(%p)->(%p %p %ld)\n", This, prgdpnid, pcdpnid, dwFlags);
323 return E_NOTIMPL;
326 static HRESULT WINAPI IDirectPlay8ServerImpl_EnumGroupMembers(IDirectPlay8Server *iface, DPNID dpnid, DPNID *prgdpnid, DWORD *pcdpnid, DWORD dwFlags)
328 IDirectPlay8ServerImpl *This = impl_from_IDirectPlay8Server(iface);
329 FIXME("(%p)->(%ld %p %p %ld)\n", This, dpnid, prgdpnid, pcdpnid, dwFlags);
330 return E_NOTIMPL;
333 static HRESULT WINAPI IDirectPlay8ServerImpl_Close(IDirectPlay8Server *iface, DWORD dwFlags)
335 IDirectPlay8ServerImpl *This = impl_from_IDirectPlay8Server(iface);
336 FIXME("(%p)->(%ld)\n", This, dwFlags);
337 return E_NOTIMPL;
340 static HRESULT WINAPI IDirectPlay8ServerImpl_DestroyClient(IDirectPlay8Server *iface, DPNID dpnidClient, const void *pvDestroyData,
341 DWORD dwDestroyDataSize, DWORD dwFlags)
343 IDirectPlay8ServerImpl *This = impl_from_IDirectPlay8Server(iface);
344 FIXME("(%p)->(%ld %p %ld %ld)\n", This, dpnidClient, pvDestroyData, dwDestroyDataSize, dwFlags);
345 return E_NOTIMPL;
348 static HRESULT WINAPI IDirectPlay8ServerImpl_ReturnBuffer(IDirectPlay8Server *iface, DPNHANDLE hBufferHandle, DWORD dwFlags)
350 IDirectPlay8ServerImpl *This = impl_from_IDirectPlay8Server(iface);
351 FIXME("(%p)->(%ld %ld)\n", This, hBufferHandle, dwFlags);
352 return E_NOTIMPL;
355 static HRESULT WINAPI IDirectPlay8ServerImpl_GetPlayerContext(IDirectPlay8Server *iface, DPNID dpnid, PVOID *ppvPlayerContext, DWORD dwFlags)
357 IDirectPlay8ServerImpl *This = impl_from_IDirectPlay8Server(iface);
358 FIXME("(%p)->(%ld %p %ld)\n", This, dpnid, ppvPlayerContext, dwFlags);
359 return E_NOTIMPL;
362 static HRESULT WINAPI IDirectPlay8ServerImpl_GetGroupContext(IDirectPlay8Server *iface, DPNID dpnid, PVOID *ppvGroupContext, DWORD dwFlags)
364 IDirectPlay8ServerImpl *This = impl_from_IDirectPlay8Server(iface);
365 FIXME("(%p)->(%ld %p %ld)\n", This, dpnid, ppvGroupContext, dwFlags);
366 return E_NOTIMPL;
369 static HRESULT WINAPI IDirectPlay8ServerImpl_GetCaps(IDirectPlay8Server *iface, DPN_CAPS *pdpCaps, DWORD dwFlags)
371 IDirectPlay8ServerImpl *This = impl_from_IDirectPlay8Server(iface);
372 FIXME("(%p)->(%p %ld)\n", This, pdpCaps, dwFlags);
373 return E_NOTIMPL;
376 static HRESULT WINAPI IDirectPlay8ServerImpl_SetCaps(IDirectPlay8Server *iface, const DPN_CAPS *pdpCaps, DWORD dwFlags)
378 IDirectPlay8ServerImpl *This = impl_from_IDirectPlay8Server(iface);
379 FIXME("(%p)->(%p %ld)\n", This, pdpCaps, dwFlags);
380 return E_NOTIMPL;
383 static HRESULT WINAPI IDirectPlay8ServerImpl_SetSPCaps(IDirectPlay8Server *iface, const GUID *pguidSP, const DPN_SP_CAPS *pdpspCaps, DWORD dwFlags )
385 IDirectPlay8ServerImpl *This = impl_from_IDirectPlay8Server(iface);
386 FIXME("(%p)->(%p %p %ld)\n", This, pguidSP, pdpspCaps, dwFlags);
387 return E_NOTIMPL;
390 static HRESULT WINAPI IDirectPlay8ServerImpl_GetSPCaps(IDirectPlay8Server *iface, const GUID *pguidSP, DPN_SP_CAPS *pdpspCaps, DWORD dwFlags)
392 IDirectPlay8ServerImpl *This = impl_from_IDirectPlay8Server(iface);
393 FIXME("(%p)->(%p %p %ld)\n", This, pguidSP, pdpspCaps, dwFlags);
394 return E_NOTIMPL;
397 static HRESULT WINAPI IDirectPlay8ServerImpl_GetConnectionInfo(IDirectPlay8Server *iface, DPNID dpnid,
398 DPN_CONNECTION_INFO *pdpConnectionInfo, DWORD dwFlags)
400 IDirectPlay8ServerImpl *This = impl_from_IDirectPlay8Server(iface);
401 FIXME("(%p)->(%ld %p %ld)\n", This, dpnid, pdpConnectionInfo, dwFlags);
402 return E_NOTIMPL;
405 static HRESULT WINAPI IDirectPlay8ServerImpl_RegisterLobby(IDirectPlay8Server *iface, DPNHANDLE dpnHandle,
406 struct IDirectPlay8LobbiedApplication *pIDP8LobbiedApplication, DWORD dwFlags)
408 IDirectPlay8ServerImpl *This = impl_from_IDirectPlay8Server(iface);
409 FIXME("(%p)->(%ld %p %ld)\n", This, dpnHandle, pIDP8LobbiedApplication, dwFlags);
410 return E_NOTIMPL;
413 static const IDirectPlay8ServerVtbl DirectPlay8ServerVtbl =
415 IDirectPlay8ServerImpl_QueryInterface,
416 IDirectPlay8ServerImpl_AddRef,
417 IDirectPlay8ServerImpl_Release,
418 IDirectPlay8ServerImpl_Initialize,
419 IDirectPlay8ServerImpl_EnumServiceProviders,
420 IDirectPlay8ServerImpl_CancelAsyncOperation,
421 IDirectPlay8ServerImpl_GetSendQueueInfo,
422 IDirectPlay8ServerImpl_GetApplicationDesc,
423 IDirectPlay8ServerImpl_SetServerInfo,
424 IDirectPlay8ServerImpl_GetClientInfo,
425 IDirectPlay8ServerImpl_GetClientAddress,
426 IDirectPlay8ServerImpl_GetLocalHostAddresses,
427 IDirectPlay8ServerImpl_SetApplicationDesc,
428 IDirectPlay8ServerImpl_Host,
429 IDirectPlay8ServerImpl_SendTo,
430 IDirectPlay8ServerImpl_CreateGroup,
431 IDirectPlay8ServerImpl_DestroyGroup,
432 IDirectPlay8ServerImpl_AddPlayerToGroup,
433 IDirectPlay8ServerImpl_RemovePlayerFromGroup,
434 IDirectPlay8ServerImpl_SetGroupInfo,
435 IDirectPlay8ServerImpl_GetGroupInfo,
436 IDirectPlay8ServerImpl_EnumPlayersAndGroups,
437 IDirectPlay8ServerImpl_EnumGroupMembers,
438 IDirectPlay8ServerImpl_Close,
439 IDirectPlay8ServerImpl_DestroyClient,
440 IDirectPlay8ServerImpl_ReturnBuffer,
441 IDirectPlay8ServerImpl_GetPlayerContext,
442 IDirectPlay8ServerImpl_GetGroupContext,
443 IDirectPlay8ServerImpl_GetCaps,
444 IDirectPlay8ServerImpl_SetCaps,
445 IDirectPlay8ServerImpl_SetSPCaps,
446 IDirectPlay8ServerImpl_GetSPCaps,
447 IDirectPlay8ServerImpl_GetConnectionInfo,
448 IDirectPlay8ServerImpl_RegisterLobby
451 HRESULT DPNET_CreateDirectPlay8Server(IClassFactory *iface, IUnknown *pUnkOuter, REFIID riid, void **ppv)
453 IDirectPlay8ServerImpl *server;
454 HRESULT hr;
456 TRACE("(%p, %s, %p)\n", pUnkOuter, debugstr_guid(riid), ppv);
458 *ppv = NULL;
460 if(pUnkOuter)
461 return CLASS_E_NOAGGREGATION;
463 server = calloc(1, sizeof(IDirectPlay8ServerImpl));
464 if (!server)
465 return E_OUTOFMEMORY;
467 server->IDirectPlay8Server_iface.lpVtbl = &DirectPlay8ServerVtbl;
468 server->ref = 1;
469 server->usercontext = NULL;
470 server->msghandler = NULL;
471 server->flags = 0;
473 hr = IDirectPlay8Server_QueryInterface(&server->IDirectPlay8Server_iface, riid, ppv);
474 IDirectPlay8Server_Release(&server->IDirectPlay8Server_iface);
476 return hr;