1// Sun, 18 Jun 2000
2// Y.Takagi
3
4#include <cstdio>
5#include <cstdarg>
6
7#include <Message.h>
8#include <File.h>
9#include <Directory.h>
10#include <fs_attr.h>
11
12#include "DbgMsg.h"
13
14#ifdef _DEBUG
15
16#if (!__MWERKS__ || defined(MSIPL_USING_NAMESPACE))
17using namespace std;
18#else
19#define std
20#endif
21
22void write_debug_stream(const char *format, ...)
23{
24	va_list	ap;
25	va_start(ap, format);
26	FILE *f = fopen("/boot/home/transport.log", "aw+");
27	vfprintf(f, format, ap);
28	fclose(f);
29	va_end(ap);
30}
31
32
33void DUMP_BFILE(BFile *in, const char *path)
34{
35	off_t size;
36	if (B_NO_ERROR == in->GetSize(&size)) {
37		uchar *buffer = new uchar[size];
38		in->Read(buffer, size);
39		BFile out(path, B_WRITE_ONLY | B_CREATE_FILE);
40		out.Write(buffer, size);
41		in->Seek(0, SEEK_SET);
42		delete [] buffer;
43	}
44}
45
46
47void DUMP_BMESSAGE(BMessage *msg)
48{
49	uint32 i;
50	int32 j;
51	char *name  = "";
52	uint32 type = 0;
53	int32 count = 0;
54
55	DBGMSG(("\t************ START - DUMP BMessage ***********\n"));
56	DBGMSG(("\taddress: 0x%x\n", (int)msg));
57	if (!msg)
58		return;
59
60#if (!__MWERKS__)
61	DBGMSG(("\tmsg->what: %c%c%c%c\n",
62		*((char *)&msg->what + 3),
63		*((char *)&msg->what + 2),
64		*((char *)&msg->what + 1),
65		*((char *)&msg->what + 0)));
66#else
67	DBGMSG(("\tmsg->what: %c%c%c%c\n",
68		*((char *)&msg->what + 0),
69		*((char *)&msg->what + 1),
70		*((char *)&msg->what + 2),
71		*((char *)&msg->what + 3)));
72#endif
73
74	for (i= 0; msg->GetInfo(B_ANY_TYPE, i, &name, &type, &count) == B_OK; i++) {
75		switch (type) {
76		case B_BOOL_TYPE:
77			for (j = 0; j < count; j++) {
78				bool aBool;
79				aBool = msg->FindBool(name, j);
80				DBGMSG(("\t%s, B_BOOL_TYPE[%d]: %s\n",
81					name, j, aBool ? "true" : "false"));
82			}
83			break;
84
85		case B_INT8_TYPE:
86			for (j = 0; j < count; j++) {
87				int8 anInt8;
88				msg->FindInt8(name, j, &anInt8);
89				DBGMSG(("\t%s, B_INT8_TYPE[%d]: %d\n", name, j, (int)anInt8));
90			}
91			break;
92
93		case B_INT16_TYPE:
94			for (j = 0; j < count; j++) {
95				int16 anInt16;
96				msg->FindInt16(name, j, &anInt16);
97				DBGMSG(("\t%s, B_INT16_TYPE[%d]: %d\n", name, j, (int)anInt16));
98			}
99			break;
100
101		case B_INT32_TYPE:
102			for (j = 0; j < count; j++) {
103				int32 anInt32;
104				msg->FindInt32(name, j, &anInt32);
105				DBGMSG(("\t%s, B_INT32_TYPE[%d]: %d\n", name, j, (int)anInt32));
106			}
107			break;
108
109		case B_INT64_TYPE:
110			for (j = 0; j < count; j++) {
111				int64 anInt64;
112				msg->FindInt64(name, j, &anInt64);
113				DBGMSG(("\t%s, B_INT64_TYPE[%d]: %d\n", name, j, (int)anInt64));
114			}
115			break;
116
117		case B_FLOAT_TYPE:
118			for (j = 0; j < count; j++) {
119				float aFloat;
120				msg->FindFloat(name, j, &aFloat);
121				DBGMSG(("\t%s, B_FLOAT_TYPE[%d]: %f\n", name, j, aFloat));
122			}
123			break;
124
125		case B_DOUBLE_TYPE:
126			for (j = 0; j < count; j++) {
127				double aDouble;
128				msg->FindDouble(name, j, &aDouble);
129				DBGMSG(("\t%s, B_DOUBLE_TYPE[%d]: %f\n", name, j, (float)aDouble));
130			}
131			break;
132
133		case B_STRING_TYPE:
134			for (j = 0; j < count; j++) {
135				const char *string;
136				msg->FindString(name, j, &string);
137				DBGMSG(("\t%s, B_STRING_TYPE[%d]: %s\n", name, j, string));
138			}
139			break;
140
141		case B_POINT_TYPE:
142			for (j = 0; j < count; j++) {
143				BPoint aPoint;
144				msg->FindPoint(name, j, &aPoint);
145				DBGMSG(("\t%s, B_POINT_TYPE[%d]: %f, %f\n",
146					name, j, aPoint.x, aPoint.y));
147			}
148			break;
149
150		case B_RECT_TYPE:
151			for (j = 0; j < count; j++) {
152				BRect aRect;
153				msg->FindRect(name, j, &aRect);
154				DBGMSG(("\t%s, B_RECT_TYPE[%d]: %f, %f, %f, %f\n",
155					name, j, aRect.left, aRect.top, aRect.right, aRect.bottom));
156			}
157			break;
158
159		case B_REF_TYPE:
160		case B_MESSAGE_TYPE:
161		case B_MESSENGER_TYPE:
162		case B_POINTER_TYPE:
163			DBGMSG(("\t%s, 0x%x, count: %d\n",
164				name ? name : "(null)", type, count));
165			break;
166		default:
167			DBGMSG(("\t%s, 0x%x, count: %d\n",
168				name ? name : "(null)", type, count));
169			break;
170		}
171
172		name  = "";
173		type  = 0;
174		count = 0;
175	}
176	DBGMSG(("\t************ END - DUMP BMessage ***********\n"));
177}
178
179#define PD_DRIVER_NAME		"Driver Name"
180#define PD_PRINTER_NAME		"Printer Name"
181#define PD_COMMENTS			"Comments"
182
183void DUMP_BDIRECTORY(BDirectory *dir)
184{
185	char buffer1[256];
186	char buffer2[256];
187	attr_info info;
188	int32 i;
189	float f;
190	BRect rc;
191	bool b;
192
193	DBGMSG(("\t************ STRAT - DUMP BDirectory ***********\n"));
194
195	dir->RewindAttrs();
196	while (dir->GetNextAttrName(buffer1) == B_NO_ERROR) {
197		dir->GetAttrInfo(buffer1, &info);
198		switch (info.type) {
199		case B_ASCII_TYPE:
200			dir->ReadAttr(buffer1, info.type, 0, buffer2, sizeof(buffer2));
201			DBGMSG(("\t%s, B_ASCII_TYPE: %s\n", buffer1, buffer2));
202			break;
203		case B_STRING_TYPE:
204			dir->ReadAttr(buffer1, info.type, 0, buffer2, sizeof(buffer2));
205			DBGMSG(("\t%s, B_STRING_TYPE: %s\n", buffer1, buffer2));
206			break;
207		case B_INT32_TYPE:
208			dir->ReadAttr(buffer1, info.type, 0, &i, sizeof(i));
209			DBGMSG(("\t%s, B_INT32_TYPE: %d\n", buffer1, i));
210			break;
211		case B_FLOAT_TYPE:
212			dir->ReadAttr(buffer1, info.type, 0, &f, sizeof(f));
213			DBGMSG(("\t%s, B_FLOAT_TYPE: %f\n", buffer1, f));
214			break;
215		case B_RECT_TYPE:
216			dir->ReadAttr(buffer1, info.type, 0, &rc, sizeof(rc));
217			DBGMSG(("\t%s, B_RECT_TYPE: %f, %f, %f, %f\n", buffer1, rc.left, rc.top, rc.right, rc.bottom));
218			break;
219		case B_BOOL_TYPE:
220			dir->ReadAttr(buffer1, info.type, 0, &b, sizeof(b));
221			DBGMSG(("\t%s, B_BOOL_TYPE: %d\n", buffer1, (int)b));
222			break;
223		default:
224			DBGMSG(("\t%s, %c%c%c%c\n",
225				buffer1,
226				*((char *)&info.type + 3),
227				*((char *)&info.type + 2),
228				*((char *)&info.type + 1),
229				*((char *)&info.type + 0)));
230			break;
231		}
232	}
233
234	DBGMSG(("\t************ END - DUMP BDirectory ***********\n"));
235}
236
237#endif	/* _DEBUG */
238