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

📄 stafqueueservice.cpp

📁 Software Testing Automation Framework (STAF)的开发代码
💻 CPP
📖 第 1 页 / 共 3 页
字号:
/*****************************************************************************//* 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 "STAFProc.h"#include "STAFProcUtil.h"#include "STAFQueueService.h"#include "STAFHandleQueue.h"#include "STAFHandleManager.h"#include "STAFVariablePool.h"#include "STAFUtil.h"// XXX: Remove STAFServiceManager.h if pass in default authenticator via//      LocalRequest()#include "STAFServiceManager.h"// QUEUE  [HANDLE <Handle>] | [NAME <Name>] [PRIORITY <Priority>] //        [TYPE <Type>]... MESSAGE <Message>// GET    [PRIORITY <Priority>]... [MACHINE <Machine>]... [NAME <Name>]...//        [HANDLE <Handle>]... [USER <User>]... [TYPE <Type>]...//        [CONTAINS <String>]... [ICONTAINS <String>]... [WAIT [Timeout]]// PEEK   [PRIORITY <Priority>]... [MACHINE <Machine>]... [NAME <Name>]...//        [HANDLE <Handle>]... [USER <User>]... [TYPE <Type>]...//        [CONTAINS <String>]... [ICONTAINS <String>]... [WAIT [Timeout]]// DELETE [PRIORITY <Priority>]... [MACHINE <Machine>]... [NAME <Name>]...//        [HANDLE <Handle>]... [USER <User>]... [TYPE <Type>]...//        [CONTAINS <String>]... [ICONTAINS <String>]... [WAIT [Timeout]]// LIST   [HANDLE <Handle>]//// Returned elements are in the form//// Priority:YYYYMMDD-HH:MM:SS:Machine:Process:Handle:Messagestatic const STAFString sColon(kUTF8_COLON);STAFQueueService::STAFQueueService() : STAFService("QUEUE"){    // queue options    fQueueParser.addOption("QUEUE",    1,        STAFCommandParser::kValueNotAllowed);    fQueueParser.addOption("HANDLE",   1,        STAFCommandParser::kValueRequired);    fQueueParser.addOption("NAME",     1,        STAFCommandParser::kValueRequired);    fQueueParser.addOption("PRIORITY", 1,        STAFCommandParser::kValueRequired);    fQueueParser.addOption("MESSAGE",  1,        STAFCommandParser::kValueRequired);    fQueueParser.addOption("TYPE",  1,        STAFCommandParser::kValueRequired);    // queue option groups    fQueueParser.addOptionGroup("HANDLE NAME", 0, 1);    fQueueParser.addOptionGroup("MESSAGE",     1, 1);    // get options    fGetParser.addOption("GET",       1,        STAFCommandParser::kValueNotAllowed);    fGetParser.addOption("PEEK",      1,        STAFCommandParser::kValueNotAllowed);    fGetParser.addOption("PRIORITY",  0,        STAFCommandParser::kValueRequired);    fGetParser.addOption("MACHINE",   0,        STAFCommandParser::kValueRequired);    fGetParser.addOption("NAME",      0,        STAFCommandParser::kValueRequired);    fGetParser.addOption("HANDLE",    0,        STAFCommandParser::kValueRequired);    fGetParser.addOption("USER",      0,        STAFCommandParser::kValueRequired);    fGetParser.addOption("TYPE",      0,        STAFCommandParser::kValueRequired);    fGetParser.addOption("CONTAINS",  0,        STAFCommandParser::kValueRequired);    fGetParser.addOption("ICONTAINS", 0,        STAFCommandParser::kValueRequired);    fGetParser.addOption("WAIT",      1,        STAFCommandParser::kValueAllowed);    // delete options    fDeleteParser.addOption("DELETE",    1,        STAFCommandParser::kValueNotAllowed);    fDeleteParser.addOption("PRIORITY",  0,        STAFCommandParser::kValueRequired);    fDeleteParser.addOption("MACHINE",   0,        STAFCommandParser::kValueRequired);    fDeleteParser.addOption("NAME",      0,        STAFCommandParser::kValueRequired);    fDeleteParser.addOption("HANDLE",    0,        STAFCommandParser::kValueRequired);    fDeleteParser.addOption("USER",      0,        STAFCommandParser::kValueRequired);    fDeleteParser.addOption("TYPE",      0,        STAFCommandParser::kValueRequired);    fDeleteParser.addOption("CONTAINS",  0,        STAFCommandParser::kValueRequired);    fDeleteParser.addOption("ICONTAINS", 0,        STAFCommandParser::kValueRequired);    // list options    fListParser.addOption("LIST",   1,        STAFCommandParser::kValueNotAllowed);    fListParser.addOption("HANDLE", 1,        STAFCommandParser::kValueRequired);    // Construct map class for an entry in a queue    fQueueEntryMapClass = STAFMapClassDefinition::create(        "STAF/Service/Queue/Entry");    fQueueEntryMapClass->addKey("priority",   "Priority");    fQueueEntryMapClass->setKeyProperty("priority", "display-short-name", "P");    fQueueEntryMapClass->addKey("timestamp",  "Date-Time");    fQueueEntryMapClass->addKey("machine",    "Machine");    fQueueEntryMapClass->addKey("handleName", "Handle Name");    fQueueEntryMapClass->setKeyProperty(        "handleName", "display-short-name", "Name");    fQueueEntryMapClass->addKey("handle",     "Handle");    fQueueEntryMapClass->setKeyProperty("handle", "display-short-name", "H#");    fQueueEntryMapClass->addKey("user",       "User");    fQueueEntryMapClass->addKey("type",       "Type");    fQueueEntryMapClass->addKey("message",    "Message");}STAFQueueService::~STAFQueueService(){    /* Do Nothing */}STAFString STAFQueueService::info(unsigned int) const{    return name() + ": Internal";}STAFServiceResult STAFQueueService::acceptRequest(    const STAFServiceRequest &requestInfo){    STAFString action = requestInfo.fRequest.subWord(0, 1).lowerCase();    if      (action == "queue")  return handleQueue(requestInfo);    else if (action == "get")    return handleGetPeek(requestInfo, true);    else if (action == "peek")   return handleGetPeek(requestInfo, false);    else if (action == "delete") return handleDelete(requestInfo);    else if (action == "list")   return handleList(requestInfo);    else if (action == "help")   return handleHelp(requestInfo);    else return STAFServiceResult(kSTAFInvalidRequestString);}STAFServiceResult STAFQueueService::handleQueue(    const STAFServiceRequest &requestInfo){    // Verify that the requesting machine/user has at least trust level 3    IVALIDATE_TRUST(3, "QUEUE");    // Parse the request    STAFCommandParseResultPtr parsedResult = fQueueParser.parse(        requestInfo.fRequest);    if (parsedResult->rc != kSTAFOk)    {        return STAFServiceResult(kSTAFInvalidRequestString,                                 parsedResult->errorBuffer, 0);    }    STAFString errorBuffer;    // HANDLE may only default if the request came from this machine    if ((parsedResult->optionTimes("HANDLE") == 0) &&        (parsedResult->optionTimes("NAME") == 0) &&        !requestInfo.fIsLocalRequest)    {        return STAFServiceResult(kSTAFInvalidRequestString);    }    DEFINE_VAR_POOL_LIST(varPoolList, varPoolListSize, requestInfo);    STAFString name;    STAFHandle_t theHandle = requestInfo.fHandle;    unsigned int priority = 5;    STAFString type;    STAFRC_t rc = RESOLVE_OPTIONAL_STRING_OPTION("NAME", name);    if (!rc) rc = RESOLVE_OPTIONAL_UINT_OPTION("HANDLE", theHandle);    if (!rc) rc = RESOLVE_OPTIONAL_UINT_OPTION("PRIORITY", priority);    if (!rc) rc = RESOLVE_OPTIONAL_STRING_OPTION("TYPE", type);    if (rc) return STAFServiceResult(rc, errorBuffer);    // Currently we won't resolve variables in MESSAGE    STAFHandleQueuePtr handleQueue;    STAFString machine = requestInfo.fEndpoint;    STAFString result;    STAFHandleQueue::Message message(priority, machine,                                     requestInfo.fAuthenticator,                                     requestInfo.fUserIdentifier,                                     requestInfo.fHandleName,                                     requestInfo.fHandle,                                     parsedResult->optionValue("MESSAGE"),                                     type);    if (parsedResult->optionTimes("NAME") == 0)    {        rc = gHandleManagerPtr->handleQueue(theHandle, handleQueue);        if (rc) return STAFServiceResult(rc);        STAFMutexSemLock queueLock(handleQueue->fQueueSem);        if (handleQueue->fQueue.size() >= gMaxQueueSize)        {            return STAFServiceResult(kSTAFQueueFull,                                     STAFString(handleQueue->fQueue.size()));        }        handleQueue->fQueue.insert(STAFHandleQueue::HandleQueue::value_type(            message.priority, message));        handleQueue->fNotify->post();    }    else    {        std::vector<STAFHandle_t> handles =                                  gHandleManagerPtr->handlesWithName(name);        std::vector<STAFHandle_t>::iterator iter;        unsigned int numberQueued = handles.size();        for (iter = handles.begin(); iter != handles.end(); iter++)        {            if (gHandleManagerPtr->handleQueue(*iter, handleQueue))                --numberQueued;            else            {                STAFMutexSemLock queueLock(handleQueue->fQueueSem);                if (handleQueue->fQueue.size() >= gMaxQueueSize)                    --numberQueued;                else                {                    handleQueue->fQueue.insert(                    STAFHandleQueue::HandleQueue::value_type(                        message.priority, message));                    handleQueue->fNotify->post();                }            }        }        result = STAFString(numberQueued);    }    return STAFServiceResult(kSTAFOk, result);}STAFServiceResult STAFQueueService::handleGetPeek(    const STAFServiceRequest &requestInfo, bool isGet){    // Verify that this request came from the local machine    // No check of trust is needed since these commands are only valid    // with respect to the submitting process' queue so just set    // required trust level to 0.    if (isGet)    {        IVALIDATE_LOCAL_TRUST(0, "GET");    }    else    {        IVALIDATE_LOCAL_TRUST(0, "PEEK");    }    // Parse the request    STAFCommandParseResultPtr parsedResult = fGetParser.parse(        requestInfo.fRequest);    if (parsedResult->rc != kSTAFOk)    {        return STAFServiceResult(kSTAFInvalidRequestString,                                 parsedResult->errorBuffer, 0);    }    DEFINE_VAR_POOL_LIST(varPoolList, varPoolListSize, requestInfo);    STAFString errorBuffer;    STAFHandleQueuePtr handleQueue;    STAFRC_t rc = gHandleManagerPtr->handleQueue(requestInfo.fHandle,                                                 handleQueue);    if (rc) return STAFServiceResult(rc);    std::vector<unsigned int> priorityList;    std::vector<unsigned int> handleList;    std::vector<STAFString> machineList;    std::vector<STAFString> nameList;    std::vector<STAFString> userList;    std::vector<STAFString> typeList;    std::vector<STAFString> containsList;    std::vector<STAFString> icontainsList;    unsigned int index = 0;    unsigned int optionCount = 0;    unsigned int priority = 0;    for (index = 1, optionCount = parsedResult->optionTimes("PRIORITY");         (index <= optionCount) && !rc; ++index)    {        rc = RESOLVE_INDEXED_UINT_OPTION("PRIORITY", index, priority);        if (!rc) priorityList.push_back(priority);    }    STAFHandle_t theHandle = 0;    for (index = 1, optionCount = parsedResult->optionTimes("HANDLE");

⌨️ 快捷键说明

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