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

📄 stafservice.cpp

📁 Software Testing Automation Framework (STAF)的开发代码
💻 CPP
字号:
/*****************************************************************************//* Software Testing Automation Framework (STAF)                              *//* (C) Copyright IBM Corp. 2001, 2005                                        *//*                                                                           *//* This software is licensed under the Common Public License (CPL) V1.0.     *//*****************************************************************************/#include "STAF.h"#include "STAFService.h"#include "STAFTrace.h"#include "STAFServiceManager.h"#include "STAFProc.h"#include "STAFThreadManager.h"STAFServiceResult STAFService::submitRequest(    const STAFServiceRequest &requestInfo){    ServiceState serviceState = kNotReady;    // First, lock the list.  If the service is accepting requests, add    // ourself to the list of request threads.    {        STAFMutexSemLock lock(fRequestSem);        serviceState = fServiceState;        if (serviceState == kReady)            fThreadList.insert(gThreadManagerPtr->getCurrentThreadID());    }    // Second, if we are accepting requests, pass the request on    STAFServiceResult result;    try    {        if (STAFTrace::doTrace(kSTAFTraceServiceRequest) &&            STAFServiceManager::doTraceService(name()))        {            STAFString data(name() + " Service Request - Client: " +                            requestInfo.fEndpoint + ", Handle: " +                            STAFString(requestInfo.fHandle) + ", Process: " +                            requestInfo.fHandleName + ", Request: " +                            requestInfo.fRequest);            STAFTrace::trace(kSTAFTraceServiceRequest, data);        }        if (serviceState != kReady)        {            result = kSTAFServiceNotAvailable;        }        else        {            result = acceptRequest(requestInfo);        }    }    catch (...)    {        // We need to remove ourself from the list if we throw an exception        // while processing the request        STAFMutexSemLock lock(fRequestSem);        fThreadList.erase(gThreadManagerPtr->getCurrentThreadID());        throw;    }    // Third, lock the list and remove ourself from the list of    // request threads    {        STAFMutexSemLock lock(fRequestSem);        fThreadList.erase(gThreadManagerPtr->getCurrentThreadID());    }    // Trace any necessary data    if (STAFTrace::doTrace(kSTAFTraceServiceResult) &&        STAFServiceManager::doTraceService(name()))    {        STAFString data(name() + " Service Result (" +                        STAFString(result.fRC) +                        ") - Client: " + requestInfo.fEndpoint + ", Handle: " +                        STAFString(requestInfo.fHandle) + ", Process: " +                        requestInfo.fHandleName + ", Request: " +                        requestInfo.fRequest + ", Result: " +                        ((result.fResult.length() == 0) ?                             STAFString("<No Result>") :                             STAFObject::unmarshall(                                 result.fResult)->asFormattedString()));        //STAFString("<No Result>") : result.fResult));        STAFTrace::trace(kSTAFTraceServiceResult, data);    }    else if (STAFTrace::doTrace(kSTAFTraceServiceComplete) &&        STAFServiceManager::doTraceService(name()))    {        STAFString data(name() + " Service Complete (" +                        STAFString(result.fRC) +                        ") - Client: " + requestInfo.fEndpoint + ", Handle: " +                        STAFString(requestInfo.fHandle) + ", Process: " +                        requestInfo.fHandleName + ", Request: " +                        requestInfo.fRequest + ", Result Length: " +                        STAFString(result.fResult.length()));        STAFTrace::trace(kSTAFTraceServiceComplete, data);    }    else if ((result.fRC != kSTAFOk) &&             STAFTrace::doTrace(kSTAFTraceServiceError) &&             STAFServiceManager::doTraceService(name()))    {        STAFString data(name() + " Service Non-Zero (" +                        STAFString(result.fRC) +                        ") Return Code - Client: " + requestInfo.fEndpoint +                        ", Handle: " + STAFString(requestInfo.fHandle) +                        ", Process: " + requestInfo.fHandleName +                        ", Request: " + requestInfo.fRequest + ", Result: " +                        ((result.fResult.length() == 0) ?                             STAFString("<No Result>") :                             STAFObject::unmarshall(                                 result.fResult)->asFormattedString()));        STAFTrace::trace(kSTAFTraceServiceError, data);    }    else if ((result.fRC == kSTAFAccessDenied) &&             STAFTrace::doTrace(kSTAFTraceServiceAccessDenied) &&             STAFServiceManager::doTraceService(name()))    {        STAFString data(name() + " Service Access Denied - Client: " +                        requestInfo.fEndpoint + ", Handle: " +                        STAFString(requestInfo.fHandle) + ", Process: " +                        requestInfo.fHandleName + ", Request: " +                        requestInfo.fRequest);        STAFTrace::trace(kSTAFTraceServiceAccessDenied, data);    }    // Finally, return the result    return result;}void STAFService::setName(const STAFString &name){    STAFMutexSemLock lock(fRequestSem);    fName = name.toUpperCase();}STAFService::ServiceState STAFService::state(){    STAFMutexSemLock lock(fRequestSem);    return fServiceState;}STAFServiceResult STAFService::initialize(){    {        STAFMutexSemLock lock(fRequestSem);        if (fServiceState == kNotReady)            fServiceState = kInitializing;        else if (fServiceState == kReady)            return kSTAFOk;        else            return kSTAFServiceNotAvailable;    }    STAFTrace::trace(kSTAFTraceServiceManagement,                     "Service " + name() + ": Initializing");    STAFServiceResult result = init();    if (!result.fRC)    {        STAFMutexSemLock lock(fRequestSem);        fServiceState = kReady;    }    return result;}STAFServiceResult STAFService::init(){    return STAFServiceResult(kSTAFOk, STAFString(""));}STAFServiceResult STAFService::terminate(unsigned int timeout){    {        STAFMutexSemLock lock(fRequestSem);        if (fServiceState == kReady)            fServiceState = kTerminating;        else if (fServiceState == kTerminated)            return kSTAFOk;        else            return kSTAFServiceNotAvailable;    }    STAFTrace::trace(kSTAFTraceServiceManagement,                     "Service " + name() + ": Terminating");    const unsigned int oneSecond = 1000;    for(unsigned int remainingTimeout = timeout;        (remainingTimeout != 0) && (fThreadList.size() != 0);        remainingTimeout -= STAF_MIN(oneSecond, remainingTimeout))    {        gThreadManagerPtr->sleepCurrentThread(STAF_MIN(oneSecond,                                              remainingTimeout));    }    STAFServiceResult result = term();    {        STAFMutexSemLock lock(fRequestSem);        if (fThreadList.size() != 0)        {            // loop through and kill all the threads            ThreadList::iterator listIter;            for(listIter = fThreadList.begin(); listIter != fThreadList.end();                ++listIter)            { /* Do Nothing */ }            // XXX:    STAFThread(*listIter).stop();        }        fServiceState = kTerminated;    }    return result;}STAFServiceResult STAFService::term(){    return STAFServiceResult(kSTAFOk, STAFString(""));}

⌨️ 快捷键说明

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