HaikuDepot: notify work status from main window
[haiku.git] / src / tools / MsgSpy / MsgSpy.cpp
blobd508c98530887d2afe45cf130f329396d95ccbbf
1 //-------------------------------------------------------------------------
2 // Handy InputFilter that dumps all Messages to a file.
3 //-------------------------------------------------------------------------
4 #include <stdlib.h>
5 #include <string.h>
6 #include <ctype.h>
8 #include <Debug.h>
9 #include <List.h>
10 #include <File.h>
11 #include <Message.h>
12 #include <String.h>
13 #include <OS.h>
15 #include <add-ons/input_server/InputServerFilter.h>
17 extern "C" _EXPORT BInputServerFilter* instantiate_input_filter();
19 class MsgSpy : public BInputServerFilter
21 public:
22 MsgSpy();
23 virtual ~MsgSpy();
25 virtual status_t InitCheck(void);
26 virtual filter_result Filter(BMessage *message, BList *outList);
27 private:
28 const char* MapWhatToString(uint32 w);
29 void OutputMsgField(const char* fieldName,
30 const uint32 rawType,
31 int rawCount,
32 const void* rawData);
34 status_t m_status;
35 BFile* m_outfile;
38 //-------------------------------------------------------------------------
39 // Create a new MsgSpy instance and return it to the caller.
40 //-------------------------------------------------------------------------
41 BInputServerFilter* instantiate_input_filter()
43 return (new MsgSpy() );
47 //-------------------------------------------------------------------------
48 //-------------------------------------------------------------------------
49 MsgSpy::MsgSpy()
51 // Create the output file and return its status.
52 m_outfile = new BFile("/boot/home/MsgSpy.output", B_READ_WRITE | B_CREATE_FILE | B_ERASE_FILE);
53 //m_status = m_outfile->InitCheck();
54 m_status = B_OK;
57 //-------------------------------------------------------------------------
58 //-------------------------------------------------------------------------
59 MsgSpy::~MsgSpy()
61 if (NULL != m_outfile)
63 // Close and destroy the output file.
64 delete m_outfile;
68 //-------------------------------------------------------------------------
69 //-------------------------------------------------------------------------
70 status_t MsgSpy::InitCheck(void)
72 return m_status;
75 //-------------------------------------------------------------------------
76 //-------------------------------------------------------------------------
77 filter_result MsgSpy::Filter(BMessage *message, BList *outList)
79 char* field_name;
80 uint32 field_type;
81 int32 field_count;
82 const void* field_data;
83 ssize_t field_data_bytes;
84 char msg_buffer [1024];
86 // Print out the message constant (what).
87 sprintf(msg_buffer, "%s\n", MapWhatToString(message->what) );
88 m_outfile->Write(msg_buffer, strlen(msg_buffer) );
90 // Display each field in the message.
91 sprintf(msg_buffer, "{\n");
92 m_outfile->Write(msg_buffer, strlen(msg_buffer) );
93 for (int32 i = 0; B_OK == message->GetInfo(B_ANY_TYPE,
95 &field_name,
96 &field_type,
97 &field_count); i++)
99 message->FindData(field_name, field_type, &field_data, &field_data_bytes);
100 OutputMsgField(field_name, field_type, field_count, field_data);
102 sprintf(msg_buffer, "}\n");
103 m_outfile->Write(msg_buffer, strlen(msg_buffer) );
105 return (B_DISPATCH_MESSAGE);
108 //-------------------------------------------------------------------------
109 //-------------------------------------------------------------------------
110 const char* MsgSpy::MapWhatToString(uint32 w)
112 const char* s;
113 switch (w)
115 // Pointing device event messages.
116 case B_MOUSE_DOWN: s = "B_MOUSE_DOWN"; break;
117 case B_MOUSE_UP: s = "B_MOUSE_UP"; break;
118 case B_MOUSE_MOVED: s = "B_MOUSE_MOVED"; break;
120 // Keyboard device event messages.
121 case B_KEY_DOWN: s = "B_KEY_DOWN"; break;
122 case B_UNMAPPED_KEY_DOWN: s = "B_UNMAPPED_KEY_DOWN"; break;
123 case B_KEY_UP: s = "B_KEY_UP"; break;
124 case B_UNMAPPED_KEY_UP: s = "B_UNMAPPED_KEY_UP"; break;
125 case B_MODIFIERS_CHANGED: s = "B_MODIFIERS_CHANGED"; break;
127 default: s = "UNKNOWN_MESSAGE"; break;
129 return s;
132 //-------------------------------------------------------------------------
133 //-------------------------------------------------------------------------
134 void MsgSpy::OutputMsgField(const char* fieldName,
135 const uint32 rawType,
136 int rawCount,
137 const void* rawData)
139 char msg_buffer [1024];
140 char value_buffer [256];
141 BString field_data;
142 const char* field_type;
143 const int field_count = rawCount;
144 const char* separator;
146 switch (rawType)
148 case B_CHAR_TYPE:
150 field_type = "B_CHAR_TYPE";
151 field_data << "{ ";
152 for (const char* data_ptr = (const char*)rawData;
153 rawCount > 0;
154 rawCount--, data_ptr++)
156 separator = (1 < rawCount) ? ", " : " }";
157 field_data << *data_ptr << separator;
159 break;
162 case B_INT8_TYPE:
164 field_type = "B_INT8_TYPE";
165 field_data << "{ ";
166 for (const int8* data_ptr = (const int8*)rawData;
167 rawCount > 0;
168 rawCount--, data_ptr++)
170 separator = (1 < rawCount) ? ", " : " }";
171 field_data << *data_ptr << separator;
173 break;
176 case B_INT16_TYPE:
178 field_type = "B_INT16_TYPE";
179 field_data << "{ ";
180 for (const int16* data_ptr = (const int16*)rawData;
181 rawCount > 0;
182 rawCount--, data_ptr++)
184 separator = (1 < rawCount) ? ", " : " }";
185 field_data << *data_ptr << separator;
187 break;
190 case B_INT32_TYPE:
192 field_type = "B_INT32_TYPE";
193 field_data << "{ ";
194 for (const int32* data_ptr = (const int32*)rawData;
195 rawCount > 0;
196 rawCount--, data_ptr++)
198 separator = (1 < rawCount) ? ", " : " }";
199 field_data << *data_ptr << separator;
201 break;
204 case B_INT64_TYPE:
206 field_type = "B_INT64_TYPE";
207 field_data << "{ ";
208 for (const int64* data_ptr = (const int64*)rawData;
209 rawCount > 0;
210 rawCount--, data_ptr++)
212 separator = (1 < rawCount) ? ", " : " }";
213 field_data << *data_ptr << separator;
215 break;
218 case B_UINT8_TYPE:
220 field_type = "B_UINT8_TYPE";
221 field_data << "{ ";
222 for (const uint8* data_ptr = (const uint8*)rawData;
223 rawCount > 0;
224 rawCount--, data_ptr++)
226 separator = (1 < rawCount) ? ", " : " }";
227 field_data << (uint32)(*data_ptr) << separator;
229 break;
232 case B_UINT16_TYPE:
234 field_type = "B_UINT16_TYPE";
235 field_data << "{ ";
236 for (const uint16* data_ptr = (const uint16*)rawData;
237 rawCount > 0;
238 rawCount--, data_ptr++)
240 separator = (1 < rawCount) ? ", " : " }";
241 field_data << (uint32)(*data_ptr) << separator;
243 break;
246 case B_UINT32_TYPE:
248 field_type = "B_UINT32_TYPE";
249 field_data << "{ ";
250 for (const uint32* data_ptr = (const uint32*)rawData;
251 rawCount > 0;
252 rawCount--, data_ptr++)
254 separator = (1 < rawCount) ? ", " : " }";
255 field_data << *data_ptr << separator;
257 break;
260 case B_UINT64_TYPE:
262 field_type = "B_UINT64_TYPE";
263 field_data << "{ ";
264 for (const uint64* data_ptr = (const uint64*)rawData;
265 rawCount > 0;
266 rawCount--, data_ptr++)
268 separator = (1 < rawCount) ? ", " : " }";
269 field_data << *data_ptr << separator;
271 break;
274 case B_FLOAT_TYPE:
276 field_type = "B_FLOAT_TYPE";
277 field_data << "{ ";
278 for (const float* data_ptr = (const float*)rawData;
279 rawCount > 0;
280 rawCount--, data_ptr++)
282 separator = (1 < rawCount) ? ", " : " }";
283 field_data << *data_ptr << separator;
285 break;
288 case B_DOUBLE_TYPE:
290 field_type = "B_DOUBLE_TYPE";
291 field_data << "{ ";
292 for (const double* data_ptr = (const double*)rawData;
293 rawCount > 0;
294 rawCount--, data_ptr++)
296 separator = (1 < rawCount) ? ", " : " }";
297 sprintf(value_buffer, "%f", *data_ptr);
298 field_data << value_buffer << separator;
300 break;
303 case B_BOOL_TYPE:
305 field_type = "B_BOOL_TYPE";
306 field_data << "{ ";
307 for (const bool* data_ptr = (const bool*)rawData;
308 rawCount > 0;
309 rawCount--, data_ptr++)
311 separator = (1 < rawCount) ? ", " : " }";
312 sprintf(value_buffer, "%s", (true == *data_ptr) ? "true" : "false");
313 field_data << value_buffer << separator;
315 break;
318 case B_OFF_T_TYPE:
320 field_type = "B_OFF_T_TYPE";
321 field_data << "{ ";
322 for (const off_t* data_ptr = (const off_t*)rawData;
323 rawCount > 0;
324 rawCount--, data_ptr++)
326 separator = (1 < rawCount) ? ", " : " }";
327 field_data << *data_ptr << separator;
329 break;
332 case B_SIZE_T_TYPE:
334 field_type = "B_SIZE_T_TYPE";
335 field_data << "{ ";
336 for (const size_t* data_ptr = (const size_t*)rawData;
337 rawCount > 0;
338 rawCount--, data_ptr++)
340 separator = (1 < rawCount) ? ", " : " }";
341 field_data << *data_ptr << separator;
343 break;
346 case B_SSIZE_T_TYPE:
348 field_type = "B_SSIZE_T_TYPE";
349 field_data << "{ ";
350 for (const ssize_t* data_ptr = (const ssize_t*)rawData;
351 rawCount > 0;
352 rawCount--, data_ptr++)
354 separator = (1 < rawCount) ? ", " : " }";
355 field_data << *data_ptr << separator;
357 break;
360 case B_POINTER_TYPE:
362 field_type = "B_POINTER_TYPE";
363 break;
366 case B_OBJECT_TYPE:
368 field_type = "B_OBJECT_TYPE";
369 break;
372 case B_MESSAGE_TYPE:
374 field_type = "B_MESSAGE_TYPE";
375 break;
378 case B_MESSENGER_TYPE:
380 field_type = "B_MESSENGER_TYPE";
381 break;
384 case B_POINT_TYPE:
386 field_type = "B_POINT_TYPE";
387 field_data << "{ ";
388 for (const BPoint* data_ptr = (const BPoint*)rawData;
389 rawCount > 0;
390 rawCount--, data_ptr++)
392 separator = (1 < rawCount) ? ", " : " }";
393 field_data << "(" << data_ptr->x << ", " << data_ptr->y << ")" << separator;
395 break;
398 case B_RECT_TYPE:
400 field_type = "B_RECT_TYPE";
401 break;
404 // case B_PATH_TYPE: s = "B_PATH_TYPE"; break;
406 case B_REF_TYPE:
408 field_type = "B_REF_TYPE";
409 break;
412 case B_RGB_COLOR_TYPE:
414 field_type = "B_RGB_COLOR_TYPE";
415 break;
418 case B_PATTERN_TYPE:
420 field_type = "B_PATTERN_TYPE";
421 break;
424 case B_STRING_TYPE:
426 field_type = "B_STRING_TYPE";
427 field_data << "{ ";
428 for (const char* data_ptr = (const char*)rawData;
429 rawCount > 0;
430 rawCount--, data_ptr+= strlen(data_ptr) )
432 separator = (1 < rawCount) ? ", " : " }";
433 field_data << "\"" << data_ptr << "\"" << separator;
435 break;
438 case B_MONOCHROME_1_BIT_TYPE:
440 field_type = "B_MONOCHROME_1_BIT_TYPE";
441 break;
444 case B_GRAYSCALE_8_BIT_TYPE:
446 field_type = "B_GRAYSCALE_8_BIT_TYPE";
447 break;
450 case B_COLOR_8_BIT_TYPE:
452 field_type = "B_COLOR_8_BIT_TYPE";
453 break;
456 case B_RGB_32_BIT_TYPE:
458 field_type = "B_RGB_32_BIT_TYPE";
459 break;
462 case B_TIME_TYPE:
464 field_type = "B_TIME_TYPE";
465 break;
468 case B_MEDIA_PARAMETER_TYPE:
470 field_type = "B_MEDIA_PARAMETER_TYPE";
471 break;
474 case B_MEDIA_PARAMETER_WEB_TYPE:
476 field_type = "B_MEDIA_PARAMETER_WEB_TYPE";
477 break;
480 case B_MEDIA_PARAMETER_GROUP_TYPE:
482 field_type = "B_MEDIA_PARAMETER_GROUP_TYPE";
483 break;
486 case B_RAW_TYPE:
488 field_type = "B_RAW_TYPE";
489 break;
492 case B_MIME_TYPE:
494 field_type = "B_MIME_TYPE";
495 break;
498 case B_ANY_TYPE:
500 field_type = "B_ANY_TYPE";
501 break;
504 default:
506 field_type = "UNKNOWN_TYPE";
507 break;
511 sprintf(msg_buffer,
512 " %-18s %-18s [%2d] = %s\n",
513 field_type,
514 fieldName,
515 field_count,
516 field_data.String() );
518 m_outfile->Write(msg_buffer, strlen(msg_buffer) );