hope no one minds with this Dano-like version of BMessage::PrintToStream()

git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@18089 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Jérôme Duval
2006-07-10 20:00:07 +00:00
parent 11235ae729
commit 67bdea52ce
2 changed files with 102 additions and 128 deletions
+1
View File
@@ -281,6 +281,7 @@ class BMessage {
ssize_t _NativeFlattenedSize() const; ssize_t _NativeFlattenedSize() const;
status_t _NativeFlatten(char *buffer, ssize_t size) const; status_t _NativeFlatten(char *buffer, ssize_t size) const;
status_t _NativeFlatten(BDataIO *stream, ssize_t *size = NULL) const; status_t _NativeFlatten(BDataIO *stream, ssize_t *size = NULL) const;
void _PrintToStream(const char* indent) const;
private: private:
message_header* fHeader; message_header* fHeader;
+67 -94
View File
@@ -364,172 +364,145 @@ BMessage::IsReply() const
} }
template<typename Type> static void template<typename Type> static uint8 *
print_to_stream_type(char* buffer, Type* item, int32 count, print_to_stream_type(uint8* pointer)
uint32 size)
{ {
sprintf(buffer + strlen(buffer), "size=%2ld, ", size); Type *item = (Type *)pointer;
printf("%s", buffer);
memset(buffer, ' ', strlen(buffer));
for (int32 i = 0; i < count; i++, item++) {
if (i > 0) /* indent */
printf(buffer);
printf("data[%ld]: ", i);
item->PrintToStream(); item->PrintToStream();
} return (uint8 *)(item+1);
} }
template<typename Type> static void template<typename Type> static uint8 *
print_type(char* buffer, const char* format, Type* item, int32 count, print_type(const char* format, uint8* pointer)
uint32 size, type_code typeCode)
{ {
sprintf(buffer + strlen(buffer), "size=%2ld, ", size); Type *item = (Type *)pointer;
printf("%s", buffer); printf(format, *item, *item);
memset(buffer, ' ', strlen(buffer)); return (uint8 *)(item+1);
for (int32 i = 0; i < count; i++, item++) {
if (i > 0) /* indent */
printf(buffer);
printf("data[%ld]: ", i);
Type value = *item;
if (typeCode == B_BOOL_TYPE) {
printf("%s (%d)\n", value != 0 ? "true" : "false", (int8)value);
} else {
if (typeCode == B_INT8_TYPE && value < ' ')
value = ' ';
swap_data(typeCode, &value, sizeof(Type), B_SWAP_BENDIAN_TO_HOST);
printf(format, *item, *item, &value);
}
}
} }
void void
BMessage::PrintToStream() const BMessage::PrintToStream() const
{
_PrintToStream("");
printf("}\n");
}
void
BMessage::_PrintToStream(const char* indent) const
{ {
DEBUG_FUNCTION_ENTER; DEBUG_FUNCTION_ENTER;
int32 value = B_BENDIAN_TO_HOST_INT32(what); int32 value = B_BENDIAN_TO_HOST_INT32(what);
printf("BMessage: what = '%.4s' (0x%lx, or %ld)\n", printf("BMessage(");
(char *)&value, what, what); if (isprint(*(char *)&value)) {
printf("'%.4s'", (char *)&value);
} else
printf("0x%lx", what);
printf(") {\n");
char buffer[1024];
field_header *field = fFields; field_header *field = fFields;
for (int32 i = 0; i < fHeader->field_count; i++, field++) { for (int32 i = 0; i < fHeader->field_count; i++, field++) {
value = B_BENDIAN_TO_HOST_INT32(field->type); value = B_BENDIAN_TO_HOST_INT32(field->type);
sprintf(buffer, " entry %14s, type='%.4s', c=%ld, ",
(char *)(fData + field->offset), (char *)&value, field->count);
ssize_t size = 0; ssize_t size = 0;
if (field->flags & FIELD_FLAG_FIXED_SIZE) if (field->flags & FIELD_FLAG_FIXED_SIZE)
size = field->data_size / field->count; size = field->data_size / field->count;
uint8 *pointer = fData + field->offset + field->name_length;
for (int32 j=0; j<field->count; j++) {
if (field->count == 1) {
printf("%s %s = ", indent,
(char *)(fData + field->offset));
} else {
printf("%s %s[%ld] = ", indent,
(char *)(fData + field->offset), j);
}
switch (field->type) { switch (field->type) {
case B_RECT_TYPE: case B_RECT_TYPE:
print_to_stream_type<BRect>(buffer, pointer = print_to_stream_type<BRect>(pointer);
(BRect *)(fData + field->offset + field->name_length),
field->count, size);
break; break;
case B_POINT_TYPE: case B_POINT_TYPE:
print_to_stream_type<BPoint>(buffer, pointer = print_to_stream_type<BPoint>(pointer);
(BPoint *)(fData + field->offset + field->name_length),
field->count, size);
break; break;
case B_STRING_TYPE: case B_STRING_TYPE: {
{
printf("%s", buffer);
memset(buffer, ' ', strlen(buffer));
uint8 *pointer = fData + field->offset + field->name_length;
for (int32 i = 0; i < field->count; i++) {
if (i > 0) /* indent */
printf("%s", buffer);
ssize_t size = *(ssize_t *)pointer; ssize_t size = *(ssize_t *)pointer;
pointer += sizeof(ssize_t); pointer += sizeof(ssize_t);
printf("size=%2ld, data[%ld]: ", size, i); printf("string(\"%s\", %ld bytes)\n", (char *)pointer, size);
printf("\"%s\"\n", (char *)pointer);
pointer += size; pointer += size;
}
break; break;
} }
case B_INT8_TYPE: case B_INT8_TYPE:
print_type<int8>(buffer, "0x%hx (%d \'%.1s\')\n", pointer = print_type<int8>("int8(0x%hx or %d or \'%.1s\')\n", pointer);
(int8 *)(fData + field->offset + field->name_length),
field->count, size, B_INT8_TYPE);
break; break;
case B_INT16_TYPE: case B_INT16_TYPE:
print_type<int16>(buffer, "0x%x (%d \'%.2s\')\n", pointer = print_type<int16>("int16 (0x%x or %d)\n", pointer);
(int16 *)(fData + field->offset + field->name_length),
field->count, size, B_INT16_TYPE);
break; break;
case B_INT32_TYPE: case B_INT32_TYPE:
print_type<int32>(buffer, "0x%lx (%ld \'%.4s\')\n", pointer = print_type<int32>("int32(0x%lx or %ld)\n", pointer);
(int32 *)(fData + field->offset + field->name_length),
field->count, size, B_INT32_TYPE);
break; break;
case B_INT64_TYPE: case B_INT64_TYPE:
print_type<int64>(buffer, "0x%Lx (%Ld \'%.8s\')\n", pointer = print_type<int64>("int64(0x%Lx or %Ld)\n", pointer);
(int64 *)(fData + field->offset + field->name_length),
field->count, size, B_INT64_TYPE);
break; break;
case B_BOOL_TYPE: case B_BOOL_TYPE:
print_type<int8>(buffer, NULL, printf("bool(%s)\n", *((bool *)pointer)!= 0 ? "true" : "false");
(int8 *)(fData + field->offset + field->name_length), pointer += sizeof(bool);
field->count, size, B_BOOL_TYPE);
break; break;
case B_FLOAT_TYPE: case B_FLOAT_TYPE:
print_type<float>(buffer, "%.4f\n", pointer = print_type<float>("float(%.4f)\n", pointer);
(float *)(fData + field->offset + field->name_length),
field->count, size, B_FLOAT_TYPE);
break; break;
case B_DOUBLE_TYPE: case B_DOUBLE_TYPE:
print_type<double>(buffer, "%.8f\n", pointer = print_type<double>("double(%.8f)\n", pointer);
(double *)(fData + field->offset + field->name_length),
field->count, size, B_DOUBLE_TYPE);
break; break;
case B_REF_TYPE: { case B_REF_TYPE: {
printf("%s", buffer);
memset(buffer, ' ', strlen(buffer));
uint8 *pointer = fData + field->offset + field->name_length;
for (int32 i = 0; i < field->count; i++) {
if (i > 0) /* indent */
printf("%s", buffer);
ssize_t size = *(ssize_t *)pointer; ssize_t size = *(ssize_t *)pointer;
pointer += sizeof(ssize_t); pointer += sizeof(ssize_t);
entry_ref ref; entry_ref ref;
BPrivate::entry_ref_unflatten(&ref, (char *)pointer, size); BPrivate::entry_ref_unflatten(&ref, (char *)pointer, size);
printf("size=%2ld, data[%ld]: ", size, i); printf("entry_ref(device=%ld, directory=%lld, name=\"%s\", ",
printf("device=%ld, directory=%lld, name=\"%s\", ",
ref.device, ref.directory, ref.name); ref.device, ref.directory, ref.name);
BPath path(&ref); BPath path(&ref);
printf("path=\"%s\"\n", path.Path()); printf("path=\"%s\")\n", path.Path());
pointer += size; pointer += size;
break;
} }
case B_MESSAGE_TYPE:
{
char buffer[1024];
sprintf(buffer, "%s ", indent);
BMessage message;
const ssize_t size = *(const ssize_t *)pointer;
pointer += sizeof(ssize_t);
if (message.Unflatten((const char *)pointer)!=B_OK) {
fprintf(stderr, "couldn't unflatten item %ld\n", i);
break;
}
message._PrintToStream(buffer);
printf("%s }\n", indent);
pointer += size;
break; break;
} }
default: { default: {
sprintf(buffer + strlen(buffer), "size=%2ld, \n", size); printf("(type = '%.4s')(size = %ld)\n", (char *)&value, size);
printf("%s", buffer); }
} }
} }
} }