Mercurial > pidgin.yaz
annotate libpurple/protocols/qq/qq_network.c @ 24068:87e61a85f5dd
2008.09.28 - ccpaging <ccpaging(at)gmail.com>
* The source is only for debug, not for user:
1. Implement new QQ protocol 2007/2008, include login and change status
2. Check 2005's login reply packet, get last 3 login time.
3. Server's notice and news is displayed in self buddy (The new buddy
created in buddy list).
4. The notice messages when adding/removing QQ Qun's buddy displayed
in char conversation. They are displayed as purple notify windows in the past.
5. The notice messages when adding/removing buddy displayed in self
buddy's conversation. They are displayed as purple notify windows in the past.
6. Client version can be selected in account option. Now only qq2005 is
working, other new version is only for debug.
author | SHiNE CsyFeK <csyfek@gmail.com> |
---|---|
date | Wed, 22 Oct 2008 14:40:04 +0000 |
parents | dbc7a9742f8d |
children | dc112387190f |
rev | line source |
---|---|
23052 | 1 /** |
2 * @file qq_network.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 "cipher.h" | |
26 #include "debug.h" | |
27 #include "internal.h" | |
28 | |
29 #include "buddy_info.h" | |
23683
1c50f12b1c52
2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23606
diff
changeset
|
30 #include "group_info.h" |
23052 | 31 #include "group_free.h" |
23753
5f454b975a99
2008.08.10 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23683
diff
changeset
|
32 #include "qq_crypt.h" |
24065
bdfcfd71449c
patch 20080922 from ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24048
diff
changeset
|
33 #include "qq_define.h" |
23683
1c50f12b1c52
2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23606
diff
changeset
|
34 #include "qq_base.h" |
1c50f12b1c52
2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23606
diff
changeset
|
35 #include "buddy_list.h" |
23052 | 36 #include "packet_parse.h" |
37 #include "qq_network.h" | |
23053
55f986ccbb6a
patch-05-reconnect-and-code-cleanup
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23052
diff
changeset
|
38 #include "qq_trans.h" |
23052 | 39 #include "utils.h" |
23683
1c50f12b1c52
2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23606
diff
changeset
|
40 #include "qq_process.h" |
23052 | 41 |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
42 #define QQ_DEFAULT_PORT 8000 |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
43 |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
44 /* set QQ_CONNECT_MAX to 1, when test reconnecting */ |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
45 #define QQ_CONNECT_MAX 3 |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
46 #define QQ_CONNECT_INTERVAL 2 |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
47 #define QQ_CONNECT_CHECK 5 |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
48 #define QQ_KEEP_ALIVE_INTERVAL 60 |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
49 #define QQ_TRANS_INTERVAL 10 |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
50 |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
51 gboolean connect_to_server(PurpleConnection *gc, gchar *server, gint port); |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
52 |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
53 static qq_connection *connection_find(qq_data *qd, int fd) { |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
54 qq_connection *ret = NULL; |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
55 GSList *entry = qd->openconns; |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
56 while(entry) { |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
57 ret = entry->data; |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
58 if(ret->fd == fd) return ret; |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
59 entry = entry->next; |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
60 } |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
61 return NULL; |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
62 } |
23053
55f986ccbb6a
patch-05-reconnect-and-code-cleanup
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23052
diff
changeset
|
63 |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
64 static qq_connection *connection_create(qq_data *qd, int fd) { |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
65 qq_connection *ret = g_new0(qq_connection, 1); |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
66 ret->fd = fd; |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
67 qd->openconns = g_slist_append(qd->openconns, ret); |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
68 return ret; |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
69 } |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
70 |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
71 static void connection_remove(qq_data *qd, int fd) { |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
72 qq_connection *conn = connection_find(qd, fd); |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
73 qd->openconns = g_slist_remove(qd->openconns, conn); |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
74 |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
75 g_return_if_fail( conn != NULL ); |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
76 |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
77 purple_debug_info("QQ", "Close socket %d\n", conn->fd); |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
78 if(conn->input_handler > 0) purple_input_remove(conn->input_handler); |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
79 if(conn->can_write_handler > 0) purple_input_remove(conn->can_write_handler); |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
80 |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
81 if (conn->fd >= 0) close(conn->fd); |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
82 if(conn->tcp_txbuf != NULL) purple_circ_buffer_destroy(conn->tcp_txbuf); |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
83 if (conn->tcp_rxqueue != NULL) g_free(conn->tcp_rxqueue); |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
84 |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
85 g_free(conn); |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
86 } |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
87 |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
88 static void connection_free_all(qq_data *qd) { |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
89 qq_connection *ret = NULL; |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
90 GSList *entry = qd->openconns; |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
91 while(entry) { |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
92 ret = entry->data; |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
93 connection_remove(qd, ret->fd); |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
94 entry = qd->openconns; |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
95 } |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
96 } |
23053
55f986ccbb6a
patch-05-reconnect-and-code-cleanup
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23052
diff
changeset
|
97 static gboolean set_new_server(qq_data *qd) |
55f986ccbb6a
patch-05-reconnect-and-code-cleanup
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23052
diff
changeset
|
98 { |
55f986ccbb6a
patch-05-reconnect-and-code-cleanup
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23052
diff
changeset
|
99 gint count; |
55f986ccbb6a
patch-05-reconnect-and-code-cleanup
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23052
diff
changeset
|
100 gint index; |
55f986ccbb6a
patch-05-reconnect-and-code-cleanup
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23052
diff
changeset
|
101 GList *it = NULL; |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
102 |
23053
55f986ccbb6a
patch-05-reconnect-and-code-cleanup
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23052
diff
changeset
|
103 g_return_val_if_fail(qd != NULL, FALSE); |
55f986ccbb6a
patch-05-reconnect-and-code-cleanup
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23052
diff
changeset
|
104 |
55f986ccbb6a
patch-05-reconnect-and-code-cleanup
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23052
diff
changeset
|
105 if (qd->servers == NULL) { |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
106 purple_debug_info("QQ", "Server list is NULL\n"); |
23053
55f986ccbb6a
patch-05-reconnect-and-code-cleanup
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23052
diff
changeset
|
107 return FALSE; |
55f986ccbb6a
patch-05-reconnect-and-code-cleanup
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23052
diff
changeset
|
108 } |
55f986ccbb6a
patch-05-reconnect-and-code-cleanup
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23052
diff
changeset
|
109 |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
110 /* remove server used before */ |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
111 if (qd->curr_server != NULL) { |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
112 purple_debug_info("QQ", |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
113 "Remove current [%s] from server list\n", qd->curr_server); |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
114 qd->servers = g_list_remove(qd->servers, qd->curr_server); |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
115 qd->curr_server = NULL; |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
116 } |
24026
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
117 |
23053
55f986ccbb6a
patch-05-reconnect-and-code-cleanup
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23052
diff
changeset
|
118 count = g_list_length(qd->servers); |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
119 purple_debug_info("QQ", "Server list has %d\n", count); |
23053
55f986ccbb6a
patch-05-reconnect-and-code-cleanup
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23052
diff
changeset
|
120 if (count <= 0) { |
55f986ccbb6a
patch-05-reconnect-and-code-cleanup
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23052
diff
changeset
|
121 /* no server left, disconnect when result is false */ |
55f986ccbb6a
patch-05-reconnect-and-code-cleanup
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23052
diff
changeset
|
122 qd->servers = NULL; |
55f986ccbb6a
patch-05-reconnect-and-code-cleanup
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23052
diff
changeset
|
123 return FALSE; |
55f986ccbb6a
patch-05-reconnect-and-code-cleanup
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23052
diff
changeset
|
124 } |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
125 |
23053
55f986ccbb6a
patch-05-reconnect-and-code-cleanup
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23052
diff
changeset
|
126 /* get new server */ |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
127 index = rand() % count; |
23053
55f986ccbb6a
patch-05-reconnect-and-code-cleanup
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23052
diff
changeset
|
128 it = g_list_nth(qd->servers, index); |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
129 qd->curr_server = it->data; /* do not free server_name */ |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
130 if (qd->curr_server == NULL || strlen(qd->curr_server) <= 0 ) { |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
131 purple_debug_info("QQ", "Server name at %d is empty\n", index); |
23053
55f986ccbb6a
patch-05-reconnect-and-code-cleanup
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23052
diff
changeset
|
132 return FALSE; |
55f986ccbb6a
patch-05-reconnect-and-code-cleanup
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23052
diff
changeset
|
133 } |
55f986ccbb6a
patch-05-reconnect-and-code-cleanup
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23052
diff
changeset
|
134 |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
135 purple_debug_info("QQ", "set new server to %s\n", qd->curr_server); |
23053
55f986ccbb6a
patch-05-reconnect-and-code-cleanup
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23052
diff
changeset
|
136 return TRUE; |
55f986ccbb6a
patch-05-reconnect-and-code-cleanup
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23052
diff
changeset
|
137 } |
23052 | 138 |
139 static gint packet_get_header(guint8 *header_tag, guint16 *source_tag, | |
140 guint16 *cmd, guint16 *seq, guint8 *buf) | |
141 { | |
142 gint bytes = 0; | |
143 bytes += qq_get8(header_tag, buf + bytes); | |
144 bytes += qq_get16(source_tag, buf + bytes); | |
145 bytes += qq_get16(cmd, buf + bytes); | |
146 bytes += qq_get16(seq, buf + bytes); | |
147 return bytes; | |
148 } | |
149 | |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
150 static gboolean connect_check(gpointer data) |
23053
55f986ccbb6a
patch-05-reconnect-and-code-cleanup
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23052
diff
changeset
|
151 { |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
152 PurpleConnection *gc = (PurpleConnection *) data; |
23053
55f986ccbb6a
patch-05-reconnect-and-code-cleanup
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23052
diff
changeset
|
153 qq_data *qd; |
55f986ccbb6a
patch-05-reconnect-and-code-cleanup
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23052
diff
changeset
|
154 |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
155 g_return_val_if_fail(gc != NULL && gc->proto_data != NULL, FALSE); |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
156 qd = (qq_data *) gc->proto_data; |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
157 |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
158 if (qd->connect_watcher > 0) { |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
159 purple_timeout_remove(qd->connect_watcher); |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
160 qd->connect_watcher = 0; |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
161 } |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
162 |
24065
bdfcfd71449c
patch 20080922 from ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24048
diff
changeset
|
163 if (qd->fd >= 0 && qd->ld.token != NULL && qd->ld.token_len > 0) { |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
164 purple_debug_info("QQ", "Connect ok\n"); |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
165 return FALSE; |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
166 } |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
167 |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
168 qd->connect_watcher = purple_timeout_add_seconds(0, qq_connect_later, gc); |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
169 return FALSE; |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
170 } |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
171 |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
172 /* Warning: qq_connect_later destory all connection |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
173 * Any function should be care of use qq_data after call this function |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
174 * Please conside tcp_pending and udp_pending */ |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
175 gboolean qq_connect_later(gpointer data) |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
176 { |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
177 PurpleConnection *gc = (PurpleConnection *) data; |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
178 qq_data *qd; |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
179 char *server; |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
180 int port; |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
181 gchar **segments; |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
182 |
23053
55f986ccbb6a
patch-05-reconnect-and-code-cleanup
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23052
diff
changeset
|
183 g_return_val_if_fail(gc != NULL && gc->proto_data != NULL, FALSE); |
55f986ccbb6a
patch-05-reconnect-and-code-cleanup
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23052
diff
changeset
|
184 qd = (qq_data *) gc->proto_data; |
55f986ccbb6a
patch-05-reconnect-and-code-cleanup
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23052
diff
changeset
|
185 |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
186 if (qd->check_watcher > 0) { |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
187 purple_timeout_remove(qd->check_watcher); |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
188 qd->check_watcher = 0; |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
189 } |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
190 qq_disconnect(gc); |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
191 |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
192 if (qd->redirect_ip.s_addr != 0) { |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
193 /* redirect to new server */ |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
194 server = g_strdup_printf("%s:%d", inet_ntoa(qd->redirect_ip), qd->redirect_port); |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
195 qd->servers = g_list_append(qd->servers, server); |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
196 qd->curr_server = server; |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
197 |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
198 qd->redirect_ip.s_addr = 0; |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
199 qd->redirect_port = 0; |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
200 qd->connect_retry = QQ_CONNECT_MAX; |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
201 } |
23053
55f986ccbb6a
patch-05-reconnect-and-code-cleanup
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23052
diff
changeset
|
202 |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
203 if (qd->curr_server == NULL || strlen (qd->curr_server) == 0 || qd->connect_retry <= 0) { |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
204 if ( set_new_server(qd) != TRUE) { |
24066
dbc7a9742f8d
2008.09.26 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24065
diff
changeset
|
205 purple_connection_error_reason(gc, |
dbc7a9742f8d
2008.09.26 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24065
diff
changeset
|
206 PURPLE_CONNECTION_ERROR_NETWORK_ERROR, |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
207 _("Failed to connect all servers")); |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
208 return FALSE; |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
209 } |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
210 qd->connect_retry = QQ_CONNECT_MAX; |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
211 } |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
212 |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
213 segments = g_strsplit_set(qd->curr_server, ":", 0); |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
214 server = g_strdup(segments[0]); |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
215 port = atoi(segments[1]); |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
216 if (port <= 0) { |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
217 purple_debug_info("QQ", "Port not define in %s\n", qd->curr_server); |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
218 port = QQ_DEFAULT_PORT; |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
219 } |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
220 g_strfreev(segments); |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
221 |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
222 qd->connect_retry--; |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
223 if ( !connect_to_server(gc, server, port) ) { |
24066
dbc7a9742f8d
2008.09.26 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24065
diff
changeset
|
224 purple_connection_error_reason(gc, |
dbc7a9742f8d
2008.09.26 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24065
diff
changeset
|
225 PURPLE_CONNECTION_ERROR_NETWORK_ERROR, |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
226 _("Unable to connect.")); |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
227 } |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
228 |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
229 qd->check_watcher = purple_timeout_add_seconds(QQ_CONNECT_CHECK, connect_check, gc); |
23053
55f986ccbb6a
patch-05-reconnect-and-code-cleanup
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23052
diff
changeset
|
230 return FALSE; /* timeout callback stops */ |
55f986ccbb6a
patch-05-reconnect-and-code-cleanup
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23052
diff
changeset
|
231 } |
55f986ccbb6a
patch-05-reconnect-and-code-cleanup
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23052
diff
changeset
|
232 |
24065
bdfcfd71449c
patch 20080922 from ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24048
diff
changeset
|
233 static void redirect_server(PurpleConnection *gc) |
bdfcfd71449c
patch 20080922 from ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24048
diff
changeset
|
234 { |
bdfcfd71449c
patch 20080922 from ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24048
diff
changeset
|
235 qq_data *qd; |
bdfcfd71449c
patch 20080922 from ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24048
diff
changeset
|
236 qd = (qq_data *) gc->proto_data; |
bdfcfd71449c
patch 20080922 from ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24048
diff
changeset
|
237 |
bdfcfd71449c
patch 20080922 from ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24048
diff
changeset
|
238 if (qd->check_watcher > 0) { |
bdfcfd71449c
patch 20080922 from ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24048
diff
changeset
|
239 purple_timeout_remove(qd->check_watcher); |
bdfcfd71449c
patch 20080922 from ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24048
diff
changeset
|
240 qd->check_watcher = 0; |
bdfcfd71449c
patch 20080922 from ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24048
diff
changeset
|
241 } |
bdfcfd71449c
patch 20080922 from ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24048
diff
changeset
|
242 if (qd->connect_watcher > 0) purple_timeout_remove(qd->connect_watcher); |
bdfcfd71449c
patch 20080922 from ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24048
diff
changeset
|
243 qd->connect_watcher = purple_timeout_add_seconds(QQ_CONNECT_INTERVAL, qq_connect_later, gc); |
bdfcfd71449c
patch 20080922 from ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24048
diff
changeset
|
244 } |
bdfcfd71449c
patch 20080922 from ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24048
diff
changeset
|
245 |
23052 | 246 /* process the incoming packet from qq_pending */ |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
247 static gboolean packet_process(PurpleConnection *gc, guint8 *buf, gint buf_len) |
23052 | 248 { |
249 qq_data *qd; | |
250 gint bytes, bytes_not_read; | |
251 | |
252 guint8 header_tag; | |
253 guint16 source_tag; | |
254 guint16 cmd; | |
23053
55f986ccbb6a
patch-05-reconnect-and-code-cleanup
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23052
diff
changeset
|
255 guint16 seq; /* May be ack_seq or send_seq, depends on cmd */ |
23753
5f454b975a99
2008.08.10 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23683
diff
changeset
|
256 guint8 room_cmd; |
5f454b975a99
2008.08.10 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23683
diff
changeset
|
257 guint32 room_id; |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
258 gint update_class; |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
259 guint32 ship32; |
24065
bdfcfd71449c
patch 20080922 from ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24048
diff
changeset
|
260 int ret; |
23053
55f986ccbb6a
patch-05-reconnect-and-code-cleanup
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23052
diff
changeset
|
261 |
23683
1c50f12b1c52
2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23606
diff
changeset
|
262 qq_transaction *trans; |
23052 | 263 |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
264 g_return_val_if_fail(buf != NULL && buf_len > 0, TRUE); |
23052 | 265 |
266 qd = (qq_data *) gc->proto_data; | |
267 | |
23757
69c218fd5d54
applied changes from 5688199e261449d33b5803dafff50d860896ebcb
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23756
diff
changeset
|
268 qd->net_stat.rcved++; |
69c218fd5d54
applied changes from 5688199e261449d33b5803dafff50d860896ebcb
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23756
diff
changeset
|
269 if (qd->net_stat.rcved <= 0) memset(&(qd->net_stat), 0, sizeof(qd->net_stat)); |
24026
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
270 |
23053
55f986ccbb6a
patch-05-reconnect-and-code-cleanup
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23052
diff
changeset
|
271 /* Len, header and tail tag have been checked before */ |
23052 | 272 bytes = 0; |
273 bytes += packet_get_header(&header_tag, &source_tag, &cmd, &seq, buf + bytes); | |
274 | |
23753
5f454b975a99
2008.08.10 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23683
diff
changeset
|
275 #if 1 |
23755
23cec4360d4a
applied changes from 8cebefbc6cd5d84acb69c74e69e8821f11dd225d
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23754
diff
changeset
|
276 purple_debug_info("QQ", "==> [%05d] %s 0x%04X, source tag 0x%04X len %d\n", |
23cec4360d4a
applied changes from 8cebefbc6cd5d84acb69c74e69e8821f11dd225d
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23754
diff
changeset
|
277 seq, qq_get_cmd_desc(cmd), cmd, source_tag, buf_len); |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
278 #endif |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
279 /* this is the length of all the encrypted data (also remove tail tag) */ |
23052 | 280 bytes_not_read = buf_len - bytes - 1; |
281 | |
23053
55f986ccbb6a
patch-05-reconnect-and-code-cleanup
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23052
diff
changeset
|
282 /* ack packet, we need to update send tranactions */ |
55f986ccbb6a
patch-05-reconnect-and-code-cleanup
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23052
diff
changeset
|
283 /* we do not check duplication for server ack */ |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
284 trans = qq_trans_find_rcved(gc, cmd, seq); |
23683
1c50f12b1c52
2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23606
diff
changeset
|
285 if (trans == NULL) { |
1c50f12b1c52
2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23606
diff
changeset
|
286 /* new server command */ |
23755
23cec4360d4a
applied changes from 8cebefbc6cd5d84acb69c74e69e8821f11dd225d
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23754
diff
changeset
|
287 if ( !qd->is_login ) { |
23cec4360d4a
applied changes from 8cebefbc6cd5d84acb69c74e69e8821f11dd225d
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23754
diff
changeset
|
288 qq_trans_add_remain(gc, cmd, seq, buf + bytes, bytes_not_read); |
23cec4360d4a
applied changes from 8cebefbc6cd5d84acb69c74e69e8821f11dd225d
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23754
diff
changeset
|
289 } else { |
23cec4360d4a
applied changes from 8cebefbc6cd5d84acb69c74e69e8821f11dd225d
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23754
diff
changeset
|
290 qq_trans_add_server_cmd(gc, cmd, seq, buf + bytes, bytes_not_read); |
23cec4360d4a
applied changes from 8cebefbc6cd5d84acb69c74e69e8821f11dd225d
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23754
diff
changeset
|
291 qq_proc_server_cmd(gc, cmd, seq, buf + bytes, bytes_not_read); |
23053
55f986ccbb6a
patch-05-reconnect-and-code-cleanup
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23052
diff
changeset
|
292 } |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
293 return TRUE; |
23683
1c50f12b1c52
2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23606
diff
changeset
|
294 } |
1c50f12b1c52
2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23606
diff
changeset
|
295 |
1c50f12b1c52
2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23606
diff
changeset
|
296 if (qq_trans_is_dup(trans)) { |
23757
69c218fd5d54
applied changes from 5688199e261449d33b5803dafff50d860896ebcb
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23756
diff
changeset
|
297 qd->net_stat.rcved_dup++; |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
298 purple_debug_info("QQ", "dup [%05d] %s, discard...\n", seq, qq_get_cmd_desc(cmd)); |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
299 return TRUE; |
24021
6408be948d56
disapproval of revision '92d52eef2994d2697999177804e3665989cfa352'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24020
diff
changeset
|
300 } |
6408be948d56
disapproval of revision '92d52eef2994d2697999177804e3665989cfa352'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24020
diff
changeset
|
301 |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
302 update_class = qq_trans_get_class(trans); |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
303 ship32 = qq_trans_get_ship(trans); |
24048
d57928c9dd8f
2008.09.19 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24046
diff
changeset
|
304 if (update_class != 0 || ship32 != 0) { |
d57928c9dd8f
2008.09.19 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24046
diff
changeset
|
305 purple_debug_info("QQ", "Process in Update class %d, ship32 %d\n", |
d57928c9dd8f
2008.09.19 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24046
diff
changeset
|
306 update_class, ship32); |
d57928c9dd8f
2008.09.19 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24046
diff
changeset
|
307 } |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
308 |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
309 switch (cmd) { |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
310 case QQ_CMD_TOKEN: |
24065
bdfcfd71449c
patch 20080922 from ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24048
diff
changeset
|
311 case QQ_CMD_GET_SERVER: |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
312 case QQ_CMD_LOGIN: |
24065
bdfcfd71449c
patch 20080922 from ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24048
diff
changeset
|
313 ret = qq_proc_login_cmds(gc, cmd, seq, buf + bytes, bytes_not_read, update_class, ship32); |
bdfcfd71449c
patch 20080922 from ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24048
diff
changeset
|
314 if (ret != QQ_LOGIN_REPLY_OK) { |
bdfcfd71449c
patch 20080922 from ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24048
diff
changeset
|
315 if (ret == QQ_LOGIN_REPLY_REDIRECT) { |
bdfcfd71449c
patch 20080922 from ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24048
diff
changeset
|
316 redirect_server(gc); |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
317 } |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
318 return FALSE; /* do nothing after this function and return now */ |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
319 } |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
320 break; |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
321 case QQ_CMD_ROOM: |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
322 room_cmd = qq_trans_get_room_cmd(trans); |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
323 room_id = qq_trans_get_room_id(trans); |
23753
5f454b975a99
2008.08.10 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23683
diff
changeset
|
324 #if 1 |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
325 purple_debug_info("QQ", "%s (0x%02X) for room %d, len %d\n", |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
326 qq_get_room_cmd_desc(room_cmd), room_cmd, room_id, buf_len); |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
327 #endif |
24065
bdfcfd71449c
patch 20080922 from ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24048
diff
changeset
|
328 qq_proc_room_cmds(gc, seq, room_cmd, room_id, buf + bytes, bytes_not_read, update_class, ship32); |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
329 break; |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
330 default: |
24065
bdfcfd71449c
patch 20080922 from ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24048
diff
changeset
|
331 qq_proc_client_cmds(gc, cmd, seq, buf + bytes, bytes_not_read, update_class, ship32); |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
332 break; |
23052 | 333 } |
334 | |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
335 return TRUE; |
23052 | 336 } |
337 | |
338 static void tcp_pending(gpointer data, gint source, PurpleInputCondition cond) | |
339 { | |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
340 PurpleConnection *gc = (PurpleConnection *) data; |
23052 | 341 qq_data *qd; |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
342 qq_connection *conn; |
23053
55f986ccbb6a
patch-05-reconnect-and-code-cleanup
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23052
diff
changeset
|
343 guint8 buf[1024]; /* set to 16 when test tcp_rxqueue */ |
23052 | 344 gint buf_len; |
345 gint bytes; | |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
346 |
23052 | 347 guint8 *pkt; |
348 guint16 pkt_len; | |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
349 |
23052 | 350 gchar *error_msg; |
351 guint8 *jump; | |
352 gint jump_len; | |
353 | |
354 g_return_if_fail(gc != NULL && gc->proto_data != NULL); | |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
355 qd = (qq_data *) gc->proto_data; |
23052 | 356 |
357 if(cond != PURPLE_INPUT_READ) { | |
24066
dbc7a9742f8d
2008.09.26 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24065
diff
changeset
|
358 purple_connection_error_reason(gc, |
dbc7a9742f8d
2008.09.26 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24065
diff
changeset
|
359 PURPLE_CONNECTION_ERROR_NETWORK_ERROR, |
23052 | 360 _("Socket error")); |
361 return; | |
362 } | |
363 | |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
364 conn = connection_find(qd, source); |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
365 g_return_if_fail(conn != NULL); |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
366 |
23052 | 367 /* test code, not using tcp_rxqueue |
368 memset(pkt,0, sizeof(pkt)); | |
369 buf_len = read(qd->fd, pkt, sizeof(pkt)); | |
370 if (buf_len > 2) { | |
371 packet_process(gc, pkt + 2, buf_len - 2); | |
372 } | |
373 return; | |
374 */ | |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
375 |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
376 buf_len = read(source, buf, sizeof(buf)); |
23052 | 377 if (buf_len < 0) { |
378 if (errno == EAGAIN) | |
379 /* No worries */ | |
380 return; | |
381 | |
382 error_msg = g_strdup_printf(_("Lost connection with server:\n%d, %s"), errno, g_strerror(errno)); | |
24066
dbc7a9742f8d
2008.09.26 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24065
diff
changeset
|
383 purple_connection_error_reason(gc, |
dbc7a9742f8d
2008.09.26 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24065
diff
changeset
|
384 PURPLE_CONNECTION_ERROR_NETWORK_ERROR, |
dbc7a9742f8d
2008.09.26 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24065
diff
changeset
|
385 error_msg); |
23052 | 386 g_free(error_msg); |
387 return; | |
388 } else if (buf_len == 0) { | |
389 purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR, | |
390 _("Server closed the connection.")); | |
391 return; | |
392 } | |
393 | |
23606
bdb38a8bf721
20080717-05-1-fix-keep-alive ccpaging <ecc_hy(at)hotmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23054
diff
changeset
|
394 /* keep alive will be sent in 30 seconds since last_receive |
bdb38a8bf721
20080717-05-1-fix-keep-alive ccpaging <ecc_hy(at)hotmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23054
diff
changeset
|
395 * QQ need a keep alive packet in every 60 seconds |
bdb38a8bf721
20080717-05-1-fix-keep-alive ccpaging <ecc_hy(at)hotmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23054
diff
changeset
|
396 gc->last_received = time(NULL); |
bdb38a8bf721
20080717-05-1-fix-keep-alive ccpaging <ecc_hy(at)hotmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23054
diff
changeset
|
397 */ |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
398 /* purple_debug_info("TCP_PENDING", "Read %d bytes, rxlen is %d\n", buf_len, conn->tcp_rxlen); */ |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
399 conn->tcp_rxqueue = g_realloc(conn->tcp_rxqueue, buf_len + conn->tcp_rxlen); |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
400 memcpy(conn->tcp_rxqueue + conn->tcp_rxlen, buf, buf_len); |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
401 conn->tcp_rxlen += buf_len; |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
402 |
23052 | 403 pkt = g_newa(guint8, MAX_PACKET_SIZE); |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
404 while (PURPLE_CONNECTION_IS_VALID(gc)) { |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
405 if (qd->openconns == NULL) { |
23052 | 406 break; |
407 } | |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
408 if (conn->tcp_rxqueue == NULL) { |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
409 conn->tcp_rxlen = 0; |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
410 break; |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
411 } |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
412 if (conn->tcp_rxlen < QQ_TCP_HEADER_LENGTH) { |
23052 | 413 break; |
414 } | |
415 | |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
416 bytes = 0; |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
417 bytes += qq_get16(&pkt_len, conn->tcp_rxqueue + bytes); |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
418 if (conn->tcp_rxlen < pkt_len) { |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
419 break; |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
420 } |
24026
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
421 |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
422 /* purple_debug_info("TCP_PENDING", "Packet len=%d, rxlen=%d\n", pkt_len, conn->tcp_rxlen); */ |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
423 if ( pkt_len < QQ_TCP_HEADER_LENGTH |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
424 || *(conn->tcp_rxqueue + bytes) != QQ_PACKET_TAG |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
425 || *(conn->tcp_rxqueue + pkt_len - 1) != QQ_PACKET_TAIL) { |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
426 /* HEY! This isn't even a QQ. What are you trying to pull? */ |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
427 purple_debug_warning("TCP_PENDING", "Packet error, no header or tail tag\n"); |
23052 | 428 |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
429 jump = memchr(conn->tcp_rxqueue + 1, QQ_PACKET_TAIL, conn->tcp_rxlen - 1); |
23052 | 430 if ( !jump ) { |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
431 purple_debug_warning("TCP_PENDING", "Failed to find next tail, clear receive buffer\n"); |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
432 g_free(conn->tcp_rxqueue); |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
433 conn->tcp_rxqueue = NULL; |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
434 conn->tcp_rxlen = 0; |
23052 | 435 return; |
436 } | |
437 | |
23053
55f986ccbb6a
patch-05-reconnect-and-code-cleanup
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23052
diff
changeset
|
438 /* jump and over QQ_PACKET_TAIL */ |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
439 jump_len = (jump - conn->tcp_rxqueue) + 1; |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
440 purple_debug_warning("TCP_PENDING", "Find next tail at %d, jump %d\n", jump_len, jump_len + 1); |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
441 g_memmove(conn->tcp_rxqueue, jump, conn->tcp_rxlen - jump_len); |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
442 conn->tcp_rxlen -= jump_len; |
23052 | 443 continue; |
444 } | |
445 | |
446 memset(pkt, 0, MAX_PACKET_SIZE); | |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
447 g_memmove(pkt, conn->tcp_rxqueue + bytes, pkt_len - bytes); |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
448 |
23053
55f986ccbb6a
patch-05-reconnect-and-code-cleanup
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23052
diff
changeset
|
449 /* jump to next packet */ |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
450 conn->tcp_rxlen -= pkt_len; |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
451 if (conn->tcp_rxlen) { |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
452 /* purple_debug_info("TCP_PENDING", "shrink tcp_rxqueue to %d\n", conn->tcp_rxlen); */ |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
453 jump = g_memdup(conn->tcp_rxqueue + pkt_len, conn->tcp_rxlen); |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
454 g_free(conn->tcp_rxqueue); |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
455 conn->tcp_rxqueue = jump; |
23052 | 456 } else { |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
457 /* purple_debug_info("TCP_PENDING", "free tcp_rxqueue\n"); */ |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
458 g_free(conn->tcp_rxqueue); |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
459 conn->tcp_rxqueue = NULL; |
23052 | 460 } |
461 | |
462 if (pkt == NULL) { | |
463 continue; | |
464 } | |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
465 /* packet_process may call disconnect and destory data like conn |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
466 * do not call packet_process before jump, |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
467 * break if packet_process return FALSE */ |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
468 if (packet_process(gc, pkt, pkt_len - bytes) == FALSE) { |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
469 purple_debug_info("TCP_PENDING", "Connection has been destory\n"); |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
470 break; |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
471 } |
23052 | 472 } |
473 } | |
474 | |
475 static void udp_pending(gpointer data, gint source, PurpleInputCondition cond) | |
476 { | |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
477 PurpleConnection *gc = (PurpleConnection *) data; |
23052 | 478 qq_data *qd; |
479 guint8 *buf; | |
480 gint buf_len; | |
481 | |
482 gc = (PurpleConnection *) data; | |
483 g_return_if_fail(gc != NULL && gc->proto_data != NULL); | |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
484 qd = (qq_data *) gc->proto_data; |
23052 | 485 |
486 if(cond != PURPLE_INPUT_READ) { | |
24066
dbc7a9742f8d
2008.09.26 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24065
diff
changeset
|
487 purple_connection_error_reason(gc, |
dbc7a9742f8d
2008.09.26 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24065
diff
changeset
|
488 PURPLE_CONNECTION_ERROR_NETWORK_ERROR, |
23052 | 489 _("Socket error")); |
490 return; | |
491 } | |
492 | |
493 buf = g_newa(guint8, MAX_PACKET_SIZE); | |
494 | |
495 /* here we have UDP proxy suppport */ | |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
496 buf_len = read(source, buf, MAX_PACKET_SIZE); |
23052 | 497 if (buf_len <= 0) { |
24066
dbc7a9742f8d
2008.09.26 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24065
diff
changeset
|
498 purple_connection_error_reason(gc, |
dbc7a9742f8d
2008.09.26 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24065
diff
changeset
|
499 PURPLE_CONNECTION_ERROR_NETWORK_ERROR, |
23052 | 500 _("Unable to read from socket")); |
501 return; | |
502 } | |
503 | |
23606
bdb38a8bf721
20080717-05-1-fix-keep-alive ccpaging <ecc_hy(at)hotmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23054
diff
changeset
|
504 /* keep alive will be sent in 30 seconds since last_receive |
bdb38a8bf721
20080717-05-1-fix-keep-alive ccpaging <ecc_hy(at)hotmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23054
diff
changeset
|
505 * QQ need a keep alive packet in every 60 seconds |
bdb38a8bf721
20080717-05-1-fix-keep-alive ccpaging <ecc_hy(at)hotmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23054
diff
changeset
|
506 gc->last_received = time(NULL); |
bdb38a8bf721
20080717-05-1-fix-keep-alive ccpaging <ecc_hy(at)hotmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23054
diff
changeset
|
507 */ |
23052 | 508 |
509 if (buf_len < QQ_UDP_HEADER_LENGTH) { | |
510 if (buf[0] != QQ_PACKET_TAG || buf[buf_len - 1] != QQ_PACKET_TAIL) { | |
511 qq_hex_dump(PURPLE_DEBUG_ERROR, "UDP_PENDING", | |
512 buf, buf_len, | |
513 "Received packet is too short, or no header and tail tag"); | |
514 return; | |
515 } | |
516 } | |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
517 |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
518 /* packet_process may call disconnect and destory data like conn |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
519 * do not call packet_process before jump, |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
520 * break if packet_process return FALSE */ |
23052 | 521 packet_process(gc, buf, buf_len); |
522 } | |
523 | |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
524 static gint udp_send_out(PurpleConnection *gc, guint8 *data, gint data_len) |
23052 | 525 { |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
526 qq_data *qd; |
23052 | 527 gint ret; |
528 | |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
529 g_return_val_if_fail(data != NULL && data_len > 0, -1); |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
530 |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
531 g_return_val_if_fail(gc != NULL && gc->proto_data != NULL, -1); |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
532 qd = (qq_data *) gc->proto_data; |
23052 | 533 |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
534 #if 0 |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
535 purple_debug_info("UDP_SEND_OUT", "Send %d bytes to socket %d\n", data_len, qd->fd); |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
536 #endif |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
537 |
23052 | 538 errno = 0; |
539 ret = send(qd->fd, data, data_len, 0); | |
540 if (ret < 0 && errno == EAGAIN) { | |
541 return ret; | |
542 } | |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
543 |
23052 | 544 if (ret < 0) { |
545 /* TODO: what to do here - do we really have to disconnect? */ | |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
546 purple_debug_error("UDP_SEND_OUT", "Send failed: %d, %s\n", errno, g_strerror(errno)); |
24066
dbc7a9742f8d
2008.09.26 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24065
diff
changeset
|
547 purple_connection_error_reason(gc, |
dbc7a9742f8d
2008.09.26 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24065
diff
changeset
|
548 PURPLE_CONNECTION_ERROR_NETWORK_ERROR, |
dbc7a9742f8d
2008.09.26 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24065
diff
changeset
|
549 g_strerror(errno)); |
23052 | 550 } |
551 return ret; | |
552 } | |
553 | |
554 static void tcp_can_write(gpointer data, gint source, PurpleInputCondition cond) | |
555 { | |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
556 PurpleConnection *gc = (PurpleConnection *) data; |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
557 qq_data *qd; |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
558 qq_connection *conn; |
23052 | 559 int ret, writelen; |
560 | |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
561 g_return_if_fail(gc != NULL && gc->proto_data != NULL); |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
562 qd = (qq_data *) gc->proto_data; |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
563 |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
564 conn = connection_find(qd, source); |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
565 g_return_if_fail(conn != NULL); |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
566 |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
567 writelen = purple_circ_buffer_get_max_read(conn->tcp_txbuf); |
23052 | 568 if (writelen == 0) { |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
569 purple_input_remove(conn->can_write_handler); |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
570 conn->can_write_handler = 0; |
23052 | 571 return; |
572 } | |
573 | |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
574 ret = write(source, conn->tcp_txbuf->outptr, writelen); |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
575 purple_debug_info("TCP_CAN_WRITE", "total %d bytes is sent %d\n", writelen, ret); |
23052 | 576 |
577 if (ret < 0 && errno == EAGAIN) | |
578 return; | |
579 else if (ret < 0) { | |
580 /* TODO: what to do here - do we really have to disconnect? */ | |
24066
dbc7a9742f8d
2008.09.26 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24065
diff
changeset
|
581 purple_connection_error_reason(gc, |
dbc7a9742f8d
2008.09.26 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24065
diff
changeset
|
582 PURPLE_CONNECTION_ERROR_NETWORK_ERROR, |
dbc7a9742f8d
2008.09.26 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24065
diff
changeset
|
583 _("Write Error")); |
23052 | 584 return; |
585 } | |
586 | |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
587 purple_circ_buffer_mark_read(conn->tcp_txbuf, ret); |
23052 | 588 } |
589 | |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
590 static gint tcp_send_out(PurpleConnection *gc, guint8 *data, gint data_len) |
23052 | 591 { |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
592 qq_data *qd; |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
593 qq_connection *conn; |
23052 | 594 gint ret; |
595 | |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
596 g_return_val_if_fail(data != NULL && data_len > 0, -1); |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
597 |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
598 g_return_val_if_fail(gc != NULL && gc->proto_data != NULL, -1); |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
599 qd = (qq_data *) gc->proto_data; |
23052 | 600 |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
601 conn = connection_find(qd, qd->fd); |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
602 g_return_val_if_fail(conn, -1); |
23052 | 603 |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
604 #if 0 |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
605 purple_debug_info("TCP_SEND_OUT", "Send %d bytes to socket %d\n", data_len, qd->fd); |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
606 #endif |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
607 |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
608 if (conn->can_write_handler == 0) { |
23052 | 609 ret = write(qd->fd, data, data_len); |
610 } else { | |
611 ret = -1; | |
612 errno = EAGAIN; | |
613 } | |
614 | |
23683
1c50f12b1c52
2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23606
diff
changeset
|
615 /* |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
616 purple_debug_info("TCP_SEND_OUT", |
23052 | 617 "Socket %d, total %d bytes is sent %d\n", qd->fd, data_len, ret); |
23683
1c50f12b1c52
2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23606
diff
changeset
|
618 */ |
23052 | 619 if (ret < 0 && errno == EAGAIN) { |
23053
55f986ccbb6a
patch-05-reconnect-and-code-cleanup
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23052
diff
changeset
|
620 /* socket is busy, send later */ |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
621 purple_debug_info("TCP_SEND_OUT", "Socket is busy and send later\n"); |
23052 | 622 ret = 0; |
623 } else if (ret <= 0) { | |
23053
55f986ccbb6a
patch-05-reconnect-and-code-cleanup
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23052
diff
changeset
|
624 /* TODO: what to do here - do we really have to disconnect? */ |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
625 purple_debug_error("TCP_SEND_OUT", |
23052 | 626 "Send to socket %d failed: %d, %s\n", qd->fd, errno, g_strerror(errno)); |
24066
dbc7a9742f8d
2008.09.26 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24065
diff
changeset
|
627 purple_connection_error_reason(gc, |
dbc7a9742f8d
2008.09.26 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24065
diff
changeset
|
628 PURPLE_CONNECTION_ERROR_NETWORK_ERROR, |
dbc7a9742f8d
2008.09.26 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24065
diff
changeset
|
629 g_strerror(errno)); |
23052 | 630 return ret; |
631 } | |
632 | |
633 if (ret < data_len) { | |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
634 purple_debug_info("TCP_SEND_OUT", |
23052 | 635 "Add %d bytes to buffer\n", data_len - ret); |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
636 if (conn->can_write_handler == 0) { |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
637 conn->can_write_handler = purple_input_add(qd->fd, PURPLE_INPUT_WRITE, tcp_can_write, gc); |
23052 | 638 } |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
639 purple_circ_buffer_append(conn->tcp_txbuf, data + ret, data_len - ret); |
23052 | 640 } |
641 return ret; | |
642 } | |
643 | |
23683
1c50f12b1c52
2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23606
diff
changeset
|
644 static gboolean network_timeout(gpointer data) |
23052 | 645 { |
23683
1c50f12b1c52
2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23606
diff
changeset
|
646 PurpleConnection *gc = (PurpleConnection *) data; |
23052 | 647 qq_data *qd; |
23683
1c50f12b1c52
2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23606
diff
changeset
|
648 gboolean is_lost_conn; |
1c50f12b1c52
2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23606
diff
changeset
|
649 |
23052 | 650 g_return_val_if_fail(gc != NULL && gc->proto_data != NULL, TRUE); |
23683
1c50f12b1c52
2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23606
diff
changeset
|
651 qd = (qq_data *) gc->proto_data; |
23052 | 652 |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
653 is_lost_conn = qq_trans_scan(gc); |
23683
1c50f12b1c52
2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23606
diff
changeset
|
654 if (is_lost_conn) { |
1c50f12b1c52
2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23606
diff
changeset
|
655 purple_connection_error_reason(gc, |
24066
dbc7a9742f8d
2008.09.26 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24065
diff
changeset
|
656 PURPLE_CONNECTION_ERROR_NETWORK_ERROR, |
dbc7a9742f8d
2008.09.26 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24065
diff
changeset
|
657 _("Connection lost")); |
23683
1c50f12b1c52
2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23606
diff
changeset
|
658 return TRUE; |
1c50f12b1c52
2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23606
diff
changeset
|
659 } |
23052 | 660 |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
661 if ( !qd->is_login ) { |
23683
1c50f12b1c52
2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23606
diff
changeset
|
662 return TRUE; |
1c50f12b1c52
2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23606
diff
changeset
|
663 } |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
664 |
23683
1c50f12b1c52
2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23606
diff
changeset
|
665 qd->itv_count.keep_alive--; |
1c50f12b1c52
2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23606
diff
changeset
|
666 if (qd->itv_count.keep_alive <= 0) { |
1c50f12b1c52
2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23606
diff
changeset
|
667 qd->itv_count.keep_alive = qd->itv_config.keep_alive; |
24065
bdfcfd71449c
patch 20080922 from ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24048
diff
changeset
|
668 qq_request_keep_alive(gc); |
23683
1c50f12b1c52
2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23606
diff
changeset
|
669 return TRUE; |
1c50f12b1c52
2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23606
diff
changeset
|
670 } |
23052 | 671 |
23683
1c50f12b1c52
2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23606
diff
changeset
|
672 if (qd->itv_config.update <= 0) { |
1c50f12b1c52
2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23606
diff
changeset
|
673 return TRUE; |
1c50f12b1c52
2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23606
diff
changeset
|
674 } |
1c50f12b1c52
2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23606
diff
changeset
|
675 |
1c50f12b1c52
2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23606
diff
changeset
|
676 qd->itv_count.update--; |
1c50f12b1c52
2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23606
diff
changeset
|
677 if (qd->itv_count.update <= 0) { |
1c50f12b1c52
2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23606
diff
changeset
|
678 qd->itv_count.update = qd->itv_config.update; |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
679 qq_update_online(gc, 0); |
23683
1c50f12b1c52
2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23606
diff
changeset
|
680 return TRUE; |
23052 | 681 } |
682 | |
683 return TRUE; /* if return FALSE, timeout callback stops */ | |
684 } | |
685 | |
24065
bdfcfd71449c
patch 20080922 from ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24048
diff
changeset
|
686 static void set_all_keys(PurpleConnection *gc) |
23052 | 687 { |
688 qq_data *qd; | |
689 const gchar *passwd; | |
24066
dbc7a9742f8d
2008.09.26 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24065
diff
changeset
|
690 guint8 *dest; |
dbc7a9742f8d
2008.09.26 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24065
diff
changeset
|
691 int dest_len = QQ_KEY_LENGTH; |
23052 | 692 |
23053
55f986ccbb6a
patch-05-reconnect-and-code-cleanup
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23052
diff
changeset
|
693 /* _qq_show_socket("Got login socket", source); */ |
23052 | 694 |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
695 g_return_if_fail(gc != NULL && gc->proto_data != NULL); |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
696 qd = (qq_data *) gc->proto_data; |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
697 |
23052 | 698 /* QQ use random seq, to minimize duplicated packets */ |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
699 srand(time(NULL)); |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
700 qd->send_seq = rand() & 0xffff; |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
701 |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
702 qd->is_login = FALSE; |
23052 | 703 qd->channel = 1; |
704 qd->uid = strtol(purple_account_get_username(purple_connection_get_account(gc)), NULL, 10); | |
705 | |
24065
bdfcfd71449c
patch 20080922 from ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24048
diff
changeset
|
706 #ifdef DEBUG |
24066
dbc7a9742f8d
2008.09.26 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24065
diff
changeset
|
707 memset(qd->ld.random_key, 0x01, sizeof(qd->ld.random_key)); |
24065
bdfcfd71449c
patch 20080922 from ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24048
diff
changeset
|
708 #else |
24066
dbc7a9742f8d
2008.09.26 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24065
diff
changeset
|
709 for (bytes = 0; bytes < sizeof(qd->ld.random_key); bytes++) { |
dbc7a9742f8d
2008.09.26 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24065
diff
changeset
|
710 qd->ld.random_key[bytes] = (guint8) (rand() & 0xff); |
24065
bdfcfd71449c
patch 20080922 from ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24048
diff
changeset
|
711 } |
bdfcfd71449c
patch 20080922 from ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24048
diff
changeset
|
712 #endif |
bdfcfd71449c
patch 20080922 from ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24048
diff
changeset
|
713 |
23052 | 714 /* now generate md5 processed passwd */ |
715 passwd = purple_account_get_password(purple_connection_get_account(gc)); | |
23683
1c50f12b1c52
2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23606
diff
changeset
|
716 |
1c50f12b1c52
2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23606
diff
changeset
|
717 /* use twice-md5 of user password as session key since QQ 2003iii */ |
24066
dbc7a9742f8d
2008.09.26 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24065
diff
changeset
|
718 dest = qd->ld.pwd_2nd_md5; |
dbc7a9742f8d
2008.09.26 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24065
diff
changeset
|
719 qq_get_md5(dest, dest_len, (guint8 *)passwd, strlen(passwd)); |
dbc7a9742f8d
2008.09.26 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24065
diff
changeset
|
720 qq_get_md5(dest, dest_len, dest, dest_len); |
23683
1c50f12b1c52
2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23606
diff
changeset
|
721 |
24066
dbc7a9742f8d
2008.09.26 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24065
diff
changeset
|
722 dest = qd->ld.pwd_4th_md5; |
dbc7a9742f8d
2008.09.26 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24065
diff
changeset
|
723 qq_get_md5(dest, dest_len, qd->ld.pwd_2nd_md5, dest_len); |
dbc7a9742f8d
2008.09.26 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24065
diff
changeset
|
724 qq_get_md5(dest, dest_len, dest, dest_len); |
23052 | 725 } |
726 | |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
727 /* the callback function after socket is built |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
728 * we setup the qq protocol related configuration here */ |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
729 static void connect_cb(gpointer data, gint source, const gchar *error_message) |
23052 | 730 { |
731 PurpleConnection *gc; | |
732 qq_data *qd; | |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
733 PurpleAccount *account ; |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
734 qq_connection *conn; |
23052 | 735 |
736 gc = (PurpleConnection *) data; | |
737 g_return_if_fail(gc != NULL && gc->proto_data != NULL); | |
738 | |
739 qd = (qq_data *) gc->proto_data; | |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
740 account = purple_connection_get_account(gc); |
23052 | 741 |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
742 /* conn_data will be destoryed */ |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
743 qd->conn_data = NULL; |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
744 |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
745 if (!PURPLE_CONNECTION_IS_VALID(gc)) { |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
746 purple_debug_info("QQ_CONN", "Invalid connection\n"); |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
747 close(source); |
23052 | 748 return; |
749 } | |
750 | |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
751 if (source < 0) { /* socket returns -1 */ |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
752 purple_debug_info("QQ_CONN", |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
753 "Could not establish a connection with the server:\n%s\n", |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
754 error_message); |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
755 if (qd->connect_watcher > 0) purple_timeout_remove(qd->connect_watcher); |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
756 qd->connect_watcher = purple_timeout_add_seconds(QQ_CONNECT_INTERVAL, qq_connect_later, gc); |
23052 | 757 return; |
758 } | |
759 | |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
760 /* _qq_show_socket("Got login socket", source); */ |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
761 qd->fd = source; |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
762 conn = connection_create(qd, source); |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
763 if (qd->use_tcp) { |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
764 conn->input_handler = purple_input_add(source, PURPLE_INPUT_READ, tcp_pending, gc); |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
765 } else { |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
766 conn->input_handler = purple_input_add(source, PURPLE_INPUT_READ, udp_pending, gc); |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
767 } |
23052 | 768 |
24065
bdfcfd71449c
patch 20080922 from ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24048
diff
changeset
|
769 g_return_if_fail(qd->network_watcher == 0); |
bdfcfd71449c
patch 20080922 from ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24048
diff
changeset
|
770 qd->network_watcher = purple_timeout_add_seconds(qd->itv_config.resend, network_timeout, gc); |
bdfcfd71449c
patch 20080922 from ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24048
diff
changeset
|
771 |
bdfcfd71449c
patch 20080922 from ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24048
diff
changeset
|
772 set_all_keys( gc ); |
bdfcfd71449c
patch 20080922 from ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24048
diff
changeset
|
773 |
24066
dbc7a9742f8d
2008.09.26 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24065
diff
changeset
|
774 if (qd->client_version > 2005) { |
24065
bdfcfd71449c
patch 20080922 from ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24048
diff
changeset
|
775 purple_connection_update_progress(gc, _("Get server ..."), 2, QQ_CONNECT_STEPS); |
bdfcfd71449c
patch 20080922 from ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24048
diff
changeset
|
776 qq_request_get_server(gc); |
bdfcfd71449c
patch 20080922 from ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24048
diff
changeset
|
777 return; |
bdfcfd71449c
patch 20080922 from ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24048
diff
changeset
|
778 } |
bdfcfd71449c
patch 20080922 from ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24048
diff
changeset
|
779 |
bdfcfd71449c
patch 20080922 from ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24048
diff
changeset
|
780 purple_connection_update_progress(gc, _("Request token"), 2, QQ_CONNECT_STEPS); |
bdfcfd71449c
patch 20080922 from ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24048
diff
changeset
|
781 qq_request_token(gc); |
23052 | 782 } |
783 | |
23755
23cec4360d4a
applied changes from 8cebefbc6cd5d84acb69c74e69e8821f11dd225d
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23754
diff
changeset
|
784 #ifndef purple_proxy_connect_udp |
24026
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
785 static void udp_can_write(gpointer data, gint source, PurpleInputCondition cond) |
23052 | 786 { |
787 PurpleConnection *gc; | |
788 qq_data *qd; | |
24026
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
789 socklen_t len; |
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
790 int error=0, ret; |
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
791 |
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
792 gc = (PurpleConnection *) data; |
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
793 g_return_if_fail(gc != NULL && gc->proto_data != NULL); |
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
794 |
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
795 qd = (qq_data *) gc->proto_data; |
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
796 |
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
797 |
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
798 purple_debug_info("proxy", "Connected.\n"); |
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
799 |
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
800 /* |
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
801 * getsockopt after a non-blocking connect returns -1 if something is |
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
802 * really messed up (bad descriptor, usually). Otherwise, it returns 0 and |
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
803 * error holds what connect would have returned if it blocked until now. |
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
804 * Thus, error == 0 is success, error == EINPROGRESS means "try again", |
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
805 * and anything else is a real error. |
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
806 * |
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
807 * (error == EINPROGRESS can happen after a select because the kernel can |
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
808 * be overly optimistic sometimes. select is just a hint that you might be |
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
809 * able to do something.) |
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
810 */ |
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
811 len = sizeof(error); |
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
812 ret = getsockopt(source, SOL_SOCKET, SO_ERROR, &error, &len); |
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
813 if (ret == 0 && error == EINPROGRESS) |
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
814 return; /* we'll be called again later */ |
23755
23cec4360d4a
applied changes from 8cebefbc6cd5d84acb69c74e69e8821f11dd225d
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23754
diff
changeset
|
815 |
23cec4360d4a
applied changes from 8cebefbc6cd5d84acb69c74e69e8821f11dd225d
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23754
diff
changeset
|
816 purple_input_remove(qd->udp_can_write_handler); |
23cec4360d4a
applied changes from 8cebefbc6cd5d84acb69c74e69e8821f11dd225d
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23754
diff
changeset
|
817 qd->udp_can_write_handler = 0; |
24026
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
818 if (ret < 0 || error != 0) { |
23755
23cec4360d4a
applied changes from 8cebefbc6cd5d84acb69c74e69e8821f11dd225d
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23754
diff
changeset
|
819 if(ret != 0) |
24026
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
820 error = errno; |
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
821 |
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
822 close(source); |
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
823 |
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
824 purple_debug_error("proxy", "getsockopt SO_ERROR check: %s\n", g_strerror(error)); |
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
825 |
23755
23cec4360d4a
applied changes from 8cebefbc6cd5d84acb69c74e69e8821f11dd225d
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23754
diff
changeset
|
826 connect_cb(gc, -1, _("Unable to connect")); |
24026
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
827 return; |
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
828 } |
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
829 |
23755
23cec4360d4a
applied changes from 8cebefbc6cd5d84acb69c74e69e8821f11dd225d
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23754
diff
changeset
|
830 connect_cb(gc, source, NULL); |
24026
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
831 } |
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
832 |
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
833 static void udp_host_resolved(GSList *hosts, gpointer data, const char *error_message) { |
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
834 PurpleConnection *gc; |
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
835 qq_data *qd; |
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
836 struct sockaddr server_addr; |
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
837 int addr_size; |
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
838 gint fd = -1; |
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
839 int flags; |
23052 | 840 |
841 gc = (PurpleConnection *) data; | |
842 g_return_if_fail(gc != NULL && gc->proto_data != NULL); | |
843 | |
844 qd = (qq_data *) gc->proto_data; | |
24026
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
845 |
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
846 /* udp_query_data must be set as NULL. |
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
847 * Otherwise purple_dnsquery_destroy in qq_disconnect cause glib double free error */ |
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
848 qd->udp_query_data = NULL; |
23052 | 849 |
24026
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
850 if (!hosts || !hosts->data) { |
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
851 purple_connection_error_reason(gc, |
24066
dbc7a9742f8d
2008.09.26 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24065
diff
changeset
|
852 PURPLE_CONNECTION_ERROR_NETWORK_ERROR, |
dbc7a9742f8d
2008.09.26 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24065
diff
changeset
|
853 _("Couldn't resolve host")); |
23052 | 854 return; |
855 } | |
856 | |
24026
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
857 addr_size = GPOINTER_TO_INT(hosts->data); |
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
858 hosts = g_slist_remove(hosts, hosts->data); |
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
859 memcpy(&server_addr, hosts->data, addr_size); |
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
860 g_free(hosts->data); |
23755
23cec4360d4a
applied changes from 8cebefbc6cd5d84acb69c74e69e8821f11dd225d
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23754
diff
changeset
|
861 |
24026
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
862 hosts = g_slist_remove(hosts, hosts->data); |
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
863 while(hosts) { |
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
864 hosts = g_slist_remove(hosts, hosts->data); |
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
865 g_free(hosts->data); |
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
866 hosts = g_slist_remove(hosts, hosts->data); |
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
867 } |
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
868 |
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
869 fd = socket(PF_INET, SOCK_DGRAM, 0); |
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
870 if (fd < 0) { |
23755
23cec4360d4a
applied changes from 8cebefbc6cd5d84acb69c74e69e8821f11dd225d
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23754
diff
changeset
|
871 purple_debug_error("QQ", |
24026
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
872 "Unable to create socket: %s\n", g_strerror(errno)); |
23052 | 873 return; |
874 } | |
875 | |
24026
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
876 /* we use non-blocking mode to speed up connection */ |
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
877 flags = fcntl(fd, F_GETFL); |
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
878 fcntl(fd, F_SETFL, flags | O_NONBLOCK); |
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
879 #ifndef _WIN32 |
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
880 fcntl(fd, F_SETFD, FD_CLOEXEC); |
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
881 #endif |
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
882 |
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
883 /* From Unix-socket-FAQ: http://www.faqs.org/faqs/unix-faq/socket/ |
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
884 * |
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
885 * If a UDP socket is unconnected, which is the normal state after a |
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
886 * bind() call, then send() or write() are not allowed, since no |
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
887 * destination is available; only sendto() can be used to send data. |
23755
23cec4360d4a
applied changes from 8cebefbc6cd5d84acb69c74e69e8821f11dd225d
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23754
diff
changeset
|
888 * |
24026
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
889 * Calling connect() on the socket simply records the specified address |
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
890 * and port number as being the desired communications partner. That |
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
891 * means that send() or write() are now allowed; they use the destination |
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
892 * address and port given on the connect call as the destination of packets. |
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
893 */ |
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
894 if (connect(fd, &server_addr, addr_size) >= 0) { |
23755
23cec4360d4a
applied changes from 8cebefbc6cd5d84acb69c74e69e8821f11dd225d
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23754
diff
changeset
|
895 purple_debug_info("QQ", "Connected.\n"); |
24026
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
896 flags = fcntl(fd, F_GETFL); |
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
897 fcntl(fd, F_SETFL, flags & ~O_NONBLOCK); |
23755
23cec4360d4a
applied changes from 8cebefbc6cd5d84acb69c74e69e8821f11dd225d
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23754
diff
changeset
|
898 connect_cb(gc, fd, NULL); |
24026
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
899 return; |
24019
147ada94a1d8
2008.08.16 - ccpaging <ecc_hy(at)hotmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23774
diff
changeset
|
900 } |
23755
23cec4360d4a
applied changes from 8cebefbc6cd5d84acb69c74e69e8821f11dd225d
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23754
diff
changeset
|
901 |
24026
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
902 /* [EINPROGRESS] |
23755
23cec4360d4a
applied changes from 8cebefbc6cd5d84acb69c74e69e8821f11dd225d
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23754
diff
changeset
|
903 * The socket is marked as non-blocking and the connection cannot be |
23cec4360d4a
applied changes from 8cebefbc6cd5d84acb69c74e69e8821f11dd225d
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23754
diff
changeset
|
904 * completed immediately. It is possible to select for completion by |
24026
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
905 * selecting the socket for writing. |
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
906 * [EINTR] |
23755
23cec4360d4a
applied changes from 8cebefbc6cd5d84acb69c74e69e8821f11dd225d
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23754
diff
changeset
|
907 * A signal interrupted the call. |
24026
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
908 * The connection is established asynchronously. |
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
909 */ |
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
910 if ((errno == EINPROGRESS) || (errno == EINTR)) { |
23755
23cec4360d4a
applied changes from 8cebefbc6cd5d84acb69c74e69e8821f11dd225d
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23754
diff
changeset
|
911 purple_debug_warning( "QQ", "Connect in asynchronous mode.\n"); |
23cec4360d4a
applied changes from 8cebefbc6cd5d84acb69c74e69e8821f11dd225d
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23754
diff
changeset
|
912 qd->udp_can_write_handler = purple_input_add(fd, PURPLE_INPUT_WRITE, udp_can_write, gc); |
24026
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
913 return; |
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
914 } |
23052 | 915 |
23755
23cec4360d4a
applied changes from 8cebefbc6cd5d84acb69c74e69e8821f11dd225d
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23754
diff
changeset
|
916 purple_debug_error("QQ", "Connection failed: %s\n", g_strerror(errno)); |
24026
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
917 close(fd); |
23052 | 918 } |
23755
23cec4360d4a
applied changes from 8cebefbc6cd5d84acb69c74e69e8821f11dd225d
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23754
diff
changeset
|
919 #endif |
23052 | 920 |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
921 gboolean connect_to_server(PurpleConnection *gc, gchar *server, gint port) |
23052 | 922 { |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
923 PurpleAccount *account ; |
23052 | 924 qq_data *qd; |
925 | |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
926 g_return_val_if_fail(gc != NULL && gc->proto_data != NULL, FALSE); |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
927 account = purple_connection_get_account(gc); |
23052 | 928 qd = (qq_data *) gc->proto_data; |
929 | |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
930 if (server == NULL || strlen(server) == 0 || port == 0) { |
24066
dbc7a9742f8d
2008.09.26 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24065
diff
changeset
|
931 purple_connection_error_reason(gc, |
dbc7a9742f8d
2008.09.26 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24065
diff
changeset
|
932 PURPLE_CONNECTION_ERROR_NETWORK_ERROR, |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
933 _("Invalid server or port")); |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
934 return FALSE; |
23053
55f986ccbb6a
patch-05-reconnect-and-code-cleanup
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23052
diff
changeset
|
935 } |
55f986ccbb6a
patch-05-reconnect-and-code-cleanup
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23052
diff
changeset
|
936 |
24065
bdfcfd71449c
patch 20080922 from ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24048
diff
changeset
|
937 purple_connection_update_progress(gc, _("Connecting server ..."), 1, QQ_CONNECT_STEPS); |
23053
55f986ccbb6a
patch-05-reconnect-and-code-cleanup
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23052
diff
changeset
|
938 |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
939 purple_debug_info("QQ", "Connect to %s:%d\n", server, port); |
23052 | 940 |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
941 if (qd->conn_data != NULL) { |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
942 purple_proxy_connect_cancel(qd->conn_data); |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
943 qd->conn_data = NULL; |
23052 | 944 } |
945 | |
23755
23cec4360d4a
applied changes from 8cebefbc6cd5d84acb69c74e69e8821f11dd225d
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23754
diff
changeset
|
946 #ifdef purple_proxy_connect_udp |
23cec4360d4a
applied changes from 8cebefbc6cd5d84acb69c74e69e8821f11dd225d
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23754
diff
changeset
|
947 if (qd->use_tcp) { |
23cec4360d4a
applied changes from 8cebefbc6cd5d84acb69c74e69e8821f11dd225d
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23754
diff
changeset
|
948 qd->conn_data = purple_proxy_connect(gc, account, server, port, connect_cb, gc); |
23cec4360d4a
applied changes from 8cebefbc6cd5d84acb69c74e69e8821f11dd225d
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23754
diff
changeset
|
949 } else { |
23cec4360d4a
applied changes from 8cebefbc6cd5d84acb69c74e69e8821f11dd225d
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23754
diff
changeset
|
950 qd->conn_data = purple_proxy_connect_udp(gc, account, server, port, connect_cb, gc); |
23cec4360d4a
applied changes from 8cebefbc6cd5d84acb69c74e69e8821f11dd225d
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23754
diff
changeset
|
951 } |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
952 if ( qd->conn_data == NULL ) { |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
953 purple_debug_error("QQ", _("Couldn't create socket")); |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
954 return FALSE; |
23052 | 955 } |
23755
23cec4360d4a
applied changes from 8cebefbc6cd5d84acb69c74e69e8821f11dd225d
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23754
diff
changeset
|
956 #else |
23cec4360d4a
applied changes from 8cebefbc6cd5d84acb69c74e69e8821f11dd225d
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23754
diff
changeset
|
957 /* QQ connection via UDP/TCP. |
24026
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
958 * Now use Purple proxy function to provide TCP proxy support, |
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
959 * and qq_udp_proxy.c to add UDP proxy support (thanks henry) */ |
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
960 if(qd->use_tcp) { |
23755
23cec4360d4a
applied changes from 8cebefbc6cd5d84acb69c74e69e8821f11dd225d
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23754
diff
changeset
|
961 qd->conn_data = purple_proxy_connect(gc, account, server, port, connect_cb, gc); |
23cec4360d4a
applied changes from 8cebefbc6cd5d84acb69c74e69e8821f11dd225d
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23754
diff
changeset
|
962 if ( qd->conn_data == NULL ) { |
23cec4360d4a
applied changes from 8cebefbc6cd5d84acb69c74e69e8821f11dd225d
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23754
diff
changeset
|
963 purple_debug_error("QQ", "Unable to connect."); |
23cec4360d4a
applied changes from 8cebefbc6cd5d84acb69c74e69e8821f11dd225d
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23754
diff
changeset
|
964 return FALSE; |
24026
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
965 } |
23755
23cec4360d4a
applied changes from 8cebefbc6cd5d84acb69c74e69e8821f11dd225d
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23754
diff
changeset
|
966 return TRUE; |
23052 | 967 } |
24026
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
968 |
23755
23cec4360d4a
applied changes from 8cebefbc6cd5d84acb69c74e69e8821f11dd225d
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23754
diff
changeset
|
969 purple_debug_info("QQ", "UDP Connect to %s:%d\n", server, port); |
23cec4360d4a
applied changes from 8cebefbc6cd5d84acb69c74e69e8821f11dd225d
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23754
diff
changeset
|
970 qd->udp_query_data = purple_dnsquery_a(server, port, udp_host_resolved, gc); |
23cec4360d4a
applied changes from 8cebefbc6cd5d84acb69c74e69e8821f11dd225d
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23754
diff
changeset
|
971 if ( qd->udp_query_data == NULL ) { |
23cec4360d4a
applied changes from 8cebefbc6cd5d84acb69c74e69e8821f11dd225d
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23754
diff
changeset
|
972 purple_debug_error("QQ", "Could not resolve hostname"); |
23cec4360d4a
applied changes from 8cebefbc6cd5d84acb69c74e69e8821f11dd225d
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23754
diff
changeset
|
973 return FALSE; |
23052 | 974 } |
23755
23cec4360d4a
applied changes from 8cebefbc6cd5d84acb69c74e69e8821f11dd225d
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23754
diff
changeset
|
975 #endif |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
976 return TRUE; |
23052 | 977 } |
978 | |
979 /* clean up qq_data structure and all its components | |
980 * always used before a redirectly connection */ | |
981 void qq_disconnect(PurpleConnection *gc) | |
982 { | |
983 qq_data *qd; | |
984 | |
985 g_return_if_fail(gc != NULL && gc->proto_data != NULL); | |
986 qd = (qq_data *) gc->proto_data; | |
987 | |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
988 purple_debug_info("QQ", "Disconnecting ...\n"); |
23683
1c50f12b1c52
2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23606
diff
changeset
|
989 |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
990 if (qd->network_watcher > 0) { |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
991 purple_debug_info("QQ", "Remove network watcher\n"); |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
992 purple_timeout_remove(qd->network_watcher); |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
993 qd->network_watcher = 0; |
23683
1c50f12b1c52
2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23606
diff
changeset
|
994 } |
1c50f12b1c52
2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23606
diff
changeset
|
995 |
23052 | 996 /* finish all I/O */ |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
997 if (qd->fd >= 0 && qd->is_login) { |
24065
bdfcfd71449c
patch 20080922 from ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24048
diff
changeset
|
998 qq_request_logout(gc); |
23052 | 999 } |
1000 | |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1001 /* not connected */ |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1002 if (qd->conn_data != NULL) { |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1003 purple_debug_info("QQ", "Connect cancel\n"); |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1004 purple_proxy_connect_cancel(qd->conn_data); |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1005 qd->conn_data = NULL; |
23052 | 1006 } |
23755
23cec4360d4a
applied changes from 8cebefbc6cd5d84acb69c74e69e8821f11dd225d
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23754
diff
changeset
|
1007 #ifndef purple_proxy_connect_udp |
23cec4360d4a
applied changes from 8cebefbc6cd5d84acb69c74e69e8821f11dd225d
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23754
diff
changeset
|
1008 if (qd->udp_can_write_handler) { |
23cec4360d4a
applied changes from 8cebefbc6cd5d84acb69c74e69e8821f11dd225d
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23754
diff
changeset
|
1009 purple_input_remove(qd->udp_can_write_handler); |
23cec4360d4a
applied changes from 8cebefbc6cd5d84acb69c74e69e8821f11dd225d
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23754
diff
changeset
|
1010 qd->udp_can_write_handler = 0; |
24026
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
1011 } |
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
1012 if (qd->udp_query_data != NULL) { |
23755
23cec4360d4a
applied changes from 8cebefbc6cd5d84acb69c74e69e8821f11dd225d
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23754
diff
changeset
|
1013 purple_debug_info("QQ", "destroy udp_query_data\n"); |
24026
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
1014 purple_dnsquery_destroy(qd->udp_query_data); |
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
1015 qd->udp_query_data = NULL; |
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
1016 } |
23755
23cec4360d4a
applied changes from 8cebefbc6cd5d84acb69c74e69e8821f11dd225d
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23754
diff
changeset
|
1017 #endif |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1018 connection_free_all(qd); |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1019 qd->fd = -1; |
23052 | 1020 |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1021 qq_trans_remove_all(gc); |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1022 |
24066
dbc7a9742f8d
2008.09.26 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24065
diff
changeset
|
1023 memset(qd->ld.random_key, 0, sizeof(qd->ld.random_key)); |
dbc7a9742f8d
2008.09.26 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24065
diff
changeset
|
1024 memset(qd->ld.pwd_2nd_md5, 0, sizeof(qd->ld.pwd_2nd_md5)); |
dbc7a9742f8d
2008.09.26 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24065
diff
changeset
|
1025 memset(qd->ld.pwd_4th_md5, 0, sizeof(qd->ld.pwd_4th_md5)); |
dbc7a9742f8d
2008.09.26 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24065
diff
changeset
|
1026 memset(qd->ld.login_key, 0, sizeof(qd->ld.login_key)); |
23683
1c50f12b1c52
2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23606
diff
changeset
|
1027 memset(qd->session_key, 0, sizeof(qd->session_key)); |
1c50f12b1c52
2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23606
diff
changeset
|
1028 memset(qd->session_md5, 0, sizeof(qd->session_md5)); |
1c50f12b1c52
2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23606
diff
changeset
|
1029 |
24068
87e61a85f5dd
2008.09.28 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24066
diff
changeset
|
1030 qd->my_local_ip.s_addr = 0; |
87e61a85f5dd
2008.09.28 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24066
diff
changeset
|
1031 qd->my_local_port = 0; |
23683
1c50f12b1c52
2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23606
diff
changeset
|
1032 qd->my_ip.s_addr = 0; |
24068
87e61a85f5dd
2008.09.28 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24066
diff
changeset
|
1033 qd->my_port = 0; |
23052 | 1034 |
1035 qq_group_free_all(qd); | |
1036 qq_buddies_list_free(gc->account, qd); | |
1037 } | |
1038 | |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1039 static gint packet_encap(qq_data *qd, guint8 *buf, gint maxlen, guint16 cmd, guint16 seq, |
23052 | 1040 guint8 *data, gint data_len) |
1041 { | |
1042 gint bytes = 0; | |
1043 g_return_val_if_fail(qd != NULL && buf != NULL && maxlen > 0, -1); | |
23753
5f454b975a99
2008.08.10 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23683
diff
changeset
|
1044 g_return_val_if_fail(data != NULL && data_len > 0, -1); |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1045 |
23052 | 1046 /* QQ TCP packet has two bytes in the begining defines packet length |
1047 * so leave room here to store packet size */ | |
1048 if (qd->use_tcp) { | |
1049 bytes += qq_put16(buf + bytes, 0x0000); | |
1050 } | |
1051 /* now comes the normal QQ packet as UDP */ | |
1052 bytes += qq_put8(buf + bytes, QQ_PACKET_TAG); | |
24066
dbc7a9742f8d
2008.09.26 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24065
diff
changeset
|
1053 bytes += qq_put16(buf + bytes, qd->client_tag); |
23052 | 1054 bytes += qq_put16(buf + bytes, cmd); |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1055 |
23052 | 1056 bytes += qq_put16(buf + bytes, seq); |
1057 | |
1058 bytes += qq_put32(buf + bytes, qd->uid); | |
1059 bytes += qq_putdata(buf + bytes, data, data_len); | |
1060 bytes += qq_put8(buf + bytes, QQ_PACKET_TAIL); | |
1061 | |
23053
55f986ccbb6a
patch-05-reconnect-and-code-cleanup
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23052
diff
changeset
|
1062 /* set TCP packet length at begin of the packet */ |
23052 | 1063 if (qd->use_tcp) { |
1064 qq_put16(buf, bytes); | |
1065 } | |
1066 | |
1067 return bytes; | |
1068 } | |
1069 | |
23683
1c50f12b1c52
2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23606
diff
changeset
|
1070 /* data has been encrypted before */ |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1071 static gint packet_send_out(PurpleConnection *gc, guint16 cmd, guint16 seq, guint8 *data, gint data_len) |
23052 | 1072 { |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1073 qq_data *qd; |
23052 | 1074 guint8 *buf; |
1075 gint buf_len; | |
1076 gint bytes_sent; | |
1077 | |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1078 g_return_val_if_fail(gc != NULL && gc->proto_data != NULL, -1); |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1079 qd = (qq_data *)gc->proto_data; |
23053
55f986ccbb6a
patch-05-reconnect-and-code-cleanup
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23052
diff
changeset
|
1080 g_return_val_if_fail(data != NULL && data_len > 0, -1); |
55f986ccbb6a
patch-05-reconnect-and-code-cleanup
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23052
diff
changeset
|
1081 |
23052 | 1082 buf = g_newa(guint8, MAX_PACKET_SIZE); |
1083 memset(buf, 0, MAX_PACKET_SIZE); | |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1084 buf_len = packet_encap(qd, buf, MAX_PACKET_SIZE, cmd, seq, data, data_len); |
23052 | 1085 if (buf_len <= 0) { |
1086 return -1; | |
1087 } | |
1088 | |
23757
69c218fd5d54
applied changes from 5688199e261449d33b5803dafff50d860896ebcb
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23756
diff
changeset
|
1089 qd->net_stat.sent++; |
23052 | 1090 if (qd->use_tcp) { |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1091 bytes_sent = tcp_send_out(gc, buf, buf_len); |
23052 | 1092 } else { |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1093 bytes_sent = udp_send_out(gc, buf, buf_len); |
23052 | 1094 } |
1095 | |
1096 return bytes_sent; | |
1097 } | |
1098 | |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1099 gint qq_send_cmd_encrypted(PurpleConnection *gc, guint16 cmd, guint16 seq, |
24066
dbc7a9742f8d
2008.09.26 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24065
diff
changeset
|
1100 guint8 *encrypted, gint encrypted_len, gboolean is_save2trans) |
23052 | 1101 { |
23756
1a0caf9983fa
applied changes from 92d52eef2994d2697999177804e3665989cfa352
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23755
diff
changeset
|
1102 gint sent_len; |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1103 |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1104 #if 1 |
23756
1a0caf9983fa
applied changes from 92d52eef2994d2697999177804e3665989cfa352
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23755
diff
changeset
|
1105 /* qq_show_packet("qq_send_cmd_encrypted", data, data_len); */ |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1106 purple_debug_info("QQ", "<== [%05d], %s(0x%04X), datalen %d\n", |
23756
1a0caf9983fa
applied changes from 92d52eef2994d2697999177804e3665989cfa352
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23755
diff
changeset
|
1107 seq, qq_get_cmd_desc(cmd), cmd, encrypted_len); |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1108 #endif |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1109 |
24066
dbc7a9742f8d
2008.09.26 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24065
diff
changeset
|
1110 sent_len = packet_send_out(gc, cmd, seq, encrypted, encrypted_len); |
23756
1a0caf9983fa
applied changes from 92d52eef2994d2697999177804e3665989cfa352
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23755
diff
changeset
|
1111 if (is_save2trans) { |
24066
dbc7a9742f8d
2008.09.26 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24065
diff
changeset
|
1112 qq_trans_add_client_cmd(gc, cmd, seq, encrypted, encrypted_len, 0, 0); |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1113 } |
23756
1a0caf9983fa
applied changes from 92d52eef2994d2697999177804e3665989cfa352
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23755
diff
changeset
|
1114 return sent_len; |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1115 } |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1116 |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1117 /* Encrypt data with session_key, and send packet out */ |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1118 static gint send_cmd_detail(PurpleConnection *gc, guint16 cmd, guint16 seq, |
23756
1a0caf9983fa
applied changes from 92d52eef2994d2697999177804e3665989cfa352
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23755
diff
changeset
|
1119 guint8 *data, gint data_len, gboolean is_save2trans, gint update_class, guint32 ship32) |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1120 { |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1121 qq_data *qd; |
24066
dbc7a9742f8d
2008.09.26 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24065
diff
changeset
|
1122 guint8 *encrypted; |
23052 | 1123 gint encrypted_len; |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1124 gint bytes_sent; |
23052 | 1125 |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1126 g_return_val_if_fail(gc != NULL && gc->proto_data != NULL, -1); |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1127 qd = (qq_data *)gc->proto_data; |
23053
55f986ccbb6a
patch-05-reconnect-and-code-cleanup
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23052
diff
changeset
|
1128 g_return_val_if_fail(data != NULL && data_len > 0, -1); |
23052 | 1129 |
23753
5f454b975a99
2008.08.10 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23683
diff
changeset
|
1130 /* at most 16 bytes more */ |
24066
dbc7a9742f8d
2008.09.26 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24065
diff
changeset
|
1131 encrypted = g_newa(guint8, data_len + 16); |
dbc7a9742f8d
2008.09.26 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24065
diff
changeset
|
1132 encrypted_len = qq_encrypt(encrypted, data, data_len, qd->session_key); |
23753
5f454b975a99
2008.08.10 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23683
diff
changeset
|
1133 if (encrypted_len < 16) { |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1134 purple_debug_error("QQ_ENCRYPT", "Error len %d: [%05d] 0x%04X %s\n", |
23753
5f454b975a99
2008.08.10 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23683
diff
changeset
|
1135 encrypted_len, seq, cmd, qq_get_cmd_desc(cmd)); |
5f454b975a99
2008.08.10 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23683
diff
changeset
|
1136 return -1; |
5f454b975a99
2008.08.10 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23683
diff
changeset
|
1137 } |
23052 | 1138 |
24066
dbc7a9742f8d
2008.09.26 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24065
diff
changeset
|
1139 bytes_sent = packet_send_out(gc, cmd, seq, encrypted, encrypted_len); |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1140 |
23756
1a0caf9983fa
applied changes from 92d52eef2994d2697999177804e3665989cfa352
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23755
diff
changeset
|
1141 if (is_save2trans) { |
24066
dbc7a9742f8d
2008.09.26 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24065
diff
changeset
|
1142 qq_trans_add_client_cmd(gc, cmd, seq, encrypted, encrypted_len, |
23756
1a0caf9983fa
applied changes from 92d52eef2994d2697999177804e3665989cfa352
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23755
diff
changeset
|
1143 update_class, ship32); |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1144 } |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1145 return bytes_sent; |
23052 | 1146 } |
23053
55f986ccbb6a
patch-05-reconnect-and-code-cleanup
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23052
diff
changeset
|
1147 |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1148 gint qq_send_cmd_mess(PurpleConnection *gc, guint16 cmd, guint8 *data, gint data_len, |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1149 gint update_class, guint32 ship32) |
23053
55f986ccbb6a
patch-05-reconnect-and-code-cleanup
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23052
diff
changeset
|
1150 { |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1151 qq_data *qd; |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1152 guint16 seq; |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1153 |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1154 g_return_val_if_fail(gc != NULL && gc->proto_data != NULL, -1); |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1155 qd = (qq_data *) gc->proto_data; |
23053
55f986ccbb6a
patch-05-reconnect-and-code-cleanup
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23052
diff
changeset
|
1156 g_return_val_if_fail(data != NULL && data_len > 0, -1); |
55f986ccbb6a
patch-05-reconnect-and-code-cleanup
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23052
diff
changeset
|
1157 |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1158 seq = ++qd->send_seq; |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1159 #if 1 |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1160 purple_debug_info("QQ", "<== [%05d], %s(0x%04X), datalen %d\n", |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1161 seq, qq_get_cmd_desc(cmd), cmd, data_len); |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1162 #endif |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1163 return send_cmd_detail(gc, cmd, seq, data, data_len, TRUE, update_class, ship32); |
23053
55f986ccbb6a
patch-05-reconnect-and-code-cleanup
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23052
diff
changeset
|
1164 } |
23753
5f454b975a99
2008.08.10 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23683
diff
changeset
|
1165 |
23756
1a0caf9983fa
applied changes from 92d52eef2994d2697999177804e3665989cfa352
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23755
diff
changeset
|
1166 /* set seq and is_save2trans, then call send_cmd_detail */ |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1167 gint qq_send_cmd(PurpleConnection *gc, guint16 cmd, guint8 *data, gint data_len) |
24026
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
1168 { |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1169 qq_data *qd; |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1170 guint16 seq; |
23756
1a0caf9983fa
applied changes from 92d52eef2994d2697999177804e3665989cfa352
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23755
diff
changeset
|
1171 gboolean is_save2trans; |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1172 |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1173 g_return_val_if_fail(gc != NULL && gc->proto_data != NULL, -1); |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1174 qd = (qq_data *) gc->proto_data; |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1175 g_return_val_if_fail(data != NULL && data_len > 0, -1); |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1176 |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1177 if (cmd != QQ_CMD_LOGOUT) { |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1178 seq = ++qd->send_seq; |
23756
1a0caf9983fa
applied changes from 92d52eef2994d2697999177804e3665989cfa352
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23755
diff
changeset
|
1179 is_save2trans = TRUE; |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1180 } else { |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1181 seq = 0xFFFF; |
23756
1a0caf9983fa
applied changes from 92d52eef2994d2697999177804e3665989cfa352
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23755
diff
changeset
|
1182 is_save2trans = FALSE; |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1183 } |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1184 #if 1 |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1185 purple_debug_info("QQ", "<== [%05d], %s(0x%04X), datalen %d\n", |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1186 seq, qq_get_cmd_desc(cmd), cmd, data_len); |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1187 #endif |
23756
1a0caf9983fa
applied changes from 92d52eef2994d2697999177804e3665989cfa352
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23755
diff
changeset
|
1188 return send_cmd_detail(gc, cmd, seq, data, data_len, is_save2trans, 0, 0); |
24026
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
1189 } |
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
1190 |
23756
1a0caf9983fa
applied changes from 92d52eef2994d2697999177804e3665989cfa352
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23755
diff
changeset
|
1191 /* set seq and is_save2trans, then call send_cmd_detail */ |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1192 gint qq_send_server_reply(PurpleConnection *gc, guint16 cmd, guint16 seq, guint8 *data, gint data_len) |
24026
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
1193 { |
23756
1a0caf9983fa
applied changes from 92d52eef2994d2697999177804e3665989cfa352
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23755
diff
changeset
|
1194 qq_data *qd; |
24066
dbc7a9742f8d
2008.09.26 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24065
diff
changeset
|
1195 guint8 *encrypted; |
23756
1a0caf9983fa
applied changes from 92d52eef2994d2697999177804e3665989cfa352
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23755
diff
changeset
|
1196 gint encrypted_len; |
1a0caf9983fa
applied changes from 92d52eef2994d2697999177804e3665989cfa352
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23755
diff
changeset
|
1197 gint bytes_sent; |
1a0caf9983fa
applied changes from 92d52eef2994d2697999177804e3665989cfa352
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23755
diff
changeset
|
1198 |
1a0caf9983fa
applied changes from 92d52eef2994d2697999177804e3665989cfa352
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23755
diff
changeset
|
1199 g_return_val_if_fail(gc != NULL && gc->proto_data != NULL, -1); |
1a0caf9983fa
applied changes from 92d52eef2994d2697999177804e3665989cfa352
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23755
diff
changeset
|
1200 qd = (qq_data *)gc->proto_data; |
1a0caf9983fa
applied changes from 92d52eef2994d2697999177804e3665989cfa352
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23755
diff
changeset
|
1201 g_return_val_if_fail(data != NULL && data_len > 0, -1); |
1a0caf9983fa
applied changes from 92d52eef2994d2697999177804e3665989cfa352
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23755
diff
changeset
|
1202 |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1203 #if 1 |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1204 purple_debug_info("QQ", "<== [SRV-%05d], %s(0x%04X), datalen %d\n", |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1205 seq, qq_get_cmd_desc(cmd), cmd, data_len); |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1206 #endif |
23756
1a0caf9983fa
applied changes from 92d52eef2994d2697999177804e3665989cfa352
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23755
diff
changeset
|
1207 /* at most 16 bytes more */ |
24066
dbc7a9742f8d
2008.09.26 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24065
diff
changeset
|
1208 encrypted = g_newa(guint8, data_len + 16); |
dbc7a9742f8d
2008.09.26 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24065
diff
changeset
|
1209 encrypted_len = qq_encrypt(encrypted, data, data_len, qd->session_key); |
23756
1a0caf9983fa
applied changes from 92d52eef2994d2697999177804e3665989cfa352
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23755
diff
changeset
|
1210 if (encrypted_len < 16) { |
1a0caf9983fa
applied changes from 92d52eef2994d2697999177804e3665989cfa352
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23755
diff
changeset
|
1211 purple_debug_error("QQ_ENCRYPT", "Error len %d: [%05d] 0x%04X %s\n", |
1a0caf9983fa
applied changes from 92d52eef2994d2697999177804e3665989cfa352
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23755
diff
changeset
|
1212 encrypted_len, seq, cmd, qq_get_cmd_desc(cmd)); |
1a0caf9983fa
applied changes from 92d52eef2994d2697999177804e3665989cfa352
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23755
diff
changeset
|
1213 return -1; |
1a0caf9983fa
applied changes from 92d52eef2994d2697999177804e3665989cfa352
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23755
diff
changeset
|
1214 } |
1a0caf9983fa
applied changes from 92d52eef2994d2697999177804e3665989cfa352
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23755
diff
changeset
|
1215 |
24066
dbc7a9742f8d
2008.09.26 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24065
diff
changeset
|
1216 bytes_sent = packet_send_out(gc, cmd, seq, encrypted, encrypted_len); |
dbc7a9742f8d
2008.09.26 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24065
diff
changeset
|
1217 qq_trans_add_server_reply(gc, cmd, seq, encrypted, encrypted_len); |
23756
1a0caf9983fa
applied changes from 92d52eef2994d2697999177804e3665989cfa352
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23755
diff
changeset
|
1218 |
1a0caf9983fa
applied changes from 92d52eef2994d2697999177804e3665989cfa352
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23755
diff
changeset
|
1219 return bytes_sent; |
24026
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
1220 } |
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
1221 |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1222 static gint send_room_cmd(PurpleConnection *gc, guint8 room_cmd, guint32 room_id, |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1223 guint8 *data, gint data_len, gint update_class, guint32 ship32) |
23753
5f454b975a99
2008.08.10 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23683
diff
changeset
|
1224 { |
24019
147ada94a1d8
2008.08.16 - ccpaging <ecc_hy(at)hotmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23774
diff
changeset
|
1225 qq_data *qd; |
23753
5f454b975a99
2008.08.10 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23683
diff
changeset
|
1226 guint8 *buf; |
5f454b975a99
2008.08.10 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23683
diff
changeset
|
1227 gint buf_len; |
24066
dbc7a9742f8d
2008.09.26 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24065
diff
changeset
|
1228 guint8 *encrypted; |
23753
5f454b975a99
2008.08.10 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23683
diff
changeset
|
1229 gint encrypted_len; |
5f454b975a99
2008.08.10 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23683
diff
changeset
|
1230 gint bytes_sent; |
5f454b975a99
2008.08.10 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23683
diff
changeset
|
1231 guint16 seq; |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1232 |
23753
5f454b975a99
2008.08.10 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23683
diff
changeset
|
1233 g_return_val_if_fail(gc != NULL && gc->proto_data != NULL, -1); |
5f454b975a99
2008.08.10 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23683
diff
changeset
|
1234 qd = (qq_data *) gc->proto_data; |
5f454b975a99
2008.08.10 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23683
diff
changeset
|
1235 |
5f454b975a99
2008.08.10 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23683
diff
changeset
|
1236 buf = g_newa(guint8, MAX_PACKET_SIZE); |
5f454b975a99
2008.08.10 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23683
diff
changeset
|
1237 memset(buf, 0, MAX_PACKET_SIZE); |
5f454b975a99
2008.08.10 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23683
diff
changeset
|
1238 |
5f454b975a99
2008.08.10 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23683
diff
changeset
|
1239 /* encap room_cmd and room id to buf*/ |
5f454b975a99
2008.08.10 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23683
diff
changeset
|
1240 buf_len = 0; |
5f454b975a99
2008.08.10 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23683
diff
changeset
|
1241 buf_len += qq_put8(buf + buf_len, room_cmd); |
5f454b975a99
2008.08.10 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23683
diff
changeset
|
1242 if (room_id != 0) { |
5f454b975a99
2008.08.10 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23683
diff
changeset
|
1243 /* id 0 is for QQ Demo Group, now there are not existed*/ |
5f454b975a99
2008.08.10 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23683
diff
changeset
|
1244 buf_len += qq_put32(buf + buf_len, room_id); |
5f454b975a99
2008.08.10 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23683
diff
changeset
|
1245 } |
5f454b975a99
2008.08.10 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23683
diff
changeset
|
1246 if (data != NULL && data_len > 0) { |
5f454b975a99
2008.08.10 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23683
diff
changeset
|
1247 buf_len += qq_putdata(buf + buf_len, data, data_len); |
5f454b975a99
2008.08.10 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23683
diff
changeset
|
1248 } |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1249 |
23753
5f454b975a99
2008.08.10 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23683
diff
changeset
|
1250 qd->send_seq++; |
5f454b975a99
2008.08.10 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23683
diff
changeset
|
1251 seq = qd->send_seq; |
5f454b975a99
2008.08.10 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23683
diff
changeset
|
1252 |
24066
dbc7a9742f8d
2008.09.26 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24065
diff
changeset
|
1253 /* Encrypt to encrypted with session_key */ |
23753
5f454b975a99
2008.08.10 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23683
diff
changeset
|
1254 /* at most 16 bytes more */ |
24066
dbc7a9742f8d
2008.09.26 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24065
diff
changeset
|
1255 encrypted = g_newa(guint8, buf_len + 16); |
dbc7a9742f8d
2008.09.26 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24065
diff
changeset
|
1256 encrypted_len = qq_encrypt(encrypted, buf, buf_len, qd->session_key); |
23753
5f454b975a99
2008.08.10 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23683
diff
changeset
|
1257 if (encrypted_len < 16) { |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1258 purple_debug_error("QQ_ENCRYPT", "Error len %d: [%05d] %s (0x%02X)\n", |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1259 encrypted_len, seq, qq_get_room_cmd_desc(room_cmd), room_cmd); |
23753
5f454b975a99
2008.08.10 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23683
diff
changeset
|
1260 return -1; |
5f454b975a99
2008.08.10 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23683
diff
changeset
|
1261 } |
5f454b975a99
2008.08.10 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23683
diff
changeset
|
1262 |
24066
dbc7a9742f8d
2008.09.26 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24065
diff
changeset
|
1263 bytes_sent = packet_send_out(gc, QQ_CMD_ROOM, seq, encrypted, encrypted_len); |
23753
5f454b975a99
2008.08.10 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23683
diff
changeset
|
1264 #if 1 |
23756
1a0caf9983fa
applied changes from 92d52eef2994d2697999177804e3665989cfa352
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23755
diff
changeset
|
1265 /* qq_show_packet("send_room_cmd", buf, buf_len); */ |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1266 purple_debug_info("QQ", |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1267 "<== [%05d], %s (0x%02X) to room %d, datalen %d\n", |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1268 seq, qq_get_room_cmd_desc(room_cmd), room_cmd, room_id, buf_len); |
23753
5f454b975a99
2008.08.10 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23683
diff
changeset
|
1269 #endif |
24026
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
1270 |
24066
dbc7a9742f8d
2008.09.26 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24065
diff
changeset
|
1271 qq_trans_add_room_cmd(gc, seq, room_cmd, room_id, encrypted, encrypted_len, |
23756
1a0caf9983fa
applied changes from 92d52eef2994d2697999177804e3665989cfa352
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23755
diff
changeset
|
1272 update_class, ship32); |
23753
5f454b975a99
2008.08.10 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23683
diff
changeset
|
1273 return bytes_sent; |
5f454b975a99
2008.08.10 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23683
diff
changeset
|
1274 } |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1275 |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1276 gint qq_send_room_cmd_mess(PurpleConnection *gc, guint8 room_cmd, guint32 room_id, |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1277 guint8 *data, gint data_len, gint update_class, guint32 ship32) |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1278 { |
24066
dbc7a9742f8d
2008.09.26 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24065
diff
changeset
|
1279 g_return_val_if_fail(room_id > 0, -1); |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1280 return send_room_cmd(gc, room_cmd, room_id, data, data_len, update_class, ship32); |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1281 } |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1282 |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1283 gint qq_send_room_cmd(PurpleConnection *gc, guint8 room_cmd, guint32 room_id, |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1284 guint8 *data, gint data_len) |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1285 { |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1286 return send_room_cmd(gc, room_cmd, room_id, data, data_len, 0, 0); |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1287 } |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1288 |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1289 gint qq_send_room_cmd_noid(PurpleConnection *gc, guint8 room_cmd, |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1290 guint8 *data, gint data_len) |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1291 { |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1292 return send_room_cmd(gc, room_cmd, 0, data, data_len, 0, 0); |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1293 } |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1294 |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1295 gint qq_send_room_cmd_only(PurpleConnection *gc, guint8 room_cmd, guint32 room_id) |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1296 { |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1297 g_return_val_if_fail(room_cmd > 0 && room_id > 0, -1); |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1298 return send_room_cmd(gc, room_cmd, room_id, NULL, 0, 0, 0); |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1299 } |