Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

172 lines
4.6 KiB

// AZipValue.cpp -- CAbstractZipValue class definition
// (c) Copyright Schlumberger Technology Corp., unpublished work, created
// 1999. This computer program includes Confidential, Proprietary
// Information and is a Trade Secret of Schlumberger Technology Corp. All
// use, disclosure, and/or reproduction is prohibited unless authorized
// in writing. All Rights Reserved.
#include "NoWarning.h"
#include <windows.h> // for zip_public.h
#include <scuArrayP.h>
#include <slbZip.h>
#include "AZipValue.h"
#include "TransactionWrap.h"
using namespace std;
using namespace cci;
/////////////////////////// LOCAL/HELPER /////////////////////////////////
namespace
{
struct ZipBuffer
{
ZipBuffer()
: m_pbData(0),
m_uLength(0)
{};
~ZipBuffer() throw()
{
try
{
if (m_pbData)
free(m_pbData);
}
catch (...)
{
}
};
BYTE *m_pbData;
UINT m_uLength;
};
std::string
AsString(ZipBuffer const &rzb)
{
return string(reinterpret_cast<char *>(rzb.m_pbData),
rzb.m_uLength);
};
} // namespace
/////////////////////////// PUBLIC /////////////////////////////////
// Types
// C'tors/D'tors
CAbstractZipValue::~CAbstractZipValue()
{}
// Operators
// Operations
void
CAbstractZipValue::Value(ValueType const &rhs)
{
CTransactionWrap wrap(m_hcard);
bool fReplaceData = !m_avData.IsCached() ||
(m_avData.Value() != rhs);
if (fReplaceData)
{
DoValue(Zip(rhs, m_fAlwaysZip));
m_avData.Value(rhs);
}
}
// Access
string
CAbstractZipValue::Value()
{
CTransactionWrap wrap(m_hcard);
if (!m_avData.IsCached())
m_avData.Value(UnZip(DoValue()));
return m_avData.Value();
}
// Predicates
// Static Variables
/////////////////////////// PROTECTED /////////////////////////////////
// C'tors/D'tors
CAbstractZipValue::CAbstractZipValue(CAbstractCard const &racard,
ObjectAccess oa,
bool fAlwaysZip)
: CProtectableCrypt(racard, oa),
m_fAlwaysZip(fAlwaysZip),
m_avData()
{}
// Operators
// Operations
// Access
// Predicates
// Static Variables
/////////////////////////// PRIVATE /////////////////////////////////
// C'tors/D'tors
// Operators
// Operations
// Compress (zip) the data, returning the smaller of the zipped or
// the original data.
CAbstractZipValue::ZipCapsule
CAbstractZipValue::Zip(std::string const &rsData,
bool fAlwaysZip)
{
ZipBuffer zb;
size_t const cTempLength =
rsData.size() * sizeof string::value_type;
scu::AutoArrayPtr<BYTE> aabTemp(new BYTE[cTempLength]);
memcpy(aabTemp.Get(), rsData.data(), cTempLength);
CompressBuffer(aabTemp.Get(), cTempLength, &zb.m_pbData, &zb.m_uLength);
return (fAlwaysZip || (cTempLength > zb.m_uLength))
? ZipCapsule(AsString(zb), true)
: ZipCapsule(rsData, false);
}
string
CAbstractZipValue::UnZip(ZipCapsule const &rzc)
{
std::string strTemp(rzc.Data());
if (rzc.IsCompressed())
{
// Need to decompress
ZipBuffer zb;
size_t cTempLength =
strTemp.size() * sizeof string::value_type;
scu::AutoArrayPtr<BYTE> aabTemp(new BYTE[cTempLength]);
memcpy(aabTemp.Get(), strTemp.data(), cTempLength);
DecompressBuffer(aabTemp.Get(), cTempLength,
&zb.m_pbData, &zb.m_uLength);
strTemp = AsString(zb);
}
return strTemp;
}
// Access
// Predicates
// Static Variables