mirror of
https://github.com/solemnwarning/ipxwrapper
synced 2024-12-30 16:45:37 +01:00
Cleaned up IPX_Send/IPX_SendEx.
This commit is contained in:
parent
fcdc62e784
commit
7a6c8e95da
108
src/directplay.c
108
src/directplay.c
@ -15,8 +15,6 @@
|
|||||||
* Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
* Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* TODO: ASYNC I/O!! */
|
|
||||||
|
|
||||||
#define INITGUID
|
#define INITGUID
|
||||||
|
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
@ -179,33 +177,54 @@ static HRESULT WINAPI IPX_EnumSessions(LPDPSP_ENUMSESSIONSDATA data) {
|
|||||||
return DP_OK;
|
return DP_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static BOOL send_get_addr(struct sockaddr_ipx *addr, IDirectPlaySP *sp, DPID player_id) {
|
||||||
|
if(player_id) {
|
||||||
|
struct sockaddr_ipx *addr_p;
|
||||||
|
DWORD size;
|
||||||
|
|
||||||
|
HRESULT r = IDirectPlaySP_GetSPPlayerData(sp, player_id, (void**)&addr_p, &size, DPGET_LOCAL);
|
||||||
|
if(r != DP_OK) {
|
||||||
|
log_printf("GetSPPlayerData: %d", (int)r);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!addr_p) {
|
||||||
|
goto NO_ADDR;
|
||||||
|
}
|
||||||
|
|
||||||
|
memcpy(addr, addr_p, sizeof(*addr));
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct sp_data *sp_data = get_sp_data(sp);
|
||||||
|
|
||||||
|
if(sp_data->ns_addr.sa_family) {
|
||||||
|
memcpy(addr, &(sp_data->ns_addr), sizeof(*addr));
|
||||||
|
|
||||||
|
release_sp_data(sp_data);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
release_sp_data(sp_data);
|
||||||
|
|
||||||
|
NO_ADDR:
|
||||||
|
|
||||||
|
log_printf("No known address for player ID %u, dropping packet", (unsigned int)player_id);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
static HRESULT WINAPI IPX_Send(LPDPSP_SENDDATA data) {
|
static HRESULT WINAPI IPX_Send(LPDPSP_SENDDATA data) {
|
||||||
CALL("SP_Send");
|
CALL("SP_Send");
|
||||||
|
|
||||||
struct sockaddr_ipx *addr = NULL;
|
struct sockaddr_ipx addr;
|
||||||
|
|
||||||
struct sp_data *sp_data = get_sp_data(data->lpISP);
|
if(!send_get_addr(&addr, data->lpISP, data->idPlayerTo)) {
|
||||||
|
|
||||||
if(data->idPlayerTo) {
|
|
||||||
DWORD size;
|
|
||||||
|
|
||||||
HRESULT r = IDirectPlaySP_GetSPPlayerData(data->lpISP, data->idPlayerTo, (void**)&addr, &size, DPGET_LOCAL);
|
|
||||||
if(r != DP_OK) {
|
|
||||||
log_printf("GetSPPlayerData: %d", (int)r);
|
|
||||||
addr = NULL;
|
|
||||||
}
|
|
||||||
}else if(sp_data->ns_addr.sa_family) {
|
|
||||||
addr = &(sp_data->ns_addr);
|
|
||||||
}
|
|
||||||
|
|
||||||
if(!addr) {
|
|
||||||
log_printf("No known address for player ID %u, dropping packet", data->idPlayerTo);
|
|
||||||
|
|
||||||
release_sp_data(sp_data);
|
|
||||||
return DP_OK;
|
return DP_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(sendto(sp_data->sock, data->lpMessage + API_HEADER_SIZE, data->dwMessageSize - API_HEADER_SIZE, 0, (struct sockaddr*)addr, sizeof(*addr)) == -1) {
|
struct sp_data *sp_data = get_sp_data(data->lpISP);
|
||||||
|
|
||||||
|
if(sendto(sp_data->sock, data->lpMessage + API_HEADER_SIZE, data->dwMessageSize - API_HEADER_SIZE, 0, (struct sockaddr*)&addr, sizeof(addr)) == -1) {
|
||||||
log_printf("sendto failed: %s", w32_error(WSAGetLastError()));
|
log_printf("sendto failed: %s", w32_error(WSAGetLastError()));
|
||||||
|
|
||||||
release_sp_data(sp_data);
|
release_sp_data(sp_data);
|
||||||
@ -219,7 +238,24 @@ static HRESULT WINAPI IPX_Send(LPDPSP_SENDDATA data) {
|
|||||||
static HRESULT WINAPI IPX_SendEx(LPDPSP_SENDEXDATA data) {
|
static HRESULT WINAPI IPX_SendEx(LPDPSP_SENDEXDATA data) {
|
||||||
CALL("SP_SendEx");
|
CALL("SP_SendEx");
|
||||||
|
|
||||||
DPSP_SENDDATA s_data;
|
if(data->dwPriority || data->dwTimeout) {
|
||||||
|
log_printf(
|
||||||
|
"SendEx called with dwPriority = %u, dwTimeout = %u",
|
||||||
|
(unsigned int)(data->dwPriority),
|
||||||
|
(unsigned int)(data->dwTimeout)
|
||||||
|
);
|
||||||
|
|
||||||
|
return DPERR_UNSUPPORTED;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(data->dwFlags & DPSEND_ASYNC) {
|
||||||
|
log_printf("SendEx called with DPSEND_ASYNC flag, not implemented");
|
||||||
|
return DPERR_UNSUPPORTED;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* NOTE: The buffer arrangement is entirely guessed and currently untested.
|
||||||
|
* TODO: TEST!
|
||||||
|
*/
|
||||||
|
|
||||||
char *buf = malloc(data->dwMessageSize);
|
char *buf = malloc(data->dwMessageSize);
|
||||||
size_t off = 0, i;
|
size_t off = 0, i;
|
||||||
@ -234,19 +270,27 @@ static HRESULT WINAPI IPX_SendEx(LPDPSP_SENDEXDATA data) {
|
|||||||
off += data->lpSendBuffers[i].len;
|
off += data->lpSendBuffers[i].len;
|
||||||
}
|
}
|
||||||
|
|
||||||
s_data.dwFlags = data->dwFlags;
|
struct sockaddr_ipx addr;
|
||||||
s_data.idPlayerTo = data->idPlayerTo;
|
|
||||||
s_data.idPlayerFrom = data->idPlayerFrom;
|
|
||||||
s_data.lpMessage = buf;
|
|
||||||
s_data.dwMessageSize = data->dwMessageSize;
|
|
||||||
s_data.bSystemMessage = data->bSystemMessage;
|
|
||||||
s_data.lpISP = data->lpISP;
|
|
||||||
|
|
||||||
HRESULT ret = IPX_Send(&s_data);
|
if(!send_get_addr(&addr, data->lpISP, data->idPlayerTo)) {
|
||||||
|
return DP_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* TODO: Support DPSEND_ASYNC */
|
||||||
|
|
||||||
|
struct sp_data *sp_data = get_sp_data(data->lpISP);
|
||||||
|
|
||||||
|
if(sendto(sp_data->sock, buf, off, 0, (struct sockaddr*)&addr, sizeof(addr)) == -1) {
|
||||||
|
log_printf("sendto failed: %s", w32_error(WSAGetLastError()));
|
||||||
|
|
||||||
|
release_sp_data(sp_data);
|
||||||
|
return DPERR_GENERIC;
|
||||||
|
}
|
||||||
|
|
||||||
free(buf);
|
free(buf);
|
||||||
|
|
||||||
return ret;
|
release_sp_data(sp_data);
|
||||||
|
return DP_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
static HRESULT WINAPI IPX_Reply(LPDPSP_REPLYDATA data) {
|
static HRESULT WINAPI IPX_Reply(LPDPSP_REPLYDATA data) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user