135 lines
4.2 KiB
C++
135 lines
4.2 KiB
C++
/////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Microsoft WMIOLE DB Provider
|
|
// (C) Copyright 1999 Microsoft Corporation. All Rights Reserved.
|
|
//
|
|
// IDBCreateSession interface implementation
|
|
//
|
|
/////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
#include "headers.h"
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Creates a new DB Session object from the DSO, and returns the requested interface on the newly
|
|
// created object.
|
|
//
|
|
// HRESULT
|
|
// S_OK The method succeeded.
|
|
// E_INVALIDARG ppDBSession was NULL
|
|
// DB_E_NOAGGREGATION pUnkOuter was not NULL (this object does not support being aggregated)
|
|
// E_FAIL Provider-specific error. This provider can only create one DBSession
|
|
// E_OUTOFMEMORY Out of memory
|
|
// E_NOINTERFACE Could not obtain requested interface on DBSession object
|
|
//
|
|
/////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
STDMETHODIMP CImpIDBCreateSession::CreateSession(
|
|
IUnknown* pUnkOuter, //IN Controlling IUnknown if being aggregated
|
|
REFIID riid, //IN The ID of the interface
|
|
IUnknown** ppDBSession //OUT A pointer to memory in which to return the interface pointer
|
|
)
|
|
{
|
|
CDBSession* pDBSession = NULL;
|
|
HRESULT hr = S_OK;
|
|
CSetStructuredExceptionHandler seh;
|
|
|
|
TRY_BLOCK;
|
|
|
|
//================================
|
|
// Serialize the object
|
|
//================================
|
|
CAutoBlock cab(DATASOURCE->GetCriticalSection());
|
|
|
|
//=========================================================================
|
|
// check in-params and NULL out-params in case of error
|
|
//=========================================================================
|
|
if (ppDBSession){
|
|
*ppDBSession = NULL;
|
|
}
|
|
else{
|
|
hr = E_INVALIDARG;
|
|
}
|
|
assert( m_pObj );
|
|
|
|
//=========================================================================
|
|
// Check to see if the DSO is Uninitialized
|
|
//=========================================================================
|
|
if( hr == S_OK ){
|
|
if (!m_pObj->m_fDSOInitialized){
|
|
hr = E_UNEXPECTED;
|
|
}
|
|
else{
|
|
|
|
//=================================================================
|
|
// this Data Source object can only create 1 DBSession...
|
|
//=================================================================
|
|
if (m_pObj->m_fDBSessionCreated){
|
|
hr = DB_E_OBJECTCREATIONLIMITREACHED;
|
|
}
|
|
else{
|
|
|
|
//=============================================================
|
|
// We do not allow the riid to be anything other than
|
|
// IID_IUnknown for aggregation
|
|
//=============================================================
|
|
if ( (pUnkOuter) && (riid != IID_IUnknown) ){
|
|
hr = DB_E_NOAGGREGATION;
|
|
}
|
|
else{
|
|
|
|
hr = m_pObj->CreateSession(pUnkOuter,riid,ppDBSession);
|
|
/*
|
|
try
|
|
{
|
|
//=========================================================
|
|
// open a DBSession object
|
|
//=========================================================
|
|
pDBSession = new CDBSession( pUnkOuter );
|
|
}
|
|
catch(...)
|
|
{
|
|
SAFE_DELETE_PTR(pDBSession);
|
|
throw;
|
|
}
|
|
|
|
if (!pDBSession){
|
|
hr = E_OUTOFMEMORY;
|
|
}
|
|
else{
|
|
|
|
//=====================================================
|
|
// initialize the object
|
|
//=====================================================
|
|
if (FAILED(hr = pDBSession->FInit( m_pObj ))){
|
|
SAFE_DELETE_PTR( pDBSession );
|
|
}
|
|
else{
|
|
//=================================================
|
|
// get requested interface pointer on DBSession
|
|
//=================================================
|
|
hr = pDBSession->QueryInterface( riid, (void **) ppDBSession );
|
|
if (FAILED( hr )){
|
|
SAFE_DELETE_PTR( pDBSession );
|
|
}
|
|
else{
|
|
//=============================================
|
|
// all went well
|
|
//=============================================
|
|
m_pObj->m_fDBSessionCreated = TRUE;
|
|
}
|
|
}
|
|
}
|
|
|
|
*/
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
CATCH_BLOCK_HRESULT(hr,L"IDBCreateSession::CreateSession");
|
|
return hr;
|
|
}
|
|
|
|
|
|
|