/****************************************************************** PrintJob.CPP -- WMI provider class implementation Generated by Microsoft WMI Code Generation Engine TO DO: - See individual function headers - When linking, make sure you link to framedyd.lib & msvcrtd.lib (debug) or framedyn.lib & msvcrt.lib (retail). Description: ******************************************************************/ #include "pchealth.h" #include "PrintJob.h" ///////////////////////////////////////////////////////////////////////////// // tracing stuff #ifdef THIS_FILE #undef THIS_FILE #endif static char __szTraceSourceFile[] = __FILE__; #define THIS_FILE __szTraceSourceFile #define TRACE_ID DCID_PRINTERDRIVER ///////////////////////////////////////////////////////////////////////////// // initialization CPrintJob MyPrintJobSet (PROVIDER_NAME_PRINTJOB, PCH_NAMESPACE) ; ///////////////////////////////////////////////////////////////////////////// // Property names // PCH const static WCHAR *c_wszName = L"Name"; const static WCHAR *c_wszPagesPrinted = L"PagesPrinted"; const static WCHAR *c_wszSize = L"Size"; const static WCHAR *c_wszStatus = L"Status"; const static WCHAR *c_wszTimeSubmitted = L"TimeSubmitted"; const static WCHAR *c_wszUser = L"User"; const static WCHAR *c_wszDocument = L"Document"; // WMI const static WCHAR *c_wszNotify = L"Notify"; const static WCHAR *c_wszJobStatus = L"JobStatus"; ////////////////////////////////////////////////////////////////////////////// // construction / destruction // *************************************************************************** CPrintJob::CPrintJob(LPCWSTR lpwszName, LPCWSTR lpwszNameSpace) : Provider(lpwszName, lpwszNameSpace) { } // *************************************************************************** CPrintJob::~CPrintJob() { } ////////////////////////////////////////////////////////////////////////////// // internal methods // **************************************************************************** HRESULT CPrintJob::GetInstanceData(IWbemClassObjectPtr pObj, CInstance *pInstance) { // ** Name CopyProperty(pObj, c_wszName, pInstance, c_wszName); // ** Pages Printed CopyProperty(pObj, c_wszPagesPrinted, pInstance, c_wszPagesPrinted); // ** Size CopyProperty(pObj, c_wszSize, pInstance, c_wszSize); // ** JobStatus CopyProperty(pObj, c_wszJobStatus, pInstance, c_wszStatus); // ** TimeSubmitted CopyProperty(pObj, c_wszTimeSubmitted, pInstance, c_wszTimeSubmitted); // ** User CopyProperty(pObj, c_wszNotify, pInstance, c_wszUser); // ** Document CopyProperty(pObj, c_wszDocument, pInstance, c_wszDocument); return NOERROR; } ////////////////////////////////////////////////////////////////////////////// // exposed methods // *************************************************************************** HRESULT CPrintJob::EnumerateInstances(MethodContext *pMethodContext, long lFlags) { TraceFunctEnter("CPCH_PrintJob::EnumerateInstances"); IEnumWbemClassObject *pEnumInst = NULL; IWbemClassObjectPtr pObj = NULL; CComBSTR bstrQuery; HRESULT hr = WBEM_S_NO_ERROR; ULONG ulRetVal; TCHAR wszUser[1024]; DWORD cchUser = sizeof(wszUser) / sizeof(TCHAR); GetUserName(wszUser, &cchUser); // Execute the query bstrQuery = L"select Name, document, Notify, Size, JobStatus, TimeSubmitted, PagesPrinted from Win32_printJob"; hr = ExecWQLQuery(&pEnumInst, bstrQuery); if (FAILED(hr)) goto done; // enumerate the instances from Win32_PrintJob while(pEnumInst->Next(WBEM_INFINITE, 1, &pObj, &ulRetVal) == WBEM_S_NO_ERROR) { // Create a new instance based on the passed-in MethodContext CInstancePtr pInstance(CreateNewInstance(pMethodContext), FALSE); // since the old code didn't care if this failed, neither do I. hr = GetInstanceData(pObj, pInstance); // commit instance hr = pInstance->Commit(); if (FAILED(hr)) ErrorTrace(TRACE_ID, "Error committing instance"); // Ok, so WMI does not follow it's own docs on how GetObject // works. According to them, we should release this object here. But // if I try, winmgmt GPFs. // pObj->Release(); pObj = NULL; } done: if (pEnumInst != NULL) pEnumInst->Release(); TraceFunctLeave(); return hr; } // ***************************************************************************** HRESULT CPrintJob::ExecMethod(const CInstance& Instance, const BSTR bstrMethodName, CInstance *pInParams, CInstance *pOutParams, long lFlags) { return (WBEM_E_PROVIDER_NOT_CAPABLE); } // ***************************************************************************** HRESULT CPrintJob::GetObject(CInstance* pInstance, long lFlags) { TraceFunctEnter("CPrintJob::GetObject"); IWbemClassObjectPtr pObj = NULL; CComBSTR bstrPath; HRESULT hr = NOERROR; VARIANT var; TCHAR szDefault[MAX_PATH]; TCHAR *pchToken, *szDefName = NULL; DWORD i; VariantInit(&var); if (pInstance == NULL) { hr = E_INVALIDARG; goto done; } // get the name of the printer if (pInstance->GetVariant(c_wszName, var) == FALSE) { ErrorTrace(TRACE_ID, "Unable to fetch printer name"); hr = E_FAIL; goto done; } if (V_VT(&var) != VT_BSTR) { hr = VariantChangeType(&var, &var, 0, VT_BSTR); if (FAILED(hr)) { ErrorTrace(TRACE_ID, "VariantChangeType failed: 0x%08x", hr); goto done; } } // get the default printer & path if(GetProfileString(_T("Windows"), _T("Device"), "\0", szDefault, MAX_PATH) > 1) { // The Above GetProfileString returns "printerName", "PrinterDriver" // and "PrinterPath" seperated by commas. Ignore "PrinterDriver" // and use the other two to set the properties. pchToken = _tcstok(szDefault, _T(",")); if(pchToken != NULL) { // ** default name szDefName = pchToken; } } // build the path to the object bstrPath = L"\\\\.\\root\\cimv2:Win32_PrintJob.Name=\""; bstrPath.Append(V_BSTR(&var)); bstrPath.Append("\""); // fetch it hr = GetCIMObj(bstrPath, &pObj, lFlags); if (FAILED(hr)) goto done; // populate the CInstance object hr = GetInstanceData(pObj, pInstance); if (FAILED(hr)) goto done; // All the properties are set. Commit the instance hr = pInstance->Commit(); if(FAILED(hr)) ErrorTrace(TRACE_ID, "Could not commit instance: 0x%08x", hr); done: VariantClear(&var); // Ok, so WMI does not follow it's own docs on how GetObject // works. According to them, we should release this object here. But // if I try, winmgmt GPFs. // if (pObj != NULL) // pObj->Release(); TraceFunctLeave(); return hr; } // ***************************************************************************** HRESULT CPrintJob::ExecQuery(MethodContext *pMethodContext, CFrameworkQuery& Query, long lFlags) { return WBEM_E_PROVIDER_NOT_CAPABLE; } // ***************************************************************************** HRESULT CPrintJob::PutInstance(const CInstance& Instance, long lFlags) { return WBEM_E_PROVIDER_NOT_CAPABLE; } // ***************************************************************************** HRESULT CPrintJob::DeleteInstance(const CInstance& Instance, long lFlags) { return WBEM_E_PROVIDER_NOT_CAPABLE; }