1bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch// Copyright (c) 2013 The Chromium Authors. All rights reserved.
2bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch// Use of this source code is governed by a BSD-style license that can be
3bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch// found in the LICENSE file.
4bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch
5bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch#include "chrome/browser/devtools/devtools_protocol.h"
6bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch
7bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch#include "base/json/json_reader.h"
8bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch#include "base/json/json_writer.h"
9bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch
10bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdochnamespace {
11bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdochconst char kIdParam[] = "id";
12bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdochconst char kMethodParam[] = "method";
13bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdochconst char kParamsParam[] = "params";
14c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdochconst char kErrorParam[] = "error";
15c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdochconst char kErrorCodeParam[] = "code";
16bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch}  // namespace
17bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch
18bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben MurdochDevToolsProtocol::Message::~Message() {
19bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch}
20bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch
21bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben MurdochDevToolsProtocol::Message::Message(const std::string& method,
22bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch                                   base::DictionaryValue* params)
23bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch    : method_(method),
24bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch      params_(params ? params->DeepCopy() : NULL) {
25bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch}
26bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch
27bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben MurdochDevToolsProtocol::Command::Command(int id,
28bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch                                   const std::string& method,
29bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch                                   base::DictionaryValue* params)
30bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch    : Message(method, params),
31bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch      id_(id) {
32bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch}
33bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch
34bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben MurdochDevToolsProtocol::Command::~Command() {
35bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch}
36bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch
37bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdochstd::string DevToolsProtocol::Command::Serialize() {
38bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  base::DictionaryValue command;
39bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  command.SetInteger(kIdParam, id_);
40bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  command.SetString(kMethodParam, method_);
41bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  if (params_)
42bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch    command.Set(kParamsParam, params_->DeepCopy());
43bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch
44bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  std::string json_command;
45bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  base::JSONWriter::Write(&command, &json_command);
46bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  return json_command;
47bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch}
48bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch
49bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben MurdochDevToolsProtocol::Notification::~Notification() {
50bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch}
51bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch
52bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben MurdochDevToolsProtocol::Notification::Notification(const std::string& method,
53bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch                                             base::DictionaryValue* params)
54bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch    : Message(method, params) {
55bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch}
56bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch
57c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben MurdochDevToolsProtocol::Response::~Response() {
58c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch}
59c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch
60c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben MurdochDevToolsProtocol::Response::Response(int id, int error_code)
61c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    : id_(id),
62c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      error_code_(error_code) {
63c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch}
64c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch
65bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch// static
66bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben MurdochDevToolsProtocol::Notification* DevToolsProtocol::ParseNotification(
67bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch    const std::string& json) {
68bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  scoped_ptr<base::Value> value(base::JSONReader::Read(json));
69bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  if (!value || !value->IsType(Value::TYPE_DICTIONARY))
70bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch    return NULL;
71bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch
72bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  scoped_ptr<base::DictionaryValue> dict(
73bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch      static_cast<base::DictionaryValue*>(value.release()));
74bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch
75bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  std::string method;
76bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  if (!dict->GetString(kMethodParam, &method))
77bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch    return NULL;
78bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch
79bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  base::DictionaryValue* params = NULL;
80bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  dict->GetDictionary(kParamsParam, &params);
81bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  return new Notification(method, params);
82bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch}
83c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch
84c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben MurdochDevToolsProtocol::Response* DevToolsProtocol::ParseResponse(
85c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    const std::string& json) {
86c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  scoped_ptr<base::Value> value(base::JSONReader::Read(json));
87c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  if (!value || !value->IsType(Value::TYPE_DICTIONARY))
88c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    return NULL;
89c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch
90c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  scoped_ptr<base::DictionaryValue> dict(
91c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      static_cast<base::DictionaryValue*>(value.release()));
92c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch
93c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  int id;
94c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  if (!dict->GetInteger(kIdParam, &id))
95c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    return NULL;
96c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch
97c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  int error_code = 0;
98c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  base::DictionaryValue* error_dict = NULL;
99c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  if (dict->GetDictionary(kErrorParam, &error_dict))
100c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    error_dict->GetInteger(kErrorCodeParam, &error_code);
101c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  return new Response(id, error_code);
102c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch}
103