Mercurial > pidgin.yaz
annotate libpurple/protocols/qq/qq_network.c @ 24276:06a4e268b9f5
merge of '843d513c3da12026fc35af070a23a3d11844824c'
and 'b630f3305c53ab0eb32b948911940959cc873699'
author | John Bailey <rekkanoryo@rekkanoryo.org> |
---|---|
date | Thu, 30 Oct 2008 03:58:19 +0000 |
parents | 1ee91ff0d5fe |
children | 42261d87854a c52fe0a3b11d |
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" |
24088
1ee91ff0d5fe
2008.10.09 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24085
diff
changeset
|
31 #include "group_internal.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: |
24069
dc112387190f
2008.09.29 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24068
diff
changeset
|
312 case QQ_CMD_TOKEN_EX: |
dc112387190f
2008.09.29 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24068
diff
changeset
|
313 case QQ_CMD_CHECK_PWD: |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
314 case QQ_CMD_LOGIN: |
24065
bdfcfd71449c
patch 20080922 from ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24048
diff
changeset
|
315 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
|
316 if (ret != QQ_LOGIN_REPLY_OK) { |
bdfcfd71449c
patch 20080922 from ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24048
diff
changeset
|
317 if (ret == QQ_LOGIN_REPLY_REDIRECT) { |
bdfcfd71449c
patch 20080922 from ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24048
diff
changeset
|
318 redirect_server(gc); |
23754
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 return FALSE; /* do nothing after this function and return now */ |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
321 } |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
322 break; |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
323 case QQ_CMD_ROOM: |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
324 room_cmd = qq_trans_get_room_cmd(trans); |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
325 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
|
326 #if 1 |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
327 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
|
328 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
|
329 #endif |
24065
bdfcfd71449c
patch 20080922 from ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24048
diff
changeset
|
330 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
|
331 break; |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
332 default: |
24065
bdfcfd71449c
patch 20080922 from ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24048
diff
changeset
|
333 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
|
334 break; |
23052 | 335 } |
336 | |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
337 return TRUE; |
23052 | 338 } |
339 | |
340 static void tcp_pending(gpointer data, gint source, PurpleInputCondition cond) | |
341 { | |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
342 PurpleConnection *gc = (PurpleConnection *) data; |
23052 | 343 qq_data *qd; |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
344 qq_connection *conn; |
23053
55f986ccbb6a
patch-05-reconnect-and-code-cleanup
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23052
diff
changeset
|
345 guint8 buf[1024]; /* set to 16 when test tcp_rxqueue */ |
23052 | 346 gint buf_len; |
347 gint bytes; | |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
348 |
23052 | 349 guint8 *pkt; |
350 guint16 pkt_len; | |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
351 |
23052 | 352 gchar *error_msg; |
353 guint8 *jump; | |
354 gint jump_len; | |
355 | |
356 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
|
357 qd = (qq_data *) gc->proto_data; |
23052 | 358 |
359 if(cond != PURPLE_INPUT_READ) { | |
24066
dbc7a9742f8d
2008.09.26 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24065
diff
changeset
|
360 purple_connection_error_reason(gc, |
dbc7a9742f8d
2008.09.26 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24065
diff
changeset
|
361 PURPLE_CONNECTION_ERROR_NETWORK_ERROR, |
23052 | 362 _("Socket error")); |
363 return; | |
364 } | |
365 | |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
366 conn = connection_find(qd, source); |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
367 g_return_if_fail(conn != NULL); |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
368 |
23052 | 369 /* test code, not using tcp_rxqueue |
370 memset(pkt,0, sizeof(pkt)); | |
371 buf_len = read(qd->fd, pkt, sizeof(pkt)); | |
372 if (buf_len > 2) { | |
373 packet_process(gc, pkt + 2, buf_len - 2); | |
374 } | |
375 return; | |
376 */ | |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
377 |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
378 buf_len = read(source, buf, sizeof(buf)); |
23052 | 379 if (buf_len < 0) { |
380 if (errno == EAGAIN) | |
381 /* No worries */ | |
382 return; | |
383 | |
384 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
|
385 purple_connection_error_reason(gc, |
dbc7a9742f8d
2008.09.26 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24065
diff
changeset
|
386 PURPLE_CONNECTION_ERROR_NETWORK_ERROR, |
dbc7a9742f8d
2008.09.26 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24065
diff
changeset
|
387 error_msg); |
23052 | 388 g_free(error_msg); |
389 return; | |
390 } else if (buf_len == 0) { | |
391 purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR, | |
392 _("Server closed the connection.")); | |
393 return; | |
394 } | |
395 | |
23606
bdb38a8bf721
20080717-05-1-fix-keep-alive ccpaging <ecc_hy(at)hotmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23054
diff
changeset
|
396 /* 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
|
397 * 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
|
398 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
|
399 */ |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
400 /* 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
|
401 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
|
402 memcpy(conn->tcp_rxqueue + conn->tcp_rxlen, buf, buf_len); |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
403 conn->tcp_rxlen += buf_len; |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
404 |
23052 | 405 pkt = g_newa(guint8, MAX_PACKET_SIZE); |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
406 while (PURPLE_CONNECTION_IS_VALID(gc)) { |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
407 if (qd->openconns == NULL) { |
23052 | 408 break; |
409 } | |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
410 if (conn->tcp_rxqueue == NULL) { |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
411 conn->tcp_rxlen = 0; |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
412 break; |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
413 } |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
414 if (conn->tcp_rxlen < QQ_TCP_HEADER_LENGTH) { |
23052 | 415 break; |
416 } | |
417 | |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
418 bytes = 0; |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
419 bytes += qq_get16(&pkt_len, conn->tcp_rxqueue + bytes); |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
420 if (conn->tcp_rxlen < pkt_len) { |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
421 break; |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
422 } |
24026
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
423 |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
424 /* 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
|
425 if ( pkt_len < QQ_TCP_HEADER_LENGTH |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
426 || *(conn->tcp_rxqueue + bytes) != QQ_PACKET_TAG |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
427 || *(conn->tcp_rxqueue + pkt_len - 1) != QQ_PACKET_TAIL) { |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
428 /* 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
|
429 purple_debug_warning("TCP_PENDING", "Packet error, no header or tail tag\n"); |
23052 | 430 |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
431 jump = memchr(conn->tcp_rxqueue + 1, QQ_PACKET_TAIL, conn->tcp_rxlen - 1); |
23052 | 432 if ( !jump ) { |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
433 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
|
434 g_free(conn->tcp_rxqueue); |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
435 conn->tcp_rxqueue = NULL; |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
436 conn->tcp_rxlen = 0; |
23052 | 437 return; |
438 } | |
439 | |
23053
55f986ccbb6a
patch-05-reconnect-and-code-cleanup
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23052
diff
changeset
|
440 /* jump and over QQ_PACKET_TAIL */ |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
441 jump_len = (jump - conn->tcp_rxqueue) + 1; |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
442 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
|
443 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
|
444 conn->tcp_rxlen -= jump_len; |
23052 | 445 continue; |
446 } | |
447 | |
448 memset(pkt, 0, MAX_PACKET_SIZE); | |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
449 g_memmove(pkt, conn->tcp_rxqueue + bytes, pkt_len - bytes); |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
450 |
23053
55f986ccbb6a
patch-05-reconnect-and-code-cleanup
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23052
diff
changeset
|
451 /* jump to next packet */ |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
452 conn->tcp_rxlen -= pkt_len; |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
453 if (conn->tcp_rxlen) { |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
454 /* 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
|
455 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
|
456 g_free(conn->tcp_rxqueue); |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
457 conn->tcp_rxqueue = jump; |
23052 | 458 } else { |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
459 /* purple_debug_info("TCP_PENDING", "free tcp_rxqueue\n"); */ |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
460 g_free(conn->tcp_rxqueue); |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
461 conn->tcp_rxqueue = NULL; |
23052 | 462 } |
463 | |
464 if (pkt == NULL) { | |
465 continue; | |
466 } | |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
467 /* packet_process may call disconnect and destory data like conn |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
468 * do not call packet_process before jump, |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
469 * break if packet_process return FALSE */ |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
470 if (packet_process(gc, pkt, pkt_len - bytes) == FALSE) { |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
471 purple_debug_info("TCP_PENDING", "Connection has been destory\n"); |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
472 break; |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
473 } |
23052 | 474 } |
475 } | |
476 | |
477 static void udp_pending(gpointer data, gint source, PurpleInputCondition cond) | |
478 { | |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
479 PurpleConnection *gc = (PurpleConnection *) data; |
23052 | 480 qq_data *qd; |
481 guint8 *buf; | |
482 gint buf_len; | |
483 | |
484 gc = (PurpleConnection *) data; | |
485 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
|
486 qd = (qq_data *) gc->proto_data; |
23052 | 487 |
488 if(cond != PURPLE_INPUT_READ) { | |
24066
dbc7a9742f8d
2008.09.26 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24065
diff
changeset
|
489 purple_connection_error_reason(gc, |
dbc7a9742f8d
2008.09.26 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24065
diff
changeset
|
490 PURPLE_CONNECTION_ERROR_NETWORK_ERROR, |
23052 | 491 _("Socket error")); |
492 return; | |
493 } | |
494 | |
495 buf = g_newa(guint8, MAX_PACKET_SIZE); | |
496 | |
497 /* here we have UDP proxy suppport */ | |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
498 buf_len = read(source, buf, MAX_PACKET_SIZE); |
23052 | 499 if (buf_len <= 0) { |
24066
dbc7a9742f8d
2008.09.26 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24065
diff
changeset
|
500 purple_connection_error_reason(gc, |
dbc7a9742f8d
2008.09.26 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24065
diff
changeset
|
501 PURPLE_CONNECTION_ERROR_NETWORK_ERROR, |
23052 | 502 _("Unable to read from socket")); |
503 return; | |
504 } | |
505 | |
23606
bdb38a8bf721
20080717-05-1-fix-keep-alive ccpaging <ecc_hy(at)hotmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23054
diff
changeset
|
506 /* 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
|
507 * 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
|
508 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
|
509 */ |
23052 | 510 |
511 if (buf_len < QQ_UDP_HEADER_LENGTH) { | |
512 if (buf[0] != QQ_PACKET_TAG || buf[buf_len - 1] != QQ_PACKET_TAIL) { | |
513 qq_hex_dump(PURPLE_DEBUG_ERROR, "UDP_PENDING", | |
514 buf, buf_len, | |
515 "Received packet is too short, or no header and tail tag"); | |
516 return; | |
517 } | |
518 } | |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
519 |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
520 /* packet_process may call disconnect and destory data like conn |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
521 * do not call packet_process before jump, |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
522 * break if packet_process return FALSE */ |
23052 | 523 packet_process(gc, buf, buf_len); |
524 } | |
525 | |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
526 static gint udp_send_out(PurpleConnection *gc, guint8 *data, gint data_len) |
23052 | 527 { |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
528 qq_data *qd; |
23052 | 529 gint ret; |
530 | |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
531 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
|
532 |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
533 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
|
534 qd = (qq_data *) gc->proto_data; |
23052 | 535 |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
536 #if 0 |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
537 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
|
538 #endif |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
539 |
23052 | 540 errno = 0; |
541 ret = send(qd->fd, data, data_len, 0); | |
542 if (ret < 0 && errno == EAGAIN) { | |
543 return ret; | |
544 } | |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
545 |
23052 | 546 if (ret < 0) { |
547 /* 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
|
548 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
|
549 purple_connection_error_reason(gc, |
dbc7a9742f8d
2008.09.26 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24065
diff
changeset
|
550 PURPLE_CONNECTION_ERROR_NETWORK_ERROR, |
dbc7a9742f8d
2008.09.26 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24065
diff
changeset
|
551 g_strerror(errno)); |
23052 | 552 } |
553 return ret; | |
554 } | |
555 | |
556 static void tcp_can_write(gpointer data, gint source, PurpleInputCondition cond) | |
557 { | |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
558 PurpleConnection *gc = (PurpleConnection *) data; |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
559 qq_data *qd; |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
560 qq_connection *conn; |
23052 | 561 int ret, writelen; |
562 | |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
563 g_return_if_fail(gc != NULL && gc->proto_data != NULL); |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
564 qd = (qq_data *) gc->proto_data; |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
565 |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
566 conn = connection_find(qd, source); |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
567 g_return_if_fail(conn != NULL); |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
568 |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
569 writelen = purple_circ_buffer_get_max_read(conn->tcp_txbuf); |
23052 | 570 if (writelen == 0) { |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
571 purple_input_remove(conn->can_write_handler); |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
572 conn->can_write_handler = 0; |
23052 | 573 return; |
574 } | |
575 | |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
576 ret = write(source, conn->tcp_txbuf->outptr, writelen); |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
577 purple_debug_info("TCP_CAN_WRITE", "total %d bytes is sent %d\n", writelen, ret); |
23052 | 578 |
579 if (ret < 0 && errno == EAGAIN) | |
580 return; | |
581 else if (ret < 0) { | |
582 /* 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
|
583 purple_connection_error_reason(gc, |
dbc7a9742f8d
2008.09.26 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24065
diff
changeset
|
584 PURPLE_CONNECTION_ERROR_NETWORK_ERROR, |
dbc7a9742f8d
2008.09.26 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24065
diff
changeset
|
585 _("Write Error")); |
23052 | 586 return; |
587 } | |
588 | |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
589 purple_circ_buffer_mark_read(conn->tcp_txbuf, ret); |
23052 | 590 } |
591 | |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
592 static gint tcp_send_out(PurpleConnection *gc, guint8 *data, gint data_len) |
23052 | 593 { |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
594 qq_data *qd; |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
595 qq_connection *conn; |
23052 | 596 gint ret; |
597 | |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
598 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
|
599 |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
600 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
|
601 qd = (qq_data *) gc->proto_data; |
23052 | 602 |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
603 conn = connection_find(qd, qd->fd); |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
604 g_return_val_if_fail(conn, -1); |
23052 | 605 |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
606 #if 0 |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
607 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
|
608 #endif |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
609 |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
610 if (conn->can_write_handler == 0) { |
23052 | 611 ret = write(qd->fd, data, data_len); |
612 } else { | |
613 ret = -1; | |
614 errno = EAGAIN; | |
615 } | |
616 | |
23683
1c50f12b1c52
2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23606
diff
changeset
|
617 /* |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
618 purple_debug_info("TCP_SEND_OUT", |
23052 | 619 "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
|
620 */ |
23052 | 621 if (ret < 0 && errno == EAGAIN) { |
23053
55f986ccbb6a
patch-05-reconnect-and-code-cleanup
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23052
diff
changeset
|
622 /* socket is busy, send later */ |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
623 purple_debug_info("TCP_SEND_OUT", "Socket is busy and send later\n"); |
23052 | 624 ret = 0; |
625 } else if (ret <= 0) { | |
23053
55f986ccbb6a
patch-05-reconnect-and-code-cleanup
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23052
diff
changeset
|
626 /* 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
|
627 purple_debug_error("TCP_SEND_OUT", |
23052 | 628 "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
|
629 purple_connection_error_reason(gc, |
dbc7a9742f8d
2008.09.26 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24065
diff
changeset
|
630 PURPLE_CONNECTION_ERROR_NETWORK_ERROR, |
dbc7a9742f8d
2008.09.26 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24065
diff
changeset
|
631 g_strerror(errno)); |
23052 | 632 return ret; |
633 } | |
634 | |
635 if (ret < data_len) { | |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
636 purple_debug_info("TCP_SEND_OUT", |
23052 | 637 "Add %d bytes to buffer\n", data_len - ret); |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
638 if (conn->can_write_handler == 0) { |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
639 conn->can_write_handler = purple_input_add(qd->fd, PURPLE_INPUT_WRITE, tcp_can_write, gc); |
23052 | 640 } |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
641 purple_circ_buffer_append(conn->tcp_txbuf, data + ret, data_len - ret); |
23052 | 642 } |
643 return ret; | |
644 } | |
645 | |
23683
1c50f12b1c52
2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23606
diff
changeset
|
646 static gboolean network_timeout(gpointer data) |
23052 | 647 { |
23683
1c50f12b1c52
2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23606
diff
changeset
|
648 PurpleConnection *gc = (PurpleConnection *) data; |
23052 | 649 qq_data *qd; |
23683
1c50f12b1c52
2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23606
diff
changeset
|
650 gboolean is_lost_conn; |
1c50f12b1c52
2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23606
diff
changeset
|
651 |
23052 | 652 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
|
653 qd = (qq_data *) gc->proto_data; |
23052 | 654 |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
655 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
|
656 if (is_lost_conn) { |
1c50f12b1c52
2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23606
diff
changeset
|
657 purple_connection_error_reason(gc, |
24066
dbc7a9742f8d
2008.09.26 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24065
diff
changeset
|
658 PURPLE_CONNECTION_ERROR_NETWORK_ERROR, |
dbc7a9742f8d
2008.09.26 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24065
diff
changeset
|
659 _("Connection lost")); |
23683
1c50f12b1c52
2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23606
diff
changeset
|
660 return TRUE; |
1c50f12b1c52
2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23606
diff
changeset
|
661 } |
23052 | 662 |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
663 if ( !qd->is_login ) { |
23683
1c50f12b1c52
2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23606
diff
changeset
|
664 return TRUE; |
1c50f12b1c52
2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23606
diff
changeset
|
665 } |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
666 |
23683
1c50f12b1c52
2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23606
diff
changeset
|
667 qd->itv_count.keep_alive--; |
1c50f12b1c52
2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23606
diff
changeset
|
668 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
|
669 qd->itv_count.keep_alive = qd->itv_config.keep_alive; |
24071
619ac2303c46
2009.10.02 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24069
diff
changeset
|
670 if (qd->client_version >= 2008) { |
619ac2303c46
2009.10.02 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24069
diff
changeset
|
671 qq_request_keep_alive_2008(gc); |
619ac2303c46
2009.10.02 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24069
diff
changeset
|
672 } else if (qd->client_version >= 2007) { |
619ac2303c46
2009.10.02 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24069
diff
changeset
|
673 qq_request_keep_alive_2007(gc); |
619ac2303c46
2009.10.02 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24069
diff
changeset
|
674 } else { |
619ac2303c46
2009.10.02 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24069
diff
changeset
|
675 qq_request_keep_alive(gc); |
619ac2303c46
2009.10.02 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24069
diff
changeset
|
676 } |
23683
1c50f12b1c52
2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23606
diff
changeset
|
677 return TRUE; |
1c50f12b1c52
2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23606
diff
changeset
|
678 } |
23052 | 679 |
23683
1c50f12b1c52
2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23606
diff
changeset
|
680 if (qd->itv_config.update <= 0) { |
1c50f12b1c52
2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23606
diff
changeset
|
681 return TRUE; |
1c50f12b1c52
2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23606
diff
changeset
|
682 } |
1c50f12b1c52
2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23606
diff
changeset
|
683 |
1c50f12b1c52
2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23606
diff
changeset
|
684 qd->itv_count.update--; |
1c50f12b1c52
2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23606
diff
changeset
|
685 if (qd->itv_count.update <= 0) { |
1c50f12b1c52
2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23606
diff
changeset
|
686 qd->itv_count.update = qd->itv_config.update; |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
687 qq_update_online(gc, 0); |
23683
1c50f12b1c52
2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23606
diff
changeset
|
688 return TRUE; |
23052 | 689 } |
690 | |
691 return TRUE; /* if return FALSE, timeout callback stops */ | |
692 } | |
693 | |
24065
bdfcfd71449c
patch 20080922 from ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24048
diff
changeset
|
694 static void set_all_keys(PurpleConnection *gc) |
23052 | 695 { |
696 qq_data *qd; | |
697 const gchar *passwd; | |
24066
dbc7a9742f8d
2008.09.26 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24065
diff
changeset
|
698 guint8 *dest; |
dbc7a9742f8d
2008.09.26 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24065
diff
changeset
|
699 int dest_len = QQ_KEY_LENGTH; |
24071
619ac2303c46
2009.10.02 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24069
diff
changeset
|
700 #ifndef DEBUG |
619ac2303c46
2009.10.02 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24069
diff
changeset
|
701 int bytes; |
619ac2303c46
2009.10.02 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24069
diff
changeset
|
702 #endif |
23053
55f986ccbb6a
patch-05-reconnect-and-code-cleanup
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23052
diff
changeset
|
703 /* _qq_show_socket("Got login socket", source); */ |
23052 | 704 |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
705 g_return_if_fail(gc != NULL && gc->proto_data != NULL); |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
706 qd = (qq_data *) gc->proto_data; |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
707 |
23052 | 708 /* QQ use random seq, to minimize duplicated packets */ |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
709 srand(time(NULL)); |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
710 qd->send_seq = rand() & 0xffff; |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
711 |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
712 qd->is_login = FALSE; |
23052 | 713 qd->uid = strtol(purple_account_get_username(purple_connection_get_account(gc)), NULL, 10); |
714 | |
24065
bdfcfd71449c
patch 20080922 from ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24048
diff
changeset
|
715 #ifdef DEBUG |
24066
dbc7a9742f8d
2008.09.26 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24065
diff
changeset
|
716 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
|
717 #else |
24066
dbc7a9742f8d
2008.09.26 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24065
diff
changeset
|
718 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
|
719 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
|
720 } |
bdfcfd71449c
patch 20080922 from ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24048
diff
changeset
|
721 #endif |
bdfcfd71449c
patch 20080922 from ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24048
diff
changeset
|
722 |
23052 | 723 /* now generate md5 processed passwd */ |
724 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
|
725 |
1c50f12b1c52
2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23606
diff
changeset
|
726 /* use twice-md5 of user password as session key since QQ 2003iii */ |
24069
dc112387190f
2008.09.29 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24068
diff
changeset
|
727 dest = qd->ld.pwd_md5; |
24066
dbc7a9742f8d
2008.09.26 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24065
diff
changeset
|
728 qq_get_md5(dest, dest_len, (guint8 *)passwd, strlen(passwd)); |
23683
1c50f12b1c52
2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23606
diff
changeset
|
729 |
24069
dc112387190f
2008.09.29 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24068
diff
changeset
|
730 dest = qd->ld.pwd_twice_md5; |
dc112387190f
2008.09.29 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24068
diff
changeset
|
731 qq_get_md5(dest, dest_len, qd->ld.pwd_md5, dest_len); |
23052 | 732 } |
733 | |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
734 /* the callback function after socket is built |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
735 * we setup the qq protocol related configuration here */ |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
736 static void connect_cb(gpointer data, gint source, const gchar *error_message) |
23052 | 737 { |
738 PurpleConnection *gc; | |
739 qq_data *qd; | |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
740 PurpleAccount *account ; |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
741 qq_connection *conn; |
23052 | 742 |
743 gc = (PurpleConnection *) data; | |
744 g_return_if_fail(gc != NULL && gc->proto_data != NULL); | |
745 | |
746 qd = (qq_data *) gc->proto_data; | |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
747 account = purple_connection_get_account(gc); |
23052 | 748 |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
749 /* conn_data will be destoryed */ |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
750 qd->conn_data = NULL; |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
751 |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
752 if (!PURPLE_CONNECTION_IS_VALID(gc)) { |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
753 purple_debug_info("QQ_CONN", "Invalid connection\n"); |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
754 close(source); |
23052 | 755 return; |
756 } | |
757 | |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
758 if (source < 0) { /* socket returns -1 */ |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
759 purple_debug_info("QQ_CONN", |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
760 "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
|
761 error_message); |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
762 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
|
763 qd->connect_watcher = purple_timeout_add_seconds(QQ_CONNECT_INTERVAL, qq_connect_later, gc); |
23052 | 764 return; |
765 } | |
766 | |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
767 /* _qq_show_socket("Got login socket", source); */ |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
768 qd->fd = source; |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
769 conn = connection_create(qd, source); |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
770 if (qd->use_tcp) { |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
771 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
|
772 } else { |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
773 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
|
774 } |
23052 | 775 |
24065
bdfcfd71449c
patch 20080922 from ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24048
diff
changeset
|
776 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
|
777 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
|
778 |
bdfcfd71449c
patch 20080922 from ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24048
diff
changeset
|
779 set_all_keys( gc ); |
bdfcfd71449c
patch 20080922 from ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24048
diff
changeset
|
780 |
24071
619ac2303c46
2009.10.02 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24069
diff
changeset
|
781 if (qd->client_version >= 2007) { |
24065
bdfcfd71449c
patch 20080922 from ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24048
diff
changeset
|
782 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
|
783 qq_request_get_server(gc); |
bdfcfd71449c
patch 20080922 from ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24048
diff
changeset
|
784 return; |
bdfcfd71449c
patch 20080922 from ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24048
diff
changeset
|
785 } |
bdfcfd71449c
patch 20080922 from ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24048
diff
changeset
|
786 |
bdfcfd71449c
patch 20080922 from ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24048
diff
changeset
|
787 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
|
788 qq_request_token(gc); |
23052 | 789 } |
790 | |
23755
23cec4360d4a
applied changes from 8cebefbc6cd5d84acb69c74e69e8821f11dd225d
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23754
diff
changeset
|
791 #ifndef purple_proxy_connect_udp |
24026
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
792 static void udp_can_write(gpointer data, gint source, PurpleInputCondition cond) |
23052 | 793 { |
794 PurpleConnection *gc; | |
795 qq_data *qd; | |
24026
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
796 socklen_t len; |
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
797 int error=0, ret; |
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
798 |
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
799 gc = (PurpleConnection *) data; |
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
800 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
|
801 |
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
802 qd = (qq_data *) gc->proto_data; |
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
803 |
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
804 |
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
805 purple_debug_info("proxy", "Connected.\n"); |
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 /* |
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
808 * 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
|
809 * 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
|
810 * 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
|
811 * 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
|
812 * and anything else is a real error. |
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
813 * |
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
814 * (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
|
815 * 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
|
816 * able to do something.) |
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
817 */ |
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
818 len = sizeof(error); |
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
819 ret = getsockopt(source, SOL_SOCKET, SO_ERROR, &error, &len); |
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
820 if (ret == 0 && error == EINPROGRESS) |
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
821 return; /* we'll be called again later */ |
23755
23cec4360d4a
applied changes from 8cebefbc6cd5d84acb69c74e69e8821f11dd225d
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23754
diff
changeset
|
822 |
23cec4360d4a
applied changes from 8cebefbc6cd5d84acb69c74e69e8821f11dd225d
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23754
diff
changeset
|
823 purple_input_remove(qd->udp_can_write_handler); |
23cec4360d4a
applied changes from 8cebefbc6cd5d84acb69c74e69e8821f11dd225d
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23754
diff
changeset
|
824 qd->udp_can_write_handler = 0; |
24026
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
825 if (ret < 0 || error != 0) { |
23755
23cec4360d4a
applied changes from 8cebefbc6cd5d84acb69c74e69e8821f11dd225d
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23754
diff
changeset
|
826 if(ret != 0) |
24026
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
827 error = errno; |
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 close(source); |
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
830 |
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
831 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
|
832 |
23755
23cec4360d4a
applied changes from 8cebefbc6cd5d84acb69c74e69e8821f11dd225d
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23754
diff
changeset
|
833 connect_cb(gc, -1, _("Unable to connect")); |
24026
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
834 return; |
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
835 } |
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
836 |
23755
23cec4360d4a
applied changes from 8cebefbc6cd5d84acb69c74e69e8821f11dd225d
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23754
diff
changeset
|
837 connect_cb(gc, source, NULL); |
24026
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
838 } |
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
839 |
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
840 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
|
841 PurpleConnection *gc; |
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
842 qq_data *qd; |
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
843 struct sockaddr server_addr; |
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
844 int addr_size; |
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
845 gint fd = -1; |
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
846 int flags; |
23052 | 847 |
848 gc = (PurpleConnection *) data; | |
849 g_return_if_fail(gc != NULL && gc->proto_data != NULL); | |
850 | |
851 qd = (qq_data *) gc->proto_data; | |
24026
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
852 |
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
853 /* udp_query_data must be set as NULL. |
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
854 * 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
|
855 qd->udp_query_data = NULL; |
23052 | 856 |
24026
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
857 if (!hosts || !hosts->data) { |
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
858 purple_connection_error_reason(gc, |
24066
dbc7a9742f8d
2008.09.26 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24065
diff
changeset
|
859 PURPLE_CONNECTION_ERROR_NETWORK_ERROR, |
dbc7a9742f8d
2008.09.26 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24065
diff
changeset
|
860 _("Couldn't resolve host")); |
23052 | 861 return; |
862 } | |
863 | |
24026
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
864 addr_size = GPOINTER_TO_INT(hosts->data); |
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
865 hosts = g_slist_remove(hosts, hosts->data); |
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
866 memcpy(&server_addr, hosts->data, addr_size); |
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
867 g_free(hosts->data); |
23755
23cec4360d4a
applied changes from 8cebefbc6cd5d84acb69c74e69e8821f11dd225d
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23754
diff
changeset
|
868 |
24026
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
869 hosts = g_slist_remove(hosts, hosts->data); |
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
870 while(hosts) { |
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
871 hosts = g_slist_remove(hosts, hosts->data); |
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
872 g_free(hosts->data); |
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
873 hosts = g_slist_remove(hosts, hosts->data); |
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
874 } |
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
875 |
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
876 fd = socket(PF_INET, SOCK_DGRAM, 0); |
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
877 if (fd < 0) { |
23755
23cec4360d4a
applied changes from 8cebefbc6cd5d84acb69c74e69e8821f11dd225d
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23754
diff
changeset
|
878 purple_debug_error("QQ", |
24026
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
879 "Unable to create socket: %s\n", g_strerror(errno)); |
23052 | 880 return; |
881 } | |
882 | |
24026
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
883 /* we use non-blocking mode to speed up connection */ |
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
884 flags = fcntl(fd, F_GETFL); |
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
885 fcntl(fd, F_SETFL, flags | O_NONBLOCK); |
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
886 #ifndef _WIN32 |
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
887 fcntl(fd, F_SETFD, FD_CLOEXEC); |
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
888 #endif |
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
889 |
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
890 /* 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
|
891 * |
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
892 * 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
|
893 * 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
|
894 * 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
|
895 * |
24026
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
896 * 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
|
897 * 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
|
898 * 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
|
899 * 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
|
900 */ |
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
901 if (connect(fd, &server_addr, addr_size) >= 0) { |
23755
23cec4360d4a
applied changes from 8cebefbc6cd5d84acb69c74e69e8821f11dd225d
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23754
diff
changeset
|
902 purple_debug_info("QQ", "Connected.\n"); |
24026
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
903 flags = fcntl(fd, F_GETFL); |
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
904 fcntl(fd, F_SETFL, flags & ~O_NONBLOCK); |
23755
23cec4360d4a
applied changes from 8cebefbc6cd5d84acb69c74e69e8821f11dd225d
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23754
diff
changeset
|
905 connect_cb(gc, fd, NULL); |
24026
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
906 return; |
24019
147ada94a1d8
2008.08.16 - ccpaging <ecc_hy(at)hotmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23774
diff
changeset
|
907 } |
23755
23cec4360d4a
applied changes from 8cebefbc6cd5d84acb69c74e69e8821f11dd225d
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23754
diff
changeset
|
908 |
24026
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
909 /* [EINPROGRESS] |
23755
23cec4360d4a
applied changes from 8cebefbc6cd5d84acb69c74e69e8821f11dd225d
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23754
diff
changeset
|
910 * 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
|
911 * 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
|
912 * selecting the socket for writing. |
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
913 * [EINTR] |
23755
23cec4360d4a
applied changes from 8cebefbc6cd5d84acb69c74e69e8821f11dd225d
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23754
diff
changeset
|
914 * A signal interrupted the call. |
24026
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
915 * The connection is established asynchronously. |
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
916 */ |
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
917 if ((errno == EINPROGRESS) || (errno == EINTR)) { |
23755
23cec4360d4a
applied changes from 8cebefbc6cd5d84acb69c74e69e8821f11dd225d
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23754
diff
changeset
|
918 purple_debug_warning( "QQ", "Connect in asynchronous mode.\n"); |
23cec4360d4a
applied changes from 8cebefbc6cd5d84acb69c74e69e8821f11dd225d
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23754
diff
changeset
|
919 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
|
920 return; |
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
921 } |
23052 | 922 |
23755
23cec4360d4a
applied changes from 8cebefbc6cd5d84acb69c74e69e8821f11dd225d
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23754
diff
changeset
|
923 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
|
924 close(fd); |
23052 | 925 } |
23755
23cec4360d4a
applied changes from 8cebefbc6cd5d84acb69c74e69e8821f11dd225d
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23754
diff
changeset
|
926 #endif |
23052 | 927 |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
928 gboolean connect_to_server(PurpleConnection *gc, gchar *server, gint port) |
23052 | 929 { |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
930 PurpleAccount *account ; |
23052 | 931 qq_data *qd; |
932 | |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
933 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
|
934 account = purple_connection_get_account(gc); |
23052 | 935 qd = (qq_data *) gc->proto_data; |
936 | |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
937 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
|
938 purple_connection_error_reason(gc, |
dbc7a9742f8d
2008.09.26 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24065
diff
changeset
|
939 PURPLE_CONNECTION_ERROR_NETWORK_ERROR, |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
940 _("Invalid server or port")); |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
941 return FALSE; |
23053
55f986ccbb6a
patch-05-reconnect-and-code-cleanup
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23052
diff
changeset
|
942 } |
55f986ccbb6a
patch-05-reconnect-and-code-cleanup
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23052
diff
changeset
|
943 |
24065
bdfcfd71449c
patch 20080922 from ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24048
diff
changeset
|
944 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
|
945 |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
946 purple_debug_info("QQ", "Connect to %s:%d\n", server, port); |
23052 | 947 |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
948 if (qd->conn_data != NULL) { |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
949 purple_proxy_connect_cancel(qd->conn_data); |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
950 qd->conn_data = NULL; |
23052 | 951 } |
952 | |
23755
23cec4360d4a
applied changes from 8cebefbc6cd5d84acb69c74e69e8821f11dd225d
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23754
diff
changeset
|
953 #ifdef purple_proxy_connect_udp |
23cec4360d4a
applied changes from 8cebefbc6cd5d84acb69c74e69e8821f11dd225d
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23754
diff
changeset
|
954 if (qd->use_tcp) { |
23cec4360d4a
applied changes from 8cebefbc6cd5d84acb69c74e69e8821f11dd225d
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23754
diff
changeset
|
955 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
|
956 } else { |
23cec4360d4a
applied changes from 8cebefbc6cd5d84acb69c74e69e8821f11dd225d
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23754
diff
changeset
|
957 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
|
958 } |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
959 if ( qd->conn_data == NULL ) { |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
960 purple_debug_error("QQ", _("Couldn't create socket")); |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
961 return FALSE; |
23052 | 962 } |
23755
23cec4360d4a
applied changes from 8cebefbc6cd5d84acb69c74e69e8821f11dd225d
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23754
diff
changeset
|
963 #else |
23cec4360d4a
applied changes from 8cebefbc6cd5d84acb69c74e69e8821f11dd225d
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23754
diff
changeset
|
964 /* QQ connection via UDP/TCP. |
24026
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
965 * 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
|
966 * 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
|
967 if(qd->use_tcp) { |
23755
23cec4360d4a
applied changes from 8cebefbc6cd5d84acb69c74e69e8821f11dd225d
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23754
diff
changeset
|
968 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
|
969 if ( qd->conn_data == NULL ) { |
23cec4360d4a
applied changes from 8cebefbc6cd5d84acb69c74e69e8821f11dd225d
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23754
diff
changeset
|
970 purple_debug_error("QQ", "Unable to connect."); |
23cec4360d4a
applied changes from 8cebefbc6cd5d84acb69c74e69e8821f11dd225d
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23754
diff
changeset
|
971 return FALSE; |
24026
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
972 } |
23755
23cec4360d4a
applied changes from 8cebefbc6cd5d84acb69c74e69e8821f11dd225d
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23754
diff
changeset
|
973 return TRUE; |
23052 | 974 } |
24026
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
975 |
23755
23cec4360d4a
applied changes from 8cebefbc6cd5d84acb69c74e69e8821f11dd225d
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23754
diff
changeset
|
976 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
|
977 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
|
978 if ( qd->udp_query_data == NULL ) { |
23cec4360d4a
applied changes from 8cebefbc6cd5d84acb69c74e69e8821f11dd225d
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23754
diff
changeset
|
979 purple_debug_error("QQ", "Could not resolve hostname"); |
23cec4360d4a
applied changes from 8cebefbc6cd5d84acb69c74e69e8821f11dd225d
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23754
diff
changeset
|
980 return FALSE; |
23052 | 981 } |
23755
23cec4360d4a
applied changes from 8cebefbc6cd5d84acb69c74e69e8821f11dd225d
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23754
diff
changeset
|
982 #endif |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
983 return TRUE; |
23052 | 984 } |
985 | |
986 /* clean up qq_data structure and all its components | |
987 * always used before a redirectly connection */ | |
988 void qq_disconnect(PurpleConnection *gc) | |
989 { | |
990 qq_data *qd; | |
991 | |
992 g_return_if_fail(gc != NULL && gc->proto_data != NULL); | |
993 qd = (qq_data *) gc->proto_data; | |
994 | |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
995 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
|
996 |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
997 if (qd->network_watcher > 0) { |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
998 purple_debug_info("QQ", "Remove network watcher\n"); |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
999 purple_timeout_remove(qd->network_watcher); |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1000 qd->network_watcher = 0; |
23683
1c50f12b1c52
2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23606
diff
changeset
|
1001 } |
1c50f12b1c52
2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23606
diff
changeset
|
1002 |
23052 | 1003 /* finish all I/O */ |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1004 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
|
1005 qq_request_logout(gc); |
23052 | 1006 } |
1007 | |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1008 /* not connected */ |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1009 if (qd->conn_data != NULL) { |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1010 purple_debug_info("QQ", "Connect cancel\n"); |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1011 purple_proxy_connect_cancel(qd->conn_data); |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1012 qd->conn_data = NULL; |
23052 | 1013 } |
23755
23cec4360d4a
applied changes from 8cebefbc6cd5d84acb69c74e69e8821f11dd225d
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23754
diff
changeset
|
1014 #ifndef purple_proxy_connect_udp |
23cec4360d4a
applied changes from 8cebefbc6cd5d84acb69c74e69e8821f11dd225d
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23754
diff
changeset
|
1015 if (qd->udp_can_write_handler) { |
23cec4360d4a
applied changes from 8cebefbc6cd5d84acb69c74e69e8821f11dd225d
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23754
diff
changeset
|
1016 purple_input_remove(qd->udp_can_write_handler); |
23cec4360d4a
applied changes from 8cebefbc6cd5d84acb69c74e69e8821f11dd225d
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23754
diff
changeset
|
1017 qd->udp_can_write_handler = 0; |
24026
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
1018 } |
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
1019 if (qd->udp_query_data != NULL) { |
23755
23cec4360d4a
applied changes from 8cebefbc6cd5d84acb69c74e69e8821f11dd225d
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23754
diff
changeset
|
1020 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
|
1021 purple_dnsquery_destroy(qd->udp_query_data); |
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
1022 qd->udp_query_data = NULL; |
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
1023 } |
23755
23cec4360d4a
applied changes from 8cebefbc6cd5d84acb69c74e69e8821f11dd225d
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23754
diff
changeset
|
1024 #endif |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1025 connection_free_all(qd); |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1026 qd->fd = -1; |
23052 | 1027 |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1028 qq_trans_remove_all(gc); |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1029 |
24066
dbc7a9742f8d
2008.09.26 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24065
diff
changeset
|
1030 memset(qd->ld.random_key, 0, sizeof(qd->ld.random_key)); |
24069
dc112387190f
2008.09.29 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24068
diff
changeset
|
1031 memset(qd->ld.pwd_md5, 0, sizeof(qd->ld.pwd_md5)); |
dc112387190f
2008.09.29 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24068
diff
changeset
|
1032 memset(qd->ld.pwd_twice_md5, 0, sizeof(qd->ld.pwd_twice_md5)); |
24066
dbc7a9742f8d
2008.09.26 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24065
diff
changeset
|
1033 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
|
1034 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
|
1035 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
|
1036 |
24068
87e61a85f5dd
2008.09.28 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24066
diff
changeset
|
1037 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
|
1038 qd->my_local_port = 0; |
23683
1c50f12b1c52
2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23606
diff
changeset
|
1039 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
|
1040 qd->my_port = 0; |
23052 | 1041 |
24088
1ee91ff0d5fe
2008.10.09 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24085
diff
changeset
|
1042 qq_room_data_free_all(gc); |
24079
1bdf7b602684
2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24071
diff
changeset
|
1043 qq_buddy_data_free_all(gc); |
23052 | 1044 } |
1045 | |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1046 static gint packet_encap(qq_data *qd, guint8 *buf, gint maxlen, guint16 cmd, guint16 seq, |
23052 | 1047 guint8 *data, gint data_len) |
1048 { | |
1049 gint bytes = 0; | |
1050 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
|
1051 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
|
1052 |
23052 | 1053 /* QQ TCP packet has two bytes in the begining defines packet length |
1054 * so leave room here to store packet size */ | |
1055 if (qd->use_tcp) { | |
1056 bytes += qq_put16(buf + bytes, 0x0000); | |
1057 } | |
1058 /* now comes the normal QQ packet as UDP */ | |
1059 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
|
1060 bytes += qq_put16(buf + bytes, qd->client_tag); |
23052 | 1061 bytes += qq_put16(buf + bytes, cmd); |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1062 |
23052 | 1063 bytes += qq_put16(buf + bytes, seq); |
1064 | |
1065 bytes += qq_put32(buf + bytes, qd->uid); | |
1066 bytes += qq_putdata(buf + bytes, data, data_len); | |
1067 bytes += qq_put8(buf + bytes, QQ_PACKET_TAIL); | |
1068 | |
23053
55f986ccbb6a
patch-05-reconnect-and-code-cleanup
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23052
diff
changeset
|
1069 /* set TCP packet length at begin of the packet */ |
23052 | 1070 if (qd->use_tcp) { |
1071 qq_put16(buf, bytes); | |
1072 } | |
1073 | |
1074 return bytes; | |
1075 } | |
1076 | |
23683
1c50f12b1c52
2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23606
diff
changeset
|
1077 /* data has been encrypted before */ |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1078 static gint packet_send_out(PurpleConnection *gc, guint16 cmd, guint16 seq, guint8 *data, gint data_len) |
23052 | 1079 { |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1080 qq_data *qd; |
23052 | 1081 guint8 *buf; |
1082 gint buf_len; | |
1083 gint bytes_sent; | |
1084 | |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1085 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
|
1086 qd = (qq_data *)gc->proto_data; |
23053
55f986ccbb6a
patch-05-reconnect-and-code-cleanup
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23052
diff
changeset
|
1087 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
|
1088 |
23052 | 1089 buf = g_newa(guint8, MAX_PACKET_SIZE); |
1090 memset(buf, 0, MAX_PACKET_SIZE); | |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1091 buf_len = packet_encap(qd, buf, MAX_PACKET_SIZE, cmd, seq, data, data_len); |
23052 | 1092 if (buf_len <= 0) { |
1093 return -1; | |
1094 } | |
1095 | |
23757
69c218fd5d54
applied changes from 5688199e261449d33b5803dafff50d860896ebcb
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23756
diff
changeset
|
1096 qd->net_stat.sent++; |
23052 | 1097 if (qd->use_tcp) { |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1098 bytes_sent = tcp_send_out(gc, buf, buf_len); |
23052 | 1099 } else { |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1100 bytes_sent = udp_send_out(gc, buf, buf_len); |
23052 | 1101 } |
1102 | |
1103 return bytes_sent; | |
1104 } | |
1105 | |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1106 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
|
1107 guint8 *encrypted, gint encrypted_len, gboolean is_save2trans) |
23052 | 1108 { |
23756
1a0caf9983fa
applied changes from 92d52eef2994d2697999177804e3665989cfa352
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23755
diff
changeset
|
1109 gint sent_len; |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1110 |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1111 #if 1 |
23756
1a0caf9983fa
applied changes from 92d52eef2994d2697999177804e3665989cfa352
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23755
diff
changeset
|
1112 /* 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
|
1113 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
|
1114 seq, qq_get_cmd_desc(cmd), cmd, encrypted_len); |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1115 #endif |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1116 |
24066
dbc7a9742f8d
2008.09.26 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24065
diff
changeset
|
1117 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
|
1118 if (is_save2trans) { |
24066
dbc7a9742f8d
2008.09.26 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24065
diff
changeset
|
1119 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
|
1120 } |
23756
1a0caf9983fa
applied changes from 92d52eef2994d2697999177804e3665989cfa352
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23755
diff
changeset
|
1121 return sent_len; |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1122 } |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1123 |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1124 /* Encrypt data with session_key, and send packet out */ |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1125 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
|
1126 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
|
1127 { |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1128 qq_data *qd; |
24066
dbc7a9742f8d
2008.09.26 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24065
diff
changeset
|
1129 guint8 *encrypted; |
23052 | 1130 gint encrypted_len; |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1131 gint bytes_sent; |
23052 | 1132 |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1133 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
|
1134 qd = (qq_data *)gc->proto_data; |
23053
55f986ccbb6a
patch-05-reconnect-and-code-cleanup
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23052
diff
changeset
|
1135 g_return_val_if_fail(data != NULL && data_len > 0, -1); |
23052 | 1136 |
23753
5f454b975a99
2008.08.10 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23683
diff
changeset
|
1137 /* at most 16 bytes more */ |
24066
dbc7a9742f8d
2008.09.26 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24065
diff
changeset
|
1138 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
|
1139 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
|
1140 if (encrypted_len < 16) { |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1141 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
|
1142 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
|
1143 return -1; |
5f454b975a99
2008.08.10 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23683
diff
changeset
|
1144 } |
23052 | 1145 |
24066
dbc7a9742f8d
2008.09.26 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24065
diff
changeset
|
1146 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
|
1147 |
23756
1a0caf9983fa
applied changes from 92d52eef2994d2697999177804e3665989cfa352
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23755
diff
changeset
|
1148 if (is_save2trans) { |
24066
dbc7a9742f8d
2008.09.26 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24065
diff
changeset
|
1149 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
|
1150 update_class, ship32); |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1151 } |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1152 return bytes_sent; |
23052 | 1153 } |
23053
55f986ccbb6a
patch-05-reconnect-and-code-cleanup
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23052
diff
changeset
|
1154 |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1155 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
|
1156 gint update_class, guint32 ship32) |
23053
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 qq_data *qd; |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1159 guint16 seq; |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1160 |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1161 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
|
1162 qd = (qq_data *) gc->proto_data; |
23053
55f986ccbb6a
patch-05-reconnect-and-code-cleanup
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23052
diff
changeset
|
1163 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
|
1164 |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1165 seq = ++qd->send_seq; |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1166 #if 1 |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1167 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
|
1168 seq, qq_get_cmd_desc(cmd), cmd, data_len); |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1169 #endif |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1170 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
|
1171 } |
23753
5f454b975a99
2008.08.10 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23683
diff
changeset
|
1172 |
23756
1a0caf9983fa
applied changes from 92d52eef2994d2697999177804e3665989cfa352
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23755
diff
changeset
|
1173 /* 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
|
1174 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
|
1175 { |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1176 qq_data *qd; |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1177 guint16 seq; |
23756
1a0caf9983fa
applied changes from 92d52eef2994d2697999177804e3665989cfa352
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23755
diff
changeset
|
1178 gboolean is_save2trans; |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1179 |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1180 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
|
1181 qd = (qq_data *) gc->proto_data; |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1182 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
|
1183 |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1184 if (cmd != QQ_CMD_LOGOUT) { |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1185 seq = ++qd->send_seq; |
23756
1a0caf9983fa
applied changes from 92d52eef2994d2697999177804e3665989cfa352
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23755
diff
changeset
|
1186 is_save2trans = TRUE; |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1187 } else { |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1188 seq = 0xFFFF; |
23756
1a0caf9983fa
applied changes from 92d52eef2994d2697999177804e3665989cfa352
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23755
diff
changeset
|
1189 is_save2trans = FALSE; |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1190 } |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1191 #if 1 |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1192 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
|
1193 seq, qq_get_cmd_desc(cmd), cmd, data_len); |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1194 #endif |
23756
1a0caf9983fa
applied changes from 92d52eef2994d2697999177804e3665989cfa352
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23755
diff
changeset
|
1195 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
|
1196 } |
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
1197 |
23756
1a0caf9983fa
applied changes from 92d52eef2994d2697999177804e3665989cfa352
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23755
diff
changeset
|
1198 /* 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
|
1199 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
|
1200 { |
23756
1a0caf9983fa
applied changes from 92d52eef2994d2697999177804e3665989cfa352
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23755
diff
changeset
|
1201 qq_data *qd; |
24066
dbc7a9742f8d
2008.09.26 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24065
diff
changeset
|
1202 guint8 *encrypted; |
23756
1a0caf9983fa
applied changes from 92d52eef2994d2697999177804e3665989cfa352
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23755
diff
changeset
|
1203 gint encrypted_len; |
1a0caf9983fa
applied changes from 92d52eef2994d2697999177804e3665989cfa352
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23755
diff
changeset
|
1204 gint bytes_sent; |
1a0caf9983fa
applied changes from 92d52eef2994d2697999177804e3665989cfa352
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23755
diff
changeset
|
1205 |
1a0caf9983fa
applied changes from 92d52eef2994d2697999177804e3665989cfa352
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23755
diff
changeset
|
1206 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
|
1207 qd = (qq_data *)gc->proto_data; |
1a0caf9983fa
applied changes from 92d52eef2994d2697999177804e3665989cfa352
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23755
diff
changeset
|
1208 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
|
1209 |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1210 #if 1 |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1211 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
|
1212 seq, qq_get_cmd_desc(cmd), cmd, data_len); |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1213 #endif |
23756
1a0caf9983fa
applied changes from 92d52eef2994d2697999177804e3665989cfa352
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23755
diff
changeset
|
1214 /* at most 16 bytes more */ |
24066
dbc7a9742f8d
2008.09.26 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24065
diff
changeset
|
1215 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
|
1216 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
|
1217 if (encrypted_len < 16) { |
1a0caf9983fa
applied changes from 92d52eef2994d2697999177804e3665989cfa352
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23755
diff
changeset
|
1218 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
|
1219 encrypted_len, seq, cmd, qq_get_cmd_desc(cmd)); |
1a0caf9983fa
applied changes from 92d52eef2994d2697999177804e3665989cfa352
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23755
diff
changeset
|
1220 return -1; |
1a0caf9983fa
applied changes from 92d52eef2994d2697999177804e3665989cfa352
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23755
diff
changeset
|
1221 } |
1a0caf9983fa
applied changes from 92d52eef2994d2697999177804e3665989cfa352
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23755
diff
changeset
|
1222 |
24066
dbc7a9742f8d
2008.09.26 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24065
diff
changeset
|
1223 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
|
1224 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
|
1225 |
1a0caf9983fa
applied changes from 92d52eef2994d2697999177804e3665989cfa352
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23755
diff
changeset
|
1226 return bytes_sent; |
24026
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
1227 } |
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
1228 |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1229 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
|
1230 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
|
1231 { |
24019
147ada94a1d8
2008.08.16 - ccpaging <ecc_hy(at)hotmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23774
diff
changeset
|
1232 qq_data *qd; |
23753
5f454b975a99
2008.08.10 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23683
diff
changeset
|
1233 guint8 *buf; |
5f454b975a99
2008.08.10 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23683
diff
changeset
|
1234 gint buf_len; |
24066
dbc7a9742f8d
2008.09.26 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24065
diff
changeset
|
1235 guint8 *encrypted; |
23753
5f454b975a99
2008.08.10 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23683
diff
changeset
|
1236 gint encrypted_len; |
5f454b975a99
2008.08.10 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23683
diff
changeset
|
1237 gint bytes_sent; |
5f454b975a99
2008.08.10 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23683
diff
changeset
|
1238 guint16 seq; |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1239 |
23753
5f454b975a99
2008.08.10 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23683
diff
changeset
|
1240 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
|
1241 qd = (qq_data *) gc->proto_data; |
5f454b975a99
2008.08.10 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23683
diff
changeset
|
1242 |
5f454b975a99
2008.08.10 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23683
diff
changeset
|
1243 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
|
1244 memset(buf, 0, MAX_PACKET_SIZE); |
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 /* 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
|
1247 buf_len = 0; |
5f454b975a99
2008.08.10 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23683
diff
changeset
|
1248 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
|
1249 if (room_id != 0) { |
5f454b975a99
2008.08.10 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23683
diff
changeset
|
1250 /* 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
|
1251 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
|
1252 } |
5f454b975a99
2008.08.10 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23683
diff
changeset
|
1253 if (data != NULL && data_len > 0) { |
5f454b975a99
2008.08.10 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23683
diff
changeset
|
1254 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
|
1255 } |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1256 |
23753
5f454b975a99
2008.08.10 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23683
diff
changeset
|
1257 qd->send_seq++; |
5f454b975a99
2008.08.10 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23683
diff
changeset
|
1258 seq = qd->send_seq; |
5f454b975a99
2008.08.10 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23683
diff
changeset
|
1259 |
24066
dbc7a9742f8d
2008.09.26 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24065
diff
changeset
|
1260 /* 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
|
1261 /* at most 16 bytes more */ |
24066
dbc7a9742f8d
2008.09.26 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24065
diff
changeset
|
1262 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
|
1263 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
|
1264 if (encrypted_len < 16) { |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1265 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
|
1266 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
|
1267 return -1; |
5f454b975a99
2008.08.10 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23683
diff
changeset
|
1268 } |
5f454b975a99
2008.08.10 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23683
diff
changeset
|
1269 |
24066
dbc7a9742f8d
2008.09.26 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24065
diff
changeset
|
1270 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
|
1271 #if 1 |
23756
1a0caf9983fa
applied changes from 92d52eef2994d2697999177804e3665989cfa352
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23755
diff
changeset
|
1272 /* qq_show_packet("send_room_cmd", buf, buf_len); */ |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1273 purple_debug_info("QQ", |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1274 "<== [%05d], %s (0x%02X) to room %d, datalen %d\n", |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1275 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
|
1276 #endif |
24026
25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
Daniel Atallah <daniel.atallah@gmail.com>
parents:
24019
diff
changeset
|
1277 |
24066
dbc7a9742f8d
2008.09.26 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24065
diff
changeset
|
1278 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
|
1279 update_class, ship32); |
23753
5f454b975a99
2008.08.10 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23683
diff
changeset
|
1280 return bytes_sent; |
5f454b975a99
2008.08.10 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23683
diff
changeset
|
1281 } |
23754
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_mess(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, gint update_class, guint32 ship32) |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1285 { |
24085
237e5a94e11c
2008.10.08 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24079
diff
changeset
|
1286 g_return_val_if_fail(room_cmd > 0, -1); |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1287 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
|
1288 } |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1289 |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1290 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
|
1291 guint8 *data, gint data_len) |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1292 { |
24085
237e5a94e11c
2008.10.08 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24079
diff
changeset
|
1293 g_return_val_if_fail(room_cmd > 0 && room_id > 0, -1); |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1294 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
|
1295 } |
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 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
|
1298 guint8 *data, gint data_len) |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1299 { |
24085
237e5a94e11c
2008.10.08 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents:
24079
diff
changeset
|
1300 g_return_val_if_fail(room_cmd > 0, -1); |
23754
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1301 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
|
1302 } |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1303 |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1304 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
|
1305 { |
967344bc404d
applied changes from f12c8903079425d7850fa183df0b3f937b2952be
SHiNE CsyFeK <csyfek@gmail.com>
parents:
23753
diff
changeset
|
1306 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
|
1307 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
|
1308 } |