libpurple/protocols/qq/packet_parse.c

branch
cpw.masca.webkit
changeset 32503
ab886d3a38ae
parent 32502
e64e49502c79
parent 31944
77d17906f1c3
child 32504
8243b910ed4c
equal deleted inserted replaced
32502:e64e49502c79 32503:ab886d3a38ae
1 /**
2 * @file packet_parse.c
3 *
4 * purple
5 *
6 * Purple is the legal property of its developers, whose names are too numerous
7 * to list here. Please refer to the COPYRIGHT file distributed with this
8 * source distribution.
9 *
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation; either version 2 of the License, or
13 * (at your option) any later version.
14 *
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
19 *
20 * You should have received a copy of the GNU General Public License
21 * along with this program; if not, write to the Free Software
22 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA
23 */
24
25 #include <string.h>
26
27 #include "packet_parse.h"
28 #include "debug.h"
29
30 /*------------------------------------------------PUT------------------------------------------------*/
31
32 /* note:
33 * 1, in these functions, 'b' stands for byte, 'w' stands for word, 'dw' stands for double word.
34 * 2, we use '*cursor' and 'buf' as two addresses to calculate the length.
35 * 3, change 'undef' to 'define' to get more info about the packet parsing. */
36
37 #undef PARSER_DEBUG
38
39 /* read one byte from buf,
40 * return the number of bytes read if succeeds, otherwise return -1 */
41 gint qq_get8(guint8 *b, guint8 *buf)
42 {
43 guint8 b_dest;
44 memcpy(&b_dest, buf, sizeof(b_dest));
45 *b = b_dest;
46 #ifdef PARSER_DEBUG
47 purple_debug_info("QQ", "[DBG][get8] buf %p\n", (void *)buf);
48 purple_debug_info("QQ", "[DBG][get8] b_dest 0x%2x, *b 0x%02x\n", b_dest, *b);
49 #endif
50 return sizeof(b_dest);
51 }
52
53
54 /* read two bytes as "guint16" from buf,
55 * return the number of bytes read if succeeds, otherwise return -1 */
56 gint qq_get16(guint16 *w, guint8 *buf)
57 {
58 guint16 w_dest;
59 memcpy(&w_dest, buf, sizeof(w_dest));
60 *w = g_ntohs(w_dest);
61 #ifdef PARSER_DEBUG
62 purple_debug_info("QQ", "[DBG][get16] buf %p\n", (void *)buf);
63 purple_debug_info("QQ", "[DBG][get16] w_dest 0x%04x, *w 0x%04x\n", w_dest, *w);
64 #endif
65 return sizeof(w_dest);
66 }
67
68 /* read four bytes as "guint32" from buf,
69 * return the number of bytes read if succeeds, otherwise return -1 */
70 gint qq_get32(guint32 *dw, guint8 *buf)
71 {
72 guint32 dw_dest;
73 memcpy(&dw_dest, buf, sizeof(dw_dest));
74 *dw = g_ntohl(dw_dest);
75 #ifdef PARSER_DEBUG
76 purple_debug_info("QQ", "[DBG][get32] buf %p\n", (void *)buf);
77 purple_debug_info("QQ", "[DBG][get32] dw_dest 0x%08x, *dw 0x%08x\n", dw_dest, *dw);
78 #endif
79 return sizeof(dw_dest);
80 }
81
82 gint qq_getIP(struct in_addr *ip, guint8 *buf)
83 {
84 memcpy(ip, buf, sizeof(struct in_addr));
85 return sizeof(struct in_addr);
86 }
87
88 /* read datalen bytes from buf,
89 * return the number of bytes read if succeeds, otherwise return -1 */
90 gint qq_getdata(guint8 *data, gint datalen, guint8 *buf)
91 {
92 memcpy(data, buf, datalen);
93 #ifdef PARSER_DEBUG
94 purple_debug_info("QQ", "[DBG][getdata] buf %p\n", (void *)buf);
95 #endif
96 return datalen;
97 }
98
99
100 /* read four bytes as "time_t" from buf,
101 * return the number of bytes read if succeeds, otherwise return -1
102 * This function is a wrapper around read_packet_dw() to avoid casting. */
103 gint qq_getime(time_t *t, guint8 *buf)
104 {
105 guint32 dw_dest;
106 memcpy(&dw_dest, buf, sizeof(dw_dest));
107 #ifdef PARSER_DEBUG
108 purple_debug_info("QQ", "[DBG][getime] buf %p\n", (void *)buf);
109 purple_debug_info("QQ", "[DBG][getime] dw_dest before 0x%08x\n", dw_dest);
110 #endif
111 dw_dest = g_ntohl(dw_dest);
112 #ifdef PARSER_DEBUG
113 purple_debug_info("QQ", "[DBG][getime] dw_dest after 0x%08x\n", dw_dest);
114 #endif
115 memcpy(t, &dw_dest, sizeof(dw_dest));
116 return sizeof(dw_dest);
117 }
118
119 /*------------------------------------------------PUT------------------------------------------------*/
120 /* pack one byte into buf
121 * return the number of bytes packed, otherwise return -1 */
122 gint qq_put8(guint8 *buf, guint8 b)
123 {
124 memcpy(buf, &b, sizeof(b));
125 #ifdef PARSER_DEBUG
126 purple_debug_info("QQ", "[DBG][put8] buf %p\n", (void *)buf);
127 purple_debug_info("QQ", "[DBG][put8] b 0x%02x\n", b);
128 #endif
129 return sizeof(b);
130 }
131
132
133 /* pack two bytes as "guint16" into buf
134 * return the number of bytes packed, otherwise return -1 */
135 gint qq_put16(guint8 *buf, guint16 w)
136 {
137 guint16 w_porter;
138 w_porter = g_htons(w);
139 #ifdef PARSER_DEBUG
140 purple_debug_info("QQ", "[DBG][put16] buf %p\n", (void *)buf);
141 purple_debug_info("QQ", "[DBG][put16] w 0x%04x, w_porter 0x%04x\n", w, w_porter);
142 #endif
143 memcpy(buf, &w_porter, sizeof(w_porter));
144 return sizeof(w_porter);
145 }
146
147
148 /* pack four bytes as "guint32" into buf
149 * return the number of bytes packed, otherwise return -1 */
150 gint qq_put32(guint8 *buf, guint32 dw)
151 {
152 guint32 dw_porter;
153 dw_porter = g_htonl(dw);
154 #ifdef PARSER_DEBUG
155 purple_debug_info("QQ", "[DBG][put32] buf %p\n", (void *)buf);
156 purple_debug_info("QQ", "[DBG][put32] dw 0x%08x, dw_porter 0x%08x\n", dw, dw_porter);
157 #endif
158 memcpy(buf, &dw_porter, sizeof(dw_porter));
159 return sizeof(dw_porter);
160 }
161
162 gint qq_putime(guint8 *buf, time_t *t)
163 {
164 guint32 dw, dw_porter;
165 memcpy(&dw, t, sizeof(dw));
166 dw_porter = g_htonl(dw);
167 #ifdef PARSER_DEBUG
168 purple_debug_info("QQ", "[DBG][put32] buf %p\n", (void *)buf);
169 purple_debug_info("QQ", "[DBG][put32] dw 0x%08x, dw_porter 0x%08x\n", dw, dw_porter);
170 #endif
171 memcpy(buf, &dw_porter, sizeof(dw_porter));
172 return sizeof(dw_porter);
173 }
174
175 gint qq_putIP(guint8* buf, struct in_addr *ip)
176 {
177 memcpy(buf, ip, sizeof(struct in_addr));
178 return sizeof(struct in_addr);
179 }
180
181 /* pack datalen bytes into buf
182 * return the number of bytes packed, otherwise return -1 */
183 gint qq_putdata(guint8 *buf, const guint8 *data, const int datalen)
184 {
185 memcpy(buf, data, datalen);
186 #ifdef PARSER_DEBUG
187 purple_debug_info("QQ", "[DBG][putdata] buf %p\n", (void *)buf);
188 #endif
189 return datalen;
190 }

mercurial