📄 deviceservice.cpp
字号:
/*****************************************************************************//* 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 <map>#include "STAFMutexSem.h"#include "STAFCommandParser.h"#include "STAFServiceInterface.h"#include "STAFUtil.h"#include "DeviceService.h"// Device Data - contains data for a devicestruct DeviceData{ DeviceData() { /* Do Nothing */ } DeviceData(const STAFString &aName, const STAFString &aModel, const STAFString &aSN) : name(aName), model(aModel), serialNumber(aSN) { /* Do Nothing */ } STAFString name; // Device name STAFString model; // Device model STAFString serialNumber; // Device serial number};typedef std::deque<DeviceData> DeviceList;typedef STAFRefPtr<DeviceData> DeviceDataPtr;// DeviceMap -- KEY: Device name,// VALUE: Pointer to DeviceData informationtypedef std::map<STAFString, DeviceDataPtr> DeviceMap;// DEVICE Service Datastruct DeviceServiceData{ unsigned int fDebugMode; // Debug Mode flag STAFString fShortName; // Short service name STAFString fName; // Registered service name STAFHandlePtr fHandlePtr; // Device service's STAF handle STAFString fLocalMachineName; // Local machine name STAFCommandParserPtr fAddParser; // DEVICE ADD command parser STAFCommandParserPtr fDeleteParser; // DEVICE DELETE command parser STAFCommandParserPtr fQueryParser; // DEVICE QUERY command parser STAFCommandParserPtr fListParser; // DEVICE LIST command parser STAFCommandParserPtr fHelpParser; // DEVICE HELP command parser STAFCommandParserPtr fVersionParser; // DEVICE VERSION command parser STAFCommandParserPtr fParmsParser; // DEVIC PARMS command parser // Map Class Definitions for marshalled results STAFMapClassDefinitionPtr fListDeviceMapClass; STAFMapClassDefinitionPtr fQueryDeviceMapClass; STAFMutexSemPtr fPrinterMapSem; // Semaphore to control // access to the PrinterMap STAFMutexSemPtr fModemMapSem; // Semaphore to control // access to the ModemMap DeviceMap fPrinterMap; // Map of all printers DeviceMap fModemMap; // Map of all modems};typedef STAFRefPtr<DeviceData> DeviceServiceDataPtr;// Static Variablesstatic STAFString sLineSep;static const STAFString sVersionInfo("3.0.1");static const STAFString sLocal("local");static const STAFString sHelp("help");static const STAFString sVar("var");static const STAFString sResStrResolve("RESOLVE REQUEST ");static const STAFString sString(" STRING ");static const STAFString sLeftCurlyBrace(kUTF8_LCURLY);// Prototypesstatic STAFResultPtr handleAdd(STAFServiceRequestLevel30 *, DeviceServiceData *);static STAFResultPtr handleDelete(STAFServiceRequestLevel30 *, DeviceServiceData *);static STAFResultPtr handleQuery(STAFServiceRequestLevel30 *, DeviceServiceData *);static STAFResultPtr handleRelease(STAFServiceRequestLevel30 *, DeviceServiceData *);static STAFResultPtr handleList(STAFServiceRequestLevel30 *, DeviceServiceData *);static STAFResultPtr handleHelp(STAFServiceRequestLevel30 *, DeviceServiceData *);static STAFResultPtr handleVersion(STAFServiceRequestLevel30 *, DeviceServiceData *);static STAFResultPtr resolveStr(STAFServiceRequestLevel30 *pInfo, DeviceServiceData *pData, const STAFString &theString);static STAFResultPtr resolveOp(STAFServiceRequestLevel30 *pInfo, DeviceServiceData *pData, STAFCommandParseResultPtr &parsedResult, const STAFString &fOption, unsigned int optionIndex = 1);STAFResultPtr resolveOpLocal(DeviceServiceData *pData, STAFCommandParseResultPtr &parsedResult, const STAFString &fOption, unsigned int optionIndex = 1);static void registerHelpData(DeviceServiceData *pData, unsigned int errorNumber, const STAFString &shortInfo, const STAFString &longInfo);static void unregisterHelpData(DeviceServiceData *pData, unsigned int errorNumber);// Begin implementationSTAFRC_t STAFServiceGetLevelBounds(unsigned int levelID, unsigned int *minimum, unsigned int *maximum){ switch (levelID) { case kServiceInfo: { *minimum = 30; *maximum = 30; break; } case kServiceInit: { *minimum = 30; *maximum = 30; break; } case kServiceAcceptRequest: { *minimum = 30; *maximum = 30; break; } case kServiceTerm: case kServiceDestruct: { *minimum = 0; *maximum = 0; break; } default: { return kSTAFInvalidAPILevel; } } return kSTAFOk;}STAFRC_t STAFServiceConstruct(STAFServiceHandle_t *pServiceHandle, void *pServiceInfo, unsigned int infoLevel, STAFString_t *pErrorBuffer){ STAFRC_t rc = kSTAFUnknownError; try { if (infoLevel != 30) return kSTAFInvalidAPILevel; STAFServiceInfoLevel30 *pInfo = reinterpret_cast<STAFServiceInfoLevel30 *>(pServiceInfo); DeviceServiceData data; data.fDebugMode = 0; data.fShortName = pInfo->name; data.fName = "STAF/Service/"; data.fName += pInfo->name; for (unsigned int i = 0; i < pInfo->numOptions; ++i) { if (STAFString(pInfo->pOptionName[i]).upperCase() == "DEBUG") { data.fDebugMode = 1; } else { STAFString optionError(pInfo->pOptionName[i]); *pErrorBuffer = optionError.adoptImpl(); return kSTAFServiceConfigurationError; } } // Set service handle *pServiceHandle = new DeviceServiceData(data); return kSTAFOk; } catch (STAFException &e) { STAFString result; result += STAFString("In DeviceService.cpp: STAFServiceConstruct") + kUTF8_SCOLON; result += STAFString("Name: ") + e.getName() + kUTF8_SCOLON; result += STAFString("Location: ") + e.getLocation() + kUTF8_SCOLON; result += STAFString("Text: ") + e.getText() + kUTF8_SCOLON; result += STAFString("Error code: ") + e.getErrorCode() + kUTF8_SCOLON; *pErrorBuffer = result.adoptImpl(); } catch (...) { STAFString error( "DeviceService.cpp: STAFServiceConstruct: Caught " "unknown exception in STAFServiceConstruct()"); *pErrorBuffer = error.adoptImpl(); } return kSTAFUnknownError;}STAFRC_t STAFServiceInit(STAFServiceHandle_t serviceHandle, void *pInitInfo, unsigned int initLevel, STAFString_t *pErrorBuffer){ STAFRC_t retCode = kSTAFUnknownError; try { if (initLevel != 30) return kSTAFInvalidAPILevel; DeviceServiceData *pData = reinterpret_cast<DeviceServiceData *>(serviceHandle); STAFServiceInitLevel30 *pInfo = reinterpret_cast<STAFServiceInitLevel30 *>(pInitInfo); retCode = STAFHandle::create(pData->fName, pData->fHandlePtr); if (retCode != kSTAFOk) return retCode; //ADD options pData->fAddParser = STAFCommandParserPtr(new STAFCommandParser, STAFCommandParserPtr::INIT); pData->fAddParser->addOption("ADD", 1, STAFCommandParser::kValueNotAllowed); pData->fAddParser->addOption("PRINTER", 1, STAFCommandParser::kValueRequired); pData->fAddParser->addOption("MODEM", 1, STAFCommandParser::kValueRequired); pData->fAddParser->addOption("MODEL", 1, STAFCommandParser::kValueRequired); pData->fAddParser->addOption("SN", 1, STAFCommandParser::kValueRequired); pData->fAddParser->addOptionNeed("PRINTER MODEM", "ADD"); pData->fAddParser->addOptionNeed("ADD", "PRINTER MODEM"); pData->fAddParser->addOptionNeed("ADD", "MODEL"); pData->fAddParser->addOptionNeed("ADD", "SN"); pData->fAddParser->addOptionGroup("PRINTER MODEM", 0, 1); //DELETE options pData->fDeleteParser = STAFCommandParserPtr(new STAFCommandParser, STAFCommandParserPtr::INIT); pData->fDeleteParser->addOption("DELETE", 1, STAFCommandParser::kValueNotAllowed); pData->fDeleteParser->addOption("PRINTER", 1, STAFCommandParser::kValueRequired); pData->fDeleteParser->addOption("MODEM", 1, STAFCommandParser::kValueRequired); pData->fDeleteParser->addOption("CONFIRM", 1, STAFCommandParser::kValueNotAllowed); pData->fDeleteParser->addOptionGroup("PRINTER MODEM", 0, 1); pData->fDeleteParser->addOptionNeed("PRINTER MODEM", "DELETE"); pData->fDeleteParser->addOptionNeed("DELETE", "PRINTER MODEM"); pData->fDeleteParser->addOptionNeed("DELETE", "CONFIRM"); //QUERY options pData->fQueryParser = STAFCommandParserPtr(new STAFCommandParser, STAFCommandParserPtr::INIT); pData->fQueryParser->addOption("QUERY", 1, STAFCommandParser::kValueNotAllowed); pData->fQueryParser->addOption("PRINTER", 1, STAFCommandParser::kValueRequired); pData->fQueryParser->addOption("MODEM", 1, STAFCommandParser::kValueRequired); pData->fQueryParser->addOptionGroup("PRINTER MODEM", 0, 1); pData->fQueryParser->addOptionNeed("PRINTER MODEM", "QUERY"); pData->fQueryParser->addOptionNeed("QUERY", "PRINTER MODEM"); //LIST options pData->fListParser = STAFCommandParserPtr(new STAFCommandParser, STAFCommandParserPtr::INIT); pData->fListParser->addOption("LIST", 1, STAFCommandParser::kValueNotAllowed); pData->fListParser->addOption("PRINTERS", 1, STAFCommandParser::kValueNotAllowed); pData->fListParser->addOption("MODEMS", 1, STAFCommandParser::kValueNotAllowed); //HELP options pData->fHelpParser = STAFCommandParserPtr(new STAFCommandParser, STAFCommandParserPtr::INIT); pData->fHelpParser->addOption("HELP", 1, STAFCommandParser::kValueNotAllowed); //VERSION options pData->fVersionParser = STAFCommandParserPtr(new STAFCommandParser, STAFCommandParserPtr::INIT); pData->fVersionParser->addOption("VERSION", 1, STAFCommandParser::kValueNotAllowed); // Construct map class for the result from a LIST request. pData->fListDeviceMapClass = STAFMapClassDefinition::create( "STAF/Service/Device/ListDevice"); pData->fListDeviceMapClass->addKey("name", "Name");
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -