From ac3e7dd9e899013ca08ed7fbe3b0cfcbd823f7bd Mon Sep 17 00:00:00 2001 From: James Booth Date: Wed, 5 Aug 2015 00:48:50 +0100 Subject: Handle software version requests for gateways that return from domainpart --- src/xmpp/iq.c | 10 ++++++++-- tests/functionaltests/functionaltests.c | 1 + tests/functionaltests/test_presence.c | 1 + tests/functionaltests/test_software.c | 28 ++++++++++++++++++++++++++++ tests/functionaltests/test_software.h | 1 + 5 files changed, 39 insertions(+), 2 deletions(-) diff --git a/src/xmpp/iq.c b/src/xmpp/iq.c index 7ed44363..3221fc2c 100644 --- a/src/xmpp/iq.c +++ b/src/xmpp/iq.c @@ -302,7 +302,7 @@ iq_send_software_version(const char * const fulljid) xmpp_stanza_t *iq = stanza_create_software_version_iq(ctx, fulljid); char *id = xmpp_stanza_get_id(iq); - xmpp_id_handler_add(conn, _version_result_handler, id, NULL); + xmpp_id_handler_add(conn, _version_result_handler, id, strdup(fulljid)); xmpp_send(conn, iq); xmpp_stanza_release(iq); @@ -893,13 +893,19 @@ _version_result_handler(xmpp_conn_t * const conn, xmpp_stanza_t * const stanza, presence = string_from_resource_presence(occupant->presence); } else { PContact contact = roster_get_contact(jidp->barejid); + if (!contact) { + jid_destroy(jidp); + jidp = jid_create((char*)userdata); + contact = roster_get_contact(jidp->barejid); + } Resource *resource = p_contact_get_resource(contact, jidp->resourcepart); presence = string_from_resource_presence(resource->presence); } - cons_show_software_version(jid, presence, name_str, version_str, os_str); + cons_show_software_version(jidp->fulljid, presence, name_str, version_str, os_str); jid_destroy(jidp); + free(userdata); return 0; } diff --git a/tests/functionaltests/functionaltests.c b/tests/functionaltests/functionaltests.c index cbedf401..a9dfea68 100644 --- a/tests/functionaltests/functionaltests.c +++ b/tests/functionaltests/functionaltests.c @@ -80,6 +80,7 @@ int main(int argc, char* argv[]) { PROF_FUNC_TEST(send_software_version_request), PROF_FUNC_TEST(display_software_version_result), PROF_FUNC_TEST(shows_message_when_software_version_error), + PROF_FUNC_TEST(display_software_version_result_when_from_domainpart), }; return run_tests(all_tests); diff --git a/tests/functionaltests/test_presence.c b/tests/functionaltests/test_presence.c index 936d9405..7f37f2fd 100644 --- a/tests/functionaltests/test_presence.c +++ b/tests/functionaltests/test_presence.c @@ -242,6 +242,7 @@ presence_received(void **state) assert_true(prof_output_exact("Buddy1 (mobile) is online, \"I'm here\"")); } +// Typical use case for gateways that don't support resources void presence_missing_resource_defaults(void **state) { diff --git a/tests/functionaltests/test_software.c b/tests/functionaltests/test_software.c index 9b063c20..08c3edff 100644 --- a/tests/functionaltests/test_software.c +++ b/tests/functionaltests/test_software.c @@ -82,3 +82,31 @@ shows_message_when_software_version_error(void **state) prof_output_exact("Could not get software version: service-unavailable"); } + +// Typical use case for gateways that don't support resources +void +display_software_version_result_when_from_domainpart(void **state) +{ + prof_connect(); + stbbr_send( + "" + "10" + "I'm here" + "" + ); + prof_output_exact("Buddy1 is online, \"I'm here\""); + + stbbr_for_query("jabber:iq:version", + "" + "" + "Some Gateway" + "1.0" + "" + "" + ); + prof_input("/software buddy1@localhost/__prof_default"); + + prof_output_exact("buddy1@localhost/__prof_default:"); + prof_output_exact("Name : Some Gateway"); + prof_output_exact("Version : 1.0"); +} diff --git a/tests/functionaltests/test_software.h b/tests/functionaltests/test_software.h index 985d7002..6d75f049 100644 --- a/tests/functionaltests/test_software.h +++ b/tests/functionaltests/test_software.h @@ -1,4 +1,5 @@ void send_software_version_request(void **state); void display_software_version_result(void **state); void shows_message_when_software_version_error(void **state); +void display_software_version_result_when_from_domainpart(void **state); -- cgit 1.4.1-2-gfad0