diff --git a/libfwupdplugin/fu-chunk-private.h b/libfwupdplugin/fu-chunk-private.h new file mode 100644 index 000000000..2002cc63e --- /dev/null +++ b/libfwupdplugin/fu-chunk-private.h @@ -0,0 +1,13 @@ +/* + * Copyright (C) 2017 Richard Hughes + * + * SPDX-License-Identifier: LGPL-2.1+ + */ + +#pragma once + +#include "fu-chunk.h" + +void fu_chunk_add_string (FuChunk *self, + guint idt, + GString *str); diff --git a/libfwupdplugin/fu-chunk.c b/libfwupdplugin/fu-chunk.c index 15125eb03..f813ec165 100644 --- a/libfwupdplugin/fu-chunk.c +++ b/libfwupdplugin/fu-chunk.c @@ -10,7 +10,7 @@ #include -#include "fu-chunk.h" +#include "fu-chunk-private.h" #include "fu-common.h" /** @@ -285,6 +285,22 @@ fu_chunk_bytes_new (GBytes *bytes) return self; } +void +fu_chunk_add_string (FuChunk *self, guint idt, GString *str) +{ + fu_common_string_append_kv (str, idt, G_OBJECT_TYPE_NAME (self), NULL); + fu_common_string_append_kx (str, idt + 1, "Index", self->idx); + fu_common_string_append_kx (str, idt + 1, "Page", self->page); + fu_common_string_append_kx (str, idt + 1, "Address", self->address); + if (self->data != NULL) { + g_autofree gchar *datastr = NULL; + datastr = fu_common_strsafe ((const gchar *) self->data, MIN (self->data_sz, 16)); + if (datastr != NULL) + fu_common_string_append_kv (str, idt + 1, "Data", datastr); + } + fu_common_string_append_kx (str, idt + 1, "DataSz", self->data_sz); +} + /** * fu_chunk_to_string: * @self: a #FuChunk @@ -298,22 +314,9 @@ fu_chunk_bytes_new (GBytes *bytes) gchar * fu_chunk_to_string (FuChunk *self) { - g_autoptr(GString) str = g_string_new (NULL); - if (self->data != NULL) { - for (guint32 i = 0; i < self->data_sz; i++) { - gchar tmp = (gchar) self->data[i]; - if (tmp == 0x00) - break; - g_string_append_c (str, g_ascii_isalnum (tmp) ? tmp : '?'); - } - } - return g_strdup_printf ("#%02" G_GUINT32_FORMAT ": page:%02x " - "addr:%04x len:%02" G_GUINT32_FORMAT " %s", - self->idx, - (guint) self->page, - (guint) self->address, - self->data_sz, - str->str); + GString *str = g_string_new (NULL); + fu_chunk_add_string (self, 0, str); + return g_string_free (str, FALSE); } /** @@ -335,6 +338,8 @@ fu_chunk_array_to_string (GPtrArray *chunks) g_autofree gchar *tmp = fu_chunk_to_string (chk); g_string_append_printf (str, "%s\n", tmp); } + if (str->len > 0) + g_string_truncate (str, str->len - 1); return g_string_free (str, FALSE); } diff --git a/libfwupdplugin/fu-self-test.c b/libfwupdplugin/fu-self-test.c index 59a22d37e..9f6bb138c 100644 --- a/libfwupdplugin/fu-self-test.c +++ b/libfwupdplugin/fu-self-test.c @@ -1309,34 +1309,117 @@ fu_chunk_func (void) chunked3 = fu_chunk_array_new ((const guint8 *) "123456", 6, 0x0, 3, 3); chunked3_str = fu_chunk_array_to_string (chunked3); - g_print ("\n%s", chunked3_str); - g_assert_cmpstr (chunked3_str, ==, "#00: page:00 addr:0000 len:03 123\n" - "#01: page:01 addr:0000 len:03 456\n"); + g_assert_cmpstr (chunked3_str, ==, "FuChunk:\n" + " Index: 0x0\n" + " Page: 0x0\n" + " Address: 0x0\n" + " Data: 123\n" + " DataSz: 0x3\n" + "\n" + "FuChunk:\n" + " Index: 0x1\n" + " Page: 0x1\n" + " Address: 0x0\n" + " Data: 456\n" + " DataSz: 0x3\n"); chunked4 = fu_chunk_array_new ((const guint8 *) "123456", 6, 0x4, 4, 4); chunked4_str = fu_chunk_array_to_string (chunked4); - g_print ("\n%s", chunked4_str); - g_assert_cmpstr (chunked4_str, ==, "#00: page:01 addr:0000 len:04 1234\n" - "#01: page:02 addr:0000 len:02 56\n"); + g_assert_cmpstr (chunked4_str, ==, "FuChunk:\n" + " Index: 0x0\n" + " Page: 0x1\n" + " Address: 0x0\n" + " Data: 1234\n" + " DataSz: 0x4\n" + "\n" + "FuChunk:\n" + " Index: 0x1\n" + " Page: 0x2\n" + " Address: 0x0\n" + " Data: 56\n" + " DataSz: 0x2\n"); chunked1 = fu_chunk_array_new ((const guint8 *) "0123456789abcdef", 16, 0x0, 10, 4); chunked1_str = fu_chunk_array_to_string (chunked1); - g_print ("\n%s", chunked1_str); - g_assert_cmpstr (chunked1_str, ==, "#00: page:00 addr:0000 len:04 0123\n" - "#01: page:00 addr:0004 len:04 4567\n" - "#02: page:00 addr:0008 len:02 89\n" - "#03: page:01 addr:0000 len:04 abcd\n" - "#04: page:01 addr:0004 len:02 ef\n"); + g_assert_cmpstr (chunked1_str, ==, "FuChunk:\n" + " Index: 0x0\n" + " Page: 0x0\n" + " Address: 0x0\n" + " Data: 0123\n" + " DataSz: 0x4\n" + "\n" + "FuChunk:\n" + " Index: 0x1\n" + " Page: 0x0\n" + " Address: 0x4\n" + " Data: 4567\n" + " DataSz: 0x4\n" + "\n" + "FuChunk:\n" + " Index: 0x2\n" + " Page: 0x0\n" + " Address: 0x8\n" + " Data: 89\n" + " DataSz: 0x2\n" + "\n" + "FuChunk:\n" + " Index: 0x3\n" + " Page: 0x1\n" + " Address: 0x0\n" + " Data: abcd\n" + " DataSz: 0x4\n" + "\n" + "FuChunk:\n" + " Index: 0x4\n" + " Page: 0x1\n" + " Address: 0x4\n" + " Data: ef\n" + " DataSz: 0x2\n"); chunked2 = fu_chunk_array_new ((const guint8 *) "XXXXXXYYYYYYZZZZZZ", 18, 0x0, 6, 4); chunked2_str = fu_chunk_array_to_string (chunked2); g_print ("\n%s", chunked2_str); - g_assert_cmpstr (chunked2_str, ==, "#00: page:00 addr:0000 len:04 XXXX\n" - "#01: page:00 addr:0004 len:02 XX\n" - "#02: page:01 addr:0000 len:04 YYYY\n" - "#03: page:01 addr:0004 len:02 YY\n" - "#04: page:02 addr:0000 len:04 ZZZZ\n" - "#05: page:02 addr:0004 len:02 ZZ\n"); + g_assert_cmpstr (chunked2_str, ==, "FuChunk:\n" + " Index: 0x0\n" + " Page: 0x0\n" + " Address: 0x0\n" + " Data: XXXX\n" + " DataSz: 0x4\n" + "\n" + "FuChunk:\n" + " Index: 0x1\n" + " Page: 0x0\n" + " Address: 0x4\n" + " Data: XX\n" + " DataSz: 0x2\n" + "\n" + "FuChunk:\n" + " Index: 0x2\n" + " Page: 0x1\n" + " Address: 0x0\n" + " Data: YYYY\n" + " DataSz: 0x4\n" + "\n" + "FuChunk:\n" + " Index: 0x3\n" + " Page: 0x1\n" + " Address: 0x4\n" + " Data: YY\n" + " DataSz: 0x2\n" + "\n" + "FuChunk:\n" + " Index: 0x4\n" + " Page: 0x2\n" + " Address: 0x0\n" + " Data: ZZZZ\n" + " DataSz: 0x4\n" + "\n" + "FuChunk:\n" + " Index: 0x5\n" + " Page: 0x2\n" + " Address: 0x4\n" + " Data: ZZ\n" + " DataSz: 0x2\n"); } static void