📄 deviceservice.cpp
字号:
// Parse the request STAFCommandParseResultPtr parsedResult = pData->fDeleteParser->parse(pInfo->request); if (parsedResult->rc != kSTAFOk) { return STAFResultPtr(new STAFResult(kSTAFInvalidRequestString, parsedResult->errorBuffer), STAFResultPtr::INIT); } // Resolve any STAF variables in the print 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; // Find the device in the printer or modem map and remove it if (printer != "") { STAFMutexSemLock lock(*pData->fPrinterMapSem); pData->fPrinterMap.erase(printer); } else if (modem != "") { STAFMutexSemLock lock(*pData->fModemMapSem); pData->fModemMap.erase(modem); } // Return an Ok result return STAFResultPtr(new STAFResult(kSTAFOk), STAFResultPtr::INIT);}// Handles device list requestsSTAFResultPtr handleList(STAFServiceRequestLevel30 *pInfo, DeviceServiceData *pData){ STAFString result; STAFRC_t rc = kSTAFOk; // Verify the requester has at least trust level 2 VALIDATE_TRUST(2, pData->fShortName, "LIST", pData->fLocalMachineName); // Parse the request STAFCommandParseResultPtr parsedResult = pData->fListParser->parse(pInfo->request); if (parsedResult->rc != kSTAFOk) { return STAFResultPtr(new STAFResult(kSTAFInvalidRequestString, parsedResult->errorBuffer), STAFResultPtr::INIT); } // Check if specified printers or modems bool all = false; bool printers = false; bool modems = false; if (!(parsedResult->optionTimes("PRINTERS")) && !(parsedResult->optionTimes("MODEMS"))) { all = true; } if (parsedResult->optionTimes("PRINTERS")) { printers = true; } if (parsedResult->optionTimes("MODEMS")) { modems = true; } // Create a marshalling context and set any map classes (if any). STAFObjectPtr mc = STAFObject::createMarshallingContext(); mc->setMapClassDefinition(pData->fListDeviceMapClass->reference()); // Create an empty result list to contain the result STAFObjectPtr resultList = STAFObject::createList(); // Add printer entries to the result list if (printers || all) { STAFMutexSemLock lock(*pData->fPrinterMapSem); DeviceMap::iterator iter; for (iter = pData->fPrinterMap.begin(); iter != pData->fPrinterMap.end(); ++iter) { STAFObjectPtr resultMap = pData->fListDeviceMapClass->createInstance(); resultMap->put("name", iter->second->name); resultMap->put("type", "Printer"); resultMap->put("model", iter->second->model); resultMap->put("serial#", iter->second->serialNumber); resultList->append(resultMap); } } // Add modem entries to the result list if (modems || all) { STAFMutexSemLock lock(*pData->fModemMapSem); DeviceMap::iterator iter; for (iter = pData->fModemMap.begin(); iter != pData->fModemMap.end(); ++iter) { STAFObjectPtr resultMap = pData->fListDeviceMapClass->createInstance(); resultMap->put("name", iter->second->name); resultMap->put("type", "Modem"); resultMap->put("model", iter->second->model); resultMap->put("serial#", iter->second->serialNumber); resultList->append(resultMap); } } // Set the result list as the root object for the marshalling context // and return the marshalled result mc->setRootObject(resultList); return STAFResultPtr(new STAFResult(kSTAFOk, mc->marshall()), STAFResultPtr::INIT);}// Handles device query requestsSTAFResultPtr handleQuery(STAFServiceRequestLevel30 *pInfo, DeviceServiceData *pData){ STAFString result; STAFRC_t rc = kSTAFOk; // Verify the requester has at least trust level 2 VALIDATE_TRUST(2, pData->fShortName, "QUERY", pData->fLocalMachineName); // Parse the request STAFCommandParseResultPtr parsedResult = pData->fQueryParser->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; // Create a marshalling context and set any map classes (if any). STAFObjectPtr mc = STAFObject::createMarshallingContext(); mc->setMapClassDefinition(pData->fQueryDeviceMapClass->reference()); // Create an empty result map to contain the result STAFObjectPtr resultMap = pData->fQueryDeviceMapClass->createInstance(); // Find the specified printer/modem and add its info to the result map if (printer != "") { STAFMutexSemLock lock(*pData->fPrinterMapSem); DeviceMap::iterator iter = pData->fPrinterMap.find(printer); if (iter == pData->fPrinterMap.end()) { return STAFResultPtr(new STAFResult(kSTAFDoesNotExist, printer), STAFResultPtr::INIT); } resultMap->put("model", iter->second->model); resultMap->put("serial#", iter->second->serialNumber); } else if (modem != "") { STAFMutexSemLock lock(*pData->fModemMapSem); DeviceMap::iterator iter = pData->fModemMap.find(modem); if (iter == pData->fModemMap.end()) { return STAFResultPtr(new STAFResult(kSTAFDoesNotExist, modem), STAFResultPtr::INIT); } resultMap->put("model", iter->second->model); resultMap->put("serial#", iter->second->serialNumber); } // Set the result map as the root object for the marshalling context // and return the marshalled result mc->setRootObject(resultMap); return STAFResultPtr(new STAFResult(kSTAFOk, mc->marshall()), STAFResultPtr::INIT);}STAFResultPtr handleHelp(STAFServiceRequestLevel30 *pInfo, DeviceServiceData *pData){ // Verify the requester has at least trust level 1 VALIDATE_TRUST(1, pData->fShortName, "HELP", pData->fLocalMachineName); // Return help text for the service STAFString help("DEVICE Service Help" + sLineSep + sLineSep); help += "ADD (PRINTER <printerName> | MODEM <modemName>)"; help += " MODEL <model> SN <serial#>"; help += sLineSep; help += "DELETE (PRINTER <printerName> | MODEM <modemName>) CONFIRM"; help += sLineSep; help += "LIST [PRINTERS] [MODEMS]" + sLineSep; help += "QUERY PRINTER <printerName> | MODEM <modemName>"; help += sLineSep; help += "VERSION" + sLineSep; help += "HELP" + sLineSep; return STAFResultPtr(new STAFResult(kSTAFOk, help), STAFResultPtr::INIT);}STAFResultPtr handleVersion(STAFServiceRequestLevel30 *pInfo, DeviceServiceData *pData){ // Verify the requester has at least trust level 1 VALIDATE_TRUST(1, pData->fShortName, "VERSION", pData->fLocalMachineName); // Return the version of the service return STAFResultPtr(new STAFResult(kSTAFOk, sVersionInfo), STAFResultPtr::INIT);}STAFResultPtr resolveOp(STAFServiceRequestLevel30 *pInfo, DeviceServiceData *pData, STAFCommandParseResultPtr &parsedResult, const STAFString &fOption, unsigned int optionIndex){ STAFString optionValue = parsedResult->optionValue(fOption, optionIndex); if (optionValue.find(sLeftCurlyBrace) == STAFString::kNPos) { return STAFResultPtr(new STAFResult(kSTAFOk, optionValue), STAFResultPtr::INIT); } return resolveStr(pInfo, pData, optionValue);}STAFResultPtr resolveStr(STAFServiceRequestLevel30 *pInfo, DeviceServiceData *pData, const STAFString &theString){ return pData->fHandlePtr->submit(sLocal, sVar, sResStrResolve + STAFString(pInfo->requestNumber) + sString + pData->fHandlePtr->wrapData(theString));}void registerHelpData(DeviceServiceData *pData, unsigned int errorNumber, const STAFString &shortInfo, const STAFString &longInfo){ static STAFString regString("REGISTER SERVICE %C ERROR %d INFO %C " "DESCRIPTION %C"); pData->fHandlePtr->submit(sLocal, sHelp, STAFHandle::formatString( regString.getImpl(), pData->fShortName.getImpl(), errorNumber, shortInfo.getImpl(), longInfo.getImpl()));}void unregisterHelpData(DeviceServiceData *pData, unsigned int errorNumber){ static STAFString regString("UNREGISTER SERVICE %C ERROR %d"); pData->fHandlePtr->submit(sLocal, sHelp, STAFHandle::formatString( regString.getImpl(), pData->fShortName.getImpl(), errorNumber));}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -