[Libreoffice-commits] .: 11 commits - sc/source tubes/CppunitTest_tubes_test.mk tubes/inc tubes/Package_inc.mk tubes/source

Matus Kukan mkukan at kemper.freedesktop.org
Fri Aug 3 16:57:38 PDT 2012


 sc/source/ui/collab/sccollaboration.cxx |   34 ++++++++++++++------
 sc/source/ui/collab/sendfunc.cxx        |    8 ++--
 sc/source/ui/docshell/docsh.cxx         |   17 ++++++++++
 sc/source/ui/inc/docsh.hxx              |    9 +++++
 sc/source/ui/inc/sccollaboration.hxx    |   10 ++++--
 sc/source/ui/view/cellsh3.cxx           |    2 -
 tubes/CppunitTest_tubes_test.mk         |    5 +++
 tubes/Package_inc.mk                    |    1 
 tubes/inc/tubes/collaboration.hxx       |    4 +-
 tubes/inc/tubes/conference.hxx          |    9 ++++-
 tubes/inc/tubes/contact-list.hxx        |    8 ----
 tubes/inc/tubes/manager.hxx             |   16 ++++-----
 tubes/source/contact-list.cxx           |   22 ++++++++++---
 tubes/source/contacts.cxx               |   46 ++++++++++++++++++---------
 tubes/source/manager.cxx                |   53 +++++++++++++++++++++++++++++++-
 15 files changed, 185 insertions(+), 59 deletions(-)

New commits:
commit 769e2b59e605c2c882d2039ad89e0958ea7bb2f2
Author: Matúš Kukan <matus.kukan at gmail.com>
Date:   Sat Aug 4 01:52:29 2012 +0200

    tubes: stop collaborating when the account gets off-line
    
    Change-Id: Ic6f1bc41bc212e0c36751168f1204c41ebe0ce61

diff --git a/tubes/source/contact-list.cxx b/tubes/source/contact-list.cxx
index 1b27af2..b238a2c 100644
--- a/tubes/source/contact-list.cxx
+++ b/tubes/source/contact-list.cxx
@@ -71,9 +71,9 @@ ContactList::~ContactList()
     mpAccountManager = NULL;
 }
 
-bool tb_contact_is_online( TpContact *contact )
+bool tb_presence_is_online( const TpConnectionPresenceType& presence )
 {
-    switch (tp_contact_get_presence_type (contact))
+    switch (presence)
     {
         case TP_CONNECTION_PRESENCE_TYPE_UNSET:
         case TP_CONNECTION_PRESENCE_TYPE_OFFLINE:
@@ -91,6 +91,16 @@ bool tb_contact_is_online( TpContact *contact )
     }
 }
 
+bool tb_account_is_online( TpAccount *account )
+{
+    return tb_presence_is_online (tp_account_get_current_presence (account, NULL, NULL));
+}
+
+bool tb_contact_is_online( TpContact *contact )
+{
+    return tb_presence_is_online (tp_contact_get_presence_type (contact));
+}
+
 namespace tubes {
     void reDrawAllContacts();
 }
diff --git a/tubes/source/manager.cxx b/tubes/source/manager.cxx
index dd3dcd5..3a2fc1b 100644
--- a/tubes/source/manager.cxx
+++ b/tubes/source/manager.cxx
@@ -105,8 +105,24 @@ public:
                             ~TeleManagerImpl();
 };
 
+bool tb_account_is_online( TpAccount* pAccount );
 bool tb_contact_is_online( TpContact* pContact );
 
