Esempio n. 1
0
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;
	}
}
Esempio n. 2
0
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;
	}
}