summaryrefslogtreecommitdiff
path: root/tubes
diff options
context:
space:
mode:
Diffstat (limited to 'tubes')
-rw-r--r--tubes/CppunitTest_tubes_test.mk4
-rw-r--r--tubes/Library_tubes.mk1
-rw-r--r--tubes/inc/tubes/contact-list.hxx60
-rw-r--r--tubes/qa/test_manager.cxx56
-rw-r--r--tubes/source/contact-list.cxx169
5 files changed, 290 insertions, 0 deletions
diff --git a/tubes/CppunitTest_tubes_test.mk b/tubes/CppunitTest_tubes_test.mk
index 32810f9739f4..7b558d7188a6 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 2ab261644932..48ef793ffbe4 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 000000000000..bf1e0f79d149
--- /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 07dd264d3b23..f017a9cc2ea6 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 000000000000..7f707afbd67e
--- /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: */