|
|
/********************************************************************
Copyright (c) 1999 Microsoft Corporation
Module Name: PCH_PrinterDriver.CPP
Abstract: WBEM provider class implementation for PCH_PrinterDriver class
Revision History:
Ghim-Sim Chua (gschua) 04/27/99 - Created
Kalyani Narlanka (kalyanin) 05/11/99 - Added Code to get all the properties for this class
********************************************************************/
#include "pchealth.h"
#include "PCH_PrinterDriver.h"
/////////////////////////////////////////////////////////////////////////////
// tracing stuff
#ifdef THIS_FILE
#undef THIS_FILE
#endif
static char __szTraceSourceFile[] = __FILE__; #define THIS_FILE __szTraceSourceFile
#define TRACE_ID DCID_PRINTERDRIVER
CPCH_PrinterDriver MyPCH_PrinterDriverSet (PROVIDER_NAME_PCH_PRINTERDRIVER, PCH_NAMESPACE) ;
// Property names
//===============
const static WCHAR* pTimeStamp = L"TimeStamp" ; const static WCHAR* pChange = L"Change" ; const static WCHAR* pDate = L"Date" ; const static WCHAR* pFilename = L"Filename" ; const static WCHAR* pManufacturer = L"Manufacturer" ; const static WCHAR* pName = L"Name" ; const static WCHAR* pSize = L"Size" ; const static WCHAR* pVersion = L"Version" ; const static WCHAR* pPath = L"Path" ;
/*****************************************************************************
* * FUNCTION : CPCH_PrinterDriver::EnumerateInstances * * DESCRIPTION : Returns all the instances of this class. * * INPUTS : A pointer to the MethodContext for communication with WinMgmt. * A long that contains the flags described in * IWbemServices::CreateInstanceEnumAsync. Note that the following * flags are handled by (and filtered out by) WinMgmt: * WBEM_FLAG_DEEP * WBEM_FLAG_SHALLOW * WBEM_FLAG_RETURN_IMMEDIATELY * WBEM_FLAG_FORWARD_ONLY * WBEM_FLAG_BIDIRECTIONAL * * RETURNS : WBEM_S_NO_ERROR if successful * * COMMENTS : TO DO: All instances on the machine should be returned here. * If there are no instances, return WBEM_S_NO_ERROR. * It is not an error to have no instances. * *****************************************************************************/ HRESULT CPCH_PrinterDriver::EnumerateInstances( MethodContext* pMethodContext, long lFlags ) {
TraceFunctEnter("CPCH_PrinterDriver::EnumerateInstances");
// Begin Declarations
HRESULT hRes = WBEM_S_NO_ERROR;
// Query String
CComBSTR bstrPrinterQuery = L"Select DeviceID, PortName FROM win32_printer";
// Instances
CComPtr<IEnumWbemClassObject> pPrinterEnumInst; CInstance *pPCHPrinterDriverInstance;
// SystemTime
SYSTEMTIME stUTCTime;
// Objects
IWbemClassObjectPtr pPrinterObj; IWbemClassObjectPtr pFileObj;
// Unsigned Longs....
ULONG ulPrinterRetVal = 0; ULONG uiReturn = 0;
// File Status structure
struct _stat filestat;
// Strings
CComBSTR bstrPrinterDriverWithPath; CComBSTR bstrPrinterDriver; CComBSTR bstrProperty; CComBSTR bstrDeviceID = L"DeviceID";
LPCWSTR lpctstrPortName = L"PortName"; LPCWSTR lpctstrFileSize = L"FileSize"; LPCWSTR lpctstrLastModified = L"LastModified"; LPCWSTR lpctstrManufacturer = L"Manufacturer"; LPCWSTR lpctstrVersion = L"Version"; LPCTSTR lpctstrComma = _T(","); LPCTSTR lpctstrDrvExtension = _T(".drv"); LPCTSTR lpctstrDevices = _T("Devices"); LPCWSTR lpctstrDeviceID = L"DeviceID";
TCHAR tchDeviceID[MAX_PATH];
TCHAR tchBuffer[MAX_PATH]; TCHAR *ptchToken;
CComVariant varValue; CComVariant varSnapshot = "Snapshot"; BOOL fDriverFound;
BOOL fCommit = FALSE;
// Get the date and time to update the TimeStamp Field
GetSystemTime(&stUTCTime);
// Execute the query to get DeviceID, PORTName FROM Win32_Printer
// Class.
// pPrinterEnumInst contains a pointer to the list of instances returned.
tchDeviceID[0] = 0;
hRes = ExecWQLQuery(&pPrinterEnumInst, bstrPrinterQuery); if (FAILED(hRes)) { // Cannot get any properties.
goto END; } // Query Succeeded!
// Enumerate the instances from pPrinterEnumInstance
// Get the next instance into pPrinterObj object.
while(WBEM_S_NO_ERROR == pPrinterEnumInst->Next(WBEM_INFINITE, 1, &pPrinterObj, &ulPrinterRetVal)) { // Create a new instance of PCH_PrinterDriver Class based on the passed-in MethodContext
CInstancePtr pPCHPrinterDriverInstance(CreateNewInstance(pMethodContext),false);
// Created a New Instance of PCH_PrinterDriver Successfully.
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
// TIME STAMP //
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
hRes = pPCHPrinterDriverInstance->SetDateTime(pTimeStamp, WBEMTime(stUTCTime)); if (FAILED(hRes)) { // Could not Set the Time Stamp
// Continue anyway
ErrorTrace(TRACE_ID, "SetDateTime on Timestamp Field failed."); }
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
// CHANGE //
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
hRes = pPCHPrinterDriverInstance->SetVariant(pChange, varSnapshot); if (FAILED(hRes)) { // Could not Set the Change Property
// Continue anyway
ErrorTrace(TRACE_ID, "SetCHString on Change Field failed."); }
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
// NAME //
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
hRes = CopyProperty(pPrinterObj, lpctstrDeviceID, pPCHPrinterDriverInstance, pName); if(SUCCEEDED(hRes)) { fCommit = TRUE; }
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
// PATH //
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
CopyProperty(pPrinterObj, lpctstrPortName, pPCHPrinterDriverInstance, pPath); /////////////////////////////////////////////////////////////////////////////////////////////////////////////
// FILENAME //
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Get the File Name i.e.driver from the INI file.
// Use the DeviceID of win32_printer class to get the PCH_Printer.FileName
// Get the device ID and use it to pick up the driver from win.ini File
hRes = pPrinterObj->Get(bstrDeviceID, 0, &varValue, NULL, NULL); if(SUCCEEDED(hRes)) { // Got the DeviceID
// Now call GetProfileString to get the Driver
USES_CONVERSION; _tcscpy(tchDeviceID,W2T(varValue.bstrVal)); if (GetProfileString(lpctstrDevices, tchDeviceID, "\0", tchBuffer, MAX_PATH) > 1) { // tchBuffer contains a string of two tokens, first the driver, second the PathName
// Get the driver
ptchToken = _tcstok(tchBuffer,lpctstrComma); if(ptchToken != NULL) { // Got the Driver Name
bstrPrinterDriver = ptchToken; varValue = ptchToken; // Use this to set the FileName
hRes = pPCHPrinterDriverInstance->SetVariant(pFilename, varValue); if (FAILED(hRes)) { // Could not Set the FileName Property
// Continue anyway
ErrorTrace(TRACE_ID, "Set Variant on Change Field failed."); }
// Now get the properties of the File
// Concatenate ".drv" to get the driver's actual Name
bstrPrinterDriver.Append(lpctstrDrvExtension);
// Get the Complete Path of the File
fDriverFound = getCompletePath(bstrPrinterDriver, bstrPrinterDriverWithPath); if (fDriverFound) { // Got the complete Path Call GetCIMDataFile Function to get
// properties of this file.
if (SUCCEEDED(GetCIMDataFile(bstrPrinterDriverWithPath, &pFileObj))) {
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
// VERSION //
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
CopyProperty(pFileObj, lpctstrVersion, pPCHPrinterDriverInstance, pVersion);
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
// FILESIZE //
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
CopyProperty(pFileObj, lpctstrFileSize, pPCHPrinterDriverInstance, pSize);
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
// DATE //
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
CopyProperty(pFileObj, lpctstrLastModified, pPCHPrinterDriverInstance, pDate);
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
// MANUFACTURER //
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
CopyProperty(pFileObj, lpctstrManufacturer, pPCHPrinterDriverInstance, pManufacturer);
} //end of SUCCEEDED...
} // end of if fDriverFound
} // end of if (ptchToken != NULL)
} // end of GetProfileString...
}// end of got the DeviceID
// All the properties are set. Commit the instance
hRes = pPCHPrinterDriverInstance->Commit(); if(FAILED(hRes)) { // Could not Commit the instance
ErrorTrace(TRACE_ID, "Could not commit the instance"); }
} // end of While
END: TraceFunctLeave(); return hRes;
}
|