1 //-------------------------------------------------------------------------
2 // Handy InputFilter that dumps all Messages to a file.
3 //-------------------------------------------------------------------------
15 #include <add-ons/input_server/InputServerFilter.h>
17 extern "C" _EXPORT BInputServerFilter
* instantiate_input_filter();
19 class MsgSpy
: public BInputServerFilter
25 virtual status_t
InitCheck(void);
26 virtual filter_result
Filter(BMessage
*message
, BList
*outList
);
28 const char* MapWhatToString(uint32 w
);
29 void OutputMsgField(const char* fieldName
,
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 //-------------------------------------------------------------------------
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();
57 //-------------------------------------------------------------------------
58 //-------------------------------------------------------------------------
61 if (NULL
!= m_outfile
)
63 // Close and destroy the output file.
68 //-------------------------------------------------------------------------
69 //-------------------------------------------------------------------------
70 status_t
MsgSpy::InitCheck(void)
75 //-------------------------------------------------------------------------
76 //-------------------------------------------------------------------------
77 filter_result
MsgSpy::Filter(BMessage
*message
, BList
*outList
)
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
,
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
)
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;
132 //-------------------------------------------------------------------------
133 //-------------------------------------------------------------------------
134 void MsgSpy::OutputMsgField(const char* fieldName
,
135 const uint32 rawType
,
139 char msg_buffer
[1024];
140 char value_buffer
[256];
142 const char* field_type
;
143 const int field_count
= rawCount
;
144 const char* separator
;
150 field_type
= "B_CHAR_TYPE";
152 for (const char* data_ptr
= (const char*)rawData
;
154 rawCount
--, data_ptr
++)
156 separator
= (1 < rawCount
) ? ", " : " }";
157 field_data
<< *data_ptr
<< separator
;
164 field_type
= "B_INT8_TYPE";
166 for (const int8
* data_ptr
= (const int8
*)rawData
;
168 rawCount
--, data_ptr
++)
170 separator
= (1 < rawCount
) ? ", " : " }";
171 field_data
<< *data_ptr
<< separator
;
178 field_type
= "B_INT16_TYPE";
180 for (const int16
* data_ptr
= (const int16
*)rawData
;
182 rawCount
--, data_ptr
++)
184 separator
= (1 < rawCount
) ? ", " : " }";
185 field_data
<< *data_ptr
<< separator
;
192 field_type
= "B_INT32_TYPE";
194 for (const int32
* data_ptr
= (const int32
*)rawData
;
196 rawCount
--, data_ptr
++)
198 separator
= (1 < rawCount
) ? ", " : " }";
199 field_data
<< *data_ptr
<< separator
;
206 field_type
= "B_INT64_TYPE";
208 for (const int64
* data_ptr
= (const int64
*)rawData
;
210 rawCount
--, data_ptr
++)
212 separator
= (1 < rawCount
) ? ", " : " }";
213 field_data
<< *data_ptr
<< separator
;
220 field_type
= "B_UINT8_TYPE";
222 for (const uint8
* data_ptr
= (const uint8
*)rawData
;
224 rawCount
--, data_ptr
++)
226 separator
= (1 < rawCount
) ? ", " : " }";
227 field_data
<< (uint32
)(*data_ptr
) << separator
;
234 field_type
= "B_UINT16_TYPE";
236 for (const uint16
* data_ptr
= (const uint16
*)rawData
;
238 rawCount
--, data_ptr
++)
240 separator
= (1 < rawCount
) ? ", " : " }";
241 field_data
<< (uint32
)(*data_ptr
) << separator
;
248 field_type
= "B_UINT32_TYPE";
250 for (const uint32
* data_ptr
= (const uint32
*)rawData
;
252 rawCount
--, data_ptr
++)
254 separator
= (1 < rawCount
) ? ", " : " }";
255 field_data
<< *data_ptr
<< separator
;
262 field_type
= "B_UINT64_TYPE";
264 for (const uint64
* data_ptr
= (const uint64
*)rawData
;
266 rawCount
--, data_ptr
++)
268 separator
= (1 < rawCount
) ? ", " : " }";
269 field_data
<< *data_ptr
<< separator
;
276 field_type
= "B_FLOAT_TYPE";
278 for (const float* data_ptr
= (const float*)rawData
;
280 rawCount
--, data_ptr
++)
282 separator
= (1 < rawCount
) ? ", " : " }";
283 field_data
<< *data_ptr
<< separator
;
290 field_type
= "B_DOUBLE_TYPE";
292 for (const double* data_ptr
= (const double*)rawData
;
294 rawCount
--, data_ptr
++)
296 separator
= (1 < rawCount
) ? ", " : " }";
297 sprintf(value_buffer
, "%f", *data_ptr
);
298 field_data
<< value_buffer
<< separator
;
305 field_type
= "B_BOOL_TYPE";
307 for (const bool* data_ptr
= (const bool*)rawData
;
309 rawCount
--, data_ptr
++)
311 separator
= (1 < rawCount
) ? ", " : " }";
312 sprintf(value_buffer
, "%s", (true == *data_ptr
) ? "true" : "false");
313 field_data
<< value_buffer
<< separator
;
320 field_type
= "B_OFF_T_TYPE";
322 for (const off_t
* data_ptr
= (const off_t
*)rawData
;
324 rawCount
--, data_ptr
++)
326 separator
= (1 < rawCount
) ? ", " : " }";
327 field_data
<< *data_ptr
<< separator
;
334 field_type
= "B_SIZE_T_TYPE";
336 for (const size_t* data_ptr
= (const size_t*)rawData
;
338 rawCount
--, data_ptr
++)
340 separator
= (1 < rawCount
) ? ", " : " }";
341 field_data
<< *data_ptr
<< separator
;
348 field_type
= "B_SSIZE_T_TYPE";
350 for (const ssize_t
* data_ptr
= (const ssize_t
*)rawData
;
352 rawCount
--, data_ptr
++)
354 separator
= (1 < rawCount
) ? ", " : " }";
355 field_data
<< *data_ptr
<< separator
;
362 field_type
= "B_POINTER_TYPE";
368 field_type
= "B_OBJECT_TYPE";
374 field_type
= "B_MESSAGE_TYPE";
378 case B_MESSENGER_TYPE
:
380 field_type
= "B_MESSENGER_TYPE";
386 field_type
= "B_POINT_TYPE";
388 for (const BPoint
* data_ptr
= (const BPoint
*)rawData
;
390 rawCount
--, data_ptr
++)
392 separator
= (1 < rawCount
) ? ", " : " }";
393 field_data
<< "(" << data_ptr
->x
<< ", " << data_ptr
->y
<< ")" << separator
;
400 field_type
= "B_RECT_TYPE";
404 // case B_PATH_TYPE: s = "B_PATH_TYPE"; break;
408 field_type
= "B_REF_TYPE";
412 case B_RGB_COLOR_TYPE
:
414 field_type
= "B_RGB_COLOR_TYPE";
420 field_type
= "B_PATTERN_TYPE";
426 field_type
= "B_STRING_TYPE";
428 for (const char* data_ptr
= (const char*)rawData
;
430 rawCount
--, data_ptr
+= strlen(data_ptr
) )
432 separator
= (1 < rawCount
) ? ", " : " }";
433 field_data
<< "\"" << data_ptr
<< "\"" << separator
;
438 case B_MONOCHROME_1_BIT_TYPE
:
440 field_type
= "B_MONOCHROME_1_BIT_TYPE";
444 case B_GRAYSCALE_8_BIT_TYPE
:
446 field_type
= "B_GRAYSCALE_8_BIT_TYPE";
450 case B_COLOR_8_BIT_TYPE
:
452 field_type
= "B_COLOR_8_BIT_TYPE";
456 case B_RGB_32_BIT_TYPE
:
458 field_type
= "B_RGB_32_BIT_TYPE";
464 field_type
= "B_TIME_TYPE";
468 case B_MEDIA_PARAMETER_TYPE
:
470 field_type
= "B_MEDIA_PARAMETER_TYPE";
474 case B_MEDIA_PARAMETER_WEB_TYPE
:
476 field_type
= "B_MEDIA_PARAMETER_WEB_TYPE";
480 case B_MEDIA_PARAMETER_GROUP_TYPE
:
482 field_type
= "B_MEDIA_PARAMETER_GROUP_TYPE";
488 field_type
= "B_RAW_TYPE";
494 field_type
= "B_MIME_TYPE";
500 field_type
= "B_ANY_TYPE";
506 field_type
= "UNKNOWN_TYPE";
512 " %-18s %-18s [%2d] = %s\n",
516 field_data
.String() );
518 m_outfile
->Write(msg_buffer
, strlen(msg_buffer
) );