// Copyright (c) 2010 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_DEBUGGER_DEVTOOLS_REMOTE_MESSAGE_H_
#define CHROME_BROWSER_DEBUGGER_DEVTOOLS_REMOTE_MESSAGE_H_
#pragma once
#include <string>
#include "base/basictypes.h"
#include "base/hash_tables.h"
// Contains DevTools protocol message header names
// and the Flags header bit field constants.
struct DevToolsRemoteMessageHeaders {
// The content length in decimal.
static const char kContentLength[];
// The tool that should handle the message.
static const char kTool[];
// The destination (inspected) object identifier (if any), like a TabID.
static const char kDestination[];
};
// Represents a Chrome remote debugging protocol message transferred
// over the wire between the remote debugger and a Chrome instance.
// Consider using DevToolsRemoteMessageBuilder (see end of this file) for easy
// construction of outbound (Chrome -> remote debugger) messages.
class DevToolsRemoteMessage {
public:
typedef base::hash_map<std::string, std::string> HeaderMap;
// Use this as the second parameter in a |GetHeader| call to use
// an empty string as the default value.
static const char kEmptyValue[];
// Constructs an empty message with no content or headers.
DevToolsRemoteMessage();
DevToolsRemoteMessage(const HeaderMap& headers, const std::string& content);
virtual ~DevToolsRemoteMessage();
const HeaderMap& headers() const {
return header_map_;
}
const std::string& content() const {
return content_;
}
int content_length() const {
return content_.size();
}
const std::string tool() const {
return GetHeaderWithEmptyDefault(DevToolsRemoteMessageHeaders::kTool);
}
const std::string destination() const {
return GetHeaderWithEmptyDefault(
DevToolsRemoteMessageHeaders::kDestination);
}
// Returns the header value providing default_value if the header is absent.
const std::string GetHeader(const std::string& header_name,
const std::string& default_value) const;
// Returns the header value providing an empty string if the header is absent.
const std::string GetHeaderWithEmptyDefault(
const std::string& header_name) const;
// Returns a string representation of the message useful for the transfer to
// the remote debugger.
const std::string ToString() const;
private:
HeaderMap header_map_;
std::string content_;
// Cannot DISALLOW_COPY_AND_ASSIGN(DevToolsRemoteMessage) since it is passed
// as an IPC message argument and needs to be copied.
};
// Facilitates easy construction of outbound (Chrome -> remote debugger)
// DevToolsRemote messages.
class DevToolsRemoteMessageBuilder {
public:
// A singleton instance getter.
static DevToolsRemoteMessageBuilder& instance();
// Creates a message given the certain header values and a payload.
DevToolsRemoteMessage* Create(const std::string& tool,
const std::string& destination,
const std::string& payload);
private:
DevToolsRemoteMessageBuilder() {}
virtual ~DevToolsRemoteMessageBuilder() {}
DISALLOW_COPY_AND_ASSIGN(DevToolsRemoteMessageBuilder);
};
#endif // CHROME_BROWSER_DEBUGGER_DEVTOOLS_REMOTE_MESSAGE_H_