+static void account_presence_changed_cb( TpAccount* pAccount,
+                                         guint      /* type */,
+                                         gchar*     /* status */,
+                                         gchar*     /* message */,
+                                         gpointer   pConference )
+{
+    if (!tb_account_is_online( pAccount ))
+    {
+        Collaboration* pCollaboration =
+            reinterpret_cast<TeleConference*> (pConference)->getCollaboration();
+        if (pCollaboration)
+            pCollaboration->ContactLeft();
+    }
+}
+
 static void contact_presence_changed_cb( TpContact* pContact,
                                          guint      /* type */,
                                          gchar*     /* status */,
@@ -157,6 +173,10 @@ void TeleManager_DBusChannelHandler(
             TeleConference* pConference = new TeleConference( pManager, pAccount, TP_DBUS_TUBE_CHANNEL( pChannel ) );
             pConference->acceptTube();
             pManager->addConference( pConference );
+
+            g_signal_connect( pAccount, "presence-changed",
+                    G_CALLBACK (account_presence_changed_cb), pConference );
+
             TpContact* pContact = tp_channel_get_target_contact( pChannel );
             if (pContact)
                 g_signal_connect( pContact, "presence-changed",
@@ -636,6 +656,9 @@ TeleConference* TeleManager::startGroupSession( TpAccount *pAccount,
     if (!pConference->isReady())
         return NULL;
 
+    g_signal_connect( pAccount, "presence-changed",
+            G_CALLBACK (account_presence_changed_cb), pConference );
+
     return pConference;
 }
 
@@ -711,6 +734,9 @@ TeleConference* TeleManager::startBuddySession( TpAccount *pAccount, TpContact *
     if (!pConference->isReady())
         return NULL;
 
+    g_signal_connect( pAccount, "presence-changed",
+            G_CALLBACK (account_presence_changed_cb), pConference );
+
     g_signal_connect( pBuddy, "presence-changed",
             G_CALLBACK (contact_presence_changed_cb), pConference );
 
commit 01839d6c7fbf2b32779c7c9037c0930b79c9e979
Author: Matúš Kukan <matus.kukan at gmail.com>
Date:   Sat Aug 4 00:02:12 2012 +0200

    tubes: fix build of unit test; set include path for now
    
    Later we would want to move headers if they are not used outside.
    
    Change-Id: I863f6f00254b335af563598a195aea01595f6c99

diff --git a/tubes/CppunitTest_tubes_test.mk b/tubes/CppunitTest_tubes_test.mk
index 597102c..6b3b40d 100644
--- a/tubes/CppunitTest_tubes_test.mk
+++ b/tubes/CppunitTest_tubes_test.mk
@@ -30,6 +30,11 @@ $(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_packages,tubes_test,tubes_inc))
 
 $(eval $(call gb_CppunitTest_use_library_objects,tubes_test,tubes))
commit 8aef9f4027a9908f9f7f8e023fed4d9db50c5696
Author: Matúš Kukan <matus.kukan at gmail.com>
Date:   Fri Aug 3 23:50:03 2012 +0200

    tubes: stop collaborating when the contact leaves
    
    Change-Id: I779aededb95eac6cbfb2fec3e97d207704244e25

diff --git a/sc/source/ui/collab/sccollaboration.cxx b/sc/source/ui/collab/sccollaboration.cxx
index aea2f0b..4651bfc 100644
--- a/sc/source/ui/collab/sccollaboration.cxx
+++ b/sc/source/ui/collab/sccollaboration.cxx
@@ -21,6 +21,17 @@ ScCollaboration::~ScCollaboration()
 {
 }
 
+void ScCollaboration::ContactLeft()
+{
+    SAL_INFO( "sc.tubes", "Contact has left the collaboration" );
+    ScDocFuncSend* pSender = GetScDocFuncSend();
+    if (pSender)
+    {
+        delete pSender;
+        mpScDocShell->SetDocFunc( new ScDocFuncDirect( *mpScDocShell ) );
+    }
+}
+
 TeleConference* ScCollaboration::GetConference()
 {
     ScDocFuncSend* pSender = GetScDocFuncSend();
diff --git a/sc/source/ui/collab/sendfunc.cxx b/sc/source/ui/collab/sendfunc.cxx
index e3ee4dc..0530980 100644
--- a/sc/source/ui/collab/sendfunc.cxx
+++ b/sc/source/ui/collab/sendfunc.cxx
@@ -356,7 +356,9 @@ ScDocFunc *ScDocShell::CreateDocFunc()
         ScDocFuncDirect *pDirect = new ScDocFuncDirect( *this );
         ScDocFuncRecv *pReceiver = new ScDocFuncRecv( pDirect );
         ScDocFuncSend *pSender = new ScDocFuncSend( *this, pReceiver );
-        pSender->SetCollaboration( TeleManager::getConference() );
+        TeleConference* pConference = TeleManager::getConference();
+        pConference->setCollaboration( mpCollaboration );
+        pSender->SetCollaboration( pConference );
         return pSender;
     }
     else
diff --git a/sc/source/ui/inc/sccollaboration.hxx b/sc/source/ui/inc/sccollaboration.hxx
index 283cce4..bfdb985 100644
--- a/sc/source/ui/inc/sccollaboration.hxx
+++ b/sc/source/ui/inc/sccollaboration.hxx
@@ -21,6 +21,7 @@ public:
                             ScCollaboration( ScDocShell* pScDocShell );
     virtual                 ~ScCollaboration();
 
+    virtual void            ContactLeft();
     virtual TeleConference* GetConference();
     virtual sal_uInt64      GetId();
     virtual void            SetCollaboration( TeleConference* pConference );
diff --git a/tubes/inc/tubes/collaboration.hxx b/tubes/inc/tubes/collaboration.hxx
index 31eff7a..6249173 100644
--- a/tubes/inc/tubes/collaboration.hxx
+++ b/tubes/inc/tubes/collaboration.hxx
@@ -23,6 +23,7 @@ public:
             Collaboration() {}
     virtual ~Collaboration() {}
 
+    virtual void                ContactLeft() = 0;
     virtual TeleConference*     GetConference() = 0;
     virtual sal_uInt64          GetId() = 0;
     virtual void                SetCollaboration( TeleConference* pConference ) = 0;
diff --git a/tubes/inc/tubes/conference.hxx b/tubes/inc/tubes/conference.hxx
index 99eb009..150e77f 100644
--- a/tubes/inc/tubes/conference.hxx
+++ b/tubes/inc/tubes/conference.hxx
@@ -34,6 +34,7 @@
 #include <rtl/ustring.hxx>
 #include <tubes/warnings_guard_boost_signals2.hpp>
 
+class Collaboration;
 class TeleManager;
 class TeleConferenceImpl;
 typedef struct _TpAccount TpAccount;
@@ -73,6 +74,9 @@ public:
     TUBES_DLLPUBLIC void    sendFile( TpContact* pContact, rtl::OUString &localUri, FileSentCallback pCallback, void* pUserData);
     const OString&          getUuid() const { return msUuid; }
 
+    Collaboration*          getCollaboration() const { return mpCollaboration; }
+    void                    setCollaboration( Collaboration* pCollaboration ) { mpCollaboration = pCollaboration; }
+
     // --- following only to be called only by manager's callbacks ---
     // TODO: make friends instead
     void                    setChannel( TpAccount* pAccount, TpDBusTubeChannel* pChannel );
@@ -98,6 +102,7 @@ private:
     // Private:
     bool                    spinUntilTubeEstablished();
 
+    Collaboration*          mpCollaboration;
     TeleManager*            mpManager;
     TpAccount*              mpAccount;
     TpDBusTubeChannel*      mpChannel;
diff --git a/tubes/source/contact-list.cxx b/tubes/source/contact-list.cxx
index 9a5b492..1b27af2 100644
--- a/tubes/source/contact-list.cxx
+++ b/tubes/source/contact-list.cxx
@@ -71,8 +71,7 @@ ContactList::~ContactList()
     mpAccountManager = NULL;
 }
 
-static bool
-tb_contact_is_online (TpContact *contact)
+bool tb_contact_is_online( TpContact *contact )
 {
     switch (tp_contact_get_presence_type (contact))
     {
diff --git a/tubes/source/contacts.cxx b/tubes/source/contacts.cxx
index aa3fb79..4db9113 100644
--- a/tubes/source/contacts.cxx
+++ b/tubes/source/contacts.cxx
@@ -124,6 +124,7 @@ class TubeContacts : public ModelessDialog
                         tp_contact_get_identifier( pContact ) );
             else
             {
+                pConference->setCollaboration( mpCollaboration );
                 mpCollaboration->SetCollaboration( pConference );
                 mpCollaboration->SendFile( pContact, OStringToOUString(
                             pConference->getUuid(), RTL_TEXTENCODING_UTF8 ) );
@@ -146,6 +147,7 @@ class TubeContacts : public ModelessDialog
                 SAL_WARN( "tubes", "Could not start group session." );
             else
             {
+                pConference->setCollaboration( mpCollaboration );
                 mpCollaboration->SetCollaboration( pConference );
             }
         }
diff --git a/tubes/source/manager.cxx b/tubes/source/manager.cxx
index 7722844..dd3dcd5 100644
--- a/tubes/source/manager.cxx
+++ b/tubes/source/manager.cxx
@@ -27,6 +27,8 @@
  */
 
 #include <tubes/manager.hxx>
+
+#include <tubes/collaboration.hxx>
 #include <tubes/conference.hxx>
 #include <tubes/constants.h>
 #include <tubes/contact-list.hxx>
@@ -103,6 +105,22 @@ public:
                             ~TeleManagerImpl();
 };
 
+bool tb_contact_is_online( TpContact* pContact );
+
+static void contact_presence_changed_cb( TpContact* pContact,
+                                         guint      /* type */,
+                                         gchar*     /* status */,
+                                         gchar*     /* message */,
+                                         gpointer   pConference )
+{
+    if (!tb_contact_is_online( pContact ))
+    {
+        Collaboration* pCollaboration =
+            reinterpret_cast<TeleConference*> (pConference)->getCollaboration();
+        if (pCollaboration)
+            pCollaboration->ContactLeft();
+    }
+}
 
 void TeleManager_DBusChannelHandler(
         TpSimpleHandler*            /*handler*/,
@@ -139,6 +157,10 @@ void TeleManager_DBusChannelHandler(
             TeleConference* pConference = new TeleConference( pManager, pAccount, TP_DBUS_TUBE_CHANNEL( pChannel ) );
             pConference->acceptTube();
             pManager->addConference( pConference );
+            TpContact* pContact = tp_channel_get_target_contact( pChannel );
+            if (pContact)
+                g_signal_connect( pContact, "presence-changed",
+                        G_CALLBACK (contact_presence_changed_cb), pConference );
         }
         else
         {
@@ -689,6 +711,9 @@ TeleConference* TeleManager::startBuddySession( TpAccount *pAccount, TpContact *
     if (!pConference->isReady())
         return NULL;
 
+    g_signal_connect( pBuddy, "presence-changed",
+            G_CALLBACK (contact_presence_changed_cb), pConference );
+
     return pConference;
 }
 
commit 374fb913a78edaa765e0f731d823d6e8180f56fe
Author: Matúš Kukan <matus.kukan at gmail.com>
Date:   Fri Aug 3 23:32:58 2012 +0200

    tubes: make ScDocShell* member of ScCollaboration
    
    Change-Id: I8e9bab6d97e7fb4a3de3b3d3896a57c6496958bd

diff --git a/sc/source/ui/collab/sccollaboration.cxx b/sc/source/ui/collab/sccollaboration.cxx
index fbdbe0a..aea2f0b 100644
--- a/sc/source/ui/collab/sccollaboration.cxx
+++ b/sc/source/ui/collab/sccollaboration.cxx
@@ -12,7 +12,8 @@
 #include "docsh.hxx"
 #include "sendfunc.hxx"
 
-ScCollaboration::ScCollaboration()
+ScCollaboration::ScCollaboration( ScDocShell* pScDocShell ) :
+    mpScDocShell( pScDocShell )
 {
 }
 
@@ -31,21 +32,20 @@ TeleConference* ScCollaboration::GetConference()
 
 sal_uInt64 ScCollaboration::GetId()
 {
-    return reinterpret_cast<sal_uInt64> (SfxObjectShell::Current());
+    return reinterpret_cast<sal_uInt64> (mpScDocShell);
 }
 
 void ScCollaboration::SetCollaboration( TeleConference* pConference )
 {
-    ScDocShell* pScDocShell = dynamic_cast<ScDocShell*> (SfxObjectShell::Current());
-    ScDocFunc* pDocFunc = pScDocShell ? &pScDocShell->GetDocFunc() : NULL;
+    ScDocFunc* pDocFunc = &mpScDocShell->GetDocFunc();
     ScDocFuncSend* pSender = dynamic_cast<ScDocFuncSend*> (pDocFunc);
     if (!pSender)
     {
         // This means pDocFunc has to be ScDocFuncDirect* and we are not collaborating yet.
         ScDocFuncDirect *pDirect = dynamic_cast<ScDocFuncDirect*> (pDocFunc);
         ScDocFuncRecv *pReceiver = new ScDocFuncRecv( pDirect );
-        pSender = new ScDocFuncSend( *pScDocShell, pReceiver );
-        pScDocShell->SetDocFunc( pSender );
+        pSender = new ScDocFuncSend( *mpScDocShell, pReceiver );
+        mpScDocShell->SetDocFunc( pSender );
     }
     pSender->SetCollaboration( pConference );
 }
@@ -59,9 +59,7 @@ void ScCollaboration::SendFile( TpContact* pContact, const OUString& rURL )
 
 ScDocFuncSend* ScCollaboration::GetScDocFuncSend()
 {
-    ScDocShell *pScDocShell = dynamic_cast<ScDocShell*> (SfxObjectShell::Current());
-    ScDocFunc *pDocFunc = pScDocShell ? &pScDocShell->GetDocFunc() : NULL;
-    return dynamic_cast<ScDocFuncSend*> (pDocFunc);
+    return dynamic_cast<ScDocFuncSend*> (&mpScDocShell->GetDocFunc());
 }
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sc/source/ui/docshell/docsh.cxx b/sc/source/ui/docshell/docsh.cxx
index 6bf7aec..228c6da 100644
--- a/sc/source/ui/docshell/docsh.cxx
+++ b/sc/source/ui/docshell/docsh.cxx
@@ -2540,7 +2540,7 @@ ScDocShell::ScDocShell( const ScDocShell& rShell ) :
     pSheetSaveData  ( NULL ),
     pModificator    ( NULL )
 #ifdef ENABLE_TELEPATHY
-    , mpCollaboration( new ScCollaboration() )
+    , mpCollaboration( new ScCollaboration( this ) )
 #endif
 {
     RTL_LOGFILE_CONTEXT_AUTHOR ( aLog, "sc", "nn93723", "ScDocShell::ScDocShell" );
@@ -2589,7 +2589,7 @@ ScDocShell::ScDocShell( const sal_uInt64 i_nSfxCreationFlags ) :
     pSheetSaveData  ( NULL ),
     pModificator    ( NULL )
 #ifdef ENABLE_TELEPATHY
-    , mpCollaboration( new ScCollaboration() )
+    , mpCollaboration( new ScCollaboration( this ) )
 #endif
 {
     RTL_LOGFILE_CONTEXT_AUTHOR ( aLog, "sc", "nn93723", "ScDocShell::ScDocShell" );
diff --git a/sc/source/ui/inc/sccollaboration.hxx b/sc/source/ui/inc/sccollaboration.hxx
index 41b2c58..283cce4 100644
--- a/sc/source/ui/inc/sccollaboration.hxx
+++ b/sc/source/ui/inc/sccollaboration.hxx
@@ -12,11 +12,13 @@
 
 #include <tubes/collaboration.hxx>
 class ScDocFuncSend;
+class ScDocShell;
 
 class ScCollaboration : public Collaboration
 {
+    ScDocShell* mpScDocShell;
 public:
-                            ScCollaboration();
+                            ScCollaboration( ScDocShell* pScDocShell );
     virtual                 ~ScCollaboration();
 
     virtual TeleConference* GetConference();
commit 56977dfaa541dfc06f2cec921a49f5a68a8dbcb9
Author: Matúš Kukan <matus.kukan at gmail.com>
Date:   Fri Aug 3 22:53:26 2012 +0200

    tubes: fix leaking ScCollaboration; add it to ScDocShell
    
    Change-Id: I43c951b5694ad38aa1a2e5da7cc99dfb52685349

diff --git a/sc/source/ui/collab/sendfunc.cxx b/sc/source/ui/collab/sendfunc.cxx
index d52f8b0..e3ee4dc 100644
--- a/sc/source/ui/collab/sendfunc.cxx
+++ b/sc/source/ui/collab/sendfunc.cxx
@@ -253,7 +253,7 @@ sal_Bool ScDocFuncSend::SetNormalString( bool& o_rbNumFmtSet, const ScAddress& r
         SendFile( NULL, rText );
 
     if ( rtl::OUString( rText ) == "contacts" )
-        tubes::createContacts( new ScCollaboration() );
+        tubes::createContacts( rDocShell.GetCollaboration() );
 
     return true; // needs some code auditing action
 }
diff --git a/sc/source/ui/docshell/docsh.cxx b/sc/source/ui/docshell/docsh.cxx
index 2c3d5ac..6bf7aec 100644
--- a/sc/source/ui/docshell/docsh.cxx
+++ b/sc/source/ui/docshell/docsh.cxx
@@ -112,6 +112,9 @@
 #include "cellsuno.hxx"
 #include "dpobject.hxx"
 #include "markdata.hxx"
+#ifdef ENABLE_TELEPATHY
+#include "sccollaboration.hxx"
+#endif
 
 #include <vector>
 #include <boost/shared_ptr.hpp>
@@ -2505,6 +2508,11 @@ ScDocFunc *ScDocShell::CreateDocFunc()
 {
     return new ScDocFuncDirect( *this );
 }
+#else
+Collaboration* ScDocShell::GetCollaboration()
+{
+    return mpCollaboration;
+}
 #endif
 
 ScDocShell::ScDocShell( const ScDocShell& rShell ) :
@@ -2531,6 +2539,9 @@ ScDocShell::ScDocShell( const ScDocShell& rShell ) :
     pSolverSaveData ( NULL ),
     pSheetSaveData  ( NULL ),
     pModificator    ( NULL )
+#ifdef ENABLE_TELEPATHY
+    , mpCollaboration( new ScCollaboration() )
+#endif
 {
     RTL_LOGFILE_CONTEXT_AUTHOR ( aLog, "sc", "nn93723", "ScDocShell::ScDocShell" );
 
@@ -2577,6 +2588,9 @@ ScDocShell::ScDocShell( const sal_uInt64 i_nSfxCreationFlags ) :
     pSolverSaveData ( NULL ),
     pSheetSaveData  ( NULL ),
     pModificator    ( NULL )
+#ifdef ENABLE_TELEPATHY
+    , mpCollaboration( new ScCollaboration() )
+#endif
 {
     RTL_LOGFILE_CONTEXT_AUTHOR ( aLog, "sc", "nn93723", "ScDocShell::ScDocShell" );
 
@@ -2635,6 +2649,9 @@ ScDocShell::~ScDocShell()
         OSL_FAIL("The Modificator should not exist");
         delete pModificator;
     }
+#ifdef ENABLE_TELEPATHY
+    delete mpCollaboration;
+#endif
 }
 
 //------------------------------------------------------------------
diff --git a/sc/source/ui/inc/docsh.hxx b/sc/source/ui/inc/docsh.hxx
index dc55102..3076592 100644
--- a/sc/source/ui/inc/docsh.hxx
+++ b/sc/source/ui/inc/docsh.hxx
@@ -73,6 +73,9 @@ class ScOptSolverSave;
 class ScSheetSaveData;
 class ScFlatBoolRowSegments;
 struct ScColWidthParam;
+#ifdef ENABLE_TELEPATHY
+class Collaboration;
+#endif
 
 namespace sfx2 { class FileDialogHelper; }
 struct DocShell_Impl;
@@ -121,6 +124,9 @@ class SC_DLLPUBLIC ScDocShell: public SfxObjectShell, public SfxListener
     ScSheetSaveData*    pSheetSaveData;
 
     ScDocShellModificator* pModificator; // #109979#; is used to load XML (created in BeforeXMLLoading and destroyed in AfterXMLLoading)
+#ifdef ENABLE_TELEPATHY
+    Collaboration*      mpCollaboration;
+#endif
 
     SC_DLLPRIVATE void          InitItems();
     SC_DLLPRIVATE void          DoEnterHandler();
@@ -186,6 +192,9 @@ public:
     using SfxShell::Deactivate;         // with sal_Bool bMDI
     using SfxObjectShell::Print;        // print styles
 
+#ifdef ENABLE_TELEPATHY
+    SC_DLLPRIVATE Collaboration* GetCollaboration();
+#endif
     virtual void    Activate();
     virtual void    Deactivate();
 
diff --git a/sc/source/ui/view/cellsh3.cxx b/sc/source/ui/view/cellsh3.cxx
index 32b5a00..4850229 100644
--- a/sc/source/ui/view/cellsh3.cxx
+++ b/sc/source/ui/view/cellsh3.cxx
@@ -118,7 +118,7 @@ void ScCellShell::Execute( SfxRequest& rReq )
 
         case SID_COLLABORATION:
 #ifdef ENABLE_TELEPATHY
-            tubes::createContacts( new ScCollaboration() );
+            tubes::createContacts( GetViewData()->GetDocShell()->GetCollaboration() );
 #endif
             break;
 
diff --git a/tubes/source/contacts.cxx b/tubes/source/contacts.cxx
index d24ffd3..aa3fb79 100644
--- a/tubes/source/contacts.cxx
+++ b/tubes/source/contacts.cxx
@@ -185,7 +185,6 @@ public:
     }
     virtual ~TubeContacts()
     {
-        delete mpCollaboration;
         delete mpManager;
     }
 
commit 0c9aae91bcbd0cb7b0f0f7e8631aa4aeebb20993
Author: Matúš Kukan <matus.kukan at gmail.com>
Date:   Fri Aug 3 15:40:04 2012 +0200

    tubes: use SAL_INFO SAL_WARN here
    
    Change-Id: Iae41c7f3d6718c06092d41d9b3757a821dba87b5

diff --git a/tubes/source/contacts.cxx b/tubes/source/contacts.cxx
index ff42df3..d24ffd3 100644
--- a/tubes/source/contacts.cxx
+++ b/tubes/source/contacts.cxx
@@ -117,10 +117,10 @@ class TubeContacts : public ModelessDialog
         {
             TpAccount* pAccount = pAC->mpAccount;
             TpContact* pContact = pAC->mpContact;
-            fprintf( stderr, "picked %s\n", tp_contact_get_identifier( pContact ) );
+            SAL_INFO( "tubes", "picked " << tp_contact_get_identifier( pContact ) );
             TeleConference* pConference = mpManager->startBuddySession( pAccount, pContact );
             if (!pConference)
-                fprintf( stderr, "could not start session with %s\n",
+                SAL_WARN( "tubes", "Could not start session with " <<
                         tp_contact_get_identifier( pContact ) );
             else
             {
@@ -139,11 +139,11 @@ class TubeContacts : public ModelessDialog
         if (pAC)
         {
             TpAccount* pAccount = pAC->mpAccount;
-            fprintf( stderr, "picked %s\n", tp_account_get_display_name( pAccount ) );
+            SAL_INFO( "tubes", "picked " << tp_account_get_display_name( pAccount ) );
             TeleConference* pConference = mpManager->startGroupSession( pAccount,
                     rtl::OUString("liboroom"), rtl::OUString("conference.jabber.org") );
             if (!pConference)
-                fprintf( stderr, "could not start group session\n" );
+                SAL_WARN( "tubes", "Could not start group session." );
             else
             {
                 mpCollaboration->SetCollaboration( pConference );
commit 2965a1c3fca6d8807e657252e53bbb2f4f63b60f
Author: Matúš Kukan <matus.kukan at gmail.com>
Date:   Fri Aug 3 15:32:28 2012 +0200

    tubes: we use less symbols after bc21b49a464ae153341ee8d836993ca89b1a6919
    
    Change-Id: Ibf2e3d3f5de87848ba8efb669308fe790d6622d6

diff --git a/tubes/Package_inc.mk b/tubes/Package_inc.mk
index 1502b90..c6606fc 100644
--- a/tubes/Package_inc.mk
+++ b/tubes/Package_inc.mk
@@ -28,7 +28,6 @@ $(eval $(call gb_Package_Package,tubes_inc,$(SRCDIR)/tubes/inc))
 
 $(eval $(call gb_Package_add_file,tubes_inc,inc/tubes/collaboration.hxx,tubes/collaboration.hxx))
 $(eval $(call gb_Package_add_file,tubes_inc,inc/tubes/conference.hxx,tubes/conference.hxx))
-$(eval $(call gb_Package_add_file,tubes_inc,inc/tubes/contact-list.hxx,tubes/contact-list.hxx))
 $(eval $(call gb_Package_add_file,tubes_inc,inc/tubes/contacts.hxx,tubes/contacts.hxx))
 $(eval $(call gb_Package_add_file,tubes_inc,inc/tubes/manager.hxx,tubes/manager.hxx))
 $(eval $(call gb_Package_add_file,tubes_inc,inc/tubes/tubesdllapi.h,tubes/tubesdllapi.h))
diff --git a/tubes/inc/tubes/conference.hxx b/tubes/inc/tubes/conference.hxx
index 6a02604..99eb009 100644
--- a/tubes/inc/tubes/conference.hxx
+++ b/tubes/inc/tubes/conference.hxx
@@ -64,14 +64,14 @@ public:
     /** Pop a received packet. */
     bool                    popPacket( OString& rPacket );
 
-    TUBES_DLLPUBLIC void    invite( TpContact *pContact );
+    void                    invite( TpContact *pContact );
 
     /** Emitted when a packet is received. */
     boost::signals2::signal<void (const OString&)> sigPacketReceived;
 
     typedef void          (*FileSentCallback)( bool aSuccess, void* pUserData);
     TUBES_DLLPUBLIC void    sendFile( TpContact* pContact, rtl::OUString &localUri, FileSentCallback pCallback, void* pUserData);
-    TUBES_DLLPUBLIC const OString& getUuid() const { return msUuid; }
+    const OString&          getUuid() const { return msUuid; }
 
     // --- following only to be called only by manager's callbacks ---
     // TODO: make friends instead
diff --git a/tubes/inc/tubes/contact-list.hxx b/tubes/inc/tubes/contact-list.hxx
index eca9f70..6dc4f32 100644
--- a/tubes/inc/tubes/contact-list.hxx
+++ b/tubes/inc/tubes/contact-list.hxx
@@ -33,8 +33,6 @@
 #include <utility>
 #include <vector>
 
-#include "tubes/tubesdllapi.h"
-
 typedef struct _TpAccount TpAccount;
 typedef struct _TpContact TpContact;
 typedef struct _TpAccountManager TpAccountManager;
@@ -42,7 +40,7 @@ typedef struct _TpAccountManager TpAccountManager;
 typedef ::std::pair< TpAccount *, TpContact * > AccountContactPair;
 typedef ::std::vector< AccountContactPair > AccountContactPairV;
 
-class TUBES_DLLPUBLIC ContactList
+class ContactList
 {
 public:
     ContactList(TpAccountManager *pAccountManager);
diff --git a/tubes/inc/tubes/manager.hxx b/tubes/inc/tubes/manager.hxx
index 8f7afa6..67f319c 100644
--- a/tubes/inc/tubes/manager.hxx
+++ b/tubes/inc/tubes/manager.hxx
@@ -73,10 +73,10 @@ public:
     TUBES_DLLPUBLIC bool                    init( bool bListen );
 
     /** Connect to DBus and create AccountManager. */
-    TUBES_DLLPUBLIC bool                    createAccountManager();
+    bool                    createAccountManager();
 
     /** Setup client handlers. */
-    TUBES_DLLPUBLIC bool                    registerClients();
+    bool                    registerClients();
 
     /** Prepare the Telepathy Account Manager.
         Requires createAccountManager() to have succeeded.
@@ -86,13 +86,13 @@ public:
 
         TODO: this needs some signalling mechanism
      */
-    TUBES_DLLPUBLIC void                    prepareAccountManager();
-    TUBES_DLLPUBLIC AccountManagerStatus    getAccountManagerStatus() const;
+    void                    prepareAccountManager();
+    AccountManagerStatus    getAccountManagerStatus() const;
 
     /** Fetches the contact list. Returns 0 before connect() is called successfully.
         Is non-functional until prepareAccountManager().
      */
-    TUBES_DLLPUBLIC ContactList*            getContactList() const;
+    ContactList*            getContactList() const;
 
     /** Start a group session in a MUC.
 
@@ -108,7 +108,7 @@ public:
             empty, only the conference's UUID is used and rConferenceRoom is
             ignored, hopefully resulting in a local DBus tube.
      */
-    TUBES_DLLPUBLIC TeleConference*         startGroupSession( TpAccount *pAccount,
+    TeleConference*         startGroupSession( TpAccount *pAccount,
                                                 const rtl::OUString& rConferenceRoom,
                                                 const rtl::OUString& rConferenceServer );
 
@@ -120,7 +120,7 @@ public:
         @param pBuddy
             The buddy to be connected. Must be a contact of pAccount.
      */
-    TUBES_DLLPUBLIC TeleConference*         startBuddySession( TpAccount *pAccount, TpContact *pBuddy );
+    TeleConference*         startBuddySession( TpAccount *pAccount, TpContact *pBuddy );
 
     /** Get a conference with current UUID to set a session. */
     TUBES_DLLPUBLIC static TeleConference*  getConference();
commit b7e077787849a91efbc81fbbf5fd885b7cd0f3e1
Author: Matúš Kukan <matus.kukan at gmail.com>
Date:   Fri Aug 3 15:22:26 2012 +0200

    tubes: do not use boost::signal here; call function directly
    
    Change-Id: Iaab997f3d56d76fe98d70f8cffdbb44a34500901

diff --git a/tubes/inc/tubes/contact-list.hxx b/tubes/inc/tubes/contact-list.hxx
index bb504dc..eca9f70 100644
--- a/tubes/inc/tubes/contact-list.hxx
+++ b/tubes/inc/tubes/contact-list.hxx
@@ -34,7 +34,6 @@
 #include <vector>
 
 #include "tubes/tubesdllapi.h"
-#include <tubes/warnings_guard_boost_signals2.hpp>
 
 typedef struct _TpAccount TpAccount;
 typedef struct _TpContact TpContact;
@@ -51,9 +50,6 @@ public:
 
     AccountContactPairV     getContacts();
 
-    /** Emitted when a contact changes its presence. */
-    boost::signals2::signal<void ()> sigContactListChanged;
-
 private:
     TpAccountManager*       mpAccountManager;
     std::set< TpContact* >  maRegistered;
diff --git a/tubes/source/contact-list.cxx b/tubes/source/contact-list.cxx
index 78f84b5..9a5b492 100644
--- a/tubes/source/contact-list.cxx
+++ b/tubes/source/contact-list.cxx
@@ -92,13 +92,16 @@ tb_contact_is_online (TpContact *contact)
     }
 }
 
+namespace tubes {
+    void reDrawAllContacts();
+}
 static void presence_changed_cb( TpContact* /* contact */,
                                  guint      /* type */,
                                  gchar*     /* status */,
                                  gchar*     /* message */,
-                                 gpointer   pContactList )
+                                 gpointer   /* pContactList*/ )
 {
-    reinterpret_cast<ContactList*> (pContactList)->sigContactListChanged();
+    tubes::reDrawAllContacts();
 }
 
 AccountContactPairV ContactList::getContacts()
diff --git a/tubes/source/contacts.cxx b/tubes/source/contacts.cxx
index 9245b55..ff42df3 100644
--- a/tubes/source/contacts.cxx
+++ b/tubes/source/contacts.cxx
@@ -182,9 +182,6 @@ public:
         sHeader += String( TubesResId( STR_HEADER_NAME ) );
         sHeader += '\t';
         maList.InsertHeaderEntry( sHeader, HEADERBAR_APPEND, HIB_LEFT );
-
-        mpManager->getContactList()->sigContactListChanged.connect(
-                boost::bind( &TubeContacts::Populate, this ) );
     }
     virtual ~TubeContacts()
     {
@@ -263,10 +260,12 @@ IMPL_LINK_NOARG( TubeContacts, BtnListenHdl )
     return 0;
 }
 
+// Mapping contacts dialog instance for each document
+typedef std::map< sal_uInt64, TubeContacts* > DialogsMap;
+static DialogsMap aDialogsMap;
+
 TubeContacts* ContactsFactory( Collaboration* pCollaboration )
 {
-    // Mapping contacts dialog instance for each document
-    static std::map< sal_uInt64, TubeContacts* > aDialogsMap;
     sal_uInt64 Id = pCollaboration->GetId();
     if (aDialogsMap.find( Id ) == aDialogsMap.end())
         aDialogsMap[ Id ] = new TubeContacts( pCollaboration );
@@ -281,6 +280,14 @@ void createContacts( Collaboration* pCollaboration )
     TubeContacts* pContacts = ContactsFactory( pCollaboration );
     pContacts->Populate();
 }
+
+void reDrawAllContacts()
+{
+    for (DialogsMap::const_iterator it = aDialogsMap.begin();
+            it != aDialogsMap.end(); ++it)
+        it->second->Populate();
+}
+
 }
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
commit 4e648b8e7c65fd8c382baf6b6798cdedfac5cdd8
Author: Matúš Kukan <matus.kukan at gmail.com>
Date:   Fri Aug 3 14:02:01 2012 +0200

    tubes: create contacts dialog instance for each document separately
    
    This solves a crash when static dialog instance was destroyed on closing of
    one document but then was used in another document.
    
    Change-Id: I6ac9edb1de83f638bdf4ce7c0814fcbdf4b4b1e5

diff --git a/sc/source/ui/collab/sccollaboration.cxx b/sc/source/ui/collab/sccollaboration.cxx
index 758db89..fbdbe0a 100644
--- a/sc/source/ui/collab/sccollaboration.cxx
+++ b/sc/source/ui/collab/sccollaboration.cxx
@@ -20,7 +20,7 @@ ScCollaboration::~ScCollaboration()
 {
 }
 
-TeleConference* ScCollaboration::GetConference() const
+TeleConference* ScCollaboration::GetConference()
 {
     ScDocFuncSend* pSender = GetScDocFuncSend();
     if (pSender)
@@ -29,6 +29,11 @@ TeleConference* ScCollaboration::GetConference() const
     return NULL;
 }
 
+sal_uInt64 ScCollaboration::GetId()
+{
+    return reinterpret_cast<sal_uInt64> (SfxObjectShell::Current());
+}
+
 void ScCollaboration::SetCollaboration( TeleConference* pConference )
 {
     ScDocShell* pScDocShell = dynamic_cast<ScDocShell*> (SfxObjectShell::Current());
@@ -52,7 +57,7 @@ void ScCollaboration::SendFile( TpContact* pContact, const OUString& rURL )
         pSender->SendFile( pContact, rURL );
 }
 
-ScDocFuncSend* ScCollaboration::GetScDocFuncSend() const
+ScDocFuncSend* ScCollaboration::GetScDocFuncSend()
 {
     ScDocShell *pScDocShell = dynamic_cast<ScDocShell*> (SfxObjectShell::Current());
     ScDocFunc *pDocFunc = pScDocShell ? &pScDocShell->GetDocFunc() : NULL;
diff --git a/sc/source/ui/inc/sccollaboration.hxx b/sc/source/ui/inc/sccollaboration.hxx
index 545db92..41b2c58 100644
--- a/sc/source/ui/inc/sccollaboration.hxx
+++ b/sc/source/ui/inc/sccollaboration.hxx
@@ -19,11 +19,12 @@ public:
                             ScCollaboration();
     virtual                 ~ScCollaboration();
 
-    virtual TeleConference* GetConference() const;
+    virtual TeleConference* GetConference();
+    virtual sal_uInt64      GetId();
     virtual void            SetCollaboration( TeleConference* pConference );
     virtual void            SendFile( TpContact* pContact, const OUString& rURL );
 private:
-    ScDocFuncSend*          GetScDocFuncSend() const;
+    ScDocFuncSend*          GetScDocFuncSend();
 };
 
 #endif // INCLUDED_SC_COLLABORATION_HXX
diff --git a/tubes/inc/tubes/collaboration.hxx b/tubes/inc/tubes/collaboration.hxx
index 5a3dddc..31eff7a 100644
--- a/tubes/inc/tubes/collaboration.hxx
+++ b/tubes/inc/tubes/collaboration.hxx
@@ -23,7 +23,8 @@ public:
             Collaboration() {}
     virtual ~Collaboration() {}
 
-    virtual TeleConference*     GetConference() const = 0;
+    virtual TeleConference*     GetConference() = 0;
+    virtual sal_uInt64          GetId() = 0;
     virtual void                SetCollaboration( TeleConference* pConference ) = 0;
     // TODO: I think this could be moved to TeleManager later.
     virtual void                SendFile( TpContact* pContact, const OUString& rURL ) = 0;
diff --git a/tubes/source/contacts.cxx b/tubes/source/contacts.cxx
index 540e8a6..9245b55 100644
--- a/tubes/source/contacts.cxx
+++ b/tubes/source/contacts.cxx
@@ -42,10 +42,13 @@
 #include <vcl/dialog.hxx>
 #include <vcl/unohelp.hxx>
 
+#include <map>
 #include <vector>
 #include <boost/ptr_container/ptr_vector.hpp>
 #include <telepathy-glib/telepathy-glib.h>
 
+namespace {
+
 ResId TubesResId( sal_uInt32 nId )
 {
     static ResMgr* pResMgr = NULL;
@@ -56,7 +59,6 @@ ResId TubesResId( sal_uInt32 nId )
     return ResId( nId, *pResMgr );
 }
 
-namespace {
 class TubeContacts : public ModelessDialog
 {
     FixedLine               maLabel;
@@ -261,12 +263,22 @@ IMPL_LINK_NOARG( TubeContacts, BtnListenHdl )
     return 0;
 }
 
+TubeContacts* ContactsFactory( Collaboration* pCollaboration )
+{
+    // Mapping contacts dialog instance for each document
+    static std::map< sal_uInt64, TubeContacts* > aDialogsMap;
+    sal_uInt64 Id = pCollaboration->GetId();
+    if (aDialogsMap.find( Id ) == aDialogsMap.end())
+        aDialogsMap[ Id ] = new TubeContacts( pCollaboration );
+    return aDialogsMap[ Id ];
+}
+
 } // anonymous namespace
 
 namespace tubes {
 void createContacts( Collaboration* pCollaboration )
 {
-    static TubeContacts *pContacts = new TubeContacts( pCollaboration );
+    TubeContacts* pContacts = ContactsFactory( pCollaboration );
     pContacts->Populate();
 }
 }
commit f2c7d7aea4ec8c1f9f38e1d00c14dadca67b863e
Author: Matúš Kukan <matus.kukan at gmail.com>
Date:   Fri Aug 3 13:29:47 2012 +0200

    tubes: remove pointless define
    
    Change-Id: I5ef7f8a5a37d0a77a9dadc44e1e895581c2ebb50

diff --git a/tubes/source/contacts.cxx b/tubes/source/contacts.cxx
index 046be97..540e8a6 100644
--- a/tubes/source/contacts.cxx
+++ b/tubes/source/contacts.cxx
@@ -56,9 +56,6 @@ ResId TubesResId( sal_uInt32 nId )
     return ResId( nId, *pResMgr );
 }
 
-#define CONTACTS_DLG
-
-#ifdef CONTACTS_DLG
 namespace {
 class TubeContacts : public ModelessDialog
 {
@@ -265,15 +262,12 @@ IMPL_LINK_NOARG( TubeContacts, BtnListenHdl )
 }
 
 } // anonymous namespace
-#endif
 
 namespace tubes {
 void createContacts( Collaboration* pCollaboration )
 {
-#ifdef CONTACTS_DLG
     static TubeContacts *pContacts = new TubeContacts( pCollaboration );
     pContacts->Populate();
-#endif
 }
 }
 
commit 3ef03fbf80760a1d21df5cfb410e94162f121914
Author: Matúš Kukan <matus.kukan at gmail.com>
Date:   Fri Aug 3 11:44:57 2012 +0200

    tubes: make TeleManager::getConference() static
    
    Change-Id: Ic7023a40eb2f09802b100d9317c0a6a66d901476

diff --git a/sc/source/ui/collab/sendfunc.cxx b/sc/source/ui/collab/sendfunc.cxx
index 1a1203d..d52f8b0 100644
--- a/sc/source/ui/collab/sendfunc.cxx
+++ b/sc/source/ui/collab/sendfunc.cxx
@@ -356,9 +356,7 @@ ScDocFunc *ScDocShell::CreateDocFunc()
         ScDocFuncDirect *pDirect = new ScDocFuncDirect( *this );
         ScDocFuncRecv *pReceiver = new ScDocFuncRecv( pDirect );
         ScDocFuncSend *pSender = new ScDocFuncSend( *this, pReceiver );
-        TeleManager *pManager = new TeleManager();
-        pSender->SetCollaboration( pManager->getConference() );
-        delete pManager;
+        pSender->SetCollaboration( TeleManager::getConference() );
         return pSender;
     }
     else
diff --git a/tubes/inc/tubes/manager.hxx b/tubes/inc/tubes/manager.hxx
index b5a68b2..8f7afa6 100644
--- a/tubes/inc/tubes/manager.hxx
+++ b/tubes/inc/tubes/manager.hxx
@@ -123,7 +123,7 @@ public:
     TUBES_DLLPUBLIC TeleConference*         startBuddySession( TpAccount *pAccount, TpContact *pBuddy );
 
     /** Get a conference with current UUID to set a session. */
-    TUBES_DLLPUBLIC TeleConference*         getConference();
+    TUBES_DLLPUBLIC static TeleConference*  getConference();
 
     /** True if there has been tube channel received and is still not used. */
     TUBES_DLLPUBLIC static bool             hasWaitingConference();
diff --git a/tubes/source/manager.cxx b/tubes/source/manager.cxx
index 40754a4..7722844 100644
--- a/tubes/source/manager.cxx
+++ b/tubes/source/manager.cxx
@@ -165,7 +165,7 @@ void TeleManager::addConference( TeleConference* pConference )
 
 TeleConference* TeleManager::getConference()
 {
-    TeleManagerImpl::MapStringConference::iterator it =
+    TeleManagerImpl::MapStringConference::const_iterator it =
             pImpl->maAcceptedConferences.find( pImpl->msCurrentUUID );
     TeleConference* pConference = NULL;
     if (it != pImpl->maAcceptedConferences.end())


More information about the Libreoffice-commits mailing list