void WorldSocket::OutPacket(uint16 opcode, size_t len, const void* data) { OUTPACKET_RESULT res; if( (len + 10) > WORLDSOCKET_SENDBUF_SIZE ) { printf("WARNING: Tried to send a packet of %u bytes (which is too large) to a socket. Opcode was: %u (0x%03X)\n", (unsigned int)len, (unsigned int)opcode, (unsigned int)opcode); return; } res = _OutPacket(opcode, len, data); if(res == OUTPACKET_RESULT_SUCCESS) return; if(res == OUTPACKET_RESULT_NO_ROOM_IN_BUFFER) { /* queue the packet */ queueLock.Acquire(); //WorldPacket * pck = new WorldPacket(opcode, len); WorldPacket * pck = g_bufferPool.Allocate(len); pck->SetOpcode(opcode); if(len) pck->append((const uint8*)data, len); _queue.Push(pck); queueLock.Release(); } }
void WorldSocket::UpdateQueuedPackets() { queueLock.Acquire(); if(!_queue.HasItems()) { queueLock.Release(); return; } WorldPacket* pck; while((pck = _queue.front()) != NULL) { /* try to push out as many as you can */ switch(_OutPacket(pck->GetOpcode(), pck->size(), pck->size() ? pck->contents() : NULL)) { case OUTPACKET_RESULT_SUCCESS: { delete pck; _queue.pop_front(); } break; case OUTPACKET_RESULT_NO_ROOM_IN_BUFFER: { /* still connected */ queueLock.Release(); return; } break; default: { /* kill everything in the buffer */ while((pck == _queue.Pop()) != 0) { delete pck; } queueLock.Release(); return; } break; } } queueLock.Release(); }