@@ -255,19 +255,10 @@ static void _handle_sasl_children(xmpp_conn_t *conn, const char *text)
255255 }
256256}
257257
258- static void _handle_compression_children (xmpp_conn_t * conn , const char * text )
259- {
260- if (strcasecmp (text , "zlib" ) == 0 ) {
261- conn -> compression_supported = 1 ;
262- }
263- }
264-
265258static int
266259_handle_features (xmpp_conn_t * conn , xmpp_stanza_t * stanza , void * userdata )
267260{
268- xmpp_stanza_t * child , * children ;
269- const char * ns ;
270- char * text ;
261+ xmpp_stanza_t * child ;
271262
272263 UNUSED (userdata );
273264
@@ -297,13 +288,6 @@ _handle_features(xmpp_conn_t *conn, xmpp_stanza_t *stanza, void *userdata)
297288 if (conn -> sasl_support & ~(SASL_MASK_PLAIN | SASL_MASK_ANONYMOUS ))
298289 conn -> sasl_support &= ~SASL_MASK_PLAIN ;
299290
300- /* check for compression */
301- child = xmpp_stanza_get_child_by_name_and_ns (stanza , "compression" ,
302- XMPP_NS_COMPRESSION );
303- if (conn -> compression_allowed && child ) {
304- _foreach_child (conn , child , "method" , _handle_compression_children );
305- }
306-
307291 _auth (conn );
308292
309293 return 0 ;
@@ -371,7 +355,7 @@ _handle_sasl_result(xmpp_conn_t *conn, xmpp_stanza_t *stanza, void *userdata)
371355 (char * )userdata );
372356
373357 /* reset parser */
374- conn_prepare_reset (conn , conn -> compression_allowed
358+ conn_prepare_reset (conn , conn -> compression . allowed
375359 ? _handle_open_compress
376360 : _handle_open_sasl );
377361
@@ -1057,6 +1041,8 @@ static int _handle_compress_result(xmpp_conn_t *const conn,
10571041{
10581042 const char * name = xmpp_stanza_get_name (stanza );
10591043
1044+ UNUSED (userdata );
1045+
10601046 if (!name )
10611047 return 0 ;
10621048 if (strcmp (name , "compressed" ) == 0 ) {
@@ -1067,7 +1053,7 @@ static int _handle_compress_result(xmpp_conn_t *const conn,
10671053 conn_prepare_reset (conn , _handle_open_sasl );
10681054
10691055 /* make compression effective */
1070- conn -> compress = 1 ;
1056+ compression_init ( conn ) ;
10711057
10721058 /* send stream tag */
10731059 conn_open_stream (conn );
@@ -1081,15 +1067,26 @@ static int _handle_features_compress(xmpp_conn_t *conn,
10811067{
10821068 const char * compress = "<compress xmlns='" XMPP_NS_COMPRESSION
10831069 "'><method>zlib</method></compress>" ;
1084-
1085- UNUSED (userdata );
1070+ xmpp_stanza_t * child ;
10861071
10871072 /* remove missing features handler */
10881073 xmpp_timed_handler_delete (conn , _handle_missing_features );
10891074
1090- send_raw (conn , compress , strlen (compress ), XMPP_QUEUE_STROPHE , NULL );
1091- handler_add (conn , _handle_compress_result , XMPP_NS_COMPRESSION , NULL , NULL ,
1092- NULL );
1075+ /* check for compression */
1076+ child = xmpp_stanza_get_child_by_name_and_ns (stanza , "compression" ,
1077+ XMPP_NS_FEATURE_COMPRESSION );
1078+ if (conn -> compression .allowed && child ) {
1079+ _foreach_child (conn , child , "method" ,
1080+ compression_handle_feature_children );
1081+ }
1082+
1083+ if (conn -> compression .supported ) {
1084+ send_raw (conn , compress , strlen (compress ), XMPP_QUEUE_STROPHE , NULL );
1085+ handler_add (conn , _handle_compress_result , XMPP_NS_COMPRESSION , NULL ,
1086+ NULL , NULL );
1087+ } else {
1088+ return _handle_features_sasl (conn , stanza , userdata );
1089+ }
10931090
10941091 return 0 ;
10951092}
0 commit comments