Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: use existing api's #385

Merged
merged 2 commits into from
Aug 4, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
39 changes: 28 additions & 11 deletions source/qcommon/net.c
Original file line number Diff line number Diff line change
Expand Up @@ -338,16 +338,21 @@ static bool NET_SocketMakeNonBlocking( socket_handle_t handle )
return true;
}

static int NET_SDR_GetPacket( const socket_t *socket, netadr_t *address, msg_t *message ) {
assert(socket&&socket->open&&socket->type==SOCKET_SDR);
struct recv_messages_req_s req;
req.cmd = RPC_P2P_RECV_MESSAGES;
req.handle = socket->handle;
struct recv_messages_recv_s *recv = (struct recv_messages_recv_s*)STEAMSHIM_sendRPCSync(&req, sizeof req);
if (recv->count == 0)
return 0;

message->readcount = 0;
struct SDR_GetPacket_Self {
msg_t* message;
netadr_t* addr;
int result;
};
static void NET_SDR_ConsumePacket(void* self, struct steam_rpc_pkt_s* rpc) {
struct SDR_GetPacket_Self* netRecieve = self;
msg_t* message = netRecieve->message;
netadr_t* address = netRecieve->addr;
struct recv_messages_recv_s *recv = &rpc->recv_messages_recv;
if(recv->count == 0) {
message->cursize = 0;
netRecieve->result = 0;
return;
}

int size = recv->messageinfo[0].count;
if (size > message->maxsize)
Expand All @@ -356,8 +361,20 @@ static int NET_SDR_GetPacket( const socket_t *socket, netadr_t *address, msg_t *

memcpy(message->data, recv->buffer, size);
NET_SteamidToAddress(recv->steamID, address);
netRecieve->result = 1;
}

return 1;
static int NET_SDR_GetPacket( const socket_t *socket, netadr_t *address, msg_t *message ) {
assert(socket&&socket->open&&socket->type==SOCKET_SDR);
struct recv_messages_req_s req;
req.cmd = RPC_P2P_RECV_MESSAGES;
req.handle = socket->handle;

uint32_t syncIndex;
struct SDR_GetPacket_Self self = {message, address, -1};
STEAMSHIM_sendRPC(&req, sizeof req, &self, NET_SDR_ConsumePacket, &syncIndex);
STEAMSHIM_waitDispatchSync(syncIndex);
return self.result;
}

/*
Expand Down
48 changes: 26 additions & 22 deletions source/server/sv_main.c
Original file line number Diff line number Diff line change
Expand Up @@ -199,6 +199,28 @@ static void SV_P2P_NewConnection( void *self, struct steam_evt_pkt_s *evt) {
}
}

static void SV_P2P_ConsumePacket(void* self, struct steam_rpc_pkt_s* rpc) {
socket_t* socket = self;
size_t offset = 0;
struct recv_messages_recv_s* recv = &rpc->recv_messages_recv;
for (int j = 0; j < recv->count; j++) {
Com_Printf("Received message %d\n", recv->messageinfo[j].count);

msg_t msg;
MSG_Init(&msg, recv->buffer+offset, recv->messageinfo[j].count);
msg.cursize = recv->messageinfo[j].count;
MSG_BeginReading(&msg);

if( *(int *)msg.data == -1 )
{
SV_ConnectionlessPacket( socket, &socket->address, &msg );
continue;
}

offset += recv->messageinfo[j].count;
}
}

/*
* SV_ReadPackets
*/
Expand Down Expand Up @@ -401,36 +423,18 @@ static void SV_ReadPackets( void )
struct recv_messages_req_s req;
req.cmd = RPC_P2P_RECV_MESSAGES;
req.handle = p2p_handles[i].handle;
struct recv_messages_recv_s *recv = (struct recv_messages_recv_s*)STEAMSHIM_sendRPCSync(&req, sizeof req);


uint32_t syncIndex;

NET_SteamidToAddress(p2p_handles[i].steamid, &address);
size_t offset = 0;


socket->address = address;
socket->type = SOCKET_SDR;
socket->handle = p2p_handles[i].handle;
socket->server = true;
socket->open = true;
socket->connected = true;

for (int j = 0; j < recv->count; j++) {
Com_Printf("Received message %d\n", recv->messageinfo[j].count);

msg_t msg;
MSG_Init(&msg, recv->buffer+offset, recv->messageinfo[j].count);
msg.cursize = recv->messageinfo[j].count;
MSG_BeginReading(&msg);

if( *(int *)msg.data == -1 )
{
SV_ConnectionlessPacket( socket, &address, &msg );
continue;
}

offset += recv->messageinfo[j].count;
}
STEAMSHIM_sendRPC(&req, sizeof req, socket, SV_P2P_ConsumePacket, &syncIndex);
STEAMSHIM_waitDispatchSync(syncIndex);
}

}
Expand Down
4 changes: 0 additions & 4 deletions source/steamshim/src/mod_steam.h
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@

