NSCAPI::errorReturn NSCAPIProtobuf2Json(const char* object, const char* request_buffer, unsigned int request_buffer_len, char ** response_buffer, unsigned int *response_buffer_len) { std::string request(request_buffer, request_buffer_len), response, obj(object); try { json_spirit::Object root; if (obj == "SettingsResponseMessage") { Plugin::SettingsResponseMessage message; message.ParseFromString(request); root = json_pb::Plugin::SettingsResponseMessage::to_json(message); } else if (obj == "RegistryResponseMessage") { Plugin::RegistryResponseMessage message; message.ParseFromString(request); root = json_pb::Plugin::RegistryResponseMessage::to_json(message); } else if (obj == "QueryResponseMessage") { Plugin::QueryResponseMessage message; message.ParseFromString(request); root = json_pb::Plugin::QueryResponseMessage::to_json(message); } else { LOG_ERROR_STD("Invalid type: " + obj); return NSCAPI::hasFailed; } std::string response = json_spirit::write(root); *response_buffer_len = static_cast<unsigned int>(response.size()); if (response.empty()) *response_buffer = NULL; else { *response_buffer = new char[*response_buffer_len + 10]; memcpy(*response_buffer, response.c_str(), *response_buffer_len); } } catch (const json_spirit::ParseError &e) { LOG_ERROR_STD("Failed to parse JSON: " + e.reason_); return NSCAPI::hasFailed; } return NSCAPI::isSuccess; }
void extscr_cli::list(const Plugin::ExecuteRequestMessage::Request &request, Plugin::ExecuteResponseMessage::Response *response) { po::variables_map vm; po::options_description desc; bool json = false, query = false, lib = false; desc.add_options() ("help", "Show help.") #ifdef HAVE_JSON_SPIRIT ("json", po::bool_switch(&json), "Return the list in json format.") #endif ("query", po::bool_switch(&query), "List queries instead of scripts (for aliases).") ("include-lib", po::bool_switch(&lib), "Do not ignore any lib folders.") ; try { npo::basic_command_line_parser cmd(request); cmd.options(desc); po::parsed_options parsed = cmd.run(); po::store(parsed, vm); po::notify(vm); } catch (const std::exception &e) { return npo::invalid_syntax(desc, request.command(), "Invalid command line: " + utf8::utf8_from_native(e.what()), *response); } if (vm.count("help")) { nscapi::protobuf::functions::set_response_good(*response, npo::help(desc)); return; } std::string resp; #ifdef HAVE_JSON_SPIRIT json_spirit::Array data; #endif if (query) { Plugin::RegistryRequestMessage rrm; Plugin::RegistryResponseMessage response; Plugin::RegistryRequestMessage::Request *payload = rrm.add_payload(); payload->mutable_inventory()->set_fetch_all(true); payload->mutable_inventory()->add_type(Plugin::Registry_ItemType_QUERY); std::string pb_response; provider_->get_core()->registry_query(rrm.SerializeAsString(), pb_response); response.ParseFromString(pb_response); BOOST_FOREACH(const ::Plugin::RegistryResponseMessage_Response &p, response.payload()) { BOOST_FOREACH(const ::Plugin::RegistryResponseMessage_Response_Inventory &i, p.inventory()) { if (json) { #ifdef HAVE_JSON_SPIRIT data.push_back(i.name()); #endif } else { resp += i.name() + "\n"; } } } } else {