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