~ubuntu-branches/ubuntu/quantal/pidgin/quantal

« back to all changes in this revision

Viewing changes to libpurple/protocols/qq/packet_parse.c

  • Committer: Bazaar Package Importer
  • Author(s): Ari Pollak
  • Date: 2011-06-13 21:17:20 UTC
  • mfrom: (1.3.19 upstream)
  • mto: This revision was merged to the branch mainline in revision 73.
  • Revision ID: james.westby@ubuntu.com-20110613211720-ke87vzmdcuaxams7
Tags: 2.8.0-1
* Imported Upstream version 2.8.0 (Closes: #630124)
* Remove SILC support since the library will be orphaned (Closes: #629222)
* Fix typo in libpurple-bin description (Closes: #625462)

Show diffs side-by-side

added added

removed removed

Lines of Context:
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
 
}