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;
+101 -128
View File
@@ -364,175 +364,148 @@ 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); item->PrintToStream();
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);
item->PrintToStream();
}
} }
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);
char buffer[1024]; } else
printf("0x%lx", what);
printf(") {\n");
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;
switch (field->type) { uint8 *pointer = fData + field->offset + field->name_length;
case B_RECT_TYPE:
print_to_stream_type<BRect>(buffer,
(BRect *)(fData + field->offset + field->name_length),
field->count, size);
break;
case B_POINT_TYPE: for (int32 j=0; j<field->count; j++) {
print_to_stream_type<BPoint>(buffer, if (field->count == 1) {
(BPoint *)(fData + field->offset + field->name_length), printf("%s %s = ", indent,
field->count, size); (char *)(fData + field->offset));
break; } else {
printf("%s %s[%ld] = ", indent,
case B_STRING_TYPE: (char *)(fData + field->offset), j);
{
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;
pointer += sizeof(ssize_t);
printf("size=%2ld, data[%ld]: ", size, i);
printf("\"%s\"\n", (char *)pointer);
pointer += size;
}
break;
} }
case B_INT8_TYPE: switch (field->type) {
print_type<int8>(buffer, "0x%hx (%d \'%.1s\')\n", case B_RECT_TYPE:
(int8 *)(fData + field->offset + field->name_length), pointer = print_to_stream_type<BRect>(pointer);
field->count, size, B_INT8_TYPE); break;
break;
case B_INT16_TYPE: case B_POINT_TYPE:
print_type<int16>(buffer, "0x%x (%d \'%.2s\')\n", pointer = print_to_stream_type<BPoint>(pointer);
(int16 *)(fData + field->offset + field->name_length), break;
field->count, size, B_INT16_TYPE);
break;
case B_INT32_TYPE: case B_STRING_TYPE: {
print_type<int32>(buffer, "0x%lx (%ld \'%.4s\')\n", ssize_t size = *(ssize_t *)pointer;
(int32 *)(fData + field->offset + field->name_length), pointer += sizeof(ssize_t);
field->count, size, B_INT32_TYPE); printf("string(\"%s\", %ld bytes)\n", (char *)pointer, size);
break; pointer += size;
break;
}
case B_INT64_TYPE: case B_INT8_TYPE:
print_type<int64>(buffer, "0x%Lx (%Ld \'%.8s\')\n", pointer = print_type<int8>("int8(0x%hx or %d or \'%.1s\')\n", pointer);
(int64 *)(fData + field->offset + field->name_length), break;
field->count, size, B_INT64_TYPE);
break;
case B_BOOL_TYPE: case B_INT16_TYPE:
print_type<int8>(buffer, NULL, pointer = print_type<int16>("int16 (0x%x or %d)\n", pointer);
(int8 *)(fData + field->offset + field->name_length), break;
field->count, size, B_BOOL_TYPE);
break;
case B_FLOAT_TYPE: case B_INT32_TYPE:
print_type<float>(buffer, "%.4f\n", pointer = print_type<int32>("int32(0x%lx or %ld)\n", pointer);
(float *)(fData + field->offset + field->name_length), break;
field->count, size, B_FLOAT_TYPE);
break;
case B_DOUBLE_TYPE: case B_INT64_TYPE:
print_type<double>(buffer, "%.8f\n", pointer = print_type<int64>("int64(0x%Lx or %Ld)\n", pointer);
(double *)(fData + field->offset + field->name_length), break;
field->count, size, B_DOUBLE_TYPE);
break;
case B_REF_TYPE: { case B_BOOL_TYPE:
printf("%s", buffer); printf("bool(%s)\n", *((bool *)pointer)!= 0 ? "true" : "false");
memset(buffer, ' ', strlen(buffer)); pointer += sizeof(bool);
break;
uint8 *pointer = fData + field->offset + field->name_length;
for (int32 i = 0; i < field->count; i++) { case B_FLOAT_TYPE:
if (i > 0) /* indent */ pointer = print_type<float>("float(%.4f)\n", pointer);
printf("%s", buffer); break;
case B_DOUBLE_TYPE:
pointer = print_type<double>("double(%.8f)\n", pointer);
break;
case B_REF_TYPE: {
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;
}
default: {
printf("(type = '%.4s')(size = %ld)\n", (char *)&value, size);
} }
break;
}
default: {
sprintf(buffer + strlen(buffer), "size=%2ld, \n", size);
printf("%s", buffer);
} }
} }
} }
} }