annotate mcabber/libjabber/jconn.c @ 1461:8fa24a6d1a93

Improve Remote Controlling Clients The XEP recommends adding the node to the IQ response. Some clients seem not to understand the answer when it is omitted. Problem reported by Rhaamo and js (thanks to js for spotting the node issue!).
author Mikael Berthe <mikael@lilotux.net>
date Sat, 12 Apr 2008 13:35:03 +0200
parents 2ac9bec53c37
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1 /*
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2 * This program is free software; you can redistribute it and/or modify
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3 * it under the terms of the GNU General Public License as published by
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
4 * the Free Software Foundation; either version 2 of the License, or
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
5 * (at your option) any later version.
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
6 *
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
7 * This program is distributed in the hope that it will be useful,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
8 * but WITHOUT ANY WARRANTY; without even the implied warranty of
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
10 * GNU General Public License for more details.
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
11 *
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
12 * You should have received a copy of the GNU General Public License
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
13 * along with this program; if not, write to the Free Software
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
14 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
15 *
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
16 * Jabber
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
17 * Copyright (C) 1998-1999 The Jabber Team http://jabber.org/
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
18 */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
19
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
20 #include "jabber.h"
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
21 #include "connwrap.h"
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
22
374
bd5638c21834 Improve logging system (traces)
Mikael Berthe <mikael@lilotux.net>
parents: 176
diff changeset
23 #include "../src/logprint.h" /* For logging */
176
99a99a160113 [/trunk] Changeset 188 by mikael
mikael
parents: 172
diff changeset
24
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
25 /* local macros for launching event handlers */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
26 #define STATE_EVT(arg) if(j->on_state) { (j->on_state)(j, (arg) ); }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
27
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
28 /* prototypes of the local functions */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
29 static void startElement(void *userdata, const char *name, const char **attribs);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
30 static void endElement(void *userdata, const char *name);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
31 static void charData(void *userdata, const char *s, int slen);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
32
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
33 /*
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
34 * jab_new -- initialize a new jabber connection
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
35 *
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
36 * parameters
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
37 * user -- jabber id of the user
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
38 * pass -- password of the user
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
39 *
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
40 * results
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
41 * a pointer to the connection structure
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
42 * or NULL if allocations failed
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
43 */
403
17aa60c6dc63 Allow a different server name than the jid domain name
Mikael Berthe <mikael@lilotux.net>
parents: 374
diff changeset
44 jconn jab_new(char *user, char *pass, char *server, int port, int ssl)
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
45 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
46 pool p;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
47 jconn j;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
48
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
49 if(!user) return(NULL);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
50
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
51 p = pool_new();
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
52 if(!p) return(NULL);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
53 j = pmalloc_x(p, sizeof(jconn_struct), 0);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
54 if(!j) return(NULL);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
55 j->p = p;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
56
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
57 j->user = jid_new(p, user);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
58 j->pass = pstrdup(p, pass);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
59 j->port = port;
403
17aa60c6dc63 Allow a different server name than the jid domain name
Mikael Berthe <mikael@lilotux.net>
parents: 374
diff changeset
60 j->server = server;
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
61
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
62 j->state = JCONN_STATE_OFF;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
63 j->cw_state = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
64 j->id = 1;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
65 j->fd = -1;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
66 j->ssl = ssl;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
67
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
68 return j;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
69 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
70
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
71 /*
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
72 * jab_delete -- free a jabber connection
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
73 *
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
74 * parameters
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
75 * j -- connection
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
76 *
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
77 */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
78 void jab_delete(jconn j)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
79 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
80 if(!j) return;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
81
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
82 jab_stop(j);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
83 pool_free(j->p);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
84 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
85
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
86 /*
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
87 * jab_state_handler -- set callback handler for state change
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
88 *
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
89 * parameters
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
90 * j -- connection
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
91 * h -- name of the handler function
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
92 */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
93 void jab_state_handler(jconn j, jconn_state_h h)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
94 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
95 if(!j) return;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
96
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
97 j->on_state = h;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
98 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
99
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
100 /*
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
101 * jab_packet_handler -- set callback handler for incoming packets
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
102 *
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
103 * parameters
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
104 * j -- connection
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
105 * h -- name of the handler function
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
106 */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
107 void jab_packet_handler(jconn j, jconn_packet_h h)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
108 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
109 if(!j) return;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
110
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
111 j->on_packet = h;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
112 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
113
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
114 void jab_logger(jconn j, jconn_logger h)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
115 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
116 if(!j) return;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
117
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
118 j->logger = h;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
119 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
120
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
121
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
122 /*
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
123 * jab_start -- start connection
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
124 *
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
125 * parameters
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
126 * j -- connection
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
127 *
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
128 */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
129 void jab_start(jconn j)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
130 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
131 xmlnode x;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
132 char *t,*t2;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
133
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
134 if(!j || (j->state != JCONN_STATE_OFF && j->state != JCONN_STATE_CONNECTING) ) return;
414
ec86d759ed54 Trailing whitespace cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 403
diff changeset
135
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
136 if (!(j->cw_state & CW_CONNECT_WANT_SOMETHING)) { /* same as state != JCONN_STATE_CONNECTING */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
137 j->parser = XML_ParserCreate(NULL);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
138 XML_SetUserData(j->parser, (void *)j);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
139 XML_SetElementHandler(j->parser, startElement, endElement);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
140 XML_SetCharacterDataHandler(j->parser, charData);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
141
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
142 if (j->cw_state & CW_CONNECT_BLOCKING)
403
17aa60c6dc63 Allow a different server name than the jid domain name
Mikael Berthe <mikael@lilotux.net>
parents: 374
diff changeset
143 j->fd = make_netsocket(j->port, j->server, NETSOCKET_CLIENT, j->ssl);
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
144 else
403
17aa60c6dc63 Allow a different server name than the jid domain name
Mikael Berthe <mikael@lilotux.net>
parents: 374
diff changeset
145 j->fd = make_nb_netsocket(j->port, j->server, NETSOCKET_CLIENT, j->ssl, &j->cw_state);
17aa60c6dc63 Allow a different server name than the jid domain name
Mikael Berthe <mikael@lilotux.net>
parents: 374
diff changeset
146
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
147 if(j->fd < 0) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
148 STATE_EVT(JCONN_STATE_OFF);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
149 return;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
150 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
151 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
152 else { /* subsequent calls to cw_nb_connect until it finishes negociation */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
153 if (cw_nb_connect(j->fd, 0, 0, j->ssl, &j->cw_state)) {
938
40175f3dcef7 SSL server certificate verification
Jefferson Ogata <ogata@antibozo.net>
parents: 686
diff changeset
154 if (cw_get_ssl_error())
40175f3dcef7 SSL server certificate verification
Jefferson Ogata <ogata@antibozo.net>
parents: 686
diff changeset
155 scr_LogPrint(LPRINT_LOGNORM, "jab_start: SSL negotiation failed: %s", cw_get_ssl_error());
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
156 STATE_EVT(JCONN_STATE_OFF);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
157 return;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
158 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
159 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
160 if (j->cw_state & CW_CONNECT_WANT_SOMETHING){ /* check if it finished negociation */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
161 j->state = JCONN_STATE_CONNECTING;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
162 STATE_EVT(JCONN_STATE_CONNECTING);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
163 return;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
164 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
165 change_socket_to_blocking(j->fd);
414
ec86d759ed54 Trailing whitespace cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 403
diff changeset
166
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
167 j->state = JCONN_STATE_CONNECTED;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
168 STATE_EVT(JCONN_STATE_CONNECTED)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
169
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
170 /* start stream */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
171 x = jutil_header(NS_CLIENT, j->user->server);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
172 t = xmlnode2str(x);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
173 /* this is ugly, we can create the string here instead of jutil_header */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
174 /* what do you think about it? -madcat */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
175 t2 = strstr(t,"/>");
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
176 *t2++ = '>';
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
177 *t2 = '\0';
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
178 jab_send_raw(j,"<?xml version='1.0'?>");
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
179 jab_send_raw(j,t);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
180 xmlnode_free(x);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
181
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
182 j->state = JCONN_STATE_ON;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
183 STATE_EVT(JCONN_STATE_ON)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
184
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
185 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
186
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
187 /*
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
188 * jab_stop -- stop connection
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
189 *
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
190 * parameters
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
191 * j -- connection
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
192 */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
193 void jab_stop(jconn j)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
194 {
1125
2ac9bec53c37 Fix a memory leak in libjabber
misc@mandriva.org
parents: 1124
diff changeset
195 if (!j) return;
2ac9bec53c37 Fix a memory leak in libjabber
misc@mandriva.org
parents: 1124
diff changeset
196 if (j->parser) {
2ac9bec53c37 Fix a memory leak in libjabber
misc@mandriva.org
parents: 1124
diff changeset
197 XML_ParserFree(j->parser);
2ac9bec53c37 Fix a memory leak in libjabber
misc@mandriva.org
parents: 1124
diff changeset
198 j->parser = NULL;
2ac9bec53c37 Fix a memory leak in libjabber
misc@mandriva.org
parents: 1124
diff changeset
199 }
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
200 j->state = JCONN_STATE_OFF;
1125
2ac9bec53c37 Fix a memory leak in libjabber
misc@mandriva.org
parents: 1124
diff changeset
201 if (j->fd >= 0) {
2ac9bec53c37 Fix a memory leak in libjabber
misc@mandriva.org
parents: 1124
diff changeset
202 cw_close(j->fd);
2ac9bec53c37 Fix a memory leak in libjabber
misc@mandriva.org
parents: 1124
diff changeset
203 j->fd = -1;
2ac9bec53c37 Fix a memory leak in libjabber
misc@mandriva.org
parents: 1124
diff changeset
204 }
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
205 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
206
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
207 /*
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
208 * jab_getfd -- get file descriptor of connection socket
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
209 *
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
210 * parameters
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
211 * j -- connection
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
212 *
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
213 * returns
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
214 * fd of the socket or -1 if socket was not connected
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
215 */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
216 int jab_getfd(jconn j)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
217 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
218 if(j)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
219 return j->fd;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
220 else
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
221 return -1;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
222 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
223
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
224 /*
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
225 * jab_getjid -- get jid structure of user
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
226 *
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
227 * parameters
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
228 * j -- connection
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
229 */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
230 jid jab_getjid(jconn j)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
231 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
232 if(j)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
233 return(j->user);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
234 else
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
235 return NULL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
236 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
237
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
238 /* jab_getsid -- get stream id
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
239 * This is the id of server's <stream:stream> tag and used for
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
240 * digest authorization.
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
241 *
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
242 * parameters
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
243 * j -- connection
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
244 */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
245 char *jab_getsid(jconn j)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
246 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
247 if(j)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
248 return(j->sid);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
249 else
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
250 return NULL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
251 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
252
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
253 /*
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
254 * jab_getid -- get a unique id
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
255 *
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
256 * parameters
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
257 * j -- connection
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
258 */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
259 char *jab_getid(jconn j)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
260 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
261 snprintf(j->idbuf, 8, "%d", j->id++);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
262 return &j->idbuf[0];
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
263 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
264
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
265 /*
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
266 * jab_send -- send xml data
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
267 *
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
268 * parameters
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
269 * j -- connection
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
270 * x -- xmlnode structure
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
271 */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
272 void jab_send(jconn j, xmlnode x)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
273 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
274 if (j && j->state != JCONN_STATE_OFF)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
275 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
276 char *buf = xmlnode2str(x);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
277 if (buf) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
278 cw_write(j->fd, buf, strlen(buf), j->ssl);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
279 if (j->logger)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
280 (j->logger)(j, 0, buf);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
281 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
282
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
283 #ifdef JDEBUG
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
284 printf ("out: %s\n", buf);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
285 #endif
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
286 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
287 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
288
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
289 /*
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
290 * jab_send_raw -- send a string
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
291 *
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
292 * parameters
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
293 * j -- connection
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
294 * str -- xml string
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
295 */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
296 void jab_send_raw(jconn j, const char *str)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
297 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
298 if (j && j->state != JCONN_STATE_OFF) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
299 cw_write(j->fd, str, strlen(str), j->ssl);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
300
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
301 if (j->logger)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
302 (j->logger)(j, 0, str);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
303 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
304
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
305 #ifdef JDEBUG
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
306 printf ("out: %s\n", str);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
307 #endif
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
308 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
309
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
310 /*
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
311 * jab_recv -- read and parse incoming data
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
312 *
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
313 * parameters
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
314 * j -- connection
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
315 */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
316 void jab_recv(jconn j)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
317 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
318 static char buf[32768];
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
319 int len;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
320
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
321 if(!j || j->state == JCONN_STATE_OFF)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
322 return;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
323
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
324 len = cw_read(j->fd, buf, sizeof(buf)-1, j->ssl);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
325 if(len>0)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
326 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
327 buf[len] = '\0';
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
328
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
329 if (j->logger)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
330 (j->logger)(j, 1, buf);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
331
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
332 #ifdef JDEBUG
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
333 printf (" in: %s\n", buf);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
334 #endif
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
335 XML_Parse(j->parser, buf, len, 0);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
336 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
337 else if(len<=0)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
338 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
339 STATE_EVT(JCONN_STATE_OFF);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
340 jab_stop(j);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
341 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
342 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
343
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
344 /*
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
345 * jab_poll -- check socket for incoming data
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
346 *
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
347 * parameters
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
348 * j -- connection
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
349 * timeout -- poll timeout
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
350 */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
351 void jab_poll(jconn j, int timeout)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
352 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
353 fd_set fds;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
354 struct timeval tv;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
355 int r;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
356
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
357 if (!j || j->state == JCONN_STATE_OFF)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
358 return;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
359
985
b33ca4e1c37d Fix potential libjabber issue
Mikael Berthe <mikael@lilotux.net>
parents: 938
diff changeset
360 if (j->fd == -1) {
b33ca4e1c37d Fix potential libjabber issue
Mikael Berthe <mikael@lilotux.net>
parents: 938
diff changeset
361 STATE_EVT(JCONN_STATE_OFF);
b33ca4e1c37d Fix potential libjabber issue
Mikael Berthe <mikael@lilotux.net>
parents: 938
diff changeset
362 return;
b33ca4e1c37d Fix potential libjabber issue
Mikael Berthe <mikael@lilotux.net>
parents: 938
diff changeset
363 }
b33ca4e1c37d Fix potential libjabber issue
Mikael Berthe <mikael@lilotux.net>
parents: 938
diff changeset
364
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
365 FD_ZERO(&fds);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
366 FD_SET(j->fd, &fds);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
367
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
368 if(timeout <= 0) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
369 r = select(j->fd + 1, &fds, NULL, NULL, NULL);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
370
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
371 } else {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
372 tv.tv_sec = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
373 tv.tv_usec = timeout;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
374 r = select(j->fd + 1, &fds, NULL, NULL, &tv);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
375
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
376 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
377
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
378 if(r > 0) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
379 jab_recv(j);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
380
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
381 } else if(r) {
172
dabf8c3b475c [/trunk] Changeset 184 by mikael
mikael
parents: 171
diff changeset
382 /* Don't disconnect for interrupted system call */
dabf8c3b475c [/trunk] Changeset 184 by mikael
mikael
parents: 171
diff changeset
383 if(errno == EINTR) return;
171
5a364195d003 [/trunk] Changeset 183 by mikael
mikael
parents: 25
diff changeset
384
374
bd5638c21834 Improve logging system (traces)
Mikael Berthe <mikael@lilotux.net>
parents: 176
diff changeset
385 scr_LogPrint(LPRINT_LOGNORM, "jab_poll: select returned errno=%d",
bd5638c21834 Improve logging system (traces)
Mikael Berthe <mikael@lilotux.net>
parents: 176
diff changeset
386 errno);
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
387 STATE_EVT(JCONN_STATE_OFF);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
388 jab_stop(j);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
389
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
390 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
391 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
392
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
393 /*
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
394 * jab_auth -- authorize user
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
395 *
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
396 * parameters
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
397 * j -- connection
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
398 *
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
399 * returns
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
400 * id of the iq packet
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
401 */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
402 char *jab_auth(jconn j)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
403 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
404 xmlnode x,y,z;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
405 char *hash, *user, *id;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
406
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
407 if(!j) return(NULL);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
408
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
409 x = jutil_iqnew(JPACKET__SET, NS_AUTH);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
410 id = jab_getid(j);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
411 xmlnode_put_attrib(x, "id", id);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
412 y = xmlnode_get_tag(x,"query");
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
413
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
414 user = j->user->user;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
415
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
416 if (user)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
417 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
418 z = xmlnode_insert_tag(y, "username");
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
419 xmlnode_insert_cdata(z, user, -1);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
420 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
421
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
422 z = xmlnode_insert_tag(y, "resource");
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
423 xmlnode_insert_cdata(z, j->user->resource, -1);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
424
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
425 if (j->sid)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
426 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
427 z = xmlnode_insert_tag(y, "digest");
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
428 hash = pmalloc(x->p, strlen(j->sid)+strlen(j->pass)+1);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
429 strcpy(hash, j->sid);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
430 strcat(hash, j->pass);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
431 hash = shahash(hash);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
432 xmlnode_insert_cdata(z, hash, 40);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
433 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
434 else
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
435 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
436 z = xmlnode_insert_tag(y, "password");
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
437 xmlnode_insert_cdata(z, j->pass, -1);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
438 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
439
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
440 jab_send(j, x);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
441 xmlnode_free(x);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
442 return id;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
443 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
444
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
445 /*
686
98de2d166a11 Use the new IQ system for authentication
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
446 * jab_auth_mcabber -- authorize user
98de2d166a11 Use the new IQ system for authentication
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
447 *
98de2d166a11 Use the new IQ system for authentication
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
448 * parameters
98de2d166a11 Use the new IQ system for authentication
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
449 * j -- connection
98de2d166a11 Use the new IQ system for authentication
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
450 * x -- xmlnode iq packet
98de2d166a11 Use the new IQ system for authentication
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
451 *
98de2d166a11 Use the new IQ system for authentication
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
452 * returns
98de2d166a11 Use the new IQ system for authentication
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
453 * non-zero in case of failure
98de2d166a11 Use the new IQ system for authentication
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
454 */
98de2d166a11 Use the new IQ system for authentication
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
455 int jab_auth_mcabber(jconn j, xmlnode x)
98de2d166a11 Use the new IQ system for authentication
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
456 {
98de2d166a11 Use the new IQ system for authentication
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
457 xmlnode y,z;
98de2d166a11 Use the new IQ system for authentication
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
458 char *hash, *user;
98de2d166a11 Use the new IQ system for authentication
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
459
98de2d166a11 Use the new IQ system for authentication
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
460 if(!j) return -1;
98de2d166a11 Use the new IQ system for authentication
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
461
98de2d166a11 Use the new IQ system for authentication
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
462 y = xmlnode_get_tag(x, "query");
98de2d166a11 Use the new IQ system for authentication
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
463
98de2d166a11 Use the new IQ system for authentication
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
464 user = j->user->user;
98de2d166a11 Use the new IQ system for authentication
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
465
98de2d166a11 Use the new IQ system for authentication
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
466 if (user)
98de2d166a11 Use the new IQ system for authentication
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
467 {
98de2d166a11 Use the new IQ system for authentication
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
468 z = xmlnode_insert_tag(y, "username");
98de2d166a11 Use the new IQ system for authentication
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
469 xmlnode_insert_cdata(z, user, -1);
98de2d166a11 Use the new IQ system for authentication
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
470 }
98de2d166a11 Use the new IQ system for authentication
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
471
98de2d166a11 Use the new IQ system for authentication
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
472 z = xmlnode_insert_tag(y, "resource");
98de2d166a11 Use the new IQ system for authentication
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
473 xmlnode_insert_cdata(z, j->user->resource, -1);
98de2d166a11 Use the new IQ system for authentication
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
474
98de2d166a11 Use the new IQ system for authentication
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
475 if (j->sid)
98de2d166a11 Use the new IQ system for authentication
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
476 {
98de2d166a11 Use the new IQ system for authentication
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
477 z = xmlnode_insert_tag(y, "digest");
98de2d166a11 Use the new IQ system for authentication
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
478 hash = pmalloc(x->p, strlen(j->sid)+strlen(j->pass)+1);
98de2d166a11 Use the new IQ system for authentication
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
479 strcpy(hash, j->sid);
98de2d166a11 Use the new IQ system for authentication
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
480 strcat(hash, j->pass);
98de2d166a11 Use the new IQ system for authentication
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
481 hash = shahash(hash);
98de2d166a11 Use the new IQ system for authentication
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
482 xmlnode_insert_cdata(z, hash, 40);
98de2d166a11 Use the new IQ system for authentication
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
483 }
98de2d166a11 Use the new IQ system for authentication
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
484 else
98de2d166a11 Use the new IQ system for authentication
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
485 {
98de2d166a11 Use the new IQ system for authentication
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
486 z = xmlnode_insert_tag(y, "password");
98de2d166a11 Use the new IQ system for authentication
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
487 xmlnode_insert_cdata(z, j->pass, -1);
98de2d166a11 Use the new IQ system for authentication
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
488 }
98de2d166a11 Use the new IQ system for authentication
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
489 return 0;
98de2d166a11 Use the new IQ system for authentication
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
490 }
98de2d166a11 Use the new IQ system for authentication
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
491
98de2d166a11 Use the new IQ system for authentication
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
492 /*
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
493 * jab_reg -- register user
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
494 *
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
495 * parameters
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
496 * j -- connection
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
497 *
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
498 * returns
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
499 * id of the iq packet
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
500 */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
501 char *jab_reg(jconn j)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
502 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
503 xmlnode x,y,z;
176
99a99a160113 [/trunk] Changeset 188 by mikael
mikael
parents: 172
diff changeset
504 char *user, *id;
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
505
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
506 if (!j) return(NULL);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
507
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
508 x = jutil_iqnew(JPACKET__SET, NS_REGISTER);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
509 id = jab_getid(j);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
510 xmlnode_put_attrib(x, "id", id);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
511 y = xmlnode_get_tag(x,"query");
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
512
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
513 user = j->user->user;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
514
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
515 if (user)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
516 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
517 z = xmlnode_insert_tag(y, "username");
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
518 xmlnode_insert_cdata(z, user, -1);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
519 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
520
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
521 z = xmlnode_insert_tag(y, "resource");
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
522 xmlnode_insert_cdata(z, j->user->resource, -1);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
523
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
524 if (j->pass)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
525 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
526 z = xmlnode_insert_tag(y, "password");
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
527 xmlnode_insert_cdata(z, j->pass, -1);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
528 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
529
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
530 jab_send(j, x);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
531 xmlnode_free(x);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
532 j->state = JCONN_STATE_ON;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
533 STATE_EVT(JCONN_STATE_ON)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
534 return id;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
535 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
536
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
537
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
538 /* local functions */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
539
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
540 static void startElement(void *userdata, const char *name, const char **attribs)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
541 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
542 xmlnode x;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
543 jconn j = (jconn)userdata;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
544
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
545 if(j->current)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
546 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
547 /* Append the node to the current one */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
548 x = xmlnode_insert_tag(j->current, name);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
549 xmlnode_put_expat_attribs(x, attribs);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
550
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
551 j->current = x;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
552 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
553 else
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
554 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
555 x = xmlnode_new_tag(name);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
556 xmlnode_put_expat_attribs(x, attribs);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
557 if(strcmp(name, "stream:stream") == 0) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
558 /* special case: name == stream:stream */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
559 /* id attrib of stream is stored for digest auth */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
560 j->sid = xmlnode_get_attrib(x, "id");
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
561 /* STATE_EVT(JCONN_STATE_AUTH) */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
562 } else {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
563 j->current = x;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
564 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
565 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
566 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
567
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
568 static void endElement(void *userdata, const char *name)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
569 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
570 jconn j = (jconn)userdata;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
571 xmlnode x;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
572 jpacket p;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
573
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
574 if(j->current == NULL) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
575 /* we got </stream:stream> */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
576 STATE_EVT(JCONN_STATE_OFF)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
577 return;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
578 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
579
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
580 x = xmlnode_get_parent(j->current);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
581
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
582 if(x == NULL)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
583 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
584 /* it is time to fire the event */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
585 p = jpacket_new(j->current);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
586
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
587 if(j->on_packet)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
588 (j->on_packet)(j, p);
1124
3fcb7c8af2ba Fix a memory leak in libjabber
misc@mandriva.org
parents: 985
diff changeset
589 xmlnode_free(j->current);
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
590 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
591
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
592 j->current = x;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
593 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
594
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
595 static void charData(void *userdata, const char *s, int slen)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
596 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
597 jconn j = (jconn)userdata;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
598
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
599 if (j->current)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
600 xmlnode_insert_cdata(j->current, s, slen);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
601 }