libpurple/protocols/gg/lib/protobuf-c.c

Wed, 28 Sep 2016 09:32:19 -0500

author
Gary Kramlich <grim@reaperworld.com>
date
Wed, 28 Sep 2016 09:32:19 -0500
changeset 38066
2e94b6fa06a0
parent 37181
06b74c255e95
permissions
-rw-r--r--

Merged in CMaiku/pidgin (pull request #136)

Windows build fixes

35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
1 /*
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2 * Copyright (c) 2008-2014, Dave Benson and the protobuf-c authors.
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
3 * All rights reserved.
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
4 *
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
5 * Redistribution and use in source and binary forms, with or without
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
6 * modification, are permitted provided that the following conditions are
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
7 * met:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
8 *
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
9 * * Redistributions of source code must retain the above copyright
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
10 * notice, this list of conditions and the following disclaimer.
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
11 *
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
12 * * Redistributions in binary form must reproduce the above
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
13 * copyright notice, this list of conditions and the following disclaimer
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
14 * in the documentation and/or other materials provided with the
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
15 * distribution.
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
16 *
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
17 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
18 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
19 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
20 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
21 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
22 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
23 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
24 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
25 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
26 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
27 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
28 */
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
29
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
30 /*! \file
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
31 * Support library for `protoc-c` generated code.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
32 *
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
33 * This file implements the public API used by the code generated
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
34 * by `protoc-c`.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
35 *
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
36 * \authors Dave Benson and the protobuf-c authors
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
37 *
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
38 * \copyright 2008-2014. Licensed under the terms of the [BSD-2-Clause] license.
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
39 */
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
40
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
41 /**
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
42 * \todo 64-BIT OPTIMIZATION: certain implementations use 32-bit math
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
43 * even on 64-bit platforms (uint64_size, uint64_pack, parse_uint64).
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
44 *
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
45 * \todo Use size_t consistently.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
46 */
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
47
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
48 #include <stdlib.h> /* for malloc, free */
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
49 #include <string.h> /* for strcmp, strlen, memcpy, memmove, memset */
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
50
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
51 /* Pull WORDS_BIGENDIAN etc */
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
52 #include "config.h"
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
53
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
54 #include "protobuf-c.h"
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
55
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
56 #define TRUE 1
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
57 #define FALSE 0
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
58
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
59 #define PROTOBUF_C__ASSERT_NOT_REACHED() assert(0)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
60
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
61 /* Workaround for Microsoft compilers. */
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
62 #ifdef _MSC_VER
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
63 # define inline __inline
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
64 #endif
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
65
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
66 /**
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
67 * \defgroup internal Internal functions and macros
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
68 *
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
69 * These are not exported by the library but are useful to developers working
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
70 * on `libprotobuf-c` itself.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
71 */
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
72
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
73 /**
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
74 * \defgroup macros Utility macros for manipulating structures
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
75 *
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
76 * Macros and constants used to manipulate the base "classes" generated by
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
77 * `protobuf-c`. They also define limits and check correctness.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
78 *
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
79 * \ingroup internal
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
80 * @{
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
81 */
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
82
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
83 /** The maximum length of a 64-bit integer in varint encoding. */
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
84 #define MAX_UINT64_ENCODED_SIZE 10
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
85
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
86 #ifndef PROTOBUF_C_UNPACK_ERROR
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
87 # define PROTOBUF_C_UNPACK_ERROR(...)
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
88 #endif
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
89
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
90 /**
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
91 * Internal `ProtobufCMessage` manipulation macro.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
92 *
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
93 * Base macro for manipulating a `ProtobufCMessage`. Used by STRUCT_MEMBER() and
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
94 * STRUCT_MEMBER_PTR().
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
95 */
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
96 #define STRUCT_MEMBER_P(struct_p, struct_offset) \
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
97 ((void *) ((uint8_t *) (struct_p) + (struct_offset)))
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
98
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
99 /**
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
100 * Return field in a `ProtobufCMessage` based on offset.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
101 *
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
102 * Take a pointer to a `ProtobufCMessage` and find the field at the offset.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
103 * Cast it to the passed type.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
104 */
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
105 #define STRUCT_MEMBER(member_type, struct_p, struct_offset) \
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
106 (*(member_type *) STRUCT_MEMBER_P((struct_p), (struct_offset)))
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
107
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
108 /**
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
109 * Return field in a `ProtobufCMessage` based on offset.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
110 *
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
111 * Take a pointer to a `ProtobufCMessage` and find the field at the offset. Cast
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
112 * it to a pointer to the passed type.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
113 */
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
114 #define STRUCT_MEMBER_PTR(member_type, struct_p, struct_offset) \
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
115 ((member_type *) STRUCT_MEMBER_P((struct_p), (struct_offset)))
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
116
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
117 /* Assertions for magic numbers. */
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
118
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
119 #define ASSERT_IS_ENUM_DESCRIPTOR(desc) \
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
120 assert((desc)->magic == PROTOBUF_C__ENUM_DESCRIPTOR_MAGIC)
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
121
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
122 #define ASSERT_IS_MESSAGE_DESCRIPTOR(desc) \
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
123 assert((desc)->magic == PROTOBUF_C__MESSAGE_DESCRIPTOR_MAGIC)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
124
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
125 #define ASSERT_IS_MESSAGE(message) \
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
126 ASSERT_IS_MESSAGE_DESCRIPTOR((message)->descriptor)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
127
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
128 #define ASSERT_IS_SERVICE_DESCRIPTOR(desc) \
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
129 assert((desc)->magic == PROTOBUF_C__SERVICE_DESCRIPTOR_MAGIC)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
130
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
131 /**@}*/
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
132
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
133 /* --- version --- */
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
134
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
135 const char *
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
136 protobuf_c_version(void)
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
137 {
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
138 return PROTOBUF_C_VERSION;
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
139 }
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
140
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
141 uint32_t
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
142 protobuf_c_version_number(void)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
143 {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
144 return PROTOBUF_C_VERSION_NUMBER;
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
145 }
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
146
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
147 /* --- allocator --- */
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
148
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
149 static void *
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
150 system_alloc(void *allocator_data, size_t size)
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
151 {
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
152 return malloc(size);
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
153 }
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
154
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
155 static void
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
156 system_free(void *allocator_data, void *data)
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
157 {
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
158 free(data);
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
159 }
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
160
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
161 static inline void *
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
162 do_alloc(ProtobufCAllocator *allocator, size_t size)
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
163 {
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
164 return allocator->alloc(allocator->allocator_data, size);
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
165 }
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
166
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
167 static inline void
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
168 do_free(ProtobufCAllocator *allocator, void *data)
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
169 {
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
170 if (data != NULL)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
171 allocator->free(allocator->allocator_data, data);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
172 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
173
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
174 /*
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
175 * This allocator uses the system's malloc() and free(). It is the default
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
176 * allocator used if NULL is passed as the ProtobufCAllocator to an exported
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
177 * function.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
178 */
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
179 static ProtobufCAllocator protobuf_c__allocator = {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
180 .alloc = &system_alloc,
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
181 .free = &system_free,
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
182 .allocator_data = NULL,
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
183 };
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
184
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
185 /* === buffer-simple === */
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
186
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
187 void
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
188 protobuf_c_buffer_simple_append(ProtobufCBuffer *buffer,
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
189 size_t len, const uint8_t *data)
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
190 {
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
191 ProtobufCBufferSimple *simp = (ProtobufCBufferSimple *) buffer;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
192 size_t new_len = simp->len + len;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
193
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
194 if (new_len > simp->alloced) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
195 ProtobufCAllocator *allocator = simp->allocator;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
196 size_t new_alloced = simp->alloced * 2;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
197 uint8_t *new_data;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
198
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
199 if (allocator == NULL)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
200 allocator = &protobuf_c__allocator;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
201 while (new_alloced < new_len)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
202 new_alloced += new_alloced;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
203 new_data = do_alloc(allocator, new_alloced);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
204 if (!new_data)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
205 return;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
206 memcpy(new_data, simp->data, simp->len);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
207 if (simp->must_free_data)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
208 do_free(allocator, simp->data);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
209 else
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
210 simp->must_free_data = TRUE;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
211 simp->data = new_data;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
212 simp->alloced = new_alloced;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
213 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
214 memcpy(simp->data + simp->len, data, len);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
215 simp->len = new_len;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
216 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
217
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
218 /**
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
219 * \defgroup packedsz protobuf_c_message_get_packed_size() implementation
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
220 *
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
221 * Routines mainly used by protobuf_c_message_get_packed_size().
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
222 *
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
223 * \ingroup internal
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
224 * @{
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
225 */
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
226
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
227 /**
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
228 * Return the number of bytes required to store the tag for the field. Includes
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
229 * 3 bits for the wire-type, and a single bit that denotes the end-of-tag.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
230 *
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
231 * \param number
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
232 * Field tag to encode.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
233 * \return
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
234 * Number of bytes required.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
235 */
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
236 static inline size_t
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
237 get_tag_size(unsigned number)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
238 {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
239 if (number < (1 << 4)) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
240 return 1;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
241 } else if (number < (1 << 11)) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
242 return 2;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
243 } else if (number < (1 << 18)) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
244 return 3;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
245 } else if (number < (1 << 25)) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
246 return 4;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
247 } else {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
248 return 5;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
249 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
250 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
251
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
252 /**
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
253 * Return the number of bytes required to store a variable-length unsigned
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
254 * 32-bit integer in base-128 varint encoding.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
255 *
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
256 * \param v
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
257 * Value to encode.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
258 * \return
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
259 * Number of bytes required.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
260 */
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
261 static inline size_t
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
262 uint32_size(uint32_t v)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
263 {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
264 if (v < (1 << 7)) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
265 return 1;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
266 } else if (v < (1 << 14)) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
267 return 2;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
268 } else if (v < (1 << 21)) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
269 return 3;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
270 } else if (v < (1 << 28)) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
271 return 4;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
272 } else {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
273 return 5;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
274 }
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
275 }
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
276
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
277 /**
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
278 * Return the number of bytes required to store a variable-length signed 32-bit
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
279 * integer in base-128 varint encoding.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
280 *
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
281 * \param v
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
282 * Value to encode.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
283 * \return
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
284 * Number of bytes required.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
285 */
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
286 static inline size_t
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
287 int32_size(int32_t v)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
288 {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
289 if (v < 0) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
290 return 10;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
291 } else if (v < (1 << 7)) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
292 return 1;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
293 } else if (v < (1 << 14)) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
294 return 2;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
295 } else if (v < (1 << 21)) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
296 return 3;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
297 } else if (v < (1 << 28)) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
298 return 4;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
299 } else {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
300 return 5;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
301 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
302 }
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
303
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
304 /**
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
305 * Return the ZigZag-encoded 32-bit unsigned integer form of a 32-bit signed
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
306 * integer.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
307 *
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
308 * \param v
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
309 * Value to encode.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
310 * \return
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
311 * ZigZag encoded integer.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
312 */
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
313 static inline uint32_t
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
314 zigzag32(int32_t v)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
315 {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
316 if (v < 0)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
317 return ((uint32_t) (-v)) * 2 - 1;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
318 else
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
319 return v * 2;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
320 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
321
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
322 /**
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
323 * Return the number of bytes required to store a signed 32-bit integer,
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
324 * converted to an unsigned 32-bit integer with ZigZag encoding, using base-128
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
325 * varint encoding.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
326 *
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
327 * \param v
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
328 * Value to encode.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
329 * \return
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
330 * Number of bytes required.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
331 */
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
332 static inline size_t
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
333 sint32_size(int32_t v)
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
334 {
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
335 return uint32_size(zigzag32(v));
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
336 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
337
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
338 /**
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
339 * Return the number of bytes required to store a 64-bit unsigned integer in
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
340 * base-128 varint encoding.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
341 *
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
342 * \param v
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
343 * Value to encode.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
344 * \return
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
345 * Number of bytes required.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
346 */
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
347 static inline size_t
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
348 uint64_size(uint64_t v)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
349 {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
350 uint32_t upper_v = (uint32_t) (v >> 32);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
351
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
352 if (upper_v == 0) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
353 return uint32_size((uint32_t) v);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
354 } else if (upper_v < (1 << 3)) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
355 return 5;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
356 } else if (upper_v < (1 << 10)) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
357 return 6;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
358 } else if (upper_v < (1 << 17)) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
359 return 7;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
360 } else if (upper_v < (1 << 24)) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
361 return 8;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
362 } else if (upper_v < (1U << 31)) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
363 return 9;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
364 } else {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
365 return 10;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
366 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
367 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
368
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
369 /**
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
370 * Return the ZigZag-encoded 64-bit unsigned integer form of a 64-bit signed
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
371 * integer.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
372 *
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
373 * \param v
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
374 * Value to encode.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
375 * \return
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
376 * ZigZag encoded integer.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
377 */
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
378 static inline uint64_t
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
379 zigzag64(int64_t v)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
380 {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
381 if (v < 0)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
382 return ((uint64_t) (-v)) * 2 - 1;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
383 else
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
384 return v * 2;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
385 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
386
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
387 /**
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
388 * Return the number of bytes required to store a signed 64-bit integer,
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
389 * converted to an unsigned 64-bit integer with ZigZag encoding, using base-128
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
390 * varint encoding.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
391 *
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
392 * \param v
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
393 * Value to encode.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
394 * \return
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
395 * Number of bytes required.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
396 */
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
397 static inline size_t
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
398 sint64_size(int64_t v)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
399 {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
400 return uint64_size(zigzag64(v));
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
401 }
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
402
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
403 /**
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
404 * Calculate the serialized size of a single required message field, including
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
405 * the space needed by the preceding tag.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
406 *
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
407 * \param field
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
408 * Field descriptor for member.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
409 * \param member
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
410 * Field to encode.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
411 * \return
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
412 * Number of bytes required.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
413 */
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
414 static size_t
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
415 required_field_get_packed_size(const ProtobufCFieldDescriptor *field,
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
416 const void *member)
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
417 {
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
418 size_t rv = get_tag_size(field->id);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
419
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
420 switch (field->type) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
421 case PROTOBUF_C_TYPE_SINT32:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
422 return rv + sint32_size(*(const int32_t *) member);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
423 case PROTOBUF_C_TYPE_INT32:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
424 return rv + int32_size(*(const uint32_t *) member);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
425 case PROTOBUF_C_TYPE_UINT32:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
426 return rv + uint32_size(*(const uint32_t *) member);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
427 case PROTOBUF_C_TYPE_SINT64:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
428 return rv + sint64_size(*(const int64_t *) member);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
429 case PROTOBUF_C_TYPE_INT64:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
430 case PROTOBUF_C_TYPE_UINT64:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
431 return rv + uint64_size(*(const uint64_t *) member);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
432 case PROTOBUF_C_TYPE_SFIXED32:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
433 case PROTOBUF_C_TYPE_FIXED32:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
434 return rv + 4;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
435 case PROTOBUF_C_TYPE_SFIXED64:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
436 case PROTOBUF_C_TYPE_FIXED64:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
437 return rv + 8;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
438 case PROTOBUF_C_TYPE_BOOL:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
439 return rv + 1;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
440 case PROTOBUF_C_TYPE_FLOAT:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
441 return rv + 4;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
442 case PROTOBUF_C_TYPE_DOUBLE:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
443 return rv + 8;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
444 case PROTOBUF_C_TYPE_ENUM:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
445 /* \todo Is this correct for negative-valued enums? */
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
446 return rv + uint32_size(*(const uint32_t *) member);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
447 case PROTOBUF_C_TYPE_STRING: {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
448 const char *str = *(char * const *) member;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
449 size_t len = str ? strlen(str) : 0;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
450 return rv + uint32_size(len) + len;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
451 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
452 case PROTOBUF_C_TYPE_BYTES: {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
453 size_t len = ((const ProtobufCBinaryData *) member)->len;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
454 return rv + uint32_size(len) + len;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
455 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
456 case PROTOBUF_C_TYPE_MESSAGE: {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
457 const ProtobufCMessage *msg = *(ProtobufCMessage * const *) member;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
458 size_t subrv = msg ? protobuf_c_message_get_packed_size(msg) : 0;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
459 return rv + uint32_size(subrv) + subrv;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
460 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
461 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
462 PROTOBUF_C__ASSERT_NOT_REACHED();
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
463 return 0;
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
464 }
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
465
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
466 /**
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
467 * Calculate the serialized size of a single optional message field, including
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
468 * the space needed by the preceding tag. Returns 0 if the optional field isn't
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
469 * set.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
470 *
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
471 * \param field
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
472 * Field descriptor for member.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
473 * \param has
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
474 * True if the field exists, false if not.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
475 * \param member
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
476 * Field to encode.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
477 * \return
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
478 * Number of bytes required.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
479 */
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
480 static size_t
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
481 optional_field_get_packed_size(const ProtobufCFieldDescriptor *field,
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
482 const protobuf_c_boolean *has,
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
483 const void *member)
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
484 {
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
485 if (field->type == PROTOBUF_C_TYPE_MESSAGE ||
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
486 field->type == PROTOBUF_C_TYPE_STRING)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
487 {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
488 const void *ptr = *(const void * const *) member;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
489 if (ptr == NULL || ptr == field->default_value)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
490 return 0;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
491 } else {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
492 if (!*has)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
493 return 0;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
494 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
495 return required_field_get_packed_size(field, member);
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
496 }
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
497
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
498 /**
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
499 * Calculate the serialized size of repeated message fields, which may consist
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
500 * of any number of values (including 0). Includes the space needed by the
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
501 * preceding tags (as needed).
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
502 *
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
503 * \param field
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
504 * Field descriptor for member.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
505 * \param count
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
506 * Number of repeated field members.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
507 * \param member
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
508 * Field to encode.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
509 * \return
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
510 * Number of bytes required.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
511 */
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
512 static size_t
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
513 repeated_field_get_packed_size(const ProtobufCFieldDescriptor *field,
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
514 size_t count, const void *member)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
515 {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
516 size_t header_size;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
517 size_t rv = 0;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
518 unsigned i;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
519 void *array = *(void * const *) member;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
520
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
521 if (count == 0)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
522 return 0;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
523 header_size = get_tag_size(field->id);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
524 if (0 == (field->flags & PROTOBUF_C_FIELD_FLAG_PACKED))
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
525 header_size *= count;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
526
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
527 switch (field->type) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
528 case PROTOBUF_C_TYPE_SINT32:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
529 for (i = 0; i < count; i++)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
530 rv += sint32_size(((int32_t *) array)[i]);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
531 break;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
532 case PROTOBUF_C_TYPE_INT32:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
533 for (i = 0; i < count; i++)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
534 rv += int32_size(((uint32_t *) array)[i]);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
535 break;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
536 case PROTOBUF_C_TYPE_UINT32:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
537 case PROTOBUF_C_TYPE_ENUM:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
538 for (i = 0; i < count; i++)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
539 rv += uint32_size(((uint32_t *) array)[i]);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
540 break;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
541 case PROTOBUF_C_TYPE_SINT64:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
542 for (i = 0; i < count; i++)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
543 rv += sint64_size(((int64_t *) array)[i]);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
544 break;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
545 case PROTOBUF_C_TYPE_INT64:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
546 case PROTOBUF_C_TYPE_UINT64:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
547 for (i = 0; i < count; i++)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
548 rv += uint64_size(((uint64_t *) array)[i]);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
549 break;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
550 case PROTOBUF_C_TYPE_SFIXED32:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
551 case PROTOBUF_C_TYPE_FIXED32:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
552 case PROTOBUF_C_TYPE_FLOAT:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
553 rv += 4 * count;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
554 break;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
555 case PROTOBUF_C_TYPE_SFIXED64:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
556 case PROTOBUF_C_TYPE_FIXED64:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
557 case PROTOBUF_C_TYPE_DOUBLE:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
558 rv += 8 * count;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
559 break;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
560 case PROTOBUF_C_TYPE_BOOL:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
561 rv += count;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
562 break;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
563 case PROTOBUF_C_TYPE_STRING:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
564 for (i = 0; i < count; i++) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
565 size_t len = strlen(((char **) array)[i]);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
566 rv += uint32_size(len) + len;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
567 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
568 break;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
569 case PROTOBUF_C_TYPE_BYTES:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
570 for (i = 0; i < count; i++) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
571 size_t len = ((ProtobufCBinaryData *) array)[i].len;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
572 rv += uint32_size(len) + len;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
573 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
574 break;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
575 case PROTOBUF_C_TYPE_MESSAGE:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
576 for (i = 0; i < count; i++) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
577 size_t len = protobuf_c_message_get_packed_size(
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
578 ((ProtobufCMessage **) array)[i]);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
579 rv += uint32_size(len) + len;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
580 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
581 break;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
582 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
583
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
584 if (0 != (field->flags & PROTOBUF_C_FIELD_FLAG_PACKED))
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
585 header_size += uint32_size(rv);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
586 return header_size + rv;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
587 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
588
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
589 /**
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
590 * Calculate the serialized size of an unknown field, i.e. one that is passed
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
591 * through mostly uninterpreted. This is required for forward compatibility if
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
592 * new fields are added to the message descriptor.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
593 *
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
594 * \param field
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
595 * Unknown field type.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
596 * \return
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
597 * Number of bytes required.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
598 */
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
599 static inline size_t
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
600 unknown_field_get_packed_size(const ProtobufCMessageUnknownField *field)
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
601 {
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
602 return get_tag_size(field->tag) + field->len;
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
603 }
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
604
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
605 /**@}*/
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
606
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
607 /*
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
608 * Calculate the serialized size of the message.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
609 */
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
610 size_t protobuf_c_message_get_packed_size(const ProtobufCMessage *message)
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
611 {
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
612 unsigned i;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
613 size_t rv = 0;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
614
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
615 ASSERT_IS_MESSAGE(message);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
616 for (i = 0; i < message->descriptor->n_fields; i++) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
617 const ProtobufCFieldDescriptor *field =
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
618 message->descriptor->fields + i;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
619 const void *member =
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
620 ((const char *) message) + field->offset;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
621 const void *qmember =
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
622 ((const char *) message) + field->quantifier_offset;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
623
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
624 if (field->label == PROTOBUF_C_LABEL_REQUIRED) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
625 rv += required_field_get_packed_size(field, member);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
626 } else if (field->label == PROTOBUF_C_LABEL_OPTIONAL) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
627 rv += optional_field_get_packed_size(field, qmember, member);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
628 } else {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
629 rv += repeated_field_get_packed_size(
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
630 field,
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
631 *(const size_t *) qmember,
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
632 member
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
633 );
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
634 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
635 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
636 for (i = 0; i < message->n_unknown_fields; i++)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
637 rv += unknown_field_get_packed_size(&message->unknown_fields[i]);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
638 return rv;
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
639 }
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
640
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
641 /**
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
642 * \defgroup pack protobuf_c_message_pack() implementation
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
643 *
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
644 * Routines mainly used by protobuf_c_message_pack().
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
645 *
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
646 * \ingroup internal
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
647 * @{
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
648 */
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
649
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
650 /**
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
651 * Pack an unsigned 32-bit integer in base-128 varint encoding and return the
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
652 * number of bytes written, which must be 5 or less.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
653 *
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
654 * \param value
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
655 * Value to encode.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
656 * \param[out] out
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
657 * Packed value.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
658 * \return
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
659 * Number of bytes written to `out`.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
660 */
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
661 static inline size_t
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
662 uint32_pack(uint32_t value, uint8_t *out)
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
663 {
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
664 unsigned rv = 0;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
665
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
666 if (value >= 0x80) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
667 out[rv++] = value | 0x80;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
668 value >>= 7;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
669 if (value >= 0x80) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
670 out[rv++] = value | 0x80;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
671 value >>= 7;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
672 if (value >= 0x80) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
673 out[rv++] = value | 0x80;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
674 value >>= 7;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
675 if (value >= 0x80) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
676 out[rv++] = value | 0x80;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
677 value >>= 7;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
678 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
679 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
680 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
681 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
682 /* assert: value<128 */
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
683 out[rv++] = value;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
684 return rv;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
685 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
686
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
687 /**
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
688 * Pack a signed 32-bit integer and return the number of bytes written.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
689 * Negative numbers are encoded as two's complement 64-bit integers.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
690 *
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
691 * \param value
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
692 * Value to encode.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
693 * \param[out] out
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
694 * Packed value.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
695 * \return
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
696 * Number of bytes written to `out`.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
697 */
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
698 static inline size_t
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
699 int32_pack(int32_t value, uint8_t *out)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
700 {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
701 if (value < 0) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
702 out[0] = value | 0x80;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
703 out[1] = (value >> 7) | 0x80;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
704 out[2] = (value >> 14) | 0x80;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
705 out[3] = (value >> 21) | 0x80;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
706 out[4] = (value >> 28) | 0x80;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
707 out[5] = out[6] = out[7] = out[8] = 0xff;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
708 out[9] = 0x01;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
709 return 10;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
710 } else {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
711 return uint32_pack(value, out);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
712 }
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
713 }
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
714
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
715 /**
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
716 * Pack a signed 32-bit integer using ZigZag encoding and return the number of
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
717 * bytes written.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
718 *
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
719 * \param value
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
720 * Value to encode.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
721 * \param[out] out
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
722 * Packed value.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
723 * \return
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
724 * Number of bytes written to `out`.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
725 */
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
726 static inline size_t
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
727 sint32_pack(int32_t value, uint8_t *out)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
728 {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
729 return uint32_pack(zigzag32(value), out);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
730 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
731
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
732 /**
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
733 * Pack a 64-bit unsigned integer using base-128 varint encoding and return the
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
734 * number of bytes written.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
735 *
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
736 * \param value
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
737 * Value to encode.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
738 * \param[out] out
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
739 * Packed value.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
740 * \return
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
741 * Number of bytes written to `out`.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
742 */
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
743 static size_t
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
744 uint64_pack(uint64_t value, uint8_t *out)
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
745 {
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
746 uint32_t hi = (uint32_t) (value >> 32);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
747 uint32_t lo = (uint32_t) value;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
748 unsigned rv;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
749
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
750 if (hi == 0)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
751 return uint32_pack((uint32_t) lo, out);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
752 out[0] = (lo) | 0x80;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
753 out[1] = (lo >> 7) | 0x80;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
754 out[2] = (lo >> 14) | 0x80;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
755 out[3] = (lo >> 21) | 0x80;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
756 if (hi < 8) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
757 out[4] = (hi << 4) | (lo >> 28);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
758 return 5;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
759 } else {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
760 out[4] = ((hi & 7) << 4) | (lo >> 28) | 0x80;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
761 hi >>= 3;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
762 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
763 rv = 5;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
764 while (hi >= 128) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
765 out[rv++] = hi | 0x80;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
766 hi >>= 7;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
767 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
768 out[rv++] = hi;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
769 return rv;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
770 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
771
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
772 /**
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
773 * Pack a 64-bit signed integer in ZigZag encoding and return the number of
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
774 * bytes written.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
775 *
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
776 * \param value
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
777 * Value to encode.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
778 * \param[out] out
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
779 * Packed value.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
780 * \return
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
781 * Number of bytes written to `out`.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
782 */
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
783 static inline size_t
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
784 sint64_pack(int64_t value, uint8_t *out)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
785 {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
786 return uint64_pack(zigzag64(value), out);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
787 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
788
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
789 /**
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
790 * Pack a 32-bit quantity in little-endian byte order. Used for protobuf wire
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
791 * types fixed32, sfixed32, float. Similar to "htole32".
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
792 *
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
793 * \param value
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
794 * Value to encode.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
795 * \param[out] out
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
796 * Packed value.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
797 * \return
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
798 * Number of bytes written to `out`.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
799 */
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
800 static inline size_t
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
801 fixed32_pack(uint32_t value, void *out)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
802 {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
803 #if !defined(WORDS_BIGENDIAN)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
804 memcpy(out, &value, 4);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
805 #else
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
806 uint8_t *buf = out;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
807
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
808 buf[0] = value;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
809 buf[1] = value >> 8;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
810 buf[2] = value >> 16;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
811 buf[3] = value >> 24;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
812 #endif
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
813 return 4;
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
814 }
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
815
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
816 /**
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
817 * Pack a 64-bit quantity in little-endian byte order. Used for protobuf wire
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
818 * types fixed64, sfixed64, double. Similar to "htole64".
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
819 *
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
820 * \todo The big-endian impl is really only good for 32-bit machines, a 64-bit
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
821 * version would be appreciated, plus a way to decide to use 64-bit math where
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
822 * convenient.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
823 *
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
824 * \param value
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
825 * Value to encode.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
826 * \param[out] out
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
827 * Packed value.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
828 * \return
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
829 * Number of bytes written to `out`.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
830 */
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
831 static inline size_t
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
832 fixed64_pack(uint64_t value, void *out)
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
833 {
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
834 #if !defined(WORDS_BIGENDIAN)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
835 memcpy(out, &value, 8);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
836 #else
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
837 fixed32_pack(value, out);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
838 fixed32_pack(value >> 32, ((char *) out) + 4);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
839 #endif
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
840 return 8;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
841 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
842
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
843 /**
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
844 * Pack a boolean value as an integer and return the number of bytes written.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
845 *
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
846 * \todo Perhaps on some platforms *out = !!value would be a better impl, b/c
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
847 * that is idiomatic C++ in some STL implementations.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
848 *
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
849 * \param value
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
850 * Value to encode.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
851 * \param[out] out
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
852 * Packed value.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
853 * \return
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
854 * Number of bytes written to `out`.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
855 */
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
856 static inline size_t
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
857 boolean_pack(protobuf_c_boolean value, uint8_t *out)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
858 {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
859 *out = value ? TRUE : FALSE;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
860 return 1;
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
861 }
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
862
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
863 /**
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
864 * Pack a NUL-terminated C string and return the number of bytes written. The
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
865 * output includes a length delimiter.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
866 *
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
867 * The NULL pointer is treated as an empty string. This isn't really necessary,
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
868 * but it allows people to leave required strings blank. (See Issue #13 in the
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
869 * bug tracker for a little more explanation).
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
870 *
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
871 * \param str
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
872 * String to encode.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
873 * \param[out] out
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
874 * Packed value.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
875 * \return
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
876 * Number of bytes written to `out`.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
877 */
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
878 static inline size_t
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
879 string_pack(const char *str, uint8_t *out)
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
880 {
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
881 if (str == NULL) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
882 out[0] = 0;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
883 return 1;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
884 } else {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
885 size_t len = strlen(str);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
886 size_t rv = uint32_pack(len, out);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
887 memcpy(out + rv, str, len);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
888 return rv + len;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
889 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
890 }
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
891
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
892 /**
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
893 * Pack a ProtobufCBinaryData and return the number of bytes written. The output
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
894 * includes a length delimiter.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
895 *
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
896 * \param bd
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
897 * ProtobufCBinaryData to encode.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
898 * \param[out] out
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
899 * Packed value.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
900 * \return
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
901 * Number of bytes written to `out`.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
902 */
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
903 static inline size_t
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
904 binary_data_pack(const ProtobufCBinaryData *bd, uint8_t *out)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
905 {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
906 size_t len = bd->len;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
907 size_t rv = uint32_pack(len, out);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
908 memcpy(out + rv, bd->data, len);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
909 return rv + len;
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
910 }
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
911
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
912 /**
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
913 * Pack a ProtobufCMessage and return the number of bytes written. The output
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
914 * includes a length delimiter.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
915 *
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
916 * \param message
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
917 * ProtobufCMessage object to pack.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
918 * \param[out] out
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
919 * Packed message.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
920 * \return
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
921 * Number of bytes written to `out`.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
922 */
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
923 static inline size_t
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
924 prefixed_message_pack(const ProtobufCMessage *message, uint8_t *out)
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
925 {
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
926 if (message == NULL) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
927 out[0] = 0;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
928 return 1;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
929 } else {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
930 size_t rv = protobuf_c_message_pack(message, out + 1);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
931 uint32_t rv_packed_size = uint32_size(rv);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
932 if (rv_packed_size != 1)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
933 memmove(out + rv_packed_size, out + 1, rv);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
934 return uint32_pack(rv, out) + rv;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
935 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
936 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
937
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
938 /**
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
939 * Pack a field tag.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
940 *
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
941 * Wire-type will be added in required_field_pack().
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
942 *
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
943 * \todo Just call uint64_pack on 64-bit platforms.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
944 *
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
945 * \param id
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
946 * Tag value to encode.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
947 * \param[out] out
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
948 * Packed value.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
949 * \return
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
950 * Number of bytes written to `out`.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
951 */
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
952 static size_t
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
953 tag_pack(uint32_t id, uint8_t *out)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
954 {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
955 if (id < (1 << (32 - 3)))
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
956 return uint32_pack(id << 3, out);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
957 else
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
958 return uint64_pack(((uint64_t) id) << 3, out);
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
959 }
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
960
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
961 /**
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
962 * Pack a required field and return the number of bytes written.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
963 *
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
964 * \param field
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
965 * Field descriptor.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
966 * \param member
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
967 * The field member.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
968 * \param[out] out
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
969 * Packed value.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
970 * \return
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
971 * Number of bytes written to `out`.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
972 */
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
973 static size_t
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
974 required_field_pack(const ProtobufCFieldDescriptor *field,
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
975 const void *member, uint8_t *out)
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
976 {
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
977 size_t rv = tag_pack(field->id, out);
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
978
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
979 switch (field->type) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
980 case PROTOBUF_C_TYPE_SINT32:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
981 out[0] |= PROTOBUF_C_WIRE_TYPE_VARINT;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
982 return rv + sint32_pack(*(const int32_t *) member, out + rv);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
983 case PROTOBUF_C_TYPE_INT32:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
984 out[0] |= PROTOBUF_C_WIRE_TYPE_VARINT;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
985 return rv + int32_pack(*(const uint32_t *) member, out + rv);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
986 case PROTOBUF_C_TYPE_UINT32:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
987 case PROTOBUF_C_TYPE_ENUM:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
988 out[0] |= PROTOBUF_C_WIRE_TYPE_VARINT;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
989 return rv + uint32_pack(*(const uint32_t *) member, out + rv);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
990 case PROTOBUF_C_TYPE_SINT64:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
991 out[0] |= PROTOBUF_C_WIRE_TYPE_VARINT;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
992 return rv + sint64_pack(*(const int64_t *) member, out + rv);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
993 case PROTOBUF_C_TYPE_INT64:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
994 case PROTOBUF_C_TYPE_UINT64:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
995 out[0] |= PROTOBUF_C_WIRE_TYPE_VARINT;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
996 return rv + uint64_pack(*(const uint64_t *) member, out + rv);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
997 case PROTOBUF_C_TYPE_SFIXED32:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
998 case PROTOBUF_C_TYPE_FIXED32:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
999 case PROTOBUF_C_TYPE_FLOAT:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1000 out[0] |= PROTOBUF_C_WIRE_TYPE_32BIT;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1001 return rv + fixed32_pack(*(const uint32_t *) member, out + rv);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1002 case PROTOBUF_C_TYPE_SFIXED64:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1003 case PROTOBUF_C_TYPE_FIXED64:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1004 case PROTOBUF_C_TYPE_DOUBLE:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1005 out[0] |= PROTOBUF_C_WIRE_TYPE_64BIT;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1006 return rv + fixed64_pack(*(const uint64_t *) member, out + rv);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1007 case PROTOBUF_C_TYPE_BOOL:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1008 out[0] |= PROTOBUF_C_WIRE_TYPE_VARINT;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1009 return rv + boolean_pack(*(const protobuf_c_boolean *) member, out + rv);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1010 case PROTOBUF_C_TYPE_STRING:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1011 out[0] |= PROTOBUF_C_WIRE_TYPE_LENGTH_PREFIXED;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1012 return rv + string_pack(*(char *const *) member, out + rv);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1013 case PROTOBUF_C_TYPE_BYTES:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1014 out[0] |= PROTOBUF_C_WIRE_TYPE_LENGTH_PREFIXED;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1015 return rv + binary_data_pack((const ProtobufCBinaryData *) member, out + rv);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1016 case PROTOBUF_C_TYPE_MESSAGE:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1017 out[0] |= PROTOBUF_C_WIRE_TYPE_LENGTH_PREFIXED;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1018 return rv + prefixed_message_pack(*(ProtobufCMessage * const *) member, out + rv);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1019 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1020 PROTOBUF_C__ASSERT_NOT_REACHED();
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1021 return 0;
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
1022 }
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
1023
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1024 /**
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1025 * Pack an optional field and return the number of bytes written.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1026 *
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1027 * \param field
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1028 * Field descriptor.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1029 * \param has
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1030 * Whether the field is set.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1031 * \param member
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1032 * The field member.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1033 * \param[out] out
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1034 * Packed value.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1035 * \return
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1036 * Number of bytes written to `out`.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1037 */
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
1038 static size_t
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1039 optional_field_pack(const ProtobufCFieldDescriptor *field,
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1040 const protobuf_c_boolean *has,
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1041 const void *member, uint8_t *out)
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
1042 {
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1043 if (field->type == PROTOBUF_C_TYPE_MESSAGE ||
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1044 field->type == PROTOBUF_C_TYPE_STRING)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1045 {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1046 const void *ptr = *(const void * const *) member;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1047 if (ptr == NULL || ptr == field->default_value)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1048 return 0;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1049 } else {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1050 if (!*has)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1051 return 0;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1052 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1053 return required_field_pack(field, member, out);
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
1054 }
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
1055
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1056 /**
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1057 * Given a field type, return the in-memory size.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1058 *
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1059 * \todo Implement as a table lookup.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1060 *
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1061 * \param type
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1062 * Field type.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1063 * \return
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1064 * Size of the field.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1065 */
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
1066 static inline size_t
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1067 sizeof_elt_in_repeated_array(ProtobufCType type)
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
1068 {
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1069 switch (type) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1070 case PROTOBUF_C_TYPE_SINT32:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1071 case PROTOBUF_C_TYPE_INT32:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1072 case PROTOBUF_C_TYPE_UINT32:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1073 case PROTOBUF_C_TYPE_SFIXED32:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1074 case PROTOBUF_C_TYPE_FIXED32:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1075 case PROTOBUF_C_TYPE_FLOAT:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1076 case PROTOBUF_C_TYPE_ENUM:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1077 return 4;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1078 case PROTOBUF_C_TYPE_SINT64:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1079 case PROTOBUF_C_TYPE_INT64:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1080 case PROTOBUF_C_TYPE_UINT64:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1081 case PROTOBUF_C_TYPE_SFIXED64:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1082 case PROTOBUF_C_TYPE_FIXED64:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1083 case PROTOBUF_C_TYPE_DOUBLE:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1084 return 8;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1085 case PROTOBUF_C_TYPE_BOOL:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1086 return sizeof(protobuf_c_boolean);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1087 case PROTOBUF_C_TYPE_STRING:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1088 case PROTOBUF_C_TYPE_MESSAGE:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1089 return sizeof(void *);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1090 case PROTOBUF_C_TYPE_BYTES:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1091 return sizeof(ProtobufCBinaryData);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1092 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1093 PROTOBUF_C__ASSERT_NOT_REACHED();
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1094 return 0;
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
1095 }
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
1096
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1097 /**
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1098 * Pack an array of 32-bit quantities.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1099 *
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1100 * \param[out] out
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1101 * Destination.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1102 * \param[in] in
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1103 * Source.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1104 * \param[in] n
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1105 * Number of elements in the source array.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1106 */
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1107 static void
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1108 copy_to_little_endian_32(void *out, const void *in, const unsigned n)
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
1109 {
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1110 #if !defined(WORDS_BIGENDIAN)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1111 memcpy(out, in, n * 4);
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
1112 #else
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1113 unsigned i;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1114 const uint32_t *ini = in;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1115 for (i = 0; i < n; i++)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1116 fixed32_pack(ini[i], (uint32_t *) out + i);
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
1117 #endif
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
1118 }
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
1119
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1120 /**
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1121 * Pack an array of 64-bit quantities.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1122 *
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1123 * \param[out] out
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1124 * Destination.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1125 * \param[in] in
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1126 * Source.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1127 * \param[in] n
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1128 * Number of elements in the source array.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1129 */
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1130 static void
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1131 copy_to_little_endian_64(void *out, const void *in, const unsigned n)
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
1132 {
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1133 #if !defined(WORDS_BIGENDIAN)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1134 memcpy(out, in, n * 8);
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
1135 #else
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1136 unsigned i;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1137 const uint64_t *ini = in;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1138 for (i = 0; i < n; i++)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1139 fixed64_pack(ini[i], (uint64_t *) out + i);
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
1140 #endif
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
1141 }
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
1142
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1143 /**
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1144 * Get the minimum number of bytes required to pack a field value of a
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1145 * particular type.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1146 *
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1147 * \param type
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1148 * Field type.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1149 * \return
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1150 * Number of bytes.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1151 */
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1152 static unsigned
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1153 get_type_min_size(ProtobufCType type)
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
1154 {
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1155 if (type == PROTOBUF_C_TYPE_SFIXED32 ||
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1156 type == PROTOBUF_C_TYPE_FIXED32 ||
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1157 type == PROTOBUF_C_TYPE_FLOAT)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1158 {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1159 return 4;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1160 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1161 if (type == PROTOBUF_C_TYPE_SFIXED64 ||
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1162 type == PROTOBUF_C_TYPE_FIXED64 ||
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1163 type == PROTOBUF_C_TYPE_DOUBLE)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1164 {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1165 return 8;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1166 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1167 return 1;
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
1168 }
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
1169
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1170 /**
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1171 * Packs the elements of a repeated field and returns the serialised field and
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1172 * its length.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1173 *
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1174 * \param field
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1175 * Field descriptor.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1176 * \param count
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1177 * Number of elements in the repeated field array.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1178 * \param member
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1179 * Pointer to the elements for this repeated field.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1180 * \param[out] out
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1181 * Serialised representation of the repeated field.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1182 * \return
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1183 * Number of bytes serialised to `out`.
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
1184 */
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1185 static size_t
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1186 repeated_field_pack(const ProtobufCFieldDescriptor *field,
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1187 size_t count, const void *member, uint8_t *out)
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
1188 {
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1189 void *array = *(void * const *) member;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1190 unsigned i;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1191
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1192 if (0 != (field->flags & PROTOBUF_C_FIELD_FLAG_PACKED)) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1193 unsigned header_len;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1194 unsigned len_start;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1195 unsigned min_length;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1196 unsigned payload_len;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1197 unsigned length_size_min;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1198 unsigned actual_length_size;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1199 uint8_t *payload_at;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1200
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1201 if (count == 0)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1202 return 0;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1203 header_len = tag_pack(field->id, out);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1204 out[0] |= PROTOBUF_C_WIRE_TYPE_LENGTH_PREFIXED;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1205 len_start = header_len;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1206 min_length = get_type_min_size(field->type) * count;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1207 length_size_min = uint32_size(min_length);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1208 header_len += length_size_min;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1209 payload_at = out + header_len;
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
1210
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1211 switch (field->type) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1212 case PROTOBUF_C_TYPE_SFIXED32:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1213 case PROTOBUF_C_TYPE_FIXED32:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1214 case PROTOBUF_C_TYPE_FLOAT:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1215 copy_to_little_endian_32(payload_at, array, count);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1216 payload_at += count * 4;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1217 break;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1218 case PROTOBUF_C_TYPE_SFIXED64:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1219 case PROTOBUF_C_TYPE_FIXED64:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1220 case PROTOBUF_C_TYPE_DOUBLE:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1221 copy_to_little_endian_64(payload_at, array, count);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1222 payload_at += count * 8;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1223 break;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1224 case PROTOBUF_C_TYPE_INT32: {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1225 const int32_t *arr = (const int32_t *) array;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1226 for (i = 0; i < count; i++)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1227 payload_at += int32_pack(arr[i], payload_at);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1228 break;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1229 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1230 case PROTOBUF_C_TYPE_SINT32: {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1231 const int32_t *arr = (const int32_t *) array;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1232 for (i = 0; i < count; i++)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1233 payload_at += sint32_pack(arr[i], payload_at);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1234 break;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1235 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1236 case PROTOBUF_C_TYPE_SINT64: {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1237 const int64_t *arr = (const int64_t *) array;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1238 for (i = 0; i < count; i++)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1239 payload_at += sint64_pack(arr[i], payload_at);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1240 break;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1241 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1242 case PROTOBUF_C_TYPE_ENUM:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1243 case PROTOBUF_C_TYPE_UINT32: {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1244 const uint32_t *arr = (const uint32_t *) array;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1245 for (i = 0; i < count; i++)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1246 payload_at += uint32_pack(arr[i], payload_at);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1247 break;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1248 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1249 case PROTOBUF_C_TYPE_INT64:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1250 case PROTOBUF_C_TYPE_UINT64: {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1251 const uint64_t *arr = (const uint64_t *) array;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1252 for (i = 0; i < count; i++)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1253 payload_at += uint64_pack(arr[i], payload_at);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1254 break;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1255 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1256 case PROTOBUF_C_TYPE_BOOL: {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1257 const protobuf_c_boolean *arr = (const protobuf_c_boolean *) array;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1258 for (i = 0; i < count; i++)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1259 payload_at += boolean_pack(arr[i], payload_at);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1260 break;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1261 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1262 default:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1263 PROTOBUF_C__ASSERT_NOT_REACHED();
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1264 }
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
1265
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1266 payload_len = payload_at - (out + header_len);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1267 actual_length_size = uint32_size(payload_len);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1268 if (length_size_min != actual_length_size) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1269 assert(actual_length_size == length_size_min + 1);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1270 memmove(out + header_len + 1, out + header_len,
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1271 payload_len);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1272 header_len++;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1273 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1274 uint32_pack(payload_len, out + len_start);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1275 return header_len + payload_len;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1276 } else {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1277 /* not "packed" cased */
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1278 /* CONSIDER: optimize this case a bit (by putting the loop inside the switch) */
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1279 size_t rv = 0;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1280 unsigned siz = sizeof_elt_in_repeated_array(field->type);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1281
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1282 for (i = 0; i < count; i++) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1283 rv += required_field_pack(field, array, out + rv);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1284 array = (char *)array + siz;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1285 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1286 return rv;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1287 }
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
1288 }
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
1289
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
1290 static size_t
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1291 unknown_field_pack(const ProtobufCMessageUnknownField *field, uint8_t *out)
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
1292 {
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1293 size_t rv = tag_pack(field->tag, out);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1294 out[0] |= field->wire_type;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1295 memcpy(out + rv, field->data, field->len);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1296 return rv + field->len;
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
1297 }
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
1298
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1299 /**@}*/
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
1300
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
1301 size_t
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1302 protobuf_c_message_pack(const ProtobufCMessage *message, uint8_t *out)
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
1303 {
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1304 unsigned i;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1305 size_t rv = 0;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1306
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1307 ASSERT_IS_MESSAGE(message);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1308 for (i = 0; i < message->descriptor->n_fields; i++) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1309 const ProtobufCFieldDescriptor *field =
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1310 message->descriptor->fields + i;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1311 const void *member = ((const char *) message) + field->offset;
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
1312
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1313 /*
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1314 * It doesn't hurt to compute qmember (a pointer to the
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1315 * quantifier field of the structure), but the pointer is only
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1316 * valid if the field is:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1317 * - a repeated field, or
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1318 * - an optional field that isn't a pointer type
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1319 * (Meaning: not a message or a string).
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1320 */
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1321 const void *qmember =
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1322 ((const char *) message) + field->quantifier_offset;
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
1323
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1324 if (field->label == PROTOBUF_C_LABEL_REQUIRED) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1325 rv += required_field_pack(field, member, out + rv);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1326 } else if (field->label == PROTOBUF_C_LABEL_OPTIONAL) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1327 /*
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1328 * Note that qmember is bogus for strings and messages,
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1329 * but it isn't used.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1330 */
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1331 rv += optional_field_pack(field, qmember, member, out + rv);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1332 } else {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1333 rv += repeated_field_pack(field, *(const size_t *) qmember,
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1334 member, out + rv);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1335 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1336 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1337 for (i = 0; i < message->n_unknown_fields; i++)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1338 rv += unknown_field_pack(&message->unknown_fields[i], out + rv);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1339 return rv;
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
1340 }
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
1341
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1342 /**
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1343 * \defgroup packbuf protobuf_c_message_pack_to_buffer() implementation
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1344 *
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1345 * Routines mainly used by protobuf_c_message_pack_to_buffer().
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1346 *
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1347 * \ingroup internal
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1348 * @{
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1349 */
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1350
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1351 /**
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1352 * Pack a required field to a virtual buffer.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1353 *
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1354 * \param field
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1355 * Field descriptor.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1356 * \param member
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1357 * The element to be packed.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1358 * \param[out] buffer
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1359 * Virtual buffer to append data to.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1360 * \return
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1361 * Number of bytes packed.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1362 */
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
1363 static size_t
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1364 required_field_pack_to_buffer(const ProtobufCFieldDescriptor *field,
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1365 const void *member, ProtobufCBuffer *buffer)
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
1366 {
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1367 size_t rv;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1368 uint8_t scratch[MAX_UINT64_ENCODED_SIZE * 2];
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1369
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1370 rv = tag_pack(field->id, scratch);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1371 switch (field->type) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1372 case PROTOBUF_C_TYPE_SINT32:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1373 scratch[0] |= PROTOBUF_C_WIRE_TYPE_VARINT;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1374 rv += sint32_pack(*(const int32_t *) member, scratch + rv);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1375 buffer->append(buffer, rv, scratch);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1376 break;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1377 case PROTOBUF_C_TYPE_INT32:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1378 scratch[0] |= PROTOBUF_C_WIRE_TYPE_VARINT;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1379 rv += int32_pack(*(const uint32_t *) member, scratch + rv);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1380 buffer->append(buffer, rv, scratch);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1381 break;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1382 case PROTOBUF_C_TYPE_UINT32:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1383 case PROTOBUF_C_TYPE_ENUM:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1384 scratch[0] |= PROTOBUF_C_WIRE_TYPE_VARINT;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1385 rv += uint32_pack(*(const uint32_t *) member, scratch + rv);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1386 buffer->append(buffer, rv, scratch);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1387 break;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1388 case PROTOBUF_C_TYPE_SINT64:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1389 scratch[0] |= PROTOBUF_C_WIRE_TYPE_VARINT;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1390 rv += sint64_pack(*(const int64_t *) member, scratch + rv);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1391 buffer->append(buffer, rv, scratch);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1392 break;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1393 case PROTOBUF_C_TYPE_INT64:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1394 case PROTOBUF_C_TYPE_UINT64:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1395 scratch[0] |= PROTOBUF_C_WIRE_TYPE_VARINT;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1396 rv += uint64_pack(*(const uint64_t *) member, scratch + rv);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1397 buffer->append(buffer, rv, scratch);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1398 break;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1399 case PROTOBUF_C_TYPE_SFIXED32:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1400 case PROTOBUF_C_TYPE_FIXED32:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1401 case PROTOBUF_C_TYPE_FLOAT:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1402 scratch[0] |= PROTOBUF_C_WIRE_TYPE_32BIT;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1403 rv += fixed32_pack(*(const uint32_t *) member, scratch + rv);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1404 buffer->append(buffer, rv, scratch);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1405 break;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1406 case PROTOBUF_C_TYPE_SFIXED64:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1407 case PROTOBUF_C_TYPE_FIXED64:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1408 case PROTOBUF_C_TYPE_DOUBLE:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1409 scratch[0] |= PROTOBUF_C_WIRE_TYPE_64BIT;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1410 rv += fixed64_pack(*(const uint64_t *) member, scratch + rv);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1411 buffer->append(buffer, rv, scratch);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1412 break;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1413 case PROTOBUF_C_TYPE_BOOL:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1414 scratch[0] |= PROTOBUF_C_WIRE_TYPE_VARINT;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1415 rv += boolean_pack(*(const protobuf_c_boolean *) member, scratch + rv);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1416 buffer->append(buffer, rv, scratch);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1417 break;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1418 case PROTOBUF_C_TYPE_STRING: {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1419 const char *str = *(char *const *) member;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1420 size_t sublen = str ? strlen(str) : 0;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1421
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1422 scratch[0] |= PROTOBUF_C_WIRE_TYPE_LENGTH_PREFIXED;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1423 rv += uint32_pack(sublen, scratch + rv);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1424 buffer->append(buffer, rv, scratch);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1425 buffer->append(buffer, sublen, (const uint8_t *) str);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1426 rv += sublen;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1427 break;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1428 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1429 case PROTOBUF_C_TYPE_BYTES: {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1430 const ProtobufCBinaryData *bd = ((const ProtobufCBinaryData *) member);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1431 size_t sublen = bd->len;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1432
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1433 scratch[0] |= PROTOBUF_C_WIRE_TYPE_LENGTH_PREFIXED;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1434 rv += uint32_pack(sublen, scratch + rv);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1435 buffer->append(buffer, rv, scratch);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1436 buffer->append(buffer, sublen, bd->data);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1437 rv += sublen;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1438 break;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1439 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1440 case PROTOBUF_C_TYPE_MESSAGE: {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1441 uint8_t simple_buffer_scratch[256];
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1442 size_t sublen;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1443 const ProtobufCMessage *msg = *(ProtobufCMessage * const *) member;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1444 ProtobufCBufferSimple simple_buffer =
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1445 PROTOBUF_C_BUFFER_SIMPLE_INIT(simple_buffer_scratch);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1446
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1447 scratch[0] |= PROTOBUF_C_WIRE_TYPE_LENGTH_PREFIXED;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1448 if (msg == NULL)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1449 sublen = 0;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1450 else
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1451 sublen = protobuf_c_message_pack_to_buffer(msg, &simple_buffer.base);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1452 rv += uint32_pack(sublen, scratch + rv);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1453 buffer->append(buffer, rv, scratch);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1454 buffer->append(buffer, sublen, simple_buffer.data);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1455 rv += sublen;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1456 PROTOBUF_C_BUFFER_SIMPLE_CLEAR(&simple_buffer);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1457 break;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1458 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1459 default:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1460 PROTOBUF_C__ASSERT_NOT_REACHED();
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1461 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1462 return rv;
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
1463 }
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
1464
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1465 /**
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1466 * Pack an optional field to a buffer.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1467 *
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1468 * \param field
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1469 * Field descriptor.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1470 * \param has
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1471 * Whether the field is set.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1472 * \param member
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1473 * The element to be packed.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1474 * \param[out] buffer
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1475 * Virtual buffer to append data to.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1476 * \return
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1477 * Number of bytes serialised to `buffer`.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1478 */
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
1479 static size_t
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1480 optional_field_pack_to_buffer(const ProtobufCFieldDescriptor *field,
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1481 const protobuf_c_boolean *has,
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1482 const void *member, ProtobufCBuffer *buffer)
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
1483 {
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1484 if (field->type == PROTOBUF_C_TYPE_MESSAGE ||
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1485 field->type == PROTOBUF_C_TYPE_STRING)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1486 {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1487 const void *ptr = *(const void *const *) member;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1488 if (ptr == NULL || ptr == field->default_value)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1489 return 0;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1490 } else {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1491 if (!*has)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1492 return 0;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1493 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1494 return required_field_pack_to_buffer(field, member, buffer);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1495 }
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
1496
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1497 /**
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1498 * Get the packed size of an array of same field type.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1499 *
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1500 * \param field
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1501 * Field descriptor.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1502 * \param count
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1503 * Number of elements of this type.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1504 * \param array
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1505 * The elements to get the size of.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1506 * \return
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1507 * Number of bytes required.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1508 */
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1509 static size_t
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1510 get_packed_payload_length(const ProtobufCFieldDescriptor *field,
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1511 unsigned count, const void *array)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1512 {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1513 unsigned rv = 0;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1514 unsigned i;
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
1515
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1516 switch (field->type) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1517 case PROTOBUF_C_TYPE_SFIXED32:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1518 case PROTOBUF_C_TYPE_FIXED32:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1519 case PROTOBUF_C_TYPE_FLOAT:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1520 return count * 4;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1521 case PROTOBUF_C_TYPE_SFIXED64:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1522 case PROTOBUF_C_TYPE_FIXED64:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1523 case PROTOBUF_C_TYPE_DOUBLE:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1524 return count * 8;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1525 case PROTOBUF_C_TYPE_INT32: {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1526 const int32_t *arr = (const int32_t *) array;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1527 for (i = 0; i < count; i++)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1528 rv += int32_size(arr[i]);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1529 break;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1530 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1531 case PROTOBUF_C_TYPE_SINT32: {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1532 const int32_t *arr = (const int32_t *) array;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1533 for (i = 0; i < count; i++)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1534 rv += sint32_size(arr[i]);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1535 break;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1536 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1537 case PROTOBUF_C_TYPE_ENUM:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1538 case PROTOBUF_C_TYPE_UINT32: {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1539 const uint32_t *arr = (const uint32_t *) array;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1540 for (i = 0; i < count; i++)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1541 rv += uint32_size(arr[i]);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1542 break;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1543 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1544 case PROTOBUF_C_TYPE_SINT64: {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1545 const int64_t *arr = (const int64_t *) array;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1546 for (i = 0; i < count; i++)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1547 rv += sint64_size(arr[i]);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1548 break;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1549 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1550 case PROTOBUF_C_TYPE_INT64:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1551 case PROTOBUF_C_TYPE_UINT64: {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1552 const uint64_t *arr = (const uint64_t *) array;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1553 for (i = 0; i < count; i++)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1554 rv += uint64_size(arr[i]);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1555 break;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1556 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1557 case PROTOBUF_C_TYPE_BOOL:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1558 return count;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1559 default:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1560 PROTOBUF_C__ASSERT_NOT_REACHED();
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1561 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1562 return rv;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1563 }
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
1564
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1565 /**
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1566 * Pack an array of same field type to a virtual buffer.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1567 *
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1568 * \param field
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1569 * Field descriptor.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1570 * \param count
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1571 * Number of elements of this type.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1572 * \param array
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1573 * The elements to get the size of.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1574 * \param[out] buffer
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1575 * Virtual buffer to append data to.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1576 * \return
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1577 * Number of bytes packed.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1578 */
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
1579 static size_t
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1580 pack_buffer_packed_payload(const ProtobufCFieldDescriptor *field,
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1581 unsigned count, const void *array,
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1582 ProtobufCBuffer *buffer)
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
1583 {
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1584 uint8_t scratch[16];
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1585 size_t rv = 0;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1586 unsigned i;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1587
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1588 switch (field->type) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1589 case PROTOBUF_C_TYPE_SFIXED32:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1590 case PROTOBUF_C_TYPE_FIXED32:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1591 case PROTOBUF_C_TYPE_FLOAT:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1592 #if !defined(WORDS_BIGENDIAN)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1593 rv = count * 4;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1594 goto no_packing_needed;
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
1595 #else
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1596 for (i = 0; i < count; i++) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1597 unsigned len = fixed32_pack(((uint32_t *) array)[i], scratch);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1598 buffer->append(buffer, len, scratch);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1599 rv += len;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1600 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1601 break;
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
1602 #endif
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1603 case PROTOBUF_C_TYPE_SFIXED64:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1604 case PROTOBUF_C_TYPE_FIXED64:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1605 case PROTOBUF_C_TYPE_DOUBLE:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1606 #if !defined(WORDS_BIGENDIAN)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1607 rv = count * 8;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1608 goto no_packing_needed;
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
1609 #else
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1610 for (i = 0; i < count; i++) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1611 unsigned len = fixed64_pack(((uint64_t *) array)[i], scratch);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1612 buffer->append(buffer, len, scratch);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1613 rv += len;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1614 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1615 break;
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
1616 #endif
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1617 case PROTOBUF_C_TYPE_INT32:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1618 for (i = 0; i < count; i++) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1619 unsigned len = int32_pack(((int32_t *) array)[i], scratch);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1620 buffer->append(buffer, len, scratch);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1621 rv += len;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1622 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1623 break;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1624 case PROTOBUF_C_TYPE_SINT32:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1625 for (i = 0; i < count; i++) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1626 unsigned len = sint32_pack(((int32_t *) array)[i], scratch);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1627 buffer->append(buffer, len, scratch);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1628 rv += len;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1629 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1630 break;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1631 case PROTOBUF_C_TYPE_ENUM:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1632 case PROTOBUF_C_TYPE_UINT32:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1633 for (i = 0; i < count; i++) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1634 unsigned len = uint32_pack(((uint32_t *) array)[i], scratch);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1635 buffer->append(buffer, len, scratch);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1636 rv += len;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1637 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1638 break;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1639 case PROTOBUF_C_TYPE_SINT64:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1640 for (i = 0; i < count; i++) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1641 unsigned len = sint64_pack(((int64_t *) array)[i], scratch);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1642 buffer->append(buffer, len, scratch);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1643 rv += len;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1644 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1645 break;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1646 case PROTOBUF_C_TYPE_INT64:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1647 case PROTOBUF_C_TYPE_UINT64:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1648 for (i = 0; i < count; i++) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1649 unsigned len = uint64_pack(((uint64_t *) array)[i], scratch);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1650 buffer->append(buffer, len, scratch);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1651 rv += len;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1652 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1653 break;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1654 case PROTOBUF_C_TYPE_BOOL:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1655 for (i = 0; i < count; i++) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1656 unsigned len = boolean_pack(((protobuf_c_boolean *) array)[i], scratch);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1657 buffer->append(buffer, len, scratch);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1658 rv += len;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1659 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1660 return count;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1661 default:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1662 PROTOBUF_C__ASSERT_NOT_REACHED();
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1663 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1664 return rv;
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
1665
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1666 #if !defined(WORDS_BIGENDIAN)
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
1667 no_packing_needed:
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1668 buffer->append(buffer, rv, array);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1669 return rv;
35650
f4232b1c3263 Update libgadu yet again
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35645
diff changeset
1670 #endif
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
1671 }
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
1672
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
1673 static size_t
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1674 repeated_field_pack_to_buffer(const ProtobufCFieldDescriptor *field,
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1675 unsigned count, const void *member,
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1676 ProtobufCBuffer *buffer)
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
1677 {
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1678 char *array = *(char * const *) member;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1679
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1680 if (count == 0)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1681 return 0;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1682 if (0 != (field->flags & PROTOBUF_C_FIELD_FLAG_PACKED)) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1683 uint8_t scratch[MAX_UINT64_ENCODED_SIZE * 2];
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1684 size_t rv = tag_pack(field->id, scratch);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1685 size_t payload_len = get_packed_payload_length(field, count, array);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1686 size_t tmp;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1687
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1688 scratch[0] |= PROTOBUF_C_WIRE_TYPE_LENGTH_PREFIXED;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1689 rv += uint32_pack(payload_len, scratch + rv);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1690 buffer->append(buffer, rv, scratch);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1691 tmp = pack_buffer_packed_payload(field, count, array, buffer);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1692 assert(tmp == payload_len);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1693 return rv + payload_len;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1694 } else {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1695 size_t siz;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1696 unsigned i;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1697 /* CONSIDER: optimize this case a bit (by putting the loop inside the switch) */
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1698 unsigned rv = 0;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1699
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1700 siz = sizeof_elt_in_repeated_array(field->type);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1701 for (i = 0; i < count; i++) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1702 rv += required_field_pack_to_buffer(field, array, buffer);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1703 array = ((char*)array) + siz;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1704 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1705 return rv;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1706 }
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
1707 }
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
1708
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
1709 static size_t
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1710 unknown_field_pack_to_buffer(const ProtobufCMessageUnknownField *field,
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1711 ProtobufCBuffer *buffer)
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
1712 {
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1713 uint8_t header[MAX_UINT64_ENCODED_SIZE];
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1714 size_t rv = tag_pack(field->tag, header);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1715
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1716 header[0] |= field->wire_type;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1717 buffer->append(buffer, rv, header);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1718 buffer->append(buffer, field->len, field->data);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1719 return rv + field->len;
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
1720 }
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
1721
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1722 /**@}*/
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1723
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
1724 size_t
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1725 protobuf_c_message_pack_to_buffer(const ProtobufCMessage *message,
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1726 ProtobufCBuffer *buffer)
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
1727 {
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1728 unsigned i;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1729 size_t rv = 0;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1730
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1731 ASSERT_IS_MESSAGE(message);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1732 for (i = 0; i < message->descriptor->n_fields; i++) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1733 const ProtobufCFieldDescriptor *field =
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1734 message->descriptor->fields + i;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1735 const void *member =
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1736 ((const char *) message) + field->offset;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1737 const void *qmember =
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1738 ((const char *) message) + field->quantifier_offset;
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
1739
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1740 if (field->label == PROTOBUF_C_LABEL_REQUIRED) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1741 rv += required_field_pack_to_buffer(field, member, buffer);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1742 } else if (field->label == PROTOBUF_C_LABEL_OPTIONAL) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1743 rv += optional_field_pack_to_buffer(
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1744 field,
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1745 qmember,
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1746 member,
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1747 buffer
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1748 );
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1749 } else {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1750 rv += repeated_field_pack_to_buffer(
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1751 field,
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1752 *(const size_t *) qmember,
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1753 member,
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1754 buffer
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1755 );
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1756 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1757 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1758 for (i = 0; i < message->n_unknown_fields; i++)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1759 rv += unknown_field_pack_to_buffer(&message->unknown_fields[i], buffer);
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
1760
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1761 return rv;
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
1762 }
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
1763
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1764 /**
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1765 * \defgroup unpack unpacking implementation
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1766 *
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1767 * Routines mainly used by the unpacking functions.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1768 *
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1769 * \ingroup internal
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1770 * @{
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1771 */
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
1772
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
1773 static inline int
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1774 int_range_lookup(unsigned n_ranges, const ProtobufCIntRange *ranges, int value)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1775 {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1776 unsigned n;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1777 unsigned start;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1778
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1779 if (n_ranges == 0)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1780 return -1;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1781 start = 0;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1782 n = n_ranges;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1783 while (n > 1) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1784 unsigned mid = start + n / 2;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1785
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1786 if (value < ranges[mid].start_value) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1787 n = mid - start;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1788 } else if (value >= ranges[mid].start_value +
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1789 (int) (ranges[mid + 1].orig_index -
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1790 ranges[mid].orig_index))
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1791 {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1792 unsigned new_start = mid + 1;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1793 n = start + n - new_start;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1794 start = new_start;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1795 } else
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1796 return (value - ranges[mid].start_value) +
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1797 ranges[mid].orig_index;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1798 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1799 if (n > 0) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1800 unsigned start_orig_index = ranges[start].orig_index;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1801 unsigned range_size =
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1802 ranges[start + 1].orig_index - start_orig_index;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1803
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1804 if (ranges[start].start_value <= value &&
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1805 value < (int) (ranges[start].start_value + range_size))
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1806 {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1807 return (value - ranges[start].start_value) +
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1808 start_orig_index;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1809 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1810 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1811 return -1;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1812 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1813
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1814 static size_t
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1815 parse_tag_and_wiretype(size_t len,
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1816 const uint8_t *data,
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1817 uint32_t *tag_out,
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1818 ProtobufCWireType *wiretype_out)
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
1819 {
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1820 unsigned max_rv = len > 5 ? 5 : len;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1821 uint32_t tag = (data[0] & 0x7f) >> 3;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1822 unsigned shift = 4;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1823 unsigned rv;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1824
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1825 *wiretype_out = data[0] & 7;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1826 if ((data[0] & 0x80) == 0) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1827 *tag_out = tag;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1828 return 1;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1829 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1830 for (rv = 1; rv < max_rv; rv++) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1831 if (data[rv] & 0x80) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1832 tag |= (data[rv] & 0x7f) << shift;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1833 shift += 7;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1834 } else {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1835 tag |= data[rv] << shift;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1836 *tag_out = tag;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1837 return rv + 1;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1838 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1839 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1840 return 0; /* error: bad header */
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1841 }
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
1842
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1843 /* sizeof(ScannedMember) must be <= (1<<BOUND_SIZEOF_SCANNED_MEMBER_LOG2) */
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1844 #define BOUND_SIZEOF_SCANNED_MEMBER_LOG2 5
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1845 typedef struct _ScannedMember ScannedMember;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1846 /** Field as it's being read. */
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1847 struct _ScannedMember {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1848 uint32_t tag; /**< Field tag. */
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1849 uint8_t wire_type; /**< Field type. */
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1850 uint8_t length_prefix_len; /**< Prefix length. */
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1851 const ProtobufCFieldDescriptor *field; /**< Field descriptor. */
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1852 size_t len; /**< Field length. */
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1853 const uint8_t *data; /**< Pointer to field data. */
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1854 };
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1855
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1856 static inline uint32_t
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1857 scan_length_prefixed_data(size_t len, const uint8_t *data,
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1858 size_t *prefix_len_out)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1859 {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1860 unsigned hdr_max = len < 5 ? len : 5;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1861 unsigned hdr_len;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1862 uint32_t val = 0;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1863 unsigned i;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1864 unsigned shift = 0;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1865
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1866 for (i = 0; i < hdr_max; i++) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1867 val |= (data[i] & 0x7f) << shift;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1868 shift += 7;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1869 if ((data[i] & 0x80) == 0)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1870 break;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1871 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1872 if (i == hdr_max) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1873 PROTOBUF_C_UNPACK_ERROR("error parsing length for length-prefixed data");
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1874 return 0;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1875 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1876 hdr_len = i + 1;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1877 *prefix_len_out = hdr_len;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1878 if (hdr_len + val > len) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1879 PROTOBUF_C_UNPACK_ERROR("data too short after length-prefix of %u", val);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1880 return 0;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1881 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1882 return hdr_len + val;
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
1883 }
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
1884
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
1885 static size_t
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1886 max_b128_numbers(size_t len, const uint8_t *data)
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
1887 {
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1888 size_t rv = 0;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1889 while (len--)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1890 if ((*data++ & 0x80) == 0)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1891 ++rv;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1892 return rv;
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
1893 }
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
1894
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1895 /**@}*/
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
1896
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1897 /**
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1898 * Merge earlier message into a latter message.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1899 *
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1900 * For numeric types and strings, if the same value appears multiple
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1901 * times, the parser accepts the last value it sees. For embedded
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1902 * message fields, the parser merges multiple instances of the same
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1903 * field. That is, all singular scalar fields in the latter instance
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1904 * replace those in the former, singular embedded messages are merged,
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1905 * and repeated fields are concatenated.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1906 *
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1907 * The earlier message should be freed after calling this function, as
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1908 * some of its fields may have been reused and changed to their default
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1909 * values during the merge.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1910 */
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1911 static protobuf_c_boolean
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1912 merge_messages(ProtobufCMessage *earlier_msg,
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1913 ProtobufCMessage *latter_msg,
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1914 ProtobufCAllocator *allocator)
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
1915 {
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1916 unsigned i;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1917 const ProtobufCFieldDescriptor *fields =
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1918 earlier_msg->descriptor->fields;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1919 for (i = 0; i < latter_msg->descriptor->n_fields; i++) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1920 if (fields[i].label == PROTOBUF_C_LABEL_REPEATED) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1921 size_t *n_earlier =
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1922 STRUCT_MEMBER_PTR(size_t, earlier_msg,
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1923 fields[i].quantifier_offset);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1924 uint8_t **p_earlier =
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1925 STRUCT_MEMBER_PTR(uint8_t *, earlier_msg,
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1926 fields[i].offset);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1927 size_t *n_latter =
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1928 STRUCT_MEMBER_PTR(size_t, latter_msg,
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1929 fields[i].quantifier_offset);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1930 uint8_t **p_latter =
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1931 STRUCT_MEMBER_PTR(uint8_t *, latter_msg,
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1932 fields[i].offset);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1933
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1934 if (*n_earlier > 0) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1935 if (*n_latter > 0) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1936 /* Concatenate the repeated field */
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1937 size_t el_size =
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1938 sizeof_elt_in_repeated_array(fields[i].type);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1939 uint8_t *new_field;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1940
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1941 new_field = do_alloc(allocator,
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1942 (*n_earlier + *n_latter) * el_size);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1943 if (!new_field)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1944 return FALSE;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1945
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1946 memcpy(new_field, *p_earlier,
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1947 *n_earlier * el_size);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1948 memcpy(new_field +
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1949 *n_earlier * el_size,
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1950 *p_latter,
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1951 *n_latter * el_size);
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
1952
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1953 do_free(allocator, *p_latter);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1954 do_free(allocator, *p_earlier);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1955 *p_latter = new_field;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1956 *n_latter = *n_earlier + *n_latter;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1957 } else {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1958 /* Zero copy the repeated field from the earlier message */
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1959 *n_latter = *n_earlier;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1960 *p_latter = *p_earlier;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1961 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1962 /* Make sure the field does not get double freed */
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1963 *n_earlier = 0;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1964 *p_earlier = 0;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1965 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1966 } else if (fields[i].type == PROTOBUF_C_TYPE_MESSAGE) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1967 ProtobufCMessage **em =
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1968 STRUCT_MEMBER_PTR(ProtobufCMessage *,
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1969 earlier_msg,
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1970 fields[i].offset);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1971 ProtobufCMessage **lm =
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1972 STRUCT_MEMBER_PTR(ProtobufCMessage *,
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1973 latter_msg,
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1974 fields[i].offset);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1975 if (*em != NULL) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1976 if (*lm != NULL) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1977 if (!merge_messages
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1978 (*em, *lm, allocator))
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1979 return FALSE;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1980 } else {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1981 /* Zero copy the optional message */
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1982 assert(fields[i].label ==
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1983 PROTOBUF_C_LABEL_OPTIONAL);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1984 *lm = *em;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1985 *em = NULL;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1986 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1987 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1988 } else if (fields[i].label == PROTOBUF_C_LABEL_OPTIONAL) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1989 size_t el_size = 0;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1990 protobuf_c_boolean need_to_merge = FALSE;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1991 void *earlier_elem =
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1992 STRUCT_MEMBER_P(earlier_msg, fields[i].offset);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1993 void *latter_elem =
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1994 STRUCT_MEMBER_P(latter_msg, fields[i].offset);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1995 const void *def_val = fields[i].default_value;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1996
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1997 switch (fields[i].type) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1998 case PROTOBUF_C_TYPE_BYTES: {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
1999 uint8_t *e_data =
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2000 ((ProtobufCBinaryData *) earlier_elem)->data;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2001 uint8_t *l_data =
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2002 ((ProtobufCBinaryData *) latter_elem)->data;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2003 const ProtobufCBinaryData *d_bd =
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2004 (ProtobufCBinaryData *) def_val;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2005
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2006 el_size = sizeof(ProtobufCBinaryData);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2007 need_to_merge =
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2008 (e_data != NULL &&
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2009 (d_bd != NULL &&
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2010 e_data != d_bd->data)) &&
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2011 (l_data == NULL ||
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2012 (d_bd != NULL &&
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2013 l_data == d_bd->data));
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2014 break;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2015 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2016 case PROTOBUF_C_TYPE_STRING: {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2017 char *e_str = *(char **) earlier_elem;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2018 char *l_str = *(char **) latter_elem;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2019 const char *d_str = def_val;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2020
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2021 el_size = sizeof(char *);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2022 need_to_merge = e_str != d_str && l_str == d_str;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2023 break;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2024 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2025 default: {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2026 el_size = sizeof_elt_in_repeated_array(fields[i].type);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2027
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2028 need_to_merge =
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2029 STRUCT_MEMBER(protobuf_c_boolean,
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2030 earlier_msg,
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2031 fields[i].quantifier_offset) &&
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2032 !STRUCT_MEMBER(protobuf_c_boolean,
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2033 latter_msg,
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2034 fields[i].quantifier_offset);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2035 break;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2036 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2037 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2038
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2039 if (need_to_merge) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2040 memcpy(latter_elem, earlier_elem, el_size);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2041 /*
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2042 * Reset the element from the old message to 0
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2043 * to make sure earlier message deallocation
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2044 * doesn't corrupt zero-copied data in the new
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2045 * message, earlier message will be freed after
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2046 * this function is called anyway
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2047 */
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2048 memset(earlier_elem, 0, el_size);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2049
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2050 if (fields[i].quantifier_offset != 0) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2051 /* Set the has field, if applicable */
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2052 STRUCT_MEMBER(protobuf_c_boolean,
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2053 latter_msg,
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2054 fields[i].
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2055 quantifier_offset) = TRUE;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2056 STRUCT_MEMBER(protobuf_c_boolean,
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2057 earlier_msg,
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2058 fields[i].
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2059 quantifier_offset) = FALSE;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2060 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2061 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2062 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2063 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2064 return TRUE;
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
2065 }
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
2066
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2067 /**
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2068 * Count packed elements.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2069 *
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2070 * Given a raw slab of packed-repeated values, determine the number of
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2071 * elements. This function detects certain kinds of errors but not
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2072 * others; the remaining error checking is done by
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2073 * parse_packed_repeated_member().
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2074 */
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
2075 static protobuf_c_boolean
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2076 count_packed_elements(ProtobufCType type,
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2077 size_t len, const uint8_t *data, size_t *count_out)
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
2078 {
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2079 switch (type) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2080 case PROTOBUF_C_TYPE_SFIXED32:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2081 case PROTOBUF_C_TYPE_FIXED32:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2082 case PROTOBUF_C_TYPE_FLOAT:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2083 if (len % 4 != 0) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2084 PROTOBUF_C_UNPACK_ERROR("length must be a multiple of 4 for fixed-length 32-bit types");
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2085 return FALSE;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2086 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2087 *count_out = len / 4;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2088 return TRUE;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2089 case PROTOBUF_C_TYPE_SFIXED64:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2090 case PROTOBUF_C_TYPE_FIXED64:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2091 case PROTOBUF_C_TYPE_DOUBLE:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2092 if (len % 8 != 0) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2093 PROTOBUF_C_UNPACK_ERROR("length must be a multiple of 8 for fixed-length 64-bit types");
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2094 return FALSE;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2095 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2096 *count_out = len / 8;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2097 return TRUE;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2098 case PROTOBUF_C_TYPE_INT32:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2099 case PROTOBUF_C_TYPE_SINT32:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2100 case PROTOBUF_C_TYPE_ENUM:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2101 case PROTOBUF_C_TYPE_UINT32:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2102 case PROTOBUF_C_TYPE_INT64:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2103 case PROTOBUF_C_TYPE_SINT64:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2104 case PROTOBUF_C_TYPE_UINT64:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2105 *count_out = max_b128_numbers(len, data);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2106 return TRUE;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2107 case PROTOBUF_C_TYPE_BOOL:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2108 *count_out = len;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2109 return TRUE;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2110 case PROTOBUF_C_TYPE_STRING:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2111 case PROTOBUF_C_TYPE_BYTES:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2112 case PROTOBUF_C_TYPE_MESSAGE:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2113 default:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2114 PROTOBUF_C_UNPACK_ERROR("bad protobuf-c type %u for packed-repeated", type);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2115 return FALSE;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2116 }
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
2117 }
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
2118
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
2119 static inline uint32_t
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2120 parse_uint32(unsigned len, const uint8_t *data)
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
2121 {
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2122 uint32_t rv = data[0] & 0x7f;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2123 if (len > 1) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2124 rv |= ((uint32_t) (data[1] & 0x7f) << 7);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2125 if (len > 2) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2126 rv |= ((uint32_t) (data[2] & 0x7f) << 14);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2127 if (len > 3) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2128 rv |= ((uint32_t) (data[3] & 0x7f) << 21);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2129 if (len > 4)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2130 rv |= ((uint32_t) (data[4]) << 28);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2131 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2132 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2133 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2134 return rv;
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
2135 }
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2136
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
2137 static inline uint32_t
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2138 parse_int32(unsigned len, const uint8_t *data)
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
2139 {
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2140 return parse_uint32(len, data);
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
2141 }
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2142
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
2143 static inline int32_t
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2144 unzigzag32(uint32_t v)
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
2145 {
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2146 if (v & 1)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2147 return -(v >> 1) - 1;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2148 else
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2149 return v >> 1;
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
2150 }
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2151
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
2152 static inline uint32_t
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2153 parse_fixed_uint32(const uint8_t *data)
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
2154 {
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2155 #if !defined(WORDS_BIGENDIAN)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2156 uint32_t t;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2157 memcpy(&t, data, 4);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2158 return t;
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
2159 #else
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2160 return data[0] |
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2161 ((uint32_t) (data[1]) << 8) |
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2162 ((uint32_t) (data[2]) << 16) |
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2163 ((uint32_t) (data[3]) << 24);
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
2164 #endif
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
2165 }
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2166
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2167 static uint64_t
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2168 parse_uint64(unsigned len, const uint8_t *data)
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
2169 {
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2170 unsigned shift, i;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2171 uint64_t rv;
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
2172
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2173 if (len < 5)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2174 return parse_uint32(len, data);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2175 rv = ((uint64_t) (data[0] & 0x7f)) |
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2176 ((uint64_t) (data[1] & 0x7f) << 7) |
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2177 ((uint64_t) (data[2] & 0x7f) << 14) |
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2178 ((uint64_t) (data[3] & 0x7f) << 21);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2179 shift = 28;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2180 for (i = 4; i < len; i++) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2181 rv |= (((uint64_t) (data[i] & 0x7f)) << shift);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2182 shift += 7;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2183 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2184 return rv;
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
2185 }
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
2186
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2187 static inline int64_t
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2188 unzigzag64(uint64_t v)
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
2189 {
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2190 if (v & 1)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2191 return -(v >> 1) - 1;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2192 else
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2193 return v >> 1;
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
2194 }
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
2195
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2196 static inline uint64_t
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2197 parse_fixed_uint64(const uint8_t *data)
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
2198 {
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2199 #if !defined(WORDS_BIGENDIAN)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2200 uint64_t t;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2201 memcpy(&t, data, 8);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2202 return t;
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
2203 #else
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2204 return (uint64_t) parse_fixed_uint32(data) |
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2205 (((uint64_t) parse_fixed_uint32(data + 4)) << 32);
35650
f4232b1c3263 Update libgadu yet again
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35645
diff changeset
2206 #endif
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
2207 }
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
2208
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
2209 static protobuf_c_boolean
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2210 parse_boolean(unsigned len, const uint8_t *data)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2211 {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2212 unsigned i;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2213 for (i = 0; i < len; i++)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2214 if (data[i] & 0x7f)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2215 return TRUE;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2216 return FALSE;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2217 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2218
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2219 static protobuf_c_boolean
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2220 parse_required_member(ScannedMember *scanned_member,
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2221 void *member,
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2222 ProtobufCAllocator *allocator,
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2223 protobuf_c_boolean maybe_clear)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2224 {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2225 unsigned len = scanned_member->len;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2226 const uint8_t *data = scanned_member->data;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2227 ProtobufCWireType wire_type = scanned_member->wire_type;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2228
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2229 switch (scanned_member->field->type) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2230 case PROTOBUF_C_TYPE_INT32:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2231 if (wire_type != PROTOBUF_C_WIRE_TYPE_VARINT)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2232 return FALSE;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2233 *(uint32_t *) member = parse_int32(len, data);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2234 return TRUE;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2235 case PROTOBUF_C_TYPE_UINT32:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2236 if (wire_type != PROTOBUF_C_WIRE_TYPE_VARINT)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2237 return FALSE;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2238 *(uint32_t *) member = parse_uint32(len, data);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2239 return TRUE;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2240 case PROTOBUF_C_TYPE_SINT32:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2241 if (wire_type != PROTOBUF_C_WIRE_TYPE_VARINT)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2242 return FALSE;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2243 *(int32_t *) member = unzigzag32(parse_uint32(len, data));
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2244 return TRUE;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2245 case PROTOBUF_C_TYPE_SFIXED32:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2246 case PROTOBUF_C_TYPE_FIXED32:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2247 case PROTOBUF_C_TYPE_FLOAT:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2248 if (wire_type != PROTOBUF_C_WIRE_TYPE_32BIT)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2249 return FALSE;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2250 *(uint32_t *) member = parse_fixed_uint32(data);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2251 return TRUE;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2252 case PROTOBUF_C_TYPE_INT64:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2253 case PROTOBUF_C_TYPE_UINT64:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2254 if (wire_type != PROTOBUF_C_WIRE_TYPE_VARINT)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2255 return FALSE;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2256 *(uint64_t *) member = parse_uint64(len, data);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2257 return TRUE;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2258 case PROTOBUF_C_TYPE_SINT64:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2259 if (wire_type != PROTOBUF_C_WIRE_TYPE_VARINT)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2260 return FALSE;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2261 *(int64_t *) member = unzigzag64(parse_uint64(len, data));
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2262 return TRUE;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2263 case PROTOBUF_C_TYPE_SFIXED64:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2264 case PROTOBUF_C_TYPE_FIXED64:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2265 case PROTOBUF_C_TYPE_DOUBLE:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2266 if (wire_type != PROTOBUF_C_WIRE_TYPE_64BIT)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2267 return FALSE;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2268 *(uint64_t *) member = parse_fixed_uint64(data);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2269 return TRUE;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2270 case PROTOBUF_C_TYPE_BOOL:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2271 *(protobuf_c_boolean *) member = parse_boolean(len, data);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2272 return TRUE;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2273 case PROTOBUF_C_TYPE_ENUM:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2274 if (wire_type != PROTOBUF_C_WIRE_TYPE_VARINT)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2275 return FALSE;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2276 *(uint32_t *) member = parse_uint32(len, data);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2277 return TRUE;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2278 case PROTOBUF_C_TYPE_STRING: {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2279 char **pstr = member;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2280 unsigned pref_len = scanned_member->length_prefix_len;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2281
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2282 if (wire_type != PROTOBUF_C_WIRE_TYPE_LENGTH_PREFIXED)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2283 return FALSE;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2284
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2285 if (maybe_clear && *pstr != NULL) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2286 const char *def = scanned_member->field->default_value;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2287 if (*pstr != NULL && *pstr != def)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2288 do_free(allocator, *pstr);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2289 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2290 *pstr = do_alloc(allocator, len - pref_len + 1);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2291 if (*pstr == NULL)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2292 return FALSE;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2293 memcpy(*pstr, data + pref_len, len - pref_len);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2294 (*pstr)[len - pref_len] = 0;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2295 return TRUE;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2296 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2297 case PROTOBUF_C_TYPE_BYTES: {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2298 ProtobufCBinaryData *bd = member;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2299 const ProtobufCBinaryData *def_bd;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2300 unsigned pref_len = scanned_member->length_prefix_len;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2301
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2302 if (wire_type != PROTOBUF_C_WIRE_TYPE_LENGTH_PREFIXED)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2303 return FALSE;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2304
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2305 def_bd = scanned_member->field->default_value;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2306 if (maybe_clear &&
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2307 bd->data != NULL &&
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2308 (def_bd == NULL || bd->data != def_bd->data))
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2309 {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2310 do_free(allocator, bd->data);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2311 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2312 if (len - pref_len > 0) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2313 bd->data = do_alloc(allocator, len - pref_len);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2314 if (bd->data == NULL)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2315 return FALSE;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2316 memcpy(bd->data, data + pref_len, len - pref_len);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2317 } else {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2318 bd->data = NULL;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2319 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2320 bd->len = len - pref_len;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2321 return TRUE;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2322 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2323 case PROTOBUF_C_TYPE_MESSAGE: {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2324 ProtobufCMessage **pmessage = member;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2325 ProtobufCMessage *subm;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2326 const ProtobufCMessage *def_mess;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2327 protobuf_c_boolean merge_successful = TRUE;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2328 unsigned pref_len = scanned_member->length_prefix_len;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2329
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2330 if (wire_type != PROTOBUF_C_WIRE_TYPE_LENGTH_PREFIXED)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2331 return FALSE;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2332
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2333 def_mess = scanned_member->field->default_value;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2334 subm = protobuf_c_message_unpack(scanned_member->field->descriptor,
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2335 allocator,
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2336 len - pref_len,
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2337 data + pref_len);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2338
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2339 if (maybe_clear &&
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2340 *pmessage != NULL &&
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2341 *pmessage != def_mess)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2342 {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2343 if (subm != NULL)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2344 merge_successful = merge_messages(*pmessage, subm, allocator);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2345 /* Delete the previous message */
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2346 protobuf_c_message_free_unpacked(*pmessage, allocator);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2347 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2348 *pmessage = subm;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2349 if (subm == NULL || !merge_successful)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2350 return FALSE;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2351 return TRUE;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2352 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2353 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2354 return FALSE;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2355 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2356
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2357 static protobuf_c_boolean
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2358 parse_optional_member(ScannedMember *scanned_member,
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2359 void *member,
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2360 ProtobufCMessage *message,
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2361 ProtobufCAllocator *allocator)
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
2362 {
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2363 if (!parse_required_member(scanned_member, member, allocator, TRUE))
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2364 return FALSE;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2365 if (scanned_member->field->quantifier_offset != 0)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2366 STRUCT_MEMBER(protobuf_c_boolean,
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2367 message,
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2368 scanned_member->field->quantifier_offset) = TRUE;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2369 return TRUE;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2370 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2371
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2372 static protobuf_c_boolean
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2373 parse_repeated_member(ScannedMember *scanned_member,
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2374 void *member,
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2375 ProtobufCMessage *message,
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2376 ProtobufCAllocator *allocator)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2377 {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2378 const ProtobufCFieldDescriptor *field = scanned_member->field;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2379 size_t *p_n = STRUCT_MEMBER_PTR(size_t, message, field->quantifier_offset);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2380 size_t siz = sizeof_elt_in_repeated_array(field->type);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2381 char *array = *(char **) member;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2382
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2383 if (!parse_required_member(scanned_member, array + siz * (*p_n),
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2384 allocator, FALSE))
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2385 {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2386 return FALSE;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2387 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2388 *p_n += 1;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2389 return TRUE;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2390 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2391
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2392 static unsigned
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2393 scan_varint(unsigned len, const uint8_t *data)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2394 {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2395 unsigned i;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2396 if (len > 10)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2397 len = 10;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2398 for (i = 0; i < len; i++)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2399 if ((data[i] & 0x80) == 0)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2400 break;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2401 if (i == len)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2402 return 0;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2403 return i + 1;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2404 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2405
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2406 static protobuf_c_boolean
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2407 parse_packed_repeated_member(ScannedMember *scanned_member,
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2408 void *member,
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2409 ProtobufCMessage *message)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2410 {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2411 const ProtobufCFieldDescriptor *field = scanned_member->field;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2412 size_t *p_n = STRUCT_MEMBER_PTR(size_t, message, field->quantifier_offset);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2413 size_t siz = sizeof_elt_in_repeated_array(field->type);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2414 void *array = *(char **) member + siz * (*p_n);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2415 const uint8_t *at = scanned_member->data + scanned_member->length_prefix_len;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2416 size_t rem = scanned_member->len - scanned_member->length_prefix_len;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2417 size_t count = 0;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2418 unsigned i;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2419
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2420 switch (field->type) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2421 case PROTOBUF_C_TYPE_SFIXED32:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2422 case PROTOBUF_C_TYPE_FIXED32:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2423 case PROTOBUF_C_TYPE_FLOAT:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2424 count = (scanned_member->len - scanned_member->length_prefix_len) / 4;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2425 #if !defined(WORDS_BIGENDIAN)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2426 goto no_unpacking_needed;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2427 #else
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2428 for (i = 0; i < count; i++) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2429 ((uint32_t *) array)[i] = parse_fixed_uint32(at);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2430 at += 4;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2431 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2432 break;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2433 #endif
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2434 case PROTOBUF_C_TYPE_SFIXED64:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2435 case PROTOBUF_C_TYPE_FIXED64:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2436 case PROTOBUF_C_TYPE_DOUBLE:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2437 count = (scanned_member->len - scanned_member->length_prefix_len) / 8;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2438 #if !defined(WORDS_BIGENDIAN)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2439 goto no_unpacking_needed;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2440 #else
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2441 for (i = 0; i < count; i++) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2442 ((uint64_t *) array)[i] = parse_fixed_uint64(at);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2443 at += 8;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2444 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2445 break;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2446 #endif
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2447 case PROTOBUF_C_TYPE_INT32:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2448 while (rem > 0) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2449 unsigned s = scan_varint(rem, at);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2450 if (s == 0) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2451 PROTOBUF_C_UNPACK_ERROR("bad packed-repeated int32 value");
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2452 return FALSE;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2453 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2454 ((int32_t *) array)[count++] = parse_int32(s, at);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2455 at += s;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2456 rem -= s;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2457 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2458 break;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2459 case PROTOBUF_C_TYPE_SINT32:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2460 while (rem > 0) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2461 unsigned s = scan_varint(rem, at);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2462 if (s == 0) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2463 PROTOBUF_C_UNPACK_ERROR("bad packed-repeated sint32 value");
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2464 return FALSE;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2465 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2466 ((int32_t *) array)[count++] = unzigzag32(parse_uint32(s, at));
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2467 at += s;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2468 rem -= s;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2469 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2470 break;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2471 case PROTOBUF_C_TYPE_ENUM:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2472 case PROTOBUF_C_TYPE_UINT32:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2473 while (rem > 0) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2474 unsigned s = scan_varint(rem, at);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2475 if (s == 0) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2476 PROTOBUF_C_UNPACK_ERROR("bad packed-repeated enum or uint32 value");
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2477 return FALSE;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2478 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2479 ((uint32_t *) array)[count++] = parse_uint32(s, at);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2480 at += s;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2481 rem -= s;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2482 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2483 break;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2484
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2485 case PROTOBUF_C_TYPE_SINT64:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2486 while (rem > 0) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2487 unsigned s = scan_varint(rem, at);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2488 if (s == 0) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2489 PROTOBUF_C_UNPACK_ERROR("bad packed-repeated sint64 value");
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2490 return FALSE;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2491 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2492 ((int64_t *) array)[count++] = unzigzag64(parse_uint64(s, at));
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2493 at += s;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2494 rem -= s;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2495 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2496 break;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2497 case PROTOBUF_C_TYPE_INT64:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2498 case PROTOBUF_C_TYPE_UINT64:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2499 while (rem > 0) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2500 unsigned s = scan_varint(rem, at);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2501 if (s == 0) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2502 PROTOBUF_C_UNPACK_ERROR("bad packed-repeated int64/uint64 value");
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2503 return FALSE;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2504 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2505 ((int64_t *) array)[count++] = parse_uint64(s, at);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2506 at += s;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2507 rem -= s;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2508 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2509 break;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2510 case PROTOBUF_C_TYPE_BOOL:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2511 count = rem;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2512 for (i = 0; i < count; i++) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2513 if (at[i] > 1) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2514 PROTOBUF_C_UNPACK_ERROR("bad packed-repeated boolean value");
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2515 return FALSE;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2516 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2517 ((protobuf_c_boolean *) array)[i] = at[i];
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2518 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2519 break;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2520 default:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2521 PROTOBUF_C__ASSERT_NOT_REACHED();
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2522 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2523 *p_n += count;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2524 return TRUE;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2525
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2526 #if !defined(WORDS_BIGENDIAN)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2527 no_unpacking_needed:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2528 memcpy(array, at, count * siz);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2529 *p_n += count;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2530 return TRUE;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2531 #endif
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2532 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2533
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2534 static protobuf_c_boolean
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2535 is_packable_type(ProtobufCType type)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2536 {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2537 return
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2538 type != PROTOBUF_C_TYPE_STRING &&
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2539 type != PROTOBUF_C_TYPE_BYTES &&
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2540 type != PROTOBUF_C_TYPE_MESSAGE;
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
2541 }
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
2542
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
2543 static protobuf_c_boolean
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2544 parse_member(ScannedMember *scanned_member,
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2545 ProtobufCMessage *message,
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2546 ProtobufCAllocator *allocator)
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
2547 {
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2548 const ProtobufCFieldDescriptor *field = scanned_member->field;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2549 void *member;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2550
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2551 if (field == NULL) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2552 ProtobufCMessageUnknownField *ufield =
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2553 message->unknown_fields +
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2554 (message->n_unknown_fields++);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2555 ufield->tag = scanned_member->tag;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2556 ufield->wire_type = scanned_member->wire_type;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2557 ufield->len = scanned_member->len;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2558 ufield->data = do_alloc(allocator, scanned_member->len);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2559 if (ufield->data == NULL)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2560 return FALSE;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2561 memcpy(ufield->data, scanned_member->data, ufield->len);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2562 return TRUE;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2563 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2564 member = (char *) message + field->offset;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2565 switch (field->label) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2566 case PROTOBUF_C_LABEL_REQUIRED:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2567 return parse_required_member(scanned_member, member,
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2568 allocator, TRUE);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2569 case PROTOBUF_C_LABEL_OPTIONAL:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2570 return parse_optional_member(scanned_member, member,
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2571 message, allocator);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2572 case PROTOBUF_C_LABEL_REPEATED:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2573 if (scanned_member->wire_type ==
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2574 PROTOBUF_C_WIRE_TYPE_LENGTH_PREFIXED &&
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2575 (0 != (field->flags & PROTOBUF_C_FIELD_FLAG_PACKED) ||
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2576 is_packable_type(field->type)))
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2577 {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2578 return parse_packed_repeated_member(scanned_member,
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2579 member, message);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2580 } else {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2581 return parse_repeated_member(scanned_member,
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2582 member, message,
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2583 allocator);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2584 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2585 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2586 PROTOBUF_C__ASSERT_NOT_REACHED();
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2587 return 0;
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
2588 }
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
2589
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2590 /**
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2591 * Initialise messages generated by old code.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2592 *
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2593 * This function is used if desc->message_init == NULL (which occurs
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2594 * for old code, and which would be useful to support allocating
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2595 * descriptors dynamically).
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2596 */
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2597 static void
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2598 message_init_generic(const ProtobufCMessageDescriptor *desc,
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2599 ProtobufCMessage *message)
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
2600 {
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2601 unsigned i;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2602
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2603 memset(message, 0, desc->sizeof_message);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2604 message->descriptor = desc;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2605 for (i = 0; i < desc->n_fields; i++) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2606 if (desc->fields[i].default_value != NULL &&
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2607 desc->fields[i].label != PROTOBUF_C_LABEL_REPEATED)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2608 {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2609 void *field =
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2610 STRUCT_MEMBER_P(message, desc->fields[i].offset);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2611 const void *dv = desc->fields[i].default_value;
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
2612
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2613 switch (desc->fields[i].type) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2614 case PROTOBUF_C_TYPE_INT32:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2615 case PROTOBUF_C_TYPE_SINT32:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2616 case PROTOBUF_C_TYPE_SFIXED32:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2617 case PROTOBUF_C_TYPE_UINT32:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2618 case PROTOBUF_C_TYPE_FIXED32:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2619 case PROTOBUF_C_TYPE_FLOAT:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2620 case PROTOBUF_C_TYPE_ENUM:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2621 memcpy(field, dv, 4);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2622 break;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2623 case PROTOBUF_C_TYPE_INT64:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2624 case PROTOBUF_C_TYPE_SINT64:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2625 case PROTOBUF_C_TYPE_SFIXED64:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2626 case PROTOBUF_C_TYPE_UINT64:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2627 case PROTOBUF_C_TYPE_FIXED64:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2628 case PROTOBUF_C_TYPE_DOUBLE:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2629 memcpy(field, dv, 8);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2630 break;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2631 case PROTOBUF_C_TYPE_BOOL:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2632 memcpy(field, dv, sizeof(protobuf_c_boolean));
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2633 break;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2634 case PROTOBUF_C_TYPE_BYTES:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2635 memcpy(field, dv, sizeof(ProtobufCBinaryData));
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2636 break;
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
2637
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2638 case PROTOBUF_C_TYPE_STRING:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2639 case PROTOBUF_C_TYPE_MESSAGE:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2640 /*
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2641 * The next line essentially implements a cast
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2642 * from const, which is totally unavoidable.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2643 */
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2644 *(const void **) field = dv;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2645 break;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2646 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2647 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2648 }
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
2649 }
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
2650
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2651 /**@}*/
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2652
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2653 /*
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2654 * ScannedMember slabs (an unpacking implementation detail). Before doing real
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2655 * unpacking, we first scan through the elements to see how many there are (for
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2656 * repeated fields), and which field to use (for non-repeated fields given
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2657 * twice).
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2658 *
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2659 * In order to avoid allocations for small messages, we keep a stack-allocated
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2660 * slab of ScannedMembers of size FIRST_SCANNED_MEMBER_SLAB_SIZE (16). After we
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2661 * fill that up, we allocate each slab twice as large as the previous one.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2662 */
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2663 #define FIRST_SCANNED_MEMBER_SLAB_SIZE_LOG2 4
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
2664
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2665 /*
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2666 * The number of slabs, including the stack-allocated ones; choose the number so
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2667 * that we would overflow if we needed a slab larger than provided.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2668 */
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2669 #define MAX_SCANNED_MEMBER_SLAB \
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2670 (sizeof(unsigned int)*8 - 1 \
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2671 - BOUND_SIZEOF_SCANNED_MEMBER_LOG2 \
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2672 - FIRST_SCANNED_MEMBER_SLAB_SIZE_LOG2)
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
2673
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2674 #define REQUIRED_FIELD_BITMAP_SET(index) \
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2675 (required_fields_bitmap[(index)/8] |= (1<<((index)%8)))
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2676
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2677 #define REQUIRED_FIELD_BITMAP_IS_SET(index) \
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2678 (required_fields_bitmap[(index)/8] & (1<<((index)%8)))
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
2679
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
2680 ProtobufCMessage *
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2681 protobuf_c_message_unpack(const ProtobufCMessageDescriptor *desc,
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2682 ProtobufCAllocator *allocator,
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2683 size_t len, const uint8_t *data)
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
2684 {
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2685 ProtobufCMessage *rv;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2686 size_t rem = len;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2687 const uint8_t *at = data;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2688 const ProtobufCFieldDescriptor *last_field = desc->fields + 0;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2689 ScannedMember first_member_slab[1 <<
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2690 FIRST_SCANNED_MEMBER_SLAB_SIZE_LOG2];
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
2691
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2692 /*
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2693 * scanned_member_slabs[i] is an array of arrays of ScannedMember.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2694 * The first slab (scanned_member_slabs[0] is just a pointer to
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2695 * first_member_slab), above. All subsequent slabs will be allocated
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2696 * using the allocator.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2697 */
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2698 ScannedMember *scanned_member_slabs[MAX_SCANNED_MEMBER_SLAB + 1];
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2699 unsigned which_slab = 0; /* the slab we are currently populating */
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2700 unsigned in_slab_index = 0; /* number of members in the slab */
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2701 size_t n_unknown = 0;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2702 unsigned f;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2703 unsigned j;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2704 unsigned i_slab;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2705 unsigned last_field_index = 0;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2706 unsigned required_fields_bitmap_len;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2707 unsigned char required_fields_bitmap_stack[16];
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2708 unsigned char *required_fields_bitmap = required_fields_bitmap_stack;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2709 protobuf_c_boolean required_fields_bitmap_alloced = FALSE;
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
2710
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2711 ASSERT_IS_MESSAGE_DESCRIPTOR(desc);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2712
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2713 if (allocator == NULL)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2714 allocator = &protobuf_c__allocator;
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
2715
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2716 rv = do_alloc(allocator, desc->sizeof_message);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2717 if (!rv)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2718 return (NULL);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2719 scanned_member_slabs[0] = first_member_slab;
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
2720
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2721 required_fields_bitmap_len = (desc->n_fields + 7) / 8;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2722 if (required_fields_bitmap_len > sizeof(required_fields_bitmap_stack)) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2723 required_fields_bitmap = do_alloc(allocator, required_fields_bitmap_len);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2724 if (!required_fields_bitmap) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2725 do_free(allocator, rv);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2726 return (NULL);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2727 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2728 required_fields_bitmap_alloced = TRUE;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2729 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2730 memset(required_fields_bitmap, 0, required_fields_bitmap_len);
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
2731
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2732 /*
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2733 * Generated code always defines "message_init". However, we provide a
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2734 * fallback for (1) users of old protobuf-c generated-code that do not
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2735 * provide the function, and (2) descriptors constructed from some other
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2736 * source (most likely, direct construction from the .proto file).
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2737 */
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2738 if (desc->message_init != NULL)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2739 protobuf_c_message_init(desc, rv);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2740 else
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2741 message_init_generic(desc, rv);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2742
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2743 while (rem > 0) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2744 uint32_t tag;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2745 ProtobufCWireType wire_type;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2746 size_t used = parse_tag_and_wiretype(rem, at, &tag, &wire_type);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2747 const ProtobufCFieldDescriptor *field;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2748 ScannedMember tmp;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2749
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2750 memset(&tmp, 0, sizeof(ScannedMember));
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
2751
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2752 if (used == 0) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2753 PROTOBUF_C_UNPACK_ERROR("error parsing tag/wiretype at offset %u",
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2754 (unsigned) (at - data));
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2755 goto error_cleanup_during_scan;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2756 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2757 /*
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2758 * \todo Consider optimizing for field[1].id == tag, if field[1]
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2759 * exists!
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2760 */
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2761 if (last_field == NULL || last_field->id != tag) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2762 /* lookup field */
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2763 int field_index =
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2764 int_range_lookup(desc->n_field_ranges,
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2765 desc->field_ranges,
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2766 tag);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2767 if (field_index < 0) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2768 field = NULL;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2769 n_unknown++;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2770 } else {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2771 field = desc->fields + field_index;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2772 last_field = field;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2773 last_field_index = field_index;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2774 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2775 } else {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2776 field = last_field;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2777 }
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
2778
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2779 if (field != NULL && field->label == PROTOBUF_C_LABEL_REQUIRED)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2780 REQUIRED_FIELD_BITMAP_SET(last_field_index);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2781
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2782 at += used;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2783 rem -= used;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2784 tmp.tag = tag;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2785 tmp.wire_type = wire_type;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2786 tmp.field = field;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2787 tmp.data = at;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2788 tmp.length_prefix_len = 0;
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
2789
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2790 switch (wire_type) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2791 case PROTOBUF_C_WIRE_TYPE_VARINT: {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2792 unsigned max_len = rem < 10 ? rem : 10;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2793 unsigned i;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2794
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2795 for (i = 0; i < max_len; i++)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2796 if ((at[i] & 0x80) == 0)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2797 break;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2798 if (i == max_len) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2799 PROTOBUF_C_UNPACK_ERROR("unterminated varint at offset %u",
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2800 (unsigned) (at - data));
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2801 goto error_cleanup_during_scan;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2802 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2803 tmp.len = i + 1;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2804 break;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2805 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2806 case PROTOBUF_C_WIRE_TYPE_64BIT:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2807 if (rem < 8) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2808 PROTOBUF_C_UNPACK_ERROR("too short after 64bit wiretype at offset %u",
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2809 (unsigned) (at - data));
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2810 goto error_cleanup_during_scan;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2811 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2812 tmp.len = 8;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2813 break;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2814 case PROTOBUF_C_WIRE_TYPE_LENGTH_PREFIXED: {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2815 size_t pref_len;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2816
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2817 tmp.len = scan_length_prefixed_data(rem, at, &pref_len);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2818 if (tmp.len == 0) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2819 /* NOTE: scan_length_prefixed_data calls UNPACK_ERROR */
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2820 goto error_cleanup_during_scan;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2821 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2822 tmp.length_prefix_len = pref_len;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2823 break;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2824 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2825 case PROTOBUF_C_WIRE_TYPE_32BIT:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2826 if (rem < 4) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2827 PROTOBUF_C_UNPACK_ERROR("too short after 32bit wiretype at offset %u",
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2828 (unsigned) (at - data));
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2829 goto error_cleanup_during_scan;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2830 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2831 tmp.len = 4;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2832 break;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2833 default:
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2834 PROTOBUF_C_UNPACK_ERROR("unsupported tag %u at offset %u",
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2835 wire_type, (unsigned) (at - data));
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2836 goto error_cleanup_during_scan;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2837 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2838
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2839 if (in_slab_index == (1U <<
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2840 (which_slab + FIRST_SCANNED_MEMBER_SLAB_SIZE_LOG2)))
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2841 {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2842 size_t size;
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
2843
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2844 in_slab_index = 0;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2845 if (which_slab == MAX_SCANNED_MEMBER_SLAB) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2846 PROTOBUF_C_UNPACK_ERROR("too many fields");
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2847 goto error_cleanup_during_scan;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2848 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2849 which_slab++;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2850 size = sizeof(ScannedMember)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2851 << (which_slab + FIRST_SCANNED_MEMBER_SLAB_SIZE_LOG2);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2852 scanned_member_slabs[which_slab] = do_alloc(allocator, size);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2853 if (scanned_member_slabs[which_slab] == NULL)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2854 goto error_cleanup_during_scan;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2855 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2856 scanned_member_slabs[which_slab][in_slab_index++] = tmp;
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
2857
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2858 if (field != NULL && field->label == PROTOBUF_C_LABEL_REPEATED) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2859 size_t *n = STRUCT_MEMBER_PTR(size_t, rv,
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2860 field->quantifier_offset);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2861 if (wire_type == PROTOBUF_C_WIRE_TYPE_LENGTH_PREFIXED &&
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2862 (0 != (field->flags & PROTOBUF_C_FIELD_FLAG_PACKED) ||
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2863 is_packable_type(field->type)))
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2864 {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2865 size_t count;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2866 if (!count_packed_elements(field->type,
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2867 tmp.len -
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2868 tmp.length_prefix_len,
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2869 tmp.data +
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2870 tmp.length_prefix_len,
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2871 &count))
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2872 {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2873 PROTOBUF_C_UNPACK_ERROR("counting packed elements");
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2874 goto error_cleanup_during_scan;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2875 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2876 *n += count;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2877 } else {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2878 *n += 1;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2879 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2880 }
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
2881
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2882 at += tmp.len;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2883 rem -= tmp.len;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2884 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2885
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2886 /* allocate space for repeated fields, also check that all required fields have been set */
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2887 for (f = 0; f < desc->n_fields; f++) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2888 const ProtobufCFieldDescriptor *field = desc->fields + f;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2889 if (field->label == PROTOBUF_C_LABEL_REPEATED) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2890 size_t siz =
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2891 sizeof_elt_in_repeated_array(field->type);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2892 size_t *n_ptr =
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2893 STRUCT_MEMBER_PTR(size_t, rv,
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2894 field->quantifier_offset);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2895 if (*n_ptr != 0) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2896 unsigned n = *n_ptr;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2897 void *a;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2898 *n_ptr = 0;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2899 assert(rv->descriptor != NULL);
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
2900 #define CLEAR_REMAINING_N_PTRS() \
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
2901 for(f++;f < desc->n_fields; f++) \
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
2902 { \
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
2903 field = desc->fields + f; \
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
2904 if (field->label == PROTOBUF_C_LABEL_REPEATED) \
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
2905 STRUCT_MEMBER (size_t, rv, field->quantifier_offset) = 0; \
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
2906 }
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2907 a = do_alloc(allocator, siz * n);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2908 if (!a) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2909 CLEAR_REMAINING_N_PTRS();
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2910 goto error_cleanup;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2911 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2912 STRUCT_MEMBER(void *, rv, field->offset) = a;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2913 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2914 } else if (field->label == PROTOBUF_C_LABEL_REQUIRED) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2915 if (field->default_value == NULL &&
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2916 !REQUIRED_FIELD_BITMAP_IS_SET(f))
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2917 {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2918 CLEAR_REMAINING_N_PTRS();
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2919 PROTOBUF_C_UNPACK_ERROR("message '%s': missing required field '%s'",
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2920 desc->name, field->name);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2921 goto error_cleanup;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2922 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2923 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2924 }
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
2925 #undef CLEAR_REMAINING_N_PTRS
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
2926
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2927 /* allocate space for unknown fields */
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2928 if (n_unknown) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2929 rv->unknown_fields = do_alloc(allocator,
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2930 n_unknown * sizeof(ProtobufCMessageUnknownField));
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2931 if (rv->unknown_fields == NULL)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2932 goto error_cleanup;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2933 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2934
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2935 /* do real parsing */
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2936 for (i_slab = 0; i_slab <= which_slab; i_slab++) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2937 unsigned max = (i_slab == which_slab) ?
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2938 in_slab_index : (1U << (i_slab + 4));
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2939 ScannedMember *slab = scanned_member_slabs[i_slab];
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2940 unsigned j;
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
2941
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2942 for (j = 0; j < max; j++) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2943 if (!parse_member(slab + j, rv, allocator)) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2944 PROTOBUF_C_UNPACK_ERROR("error parsing member %s of %s",
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2945 slab->field ? slab->field->name : "*unknown-field*",
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2946 desc->name);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2947 goto error_cleanup;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2948 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2949 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2950 }
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
2951
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2952 /* cleanup */
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2953 for (j = 1; j <= which_slab; j++)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2954 do_free(allocator, scanned_member_slabs[j]);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2955 if (required_fields_bitmap_alloced)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2956 do_free(allocator, required_fields_bitmap);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2957 return rv;
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
2958
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
2959 error_cleanup:
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2960 protobuf_c_message_free_unpacked(rv, allocator);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2961 for (j = 1; j <= which_slab; j++)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2962 do_free(allocator, scanned_member_slabs[j]);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2963 if (required_fields_bitmap_alloced)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2964 do_free(allocator, required_fields_bitmap);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2965 return NULL;
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
2966
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
2967 error_cleanup_during_scan:
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2968 do_free(allocator, rv);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2969 for (j = 1; j <= which_slab; j++)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2970 do_free(allocator, scanned_member_slabs[j]);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2971 if (required_fields_bitmap_alloced)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2972 do_free(allocator, required_fields_bitmap);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2973 return NULL;
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
2974 }
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
2975
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
2976 void
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2977 protobuf_c_message_free_unpacked(ProtobufCMessage *message,
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2978 ProtobufCAllocator *allocator)
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
2979 {
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2980 const ProtobufCMessageDescriptor *desc = message->descriptor;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2981 unsigned f;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2982
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2983 ASSERT_IS_MESSAGE(message);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2984 if (allocator == NULL)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2985 allocator = &protobuf_c__allocator;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2986 message->descriptor = NULL;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2987 for (f = 0; f < desc->n_fields; f++) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2988 if (desc->fields[f].label == PROTOBUF_C_LABEL_REPEATED) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2989 size_t n = STRUCT_MEMBER(size_t,
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2990 message,
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2991 desc->fields[f].quantifier_offset);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2992 void *arr = STRUCT_MEMBER(void *,
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2993 message,
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2994 desc->fields[f].offset);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2995
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2996 if (desc->fields[f].type == PROTOBUF_C_TYPE_STRING) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2997 unsigned i;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2998 for (i = 0; i < n; i++)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
2999 do_free(allocator, ((char **) arr)[i]);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3000 } else if (desc->fields[f].type == PROTOBUF_C_TYPE_BYTES) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3001 unsigned i;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3002 for (i = 0; i < n; i++)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3003 do_free(allocator, ((ProtobufCBinaryData *) arr)[i].data);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3004 } else if (desc->fields[f].type == PROTOBUF_C_TYPE_MESSAGE) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3005 unsigned i;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3006 for (i = 0; i < n; i++)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3007 protobuf_c_message_free_unpacked(
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3008 ((ProtobufCMessage **) arr)[i],
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3009 allocator
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3010 );
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3011 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3012 if (arr != NULL)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3013 do_free(allocator, arr);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3014 } else if (desc->fields[f].type == PROTOBUF_C_TYPE_STRING) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3015 char *str = STRUCT_MEMBER(char *, message,
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3016 desc->fields[f].offset);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3017
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3018 if (str && str != desc->fields[f].default_value)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3019 do_free(allocator, str);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3020 } else if (desc->fields[f].type == PROTOBUF_C_TYPE_BYTES) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3021 void *data = STRUCT_MEMBER(ProtobufCBinaryData, message,
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3022 desc->fields[f].offset).data;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3023 const ProtobufCBinaryData *default_bd;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3024
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3025 default_bd = desc->fields[f].default_value;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3026 if (data != NULL &&
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3027 (default_bd == NULL ||
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3028 default_bd->data != data))
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3029 {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3030 do_free(allocator, data);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3031 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3032 } else if (desc->fields[f].type == PROTOBUF_C_TYPE_MESSAGE) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3033 ProtobufCMessage *sm;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3034
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3035 sm = STRUCT_MEMBER(ProtobufCMessage *, message,
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3036 desc->fields[f].offset);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3037 if (sm && sm != desc->fields[f].default_value)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3038 protobuf_c_message_free_unpacked(sm, allocator);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3039 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3040 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3041
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3042 for (f = 0; f < message->n_unknown_fields; f++)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3043 do_free(allocator, message->unknown_fields[f].data);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3044 if (message->unknown_fields != NULL)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3045 do_free(allocator, message->unknown_fields);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3046
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3047 do_free(allocator, message);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3048 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3049
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3050 void
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3051 protobuf_c_message_init(const ProtobufCMessageDescriptor * descriptor,
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3052 void *message)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3053 {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3054 descriptor->message_init((ProtobufCMessage *) (message));
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3055 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3056
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3057 protobuf_c_boolean
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3058 protobuf_c_message_check(const ProtobufCMessage *message)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3059 {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3060 unsigned i;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3061
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3062 if (!message ||
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3063 !message->descriptor ||
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3064 message->descriptor->magic != PROTOBUF_C__MESSAGE_DESCRIPTOR_MAGIC)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3065 {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3066 return FALSE;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3067 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3068
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3069 for (i = 0; i < message->descriptor->n_fields; i++) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3070 const ProtobufCFieldDescriptor *f = message->descriptor->fields + i;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3071 ProtobufCType type = f->type;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3072 ProtobufCLabel label = f->label;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3073 void *field = STRUCT_MEMBER_P (message, f->offset);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3074
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3075 if (label == PROTOBUF_C_LABEL_REPEATED) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3076 size_t *quantity = STRUCT_MEMBER_P (message, f->quantifier_offset);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3077
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3078 if (*quantity > 0 && *(void **) field == NULL) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3079 return FALSE;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3080 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3081
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3082 if (type == PROTOBUF_C_TYPE_MESSAGE) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3083 ProtobufCMessage **submessage = *(ProtobufCMessage ***) field;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3084 unsigned j;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3085 for (j = 0; j < *quantity; j++) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3086 if (!protobuf_c_message_check(submessage[j]))
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3087 return FALSE;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3088 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3089 } else if (type == PROTOBUF_C_TYPE_STRING) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3090 char **string = *(char ***) field;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3091 unsigned j;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3092 for (j = 0; j < *quantity; j++) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3093 if (!string[j])
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3094 return FALSE;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3095 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3096 } else if (type == PROTOBUF_C_TYPE_BYTES) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3097 ProtobufCBinaryData *bd = *(ProtobufCBinaryData **) field;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3098 unsigned j;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3099 for (j = 0; j < *quantity; j++) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3100 if (bd[j].len > 0 && bd[j].data == NULL)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3101 return FALSE;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3102 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3103 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3104
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3105 } else { /* PROTOBUF_C_LABEL_REQUIRED or PROTOBUF_C_LABEL_OPTIONAL */
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3106
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3107 if (type == PROTOBUF_C_TYPE_MESSAGE) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3108 ProtobufCMessage *submessage = *(ProtobufCMessage **) field;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3109 if (label == PROTOBUF_C_LABEL_REQUIRED || submessage != NULL) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3110 if (!protobuf_c_message_check(submessage))
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3111 return FALSE;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3112 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3113 } else if (type == PROTOBUF_C_TYPE_STRING) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3114 char *string = *(char **) field;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3115 if (label == PROTOBUF_C_LABEL_REQUIRED && string == NULL)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3116 return FALSE;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3117 } else if (type == PROTOBUF_C_TYPE_BYTES) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3118 protobuf_c_boolean *has = STRUCT_MEMBER_P (message, f->quantifier_offset);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3119 ProtobufCBinaryData *bd = field;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3120 if (label == PROTOBUF_C_LABEL_REQUIRED || *has == TRUE) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3121 if (bd->len > 0 && bd->data == NULL)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3122 return FALSE;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3123 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3124 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3125 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3126 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3127
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3128 return TRUE;
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
3129 }
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
3130
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
3131 /* === services === */
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3132
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3133 typedef void (*GenericHandler) (void *service,
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3134 const ProtobufCMessage *input,
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3135 ProtobufCClosure closure,
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3136 void *closure_data);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3137 void
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
3138 protobuf_c_service_invoke_internal(ProtobufCService *service,
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3139 unsigned method_index,
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3140 const ProtobufCMessage *input,
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3141 ProtobufCClosure closure,
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3142 void *closure_data)
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
3143 {
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3144 GenericHandler *handlers;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3145 GenericHandler handler;
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
3146
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3147 /*
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3148 * Verify that method_index is within range. If this fails, you are
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3149 * likely invoking a newly added method on an old service. (Although
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3150 * other memory corruption bugs can cause this assertion too.)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3151 */
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3152 assert(method_index < service->descriptor->n_methods);
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
3153
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3154 /*
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3155 * Get the array of virtual methods (which are enumerated by the
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3156 * generated code).
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3157 */
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3158 handlers = (GenericHandler *) (service + 1);
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
3159
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3160 /*
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3161 * Get our method and invoke it.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3162 * \todo Seems like handler == NULL is a situation that needs handling.
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3163 */
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3164 handler = handlers[method_index];
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3165 (*handler)(service, input, closure, closure_data);
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
3166 }
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
3167
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
3168 void
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3169 protobuf_c_service_generated_init(ProtobufCService *service,
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3170 const ProtobufCServiceDescriptor *descriptor,
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3171 ProtobufCServiceDestroy destroy)
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
3172 {
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3173 ASSERT_IS_SERVICE_DESCRIPTOR(descriptor);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3174 service->descriptor = descriptor;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3175 service->destroy = destroy;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3176 service->invoke = protobuf_c_service_invoke_internal;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3177 memset(service + 1, 0, descriptor->n_methods * sizeof(GenericHandler));
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
3178 }
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
3179
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3180 void protobuf_c_service_destroy(ProtobufCService *service)
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
3181 {
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3182 service->destroy(service);
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
3183 }
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
3184
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
3185 /* --- querying the descriptors --- */
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3186
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
3187 const ProtobufCEnumValue *
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3188 protobuf_c_enum_descriptor_get_value_by_name(const ProtobufCEnumDescriptor *desc,
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3189 const char *name)
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
3190 {
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3191 unsigned start = 0;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3192 unsigned count = desc->n_value_names;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3193
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3194 while (count > 1) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3195 unsigned mid = start + count / 2;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3196 int rv = strcmp(desc->values_by_name[mid].name, name);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3197 if (rv == 0)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3198 return desc->values + desc->values_by_name[mid].index;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3199 else if (rv < 0) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3200 count = start + count - (mid + 1);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3201 start = mid + 1;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3202 } else
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3203 count = mid - start;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3204 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3205 if (count == 0)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3206 return NULL;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3207 if (strcmp(desc->values_by_name[start].name, name) == 0)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3208 return desc->values + desc->values_by_name[start].index;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3209 return NULL;
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
3210 }
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3211
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
3212 const ProtobufCEnumValue *
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3213 protobuf_c_enum_descriptor_get_value(const ProtobufCEnumDescriptor *desc,
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3214 int value)
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
3215 {
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3216 int rv = int_range_lookup(desc->n_value_ranges, desc->value_ranges, value);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3217 if (rv < 0)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3218 return NULL;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3219 return desc->values + rv;
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
3220 }
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
3221
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
3222 const ProtobufCFieldDescriptor *
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3223 protobuf_c_message_descriptor_get_field_by_name(const ProtobufCMessageDescriptor *desc,
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3224 const char *name)
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
3225 {
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3226 unsigned start = 0;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3227 unsigned count = desc->n_fields;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3228 const ProtobufCFieldDescriptor *field;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3229
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3230 while (count > 1) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3231 unsigned mid = start + count / 2;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3232 int rv;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3233 field = desc->fields + desc->fields_sorted_by_name[mid];
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3234 rv = strcmp(field->name, name);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3235 if (rv == 0)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3236 return field;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3237 else if (rv < 0) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3238 count = start + count - (mid + 1);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3239 start = mid + 1;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3240 } else
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3241 count = mid - start;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3242 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3243 if (count == 0)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3244 return NULL;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3245 field = desc->fields + desc->fields_sorted_by_name[start];
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3246 if (strcmp(field->name, name) == 0)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3247 return field;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3248 return NULL;
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
3249 }
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
3250
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
3251 const ProtobufCFieldDescriptor *
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3252 protobuf_c_message_descriptor_get_field(const ProtobufCMessageDescriptor *desc,
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3253 unsigned value)
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
3254 {
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3255 int rv = int_range_lookup(desc->n_field_ranges,desc->field_ranges, value);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3256 if (rv < 0)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3257 return NULL;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3258 return desc->fields + rv;
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
3259 }
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
3260
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
3261 const ProtobufCMethodDescriptor *
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3262 protobuf_c_service_descriptor_get_method_by_name(const ProtobufCServiceDescriptor *desc,
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3263 const char *name)
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
3264 {
37180
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3265 unsigned start = 0;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3266 unsigned count = desc->n_methods;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3267
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3268 while (count > 1) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3269 unsigned mid = start + count / 2;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3270 unsigned mid_index = desc->method_indices_by_name[mid];
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3271 const char *mid_name = desc->methods[mid_index].name;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3272 int rv = strcmp(mid_name, name);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3273
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3274 if (rv == 0)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3275 return desc->methods + desc->method_indices_by_name[mid];
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3276 if (rv < 0) {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3277 count = start + count - (mid + 1);
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3278 start = mid + 1;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3279 } else {
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3280 count = mid - start;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3281 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3282 }
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3283 if (count == 0)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3284 return NULL;
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3285 if (strcmp(desc->methods[desc->method_indices_by_name[start]].name, name) == 0)
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3286 return desc->methods + desc->method_indices_by_name[start];
cf498d4b54bb Update internal libgadu to 1.12.1
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36169
diff changeset
3287 return NULL;
35617
c9069e0e3c36 Update internal libgadu to 1.12.0-rc2
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
3288 }

mercurial