// 添加内存数据 bool CPackMgr::CMemFile::AddBuffer( DataBuffer &pack, const int index, const int count, const char *buf, int len ) { // 如果为一个数据就不需要处理组包了 if ( count == 1 ) { pack.writeBlock( buf, len ) ; return true ; } // 如果还没有开辟数据空间 if ( _vec.empty() ) { for ( int i = 0; i < count; ++ i ) { _vec.push_back( new DataBuffer ) ; } } // 如果不正确的INDEX就不处理了 if ( index > (int) _vec.size() ) { return false ; } // 取得存放数据块的内存 DataBuffer *p = _vec[index-1] ; assert( p != NULL ) ; if ( p->getLength() == 0 ) { ++ _cur ; } else { p->resetBuf() ; } p->writeBlock( buf, len ) ; // 如果接收数据包成功 if ( _cur >= (unsigned int) count ) { // 取得分包个数 int size = _vec.size() ; // 写最后一个数据包的头部 pack.writeBlock( p->getBuffer() , sizeof(GBheader) ) ; // 重新开始组包,这样数据就只有数据头和数据体 for ( int i = 0; i < size ; ++ i ) { p = _vec[i] ; if ( p->getLength() < (int)sizeof(GBheader) ){ continue ; } unsigned short mlen = p->fetchInt16( 3 ) & 0x03FF; if ( mlen > 0 ) { pack.writeBlock( p->getBuffer() + sizeof(GBheader) + 4 , mlen ) ; } } // 添加尾部数据 GBFooter footer ; pack.writeBlock( &footer, sizeof(footer) ) ; return true ; } // 更新最后一次访问的时间 _last = time(NULL) ; OUT_INFO( NULL, 0, "packmgr" , "save index file %d, current count %d total %d" , index, _cur, count ) ; return false ; }