void EQStream::SendPacket(uint16 opcode, EQApplicationPacket *p) { uint32 chunksize, used; uint32 length; if (Log.log_settings[Logs::Server_Client_Packet].is_category_enabled == 1){ if (p->GetOpcode() != OP_SpecialMesg){ Log.Out(Logs::General, Logs::Server_Client_Packet, "[%s - 0x%04x] [Size: %u]", OpcodeManager::EmuToName(p->GetOpcode()), p->GetOpcode(), p->Size()); } } if (Log.log_settings[Logs::Server_Client_Packet_With_Dump].is_category_enabled == 1){ if (p->GetOpcode() != OP_SpecialMesg){ Log.Out(Logs::General, Logs::Server_Client_Packet_With_Dump, "[%s - 0x%04x] [Size: %u] %s", OpcodeManager::EmuToName(p->GetOpcode()), p->GetOpcode(), p->Size(), DumpPacketToString(p).c_str()); } } // Convert the EQApplicationPacket to 1 or more EQProtocolPackets if (p->size>(MaxLen-8)) { // proto-op(2), seq(2), app-op(2) ... data ... crc(2) Log.Out(Logs::Detail, Logs::Netcode, _L "Making oversized packet, len %d" __L, p->size); unsigned char *tmpbuff=new unsigned char[p->size+3]; length=p->serialize(opcode, tmpbuff); EQProtocolPacket *out=new EQProtocolPacket(OP_Fragment,nullptr,MaxLen-4); *(uint32 *)(out->pBuffer+2)=htonl(p->Size()); used=MaxLen-10; memcpy(out->pBuffer+6,tmpbuff,used); Log.Out(Logs::Detail, Logs::Netcode, _L "First fragment: used %d/%d. Put size %d in the packet" __L, used, p->size, p->Size()); SequencedPush(out); while (used<length) { out=new EQProtocolPacket(OP_Fragment,nullptr,MaxLen-4); chunksize=std::min(length-used,MaxLen-6); memcpy(out->pBuffer+2,tmpbuff+used,chunksize); out->size=chunksize+2; SequencedPush(out); used+=chunksize; Log.Out(Logs::Detail, Logs::Netcode, _L "Subsequent fragment: len %d, used %d/%d." __L, chunksize, used, p->size); } delete p; delete[] tmpbuff; } else { unsigned char *tmpbuff=new unsigned char[p->Size()+3]; length=p->serialize(opcode, tmpbuff+2) + 2; EQProtocolPacket *out=new EQProtocolPacket(OP_Packet,tmpbuff,length); delete[] tmpbuff; SequencedPush(out); delete p; } }
void EQStream::SendPacket(uint16 opcode, EQApplicationPacket *p) { uint32 chunksize,used; uint32 length; // Convert the EQApplicationPacket to 1 or more EQProtocolPackets if (p->size>(MaxLen-8)) { // proto-op(2), seq(2), app-op(2) ... data ... crc(2) _log(NET__FRAGMENT, _L "Making oversized packet, len %d" __L, p->size); unsigned char *tmpbuff=new unsigned char[p->size+3]; length=p->serialize(opcode, tmpbuff); EQProtocolPacket *out=new EQProtocolPacket(OP_Fragment,NULL,MaxLen-4); *(uint32 *)(out->pBuffer+2)=htonl(p->Size()); used=MaxLen-10; memcpy(out->pBuffer+6,tmpbuff,used); _log(NET__FRAGMENT, _L "First fragment: used %d/%d. Put size %d in the packet" __L, used, p->size, p->Size()); SequencedPush(out); while (used<length) { out=new EQProtocolPacket(OP_Fragment,NULL,MaxLen-4); chunksize=min(length-used,MaxLen-6); memcpy(out->pBuffer+2,tmpbuff+used,chunksize); out->size=chunksize+2; SequencedPush(out); used+=chunksize; _log(NET__FRAGMENT, _L "Subsequent fragment: len %d, used %d/%d." __L, chunksize, used, p->size); } delete p; delete[] tmpbuff; } else { unsigned char *tmpbuff=new unsigned char[p->Size()+3]; length=p->serialize(opcode, tmpbuff+2) + 2; EQProtocolPacket *out=new EQProtocolPacket(OP_Packet,tmpbuff,length); delete[] tmpbuff; SequencedPush(out); delete p; } }