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
47struct 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
75enum 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
136class LogWriter
137{
138public:
139	// Set:  output for the log_what members is disabled
140	typedef std::set<log_what> FilterSet;
141
142public:
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
154private:
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