[Libreoffice-commits] .: 4 commits - tubes/CppunitTest_tubes_test.mk tubes/inc tubes/Library_tubes.mk tubes/qa tubes/README tubes/source

Libreoffice Gerrit user logerrit at kemper.freedesktop.org
Mon Aug 20 08:36:28 PDT 2012


 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 <matus.kukan at gmail.com>
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 <matus.kukan at gmail.com>
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 <matus.kukan at gmail.com>
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 <matus.kukan at gmail.com>
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: */


More information about the Libreoffice-commits mailing list