GPResult gpiSendOrBufferStringLenToPeer( GPConnection * connection, GPIPeer_st peer, const char * string, int stringLen ) { GPIConnection *iconnection; unsigned int sent; unsigned int total; unsigned int remaining; assert(peer->outputBuffer.buffer != NULL); sent = 0; iconnection = (GPIConnection *)*connection; remaining = (unsigned int)stringLen; total = 0; // Check for nothing to send. ///////////////////////////// if(stringLen == 0) return GP_NO_ERROR; // Only try to send if the buffer is empty and there are no messages. ///////////////////////////////////////////////////////////////////// if(!(peer->outputBuffer.len - peer->outputBuffer.pos) && !ArrayLength(peer->messages)) { if ((int)remaining <= (gsUdpEngineGetPeerOutBufferFreeSpace(peer->ip, peer->port) - GS_UDP_RELIABLE_MSG_HEADER - GS_UDP_MSG_HEADER_LEN)) { gsUdpEngineSendMessage(peer->ip, peer->port, iconnection->mHeader, (unsigned char *)string, remaining, gsi_true); total = remaining; remaining = 0; } else { unsigned int freeSpace = (unsigned int)gsUdpEngineGetPeerOutBufferFreeSpace(peer->ip, peer->port); if (freeSpace > (GS_UDP_MSG_HEADER_LEN + GS_UDP_RELIABLE_MSG_HEADER)) { sent = freeSpace - (GS_UDP_MSG_HEADER_LEN + GS_UDP_RELIABLE_MSG_HEADER); gsUdpEngineSendMessage(peer->ip, peer->port, iconnection->mHeader, (unsigned char *)string, sent, gsi_true); total = sent; remaining -= sent; } } } // Buffer what wasn't sent. /////////////////////////// if(remaining) CHECK_RESULT(gpiAppendStringToBufferLen(connection, &peer->outputBuffer, &string[total], (int)remaining)); return GP_NO_ERROR; }
GPResult gpiAppendStringToBuffer( GPConnection * connection, GPIBuffer * outputBuffer, const char * buffer ) { return gpiAppendStringToBufferLen(connection, outputBuffer, buffer, (int)strlen(buffer)); }
GPResult gpiPeerAddMessage( GPConnection * connection, GPIPeer * peer, int type, const char * message ) { GPIMessage gpiMessage; int len; GS_ASSERT(peer != NULL); GS_ASSERT(message != NULL); if (peer == NULL) return GP_NETWORK_ERROR; if (message == NULL) return GP_NETWORK_ERROR; // Get the length. ////////////////// len = (int)strlen(message); // Clear the message. ///////////////////// memset(&gpiMessage, 0, sizeof(GPIMessage)); // Copy the type. ///////////////// gpiMessage.type = type; // Copy the header to the buffer. ///////////////////////////////// CHECK_RESULT(gpiAppendStringToBuffer(connection, &gpiMessage.buffer, "\\m\\")); CHECK_RESULT(gpiAppendIntToBuffer(connection, &gpiMessage.buffer, type)); CHECK_RESULT(gpiAppendStringToBuffer(connection, &gpiMessage.buffer, "\\len\\")); CHECK_RESULT(gpiAppendIntToBuffer(connection, &gpiMessage.buffer, len)); CHECK_RESULT(gpiAppendStringToBuffer(connection, &gpiMessage.buffer, "\\msg\\\n")); // Copy the message to the buffer. ////////////////////////////////// gpiMessage.start = gpiMessage.buffer.len; CHECK_RESULT(gpiAppendStringToBufferLen(connection, &gpiMessage.buffer, message, len)); CHECK_RESULT(gpiAppendCharToBuffer(connection, &gpiMessage.buffer, '\0')); // Add it to the list. ////////////////////// ArrayAppend(peer->messages, &gpiMessage); // Reset the timeout. ///////////////////// peer->timeout = (time(NULL) + GPI_PEER_TIMEOUT); return GP_NO_ERROR; }