Windows2003-3790/inetcore/datacab/viaduct/msr2c/entryid.cpp
2020-09-30 16:53:55 +02:00

182 lines
4.9 KiB
C++

//---------------------------------------------------------------------------
// EntryIDData.cpp : EntryIDData implementation
//
// Copyright (c) 1996 Microsoft Corporation, All Rights Reserved
// Developed by Sheridan Software Systems, Inc.
//---------------------------------------------------------------------------
#include "stdafx.h"
#ifndef VD_DONT_IMPLEMENT_ISTREAM
#include "Notifier.h"
#include "RSColumn.h"
#include "RSSource.h"
#include "CursMain.h"
#include "ColUpdat.h"
#include "CursPos.h"
#include "EntryID.h"
#include "resource.h"
SZTHISFILE
//=--------------------------------------------------------------------------=
// CVDEntryIDData - Constructor
//
CVDEntryIDData::CVDEntryIDData()
{
m_dwRefCount = 1;
m_pCursorPosition = NULL;
m_pColumn = NULL;
m_hRow = 0;
m_pStream = NULL;
m_pResourceDLL = NULL;
m_fDirty = FALSE;
#ifdef _DEBUG
g_cVDEntryIDDataCreated++;
#endif
}
//=--------------------------------------------------------------------------=
// ~CVDEntryIDData - Destructor
//
CVDEntryIDData::~CVDEntryIDData()
{
if (m_fDirty)
Commit();
if (m_pCursorPosition)
{
if (m_hRow)
{
IRowset * pRowset = m_pCursorPosition->GetCursorMain()->GetRowset();
if (pRowset && m_pCursorPosition->GetCursorMain()->IsRowsetValid())
pRowset->ReleaseRows(1, &m_hRow, NULL, NULL, NULL);
}
((CVDNotifier*)m_pCursorPosition)->Release();
}
if (m_pStream)
m_pStream->Release();
#ifdef _DEBUG
g_cVDEntryIDDataDestroyed++;
#endif
}
//=--------------------------------------------------------------------------=
// Create - Create entryID data object
//=--------------------------------------------------------------------------=
// This function creates and initializes a new entryID data object
//
// Parameters:
// pCursorPosition - [in] backwards pointer to CVDCursorPosition object
// pColumn - [in] rowset column pointer
// hRow - [in] row handle
// pStream - [in] data stream pointer
// ppEntryIDData - [out] a pointer in which to return pointer to
// entryID data object
// pResourceDLL - [in] a pointer which keeps track of resource DLL
//
// Output:
// HRESULT - S_OK if successful
// E_OUTOFMEMORY not enough memory to create object
//
// Notes:
//
HRESULT CVDEntryIDData::Create(CVDCursorPosition * pCursorPosition, CVDRowsetColumn * pColumn, HROW hRow,
IStream * pStream, CVDEntryIDData ** ppEntryIDData, CVDResourceDLL * pResourceDLL)
{
ASSERT_POINTER(pCursorPosition, CVDCursorPosition)
ASSERT_POINTER(pStream, IStream)
ASSERT_POINTER(ppEntryIDData, CVDEntryIDData*)
ASSERT_POINTER(pResourceDLL, CVDResourceDLL)
// make sure we have all necessary pointers
if (!pCursorPosition || !pStream || !ppEntryIDData)
{
VDSetErrorInfo(IDS_ERR_INVALIDARG, IID_IEntryID, pResourceDLL);
return E_INVALIDARG;
}
IRowset * pRowset = pCursorPosition->GetCursorMain()->GetRowset();
// make sure we have a valid rowset pointer
if (!pRowset || !pCursorPosition->GetCursorMain()->IsRowsetValid())
{
VDSetErrorInfo(IDS_ERR_ROWSETRELEASED, IID_IEntryID, pResourceDLL);
return E_FAIL;
}
*ppEntryIDData = NULL;
CVDEntryIDData * pEntryIDData = new CVDEntryIDData();
if (!pEntryIDData)
{
VDSetErrorInfo(IDS_ERR_OUTOFMEMORY, IID_IEntryID, pResourceDLL);
return E_OUTOFMEMORY;
}
((CVDNotifier*)pCursorPosition)->AddRef();
pRowset->AddRefRows(1, &hRow, NULL, NULL);
pStream->AddRef();
pEntryIDData->m_pCursorPosition = pCursorPosition;
pEntryIDData->m_pColumn = pColumn;
pEntryIDData->m_hRow = hRow;
pEntryIDData->m_pStream = pStream;
pEntryIDData->m_pResourceDLL = pResourceDLL;
*ppEntryIDData = pEntryIDData;
return S_OK;
}
//=--------------------------------------------------------------------------=
// AddRef
//
ULONG CVDEntryIDData::AddRef(void)
{
return ++m_dwRefCount;
}
//=--------------------------------------------------------------------------=
// Release
//
ULONG CVDEntryIDData::Release(void)
{
if (1 > --m_dwRefCount)
{
delete this;
return 0;
}
return m_dwRefCount;
}
//=--------------------------------------------------------------------------=
// Commit
//
HRESULT CVDEntryIDData::Commit()
{
HRESULT hr = S_OK;
if (m_fDirty)
{
hr = m_pCursorPosition->UpdateEntryIDStream(m_pColumn, m_hRow, m_pStream);
if (SUCCEEDED(hr))
m_fDirty = FALSE;
}
return hr;
}
#endif //VD_DONT_IMPLEMENT_ISTREAM