void ChannelController::start() { Poco::JSON::Object::Ptr pcfParameters; if ( data().has("input") && data().isObject("input") ) { pcfParameters = data().getObject("input"); } else { pcfParameters = new Poco::JSON::Object(); setData("input", pcfParameters); std::vector<std::string> parameters = getParameters(); // First parameter is queuemanager // Second parameter is a channelname if ( parameters.size() > 1 ) { pcfParameters->set("ChannelName", parameters[1]); } else { if ( form().has("ChannelName") ) pcfParameters->set("ChannelName", form().get("ChannelName")); } if ( form().has("CommandScope") ) pcfParameters->set("CommandScope", form().get("CommandScope")); if ( form().has("ChannelDisposition") ) pcfParameters->set("ChannelDisposition", form().get("ChannelDisposition")); } ChannelStart command(*commandServer(), pcfParameters); setData("data", command.execute()); }
void ChannelController::copy() { Poco::JSON::Object::Ptr pcfParameters; if (data().has("input") && data().isObject("input")) { pcfParameters = data().getObject("input"); } else { pcfParameters = new Poco::JSON::Object(); std::vector<std::string> parameters = getParameters(); if (parameters.size() > 2) { pcfParameters->set("FromChannelName", parameters[2]); } if (parameters.size() > 1) { pcfParameters->set("ToChannelName", parameters[1]); } // Copy all query parameters to PCF for (Poco::Net::NameValueCollection::ConstIterator it = form().begin(); it != form().end(); ++it) { pcfParameters->set(it->first, it->second); } } ChannelCopy command(*commandServer(), pcfParameters); command.execute(); }
void ChannelController::create() { Poco::JSON::Object::Ptr pcfParameters; if (data().has("input") && data().isObject("input")) { pcfParameters = data().getObject("input"); } else { pcfParameters = new Poco::JSON::Object(); std::vector<std::string> parameters = getParameters(); if (parameters.size() > 1) { pcfParameters->set("ChannelName", parameters[1]); } if (parameters.size() > 2) { pcfParameters->set("ChannelType", parameters[2]); } // Copy all query parameters to PCF, except ChannelName if it is already set on the URI for (Poco::Net::NameValueCollection::ConstIterator it = form().begin(); it != form().end(); ++it) { if (parameters.size() > 1 && Poco::icompare(it->first, "ChannelName") == 0) continue; if (parameters.size() > 2 && Poco::icompare(it->first, "ChannelType") == 0) continue; pcfParameters->set(it->first, it->second); } } ChannelCreate command(*commandServer(), pcfParameters); command.execute(); }
void ServiceController::inquire() { Poco::JSON::Object::Ptr pcfParameters; if ( data().has("filter") && data().isObject("filter") ) { pcfParameters = data().getObject("filter"); } else { pcfParameters = new Poco::JSON::Object(); set("filter", pcfParameters); std::vector<std::string> parameters = getParameters(); // First parameter is queuemanager // Second parameter can be a servicename. If this is passed // the query parameter ServiceName is ignored. if ( parameters.size() > 1 ) { pcfParameters->set("ServiceName", parameters[1]); } else { // Handle query parameters std::string serviceNameField; if ( form().has("ServiceName") ) { serviceNameField = form().get("ServiceName"); } else if ( form().has("name") ) { serviceNameField = form().get("name"); } if ( serviceNameField.empty() ) { serviceNameField = "*"; } pcfParameters->set("ServiceName", serviceNameField); } pcfParameters->set("ExcludeSystem", form().get("ExcludeSystem", "false").compare("true") == 0); Poco::JSON::Array::Ptr attrs = new Poco::JSON::Array(); formElementToJSONArray("ServiceAttrs", attrs); if ( attrs->size() == 0 ) // Nothing found for ServiceAttrs, try Attrs { formElementToJSONArray("Attrs", attrs); } if ( attrs->size() > 0 ) { pcfParameters->set("ServiceAttrs", attrs); } handleFilterForm(pcfParameters); } ServiceMapper mapper(*commandServer(), pcfParameters); set("services", mapper.inquire()); }
void QueueStatusController::inquire() { Poco::JSON::Object::Ptr pcfParameters; if ( data().has("input") && data().isObject("input") ) { pcfParameters = data().getObject("input"); } else { pcfParameters = new Poco::JSON::Object(); setData("input", pcfParameters); std::vector<std::string> parameters = getParameters(); // First parameter is queuemanager // Second parameter can be a queuename. If this is passed, the // query parameter QName or queueName is ignored. if ( parameters.size() > 1 ) { pcfParameters->set("QName", parameters[1]); } else { // Handle query parameters pcfParameters->set("QName", form().get("QName", "*")); } pcfParameters->set("ExcludeSystem", form().get("ExcludeSystem", "false").compare("true") == 0); pcfParameters->set("ExcludeTemp", form().get("ExcludeTemp", "false").compare("true") == 0); if ( form().has("CommandScope") ) { pcfParameters->set("CommandScope", form().get("CommandScope")); } if ( form().has("QSGDisposition") ) { pcfParameters->set("QSGDisposition", form().get("QSGDisposition")); } if ( form().has("StatusType") ) pcfParameters->set("StatusType", form().get("StatusType")); if ( form().has("OpenType") ) pcfParameters->set("OpenType", form().get("OpenType")); handleFilterForm(pcfParameters); Poco::JSON::Array::Ptr attrs = new Poco::JSON::Array(); formElementToJSONArray("QStatusAttrs", attrs); if ( attrs->size() == 0 ) // Nothing found for QStatusAttrs, try Attrs { formElementToJSONArray("Attrs", attrs); } if ( attrs->size() > 0 ) { pcfParameters->set("QStatusAttrs", attrs); } } QueueStatusInquire command(*commandServer(), pcfParameters); setData("data", command.execute()); }
void ConnectionController::inquire() { Poco::JSON::Object::Ptr pcfParameters; if ( data().has("filter") && data().isObject("filter") ) { pcfParameters = data().getObject("filter"); } else { pcfParameters = new Poco::JSON::Object(); set("filter", pcfParameters); std::vector<std::string> parameters = getParameters(); // First parameter is queuemanager // Second parameter can be a connection id and will result in inquiring // only that connection. if ( parameters.size() > 1 ) { pcfParameters->set("ConnectionId", parameters[1]); } Poco::JSON::Array::Ptr attrs = new Poco::JSON::Array(); formElementToJSONArray("ConnectionAttrs", attrs); if ( attrs->size() == 0 ) // Nothing found for ConnectionAttrs, try Attrs { formElementToJSONArray("Attrs", attrs); } if ( attrs->size() > 0 ) { pcfParameters->set("ConnectionAttrs", attrs); } if ( form().has("CommandScope") ) { pcfParameters->set("CommandScope", form().get("CommandScope")); } if ( form().has("ConnInfoType") ) { pcfParameters->set("ConnInfoType", form().get("ConnInfoType")); } if ( form().has("URDisposition") ) { pcfParameters->set("URDisposition", form().get("URDisposition")); } handleFilterForm(pcfParameters); } ConnectionMapper mapper(*commandServer(), pcfParameters); set("connections", mapper.inquire()); }
JNIEXPORT void Java_com_demo_pocodemo_MainActivity_JSONDemo(JNIEnv* env, jobject thiz) { // smart pointer, so don't worry about cleaning up Poco::JSON::Object::Ptr inner = new Poco::JSON::Object; inner->set("some_number", 5); inner->set("some_string", "xyz"); std::string key = "new_object"; Poco::JSON::Object::Ptr result = new Poco::JSON::Object; result->set(key, inner); printf("isObject: %i\n", result->isObject(key)); // true printf("size of inner json obj : %i\n", inner->size()); // true }
//! helper to convert the port info vector into JSON for serialization of the block static Poco::JSON::Array::Ptr portInfosToJSON(const std::vector<Pothos::PortInfo> &infos) { Poco::JSON::Array::Ptr array = new Poco::JSON::Array(); for (const auto &info : infos) { Poco::JSON::Object::Ptr portInfo = new Poco::JSON::Object(); portInfo->set("name", info.name); portInfo->set("isSigSlot", info.isSigSlot); portInfo->set("size", info.dtype.size()); portInfo->set("dtype", info.dtype.toMarkup()); array->add(portInfo); } return array; }
void modifyTask() { int ret; ret = 0; printf("\n>>>> Modify task <<<<\n"); printf("Which task would be modified:"); int num; ret = scanf("%d", &num); if(num > tasksNum) { printf("Num input error.\n"); } else { printf("Task option:"); int option; ret = scanf("%d", &option); printf("Hour:"); int hour; ret = scanf("%d", &hour); printf("Minute:"); int minute; ret = scanf("%d", &minute); printf("Weekday:"); char str[8]; unsigned char mask = 0x40; ret = scanf("%s", str); int weekday = 0; for(int i = 0; i < 7; i++) { if(str[i] == '1') { weekday &= mask; mask >>= 1; } } printf("prepare to modify Task[%llu]\n", pTask[num]->id); Poco::JSON::Object::Ptr pObj = new Poco::JSON::Object; pObj->set("id", (Poco::Int64)pTask[num - 1]->id); pObj->set("option", option); pObj->set("hour", hour); pObj->set("minute", minute); pObj->set("weekday", weekday); printf("new task:(%d, %d, %d, %d)\n", option, hour, minute, weekday); ret = task_manager->modifyTask(pObj); printf("modify task return %d\n", ret); updateTasksList(); ret++; getchar(); }
void AuthorityServiceController::inquire() { Poco::JSON::Object::Ptr pcfParameters; if ( data().has("filter") && data().isObject("filter") ) { pcfParameters = data().getObject("filter"); // There is a bug in MQCMD_INQUIRE_AUTH_SERVICE, AuthServiceAttrs is required! if ( !pcfParameters->has("AuthServiceAttrs") ) { Poco::JSON::Array::Ptr attrs = new Poco::JSON::Array(); attrs->add("All"); pcfParameters->set("AuthServiceAttrs", attrs); } } else { pcfParameters = new Poco::JSON::Object(); set("filter", pcfParameters); Poco::JSON::Array::Ptr attrs = new Poco::JSON::Array(); formElementToJSONArray("AuthServiceAttrs", attrs); if ( attrs->size() == 0 ) // Nothing found for AuthServiceAttrs, try Attrs { formElementToJSONArray("Attrs", attrs); } if ( attrs->size() == 0 ) // Default must be specified for this command! { attrs->add("All"); } pcfParameters->set("AuthServiceAttrs", attrs); if ( form().has("ServiceComponent") ) { pcfParameters->set("ServiceComponent", form().get("ServiceComponent")); } handleFilterForm(pcfParameters); } AuthorityServiceMapper mapper(*commandServer(), pcfParameters); set("authservices", mapper.inquire()); }
/*! * Extract an args array and kwargs object parsed from an args string */ static void extractArgs(const std::string &argsStr, Poco::JSON::Array::Ptr &args, Poco::JSON::Object::Ptr &kwargs) { for (const auto &arg : splitCommaArgs(argsStr)) { const Poco::StringTokenizer kvpTok(arg, "=", Poco::StringTokenizer::TOK_TRIM); const std::vector<std::string> kvp(kvpTok.begin(), kvpTok.end()); if (kwargs and kvp.size() == 2) kwargs->set(kvp[0], exprToDynVar(kvp[1])); else if (args) args->add(exprToDynVar(arg)); } }
void QueueController::clear() { Poco::JSON::Object::Ptr pcfParameters; if (data().has("input") && data().isObject("input")) { pcfParameters = data().getObject("input"); } else { pcfParameters = new Poco::JSON::Object(); meta().set("input", pcfParameters); std::vector<std::string> parameters = getParameters(); // First parameter is queuemanager // Second parameter can be a queuename. If this is passed, the // query parameter QName or queueName is ignored. if (parameters.size() > 1) { pcfParameters->set("QName", parameters[1]); } else { // Handle query parameters pcfParameters->set("QName", form().get("QName", "*")); } if (form().has("CommandScope")) { pcfParameters->set("CommandScope", form().get("CommandScope")); } if (form().has("QSGDisposition")) { pcfParameters->set("QSGDisposition", form().get("QSGDisposition")); } } QueueClear command(*commandServer(), pcfParameters); setData("data", command.execute()); }
bool CSystemManager::getDevVersion(Poco::JSON::Object::Ptr& param, std::string& detail) { CConfigManager* config = CConfigManager::instance(); JSON::Object::Ptr pUpdate; config->getConfig("Update", pUpdate); if(pUpdate.isNull() || !pUpdate->has("infoPath")) { detail = "901"; return false; } std::string infoPath = pUpdate->getValue<std::string>("infoPath"); File file(infoPath); if(!file.exists()) { detail = "465"; return false; } Util::JSONConfiguration info; std::string version; std::string buildtime; try { info.load(infoPath); version = info.getString(UPDATE_VERSION_STR); buildtime = info.getString(UPDATE_BUILDTIME_STR); } catch(Exception& e) { detail = "465"; warnf("%s, %d: Load device info file failed, %s", __FILE__, __LINE__, e.message().c_str()); return false; } if(param->has(REG_TOKEN_STR)) { param->remove(REG_TOKEN_STR); } param->set(SYSTEM_VERSION_STR, version); param->set(SYSTEM_BUILDTIME_STR, buildtime); return true; }
Poco::JSON::Object::Ptr AffinityZoneEditor::getCurrentConfig(void) const { Poco::JSON::Object::Ptr config = new Poco::JSON::Object(); config->set("color", _colorPicker->currentColor().name().toStdString()); config->set("hostUri", _hostsBox->itemText(_hostsBox->currentIndex()).toStdString()); config->set("processName", _processNameEdit->text().toStdString()); config->set("numThreads", _numThreadsSpin->value()); config->set("priority", _prioritySpin->value()/100.0); assert(_cpuSelection != nullptr); config->set("affinityMode", _cpuSelection->mode()); Poco::JSON::Array::Ptr affinityMask = new Poco::JSON::Array(); for (auto num : _cpuSelection->selection()) affinityMask->add(num); config->set("affinityMask", affinityMask); config->set("yieldMode", _yieldModeBox->itemData(_yieldModeBox->currentIndex()).toString().toStdString()); return config; }
void addTask() { printf("\n>>>> Add task <<<<\n"); printf("Task option:"); int option; int ret; ret = 0; ret = scanf("%d", &option); printf("Hour:"); int hour; ret = scanf("%d", &hour); printf("Minute:"); int minute; ret = scanf("%d", &minute); printf("Weekday:"); int weekday = 0; char str[9]; ret = scanf("%s", str); unsigned short mask = 0x40; for(int i = 0; i < 7; i++) { if(str[i] == '1') weekday |= mask; mask = mask >> 1; } printf("%x\n", weekday); Poco::JSON::Object::Ptr pObj = new Poco::JSON::Object; pObj->set("option", option); pObj->set("hour", hour); pObj->set("minute", minute); pObj->set("weekday", weekday); Poco::Int64 retval = task_manager->addTask(pObj); printf("Add task result: %llu.\n", retval); updateTasksList(); ret++; getchar(); }
void ChannelController::remove() { Poco::JSON::Object::Ptr pcfParameters; if (data().has("input") && data().isObject("input")) { pcfParameters = data().getObject("input"); } else { pcfParameters = new Poco::JSON::Object(); meta().set("input", pcfParameters); std::vector<std::string> parameters = getParameters(); // First parameter is queuemanager // Second parameter can be a queuename. If this is passed, the // query parameter QName or queueName is ignored. if (parameters.size() > 1) { pcfParameters->set("ChannelName", parameters[1]); } else { // Handle query parameters std::string channelName; if (form().has("ChannelName")) { channelName = form().get("ChannelName"); } pcfParameters->set("ChannelName", channelName); } if (form().has("CommandScope")) { pcfParameters->set("CommandScope", form().get("CommandScope")); } if (form().has("QSGDisposition")) { pcfParameters->set("QSGDisposition", form().get("QSGDisposition")); } if (form().has("ChannelType")) { pcfParameters->set("ChannelType", form().get("ChannelType")); } if (form().has("ChannelTable")) { pcfParameters->set("ChannelTable", form().get("ChannelTable")); } } ChannelRemove command(*commandServer(), pcfParameters); command.execute(); }
Poco::JSON::Object::Ptr BlockEval::inspectPorts(void) { auto block = _proxyBlock; Poco::JSON::Object::Ptr info = new Poco::JSON::Object(); info->set("uid", block.call<std::string>("uid")); //TODO FIXME inspect will fail for topologies ATM, cant query isSignal/isSlot on topology Poco::JSON::Array::Ptr inputPorts = new Poco::JSON::Array(); for (const auto &name : block.call<std::vector<std::string>>("inputPortNames")) { Poco::JSON::Object::Ptr portInfo = new Poco::JSON::Object(); portInfo->set("name", name); portInfo->set("isSlot", block.callProxy("input", name).call<bool>("isSlot")); portInfo->set("size", block.callProxy("input", name).callProxy("dtype").call<unsigned>("size")); portInfo->set("dtype", block.callProxy("input", name).callProxy("dtype").call<std::string>("toString")); inputPorts->add(portInfo); } info->set("inputPorts", inputPorts); Poco::JSON::Array::Ptr outputPorts = new Poco::JSON::Array(); for (const auto &name : block.call<std::vector<std::string>>("outputPortNames")) { Poco::JSON::Object::Ptr portInfo = new Poco::JSON::Object(); portInfo->set("name", name); portInfo->set("isSignal", block.callProxy("output", name).call<bool>("isSignal")); portInfo->set("size", block.callProxy("output", name).callProxy("dtype").call<unsigned>("size")); portInfo->set("dtype", block.callProxy("output", name).callProxy("dtype").call<std::string>("toString")); outputPorts->add(portInfo); } info->set("outputPorts", outputPorts); return info; }
void ChannelController::inquire() { Poco::JSON::Object::Ptr pcfParameters; if ( data().has("input") && data().isObject("input") ) { pcfParameters = data().getObject("input"); } else { pcfParameters = new Poco::JSON::Object(); setData("input", pcfParameters); std::vector<std::string> parameters = getParameters(); // First parameter is queuemanager // Second parameter can be a channelname. If this is passed // the query parameter ChannelName is ignored. A third parameter // can be used for setting the channel type. This parameter can also // be set using the query parameter ChannelType. if ( parameters.size() > 1 ) { pcfParameters->set("ChannelName", parameters[1]); } else { // Handle query parameters pcfParameters->set("ChannelName", form().get("ChannelName", "*")); } if ( parameters.size() > 2 ) { pcfParameters->set("ChannelType", parameters[2]); } else if ( form().has("ChannelType") ) { pcfParameters->set("ChannelType", form().get("ChannelType", "All")); } pcfParameters->set("ExcludeSystem", form().get("ExcludeSystem", "false").compare("true") == 0); Poco::JSON::Array::Ptr attrs = new Poco::JSON::Array(); formElementToJSONArray("ChannelAttrs", attrs); if ( attrs->size() == 0 ) // Nothing found for ChannelAttrs, try Attrs { formElementToJSONArray("Attrs", attrs); } if ( attrs->size() > 0 ) { pcfParameters->set("ChannelAttrs", attrs); } if ( form().has("CommandScope") ) { pcfParameters->set("CommandScope", form().get("CommandScope")); } if ( form().has("QSGDisposition") ) { pcfParameters->set("QSGDisposition", form().get("QSGDisposition")); } if ( form().has("DefaultChannelDisposition") ) { pcfParameters->set("DefaultChannelDisposition", form().get("DefaultChannelDisposition")); } handleFilterForm(pcfParameters); } ChannelInquire command(*commandServer(), pcfParameters); setData("data", command.execute()); }
void SubscriptionController::inquire() { Poco::JSON::Object::Ptr pcfParameters; if ( data().has("input") && data().isObject("input") ) { pcfParameters = data().getObject("input"); } else { pcfParameters = new Poco::JSON::Object(); setData("input", pcfParameters); std::vector<std::string> parameters = getParameters(); // First parameter is queuemanager // Second parameter can be a subname. If this is passed // the query parameter subName is ignored. if ( parameters.size() > 1 ) { pcfParameters->set("SubName", parameters[1]); } else { // Handle query parameters pcfParameters->set("SubName", form().get("SubName", "*")); } if ( form().has("SubId") ) { pcfParameters->set("SubId", form().get("SubId")); } if ( form().has("SubscriptionType") ) { pcfParameters->set("SubscriptionType", form().get("SubscriptionType")); } pcfParameters->set("ExcludeSystem", form().get("ExcludeSystem", "false").compare("true") == 0); Poco::JSON::Array::Ptr attrs = new Poco::JSON::Array(); formElementToJSONArray("SubAttrs", attrs); if ( attrs->size() == 0 ) // Nothing found for SubAttrs, try Attrs { formElementToJSONArray("Attrs", attrs); } if ( attrs->size() > 0 ) { pcfParameters->set("SubAttrs", attrs); } if ( form().has("CommandScope") ) { pcfParameters->set("CommandScope", form().get("CommandScope")); } if ( form().has("Durable") ) { pcfParameters->set("Durable", form().get("Durable")); } handleFilterForm(pcfParameters); } SubscriptionInquire command(*commandServer(), pcfParameters); setData("data", command.execute()); }
void AuthorityRecordController::inquire() { if ( qmgr()->zos() ) { // Authority records are not supported on z/OS setResponseStatus(Poco::Net::HTTPResponse::HTTP_NOT_IMPLEMENTED, "/authrec/inquire not implemented for z/OS"); return; } Poco::JSON::Object::Ptr pcfParameters; if ( data().has("input") && data().isObject("input") ) { pcfParameters = data().getObject("input"); } else { pcfParameters = new Poco::JSON::Object(); setData("input", pcfParameters); std::vector<std::string> parameters = getParameters(); // First parameter is queuemanager // Second parameter can be a authentication information name and will result in inquiring // only that queue and ignores all query parameters. if ( parameters.size() > 1 ) { pcfParameters->set("ProfileName", parameters[1]); } else { // Handle query parameters if ( form().has("ProfileName") ) { pcfParameters->set("ProfileName", form().get("ProfileName")); } } Poco::JSON::Array::Ptr attrs = new Poco::JSON::Array(); formElementToJSONArray("ProfileAttrs", attrs); if ( attrs->size() == 0 ) // Nothing found for ProfileAttrs, try Attrs { formElementToJSONArray("Attrs", attrs); } if ( attrs->size() > 0 ) { pcfParameters->set("ProfileAttrs", attrs); } Poco::JSON::Array::Ptr jsonOptions = new Poco::JSON::Array(); pcfParameters->set("Options", jsonOptions); for(Poco::Net::NameValueCollection::ConstIterator itOptions = form().find("Options"); itOptions != form().end() && Poco::icompare(itOptions->first, "Options") == 0; ++itOptions) { jsonOptions->add(itOptions->second); } if ( form().has("ObjectType") ) pcfParameters->set("ObjectType", form().get("ObjectType")); if ( form().has("EntityName") ) pcfParameters->set("EntityName", form().get("EntityName")); if ( form().has("EntityType") ) pcfParameters->set("EntityType", form().get("EntityType")); if ( form().has("ServiceComponent") ) pcfParameters->set("ServiceComponent", form().get("ServiceComponent")); } AuthorityRecordInquire command(*commandServer(), pcfParameters); setData("data", command.execute()); }
void Dictionary::mapToJSON(const PCF& pcf, Poco::JSON::Object::Ptr& json, bool alwaysCreate) const { std::vector<MQLONG> parameters = pcf.getParameters(); for(std::vector<MQLONG>::iterator it = parameters.begin(); it != parameters.end(); ++it) { std::string name = getName(*it); if ( name.empty() ) { if ( alwaysCreate ) { name = "id_" + Poco::NumberFormatter::format(*it); } else { continue; } } if ( json->has(name) ) continue; // Don't overwrite already added properties Poco::JSON::Object::Ptr field = new Poco::JSON::Object(); json->set(name, field); field->set("id", *it); if ( pcf.isNumber(*it) ) { MQLONG value = pcf.getParameterNum(*it); field->set("value", value); if ( hasDisplayMap(*it) ) { std::string displayValue = getDisplayValue(*it, value); if ( displayValue.empty() ) { displayValue = "Unknown value " + Poco::NumberFormatter::format(value) + " for " + Poco::NumberFormatter::format(*it); } field->set("display", displayValue); } } else if ( pcf.isString(*it) ) { field->set("value", pcf.getParameterString(*it)); } else if ( pcf.isNumberList(*it) ) { std::vector<MQLONG> values = pcf.getParameterNumList(*it); Poco::JSON::Array::Ptr jsonValues = new Poco::JSON::Array(); field->set("value", jsonValues); if ( hasDisplayMap(*it) ) { for(std::vector<MQLONG>::iterator vit = values.begin(); vit != values.end(); ++vit) { Poco::JSON::Object::Ptr jsonValueObject = new Poco::JSON::Object(); std::string displayValue = getDisplayValue(*it, *vit); if ( displayValue.empty() ) { displayValue = "Unknown value " + Poco::NumberFormatter::format(*vit) + " for " + Poco::NumberFormatter::format(*it); } jsonValueObject->set("value", *vit); jsonValueObject->set("display", displayValue); jsonValues->add(jsonValueObject); } } else { for(std::vector<MQLONG>::iterator vit = values.begin(); vit != values.end(); ++vit) { jsonValues->add(*vit); } } } else if ( pcf.isStringList(*it) ) { Poco::JSON::Array::Ptr jsonValues = new Poco::JSON::Array(); field->set("value", jsonValues); std::vector<std::string> strings = pcf.getParameterStringList(*it); for(std::vector<std::string>::iterator vit = strings.begin(); vit != strings.end(); ++vit) { jsonValues->add(*vit); } } else { poco_assert_dbg(false); } } }
void TopicController::inquire() { Poco::JSON::Object::Ptr pcfParameters; if ( data().has("filter") && data().isObject("filter") ) { pcfParameters = data().getObject("filter"); } else { pcfParameters = new Poco::JSON::Object(); set("filter", pcfParameters); std::vector<std::string> parameters = getParameters(); // First parameter is queuemanager // Second parameter can be a topicname. If this is passed // the query parameter topicName is ignored. if ( parameters.size() > 1 ) { pcfParameters->set("TopicName", parameters[1]); } else { // Handle query parameters std::string topicNameField; if ( form().has("TopicName") ) { topicNameField = form().get("TopicName"); } else if ( form().has("name") ) { topicNameField = form().get("name"); } if ( topicNameField.empty() ) { topicNameField = "*"; } pcfParameters->set("TopicName", topicNameField); } pcfParameters->set("ExcludeSystem", form().get("ExcludeSystem", "false").compare("true") == 0); if ( form().has("ClusterInfo") ) { std::string clusterInfo = form().get("ClusterInfo"); pcfParameters->set("ClusterInfo", Poco::icompare(clusterInfo, "true") == 0 ? "true" : "false"); } Poco::JSON::Array::Ptr attrs = new Poco::JSON::Array(); formElementToJSONArray("TopicAttrs", attrs); if ( attrs->size() == 0 ) // Nothing found for TopicAttrs, try Attrs { formElementToJSONArray("Attrs", attrs); } if ( attrs->size() > 0 ) { pcfParameters->set("TopicAttrs", attrs); } if ( form().has("CommandScope") ) { pcfParameters->set("CommandScope", form().get("CommandScope")); } if ( form().has("QSGDisposition") ) { pcfParameters->set("QSGDisposition", form().get("QSGDisposition")); } if ( form().has("TopicType") ) { pcfParameters->set("TopicType", form().get("TopicType")); } handleFilterForm(pcfParameters); } TopicMapper mapper(*commandServer(), pcfParameters); set("topics", mapper.inquire()); }
void QueueController::inquire() { Poco::JSON::Object::Ptr pcfParameters; if ( data().has("input") && data().isObject("input") ) { pcfParameters = data().getObject("input"); } else { pcfParameters = new Poco::JSON::Object(); meta().set("input", pcfParameters); std::vector<std::string> parameters = getParameters(); // First parameter is queuemanager // Second parameter can be a queuename. If this is passed, the // query parameter QName or queueName is ignored. if ( parameters.size() > 1 ) { pcfParameters->set("QName", parameters[1]); } else { // Handle query parameters pcfParameters->set("QName", form().get("QName", "*")); } if ( form().has("ClusterInfo") ) { std::string clusterInfo = form().get("ClusterInfo"); pcfParameters->set("ClusterInfo", Poco::icompare(clusterInfo, "true") == 0 ? "true" : "false"); } if ( form().has("ClusterName") ) { pcfParameters->set("ClusterName", form().get("ClusterName")); } if ( form().has("ClusterNameList") ) { pcfParameters->set("ClusterNamelist", form().get("ClusterNamelist")); } if ( form().has("CommandScope") ) { pcfParameters->set("CommandScope", form().get("CommandScope")); } if ( form().has("PageSetId") ) { int pageSetId = 0; if ( Poco::NumberParser::tryParse(form().get("PageSetId"), pageSetId) ) { pcfParameters->set("PageSetId", pageSetId); } } if ( form().has("QSGDisposition") ) { pcfParameters->set("QSGDisposition", form().get("QSGDisposition")); } std::string queueDepthField; if ( form().has("CurrentQDepth") ) { queueDepthField = form().get("CurrentQDepth", ""); } else if ( form().has("QueueDepth")) { queueDepthField = form().get("QueueDepth", ""); } if ( !queueDepthField.empty() ) { int queueDepth = 0; if ( Poco::NumberParser::tryParse(queueDepthField, queueDepth) ) { Poco::JSON::Object::Ptr filter = new Poco::JSON::Object(); filter->set("Parameter", "CurrentQDepth"); filter->set("Operator", "NLT"); //Not Less## filter->set("FilterValue", queueDepth); pcfParameters->set("IntegerFilterCommand", filter); } } handleFilterForm(pcfParameters); if ( form().has("QueueUsage") ) { pcfParameters->set("Usage", form().get("QueueUsage")); } else if ( form().has("Usage") ) { pcfParameters->set("Usage", form().get("Usage")); } if ( form().has("QueueType") ) { pcfParameters->set("QType", form().get("QueueType")); } pcfParameters->set("ExcludeSystem", form().get("ExcludeSystem", "false").compare("true") == 0); pcfParameters->set("ExcludeTemp", form().get("ExcludeTemp", "false").compare("true") == 0); Poco::JSON::Array::Ptr attrs = new Poco::JSON::Array(); formElementToJSONArray("QAttrs", attrs); if ( attrs->size() == 0 ) // Nothing found for QAttrs, try Attrs { formElementToJSONArray("Attrs", attrs); } if ( attrs->size() > 0 ) { pcfParameters->set("QAttrs", attrs); } } QueueInquire command(*commandServer(), pcfParameters); setData("data", command.execute()); }
void AuthenticationInformationController::inquire() { Poco::JSON::Object::Ptr pcfParameters; if ( data().has("filter") && data().isObject("filter") ) { pcfParameters = data().getObject("filter"); } else { pcfParameters = new Poco::JSON::Object(); set("filter", pcfParameters); std::vector<std::string> parameters = getParameters(); // First parameter is queuemanager // Second parameter can be a authentication information name (generic name is allowed) if ( parameters.size() > 1 ) { pcfParameters->set("AuthInfoName", parameters[1]); } else { // Handle query parameters std::string authInfoNameField; if ( form().has("AuthInfoName") ) { authInfoNameField = form().get("AuthInfoName"); } else if ( form().has("name") ) { authInfoNameField = form().get("name"); } if ( authInfoNameField.empty() ) { authInfoNameField = "*"; } pcfParameters->set("AuthInfoName", authInfoNameField); } Poco::JSON::Array::Ptr attrs = new Poco::JSON::Array(); formElementToJSONArray("AuthInfoAttrs", attrs); if ( attrs->size() == 0 ) // Nothing found for AuthInfoAttrs, try Attrs { formElementToJSONArray("Attrs", attrs); } if ( attrs->size() > 0 ) { pcfParameters->set("AuthInfoAttrs", attrs); } if ( form().has("AuthInfoType") ) { pcfParameters->set("AuthInfoType", form().get("AuthInfoType")); } if ( form().has("CommandScope") ) { pcfParameters->set("CommandScope", form().get("CommandScope")); } if ( form().has("QSGDisposition") ) { pcfParameters->set("QSGDisposition", form().get("QSGDisposition")); } pcfParameters->set("ExcludeSystem", form().get("ExcludeSystem", "false").compare("true") == 0); handleFilterForm(pcfParameters); } AuthenticationInformationMapper mapper(*commandServer(), pcfParameters); set("authinfos", mapper.inquire()); }
int CUserMgr::HandleHeader(CMission* pMission) { ST_CMD_HEADER header = *(ST_CMD_HEADER*)pMission->m_pMissionData; CNetUser* pUser = pMission->m_pUser; BOOL bFind = TRUE; //该命令是否被处理 switch (header.usCmd) { case USER_LOGIN: { ST_LOGIN_INFO LoginInfo = *(pStLoginInfo)(pMission->m_pMissionData + HEAD_SIZE); std::cout << "login info: " << LoginInfo.szUserNo << ", pwd: " << LoginInfo.szPWD << std::endl; // _mapUserLock_.lock(); // MAP_USER::iterator itFind = _mapUser_.find(LoginInfo.szUserNo); // if (itFind != _mapUser_.end()) // { // //重复登录提醒, // std::string strSendData = "账号已登录"; // // pUser->SendResponesInfo(USER_RESPONSE_LOGIN, RESULT_LOGIN_FAIL, (char*)strSendData.c_str(), strSendData.length()); // _mapUserLock_.unlock(); // return 1; // } // _mapUserLock_.unlock(); #ifdef TEST_MODE _mapUserLock_.lock(); MAP_USER::iterator itFind2 = _mapUser_.find(LoginInfo.szUserNo); if (itFind2 == _mapUser_.end()) { _mapUser_.insert(MAP_USER::value_type(LoginInfo.szUserNo, pUser)); } else { itFind2->second = pUser; } _mapUserLock_.unlock(); ST_LOGIN_RESULT stResult; ZeroMemory(&stResult, sizeof(stResult)); stResult.nTeacherId = 100; stResult.nUserId = 200; std::string strEzs = "1234567890abcdefghijklmnopqrstuvwxyz"; strncpy(stResult.szEzs, strEzs.c_str(), strEzs.length()); strncpy(stResult.szUserInfo, LoginInfo.szUserNo, 100); char szLoginResult[1024] = { 0 }; memcpy(szLoginResult, (char*)&stResult, sizeof(stResult)); pUser->UpdateLogonInfo(LoginInfo.szUserNo, LoginInfo.szPWD); pUser->SendResponesInfo(USER_RESPONSE_LOGIN, RESULT_SUCCESS, szLoginResult, sizeof(stResult)); return 1; #endif // #ifdef TO_WHTY #if 1 pSCAN_REQ_TASK pTask = NULL; if(SysSet.m_nServerMode == 1) { std::string strAppKey = "SP0000000TEST"; std::string strAppValue = "63d4311d46714a39-a54cf2b0537a79b6TEST"; std::string strMsgFormat = "json"; std::string strMethod = "login111"; std::string strPwd = LoginInfo.szPWD; std::string strUser = LoginInfo.szUserNo; std::string strSha1Src = Poco::format("%sappKey%smessageFormat%smethod%spassword%susername%sv1.0%s", strAppValue, strAppKey, strMsgFormat, strMethod, strPwd, strUser, strAppValue); Poco::SHA1Engine engine; engine.update(strSha1Src); std::string strSHA1 = Poco::DigestEngine::digestToHex(engine.digest()); std::string strSHA1_Up = Poco::toUpper(strSHA1); std::string strUriValue = Poco::format("/router?appKey=%s&messageFormat=%s&method=%s&password=%s&sign=%s&username=%s&v=1.0", strAppKey, strMsgFormat, strMethod, strPwd, strSHA1_Up, strUser); pTask = new SCAN_REQ_TASK; pTask->strUri = SysSet.m_strBackUri + strUriValue; pTask->pUser = pUser; pTask->strMsg = "login2Ty"; pTask->strUser = LoginInfo.szUserNo; pTask->strPwd = LoginInfo.szPWD; std::string strLog = Poco::format("天喻登录: src_SHA1 = %s\nSHA1 = %s\nuri = %s", strSha1Src, strSHA1_Up, pTask->strUri); g_Log.LogOut(strLog); } else { pTask = new SCAN_REQ_TASK; pTask->pUser = pUser; pTask->strUser = LoginInfo.szUserNo; pTask->strPwd = LoginInfo.szPWD; switch (SysSet.m_nUseThirdPlatform) { case 3: //成都佳发,用的天喻系统,登录方法改变 case 1: //武汉天喻 { std::string strAppKey = "SP0000000TEST"; std::string strAppValue = "63d4311d46714a39-a54cf2b0537a79b6TEST"; std::string strMsgFormat = "json"; std::string strMethod = "login111"; if (SysSet.m_nUseThirdPlatform == 3) strMethod = "loginjf"; std::string strPwd = LoginInfo.szPWD; std::string strUser = LoginInfo.szUserNo; std::string strSha1Src = Poco::format("%sappKey%smessageFormat%smethod%spassword%susername%sv1.0%s", strAppValue, strAppKey, strMsgFormat, strMethod, strPwd, strUser, strAppValue); Poco::SHA1Engine engine; engine.update(strSha1Src); std::string strSHA1 = Poco::DigestEngine::digestToHex(engine.digest()); std::string strSHA1_Up = Poco::toUpper(strSHA1); std::string strUriValue = Poco::format("/router?appKey=%s&messageFormat=%s&method=%s&password=%s&sign=%s&username=%s&v=1.0", strAppKey, strMsgFormat, strMethod, strPwd, strSHA1_Up, strUser); pTask->strUri = SysSet.m_str3PlatformUrl + strUriValue; pTask->strMsg = "login2Ty"; } break; case 2: //山西寰烁 { pTask->strUri = SysSet.m_str3PlatformUrl + "?username="******"&password="******"login_SanXi_huanshuo"; } break; default: //默认易考乐学后端平台 { pTask->strUri = SysSet.m_strBackUri + "/login"; pTask->strMsg = "login"; char szTmp[200] = { 0 }; sprintf(szTmp, "username=%s&password=%s", LoginInfo.szUserNo, LoginInfo.szPWD); pTask->strRequest = szTmp; } } std::string strLog = Poco::format("登录命令: msg = %s(%s:%s)\nurl = %s", pTask->strMsg, pTask->strUser, pTask->strPwd, pTask->strUri); g_Log.LogOut(strLog); } #else pSCAN_REQ_TASK pTask = new SCAN_REQ_TASK; pTask->strUri = SysSet.m_strBackUri + "/login"; pTask->pUser = pUser; pTask->strMsg = "login"; pTask->strUser = LoginInfo.szUserNo; pTask->strPwd = LoginInfo.szPWD; char szTmp[200] = { 0 }; sprintf(szTmp, "username=%s&password=%s", LoginInfo.szUserNo, LoginInfo.szPWD); pTask->strRequest = szTmp; #endif g_fmScanReq.lock(); g_lScanReq.push_back(pTask); g_fmScanReq.unlock(); } break; case USER_LOGIN_4TY: { ST_LOGIN_INFO4TY LoginInfo = *(pStLoginInfo4TY)(pMission->m_pMissionData + HEAD_SIZE); std::cout << "login info: " << LoginInfo.szUserNo << ", pwd: " << LoginInfo.szPWD << ", platformcode: " << LoginInfo.szPlatformCode << ", encryption: " << LoginInfo.szEncryption << ", platformUrl: " << LoginInfo.szPlatformUrl << std::endl; std::string strAppKey = "SP0000000TEST"; std::string strAppValue = "63d4311d46714a39-a54cf2b0537a79b6TEST"; std::string strMsgFormat = "json"; std::string strMethod = "login111"; std::string strPwd = LoginInfo.szPWD; std::string strUser = LoginInfo.szUserNo; std::string strEncryption = LoginInfo.szEncryption; std::string strPlatformCode = LoginInfo.szPlatformCode; std::string strPlatformUrl = LoginInfo.szPlatformUrl; std::string strSha1Src = Poco::format("%sappKey%sencryption%smessageFormat%smethod%spassword%splatformUrl%splatformcode%susername%sv1.0%s", \ strAppValue, strAppKey, strEncryption, strMsgFormat, strMethod, strPwd, strPlatformUrl, strPlatformCode, strUser, strAppValue); Poco::SHA1Engine engine; engine.update(strSha1Src); std::string strSHA1 = Poco::DigestEngine::digestToHex(engine.digest()); std::string strSHA1_Up = Poco::toUpper(strSHA1); std::string strUriValue = Poco::format("/router?appKey=%s&encryption=%s&messageFormat=%s&method=%s&password=%s&platformUrl=%s&platformcode=%s&sign=%s&username=%s&v=1.0",\ strAppKey, strEncryption, strMsgFormat, strMethod, strPwd, strPlatformUrl, strPlatformCode, strSHA1_Up, strUser); pSCAN_REQ_TASK pTask = new SCAN_REQ_TASK; if (SysSet.m_nServerMode == 0) //非天喻服务器模式,则进入此处为登录第3方天喻平台 pTask->strUri = SysSet.m_str3PlatformUrl + strUriValue; else pTask->strUri = SysSet.m_strBackUri + strUriValue; pTask->pUser = pUser; pTask->strMsg = "login2Ty"; pTask->strUser = LoginInfo.szUserNo; pTask->strPwd = LoginInfo.szPWD; std::string strLog = Poco::format("天喻登录平台: src_SHA1 = %s\nSHA1 = %s\nuri = %s", strSha1Src, strSHA1_Up, pTask->strUri); g_Log.LogOut(strLog); g_fmScanReq.lock(); g_lScanReq.push_back(pTask); g_fmScanReq.unlock(); } break; case USER_LOGOUT: { char szData[1024] = { 0 }; strncpy(szData, pMission->m_pMissionData + HEAD_SIZE, header.uPackSize); std::string strUser = szData; _mapUserLock_.lock(); MAP_USER::iterator itFind = _mapUser_.find(strUser); if (itFind != _mapUser_.end()) { _mapUser_.erase(itFind); std::string strLog = "账号" + strUser + "退出登录"; pUser->SendResponesInfo(USER_RESPONSE_LOGOUT, RESULT_SUCCESS, (char*)strUser.c_str(), strUser.length()); g_Log.LogOut(strLog); } _mapUserLock_.unlock(); } break; case USER_GETEXAMINFO: { ST_EXAM_INFO stExamInfo = *(pStExamInfo)(pMission->m_pMissionData + HEAD_SIZE); std::string strEzs = stExamInfo.szEzs; int nUserID = stExamInfo.nUserId; std::cout << "获取考试列表: " << pUser->m_Name <<std::endl; #ifdef TEST_MODE #if 1 std::string strExamListPath = SysSet.m_strCurrentDir + "\\ServerTestData\\ServerTestData-examlist.txt"; std::string strJsnData; std::ifstream in(strExamListPath); if (!in) return false; std::string strJsnLine; while (!in.eof()) { getline(in, strJsnLine); strJsnData.append(strJsnLine); } in.close(); pUser->SendResponesInfo(USER_RESPONSE_EXAMINFO, RESULT_EXAMINFO_SUCCESS, (char*)strJsnData.c_str(), strJsnData.length()); return 1; #else Poco::JSON::Object jsnSubject1; jsnSubject1.set("id", 200); jsnSubject1.set("name", CMyCodeConvert::Gb2312ToUtf8("语文")); jsnSubject1.set("code", 1001); jsnSubject1.set("scanTemplateName", "100_200.mod"); Poco::JSON::Object jsnSubject2; jsnSubject2.set("id", 201); jsnSubject2.set("name", CMyCodeConvert::Gb2312ToUtf8("数学")); jsnSubject2.set("code", 1002); jsnSubject2.set("scanTemplateName", "100_201.mod"); Poco::JSON::Array jsnSubjectArry; jsnSubjectArry.add(jsnSubject1); jsnSubjectArry.add(jsnSubject2); Poco::JSON::Object jsnExamObj; jsnExamObj.set("id", 100); jsnExamObj.set("name", CMyCodeConvert::Gb2312ToUtf8("高三期末考试")); Poco::JSON::Object jsnExamTypeObj; jsnExamTypeObj.set("id", 33); jsnExamTypeObj.set("name", CMyCodeConvert::Gb2312ToUtf8("期末考试")); jsnExamObj.set("examType", jsnExamTypeObj); Poco::JSON::Object jsnGrade; jsnGrade.set("id", 5); jsnGrade.set("name", CMyCodeConvert::Gb2312ToUtf8("高三")); jsnGrade.set("aliasName", ""); jsnExamObj.set("grade", jsnGrade); jsnExamObj.set("examSubjects", jsnSubjectArry); jsnExamObj.set("state", 1); Poco::JSON::Array jsnExamArry; jsnExamArry.add(jsnExamObj); Poco::JSON::Object jsnResult; jsnResult.set("exams", jsnExamArry); Poco::JSON::Object jsnStatus; jsnStatus.set("success", true); jsnResult.set("status", jsnStatus); std::stringstream jsnString; jsnResult.stringify(jsnString, 0); pUser->SendResponesInfo(USER_RESPONSE_EXAMINFO, RESULT_EXAMINFO_SUCCESS, (char*)jsnString.str().c_str(), jsnString.str().length()); return 1; #endif #endif // #ifdef TO_WHTY #if 1 pSCAN_REQ_TASK pTask = NULL; if (SysSet.m_nServerMode == 1) { std::string strAppKey = "SP0000000TEST"; std::string strAppValue = "63d4311d46714a39-a54cf2b0537a79b6TEST"; std::string strMsgFormat = "json"; std::string strMethod = "examinfo"; std::string strPersonId; std::string strSchoolID; std::string strTmp = stExamInfo.szEzs; int nPos = strTmp.find("###"); if (nPos != std::string::npos) { std::string strEzs = strTmp.substr(0, nPos); strSchoolID = strTmp.substr(nPos + 3); strPersonId = strEzs; } else { strPersonId = stExamInfo.szEzs; } // std::string strPersonId = stExamInfo.szEzs; std::string strSha1Src = Poco::format("%sappKey%smessageFormat%smethod%sperson_id%sv1.0%s", strAppValue, strAppKey, strMsgFormat, strMethod, strPersonId, strAppValue); Poco::SHA1Engine engine; engine.update(strSha1Src); std::string strSHA1 = Poco::DigestEngine::digestToHex(engine.digest()); std::string strSHA1_Up = Poco::toUpper(strSHA1); // std::string strUriValue = Poco::format("/router?appKey=%s&messageFormat=%s&method=%s&person_id=%s&sign=%s&v=1.0", strAppKey, strMsgFormat, strMethod, strPersonId, strSHA1_Up); std::string strUriValue; if (nPos != std::string::npos) strUriValue = Poco::format("/router?appKey=%s&messageFormat=%s&method=%s&person_id=%s&school_id=%s&sign=%s&v=1.0", strAppKey, strMsgFormat, strMethod, strPersonId, strSchoolID, strSHA1_Up); //2017.6.20添加school_id else strUriValue = Poco::format("/router?appKey=%s&messageFormat=%s&method=%s&person_id=%s&sign=%s&v=1.0", strAppKey, strMsgFormat, strMethod, strPersonId, strSHA1_Up); pTask = new SCAN_REQ_TASK; pTask->strUri = SysSet.m_strBackUri + strUriValue; pTask->pUser = pUser; pTask->strEzs = SysSet.m_strSessionName + strEzs; //"ezs=" + strEzs; pTask->strMsg = "ezs"; std::string strLog = Poco::format("天喻平台,获取考试列表: src_SHA1 = %s\nSHA1 = %s\nuri = %s", strSha1Src, strSHA1_Up, pTask->strUri); g_Log.LogOut(strLog); } else { pTask = new SCAN_REQ_TASK; std::string strUserID = Poco::format("%d", nUserID); if (SysSet.m_nQuYuVersion) pTask->strUri = SysSet.m_strBackUri + "/examinfo"; else pTask->strUri = SysSet.m_strBackUri + "/examinfo/" + strUserID; pTask->pUser = pUser; pTask->strEzs = SysSet.m_strSessionName + strEzs; //"ezs=" + strEzs; pTask->strMsg = "ezs"; } #else pSCAN_REQ_TASK pTask = new SCAN_REQ_TASK; pTask->strUri = SysSet.m_strBackUri + "/examinfo"; pTask->pUser = pUser; pTask->strEzs = SysSet.m_strSessionName + strEzs; //"ezs=" + strEzs; pTask->strMsg = "ezs"; #endif g_fmScanReq.lock(); g_lScanReq.push_back(pTask); g_fmScanReq.unlock(); } break; case USER_SETMODELINFO: { ST_MODELINFO stModelInfo = *(pST_MODELINFO)(pMission->m_pMissionData + HEAD_SIZE); bool bNeedSend = false; char szIndex[50] = { 0 }; sprintf(szIndex, "%d_%d", stModelInfo.nExamID, stModelInfo.nSubjectID); std::cout << "设置考试模板命令: " << szIndex << std::endl; std::stringstream ssLog; ssLog << "设置考试模板命令: " << szIndex << "\n"; MAP_MODEL::iterator itFind = _mapModel_.find(szIndex); if (itFind == _mapModel_.end()) { bNeedSend = true; ssLog << "模板信息映射表中未找到" << szIndex << "的信息,可以发送此模板的信息[Ezs = " << stModelInfo.szEzs << "]\n"; //g_Log.LogOut(strLog); pST_MODELINFO pStModelInfo = new ST_MODELINFO; memcpy(pStModelInfo, &stModelInfo, sizeof(stModelInfo)); pMODELINFO pModelInfo = new MODELINFO; pModelInfo->nExamID = stModelInfo.nExamID; pModelInfo->nSubjectID = stModelInfo.nSubjectID; pModelInfo->strName = stModelInfo.szModelName; pModelInfo->strEzs = stModelInfo.szEzs; pModelInfo->strElectOmr = stModelInfo.szElectOmr; pModelInfo->strMd5 = stModelInfo.szMD5; pModelInfo->pUploadModelInfo = pStModelInfo; pModelInfo->pUser = pUser; _mapModelLock_.lock(); _mapModel_.insert(MAP_MODEL::value_type(szIndex, pModelInfo)); _mapModelLock_.unlock(); ssLog << "添加新的模板信息,等待接收模板文件: " << stModelInfo.szModelName << "\n"; } else { pMODELINFO pModelInfo = itFind->second; try { Poco::File modelFile(CMyCodeConvert::Gb2312ToUtf8(pModelInfo->strPath)); if (!modelFile.exists()) pModelInfo->strMd5 = ""; } catch (Poco::Exception&exc) { } if (pModelInfo->strMd5 != stModelInfo.szMD5) //文件有修改,需要重新发送 { bNeedSend = true; pST_MODELINFO pStModelInfo = new ST_MODELINFO; memcpy(pStModelInfo, &stModelInfo, sizeof(stModelInfo)); SAFE_RELEASE(pModelInfo->pUploadModelInfo); pModelInfo->pUploadModelInfo = pStModelInfo; pModelInfo->pUser = pUser; pModelInfo->nExamID = stModelInfo.nExamID; pModelInfo->nSubjectID = stModelInfo.nSubjectID; pModelInfo->strName = stModelInfo.szModelName; pModelInfo->strEzs = stModelInfo.szEzs; pModelInfo->strElectOmr = stModelInfo.szElectOmr; pModelInfo->strMd5 = stModelInfo.szMD5; ssLog << "模板信息映射表中" << szIndex << "的文件MD5与需要上传的文件MD5信息不一致,可以发送此模板的信息[Ezs = " << pModelInfo->strEzs <<"]"; } else std::cout << "文件未修改,不需要重传" << std::endl; } if (bNeedSend) { pUser->SendResponesInfo(USER_RESPONSE_MODELINFO, RESULT_SETMODELINFO_SEND, (char*)&stModelInfo, sizeof(stModelInfo)); #ifdef TEST_MODE return 1; #endif #if 0 //需要先解压后提交图片MD5再去后端设置信息 Poco::JSON::Object jsnModel; jsnModel.set("examId", stModelInfo.nExamID); jsnModel.set("subjectId", stModelInfo.nSubjectID); jsnModel.set("tmplateName", stModelInfo.szModelName); jsnModel.set("modelElectOmr", stModelInfo.szElectOmr); std::stringstream jsnString; jsnModel.stringify(jsnString, 0); std::string strEzs = stModelInfo.szEzs; pSCAN_REQ_TASK pTask = new SCAN_REQ_TASK; pTask->strUri = SysSet.m_strBackUri + "/scanTemplate"; pTask->pUser = pUser; pTask->strEzs = "ezs=" + strEzs; pTask->strMsg = "setScanModel"; pTask->strRequest = jsnString.str(); g_fmScanReq.lock(); g_lScanReq.push_back(pTask); g_fmScanReq.unlock(); #endif } else pUser->SendResult(USER_RESPONSE_MODELINFO, RESULT_SETMODELINFO_NO); g_Log.LogOut(ssLog.str()); } break; case USER_NEED_DOWN_MODEL: { ST_DOWN_MODEL stModelInfo = *(pST_DOWN_MODEL)(pMission->m_pMissionData + HEAD_SIZE); bool bNeedDown = true; char szIndex[50] = { 0 }; sprintf(szIndex, "%d_%d", stModelInfo.nExamID, stModelInfo.nSubjectID); std::cout << "请求下载模板命令: " << szIndex << std::endl; std::stringstream ssLog; ssLog << "请求下载模板命令: " << szIndex << "\n"; pMODELINFO pModelInfo = NULL; MAP_MODEL::iterator itFind = _mapModel_.find(szIndex); if (itFind == _mapModel_.end()) { pUser->SendResult(USER_RESPONSE_NEEDDOWN, RESULT_DOWNMODEL_FAIL); ssLog << "请求下载的模板文件不存在\n"; break; } else { pModelInfo = itFind->second; if (pModelInfo->strMd5 == stModelInfo.szMD5) //文件未修改,不需要重新下载 bNeedDown = false; } if (bNeedDown) { try { Poco::File fileModel(CMyCodeConvert::Gb2312ToUtf8(pModelInfo->strPath)); stModelInfo.nModelSize = static_cast<int>(fileModel.getSize()); pUser->SendResponesInfo(USER_RESPONSE_NEEDDOWN, RESULT_DOWNMODEL_OK, (char*)&stModelInfo, sizeof(stModelInfo)); ssLog << "可以正常下载"; } catch (Poco::Exception& exc) { std::string strLog = "请求下载模板命令(" + std::string(szIndex) + ")-->检测模板文件路径异常: " + exc.displayText(); std::cout << strLog << std::endl; ssLog << strLog; pUser->SendResult(USER_RESPONSE_NEEDDOWN, RESULT_DOWNMODEL_FAIL); } } else { pUser->SendResult(USER_RESPONSE_NEEDDOWN, RESULT_DOWNMODEL_NONEED); ssLog << "不需要重新下载模板\n"; } g_Log.LogOut(ssLog.str()); } break; case USER_DOWN_MODEL: { ST_DOWN_MODEL stModelInfo = *(pST_DOWN_MODEL)(pMission->m_pMissionData + HEAD_SIZE); std::string strCmdResponse = Poco::format("Get Cmd %d OK", (int)USER_DOWN_MODEL); //pUser->SendResponesInfo(USER_RESPONSE_DOWNMODEL, RESULT_SUCCESS, (char*)strCmdResponse.c_str(), strCmdResponse.length()); bool bNeedDown = true; char szIndex[50] = { 0 }; sprintf(szIndex, "%d_%d", stModelInfo.nExamID, stModelInfo.nSubjectID); std::cout << "开始下载考试模板命令: " << szIndex << std::endl; std::stringstream ssLog; ssLog << "开始下载考试模板命令: " << szIndex << "\n"; MAP_MODEL::iterator itFind = _mapModel_.find(szIndex); if (itFind == _mapModel_.end()) { } else { pMODELINFO pModelInfo = itFind->second; std::string strFileData; std::ifstream fin(pModelInfo->strPath, std::ifstream::binary); if (!fin) { pUser->SendResult(USER_RESPONSE_DOWNMODEL, RESULT_ERROR_FILEIO); return false; } std::stringstream buffer; buffer << fin.rdbuf(); strFileData = buffer.str(); fin.close(); int nLen = strFileData.length(); std::cout << "模板长度: " << nLen << std::endl; ssLog << "模板长度: " << nLen << "\n"; // ofstream out("1.mod", std::ios::binary); // std::stringstream buffer2; // buffer2.write(strFileData.c_str(), strFileData.length()); // int n = buffer2.str().length(); // out << buffer2.str(); // out.close(); pUser->SendResponesInfo(USER_RESPONSE_DOWNMODEL, RESULT_DOWNMODEL_RECV, (char*)strFileData.c_str(), strFileData.length()); std::cout << "下载考试模板文件完成: " << szIndex << std::endl; ssLog << "下载考试模板文件完成: " << szIndex; g_Log.LogOut(ssLog.str()); } } break; case USER_NEED_CREATE_MODEL: { ST_CREATE_MODEL stModelInfo = *(pST_CREATE_MODEL)(pMission->m_pMissionData + HEAD_SIZE); char szIndex[50] = { 0 }; sprintf(szIndex, "%d_%d", stModelInfo.nExamID, stModelInfo.nSubjectID); std::cout << "请求自动创建模板命令: " << szIndex << std::endl; _mapModelLock_.lock(); pMODELINFO pModelInfo = NULL; MAP_MODEL::iterator itFind = _mapModel_.find(szIndex); if (itFind == _mapModel_.end()) //服务器上没有模板,请求后端提供数据生成模板 { pModelInfo = new MODELINFO; pModelInfo->nExamID = stModelInfo.nExamID; pModelInfo->nSubjectID = stModelInfo.nSubjectID; _mapModel_.insert(MAP_MODEL::value_type(szIndex, pModelInfo)); } _mapModelLock_.unlock(); pSCAN_REQ_TASK pTask = new SCAN_REQ_TASK; pTask->strUri = Poco::format("%s/sheet/data/%d/%d", SysSet.m_strBackUri, stModelInfo.nExamID, stModelInfo.nSubjectID); pTask->pUser = pUser; pTask->strMsg = "createModel"; pTask->nExamID = stModelInfo.nExamID; pTask->nSubjectID = stModelInfo.nSubjectID; pTask->strEzs = stModelInfo.szEzs; pTask->strExamName = stModelInfo.szExamName; pTask->strSubjectName = stModelInfo.szSubjectName; g_fmScanReq.lock(); g_lScanReq.push_back(pTask); g_fmScanReq.unlock(); } break; case GET_VERSERVER_ADDR: { std::stringstream ss; ss << SysSet.m_strVerServerIP << ":" << SysSet.m_nVerServerPort; std::string strVerAddr = ss.str(); pUser->SendResponesInfo(RESPONSE_GET_VERSERVER_ADDR, RESULT_SUCCESS, (char*)strVerAddr.c_str(), strVerAddr.length()); std::cout << "回复版本服务器地址信息:" << strVerAddr << std::endl; } break; case USER_GET_BMK: { ST_GET_BMK_INFO stGetBmkInfo = *(pStGetBmkInfo)(pMission->m_pMissionData + HEAD_SIZE); std::cout << "请求报名库命令: " << stGetBmkInfo.nExamID << "_" << stGetBmkInfo.nSubjectID << std::endl; std::string strLog = Poco::format("请求考试的报名库命令: %d_%d", stGetBmkInfo.nExamID, stGetBmkInfo.nSubjectID); g_Log.LogOut(strLog); std::string strEzs = stGetBmkInfo.szEzs; pSCAN_REQ_TASK pTask = new SCAN_REQ_TASK; pTask->strUri = SysSet.m_strBackUri + "/getStudents"; pTask->nExamID = stGetBmkInfo.nExamID; pTask->nSubjectID = stGetBmkInfo.nSubjectID; char szExamInfo[30] = { 0 }; sprintf(szExamInfo, "/%d/%d", stGetBmkInfo.nExamID, stGetBmkInfo.nSubjectID); pTask->strUri.append(szExamInfo); pTask->pUser = pUser; pTask->strEzs = SysSet.m_strSessionName + strEzs; //"ezs=" + strEzs; pTask->strMsg = "getBmk"; Poco::JSON::Object obj; obj.set("examId", stGetBmkInfo.nExamID); obj.set("subjectId", stGetBmkInfo.nSubjectID); stringstream ss; obj.stringify(ss, 0); pTask->strRequest = ss.str(); g_fmScanReq.lock(); g_lScanReq.push_back(pTask); g_fmScanReq.unlock(); } break; case USER_GET_EXAM_BMK: { ST_GET_BMK_INFO stGetBmkInfo = *(pStGetBmkInfo)(pMission->m_pMissionData + HEAD_SIZE); std::string strCmdResponse = Poco::format("Get Cmd %d OK", (int)USER_GET_EXAM_BMK); //pUser->SendResponesInfo(USER_RESPONSE_GET_EXAM_BMK, RESULT_SUCCESS, (char*)strCmdResponse.c_str(), strCmdResponse.length()); std::cout << "请求考试的报名库命令: " << stGetBmkInfo.nExamID << std::endl; std::string strLog = Poco::format("请求考试的报名库命令: %d", stGetBmkInfo.nExamID); g_Log.LogOut(strLog); // #ifdef _DEBUG //测试数据,后期要删 #ifdef TEST_MODE std::string strSendData; std::string strBmkFileName; if (stGetBmkInfo.nExamID == 1354 || stGetBmkInfo.nExamID == 1257 || stGetBmkInfo.nExamID == 1241) { strBmkFileName = Poco::format("ServerTestData-bmk-%d.txt", stGetBmkInfo.nExamID); std::string strExamListPath = SysSet.m_strCurrentDir + "\\ServerTestData\\" + strBmkFileName; std::string strJsnData; std::ifstream in(strExamListPath); if (!in) return false; std::string strJsnLine; while (!in.eof()) { getline(in, strJsnLine); strJsnData.append(strJsnLine); } in.close(); Poco::JSON::Parser parser; Poco::Dynamic::Var result; try { result = parser.parse(strJsnData); Poco::JSON::Object::Ptr object = result.extract<Poco::JSON::Object::Ptr>(); //++添加考试ID和科目ID到结果信息中 Poco::JSON::Object objExam; objExam.set("examId", stGetBmkInfo.nExamID); objExam.set("subjectId", stGetBmkInfo.nSubjectID); object->set("examInfo", objExam); std::stringstream jsnSnString; object->stringify(jsnSnString, 0); //-- strSendData = jsnSnString.str(); } catch (Poco::Exception& exc) { std::cout << "获取考试[" << stGetBmkInfo.nExamID << "]报名库数据异常\n"; return false; } } else { Poco::JSON::Object objBmkTestResult; Poco::JSON::Object objStatus; objStatus.set("success", true); Poco::JSON::Array arryStudent; for (int i = 0; i < 100; i++) { Poco::JSON::Object objStudent; std::string strZkzh = Poco::format("%d", 100 + i); objStudent.set("zkzh", strZkzh); std::string strName = Poco::format("测试%d", i); objStudent.set("name", CMyCodeConvert::Gb2312ToUtf8(strName)); objStudent.set("classRoom", CMyCodeConvert::Gb2312ToUtf8("10001")); objStudent.set("school", CMyCodeConvert::Gb2312ToUtf8("一中")); Poco::JSON::Array arryScanStatus; for (int j = 0; j < 4; j++) { Poco::JSON::Object objSubStatus; objSubStatus.set("subjectID", 590 + j); objSubStatus.set("scaned", (j + i) % 2); arryScanStatus.add(objSubStatus); } objStudent.set("scanStatus", arryScanStatus); arryStudent.add(objStudent); } Poco::JSON::Object objExam; objExam.set("examId", 402); objExam.set("subjectId", 590); objBmkTestResult.set("status", objStatus); objBmkTestResult.set("students", arryStudent); objBmkTestResult.set("examInfo", objExam); std::stringstream jsnSnString; objBmkTestResult.stringify(jsnSnString, 0); strSendData = jsnSnString.str(); } pUser->SendResponesInfo(USER_RESPONSE_GET_EXAM_BMK, RESULT_GET_BMK_SUCCESS, (char*)strSendData.c_str(), strSendData.length()); break; #endif std::string strEzs = stGetBmkInfo.szEzs; pSCAN_REQ_TASK pTask = new SCAN_REQ_TASK; pTask->strUri = SysSet.m_strBackUri + "/getStudents"; pTask->nExamID = stGetBmkInfo.nExamID; pTask->nSubjectID = stGetBmkInfo.nSubjectID; pTask->nTeacherID = _mapSession_[strEzs].nTeacherID; char szExamInfo[30] = { 0 }; sprintf(szExamInfo, "/%d/%d", stGetBmkInfo.nExamID, stGetBmkInfo.nSubjectID); pTask->strUri.append(szExamInfo); pTask->pUser = pUser; pTask->strEzs = SysSet.m_strSessionName + strEzs; //"ezs=" + strEzs; pTask->strMsg = "getExamBmk"; Poco::JSON::Object obj; obj.set("examId", stGetBmkInfo.nExamID); obj.set("subjectId", stGetBmkInfo.nSubjectID); obj.set("teacherId", pTask->nTeacherID); stringstream ss; obj.stringify(ss, 0); pTask->strRequest = ss.str(); g_fmScanReq.lock(); g_lScanReq.push_back(pTask); g_fmScanReq.unlock(); } break; case USER_GET_FILE_UPLOAD_ADDR: { std::cout << "请求不同格式文件服务器地址信息命令: "<< std::endl; int nResult = RESULT_GET_FILE_ADDR_SUCCESS; if (SysSet.m_strFileAddrs.empty()) nResult = RESULT_GET_FILE_ADDR_FAIL; std::string strVerAddr = SysSet.m_strFileAddrs; pUser->SendResponesInfo(USER_RESPONSE_GET_FILE_UPLOAD_ADDR, nResult, (char*)strVerAddr.c_str(), strVerAddr.length()); std::string strLog = "请求不同格式文件服务器地址信息命令: \n" + strVerAddr; g_Log.LogOut(strLog); } break; case USER_NEED_UP_MODEL_PIC: { std::cout << "请求上传模板图像命令: " << std::endl; ST_MODELPIC stModelPic = *(pST_MODELPIC)(pMission->m_pMissionData + HEAD_SIZE); int nResult = RESULT_ERROR_UNKNOWN; std::string strModelPicPath = Poco::format("%s\\%d\\%d_%d_%d%s", CMyCodeConvert::Gb2312ToUtf8(SysSet.m_strModelSavePath), stModelPic.nExamID, \ stModelPic.nExamID, stModelPic.nSubjectID, stModelPic.nIndex, CMyCodeConvert::Gb2312ToUtf8(stModelPic.szExtName)); // std::string strModelPicPath = Poco::format("%s\\%d\\%d_%d_%d_#_%s", CMyCodeConvert::Gb2312ToUtf8(SysSet.m_strModelSavePath), stModelPic.nExamID,\ // stModelPic.nExamID, stModelPic.nSubjectID, stModelPic.nIndex, CMyCodeConvert::Gb2312ToUtf8(stModelPic.szPicName)); std::string strLog; try { Poco::File modelPic(strModelPicPath); if (!modelPic.exists()) { nResult = RESULT_UP_MODEL_PIC_SEND; strLog = "请求上传模板图像命令 ==> 可以发送模板图片:" + strModelPicPath; std::cout << "可以发送模板图片:" << strModelPicPath << std::endl; } else { std::string strMd5 = calcFileMd5(strModelPicPath); if (strMd5 == stModelPic.szMD5) { nResult = RESULT_UP_MODEL_PIC_NONEED; strLog = "请求上传模板图像命令 ==> 不需要发送模板图片:" + strModelPicPath; std::cout << "不需要发送模板图片:" << strModelPicPath << std::endl; } else { nResult = RESULT_UP_MODEL_PIC_SEND; strLog = "请求上传模板图像命令 ==> 可以发送模板图片:" + strModelPicPath; std::cout << "可以发送模板图片:" << strModelPicPath << std::endl; } } } catch (Poco::Exception& e) { strLog = "请求上传模板图像命令 ==> 检测模板图片路径异常:" + e.displayText(); std::cout << "检测模板图片路径异常: "<< e.displayText() << std::endl; nResult = RESULT_UP_MODEL_PIC_SEND; } pUser->SendResponesInfo(USER_RESPONSE_NEED_UP_MODEL_PIC, nResult, (char*)&stModelPic, sizeof(stModelPic)); g_Log.LogOut(strLog); } break; case USER_GET_MODEL_PIC: { char szData[1024] = { 0 }; strncpy(szData, pMission->m_pMissionData + HEAD_SIZE, header.uPackSize); std::string strModelPicInfo = szData; std::cout << "请求下载模板图像命令: " << strModelPicInfo << std::endl; std::stringstream ssLog; ssLog<< "请求下载模板图像命令: " << strModelPicInfo << std::endl; int nPos = strModelPicInfo.find("_"); std::string strExamID = strModelPicInfo.substr(0, nPos); std::string strSubjectID = strModelPicInfo.substr(nPos + 1); std::string strModelPicDir = SysSet.m_strModelSavePath + "\\" + strExamID + "\\"; std::vector<std::string> vecModelPicName; std::vector<std::string> vecModelPicPath; std::string strPaperPath = CMyCodeConvert::Gb2312ToUtf8(strModelPicDir); try { Poco::File modlePicDir(strPaperPath); if (!modlePicDir.exists()) { pUser->SendResult(USER_RESPONSE_GET_MODEL_PIC, RESULT_GET_MODEL_PIC_NOPIC); ssLog << "模板图像不存在"; g_Log.LogOut(ssLog.str()); return false; } } catch (Poco::Exception& e) { } Poco::DirectoryIterator it(strPaperPath); Poco::DirectoryIterator end; while (it != end) { Poco::Path p(it->path()); if (it->isFile()) { std::string strName = p.getFileName(); if (strName.find(strModelPicInfo) != std::string::npos) { std::string strPicPath = p.toString(); vecModelPicName.push_back(strName); vecModelPicPath.push_back(strPicPath); } } it++; } if (vecModelPicPath.size() == 0) { pUser->SendResult(USER_RESPONSE_GET_MODEL_PIC, RESULT_GET_MODEL_PIC_NOPIC); ssLog << "模板图像不存在"; g_Log.LogOut(ssLog.str()); return false; } std::string strSendData; for (int i = 0; i < vecModelPicPath.size(); i++) { std::string strFileData; std::ifstream fin(CMyCodeConvert::Utf8ToGb2312(vecModelPicPath[i]), std::ifstream::binary); if (!fin) { pUser->SendResult(USER_RESPONSE_GET_MODEL_PIC, RESULT_ERROR_FILEIO); ssLog << "读取模板文件失败"; g_Log.LogOut(ssLog.str()); return false; } std::stringstream buffer; buffer << fin.rdbuf(); strFileData = buffer.str(); fin.close(); strSendData.append("#_#_#_#_"); strSendData.append(vecModelPicName[i]); strSendData.append("_*_"); char szLen[20] = { 0 }; sprintf_s(szLen, "%d", strFileData.length()); strSendData.append(szLen); strSendData.append("_#####_"); strSendData.append(strFileData); } pUser->SendResponesInfo(USER_RESPONSE_GET_MODEL_PIC, RESULT_GET_MODEL_PIC_SUCCESS, (char*)strSendData.c_str(), strSendData.length()); ssLog << "模板文件发送完成"; g_Log.LogOut(ssLog.str()); } break; case USER_CHK_NEW_GUARDEXE: { char szData[1024] = { 0 }; strncpy(szData, pMission->m_pMissionData + HEAD_SIZE, header.uPackSize); std::string strClientGuardExeMd5 = szData; if (_strNewGuardExeMd5_.empty()) { std::cout << "服务器上新守护进程不存在" << std::endl; pUser->SendResult(USER_RESPONSE_CHK_NEW_GUARDEXE, RESULT_GET_NEW_GUARDEXE_NOFILE); } else if (_strNewGuardExeMd5_ == strClientGuardExeMd5) { std::cout << "客户端上的守护进程和服务器一致,不需要下载" << std::endl; pUser->SendResult(USER_RESPONSE_CHK_NEW_GUARDEXE, RESULT_GET_NEW_GUARDEXE_NONEED); } else { std::string strGuardExePath = SysSet.m_strNewGuardProcessPath + "EasyTntGuardProcess.exe"; std::string strFileData; std::ifstream fin(strGuardExePath, std::ifstream::binary); if (!fin) { pUser->SendResult(USER_RESPONSE_CHK_NEW_GUARDEXE, RESULT_ERROR_FILEIO); g_Log.LogOut("读取新守护进程文件时打开文件失败: " + strGuardExePath); return false; } std::cout << "正在发送新守护进程文件..." << std::endl; std::stringstream buffer; buffer << fin.rdbuf(); strFileData = buffer.str(); fin.close(); pUser->SendResponesInfo(USER_RESPONSE_CHK_NEW_GUARDEXE, RESULT_GET_NEW_GUARDEXE_SUCCESS, (char*)strFileData.c_str(), strFileData.length()); g_Log.LogOut("新守护进程文件发送完成"); std::cout << "新守护进程文件发送完成" << std::endl; } } break; case KEEPALIVE_PKG: { char szData[1024] = { 0 }; strncpy(szData, pMission->m_pMissionData + HEAD_SIZE, header.uPackSize); std::string strEzs = szData; MAP_SESSION::iterator itSession = _mapSession_.begin(); for (; itSession != _mapSession_.end(); itSession++) { if (itSession->first == strEzs) { itSession->second.tmStamp.update(); itSession->second.nChkHeartPkgFailTimes = 0; break; } } } break; default: bFind = FALSE; break; } if (bFind) { return 1; } return 0; }
static bool flattenDump(Poco::JSON::Object::Ptr &topObj) { assert(topObj); bool hierFound = false; //create new blocks object that flattens any hierarchy to 1 depth //if this block is a hierarchy -- bring its blocks to the top level const auto blocksObj = topObj->getObject("blocks"); assert(blocksObj); Poco::JSON::Object::Ptr flatBlocksObj(new Poco::JSON::Object()); std::vector<std::string> blockUids; blocksObj->getNames(blockUids); for (const auto &uid : blockUids) { const auto blockObj = blocksObj->getObject(uid); assert(blockObj); if (blockIsHier(blockObj)) { hierFound = true; const auto subBlocksObj = blockObj->getObject("blocks"); assert(subBlocksObj); const auto thisName = blockObj->getValue<std::string>("name"); std::vector<std::string> subBlockUids; subBlocksObj->getNames(subBlockUids); for (const auto &subUid : subBlockUids) { auto subBlockObj = subBlocksObj->getObject(subUid); assert(subBlockObj); const auto subName = subBlockObj->getValue<std::string>("name"); subBlockObj->set("name", thisName+"/"+subName); //heritage name flatBlocksObj->set(subUid, subBlockObj); } } else flatBlocksObj->set(uid, blockObj); } //create new connections array folding out depth 1 hierarchies const auto connsArray = topObj->getArray("connections"); assert(connsArray); Poco::JSON::Array::Ptr flatConnsArray(new Poco::JSON::Array()); for (size_t c_i = 0; c_i < connsArray->size(); c_i++) { const auto connObj = connsArray->getObject(c_i); assert(connObj); for (const auto & resolvedSrc : resolvePorts(topObj, connObj->getValue<std::string>("srcId"), connObj->getValue<std::string>("srcName"), true)) { for (const auto & resolvedDst : resolvePorts(topObj, connObj->getValue<std::string>("dstId"), connObj->getValue<std::string>("dstName"), false)) { Poco::JSON::Object::Ptr flatConnObj(new Poco::JSON::Object()); flatConnsArray->add(flatConnObj); flatConnObj->set("srcId", resolvedSrc.first); flatConnObj->set("srcName", resolvedSrc.second); flatConnObj->set("dstId", resolvedDst.first); flatConnObj->set("dstName", resolvedDst.second); } } } //resolve pass-through connections and totally internal connections for (const auto &uid : blockUids) { const auto blockObj = blocksObj->getObject(uid); assert(blockObj); if (not blockIsHier(blockObj)) continue; const auto subConnsArray = blockObj->getArray("connections"); for (size_t c_i = 0; c_i < subConnsArray->size(); c_i++) { const auto subConnObj = subConnsArray->getObject(c_i); assert(subConnObj); const bool srcIsThis = subConnObj->getValue<std::string>("srcId") == uid; const bool dstIsThis = subConnObj->getValue<std::string>("dstId") == uid; //totally internal connection if (not srcIsThis and not dstIsThis) flatConnsArray->add(subConnObj); //otherwise not a pass-through if (not srcIsThis or not dstIsThis) continue; //find sources where the destination is this pass-through for (size_t c_s = 0; c_s < connsArray->size(); c_s++) { const auto connObj_s = connsArray->getObject(c_s); assert(connObj_s); if (connObj_s->getValue<std::string>("dstId") != uid) continue; if (connObj_s->getValue<std::string>("dstName") != subConnObj->getValue<std::string>("srcName")) continue; //find sources where the destination is this pass-through for (size_t c_d = 0; c_d < connsArray->size(); c_d++) { const auto connObj_d = connsArray->getObject(c_d); assert(connObj_d); if (connObj_d->getValue<std::string>("srcId") != uid) continue; if (connObj_d->getValue<std::string>("srcName") != subConnObj->getValue<std::string>("dstName")) continue; Poco::JSON::Object::Ptr flatConnObj(new Poco::JSON::Object()); flatConnsArray->add(flatConnObj); flatConnObj->set("srcId", connObj_s->get("srcId")); flatConnObj->set("srcName", connObj_s->get("srcName")); flatConnObj->set("dstId", connObj_d->get("dstId")); flatConnObj->set("dstName", connObj_d->get("dstName")); } } } } //set new flat data into the top object topObj = new Poco::JSON::Object(); topObj->set("blocks", flatBlocksObj); topObj->set("connections", flatConnsArray); return hierFound; }
/*********************************************************************** * Parse a single documentation block for markup **********************************************************************/ static Poco::JSON::Object::Ptr parseCommentBlockForMarkup(const CodeBlock &commentBlock) { Poco::JSON::Object::Ptr topObj(new Poco::JSON::Object()); Poco::JSON::Array calls; Poco::JSON::Array keywords; Poco::JSON::Array::Ptr aliases(new Poco::JSON::Array()); Poco::JSON::Array categories; Poco::JSON::Array params; Poco::JSON::Array::Ptr topDocs(new Poco::JSON::Array()); Poco::JSON::Object::Ptr currentParam; std::string state; std::string indent; std::string instruction; std::string payload; //search for the markup begin tag and record the indent for (const auto &codeLine : commentBlock) { std::string line = codeLine.text; Poco::RegularExpression::MatchVec matches; if (not state.empty()) { if (line.size() >= indent.size() and line.substr(0, indent.size()) != indent) { if (codeLine.lineNo == commentBlock.back().lineNo) line = ""; else throw Pothos::SyntaxException("Inconsistent indentation", codeLine.toString()); } if (line.size() >= indent.size()) line = line.substr(indent.size()); else line = ""; Poco::RegularExpression("^\\|(\\w+)\\s+(.*)$").match(line, 0, matches); if (not matches.empty()) { assert(matches.size() == 3); instruction = line.substr(matches[1].offset, matches[1].length); payload = line.substr(matches[2].offset, matches[2].length); } } if (state.empty()) { Poco::RegularExpression("^(.*)\\|PothosDoc\\s+(.*)$").match(line, 0, matches); if (matches.empty()) continue; assert(matches.size() == 3); indent = line.substr(matches[1].offset, matches[1].length); topObj->set("name", Poco::trim(line.substr(matches[2].offset, matches[2].length))); state = "DOC"; } else if (matches.empty() and state == "DOC") { topDocs->add(line); } else if (matches.empty() and state == "PARAM") { auto array = currentParam->getArray("desc"); array->add(line); currentParam->set("desc", stripDocArray(array)); } else if (instruction == "category" and state == "DOC") { categories.add(Poco::trim(payload)); } else if (instruction == "keywords" and state == "DOC") { for (const auto &keyword : Poco::StringTokenizer( payload, " \t", Poco::StringTokenizer::TOK_TRIM | Poco::StringTokenizer::TOK_IGNORE_EMPTY)) { keywords.add(Poco::trim(keyword)); } } else if (instruction == "alias" and state == "DOC") { const std::string alias(Poco::trim(payload)); try {Pothos::PluginPath(alias);} catch (const Pothos::PluginPathError &) { throw Pothos::SyntaxException("Invalid alias path", codeLine.toString()); } aliases->add(alias); } else if (instruction == "param" and (state == "DOC" or state == "PARAM")) { payload = bracketEscapeEncode(payload); Poco::RegularExpression::MatchVec fields; Poco::RegularExpression("^\\s*(\\w+)(\\s*\\[(.*)\\]\\s*)?(.*)$").match(payload, 0, fields); if (fields.empty()) throw Pothos::SyntaxException( "Expected |param key[name] description", codeLine.toString()); assert(fields.size() == 5); const std::string key = bracketEscapeDecode(Poco::trim(payload.substr(fields[1].offset, fields[1].length))); std::string name = titleCase(key); if (fields[3].length != 0) name = bracketEscapeDecode(Poco::trim(payload.substr(fields[3].offset, fields[3].length))); const std::string desc = bracketEscapeDecode(Poco::trim(payload.substr(fields[4].offset, fields[4].length))); currentParam = Poco::JSON::Object::Ptr(new Poco::JSON::Object()); params.add(currentParam); currentParam->set("key", key); currentParam->set("name", name); Poco::JSON::Array::Ptr descArr(new Poco::JSON::Array()); descArr->add(desc); currentParam->set("desc", descArr); state = "PARAM"; } else if (instruction == "default" and state == "PARAM") { if (currentParam->has("default")) throw Pothos::SyntaxException( "Multiple occurrence of |default for param", codeLine.toString()); currentParam->set("default", payload); } else if (instruction == "units" and state == "PARAM") { if (currentParam->has("units")) throw Pothos::SyntaxException( "Multiple occurrence of |units for param", codeLine.toString()); currentParam->set("units", payload); } else if (instruction == "widget" and state == "PARAM") { if (currentParam->has("widgetType")) throw Pothos::SyntaxException( "Multiple occurrence of |widget for param", codeLine.toString()); Poco::RegularExpression::MatchVec fields; Poco::RegularExpression("^\\s*(\\w+)\\s*\\((.*)\\)$").match(payload, 0, fields); if (fields.empty()) throw Pothos::SyntaxException( "Expected |widget SpinBox(args...)", codeLine.toString()); assert(fields.size() == 3); const std::string widgetType = Poco::trim(payload.substr(fields[1].offset, fields[1].length)); const std::string argsStr = Poco::trim(payload.substr(fields[2].offset, fields[2].length)); currentParam->set("widgetType", widgetType); loadArgs(codeLine, *currentParam, argsStr, "widgetArgs", "widgetKwargs"); } else if (instruction == "tab" and state == "PARAM") { if (currentParam->has("tab")) throw Pothos::SyntaxException( "Multiple occurrence of |tab for param", codeLine.toString()); currentParam->set("tab", payload); } else if (instruction == "preview" and state == "PARAM") { if (currentParam->has("preview")) throw Pothos::SyntaxException( "Multiple occurrence of preview for param", codeLine.toString()); Poco::RegularExpression::MatchVec fields; Poco::RegularExpression("^\\s*(\\w+)(\\s*\\((.*)\\))?$").match(payload, 0, fields); if (fields.empty()) throw Pothos::SyntaxException( "Expected |preview previewType(args...)", codeLine.toString()); assert(fields.size() == 2 or fields.size() == 4); const std::string previewType = Poco::trim(payload.substr(fields[1].offset, fields[1].length)); if (previewType != "disable" and previewType != "enable" and previewType != "valid" and previewType != "invalid" and previewType != "when" ) throw Pothos::SyntaxException( "Only supports enable/disable/valid/invalid/when as value for preview option of param", codeLine.toString()); currentParam->set("preview", previewType); if (fields.size() == 4) { const std::string argsStr = Poco::trim(payload.substr(fields[3].offset, fields[3].length)); loadArgs(codeLine, *currentParam, argsStr, "previewArgs", "previewKwargs"); } } else if (instruction == "option" and state == "PARAM") { payload = bracketEscapeEncode(payload); Poco::RegularExpression::MatchVec fields; Poco::RegularExpression("^(\\s*\\[(.*)\\]\\s*)?(.*)$").match(payload, 0, fields); if (fields.empty()) throw Pothos::SyntaxException( "Expected |option [name] value", codeLine.toString()); assert(fields.size() == 4); const std::string value = bracketEscapeDecode(Poco::trim(payload.substr(fields[3].offset, fields[3].length))); std::string name = titleCase(value); if (fields[2].length != 0) name = bracketEscapeDecode(Poco::trim(payload.substr(fields[2].offset, fields[2].length))); Poco::JSON::Object option; option.set("value", value); option.set("name", name); if (not currentParam->has("options")) currentParam->set( "options", Poco::JSON::Array::Ptr(new Poco::JSON::Array())); currentParam->getArray("options")->add(option); } else if (instruction == "factory" and (state == "DOC" or state == "PARAM")) { Poco::RegularExpression::MatchVec fields; Poco::RegularExpression("^\\s*(/.*)\\s*\\((.*)\\)$").match(payload, 0, fields); if (fields.empty()) throw Pothos::SyntaxException( "Expected |factory /registry/path(args...)", codeLine.toString()); assert(fields.size() == 3); const std::string path = Poco::trim(payload.substr(fields[1].offset, fields[1].length)); const std::string argsStr = Poco::trim(payload.substr(fields[2].offset, fields[2].length)); //add the path try {Pothos::PluginPath(path);} catch (const Pothos::PluginPathError &) { throw Pothos::SyntaxException("Invalid factory path", codeLine.toString()); } if (topObj->has("path")) throw Pothos::SyntaxException( "Multiple occurrence of |factory", codeLine.toString()); topObj->set("path", path); //split and extract args loadArgs(codeLine, *topObj, argsStr); state = "DOC"; } else if ((instruction == "setter" or instruction == "initializer") and (state == "DOC" or state == "PARAM")) { Poco::RegularExpression::MatchVec fields; Poco::RegularExpression("^\\s*(\\w+)\\s*\\((.*)\\)$").match(payload, 0, fields); if (fields.empty()) throw Pothos::SyntaxException( "Expected |"+instruction+" setFooBar(args...)", codeLine.toString()); assert(fields.size() == 3); const std::string callName = Poco::trim(payload.substr(fields[1].offset, fields[1].length)); const std::string argsStr = Poco::trim(payload.substr(fields[2].offset, fields[2].length)); //add to calls Poco::JSON::Object call; call.set("type", instruction); call.set("name", callName); loadArgs(codeLine, call, argsStr); calls.add(call); state = "DOC"; } else if (instruction == "mode" and (state == "DOC" or state == "PARAM")) { if (topObj->has("mode")) throw Pothos::SyntaxException( "Multiple occurrence of |mode", codeLine.toString()); topObj->set("mode", payload); } } //empty state means this was a regular comment block, return null if (state.empty()) return Poco::JSON::Object::Ptr(); topDocs = stripDocArray(topDocs); if (topDocs->size() > 0) topObj->set("docs", topDocs); if (categories.size() > 0) topObj->set("categories", categories); if (keywords.size() > 0) topObj->set("keywords", keywords); if (aliases->size() > 0) topObj->set("aliases", aliases); if (params.size() > 0) topObj->set("params", params); if (calls.size() > 0) topObj->set("calls", calls); //sanity check for required stuff if (not topObj->has("path")) { throw Pothos::SyntaxException("missing |factory declaration"); } return topObj; }