/* Queue up a structure indicating that we want a reply of type wReplyCommandId. DPlay does * not seem to offer any way of uniquely differentiating between replies of the same type * relative to the request sent. There is an implicit assumption that there will be no * ordering issues on sends and receives from the opposite machine. No wonder MS is not * a networking company. */ static void *DP_MSG_ExpectReply( IDirectPlayImpl *This, DPSP_SENDDATA *lpData, DWORD dwWaitTime, WORD wReplyCommandId, void **lplpReplyMsg, DWORD *lpdwMsgBodySize ) { HRESULT hr; HANDLE hMsgReceipt; DP_MSG_REPLY_STRUCT_LIST replyStructList; DWORD dwWaitReturn; /* Setup for receipt */ hMsgReceipt = DP_MSG_BuildAndLinkReplyStruct( This, &replyStructList, wReplyCommandId ); TRACE( "Sending msg and expecting cmd %u in reply within %u ticks\n", wReplyCommandId, dwWaitTime ); hr = (*This->dp2->spData.lpCB->Send)( lpData ); if( FAILED(hr) ) { ERR( "Send failed: %s\n", DPLAYX_HresultToString( hr ) ); return NULL; } /* The reply message will trigger the hMsgReceipt event effectively switching * control back to this thread. See DP_MSG_ReplyReceived. */ dwWaitReturn = WaitForSingleObject( hMsgReceipt, dwWaitTime ); if( dwWaitReturn != WAIT_OBJECT_0 ) { ERR( "Wait failed 0x%08x\n", dwWaitReturn ); return NULL; } /* Clean Up */ return DP_MSG_CleanReplyStruct( &replyStructList, lplpReplyMsg, lpdwMsgBodySize ); }
void DP_MSG_ErrorReceived( IDirectPlay2AImpl* This, WORD wCommandId, LPCVOID lpMsgBody, DWORD dwMsgBodySize ) { LPCDPMSG_FORWARDADDPLAYERNACK lpcErrorMsg; lpcErrorMsg = (LPCDPMSG_FORWARDADDPLAYERNACK)lpMsgBody; ERR( "Received error message %u. Error is %s\n", wCommandId, DPLAYX_HresultToString( lpcErrorMsg->errorCode) ); DebugBreak(); }