33#define DPWS_PORT 47624
34#define DPWS_START_TCP_PORT 2300
35#define DPWS_END_TCP_PORT 2350
36#define DPWS_START_UDP_PORT 2350
37#define DPWS_END_UDP_PORT 2400
89 ERR(
"bind() failed\n" );
93 ERR(
"no free ports\n" );
112 ERR(
"WSARecv() failed\n" );
123 if ( transferred < connection->wsaBuffer.len )
133 ERR(
"WSARecv() failed\n" );
153 connection->completionRoutine = completionRoutine;
160 ERR(
"WSARecv() failed\n" );
176 ERR(
"message is too short: %d\n", messageSize );
184 ERR(
"message is too long: %d\n", messageSize );
189 if (
connection->bufferSize < messageBodySize )
191 int newSize =
max(
connection->bufferSize * 2, messageBodySize );
195 ERR(
"failed to allocate required memory.\n" );
244 ERR(
"WSARecv() failed\n" );
248 messageBody = dpwsData->
buffer;
249 messageBodySize = transferred;
264 ERR(
"message is too short: %d\n", messageSize );
267 if ( messageSize > transferred )
269 ERR(
"truncated message\n" );
285 ERR(
"WSARecv() failed\n" );
304 ERR(
"WSARecv() failed\n" );
325 ERR(
"WSAWaitForMultipleEvents() failed\n" );
328 if ( waitResult == WSA_WAIT_IO_COMPLETION )
336 ERR(
"WSAEnumNetworkEvents() failed\n" );
340 addrSize =
sizeof(
addr );
346 ERR(
"accept() failed\n" );
353 ERR(
"failed to allocate required memory.\n" );
386 ERR(
"socket() failed\n" );
400 ERR(
"listen() failed\n" );
408 ERR(
"WSACreateEvent() failed\n" );
415 ERR(
"WSAEventSelect() failed\n" );
426 ERR(
"socket() failed\n" );
451 ERR(
"WSACreateEvent() failed\n" );
463 ERR(
"CreateThread() failed\n" );
499 free( outConnection );
523 TRACE(
"(%p,%ld,%p,%u)\n",
524 data->lpMessage,
data->dwMessageSize,
538 ERR(
"socket() failed\n" );
543 (
const char *) &trueflag,
544 sizeof( trueflag ) ) )
546 ERR(
"setsockopt() failed\n" );
554 header->SockAddr.sin_port = dpwsData->tcpAddr.sin_port;
564 ERR(
"sendto() failed\n" );
576 FIXME(
"(%p,%p,%ld,%ld,%p) stub\n",
577 data->lpSPMessageHeader,
data->lpMessage,
data->dwMessageSize,
584 FIXME(
"(0x%08lx,%ld,%ld,%p,%ld,%u,%p) stub\n",
586 data->lpMessage,
data->dwMessageSize,
587 data->bSystemMessage,
data->lpISP );
620 ++groupConnectionRef->
ref;
624 if ( !groupConnectionRef )
626 groupConnectionRef->
ref = 1;
629 &groupConnectionRef->
entry );
642 TRACE(
"(%ld,0x%08lx,%p,%p)\n",
data->idGroup,
data->dwFlags,
data->lpSPMessageHeader,
667 key.guaranteed = guaranteed;
680 (*connection)->key =
key;
694 DWORD playerDataSize;
701 TRACE(
"(%ld,0x%08lx,%p,%p)\n",
703 data->lpSPMessageHeader,
data->lpISP );
709 if ( !
data->lpSPMessageHeader )
713 (
void *) &playerDataPlaceholder,
726 if (
data->lpSPMessageHeader )
758 if ( !tcpConnectionRef )
764 tcpConnectionRef->
ref = 1;
769 free( tcpConnectionRef );
775 if ( !udpConnectionRef )
777 free( tcpConnectionRef );
782 udpConnectionRef->
ref = 1;
787 free( udpConnectionRef );
788 free( tcpConnectionRef );
818 free( connectionRef );
832 TRACE(
"(%ld,0x%08lx,%p)\n",
844 free( connectionRef );
852 FIXME(
"(%ld,0x%08lx,%p,%p,%p) stub\n",
854 data->lpdwAddressSize,
data->lpISP );
860 TRACE(
"(%ld,%p,0x%08lx,%p)\n",
896 TRACE(
"(%u,%p,%p,%u,0x%08lx,0x%08lx)\n",
898 data->bReturnStatus,
data->dwOpenFlags,
data->dwSessionFlags );
902 FIXME(
"session creation is not yet supported\n" );
914 memset( &nameserverAddr, 0,
sizeof( nameserverAddr ) );
915 nameserverAddr.sin_family =
AF_INET;
916 nameserverAddr.sin_addr =
header->SockAddr.sin_addr;
917 nameserverAddr.sin_port =
header->SockAddr.sin_port;
922 &dpwsData->nameserverConnectionRef.connection );
926 rb_put( &dpwsData->nameserver.connectionRefs,
927 &dpwsData->nameserverConnectionRef.connection->key,
928 &dpwsData->nameserverConnectionRef.entry );
962 --groupConnectionRef->
ref;
963 if ( groupConnectionRef->
ref )
966 free( groupConnectionRef );
1010 FIXME(
"(%p,%p,%p) stub\n",
1022 if ( guaranteed ||
system )
1047 ERR(
"socket() failed\n" );
1055 ERR(
"connect() failed\n" );
1071 if (
connection->key.guaranteed != guaranteed )
1081 ERR(
"WSASend() failed\n" );
1096 ERR(
"WSASendTo() failed\n" );
1113 if (
connection->key.guaranteed != guaranteed )
1124 ERR(
"WSAGetOverlappedResult() failed\n" );
1129 if ( guaranteed && transferred < messageSize )
1131 ERR(
"lost connection\n" );
1151 TRACE(
"(%p,0x%08lx,%ld,%ld,%p,%ld,%ld,%ld,%ld,%p,%p,%u)\n",
1153 data->lpSendBuffers,
data->cBuffers,
data->dwMessageSize,
1155 data->lpdwSPMsgID,
data->bSystemMessage );
1159 FIXME(
"asynchronous send is not yet supported\n");
1167 if (
data->idPlayerTo )
1182 data->bSystemMessage );
1193 TRACE(
"(%p,0x%08lx,%ld,%ld,%p,%ld,%ld,%ld,%ld,%p,%p)\n",
1195 data->lpSendBuffers,
data->cBuffers,
data->dwMessageSize,
1197 data->lpdwSPMsgID );
1201 FIXME(
"asynchronous send is not yet supported\n");
1220 FIXME(
"(%p,0x%08lx,%p,%ld,0x%08lx,0x%08lx) stub\n",
1222 data->dwMinPriority,
data->dwMaxPriority );
1228 FIXME(
"(%p,0x%08lx,%ld,%ld,%p,%p) stub\n",
1230 data->lpdwNumMsgs,
data->lpdwNumBytes );
1271 TRACE(
"Initializing library for %s (%s)\n",
1286 ERR(
"WSAStartup() failed\n" );
HRESULT WINAPI DECLSPEC_HOTPATCH SetThreadDescription(_In_ HANDLE hThread, _In_ PCWSTR lpThreadDescription)
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
static void list_remove(struct list_entry *entry)
static void list_add_tail(struct list_entry *head, struct list_entry *entry)
static void list_init(struct list_entry *head)
HANDLE WINAPI DECLSPEC_HOTPATCH CreateThread(IN LPSECURITY_ATTRIBUTES lpThreadAttributes, IN DWORD dwStackSize, IN LPTHREAD_START_ROUTINE lpStartAddress, IN LPVOID lpParameter, IN DWORD dwCreationFlags, OUT LPDWORD lpThreadId)
_ACRTIMP int __cdecl system(const char *)
BOOL WSAAPI WSACloseEvent(IN WSAEVENT hEvent)
INT WSAAPI WSAEnumNetworkEvents(IN SOCKET s, IN WSAEVENT hEventObject, OUT LPWSANETWORKEVENTS lpNetworkEvents)
BOOL WSAAPI WSASetEvent(IN WSAEVENT hEvent)
DWORD WSAAPI WSAWaitForMultipleEvents(IN DWORD cEvents, IN CONST WSAEVENT FAR *lphEvents, IN BOOL fWaitAll, IN DWORD dwTimeout, IN BOOL fAlertable)
INT WSAAPI WSARecv(IN SOCKET s, IN OUT LPWSABUF lpBuffers, IN DWORD dwBufferCount, OUT LPDWORD lpNumberOfBytesRecvd, IN OUT LPDWORD lpFlags, IN LPWSAOVERLAPPED lpOverlapped, IN LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine)
INT WSAAPI WSAEventSelect(IN SOCKET s, IN WSAEVENT hEventObject, IN LONG lNetworkEvents)
INT WSAAPI sendto(IN SOCKET s, IN CONST CHAR FAR *buf, IN INT len, IN INT flags, IN CONST struct sockaddr *to, IN INT tolen)
INT WSAAPI WSASend(IN SOCKET s, IN LPWSABUF lpBuffers, IN DWORD dwBufferCount, OUT LPDWORD lpNumberOfBytesSent, IN DWORD dwFlags, IN LPWSAOVERLAPPED lpOverlapped, IN LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine)
INT WSAAPI WSASendTo(IN SOCKET s, IN LPWSABUF lpBuffers, IN DWORD dwBufferCount, OUT LPDWORD lpNumberOfBytesSent, IN DWORD dwFlags, IN CONST struct sockaddr *lpTo, IN INT iToLen, IN LPWSAOVERLAPPED lpOverlapped, IN LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine)
#define DPCAPS_GUARANTEEDSUPPORTED
#define DPCAPS_ASYNCSUPPORTED
#define DPSEND_GUARANTEED
#define DPERR_CONNECTIONLOST
#define DPERR_UNSUPPORTED
#define DPERR_UNAVAILABLE
#define DPERR_OUTOFMEMORY
#define DPCAPS_GUARANTEEDOPTIMIZED
#define DPGETCAPS_GUARANTEED
#define IDirectPlaySP_SetSPData(p, a, b, c)
#define IDirectPlaySP_SetSPPlayerData(p, a, b, c, d)
#define IDirectPlaySP_GetSPPlayerData(p, a, b, c, d)
#define DPLAYI_PLAYER_PLAYERLOCAL
#define IDirectPlaySP_HandleMessage(p, a, b, c)
#define IDirectPlaySP_GetSPData(p, a, b, c)
void DPWS_COMPLETION_ROUTINE(DPWS_IN_CONNECTION *connection)
#define DPSP_MSG_TOKEN_REMOTE
#define DPWS_MAXLOCALPLAYERS
#define DPWS_MAXQUEUESIZE
struct tagDPSP_MSG_HEADER DPSP_MSG_HEADER
#define DPWS_GUARANTEED_MAXPLAYERS
#define DPWS_GUARANTEED_MAXBUFFERSIZE
#define DPSP_MSG_MAKE_MIXED(s, t)
#define DPWS_MAXBUFFERSIZE
static HRESULT WINAPI DPWSCB_CloseEx(LPDPSP_CLOSEDATA data)
static HRESULT WINAPI DPWSCB_CreateGroup(DPSP_CREATEGROUPDATA *data)
#define DPWS_START_TCP_PORT
static HRESULT WINAPI DPWSCB_SendToGroupEx(LPDPSP_SENDTOGROUPEXDATA data)
static int DPWS_CompareConnectionRefs(const void *key, const struct rb_entry *entry)
static HRESULT WINAPI DPWSCB_GetAddress(LPDPSP_GETADDRESSDATA data)
static HRESULT WINAPI DPWSCB_GetAddressChoices(LPDPSP_GETADDRESSCHOICESDATA data)
#define DPWS_START_UDP_PORT
HRESULT WINAPI SPInit(LPSPINITDATA lpspData)
static int DPWS_CompareConnections(const void *key, const struct rb_entry *entry)
static HRESULT WINAPI DPWSCB_Reply(LPDPSP_REPLYDATA data)
#define DPWS_END_UDP_PORT
static HRESULT WINAPI DPWSCB_ShutdownEx(LPDPSP_SHUTDOWNDATA data)
static HRESULT WINAPI DPWSCB_Send(LPDPSP_SENDDATA data)
static HRESULT DPWS_GetConnection(DPWS_DATA *dpwsData, SOCKADDR_IN *addr, BOOL guaranteed, DPWS_OUT_CONNECTION **connection)
static void DPWS_MessageBodyReceiveCompleted(DPWS_IN_CONNECTION *connection)
static HRESULT DPWS_BindToFreePort(SOCKET sock, SOCKADDR_IN *addr, int startPort, int endPort)
static HRESULT WINAPI DPWSCB_DeleteGroup(DPSP_DELETEGROUPDATA *data)
static HRESULT WINAPI DPWSCB_GetMessageQueue(LPDPSP_GETMESSAGEQUEUEDATA data)
static HRESULT WINAPI DPWSCB_GetCaps(LPDPSP_GETCAPSDATA data)
static HRESULT WINAPI DPWSCB_DeletePlayer(LPDPSP_DELETEPLAYERDATA data)
static HRESULT DPWS_TcpReceive(DPWS_IN_CONNECTION *connection, void *data, DWORD size, DPWS_COMPLETION_ROUTINE *completionRoutine)
static void DPWS_HeaderReceiveCompleted(DPWS_IN_CONNECTION *connection)
static HRESULT WINAPI DPWSCB_SendEx(LPDPSP_SENDEXDATA data)
static HRESULT WINAPI DPWSCB_RemovePlayerFromGroup(DPSP_REMOVEPLAYERFROMGROUPDATA *data)
static HRESULT WINAPI DPWSCB_AddPlayerToGroup(DPSP_ADDPLAYERTOGROUPDATA *data)
static void WINAPI DPWS_TcpReceiveCompleted(DWORD error, DWORD transferred, WSAOVERLAPPED *overlapped, DWORD flags)
static void WINAPI DPWS_UdpReceiveCompleted(DWORD error, DWORD transferred, WSAOVERLAPPED *overlapped, DWORD flags)
static HRESULT WINAPI DPWSCB_EnumSessions(LPDPSP_ENUMSESSIONSDATA data)
static HRESULT WINAPI DPWSCB_Cancel(LPDPSP_CANCELDATA data)
static void DPWS_RemoveInConnection(DPWS_IN_CONNECTION *connection)
static HRESULT DPWS_SendImpl(DPWS_DATA *dpwsData, DPWS_PLAYER *player, SGBUFFER *buffers, DWORD bufferCount, DWORD messageSize, BOOL guaranteed, BOOL system)
static HRESULT WINAPI DPWSCB_CreatePlayer(LPDPSP_CREATEPLAYERDATA data)
#define DPWS_END_TCP_PORT
static void DPWS_Stop(DPWS_DATA *dpwsData)
static HRESULT DPWS_Start(DPWS_DATA *dpwsData)
static DWORD WINAPI DPWS_ThreadProc(void *param)
static void setup_callbacks(LPDPSP_SPCALLBACKS lpCB)
static HRESULT WINAPI DPWSCB_Open(LPDPSP_OPENDATA data)
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
GLenum const GLvoid * addr
#define IsEqualGUID(rguid1, rguid2)
static __inline const char * wine_dbgstr_guid(const GUID *id)
#define LIST_FOR_EACH_ENTRY_SAFE(cursor, cursor2, list, type, field)
#define RB_ENTRY_VALUE(element, type, field)
#define RB_FOR_EACH_ENTRY_DESTRUCTOR(elem, elem2, tree, type, field)
static int rb_put(struct rb_tree *tree, const void *key, struct rb_entry *entry)
static struct rb_entry * rb_get(const struct rb_tree *tree, const void *key)
#define RB_FOR_EACH_ENTRY(elem, tree, type, field)
static void rb_remove(struct rb_tree *tree, struct rb_entry *entry)
static void rb_init(struct rb_tree *tree, rb_compare_func_t compare)
namespace GUID const ADDRINFOEXW ADDRINFOEXW struct timeval OVERLAPPED * overlapped
INT WSAAPI setsockopt(IN SOCKET s, IN INT level, IN INT optname, IN CONST CHAR FAR *optval, IN INT optlen)
INT WSAAPI listen(IN SOCKET s, IN INT backlog)
BOOL WSAAPI WSAGetOverlappedResult(IN SOCKET s, IN LPWSAOVERLAPPED lpOverlapped, OUT LPDWORD lpcbTransfer, IN BOOL fWait, OUT LPDWORD lpdwFlags)
INT WSAAPI bind(IN SOCKET s, IN CONST struct sockaddr *name, IN INT namelen)
SOCKET WSAAPI accept(IN SOCKET s, OUT LPSOCKADDR addr, OUT INT FAR *addrlen)
DPWS_OUT_CONNECTION * connection
struct rb_tree connectionRefs
LPDPSP_GETADDRESS GetAddress
LPDPSP_GETMESSAGEQUEUE GetMessageQueue
LPDPSP_DELETEGROUP DeleteGroup
LPDPSP_SHUTDOWNEX ShutdownEx
LPDPSP_ENUMSESSIONS EnumSessions
LPDPSP_REMOVEPLAYERFROMGROUP RemovePlayerFromGroup
LPDPSP_GETADDRESSCHOICES GetAddressChoices
LPDPSP_SENDTOGROUP SendToGroup
LPDPSP_CREATEGROUP CreateGroup
LPDPSP_CREATEPLAYER CreatePlayer
LPDPSP_ADDPLAYERTOGROUP AddPlayerToGroup
LPDPSP_DELETEPLAYER DeletePlayer
LPDPSP_SENDTOGROUPEX SendToGroupEx
struct rb_tree connections
struct list inConnections
DWORD WINAPI WaitForSingleObject(IN HANDLE hHandle, IN DWORD dwMilliseconds)
VOID WINAPI InitializeCriticalSection(OUT LPCRITICAL_SECTION lpCriticalSection)
INT WINAPI WSAStartup(IN WORD wVersionRequested, OUT LPWSADATA lpWSAData)
HANDLE WINAPI GetCurrentThread(void)
void WINAPI LeaveCriticalSection(LPCRITICAL_SECTION)
void WINAPI EnterCriticalSection(LPCRITICAL_SECTION)
void WINAPI DeleteCriticalSection(PCRITICAL_SECTION)
WINSOCK_API_LINKAGE WSAEVENT WSAAPI WSACreateEvent(void)
int PASCAL FAR WSAGetLastError(void)
int PASCAL FAR WSACleanup(void)