GPResult gpiSendBuddyMessage( GPConnection * connection, int profileid, int type, const char * message, int sendOption, GPIPeerOp *peerOp ) { GPIPeer * peer; GPIProfile * profile; //GPIConnection *iconnection = (GPIConnection *)*connection; peer = gpiGetPeerByProfile(connection, profileid); if(!peer) { // Check if we should send this through the server. //////////////////////////////////////////////////// if(!gpiGetProfile(connection, profileid, &profile) || (!profile->buddyStatusInfo || !profile->buddyStatusInfo->buddyPort)) { if (sendOption == GP_DONT_ROUTE) return GP_NETWORK_ERROR; return gpiSendServerBuddyMessage(connection, profileid, type, message); } // Create a new peer connection for this message. ///////////////////////////////////////////////// peer = gpiAddPeer(connection, profileid, GPITrue); if(!peer) return GP_MEMORY_ERROR; // Check if we need a sig. ////////////////////////// if(!profile->peerSig) { // Get the sig. /////////////// CHECK_RESULT(gpiPeerGetSig(connection, peer)); } else { // Try to connect to the peer. ////////////////////////////// CHECK_RESULT(gpiPeerStartConnect(connection, peer)); } } else if (peer->state == GPI_PEER_DISCONNECTED) { if (gpiGetProfile(connection, profileid, &profile)) { // clear the buddy port to prevent future messages from // being sent via UDP layer if (profile->buddyStatusInfo) profile->buddyStatusInfo->buddyPort = 0; // send the message through the server if (sendOption == GP_DONT_ROUTE) return GP_NETWORK_ERROR; if (type < 100) return gpiSendServerBuddyMessage(connection, profileid, type, message); } } if (peerOp) { gpiPeerAddOp(peer, peerOp); } // Copy the message. //////////////////// CHECK_RESULT(gpiPeerAddMessage(connection, peer, type, message)); return GP_NO_ERROR; }
void gpiRemovePeer( GPConnection * connection, GPIPeer * peer ) { GPIPeer * pprev; GPIConnection * iconnection = (GPIConnection*)*connection; GPIMessage * message; GS_ASSERT(peer != NULL); if (peer == NULL) return; GS_ASSERT(iconnection->peerList); if (iconnection->peerList == NULL) return; // Check if this is the first peer. /////////////////////////////////// if(iconnection->peerList == peer) { iconnection->peerList = peer->pnext; } else { // Find the previous peer. ////////////////////////// for(pprev = iconnection->peerList ; pprev->pnext != peer ; pprev = pprev->pnext) { if(pprev->pnext == NULL) { // Can't find this peer in the list! //////////////////////////////////// assert(0); gsDebugFormat(GSIDebugCat_GP, GSIDebugType_Misc, GSIDebugLevel_HotError, "Tried to remove peer not in list."); return; } } pprev->pnext = peer->pnext; } // Check for pending messages. ////////////////////////////// while(ArrayLength(peer->messages)) { // Get the next message. //////////////////////// message = (GPIMessage *)ArrayNth(peer->messages, 0); // Don't forward protocol messages. /////////////////////////////////// if(message->type < 100) gpiSendServerBuddyMessage(connection, peer->profile, message->type, message->buffer.buffer + message->start); // Remove the message. ////////////////////// ArrayDeleteAt(peer->messages, 0); } gpiDestroyPeer(connection, peer); }