message-part-serialize.c revision def516ea503a60f20d510c14d5070b7ff5bbddf4
8043e7591c0a8c5d08e3d52c99dd2579cc8edb41rbb/* Copyright (C) 2002 Timo Sirainen */
8043e7591c0a8c5d08e3d52c99dd2579cc8edb41rbb Serialized a series of SerializedMessageParts:
8043e7591c0a8c5d08e3d52c99dd2579cc8edb41rbb root's first children
8043e7591c0a8c5d08e3d52c99dd2579cc8edb41rbb children's first children
8043e7591c0a8c5d08e3d52c99dd2579cc8edb41rbb root's next children
8043e7591c0a8c5d08e3d52c99dd2579cc8edb41rbb/* struct is 8 byte aligned */
8043e7591c0a8c5d08e3d52c99dd2579cc8edb41rbbtypedef struct {
8043e7591c0a8c5d08e3d52c99dd2579cc8edb41rbb unsigned int header_lines;
8043e7591c0a8c5d08e3d52c99dd2579cc8edb41rbb unsigned int body_lines;
8043e7591c0a8c5d08e3d52c99dd2579cc8edb41rbb unsigned int children_count;
8043e7591c0a8c5d08e3d52c99dd2579cc8edb41rbb unsigned int flags;
8043e7591c0a8c5d08e3d52c99dd2579cc8edb41rbbvoid message_part_serialize(MessagePart *part, Buffer *dest)
8043e7591c0a8c5d08e3d52c99dd2579cc8edb41rbb /* create serialized part */
8043e7591c0a8c5d08e3d52c99dd2579cc8edb41rbb spart->header_physical_size = part->header_size.physical_size;
8043e7591c0a8c5d08e3d52c99dd2579cc8edb41rbb spart->header_virtual_size = part->header_size.virtual_size;
8043e7591c0a8c5d08e3d52c99dd2579cc8edb41rbb spart->body_physical_size = part->body_size.physical_size;
8043e7591c0a8c5d08e3d52c99dd2579cc8edb41rbb spart->body_virtual_size = part->body_size.virtual_size;
8043e7591c0a8c5d08e3d52c99dd2579cc8edb41rbbmessage_part_deserialize_part(Pool pool, MessagePart *parent,
8043e7591c0a8c5d08e3d52c99dd2579cc8edb41rbb unsigned int i;
8043e7591c0a8c5d08e3d52c99dd2579cc8edb41rbb part->header_size.physical_size = spart->header_physical_size;
8043e7591c0a8c5d08e3d52c99dd2579cc8edb41rbb part->header_size.virtual_size = spart->header_virtual_size;
8043e7591c0a8c5d08e3d52c99dd2579cc8edb41rbb part->body_size.physical_size = spart->body_physical_size;
8043e7591c0a8c5d08e3d52c99dd2579cc8edb41rbb part->body_size.virtual_size = spart->body_virtual_size;
8043e7591c0a8c5d08e3d52c99dd2579cc8edb41rbb part->children = message_part_deserialize_part(pool, part,
8043e7591c0a8c5d08e3d52c99dd2579cc8edb41rbbMessagePart *message_part_deserialize(Pool pool, const void *data,
8043e7591c0a8c5d08e3d52c99dd2579cc8edb41rbb /* make sure it looks valid */
8043e7591c0a8c5d08e3d52c99dd2579cc8edb41rbb return message_part_deserialize_part(pool, NULL, &spart, &count,
8043e7591c0a8c5d08e3d52c99dd2579cc8edb41rbb (unsigned int)count);
8043e7591c0a8c5d08e3d52c99dd2579cc8edb41rbbint message_part_serialize_update_header(void *data, size_t size,
8043e7591c0a8c5d08e3d52c99dd2579cc8edb41rbb /* make sure it looks valid */
8043e7591c0a8c5d08e3d52c99dd2579cc8edb41rbb pos_diff = (off_t)hdr_size->physical_size - spart->header_physical_size;
8043e7591c0a8c5d08e3d52c99dd2579cc8edb41rbb if (pos_diff != 0) {
8043e7591c0a8c5d08e3d52c99dd2579cc8edb41rbb /* have to update all positions, but skip the first one */
8043e7591c0a8c5d08e3d52c99dd2579cc8edb41rbb /* invalid offset, might cause overflow */
8043e7591c0a8c5d08e3d52c99dd2579cc8edb41rbbint message_part_deserialize_size(const void *data, size_t size,
8043e7591c0a8c5d08e3d52c99dd2579cc8edb41rbb /* make sure it looks valid */