00001
00002
00003
00004
00005 #include "command.h"
00006
00007 #include "node.h"
00008 #include "packets.h"
00009
00010 using namespace std;
00011
00012 namespace eq
00013 {
00014 namespace net
00015 {
00016
00017 Command::Command()
00018 : _packet( 0 )
00019 , _packetAllocSize( 0 )
00020 , _dispatched( false )
00021 {
00022 }
00023
00024 Command::Command( const Command& from )
00025 : _node( from._node )
00026 , _localNode( from._localNode )
00027 , _packet( 0 )
00028 , _packetAllocSize( 0 )
00029 , _dispatched( from._dispatched )
00030 {
00031 if( !from.isValid( ))
00032 return;
00033
00034 _packetAllocSize = EQ_MAX( Packet::minSize, from._packet->size );
00035 _packet = static_cast<Packet*>( malloc( _packetAllocSize ));
00036 memcpy( _packet, from._packet, from._packet->size );
00037 }
00038
00039 Command::~Command()
00040 {
00041 release();
00042 }
00043
00044 void Command::swap( Command& rhs )
00045 {
00046 if( this == &rhs )
00047 return;
00048
00049 Packet* packet = _packet;
00050 NodePtr node = _node;
00051 NodePtr localNode = _localNode;
00052 const uint64_t packetAllocSize = _packetAllocSize;
00053
00054 _packet = rhs._packet;
00055 _node = rhs._node;
00056 _localNode = rhs._localNode;
00057 _packetAllocSize = rhs._packetAllocSize;
00058 _dispatched = false;
00059
00060 rhs._packet = packet;
00061 rhs._node = node;
00062 rhs._localNode = localNode;
00063 rhs._packetAllocSize = packetAllocSize;
00064 rhs._dispatched = false;
00065 }
00066
00067 void Command::allocate( NodePtr node, NodePtr localNode, const uint64_t size )
00068 {
00069 if( !_packet )
00070 {
00071 _packetAllocSize = EQ_MAX( Packet::minSize, size );
00072 _packet = static_cast<Packet*>( malloc( _packetAllocSize ));
00073 }
00074 else if( size > _packetAllocSize )
00075 {
00076 _packetAllocSize = EQ_MAX( Packet::minSize, size );
00077 _packet = static_cast<Packet*>( realloc( _packet, _packetAllocSize ));
00078 }
00079
00080 _node = node;
00081 _localNode = localNode;
00082 _packet->size = size;
00083 _dispatched = false;
00084 }
00085
00086 void Command::release()
00087 {
00088 if( _packet )
00089 free( _packet );
00090
00091 _packet = 0;
00092 _node = 0;
00093 _localNode = 0;
00094 _packetAllocSize = 0;
00095 _dispatched = false;
00096 }
00097
00098 EQ_EXPORT std::ostream& operator << ( std::ostream& os, const Command& command )
00099 {
00100 if( command.isValid( ))
00101 {
00102 os << base::disableFlush << "command< ";
00103 const Packet* packet = command.getPacket() ;
00104 switch( packet->datatype )
00105 {
00106 case DATATYPE_EQNET_SESSION:
00107 os << static_cast< const SessionPacket* >( packet );
00108 break;
00109
00110 case DATATYPE_EQNET_OBJECT:
00111 os << static_cast< const ObjectPacket* >( packet );
00112 break;
00113
00114 default:
00115 os << packet;
00116 }
00117
00118 os << ", " << command.getNode() << " >" << base::enableFlush;
00119 }
00120 else
00121 os << "command< empty >";
00122
00123 return os;
00124 }
00125 }
00126 }