📄 deviceservice.cpp
字号:
pData->fListDeviceMapClass->addKey("type", "Type"); pData->fListDeviceMapClass->addKey("model", "Model"); pData->fListDeviceMapClass->addKey("serial#", "Serial Number"); pData->fListDeviceMapClass->setKeyProperty( "serial#", "display-short-name", "Serial #"); // Construct map class for the result from a QUERY request. pData->fQueryDeviceMapClass = STAFMapClassDefinition::create( "STAF/Service/Device/QueryDevice"); pData->fQueryDeviceMapClass->addKey("model", "Model"); pData->fQueryDeviceMapClass->addKey("serial#", "Serial Number"); // Resolve the line separator variable for the local machine STAFResultPtr result = pData->fHandlePtr->submit( "local", "VAR", "RESOLVE STRING {STAF/Config/Sep/Line}"); if (result->rc != 0) { *pErrorBuffer = result->result.adoptImpl(); return result->rc; } else sLineSep = result->result; // Resolve the machine name variable for the local machine result = pData->fHandlePtr->submit( "local", "VAR", "RESOLVE STRING {STAF/Config/Machine}"); if (result->rc != 0) { *pErrorBuffer = result->result.adoptImpl(); return result->rc; } else pData->fLocalMachineName = result->result; // Create mutex semaphores for the printer and modem data maps pData->fPrinterMapSem = STAFMutexSemPtr( new STAFMutexSem, STAFMutexSemPtr::INIT); pData->fModemMapSem = STAFMutexSemPtr( new STAFMutexSem, STAFMutexSemPtr::INIT); // Register Help Data registerHelpData(pData, kDeviceInvalidSerialNumber, STAFString("Invalid serial number"), STAFString("A non-numeric value was specified for serial number")); } catch (STAFException &e) { STAFString result; result += STAFString("In DeviceService.cpp: STAFServiceInit") + 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: STAFServiceInit: Caught unknown " "exception in STAFServiceServiceInit()"); *pErrorBuffer = error.adoptImpl(); } return retCode;}STAFRC_t STAFServiceAcceptRequest(STAFServiceHandle_t serviceHandle, void *pRequestInfo, unsigned int reqLevel, STAFString_t *pResultBuffer){ if (reqLevel != 30) return kSTAFInvalidAPILevel; STAFRC_t retCode = kSTAFUnknownError; try { STAFResultPtr result(new STAFResult(), STAFResultPtr::INIT); STAFServiceRequestLevel30 *pInfo = reinterpret_cast<STAFServiceRequestLevel30 *>(pRequestInfo); DeviceServiceData *pData = reinterpret_cast<DeviceServiceData *>(serviceHandle); STAFString request(pInfo->request); STAFString action = request.subWord(0, 1).toLowerCase(); // Call functions for the request if (action == "add") result = handleAdd(pInfo, pData); else if (action == "delete") result = handleDelete(pInfo, pData); else if (action == "query") result = handleQuery(pInfo, pData); else if (action == "list") result = handleList(pInfo, pData); else if (action == "help") result = handleHelp(pInfo, pData); else if (action == "version") result = handleVersion(pInfo, pData); else { result = STAFResultPtr(new STAFResult(kSTAFInvalidRequestString, request.subWord(0, 1)), STAFResultPtr::INIT); } *pResultBuffer = result->result.adoptImpl(); retCode = result->rc; } catch (STAFException &e) { STAFString result; result += STAFString("In DeviceService.cpp: STAFServiceAcceptRequest") + 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; *pResultBuffer = result.adoptImpl(); } catch (...) { STAFString error( "DeviceService.cpp: STAFServiceAcceptRequest: Caught " "unknown exception in STAFServiceAcceptRequest()"); *pResultBuffer = error.adoptImpl(); } return retCode;}STAFRC_t STAFServiceTerm(STAFServiceHandle_t serviceHandle, void *pTermInfo, unsigned int termLevel, STAFString_t *pErrorBuffer){ if (termLevel != 0) return kSTAFInvalidAPILevel; STAFRC_t retCode = kSTAFUnknownError; try { retCode = kSTAFOk; DeviceServiceData *pData = reinterpret_cast<DeviceServiceData *>(serviceHandle); // Un-register Help Data unregisterHelpData(pData, kDeviceInvalidSerialNumber); } catch (STAFException &e) { STAFString result; result += STAFString("In DeviceService.cpp: STAFServiceTerm") + 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: STAFServiceTerm: Caught unknown " "exception in STAFServiceTerm()"); *pErrorBuffer = error.adoptImpl(); } return retCode;}STAFRC_t STAFServiceDestruct(STAFServiceHandle_t *serviceHandle, void *pDestructInfo, unsigned int destructLevel, STAFString_t *pErrorBuffer){ if (destructLevel != 0) return kSTAFInvalidAPILevel; STAFRC_t retCode = kSTAFUnknownError; try { DeviceServiceData *pData = reinterpret_cast<DeviceServiceData *>(*serviceHandle); delete pData; *serviceHandle = 0; retCode = kSTAFOk; } catch (STAFException &e) { STAFString result; result += STAFString("In DeviceService.cpp: STAFServiceDestruct") + 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( "DevicePoolService.cpp: STAFServiceDestruct: Caught " "unknown exception in STAFServiceDestruct()"); *pErrorBuffer = error.adoptImpl(); } return retCode;}// Handles device add entry requestsSTAFResultPtr handleAdd(STAFServiceRequestLevel30 *pInfo, DeviceServiceData *pData){ // Verify the requester has at least trust level 3 VALIDATE_TRUST(3, pData->fShortName, "ADD", pData->fLocalMachineName); // Parse the request STAFCommandParseResultPtr parsedResult = pData->fAddParser->parse(pInfo->request); if (parsedResult->rc != kSTAFOk) { return STAFResultPtr(new STAFResult(kSTAFInvalidRequestString, parsedResult->errorBuffer), STAFResultPtr::INIT); } // Resolve any STAF variables in the printer option's value STAFResultPtr resultPtr = resolveOp(pInfo, pData, parsedResult, "PRINTER"); if (resultPtr->rc != 0) return resultPtr; STAFString printer = resultPtr->result; // Resolve any STAF variables in the modem option's value resultPtr = resolveOp(pInfo, pData, parsedResult, "MODEM"); if (resultPtr->rc != 0) return resultPtr; STAFString modem = resultPtr->result; // Resolve any STAF variables in the model option's value resultPtr = resolveOp(pInfo, pData, parsedResult, "MODEL"); if (resultPtr->rc != 0) return resultPtr; STAFString model = resultPtr->result; // Resolve any STAF variables in the sn option's value resultPtr = resolveOp(pInfo, pData, parsedResult, "SN"); if (resultPtr->rc != 0) return resultPtr; STAFString serialNumber = resultPtr->result; // Verify that the serial number is numeric if (!serialNumber.isDigits()) { // Note that instead of creating a new error code specific for // this service, could use kSTAFInvalidValue instead. return STAFResultPtr( new STAFResult(kDeviceInvalidSerialNumber, serialNumber), STAFResultPtr::INIT); } // Add the device to the printer map or the modem map if (printer != "") { STAFMutexSemLock lock(*pData->fPrinterMapSem); pData->fPrinterMap.insert(DeviceMap::value_type(printer, DeviceDataPtr(new DeviceData(printer, model, serialNumber), DeviceDataPtr::INIT))); } else if (modem != "") { STAFMutexSemLock lock(*pData->fModemMapSem); pData->fModemMap.insert(DeviceMap::value_type(modem, DeviceDataPtr(new DeviceData(modem, model, serialNumber), DeviceDataPtr::INIT))); } // Return an Ok result return STAFResultPtr(new STAFResult(kSTAFOk), STAFResultPtr::INIT);}// Handles device deletion requestsSTAFResultPtr handleDelete(STAFServiceRequestLevel30 *pInfo, DeviceServiceData *pData){ // Verify the requester has at least trust level 4 VALIDATE_TRUST(4, pData->fShortName, "DELETE", pData->fLocalMachineName);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -