From 466edaa9fb54f7f976c176635fb836f7cd85b456 Mon Sep 17 00:00:00 2001 From: Matúš Kukan Date: Mon, 20 Aug 2012 14:08:02 +0200 Subject: tubes: move getContacts() to TeleManager where it belongs, I believe Change-Id: I69ca3bde24890d809d8fad60398687c54aa1ca54 --- tubes/source/contact-list.cxx | 137 ------------------------------------------ tubes/source/contacts.cxx | 64 +++++++++----------- tubes/source/manager.cxx | 95 ++++++++++++++++++++++++++--- 3 files changed, 115 insertions(+), 181 deletions(-) delete mode 100644 tubes/source/contact-list.cxx (limited to 'tubes/source') 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 -#include - -#include - -#include -#include -#include - -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(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(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 #include #include -#include #include #include #include @@ -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 #include #include -#include #include #include @@ -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(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(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: */ -- cgit