| // 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 |