2025-11-27 16:46:48 +09:00

157 lines
4.3 KiB
C++

// ==========================================================================
// Class Implementation : COXBlob
// ==========================================================================
// Source file : OXBlob.cpp
// This software along with its related components, documentation and files ("The Libraries")
// is © 1994-2007 The Code Project (1612916 Ontario Limited) and use of The Libraries is
// governed by a software license agreement ("Agreement"). Copies of the Agreement are
// available at The Code Project (www.codeproject.com), as part of the package you downloaded
// to obtain this file, or directly from our office. For a copy of the license governing
// this software, you may contact us at legalaffairs@codeproject.com, or by calling 416-849-8900.
// //////////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "OXBlob.h"
#include <afxdb.h> // For CLongBinary
#ifdef _DEBUG
#undef THIS_FILE
static char BASED_CODE THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// Definition of static functions
IMPLEMENT_DYNAMIC(COXBlob, CByteArray);
// Data members -------------------------------------------------------------
// protected:
// private:
// Member functions ---------------------------------------------------------
// public:
COXBlob::COXBlob(const CLongBinary& lbSrc)
:
CByteArray()
{
SetSize(lbSrc.m_dwDataLength);
ASSERT((lbSrc.m_dwDataLength == 0) || (GetData() != NULL));
BYTE* pData = (BYTE*)::GlobalLock(lbSrc.m_hData);
ASSERT(pData != NULL);
memcpy(GetData(), pData, lbSrc.m_dwDataLength);
::GlobalUnlock(lbSrc.m_hData);
}
COXBlob& COXBlob::operator=(const CLongBinary& lbSrc)
{
SetSize(lbSrc.m_dwDataLength);
ASSERT((lbSrc.m_dwDataLength == 0) || (GetData() != NULL));
BYTE* pData = (BYTE*)::GlobalLock(lbSrc.m_hData);
ASSERT(pData != NULL);
memcpy(GetData(), pData, lbSrc.m_dwDataLength);
::GlobalUnlock(lbSrc.m_hData);
return *this;
}
BOOL COXBlob::ReadRaw(LPCTSTR pszPath)
{
CFileStatus fileStatus;
if (!CFile::GetStatus(pszPath, fileStatus))
{
TRACE(_T("COXBlob::ReadRaw : Specified file does not exist (%s)\n"), pszPath);
return FALSE;
}
// Read as a only dimensional array of unsigned bytes
BOOL bSuccess = TRUE;
// Fill with the actual data
SetSize(fileStatus.m_size);
TRY
{
CFile file(pszPath, CFile::modeRead | CFile::shareDenyNone);
file.Read(GetData(), fileStatus.m_size);
file.Close();
}
CATCH(CFileException, px)
{
TRACE(_T("COXBlob::ReadRaw : Catching File exception\n"));
bSuccess = FALSE;
}
END_CATCH
if (!bSuccess)
// Clean up after failure
RemoveAll();
return bSuccess;
}
BOOL COXBlob::WriteRaw(LPCTSTR pszPath)
{
BOOL bSuccess = TRUE;
TRY
{
CFile file(pszPath, CFile::modeWrite | CFile::modeCreate | CFile::shareDenyWrite);
file.Write(GetData(), GetSize());
file.Close();
}
CATCH(CFileException, px)
{
TRACE(_T("COXBlob::WriteRaw : Catching File exception\n"));
bSuccess = FALSE;
}
END_CATCH
return bSuccess;;
}
// protected:
BOOL COXBlob::CopyVariant(LPCVARIANT pSrc)
// --- In : pSrc : Pointer to the source variant
// --- Out :
// --- Returns : Whether it succeeded or not
// --- Effect : Copies the contents of the source variant to this blob object
// The supported types are VT_EMPTY and 1-dim (VT_UI1 | VT_ARRAY)
{
if (V_VT(pSrc) == VT_EMPTY)
{
// Empty variant, just clear the blob
RemoveAll();
return TRUE;
}
if (V_VT(pSrc) != (VT_UI1 | VT_ARRAY) ||
SafeArrayGetDim(V_ARRAY(pSrc)) != 1)
{
TRACE(_T("COXBlob::CopyVariant : Input variant not a one dimensional array of bytes.\n"));
return FALSE;
}
DWORD lSize;
long lLower, lUpper;
void* pDest;
// ... Make sure that it is an array of BYTEs
ASSERT(SafeArrayGetElemsize(V_ARRAY(pSrc)) == 1);
// ... Get the lower and upper bound
COXVariant::CheckError(SafeArrayGetLBound(V_ARRAY(pSrc), 1, &lLower));
COXVariant::CheckError(SafeArrayGetUBound(V_ARRAY(pSrc), 1, &lUpper));
lSize = (DWORD)(lUpper - lLower + 1);
// ... Get a pointer to the actual data and copy it
COXVariant::CheckError(SafeArrayAccessData(V_ARRAY(pSrc), &pDest));
SetSize(lSize);
memcpy(GetData(), pDest, lSize);
COXVariant::CheckError(SafeArrayUnaccessData(V_ARRAY(pSrc)));
return TRUE;
}
// private:
// ==========================================================================