tubes/CppunitTest_tubes_test.mk | 5 - tubes/Library_tubes.mk | 1 tubes/README | 76 +++------------------ tubes/inc/tubes/collaboration.hxx | 4 + tubes/inc/tubes/contact-list.hxx | 62 ----------------- tubes/inc/tubes/manager.hxx | 27 ++++--- tubes/qa/test_manager.cxx | 3 tubes/source/contact-list.cxx | 137 -------------------------------------- tubes/source/contacts.cxx | 64 ++++++++--------- tubes/source/manager.cxx | 86 +++++++++++++++++++++-- 10 files changed, 143 insertions(+), 322 deletions(-)
New commits: commit aa460e5731e94d00cf0776c10ab86013d334ae16 Author: Matúš Kukan <[email protected]> Date: Mon Aug 20 17:28:46 2012 +0200 tubes: update README Change-Id: Iab26aa96301851ace6244688a38bbb99630afd73 diff --git a/tubes/README b/tubes/README index e8e12fb..7d67636 100644 --- a/tubes/README +++ b/tubes/README @@ -3,9 +3,6 @@ The idea is to provide 1-1 collaboration between contacts and many-many collaboration via MUCs, using Telepathy DBus Tubes over Jabber/XMPP. -First stab is at 1-1 contact channels, hopefully MUCs can be realized using -the same TeleConference abstraction. - To enable configure LibO with --enable-telepathy Currently (2012-04-14) at least telepathy-glib 0.18 is needed, which doesn't @@ -19,7 +16,7 @@ cp -p $HOME/usr/lib/libtelepathy-glib.* $SRCDIR/solver/$INPATH/lib/ If you have a Telepathy-enabled LibreOffice installed to /usr (including liboapprover) you may also want to install the .service and .client files to -make everything service-activatable: +make everything service-activatable. Currently this does not seem to work. mkdir -p $HOME/.local/share/telepathy/clients ln -s $PWD/tubes/LibreOffice.client \ @@ -31,86 +28,41 @@ make everything service-activatable: $PWD/tubes/org.freedesktop.Telepathy.Client.LibreOffice.service \ $HOME/.local/share/dbus-1/services -Otherwise, you need to make sure liboapprover and a Telepathy-enabled -LibreOffice are running. - - -* Demo modes -This allows you to play with the interposing without having a telepathy -enabled setup: +* liboapprover - INTERCEPT=demo ./soffice -calc +You may run it in the background. When someone wants to collaborate with you, +you then get a confirmation dialog. -Create a bit of a document, type 'saveas' with spelling auto-correction -disabled, and bingo. +* Demo modes +To play with the interposing without having an online account connected, create +a bit of a document, go to File -> Collaboration -> startDemoSession and bingo. -* Status 2012-03-23: * To do interesting things with this code build and run calc thus: - SAL_LOG=1 LIBO_TUBES=slave ./soffice -calc # user one - SAL_LOG=1 LIBO_TUBES=master ./soffice -calc # user two - - hope that a nasty race-condition doesn't occur during startup: -which is flagged by "we are supposed to handle only one channel" you -hit it: bang - just try again. - - you also require only a single jabber connection enabled (in -empathy) and to have your opponent added and approved on both sides. + SAL_LOG=1 ./soffice --calc - Now type simple strings into cells, rename sheets, or type -'saveme' to transfer your document as-is to the other side ... + Now type simple strings into cells, rename sheets, or go to + File -> Collaboration; Listen; startBuddySession; + to transfer your document as-is to the other side ... -* Status 2012-03-20: - -* no LibO code depends on this module yet, so it is not built in a regular - build, even if configured with --enable-telepathy, so cd tubes and make here - * to enable the various SAL_INFO and SAL_WARN messages emitted during - cppunittest pass SAL_LOG=... and do a debug build - * SAL_LOG="+WARN+INFO.tubes" make -rs debug=true - * the cppunittest will currently fail anyway (even if it wouldn't for other - reasons), this is on purpose to be able to see the output as otherwise it - is silenced down ... :-( - * for the cppunittest needed: * Configure two Jabber accounts in Empathy * Both must be online and on each other's contact list * Copy qa/test-config.ini.example to qa/test-config.ini, and specify those two accounts' JIDs in it. -* very nasty GMainLoop handling for cppunittest, HOPEFULLY we will get rid of - that in a real LibO -* working: - * contact channels are setup - * tube is offered/accepted - * packets are sent and received - - -TODO: - -* cleanup code to use a refcounted single instance thats holds mpAccountManager - and stuff and actually releases them, instead of statics -* TeleManager should be a single instance, not holding any account information; - instead, the start...Session() methods should also get the account passed -* implement master/slave mode in 1-1 buddy conferences, master would do strong - ordering - -other TODOs: +* TODOs: -* associate a document with a conference - * use SfxObjectShell as an abstraction and broadcast incoming changes? - * use UNO API? - * first setup just to get something working could share a document - accessible by all parties on a network share or some such - * may need one master responsible to save the document - * later document transfer will be needed, use Telepathy File Transfer +* TeleConference is not deleted anywhere * dialog to pick own account * dialog to pick contact or MUC to work with * dialog to accept/reject collaboration requests +* make the .service and .client files work reliably In applications, e.g. Calc: commit 2bb73133df604f44dfe7904c42bbc37827f3fd4c Author: Matúš Kukan <[email protected]> Date: Mon Aug 20 12:05:50 2012 +0200 tubes: add few more comments Change-Id: I263443d341805583f8ecedf0da738b75249b5d97 diff --git a/tubes/inc/tubes/collaboration.hxx b/tubes/inc/tubes/collaboration.hxx index e3f765c..3f32d41 100644 --- a/tubes/inc/tubes/collaboration.hxx +++ b/tubes/inc/tubes/collaboration.hxx @@ -27,14 +27,18 @@ public: Collaboration(); virtual ~Collaboration(); + /** Returns to normal editing mode */ virtual void EndCollaboration() const = 0; virtual void PacketReceived( const OString& rPacket ) const = 0; + /** Saves current document and then calls SendFile() with the file URL */ virtual void SaveAndSendFile( TpContact* pContact ) const = 0; + /** Prepares document for collaboration and should call SetConference() */ virtual void StartCollaboration( TeleConference* pConference ) = 0; TUBES_DLLPRIVATE sal_uInt64 GetId() const; TUBES_DLLPRIVATE void Invite( TpContact* pContact ) const; + /** Application calls this to display contacts dialog from where can the collaboration start */ void DisplayContacts(); void SendFile( TpContact* pContact, const OUString& rURL ) const; void SendPacket( const OString& rPacket ) const; diff --git a/tubes/inc/tubes/manager.hxx b/tubes/inc/tubes/manager.hxx index 27dcec7..6a73cd5 100644 --- a/tubes/inc/tubes/manager.hxx +++ b/tubes/inc/tubes/manager.hxx @@ -61,9 +61,6 @@ typedef ::std::vector< AccountContactPair > AccountContactPairV; class TeleManager { - TeleManager(); - ~TeleManager(); - public: /** Prepare tube manager with account and service to be offered/listened to. @@ -124,6 +121,8 @@ public: static void registerCollaboration( Collaboration* pCollaboration ); static void unregisterCollaboration( Collaboration* pCollaboration ); + /** Used to determine whether we are closing the channel by ourselves. + * @return true if the Collaboration is still registered */ static bool existsCollaboration( Collaboration* pCollaboration ); /** Display contact list dialog for all documents. */ static void displayAllContacts(); @@ -133,11 +132,15 @@ public: /** Broadcast packet to all conferences. Used for demo mode. */ static void broadcastPacket( const OString& rPacket ); - static void setCurrentUuid( const OString& rUuid ); - static rtl::OString createUuid(); // Only for callbacks. static void addConference( TeleConference* pConference ); + static rtl::OString createUuid(); + /** @param rUuid + is stored so that accepted conference with this UUID could be + then retrieved by getConference() when loading new document + */ + static void setCurrentUuid( const OString& rUuid ); /// "LibreOfficeWhatEver" static rtl::OString getFullClientName(); commit 24209be305acc24a0432bcda21a8919a309ac9ea Author: Matúš Kukan <[email protected]> Date: Mon Aug 20 14:17:51 2012 +0200 tubes: fix indentation and scope of variables Change-Id: Ibd0b000d2a8f216e0eb202f7fa7795903e5e18e8 diff --git a/tubes/source/manager.cxx b/tubes/source/manager.cxx index fde9281..8089976 100644 --- a/tubes/source/manager.cxx +++ b/tubes/source/manager.cxx @@ -792,54 +792,45 @@ static void presence_changed_cb( TpContact* /* contact */, AccountContactPairV TeleManager::getContacts() { - GList *accounts; - AccountContactPairV pairs; + AccountContactPairV pairs; - for (accounts = tp_account_manager_get_valid_accounts (pImpl->mpAccountManager); - accounts != NULL; - accounts = g_list_delete_link (accounts, accounts)) + for (GList *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++) + TpAccount *account = reinterpret_cast<TpAccount *>(accounts->data); + TpConnection *connection = tp_account_get_connection (account); + + /* 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; + + TpContact *self = tp_connection_get_self_contact (connection); + GPtrArray *contacts = tp_connection_dup_contact_list (connection); + for (guint 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)) + 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); + g_object_ref (account); + g_object_ref (contact); - AccountContactPair pair(account, contact); - pairs.push_back(pair); + AccountContactPair pair(account, contact); + pairs.push_back(pair); } } - g_ptr_array_unref (contacts); + g_ptr_array_unref (contacts); } - return pairs; + return pairs; } rtl::OString TeleManager::getFullClientName() commit 466edaa9fb54f7f976c176635fb836f7cd85b456 Author: Matúš Kukan <[email protected]> Date: Mon Aug 20 14:08:02 2012 +0200 tubes: move getContacts() to TeleManager where it belongs, I believe Change-Id: I69ca3bde24890d809d8fad60398687c54aa1ca54 diff --git a/tubes/CppunitTest_tubes_test.mk b/tubes/CppunitTest_tubes_test.mk index f40f0f4..f60a1b0 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 1c20e2b..5ef4cb4 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 cc4ba29..0000000 --- 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 032f539..27dcec7 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 2e5543e..545947d 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 e240ece..0000000 --- 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 1017fad..3c0a332 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 ed6a0a2..fde9281 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: */
_______________________________________________ Libreoffice-commits mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
