Example #1
0
void AppendStringToBuffer(BufferRef buffer, char * append) {
	BufferRef appendBuffer = CreateBufferRef();
	IncrementBufferRefBySize(appendBuffer, strlen(append)-0x1);
	memcpy(appendBuffer->data, append, strlen(append));
	AppendBufferToBuffer(buffer, appendBuffer);
}
Example #2
0
BufferRef CreateBufferFromBufferWithRange(BufferRef buffer, Range subRange) {
	BufferRef sub = CreateBufferRef();
	IncrementBufferRefBySize(sub, subRange.length-0x1);
	memcpy(sub->data, &(buffer->data[subRange.offset]), subRange.length);
	return sub;
}
Example #3
0
	owBuffer * owZip::RefCompress(owFile * _pFile, int32_t _nLevel)
	{
		_pFile->Seek( SEEK_SET, 0);
		if(_pFile->Eof())
		{
			return NULL;
		}
		// 保证有充足的压缩空间
		if(_pFile->Size() > m_pTempBuffer->Size())
		{
			m_pTempBuffer->Resize( _pFile->Size());
		}
		m_pTempBuffer->Seek( SEEK_SET, 0);
		
		int retCode;
		int flush;
		
		z_stream stream;
		
		stream.zalloc = Z_NULL;
		stream.zfree = Z_NULL;
		stream.opaque = Z_NULL;
		retCode = deflateInit( &stream, _nLevel);
		
		while( true )
		{
			stream.avail_in = _pFile->Read( m_pInputChunkBuffer->GetBuffer(), m_pInputChunkBuffer->Size() );
			stream.next_in = (Bytef*)m_pInputChunkBuffer->GetBuffer();
			flush = _pFile->Eof()?Z_FINISH : Z_NO_FLUSH;
			while( stream.avail_in != 0 )
			{
				stream.avail_out = (uint32_t)m_pOutputChunkBuffer->Size();
				stream.next_out = (Bytef*)m_pOutputChunkBuffer->GetBuffer();
				retCode = deflate( &stream, flush);
				assert(retCode != Z_STREAM_ERROR);
				
				int32_t chunkSize = m_pOutputChunkBuffer->Size() - stream.avail_out;
				// m_pTempBuffer 大小会自动增长
				m_pTempBuffer->Write( m_pOutputChunkBuffer->GetBuffer(), chunkSize);
			}
			
			assert(stream.avail_in == 0);
			if(flush == Z_FINISH)
			{
				break;
			}
		}
		
		int32_t dataSize = m_pTempBuffer->GetCurr() - m_pTempBuffer->GetBuffer();
		
		
		if(dataSize == 0)
		{
			return NULL;
		}
		else
		{
			owBuffer * pRet = CreateBufferRef( m_pTempBuffer->GetBuffer(), dataSize);
			return pRet;
		}
		return NULL;
	}