25 #ifndef SERIALIZE_H_INCLUDED
26 #define SERIALIZE_H_INCLUDED
41 gboolean (*
read_bytes)(SerializeArchive *archive, gchar *buf, gsize count, GError **
error);
42 gboolean (*
write_bytes)(SerializeArchive *archive,
const gchar *buf, gsize count, GError **
error);
48 static inline gboolean
49 serialize_archive_read_bytes(SerializeArchive *
self, gchar *buf, gsize buflen)
53 if ((
self->error == NULL) && !
self->read_bytes(
self, buf, buflen, &error))
55 return self->error == NULL;
58 static inline gboolean
59 serialize_archive_write_bytes(SerializeArchive *
self,
const gchar *buf, gsize buflen)
63 if ((
self->error == NULL) && !
self->write_bytes(
self, buf, buflen, &error))
65 return self->error == NULL;
68 static inline gboolean
69 serialize_write_uint32(SerializeArchive *archive, guint32
value)
71 guint32 n = GUINT32_TO_BE(
value);
72 return serialize_archive_write_bytes(archive, (gchar *) &n,
sizeof(n));
75 static inline gboolean
76 serialize_read_uint32(SerializeArchive *archive, guint32 *
value)
80 if (serialize_archive_read_bytes(archive, (gchar *) &n,
sizeof(n)))
82 *
value = GUINT32_FROM_BE(n);
90 static inline gboolean
91 serialize_write_uint32_array(SerializeArchive *archive, guint32 *values, gsize elements)
93 #define BUFFER_SIZE 128
99 for (converted_ndx = 0;
100 converted_ndx <
BUFFER_SIZE && converted_ndx < elements;
102 converted_values[converted_ndx] = GUINT32_TO_BE(values[converted_ndx]);
104 if (!serialize_archive_write_bytes(archive, (
const gchar *) converted_values, converted_ndx *
sizeof(guint32)))
107 values += converted_ndx;
108 elements -= converted_ndx;
113 static inline gboolean
114 serialize_read_uint32_array(SerializeArchive *archive, guint32 *values, gsize elements)
116 if (serialize_archive_read_bytes(archive, (gchar *) values, elements *
sizeof(guint32)))
118 for (gsize i = 0; i < elements; i++)
119 values[i] = GUINT32_FROM_BE(values[i]);
125 static inline gboolean
126 serialize_read_uint16_array(SerializeArchive *archive, guint32 *values, gsize elements)
128 gboolean ret = FALSE;
129 guint16 *
buffer = g_new(guint16, elements);
131 if (serialize_archive_read_bytes(archive, (gchar *)
buffer, elements *
sizeof(guint16)))
133 for (gsize i = 0; i < elements; i++)
134 values[i] = GUINT16_FROM_BE(
buffer[i]);
141 static inline gboolean
142 serialize_write_uint64(SerializeArchive *archive, guint64
value)
144 guint64 n = GUINT64_TO_BE(
value);
145 return serialize_archive_write_bytes(archive, (gchar *) &n,
sizeof(n));
148 static inline gboolean
149 serialize_read_uint64(SerializeArchive *archive, guint64 *
value)
153 if (serialize_archive_read_bytes(archive, (gchar *) &n,
sizeof(n)))
155 *
value = GUINT64_FROM_BE(n);
161 static inline gboolean
162 serialize_write_uint16(SerializeArchive *archive, guint16
value)
164 guint16 n = GUINT16_TO_BE(
value);
165 return serialize_archive_write_bytes(archive, (gchar *) &n,
sizeof(n));
168 static inline gboolean
169 serialize_read_uint16(SerializeArchive *archive, guint16 *
value)
173 if (serialize_archive_read_bytes(archive, (gchar *) &n,
sizeof(n)))
175 *
value = GUINT16_FROM_BE(n);
181 static inline gboolean
182 serialize_write_uint8(SerializeArchive *archive, guint8
value)
185 return serialize_archive_write_bytes(archive, (gchar *) &n,
sizeof(n));
188 static inline gboolean
189 serialize_read_uint8(SerializeArchive *archive, guint8 *
value)
193 if (serialize_archive_read_bytes(archive, (gchar *) &n,
sizeof(n)))
202 static inline gboolean
203 serialize_write_blob(SerializeArchive *archive,
const void *blob, gsize len)
205 return serialize_archive_write_bytes(archive, (
const gchar *) blob, len);
208 static inline gboolean
209 serialize_read_blob(SerializeArchive *archive,
void *blob, gsize len)
211 return serialize_archive_read_bytes(archive, (gchar *) blob, len);
214 static inline gboolean
215 serialize_write_string(SerializeArchive *archive, GString *str)
217 return serialize_write_uint32(archive, str->len) &&
218 serialize_archive_write_bytes(archive, str->str, str->len);
221 static inline gboolean
222 serialize_read_string(SerializeArchive *archive, GString *str)
226 if (serialize_read_uint32(archive, &len))
228 if (len > str->allocated_len)
232 p = (gchar *) g_try_realloc(str->str, len + 1);
240 g_string_set_size(str, len);
242 return serialize_archive_read_bytes(archive, str->str, len);
247 static inline gboolean
248 serialize_write_cstring(SerializeArchive *archive,
const gchar *str, gssize len)
253 return serialize_write_uint32(archive, len) &&
254 (len == 0 || serialize_archive_write_bytes(archive, str, len));
257 static inline gboolean
258 serialize_read_cstring(SerializeArchive *archive, gchar **str, gsize *str_len)
262 if (serialize_read_uint32(archive, &len))
264 *str = (gchar *) g_try_malloc(len + 1);
271 return serialize_archive_read_bytes(archive, *str, len);
#define self
Definition: rcptid.c:38
void serialize_string_archive_reset(SerializeArchive *sa)
Definition: serialize.c:128
SerializeArchive * serialize_file_archive_new(FILE *f)
Definition: serialize.c:116
gsize serialize_buffer_archive_get_pos(SerializeArchive *self)
Definition: serialize.c:216
SerializeArchive * serialize_buffer_archive_new(gchar *buff, gsize len)
Definition: serialize.c:224
SerializeArchive * serialize_string_archive_new(GString *str)
Definition: serialize.c:169
void serialize_archive_free(SerializeArchive *self)
Definition: serialize.c:68
void _serialize_handle_errors(SerializeArchive *self, const gchar *error_desc, GError *error)
Definition: serialize.c:54
Definition: serialize.h:36
GError * error
Definition: serialize.h:37
guint16 silent
Definition: serialize.h:39
guint16 len
Definition: serialize.h:38
gboolean(* write_bytes)(SerializeArchive *archive, const gchar *buf, gsize count, GError **error)
Definition: serialize.h:42
gboolean(* read_bytes)(SerializeArchive *archive, gchar *buf, gsize count, GError **error)
Definition: serialize.h:41
GString * value
Definition: test_decode.c:28
GString * buffer
Definition: test_smart_multi_line.c:69
SerializeArchive * sa
Definition: test_timestamp_serialize.c:31