annotate src/protocols/gg/lib/events.c @ 11911:fe12abd6b879

[gaim-migrate @ 14202] SF Patch #1339005 from Sadrul "This patch is a fix for this small bug: (1) open a new conversation with some buddy in a contact. (2) open another conversation with another buddy in the same contact. (3) now press space/enter on the first buddy in the buddy-list. you will notice that the active-buddy in the conversation doesn't change to the buddy you just activated." committer: Tailor Script <tailor@pidgin.im>
author Richard Laager <rlaager@wiktel.com>
date Sun, 30 Oct 2005 23:36:51 +0000
parents 3c536224f0d0
children 9cbc5967fbfd
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
11546
3c536224f0d0 [gaim-migrate @ 13801]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11360
diff changeset
1 /* $Id: events.c 13801 2005-09-14 19:10:39Z datallah $ */
11360
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
2
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
3 /*
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
4 * (C) Copyright 2001-2003 Wojtek Kaniewski <wojtekka@irc.pl>
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
5 * Robert J. Woźny <speedy@ziew.org>
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
6 * Arkadiusz Miśkiewicz <arekm@pld-linux.org>
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
7 *
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
8 * This program is free software; you can redistribute it and/or modify
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
9 * it under the terms of the GNU Lesser General Public License Version
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
10 * 2.1 as published by the Free Software Foundation.
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
11 *
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
12 * This program is distributed in the hope that it will be useful,
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
15 * GNU Lesser General Public License for more details.
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
16 *
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
17 * You should have received a copy of the GNU Lesser General Public
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
18 * License along with this program; if not, write to the Free Software
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
19 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307,
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
20 * USA.
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
21 */
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
22
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
23 #include <sys/types.h>
11546
3c536224f0d0 [gaim-migrate @ 13801]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11360
diff changeset
24 #ifndef _WIN32
11360
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
25 #include <sys/wait.h>
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
26 #include <sys/ioctl.h>
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
27 #include <sys/socket.h>
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
28 #include <netinet/in.h>
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
29 #include <arpa/inet.h>
11546
3c536224f0d0 [gaim-migrate @ 13801]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11360
diff changeset
30 #endif
11360
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
31
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
32 #include "libgadu-config.h"
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
33
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
34 #include <errno.h>
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
35 #ifdef __GG_LIBGADU_HAVE_PTHREAD
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
36 # include <pthread.h>
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
37 #endif
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
38 #include <stdio.h>
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
39 #include <string.h>
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
40 #include <stdlib.h>
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
41 #include <time.h>
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
42 #include <unistd.h>
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
43 #ifdef __GG_LIBGADU_HAVE_OPENSSL
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
44 # include <openssl/err.h>
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
45 # include <openssl/x509.h>
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
46 #endif
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
47
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
48 #include "compat.h"
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
49 #include "libgadu.h"
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
50
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
51 /*
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
52 * gg_event_free()
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
53 *
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
54 * zwalnia pamięć zajmowaną przez informację o zdarzeniu.
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
55 *
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
56 * - e - wskaźnik do informacji o zdarzeniu
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
57 */
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
58 void gg_event_free(struct gg_event *e)
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
59 {
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
60 gg_debug(GG_DEBUG_FUNCTION, "** gg_event_free(%p);\n", e);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
61
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
62 if (!e)
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
63 return;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
64
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
65 switch (e->type) {
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
66 case GG_EVENT_MSG:
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
67 free(e->event.msg.message);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
68 free(e->event.msg.formats);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
69 free(e->event.msg.recipients);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
70 break;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
71
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
72 case GG_EVENT_NOTIFY:
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
73 free(e->event.notify);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
74 break;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
75
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
76 case GG_EVENT_NOTIFY60:
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
77 {
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
78 int i;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
79
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
80 for (i = 0; e->event.notify60[i].uin; i++)
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
81 free(e->event.notify60[i].descr);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
82
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
83 free(e->event.notify60);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
84
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
85 break;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
86 }
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
87
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
88 case GG_EVENT_STATUS60:
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
89 free(e->event.status60.descr);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
90 break;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
91
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
92 case GG_EVENT_STATUS:
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
93 free(e->event.status.descr);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
94 break;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
95
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
96 case GG_EVENT_NOTIFY_DESCR:
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
97 free(e->event.notify_descr.notify);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
98 free(e->event.notify_descr.descr);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
99 break;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
100
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
101 case GG_EVENT_DCC_VOICE_DATA:
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
102 free(e->event.dcc_voice_data.data);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
103 break;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
104
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
105 case GG_EVENT_PUBDIR50_SEARCH_REPLY:
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
106 case GG_EVENT_PUBDIR50_READ:
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
107 case GG_EVENT_PUBDIR50_WRITE:
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
108 gg_pubdir50_free(e->event.pubdir50);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
109 break;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
110
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
111 case GG_EVENT_USERLIST:
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
112 free(e->event.userlist.reply);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
113 break;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
114
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
115 case GG_EVENT_IMAGE_REPLY:
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
116 free(e->event.image_reply.filename);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
117 free(e->event.image_reply.image);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
118 break;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
119 }
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
120
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
121 free(e);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
122 }
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
123
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
124 /*
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
125 * gg_image_queue_remove()
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
126 *
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
127 * usuwa z kolejki dany wpis.
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
128 *
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
129 * - s - sesja
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
130 * - q - kolejka
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
131 * - freeq - czy zwolnić kolejkę
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
132 *
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
133 * 0/-1
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
134 */
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
135 int gg_image_queue_remove(struct gg_session *s, struct gg_image_queue *q, int freeq)
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
136 {
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
137 if (!s || !q) {
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
138 errno = EFAULT;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
139 return -1;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
140 }
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
141
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
142 if (s->images == q)
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
143 s->images = q->next;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
144 else {
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
145 struct gg_image_queue *qq;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
146
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
147 for (qq = s->images; qq; qq = qq->next) {
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
148 if (qq->next == q) {
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
149 qq->next = q->next;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
150 break;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
151 }
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
152 }
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
153 }
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
154
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
155 if (freeq) {
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
156 free(q->image);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
157 free(q->filename);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
158 free(q);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
159 }
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
160
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
161 return 0;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
162 }
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
163
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
164 /*
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
165 * gg_image_queue_parse() // funkcja wewnętrzna
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
166 *
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
167 * parsuje przychodzący pakiet z obrazkiem.
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
168 *
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
169 * - e - opis zdarzenia
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
170 * -
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
171 */
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
172 static void gg_image_queue_parse(struct gg_event *e, char *p, unsigned int len, struct gg_session *sess, uin_t sender)
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
173 {
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
174 struct gg_msg_image_reply *i = (void*) p;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
175 struct gg_image_queue *q, *qq;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
176
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
177 if (!p || !sess || !e) {
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
178 errno = EFAULT;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
179 return;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
180 }
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
181
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
182 /* znajdź dany obrazek w kolejce danej sesji */
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
183
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
184 for (qq = sess->images, q = NULL; qq; qq = qq->next) {
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
185 if (sender == qq->sender && i->size == qq->size && i->crc32 == qq->crc32) {
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
186 q = qq;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
187 break;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
188 }
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
189 }
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
190
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
191 if (!q) {
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
192 gg_debug(GG_DEBUG_MISC, "// gg_image_queue_parse() unknown image from %d, size=%d, crc32=%.8x\n", sender, i->size, i->crc32);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
193 return;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
194 }
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
195
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
196 if (p[0] == 0x05) {
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
197 int i, ok = 0;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
198
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
199 q->done = 0;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
200
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
201 len -= sizeof(struct gg_msg_image_reply);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
202 p += sizeof(struct gg_msg_image_reply);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
203
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
204 /* sprawdź, czy mamy tekst zakończony \0 */
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
205
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
206 for (i = 0; i < len; i++) {
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
207 if (!p[i]) {
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
208 ok = 1;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
209 break;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
210 }
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
211 }
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
212
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
213 if (!ok) {
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
214 gg_debug(GG_DEBUG_MISC, "// gg_image_queue_parse() malformed packet from %d, unlimited filename\n", sender);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
215 return;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
216 }
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
217
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
218 if (!(q->filename = strdup(p))) {
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
219 gg_debug(GG_DEBUG_MISC, "// gg_image_queue_parse() not enough memory for filename\n");
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
220 return;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
221 }
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
222
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
223 len -= strlen(p) + 1;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
224 p += strlen(p) + 1;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
225 } else {
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
226 len -= sizeof(struct gg_msg_image_reply);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
227 p += sizeof(struct gg_msg_image_reply);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
228 }
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
229
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
230 if (q->done + len > q->size)
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
231 len = q->size - q->done;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
232
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
233 memcpy(q->image + q->done, p, len);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
234 q->done += len;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
235
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
236 /* jeśli skończono odbierać obrazek, wygeneruj zdarzenie */
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
237
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
238 if (q->done >= q->size) {
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
239 e->type = GG_EVENT_IMAGE_REPLY;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
240 e->event.image_reply.sender = sender;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
241 e->event.image_reply.size = q->size;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
242 e->event.image_reply.crc32 = q->crc32;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
243 e->event.image_reply.filename = q->filename;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
244 e->event.image_reply.image = q->image;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
245
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
246 gg_image_queue_remove(sess, q, 0);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
247
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
248 free(q);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
249 }
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
250 }
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
251
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
252 /*
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
253 * gg_handle_recv_msg() // funkcja wewnętrzna
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
254 *
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
255 * obsługuje pakiet z przychodzącą wiadomością, rozbijając go na dodatkowe
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
256 * struktury (konferencje, kolorki) w razie potrzeby.
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
257 *
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
258 * - h - nagłówek pakietu
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
259 * - e - opis zdarzenia
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
260 *
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
261 * 0, -1.
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
262 */
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
263 static int gg_handle_recv_msg(struct gg_header *h, struct gg_event *e, struct gg_session *sess)
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
264 {
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
265 struct gg_recv_msg *r = (struct gg_recv_msg*) ((char*) h + sizeof(struct gg_header));
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
266 char *p, *packet_end = (char*) r + h->length;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
267
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
268 gg_debug(GG_DEBUG_FUNCTION, "** gg_handle_recv_msg(%p, %p);\n", h, e);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
269
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
270 if (!r->seq && !r->msgclass) {
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
271 gg_debug(GG_DEBUG_MISC, "// gg_handle_recv_msg() oops, silently ignoring the bait\n");
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
272 e->type = GG_EVENT_NONE;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
273 return 0;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
274 }
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
275
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
276 for (p = (char*) r + sizeof(*r); *p; p++) {
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
277 if (*p == 0x02 && p == packet_end - 1) {
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
278 gg_debug(GG_DEBUG_MISC, "// gg_handle_recv_msg() received ctcp packet\n");
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
279 break;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
280 }
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
281 if (p >= packet_end) {
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
282 gg_debug(GG_DEBUG_MISC, "// gg_handle_recv_msg() malformed packet, message out of bounds (0)\n");
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
283 goto malformed;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
284 }
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
285 }
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
286
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
287 p++;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
288
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
289 /* przeanalizuj dodatkowe opcje */
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
290 while (p < packet_end) {
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
291 switch (*p) {
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
292 case 0x01: /* konferencja */
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
293 {
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
294 struct gg_msg_recipients *m = (void*) p;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
295 uint32_t i, count;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
296
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
297 p += sizeof(*m);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
298
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
299 if (p > packet_end) {
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
300 gg_debug(GG_DEBUG_MISC, "// gg_handle_recv_msg() packet out of bounds (1)\n");
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
301 goto malformed;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
302 }
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
303
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
304 count = gg_fix32(m->count);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
305
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
306 if (p + count * sizeof(uin_t) > packet_end || p + count * sizeof(uin_t) < p || count > 0xffff) {
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
307 gg_debug(GG_DEBUG_MISC, "// gg_handle_recv_msg() packet out of bounds (1.5)\n");
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
308 goto malformed;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
309 }
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
310
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
311 if (!(e->event.msg.recipients = (void*) malloc(count * sizeof(uin_t)))) {
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
312 gg_debug(GG_DEBUG_MISC, "// gg_handle_recv_msg() not enough memory for recipients data\n");
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
313 goto fail;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
314 }
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
315
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
316 for (i = 0; i < count; i++, p += sizeof(uint32_t)) {
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
317 uint32_t u;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
318 memcpy(&u, p, sizeof(uint32_t));
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
319 e->event.msg.recipients[i] = gg_fix32(u);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
320 }
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
321
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
322 e->event.msg.recipients_count = count;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
323
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
324 break;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
325 }
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
326
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
327 case 0x02: /* richtext */
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
328 {
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
329 uint16_t len;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
330 char *buf;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
331
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
332 if (p + 3 > packet_end) {
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
333 gg_debug(GG_DEBUG_MISC, "// gg_handle_recv_msg() packet out of bounds (2)\n");
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
334 goto malformed;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
335 }
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
336
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
337 memcpy(&len, p + 1, sizeof(uint16_t));
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
338 len = gg_fix16(len);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
339
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
340 if (!(buf = malloc(len))) {
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
341 gg_debug(GG_DEBUG_MISC, "// gg_handle_recv_msg() not enough memory for richtext data\n");
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
342 goto fail;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
343 }
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
344
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
345 p += 3;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
346
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
347 if (p + len > packet_end) {
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
348 gg_debug(GG_DEBUG_MISC, "// gg_handle_recv_msg() packet out of bounds (3)\n");
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
349 free(buf);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
350 goto malformed;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
351 }
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
352
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
353 memcpy(buf, p, len);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
354
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
355 e->event.msg.formats = buf;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
356 e->event.msg.formats_length = len;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
357
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
358 p += len;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
359
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
360 break;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
361 }
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
362
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
363 case 0x04: /* image_request */
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
364 {
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
365 struct gg_msg_image_request *i = (void*) p;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
366
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
367 if (p + sizeof(*i) > packet_end) {
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
368 gg_debug(GG_DEBUG_MISC, "// gg_handle_recv_msg() packet out of bounds (3)\n");
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
369 goto malformed;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
370 }
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
371
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
372 e->event.image_request.sender = gg_fix32(r->sender);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
373 e->event.image_request.size = gg_fix32(i->size);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
374 e->event.image_request.crc32 = gg_fix32(i->crc32);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
375
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
376 e->type = GG_EVENT_IMAGE_REQUEST;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
377
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
378 return 0;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
379 }
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
380
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
381 case 0x05: /* image_reply */
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
382 case 0x06:
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
383 {
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
384 struct gg_msg_image_reply *rep = (void*) p;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
385
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
386 if (p + sizeof(struct gg_msg_image_reply) == packet_end) {
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
387
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
388 /* pusta odpowiedź - klient po drugiej stronie nie ma żądanego obrazka */
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
389
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
390 e->type = GG_EVENT_IMAGE_REPLY;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
391 e->event.image_reply.sender = gg_fix32(r->sender);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
392 e->event.image_reply.size = 0;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
393 e->event.image_reply.crc32 = gg_fix32(rep->crc32);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
394 e->event.image_reply.filename = NULL;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
395 e->event.image_reply.image = NULL;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
396 return 0;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
397
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
398 } else if (p + sizeof(struct gg_msg_image_reply) + 1 > packet_end) {
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
399
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
400 gg_debug(GG_DEBUG_MISC, "// gg_handle_recv_msg() packet out of bounds (4)\n");
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
401 goto malformed;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
402 }
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
403
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
404 rep->size = gg_fix32(rep->size);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
405 rep->crc32 = gg_fix32(rep->crc32);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
406 gg_image_queue_parse(e, p, (unsigned int)(packet_end - p), sess, gg_fix32(r->sender));
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
407
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
408 return 0;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
409 }
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
410
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
411 default:
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
412 {
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
413 gg_debug(GG_DEBUG_MISC, "// gg_handle_recv_msg() unknown payload 0x%.2x\n", *p);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
414 p = packet_end;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
415 }
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
416 }
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
417 }
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
418
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
419 e->type = GG_EVENT_MSG;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
420 e->event.msg.msgclass = gg_fix32(r->msgclass);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
421 e->event.msg.sender = gg_fix32(r->sender);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
422 e->event.msg.time = gg_fix32(r->time);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
423 e->event.msg.message = strdup((char*) r + sizeof(*r));
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
424
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
425 return 0;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
426
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
427 malformed:
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
428 e->type = GG_EVENT_NONE;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
429
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
430 free(e->event.msg.recipients);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
431 free(e->event.msg.formats);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
432
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
433 return 0;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
434
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
435 fail:
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
436 free(e->event.msg.recipients);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
437 free(e->event.msg.formats);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
438 return -1;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
439 }
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
440
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
441 /*
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
442 * gg_watch_fd_connected() // funkcja wewnętrzna
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
443 *
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
444 * patrzy na gniazdo, odbiera pakiet i wypełnia strukturę zdarzenia.
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
445 *
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
446 * - sess - struktura opisująca sesję
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
447 * - e - opis zdarzenia
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
448 *
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
449 * 0, -1.
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
450 */
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
451 static int gg_watch_fd_connected(struct gg_session *sess, struct gg_event *e)
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
452 {
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
453 struct gg_header *h = NULL;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
454 char *p;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
455
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
456 gg_debug(GG_DEBUG_FUNCTION, "** gg_watch_fd_connected(%p, %p);\n", sess, e);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
457
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
458 if (!sess) {
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
459 errno = EFAULT;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
460 return -1;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
461 }
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
462
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
463 if (!(h = gg_recv_packet(sess))) {
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
464 gg_debug(GG_DEBUG_MISC, "// gg_watch_fd_connected() gg_recv_packet failed (errno=%d, %s)\n", errno, strerror(errno));
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
465 goto fail;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
466 }
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
467
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
468 p = (char*) h + sizeof(struct gg_header);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
469
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
470 switch (h->type) {
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
471 case GG_RECV_MSG:
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
472 {
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
473 if (h->length >= sizeof(struct gg_recv_msg))
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
474 if (gg_handle_recv_msg(h, e, sess))
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
475 goto fail;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
476
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
477 break;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
478 }
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
479
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
480 case GG_NOTIFY_REPLY:
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
481 {
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
482 struct gg_notify_reply *n = (void*) p;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
483 unsigned int count, i;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
484 char *tmp;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
485
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
486 gg_debug(GG_DEBUG_MISC, "// gg_watch_fd_connected() received a notify reply\n");
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
487
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
488 if (h->length < sizeof(*n)) {
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
489 gg_debug(GG_DEBUG_MISC, "// gg_watch_fd_connected() incomplete packet\n");
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
490 errno = EINVAL;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
491 goto fail;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
492 }
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
493
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
494 if (gg_fix32(n->status) == GG_STATUS_BUSY_DESCR || gg_fix32(n->status) == GG_STATUS_NOT_AVAIL_DESCR || gg_fix32(n->status) == GG_STATUS_AVAIL_DESCR) {
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
495 e->type = GG_EVENT_NOTIFY_DESCR;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
496
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
497 if (!(e->event.notify_descr.notify = (void*) malloc(sizeof(*n) * 2))) {
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
498 gg_debug(GG_DEBUG_MISC, "// gg_watch_fd_connected() not enough memory for notify data\n");
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
499 goto fail;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
500 }
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
501 e->event.notify_descr.notify[1].uin = 0;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
502 memcpy(e->event.notify_descr.notify, p, sizeof(*n));
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
503 e->event.notify_descr.notify[0].uin = gg_fix32(e->event.notify_descr.notify[0].uin);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
504 e->event.notify_descr.notify[0].status = gg_fix32(e->event.notify_descr.notify[0].status);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
505 e->event.notify_descr.notify[0].remote_ip = e->event.notify_descr.notify[0].remote_ip;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
506 e->event.notify_descr.notify[0].remote_port = gg_fix16(e->event.notify_descr.notify[0].remote_port);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
507
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
508 count = h->length - sizeof(*n);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
509 if (!(tmp = malloc(count + 1))) {
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
510 gg_debug(GG_DEBUG_MISC, "// gg_watch_fd_connected() not enough memory for notify data\n");
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
511 goto fail;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
512 }
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
513 memcpy(tmp, p + sizeof(*n), count);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
514 tmp[count] = 0;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
515 e->event.notify_descr.descr = tmp;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
516
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
517 } else {
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
518 e->type = GG_EVENT_NOTIFY;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
519
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
520 if (!(e->event.notify = (void*) malloc(h->length + 2 * sizeof(*n)))) {
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
521 gg_debug(GG_DEBUG_MISC, "// gg_watch_fd_connected() not enough memory for notify data\n");
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
522 goto fail;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
523 }
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
524
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
525 memcpy(e->event.notify, p, h->length);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
526 count = h->length / sizeof(*n);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
527 e->event.notify[count].uin = 0;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
528
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
529 for (i = 0; i < count; i++) {
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
530 e->event.notify[i].uin = gg_fix32(e->event.notify[i].uin);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
531 e->event.notify[i].status = gg_fix32(e->event.notify[i].status);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
532 e->event.notify[i].remote_ip = e->event.notify[i].remote_ip;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
533 e->event.notify[i].remote_port = gg_fix16(e->event.notify[i].remote_port);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
534 }
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
535 }
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
536
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
537 break;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
538 }
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
539
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
540 case GG_STATUS:
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
541 {
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
542 struct gg_status *s = (void*) p;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
543
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
544 gg_debug(GG_DEBUG_MISC, "// gg_watch_fd_connected() received a status change\n");
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
545
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
546 if (h->length >= sizeof(*s)) {
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
547 e->type = GG_EVENT_STATUS;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
548 memcpy(&e->event.status, p, sizeof(*s));
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
549 e->event.status.uin = gg_fix32(e->event.status.uin);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
550 e->event.status.status = gg_fix32(e->event.status.status);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
551 if (h->length > sizeof(*s)) {
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
552 int len = h->length - sizeof(*s);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
553 char *buf = malloc(len + 1);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
554 if (buf) {
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
555 memcpy(buf, p + sizeof(*s), len);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
556 buf[len] = 0;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
557 }
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
558 e->event.status.descr = buf;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
559 } else
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
560 e->event.status.descr = NULL;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
561 }
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
562
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
563 break;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
564 }
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
565
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
566 case GG_NOTIFY_REPLY60:
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
567 {
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
568 struct gg_notify_reply60 *n = (void*) p;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
569 unsigned int length = h->length, i = 0;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
570
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
571 gg_debug(GG_DEBUG_MISC, "// gg_watch_fd_connected() received a notify reply\n");
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
572
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
573 e->type = GG_EVENT_NOTIFY60;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
574 e->event.notify60 = malloc(sizeof(*e->event.notify60));
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
575
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
576 if (!e->event.notify60) {
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
577 gg_debug(GG_DEBUG_MISC, "// gg_watch_fd_connected() not enough memory for notify data\n");
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
578 goto fail;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
579 }
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
580
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
581 e->event.notify60[0].uin = 0;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
582
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
583 while (length >= sizeof(struct gg_notify_reply60)) {
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
584 uin_t uin = gg_fix32(n->uin);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
585 char *tmp;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
586
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
587 e->event.notify60[i].uin = uin & 0x00ffffff;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
588 e->event.notify60[i].status = n->status;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
589 e->event.notify60[i].remote_ip = n->remote_ip;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
590 e->event.notify60[i].remote_port = gg_fix16(n->remote_port);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
591 e->event.notify60[i].version = n->version;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
592 e->event.notify60[i].image_size = n->image_size;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
593 e->event.notify60[i].descr = NULL;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
594 e->event.notify60[i].time = 0;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
595
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
596 if (uin & 0x40000000)
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
597 e->event.notify60[i].version |= GG_HAS_AUDIO_MASK;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
598 if (uin & 0x08000000)
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
599 e->event.notify60[i].version |= GG_ERA_OMNIX_MASK;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
600
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
601 if (GG_S_D(n->status)) {
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
602 unsigned char descr_len = *((char*) n + sizeof(struct gg_notify_reply60));
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
603
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
604 if (descr_len < length) {
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
605 if (!(e->event.notify60[i].descr = malloc(descr_len + 1))) {
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
606 gg_debug(GG_DEBUG_MISC, "// gg_watch_fd_connected() not enough memory for notify data\n");
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
607 goto fail;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
608 }
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
609
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
610 memcpy(e->event.notify60[i].descr, (char*) n + sizeof(struct gg_notify_reply60) + 1, descr_len);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
611 e->event.notify60[i].descr[descr_len] = 0;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
612
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
613 /* XXX czas */
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
614 }
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
615
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
616 length -= sizeof(struct gg_notify_reply60) + descr_len + 1;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
617 n = (void*) ((char*) n + sizeof(struct gg_notify_reply60) + descr_len + 1);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
618 } else {
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
619 length -= sizeof(struct gg_notify_reply60);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
620 n = (void*) ((char*) n + sizeof(struct gg_notify_reply60));
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
621 }
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
622
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
623 if (!(tmp = realloc(e->event.notify60, (i + 2) * sizeof(*e->event.notify60)))) {
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
624 gg_debug(GG_DEBUG_MISC, "// gg_watch_fd_connected() not enough memory for notify data\n");
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
625 free(e->event.notify60);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
626 goto fail;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
627 }
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
628
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
629 e->event.notify60 = (void*) tmp;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
630 e->event.notify60[++i].uin = 0;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
631 }
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
632
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
633 break;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
634 }
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
635
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
636 case GG_STATUS60:
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
637 {
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
638 struct gg_status60 *s = (void*) p;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
639 uint32_t uin;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
640
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
641 gg_debug(GG_DEBUG_MISC, "// gg_watch_fd_connected() received a status change\n");
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
642
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
643 if (h->length < sizeof(*s))
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
644 break;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
645
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
646 uin = gg_fix32(s->uin);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
647
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
648 e->type = GG_EVENT_STATUS60;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
649 e->event.status60.uin = uin & 0x00ffffff;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
650 e->event.status60.status = s->status;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
651 e->event.status60.remote_ip = s->remote_ip;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
652 e->event.status60.remote_port = gg_fix16(s->remote_port);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
653 e->event.status60.version = s->version;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
654 e->event.status60.image_size = s->image_size;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
655 e->event.status60.descr = NULL;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
656 e->event.status60.time = 0;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
657
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
658 if (uin & 0x40000000)
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
659 e->event.status60.version |= GG_HAS_AUDIO_MASK;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
660 if (uin & 0x08000000)
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
661 e->event.status60.version |= GG_ERA_OMNIX_MASK;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
662
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
663 if (h->length > sizeof(*s)) {
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
664 int len = h->length - sizeof(*s);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
665 char *buf = malloc(len + 1);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
666
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
667 if (buf) {
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
668 memcpy(buf, (char*) p + sizeof(*s), len);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
669 buf[len] = 0;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
670 }
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
671
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
672 e->event.status60.descr = buf;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
673
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
674 if (len > 4 && p[h->length - 5] == 0) {
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
675 uint32_t t;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
676 memcpy(&t, p + h->length - 4, sizeof(uint32_t));
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
677 e->event.status60.time = gg_fix32(t);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
678 }
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
679 }
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
680
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
681 break;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
682 }
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
683
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
684 case GG_SEND_MSG_ACK:
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
685 {
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
686 struct gg_send_msg_ack *s = (void*) p;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
687
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
688 gg_debug(GG_DEBUG_MISC, "// gg_watch_fd_connected() received a message ack\n");
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
689
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
690 if (h->length < sizeof(*s))
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
691 break;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
692
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
693 e->type = GG_EVENT_ACK;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
694 e->event.ack.status = gg_fix32(s->status);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
695 e->event.ack.recipient = gg_fix32(s->recipient);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
696 e->event.ack.seq = gg_fix32(s->seq);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
697
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
698 break;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
699 }
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
700
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
701 case GG_PONG:
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
702 {
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
703 gg_debug(GG_DEBUG_MISC, "// gg_watch_fd_connected() received a pong\n");
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
704
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
705 e->type = GG_EVENT_PONG;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
706 sess->last_pong = time(NULL);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
707
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
708 break;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
709 }
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
710
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
711 case GG_DISCONNECTING:
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
712 {
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
713 gg_debug(GG_DEBUG_MISC, "// gg_watch_fd_connected() received disconnection warning\n");
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
714 e->type = GG_EVENT_DISCONNECT;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
715 break;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
716 }
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
717
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
718 case GG_PUBDIR50_REPLY:
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
719 {
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
720 gg_debug(GG_DEBUG_MISC, "// gg_watch_fd_connected() received pubdir/search reply\n");
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
721 if (gg_pubdir50_handle_reply(e, p, h->length) == -1)
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
722 goto fail;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
723 break;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
724 }
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
725
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
726 case GG_USERLIST_REPLY:
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
727 {
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
728 gg_debug(GG_DEBUG_MISC, "// gg_watch_fd_connected() received userlist reply\n");
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
729
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
730 if (h->length < 1)
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
731 break;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
732
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
733 /* jeśli odpowiedź na eksport, wywołaj zdarzenie tylko
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
734 * gdy otrzymano wszystkie odpowiedzi */
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
735 if (p[0] == GG_USERLIST_PUT_REPLY || p[0] == GG_USERLIST_PUT_MORE_REPLY) {
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
736 if (--sess->userlist_blocks)
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
737 break;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
738
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
739 p[0] = GG_USERLIST_PUT_REPLY;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
740 }
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
741
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
742 if (h->length > 1) {
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
743 char *tmp;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
744 unsigned int len = (sess->userlist_reply) ? strlen(sess->userlist_reply) : 0;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
745
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
746 gg_debug(GG_DEBUG_MISC, "userlist_reply=%p, len=%d\n", sess->userlist_reply, len);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
747
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
748 if (!(tmp = realloc(sess->userlist_reply, len + h->length))) {
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
749 gg_debug(GG_DEBUG_MISC, "// gg_watch_fd_connected() not enough memory for userlist reply\n");
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
750 free(sess->userlist_reply);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
751 sess->userlist_reply = NULL;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
752 goto fail;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
753 }
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
754
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
755 sess->userlist_reply = tmp;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
756 sess->userlist_reply[len + h->length - 1] = 0;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
757 memcpy(sess->userlist_reply + len, p + 1, h->length - 1);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
758 }
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
759
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
760 if (p[0] == GG_USERLIST_GET_MORE_REPLY)
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
761 break;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
762
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
763 e->type = GG_EVENT_USERLIST;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
764 e->event.userlist.type = p[0];
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
765 e->event.userlist.reply = sess->userlist_reply;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
766 sess->userlist_reply = NULL;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
767
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
768 break;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
769 }
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
770
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
771 default:
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
772 gg_debug(GG_DEBUG_MISC, "// gg_watch_fd_connected() received unknown packet 0x%.2x\n", h->type);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
773 }
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
774
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
775 free(h);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
776 return 0;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
777
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
778 fail:
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
779 free(h);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
780 return -1;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
781 }
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
782
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
783 /*
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
784 * gg_watch_fd()
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
785 *
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
786 * funkcja, którą należy wywołać, gdy coś się stanie z obserwowanym
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
787 * deskryptorem. zwraca klientowi informację o tym, co się dzieje.
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
788 *
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
789 * - sess - opis sesji
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
790 *
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
791 * wskaźnik do struktury gg_event, którą trzeba zwolnić później
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
792 * za pomocą gg_event_free(). jesli rodzaj zdarzenia jest równy
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
793 * GG_EVENT_NONE, należy je zignorować. jeśli zwróciło NULL,
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
794 * stało się coś niedobrego -- albo zabrakło pamięci albo zerwało
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
795 * połączenie.
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
796 */
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
797 struct gg_event *gg_watch_fd(struct gg_session *sess)
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
798 {
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
799 struct gg_event *e;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
800 int res = 0;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
801 int port = 0;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
802 int errno2 = 0;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
803
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
804 gg_debug(GG_DEBUG_FUNCTION, "** gg_watch_fd(%p);\n", sess);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
805
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
806 if (!sess) {
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
807 errno = EFAULT;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
808 return NULL;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
809 }
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
810
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
811 if (!(e = (void*) calloc(1, sizeof(*e)))) {
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
812 gg_debug(GG_DEBUG_MISC, "// gg_watch_fd() not enough memory for event data\n");
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
813 return NULL;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
814 }
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
815
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
816 e->type = GG_EVENT_NONE;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
817
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
818 switch (sess->state) {
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
819 case GG_STATE_RESOLVING:
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
820 {
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
821 struct in_addr addr;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
822 int failed = 0;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
823
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
824 gg_debug(GG_DEBUG_MISC, "// gg_watch_fd() GG_STATE_RESOLVING\n");
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
825
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
826 if (read(sess->fd, &addr, sizeof(addr)) < (signed)sizeof(addr) || addr.s_addr == INADDR_NONE) {
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
827 gg_debug(GG_DEBUG_MISC, "// gg_watch_fd() resolving failed\n");
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
828 failed = 1;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
829 errno2 = errno;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
830 }
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
831
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
832 close(sess->fd);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
833 sess->fd = -1;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
834
11546
3c536224f0d0 [gaim-migrate @ 13801]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11360
diff changeset
835 #ifdef __GG_LIBGADU_HAVE_PTHREAD
11360
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
836 if (sess->resolver) {
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
837 pthread_cancel(*((pthread_t*) sess->resolver));
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
838 free(sess->resolver);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
839 sess->resolver = NULL;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
840 }
11546
3c536224f0d0 [gaim-migrate @ 13801]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11360
diff changeset
841 #elif defined _WIN32
3c536224f0d0 [gaim-migrate @ 13801]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11360
diff changeset
842 if (sess->resolver) {
3c536224f0d0 [gaim-migrate @ 13801]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11360
diff changeset
843 HANDLE h = sess->resolver;
3c536224f0d0 [gaim-migrate @ 13801]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11360
diff changeset
844 TerminateThread(h, 0);
3c536224f0d0 [gaim-migrate @ 13801]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11360
diff changeset
845 CloseHandle(h);
3c536224f0d0 [gaim-migrate @ 13801]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11360
diff changeset
846 sess->resolver = NULL;
3c536224f0d0 [gaim-migrate @ 13801]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11360
diff changeset
847 }
3c536224f0d0 [gaim-migrate @ 13801]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11360
diff changeset
848 #else
3c536224f0d0 [gaim-migrate @ 13801]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11360
diff changeset
849 waitpid(sess->pid, NULL, 0);
3c536224f0d0 [gaim-migrate @ 13801]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11360
diff changeset
850 sess->pid = -1;
11360
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
851 #endif
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
852
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
853 if (failed) {
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
854 errno = errno2;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
855 goto fail_resolving;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
856 }
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
857
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
858 /* jeśli jesteśmy w resolverze i mamy ustawiony port
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
859 * proxy, znaczy, że resolvowaliśmy proxy. zatem
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
860 * wpiszmy jego adres. */
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
861 if (sess->proxy_port)
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
862 sess->proxy_addr = addr.s_addr;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
863
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
864 /* zapiszmy sobie adres huba i adres serwera (do
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
865 * bezpośredniego połączenia, jeśli hub leży)
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
866 * z resolvera. */
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
867 if (sess->proxy_addr && sess->proxy_port)
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
868 port = sess->proxy_port;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
869 else {
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
870 sess->server_addr = sess->hub_addr = addr.s_addr;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
871 port = GG_APPMSG_PORT;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
872 }
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
873
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
874 gg_debug(GG_DEBUG_MISC, "// gg_watch_fd() resolved, connecting to %s:%d\n", inet_ntoa(addr), port);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
875
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
876 /* łączymy się albo z hubem, albo z proxy, zależnie
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
877 * od tego, co resolvowaliśmy. */
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
878 if ((sess->fd = gg_connect(&addr, port, sess->async)) == -1) {
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
879 /* jeśli w trybie asynchronicznym gg_connect()
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
880 * zwróci błąd, nie ma sensu próbować dalej. */
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
881 gg_debug(GG_DEBUG_MISC, "// gg_watch_fd() connection failed (errno=%d, %s), critical\n", errno, strerror(errno));
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
882 goto fail_connecting;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
883 }
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
884
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
885 /* jeśli podano serwer i łączmy się przez proxy,
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
886 * jest to bezpośrednie połączenie, inaczej jest
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
887 * do huba. */
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
888 sess->state = (sess->proxy_addr && sess->proxy_port && sess->server_addr) ? GG_STATE_CONNECTING_GG : GG_STATE_CONNECTING_HUB;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
889 sess->check = GG_CHECK_WRITE;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
890 sess->timeout = GG_DEFAULT_TIMEOUT;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
891
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
892 break;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
893 }
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
894
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
895 case GG_STATE_CONNECTING_HUB:
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
896 {
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
897 char buf[1024], *client, *auth;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
898 int res = 0, res_size = sizeof(res);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
899 const char *host, *appmsg;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
900
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
901 gg_debug(GG_DEBUG_MISC, "// gg_watch_fd() GG_STATE_CONNECTING_HUB\n");
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
902
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
903 /* jeśli asynchroniczne, sprawdzamy, czy nie wystąpił
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
904 * przypadkiem jakiś błąd. */
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
905 if (sess->async && (getsockopt(sess->fd, SOL_SOCKET, SO_ERROR, &res, &res_size) || res)) {
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
906 /* no tak, nie udało się połączyć z proxy. nawet
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
907 * nie próbujemy dalej. */
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
908 if (sess->proxy_addr && sess->proxy_port) {
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
909 gg_debug(GG_DEBUG_MISC, "// gg_watch_fd() connection to proxy failed (errno=%d, %s)\n", res, strerror(res));
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
910 goto fail_connecting;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
911 }
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
912
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
913 gg_debug(GG_DEBUG_MISC, "// gg_watch_fd() connection to hub failed (errno=%d, %s), trying direct connection\n", res, strerror(res));
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
914 close(sess->fd);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
915
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
916 if ((sess->fd = gg_connect(&sess->hub_addr, GG_DEFAULT_PORT, sess->async)) == -1) {
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
917 /* przy asynchronicznych, gg_connect()
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
918 * zwraca -1 przy błędach socket(),
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
919 * ioctl(), braku routingu itd. dlatego
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
920 * nawet nie próbujemy dalej. */
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
921 gg_debug(GG_DEBUG_MISC, "// gg_watch_fd() direct connection failed (errno=%d, %s), critical\n", errno, strerror(errno));
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
922 goto fail_connecting;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
923 }
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
924
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
925 sess->state = GG_STATE_CONNECTING_GG;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
926 sess->check = GG_CHECK_WRITE;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
927 sess->timeout = GG_DEFAULT_TIMEOUT;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
928 break;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
929 }
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
930
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
931 gg_debug(GG_DEBUG_MISC, "// gg_watch_fd() connected to hub, sending query\n");
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
932
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
933 if (!(client = gg_urlencode((sess->client_version) ? sess->client_version : GG_DEFAULT_CLIENT_VERSION))) {
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
934 gg_debug(GG_DEBUG_MISC, "// gg_watch_fd() out of memory for client version\n");
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
935 goto fail_connecting;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
936 }
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
937
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
938 if (!gg_proxy_http_only && sess->proxy_addr && sess->proxy_port)
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
939 host = "http://" GG_APPMSG_HOST;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
940 else
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
941 host = "";
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
942
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
943 #ifdef __GG_LIBGADU_HAVE_OPENSSL
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
944 if (sess->ssl)
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
945 appmsg = "appmsg3.asp";
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
946 else
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
947 #endif
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
948 appmsg = "appmsg2.asp";
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
949
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
950 auth = gg_proxy_auth();
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
951
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
952 snprintf(buf, sizeof(buf) - 1,
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
953 "GET %s/appsvc/%s?fmnumber=%u&version=%s&lastmsg=%d HTTP/1.0\r\n"
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
954 "Host: " GG_APPMSG_HOST "\r\n"
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
955 "User-Agent: " GG_HTTP_USERAGENT "\r\n"
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
956 "Pragma: no-cache\r\n"
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
957 "%s"
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
958 "\r\n", host, appmsg, sess->uin, client, sess->last_sysmsg, (auth) ? auth : "");
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
959
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
960 if (auth)
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
961 free(auth);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
962
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
963 free(client);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
964
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
965 /* zwolnij pamięć po wersji klienta. */
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
966 if (sess->client_version) {
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
967 free(sess->client_version);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
968 sess->client_version = NULL;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
969 }
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
970
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
971 gg_debug(GG_DEBUG_MISC, "=> -----BEGIN-HTTP-QUERY-----\n%s\n=> -----END-HTTP-QUERY-----\n", buf);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
972
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
973 /* zapytanie jest krótkie, więc zawsze zmieści się
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
974 * do bufora gniazda. jeśli write() zwróci mniej,
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
975 * stało się coś złego. */
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
976 if (write(sess->fd, buf, strlen(buf)) < (signed)strlen(buf)) {
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
977 gg_debug(GG_DEBUG_MISC, "// gg_watch_fd() sending query failed\n");
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
978
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
979 e->type = GG_EVENT_CONN_FAILED;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
980 e->event.failure = GG_FAILURE_WRITING;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
981 sess->state = GG_STATE_IDLE;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
982 close(sess->fd);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
983 sess->fd = -1;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
984 break;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
985 }
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
986
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
987 sess->state = GG_STATE_READING_DATA;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
988 sess->check = GG_CHECK_READ;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
989 sess->timeout = GG_DEFAULT_TIMEOUT;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
990
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
991 break;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
992 }
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
993
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
994 case GG_STATE_READING_DATA:
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
995 {
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
996 char buf[1024], *tmp, *host;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
997 int port = GG_DEFAULT_PORT;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
998 struct in_addr addr;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
999
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1000 gg_debug(GG_DEBUG_MISC, "// gg_watch_fd() GG_STATE_READING_DATA\n");
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1001
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1002 /* czytamy linię z gniazda i obcinamy \r\n. */
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1003 gg_read_line(sess->fd, buf, sizeof(buf) - 1);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1004 gg_chomp(buf);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1005 gg_debug(GG_DEBUG_TRAFFIC, "// gg_watch_fd() received http header (%s)\n", buf);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1006
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1007 /* sprawdzamy, czy wszystko w porządku. */
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1008 if (strncmp(buf, "HTTP/1.", 7) || strncmp(buf + 9, "200", 3)) {
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1009 gg_debug(GG_DEBUG_MISC, "// gg_watch_fd() that's not what we've expected, trying direct connection\n");
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1010
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1011 close(sess->fd);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1012
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1013 /* jeśli otrzymaliśmy jakieś dziwne informacje,
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1014 * próbujemy się łączyć z pominięciem huba. */
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1015 if (sess->proxy_addr && sess->proxy_port) {
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1016 if ((sess->fd = gg_connect(&sess->proxy_addr, sess->proxy_port, sess->async)) == -1) {
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1017 /* trudno. nie wyszło. */
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1018 gg_debug(GG_DEBUG_MISC, "// gg_watch_fd() connection to proxy failed (errno=%d, %s)\n", errno, strerror(errno));
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1019 goto fail_connecting;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1020 }
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1021
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1022 sess->state = GG_STATE_CONNECTING_GG;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1023 sess->check = GG_CHECK_WRITE;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1024 sess->timeout = GG_DEFAULT_TIMEOUT;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1025 break;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1026 }
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1027
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1028 sess->port = GG_DEFAULT_PORT;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1029
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1030 /* łączymy się na port 8074 huba. */
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1031 if ((sess->fd = gg_connect(&sess->hub_addr, sess->port, sess->async)) == -1) {
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1032 gg_debug(GG_DEBUG_MISC, "// gg_watch_fd() connection failed (errno=%d, %s), trying https\n", errno, strerror(errno));
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1033
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1034 sess->port = GG_HTTPS_PORT;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1035
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1036 /* łączymy się na port 443. */
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1037 if ((sess->fd = gg_connect(&sess->hub_addr, sess->port, sess->async)) == -1) {
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1038 gg_debug(GG_DEBUG_MISC, "// gg_watch_fd() connection failed (errno=%d, %s)\n", errno, strerror(errno));
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1039 goto fail_connecting;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1040 }
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1041 }
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1042
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1043 sess->state = GG_STATE_CONNECTING_GG;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1044 sess->check = GG_CHECK_WRITE;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1045 sess->timeout = GG_DEFAULT_TIMEOUT;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1046 break;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1047 }
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1048
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1049 /* ignorujemy resztę nagłówka. */
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1050 while (strcmp(buf, "\r\n") && strcmp(buf, ""))
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1051 gg_read_line(sess->fd, buf, sizeof(buf) - 1);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1052
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1053 /* czytamy pierwszą linię danych. */
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1054 gg_read_line(sess->fd, buf, sizeof(buf) - 1);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1055 gg_chomp(buf);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1056
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1057 /* jeśli pierwsza liczba w linii nie jest równa zeru,
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1058 * oznacza to, że mamy wiadomość systemową. */
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1059 if (atoi(buf)) {
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1060 char tmp[1024], *foo, *sysmsg_buf = NULL;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1061 int len = 0;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1062
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1063 while (gg_read_line(sess->fd, tmp, sizeof(tmp) - 1)) {
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1064 if (!(foo = realloc(sysmsg_buf, len + strlen(tmp) + 2))) {
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1065 gg_debug(GG_DEBUG_MISC, "// gg_watch_fd() out of memory for system message, ignoring\n");
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1066 break;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1067 }
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1068
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1069 sysmsg_buf = foo;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1070
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1071 if (!len)
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1072 strcpy(sysmsg_buf, tmp);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1073 else
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1074 strcat(sysmsg_buf, tmp);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1075
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1076 len += strlen(tmp);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1077 }
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1078
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1079 e->type = GG_EVENT_MSG;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1080 e->event.msg.msgclass = atoi(buf);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1081 e->event.msg.sender = 0;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1082 e->event.msg.message = sysmsg_buf;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1083 }
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1084
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1085 close(sess->fd);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1086
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1087 gg_debug(GG_DEBUG_TRAFFIC, "// gg_watch_fd() received http data (%s)\n", buf);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1088
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1089 /* analizujemy otrzymane dane. */
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1090 tmp = buf;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1091
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1092 while (*tmp && *tmp != ' ')
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1093 tmp++;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1094 while (*tmp && *tmp == ' ')
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1095 tmp++;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1096 host = tmp;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1097 while (*tmp && *tmp != ' ')
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1098 tmp++;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1099 *tmp = 0;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1100
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1101 if ((tmp = strchr(host, ':'))) {
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1102 *tmp = 0;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1103 port = atoi(tmp + 1);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1104 }
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1105
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1106 addr.s_addr = inet_addr(host);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1107 sess->server_addr = addr.s_addr;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1108
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1109 if (!gg_proxy_http_only && sess->proxy_addr && sess->proxy_port) {
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1110 /* jeśli mamy proxy, łączymy się z nim. */
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1111 if ((sess->fd = gg_connect(&sess->proxy_addr, sess->proxy_port, sess->async)) == -1) {
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1112 /* nie wyszło? trudno. */
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1113 gg_debug(GG_DEBUG_MISC, "// gg_watch_fd() connection to proxy failed (errno=%d, %s)\n", errno, strerror(errno));
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1114 goto fail_connecting;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1115 }
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1116
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1117 sess->state = GG_STATE_CONNECTING_GG;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1118 sess->check = GG_CHECK_WRITE;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1119 sess->timeout = GG_DEFAULT_TIMEOUT;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1120 break;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1121 }
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1122
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1123 sess->port = port;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1124
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1125 /* łączymy się z właściwym serwerem. */
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1126 if ((sess->fd = gg_connect(&addr, sess->port, sess->async)) == -1) {
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1127 gg_debug(GG_DEBUG_MISC, "// gg_watch_fd() connection failed (errno=%d, %s), trying https\n", errno, strerror(errno));
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1128
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1129 sess->port = GG_HTTPS_PORT;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1130
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1131 /* nie wyszło? próbujemy portu 443. */
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1132 if ((sess->fd = gg_connect(&addr, GG_HTTPS_PORT, sess->async)) == -1) {
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1133 /* ostatnia deska ratunku zawiodła?
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1134 * w takim razie zwijamy manatki. */
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1135 gg_debug(GG_DEBUG_MISC, "// gg_watch_fd() connection failed (errno=%d, %s)\n", errno, strerror(errno));
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1136 goto fail_connecting;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1137 }
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1138 }
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1139
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1140 sess->state = GG_STATE_CONNECTING_GG;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1141 sess->check = GG_CHECK_WRITE;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1142 sess->timeout = GG_DEFAULT_TIMEOUT;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1143
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1144 break;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1145 }
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1146
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1147 case GG_STATE_CONNECTING_GG:
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1148 {
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1149 int res = 0, res_size = sizeof(res);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1150
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1151 gg_debug(GG_DEBUG_MISC, "// gg_watch_fd() GG_STATE_CONNECTING_GG\n");
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1152
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1153 /* jeśli wystąpił błąd podczas łączenia się... */
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1154 if (sess->async && (sess->timeout == 0 || getsockopt(sess->fd, SOL_SOCKET, SO_ERROR, &res, &res_size) || res)) {
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1155 /* jeśli nie udało się połączenie z proxy,
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1156 * nie mamy czego próbować więcej. */
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1157 if (sess->proxy_addr && sess->proxy_port) {
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1158 gg_debug(GG_DEBUG_MISC, "// gg_watch_fd() connection to proxy failed (errno=%d, %s)\n", res, strerror(res));
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1159 goto fail_connecting;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1160 }
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1161
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1162 close(sess->fd);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1163 sess->fd = -1;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1164
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1165 #ifdef ETIMEDOUT
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1166 if (sess->timeout == 0)
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1167 errno = ETIMEDOUT;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1168 #endif
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1169
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1170 #ifdef __GG_LIBGADU_HAVE_OPENSSL
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1171 /* jeśli logujemy się po TLS, nie próbujemy
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1172 * się łączyć już z niczym innym w przypadku
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1173 * błędu. nie dość, że nie ma sensu, to i
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1174 * trzeba by się bawić w tworzenie na nowo
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1175 * SSL i SSL_CTX. */
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1176
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1177 if (sess->ssl) {
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1178 gg_debug(GG_DEBUG_MISC, "// gg_watch_fd() connection failed (errno=%d, %s)\n", res, strerror(res));
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1179 goto fail_connecting;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1180 }
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1181 #endif
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1182
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1183 gg_debug(GG_DEBUG_MISC, "// gg_watch_fd() connection failed (errno=%d, %s), trying https\n", res, strerror(res));
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1184
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1185 sess->port = GG_HTTPS_PORT;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1186
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1187 /* próbujemy na port 443. */
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1188 if ((sess->fd = gg_connect(&sess->server_addr, sess->port, sess->async)) == -1) {
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1189 gg_debug(GG_DEBUG_MISC, "// gg_watch_fd() connection failed (errno=%d, %s)\n", errno, strerror(errno));
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1190 goto fail_connecting;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1191 }
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1192 }
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1193
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1194 gg_debug(GG_DEBUG_MISC, "// gg_watch_fd() connected\n");
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1195
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1196 if (gg_proxy_http_only)
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1197 sess->proxy_port = 0;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1198
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1199 /* jeśli mamy proxy, wyślijmy zapytanie. */
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1200 if (sess->proxy_addr && sess->proxy_port) {
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1201 char buf[100], *auth = gg_proxy_auth();
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1202 struct in_addr addr;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1203
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1204 if (sess->server_addr)
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1205 addr.s_addr = sess->server_addr;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1206 else
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1207 addr.s_addr = sess->hub_addr;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1208
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1209 snprintf(buf, sizeof(buf), "CONNECT %s:%d HTTP/1.0\r\n", inet_ntoa(addr), sess->port);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1210
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1211 gg_debug(GG_DEBUG_MISC, "// gg_watch_fd() proxy request:\n// %s", buf);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1212
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1213 /* wysyłamy zapytanie. jest ono na tyle krótkie,
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1214 * że musi się zmieścić w buforze gniazda. jeśli
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1215 * write() zawiedzie, stało się coś złego. */
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1216 if (write(sess->fd, buf, strlen(buf)) < (signed)strlen(buf)) {
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1217 gg_debug(GG_DEBUG_MISC, "// gg_watch_fd() can't send proxy request\n");
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1218 goto fail_connecting;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1219 }
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1220
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1221 if (auth) {
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1222 gg_debug(GG_DEBUG_MISC, "// %s", auth);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1223 if (write(sess->fd, auth, strlen(auth)) < (signed)strlen(auth)) {
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1224 gg_debug(GG_DEBUG_MISC, "// gg_watch_fd() can't send proxy request\n");
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1225 goto fail_connecting;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1226 }
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1227
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1228 free(auth);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1229 }
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1230
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1231 if (write(sess->fd, "\r\n", 2) < 2) {
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1232 gg_debug(GG_DEBUG_MISC, "// gg_watch_fd() can't send proxy request\n");
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1233 goto fail_connecting;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1234 }
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1235 }
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1236
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1237 #ifdef __GG_LIBGADU_HAVE_OPENSSL
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1238 if (sess->ssl) {
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1239 SSL_set_fd(sess->ssl, sess->fd);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1240
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1241 sess->state = GG_STATE_TLS_NEGOTIATION;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1242 sess->check = GG_CHECK_WRITE;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1243 sess->timeout = GG_DEFAULT_TIMEOUT;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1244
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1245 break;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1246 }
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1247 #endif
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1248
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1249 sess->state = GG_STATE_READING_KEY;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1250 sess->check = GG_CHECK_READ;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1251 sess->timeout = GG_DEFAULT_TIMEOUT;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1252
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1253 break;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1254 }
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1255
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1256 #ifdef __GG_LIBGADU_HAVE_OPENSSL
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1257 case GG_STATE_TLS_NEGOTIATION:
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1258 {
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1259 int res;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1260 X509 *peer;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1261
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1262 gg_debug(GG_DEBUG_MISC, "// gg_watch_fd() GG_STATE_TLS_NEGOTIATION\n");
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1263
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1264 if ((res = SSL_connect(sess->ssl)) <= 0) {
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1265 int err = SSL_get_error(sess->ssl, res);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1266
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1267 if (res == 0) {
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1268 gg_debug(GG_DEBUG_MISC, "// gg_watch_fd() disconnected during TLS negotiation\n");
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1269
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1270 e->type = GG_EVENT_CONN_FAILED;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1271 e->event.failure = GG_FAILURE_TLS;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1272 sess->state = GG_STATE_IDLE;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1273 close(sess->fd);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1274 sess->fd = -1;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1275 break;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1276 }
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1277
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1278 if (err == SSL_ERROR_WANT_READ) {
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1279 gg_debug(GG_DEBUG_MISC, "// gg_watch_fd() SSL_connect() wants to read\n");
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1280
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1281 sess->state = GG_STATE_TLS_NEGOTIATION;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1282 sess->check = GG_CHECK_READ;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1283 sess->timeout = GG_DEFAULT_TIMEOUT;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1284
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1285 break;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1286 } else if (err == SSL_ERROR_WANT_WRITE) {
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1287 gg_debug(GG_DEBUG_MISC, "// gg_watch_fd() SSL_connect() wants to write\n");
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1288
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1289 sess->state = GG_STATE_TLS_NEGOTIATION;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1290 sess->check = GG_CHECK_WRITE;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1291 sess->timeout = GG_DEFAULT_TIMEOUT;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1292
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1293 break;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1294 } else {
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1295 char buf[1024];
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1296
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1297 ERR_error_string_n(ERR_get_error(), buf, sizeof(buf));
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1298
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1299 gg_debug(GG_DEBUG_MISC, "// gg_watch_fd() SSL_connect() bailed out: %s\n", buf);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1300
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1301 e->type = GG_EVENT_CONN_FAILED;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1302 e->event.failure = GG_FAILURE_TLS;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1303 sess->state = GG_STATE_IDLE;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1304 close(sess->fd);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1305 sess->fd = -1;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1306 break;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1307 }
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1308 }
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1309
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1310 gg_debug(GG_DEBUG_MISC, "// gg_watch_fd() TLS negotiation succeded:\n// cipher: %s\n", SSL_get_cipher_name(sess->ssl));
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1311
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1312 peer = SSL_get_peer_certificate(sess->ssl);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1313
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1314 if (!peer)
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1315 gg_debug(GG_DEBUG_MISC, "// WARNING! unable to get peer certificate!\n");
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1316 else {
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1317 char buf[1024];
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1318
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1319 X509_NAME_oneline(X509_get_subject_name(peer), buf, sizeof(buf));
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1320 gg_debug(GG_DEBUG_MISC, "// cert subject: %s\n", buf);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1321
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1322 X509_NAME_oneline(X509_get_issuer_name(peer), buf, sizeof(buf));
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1323 gg_debug(GG_DEBUG_MISC, "// cert issuer: %s\n", buf);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1324 }
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1325
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1326 sess->state = GG_STATE_READING_KEY;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1327 sess->check = GG_CHECK_READ;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1328 sess->timeout = GG_DEFAULT_TIMEOUT;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1329
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1330 break;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1331 }
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1332 #endif
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1333
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1334 case GG_STATE_READING_KEY:
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1335 {
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1336 struct gg_header *h;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1337 struct gg_welcome *w;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1338 struct gg_login60 l;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1339 unsigned int hash;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1340 unsigned char *password = sess->password;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1341 int ret;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1342
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1343 gg_debug(GG_DEBUG_MISC, "// gg_watch_fd() GG_STATE_READING_KEY\n");
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1344
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1345 memset(&l, 0, sizeof(l));
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1346 l.dunno2 = 0xbe;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1347
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1348 /* XXX bardzo, bardzo, bardzo głupi pomysł na pozbycie
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1349 * się tekstu wrzucanego przez proxy. */
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1350 if (sess->proxy_addr && sess->proxy_port) {
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1351 char buf[100];
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1352
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1353 strcpy(buf, "");
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1354 gg_read_line(sess->fd, buf, sizeof(buf) - 1);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1355 gg_chomp(buf);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1356 gg_debug(GG_DEBUG_MISC, "// gg_watch_fd() proxy response:\n// %s\n", buf);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1357
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1358 while (strcmp(buf, "")) {
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1359 gg_read_line(sess->fd, buf, sizeof(buf) - 1);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1360 gg_chomp(buf);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1361 if (strcmp(buf, ""))
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1362 gg_debug(GG_DEBUG_MISC, "// %s\n", buf);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1363 }
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1364
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1365 /* XXX niech czeka jeszcze raz w tej samej
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1366 * fazie. głupio, ale działa. */
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1367 sess->proxy_port = 0;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1368
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1369 break;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1370 }
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1371
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1372 /* czytaj pierwszy pakiet. */
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1373 if (!(h = gg_recv_packet(sess))) {
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1374 gg_debug(GG_DEBUG_MISC, "// gg_watch_fd() didn't receive packet (errno=%d, %s)\n", errno, strerror(errno));
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1375
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1376 e->type = GG_EVENT_CONN_FAILED;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1377 e->event.failure = GG_FAILURE_READING;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1378 sess->state = GG_STATE_IDLE;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1379 errno2 = errno;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1380 close(sess->fd);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1381 errno = errno2;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1382 sess->fd = -1;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1383 break;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1384 }
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1385
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1386 if (h->type != GG_WELCOME) {
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1387 gg_debug(GG_DEBUG_MISC, "// gg_watch_fd() invalid packet received\n");
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1388 free(h);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1389 close(sess->fd);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1390 sess->fd = -1;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1391 errno = EINVAL;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1392 e->type = GG_EVENT_CONN_FAILED;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1393 e->event.failure = GG_FAILURE_INVALID;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1394 sess->state = GG_STATE_IDLE;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1395 break;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1396 }
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1397
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1398 w = (struct gg_welcome*) ((char*) h + sizeof(struct gg_header));
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1399 w->key = gg_fix32(w->key);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1400
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1401 hash = gg_login_hash(password, w->key);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1402
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1403 gg_debug(GG_DEBUG_DUMP, "// gg_watch_fd() challenge %.4x --> hash %.8x\n", w->key, hash);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1404
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1405 free(h);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1406
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1407 free(sess->password);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1408 sess->password = NULL;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1409
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1410 {
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1411 struct in_addr dcc_ip;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1412 dcc_ip.s_addr = gg_dcc_ip;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1413 gg_debug(GG_DEBUG_MISC, "// gg_watch_fd() gg_dcc_ip = %s\n", inet_ntoa(dcc_ip));
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1414 }
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1415
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1416 if (gg_dcc_ip == (unsigned long) inet_addr("255.255.255.255")) {
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1417 struct sockaddr_in sin;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1418 int sin_len = sizeof(sin);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1419
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1420 gg_debug(GG_DEBUG_MISC, "// gg_watch_fd() detecting address\n");
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1421
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1422 if (!getsockname(sess->fd, (struct sockaddr*) &sin, &sin_len)) {
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1423 gg_debug(GG_DEBUG_MISC, "// gg_watch_fd() detected address to %s\n", inet_ntoa(sin.sin_addr));
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1424 l.local_ip = sin.sin_addr.s_addr;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1425 } else {
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1426 gg_debug(GG_DEBUG_MISC, "// gg_watch_fd() unable to detect address\n");
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1427 l.local_ip = 0;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1428 }
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1429 } else
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1430 l.local_ip = gg_dcc_ip;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1431
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1432 l.uin = gg_fix32(sess->uin);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1433 l.hash = gg_fix32(hash);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1434 l.status = gg_fix32(sess->initial_status ? sess->initial_status : GG_STATUS_AVAIL);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1435 l.version = gg_fix32(sess->protocol_version);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1436 l.local_port = gg_fix16(gg_dcc_port);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1437 l.image_size = sess->image_size;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1438
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1439 if (sess->external_addr && sess->external_port > 1023) {
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1440 l.external_ip = sess->external_addr;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1441 l.external_port = gg_fix16(sess->external_port);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1442 }
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1443
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1444 gg_debug(GG_DEBUG_TRAFFIC, "// gg_watch_fd() sending GG_LOGIN60 packet\n");
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1445 ret = gg_send_packet(sess, GG_LOGIN60, &l, sizeof(l), sess->initial_descr, (sess->initial_descr) ? strlen(sess->initial_descr) : 0, NULL);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1446
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1447 free(sess->initial_descr);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1448 sess->initial_descr = NULL;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1449
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1450 if (ret == -1) {
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1451 gg_debug(GG_DEBUG_TRAFFIC, "// gg_watch_fd() sending packet failed. (errno=%d, %s)\n", errno, strerror(errno));
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1452 errno2 = errno;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1453 close(sess->fd);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1454 errno = errno2;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1455 sess->fd = -1;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1456 e->type = GG_EVENT_CONN_FAILED;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1457 e->event.failure = GG_FAILURE_WRITING;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1458 sess->state = GG_STATE_IDLE;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1459 break;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1460 }
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1461
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1462 sess->state = GG_STATE_READING_REPLY;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1463
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1464 break;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1465 }
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1466
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1467 case GG_STATE_READING_REPLY:
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1468 {
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1469 struct gg_header *h;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1470
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1471 gg_debug(GG_DEBUG_MISC, "// gg_watch_fd() GG_STATE_READING_REPLY\n");
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1472
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1473 if (!(h = gg_recv_packet(sess))) {
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1474 gg_debug(GG_DEBUG_MISC, "// gg_watch_fd() didn't receive packet (errno=%d, %s)\n", errno, strerror(errno));
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1475 e->type = GG_EVENT_CONN_FAILED;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1476 e->event.failure = GG_FAILURE_READING;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1477 sess->state = GG_STATE_IDLE;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1478 errno2 = errno;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1479 close(sess->fd);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1480 errno = errno2;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1481 sess->fd = -1;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1482 break;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1483 }
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1484
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1485 if (h->type == GG_LOGIN_OK) {
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1486 gg_debug(GG_DEBUG_MISC, "// gg_watch_fd() login succeded\n");
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1487 e->type = GG_EVENT_CONN_SUCCESS;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1488 sess->state = GG_STATE_CONNECTED;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1489 sess->timeout = -1;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1490 sess->status = (sess->initial_status) ? sess->initial_status : GG_STATUS_AVAIL;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1491 free(h);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1492 break;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1493 }
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1494
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1495 if (h->type == GG_LOGIN_FAILED) {
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1496 gg_debug(GG_DEBUG_MISC, "// gg_watch_fd() login failed\n");
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1497 e->event.failure = GG_FAILURE_PASSWORD;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1498 errno = EACCES;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1499 } else if (h->type == GG_NEED_EMAIL) {
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1500 gg_debug(GG_DEBUG_MISC, "// gg_watch_fd() email change needed\n");
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1501 e->event.failure = GG_FAILURE_NEED_EMAIL;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1502 errno = EACCES;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1503 } else {
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1504 gg_debug(GG_DEBUG_MISC, "// gg_watch_fd() invalid packet\n");
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1505 e->event.failure = GG_FAILURE_INVALID;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1506 errno = EINVAL;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1507 }
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1508
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1509 e->type = GG_EVENT_CONN_FAILED;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1510 sess->state = GG_STATE_IDLE;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1511 errno2 = errno;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1512 close(sess->fd);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1513 errno = errno2;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1514 sess->fd = -1;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1515 free(h);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1516
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1517 break;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1518 }
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1519
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1520 case GG_STATE_CONNECTED:
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1521 {
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1522 gg_debug(GG_DEBUG_MISC, "// gg_watch_fd() GG_STATE_CONNECTED\n");
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1523
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1524 sess->last_event = time(NULL);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1525
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1526 if ((res = gg_watch_fd_connected(sess, e)) == -1) {
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1527
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1528 gg_debug(GG_DEBUG_MISC, "// gg_watch_fd() watch_fd_connected failed (errno=%d, %s)\n", errno, strerror(errno));
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1529
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1530 if (errno == EAGAIN) {
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1531 e->type = GG_EVENT_NONE;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1532 res = 0;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1533 } else
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1534 res = -1;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1535 }
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1536 break;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1537 }
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1538 }
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1539
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1540 done:
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1541 if (res == -1) {
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1542 free(e);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1543 e = NULL;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1544 }
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1545
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1546 return e;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1547
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1548 fail_connecting:
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1549 if (sess->fd != -1) {
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1550 errno2 = errno;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1551 close(sess->fd);
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1552 errno = errno2;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1553 sess->fd = -1;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1554 }
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1555 e->type = GG_EVENT_CONN_FAILED;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1556 e->event.failure = GG_FAILURE_CONNECTING;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1557 sess->state = GG_STATE_IDLE;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1558 goto done;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1559
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1560 fail_resolving:
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1561 e->type = GG_EVENT_CONN_FAILED;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1562 e->event.failure = GG_FAILURE_RESOLVING;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1563 sess->state = GG_STATE_IDLE;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1564 goto done;
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1565 }
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1566
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1567 /*
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1568 * Local variables:
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1569 * c-indentation-style: k&r
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1570 * c-basic-offset: 8
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1571 * indent-tabs-mode: notnil
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1572 * End:
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1573 *
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1574 * vim: shiftwidth=8:
cf15c1cdcfbd [gaim-migrate @ 13582]
Bartoz Oler <bartosz@pidgin.im>
parents:
diff changeset
1575 */