1
Fork 0
mirror of https://github.com/SapphireServer/Sapphire.git synced 2025-04-27 14:57:44 +00:00
sapphire/src/common/Network/PacketContainer.cpp

89 lines
2.3 KiB
C++
Raw Normal View History

2017-08-08 13:53:47 +02:00
#include "PacketContainer.h"
2018-10-25 23:50:18 +02:00
#include "Util/Util.h"
2018-03-06 22:22:19 +01:00
#include "Common.h"
2018-06-27 23:48:18 -03:00
#include "Forwards.h"
2017-08-08 13:53:47 +02:00
#include <chrono>
2018-07-03 09:20:09 +02:00
#include <string.h>
#include <memory>
2017-08-08 13:53:47 +02:00
Sapphire::Network::Packets::PacketContainer::PacketContainer( uint32_t segmentTargetOverride ) :
m_segmentTargetOverride( segmentTargetOverride )
2017-08-08 13:53:47 +02:00
{
memset( &m_ipcHdr, 0, sizeof( FFXIVARR_PACKET_HEADER ) );
m_ipcHdr.size = sizeof( FFXIVARR_PACKET_HEADER );
m_ipcHdr.count = 0;
2017-08-08 13:53:47 +02:00
}
Sapphire::Network::Packets::PacketContainer::~PacketContainer()
2017-08-08 13:53:47 +02:00
{
m_entryList.clear();
2017-08-08 13:53:47 +02:00
}
void Sapphire::Network::Packets::PacketContainer::addPacket( Sapphire::Network::Packets::FFXIVPacketBasePtr entry )
2017-08-08 13:53:47 +02:00
{
m_entryList.push_back( entry );
2017-08-08 13:53:47 +02:00
m_ipcHdr.size += entry->getSize();
m_ipcHdr.count++;
2017-08-08 13:53:47 +02:00
}
void Sapphire::Network::Packets::PacketContainer::fillSendBuffer( std::vector< uint8_t >& sendBuffer )
2017-08-08 13:53:47 +02:00
{
std::vector< uint8_t > tempBuffer( m_ipcHdr.size );
memset( &tempBuffer[ 0 ], 0, m_ipcHdr.size );
2017-08-08 13:53:47 +02:00
using namespace std::chrono;
auto ms = duration_cast< milliseconds >( system_clock::now().time_since_epoch() );
uint64_t tick = ms.count();
m_ipcHdr.unknown_0 = 0xE2465DFF41a05252;
m_ipcHdr.unknown_8 = 0x75C4997B4D642A7F;
m_ipcHdr.timestamp = tick;
m_ipcHdr.unknown_20 = 1;
2017-08-08 13:53:47 +02:00
memcpy( &tempBuffer[ 0 ], &m_ipcHdr, sizeof( FFXIVARR_PACKET_HEADER ) );
2017-08-08 13:53:47 +02:00
auto it = m_entryList.begin();
std::size_t offset = 0;
2017-08-08 13:53:47 +02:00
if( m_entryList.size() > 1 )
offset = 0;
2017-08-08 13:53:47 +02:00
for( ; it != m_entryList.end(); ++it )
{
auto pPacket = ( *it );
if( m_segmentTargetOverride != 0 && pPacket->getSegmentType() == SEGMENTTYPE_IPC )
{
pPacket->setTargetActor( m_segmentTargetOverride );
}
auto data = pPacket->getData();
memcpy( &tempBuffer[ 0 ] + sizeof( FFXIVARR_PACKET_HEADER ) + offset, &data[ 0 ], pPacket->getSize() );
offset += pPacket->getSize();
}
2017-08-08 13:53:47 +02:00
sendBuffer.assign( &tempBuffer[ 0 ], &tempBuffer[ 0 ] + m_ipcHdr.size );
2017-08-08 13:53:47 +02:00
}
std::string Sapphire::Network::Packets::PacketContainer::toString()
2017-08-08 13:53:47 +02:00
{
std::vector< uint8_t > tmpBuffer;
2017-08-08 13:53:47 +02:00
fillSendBuffer( tmpBuffer );
2017-08-08 13:53:47 +02:00
std::string str = "\n";
for( uint32_t i = 0; i < m_ipcHdr.size; i++ )
{
2018-10-25 23:50:18 +02:00
str += Util::intToHexString( static_cast< int32_t >( tmpBuffer[ i ] & 0xFF ) ) + " ";
2017-08-08 13:53:47 +02:00
if( ( i + 1 ) % 16 == 0 )
str += "\n";
}
str += "\n";
2017-08-08 13:53:47 +02:00
return str;
2017-08-08 13:53:47 +02:00
}