xref: /haiku/src/apps/cortex/addons/LoggingConsumer/LogWriter.h (revision 2b76973fa2401f7a5edf68e6470f3d3210cbcff3)
1 /*
2  * Copyright 1991-1999, Be Incorporated.
3  * Copyright (c) 1999-2000, Eric Moon.
4  * All rights reserved.
5  *
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted provided that the following conditions
8  * are met:
9  *
10  * 1. Redistributions of source code must retain the above copyright
11  *    notice, this list of conditions, and the following disclaimer.
12  *
13  * 2. Redistributions in binary form must reproduce the above copyright
14  *    notice, this list of conditions, and the following disclaimer in the
15  *    documentation and/or other materials provided with the distribution.
16  *
17  * 3. The name of the author may not be used to endorse or promote products
18  *    derived from this software without specific prior written permission.
19  *
20  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR
21  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
22  * OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A PARTICULAR
23  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
24  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
25  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
26  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
27  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
28  * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30  */
31 
32 
33 // LogWriter.h
34 
35 #ifndef LogWriter_H
36 #define LogWriter_H 1
37 
38 #include <kernel/OS.h>
39 //#include <storage/Entry.h>
40 //#include <storage/File.h>
41 #include <Entry.h>
42 #include <File.h>
43 #include <support/String.h>
44 #include <set>
45 
46 // logging message data structure
47 struct log_message
48 {
49 	bigtime_t tstamp;					// time that LogWriter::Log() was called, in real time
50 	bigtime_t now;						// time that LogWriter::Log() was called, according to the time source
51 	union										// various bits of data for different kinds of logged actions
52 	{
53 		struct
54 		{
55 			bigtime_t start_time;		// buffer's start time stamp
56 			bigtime_t offset;				// how late or early the buffer was handled
57 		} buffer_data;
58 		struct
59 		{
60 			int32 status;
61 		} data_status;
62 		struct
63 		{
64 			int32 id;							// parameter ID
65 			float value;						// new value
66 		} param;
67 		struct
68 		{
69 			int32 what;
70 		} unknown;
71 	};
72 };
73 
74 // logging message 'what' codes
75 enum log_what
76 {
77 	LOG_QUIT = 'Quit',					// time to quit; tear down the thread
78 
79 	// messages related to BMediaNode methods
80 	LOG_SET_RUN_MODE = 'Rnmd',
81 	LOG_PREROLL = 'Prll',
82 	LOG_SET_TIME_SOURCE = 'TSrc',
83 	LOG_REQUEST_COMPLETED = 'Rqcm',
84 
85 	// messages related to BControllable methods
86 	LOG_GET_PARAM_VALUE = 'PVal',
87 	LOG_SET_PARAM_VALUE = 'SVal',
88 
89 	// messages related to BBufferProducer methods
90 	LOG_FORMAT_SUGG_REQ = 'FSRq',
91 	LOG_FORMAT_PROPOSAL = 'FPro',
92 	LOG_FORMAT_CHANGE_REQ = 'FCRq',
93 	LOG_SET_BUFFER_GROUP = 'SBfG',
94 	LOG_VIDEO_CLIP_CHANGED = 'VClp',
95 	LOG_GET_LATENCY = 'GLat',
96 	LOG_PREPARE_TO_CONNECT = 'PCon',
97 	LOG_CONNECT = 'Cnct',
98 	LOG_DISCONNECT = 'Dsct',
99 	LOG_LATE_NOTICE_RECEIVED = 'LNRc',
100 	LOG_ENABLE_OUTPUT = 'EnOP',
101 	LOG_SET_PLAY_RATE = 'PlRt',
102 	LOG_ADDITIONAL_BUFFER = 'AdBf',
103 	LOG_LATENCY_CHANGED = 'LtCh',
104 
105 	// messages related to BBufferConsumer methods
106 	LOG_HANDLE_MESSAGE = 'Mesg',
107 	LOG_ACCEPT_FORMAT = 'Frmt',
108 	LOG_BUFFER_RECEIVED = 'Bufr',
109 	LOG_PRODUCER_DATA_STATUS = 'PDSt',
110 	LOG_CONNECTED = 'Cntd',
111 	LOG_DISCONNECTED = 'Dctd',
112 	LOG_FORMAT_CHANGED = 'Fmtc',
113 	LOG_SEEK_TAG = 'STrq',
114 
115 	// messages related to BMediaEventLooper methods
116 	LOG_REGISTERED = 'Rgst',
117 	LOG_START = 'Strt',
118 	LOG_STOP = 'Stop',
119 	LOG_SEEK = 'Seek',
120 	LOG_TIMEWARP = 'Warp',
121 
122 	// messages about handling things in BMediaEventLooper::HandleEvent()
123 	LOG_HANDLE_EVENT = 'HEvt',
124 	LOG_HANDLE_UNKNOWN = 'Uknw',		// unknown event code in HandleEvent()
125 	LOG_BUFFER_HANDLED = 'Bfhd',
126 	LOG_START_HANDLED = 'Sthd',
127 	LOG_STOP_HANDLED = 'Sphd',
128 	LOG_SEEK_HANDLED = 'Skhd',
129 	LOG_WARP_HANDLED = 'Wphd',
130 	LOG_DATA_STATUS_HANDLED = 'DShd',
131 	LOG_SET_PARAM_HANDLED = 'SPrm',
132 	LOG_INVALID_PARAM_HANDLED = 'BadP'
133 };
134 
135 // LogWriter class
136 class LogWriter
137 {
138 public:
139 	// Set:  output for the log_what members is disabled
140 	typedef std::set<log_what> FilterSet;
141 
142 public:
143 	LogWriter(const entry_ref& logRef);
144 	~LogWriter();
145 
146 	// write a message to the log
147 	void Log(log_what what, const log_message& data);
148 
149 	// filtering control for logged messages
150 	void SetEnabled(log_what what, bool enable);
151 	void EnableAllMessages();
152 	void DisableAllMessages();
153 
154 private:
155 	entry_ref mLogRef;
156 	thread_id mLogThread;
157 	port_id mPort;
158 	BFile mLogFile;
159 	BString mWriteBuf;
160 	FilterSet mFilters;
161 
162 	// called by the LogWriter's thread
163 	void HandleMessage(log_what what, const log_message& msg);
164 
165 	friend int32 LogWriterLoggingThread(void* arg);
166 };
167 
168 #endif
169