message-part-serialize.c revision 6697a923d6768bf8d71f87f80b90747cf6870753
5a580c3a38ced62d4bcc95b8ac7c4f2935b5d294Timo Sirainen/* Copyright (C) 2002 Timo Sirainen */
e28fa207d1a097fa6e4a867f74ee0761472ef1ceTimo Sirainen Serialized a series of SerializedMessageParts:
adb6413686e52e00dded4932babcc08ff041876bTimo Sirainen root's first children
b1f37113a5760bee842c5a7678bb5fa6f5bd8b60Timo Sirainen children's first children
94d8e51119003d2bc5a100c663f90141f297385dTimo Sirainen root's next children
13d98ffa534f2e7d04a832c9d0153fc9c568b878Timo Sirainen/* struct is 8 byte aligned */
13d98ffa534f2e7d04a832c9d0153fc9c568b878Timo Sirainentypedef struct {
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen unsigned int flags;
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainenstatic void message_part_serialize_part(MessagePart *part,
8a0ad174adb1eb5108511b90e97f4e5f9089b0eeTimo Sirainen /* make sure we have space */
8a0ad174adb1eb5108511b90e97f4e5f9089b0eeTimo Sirainen buf_size = sizeof(SerializedMessagePart) * (*size);
8a0ad174adb1eb5108511b90e97f4e5f9089b0eeTimo Sirainen *spart_base = t_buffer_reget(*spart_base, buf_size);
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen /* create serialized part */
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen memset(spart, 0, sizeof(SerializedMessagePart));
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen spart->header_physical_size = part->header_size.physical_size;
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen spart->header_virtual_size = part->header_size.virtual_size;
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen spart->header_lines = part->header_size.lines;
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen spart->body_physical_size = part->body_size.physical_size;
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen spart->body_virtual_size = part->body_size.virtual_size;
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainenconst void *message_part_serialize(MessagePart *part, size_t *size)
a24519c36d5f8fa22f58b2c693ba547e8d175a54Timo Sirainen spart_base = t_buffer_get(sizeof(SerializedMessagePart) * buf_size);
a24519c36d5f8fa22f58b2c693ba547e8d175a54Timo Sirainen message_part_serialize_part(part, NULL, &spart_base, &pos, &buf_size);
a24519c36d5f8fa22f58b2c693ba547e8d175a54Timo Sirainenmessage_part_deserialize_part(Pool pool, MessagePart *parent,
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen unsigned int i;
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen for (i = 0; i < child_count && *count > 0; i++) {
2649b237dd4690575e75a30b2bf3b39ebd37b835Timo Sirainen part->header_size.physical_size = spart->header_physical_size;
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen part->header_size.virtual_size = spart->header_virtual_size;
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen part->header_size.lines = spart->header_lines;
1701e3f91107051b1704721bf1dc1e32491faaf9Timo Sirainen part->body_size.physical_size = spart->body_physical_size;
2649b237dd4690575e75a30b2bf3b39ebd37b835Timo Sirainen part->body_size.virtual_size = spart->body_virtual_size;
2649b237dd4690575e75a30b2bf3b39ebd37b835Timo Sirainen part->children = message_part_deserialize_part(pool, part,
76b91bac787101e6b0075122ab6478dd98c8a884Timo SirainenMessagePart *message_part_deserialize(Pool pool, const void *data,
2a6dcd984104fed84bed8795ccdfabb20e41ce52Timo Sirainen /* make sure it looks valid */
2a6dcd984104fed84bed8795ccdfabb20e41ce52Timo Sirainen if (size == 0 || (size % sizeof(SerializedMessagePart)) != 0)
2a6dcd984104fed84bed8795ccdfabb20e41ce52Timo Sirainen return message_part_deserialize_part(pool, NULL, &spart, &count,
2a6dcd984104fed84bed8795ccdfabb20e41ce52Timo Sirainen (unsigned int)count);
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainenint message_part_serialize_update_header(void *data, size_t size,
360123b1b41b7aa8af6c4a91c39046be646cd349Timo Sirainen /* make sure it looks valid */
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen if (size == 0 || (size % sizeof(SerializedMessagePart)) != 0)
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen spart->header_physical_size = hdr_size->physical_size;
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen spart->header_virtual_size = hdr_size->virtual_size;
917498e6f84969d2b93410c1e479735abe8e0ed7Timo Sirainen pos_diff = (off_t)hdr_size->physical_size - spart->header_physical_size;
917498e6f84969d2b93410c1e479735abe8e0ed7Timo Sirainen /* have to update all positions */
e5acc283bf030b0b5c79ca4e52d315c516a299faPascal Volk /* invalid offset, might cause overflow */
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainenint message_part_deserialize_size(const void *data, size_t size,
5666a3d6a7ea89362b8d9e8b39b15424cd9d6388Timo Sirainen /* make sure it looks valid */
1701e3f91107051b1704721bf1dc1e32491faaf9Timo Sirainen if (size == 0 || (size % sizeof(SerializedMessagePart)) != 0)
0bf25546c91ccafff9e2cc93368d2d25acb5c39eTimo Sirainen hdr_size->physical_size = spart->header_physical_size;
94b0ff77495c3ed14bdd4b5d7ae1eb37e8c9efb5Timo Sirainen hdr_size->virtual_size = spart->header_virtual_size;
adb6413686e52e00dded4932babcc08ff041876bTimo Sirainen body_size->physical_size = spart->body_physical_size;