⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 stafprocessservice.cpp

📁 Software Testing Automation Framework (STAF)的开发代码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
/*****************************************************************************//* Software Testing Automation Framework (STAF)                              *//* (C) Copyright IBM Corp. 2001, 2004, 2005                                  *//*                                                                           *//* This software is licensed under the Common Public License (CPL) V1.0.     *//*****************************************************************************/#include "STAF.h"#include <deque>#include "STAF_iostream.h"#include "STAF_fstream.h"#include "STAFString.h"#include "STAFProc.h"#include "STAFProcUtil.h"#include "STAFException.h"#include "STAFProcessService.h"#include "STAFProcess.h"#include "STAFHandleManager.h"#include "STAFVariablePool.h"#include "STAFUtil.h"#include "STAFThreadManager.h"#include "STAFTrace.h"#include "STAFInternalProcess.h"STAFProcessAuthenticationMode_t    STAFProcessService::fAuthMode = kSTAFProcessAuthDisabled;STAFProcessStopMethod_t    STAFProcessService::fDefaultStopMethod = kSTAFProcessStopWithSigKill;STAFProcessDisabledAuthAction_t    STAFProcessService::fAuthAction = kSTAFProcessDisabledAuthIgnore;STAFProcessConsoleFocus_t    STAFProcessService::fDefaultConsoleFocus = kSTAFProcessBackground;STAFString STAFProcessService::fDefaultAuthUsername;STAFString STAFProcessService::fDefaultAuthPassword;STAFString STAFProcessService::fDefaultShellCommand;STAFString STAFProcessService::fDefaultSameConsoleShell;STAFString STAFProcessService::fDefaultNewConsoleShell;STAFString STAFProcessService::fTempDirectory;STAFEventSem STAFProcessService::fNotifySem;STAFProcessService::ProcessPtr STAFProcessService::fNotifyProcess;unsigned int STAFProcessService::fEnvVarCaseSensitive = 1;static STAFMutexSem sDefaultStopUsingSem;static STAFMutexSem sDefaultConsoleModeSem;static STAFMutexSem sDefaultConsoleFocusSem;static STAFMutexSem sProcessAuthModeSem;static STAFMutexSem sDefaultAuthUsernameSem;static STAFMutexSem sDefaultAuthPasswordSem;static STAFMutexSem sDefaultAuthDisabledActionSem;static STAFMutexSem sDefaultShellSem;static STAFMutexSem sDefaultNewConsoleShellSem;static STAFMutexSem sDefaultSameConsoleShellSem;static STAFMutexSem sTempDirectorySem;static const STAFString sNew = "New";static const STAFString sSame = "Same";// Note: This is a mild hack to allow the callback routine to work.// In a perfect world, this class (and all the Service classes) would// be Singletons and I would create a more generic callback mechanism.static STAFProcessService *processService = 0;STAFServiceResult readFileIntoString(const STAFString &file){    fstream inFile(file.toCurrentCodePage()->buffer(),                   ios::in | STAF_ios_binary);    if (!inFile) return STAFServiceResult(kSTAFFileOpenError, file);    // Figure out how big the file is    inFile.seekg(0, ios::end);    unsigned int fileLength = (unsigned int)inFile.tellg();    // Initialize the output buffer and read in the file    STAFRefPtr<char> buffer(new char[fileLength], STAFRefPtr<char>::INIT,                            STAFRefPtr<char>::ARRAY);    inFile.seekg(0, ios::beg);    inFile.read(buffer, fileLength);    return STAFServiceResult(kSTAFOk, STAFString(buffer, fileLength));}STAFServiceResult deleteTempFile(const STAFString &tempFileName){    STAFRC_t rc = kSTAFBaseOSError;    unsigned int osRC = 0;    STAFString errorBuffer = STAFString("");    unsigned int retryAttempts = 10;    // Retry to delete the temporary file up to 10 times until successful    // because sometimes the file is still in use (OSRC=32 on Windows)    for (unsigned int i = 1; (rc != kSTAFOk) && (i <= retryAttempts); ++i)    {        try        {            rc = STAFFSPath(tempFileName).getEntry()->remove(&osRC);            if (rc != kSTAFOk)            {                if (i == retryAttempts)                {                    errorBuffer =                        STAFString("STAFProcessService::deleteTempFile()"                                   " - Failed for " + tempFileName +                                   " with OSRC " + osRC);                    STAFTrace::trace(kSTAFTraceWarning, errorBuffer);                }                else                {                    // Sleep a short time before retrying to delete the file                    STAFThreadManager::sleepCurrentThread(500);                }            }        }        catch (STAFException &se)        {            // Don't retry deleting the temp file            rc = kSTAFBaseOSError;            errorBuffer = STAFString("STAFProcessService::deleteTempFile()"                                     " - Failed for " + tempFileName +                                     " Text: " + se.getText());            STAFTrace::trace(kSTAFTraceWarning, errorBuffer);        }        catch (...)        {            // Don't retry deleting the temp file            rc = kSTAFBaseOSError;            errorBuffer = STAFString("STAFProcessService::deleteTempFile()"                                     " - Caught unknown exception deleting " +                                     tempFileName);            STAFTrace::trace(kSTAFTraceWarning, errorBuffer);        }    }    return STAFServiceResult(rc, errorBuffer);}STAFProcessService::STAFProcessService() : STAFService("PROCESS"){    processService = this;    // START options    fStartParser.addOption("START",             1,        STAFCommandParser::kValueNotAllowed);    fStartParser.addOption("WORKLOAD",          1,        STAFCommandParser::kValueRequired);    fStartParser.addOption("COMMAND",           1,        STAFCommandParser::kValueRequired);    fStartParser.addOption("PARMS",             1,        STAFCommandParser::kValueRequired);    fStartParser.addOption("SHELL",             1,        STAFCommandParser::kValueAllowed);    fStartParser.addOption("WORKDIR",           1,        STAFCommandParser::kValueRequired);    fStartParser.addOption("TITLE",             1,        STAFCommandParser::kValueRequired);    fStartParser.addOption("WAIT",              1,        STAFCommandParser::kValueAllowed);    fStartParser.addOption("ASYNC",             1,        STAFCommandParser::kValueNotAllowed);    fStartParser.addOption("VAR",               0,        STAFCommandParser::kValueRequired);    fStartParser.addOption("ENV",               0,        STAFCommandParser::kValueRequired);    fStartParser.addOption("USEPROCESSVARS",    0,        STAFCommandParser::kValueNotAllowed);    fStartParser.addOption("NOTIFY",            1,        STAFCommandParser::kValueNotAllowed);    fStartParser.addOption("ONEND",             1,        STAFCommandParser::kValueNotAllowed);    fStartParser.addOption("NAME",              1,        STAFCommandParser::kValueRequired);    fStartParser.addOption("HANDLE",            1,        STAFCommandParser::kValueRequired);    fStartParser.addOption("MACHINE",           1,        STAFCommandParser::kValueRequired);    fStartParser.addOption("PRIORITY",          1,        STAFCommandParser::kValueRequired);    fStartParser.addOption("KEY",          1,        STAFCommandParser::kValueRequired);    fStartParser.addOption("STOPUSING",         1,        STAFCommandParser::kValueRequired);    fStartParser.addOption("NEWCONSOLE",        1,        STAFCommandParser::kValueNotAllowed);    fStartParser.addOption("SAMECONSOLE",       1,        STAFCommandParser::kValueNotAllowed);    fStartParser.addOption("FOCUS",             1,        STAFCommandParser::kValueRequired);    fStartParser.addOption("USERNAME",          1,        STAFCommandParser::kValueRequired);    fStartParser.addOption("PASSWORD",          1,        STAFCommandParser::kValueRequired);    fStartParser.addOption("STDIN",             1,        STAFCommandParser::kValueRequired);    fStartParser.addOption("STDOUT",            1,        STAFCommandParser::kValueRequired);    fStartParser.addOption("STDERR",            1,        STAFCommandParser::kValueRequired);    fStartParser.addOption("STDOUTAPPEND",      1,        STAFCommandParser::kValueRequired);    fStartParser.addOption("STDERRAPPEND",      1,        STAFCommandParser::kValueRequired);    fStartParser.addOption("STDERRTOSTDOUT", 0,        STAFCommandParser::kValueNotAllowed);    fStartParser.addOption("DISABLEDAUTHISERROR", 0,        STAFCommandParser::kValueNotAllowed);    fStartParser.addOption("IGNOREDISABLEDAUTH",  0,        STAFCommandParser::kValueNotAllowed);    fStartParser.addOption("STATICHANDLENAME",  1,        STAFCommandParser::kValueRequired);    fStartParser.addOption("RETURNSTDOUT",      1,        STAFCommandParser::kValueNotAllowed);    fStartParser.addOption("RETURNSTDERR",      1,        STAFCommandParser::kValueNotAllowed);    fStartParser.addOption("RETURNFILE",        0,        STAFCommandParser::kValueRequired);    // START option groups    fStartParser.addOptionGroup("COMMAND", 1, 1);    fStartParser.addOptionGroup("WAIT ASYNC",  0, 1);    fStartParser.addOptionGroup("HANDLE NAME", 0, 1);    fStartParser.addOptionGroup("NEWCONSOLE SAMECONSOLE", 0, 1);    fStartParser.addOptionGroup("DISABLEDAUTHISERROR IGNOREDISABLEDAUTH", 0, 1);    fStartParser.addOptionGroup("STDOUT STDOUTAPPEND", 0, 1);    fStartParser.addOptionGroup("STDERR STDERRAPPEND STDERRTOSTDOUT", 0, 1);    // START option needs    fStartParser.addOptionNeed("NOTIFY", "ONEND");    fStartParser.addOptionNeed("PASSWORD", "USERNAME");    fStartParser.addOptionNeed("NAME HANDLE MACHINE PRIORITY KEY", "NOTIFY");    fStartParser.addOptionNeed("STDERRTOSTDOUT", "STDOUT STDOUTAPPEND RETURNSTDOUT");    // QUERY options    fQueryParser.addOption("QUERY",    1,        STAFCommandParser::kValueNotAllowed);    fQueryParser.addOption("FREE",    1,        STAFCommandParser::kValueNotAllowed);    fQueryParser.addOption("WORKLOAD", 1,        STAFCommandParser::kValueRequired);    fQueryParser.addOption("HANDLE",   1,        STAFCommandParser::kValueRequired);    // QUERY groups    fQueryParser.addOptionGroup("HANDLE", 1, 1);    // FREE options    fFreeParser.addOption("FREE",    1,        STAFCommandParser::kValueNotAllowed);    fFreeParser.addOption("WORKLOAD", 1,        STAFCommandParser::kValueRequired);    fFreeParser.addOption("HANDLE",   1,        STAFCommandParser::kValueRequired);    fFreeParser.addOption("ALL", 1,        STAFCommandParser::kValueNotAllowed);    // FREE groups    fFreeParser.addOptionGroup("HANDLE WORKLOAD ALL", 1, 1);    // STOP options    fStopParser.addOption("STOP",     1,        STAFCommandParser::kValueNotAllowed);    fStopParser.addOption("WORKLOAD", 1,        STAFCommandParser::kValueRequired);    fStopParser.addOption("HANDLE",   1,        STAFCommandParser::kValueRequired);    fStopParser.addOption("ALL",      1,        STAFCommandParser::kValueNotAllowed);    fStopParser.addOption("CONFIRM",  1,        STAFCommandParser::kValueNotAllowed);    fStopParser.addOption("USING",    1,        STAFCommandParser::kValueRequired);    // STOP needs    fStopParser.addOptionNeed("ALL", "CONFIRM");    // NOTIFY registration options    fNotifyRegistrationParser.addOption("NOTIFY",        1,        STAFCommandParser::kValueNotAllowed);    fNotifyRegistrationParser.addOption("REGISTER",      1,        STAFCommandParser::kValueNotAllowed);    fNotifyRegistrationParser.addOption("UNREGISTER",    1,        STAFCommandParser::kValueNotAllowed);    fNotifyRegistrationParser.addOption("ONENDOFHANDLE", 1,        STAFCommandParser::kValueRequired);    fNotifyRegistrationParser.addOption("NAME",          1,        STAFCommandParser::kValueRequired);    fNotifyRegistrationParser.addOption("HANDLE",        1,        STAFCommandParser::kValueRequired);    fNotifyRegistrationParser.addOption("MACHINE",       1,        STAFCommandParser::kValueRequired);    fNotifyRegistrationParser.addOption("PRIORITY",      1,        STAFCommandParser::kValueRequired);    // NOTIFY registration groups    fNotifyRegistrationParser.addOptionGroup("ONENDOFHANDLE",       1, 1);    fNotifyRegistrationParser.addOptionGroup("HANDLE NAME",         0, 1);    // NOTIFY LIST options    fNotifyListParser.addOption("NOTIFY",        1,        STAFCommandParser::kValueNotAllowed);    fNotifyListParser.addOption("LIST",          1,        STAFCommandParser::kValueNotAllowed);    fNotifyListParser.addOption("ONENDOFHANDLE", 1,        STAFCommandParser::kValueRequired);    // NOTIFY LIST groups    fNotifyListParser.addOptionGroup("ONENDOFHANDLE", 1, 1);    // LIST options    fListParser.addOption("LIST",       1,        STAFCommandParser::kValueNotAllowed);    fListParser.addOption("HANDLES",       1,        STAFCommandParser::kValueNotAllowed);    fListParser.addOption("WORKLOAD",   1,        STAFCommandParser::kValueRequired);    fListParser.addOption("COMPLETED", 1,        STAFCommandParser::kValueNotAllowed);    fListParser.addOption("RUNNING", 1,        STAFCommandParser::kValueNotAllowed);    fListParser.addOption("LONG", 1,        STAFCommandParser::kValueNotAllowed);    fListParser.addOption("SETTINGS", 1,        STAFCommandParser::kValueNotAllowed);    // LIST groups    fListParser.addOptionGroup("WORKLOAD", 0, 1);    // You can list the operational settings for the Process service OR    // you can list processes    fListParser.addOptionGroup("SETTINGS HANDLES", 0, 1);    fListParser.addOptionGroup("SETTINGS WORKLOAD", 0, 1);    fListParser.addOptionGroup("SETTINGS COMPLETED", 0, 1);    fListParser.addOptionGroup("SETTINGS RUNNING", 0, 1);    fListParser.addOptionGroup("SETTINGS LONG", 0, 1);    // set options    fSetParser.addOption("SET", 1,                         STAFCommandParser::kValueNotAllowed);    fSetParser.addOption("DEFAULTSTOPUSING", 1,                         STAFCommandParser::kValueRequired);    fSetParser.addOption("DEFAULTCONSOLE", 1,                         STAFCommandParser::kValueRequired);    fSetParser.addOption("DEFAULTFOCUS", 1,                         STAFCommandParser::kValueRequired);    fSetParser.addOption("PROCESSAUTHMODE", 1,                         STAFCommandParser::kValueRequired);    fSetParser.addOption("DEFAULTAUTHUSERNAME", 1,                         STAFCommandParser::kValueRequired);    fSetParser.addOption("DEFAULTAUTHPASSWORD", 1,                         STAFCommandParser::kValueRequired);    fSetParser.addOption("DEFAULTAUTHDISABLEDACTION", 1,                         STAFCommandParser::kValueRequired);    fSetParser.addOption("DEFAULTSHELL", 1,                         STAFCommandParser::kValueRequired);    fSetParser.addOption("DEFAULTNEWCONSOLESHELL", 1,                         STAFCommandParser::kValueRequired);    fSetParser.addOption("DEFAULTSAMECONSOLESHELL", 1,                         STAFCommandParser::kValueRequired);    // Construct map class for process completion information    fCompletionMapClass = STAFMapClassDefinition::create(        "STAF/Service/Process/CompletionInfo");    fCompletionMapClass->addKey("rc",       "Return Code");    fCompletionMapClass->addKey("key",      "Key");    fCompletionMapClass->addKey("fileList", "Files");

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -