// Licensed to the Software Freedom Conservancy (SFC) under one // or more contributor license agreements. See the NOTICE file // distributed with this work for additional information // regarding copyright ownership. The SFC licenses this file // to you under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "command.h" #include "command_types.h" #include "logging.h" namespace webdriver { Command::Command() : command_type_(webdriver::CommandType::NoCommand), session_id_("") { } Command::~Command() { } void Command::Deserialize(const std::string& json) { LOG(TRACE) << "Entering Command::Deserialize"; // Clear the existing maps. this->command_parameters_.clear(); LOG(DEBUG) << "Raw JSON command: " << json; Json::Value root; std::string parse_errors; std::stringstream json_stream; json_stream.str(json); bool successful_parse = Json::parseFromStream(Json::CharReaderBuilder(), json_stream, &root, &parse_errors); if (!successful_parse) { // report to the user the failure and their locations in the document. LOG(WARN) << "Failed to parse configuration due to " << parse_errors << std::endl << "JSON command: '" << json << "'"; } this->command_type_ = root.get("name", webdriver::CommandType::NoCommand).asString(); if (this->command_type_ != webdriver::CommandType::NoCommand) { Json::Value locator_parameter_object = root["locator"]; Json::Value::iterator it = locator_parameter_object.begin(); Json::Value::iterator end = locator_parameter_object.end(); for (; it != end; ++it) { std::string key = it.key().asString(); std::string value = locator_parameter_object[key].asString(); if (key == "sessionid") { this->session_id_ = value; } else { this->command_parameters_[key] = value; } } this->is_valid_parameters_ = true; Json::Value command_parameter_object = root["parameters"]; if (!command_parameter_object.isObject()) { LOG(WARN) << "The value of the 'parameters' attribute is not a JSON " << "object. This is invalid for the WebDriver JSON Wire " << "Protocol."; this->is_valid_parameters_ = false; } else { it = command_parameter_object.begin(); end = command_parameter_object.end(); for (; it != end; ++it) { std::string key = it.key().asString(); Json::Value value = command_parameter_object[key]; this->command_parameters_[key] = value; } } } else { LOG(DEBUG) << "Command type is zero, no 'name' attribute in JSON object"; } } std::string Command::Serialize() { LOG(TRACE) << "Entering Command::Serialize"; Json::Value json_object; json_object["name"] = this->command_type_; if (this->session_id_.length() == 0) { json_object["sessionId"] = Json::nullValue; } else { json_object["sessionId"] = this->session_id_; } Json::Value parameters_object(Json::objectValue); ParametersMap::const_iterator it = this->command_parameters_.begin(); ParametersMap::const_iterator end = this->command_parameters_.end(); for (; it != end; ++it) { parameters_object[it->first] = it->second; } json_object["parameters"] = parameters_object; Json::StreamWriterBuilder writer; std::string output(Json::writeString(writer, json_object)); return output; } void Command::Copy(const Command& source) { this->command_type_ = source.command_type_; this->command_parameters_ = source.command_parameters_; this->is_valid_parameters_ = source.is_valid_parameters_; this->session_id_ = source.session_id_; } void Command::Reset() { this->command_type_ = CommandType::NoCommand; this->session_id_ = ""; this->command_parameters_.clear(); this->is_valid_parameters_ = false; } } // namespace webdriver