143 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			143 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
// ODBCDriverSoftwareElement.cpp: implementation of the CODBCDriverSoftwareElement class.
 | 
						|
 | 
						|
//
 | 
						|
 | 
						|
// Copyright (c) 1997-2001 Microsoft Corporation, All Rights Reserved
 | 
						|
//
 | 
						|
//////////////////////////////////////////////////////////////////////
 | 
						|
 | 
						|
#include "precomp.h"
 | 
						|
#include "ODBCDriverSoftwareElement.h"
 | 
						|
 | 
						|
#include "ExtendString.h"
 | 
						|
 | 
						|
//////////////////////////////////////////////////////////////////////
 | 
						|
// Construction/Destruction
 | 
						|
//////////////////////////////////////////////////////////////////////
 | 
						|
 | 
						|
CODBCDriverSoftwareElement::CODBCDriverSoftwareElement(CRequestObject *pObj, IWbemServices *pNamespace,
 | 
						|
                                   IWbemContext *pCtx):CGenericClass(pObj, pNamespace, pCtx)
 | 
						|
{
 | 
						|
 | 
						|
}
 | 
						|
 | 
						|
CODBCDriverSoftwareElement::~CODBCDriverSoftwareElement()
 | 
						|
{
 | 
						|
 | 
						|
}
 | 
						|
 | 
						|
HRESULT CODBCDriverSoftwareElement::CreateObject(IWbemObjectSink *pHandler, ACTIONTYPE atAction)
 | 
						|
{
 | 
						|
    HRESULT hr = WBEM_S_NO_ERROR;
 | 
						|
 | 
						|
	MSIHANDLE hView		= NULL;
 | 
						|
	MSIHANDLE hRecord	= NULL;
 | 
						|
 | 
						|
    int i = -1;
 | 
						|
    WCHAR wcBuf[BUFF_SIZE];
 | 
						|
    WCHAR wcQuery[BUFF_SIZE];
 | 
						|
    WCHAR wcProductCode[39];
 | 
						|
    WCHAR wcProp[BUFF_SIZE];
 | 
						|
    DWORD dwBufSize;
 | 
						|
    bool bMatch = false;
 | 
						|
    UINT uiStatus;
 | 
						|
 | 
						|
	CStringExt str;
 | 
						|
 | 
						|
    //These will change from class to class
 | 
						|
    bool bFeature, bElement;
 | 
						|
 | 
						|
	// safe operation
 | 
						|
	// lenght is smaller than BUFF_SIZE ( 512 )
 | 
						|
    wcscpy(wcQuery, L"select distinct `Component_`, `Driver` from ODBCDriver");
 | 
						|
 | 
						|
    while(!bMatch && m_pRequest->Package(++i) && (hr != WBEM_E_CALL_CANCELLED))
 | 
						|
	{
 | 
						|
		// safe operation:
 | 
						|
		// Package ( i ) returns NULL ( tested above ) or valid WCHAR [39]
 | 
						|
 | 
						|
        wcscpy(wcProductCode, m_pRequest->Package(i));
 | 
						|
        
 | 
						|
		//Open our database
 | 
						|
 | 
						|
        try
 | 
						|
		{
 | 
						|
            if ( GetView ( &hView, wcProductCode, wcQuery, L"ODBCDriver", TRUE, FALSE ) )
 | 
						|
			{
 | 
						|
                uiStatus = g_fpMsiViewFetch(hView, &hRecord);
 | 
						|
 | 
						|
                while(!bMatch && (uiStatus != ERROR_NO_MORE_ITEMS) && (hr != WBEM_E_CALL_CANCELLED)){
 | 
						|
                    CheckMSI(uiStatus);
 | 
						|
 | 
						|
                    if(FAILED(hr = SpawnAnInstance(&m_pObj))) throw hr;
 | 
						|
 | 
						|
                //----------------------------------------------------
 | 
						|
                    dwBufSize = BUFF_SIZE;
 | 
						|
                    CheckMSI(g_fpMsiRecordGetStringW(hRecord, 1, wcBuf, &dwBufSize));
 | 
						|
 | 
						|
					dwBufSize = BUFF_SIZE;
 | 
						|
					uiStatus = CreateSoftwareElementString (	msidata.GetDatabase(),
 | 
						|
																wcBuf,
 | 
						|
																wcProductCode,
 | 
						|
																wcProp,
 | 
						|
																&dwBufSize
 | 
						|
														   );
 | 
						|
 | 
						|
					if ( uiStatus == ERROR_SUCCESS )
 | 
						|
					{
 | 
						|
                        PutKeyProperty(m_pObj, pElement, wcProp, &bElement, m_pRequest);
 | 
						|
 | 
						|
                        dwBufSize = BUFF_SIZE;
 | 
						|
                        CheckMSI(g_fpMsiRecordGetStringW(hRecord, 2, wcBuf, &dwBufSize));
 | 
						|
 | 
						|
                        if(wcscmp(wcBuf, L"") != 0)
 | 
						|
						{
 | 
						|
							// safe operation
 | 
						|
                            str.Copy ( L"Win32_ODBCDriverSpecification.CheckID=\"" );
 | 
						|
							str.Append ( 3, wcBuf, wcProductCode, L"\"" );
 | 
						|
							PutKeyProperty(m_pObj, pCheck, str, &bFeature, m_pRequest);
 | 
						|
 | 
						|
                            if(bFeature && bElement) bMatch = true;
 | 
						|
 | 
						|
                            if((atAction != ACTIONTYPE_GET)  || bMatch){
 | 
						|
 | 
						|
                                hr = pHandler->Indicate(1, &m_pObj);
 | 
						|
                            }
 | 
						|
                        }
 | 
						|
                    }
 | 
						|
 | 
						|
                    m_pObj->Release();
 | 
						|
                    m_pObj = NULL;
 | 
						|
                
 | 
						|
                    g_fpMsiCloseHandle(hRecord);
 | 
						|
 | 
						|
					uiStatus = g_fpMsiViewFetch(hView, &hRecord);
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
		catch(...)
 | 
						|
		{
 | 
						|
            g_fpMsiCloseHandle(hRecord);
 | 
						|
            g_fpMsiViewClose(hView);
 | 
						|
            g_fpMsiCloseHandle(hView);
 | 
						|
 | 
						|
			msidata.CloseDatabase ();
 | 
						|
 | 
						|
			if(m_pObj)
 | 
						|
			{
 | 
						|
				m_pObj->Release();
 | 
						|
				m_pObj = NULL;
 | 
						|
			}
 | 
						|
 | 
						|
            throw;
 | 
						|
        }
 | 
						|
 | 
						|
        g_fpMsiCloseHandle(hRecord);
 | 
						|
        g_fpMsiViewClose(hView);
 | 
						|
        g_fpMsiCloseHandle(hView);
 | 
						|
 | 
						|
		msidata.CloseDatabase ();
 | 
						|
    }
 | 
						|
 | 
						|
    return hr;
 | 
						|
} |