diff options
-rw-r--r-- | tubes/CppunitTest_tubes_test.mk | 5 | ||||
-rw-r--r-- | tubes/Library_tubes.mk | 1 | ||||
-rw-r--r-- | tubes/inc/tubes/contact-list.hxx | 62 | ||||
-rw-r--r-- | tubes/inc/tubes/manager.hxx | 14 | ||||
-rw-r--r-- | tubes/qa/test_manager.cxx | 3 | ||||
-rw-r--r-- | tubes/source/contact-list.cxx | 137 | ||||
-rw-r--r-- | tubes/source/contacts.cxx | 64 | ||||
-rw-r--r-- | tubes/source/manager.cxx | 95 |
8 files changed, 126 insertions, 255 deletions
diff --git a/tubes/CppunitTest_tubes_test.mk b/tubes/CppunitTest_tubes_test.mk index f40f0f41ce98..f60a1b0fd174 100644 --- a/tubes/CppunitTest_tubes_test.mk +++ b/tubes/CppunitTest_tubes_test.mk @@ -30,11 +30,6 @@ $(eval $(call gb_CppunitTest_add_exception_objects,tubes_test, \ tubes/qa/test_manager \ )) -$(eval $(call gb_CppunitTest_set_include,tubes_test, \ - -I$(SRCDIR)/tubes/inc \ - $$(INCLUDE) \ -)) - $(eval $(call gb_CppunitTest_use_libraries,tubes_test, \ sal \ tubes \ diff --git a/tubes/Library_tubes.mk b/tubes/Library_tubes.mk index 1c20e2b29b74..5ef4cb407980 100644 --- a/tubes/Library_tubes.mk +++ b/tubes/Library_tubes.mk @@ -60,7 +60,6 @@ $(eval $(call gb_Library_use_externals,tubes,\ $(eval $(call gb_Library_add_exception_objects,tubes,\ tubes/source/collaboration \ tubes/source/conference \ - tubes/source/contact-list \ tubes/source/contacts \ tubes/source/manager \ )) diff --git a/tubes/inc/tubes/contact-list.hxx b/tubes/inc/tubes/contact-list.hxx deleted file mode 100644 index cc4ba29bc28f..000000000000 --- a/tubes/inc/tubes/contact-list.hxx +++ /dev/null @@ -1,62 +0,0 @@ -/* -*- 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 <tubes/tubesdllapi.h> - -#include <set> -#include <utility> -#include <vector> - -typedef struct _TpAccount TpAccount; -typedef struct _TpContact TpContact; -typedef struct _TpAccountManager TpAccountManager; - -typedef ::std::pair< TpAccount *, TpContact * > AccountContactPair; -typedef ::std::vector< AccountContactPair > AccountContactPairV; - -class ContactList -{ -public: - ContactList(TpAccountManager *pAccountManager); - ~ContactList(); - - // exported for unit test - TUBES_DLLPUBLIC AccountContactPairV getContacts(); - -private: - TpAccountManager* mpAccountManager; - std::set< TpContact* > maRegistered; - -}; - -#endif // INCLUDED_TUBES_CONTACT_LIST_HXX - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/tubes/inc/tubes/manager.hxx b/tubes/inc/tubes/manager.hxx index 032f5390f8d8..27dcec7bb585 100644 --- a/tubes/inc/tubes/manager.hxx +++ b/tubes/inc/tubes/manager.hxx @@ -33,6 +33,9 @@ #include <tubes/tubesdllapi.h> #include <rtl/ustring.hxx> +#include <utility> +#include <vector> + // For testing purposes, we might need more in future. #define LIBO_TUBES_DBUS_INTERFACE "org.libreoffice.calc" #define LIBO_TUBES_DBUS_MSG_METHOD "LibOMsg" @@ -40,12 +43,15 @@ namespace osl { class Mutex; } class Collaboration; -class ContactList; class TeleConference; class TeleManagerImpl; typedef struct _TpAccount TpAccount; typedef struct _TpContact TpContact; +typedef ::std::pair< TpAccount *, TpContact * > AccountContactPair; +typedef ::std::vector< AccountContactPair > AccountContactPairV; + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ /** Interface to Telepathy DBus Tubes. Fragile, not working yet. @@ -78,11 +84,11 @@ public: /** Setup client handlers. */ static bool registerClients(); - /** Fetches the contact list. Returns 0 before connect() is called successfully. - Is non-functional until prepareAccountManager(). + /** Fetches the contact list. + Is non-functional until createAccountManager(). */ // exported for unit test - TUBES_DLLPUBLIC static ContactList* getContactList(); + TUBES_DLLPUBLIC static AccountContactPairV getContacts(); /** Start a demo session where all local documents are shared to each other */ static TeleConference* startDemoSession(); diff --git a/tubes/qa/test_manager.cxx b/tubes/qa/test_manager.cxx index 2e5543ee81d9..545947de159e 100644 --- a/tubes/qa/test_manager.cxx +++ b/tubes/qa/test_manager.cxx @@ -36,7 +36,6 @@ #include <rtl/string.hxx> #include <rtl/ustring.hxx> #include <tubes/collaboration.hxx> -#include <tubes/contact-list.hxx> #include <tubes/manager.hxx> #include <unotools/localfilehelper.hxx> @@ -137,7 +136,7 @@ void TestTeleTubes::testInitTeleManager() void TestTeleTubes::testContactList() { - AccountContactPairV pairs = TeleManager::getContactList()->getContacts(); + AccountContactPairV pairs = TeleManager::getContacts(); /* Both our accounts are meant to be signed in, and they both should be * capable of LibreOffice tubes because this test runs after we register * our handler. */ diff --git a/tubes/source/contact-list.cxx b/tubes/source/contact-list.cxx deleted file mode 100644 index e240ece872ad..000000000000 --- a/tubes/source/contact-list.cxx +++ /dev/null @@ -1,137 +0,0 @@ -/* -*- 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/constants.h> -#include <tubes/contact-list.hxx> -#include <tubes/manager.hxx> - -ContactList::ContactList(TpAccountManager *pAccountManager) - : mpAccountManager(pAccountManager) -{ - SAL_WARN_IF( !mpAccountManager, "tubes", - "ContactList::ContactList: passed a null account manager"); - g_object_ref( mpAccountManager); -} - -ContactList::~ContactList() -{ - g_object_unref(mpAccountManager); - mpAccountManager = NULL; -} - -static bool tb_presence_is_online( const TpConnectionPresenceType& presence ) -{ - switch (presence) - { - case TP_CONNECTION_PRESENCE_TYPE_UNSET: - case TP_CONNECTION_PRESENCE_TYPE_OFFLINE: - return false; - case TP_CONNECTION_PRESENCE_TYPE_AVAILABLE: - case TP_CONNECTION_PRESENCE_TYPE_AWAY: - case TP_CONNECTION_PRESENCE_TYPE_EXTENDED_AWAY: - case TP_CONNECTION_PRESENCE_TYPE_HIDDEN: - case TP_CONNECTION_PRESENCE_TYPE_BUSY: - return true; - case TP_CONNECTION_PRESENCE_TYPE_UNKNOWN: - case TP_CONNECTION_PRESENCE_TYPE_ERROR: - default: - return false; - } -} - -static bool tb_contact_is_online( TpContact *contact ) -{ - return tb_presence_is_online (tp_contact_get_presence_type (contact)); -} - -static void presence_changed_cb( TpContact* /* contact */, - guint /* type */, - gchar* /* status */, - gchar* /* message */, - gpointer /* pContactList*/ ) -{ - TeleManager::displayAllContacts(); -} - -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); - TpContact *self; - 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; - - self = tp_connection_get_self_contact (connection); - 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 (maRegistered.find (contact) == maRegistered.end()) - { - maRegistered.insert (contact); - g_signal_connect (contact, "presence-changed", - G_CALLBACK (presence_changed_cb), this ); - } - - if (contact != self && - tb_contact_is_online (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: */ diff --git a/tubes/source/contacts.cxx b/tubes/source/contacts.cxx index 1017fade4b14..3c0a3322bca1 100644 --- a/tubes/source/contacts.cxx +++ b/tubes/source/contacts.cxx @@ -34,7 +34,6 @@ #include <tools/resid.hxx> #include <tubes/conference.hxx> #include <tubes/collaboration.hxx> -#include <tubes/contact-list.hxx> #include <tubes/manager.hxx> #include <unotools/confignode.hxx> #include <vcl/fixed.hxx> @@ -196,44 +195,41 @@ public: SAL_INFO( "tubes", "Populating contact list dialog" ); maList.Clear(); maACs.clear(); - ContactList *pContacts = TeleManager::getContactList(); - if ( pContacts ) + + AccountContactPairV aPairs = TeleManager::getContacts(); + AccountContactPairV::iterator it; + // make sure we have enough memory to not need re-allocation + // which would invalidate pointers stored in maList entries + maACs.reserve( aPairs.size() ); + for( it = aPairs.begin(); it != aPairs.end(); ++it ) { - AccountContactPairV aPairs = pContacts->getContacts(); - AccountContactPairV::iterator it; - // make sure we have enough memory to not need re-allocation - // which would invalidate pointers stored in maList entries - maACs.reserve( aPairs.size() ); - for( it = aPairs.begin(); it != aPairs.end(); ++it ) + Image aImage; + GFile *pAvatarFile = tp_contact_get_avatar_file( it->second ); + if( pAvatarFile ) { - Image aImage; - GFile *pAvatarFile = tp_contact_get_avatar_file( it->second ); - if( pAvatarFile ) + const rtl::OUString sAvatarFileUrl = fromUTF8( g_file_get_path ( pAvatarFile ) ); + Graphic aGraphic; + if( GRFILTER_OK == GraphicFilter::LoadGraphic( sAvatarFileUrl, rtl::OUString(""), aGraphic ) ) { - const rtl::OUString sAvatarFileUrl = fromUTF8( g_file_get_path ( pAvatarFile ) ); - Graphic aGraphic; - if( GRFILTER_OK == GraphicFilter::LoadGraphic( sAvatarFileUrl, rtl::OUString(""), aGraphic ) ) - { - BitmapEx aBitmap = aGraphic.GetBitmapEx(); - double fScale = 30.0 / aBitmap.GetSizePixel().Height(); - aBitmap.Scale( fScale, fScale ); - aImage = Image( aBitmap ); - } + BitmapEx aBitmap = aGraphic.GetBitmapEx(); + double fScale = 30.0 / aBitmap.GetSizePixel().Height(); + aBitmap.Scale( fScale, fScale ); + aImage = Image( aBitmap ); } - rtl::OUStringBuffer aEntry( 128 ); - aEntry.append( sal_Unicode( '\t' ) ); - aEntry.append( fromUTF8 ( tp_contact_get_alias( it->second ) ) ); - aEntry.append( sal_Unicode( '\t' ) ); - aEntry.append( fromUTF8 ( tp_contact_get_identifier( it->second ) ) ); - aEntry.append( sal_Unicode( '\t' ) ); - SvLBoxEntry* pEntry = maList.InsertEntry( aEntry.makeStringAndClear(), aImage, aImage ); - // FIXME: ref the TpAccount, TpContact ... - maACs.push_back( AccountContactPair( it->first, it->second ) ); - pEntry->SetUserData( &maACs.back() ); - - g_object_unref (it->first); - g_object_unref (it->second); } + rtl::OUStringBuffer aEntry( 128 ); + aEntry.append( sal_Unicode( '\t' ) ); + aEntry.append( fromUTF8 ( tp_contact_get_alias( it->second ) ) ); + aEntry.append( sal_Unicode( '\t' ) ); + aEntry.append( fromUTF8 ( tp_contact_get_identifier( it->second ) ) ); + aEntry.append( sal_Unicode( '\t' ) ); + SvLBoxEntry* pEntry = maList.InsertEntry( aEntry.makeStringAndClear(), aImage, aImage ); + // FIXME: ref the TpAccount, TpContact ... + maACs.push_back( AccountContactPair( it->first, it->second ) ); + pEntry->SetUserData( &maACs.back() ); + + g_object_unref (it->first); + g_object_unref (it->second); } Show(); } diff --git a/tubes/source/manager.cxx b/tubes/source/manager.cxx index ed6a0a2a749b..fde9281da516 100644 --- a/tubes/source/manager.cxx +++ b/tubes/source/manager.cxx @@ -31,7 +31,6 @@ #include <tubes/collaboration.hxx> #include <tubes/conference.hxx> #include <tubes/constants.h> -#include <tubes/contact-list.hxx> #include <tubes/file-transfer-helper.h> #include <com/sun/star/uno/Sequence.hxx> @@ -91,7 +90,6 @@ public: static bool mbAccountManagerReady; static bool mbAccountManagerReadyHandlerInvoked; static bool mbChannelReadyHandlerInvoked; - ContactList* mpContactList; OString msCurrentUUID; OString msNameSuffix; typedef std::map< OString, TeleConference* > MapStringConference; @@ -100,6 +98,8 @@ public: DemoConferences maDemoConferences; typedef std::set< Collaboration* > Collaborations; Collaborations maCollaborations; + typedef std::set< TpContact* > RegisteredContacts; + RegisteredContacts maRegisteredContacts; TeleManagerImpl(); ~TeleManagerImpl(); @@ -756,12 +756,90 @@ TeleConference* TeleManager::startBuddySession( TpAccount *pAccount, TpContact * return pConference; } -ContactList* TeleManager::getContactList() +static bool tb_presence_is_online( const TpConnectionPresenceType& presence ) { - if (!pImpl->mpContactList) - pImpl->mpContactList = new ContactList (pImpl->mpAccountManager); + switch (presence) + { + case TP_CONNECTION_PRESENCE_TYPE_UNSET: + case TP_CONNECTION_PRESENCE_TYPE_OFFLINE: + return false; + case TP_CONNECTION_PRESENCE_TYPE_AVAILABLE: + case TP_CONNECTION_PRESENCE_TYPE_AWAY: + case TP_CONNECTION_PRESENCE_TYPE_EXTENDED_AWAY: + case TP_CONNECTION_PRESENCE_TYPE_HIDDEN: + case TP_CONNECTION_PRESENCE_TYPE_BUSY: + return true; + case TP_CONNECTION_PRESENCE_TYPE_UNKNOWN: + case TP_CONNECTION_PRESENCE_TYPE_ERROR: + default: + return false; + } +} + +static bool tb_contact_is_online( TpContact *contact ) +{ + return tb_presence_is_online (tp_contact_get_presence_type (contact)); +} + +static void presence_changed_cb( TpContact* /* contact */, + guint /* type */, + gchar* /* status */, + gchar* /* message */, + gpointer /* pContactList*/ ) +{ + TeleManager::displayAllContacts(); +} + +AccountContactPairV TeleManager::getContacts() +{ + GList *accounts; + AccountContactPairV pairs; + + for (accounts = tp_account_manager_get_valid_accounts (pImpl->mpAccountManager); + accounts != NULL; + accounts = g_list_delete_link (accounts, accounts)) + { + TpAccount *account = reinterpret_cast<TpAccount *>(accounts->data); + TpConnection *connection = tp_account_get_connection (account); + TpContact *self; + 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; + + self = tp_connection_get_self_contact (connection); + 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 (pImpl->maRegisteredContacts.find (contact) == pImpl->maRegisteredContacts.end()) + { + pImpl->maRegisteredContacts.insert (contact); + g_signal_connect (contact, "presence-changed", + G_CALLBACK (presence_changed_cb), NULL ); + } + + if (contact != self && + tb_contact_is_online (contact)) + { + g_object_ref (account); + g_object_ref (contact); + + AccountContactPair pair(account, contact); + pairs.push_back(pair); + } + } + g_ptr_array_unref (contacts); + } - return pImpl->mpContactList; + return pairs; } rtl::OString TeleManager::getFullClientName() @@ -823,8 +901,7 @@ TeleManagerImpl::TeleManagerImpl() mpFactory( NULL), mpClient( NULL), mpFileTransferClient( NULL), - mpAccountManager( NULL), - mpContactList( NULL) + mpAccountManager( NULL) { g_type_init(); } @@ -850,8 +927,6 @@ TeleManagerImpl::~TeleManagerImpl() g_object_unref( mpFactory); if (mpAccountManager) g_object_unref( mpAccountManager); - if (mpContactList) - delete mpContactList; } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |