@@ -26,46 +26,42 @@ static void jabber_hfu_disco_info_cb(JabberStream *js, const char *from,
2626
2727 query = xmlnode_get_child_with_namespace (packet , "query" , NS_DISCO_INFO );
2828
29- if (type == JABBER_IQ_RESULT && query )
30- {
31- js_data = g_hash_table_lookup (HFUJabberStreamDataTable , js );
32- if (!js_data ) return ;
29+ if (type != JABBER_IQ_RESULT || query == NULL )
30+ return ;
31+
32+ js_data = g_hash_table_lookup (HFUJabberStreamDataTable , js );
33+ // Always prefer latest standard, skip if already found
34+ if (!js_data || str_equal (js_data -> ns , NS_HTTP_FILE_UPLOAD_V0 ))
35+ return ;
3336
3437 for (feature = xmlnode_get_child (query , "feature" ) ; feature ; feature = xmlnode_get_next_twin (feature ))
3538 {
36- const char * var = xmlnode_get_attrib (feature , "var" );
37- if (!var )
38- continue ;
39+ const char * var = xmlnode_get_attrib (feature , "var" );
40+ if (!var )
41+ continue ;
3942
40- if (str_equal (var , NS_HTTP_FILE_UPLOAD ))
41- js_data -> ns = NS_HTTP_FILE_UPLOAD ;
42- else if (str_equal (var , NS_HTTP_FILE_UPLOAD_V0 ))
43- js_data -> ns = NS_HTTP_FILE_UPLOAD_V0 ;
43+ if (str_equal (var , NS_HTTP_FILE_UPLOAD ) && js_data -> ns == NULL )
44+ js_data -> ns = NS_HTTP_FILE_UPLOAD ;
45+ else if (str_equal (var , NS_HTTP_FILE_UPLOAD_V0 ))
46+ js_data -> ns = NS_HTTP_FILE_UPLOAD_V0 ;
47+ else
48+ continue ;
49+
50+ g_free (js_data -> host );
51+ js_data -> host = g_strdup (from );
4452
45- if (str_equal (var , NS_HTTP_FILE_UPLOAD ) || str_equal (var , NS_HTTP_FILE_UPLOAD_V0 ))
53+ x = xmlnode_get_child_with_namespace (query , "x" , "jabber:x:data" );
54+ if (x )
55+ {
56+ for (field = xmlnode_get_child (x , "field" ); field ; field = xmlnode_get_next_twin (field ))
4657 {
47- js_data -> host = g_strdup (from );
48-
49- x = xmlnode_get_child_with_namespace (query , "x" , "jabber:x:data" );
50- if (x )
51- {
52- for (field = xmlnode_get_child (x , "field" ); field ; field = xmlnode_get_next_twin (field ))
53- {
54- const char * var = xmlnode_get_attrib (field , "var" );
55-
56- if (var && str_equal (var , "max-file-size" ))
57- {
58- if ((value = xmlnode_get_child (field , "value" )))
59- {
60- js_data -> max_file_size = (gsize ) atol (xmlnode_get_data (value ));
61- }
62- }
63- }
64- }
58+ const char * var = xmlnode_get_attrib (field , "var" );
59+
60+ if (var && str_equal (var , "max-file-size" ))
61+ if ((value = xmlnode_get_child (field , "value" )))
62+ js_data -> max_file_size = (gsize ) atol (xmlnode_get_data (value ));
6563 }
6664 }
67-
68-
6965 }
7066}
7167
0 commit comments