Example #1
0
// 添加内存数据
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 ;
}