xref: /haiku/src/tests/servers/input/msgspy/MsgSpy.cpp (revision 697ba202b7d45dd9c1475dd5eaa60adcf4806816)
152a38012Sejakowatz //-------------------------------------------------------------------------
252a38012Sejakowatz // Handy InputFilter that dumps all Messages to a file.
352a38012Sejakowatz //-------------------------------------------------------------------------
452a38012Sejakowatz #include <stdlib.h>
552a38012Sejakowatz #include <string.h>
652a38012Sejakowatz #include <ctype.h>
752a38012Sejakowatz 
852a38012Sejakowatz #include <Debug.h>
952a38012Sejakowatz #include <List.h>
1052a38012Sejakowatz #include <File.h>
1152a38012Sejakowatz #include <Message.h>
1252a38012Sejakowatz #include <String.h>
1352a38012Sejakowatz #include <OS.h>
1452a38012Sejakowatz 
1552a38012Sejakowatz #include <add-ons/input_server/InputServerFilter.h>
1652a38012Sejakowatz 
1752a38012Sejakowatz extern "C" _EXPORT BInputServerFilter* instantiate_input_filter();
1852a38012Sejakowatz 
1952a38012Sejakowatz class MsgSpy : public BInputServerFilter
2052a38012Sejakowatz {
2152a38012Sejakowatz public:
2252a38012Sejakowatz 	         MsgSpy();
2352a38012Sejakowatz 	virtual ~MsgSpy();
2452a38012Sejakowatz 
2552a38012Sejakowatz     virtual status_t      InitCheck(void);
2652a38012Sejakowatz 	virtual	filter_result Filter(BMessage *message, BList *outList);
2752a38012Sejakowatz private:
2852a38012Sejakowatz 	const char* MapWhatToString(uint32 w);
2952a38012Sejakowatz 	void        OutputMsgField(const char*  fieldName,
3052a38012Sejakowatz 	                           const uint32 rawType,
3152a38012Sejakowatz                                int          rawCount,
3252a38012Sejakowatz                                const void*  rawData);
3352a38012Sejakowatz 
3452a38012Sejakowatz     status_t m_status;
3552a38012Sejakowatz     BFile*   m_outfile;
3652a38012Sejakowatz };
3752a38012Sejakowatz 
3852a38012Sejakowatz //-------------------------------------------------------------------------
3952a38012Sejakowatz // Create a new MsgSpy instance and return it to the caller.
4052a38012Sejakowatz //-------------------------------------------------------------------------
instantiate_input_filter()4152a38012Sejakowatz BInputServerFilter* instantiate_input_filter()
4252a38012Sejakowatz {
4352a38012Sejakowatz 	return (new MsgSpy() );
4452a38012Sejakowatz }
4552a38012Sejakowatz 
4652a38012Sejakowatz 
4752a38012Sejakowatz //-------------------------------------------------------------------------
4852a38012Sejakowatz //-------------------------------------------------------------------------
MsgSpy()4952a38012Sejakowatz MsgSpy::MsgSpy()
5052a38012Sejakowatz {
5152a38012Sejakowatz     // Create the output file and return its status.
5252a38012Sejakowatz     m_outfile = new BFile("/boot/home/MsgSpy.output", B_READ_WRITE | B_CREATE_FILE | B_ERASE_FILE);
5352a38012Sejakowatz     //m_status = m_outfile->InitCheck();
5452a38012Sejakowatz     m_status = B_OK;
5552a38012Sejakowatz }
5652a38012Sejakowatz 
5752a38012Sejakowatz //-------------------------------------------------------------------------
5852a38012Sejakowatz //-------------------------------------------------------------------------
~MsgSpy()5952a38012Sejakowatz MsgSpy::~MsgSpy()
6052a38012Sejakowatz {
6152a38012Sejakowatz     if (NULL != m_outfile)
6252a38012Sejakowatz     {
6352a38012Sejakowatz         // Close and destroy the output file.
6452a38012Sejakowatz         delete m_outfile;
6552a38012Sejakowatz     }
6652a38012Sejakowatz }
6752a38012Sejakowatz 
6852a38012Sejakowatz //-------------------------------------------------------------------------
6952a38012Sejakowatz //-------------------------------------------------------------------------
InitCheck(void)7052a38012Sejakowatz status_t MsgSpy::InitCheck(void)
7152a38012Sejakowatz {
7252a38012Sejakowatz 	return m_status;
7352a38012Sejakowatz }
7452a38012Sejakowatz 
7552a38012Sejakowatz //-------------------------------------------------------------------------
7652a38012Sejakowatz //-------------------------------------------------------------------------
Filter(BMessage * message,BList * outList)7752a38012Sejakowatz filter_result MsgSpy::Filter(BMessage *message, BList *outList)
7852a38012Sejakowatz {
7952a38012Sejakowatz     char*       field_name;
8052a38012Sejakowatz     uint32      field_type;
8152a38012Sejakowatz     int32       field_count;
8252a38012Sejakowatz     const void* field_data;
8352a38012Sejakowatz     ssize_t     field_data_bytes;
8452a38012Sejakowatz 	char        msg_buffer  [1024];
8552a38012Sejakowatz 
8652a38012Sejakowatz 	// Print out the message constant (what).
8752a38012Sejakowatz 	sprintf(msg_buffer, "%s\n", MapWhatToString(message->what) );
8852a38012Sejakowatz     m_outfile->Write(msg_buffer, strlen(msg_buffer) );
8952a38012Sejakowatz 
9052a38012Sejakowatz     // Display each field in the message.
9152a38012Sejakowatz 	sprintf(msg_buffer, "{\n");
9252a38012Sejakowatz     m_outfile->Write(msg_buffer, strlen(msg_buffer) );
9352a38012Sejakowatz 	for (int32 i = 0;  B_OK == message->GetInfo(B_ANY_TYPE,
9452a38012Sejakowatz 	                                            i,
9552a38012Sejakowatz 	                                            &field_name,
9652a38012Sejakowatz 	                                            &field_type,
9752a38012Sejakowatz 	                                            &field_count);  i++)
9852a38012Sejakowatz 	{
9952a38012Sejakowatz 		message->FindData(field_name, field_type, &field_data, &field_data_bytes);
10052a38012Sejakowatz 		OutputMsgField(field_name, field_type, field_count, field_data);
10152a38012Sejakowatz 	}
10252a38012Sejakowatz 	sprintf(msg_buffer, "}\n");
10352a38012Sejakowatz     m_outfile->Write(msg_buffer, strlen(msg_buffer) );
10452a38012Sejakowatz 
10552a38012Sejakowatz 	return (B_DISPATCH_MESSAGE);
10652a38012Sejakowatz }
10752a38012Sejakowatz 
10852a38012Sejakowatz //-------------------------------------------------------------------------
10952a38012Sejakowatz //-------------------------------------------------------------------------
MapWhatToString(uint32 w)11052a38012Sejakowatz const char* MsgSpy::MapWhatToString(uint32 w)
11152a38012Sejakowatz {
11252a38012Sejakowatz     const char* s;
11352a38012Sejakowatz 	switch (w)
11452a38012Sejakowatz 	{
11552a38012Sejakowatz 		// Pointing device event messages.
11652a38012Sejakowatz 		case B_MOUSE_DOWN:					s = "B_MOUSE_DOWN";					break;
11752a38012Sejakowatz 		case B_MOUSE_UP:					s = "B_MOUSE_UP";					break;
11852a38012Sejakowatz 		case B_MOUSE_MOVED:					s = "B_MOUSE_MOVED";				break;
119*697ba202SJérôme Duval 		case B_MOUSE_WHEEL_CHANGED:				s = "B_MOUSE_WHEEL_CHANGED";			break;
12052a38012Sejakowatz 
12152a38012Sejakowatz 		// Keyboard device event messages.
12252a38012Sejakowatz 		case B_KEY_DOWN:					s = "B_KEY_DOWN";					break;
12352a38012Sejakowatz 		case B_UNMAPPED_KEY_DOWN:			s = "B_UNMAPPED_KEY_DOWN";			break;
12452a38012Sejakowatz 		case B_KEY_UP:						s = "B_KEY_UP";						break;
12552a38012Sejakowatz 		case B_UNMAPPED_KEY_UP:				s = "B_UNMAPPED_KEY_UP";			break;
12652a38012Sejakowatz 		case B_MODIFIERS_CHANGED:			s = "B_MODIFIERS_CHANGED";			break;
12752a38012Sejakowatz 
128*697ba202SJérôme Duval 		case B_INPUT_METHOD_EVENT:			s = "B_INPUT_METHOD_EVENT";			break;
12952a38012Sejakowatz 		default:							s = "UNKNOWN_MESSAGE";				break;
13052a38012Sejakowatz 	}
13152a38012Sejakowatz 	return s;
13252a38012Sejakowatz }
13352a38012Sejakowatz 
13452a38012Sejakowatz //-------------------------------------------------------------------------
13552a38012Sejakowatz //-------------------------------------------------------------------------
OutputMsgField(const char * fieldName,const uint32 rawType,int rawCount,const void * rawData)13652a38012Sejakowatz void MsgSpy::OutputMsgField(const char*  fieldName,
13752a38012Sejakowatz                             const uint32 rawType,
13852a38012Sejakowatz                             int          rawCount,
13952a38012Sejakowatz                             const void*  rawData)
14052a38012Sejakowatz {
14152a38012Sejakowatz 	char        msg_buffer   [1024];
14252a38012Sejakowatz 	char        value_buffer [256];
14352a38012Sejakowatz 	BString     field_data;
14452a38012Sejakowatz     const char* field_type;
14552a38012Sejakowatz     const int   field_count  = rawCount;
14652a38012Sejakowatz     const char* separator;
14752a38012Sejakowatz 
14852a38012Sejakowatz 	switch (rawType)
14952a38012Sejakowatz 	{
15052a38012Sejakowatz 		case B_CHAR_TYPE:
15152a38012Sejakowatz 		{
15252a38012Sejakowatz 			field_type = "B_CHAR_TYPE";
15352a38012Sejakowatz 			field_data << "{ ";
15452a38012Sejakowatz 			for (const char* data_ptr = (const char*)rawData;
15552a38012Sejakowatz 				rawCount > 0;
15652a38012Sejakowatz 				rawCount--, data_ptr++)
15752a38012Sejakowatz 			{
15852a38012Sejakowatz 				separator = (1 < rawCount) ? ", " : " }";
15952a38012Sejakowatz 				field_data << *data_ptr << separator;
16052a38012Sejakowatz 			}
16152a38012Sejakowatz 			break;
16252a38012Sejakowatz 		}
16352a38012Sejakowatz 
16452a38012Sejakowatz 		case B_INT8_TYPE:
16552a38012Sejakowatz 		{
16652a38012Sejakowatz 			field_type = "B_INT8_TYPE";
16752a38012Sejakowatz 			field_data << "{ ";
16852a38012Sejakowatz 			for (const int8* data_ptr = (const int8*)rawData;
16952a38012Sejakowatz 				rawCount > 0;
17052a38012Sejakowatz 				rawCount--, data_ptr++)
17152a38012Sejakowatz 			{
17252a38012Sejakowatz 				separator = (1 < rawCount) ? ", " : " }";
17352a38012Sejakowatz 				field_data << *data_ptr << separator;
17452a38012Sejakowatz 			}
17552a38012Sejakowatz 			break;
17652a38012Sejakowatz 		}
17752a38012Sejakowatz 
17852a38012Sejakowatz 		case B_INT16_TYPE:
17952a38012Sejakowatz 		{
18052a38012Sejakowatz 			field_type = "B_INT16_TYPE";
18152a38012Sejakowatz 			field_data << "{ ";
18252a38012Sejakowatz 			for (const int16* data_ptr = (const int16*)rawData;
18352a38012Sejakowatz 				rawCount > 0;
18452a38012Sejakowatz 				rawCount--, data_ptr++)
18552a38012Sejakowatz 			{
18652a38012Sejakowatz 				separator = (1 < rawCount) ? ", " : " }";
18752a38012Sejakowatz 				field_data << *data_ptr << separator;
18852a38012Sejakowatz 			}
18952a38012Sejakowatz 			break;
19052a38012Sejakowatz 		}
19152a38012Sejakowatz 
19252a38012Sejakowatz 		case B_INT32_TYPE:
19352a38012Sejakowatz 		{
19452a38012Sejakowatz 			field_type = "B_INT32_TYPE";
19552a38012Sejakowatz 			field_data << "{ ";
19652a38012Sejakowatz 			for (const int32* data_ptr = (const int32*)rawData;
19752a38012Sejakowatz 				rawCount > 0;
19852a38012Sejakowatz 				rawCount--, data_ptr++)
19952a38012Sejakowatz 			{
20052a38012Sejakowatz 				separator = (1 < rawCount) ? ", " : " }";
20152a38012Sejakowatz 				field_data << *data_ptr << separator;
20252a38012Sejakowatz 			}
20352a38012Sejakowatz 			break;
20452a38012Sejakowatz 		}
20552a38012Sejakowatz 
20652a38012Sejakowatz 		case B_INT64_TYPE:
20752a38012Sejakowatz 		{
20852a38012Sejakowatz 			field_type = "B_INT64_TYPE";
20952a38012Sejakowatz 			field_data << "{ ";
21052a38012Sejakowatz 			for (const int64* data_ptr = (const int64*)rawData;
21152a38012Sejakowatz 				rawCount > 0;
21252a38012Sejakowatz 				rawCount--, data_ptr++)
21352a38012Sejakowatz 			{
21452a38012Sejakowatz 				separator = (1 < rawCount) ? ", " : " }";
21552a38012Sejakowatz 				field_data << *data_ptr << separator;
21652a38012Sejakowatz 			}
21752a38012Sejakowatz 			break;
21852a38012Sejakowatz 		}
21952a38012Sejakowatz 
22052a38012Sejakowatz 		case B_UINT8_TYPE:
22152a38012Sejakowatz 		{
22252a38012Sejakowatz 			field_type = "B_UINT8_TYPE";
22352a38012Sejakowatz 			field_data << "{ ";
22452a38012Sejakowatz 			for (const uint8* data_ptr = (const uint8*)rawData;
22552a38012Sejakowatz 				rawCount > 0;
22652a38012Sejakowatz 				rawCount--, data_ptr++)
22752a38012Sejakowatz 			{
22852a38012Sejakowatz 				separator = (1 < rawCount) ? ", " : " }";
22952a38012Sejakowatz 				field_data << (uint32)(*data_ptr) << separator;
23052a38012Sejakowatz 			}
23152a38012Sejakowatz 			break;
23252a38012Sejakowatz 		}
23352a38012Sejakowatz 
23452a38012Sejakowatz 		case B_UINT16_TYPE:
23552a38012Sejakowatz 		{
23652a38012Sejakowatz 			field_type = "B_UINT16_TYPE";
23752a38012Sejakowatz 			field_data << "{ ";
23852a38012Sejakowatz 			for (const uint16* data_ptr = (const uint16*)rawData;
23952a38012Sejakowatz 				rawCount > 0;
24052a38012Sejakowatz 				rawCount--, data_ptr++)
24152a38012Sejakowatz 			{
24252a38012Sejakowatz 				separator = (1 < rawCount) ? ", " : " }";
24352a38012Sejakowatz 				field_data << (uint32)(*data_ptr) << separator;
24452a38012Sejakowatz 			}
24552a38012Sejakowatz 			break;
24652a38012Sejakowatz 		}
24752a38012Sejakowatz 
24852a38012Sejakowatz 		case B_UINT32_TYPE:
24952a38012Sejakowatz 		{
25052a38012Sejakowatz 			field_type = "B_UINT32_TYPE";
25152a38012Sejakowatz 			field_data << "{ ";
25252a38012Sejakowatz 			for (const uint32* data_ptr = (const uint32*)rawData;
25352a38012Sejakowatz 				rawCount > 0;
25452a38012Sejakowatz 				rawCount--, data_ptr++)
25552a38012Sejakowatz 			{
25652a38012Sejakowatz 				separator = (1 < rawCount) ? ", " : " }";
25752a38012Sejakowatz 				field_data << *data_ptr << separator;
25852a38012Sejakowatz 			}
25952a38012Sejakowatz 			break;
26052a38012Sejakowatz 		}
26152a38012Sejakowatz 
26252a38012Sejakowatz 		case B_UINT64_TYPE:
26352a38012Sejakowatz 		{
26452a38012Sejakowatz 			field_type = "B_UINT64_TYPE";
26552a38012Sejakowatz 			field_data << "{ ";
26652a38012Sejakowatz 			for (const uint64* data_ptr = (const uint64*)rawData;
26752a38012Sejakowatz 				rawCount > 0;
26852a38012Sejakowatz 				rawCount--, data_ptr++)
26952a38012Sejakowatz 			{
27052a38012Sejakowatz 				separator = (1 < rawCount) ? ", " : " }";
27152a38012Sejakowatz 				field_data << *data_ptr << separator;
27252a38012Sejakowatz 			}
27352a38012Sejakowatz 			break;
27452a38012Sejakowatz 		}
27552a38012Sejakowatz 
27652a38012Sejakowatz 		case B_FLOAT_TYPE:
27752a38012Sejakowatz 		{
27852a38012Sejakowatz 			field_type = "B_FLOAT_TYPE";
27952a38012Sejakowatz 			field_data << "{ ";
28052a38012Sejakowatz 			for (const float* data_ptr = (const float*)rawData;
28152a38012Sejakowatz 				rawCount > 0;
28252a38012Sejakowatz 				rawCount--, data_ptr++)
28352a38012Sejakowatz 			{
28452a38012Sejakowatz 				separator = (1 < rawCount) ? ", " : " }";
28552a38012Sejakowatz 				field_data << *data_ptr << separator;
28652a38012Sejakowatz 			}
28752a38012Sejakowatz 			break;
28852a38012Sejakowatz 		}
28952a38012Sejakowatz 
29052a38012Sejakowatz 		case B_DOUBLE_TYPE:
29152a38012Sejakowatz 		{
29252a38012Sejakowatz 			field_type = "B_DOUBLE_TYPE";
29352a38012Sejakowatz 			field_data << "{ ";
29452a38012Sejakowatz 			for (const double* data_ptr = (const double*)rawData;
29552a38012Sejakowatz 				rawCount > 0;
29652a38012Sejakowatz 				rawCount--, data_ptr++)
29752a38012Sejakowatz 			{
29852a38012Sejakowatz 				separator = (1 < rawCount) ? ", " : " }";
29952a38012Sejakowatz 				sprintf(value_buffer, "%f", *data_ptr);
30052a38012Sejakowatz 				field_data << value_buffer << separator;
30152a38012Sejakowatz 			}
30252a38012Sejakowatz 			break;
30352a38012Sejakowatz 		}
30452a38012Sejakowatz 
30552a38012Sejakowatz 		case B_BOOL_TYPE:
30652a38012Sejakowatz 		{
30752a38012Sejakowatz 			field_type = "B_BOOL_TYPE";
30852a38012Sejakowatz 			field_data << "{ ";
30952a38012Sejakowatz 			for (const bool* data_ptr = (const bool*)rawData;
31052a38012Sejakowatz 				rawCount > 0;
31152a38012Sejakowatz 				rawCount--, data_ptr++)
31252a38012Sejakowatz 			{
31352a38012Sejakowatz 				separator = (1 < rawCount) ? ", " : " }";
31452a38012Sejakowatz 				sprintf(value_buffer, "%s", (true == *data_ptr) ? "true" : "false");
31552a38012Sejakowatz 				field_data << value_buffer << separator;
31652a38012Sejakowatz 			}
31752a38012Sejakowatz 			break;
31852a38012Sejakowatz 		}
31952a38012Sejakowatz 
32052a38012Sejakowatz 		case B_OFF_T_TYPE:
32152a38012Sejakowatz 		{
32252a38012Sejakowatz 			field_type = "B_OFF_T_TYPE";
32352a38012Sejakowatz 			field_data << "{ ";
32452a38012Sejakowatz 			for (const off_t* data_ptr = (const off_t*)rawData;
32552a38012Sejakowatz 				rawCount > 0;
32652a38012Sejakowatz 				rawCount--, data_ptr++)
32752a38012Sejakowatz 			{
32852a38012Sejakowatz 				separator = (1 < rawCount) ? ", " : " }";
32952a38012Sejakowatz 				field_data << *data_ptr << separator;
33052a38012Sejakowatz 			}
33152a38012Sejakowatz 			break;
33252a38012Sejakowatz 		}
33352a38012Sejakowatz 
33452a38012Sejakowatz 		case B_SIZE_T_TYPE:
33552a38012Sejakowatz 		{
33652a38012Sejakowatz 			field_type = "B_SIZE_T_TYPE";
33752a38012Sejakowatz 			field_data << "{ ";
33852a38012Sejakowatz 			for (const size_t* data_ptr = (const size_t*)rawData;
33952a38012Sejakowatz 				rawCount > 0;
34052a38012Sejakowatz 				rawCount--, data_ptr++)
34152a38012Sejakowatz 			{
34252a38012Sejakowatz 				separator = (1 < rawCount) ? ", " : " }";
34352a38012Sejakowatz 				field_data << *data_ptr << separator;
34452a38012Sejakowatz 			}
34552a38012Sejakowatz 			break;
34652a38012Sejakowatz 		}
34752a38012Sejakowatz 
34852a38012Sejakowatz 		case B_SSIZE_T_TYPE:
34952a38012Sejakowatz 		{
35052a38012Sejakowatz 			field_type = "B_SSIZE_T_TYPE";
35152a38012Sejakowatz 			field_data << "{ ";
35252a38012Sejakowatz 			for (const ssize_t* data_ptr = (const ssize_t*)rawData;
35352a38012Sejakowatz 				rawCount > 0;
35452a38012Sejakowatz 				rawCount--, data_ptr++)
35552a38012Sejakowatz 			{
35652a38012Sejakowatz 				separator = (1 < rawCount) ? ", " : " }";
35752a38012Sejakowatz 				field_data << *data_ptr << separator;
35852a38012Sejakowatz 			}
35952a38012Sejakowatz 			break;
36052a38012Sejakowatz 		}
36152a38012Sejakowatz 
36252a38012Sejakowatz 		case B_POINTER_TYPE:
36352a38012Sejakowatz 		{
36452a38012Sejakowatz 			field_type = "B_POINTER_TYPE";
36552a38012Sejakowatz 			break;
36652a38012Sejakowatz 		}
36752a38012Sejakowatz 
36852a38012Sejakowatz 		case B_OBJECT_TYPE:
36952a38012Sejakowatz 		{
37052a38012Sejakowatz 			field_type = "B_OBJECT_TYPE";
37152a38012Sejakowatz 			break;
37252a38012Sejakowatz 		}
37352a38012Sejakowatz 
37452a38012Sejakowatz 		case B_MESSAGE_TYPE:
37552a38012Sejakowatz 		{
37652a38012Sejakowatz 			field_type = "B_MESSAGE_TYPE";
37752a38012Sejakowatz 			break;
37852a38012Sejakowatz 		}
37952a38012Sejakowatz 
38052a38012Sejakowatz 		case B_MESSENGER_TYPE:
38152a38012Sejakowatz 		{
38252a38012Sejakowatz 			field_type = "B_MESSENGER_TYPE";
38352a38012Sejakowatz 			break;
38452a38012Sejakowatz 		}
38552a38012Sejakowatz 
38652a38012Sejakowatz 		case B_POINT_TYPE:
38752a38012Sejakowatz 		{
38852a38012Sejakowatz 			field_type = "B_POINT_TYPE";
38952a38012Sejakowatz 			field_data << "{ ";
39052a38012Sejakowatz 			for (const BPoint* data_ptr = (const BPoint*)rawData;
39152a38012Sejakowatz 				rawCount > 0;
39252a38012Sejakowatz 				rawCount--, data_ptr++)
39352a38012Sejakowatz 			{
39452a38012Sejakowatz 				separator = (1 < rawCount) ? ", " : " }";
39552a38012Sejakowatz 				field_data << "(" << data_ptr->x << ", " << data_ptr->y << ")" << separator;
39652a38012Sejakowatz 			}
39752a38012Sejakowatz 			break;
39852a38012Sejakowatz 		}
39952a38012Sejakowatz 
40052a38012Sejakowatz 		case B_RECT_TYPE:
40152a38012Sejakowatz 		{
40252a38012Sejakowatz 			field_type = "B_RECT_TYPE";
40352a38012Sejakowatz 			break;
40452a38012Sejakowatz 		}
40552a38012Sejakowatz 
40652a38012Sejakowatz //		case B_PATH_TYPE:					s = "B_PATH_TYPE";					break;
40752a38012Sejakowatz 
40852a38012Sejakowatz 		case B_REF_TYPE:
40952a38012Sejakowatz 		{
41052a38012Sejakowatz 			field_type = "B_REF_TYPE";
41152a38012Sejakowatz 			break;
41252a38012Sejakowatz 		}
41352a38012Sejakowatz 
41452a38012Sejakowatz 		case B_RGB_COLOR_TYPE:
41552a38012Sejakowatz 		{
41652a38012Sejakowatz 			field_type = "B_RGB_COLOR_TYPE";
41752a38012Sejakowatz 			break;
41852a38012Sejakowatz 		}
41952a38012Sejakowatz 
42052a38012Sejakowatz 		case B_PATTERN_TYPE:
42152a38012Sejakowatz 		{
42252a38012Sejakowatz 			field_type = "B_PATTERN_TYPE";
42352a38012Sejakowatz 			break;
42452a38012Sejakowatz 		}
42552a38012Sejakowatz 
42652a38012Sejakowatz 		case B_STRING_TYPE:
42752a38012Sejakowatz 		{
42852a38012Sejakowatz 			field_type = "B_STRING_TYPE";
42952a38012Sejakowatz 			field_data << "{ ";
43052a38012Sejakowatz 			for (const char* data_ptr = (const char*)rawData;
43152a38012Sejakowatz 				rawCount > 0;
43252a38012Sejakowatz 				rawCount--, data_ptr+= strlen(data_ptr) )
43352a38012Sejakowatz 			{
43452a38012Sejakowatz 				separator = (1 < rawCount) ? ", " : " }";
43552a38012Sejakowatz 				field_data << "\"" << data_ptr << "\"" << separator;
43652a38012Sejakowatz 			}
43752a38012Sejakowatz 			break;
43852a38012Sejakowatz 		}
43952a38012Sejakowatz 
44052a38012Sejakowatz 		case B_MONOCHROME_1_BIT_TYPE:
44152a38012Sejakowatz 		{
44252a38012Sejakowatz 			field_type = "B_MONOCHROME_1_BIT_TYPE";
44352a38012Sejakowatz 			break;
44452a38012Sejakowatz 		}
44552a38012Sejakowatz 
44652a38012Sejakowatz 		case B_GRAYSCALE_8_BIT_TYPE:
44752a38012Sejakowatz 		{
44852a38012Sejakowatz 			field_type = "B_GRAYSCALE_8_BIT_TYPE";
44952a38012Sejakowatz 			break;
45052a38012Sejakowatz 		}
45152a38012Sejakowatz 
45252a38012Sejakowatz 		case B_COLOR_8_BIT_TYPE:
45352a38012Sejakowatz 		{
45452a38012Sejakowatz 			field_type = "B_COLOR_8_BIT_TYPE";
45552a38012Sejakowatz 			break;
45652a38012Sejakowatz 		}
45752a38012Sejakowatz 
45852a38012Sejakowatz 		case B_RGB_32_BIT_TYPE:
45952a38012Sejakowatz 		{
46052a38012Sejakowatz 			field_type = "B_RGB_32_BIT_TYPE";
46152a38012Sejakowatz 			break;
46252a38012Sejakowatz 		}
46352a38012Sejakowatz 
46452a38012Sejakowatz 		case B_TIME_TYPE:
46552a38012Sejakowatz 		{
46652a38012Sejakowatz 			field_type = "B_TIME_TYPE";
46752a38012Sejakowatz 			break;
46852a38012Sejakowatz 		}
46952a38012Sejakowatz 
47052a38012Sejakowatz 		case B_MEDIA_PARAMETER_TYPE:
47152a38012Sejakowatz 		{
47252a38012Sejakowatz 			field_type = "B_MEDIA_PARAMETER_TYPE";
47352a38012Sejakowatz 			break;
47452a38012Sejakowatz 		}
47552a38012Sejakowatz 
47652a38012Sejakowatz 		case B_MEDIA_PARAMETER_WEB_TYPE:
47752a38012Sejakowatz 		{
47852a38012Sejakowatz 			field_type = "B_MEDIA_PARAMETER_WEB_TYPE";
47952a38012Sejakowatz 			break;
48052a38012Sejakowatz 		}
48152a38012Sejakowatz 
48252a38012Sejakowatz 		case B_MEDIA_PARAMETER_GROUP_TYPE:
48352a38012Sejakowatz 		{
48452a38012Sejakowatz 			field_type = "B_MEDIA_PARAMETER_GROUP_TYPE";
48552a38012Sejakowatz 			break;
48652a38012Sejakowatz 		}
48752a38012Sejakowatz 
48852a38012Sejakowatz 		case B_RAW_TYPE:
48952a38012Sejakowatz 		{
49052a38012Sejakowatz 			field_type = "B_RAW_TYPE";
49152a38012Sejakowatz 			break;
49252a38012Sejakowatz 		}
49352a38012Sejakowatz 
49452a38012Sejakowatz 		case B_MIME_TYPE:
49552a38012Sejakowatz 		{
49652a38012Sejakowatz 			field_type = "B_MIME_TYPE";
49752a38012Sejakowatz 			break;
49852a38012Sejakowatz 		}
49952a38012Sejakowatz 
50052a38012Sejakowatz 		case B_ANY_TYPE:
50152a38012Sejakowatz 		{
50252a38012Sejakowatz 			field_type = "B_ANY_TYPE";
50352a38012Sejakowatz 			break;
50452a38012Sejakowatz 		}
50552a38012Sejakowatz 
50652a38012Sejakowatz 		default:
50752a38012Sejakowatz 		{
50852a38012Sejakowatz 			field_type = "UNKNOWN_TYPE";
50952a38012Sejakowatz 			break;
51052a38012Sejakowatz 		}
51152a38012Sejakowatz 	}
51252a38012Sejakowatz 
51352a38012Sejakowatz     sprintf(msg_buffer,
51452a38012Sejakowatz             "    %-18s %-18s [%2d] = %s\n",
51552a38012Sejakowatz             field_type,
51652a38012Sejakowatz             fieldName,
51752a38012Sejakowatz             field_count,
51852a38012Sejakowatz             field_data.String() );
51952a38012Sejakowatz 
52052a38012Sejakowatz     m_outfile->Write(msg_buffer, strlen(msg_buffer) );
52152a38012Sejakowatz }
522