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

Reply via email to