1*635a8641SAndroid Build Coastguard Worker // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2*635a8641SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*635a8641SAndroid Build Coastguard Worker // found in the LICENSE file.
4*635a8641SAndroid Build Coastguard Worker
5*635a8641SAndroid Build Coastguard Worker #ifndef IPC_IPC_LOGGING_H_
6*635a8641SAndroid Build Coastguard Worker #define IPC_IPC_LOGGING_H_
7*635a8641SAndroid Build Coastguard Worker
8*635a8641SAndroid Build Coastguard Worker #include "ipc/ipc_buildflags.h"
9*635a8641SAndroid Build Coastguard Worker
10*635a8641SAndroid Build Coastguard Worker #if BUILDFLAG(IPC_MESSAGE_LOG_ENABLED)
11*635a8641SAndroid Build Coastguard Worker
12*635a8641SAndroid Build Coastguard Worker #include <stdint.h>
13*635a8641SAndroid Build Coastguard Worker #include <vector>
14*635a8641SAndroid Build Coastguard Worker
15*635a8641SAndroid Build Coastguard Worker #include "base/component_export.h"
16*635a8641SAndroid Build Coastguard Worker #include "base/containers/hash_tables.h"
17*635a8641SAndroid Build Coastguard Worker #include "base/memory/ref_counted.h"
18*635a8641SAndroid Build Coastguard Worker #include "base/memory/singleton.h"
19*635a8641SAndroid Build Coastguard Worker #include "base/single_thread_task_runner.h"
20*635a8641SAndroid Build Coastguard Worker #include "ipc/ipc_message.h"
21*635a8641SAndroid Build Coastguard Worker
22*635a8641SAndroid Build Coastguard Worker // Logging function. |name| is a string in ASCII and |params| is a string in
23*635a8641SAndroid Build Coastguard Worker // UTF-8.
24*635a8641SAndroid Build Coastguard Worker typedef void (*LogFunction)(std::string* name,
25*635a8641SAndroid Build Coastguard Worker const IPC::Message* msg,
26*635a8641SAndroid Build Coastguard Worker std::string* params);
27*635a8641SAndroid Build Coastguard Worker
28*635a8641SAndroid Build Coastguard Worker typedef base::hash_map<uint32_t, LogFunction > LogFunctionMap;
29*635a8641SAndroid Build Coastguard Worker
30*635a8641SAndroid Build Coastguard Worker namespace IPC {
31*635a8641SAndroid Build Coastguard Worker
32*635a8641SAndroid Build Coastguard Worker class Message;
33*635a8641SAndroid Build Coastguard Worker class Sender;
34*635a8641SAndroid Build Coastguard Worker
35*635a8641SAndroid Build Coastguard Worker // One instance per process. Needs to be created on the main thread (the UI
36*635a8641SAndroid Build Coastguard Worker // thread in the browser) but OnPreDispatchMessage/OnPostDispatchMessage
37*635a8641SAndroid Build Coastguard Worker // can be called on other threads.
COMPONENT_EXPORT(IPC)38*635a8641SAndroid Build Coastguard Worker class COMPONENT_EXPORT(IPC) Logging {
39*635a8641SAndroid Build Coastguard Worker public:
40*635a8641SAndroid Build Coastguard Worker // Implemented by consumers of log messages.
41*635a8641SAndroid Build Coastguard Worker class Consumer {
42*635a8641SAndroid Build Coastguard Worker public:
43*635a8641SAndroid Build Coastguard Worker virtual void Log(const LogData& data) = 0;
44*635a8641SAndroid Build Coastguard Worker
45*635a8641SAndroid Build Coastguard Worker protected:
46*635a8641SAndroid Build Coastguard Worker virtual ~Consumer() {}
47*635a8641SAndroid Build Coastguard Worker };
48*635a8641SAndroid Build Coastguard Worker
49*635a8641SAndroid Build Coastguard Worker void SetConsumer(Consumer* consumer);
50*635a8641SAndroid Build Coastguard Worker
51*635a8641SAndroid Build Coastguard Worker ~Logging();
52*635a8641SAndroid Build Coastguard Worker static Logging* GetInstance();
53*635a8641SAndroid Build Coastguard Worker
54*635a8641SAndroid Build Coastguard Worker // Enable and Disable are NOT cross-process; they only affect the
55*635a8641SAndroid Build Coastguard Worker // current thread/process. If you want to modify the value for all
56*635a8641SAndroid Build Coastguard Worker // processes, perhaps your intent is to call
57*635a8641SAndroid Build Coastguard Worker // g_browser_process->SetIPCLoggingEnabled().
58*635a8641SAndroid Build Coastguard Worker void Enable();
59*635a8641SAndroid Build Coastguard Worker void Disable();
60*635a8641SAndroid Build Coastguard Worker bool Enabled() const { return enabled_; }
61*635a8641SAndroid Build Coastguard Worker
62*635a8641SAndroid Build Coastguard Worker // Called by child processes to give the logger object the channel to send
63*635a8641SAndroid Build Coastguard Worker // logging data to the browser process.
64*635a8641SAndroid Build Coastguard Worker void SetIPCSender(Sender* sender);
65*635a8641SAndroid Build Coastguard Worker
66*635a8641SAndroid Build Coastguard Worker // Called in the browser process when logging data from a child process is
67*635a8641SAndroid Build Coastguard Worker // received.
68*635a8641SAndroid Build Coastguard Worker void OnReceivedLoggingMessage(const Message& message);
69*635a8641SAndroid Build Coastguard Worker
70*635a8641SAndroid Build Coastguard Worker void OnSendMessage(Message* message);
71*635a8641SAndroid Build Coastguard Worker void OnPreDispatchMessage(const Message& message);
72*635a8641SAndroid Build Coastguard Worker void OnPostDispatchMessage(const Message& message);
73*635a8641SAndroid Build Coastguard Worker
74*635a8641SAndroid Build Coastguard Worker // Like the *MsgLog functions declared for each message class, except this
75*635a8641SAndroid Build Coastguard Worker // calls the correct one based on the message type automatically. Defined in
76*635a8641SAndroid Build Coastguard Worker // ipc_logging.cc.
77*635a8641SAndroid Build Coastguard Worker static void GetMessageText(uint32_t type, std::string* name,
78*635a8641SAndroid Build Coastguard Worker const Message* message, std::string* params);
79*635a8641SAndroid Build Coastguard Worker
80*635a8641SAndroid Build Coastguard Worker static void set_log_function_map(LogFunctionMap* functions) {
81*635a8641SAndroid Build Coastguard Worker log_function_map_ = functions;
82*635a8641SAndroid Build Coastguard Worker }
83*635a8641SAndroid Build Coastguard Worker
84*635a8641SAndroid Build Coastguard Worker static LogFunctionMap* log_function_map() {
85*635a8641SAndroid Build Coastguard Worker return log_function_map_;
86*635a8641SAndroid Build Coastguard Worker }
87*635a8641SAndroid Build Coastguard Worker
88*635a8641SAndroid Build Coastguard Worker private:
89*635a8641SAndroid Build Coastguard Worker typedef enum {
90*635a8641SAndroid Build Coastguard Worker ANSI_COLOR_RESET = -1,
91*635a8641SAndroid Build Coastguard Worker ANSI_COLOR_BLACK,
92*635a8641SAndroid Build Coastguard Worker ANSI_COLOR_RED,
93*635a8641SAndroid Build Coastguard Worker ANSI_COLOR_GREEN,
94*635a8641SAndroid Build Coastguard Worker ANSI_COLOR_YELLOW,
95*635a8641SAndroid Build Coastguard Worker ANSI_COLOR_BLUE,
96*635a8641SAndroid Build Coastguard Worker ANSI_COLOR_MAGENTA,
97*635a8641SAndroid Build Coastguard Worker ANSI_COLOR_CYAN,
98*635a8641SAndroid Build Coastguard Worker ANSI_COLOR_WHITE
99*635a8641SAndroid Build Coastguard Worker } ANSIColor;
100*635a8641SAndroid Build Coastguard Worker const char* ANSIEscape(ANSIColor color);
101*635a8641SAndroid Build Coastguard Worker ANSIColor DelayColor(double delay);
102*635a8641SAndroid Build Coastguard Worker
103*635a8641SAndroid Build Coastguard Worker friend struct base::DefaultSingletonTraits<Logging>;
104*635a8641SAndroid Build Coastguard Worker Logging();
105*635a8641SAndroid Build Coastguard Worker
106*635a8641SAndroid Build Coastguard Worker void OnSendLogs();
107*635a8641SAndroid Build Coastguard Worker void Log(const LogData& data);
108*635a8641SAndroid Build Coastguard Worker
109*635a8641SAndroid Build Coastguard Worker bool enabled_;
110*635a8641SAndroid Build Coastguard Worker bool enabled_on_stderr_; // only used on POSIX for now
111*635a8641SAndroid Build Coastguard Worker bool enabled_color_; // only used on POSIX for now
112*635a8641SAndroid Build Coastguard Worker
113*635a8641SAndroid Build Coastguard Worker std::vector<LogData> queued_logs_;
114*635a8641SAndroid Build Coastguard Worker bool queue_invoke_later_pending_;
115*635a8641SAndroid Build Coastguard Worker
116*635a8641SAndroid Build Coastguard Worker Sender* sender_;
117*635a8641SAndroid Build Coastguard Worker scoped_refptr<base::SingleThreadTaskRunner> main_thread_;
118*635a8641SAndroid Build Coastguard Worker
119*635a8641SAndroid Build Coastguard Worker Consumer* consumer_;
120*635a8641SAndroid Build Coastguard Worker
121*635a8641SAndroid Build Coastguard Worker static LogFunctionMap* log_function_map_;
122*635a8641SAndroid Build Coastguard Worker };
123*635a8641SAndroid Build Coastguard Worker
124*635a8641SAndroid Build Coastguard Worker } // namespace IPC
125*635a8641SAndroid Build Coastguard Worker
126*635a8641SAndroid Build Coastguard Worker #endif // BUILDFLAG(IPC_MESSAGE_LOG_ENABLED)
127*635a8641SAndroid Build Coastguard Worker
128*635a8641SAndroid Build Coastguard Worker #endif // IPC_IPC_LOGGING_H_
129