blob: f730b6ae3e2b6dcdb6866d67354b4673cb29c829 [file] [log] [blame]
levin@chromium.org5c528682011-03-28 10:54:15 +09001// Copyright (c) 2011 The Chromium Authors. All rights reserved.
agl@chromium.org1c6dcf22009-07-23 08:57:21 +09002// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef IPC_IPC_LOGGING_H_
6#define IPC_IPC_LOGGING_H_
7
8#include "ipc/ipc_message.h" // For IPC_MESSAGE_LOG_ENABLED.
9
10#ifdef IPC_MESSAGE_LOG_ENABLED
11
12#include <vector>
13
brettw@chromium.org30230a82013-06-12 02:52:44 +090014#include "base/containers/hash_tables.h"
levin@chromium.org5c528682011-03-28 10:54:15 +090015#include "base/memory/scoped_ptr.h"
16#include "base/memory/singleton.h"
avi@chromium.orga29af562013-07-18 08:00:30 +090017#include "base/message_loop/message_loop.h"
darin@chromium.org80e4c5e2011-08-16 05:41:46 +090018#include "ipc/ipc_export.h"
agl@chromium.org1c6dcf22009-07-23 08:57:21 +090019
jam@chromium.org86a8de12010-12-09 08:34:16 +090020// Logging function. |name| is a string in ASCII and |params| is a string in
21// UTF-8.
22typedef void (*LogFunction)(std::string* name,
23 const IPC::Message* msg,
24 std::string* params);
25
26typedef base::hash_map<uint32, LogFunction > LogFunctionMap;
27
agl@chromium.org1c6dcf22009-07-23 08:57:21 +090028namespace IPC {
29
30class Message;
viettrungluu@chromium.org5254ca02012-12-15 07:56:28 +090031class Sender;
agl@chromium.org1c6dcf22009-07-23 08:57:21 +090032
33// One instance per process. Needs to be created on the main thread (the UI
34// thread in the browser) but OnPreDispatchMessage/OnPostDispatchMessage
35// can be called on other threads.
darin@chromium.org80e4c5e2011-08-16 05:41:46 +090036class IPC_EXPORT Logging {
agl@chromium.org1c6dcf22009-07-23 08:57:21 +090037 public:
38 // Implemented by consumers of log messages.
39 class Consumer {
40 public:
41 virtual void Log(const LogData& data) = 0;
jamesr@chromium.orgab4c65e2009-12-16 10:01:25 +090042
43 protected:
44 virtual ~Consumer() {}
agl@chromium.org1c6dcf22009-07-23 08:57:21 +090045 };
46
47 void SetConsumer(Consumer* consumer);
48
49 ~Logging();
satish@chromium.orgaa870602010-12-13 17:18:55 +090050 static Logging* GetInstance();
agl@chromium.org1c6dcf22009-07-23 08:57:21 +090051
jrg@chromium.orgf2b21be2009-09-29 06:08:04 +090052 // Enable and Disable are NOT cross-process; they only affect the
53 // current thread/process. If you want to modify the value for all
54 // processes, perhaps your intent is to call
55 // g_browser_process->SetIPCLoggingEnabled().
agl@chromium.org1c6dcf22009-07-23 08:57:21 +090056 void Enable();
57 void Disable();
58 bool Enabled() const { return enabled_; }
59
60 // Called by child processes to give the logger object the channel to send
61 // logging data to the browser process.
brettw@chromium.orgf947ed02012-06-12 07:35:26 +090062 void SetIPCSender(Sender* sender);
agl@chromium.org1c6dcf22009-07-23 08:57:21 +090063
64 // Called in the browser process when logging data from a child process is
65 // received.
66 void OnReceivedLoggingMessage(const Message& message);
67
68 void OnSendMessage(Message* message, const std::string& channel_id);
69 void OnPreDispatchMessage(const Message& message);
70 void OnPostDispatchMessage(const Message& message,
71 const std::string& channel_id);
72
agl@chromium.org1c6dcf22009-07-23 08:57:21 +090073 // Like the *MsgLog functions declared for each message class, except this
74 // calls the correct one based on the message type automatically. Defined in
75 // ipc_logging.cc.
erg@google.com8aca7272010-08-19 03:33:57 +090076 static void GetMessageText(uint32 type, std::string* name,
77 const Message* message, std::string* params);
agl@chromium.org1c6dcf22009-07-23 08:57:21 +090078
jam@chromium.org86a8de12010-12-09 08:34:16 +090079 static void set_log_function_map(LogFunctionMap* functions) {
80 log_function_map_ = functions;
81 }
agl@chromium.org1c6dcf22009-07-23 08:57:21 +090082
jam@chromium.org86a8de12010-12-09 08:34:16 +090083 static LogFunctionMap* log_function_map() {
84 return log_function_map_;
85 }
agl@chromium.org1c6dcf22009-07-23 08:57:21 +090086
87 private:
scottbyer@chromium.orgf0cf0b72011-10-21 04:34:43 +090088 typedef enum {
89 ANSI_COLOR_RESET = -1,
90 ANSI_COLOR_BLACK,
91 ANSI_COLOR_RED,
92 ANSI_COLOR_GREEN,
93 ANSI_COLOR_YELLOW,
94 ANSI_COLOR_BLUE,
95 ANSI_COLOR_MAGENTA,
96 ANSI_COLOR_CYAN,
97 ANSI_COLOR_WHITE
98 } ANSIColor;
99 const char* ANSIEscape(ANSIColor color);
100 ANSIColor DelayColor(double delay);
101
agl@chromium.org1c6dcf22009-07-23 08:57:21 +0900102 friend struct DefaultSingletonTraits<Logging>;
103 Logging();
104
agl@chromium.org1c6dcf22009-07-23 08:57:21 +0900105 void OnSendLogs();
106 void Log(const LogData& data);
107
agl@chromium.org1c6dcf22009-07-23 08:57:21 +0900108 bool enabled_;
jrg@chromium.orgf2b21be2009-09-29 06:08:04 +0900109 bool enabled_on_stderr_; // only used on POSIX for now
scottbyer@chromium.orgf0cf0b72011-10-21 04:34:43 +0900110 bool enabled_color_; // only used on POSIX for now
agl@chromium.org1c6dcf22009-07-23 08:57:21 +0900111
112 std::vector<LogData> queued_logs_;
113 bool queue_invoke_later_pending_;
114
brettw@chromium.orgf947ed02012-06-12 07:35:26 +0900115 Sender* sender_;
xhwang@chromium.org0b2c2a52013-05-01 05:55:03 +0900116 base::MessageLoop* main_thread_;
agl@chromium.org1c6dcf22009-07-23 08:57:21 +0900117
118 Consumer* consumer_;
119
jam@chromium.org86a8de12010-12-09 08:34:16 +0900120 static LogFunctionMap* log_function_map_;
agl@chromium.org1c6dcf22009-07-23 08:57:21 +0900121};
122
123} // namespace IPC
124
125#endif // IPC_MESSAGE_LOG_ENABLED
126
127#endif // IPC_IPC_LOGGING_H_