DECLARE_TYPEDEF_METHOD( int, STEAMSHIM_dispatch );
DECLARE_TYPEDEF_METHOD( int, STEAMSHIM_sendRPC, void *req, uint32_t size, void *self, STEAMSHIM_rpc_handle rpc, uint32_t *syncIndex );
DECLARE_TYPEDEF_METHOD( struct steam_rpc_pkt_s *, STEAMSHIM_sendRPCSync, void *req, uint32_t size );
DECLARE_TYPEDEF_METHOD( int, STEAMSHIM_waitDispatchSync, uint32_t syncIndex ); // wait on the dispatch loop does not trigger steam callbacks
DECLARE_TYPEDEF_METHOD( void, STEAMSHIM_subscribeEvent, uint32_t id, void *self, STEAMSHIM_evt_handle evt );
DECLARE_TYPEDEF_METHOD( void, STEAMSHIM_unsubscribeEvent, uint32_t id, STEAMSHIM_evt_handle evt );
Expand All @@ -28,7 +27,6 @@ DECLARE_TYPEDEF_METHOD( bool, STEAMSHIM_active );
struct steam_import_s {
STEAMSHIM_dispatchFn STEAMSHIM_dispatch;
STEAMSHIM_sendRPCFn STEAMSHIM_sendRPC;
STEAMSHIM_sendRPCSyncFn STEAMSHIM_sendRPCSync;
STEAMSHIM_waitDispatchSyncFn STEAMSHIM_waitDispatchSync;
STEAMSHIM_subscribeEventFn STEAMSHIM_subscribeEvent;
STEAMSHIM_unsubscribeEventFn STEAMSHIM_unsubscribeEvent;
Expand All @@ -37,7 +35,6 @@ struct steam_import_s {
#define DECLARE_STEAM_STRUCT() { \
STEAMSHIM_dispatch, \
STEAMSHIM_sendRPC, \
STEAMSHIM_sendRPCSync, \
STEAMSHIM_waitDispatchSync, \
STEAMSHIM_subscribeEvent, \
STEAMSHIM_unsubscribeEvent, \
Expand All @@ -52,7 +49,6 @@ static inline void Q_ImportSteamModule( const struct steam_import_s *imp )
}
int STEAMSHIM_dispatch() { return steam_import.STEAMSHIM_dispatch();}
int STEAMSHIM_sendRPC( void *req, uint32_t size, void *self, STEAMSHIM_rpc_handle rpc, uint32_t *syncIndex ) { return steam_import.STEAMSHIM_sendRPC(req, size, self, rpc, syncIndex);}
struct steam_rpc_pkt_s *STEAMSHIM_sendRPCSync( void *req, uint32_t size ) { return steam_import.STEAMSHIM_sendRPCSync(req, size); }
int STEAMSHIM_waitDispatchSync( uint32_t syncIndex ){ return steam_import.STEAMSHIM_waitDispatchSync(syncIndex);} // wait on the dispatch loop
void STEAMSHIM_subscribeEvent( uint32_t id, void *self, STEAMSHIM_evt_handle evt ){ return steam_import.STEAMSHIM_subscribeEvent(id, self, evt);} // wait on the dispatch loop
void STEAMSHIM_unsubscribeEvent( uint32_t id, STEAMSHIM_evt_handle evt){ return steam_import.STEAMSHIM_unsubscribeEvent(id, evt);} // wait on the dispatch loop
Expand Down
37 changes: 0 additions & 37 deletions source/steamshim/src/parent/parent.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -162,43 +162,6 @@ bool STEAMSHIM_active() {
return ( ( GPipeRead != NULLPIPE ) && ( GPipeWrite != NULLPIPE ) );
}

union {
struct steam_rpc_pkt_s packet;
char maxsize[sizeof(struct steam_rpc_pkt_s) + SDR_MAX_MESSAGE_SIZE];
} sync_stored_packet;

static void CB_RPCSyncHandler( void *self, struct steam_rpc_pkt_s *packet )
{
size_t size = sizeof( steam_rpc_pkt_s );

// this is a flexible-sized message
if (packet->common.cmd == RPC_P2P_RECV_MESSAGES && packet->recv_messages_recv.count > 0) {
for (size_t i = 0; i < packet->recv_messages_recv.count; i++) {
size += packet->recv_messages_recv.messageinfo[i].count;
}
}

memcpy( &sync_stored_packet, packet, size );
}

// do NOT call this inside the handler of an async RPC
struct steam_rpc_pkt_s *STEAMSHIM_sendRPCSync(void *packet, uint32_t size)
{
uint32_t syncIndex;
if( STEAMSHIM_sendRPC( packet, size, NULL, CB_RPCSyncHandler, &syncIndex ) < 0 ) {
return NULL;
}


while( 1 ) {
STEAMSHIM_dispatch();

if( sync_stored_packet.packet.common.sync == syncIndex ) {
return &sync_stored_packet.packet;
}
}
}

int STEAMSHIM_sendRPC( void *packet, uint32_t size, void *self, STEAMSHIM_rpc_handle rpc, uint32_t *sync )
{
uint32_t syncIndex = ++SyncToken;
Expand Down
Loading