configure.in | 2 tubes/CppunitTest_tubes_test.mk | 4 tubes/Library_tubes.mk | 1 tubes/inc/tubes/contact-list.hxx | 60 +++++++++++++ tubes/qa/test_manager.cxx | 56 ++++++++++++ tubes/source/contact-list.cxx | 169 +++++++++++++++++++++++++++++++++++++++ 6 files changed, 291 insertions(+), 1 deletion(-)
New commits: commit 3cd4a8e788d01e87a2e6dbc768b99668443b0839 Author: Will Thompson <will.thomp...@collabora.co.uk> Date: Wed Mar 21 11:13:04 2012 +0000 tubes: add API to find contacts with LibO tube support diff --git a/configure.in b/configure.in index af324fc..7fdabdb 100644 --- a/configure.in +++ b/configure.in @@ -8369,7 +8369,7 @@ AC_MSG_CHECKING([whether to enable Telepathy support]) if test "$_os" != "WINNT" -a "$_os" != "Darwin" -a "$enable_telepathy" = "yes"; then ENABLE_TELEPATHY="TRUE" AC_MSG_RESULT([yes]) - PKG_CHECK_MODULES( TELEPATHY, telepathy-glib >= 0.16.4 glib-2.0 gobject-2.0 gthread-2.0 dbus-1 dbus-glib-1 ) + PKG_CHECK_MODULES( TELEPATHY, telepathy-glib >= 0.16.4 glib-2.0 gobject-2.0 gthread-2.0 gio-2.0 dbus-1 dbus-glib-1 ) else AC_MSG_RESULT([no]) fi diff --git a/tubes/CppunitTest_tubes_test.mk b/tubes/CppunitTest_tubes_test.mk index 32810f9..7b558d7 100644 --- a/tubes/CppunitTest_tubes_test.mk +++ b/tubes/CppunitTest_tubes_test.mk @@ -36,6 +36,10 @@ $(eval $(call gb_CppunitTest_add_linked_libs,tubes_test, \ $(gb_STDLIBS) \ )) +$(eval $(call gb_CppunitTest_add_libs,tubes_test, \ + $$(TELEPATHY_LIBS) \ +)) + $(eval $(call gb_CppunitTest_set_include,tubes_test,\ -I$(realpath $(SRCDIR)/tubes/inc) \ $$(TELEPATHY_CFLAGS) \ diff --git a/tubes/Library_tubes.mk b/tubes/Library_tubes.mk index 2ab2616..48ef793 100644 --- a/tubes/Library_tubes.mk +++ b/tubes/Library_tubes.mk @@ -58,6 +58,7 @@ $(eval $(call gb_Library_add_exception_objects,tubes,\ tubes/source/conference \ tubes/source/manager \ tubes/source/packet \ + tubes/source/contact-list \ )) # vim:set shiftwidth=4 tabstop=4 noexpandtab: */ diff --git a/tubes/inc/tubes/contact-list.hxx b/tubes/inc/tubes/contact-list.hxx new file mode 100644 index 0000000..bf1e0f7 --- /dev/null +++ b/tubes/inc/tubes/contact-list.hxx @@ -0,0 +1,60 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * Version: MPL 1.1 / GPLv3+ / LGPLv3+ + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License or as specified alternatively below. You may obtain a copy of + * the License at http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * Major Contributor(s): + * Copyright (C) 2012 Collabora Ltd. + * + * All Rights Reserved. + * + * For minor contributions see the git repository. + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 3 or later (the "GPLv3+"), or + * the GNU Lesser General Public License Version 3 or later (the "LGPLv3+"), + * in which case the provisions of the GPLv3+ or the LGPLv3+ are applicable + * instead of those above. + */ + +#ifndef INCLUDED_TUBES_CONTACT_LIST_HXX +#define INCLUDED_TUBES_CONTACT_LIST_HXX + +#include <utility> +#include <vector> + +#include <telepathy-glib/telepathy-glib.h> + +#include "tubes/tubesdllapi.h" + +typedef ::std::pair< TpAccount *, TpContact * > AccountContactPair; +typedef ::std::vector< AccountContactPair > AccountContactPairV; + +class TUBES_DLLPUBLIC ContactList +{ +public: + ContactList(); + ~ContactList(); + + typedef void (*PrepareCallback)( GError *errorOr0, void *user_data ); + void prepare( PrepareCallback callback, void *user_data ); + + AccountContactPairV getContacts(); + +private: + TpAccountManager* mpAccountManager; + +}; + +#endif // INCLUDED_TUBES_CONTACT_LIST_HXX + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/tubes/qa/test_manager.cxx b/tubes/qa/test_manager.cxx index 07dd264..f017a9c 100644 --- a/tubes/qa/test_manager.cxx +++ b/tubes/qa/test_manager.cxx @@ -28,6 +28,7 @@ #include <sal/precppunit.hxx> +#include <tubes/contact-list.hxx> #include <tubes/manager.hxx> #include <cppunit/TestAssert.h> @@ -45,6 +46,7 @@ public: TestTeleTubes(); ~TestTeleTubes(); + void testContactList(); void testSetupManager1(); void testSetupManager2(); void testConnect1(); @@ -60,8 +62,11 @@ public: void testDestroyManager2(); void testFailAlways(); + GMainLoop* mpMainLoop; + // Order is significant. CPPUNIT_TEST_SUITE( TestTeleTubes ); + CPPUNIT_TEST( testContactList ); CPPUNIT_TEST( testSetupManager1 ); CPPUNIT_TEST( testSetupManager2 ); CPPUNIT_TEST( testConnect1 ); @@ -103,6 +108,57 @@ TestTeleTubes::~TestTeleTubes() { } +static void TeleTestTubes_ContactListPrepared( GError *errorOr0, void *user_data ) +{ + TestTeleTubes *self = reinterpret_cast<TestTeleTubes *>(user_data); + + CPPUNIT_ASSERT( errorOr0 == 0 ); + + g_main_loop_quit (self->mpMainLoop); +} + +static gboolean +timed_out (void *user_data) +{ + CPPUNIT_ASSERT( false); + + GMainLoop *loop = reinterpret_cast<GMainLoop *>(user_data); + + g_main_loop_quit (loop); + return FALSE; +} + +void TestTeleTubes::testContactList() +{ + mpMainLoop = g_main_loop_new (NULL, FALSE); + + ContactList cl; + cl.prepare( TeleTestTubes_ContactListPrepared, this ); + g_timeout_add_seconds (5, timed_out, mpMainLoop); + g_main_loop_run (mpMainLoop); + g_main_loop_unref (mpMainLoop); + mpMainLoop = NULL; + + /* Okay, now everything's prepared, we can get contacts synchronously. */ + AccountContactPairV pairs; + + pairs = cl.getContacts(); + guint i; + + CPPUNIT_ASSERT( pairs.size() > 0 ); + + for (i = 0; i < pairs.size(); i++) + { + AccountContactPair pair = pairs[i]; + g_print ("Account %s; contact %s (%s)\n", + tp_account_get_display_name (pair.first), + tp_contact_get_alias (pair.second), + tp_contact_get_identifier (pair.second)); + g_object_unref (pair.first); + g_object_unref (pair.second); + } +} + void TestTeleTubes::testSetupManager1() { mpManager1 = new TeleManager( sAcc1, sService, true); diff --git a/tubes/source/contact-list.cxx b/tubes/source/contact-list.cxx new file mode 100644 index 0000000..7f707af --- /dev/null +++ b/tubes/source/contact-list.cxx @@ -0,0 +1,169 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * Version: MPL 1.1 / GPLv3+ / LGPLv3+ + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License or as specified alternatively below. You may obtain a copy of + * the License at http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * Major Contributor(s): + * Copyright (C) 2012 Collabora Ltd. + * + * All Rights Reserved. + * + * For minor contributions see the git repository. + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 3 or later (the "GPLv3+"), or + * the GNU Lesser General Public License Version 3 or later (the "LGPLv3+"), + * in which case the provisions of the GPLv3+ or the LGPLv3+ are applicable + * instead of those above. + */ +#include <utility> +#include <vector> + +#include <telepathy-glib/telepathy-glib.h> + +#include <tubes/contact-list.hxx> + +ContactList::ContactList() +{ + g_type_init(); + + mpAccountManager = tp_account_manager_dup (); + + /* Tell the client factory (which creates and prepares proxy objects) to + * get the features we need ready before giving us any objects. + */ + TpSimpleClientFactory *factory = tp_proxy_get_factory (mpAccountManager); + /* We need every online account's connection object to be available... */ + tp_simple_client_factory_add_account_features_varargs (factory, + TP_ACCOUNT_FEATURE_CONNECTION, + 0); + /* ...and we want those connection objects to have the contact list + * available... */ + tp_simple_client_factory_add_connection_features_varargs (factory, + TP_CONNECTION_FEATURE_CONTACT_LIST, + 0); + /* ...and those contacts should have their alias and their capabilities + * available. + */ + tp_simple_client_factory_add_contact_features_varargs (factory, + TP_CONTACT_FEATURE_ALIAS, + TP_CONTACT_FEATURE_CAPABILITIES, + TP_CONTACT_FEATURE_INVALID); +} + +ContactList::~ContactList() +{ + g_object_unref(mpAccountManager); + mpAccountManager = NULL; +} + +/* FIXME: Should be something like + * + * org.libreoffice.calc + * org.libreoffice.writer + * + * etc. This does not need to include the org.freedesktop.Telepathy.Client + * stuff. + */ +#define LIBO_DTUBE_SERVICE \ + TP_CLIENT_BUS_NAME_BASE "LibreOfficeTeleTest" + +static gboolean +contact_supports_libo_dtube (TpContact *contact) +{ + TpCapabilities *caps = tp_contact_get_capabilities (contact); + + if (caps == NULL) + return FALSE; + + return tp_capabilities_supports_dbus_tubes (caps, + TP_HANDLE_TYPE_CONTACT, LIBO_DTUBE_SERVICE); +} + +typedef ::std::pair< ContactList::PrepareCallback, void * > Foo; + +static void +account_manager_prepared_cb (GObject *object, + GAsyncResult *res, + gpointer user_data) +{ + Foo *data = reinterpret_cast<Foo *>(user_data); + GError *error = NULL; + + if (!tp_proxy_prepare_finish (object, res, &error)) + { + data->first( error, data->second ); + g_clear_error(&error); + } + else + { + data->first( NULL, data->second ); + } + + delete data; +} + +void ContactList::prepare( + ContactList::PrepareCallback callback, + void* user_data) +{ + Foo *data = new Foo(callback, user_data); + + /* This will call back immediately (in an idle) if the manager is already + * prepared, which is fine-ish */ + tp_proxy_prepare_async (mpAccountManager, NULL, account_manager_prepared_cb, data); +} + +AccountContactPairV ContactList::getContacts() +{ + GList *accounts; + AccountContactPairV pairs; + + for (accounts = tp_account_manager_get_valid_accounts (mpAccountManager); + accounts != NULL; + accounts = g_list_delete_link (accounts, accounts)) + { + TpAccount *account = reinterpret_cast<TpAccount *>(accounts->data); + TpConnection *connection = tp_account_get_connection (account); + GPtrArray *contacts; + guint i; + + /* Verify account is online and received its contact list. If state is not + * SUCCESS this means we didn't received the roster from server yet and + * we would have to wait for the "notify:contact-list-state" signal. */ + if (connection == NULL || + tp_connection_get_contact_list_state (connection) != + TP_CONTACT_LIST_STATE_SUCCESS) + continue; + + contacts = tp_connection_dup_contact_list (connection); + for (i = 0; i < contacts->len; i++) + { + TpContact *contact = + reinterpret_cast<TpContact *>(g_ptr_array_index (contacts, i)); + + if (contact_supports_libo_dtube (contact)) + { + g_object_ref (account); + g_object_ref (contact); + + AccountContactPair pair(account, contact); + pairs.push_back(pair); + } + } + g_ptr_array_unref (contacts); + } + + return pairs; +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ _______________________________________________ Libreoffice-commits mailing list Libreoffice-commits@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits