402 lines
9.2 KiB
C++
402 lines
9.2 KiB
C++
//-----------------------------------------------------------------------------
|
|
//
|
|
// Microsoft Windows
|
|
// Copyright (C) Microsoft Corporation, 1992 - 1995
|
|
//
|
|
// File: ccolinfo.cxx
|
|
//
|
|
// Contents: IColumnsInfo implementation for LDAP rowsets
|
|
//
|
|
//
|
|
// History: 07/10/96 RenatoB Created, lifted from EricJ code
|
|
//
|
|
//------------------------------------------------------------------------------
|
|
|
|
|
|
// Includes
|
|
#include "oleds.hxx"
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// CLdap_ColumnsInfo object
|
|
//
|
|
// This object is just a wrapper for the CColInfo object.
|
|
// It is separate because of refcount usage.
|
|
// (It is also shared by Command and Rowset objects.)
|
|
//
|
|
// - Delegate QI, AddRef, Release to CLdap_RowProvider.
|
|
// - Delegate IColumnsInfo functions to CColInfo.
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Function: CLdap_ColumnsInfo::CLdap_ColumnsInfo
|
|
//
|
|
// Synopsis: @mfunc Ctor
|
|
//
|
|
// Arguments:
|
|
//
|
|
//
|
|
// Returns: @rdesc NONE
|
|
//
|
|
// Modifies:
|
|
//
|
|
// History: 07/10/96 RenatoB Created
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
PUBLIC
|
|
CLdap_ColumnsInfo::CLdap_ColumnsInfo(
|
|
CLdap_RowProvider * pObj) // @parm IN |
|
|
{
|
|
m_pObj = pObj;
|
|
};
|
|
|
|
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Function: CLdap_ColumnsInfo::FInit
|
|
//
|
|
// Synopsis:
|
|
//
|
|
// Arguments:
|
|
//
|
|
// Returns:
|
|
//
|
|
// Modifies:
|
|
//
|
|
// History: 07/10/96 RenatoB Created
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
PUBLIC STDMETHODIMP
|
|
CLdap_ColumnsInfo::FInit(
|
|
ULONG cColumns,
|
|
DBCOLUMNINFO *rgInfo,
|
|
OLECHAR *pStringsBuffer
|
|
)
|
|
{
|
|
ULONG cChars;
|
|
ULONG cCharDispl;
|
|
ULONG i;
|
|
HRESULT hr;
|
|
void* Null1 = NULL;
|
|
void* Null2 = NULL;
|
|
|
|
m_ColInfo = NULL;
|
|
m_pwchBuf = NULL;
|
|
|
|
hr = CoGetMalloc(
|
|
MEMCTX_TASK,
|
|
&m_pMalloc);
|
|
|
|
if (! SUCCEEDED(hr)) {
|
|
goto error;
|
|
}
|
|
|
|
m_cColumns= cColumns;
|
|
|
|
Null1 = m_pMalloc->Alloc(
|
|
cColumns*sizeof(DBCOLUMNINFO)
|
|
);
|
|
if (Null1 == NULL)
|
|
goto error;
|
|
|
|
memset(Null1, 0, cColumns*sizeof(DBCOLUMNINFO));
|
|
|
|
memcpy( (void*) Null1, (void*) rgInfo, cColumns*sizeof(DBCOLUMNINFO));
|
|
m_ColInfo = (DBCOLUMNINFO*) Null1;
|
|
|
|
cChars= m_pMalloc->GetSize(pStringsBuffer);
|
|
Null2 = m_pMalloc->Alloc(cChars);
|
|
if (Null2 == NULL)
|
|
goto error;
|
|
|
|
memset(Null2, 0, cChars);
|
|
memcpy( (void*) Null2, (void*)pStringsBuffer , cChars);
|
|
m_pwchBuf= (OLECHAR*) Null2;
|
|
|
|
for (i=0; i<m_cColumns; i++) {
|
|
cCharDispl = rgInfo[i].pwszName - pStringsBuffer;
|
|
m_ColInfo[i].pwszName = m_pwchBuf+ cCharDispl;
|
|
};
|
|
|
|
RRETURN(S_OK);
|
|
|
|
error:
|
|
if (m_ColInfo != NULL)
|
|
m_pMalloc->Free(m_ColInfo);
|
|
if (m_pwchBuf != NULL)
|
|
m_pMalloc->Free(m_pwchBuf);
|
|
|
|
m_ColInfo = NULL;
|
|
m_pwchBuf = NULL;
|
|
m_cColumns = 0;
|
|
|
|
m_pMalloc->Release();
|
|
|
|
RRETURN(E_FAIL);
|
|
|
|
}
|
|
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Function: CLdap_ColumnsInfo::~CLdap_ColumnsInfo
|
|
//
|
|
// Synopsis: @mfunc Dtor
|
|
//
|
|
// Arguments:
|
|
//
|
|
// Returns: @rdesc NONE
|
|
//
|
|
// Modifies:
|
|
//
|
|
// History: 07/10/96 RenatoB Created
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
PUBLIC CLdap_ColumnsInfo::~CLdap_ColumnsInfo()
|
|
{
|
|
|
|
//
|
|
// Assume we are only being called by CLdap_RowProvider
|
|
// (i.e. backpointer) therefore we don't delete.
|
|
// Delete m_ColInfo, m_CharBuf, and release the memory allocator
|
|
//
|
|
if (m_pMalloc != NULL) {
|
|
if (m_ColInfo != NULL)
|
|
m_pMalloc->Free(m_ColInfo);
|
|
|
|
if (m_pwchBuf != NULL)
|
|
m_pMalloc->Free(m_pwchBuf);
|
|
|
|
m_pMalloc->Release();
|
|
}
|
|
|
|
}
|
|
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Function: CLdap_ColumnsInfo::QueryInterface
|
|
//
|
|
// Synopsis: @mfunc QueryInterface.
|
|
// We delegate to the CLdap_RowProvider.
|
|
//
|
|
// Called by: Client.
|
|
// Called when: Any time.
|
|
//
|
|
// Arguments:
|
|
//
|
|
// Returns: @rdesc HRESULT
|
|
//
|
|
// Modifies:
|
|
//
|
|
// History: 07/10/96 RenatoB Created
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
PUBLIC STDMETHODIMP
|
|
CLdap_ColumnsInfo::QueryInterface(
|
|
REFIID riid, // IN | Interface ID of the interface being queried for
|
|
LPVOID * ppv // OUT | Pointer to interface that was instantiated
|
|
)
|
|
{
|
|
return m_pObj->QueryInterface(riid, ppv);
|
|
}
|
|
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Function: CLdap_ColumnsInfo::AddRef
|
|
//
|
|
// Synopsis: @mfunc AddRef.
|
|
// We delegate to the CLdap_RowProvider.
|
|
//
|
|
// Called by: Client.
|
|
// Called when: Any time.
|
|
//
|
|
// Arguments:
|
|
//
|
|
// Returns: @rdesc Refcount
|
|
//
|
|
// Modifies:
|
|
//
|
|
// History: 07/10/96 RenatoB Created
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
PUBLIC STDMETHODIMP_(ULONG) CLdap_ColumnsInfo::AddRef()
|
|
{
|
|
return m_pObj->AddRef();
|
|
}
|
|
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Function: CLdap_ColumnsInfo::Release
|
|
//
|
|
// Synopsis: @mfunc Release.
|
|
// We delegate to the CLdap_RowProvider.
|
|
//
|
|
// Called by: Client.
|
|
// Called when: Any time.
|
|
//
|
|
// Arguments:
|
|
//
|
|
// Returns: @rdesc Refcount
|
|
//
|
|
// Modifies:
|
|
//
|
|
// History: 07/10/96 RenatoB Created
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
PUBLIC STDMETHODIMP_(ULONG) CLdap_ColumnsInfo::Release()
|
|
{
|
|
return m_pObj->Release();
|
|
}
|
|
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Function: CLdap_ColumnsInfo::GetColumnInfo
|
|
//
|
|
// Synopsis: @mfunc Get Column Info.
|
|
// Delegate.
|
|
//
|
|
// @rdesc See CColInfo::GetColumnInfo.
|
|
//
|
|
// Arguments:
|
|
//
|
|
// Returns: @rdesc See CColInfo::GetColumnInfo.
|
|
//
|
|
// Modifies:
|
|
//
|
|
// History: 07/10/96 RenatoB Created
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
PUBLIC STDMETHODIMP
|
|
CLdap_ColumnsInfo::GetColumnInfo(
|
|
DBORDINAL *pcColumns, //@parm OUT | .
|
|
DBCOLUMNINFO **prgInfo, //@parm OUT | .
|
|
WCHAR **ppStringsBuffer //@parm OUT | .
|
|
)
|
|
{
|
|
|
|
ULONG i, cChars, cCharDispl;
|
|
HRESULT hr= S_OK;
|
|
void* Null1 = NULL;
|
|
void* Null2 = NULL;
|
|
|
|
if ((pcColumns == NULL ) || (prgInfo == NULL) || (ppStringsBuffer == NULL))
|
|
BAIL_ON_FAILURE(hr=E_INVALIDARG);
|
|
|
|
*pcColumns= m_cColumns;
|
|
Null1 = m_pMalloc->Alloc(m_cColumns*sizeof(DBCOLUMNINFO));
|
|
if (Null1 == NULL) {
|
|
hr = E_OUTOFMEMORY;
|
|
goto error;
|
|
};
|
|
memset(Null1, 0, m_cColumns*sizeof(DBCOLUMNINFO));
|
|
memcpy( (void*) Null1, (void*) m_ColInfo,m_cColumns*sizeof(DBCOLUMNINFO));
|
|
*prgInfo = (DBCOLUMNINFO*) Null1;
|
|
|
|
cChars= m_pMalloc->GetSize(m_pwchBuf);
|
|
Null2 = m_pMalloc->Alloc(cChars);
|
|
if (Null2 == NULL) {
|
|
hr = E_OUTOFMEMORY;
|
|
goto error;
|
|
};
|
|
|
|
memset(Null2, 0, cChars);
|
|
memcpy( (void*) Null2, (void*)m_pwchBuf , cChars);
|
|
*ppStringsBuffer= (OLECHAR*) Null2;
|
|
|
|
for (i=0; i<m_cColumns; i++) {
|
|
cCharDispl = m_ColInfo[i].pwszName - m_pwchBuf;
|
|
(*prgInfo)[i].pwszName =(*ppStringsBuffer) + cCharDispl;
|
|
};
|
|
|
|
RRETURN(hr);
|
|
|
|
error:
|
|
if (Null1 != NULL)
|
|
m_pMalloc->Free(Null1);
|
|
if (Null2 != NULL)
|
|
m_pMalloc->Free(Null2);
|
|
|
|
*prgInfo = NULL;
|
|
*ppStringsBuffer = NULL;
|
|
*pcColumns= 0;
|
|
|
|
RRETURN(hr);
|
|
|
|
};
|
|
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Function: CLdap_ColumnsInfo::MapColumnIDs
|
|
//
|
|
// Synopsis: @mfunc Map Column IDs.
|
|
// Just delegate to the CColInfo object we have.
|
|
//
|
|
// @rdesc See CColInfo::MapColumnIDs.
|
|
//
|
|
// Arguments:
|
|
//
|
|
// Returns: @rdesc See CColInfo::MapColumnIDs
|
|
//
|
|
// Modifies:
|
|
//
|
|
// History: 07/10/96 RenatoB Created
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
PUBLIC STDMETHODIMP
|
|
CLdap_ColumnsInfo::MapColumnIDs(
|
|
DBORDINAL cColumnIDs, //@parm IN | .
|
|
const DBID rgColumnIDs[], //@parm IN | .
|
|
DBORDINAL rgColumns[] //@parm INOUT | .
|
|
)
|
|
{
|
|
// It is a logical (programming) error to fail here.
|
|
// this data must have already been established.
|
|
|
|
// Delegate the actual work.
|
|
ULONG found = 0;
|
|
DBORDINAL i;
|
|
|
|
if (cColumnIDs == 0)
|
|
RRETURN(S_OK);
|
|
|
|
if (rgColumnIDs == NULL || rgColumns == NULL)
|
|
RRETURN(E_INVALIDARG);
|
|
|
|
for (i=0; i<cColumnIDs; i++) {
|
|
if (rgColumnIDs[i].eKind!= DBKIND_PROPID) {
|
|
found = 1;
|
|
rgColumns[i]= DB_INVALIDCOLUMN;
|
|
}
|
|
else {
|
|
if ((rgColumnIDs[i].uName.ulPropid > 3) ||
|
|
(rgColumnIDs[i].uName.ulPropid<2)) {
|
|
found = 1;
|
|
rgColumns[i]= DB_INVALIDCOLUMN;
|
|
}
|
|
else rgColumns[i] = rgColumnIDs[i].uName.ulPropid -2;
|
|
}
|
|
}
|
|
|
|
if (found == 1)
|
|
RRETURN(DB_S_ERRORSOCCURRED);
|
|
else
|
|
return S_OK;
|
|
}
|
|
|
|
|