summaryrefslogtreecommitdiff
path: root/libpurple/protocols/qq/qq.h
blob: ad2206655e19d39a795b370a7dfca2f64fc539e0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
/**
 * @file qq.h
 *
 * purple
 *
 * Purple is the legal property of its developers, whose names are too numerous
 * to list here.  Please refer to the COPYRIGHT file distributed with this
 * source distribution.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
 */

#ifndef _QQ_QQ_H_
#define _QQ_QQ_H_

#include "internal.h"
#include "ft.h"
#include "circbuffer.h"
#include "dnsquery.h"
#include "dnssrv.h"
#include "proxy.h"
#include "roomlist.h"

#define QQ_KEY_LENGTH       16

/* steal from kazehakase :) */
#define qq_strlen(s) ((s)!=NULL?strlen(s):0)
#define qq_strcmp(s1,s2) ((s1)!=NULL && (s2)!=NULL?strcmp(s1,s2):0)

typedef struct _qq_data qq_data;
typedef struct _qq_buddy_data qq_buddy_data;
typedef struct _qq_interval qq_interval;
typedef struct _qq_net_stat qq_net_stat;
typedef struct _qq_login_data qq_login_data;
typedef struct _qq_captcha_data qq_captcha_data;

struct _qq_captcha_data {
	guint8 *token;
	guint16 token_len;
	guint8 next_index;
	guint8 *data;
	guint16 data_len;
};

struct _qq_login_data {
	guint8 random_key[QQ_KEY_LENGTH];			/* first encrypt key generated by client */
	guint8 *token;				/* get from server */
	guint8 token_len;
	guint8 *token_ex;			/* get from server */
	guint16 token_ex_len;

	guint8 pwd_md5[QQ_KEY_LENGTH];			/* password in md5 (or md5' md5) */
	guint8 pwd_twice_md5[QQ_KEY_LENGTH];

	guint8 *login_token;
	guint16 login_token_len;
	guint8 login_key[QQ_KEY_LENGTH];
};

struct _qq_interval {
	gint resend;
	gint keep_alive;
	gint update;
};

struct _qq_net_stat {
	glong sent;
	glong resend;
	glong lost;
	glong rcved;
	glong rcved_dup;
};

struct _qq_buddy_data {
	guint32 uid;
	guint16 face;		/* index: 0 - 299 */
	guint8 age;
	guint8 gender;
	gchar *nickname;
	struct in_addr ip;
	guint16 port;
	guint8 status;
	guint8 ext_flag;
	guint8 comm_flag;	/* details in qq_buddy_list.c */
	guint16 client_tag;
	guint8 onlineTime;
	guint16 level;
	guint16 timeRemainder;
	time_t signon;
	time_t idle;
	time_t last_update;
	gchar** memo;

	gint8  role;		/* role in group, used only in group->members list */
};

typedef struct _qq_connection qq_connection;
struct _qq_connection {
	int fd;				/* socket file handler */
	int input_handler;

	/* tcp related */
	int can_write_handler; 	/* use in tcp_send_out */
	PurpleCircBuffer *tcp_txbuf;
	guint8 *tcp_rxqueue;
	int tcp_rxlen;
};

struct _qq_data {
	PurpleConnection *gc;

	GSList *openconns;
	gboolean use_tcp;		/* network in tcp or udp */
	PurpleProxyConnectData *conn_data;
#ifndef purple_proxy_connect_udp
	PurpleDnsQueryData *udp_query_data;		/* udp related */
	gint udp_can_write_handler; 	/* socket can_write handle, use in udp connecting and tcp send out */
#endif
	gint fd;							/* socket file handler */
	qq_net_stat net_stat;

	GList *servers;
	gchar *curr_server;		/* point to servers->data, do not free*/

	guint16 client_tag;
	gint client_version;

	struct in_addr redirect_ip;
	guint16 redirect_port;
	guint8 *redirect;
	guint8 redirect_len;

	guint check_watcher;
	guint connect_watcher;
	gint connect_retry;

	qq_interval itv_config;
	qq_interval itv_count;
	guint network_watcher;
	gint resend_times;

	GList *transactions;	/* check ack packet and resend */

	guint32 uid;			/* QQ number */

	qq_login_data ld;
	qq_captcha_data captcha;

	guint8 session_key[QQ_KEY_LENGTH];		/* later use this as key in this session */
	guint8 session_md5[QQ_KEY_LENGTH];		/* concatenate my uid with session_key and md5 it */

	guint16 send_seq;		/* send sequence number */
	guint8 login_mode;		/* online of invisible */
	gboolean is_login;		/* used by qq_add_buddy */

	PurpleXfer *xfer;			/* file transfer handler */

	/* get from login reply packet */
	struct in_addr my_local_ip;			/* my local ip address detected by server */
	guint16 my_local_port;		/* my lcoal port detected by server */
	time_t login_time;
	time_t last_login_time[3];
	struct in_addr last_login_ip;
	/* get from keep_alive packet */
	struct in_addr my_ip;			/* my ip address detected by server */
	guint16 my_port;		/* my port detected by server */
	guint16 my_icon;		/* my icon index */
	guint32 online_total;		/* the number of online QQ users */
	time_t online_last_update;		/* last time send get_friends_online packet */

	PurpleRoomlist *roomlist;

	GList *groups;

	gboolean is_show_notice;
	gboolean is_show_news;
	gboolean is_show_chat;

	guint16 send_im_id;		/* send IM sequence number */
};

#endif