230 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			230 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
#include "stdinc.h"
 | 
						|
#include "local-stdinc.h"
 | 
						|
#include "RowObject.h"
 | 
						|
 | 
						|
void __stdcall _com_issue_error( HRESULT hr )
 | 
						|
{
 | 
						|
    ASSERT( hr != S_OK );
 | 
						|
    throw hr;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
CRowObject::CRowObject() : m_iColumnCount(0), m_iMaxColumns(0), m_pbstColumnData(NULL), 
 | 
						|
    m_lRefCount(1)
 | 
						|
{
 | 
						|
    ::InitializeCriticalSection( &this->m_csColumnDataLock );
 | 
						|
}
 | 
						|
 | 
						|
HRESULT
 | 
						|
CRowObject::EnsureColumnSize( int iColumns )
 | 
						|
{
 | 
						|
    HRESULT hr = E_FAIL;
 | 
						|
 | 
						|
    this->Lock();
 | 
						|
    __try
 | 
						|
    {
 | 
						|
        if ( ( iColumns > m_iMaxColumns ) || ( m_pbstColumnData == NULL ) )
 | 
						|
        {
 | 
						|
            _bstr_t *pbstNewData = new _bstr_t[iColumns];
 | 
						|
 | 
						|
            if ( m_pbstColumnData != NULL )
 | 
						|
            {
 | 
						|
                for ( int i = 0; i < m_iMaxColumns; i++ )
 | 
						|
                    pbstNewData[i] = m_pbstColumnData[i];
 | 
						|
                delete[] m_pbstColumnData;
 | 
						|
            }
 | 
						|
            
 | 
						|
            m_pbstColumnData = pbstNewData;
 | 
						|
            m_iMaxColumns = iColumns;
 | 
						|
        }
 | 
						|
    }
 | 
						|
    __finally
 | 
						|
    {
 | 
						|
        this->UnLock();
 | 
						|
    }
 | 
						|
 | 
						|
    return hr;
 | 
						|
}
 | 
						|
 | 
						|
CRowObject::~CRowObject() 
 | 
						|
{
 | 
						|
    this->Lock();
 | 
						|
    if ( m_pbstColumnData )
 | 
						|
    {
 | 
						|
        delete [] m_pbstColumnData;
 | 
						|
        m_pbstColumnData = NULL;
 | 
						|
        m_iColumnCount = 0;
 | 
						|
        m_iMaxColumns = 0;
 | 
						|
    }
 | 
						|
    ::LeaveCriticalSection( &m_csColumnDataLock );
 | 
						|
    ::DeleteCriticalSection( &m_csColumnDataLock );
 | 
						|
}
 | 
						|
 | 
						|
ULONG STDMETHODCALLTYPE 
 | 
						|
CRowObject::AddRef() { return ::InterlockedIncrement( &m_lRefCount ); }
 | 
						|
 | 
						|
ULONG STDMETHODCALLTYPE 
 | 
						|
CRowObject::Release() { 
 | 
						|
    ULONG lRC = ::InterlockedDecrement( &m_lRefCount );
 | 
						|
    if ( lRC == 0 )
 | 
						|
        delete this;
 | 
						|
    return lRC;
 | 
						|
}
 | 
						|
 | 
						|
HRESULT STDMETHODCALLTYPE 
 | 
						|
CRowObject::QueryInterface( REFIID riid, void** ppvObject ) {
 | 
						|
    if ( ppvObject == NULL )
 | 
						|
        return E_INVALIDARG;
 | 
						|
    else
 | 
						|
        *ppvObject = NULL;
 | 
						|
 | 
						|
    if ( riid == __uuidof(IViewRow) ) {
 | 
						|
        *ppvObject = (IViewRow*)this;
 | 
						|
    } else if ( riid == __uuidof( IWriteableViewRow ) ) {
 | 
						|
        *ppvObject = (IWriteableViewRow*)this;
 | 
						|
    } else if ( riid == __uuidof( IUnknown ) ) {
 | 
						|
        *ppvObject = (IUnknown*)this;
 | 
						|
    } else return E_NOINTERFACE;
 | 
						|
 | 
						|
    if ( *ppvObject ) {
 | 
						|
        ((IUnknown*)*ppvObject)->AddRef();
 | 
						|
    }
 | 
						|
 | 
						|
    return S_OK;
 | 
						|
    
 | 
						|
}
 | 
						|
 | 
						|
HRESULT
 | 
						|
CRowObject::set_Count( int iTotalColumns, BOOL bClipOffRemaining )
 | 
						|
{
 | 
						|
    HRESULT hr = E_FAIL;
 | 
						|
 | 
						|
    this->Lock();
 | 
						|
    __try
 | 
						|
    {
 | 
						|
        //
 | 
						|
        // bClipOffRemaining is apocryphal, and was suppose to be an optimization
 | 
						|
        // to allow pruning of the table size.  Now, it's just "there"
 | 
						|
        //
 | 
						|
        if ( FAILED( hr = this->EnsureColumnSize( iTotalColumns ) ) )
 | 
						|
            __leave;
 | 
						|
            
 | 
						|
        m_iColumnCount = iTotalColumns;
 | 
						|
    }
 | 
						|
    __finally
 | 
						|
    {
 | 
						|
        this->UnLock();
 | 
						|
    }
 | 
						|
 | 
						|
    return hr;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
HRESULT
 | 
						|
CRowObject::set_Value( int iWhichColumn, BSTR bstColumnValue )
 | 
						|
{
 | 
						|
    HRESULT hr = E_FAIL;
 | 
						|
 | 
						|
    if ( ( iWhichColumn == 0 ) || ( bstColumnValue == NULL ) )
 | 
						|
        return E_INVALIDARG;
 | 
						|
 | 
						|
    this->Lock();
 | 
						|
    __try
 | 
						|
    {
 | 
						|
        if ( iWhichColumn > this->m_iColumnCount )
 | 
						|
        {
 | 
						|
            this->EnsureColumnSize( iWhichColumn );
 | 
						|
        }
 | 
						|
 | 
						|
        this->m_pbstColumnData[iWhichColumn - 1] = bstColumnValue;
 | 
						|
        if ( iWhichColumn > m_iColumnCount ) m_iColumnCount = iWhichColumn;
 | 
						|
        hr = S_OK;
 | 
						|
    }
 | 
						|
    __finally
 | 
						|
    {
 | 
						|
        this->UnLock();
 | 
						|
    }
 | 
						|
 | 
						|
    return hr;
 | 
						|
    
 | 
						|
}
 | 
						|
 | 
						|
HRESULT 
 | 
						|
CRowObject::get_Value( int iWhichColumn, BSTR* pbstColumnValue )
 | 
						|
{
 | 
						|
    HRESULT hr = E_FAIL;
 | 
						|
 | 
						|
    if ( pbstColumnValue == NULL )
 | 
						|
        return E_INVALIDARG;
 | 
						|
    else
 | 
						|
        *pbstColumnValue = NULL;
 | 
						|
 | 
						|
    if ( iWhichColumn == 0 )
 | 
						|
        return E_INVALIDARG;
 | 
						|
 | 
						|
    this->Lock();
 | 
						|
    __try
 | 
						|
    {
 | 
						|
        if ( iWhichColumn > this->m_iColumnCount )
 | 
						|
        {
 | 
						|
            hr = E_INVALIDARG;
 | 
						|
            __leave;
 | 
						|
        }
 | 
						|
        else if ( m_pbstColumnData == NULL )
 | 
						|
        {
 | 
						|
            __leave;
 | 
						|
        }
 | 
						|
        else
 | 
						|
        {
 | 
						|
            *pbstColumnValue = m_pbstColumnData[iWhichColumn-1].copy();
 | 
						|
            hr = S_OK;
 | 
						|
        }
 | 
						|
    }
 | 
						|
    __finally
 | 
						|
    {
 | 
						|
        this->UnLock();
 | 
						|
    }
 | 
						|
 | 
						|
    return hr;
 | 
						|
}
 | 
						|
 | 
						|
HRESULT 
 | 
						|
CRowObject::get_Count( int* piColumnCount )
 | 
						|
{
 | 
						|
    HRESULT hr = E_FAIL;
 | 
						|
 | 
						|
    if ( piColumnCount == NULL )
 | 
						|
        return E_INVALIDARG;
 | 
						|
    else
 | 
						|
        *piColumnCount = 0;
 | 
						|
 | 
						|
    this->Lock();
 | 
						|
    __try
 | 
						|
    {
 | 
						|
        *piColumnCount = this->m_iColumnCount;
 | 
						|
        hr = S_OK;
 | 
						|
    }
 | 
						|
    __finally
 | 
						|
    {
 | 
						|
        this->UnLock();
 | 
						|
    }
 | 
						|
 | 
						|
    return hr;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
HRESULT
 | 
						|
CRowObject::Lock() 
 | 
						|
{ 
 | 
						|
    ::EnterCriticalSection( &this->m_csColumnDataLock );
 | 
						|
    return S_OK; 
 | 
						|
}
 | 
						|
 | 
						|
HRESULT
 | 
						|
CRowObject::UnLock()
 | 
						|
{
 | 
						|
    ::LeaveCriticalSection( &this->m_csColumnDataLock );
 | 
						|
    return S_OK;
 | 
						|
}
 | 
						|
 |