void CPackager::AddData( BYTE cID, const char * const pData, size_t dataLength, unsigned long lnUserData /* = 0 */ ) { CCriticalSection::Owner lock( m_csSend ); BUFFER_MAP::iterator it; if ( m_theSend.end() != ( it = m_theSend.find( cID ) ) ) { CBuffer *pBuffer = m_theSend[cID]; ASSERT( pBuffer ); pBuffer->SetUserData( lnUserData ); pBuffer->AddData( pData, dataLength ); } else { CBuffer *pBuffer = m_theAllocator.Allocate(); ASSERT( pBuffer ); pBuffer->SetUserData( lnUserData ); pBuffer->AddData( pData, dataLength ); m_theSend[cID] = pBuffer; } }
CBuffer *CPackager::PackUp( const void *pData, size_t dataLength ) { CCriticalSection::Owner lock( m_csRecv ); if ( NULL == pData || dataLength < 3 /* cID + cPackFlag + ... */ ) { return NULL; } BYTE cID = CPackager::Peek( pData ); BUFFER_MAP::iterator it; if ( m_theRecv.end() == ( it = m_theRecv.find( cID ) ) ) { CBuffer *pPack = m_theAllocator.Allocate(); m_theRecv[cID] = pPack; } CBuffer *pBuffer = m_theRecv[cID]; ASSERT( pBuffer ); BYTE cFlag = CPackager::Peek( pData, 1 ); const size_t nDataBegin = 1 + 1 + sizeof( unsigned long ); if ( _Header( cFlag ) ) { pBuffer->Empty(); pBuffer->AddData( ( ( const char * )pData + nDataBegin ), dataLength - nDataBegin ); } if ( _Middle( cFlag ) ) { pBuffer->AddData( ( ( const char * )pData + nDataBegin ), dataLength - nDataBegin ); } if ( _Tail( cFlag ) ) { unsigned long lnUserData = *( const unsigned long * )( ( const char * )pData + 2 ); pBuffer->SetUserData( lnUserData ); pBuffer->AddRef(); return pBuffer; } if ( _Error( cFlag ) ) { ASSERT( NULL && "CPackager::PackUp - Invalid package!" ); } return NULL; }