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.8 KiB
172 lines
4.8 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
|
|
|
|
|