/**************************************************************************** Copyright information : Copyright (c) 1998-2002 Microsoft Corporation File Name : FormatEngine.cpp Project Name : WMI Command Line Author Name : Ch. Sriramachandramurthy Date of Creation (dd/mm/yy) : 27th-September-2000 Version Number : 1.0 Brief Description : The Format Engine is primarily responsible for displaying the a) the data views for the management areas by using predefined XSL style sheets b) the property update/method execution status c) error messages and d) display of usage information. It depends on the output of Parsing and/or Format Engine. Revision History : Last Modified By : Ch. Sriramachandramurthy Last Modified Date : 11th-April-2001 ******************************************************************************/ // FormatEngine.cpp : implementation file // #include "Precomp.h" #include "CommandSwitches.h" #include "GlobalSwitches.h" #include "HelpInfo.h" #include "ErrorLog.h" #include "ParsedInfo.h" #include "ErrorInfo.h" #include "WMICliXMLLog.h" #include "FormatEngine.h" #include "CmdTokenizer.h" #include "CmdAlias.h" #include "ParserEngine.h" #include "ExecEngine.h" #include "WmiCmdLn.h" #include "OutputStream.h" /*------------------------------------------------------------------------ Name :CFormatEngine Synopsis :This function initializes the member variables when an object of the class type is instantiated. Type :Constructor Input parameter :None Output parameters :None Return Type :None Global Variables :None Calling Syntax :None Notes :None ------------------------------------------------------------------------*/ CFormatEngine::CFormatEngine() { m_pIXMLDoc = NULL; m_pIXSLDoc = NULL; m_bRecord = FALSE; m_bTrace = FALSE; m_bHelp = FALSE; m_bGetOutOpt = TRUE; m_bGetAppendFilePinter = TRUE; m_bGetOutputFilePinter = TRUE; m_bLog = TRUE; m_bInteractiveHelp = FALSE; m_bOutputGoingToStream = FALSE; } /*------------------------------------------------------------------------ Name :~CFormatEngine Synopsis :Destructor Type :Destructor Input parameter :None Output parameters :None Return Type :None Global Variables :None Calling Syntax :None Notes :None ------------------------------------------------------------------------*/ CFormatEngine::~CFormatEngine() { Uninitialize(TRUE); } /*------------------------------------------------------------------------ Name :CreateEmptyDocument Synopsis :Creates an empty XML Document and returns the same in Passed Parameter. Type :Member Function Input parameter : Output parameters :None pDoc - Pointer to pointer to IXMLDOMDocument2 Interface Return Type :HRESULT Global Variables :None Calling Syntax :CreateEmptyDocument(&pIXMLDoc) Notes :None ------------------------------------------------------------------------*/ HRESULT CFormatEngine::CreateEmptyDocument(IXMLDOMDocument2** pIDoc) { // Create an empty XML document return CoCreateInstance(CLSID_FreeThreadedDOMDocument, NULL, CLSCTX_INPROC_SERVER, IID_IXMLDOMDocument2, (LPVOID*)pIDoc); } /*------------------------------------------------------------------------ Name :Uninitialize Synopsis :Carries out the releasing process. Type :Member Function Input parameter :None Output parameters :None Return Type :void Global Variables :None Calling Syntax :Uninitialize() Notes :None ------------------------------------------------------------------------*/ void CFormatEngine::Uninitialize(BOOL bFinal) { // Release the interface pointers SAFEIRELEASE(m_pIXMLDoc); SAFEIRELEASE(m_pIXSLDoc); m_bTrace = FALSE; m_eloErrLogOpt = NO_LOGGING; m_bHelp = FALSE; m_bGetOutOpt = TRUE; m_bGetAppendFilePinter = TRUE; m_bGetOutputFilePinter = TRUE; m_bLog = TRUE; m_bInteractiveHelp = FALSE; m_bOutputGoingToStream = FALSE; m_chsOutput.Empty(); // Uninitialize the ErrInfo object m_ErrInfo.Uninitialize(); // Erase the help vector if ( !m_cvHelp.empty() ) { if (m_cvHelp.size()) { CHARVECTOR::iterator theIterator = m_cvHelp.begin(); while (theIterator != m_cvHelp.end()) { SAFEDELETE(*theIterator); theIterator++; } } m_cvHelp.erase(m_cvHelp.begin(), m_cvHelp.end()); } m_WmiCliLog.Uninitialize(bFinal); } /*------------------------------------------------------------------------ Name :ApplyXSLFormatting Synopsis :Applies a XSL style sheet containing format of the display to a XML stream containing result set. Type :Member Function Input parameter : rParsedInfo - reference to CParsedInfo class object Output parameters : rParsedInfo - reference to CParsedInfo class object Return Type :BOOL Global Variables :None Calling Syntax :ApplyXSLFormatting(rParsedInfo); Notes :None ------------------------------------------------------------------------*/ BOOL CFormatEngine::ApplyXSLFormatting(CParsedInfo& rParsedInfo) { BOOL bRet = TRUE; DWORD dwThreadId = GetCurrentThreadId(); if ( g_wmiCmd.GetBreakEvent() == TRUE ) { bRet = TRUE; } // If the XML stream is empty (or) XSL file path is empty // set the return value as FALSE. else if (!rParsedInfo.GetCmdSwitchesObject().GetXMLResultSet() || rParsedInfo.GetCmdSwitchesObject().GetXSLTDetailsVector().empty()) { bRet = FALSE; } else { HRESULT hr = S_OK; //BSTR bstrOutput = NULL; _bstr_t bstrOutput; CHString chsMsg; VARIANT_BOOL varBool = VARIANT_FALSE; VARIANT varXSL; VariantInit(&varXSL); try { // Create an empty XML Document hr = CreateEmptyDocument(&m_pIXMLDoc); if (m_bTrace || m_eloErrLogOpt) { chsMsg.Format(L"CoCreateInstance(CLSID_FreeThreadedDOMDocument, NULL," L" CLSCTX_INPROC_SERVER, IID_IXMLDOMDocument2, -)"); WMITRACEORERRORLOG(hr, __LINE__, __FILE__, (LPCWSTR)chsMsg, dwThreadId, rParsedInfo, m_bTrace); } ONFAILTHROWERROR(hr); BOOL bFlag = FALSE; BOOL bTranslateTable = FALSE; // If Translate table name is given and before format switch // translate switch is given then set the flag if( rParsedInfo.GetCmdSwitchesObject(). GetTranslateTableName() != NULL && rParsedInfo.GetCmdSwitchesObject(). GetTranslateFirstFlag() == TRUE) { bTranslateTable = TRUE; } // If Translate table name is given then translate // the XML node list if ( bTranslateTable == TRUE ) { bFlag = TraverseNode(rParsedInfo); } else { // Load XML content hr = m_pIXMLDoc->loadXML(rParsedInfo.GetCmdSwitchesObject(). GetXMLResultSet(), &varBool); if (m_bTrace || m_eloErrLogOpt) { WMITRACEORERRORLOG(hr, __LINE__, __FILE__, _T("IXMLDOMDocument::loadXML(-, -)"), dwThreadId, rParsedInfo, m_bTrace); } ONFAILTHROWERROR(hr); } // If loading the XML document is successful or if translate table // name is given and translation is successful if( (bTranslateTable == TRUE && bFlag == TRUE) || (bTranslateTable == FALSE && varBool == VARIANT_TRUE) ) { bRet = DoCascadeTransforms(rParsedInfo, bstrOutput); if (bRet) { STRING strOutput((_TCHAR*)bstrOutput); // If /TRANSLATE: is specified and after format // switch translate switch is given then translate the // result if ( bTranslateTable == FALSE) { // Translate the result ApplyTranslateTable(strOutput, rParsedInfo); } bRet = TRUE; if (m_bRecord && m_bLog && !m_bInteractiveHelp) { hr = m_WmiCliLog.WriteToXMLLog(rParsedInfo, _bstr_t(strOutput.data())); if (FAILED(hr)) { m_WmiCliLog.StopLogging(); m_bRecord = FALSE; hr = S_OK; DisplayString(IDS_E_WRITELOG_FAILED, FALSE, NULL, TRUE); } m_bLog = FALSE; } // Display the result DisplayLargeString(rParsedInfo, strOutput); bRet = TRUE; } } else { // Invalid XML content. rParsedInfo.GetCmdSwitchesObject() .SetErrataCode(IDS_E_INVALID_XML_CONTENT); bRet = FALSE; } } catch(_com_error& e) { // Set the COM error. rParsedInfo.GetCmdSwitchesObject().SetCOMError(e); bRet = FALSE; } catch(CHeap_Exception) { hr = WBEM_E_OUT_OF_MEMORY; _com_issue_error(hr); } } return bRet; } /*------------------------------------------------------------------------ Name :DisplayResults Synopsis :Displays the result referring CcommandSwitches and CGlobalSwitches Objects of the CParsedInfo object. Type :Member Function Input parameter : rParsedInfo - reference to CParsedInfo class object bInteractiveHelp TRUE - indicates intermediate help display in interactive mode FALSE - indicates results display in normal mode Output parameters : rParsedInfo - reference to CParsedInfo class object Return Type :BOOL Global Variables :None Calling Syntax :DisplayResults(rParsedInfo, bInteractiveHelp) Notes :None ------------------------------------------------------------------------*/ BOOL CFormatEngine::DisplayResults(CParsedInfo& rParsedInfo, BOOL bInteractiveHelp) { BOOL bRet = TRUE; DWORD dwThreadId = GetCurrentThreadId(); _TCHAR* pszVerbName = NULL; BOOL bLog = TRUE; HRESULT hr = S_OK; m_bInteractiveHelp = bInteractiveHelp; // Frame the command part of the log entry: // "command: <>" try { CHString chsCmdMsg(_T("command: ")); chsCmdMsg += rParsedInfo.GetCmdSwitchesObject().GetCommandInput(); // Get the TRACE status and store it in m_bTrace m_bTrace = rParsedInfo.GetGlblSwitchesObject().GetTraceStatus(); // Get the Logging mode (VERBOSE | ERRORONLY | NOLOGGING) and store // it in m_eloErrLogOpt m_eloErrLogOpt = rParsedInfo.GetErrorLogObject().GetErrLogOption(); // Get the output option to redirect the output. m_opsOutputOpt = rParsedInfo.GetGlblSwitchesObject(). GetOutputOrAppendOption(TRUE); m_bGetOutOpt = FALSE; // FALSE for getting append file pointer. m_fpAppendFile = rParsedInfo.GetGlblSwitchesObject(). GetOutputOrAppendFilePointer(FALSE); m_bGetAppendFilePinter = FALSE; // TRUE for getting out file pointer. m_fpOutFile = rParsedInfo.GetGlblSwitchesObject(). GetOutputOrAppendFilePointer(TRUE); m_bGetOutputFilePinter = FALSE; // If /RECORD global switch has been specified, create the log file // and write the input command. if (rParsedInfo.GetGlblSwitchesObject().GetRPChangeStatus()) { // Stop logging m_WmiCliLog.StopLogging(); if (rParsedInfo.GetGlblSwitchesObject().GetRecordPath() != NULL) { if (!rParsedInfo.GetCmdSwitchesObject().GetEverySwitchFlag()) { // Set the log file path m_WmiCliLog.SetLogFilePath(rParsedInfo. GetGlblSwitchesObject().GetRecordPath()); // Set the m_bRecord flag to TRUE m_bRecord = TRUE; // Set the recordpath change flag to FALSE rParsedInfo.GetGlblSwitchesObject(). SetRPChangeStatus(FALSE); } } else { // Set the m_bRecord flag to FALSE m_bRecord = FALSE; } // Get Token vector CHARVECTOR cvTokens = g_wmiCmd.GetTokenVector(); // if command consist of only /RECORD switch option then don't // record it. (It will come here only when /RECORD is given) if (cvTokens.size() <= 4) m_bLog = FALSE; } //If the COM error is not NULL , then display the error if (rParsedInfo.GetCmdSwitchesObject().GetCOMError() != NULL) { DisplayCOMError(rParsedInfo); } // Check the success flag , display error in case error flag is set. else if (!rParsedInfo.GetCmdSwitchesObject().GetSuccessFlag()) { _bstr_t bstrErrMsg; if (IDS_E_ALIAS_NOT_FOUND == rParsedInfo.GetCmdSwitchesObject() .GetErrataCode()) { WMIFormatMessage(IDS_E_ALIAS_NOT_FOUND, 1, bstrErrMsg, rParsedInfo.GetCmdSwitchesObject(). GetAliasName()); DisplayString((LPTSTR) bstrErrMsg, TRUE, TRUE); } else if (IDS_E_INVALID_CLASS == rParsedInfo.GetCmdSwitchesObject() .GetErrataCode()) { WMIFormatMessage(IDS_E_INVALID_CLASS, 1, bstrErrMsg, rParsedInfo.GetCmdSwitchesObject(). GetClassPath()); DisplayString((LPTSTR) bstrErrMsg, TRUE, TRUE); } else DisplayString(rParsedInfo.GetCmdSwitchesObject(). GetErrataCode(), TRUE, NULL, TRUE); if ( m_eloErrLogOpt ) { chsCmdMsg += _T(", Utility returned error ID."); // explicit error -1 to specify errata code. WMITRACEORERRORLOG(-1, __LINE__, __FILE__, (LPCWSTR)chsCmdMsg, dwThreadId, rParsedInfo, FALSE, rParsedInfo.GetCmdSwitchesObject().GetErrataCode()); } } //if the help has been specified , FrameHelpVector is called . else if (rParsedInfo.GetGlblSwitchesObject().GetHelpFlag()) { m_bHelp = TRUE; // Form help vector FrameHelpVector(rParsedInfo); // Display paged help DisplayPagedHelp(rParsedInfo); if ( m_eloErrLogOpt ) WMITRACEORERRORLOG(S_OK, __LINE__, __FILE__, (LPCWSTR)chsCmdMsg, dwThreadId, rParsedInfo, FALSE); } else { // Get the verb name pszVerbName = rParsedInfo.GetCmdSwitchesObject(). GetVerbName(); // Check the information code if (rParsedInfo.GetCmdSwitchesObject().GetInformationCode()) { DisplayString(rParsedInfo.GetCmdSwitchesObject(). GetInformationCode()); if ( m_eloErrLogOpt ) { WMITRACEORERRORLOG(S_OK, __LINE__, __FILE__, (LPCWSTR)chsCmdMsg, dwThreadId, rParsedInfo, FALSE); } } else if ( CompareTokens(pszVerbName, CLI_TOKEN_LIST) || CompareTokens(pszVerbName, CLI_TOKEN_ASSOC) || CompareTokens(pszVerbName, CLI_TOKEN_GET) || m_bInteractiveHelp) { //If XSL file is not specified - pick the default XSL. if(rParsedInfo.GetCmdSwitchesObject().GetXSLTDetailsVector(). empty()) { if(IsClassOperation(rParsedInfo)) { rParsedInfo.GetCmdSwitchesObject(). ClearXSLTDetailsVector(); //default format is MOF if CLASS bRet = FrameFileAndAddToXSLTDetVector ( XSL_FORMAT_MOF, CLI_TOKEN_MOF, rParsedInfo ); } else { rParsedInfo.GetCmdSwitchesObject(). ClearXSLTDetailsVector(); // Default format is TABLE if an alias or path // with where expression or with keyclause bRet = FrameFileAndAddToXSLTDetVector ( XSL_FORMAT_TABLE, CLI_TOKEN_TABLE, rParsedInfo ); } if (bInteractiveHelp && !CompareTokens(pszVerbName, CLI_TOKEN_ASSOC)) { rParsedInfo.GetCmdSwitchesObject(). ClearXSLTDetailsVector(); //otherwise go with LIST bRet = FrameFileAndAddToXSLTDetVector ( XSL_FORMAT_TEXTVALUE, CLI_TOKEN_TEXTVALUE, rParsedInfo ); } } // If result set is not empty if (!(!rParsedInfo.GetCmdSwitchesObject().GetXMLResultSet())) { // Apply the XSL formatting. bRet = ApplyXSLFormatting(rParsedInfo); // If XSL formatting fails if (!bRet) { //If the COM error is not NULL , then display the error if (rParsedInfo.GetCmdSwitchesObject(). GetCOMError() != NULL) { DisplayCOMError(rParsedInfo); } else { DisplayString(rParsedInfo. GetCmdSwitchesObject().GetErrataCode(), TRUE, NULL, TRUE); if ( m_eloErrLogOpt ) { chsCmdMsg += _T(", Utility returned error ID."); // explicit error -1 to specify errata code. WMITRACEORERRORLOG(-1, __LINE__, __FILE__, (LPCWSTR)chsCmdMsg, dwThreadId, rParsedInfo, FALSE, rParsedInfo.GetCmdSwitchesObject(). GetErrataCode()); } } } if ( m_eloErrLogOpt ) { HRESULT hrTemp; if ( g_wmiCmd.GetSessionErrorLevel() != 0) hrTemp = -1; else hrTemp = S_OK; WMITRACEORERRORLOG(hrTemp, __LINE__, __FILE__, (LPCWSTR)chsCmdMsg, dwThreadId, rParsedInfo, FALSE); } } else { if (CompareTokens(pszVerbName, CLI_TOKEN_ASSOC)) { if (m_bRecord && m_bLog) { hr = m_WmiCliLog.WriteToXMLLog(rParsedInfo, _bstr_t((LPCWSTR)m_chsOutput)); if (FAILED(hr)) { m_WmiCliLog.StopLogging(); m_bRecord = FALSE; hr = S_OK; DisplayString(IDS_E_WRITELOG_FAILED, FALSE, NULL, TRUE); } m_bLog = FALSE; } } } } //SET, DELETE, CREATE verbs - on successfully invoked else { if (m_bRecord && m_bLog) { hr = m_WmiCliLog.WriteToXMLLog(rParsedInfo, _bstr_t((LPCWSTR)m_chsOutput)); if (FAILED(hr)) { m_WmiCliLog.StopLogging(); m_bRecord = FALSE; hr = S_OK; DisplayString(IDS_E_WRITELOG_FAILED, FALSE, NULL, TRUE); } m_bLog = FALSE; } } } } // To handle COM exception catch (_com_error& e) { rParsedInfo.GetCmdSwitchesObject().SetCOMError(e); bRet = FALSE; } // To handle user-defined exceptions catch(WMICLIINT nVal) { // If memory allocation failed. if (nVal == OUT_OF_MEMORY) { rParsedInfo.GetCmdSwitchesObject().SetErrataCode(OUT_OF_MEMORY); } bRet = FALSE; } //trap for CHeap_Exception catch(CHeap_Exception) { hr = WBEM_E_OUT_OF_MEMORY; _com_issue_error(hr); } catch(DWORD dwError) { // If Win32 function call failed. ::SetLastError(dwError); rParsedInfo.GetCmdSwitchesObject().SetErrataCode(dwError); DisplayWin32Error(); ::SetLastError(dwError); bRet = FALSE; } return bRet; } /*------------------------------------------------------------------------ Name :DisplayGETUsage Synopsis :Displays GET usage. Type :Member Function Input parameter : rParsedInfo - reference to CParsedInfo class object Output parameters :None Return Type :void Global Variables :None Calling Syntax :DisplayGETUsage(rParsedInfo) Notes :None ------------------------------------------------------------------------*/ void CFormatEngine::DisplayGETUsage(CParsedInfo& rParsedInfo) { BOOL bClass = FALSE; if(IsClassOperation(rParsedInfo)) { bClass = TRUE; } if(!bClass) { DisplayInvalidProperties(rParsedInfo); if (rParsedInfo.GetHelpInfoObject().GetHelp(GETSwitchesOnly) == FALSE) { if ( rParsedInfo.GetCmdSwitchesObject(). GetPropertyList().size() == 0 ) { // Display the usage of the GET verb DisplayString(IDS_I_NEWLINE); DisplayString(IDS_I_GET_DESC); DisplayString(IDS_I_USAGE); DisplayString(IDS_I_NEWLINE); DisplayString(IDS_I_GET_USAGE); DisplayString(IDS_I_PROPERTYLIST_NOTE1); } // Display the properties DisplayPropertyDetails(rParsedInfo); } } else { // Display the usage of the CLASS GET verb DisplayString(IDS_I_NEWLINE); DisplayString(IDS_I_CLASS_GET_DESC); DisplayString(IDS_I_USAGE); DisplayString(IDS_I_NEWLINE); DisplayString(IDS_I_CLASS_GET_USAGE); } // Enumerate the available GET switches DisplayString(IDS_I_NEWLINE); DisplayString(IDS_I_GET_SWITCH_HEAD); DisplayString(IDS_I_NEWLINE); DisplayString(IDS_I_GET_SWITCH_VALUE); DisplayString(IDS_I_GET_SWITCH_ALL); DisplayString(IDS_I_SWITCH_TRANSLATE); DisplayString(IDS_I_SWITCH_EVERY); DisplayString(IDS_I_SWITCH_FORMAT); DisplayString(IDS_I_NEWLINE); DisplayString(IDS_I_TRANSFORMAT_NOTE1); DisplayString(IDS_I_TRANSFORMAT_NOTE2); DisplayString(IDS_I_TRANSFORMAT_NOTE3); } /*------------------------------------------------------------------------ Name :DisplayLISTUsage Synopsis :Displays LIST usage. Type :Member Function Input parameter : rParsedInfo - reference to CParsedInfo class object Output parameters :None Return Type :void Global Variables :None Calling Syntax :DisplayLISTUsage(rParsedInfo) Notes :None ------------------------------------------------------------------------*/ void CFormatEngine::DisplayLISTUsage(CParsedInfo& rParsedInfo) { try { if (rParsedInfo.GetHelpInfoObject().GetHelp(LISTSwitchesOnly) == FALSE) { // Display the usage of the LIST verb DisplayString(IDS_I_NEWLINE); DisplayString(IDS_I_LIST_DESC); DisplayString(IDS_I_USAGE); DisplayString(IDS_I_NEWLINE); DisplayString(IDS_I_LIST_USAGE); ALSFMTDETMAP afdAlsFmtDet = rParsedInfo. GetCmdSwitchesObject(). GetAliasFormatDetMap(); ALSFMTDETMAP::iterator theIterator; if ( afdAlsFmtDet.empty() ) { // If no list formats are available/defined for the // alias specified. DisplayString(IDS_I_NEWLINE); DisplayString(IDS_I_LIST_NOFORMATS); } else { // Display the available/defined LIST formats for // the alias specified. DisplayString(IDS_I_NEWLINE); DisplayString(IDS_I_LIST_FMT_HEAD); DisplayString(IDS_I_NEWLINE); for ( theIterator = afdAlsFmtDet.begin(); theIterator != afdAlsFmtDet.end(); theIterator++ ) { _bstr_t bstrProps = _bstr_t(""); // Print props associated with the format. BSTRVECTOR bvProps = (*theIterator).second; BSTRVECTOR::iterator propIterator; for ( propIterator = bvProps.begin(); propIterator != bvProps.end(); propIterator++ ) { if ( propIterator != bvProps.begin() ) bstrProps += _bstr_t(", "); bstrProps += *propIterator; } _TCHAR szMsg[MAX_BUFFER] = NULL_STRING; _stprintf(szMsg, _T("%-25s - %s\r\n"), (_TCHAR*)(*theIterator).first, (_TCHAR*)bstrProps); DisplayString(szMsg); } } } // Display the LIST switches DisplayString(IDS_I_NEWLINE); DisplayString(IDS_I_LIST_SWITCH_HEAD); DisplayString(IDS_I_NEWLINE); DisplayString(IDS_I_SWITCH_TRANSLATE); DisplayString(IDS_I_SWITCH_EVERY); DisplayString(IDS_I_SWITCH_FORMAT); DisplayString(IDS_I_NEWLINE); DisplayString(IDS_I_TRANSFORMAT_NOTE1); DisplayString(IDS_I_TRANSFORMAT_NOTE2); DisplayString(IDS_I_TRANSFORMAT_NOTE3); } catch(_com_error& e) { _com_issue_error(e.Error()); } } /*------------------------------------------------------------------------ Name :DisplayCALLUsage Synopsis :Displays CALL usage. Type :Member Function Input parameter : rParsedInfo - reference to CParsedInfo class object Output parameters :None Return Type :void Global Variables :None Calling Syntax :DisplayCALLUsage(rParsedInfo) Notes :None ------------------------------------------------------------------------*/ void CFormatEngine::DisplayCALLUsage(CParsedInfo& rParsedInfo) { // Display the usage of the CALL verb DisplayString(IDS_I_NEWLINE); DisplayString(IDS_I_CALL_DESC); DisplayString(IDS_I_USAGE); DisplayString(IDS_I_NEWLINE); DisplayString(IDS_I_CALL_USAGE); DisplayString(IDS_I_CALL_PARAM_NOTE); // Display the method details. DisplayMethodDetails(rParsedInfo); } /*------------------------------------------------------------------------ Name :DisplaySETUsage Synopsis :Displays SET usage. Type :Member Function Input parameter : rParsedInfo - reference to CParsedInfo class object Output parameters :None Return Type :void Global Variables :None Calling Syntax :DisplaySETUsage(rParsedInfo) Notes :None ------------------------------------------------------------------------*/ void CFormatEngine::DisplaySETUsage(CParsedInfo& rParsedInfo) { DisplayInvalidProperties(rParsedInfo, TRUE); if ( rParsedInfo.GetCmdSwitchesObject(). GetPropertyList().size() == 0 ) { // Display the usage of the SET verb DisplayString(IDS_I_NEWLINE); DisplayString(IDS_I_SET_DESC); DisplayString(IDS_I_USAGE); DisplayString(IDS_I_NEWLINE); DisplayString(IDS_I_SET_USAGE); DisplayString(IDS_I_ASSIGNLIST_NOTE1); DisplayString(IDS_I_ASSIGNLIST_NOTE2); } // Display the property details DisplayPropertyDetails(rParsedInfo); } /*------------------------------------------------------------------------ Name :DisplayCREATEUsage Synopsis :Displays CREATE usage. Type :Member Function Input parameter : rParsedInfo - reference to CParsedInfo class object Output parameters :None Return Type :void Global Variables :None Calling Syntax :DisplayCREATEsage(rParsedInfo) Notes :None ------------------------------------------------------------------------*/ void CFormatEngine::DisplayCREATEUsage(CParsedInfo& rParsedInfo) { DisplayInvalidProperties(rParsedInfo); if ( rParsedInfo.GetCmdSwitchesObject(). GetPropertyList().size() == 0 ) { // Display the usage of the CREATE verb DisplayString(IDS_I_NEWLINE); DisplayString(IDS_I_CREATE_DESC); DisplayString(IDS_I_USAGE); DisplayString(IDS_I_NEWLINE); DisplayString(IDS_I_CREATE_USAGE); DisplayString(IDS_I_ASSIGNLIST_NOTE1); DisplayString(IDS_I_ASSIGNLIST_NOTE2); DisplayString(IDS_I_NEWLINE); DisplayString(IDS_I_CREATE_NOTE); } // Display the property details DisplayPropertyDetails(rParsedInfo); } /*------------------------------------------------------------------------ Name :DisplayDELETEUsage Synopsis :Displays DELETE usage. Type :Member Function Input parameter : rParsedInfo - reference to CParsedInfo class object Output parameters :None Return Type :void Global Variables :None Calling Syntax :DisplayDELETEUsage() Notes :None ------------------------------------------------------------------------*/ void CFormatEngine::DisplayDELETEUsage(CParsedInfo& rParsedInfo) { // Display the usage of the DELETE verb DisplayString(IDS_I_NEWLINE); if(IsClassOperation(rParsedInfo)) { DisplayString(IDS_I_CLASS_DELETE_DESC); } else { DisplayString(IDS_I_DELETE_DESC); } } /*------------------------------------------------------------------------ Name :DisplayASSOCUsage Synopsis :Displays ASSOC usage. Type :Member Function Input parameter : rParsedInfo - reference to CParsedInfo class object Output parameters :None Return Type :void Global Variables :None Calling Syntax :DisplayASSOCUsage(rParsedInfo) Notes :None ------------------------------------------------------------------------*/ void CFormatEngine::DisplayASSOCUsage(CParsedInfo& rParsedInfo) { if (rParsedInfo.GetHelpInfoObject().GetHelp(ASSOCSwitchesOnly) == FALSE) { DisplayString(IDS_I_NEWLINE); if(IsClassOperation(rParsedInfo)) { DisplayString(IDS_I_CLASS_ASSOC_DESC); } else { DisplayString(IDS_I_ASSOC_DESC); } DisplayString(IDS_I_USAGE); DisplayString(IDS_I_NEWLINE); DisplayString(IDS_I_ASSOC_USAGE); DisplayString(IDS_I_ASSOC_FMT_NOTE); DisplayString(IDS_I_NEWLINE); } DisplayString(IDS_I_ASSOC_SWITCH_HEAD); DisplayString(IDS_I_NEWLINE); DisplayString(IDS_I_ASSOC_RESULTCLASS); DisplayString(IDS_I_ASSOC_RESULTROLE); DisplayString(IDS_I_ASSOC_ASSOCCLASS); } /*------------------------------------------------------------------------ Name :DisplayAliasFriendlyNames Synopsis :Displays alias names Type :Member Function Input parameter : rParsedInfo - reference to CParsedInfo class object pszAlias - alias name (default null) Output parameters :None Return Type :void Global Variables :None Calling Syntax :DisplayAliasFriendlyNames(rParsedInfo, pszAlias) Notes :None ------------------------------------------------------------------------*/ void CFormatEngine::DisplayAliasFriendlyNames(CParsedInfo& rParsedInfo, _TCHAR* pszAlias) { _TCHAR szMsg[MAX_BUFFER] = NULL_STRING; // display ALIAS help BSTRMAP theMap = rParsedInfo.GetCmdSwitchesObject() .GetAlsFrnNmsOrTrnsTblMap(); BSTRMAP::iterator theIterator; // Displaying the alias specific description if (pszAlias) { theIterator = theMap.find(CharUpper(pszAlias)); if (theIterator != theMap.end()) { DisplayString(IDS_I_NEWLINE); _stprintf(szMsg,_T("%s - %s\r\n"), (LPTSTR) (*theIterator).first, (LPTSTR) (*theIterator).second); DisplayString((LPTSTR) szMsg); } } else if ( !theMap.empty() ) { _TCHAR* pszCmdString = rParsedInfo.GetCmdSwitchesObject(). GetCommandInput(); DisplayString(IDS_I_NEWLINE); DisplayString(IDS_I_ALIASCMD_HEAD); // Display the alias friendly names together with the // descriptions for (theIterator = theMap.begin(); theIterator != theMap.end(); theIterator++) { if ( rParsedInfo.GetGlblSwitchesObject(). GetHelpOption() == HELPBRIEF && StrStrI(pszCmdString, _T("BRIEF")) && lstrlen((*theIterator).second) > 48) { _stprintf(szMsg,_T("%-25s- %.48s...\r\n"), (LPTSTR) (*theIterator).first, (LPTSTR) (*theIterator).second); } else { _stprintf(szMsg,_T("%-25s- %s\r\n"), (LPTSTR) (*theIterator).first, (LPTSTR) (*theIterator).second); } DisplayString((LPTSTR) szMsg); } DisplayString(IDS_I_NEWLINE); DisplayString(IDS_I_CMD_MORE); } else { DisplayString(IDS_I_NEWLINE); DisplayString(IDS_I_ALIASCMD_NOT_AVLBL); } } /*------------------------------------------------------------------------ Name :DisplayGlobalSwitchesAndOtherDesc Synopsis :Display help for global switches Type :Member Function Input parameter : rParsedInfo - reference to CParsedInfo class object Output parameters :None Return Type :void Global Variables :None Calling Syntax :DisplayGlobalSwitchesAndOtherDesc(rParsedInfo) Notes :None ------------------------------------------------------------------------*/ void CFormatEngine::DisplayGlobalSwitchesAndOtherDesc( CParsedInfo& rParsedInfo) { BOOL bDisplayAllInfo = rParsedInfo.GetHelpInfoObject(). GetHelp(GlblAllInfo); // Display NAMESPACE help if (bDisplayAllInfo || rParsedInfo.GetHelpInfoObject().GetHelp(Namespace)) { DisplayString(IDS_I_NEWLINE); DisplayString(IDS_I_NAMESPACE_DESC1); DisplayString(IDS_I_NAMESPACE_DESC2); DisplayString(IDS_I_NAMESPACE_DESC3); DisplayString(IDS_I_USAGE); DisplayString(IDS_I_NEWLINE); DisplayString(IDS_I_NAMESPACE_USAGE); if (!bDisplayAllInfo) { DisplayString(IDS_I_NEWLINE); DisplayString(IDS_I_SPECIAL_NOTE); } } // Display ROLE help if (bDisplayAllInfo || rParsedInfo.GetHelpInfoObject().GetHelp(Role)) { DisplayString(IDS_I_NEWLINE); DisplayString(IDS_I_ROLE_DESC1); DisplayString(IDS_I_ROLE_DESC2); DisplayString(IDS_I_USAGE); DisplayString(IDS_I_NEWLINE); DisplayString(IDS_I_ROLE_USAGE); DisplayString(IDS_I_ROLE_NOTE1); DisplayString(IDS_I_ROLE_NOTE2); DisplayString(IDS_I_ROLE_NOTE3); if (!bDisplayAllInfo) { DisplayString(IDS_I_NEWLINE); DisplayString(IDS_I_SPECIAL_NOTE); } } // Display NODE help if (bDisplayAllInfo || rParsedInfo.GetHelpInfoObject().GetHelp(Node)) { DisplayString(IDS_I_NEWLINE); DisplayString(IDS_I_NODE_DESC); DisplayString(IDS_I_USAGE); DisplayString(IDS_I_NEWLINE); DisplayString(IDS_I_NODE_USAGE); DisplayString(IDS_I_NODE_NOTE); if (!bDisplayAllInfo) { DisplayString(IDS_I_NEWLINE); DisplayString(IDS_I_SPECIAL_NOTE); } } // Display IMPLEVEL help if (bDisplayAllInfo || rParsedInfo.GetHelpInfoObject().GetHelp(Level)) { DisplayString(IDS_I_NEWLINE); DisplayString(IDS_I_IMPLEVEL_DESC1); DisplayString(IDS_I_IMPLEVEL_DESC2); DisplayString(IDS_I_USAGE); DisplayString(IDS_I_NEWLINE); DisplayString(IDS_I_IMPLEVEL_USAGE); DisplayString(IDS_I_IMPLEVEL_HEAD); DisplayString(IDS_I_IMPLEVEL_HEAD1); DisplayString(IDS_I_IMPLEVEL_HEAD2); DisplayString(IDS_I_IMPLEVEL_ANON); DisplayString(IDS_I_IMPLEVEL_IDENTIFY); DisplayString(IDS_I_IMPLEVEL_IMPERSONATE); DisplayString(IDS_I_IMPLEVEL_DELEGATE); DisplayString(IDS_I_IMPLEVEL_NOTE); } // Display AUTHLEVEL help if (bDisplayAllInfo || rParsedInfo.GetHelpInfoObject().GetHelp(AuthLevel)) { DisplayString(IDS_I_NEWLINE); DisplayString(IDS_I_AUTHLEVEL_DESC1); DisplayString(IDS_I_AUTHLEVEL_DESC2); DisplayString(IDS_I_USAGE); DisplayString(IDS_I_NEWLINE); DisplayString(IDS_I_AUTHLEVEL_USAGE); DisplayString(IDS_I_AUTHLEVEL_HEAD); DisplayString(IDS_I_AUTHLEVEL_HEAD1); DisplayString(IDS_I_AUTHLEVEL_HEAD2); DisplayString(IDS_I_AUTHLEVEL_DEFAULT); DisplayString(IDS_I_AUTHLEVEL_NONE); DisplayString(IDS_I_AUTHLEVEL_CONNECT); DisplayString(IDS_I_AUTHLEVEL_CALL); DisplayString(IDS_I_AUTHLEVEL_PKT); DisplayString(IDS_I_AUTHLEVEL_PKTINTGRTY); DisplayString(IDS_I_AUTHLEVEL_PKTPRVCY); } // Display LOCALE help if (bDisplayAllInfo || rParsedInfo.GetHelpInfoObject().GetHelp(Locale)) { DisplayString(IDS_I_NEWLINE); DisplayString(IDS_I_LOCALE_DESC); DisplayString(IDS_I_USAGE); DisplayString(IDS_I_NEWLINE); DisplayString(IDS_I_LOCALE_USAGE); DisplayString(IDS_I_LOCALE_NOTE1); DisplayString(IDS_I_LOCALE_NOTE2); } // Display PRIVILEGES help if (bDisplayAllInfo || rParsedInfo.GetHelpInfoObject().GetHelp(Privileges)) { DisplayString(IDS_I_NEWLINE); DisplayString(IDS_I_PRIVILEGES_DESC); DisplayString(IDS_I_USAGE); DisplayString(IDS_I_NEWLINE); DisplayString(IDS_I_PRIVILEGES_USAGE); DisplayString(IDS_I_PRIVILEGES_NOTE); } // Display TRACE help if (bDisplayAllInfo || rParsedInfo.GetHelpInfoObject().GetHelp(Trace)) { DisplayString(IDS_I_NEWLINE); DisplayString(IDS_I_TRACE_DESC1); DisplayString(IDS_I_TRACE_DESC2); DisplayString(IDS_I_USAGE); DisplayString(IDS_I_NEWLINE); DisplayString(IDS_I_TRACE_USAGE); DisplayString(IDS_I_TRACE_NOTE); } // Display RECORD help if (bDisplayAllInfo || rParsedInfo.GetHelpInfoObject().GetHelp(RecordPath)) { DisplayString(IDS_I_NEWLINE); DisplayString(IDS_I_RECORD_DESC); DisplayString(IDS_I_USAGE); DisplayString(IDS_I_NEWLINE); DisplayString(IDS_I_RECORD_USAGE); if (!bDisplayAllInfo) { DisplayString(IDS_I_NEWLINE); DisplayString(IDS_I_SPECIAL_NOTE); } } // Display INTERACTIVE help if (bDisplayAllInfo || rParsedInfo.GetHelpInfoObject().GetHelp(Interactive)) { DisplayString(IDS_I_NEWLINE); DisplayString(IDS_I_INTERACTIVE_DESC); DisplayString(IDS_I_USAGE); DisplayString(IDS_I_NEWLINE); DisplayString(IDS_I_INTERACTIVE_USAGE); DisplayString(IDS_I_TRACE_NOTE); } // Display FAILFAST help if (bDisplayAllInfo || rParsedInfo.GetHelpInfoObject().GetHelp(FAILFAST)) { DisplayString(IDS_I_NEWLINE); DisplayString(IDS_I_FAILFAST_DESC); DisplayString(IDS_I_USAGE); DisplayString(IDS_I_NEWLINE); DisplayString(IDS_I_FAILFAST_USAGE); DisplayString(IDS_I_TRACE_NOTE); } // Display OUTPUT help if (bDisplayAllInfo || rParsedInfo.GetHelpInfoObject().GetHelp(OUTPUT)) { DisplayString(IDS_I_NEWLINE); DisplayString(IDS_I_OUTPUT_DESC); DisplayString(IDS_I_USAGE); DisplayString(IDS_I_NEWLINE); DisplayString(IDS_I_OUTPUT_USAGE); DisplayString(IDS_I_OUTPUT_NOTE); DisplayString(IDS_I_STDOUT_NOTE); DisplayString(IDS_I_CLIPBOARD_NOTE); DisplayString(IDS_I_OUTPUT_FILE_NOTE); if (!bDisplayAllInfo) { DisplayString(IDS_I_NEWLINE); DisplayString(IDS_I_SPECIAL_NOTE); } } // Display APPEND help if (bDisplayAllInfo || rParsedInfo.GetHelpInfoObject().GetHelp(APPEND)) { DisplayString(IDS_I_NEWLINE); DisplayString(IDS_I_APPEND_DESC); DisplayString(IDS_I_USAGE); DisplayString(IDS_I_NEWLINE); DisplayString(IDS_I_APPEND_USAGE); DisplayString(IDS_I_OUTPUT_NOTE); DisplayString(IDS_I_STDOUT_NOTE); DisplayString(IDS_I_CLIPBOARD_NOTE); DisplayString(IDS_I_APPEND_FILE_NOTE); if (!bDisplayAllInfo) { DisplayString(IDS_I_NEWLINE); DisplayString(IDS_I_SPECIAL_NOTE); } } // Display USER help if (bDisplayAllInfo || rParsedInfo.GetHelpInfoObject().GetHelp(User)) { DisplayString(IDS_I_NEWLINE); DisplayString(IDS_I_USER_DESC); DisplayString(IDS_I_USAGE); DisplayString(IDS_I_NEWLINE); DisplayString(IDS_I_USER_USAGE); DisplayString(IDS_I_USER_NOTE); if (!bDisplayAllInfo) { DisplayString(IDS_I_NEWLINE); DisplayString(IDS_I_SPECIAL_NOTE); } } //Display AGGREGATE help if(bDisplayAllInfo || rParsedInfo.GetHelpInfoObject().GetHelp(Aggregate)) { DisplayString(IDS_I_NEWLINE); DisplayString(IDS_I_AGGREGATE_DESC); DisplayString(IDS_I_USAGE); DisplayString(IDS_I_NEWLINE); DisplayString(IDS_I_AGGREGATE_USAGE); DisplayString(IDS_I_AGGREGATE_NOTE); } // Display PASSWORD help if (bDisplayAllInfo || rParsedInfo.GetHelpInfoObject().GetHelp(Password)) { DisplayString(IDS_I_NEWLINE); DisplayString(IDS_I_PASSWORD_DESC); DisplayString(IDS_I_USAGE); DisplayString(IDS_I_NEWLINE); DisplayString(IDS_I_PASSWORD_USAGE); if (!bDisplayAllInfo) { DisplayString(IDS_I_NEWLINE); DisplayString(IDS_I_SPECIAL_NOTE); } } // Display AUTHORITY help if (bDisplayAllInfo || rParsedInfo.GetHelpInfoObject().GetHelp(Authority)) { DisplayString(IDS_I_NEWLINE); DisplayString(IDS_I_AUTHORITY_DESC); DisplayString(IDS_I_USAGE); DisplayString(IDS_I_NEWLINE); DisplayString(IDS_I_AUTHORITY_USAGE); } if (bDisplayAllInfo) { DisplayString(IDS_I_NEWLINE); DisplayString(IDS_I_HELP_DESC); DisplayString(IDS_I_USAGE); DisplayString(IDS_I_NEWLINE); DisplayString(IDS_I_HELP_USAGE); DisplayString(IDS_I_HELP_NOTE); DisplayString(IDS_I_NEWLINE); DisplayString(IDS_I_SPECIAL_NOTE); } } /*------------------------------------------------------------------------ Name :DisplayMethodDetails Synopsis :Display help for Alias verbs Type :Member Function Input parameter : rParsedInfo - reference to CParsedInfo class object Output parameters :None Return Type :void Global Variables :None Calling Syntax :DisplayMethodDetails(rParsedInfo) Notes :None ------------------------------------------------------------------------*/ void CFormatEngine::DisplayMethodDetails(CParsedInfo& rParsedInfo) { // Obtain the help option. HELPOPTION hoHelpType = rParsedInfo.GetGlblSwitchesObject() .GetHelpOption(); // Obtain the method details. METHDETMAP theMap = rParsedInfo.GetCmdSwitchesObject(). GetMethDetMap(); METHDETMAP::iterator theIterator; BOOL bDisAliasVerb = rParsedInfo.GetHelpInfoObject(). GetHelp(AliasVerb); BOOL bPrinted = FALSE; _bstr_t bstrLine; try { // Loop thru the method map for (theIterator = theMap.begin(); theIterator != theMap.end(); theIterator++) { if (!bDisAliasVerb && theIterator == theMap.begin()) { DisplayString(IDS_I_NEWLINE); if (rParsedInfo.GetCmdSwitchesObject().GetAliasName()) DisplayString(IDS_I_ALIASVERB_HEAD); else DisplayString(IDS_I_VERB_HEAD); DisplayString(IDS_I_NEWLINE); } if ( bPrinted == FALSE ) { DisplayString(IDS_I_PARAM_HEAD); DisplayString(IDS_I_PARAM_BORDER); bPrinted = TRUE; } METHODDETAILS mdMethDet = (*theIterator).second; _TCHAR szMsg[MAX_BUFFER] = NULL_STRING; _stprintf(szMsg,_T("%-24s"),(LPTSTR) (*theIterator).first); _bstr_t bstrMessage = _bstr_t(szMsg); PROPDETMAP pdmParams = mdMethDet.Params; PROPDETMAP::iterator paraIterator; for ( paraIterator = pdmParams.begin() ; paraIterator != pdmParams.end(); paraIterator++ ) { if ( paraIterator != pdmParams.begin()) { DisplayString(IDS_I_NEWLINE); _stprintf(szMsg, _T("\t\t\t")); bstrMessage = szMsg; } LPSTR pszParaId = NULL, pszParaType = NULL; PROPERTYDETAILS pdPropDet = (*paraIterator).second; if (!ConvertWCToMBCS((LPTSTR)(*paraIterator).first,(LPVOID*) &pszParaId, CP_OEMCP)) throw OUT_OF_MEMORY; if (!ConvertWCToMBCS(pdPropDet.Type,(LPVOID*) &pszParaType, CP_OEMCP)) throw OUT_OF_MEMORY; _bstr_t bstrInOrOut; if ( pdPropDet.InOrOut == INP ) bstrInOrOut = _bstr_t("[IN ]"); else if ( pdPropDet.InOrOut == OUTP ) bstrInOrOut = _bstr_t("[OUT]"); else bstrInOrOut = _bstr_t("[UNKNOWN]"); // Remove initial 5 chars from pszParaId to remove temporary // number for maintaining order of paramas _bstr_t bstrLine = bstrInOrOut + _bstr_t(pszParaId + 5) + _bstr_t("(") + _bstr_t(pszParaType) + _bstr_t(")"); _stprintf(szMsg,_T("%-36s\t"),(LPTSTR) bstrLine); bstrMessage += _bstr_t(szMsg); SAFEDELETE(pszParaId); SAFEDELETE(pszParaType); if ( paraIterator == pdmParams.begin() ) { _stprintf(szMsg,_T("%-15s"),(LPTSTR) mdMethDet.Status); bstrMessage += szMsg; } bstrMessage += _bstr_t(L"\n"); DisplayString((LPTSTR) bstrMessage); } if ( paraIterator == pdmParams.begin() ) { _stprintf(szMsg,_T("\t\t\t\t\t%-15s"),(LPTSTR)mdMethDet.Status); bstrMessage += _bstr_t(szMsg) + _bstr_t(L"\n"); DisplayString((LPTSTR) bstrMessage); DisplayString(IDS_I_NEWLINE); } DisplayString(IDS_I_NEWLINE); if ( hoHelpType == HELPFULL ) { DisplayString(IDS_I_DESCRIPTION); bstrLine = mdMethDet.Description + _bstr_t(L"\n"); DisplayString((LPTSTR) bstrLine); DisplayString(IDS_I_NEWLINE); } } if (!bPrinted) { if (rParsedInfo.GetCmdSwitchesObject().GetMethodName() != NULL) { DisplayString(IDS_I_ALIASVERB_NOT_AVLBL); } else { DisplayString(IDS_I_NEWLINE); DisplayString(IDS_I_VERB_NOT_AVLBL); } } } catch(_com_error& e) { _com_issue_error(e.Error()); } catch(WMICLIINT nVal) { // If memory allocation failed. if (nVal == OUT_OF_MEMORY) { rParsedInfo.GetCmdSwitchesObject().SetErrataCode(OUT_OF_MEMORY); } } } /*------------------------------------------------------------------------ Name :DisplayPropertyDetails Synopsis :Display help for Alias properties and their descriptions Type :Member Function Input parameter : rParsedInfo - reference to CParsedInfo class object Output parameters :None Return Type :void Global Variables :None Calling Syntax :DisplayPropertyDetails(rParsedInfo) Notes :None ------------------------------------------------------------------------*/ void CFormatEngine::DisplayPropertyDetails(CParsedInfo& rParsedInfo) { BOOL bFirst = TRUE; BOOL bSetVerb = FALSE; _TCHAR szMsg[MAX_BUFFER] = NULL_STRING; _bstr_t bstrLine; PROPDETMAP::iterator theIterator = NULL; PROPERTYDETAILS pdPropDet; HELPOPTION hoHelpType = rParsedInfo.GetGlblSwitchesObject(). GetHelpOption(); PROPDETMAP theMap = rParsedInfo.GetCmdSwitchesObject().GetPropDetMap(); try { // If the verb is SET display only writable properties if (CompareTokens(rParsedInfo.GetCmdSwitchesObject().GetVerbName(), CLI_TOKEN_SET)) { bSetVerb = TRUE; } for (theIterator = theMap.begin(); theIterator != theMap.end(); theIterator++) { pdPropDet = (PROPERTYDETAILS)((*theIterator).second); if (bFirst) { DisplayString(IDS_I_NEWLINE); if ( rParsedInfo.GetCmdSwitchesObject(). GetPropertyList().size() == 0 ) { if (bSetVerb) { DisplayString(IDS_I_PROP_WRITEABLE_HEAD); } else { DisplayString(IDS_I_PROP_HEAD); } } DisplayString(IDS_I_PROPS_HEAD); DisplayString(IDS_I_PROPS_BORDER); bFirst = FALSE; } _stprintf(szMsg,_T("%-35s\t%-20s\t%-10s\r\n"), (LPTSTR)(*theIterator).first, (LPTSTR) pdPropDet.Type, (LPTSTR) pdPropDet.Operation); DisplayString((LPTSTR) szMsg); if ( hoHelpType == HELPFULL ) { DisplayString(IDS_I_DESCRIPTION); bstrLine = pdPropDet.Description + _bstr_t(L"\n"); DisplayString((LPTSTR) bstrLine); DisplayString(IDS_I_NEWLINE); } } if ( bSetVerb && rParsedInfo.GetCmdSwitchesObject(). GetPropertyList().size() == 0 && bFirst == TRUE ) { DisplayString(IDS_I_NEWLINE); DisplayString(IDS_I_PROP_WRITEABLE_NOT_AVLBL); } } catch(_com_error& e) { _com_issue_error(e.Error()); } } /*------------------------------------------------------------------------ Name :DisplayStdVerbDescriptions Synopsis :Displays help for standard verbs Type :Member Function Input parameter : rParsedInfo - reference to CParsedInfo class object Output parameters :None Return Type :void Global Variables :None Calling Syntax :DisplayStdVerbDescriptions(rParsedInfo) Notes :None ------------------------------------------------------------------------*/ void CFormatEngine::DisplayStdVerbDescriptions(CParsedInfo& rParsedInfo) { BOOL bDisAllCmdHelp = rParsedInfo.GetHelpInfoObject().GetHelp(CmdAllInfo); if (bDisAllCmdHelp) { DisplayString(IDS_I_NEWLINE); DisplayString(IDS_I_STDVERB_HEAD); } if (bDisAllCmdHelp || rParsedInfo.GetHelpInfoObject().GetHelp(GETVerb)) DisplayGETUsage(rParsedInfo); if (bDisAllCmdHelp || rParsedInfo.GetHelpInfoObject().GetHelp(SETVerb)) DisplaySETUsage(rParsedInfo); if (bDisAllCmdHelp || rParsedInfo.GetHelpInfoObject().GetHelp(LISTVerb)) DisplayLISTUsage(rParsedInfo); if (bDisAllCmdHelp || rParsedInfo.GetHelpInfoObject().GetHelp(CALLVerb)) DisplayCALLUsage(rParsedInfo); if (bDisAllCmdHelp || rParsedInfo.GetHelpInfoObject().GetHelp(ASSOCVerb)) DisplayASSOCUsage(rParsedInfo); if (bDisAllCmdHelp || rParsedInfo.GetHelpInfoObject().GetHelp(CREATEVerb)) DisplayCREATEUsage(rParsedInfo); if (bDisAllCmdHelp || rParsedInfo.GetHelpInfoObject().GetHelp(DELETEVerb)) DisplayDELETEUsage(rParsedInfo); } /*------------------------------------------------------------------------ Name :FrameHelpVector Synopsis :Frames the help vector which will be later used for displaying the help on a page by page basis Type :Member Function Input parameter : rParsedInfo - reference to CParsedInfo class object Output parameters :None Return Type :void Global Variables :None Calling Syntax :FrameHelpVector(rParsedInfo) Notes :None ------------------------------------------------------------------------*/ void CFormatEngine::FrameHelpVector(CParsedInfo& rParsedInfo) { m_bDispCALL = rParsedInfo.GetCmdSwitchesObject(). GetMethodsAvailable(); m_bDispSET = rParsedInfo.GetCmdSwitchesObject(). GetWriteablePropsAvailable(); m_bDispLIST = rParsedInfo.GetCmdSwitchesObject(). GetLISTFormatsAvailable(); if (rParsedInfo.GetHelpInfoObject().GetHelp(GlblAllInfo)) { DisplayString(IDS_I_NEWLINE); DisplayString(IDS_I_GLBLCMD); DisplayString(IDS_I_NEWLINE); DisplayString(IDS_I_GLBL_SWITCH_HEAD); if ( rParsedInfo.GetGlblSwitchesObject().GetHelpOption() == HELPBRIEF) DisplayGlobalSwitchesBrief(); else DisplayGlobalSwitchesAndOtherDesc(rParsedInfo); DisplayString(IDS_I_NEWLINE); DisplayAliasFriendlyNames(rParsedInfo); DisplayString(IDS_I_NEWLINE); DisplayString(IDS_I_CLASS_DESCFULL); DisplayString(IDS_I_PATH_DESCFULL); DisplayString(IDS_I_CONTEXT_DESCFULL); DisplayString(IDS_I_QUITEXIT); DisplayString(IDS_I_NEWLINE); DisplayString(IDS_I_CLASSPATH_MORE); } else if (rParsedInfo.GetHelpInfoObject().GetHelp(CmdAllInfo)) { DisplayAliasFriendlyNames(rParsedInfo, rParsedInfo.GetCmdSwitchesObject().GetAliasName()); DisplayAliasHelp(rParsedInfo); } else if ( rParsedInfo.GetHelpInfoObject().GetHelp(PATH)) DisplayPATHHelp(rParsedInfo); else if ( rParsedInfo.GetHelpInfoObject().GetHelp(WHERE)) DisplayWHEREHelp(rParsedInfo); else if ( rParsedInfo.GetHelpInfoObject().GetHelp(CLASS)) DisplayCLASSHelp(rParsedInfo); else if ( rParsedInfo.GetHelpInfoObject().GetHelp(PWhere)) DisplayPWhereHelp(rParsedInfo); else if ( rParsedInfo.GetHelpInfoObject().GetHelp(TRANSLATE)) DisplayTRANSLATEHelp(rParsedInfo); else if ( rParsedInfo.GetHelpInfoObject().GetHelp(EVERY)) DisplayEVERYHelp(rParsedInfo); else if ( rParsedInfo.GetHelpInfoObject().GetHelp(REPEAT)) DisplayREPEATHelp(); else if ( rParsedInfo.GetHelpInfoObject().GetHelp(FORMAT)) DisplayFORMATHelp(rParsedInfo); else if ( rParsedInfo.GetHelpInfoObject().GetHelp(VERBSWITCHES)) DisplayVERBSWITCHESHelp(rParsedInfo); else if ( rParsedInfo.GetHelpInfoObject().GetHelp(GLBLCONTEXT)) DisplayContext(rParsedInfo); else if ( rParsedInfo.GetHelpInfoObject().GetHelp(CONTEXTHELP)) DisplayContextHelp(); else if ( rParsedInfo.GetHelpInfoObject().GetHelp(RESULTCLASShelp)) DisplayRESULTCLASSHelp(); else if ( rParsedInfo.GetHelpInfoObject().GetHelp(RESULTROLEhelp)) DisplayRESULTROLEHelp(); else if ( rParsedInfo.GetHelpInfoObject().GetHelp(ASSOCCLASShelp)) DisplayASSOCCLASSHelp(); else { DisplayGlobalSwitchesAndOtherDesc(rParsedInfo); DisplayStdVerbDescriptions(rParsedInfo); if ( rParsedInfo.GetHelpInfoObject().GetHelp(AliasVerb) ) DisplayMethodDetails(rParsedInfo); } } /*------------------------------------------------------------------------ Name :DisplayAliasHelp Synopsis :Displays help for Alias Type :Member Function Input parameter : rParsedInfo - reference to CParsedInfo class object Output parameters :None Return Type :void Global Variables :None Calling Syntax :DisplayAliasHelp(rParsedInfo) Notes :None ------------------------------------------------------------------------*/ void CFormatEngine::DisplayAliasHelp(CParsedInfo& rParsedInfo) { try { DisplayString(IDS_I_NEWLINE); DisplayString(IDS_I_ALIAS_USAGE1); DisplayString(IDS_I_ALIAS_USAGE2); DisplayString(IDS_I_NEWLINE); // Get the Alias Name _bstr_t bstrAliasName = _bstr_t(rParsedInfo. GetCmdSwitchesObject().GetAliasName()); CharUpper(bstrAliasName); DisplayStdVerbsUsage(bstrAliasName); } catch(_com_error& e) { _com_issue_error(e.Error()); } } /*------------------------------------------------------------------------ Name :DisplayPATHHelp Synopsis :Displays help for Alias PATH Type :Member Function Input parameter : rParsedInfo - reference to CParsedInfo class object Output parameters :None Return Type :void Global Variables :None Calling Syntax :DisplayPATHHelp(rParsedInfo) Notes :None ------------------------------------------------------------------------*/ void CFormatEngine::DisplayPATHHelp(CParsedInfo& rParsedInfo) { if ( rParsedInfo.GetCmdSwitchesObject().GetClassPath() == NULL ) { DisplayString(IDS_I_NEWLINE); DisplayString(IDS_I_PATH_DESC); DisplayString(IDS_I_USAGE); DisplayString(IDS_I_NEWLINE); DisplayString(IDS_I_PATH_USAGE); } else { DisplayString(IDS_I_NEWLINE); DisplayString(IDS_I_PATH_DESC); _bstr_t bstrMsg; WMIFormatMessage(IDS_I_PATHHELP_SUBST, 0, bstrMsg, NULL); DisplayStdVerbsUsage(bstrMsg); } } /*------------------------------------------------------------------------ Name :DisplayWHEREHelp Synopsis :Displays help for WHERE Type :Member Function Input parameter : rParsedInfo - reference to CParsedInfo class object Output parameters :None Return Type :void Global Variables :None Calling Syntax :DisplayWHEREHelp(rParsedInfo) Notes :None ------------------------------------------------------------------------*/ void CFormatEngine::DisplayWHEREHelp(CParsedInfo& rParsedInfo) { try { if ( rParsedInfo.GetCmdSwitchesObject().GetWhereExpression() == NULL ) { DisplayString(IDS_I_NEWLINE); DisplayString(IDS_I_WHERE_DESC1); DisplayString(IDS_I_WHERE_DESC2); DisplayString(IDS_I_USAGE); DisplayString(IDS_I_NEWLINE); DisplayString(IDS_I_WHERE_USAGE); } else { DisplayString(IDS_I_NEWLINE); DisplayString(IDS_I_WHERE_DESC1); DisplayString(IDS_I_WHERE_DESC2); _bstr_t bstrMsg; WMIFormatMessage(IDS_I_WHEREHELP_SUBST, 0, bstrMsg, NULL); DisplayStdVerbsUsage(bstrMsg); } } catch(_com_error& e) { _com_issue_error(e.Error()); } } /*------------------------------------------------------------------------ Name :DisplayCLASSHelp Synopsis :Displays help for CLASS Type :Member Function Input parameter : rParsedInfo - reference to CParsedInfo class object Output parameters :None Return Type :void Global Variables :None Calling Syntax :DisplayCLASSHelp(rParsedInfo) Notes :None ------------------------------------------------------------------------*/ void CFormatEngine::DisplayCLASSHelp(CParsedInfo& rParsedInfo) { if ( rParsedInfo.GetCmdSwitchesObject().GetClassPath() == NULL ) { DisplayString(IDS_I_NEWLINE); DisplayString(IDS_I_CLASS_DESC); DisplayString(IDS_I_USAGE); DisplayString(IDS_I_NEWLINE); DisplayString(IDS_I_CLASS_USAGE); } else { DisplayString(IDS_I_NEWLINE); DisplayString(IDS_I_CLASS_DESC); _bstr_t bstrMsg; WMIFormatMessage(IDS_I_CLASSHELP_SUBST, 0, bstrMsg, NULL); DisplayStdVerbsUsage(bstrMsg, TRUE); } } /*------------------------------------------------------------------------ Name :Help Synopsis :Displays help for PWhere Type :Member Function Input parameter : rParsedInfo - reference to CParsedInfo class object Output parameters :None Return Type :void Global Variables :None Calling Syntax :DisplayPWhereHelp(rParsedInfo) Notes :None ------------------------------------------------------------------------*/ void CFormatEngine::DisplayPWhereHelp(CParsedInfo& rParsedInfo) { DisplayString(IDS_I_NEWLINE); DisplayString(IDS_I_PWHERE_DESC1); DisplayString(IDS_I_PWHERE_DESC2); DisplayString(IDS_I_NEWLINE); _bstr_t bstrMsg; WMIFormatMessage(IDS_I_PWHEREHELP_SUBST, 1, bstrMsg, CharUpper(rParsedInfo.GetCmdSwitchesObject() .GetAliasName())); DisplayStdVerbsUsage(bstrMsg); DisplayString(IDS_I_PWHERE_USAGE); } /*------------------------------------------------------------------------ Name :DisplayString Synopsis :Displays localized string Type :Member Function Input parameter :None uID - string table identifier bAddToVector - add to help vector. LPTSTR - lpszParam (parameter for substituion) Output parameters :None Return Type :void Global Variables :None Calling Syntax :DisplayString(uID, bAddToVector, lpszParam) Notes :None ------------------------------------------------------------------------*/ void CFormatEngine::DisplayString(UINT uID, BOOL bAddToVector, LPTSTR lpszParam, BOOL bIsError) { LPTSTR lpszMsg = NULL; LPVOID lpMsgBuf = NULL; HRESULT hr = S_OK; try { lpszMsg = new _TCHAR [BUFFER1024]; if ( m_bGetOutOpt == TRUE ) { // Get the output option to redirect the output. m_opsOutputOpt = g_wmiCmd.GetParsedInfoObject(). GetGlblSwitchesObject(). GetOutputOrAppendOption(TRUE); m_bGetOutOpt = FALSE; } if ( m_bGetAppendFilePinter == TRUE ) { // FALSE for getting append file pointer. m_fpAppendFile = g_wmiCmd.GetParsedInfoObject(). GetGlblSwitchesObject(). GetOutputOrAppendFilePointer(FALSE); m_bGetAppendFilePinter = FALSE; } if ( m_bGetOutputFilePinter == TRUE ) { // TRUE for getting append file pointer. m_fpOutFile = g_wmiCmd.GetParsedInfoObject(). GetGlblSwitchesObject(). GetOutputOrAppendFilePointer(TRUE); m_bGetOutputFilePinter = FALSE; } if (lpszMsg) { LoadString(NULL, uID, lpszMsg, BUFFER1024); if (lpszParam) { char* pvaInsertStrs[1]; pvaInsertStrs[0] = (char*) lpszParam; DWORD dwRet = FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_ARGUMENT_ARRAY, lpszMsg, 0, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &lpMsgBuf, 0, pvaInsertStrs); if (dwRet == 0) { SAFEDELETE(lpszMsg); throw (::GetLastError()); } } if (m_bHelp && bAddToVector) { LPWSTR wszHelp = NULL ; if ( NULL != ( wszHelp = new WCHAR [ lstrlen ( reinterpret_cast < WCHAR* > ( ( lpMsgBuf ) ? lpMsgBuf : lpszMsg ) ) + 1 ] ) ) { lstrcpy ( wszHelp, reinterpret_cast < WCHAR* > ( ( lpMsgBuf ) ? lpMsgBuf : lpszMsg ) ) ; m_cvHelp.push_back ( wszHelp ) ; } if ( NULL == wszHelp ) { // // must delete here // SAFEDELETE(lpszMsg); // Free the memory used up the error message // and then exit if ( lpMsgBuf != NULL ) { LocalFree(lpMsgBuf); lpMsgBuf = NULL ; } throw OUT_OF_MEMORY; } } else { if (m_bRecord && m_bLog && !m_bInteractiveHelp) { hr = m_WmiCliLog.WriteToXMLLog(g_wmiCmd.GetParsedInfoObject(), ( lpMsgBuf ) ? ( LPTSTR ) lpMsgBuf : lpszMsg ); if (FAILED(hr)) { m_WmiCliLog.StopLogging(); m_bRecord = FALSE; hr = S_OK; DisplayString(IDS_E_WRITELOG_FAILED, FALSE, NULL, TRUE); } m_bLog = FALSE; } if (m_bInteractiveHelp) { m_chsOutput += ( ( lpMsgBuf ) ? ( LPTSTR ) lpMsgBuf : lpszMsg ) ; } DisplayMessage ( ( ( lpMsgBuf ) ? ( LPTSTR ) lpMsgBuf : lpszMsg ), CP_OEMCP, bIsError, FALSE, m_bOutputGoingToStream ) ; } // // must delete here // SAFEDELETE(lpszMsg); // Free the memory used up the error message // and then exit if ( lpMsgBuf != NULL ) { LocalFree(lpMsgBuf); lpMsgBuf = NULL ; } } else _com_issue_error(WBEM_E_OUT_OF_MEMORY); } catch(_com_error& e) { if ( lpMsgBuf != NULL ) { LocalFree(lpMsgBuf); lpMsgBuf = NULL ; } SAFEDELETE(lpszMsg); _com_issue_error(e.Error()); } catch(CHeap_Exception) { if ( lpMsgBuf != NULL ) { LocalFree(lpMsgBuf); lpMsgBuf = NULL ; } SAFEDELETE(lpszMsg); _com_issue_error(WBEM_E_OUT_OF_MEMORY); } } /*------------------------------------------------------------------------ Name :DisplayString Synopsis :Displays localized string Type :Member Function Input parameter : lszpMsg - string bScreen - TRUE - write to screen FALSE - write only to log file bIsError - TRUE - write to STDERR Output parameters :None Return Type :void Global Variables :None Calling Syntax :DisplayString(lpszMsg, bScreen, bIsError) Notes :None ------------------------------------------------------------------------*/ void CFormatEngine::DisplayString(LPTSTR lpszMsg, BOOL bScreen, BOOL bIsError) { HRESULT hr = S_OK; try { if ( m_bGetOutOpt == TRUE ) { // Get the output option to redirect the output. m_opsOutputOpt = g_wmiCmd.GetParsedInfoObject(). GetGlblSwitchesObject(). GetOutputOrAppendOption(TRUE); m_bGetOutOpt = FALSE; } if ( m_bGetAppendFilePinter == TRUE ) { // FALSE for getting append file pointer. m_fpAppendFile = g_wmiCmd.GetParsedInfoObject(). GetGlblSwitchesObject(). GetOutputOrAppendFilePointer(FALSE); m_bGetAppendFilePinter = FALSE; } if ( m_bGetOutputFilePinter == TRUE ) { // TRUE for getting append file pointer. m_fpOutFile = g_wmiCmd.GetParsedInfoObject(). GetGlblSwitchesObject(). GetOutputOrAppendFilePointer(TRUE); m_bGetOutputFilePinter = FALSE; } // If write to screen is TRUE and help flag is not enabled. if (bScreen && !m_bHelp) { if (m_bRecord && m_bLog && !m_bInteractiveHelp) { hr = m_WmiCliLog.WriteToXMLLog(g_wmiCmd.GetParsedInfoObject(),lpszMsg); if (FAILED(hr)) { m_WmiCliLog.StopLogging(); m_bRecord = FALSE; hr = S_OK; DisplayString(IDS_E_WRITELOG_FAILED, FALSE, NULL, TRUE); } m_bLog = FALSE; } if (m_bInteractiveHelp) { m_chsOutput += lpszMsg; } DisplayMessage ( lpszMsg, CP_OEMCP, bIsError, FALSE, m_bOutputGoingToStream ) ; } else if (m_bHelp) { LPWSTR wszHelp = NULL ; if ( NULL != ( wszHelp = new WCHAR [ lstrlen ( lpszMsg ) + 1 ] ) ) { lstrcpy ( wszHelp, lpszMsg ) ; m_cvHelp.push_back ( wszHelp ) ; } else { throw OUT_OF_MEMORY; } } } catch(_com_error& e) { _com_issue_error(e.Error()); } catch(CHeap_Exception) { _com_issue_error(WBEM_E_OUT_OF_MEMORY); } } /*------------------------------------------------------------------------ Name :DisplayPagedHelp Synopsis :Displays help in pages Type :Member Function Input parameter : rParsedInfo - reference to CParsedInfo object Output parameters :None Return Type :void Global Variables :None Calling Syntax :DisplayPagedHelp(rParsedInfo) ------------------------------------------------------------------------*/ void CFormatEngine::DisplayPagedHelp(CParsedInfo& rParsedInfo) { CHARVECTOR::iterator itrStart = NULL, itrEnd = NULL; HANDLE hStdOut = NULL ; CONSOLE_SCREEN_BUFFER_INFO csbiInfo; WMICLIINT nHeight = 0; WMICLIINT nWidth = 1; WMICLIINT nLines = 0; _TCHAR cUserKey = 0; _TCHAR cCharESC = 0x1B; _TCHAR cCharCtrlC = 0x03; _bstr_t bstrHelp; HRESULT hr = S_OK; itrStart = m_cvHelp.begin(); itrEnd = m_cvHelp.end(); try { if (m_bRecord && m_bLog) { while (itrStart != itrEnd) { bstrHelp += *itrStart; itrStart++; } hr = m_WmiCliLog.WriteToXMLLog(rParsedInfo, bstrHelp); if (FAILED(hr)) { m_WmiCliLog.StopLogging(); m_bRecord = FALSE; hr = S_OK; DisplayString(IDS_E_WRITELOG_FAILED, FALSE, NULL, TRUE); } m_bLog = FALSE; itrStart = m_cvHelp.begin(); } if ( m_bGetOutOpt == TRUE ) { // Get the output option to redirect the output. m_opsOutputOpt = g_wmiCmd.GetParsedInfoObject(). GetGlblSwitchesObject(). GetOutputOrAppendOption(TRUE); m_bGetOutOpt = FALSE; } if ( m_bGetAppendFilePinter == TRUE ) { // FALSE for getting append file pointer. m_fpAppendFile = g_wmiCmd.GetParsedInfoObject(). GetGlblSwitchesObject(). GetOutputOrAppendFilePointer(FALSE); m_bGetAppendFilePinter = FALSE; } if ( m_bGetOutputFilePinter == TRUE ) { // TRUE for getting append file pointer. m_fpOutFile = g_wmiCmd.GetParsedInfoObject(). GetGlblSwitchesObject(). GetOutputOrAppendFilePointer(TRUE); m_bGetOutputFilePinter = FALSE; } // Obtain the standard output handle hStdOut = GetStdHandle(STD_OUTPUT_HANDLE); while (itrStart != itrEnd) { if ( STDOUT == m_opsOutputOpt ) { // Get the screen buffer size. if ( hStdOut != INVALID_HANDLE_VALUE && GetConsoleScreenBufferInfo ( hStdOut, &csbiInfo ) == TRUE ) { nHeight = (csbiInfo.srWindow.Bottom - csbiInfo.srWindow.Top) - 1; nWidth = csbiInfo.dwSize.X; } else { nHeight = 0; nWidth = 0; } // if console size is positive (to address redirection) if ( nHeight > 0 ) { if (nLines >= nHeight) { GetConsoleScreenBufferInfo ( hStdOut, &csbiInfo ) ; DisplayString(IDS_I_PAKTC, FALSE); cUserKey = (_TCHAR)_getch(); EraseConsoleString(&csbiInfo); nLines = 0; if ( cUserKey == cCharESC || cUserKey == cCharCtrlC ) break; } nLines += ceil(((float) lstrlen(*itrStart) / (float)nWidth )); } } DisplayMessage ( ( *itrStart ) ) ; // Move to next entry itrStart++; } DisplayMessage ( L"\r\n" ) ; } catch(_com_error& e) { _com_issue_error(e.Error()); } catch(CHeap_Exception) { _com_issue_error(WBEM_E_OUT_OF_MEMORY); } } /*------------------------------------------------------------------------ Name :DisplayStdVerbsUsage Synopsis :Displays all standard verbs available. Type :Member Function Input Parameter(s): bstrBeginStr - string that needs to be appended. bClass TRUE - indicates class (drop LIST from the help) Output Parameter(s):None Return Type :void Global Variables :None Calling Syntax :DisplayStdVerbsUsage(bstrBeginStr, bClass) Notes :None ------------------------------------------------------------------------*/ void CFormatEngine::DisplayStdVerbsUsage(_bstr_t bstrBeginStr, BOOL bClass) { DisplayString(IDS_I_USAGE); DisplayString(IDS_I_NEWLINE); // Display help for Alias name means standard verb available to this // Alias name DisplayString(IDS_I_STDVERB_ASSOC, TRUE, (LPTSTR)bstrBeginStr); if ( m_bDispCALL == TRUE ) DisplayString(IDS_I_STDVERB_CALL, TRUE, (LPTSTR)bstrBeginStr); DisplayString(IDS_I_STDVERB_CREATE, TRUE, (LPTSTR)bstrBeginStr); DisplayString(IDS_I_STDVERB_DELETE, TRUE, (LPTSTR)bstrBeginStr); if (!bClass) { DisplayString(IDS_I_STDVERB_GET, TRUE, (LPTSTR)bstrBeginStr); } else { DisplayString(IDS_I_CLASS_STDVERB_GET, TRUE, (LPTSTR)bstrBeginStr); } if (!bClass) { if ( m_bDispLIST == TRUE ) DisplayString(IDS_I_STDVERB_LIST, TRUE, (LPTSTR)bstrBeginStr); } if ( m_bDispSET == TRUE ) DisplayString(IDS_I_STDVERB_SET, TRUE, (LPTSTR)bstrBeginStr); } /*------------------------------------------------------------------------ Name :DisplayTRANSLATEHelp Synopsis :Displays help for TRANSLATE switch Type :Member Function Input parameter : rParsedInfo - reference to CParsedInfo class object Output parameters :None Return Type :void Global Variables :None Calling Syntax :DisplayTRANSLATEHelp(rParsedInfo) Notes :None ------------------------------------------------------------------------*/ void CFormatEngine::DisplayTRANSLATEHelp(CParsedInfo& rParsedInfo) { DisplayString(IDS_I_NEWLINE); DisplayString(IDS_I_SWITCH_TRANSLATE_FULL_DESC); DisplayString(IDS_I_USAGE); DisplayString(IDS_I_NEWLINE); DisplayString(IDS_I_SWITCH_TRANSLATE_USAGE); CHARVECTOR cvTables = rParsedInfo. GetCmdSwitchesObject().GetTrnsTablesList(); if ( !cvTables.empty() ) { CHARVECTOR::iterator theIterator; DisplayString(IDS_I_NEWLINE); DisplayString(IDS_I_TRANSLATE_HEAD); for ( theIterator = cvTables.begin(); theIterator != cvTables.end(); theIterator++ ) { DisplayString(IDS_I_NEWLINE); DisplayString(*theIterator); } DisplayString(IDS_I_NEWLINE); } else { DisplayString(IDS_I_NEWLINE); DisplayString(IDS_I_TRANSLATE_NOTABLES); } } /*------------------------------------------------------------------------ Name :DisplayEVERYHelp Synopsis :Displays help for EVERY switch Type :Member Function Input parameter : rParsedInfo - reference to CParsedInfo class object Output parameters :None Return Type :void Global Variables :None Calling Syntax :DisplayTRANSLATEHelp(rParsedInfo) Notes :None ------------------------------------------------------------------------*/ void CFormatEngine::DisplayEVERYHelp(CParsedInfo& rParsedInfo) { DisplayString(IDS_I_NEWLINE); DisplayString(IDS_I_SWITCH_EVERY_DESC_FULL); DisplayString(IDS_I_USAGE); DisplayString(IDS_I_NEWLINE); DisplayString(IDS_I_SWITCH_EVERY_USAGE); DisplayString(IDS_I_EVERY_NOTE); } /*------------------------------------------------------------------------ Name :DisplayREPEATHelp Synopsis :Displays help for REPEAT switch Type :Member Function Input parameter :None Output parameters :None Return Type :void Global Variables :None Calling Syntax :DisplayREPEATHelp() Notes :None ------------------------------------------------------------------------*/ void CFormatEngine::DisplayREPEATHelp() { DisplayString(IDS_I_NEWLINE); DisplayString(IDS_I_SWITCH_REPEAT_DESC_FULL); DisplayString(IDS_I_USAGE); DisplayString(IDS_I_NEWLINE); DisplayString(IDS_I_SWITCH_REPEAT_USAGE); DisplayString(IDS_I_REPEAT_NOTE); } /*------------------------------------------------------------------------ Name :DisplayFORMATHelp Synopsis :Displays help for FORMAT switch Type :Member Function Input parameter : rParsedInfo - reference to CParsedInfo class object Output parameters :None Return Type :void Global Variables :None Calling Syntax :DisplayTRANSLATEHelp(rParsedInfo) Notes :None ------------------------------------------------------------------------*/ void CFormatEngine::DisplayFORMATHelp(CParsedInfo& rParsedInfo) { DisplayString(IDS_I_NEWLINE); DisplayString(IDS_I_SWITCH_FORMAT_DESC_FULL); DisplayString(IDS_I_USAGE); DisplayString(IDS_I_NEWLINE); DisplayString(IDS_I_SWITCH_FORMAT_USAGE); DisplayString(IDS_I_FORMAT_NOTE); DisplayString(IDS_I_NEWLINE); // // I need to get mappings from stl map // I need to add this into help so it shows up // // DisplayString(IDS_I_FORMAT_KEYWORDS); // DisplayString(IDS_I_NEWLINE); // DisplayString(IDS_I_NEWLINE); // // DisplayString(keyword, FALSE); // // will do for all pairs from WmiCmdLn::m_bmKeyWordtoFileName // const BSTRMAP* pMap = g_wmiCmd.GetMappingsMap(); BSTRMAP::iterator theMapIterator = NULL; if ( pMap->size() ) { DisplayString(IDS_I_FORMAT_KEYWORDS); DisplayString(IDS_I_NEWLINE); DisplayString(IDS_I_NEWLINE); } for ( theMapIterator = pMap->begin(); theMapIterator != pMap->end(); theMapIterator++ ) { DisplayString((*theMapIterator).first, FALSE); DisplayString(IDS_I_NEWLINE); } } /*------------------------------------------------------------------------ Name :DisplayVERBSWITCHESHelp Synopsis :Displays help on Type :Member Function Input parameter : rParsedInfo - reference to CParsedInfo class object Output parameters :None Return Type :void Global Variables :None Calling Syntax :DisplayVERBSWITCHESHelp(rParsedInfo) Notes :None ------------------------------------------------------------------------*/ void CFormatEngine::DisplayVERBSWITCHESHelp(CParsedInfo& rParsedInfo) { _TCHAR *pszVerbName = rParsedInfo.GetCmdSwitchesObject().GetVerbName(); BOOL bInstanceHelp = TRUE; if(CompareTokens(pszVerbName, CLI_TOKEN_DELETE)) { if(rParsedInfo.GetCmdSwitchesObject(). GetInteractiveMode() != INTERACTIVE) { DisplayDELETEUsage(rParsedInfo); } } DisplayString(IDS_I_NEWLINE); DisplayString(IDS_I_USAGE); if(CompareTokens(pszVerbName, CLI_TOKEN_CALL) || CompareTokens(pszVerbName, CLI_TOKEN_SET) || CompareTokens(pszVerbName, CLI_TOKEN_DELETE)) { if(IsClassOperation(rParsedInfo)) { bInstanceHelp = FALSE; } else { if(CompareTokens(pszVerbName, CLI_TOKEN_CALL)) { if ( rParsedInfo.GetCmdSwitchesObject(). GetAliasName() != NULL ) { if (rParsedInfo.GetCmdSwitchesObject(). GetWhereExpression() == NULL) { bInstanceHelp = FALSE; } else { bInstanceHelp = TRUE; } } else { if ((rParsedInfo.GetCmdSwitchesObject(). GetPathExpression() != NULL) && (rParsedInfo.GetCmdSwitchesObject(). GetWhereExpression() == NULL)) { bInstanceHelp = FALSE; } else { bInstanceHelp = TRUE; } } } else { bInstanceHelp = TRUE; } } } else { bInstanceHelp = FALSE; } if(bInstanceHelp) { DisplayString(IDS_I_VERB_INTERACTIVE_DESC1); DisplayString(IDS_I_VERB_INTERACTIVE_DESC2); DisplayString(IDS_I_NEWLINE); DisplayString(IDS_I_PROPERTYLIST_NOTE1); } else { DisplayString(IDS_I_VERB_SWITCH_INTERACTIVE_DESC); } if(rParsedInfo.GetCmdSwitchesObject().GetInteractiveMode() != INTERACTIVE) { DisplayString(IDS_I_VERB_SWITCH_NOINTERACTIVE_DESC); } } /*------------------------------------------------------------------------ Name :DisplayCOMError Synopsis :Displays the formatted COM error Type :Member Function Input parameter : rParsedInfo - reference to CParsedInfo class object Output parameters :None Return Type :void Global Variables :None Calling Syntax :DisplayCOMError(rParsedInfo) Notes :None ------------------------------------------------------------------------*/ void CFormatEngine::DisplayCOMError(CParsedInfo& rParsedInfo) { _com_error* pComError = NULL; _TCHAR szBuffer[BUFFER32] = NULL_STRING; _bstr_t bstrErr, bstrFacility, bstrMsg; // Get the TRACE status and store it in m_bTrace m_bTrace = rParsedInfo.GetGlblSwitchesObject().GetTraceStatus(); // Get the Logging mode (VERBOSE | ERRORONLY | NOLOGGING) and store // it in m_eloErrLogOpt m_eloErrLogOpt = rParsedInfo.GetErrorLogObject().GetErrLogOption(); try { //Getting the _com_error data. pComError = rParsedInfo.GetCmdSwitchesObject().GetCOMError(); m_ErrInfo.GetErrorString(pComError->Error(), m_bTrace, bstrErr, bstrFacility); //Printing the _com_error into a string for displaying it if (m_bTrace || m_eloErrLogOpt) { _stprintf(szBuffer, _T("0x%x"), pComError->Error()); WMIFormatMessage(IDS_I_ERROR_MSG, 3, bstrMsg, szBuffer, (LPWSTR) bstrErr, (LPWSTR)bstrFacility); } else { WMIFormatMessage(IDS_I_ERROR_MSG_NOTRACE, 1, bstrMsg, (LPWSTR)bstrErr); } DisplayMessage((LPWSTR) bstrMsg, CP_OEMCP, TRUE, FALSE); } catch(_com_error& e) { _com_issue_error(e.Error()); } } /*------------------------------------------------------------------------ Name :DisplayGlobalSwitchesBrief Synopsis :Display help for global switches in brief Type :Member Function Input parameter :None Output parameters :None Return Type :void Global Variables :None Calling Syntax :DisplayGlobalSwitchesBrief() Notes :None ------------------------------------------------------------------------*/ void CFormatEngine::DisplayGlobalSwitchesBrief() { DisplayString(IDS_I_NAMESPACE_BRIEF); DisplayString(IDS_I_ROLE_BRIEF); DisplayString(IDS_I_NODE_BRIEF); DisplayString(IDS_I_IMPLEVEL_BRIEF); DisplayString(IDS_I_AUTHLEVEL_BRIEF); DisplayString(IDS_I_LOCALE_BRIEF); DisplayString(IDS_I_PRIVILEGES_BRIEF); DisplayString(IDS_I_TRACE_BRIEF); DisplayString(IDS_I_RECORD_BRIEF); DisplayString(IDS_I_INTERACTIVE_BRIEF); DisplayString(IDS_I_FAILFAST_BRIEF); DisplayString(IDS_I_USER_BRIEF); DisplayString(IDS_I_PASSWORD_BRIEF); DisplayString(IDS_I_OUTPUT_BRIEF); DisplayString(IDS_I_APPEND_BRIEF); DisplayString(IDS_I_AGGREGATE_BRIEF); DisplayString(IDS_I_AUTHORITY_BRIEF); DisplayString(IDS_I_HELPBRIEF); DisplayString(IDS_I_NEWLINE); DisplayString(IDS_I_GLBL_MORE); } /*------------------------------------------------------------------------ Name :DisplayContext Synopsis :Displays the environment variables (i.e global switches) Type :Member Function Input parameter : rParsedInfo - reference to rParsedInfo object Output parameters :None Return Type :None Global Variables :None Calling Syntax :DisplayContext(rParsedInfo) Notes :None ------------------------------------------------------------------------*/ void CFormatEngine::DisplayContext(CParsedInfo& rParsedInfo) { _bstr_t bstrTemp; // NAMESPACE DisplayString(IDS_I_NAMESPACE_VALUE, TRUE, rParsedInfo.GetGlblSwitchesObject().GetNameSpace()); // ROLE DisplayString(IDS_I_ROLE_VALUE, TRUE, rParsedInfo.GetGlblSwitchesObject().GetRole()); // NODE(S) rParsedInfo.GetGlblSwitchesObject().GetNodeString(bstrTemp); DisplayString(IDS_I_NODELIST_VALUE, TRUE, (LPWSTR)bstrTemp); // IMPLEVEL rParsedInfo.GetGlblSwitchesObject().GetImpLevelTextDesc(bstrTemp); DisplayString(IDS_I_IMPLEVEL_VALUE, TRUE, (LPWSTR)bstrTemp); // AUTHORITY rParsedInfo.GetAuthorityDesc(bstrTemp); DisplayString(IDS_I_AUTHORITY_VALUE, TRUE, (LPWSTR)bstrTemp); // AUTHLEVEL rParsedInfo.GetGlblSwitchesObject().GetAuthLevelTextDesc(bstrTemp); DisplayString(IDS_I_AUTHLEVEL_VALUE, TRUE, (LPWSTR)bstrTemp); // LOCALE DisplayString(IDS_I_LOCALE_VALUE, TRUE, rParsedInfo.GetGlblSwitchesObject().GetLocale()); // PRIVILEGES rParsedInfo.GetGlblSwitchesObject().GetPrivilegesTextDesc(bstrTemp); DisplayString(IDS_I_PRIVILEGES_VALUE, TRUE, (LPWSTR)bstrTemp); // TRACE rParsedInfo.GetGlblSwitchesObject().GetTraceTextDesc(bstrTemp); DisplayString(IDS_I_TRACE_VALUE, TRUE, (LPWSTR)bstrTemp); // RECORDPATH rParsedInfo.GetGlblSwitchesObject().GetRecordPathDesc(bstrTemp); DisplayString(IDS_I_RECORDPATH_VALUE, TRUE, (LPWSTR)bstrTemp); // INTERACTIVE rParsedInfo.GetGlblSwitchesObject().GetInteractiveTextDesc(bstrTemp); DisplayString(IDS_I_INTERACTIVE_VALUE, TRUE, (LPWSTR)bstrTemp); // FAILFAST rParsedInfo.GetGlblSwitchesObject().GetFailFastTextDesc(bstrTemp); DisplayString(IDS_I_FAILFAST_VALUE, TRUE, (LPWSTR)bstrTemp); // TRUE for OUTPUT option. rParsedInfo.GetGlblSwitchesObject().GetOutputOrAppendTextDesc(bstrTemp, TRUE); DisplayString(IDS_I_OUTPUT_VALUE, TRUE, (LPWSTR)bstrTemp); // FALSE for APPEND option. rParsedInfo.GetGlblSwitchesObject().GetOutputOrAppendTextDesc(bstrTemp, FALSE); DisplayString(IDS_I_APPEND_VALUE, TRUE, (LPWSTR)bstrTemp); // USER rParsedInfo.GetUserDesc(bstrTemp); DisplayString(IDS_I_USER_VALUE, TRUE, (LPWSTR)bstrTemp); //AGGREGATE if(rParsedInfo.GetGlblSwitchesObject().GetAggregateFlag()) DisplayString(IDS_I_AGGREGATE_VALUE, TRUE, CLI_TOKEN_ON); else DisplayString(IDS_I_AGGREGATE_VALUE, TRUE, CLI_TOKEN_OFF); } /*------------------------------------------------------------------------ Name :DisplayContextHelp Synopsis :Displays the help on CONTEXT keyword Type :Member Function Input parameter :None Output parameters :None Return Type :None Global Variables :None Calling Syntax :DisplayContextHelp() Notes :None ------------------------------------------------------------------------*/ void CFormatEngine::DisplayContextHelp() { DisplayString(IDS_I_NEWLINE); DisplayString(IDS_I_CONTEXT_DESC); DisplayString(IDS_I_USAGE); DisplayString(IDS_I_NEWLINE); DisplayString(IDS_I_CONTEXT_USAGE); } /*------------------------------------------------------------------------ Name :ApplyTranslateTable Synopsis :Processes the translation specified in translate table. Type :Member Function Input parameter : rParsedInfo - CParsedInfo object, input information. Output parameters : strString - STRING type, string to be translated. Return Type :void Global Variables :None Calling Syntax :ApplyTranslateTable(strOutput, rParsedInfo) Notes :None ------------------------------------------------------------------------*/ void CFormatEngine::ApplyTranslateTable(STRING& strString, CParsedInfo& rParsedInfo) { BSTRMAP bmTransTbl = rParsedInfo.GetCmdSwitchesObject(). GetAlsFrnNmsOrTrnsTblMap(); BSTRMAP::iterator iTransTblEntry; for( iTransTblEntry = bmTransTbl.begin(); iTransTblEntry != bmTransTbl.end();iTransTblEntry++ ) { _TCHAR cValue1, cValue2, cTemp; if ( IsValueSet((*iTransTblEntry).first, cValue1, cValue2) ) { for ( cTemp = cValue1; cTemp <= cValue2 ; cTemp++) { _TCHAR szTemp[2]; szTemp[0] = cTemp; szTemp[1] = _T('\0'); FindAndReplaceAll(strString, szTemp, (*iTransTblEntry).second); } } else { FindAndReplaceAll(strString, (*iTransTblEntry).first, (*iTransTblEntry).second); } } } /*------------------------------------------------------------------------ Name :DisplayInvalidProperties Synopsis :Displays the list of invalid properties Type :Member Function Input parameter : rParsedInfo - CParsedInfo object, input information. bSetVerb - SET verb Output parameters :None Return Type :void Global Variables :None Calling Syntax :DisplayInvalidProperties(rParsedInfo, bSetVerb) Notes :None ------------------------------------------------------------------------*/ void CFormatEngine::DisplayInvalidProperties(CParsedInfo& rParsedInfo, BOOL bSetVerb) { CHARVECTOR::iterator cvIterator = NULL; LONG lCount = 0; _bstr_t bstrMsg; try { // Get the list of properties. CHARVECTOR cvPropertyList = rParsedInfo.GetCmdSwitchesObject(). GetPropertyList(); // Get the property details pooled up from alias definition PROPDETMAP pdmPropDetMap = rParsedInfo.GetCmdSwitchesObject(). GetPropDetMap(); if (cvPropertyList.size() != pdmPropDetMap.size() && cvPropertyList.size() != 0) { for ( cvIterator = cvPropertyList.begin(); cvIterator != cvPropertyList.end(); cvIterator++ ) { PROPDETMAP::iterator tempIterator = NULL; if ( !Find(pdmPropDetMap, *cvIterator, tempIterator) ) { if ( lCount == 0) { bstrMsg += _bstr_t(*cvIterator); } else { bstrMsg += _bstr_t(L", ") + _bstr_t(*cvIterator); } lCount++; } } DisplayString(IDS_I_NEWLINE); if (bSetVerb) DisplayString(IDS_I_INVALID_NOWRITE_PROS, TRUE, (LPWSTR)bstrMsg); else DisplayString(IDS_I_INVALID_PROS, TRUE, (LPWSTR)bstrMsg); } } catch(_com_error& e) { _com_issue_error(e.Error()); } } /*------------------------------------------------------------------------ Name :DisplayLargeString Synopsis :Displays the large string line by line. And respond to Ctr+C event. Type :Member Function Input parameter(s): rParsedInfo - CParsedInfo object, input information. strLargeString - reference to STRING object. Output parameter(s):None Return Type :void Global Variables :None Calling Syntax :DisplayLargeString(rParsedInfo, stroutput) Notes :None ------------------------------------------------------------------------*/ void CFormatEngine::DisplayLargeString(CParsedInfo& rParsedInfo, STRING& strLargeString) { size_t nLineStart = 0; size_t nLineEnd = 0; while ( TRUE ) { if ( g_wmiCmd.GetBreakEvent() == TRUE ) { DisplayString(IDS_I_NEWLINE); break; } nLineEnd = strLargeString.find(_T("\n"), nLineStart); if ( nLineEnd == STRING::npos ) { // // string may not be terminated by \n // check for NULL terminator // nLineEnd = strLargeString.find(_T("\0"), nLineStart); } if ( nLineEnd != STRING::npos ) { DisplayString( (LPTSTR) strLargeString.substr ( nLineStart, ( nLineEnd - nLineStart + 1 ) ).data() ) ; nLineStart = nLineEnd + 1; } else { DisplayString(IDS_I_NEWLINE); break; } } } /*------------------------------------------------------------------------ Name :TraverseNode Synopsis :Travese through XML stream node by node and translate all nodes Type :Member Function Input parameter : rParsedInfo - CParsedInfo object, input information. Output parameters :None Return Type :BOOL Global Variables :None Calling Syntax :TraverseNode(rParsedInfo) Notes :None ------------------------------------------------------------------------*/ BOOL CFormatEngine::TraverseNode(CParsedInfo& rParsedInfo) { HRESULT hr = S_OK; IXMLDOMElement *pIXMLDOMElement = NULL; IXMLDOMNodeList *pIDOMNodeList = NULL; IXMLDOMNode *pIDOMNode = NULL; IXMLDOMNode *pIParentNode = NULL; IXMLDOMNode *pINewNode = NULL; LONG lValue = 0; BSTR bstrItemText = NULL; BOOL bRet = TRUE; DWORD dwThreadId = GetCurrentThreadId(); try { if(m_pIXMLDoc != NULL) { _bstr_t bstrTemp = rParsedInfo.GetCmdSwitchesObject(). GetXMLResultSet(); // Load the XML stream VARIANT_BOOL varBool; hr = m_pIXMLDoc->loadXML(bstrTemp, &varBool); if (m_bTrace || m_eloErrLogOpt) { WMITRACEORERRORLOG(hr, __LINE__, __FILE__, _T("IXMLDOMDocument::loadXML(-, -)"), dwThreadId, rParsedInfo, m_bTrace); } ONFAILTHROWERROR(hr); if(varBool == VARIANT_TRUE) { // Get the document element. hr = m_pIXMLDoc->get_documentElement(&pIXMLDOMElement); if (m_bTrace || m_eloErrLogOpt) { WMITRACEORERRORLOG(hr, __LINE__, __FILE__, _T("IXMLDOMDocument::get_documentElement(-)"), dwThreadId, rParsedInfo, m_bTrace); } ONFAILTHROWERROR(hr); if (pIXMLDOMElement != NULL) { // Get the Node List named in the current XML doc hr = pIXMLDOMElement->getElementsByTagName (_bstr_t(L"VALUE"), &pIDOMNodeList); if (m_bTrace || m_eloErrLogOpt) { WMITRACEORERRORLOG(hr, __LINE__, __FILE__, _T("IXMLDOMElement::getElementsByTagName" L"(L\"VALUE\", -)"), dwThreadId, rParsedInfo, m_bTrace); } ONFAILTHROWERROR(hr); // Get the length of the node list hr = pIDOMNodeList->get_length(&lValue); if (m_bTrace || m_eloErrLogOpt) { WMITRACEORERRORLOG(hr, __LINE__, __FILE__, _T("IXMLDOMNodeList::get_length(-)"), dwThreadId, rParsedInfo, m_bTrace); } ONFAILTHROWERROR(hr); // Traverse through full node list and apply // translate table on each node for(WMICLIINT ii = 0; ii < lValue; ii++) { // Get a node from node list hr = pIDOMNodeList->get_item(ii, &pIDOMNode); if (m_bTrace || m_eloErrLogOpt) { WMITRACEORERRORLOG(hr, __LINE__, __FILE__, _T("IXMLDOMNodeList::get_item(-,-)"), dwThreadId, rParsedInfo, m_bTrace); } ONFAILTHROWERROR(hr); if (pIDOMNode == NULL) continue; // Get the value stored in the node hr = pIDOMNode->get_text(&bstrItemText); if (m_bTrace || m_eloErrLogOpt) { WMITRACEORERRORLOG(hr, __LINE__, __FILE__, _T("IXMLDOMNode::get_text(-)"), dwThreadId, rParsedInfo, m_bTrace); } ONFAILTHROWERROR(hr); // Get the parent node of the current node to store // the translated value in the current node hr = pIDOMNode->get_parentNode(&pIParentNode); if (m_bTrace || m_eloErrLogOpt) { WMITRACEORERRORLOG(hr, __LINE__, __FILE__, _T("IXMLDOMNode::get_parentNode(-)"), dwThreadId, rParsedInfo, m_bTrace); } ONFAILTHROWERROR(hr); // Create a clone node of current node VARIANT_BOOL vBool = VARIANT_FALSE; hr = pIDOMNode->cloneNode(vBool, &pINewNode); if (m_bTrace || m_eloErrLogOpt) { WMITRACEORERRORLOG(hr, __LINE__, __FILE__, _T("IXMLDOMNode::cloneNode(-,-)"), dwThreadId, rParsedInfo, m_bTrace); } ONFAILTHROWERROR(hr); if (pINewNode != NULL && pIParentNode != NULL) { // If /TRANSLATE:
is specified. STRING strOutput((_TCHAR*)bstrItemText); if ( rParsedInfo.GetCmdSwitchesObject(). GetTranslateTableName() != NULL ) { // Translate the result ApplyTranslateTable(strOutput, rParsedInfo); } // Reconvert the char string into BSTR string _bstr_t bstrTemp = _bstr_t((LPTSTR)strOutput.data()); // Write the translated value into new node hr = pINewNode->put_text(bstrTemp); if (m_bTrace || m_eloErrLogOpt) { WMITRACEORERRORLOG(hr, __LINE__, __FILE__, _T("IXMLDOMNode::put_text(-)"), dwThreadId, rParsedInfo, m_bTrace); } ONFAILTHROWERROR(hr); // Replace current node with translated node hr = pIParentNode->replaceChild(pINewNode, pIDOMNode, NULL); if (m_bTrace || m_eloErrLogOpt) { WMITRACEORERRORLOG(hr, __LINE__, __FILE__, _T("IXMLDOMNode::replaceChild(-,-,-)"), dwThreadId, rParsedInfo, m_bTrace); } ONFAILTHROWERROR(hr); } SAFEBSTRFREE(bstrItemText); bstrItemText = NULL; SAFEIRELEASE(pINewNode); SAFEIRELEASE(pIParentNode); SAFEIRELEASE(pIDOMNode); } SAFEIRELEASE(pIDOMNodeList); SAFEIRELEASE(pIXMLDOMElement); bRet = TRUE; } } else bRet = FALSE; } else bRet = FALSE; } catch(_com_error& e) { SAFEIRELEASE(pIParentNode); SAFEIRELEASE(pINewNode); SAFEIRELEASE(pIDOMNode); SAFEIRELEASE(pIDOMNodeList); SAFEIRELEASE(pIXMLDOMElement); SAFEBSTRFREE(bstrItemText); rParsedInfo.GetCmdSwitchesObject().SetCOMError(e); bRet = FALSE; } return bRet; } /*------------------------------------------------------------------------ Name :DisplayRESULTCLASSHelp Synopsis :Displays help for RESULT CLASS switch Type :Member Function Input parameter :None Output parameters :None Return Type :void Global Variables :None Calling Syntax :DisplayRESULTCLASSHelp() Notes :None ------------------------------------------------------------------------*/ void CFormatEngine::DisplayRESULTCLASSHelp() { DisplayString(IDS_I_NEWLINE); DisplayString(IDS_I_SWITCH_RESULTCLASS_DESC_FULL); DisplayString(IDS_I_USAGE); DisplayString(IDS_I_NEWLINE); DisplayString(IDS_I_SWITCH_RESULTCLASS_USAGE); } /*------------------------------------------------------------------------ Name :DisplayRESULTROLEHelp Synopsis :Displays help for RESULT ROLE switch Type :Member Function Input parameter :None Output parameters :None Return Type :void Global Variables :None Calling Syntax :DisplayRESULTROLEHelp() Notes :None ------------------------------------------------------------------------*/ void CFormatEngine::DisplayRESULTROLEHelp() { DisplayString(IDS_I_NEWLINE); DisplayString(IDS_I_SWITCH_RESULTROLE_DESC_FULL ); DisplayString(IDS_I_USAGE); DisplayString(IDS_I_NEWLINE); DisplayString(IDS_I_SWITCH_RESULTROLE_USAGE); } /*------------------------------------------------------------------------ Name :DisplayASSOCCLASSHelp Synopsis :Displays help for ASSOCCLASS switch Type :Member Function Input parameter :None Output parameters :None Return Type :void Global Variables :None Calling Syntax :DisplayASSOCCLASSHelp() Notes :None ------------------------------------------------------------------------*/ void CFormatEngine::DisplayASSOCCLASSHelp() { DisplayString(IDS_I_NEWLINE); DisplayString(IDS_I_SWITCH_ASSOCCLASS_DESC_FULL); DisplayString(IDS_I_USAGE); DisplayString(IDS_I_NEWLINE); DisplayString(IDS_I_SWITCH_ASSOCCLASS_USAGE); } /*------------------------------------------------------------------------ Name :AppendtoOutputString Synopsis :Appends the content currently being displayed, to the m_chsOutput which will be used for XML logging Type :Member Function Input parameter : pszOutput - output string Output parameters :None Return Type :void Global Variables :None Calling Syntax :AppendtoOutputString(pszOutput) Notes :None ------------------------------------------------------------------------*/ void CFormatEngine::AppendtoOutputString(_TCHAR* pszOutput) { m_chsOutput += pszOutput; } /*------------------------------------------------------------------------ Name :DoCascadeTransforms Synopsis :Does cascading transforms on the XML output obtained as result (the intermediate transforms should data which is DOM compliant) Type :Member Function Input parameter : rParsedInfo - reference to CParsedInfo object Output parameters : bstrOutput - transformed output Return Type :BOOL Global Variables :None Calling Syntax :DoCascadeTransforms(rParsedInfo, bstrOutput) Notes :None ------------------------------------------------------------------------*/ BOOL CFormatEngine::DoCascadeTransforms(CParsedInfo& rParsedInfo, _bstr_t& bstrOutput) { HRESULT hr = S_OK; IXMLDOMDocument2 *pIStyleSheet = NULL; IXMLDOMDocument2 *pIObject = NULL; IXSLTemplate *pITemplate = NULL; IXSLProcessor *pIProcessor = NULL; VARIANT varValue, vtOutStream; VariantInit(&varValue); VariantInit(&vtOutStream); VARIANT_BOOL varLoad = VARIANT_FALSE; XSLTDETVECTOR vecXSLDetails; XSLTDETVECTOR::iterator vecEnd = NULL, vecIterator = NULL; BSTRMAP::iterator mapItrtr = NULL, mapEnd = NULL; BOOL bFirst = TRUE; DWORD dwCount = 0; DWORD dwSize = 0; BOOL bRet = TRUE; CHString chsMsg; DWORD dwThreadId = GetCurrentThreadId(); CFileOutputStream outStrm; vecXSLDetails = rParsedInfo.GetCmdSwitchesObject().GetXSLTDetailsVector(); try { // Create single instance of the IXSLTemplate hr = CoCreateInstance(CLSID_XSLTemplate, NULL, CLSCTX_SERVER, IID_IXSLTemplate, (LPVOID*)(&pITemplate)); if (m_bTrace || m_eloErrLogOpt) { chsMsg.Format(L"CoCreateInstance(CLSID_XSLTemplate, NULL," L" CLSCTX_SERVER, IID_IXSLTemplate, -)"); WMITRACEORERRORLOG(hr, __LINE__, __FILE__, (LPCWSTR)chsMsg, dwThreadId, rParsedInfo, m_bTrace); } ONFAILTHROWERROR(hr); if (pITemplate) { vecIterator = vecXSLDetails.begin(); vecEnd = vecXSLDetails.end(); dwSize = vecXSLDetails.size(); // Loop thru the list of cascading transforms specified. while (vecIterator != vecEnd) { // Create single instance of IXMLDOMDocument2 hr = CoCreateInstance(CLSID_FreeThreadedDOMDocument, NULL, CLSCTX_SERVER, IID_IXMLDOMDocument2, (LPVOID*) (&pIStyleSheet)); if (m_bTrace || m_eloErrLogOpt) { chsMsg.Format(L"CoCreateInstance(" L"CLSID_FreeThreadedDOMDocument, NULL, CLSCTX_SERVER," L"IID_IXMLDOMDocument2, -)"); WMITRACEORERRORLOG(hr, __LINE__, __FILE__, (LPCWSTR)chsMsg, dwThreadId, rParsedInfo, m_bTrace); } ONFAILTHROWERROR(hr); if (pIStyleSheet) { hr = pIStyleSheet->put_async(VARIANT_FALSE); if (m_bTrace || m_eloErrLogOpt) { chsMsg.Format(L"IXSLDOMDocument2::put_async(" L"VARIANT_FALSE)"); WMITRACEORERRORLOG(hr, __LINE__, __FILE__, (LPCWSTR)chsMsg, dwThreadId, rParsedInfo, m_bTrace); } ONFAILTHROWERROR(hr); dwCount++; // Load the transform document (xsl) hr = pIStyleSheet->load(_variant_t((*vecIterator) .FileName), &varLoad); if (m_bTrace || m_eloErrLogOpt) { chsMsg.Format(L"IXSLDOMDocument2::load(" L"L\"%s\", -)", (WCHAR*)(*vecIterator).FileName); WMITRACEORERRORLOG(hr, __LINE__, __FILE__, (LPCWSTR)chsMsg, dwThreadId, rParsedInfo, m_bTrace); } ONFAILTHROWERROR(hr); if (varLoad == VARIANT_TRUE) { // Add the reference of the stylesheet to the // IXSLTemplate object hr = pITemplate->putref_stylesheet(pIStyleSheet); if (m_bTrace || m_eloErrLogOpt) { chsMsg.Format(L"IXSTemplate::putref_stylesheet(" L"-)"); WMITRACEORERRORLOG(hr, __LINE__, __FILE__, (LPCWSTR)chsMsg, dwThreadId, rParsedInfo, m_bTrace); } ONFAILTHROWERROR(hr); // Create the processor object hr = pITemplate->createProcessor(&pIProcessor); if (m_bTrace || m_eloErrLogOpt) { chsMsg.Format(L"IXSTemplate::createProcessor(" L"-)"); WMITRACEORERRORLOG(hr, __LINE__, __FILE__, (LPCWSTR)chsMsg, dwThreadId, rParsedInfo, m_bTrace); } ONFAILTHROWERROR(hr); if (pIProcessor) { // If parameters are specified if ((*vecIterator).ParamMap.size()) { // Add the list of parameters specified to the // IXSLProcessor interface object hr = AddParameters(rParsedInfo, pIProcessor, (*vecIterator).ParamMap); ONFAILTHROWERROR(hr); } // If first tranformation, then feed the XML data // loaded into m_pIXMLDoc for transformation if (bFirst) { hr = pIProcessor->put_input( _variant_t(m_pIXMLDoc)); bFirst = FALSE; } else { // Intermediate transformation - load the // result data obtained in previous // transformation hr = pIProcessor->put_input( _variant_t(pIObject)); } if (m_bTrace || m_eloErrLogOpt) { chsMsg.Format(L"IXSProcessor::put_input(" L"-)"); WMITRACEORERRORLOG(hr, __LINE__, __FILE__, (LPCWSTR)chsMsg, dwThreadId, rParsedInfo, m_bTrace); } ONFAILTHROWERROR(hr); // if last transform then direct output to file // Streaming of output is done only if output // redirection is specified or in case inline // /output command if (dwCount == dwSize) { // Set output stream i.e output file or // redirection file. // This function if ( SetOutputStream(outStrm, vtOutStream) == TRUE ) { // Put output stream in IXSLProcessor // so that when transform() is executed // output goes directly to the stream // i.e output file or redirection file hr = pIProcessor->put_output(vtOutStream); if (m_bTrace || m_eloErrLogOpt) { chsMsg.Format(L"IXSProcessor::put_output(" L"-)"); WMITRACEORERRORLOG(hr, __LINE__, __FILE__, (LPCWSTR)chsMsg, dwThreadId, rParsedInfo, m_bTrace); } ONFAILTHROWERROR(hr); } } // Transform the content hr = pIProcessor->transform(&varLoad); if (m_bTrace || m_eloErrLogOpt) { chsMsg.Format(L"IXSProcessor::tranform(" L"-)"); WMITRACEORERRORLOG(hr, __LINE__, __FILE__, (LPCWSTR)chsMsg, dwThreadId, rParsedInfo, m_bTrace); } ONFAILTHROWERROR(hr); // If last transform is streamed out to stream // specified by put_output() then apply again // transform to get output in Unicode string // which can be used in XML logging and for // append file if (dwCount == dwSize && m_bOutputGoingToStream == TRUE) { // Stop streaming output to out files V_VT(&vtOutStream) = VT_EMPTY; pIProcessor->put_output(vtOutStream); // Execute transform again to get output // in Unicode string hr = pIProcessor->transform(&varLoad); if (m_bTrace || m_eloErrLogOpt) { chsMsg.Format(L"IXSProcessor::tranform(" L"-)"); WMITRACEORERRORLOG(hr, __LINE__, __FILE__, (LPCWSTR)chsMsg, dwThreadId, rParsedInfo, m_bTrace); } ONFAILTHROWERROR(hr); } if (varLoad == VARIANT_TRUE) { // Retrieve the output hr = pIProcessor->get_output(&varValue); if (m_bTrace || m_eloErrLogOpt) { chsMsg.Format(L"IXSProcessor::" L"get_output(-)"); WMITRACEORERRORLOG(hr, __LINE__, __FILE__, (LPCWSTR)chsMsg, dwThreadId, rParsedInfo, m_bTrace); } ONFAILTHROWERROR(hr); // intermediate transform if (dwCount != dwSize) { if (pIObject == NULL) { hr = CoCreateInstance(CLSID_FreeThreadedDOMDocument, NULL, CLSCTX_SERVER, IID_IXMLDOMDocument2, (LPVOID*)(&pIObject)); if (m_bTrace || m_eloErrLogOpt) { chsMsg.Format(L"CoCreateInstance(" L"CLSID_FreeThreadedDOMDocument, NULL," L" CLSCTX_INPROC_SERVER, " L"IID_IXMLDOMDocument2, -)"); WMITRACEORERRORLOG(hr, __LINE__, __FILE__, (LPCWSTR)chsMsg, dwThreadId, rParsedInfo, m_bTrace); } ONFAILTHROWERROR(hr); } hr = pIObject->loadXML( varValue.bstrVal, &varLoad); if (m_bTrace || m_eloErrLogOpt) { chsMsg.Format(L"IXMLDOMDocument2::" L"loadXML(-, -)"); WMITRACEORERRORLOG(hr, __LINE__, __FILE__, (LPCWSTR)chsMsg, dwThreadId, rParsedInfo, m_bTrace); } ONFAILTHROWERROR(hr); if (varLoad == VARIANT_FALSE) { // Invalid XML content. rParsedInfo.GetCmdSwitchesObject(). SetErrataCode( IDS_E_INVALID_XML_CONTENT); bRet = FALSE; break; } } // last transform - print the result. else { bstrOutput = _bstr_t(varValue); } VariantClear(&varValue); } SAFEIRELEASE(pIProcessor); } } else { // Invalid XSL format. rParsedInfo.GetCmdSwitchesObject() .SetErrataCode(IDS_E_INVALID_FORMAT); bRet = FALSE; break; } SAFEIRELEASE(pIStyleSheet); } vecIterator++; } VariantClear(&vtOutStream); SAFEIRELEASE(pIProcessor); SAFEIRELEASE(pITemplate); SAFEIRELEASE(pIObject); SAFEIRELEASE(pITemplate); } } catch(_com_error& e) { rParsedInfo.GetCmdSwitchesObject().SetCOMError(e); VariantClear(&varValue); VariantClear(&vtOutStream); SAFEIRELEASE(pIProcessor); SAFEIRELEASE(pIStyleSheet); SAFEIRELEASE(pITemplate); SAFEIRELEASE(pIObject); bRet = FALSE; } //trap for CHeap_Exception catch(CHeap_Exception) { VariantClear(&varValue); VariantClear(&vtOutStream); SAFEIRELEASE(pIProcessor); SAFEIRELEASE(pIStyleSheet); SAFEIRELEASE(pITemplate); SAFEIRELEASE(pIObject); bRet = FALSE; hr = WBEM_E_OUT_OF_MEMORY; _com_issue_error(hr); } return bRet; } /*------------------------------------------------------------------------ Name :AddParameters Synopsis :Adds parameters to the IXSLProcessor object Type :Member Function Input parameter : rParsedInfo - reference to CParsedInfo object pIProcessor - IXSLProcessor object bstrmapParam - parameter map Output parameters :None Return Type :HRESULT Global Variables :None Calling Syntax :AddParameters(rParsedInfo, pIProcessor, bstrmapParam) Notes :None ------------------------------------------------------------------------*/ HRESULT CFormatEngine::AddParameters(CParsedInfo& rParsedInfo, IXSLProcessor *pIProcessor, BSTRMAP bstrmapParam) { HRESULT hr = S_OK; BSTRMAP::iterator mapItrtr = NULL, mapEnd = NULL; _bstr_t bstrProp, bstrVal; CHString chsMsg; DWORD dwThreadId = GetCurrentThreadId(); try { mapItrtr = bstrmapParam.begin(); mapEnd = bstrmapParam.end(); // Loop thru the available parameters while (mapItrtr != mapEnd) { bstrProp = (*mapItrtr).first; bstrVal = (*mapItrtr).second; // Add the parameter to the IXSLProcessor hr = pIProcessor->addParameter(bstrProp, _variant_t(bstrVal)); if (m_bTrace || m_eloErrLogOpt) { chsMsg.Format(L"IXSProcessor::addParameter(L\"%s\", -)", (WCHAR*) bstrProp); WMITRACEORERRORLOG(hr, __LINE__, __FILE__, (LPCWSTR)chsMsg, dwThreadId, rParsedInfo, m_bTrace); } ONFAILTHROWERROR(hr); mapItrtr++; } } catch(_com_error& e) { hr = e.Error(); } catch(CHeap_Exception) { hr = WBEM_E_OUT_OF_MEMORY; _com_issue_error(hr); } return hr; } /*------------------------------------------------------------------------ Name :SetOutputStream Synopsis :Sets the output stream, if /OUTPUT if FILEOUTPUT and is inline command i.e /OUTPUT:file command, Or output redirection is specified. Type :Member Function Input parameter : Output parameters : fosFileOutputStream - CFileOutputStream object, initialized output stream vtStream - VARIANT type, holds the stream object Return Type :BOOL Global Variables :None Calling Syntax :SetOutputStream(outStrm, vtOutStream); Notes :None ------------------------------------------------------------------------*/ BOOL CFormatEngine::SetOutputStream(CFileOutputStream& fosFileOutputStream, VARIANT& vtStream) { BOOL bRet = TRUE; HRESULT hr = S_OK; try { if ( m_bGetOutOpt == TRUE ) { // Get the output option to redirect the output. m_opsOutputOpt = g_wmiCmd.GetParsedInfoObject(). GetGlblSwitchesObject(). GetOutputOrAppendOption(TRUE); m_bGetOutOpt = FALSE; } // If Output is directed to file and /OUTPUT is appearing in command // i.e ( /OUTPUT: command ) if ( m_opsOutputOpt == FILEOUTPUT && g_wmiCmd.GetParsedInfoObject().GetCmdSwitchesObject(). GetOutputSwitchFlag() == TRUE ) { // Close the output file which is already opened in text mode. if ( CloseOutputFile() == TRUE ) { // Make Out file pointer NULL. m_fpOutFile = NULL; // Set output file to stream hr = fosFileOutputStream.Init( g_wmiCmd. GetParsedInfoObject(). GetGlblSwitchesObject(). GetOutputOrAppendFileName(TRUE)); ONFAILTHROWERROR(hr); } m_bOutputGoingToStream = TRUE; } else if ( IsRedirection() == TRUE ) // If output redirection is specified { HANDLE hFile = GetStdHandle(STD_OUTPUT_HANDLE); BOOL bOutputGoingToStream = FALSE; if (FILE_TYPE_DISK == GetFileType(hFile)) { bOutputGoingToStream = TRUE; } if(bOutputGoingToStream) { hr = fosFileOutputStream.Init(GetStdHandle(STD_OUTPUT_HANDLE)); ONFAILTHROWERROR(hr); m_bOutputGoingToStream = TRUE; } } if ( m_bOutputGoingToStream == TRUE ) { V_VT(&vtStream) = VT_UNKNOWN; V_UNKNOWN(&vtStream) = &fosFileOutputStream; } else bRet = FALSE; } catch(_com_error& e) { g_wmiCmd.GetParsedInfoObject().GetCmdSwitchesObject().SetCOMError(e); bRet = FALSE; } return bRet; }