Merge pull request #84 from monich/pad
Add readers and writers for int8 and int16
This commit is contained in:
@@ -65,6 +65,26 @@ gbinder_reader_read_bool(
|
||||
GBinderReader* reader,
|
||||
gboolean* value);
|
||||
|
||||
gboolean
|
||||
gbinder_reader_read_int8(
|
||||
GBinderReader* reader,
|
||||
gint8* value); /* Since 1.1.15 */
|
||||
|
||||
gboolean
|
||||
gbinder_reader_read_uint8(
|
||||
GBinderReader* reader,
|
||||
guint8* value); /* Since 1.1.15 */
|
||||
|
||||
gboolean
|
||||
gbinder_reader_read_int16(
|
||||
GBinderReader* reader,
|
||||
gint16* value); /* Since 1.1.15 */
|
||||
|
||||
gboolean
|
||||
gbinder_reader_read_uint16(
|
||||
GBinderReader* reader,
|
||||
guint16* value); /* Since 1.1.15 */
|
||||
|
||||
gboolean
|
||||
gbinder_reader_read_int32(
|
||||
GBinderReader* reader,
|
||||
|
||||
@@ -55,6 +55,16 @@ struct gbinder_parent {
|
||||
guint32 offset;
|
||||
};
|
||||
|
||||
void
|
||||
gbinder_writer_append_int8(
|
||||
GBinderWriter* writer,
|
||||
guint8 value); /* Since 1.1.15 */
|
||||
|
||||
void
|
||||
gbinder_writer_append_int16(
|
||||
GBinderWriter* writer,
|
||||
guint16 value); /* Since 1.1.15 */
|
||||
|
||||
void
|
||||
gbinder_writer_append_int32(
|
||||
GBinderWriter* writer,
|
||||
|
||||
@@ -138,6 +138,62 @@ gbinder_reader_read_bool(
|
||||
}
|
||||
}
|
||||
|
||||
gboolean
|
||||
gbinder_reader_read_int8(
|
||||
GBinderReader* reader,
|
||||
gint8* value) /* Since 1.1.15 */
|
||||
{
|
||||
return gbinder_reader_read_uint8(reader, (guint8*)value);
|
||||
}
|
||||
|
||||
gboolean
|
||||
gbinder_reader_read_uint8(
|
||||
GBinderReader* reader,
|
||||
guint8* value) /* Since 1.1.15 */
|
||||
{
|
||||
/* Primitive values are supposed to be padded to 4-byte boundary */
|
||||
if (value) {
|
||||
guint32 padded;
|
||||
|
||||
if (gbinder_reader_read_uint32(reader, &padded)) {
|
||||
*value = (guint8)padded;
|
||||
return TRUE;
|
||||
} else {
|
||||
return FALSE;
|
||||
}
|
||||
} else {
|
||||
return gbinder_reader_read_uint32(reader, NULL);
|
||||
}
|
||||
}
|
||||
|
||||
gboolean
|
||||
gbinder_reader_read_int16(
|
||||
GBinderReader* reader,
|
||||
gint16* value) /* Since 1.1.15 */
|
||||
{
|
||||
return gbinder_reader_read_uint16(reader, (guint16*)value);
|
||||
}
|
||||
|
||||
gboolean
|
||||
gbinder_reader_read_uint16(
|
||||
GBinderReader* reader,
|
||||
guint16* value) /* Since 1.1.15 */
|
||||
{
|
||||
/* Primitive values are supposed to be padded to 4-byte boundary */
|
||||
if (value) {
|
||||
guint32 padded;
|
||||
|
||||
if (gbinder_reader_read_uint32(reader, &padded)) {
|
||||
*value = (guint16)padded;
|
||||
return TRUE;
|
||||
} else {
|
||||
return FALSE;
|
||||
}
|
||||
} else {
|
||||
return gbinder_reader_read_uint32(reader, NULL);
|
||||
}
|
||||
}
|
||||
|
||||
gboolean
|
||||
gbinder_reader_read_int32(
|
||||
GBinderReader* reader,
|
||||
|
||||
@@ -213,12 +213,34 @@ gbinder_writer_data_append_bool(
|
||||
GBinderWriterData* data,
|
||||
gboolean value)
|
||||
{
|
||||
guint8 padded[4];
|
||||
/* Primitive values are padded to 4-byte boundary */
|
||||
gbinder_writer_data_append_int32(data, value != FALSE);
|
||||
}
|
||||
|
||||
/* Boolean values are padded to 4-byte boundary */
|
||||
padded[0] = (value != FALSE);
|
||||
padded[1] = padded[2] = padded[3] = 0;
|
||||
g_byte_array_append(data->bytes, padded, sizeof(padded));
|
||||
void
|
||||
gbinder_writer_append_int8(
|
||||
GBinderWriter* self,
|
||||
guint8 value) /* Since 1.1.15 */
|
||||
{
|
||||
GBinderWriterData* data = gbinder_writer_data(self);
|
||||
|
||||
if (G_LIKELY(data)) {
|
||||
/* Primitive values are padded to 4-byte boundary */
|
||||
gbinder_writer_data_append_int32(data, value);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
gbinder_writer_append_int16(
|
||||
GBinderWriter* self,
|
||||
guint16 value) /* Since 1.1.15 */
|
||||
{
|
||||
GBinderWriterData* data = gbinder_writer_data(self);
|
||||
|
||||
if (G_LIKELY(data)) {
|
||||
/* Primitive values are padded to 4-byte boundary */
|
||||
gbinder_writer_data_append_int32(data, value);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
@@ -661,24 +683,21 @@ gbinder_writer_data_append_fds(
|
||||
const GBinderFds *fds,
|
||||
const GBinderParent* parent)
|
||||
{
|
||||
/* If the pointer is null only write zero size */
|
||||
if (!fds) {
|
||||
if (fds) {
|
||||
/* Size, fds data buffer and fd_array_object */
|
||||
const gsize fds_total = sizeof(GBinderFds) +
|
||||
sizeof(int) * (fds->num_fds + fds->num_ints);
|
||||
GBinderParent fds_parent;
|
||||
|
||||
gbinder_writer_data_append_int64(data, fds_total);
|
||||
fds_parent.index = gbinder_writer_data_append_buffer_object(data,
|
||||
fds, fds_total, parent);
|
||||
fds_parent.offset = sizeof(GBinderFds);
|
||||
gbinder_writer_data_append_fda_object(data, fds, &fds_parent);
|
||||
} else {
|
||||
/* If the pointer is null only write zero size */
|
||||
gbinder_writer_data_append_int64(data, 0);
|
||||
return;
|
||||
}
|
||||
|
||||
/* Write the fds information: size, fds data buffer and fd_array_object */
|
||||
const gsize fds_total = sizeof(GBinderFds) +
|
||||
sizeof(int) * (fds->num_fds + fds->num_ints);
|
||||
GBinderParent fds_parent;
|
||||
|
||||
gbinder_writer_data_append_int64(data, fds_total);
|
||||
|
||||
fds_parent.index = gbinder_writer_data_append_buffer_object(data,
|
||||
fds, fds_total, parent);
|
||||
fds_parent.offset = sizeof(GBinderFds);
|
||||
|
||||
gbinder_writer_data_append_fda_object(data, fds, &fds_parent);
|
||||
}
|
||||
|
||||
guint
|
||||
@@ -1017,6 +1036,7 @@ gbinder_writer_data_append_fmq_descriptor(
|
||||
const gsize fds_total = sizeof(GBinderFds) +
|
||||
sizeof(int) * (desc->data.fds->num_fds + desc->data.fds->num_ints);
|
||||
GBinderFds* fds = gutil_memdup(desc->data.fds, fds_total);
|
||||
|
||||
mqdesc->data.fds = fds;
|
||||
data->cleanup = gbinder_cleanup_add(data->cleanup, g_free, fds);
|
||||
|
||||
|
||||
@@ -80,6 +80,10 @@ test_run_in_context(
|
||||
/* Helper macros */
|
||||
|
||||
#if G_BYTE_ORDER == G_LITTLE_ENDIAN
|
||||
# define TEST_INT8_BYTES_4(v) \
|
||||
(guint8)(v), 0, 0, 0
|
||||
# define TEST_INT16_BYTES_4(v) \
|
||||
(guint8)(v), (guint8)((v) >> 8), 0, 0
|
||||
# define TEST_INT16_BYTES(v) \
|
||||
(guint8)(v), (guint8)((v) >> 8)
|
||||
# define TEST_INT32_BYTES(v) \
|
||||
@@ -91,6 +95,10 @@ test_run_in_context(
|
||||
(guint8)(((guint64)(v)) >> 32), (guint8)(((guint64)(v)) >> 40), \
|
||||
(guint8)(((guint64)(v)) >> 48), (guint8)(((guint64)(v)) >> 56)
|
||||
#elif G_BYTE_ORDER == G_BIG_ENDIAN
|
||||
# define TEST_INT8_BYTES_4(v) \
|
||||
0, 0, 0, (guint8)(v)
|
||||
# define TEST_INT16_BYTES_4(v) \
|
||||
0, 0, (guint8)((v) >> 8), (guint8)(v)
|
||||
# define TEST_INT16_BYTES(v) \
|
||||
(guint8)((v) >> 8), (guint8)(v)
|
||||
# define TEST_INT32_BYTES(v) \
|
||||
|
||||
@@ -108,6 +108,8 @@ test_empty(
|
||||
g_assert(!gbinder_reader_bytes_remaining(&reader));
|
||||
g_assert(!gbinder_reader_read_byte(&reader, NULL));
|
||||
g_assert(!gbinder_reader_read_bool(&reader, NULL));
|
||||
g_assert(!gbinder_reader_read_int8(&reader, NULL));
|
||||
g_assert(!gbinder_reader_read_int16(&reader, NULL));
|
||||
g_assert(!gbinder_reader_read_int32(&reader, NULL));
|
||||
g_assert(!gbinder_reader_read_uint32(&reader, NULL));
|
||||
g_assert(!gbinder_reader_read_int64(&reader, NULL));
|
||||
@@ -176,8 +178,8 @@ void
|
||||
test_bool(
|
||||
void)
|
||||
{
|
||||
const guint8 in_true[4] = { 0x01, 0xff, 0xff, 0xff };
|
||||
const guint8 in_false[4] = { 0x00, 0xff, 0xff, 0xff };
|
||||
const guint8 in_true[] = { TEST_INT8_BYTES_4(TRUE) };
|
||||
const guint8 in_false[] = { TEST_INT8_BYTES_4(FALSE) };
|
||||
gboolean out = FALSE;
|
||||
GBinderDriver* driver = gbinder_driver_new(GBINDER_DEFAULT_BINDER, NULL);
|
||||
GBinderReader reader;
|
||||
@@ -216,6 +218,108 @@ test_bool(
|
||||
gbinder_driver_unref(driver);
|
||||
}
|
||||
|
||||
/*==========================================================================*
|
||||
* int8
|
||||
*==========================================================================*/
|
||||
|
||||
static
|
||||
void
|
||||
test_int8(
|
||||
void)
|
||||
{
|
||||
const guint8 in = 42;
|
||||
const guint8 in4[] = { TEST_INT8_BYTES_4(42) };
|
||||
guint8 out1 = 0;
|
||||
gint8 out2 = 0;
|
||||
GBinderDriver* driver = gbinder_driver_new(GBINDER_DEFAULT_BINDER, NULL);
|
||||
GBinderReader reader;
|
||||
GBinderReaderData data;
|
||||
|
||||
g_assert(driver);
|
||||
memset(&data, 0, sizeof(data));
|
||||
|
||||
/* Not enough data */
|
||||
data.buffer = gbinder_buffer_new(driver, g_memdup(&in, sizeof(in)),
|
||||
sizeof(in), NULL);
|
||||
|
||||
gbinder_reader_init(&reader, &data, 0, sizeof(in));
|
||||
g_assert(!gbinder_reader_read_uint8(&reader, &out1));
|
||||
g_assert(!gbinder_reader_at_end(&reader));
|
||||
gbinder_buffer_free(data.buffer);
|
||||
|
||||
/* Enough data */
|
||||
data.buffer = gbinder_buffer_new(driver, g_memdup(in4, sizeof(in4)),
|
||||
sizeof(in4), NULL);
|
||||
|
||||
gbinder_reader_init(&reader, &data, 0, sizeof(in4));
|
||||
g_assert(gbinder_reader_read_uint8(&reader, &out1));
|
||||
g_assert(gbinder_reader_at_end(&reader));
|
||||
g_assert_cmpuint(in, == ,out1);
|
||||
|
||||
gbinder_reader_init(&reader, &data, 0, sizeof(in4));
|
||||
g_assert(gbinder_reader_read_int8(&reader, &out2));
|
||||
g_assert(gbinder_reader_at_end(&reader));
|
||||
g_assert_cmpint(in, == ,out2);
|
||||
|
||||
gbinder_reader_init(&reader, &data, 0, sizeof(in4));
|
||||
g_assert(gbinder_reader_read_int8(&reader, NULL));
|
||||
g_assert(gbinder_reader_at_end(&reader));
|
||||
|
||||
gbinder_buffer_free(data.buffer);
|
||||
gbinder_driver_unref(driver);
|
||||
}
|
||||
|
||||
/*==========================================================================*
|
||||
* int16
|
||||
*==========================================================================*/
|
||||
|
||||
static
|
||||
void
|
||||
test_int16(
|
||||
void)
|
||||
{
|
||||
const guint16 in = 42;
|
||||
const guint8 in4[] = { TEST_INT16_BYTES_4(42) };
|
||||
guint16 out1 = 0;
|
||||
gint16 out2 = 0;
|
||||
GBinderDriver* driver = gbinder_driver_new(GBINDER_DEFAULT_BINDER, NULL);
|
||||
GBinderReader reader;
|
||||
GBinderReaderData data;
|
||||
|
||||
g_assert(driver);
|
||||
memset(&data, 0, sizeof(data));
|
||||
|
||||
/* Not enough data */
|
||||
data.buffer = gbinder_buffer_new(driver, g_memdup(&in, sizeof(in)),
|
||||
sizeof(in), NULL);
|
||||
|
||||
gbinder_reader_init(&reader, &data, 0, sizeof(in));
|
||||
g_assert(!gbinder_reader_read_uint16(&reader, &out1));
|
||||
g_assert(!gbinder_reader_at_end(&reader));
|
||||
gbinder_buffer_free(data.buffer);
|
||||
|
||||
/* Enough data */
|
||||
data.buffer = gbinder_buffer_new(driver, g_memdup(in4, sizeof(in4)),
|
||||
sizeof(in4), NULL);
|
||||
|
||||
gbinder_reader_init(&reader, &data, 0, sizeof(in4));
|
||||
g_assert(gbinder_reader_read_uint16(&reader, &out1));
|
||||
g_assert(gbinder_reader_at_end(&reader));
|
||||
g_assert_cmpuint(in, == ,out1);
|
||||
|
||||
gbinder_reader_init(&reader, &data, 0, sizeof(in4));
|
||||
g_assert(gbinder_reader_read_int16(&reader, &out2));
|
||||
g_assert(gbinder_reader_at_end(&reader));
|
||||
g_assert_cmpint(in, == ,out2);
|
||||
|
||||
gbinder_reader_init(&reader, &data, 0, sizeof(in4));
|
||||
g_assert(gbinder_reader_read_int16(&reader, NULL));
|
||||
g_assert(gbinder_reader_at_end(&reader));
|
||||
|
||||
gbinder_buffer_free(data.buffer);
|
||||
gbinder_driver_unref(driver);
|
||||
}
|
||||
|
||||
/*==========================================================================*
|
||||
* int32
|
||||
*==========================================================================*/
|
||||
@@ -2199,6 +2303,8 @@ int main(int argc, char* argv[])
|
||||
g_test_add_func(TEST_("empty"), test_empty);
|
||||
g_test_add_func(TEST_("byte"), test_byte);
|
||||
g_test_add_func(TEST_("bool"), test_bool);
|
||||
g_test_add_func(TEST_("int8"), test_int8);
|
||||
g_test_add_func(TEST_("int16"), test_int16);
|
||||
g_test_add_func(TEST_("int32"), test_int32);
|
||||
g_test_add_func(TEST_("int64"), test_int64);
|
||||
g_test_add_func(TEST_("float"), test_float);
|
||||
|
||||
@@ -64,6 +64,10 @@ test_null(
|
||||
gsize size = 1;
|
||||
|
||||
gbinder_local_request_init_writer(NULL, &writer);
|
||||
gbinder_writer_append_int8(NULL, 0);
|
||||
gbinder_writer_append_int8(&writer, 0);
|
||||
gbinder_writer_append_int16(NULL, 0);
|
||||
gbinder_writer_append_int16(&writer, 0);
|
||||
gbinder_writer_append_int32(NULL, 0);
|
||||
gbinder_writer_append_int32(&writer, 0);
|
||||
gbinder_writer_append_int64(NULL, 0);
|
||||
@@ -164,6 +168,60 @@ test_cleanup(
|
||||
g_assert_cmpint(cleanup_count, == ,2);
|
||||
}
|
||||
|
||||
/*==========================================================================*
|
||||
* int8
|
||||
*==========================================================================*/
|
||||
|
||||
static
|
||||
void
|
||||
test_int8(
|
||||
void)
|
||||
{
|
||||
const char encoded[] = {
|
||||
TEST_INT8_BYTES_4(0x80)
|
||||
};
|
||||
GBinderLocalRequest* req = gbinder_local_request_new(&gbinder_io_32, NULL);
|
||||
GBinderOutputData* data;
|
||||
GBinderWriter writer;
|
||||
|
||||
gbinder_local_request_init_writer(req, &writer);
|
||||
gbinder_writer_append_int8(&writer, 0x80);
|
||||
|
||||
data = gbinder_local_request_data(req);
|
||||
g_assert(!gbinder_output_data_offsets(data));
|
||||
g_assert(!gbinder_output_data_buffers_size(data));
|
||||
g_assert_cmpuint(data->bytes->len, == ,sizeof(encoded));
|
||||
g_assert(!memcmp(data->bytes->data, encoded, data->bytes->len));
|
||||
gbinder_local_request_unref(req);
|
||||
}
|
||||
|
||||
/*==========================================================================*
|
||||
* int16
|
||||
*==========================================================================*/
|
||||
|
||||
static
|
||||
void
|
||||
test_int16(
|
||||
void)
|
||||
{
|
||||
const char encoded[] = {
|
||||
TEST_INT16_BYTES_4(0x80ff)
|
||||
};
|
||||
GBinderLocalRequest* req = gbinder_local_request_new(&gbinder_io_32, NULL);
|
||||
GBinderOutputData* data;
|
||||
GBinderWriter writer;
|
||||
|
||||
gbinder_local_request_init_writer(req, &writer);
|
||||
gbinder_writer_append_int16(&writer, 0x80ff);
|
||||
|
||||
data = gbinder_local_request_data(req);
|
||||
g_assert(!gbinder_output_data_offsets(data));
|
||||
g_assert(!gbinder_output_data_buffers_size(data));
|
||||
g_assert_cmpuint(data->bytes->len, == ,sizeof(encoded));
|
||||
g_assert(!memcmp(data->bytes->data, encoded, data->bytes->len));
|
||||
gbinder_local_request_unref(req);
|
||||
}
|
||||
|
||||
/*==========================================================================*
|
||||
* int32
|
||||
*==========================================================================*/
|
||||
@@ -283,9 +341,9 @@ test_bool(
|
||||
void)
|
||||
{
|
||||
const char encoded[] = {
|
||||
0x00, 0x00, 0x00, 0x00,
|
||||
0x01, 0x00, 0x00, 0x00,
|
||||
0x01, 0x00, 0x00, 0x00
|
||||
TEST_INT8_BYTES_4(0),
|
||||
TEST_INT8_BYTES_4(1),
|
||||
TEST_INT8_BYTES_4(1)
|
||||
};
|
||||
GBinderLocalRequest* req = gbinder_local_request_new(&gbinder_io_32, NULL);
|
||||
GBinderOutputData* data;
|
||||
@@ -1063,6 +1121,8 @@ int main(int argc, char* argv[])
|
||||
g_test_init(&argc, &argv, NULL);
|
||||
g_test_add_func(TEST_("null"), test_null);
|
||||
g_test_add_func(TEST_("cleanup"), test_cleanup);
|
||||
g_test_add_func(TEST_("int8"), test_int8);
|
||||
g_test_add_func(TEST_("int16"), test_int16);
|
||||
g_test_add_func(TEST_("int32"), test_int32);
|
||||
g_test_add_func(TEST_("int64"), test_int64);
|
||||
g_test_add_func(TEST_("float"), test_float);
|
||||
|
||||
Reference in New Issue
Block a user