XBOX::VError DecompressStream (XBOX::VStream& ioStream) { XBOX::VError error = VE_COMP_LIBRARY_NOT_FOUND; if (XBOX::VComponentManager::IsComponentAvailable ((XBOX::CType)CZipComponent::Component_Type)) { CZipComponent *zipComponent = (CZipComponent *)VComponentManager::RetainComponent ((CType)CZipComponent::Component_Type); if (zipComponent) { XBOX::VPtrStream decompressedStream; if ((XBOX::VE_OK == (error = ioStream.OpenReading())) && !decompressedStream.OpenWriting()) { error = zipComponent->ExpandStream (&ioStream, &decompressedStream); ioStream.CloseReading(); decompressedStream.CloseWriting(); if ((XBOX::VE_OK == error) && (!decompressedStream.IsEmpty())) { if (XBOX::VE_OK == (error = ioStream.OpenWriting())) { ioStream.SetSize (0); ioStream.PutData (decompressedStream.GetDataPtr(), decompressedStream.GetDataSize()); error = ioStream.CloseWriting(); } } } zipComponent->Release(); } } return error; }
XBOX::VError CompressStream (XBOX::VStream& ioStream, HTTPCompressionMethod inMethod) { if ((inMethod == COMPRESSION_NONE) || (inMethod > COMPRESSION_LAST_SUPPORTED_METHOD)) return VE_INVALID_PARAMETER; XBOX::VError error = VE_COMP_LIBRARY_NOT_FOUND; if (VHTTPServer::GetZipComponentAvailable()) { CZipComponent *zipComponent = VHTTPServer::RetainZipComponent(); if (NULL != zipComponent) { XBOX::VPtrStream compressedStream; EZipCompressionLevel compressionLevel = ((inMethod == COMPRESSION_GZIP) || (inMethod == COMPRESSION_X_GZIP)) ? eCompressionLevel_GZip_BestSpeed : eCompressionLevel_BestSpeed; if ((XBOX::VE_OK == (error = ioStream.OpenReading())) && !compressedStream.OpenWriting()) { error = zipComponent->CompressStream (&ioStream, compressionLevel, &compressedStream); ioStream.CloseReading(); compressedStream.CloseWriting(); if ((XBOX::VE_OK == error) && (!compressedStream.IsEmpty())) { if (XBOX::VE_OK == (error = ioStream.OpenWriting())) { ioStream.SetSize (0); ioStream.PutData (compressedStream.GetDataPtr(), compressedStream.GetDataSize()); ioStream.CloseWriting(); } } } XBOX::QuickReleaseRefCountable (zipComponent); } } return error; }