|
|
/*++
� 1998 Seagate Software, Inc. All rights reserved.
Module Name:
Wsbdbkey.cpp
Abstract:
The CWsbDbKey class.
Author:
Ron White [ronw] 1-Jul-1997
Revision History:
--*/
#include "stdafx.h"
#include "wsbdbkey.h"
// Local stuff
HRESULT CWsbDbKey::AppendBool( BOOL value )
/*++
Implements:
IWsbDbKey::AppendBool
--*/ { HRESULT hr = S_OK; ULONG size;
WsbTraceIn(OLESTR("CWsbDbKey::AppendBool"), OLESTR("value = <%ls>"), WsbBoolAsString(value)); try { WsbAssert(make_key(m_size + WsbByteSize(value)), WSB_E_RESOURCE_UNAVAILABLE); WsbAffirmHr(WsbConvertToBytes(&m_value[m_size], value, &size)); m_size += size; } WsbCatch(hr);
WsbTraceOut(OLESTR("CWsbDbKey::AppendBool"), OLESTR("hr =<%ls>"), WsbHrAsString(hr));
return(hr); }
HRESULT CWsbDbKey::AppendBytes( UCHAR* value, ULONG size )
/*++
Implements:
IWsbDbKey::AppendBytes
--*/ { HRESULT hr = S_OK;
WsbTraceIn(OLESTR("CWsbDbKey::AppendBytes"), OLESTR("size = <%ld>"), size); try { WsbAssert(size > 0, E_UNEXPECTED); WsbAssert(make_key(size + m_size), WSB_E_RESOURCE_UNAVAILABLE); memcpy(&m_value[m_size], value, size); m_size += size; } WsbCatch(hr);
WsbTraceOut(OLESTR("CWsbDbKey::AppendBytes"), OLESTR("hr =<%ls>"), WsbHrAsString(hr));
return(hr); }
HRESULT CWsbDbKey::AppendFiletime( FILETIME value )
/*++
Implements:
IWsbDbKey::AppendFiletime
--*/ { HRESULT hr = S_OK; ULONG size;
WsbTraceIn(OLESTR("CWsbDbKey::AppendFiletime"), OLESTR("")); try { WsbAssert(make_key(m_size + WsbByteSize(value)), WSB_E_RESOURCE_UNAVAILABLE); WsbAffirmHr(WsbConvertToBytes(&m_value[m_size], value, &size)); m_size += size; } WsbCatch(hr);
WsbTraceOut(OLESTR("CWsbDbKey::AppendFiletime"), OLESTR("hr =<%ls>"), WsbHrAsString(hr));
return(hr); }
HRESULT CWsbDbKey::AppendGuid( GUID value )
/*++
Implements:
IWsbDbKey::AppendGuid
--*/ { HRESULT hr = S_OK; ULONG size;
WsbTraceIn(OLESTR("CWsbDbKey::AppendGuid"), OLESTR("value = <%ls>"), WsbGuidAsString(value)); try { WsbAssert(make_key(m_size + WsbByteSize(value)), WSB_E_RESOURCE_UNAVAILABLE); WsbAffirmHr(WsbConvertToBytes(&m_value[m_size], value, &size)); m_size += size; } WsbCatch(hr);
WsbTraceOut(OLESTR("CWsbDbKey::AppendGuid"), OLESTR("hr =<%ls>"), WsbHrAsString(hr));
return(hr); }
HRESULT CWsbDbKey::AppendLonglong( LONGLONG value )
/*++
Implements:
IWsbDbKey::AppendLonglong
--*/ { HRESULT hr = S_OK; ULONG size;
WsbTraceIn(OLESTR("CWsbDbKey::AppendLonglong"), OLESTR("value = <%ls>"), WsbLonglongAsString(value)); try { WsbAssert(make_key(m_size + WsbByteSize(value)), WSB_E_RESOURCE_UNAVAILABLE); WsbAffirmHr(WsbConvertToBytes(&m_value[m_size], value, &size)); m_size += size; } WsbCatch(hr);
WsbTraceOut(OLESTR("CWsbDbKey::AppendLonglong"), OLESTR("hr =<%ls>"), WsbHrAsString(hr));
return(hr); }
HRESULT CWsbDbKey::AppendString( OLECHAR* value )
/*++
Implements:
IWsbDbKey::AppendString
--*/ { HRESULT hr = S_OK;
WsbTraceIn(OLESTR("CWsbDbKey::AppendString"), OLESTR("")); try { ULONG size;
size = wcslen(value) * sizeof(OLECHAR); WsbAffirmHr(AppendBytes((UCHAR *)value, size)); } WsbCatch(hr);
WsbTraceOut(OLESTR("CWsbDbKey::AppendString"), OLESTR("hr =<%ls>"), WsbHrAsString(hr));
return(hr); }
HRESULT CWsbDbKey::CompareTo( IN IUnknown* pCollectable, OUT SHORT* pResult )
/*++
Implements:
IWsbCollectable::CompareTo
--*/ { HRESULT hr = S_FALSE;
WsbTraceIn(OLESTR("CWsbDbKey::CompareTo"), OLESTR("")); try { UCHAR* bytes2; CComPtr<IWsbDbKey> pKey2; CComPtr<IWsbDbKeyPriv> pKeyPriv2; SHORT result; ULONG size2;
// Did they give us a valid item to compare to?
WsbAssert(0 != pCollectable, E_POINTER);
// We need the IWsbDbKey interface to get the value.
WsbAffirmHr(pCollectable->QueryInterface(IID_IWsbDbKey, (void**) &pKey2)); WsbAffirmHr(pKey2->QueryInterface(IID_IWsbDbKeyPriv, (void**)&pKeyPriv2));
// Get the other key's bytes
bytes2 = NULL; WsbAffirmHr(pKeyPriv2->GetBytes(&bytes2, &size2));
// Do compare
if (size2 == 0 && m_size == 0) { result = 0; } else if (size2 == 0) { result = 1; } else if (m_size == 0) { result = -1; } else { result = WsbSign( memcmp(m_value, bytes2, min(m_size, size2)) ); if (result == 0 && m_size != size2) { result = (m_size > size2) ? (SHORT)1 : (SHORT)-1; } } WsbFree(bytes2);
// If the aren't equal, then return false.
if (result != 0) { hr = S_FALSE; } else { hr = S_OK; } *pResult = result; } WsbCatch(hr);
WsbTraceOut(OLESTR("CWsbDbKey::CompareTo"), OLESTR("hr =<%ls>"), WsbHrAsString(hr));
return(hr); }
HRESULT CWsbDbKey::GetBytes( OUT UCHAR** ppBytes, OUT ULONG* pSize )
/*++
Implements:
IWsbDbKey::GetBytes --*/ { HRESULT hr = S_OK;
WsbTraceIn(OLESTR("CWsbDbKey::GetBytes"), OLESTR(""));
try { if (ppBytes && m_size) { if (*ppBytes == NULL) { *ppBytes = (UCHAR *)WsbAlloc(m_size); } if (*ppBytes) { memcpy(*ppBytes, m_value, m_size); } else { WsbThrow(E_OUTOFMEMORY); } } if (pSize) { *pSize = m_size; } } WsbCatch(hr);
WsbTraceOut(OLESTR("CWsbDbKey::GetBytes"), OLESTR("hr = <%ls>"), WsbHrAsString(hr)); return(hr); }
HRESULT CWsbDbKey::GetType( OUT ULONG* pType )
/*++
Implements:
IWsbDbKey::GetType --*/ { HRESULT hr = S_OK;
WsbTraceIn(OLESTR("CWsbDbKey::GetType"), OLESTR(""));
try { WsbAffirm(pType != NULL, E_POINTER); *pType = m_type; } WsbCatch(hr);
WsbTraceOut(OLESTR("CWsbDbKey::GetType"), OLESTR("hr = <%ls>, value = <%ls>"), WsbHrAsString(hr), m_value); return(hr); }
HRESULT CWsbDbKey::SetToBool( BOOL value )
/*++
Implements:
IWsbDbKey::SetToBool
--*/ { HRESULT hr = S_OK;
WsbTraceIn(OLESTR("CWsbDbKey::SetToBool"), OLESTR("value = <%ls>"), WsbBoolAsString(value)); try { WsbAssert(make_key(WsbByteSize(value)), WSB_E_RESOURCE_UNAVAILABLE); WsbAffirmHr(WsbConvertToBytes(m_value, value, &m_size)); } WsbCatch(hr);
WsbTraceOut(OLESTR("CWsbDbKey::SetToBool"), OLESTR("hr =<%ls>"), WsbHrAsString(hr));
return(hr); }
HRESULT CWsbDbKey::SetToBytes( UCHAR* value, ULONG size )
/*++
Implements:
IWsbDbKey::SetToBytes
--*/ { HRESULT hr = S_OK;
WsbTraceIn(OLESTR("CWsbDbKey::SetToBytes"), OLESTR("size = <%ld>"), size); try { WsbAssert(size > 0, E_UNEXPECTED); WsbAssert(make_key(size), WSB_E_RESOURCE_UNAVAILABLE); memcpy(m_value, value, size); m_size = size; } WsbCatch(hr);
WsbTraceOut(OLESTR("CWsbDbKey::SetToBytes"), OLESTR("hr =<%ls>"), WsbHrAsString(hr));
return(hr); }
HRESULT CWsbDbKey::SetToFiletime( FILETIME value )
/*++
Implements:
IWsbDbKey::SetToFiletime
--*/ { HRESULT hr = S_OK;
WsbTraceIn(OLESTR("CWsbDbKey::SetToFiletime"), OLESTR("")); try { WsbAssert(make_key(WsbByteSize(value)), WSB_E_RESOURCE_UNAVAILABLE); WsbAffirmHr(WsbConvertToBytes(m_value, value, &m_size)); } WsbCatch(hr);
WsbTraceOut(OLESTR("CWsbDbKey::SetToFiletime"), OLESTR("hr =<%ls>"), WsbHrAsString(hr));
return(hr); }
HRESULT CWsbDbKey::SetToGuid( GUID value )
/*++
Implements:
IWsbDbKey::SetToGuid
--*/ { HRESULT hr = S_OK;
WsbTraceIn(OLESTR("CWsbDbKey::SetToGuid"), OLESTR("value = <%ls>"), WsbGuidAsString(value)); try { WsbAssert(make_key(WsbByteSize(value)), WSB_E_RESOURCE_UNAVAILABLE); WsbAffirmHr(WsbConvertToBytes(m_value, value, &m_size)); } WsbCatch(hr);
WsbTraceOut(OLESTR("CWsbDbKey::SetToGuid"), OLESTR("hr =<%ls>"), WsbHrAsString(hr));
return(hr); }
HRESULT CWsbDbKey::SetToLonglong( LONGLONG value )
/*++
Implements:
IWsbDbKey::SetToLonglong
--*/ { HRESULT hr = S_OK;
WsbTraceIn(OLESTR("CWsbDbKey::SetToLonglong"), OLESTR("value = <%ls>"), WsbLonglongAsString(value)); try { WsbAssert(make_key(WsbByteSize(value)), WSB_E_RESOURCE_UNAVAILABLE); WsbAffirmHr(WsbConvertToBytes(m_value, value, &m_size)); } WsbCatch(hr);
WsbTraceOut(OLESTR("CWsbDbKey::SetToLonglong"), OLESTR("hr =<%ls>"), WsbHrAsString(hr));
return(hr); }
HRESULT CWsbDbKey::SetToUlong( ULONG value )
/*++
Implements:
IWsbDbKey::SetToUlong
--*/ { HRESULT hr = S_OK;
WsbTraceIn(OLESTR("CWsbDbKey::SetToUlong"), OLESTR("value = <%ld>"), value); try { WsbAssert(make_key(WsbByteSize(value)), WSB_E_RESOURCE_UNAVAILABLE); WsbAffirmHr(WsbConvertToBytes(m_value, value, &m_size)); } WsbCatch(hr);
WsbTraceOut(OLESTR("CWsbDbKey::SetToUlong"), OLESTR("hr =<%ls>"), WsbHrAsString(hr));
return(hr); }
HRESULT CWsbDbKey::SetToString( OLECHAR* value )
/*++
Implements:
IWsbDbKey::SetToString
--*/ { HRESULT hr = S_OK;
WsbTraceIn(OLESTR("CWsbDbKey::SetToString"), OLESTR("")); try { ULONG size;
size = wcslen(value) * sizeof(OLECHAR); WsbAffirmHr(SetToBytes((UCHAR *)value, size)); } WsbCatch(hr);
WsbTraceOut(OLESTR("CWsbDbKey::SetToString"), OLESTR("hr =<%ls>"), WsbHrAsString(hr));
return(hr); }
HRESULT CWsbDbKey::FinalConstruct( void )
/*++
Implements:
CComObjectRoot::FinalConstruct
--*/ { HRESULT hr = S_OK;
WsbTraceIn(OLESTR("CWsbDbKey::FinalConstruct"), OLESTR("") );
try { WsbAffirmHr(CWsbObject::FinalConstruct()); m_value = NULL; m_size = 0; m_max = 0;
} WsbCatch(hr);
WsbTraceOut(OLESTR("CWsbDbKey::FinalConstruct"), OLESTR("hr =<%ls>"), WsbHrAsString(hr));
return(hr); }
void CWsbDbKey::FinalRelease( void )
/*++
Routine Description:
This method does some cleanup of the object that is necessary during destruction.
Arguments:
None.
Return Value:
None.
--*/ { HRESULT hr = S_OK;
WsbTraceIn(OLESTR("CWsbDbKey::FinalRelease"), OLESTR(""));
try { if (m_value) { WsbFree(m_value); m_value = NULL; } CWsbObject::FinalRelease(); } WsbCatch(hr);
WsbTraceOut(OLESTR("CWsbDbKey::FinalRelease"), OLESTR("hr =<%ls>"), WsbHrAsString(hr)); }
HRESULT CWsbDbKey::GetClassID( OUT CLSID* pClsid )
/*++
Implements:
IPersist::GetClassID().
--*/ { HRESULT hr = S_OK;
WsbTraceIn(OLESTR("CWsbDbKey::GetClassID"), OLESTR(""));
try { WsbAssert(0 != pClsid, E_POINTER); *pClsid = CLSID_CWsbDbKey; } WsbCatch(hr); WsbTraceOut(OLESTR("CWsbDbKey::GetClassID"), OLESTR("hr = <%ls>, CLSID = <%ls>"), WsbHrAsString(hr), WsbGuidAsString(*pClsid));
return(hr); }
HRESULT CWsbDbKey::GetSizeMax( OUT ULARGE_INTEGER* /*pSize*/ )
/*++
Implements:
IPersistStream::GetSizeMax().
--*/ { HRESULT hr = E_NOTIMPL; return(hr); }
HRESULT CWsbDbKey::Load( IN IStream* /*pStream*/ )
/*++
Implements:
IPersistStream::Load().
--*/ { HRESULT hr = E_NOTIMPL; return(hr); }
HRESULT CWsbDbKey::Save( IN IStream* /*pStream*/, IN BOOL /*clearDirty*/ )
/*++
Implements:
IPersistStream::Save().
--*/ { HRESULT hr = E_NOTIMPL; return(hr); }
// CWsbDbKey internal helper functions
// make_key - create a key of the specified size
BOOL CWsbDbKey::make_key( ULONG size ) { BOOL status = FALSE; LPVOID pTemp;
if ( (size > IDB_MAX_KEY_SIZE) || (size == 0) ) { status = FALSE; } else if (m_value && m_max >= size) { status = TRUE; } else { pTemp = WsbRealloc(m_value, size); if ( pTemp ) { m_value = (PUCHAR) pTemp; status = TRUE; m_max = size; } } return(status); }
HRESULT CWsbDbKey::Test( OUT USHORT* passed, OUT USHORT* failed )
/*++
Implements:
IWsbTestable::Test().
--*/ { *passed = 0; *failed = 0;
HRESULT hr = S_OK;
#if !defined(WSB_NO_TEST)
CComPtr<IWsbDbKey> pDbKey1;
WsbTraceIn(OLESTR("CWsbDbKey::Test"), OLESTR(""));
try {
try { WsbAssertHr(((IUnknown*) (IWsbDbKey*) this)->QueryInterface(IID_IWsbDbKey, (void**) &pDbKey1));
// Set o a ULONG value, and see if it is returned.
hr = S_OK; try { WsbAssertHr(pDbKey1->SetToUlong(0xffffffff)); // ULONG value;
// WsbAssertHr(pDbKey1->GetUlong(&value));
// WsbAssert(value == 0xffffffff, E_FAIL);
} WsbCatch(hr);
if (hr == S_OK) { (*passed)++; } else { (*failed)++; }
} WsbCatch(hr);
if (hr == S_OK) { (*passed)++; } else { (*failed)++; } } WsbCatch(hr);
// Tally up the results
if (*failed) { hr = S_FALSE; } else { hr = S_OK; }
WsbTraceOut(OLESTR("CWsbDbKey::Test"), OLESTR("hr = <%ls>"), WsbHrAsString(hr)); #endif // WSB_NO_TEST
return(hr); }
|