//----------------------------------------------------------------------------- // // 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; iFree(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; iFree(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 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; }