[Libreoffice-commits] .: Branch 'feature/tubes2' - 4 commits - tubes/inc tubes/source

Will Thompson wjt at kemper.freedesktop.org
Mon Apr 2 05:35:35 PDT 2012


 tubes/inc/tubes/conference.hxx |   39 +++-
 tubes/inc/tubes/manager.hxx    |   14 +
 tubes/source/conference.cxx    |  358 +++++++++++++++++++++--------------------
 tubes/source/manager.cxx       |   70 +-------
 4 files changed, 242 insertions(+), 239 deletions(-)

New commits:
commit 0af429b1446fecc82e679519755350df984c6cae
Author: Will Thompson <will.thompson at collabora.co.uk>
Date:   Sun Apr 1 15:30:39 2012 +0100

    tubes: make conference hold a TpDBusTubeChannel
    
    It already was, actually. :)

diff --git a/tubes/inc/tubes/conference.hxx b/tubes/inc/tubes/conference.hxx
index 118def6..fca6e2e 100644
--- a/tubes/inc/tubes/conference.hxx
+++ b/tubes/inc/tubes/conference.hxx
@@ -49,7 +49,7 @@ class TeleConference : public boost::enable_shared_from_this<TeleConference>
 {
 public:
 
-    TeleConference( TeleManager* pManager, TpAccount *pAccount, TpChannel* pChannel, const rtl::OString& rSessionId );
+    TeleConference( TeleManager* pManager, TpAccount *pAccount, TpDBusTubeChannel* pChannel, const rtl::OString& rSessionId );
     ~TeleConference();
 
     /// Close channel and call finalize()
@@ -79,8 +79,8 @@ public:
     // --- following only to be called only by manager's callbacks ---
     // TODO: make friends instead
 
-    void                    setChannel( TpAccount* pAccount, TpChannel* pChannel );
-    TpChannel*              getChannel() const  { return mpChannel; }
+    void                    setChannel( TpAccount* pAccount, TpDBusTubeChannel* pChannel );
+    TpDBusTubeChannel*      getChannel() const  { return mpChannel; }
     bool                    offerTube();
     bool                    acceptTube();
     /// got tube accepted on other end as well?
@@ -117,7 +117,7 @@ private:
     rtl::OString            maSessionId;
     TeleManager*            mpManager;
     TpAccount*              mpAccount;
-    TpChannel*              mpChannel;
+    TpDBusTubeChannel*      mpChannel;
     gchar*                  mpAddress;
     GDBusConnection*        mpTube;
     guint                   maObjectRegistrationId;
diff --git a/tubes/source/conference.cxx b/tubes/source/conference.cxx
index 9c2e8d7..1cd9248 100644
--- a/tubes/source/conference.cxx
+++ b/tubes/source/conference.cxx
@@ -142,7 +142,7 @@ static void TeleConference_ChannelCloseHandler(
 
 
 void TeleConference::TubeOfferedHandler(
-        TpChannel*      pChannel,
+        TpChannel*      pBaseChannel,
         const gchar*    pAddress,
         const GError*   pError,
         gpointer        pUserData,
@@ -168,8 +168,9 @@ void TeleConference::TubeOfferedHandler(
     if (!pAddress)
         return;
 
+    TpDBusTubeChannel* pChannel = TP_DBUS_TUBE_CHANNEL( pBaseChannel);
     SAL_WARN_IF( pChannel != pConference->getChannel(), "tubes", "TeleConference::TubeOfferedHandler: not my channel");
-    if (pChannel != pConference->getChannel())
+    if ((pChannel) != pConference->getChannel())
         return;
 
     pConference->mpAddress = g_strdup( pAddress );
@@ -192,7 +193,7 @@ bool TeleConference::tryToOpen()
 }
 
 void TeleConference::TubeChannelStateChangedHandler(
-        TpChannel*  pChannel,
+        TpChannel*  pBaseChannel,
         guint       nState,
         gpointer    pUserData,
         GObject*    /*weak_object*/
@@ -207,6 +208,7 @@ void TeleConference::TubeChannelStateChangedHandler(
     if (!pConference)
         return;
 
+    TpDBusTubeChannel* pChannel = TP_DBUS_TUBE_CHANNEL( pBaseChannel);
     SAL_WARN_IF( pChannel != pConference->getChannel(), "tubes",
             "TeleConference::TubeChannelStateChangedHandler: not my channel");
     if (pChannel != pConference->getChannel())
@@ -217,7 +219,7 @@ void TeleConference::TubeChannelStateChangedHandler(
 }
 
 
-TeleConference::TeleConference( TeleManager* pManager, TpAccount* pAccount, TpChannel* pChannel, const rtl::OString& rSessionId )
+TeleConference::TeleConference( TeleManager* pManager, TpAccount* pAccount, TpDBusTubeChannel* pChannel, const rtl::OString& rSessionId )
     :
         maSessionId( rSessionId ),
         mpManager( pManager),
@@ -238,7 +240,7 @@ TeleConference::~TeleConference()
 }
 
 
-void TeleConference::setChannel( TpAccount *pAccount, TpChannel* pChannel )
+void TeleConference::setChannel( TpAccount *pAccount, TpDBusTubeChannel* pChannel )
 {
     OSL_ENSURE( !mpChannel, "TeleConference::setChannel: already have channel");
     if (mpChannel)
@@ -254,7 +256,7 @@ void TeleConference::setChannel( TpAccount *pAccount, TpChannel* pChannel )
         GError* pError = NULL;
         TpProxySignalConnection* pProxySignalConnection =
             tp_cli_channel_interface_tube_connect_to_tube_channel_state_changed(
-                    mpChannel,
+                    TP_CHANNEL( mpChannel),
                     &TeleConference::TubeChannelStateChangedHandler,
                     this,
                     NULL,
@@ -295,7 +297,7 @@ bool TeleConference::acceptTube()
     if (!mpChannel || mpTube)
         return false;
 
-    tp_cli_channel_type_dbus_tube_call_accept( mpChannel, -1,
+    tp_cli_channel_type_dbus_tube_call_accept( TP_CHANNEL( mpChannel), -1,
             TP_SOCKET_ACCESS_CONTROL_CREDENTIALS,
             &TeleConference::TubeOfferedHandler,
             this, NULL, NULL);
@@ -318,7 +320,7 @@ bool TeleConference::offerTube()
             NULL);
 
     tp_cli_channel_type_dbus_tube_call_offer(
-            mpChannel,                              // proxy
+            TP_CHANNEL( mpChannel),                 // proxy
             -1,                                     // timeout_ms
             pParams,                                // in_parameters
             TP_SOCKET_ACCESS_CONTROL_CREDENTIALS,   // in_access_control
@@ -387,7 +389,7 @@ void TeleConference::close()
     INFO_LOGGER( "TeleConference::close");
 
     if (mpChannel)
-        tp_cli_channel_call_close( mpChannel, 5000, TeleConference_ChannelCloseHandler, this, NULL, NULL);
+        tp_cli_channel_call_close( TP_CHANNEL( mpChannel), 5000, TeleConference_ChannelCloseHandler, this, NULL, NULL);
     else
         finalize();
 }
@@ -552,7 +554,7 @@ void TeleConference::sendFile( rtl::OUString &localUri, FileSentCallback pCallba
     SendFileRequest *pReq = new SendFileRequest( this, pCallback, pUserData);
 
     empathy_ft_handler_new_outgoing( mpAccount,
-        tp_channel_get_target_contact( mpChannel),
+        tp_channel_get_target_contact( TP_CHANNEL( mpChannel)),
         pSource,
         0,
         &TeleConference::FTReady, pReq);
diff --git a/tubes/source/manager.cxx b/tubes/source/manager.cxx
index 32589f1..2e0cd3e 100644
--- a/tubes/source/manager.cxx
+++ b/tubes/source/manager.cxx
@@ -119,12 +119,12 @@ void TeleManager::DBusChannelHandler(
         SAL_INFO( "tubes", "TeleManager::DBusChannelHandler: incoming dbus channel: "
                 << tp_channel_get_identifier( pChannel));
 
-        if (tp_channel_get_channel_type_id( pChannel) == TP_IFACE_QUARK_CHANNEL_TYPE_DBUS_TUBE)
+        if (TP_IS_DBUS_TUBE_CHANNEL( pChannel))
         {
             SAL_INFO( "tubes", "accepting");
             aAccepted = true;
 
-            TeleConferencePtr pConference( new TeleConference( pManager, pAccount, pChannel, ""));
+            TeleConferencePtr pConference( new TeleConference( pManager, pAccount, TP_DBUS_TUBE_CHANNEL( pChannel), ""));
             pManager->maConferences.push_back( pConference);
             pConference->acceptTube();
         }
@@ -283,7 +283,7 @@ static void TeleManager_ChannelReadyHandler(
     }
 
     pConference->setChannel( tp_account_channel_request_get_account( pChannelRequest),
-            pChannel);
+            TP_DBUS_TUBE_CHANNEL (pChannel));
     pConference->offerTube();
 }
 
commit cb2407e1b0c2188211562292529142c82b3bd7b5
Author: Will Thompson <will.thompson at collabora.co.uk>
Date:   Fri Mar 30 18:50:27 2012 +0100

    tubes: use GDBus rather than libdbus
    
    GDBus is the future. And TpDBusTubeChannel will ultimately give us a
    GDBusConnection, so...

diff --git a/tubes/inc/tubes/conference.hxx b/tubes/inc/tubes/conference.hxx
index 4ae49c8..118def6 100644
--- a/tubes/inc/tubes/conference.hxx
+++ b/tubes/inc/tubes/conference.hxx
@@ -100,6 +100,15 @@ public:
                                                gpointer pUserData, GObject*pWeakObject);
     static void             FTReady( EmpathyFTHandler *handler, GError *error, gpointer user_data);
 
+    static void             methodCallHandler(GDBusConnection*       pConnection,
+                                              const gchar*           pSender,
+                                              const gchar*           pObjectPath,
+                                              const gchar*           pInterfaceName,
+                                              const gchar*           pMethodName,
+                                              GVariant*              pParameters,
+                                              GDBusMethodInvocation* pInvocation,
+                                              void*                  pUserData);
+
 private:
     bool                    tryToOpen();
     bool                    spinUntilTubeEstablished();
@@ -110,7 +119,8 @@ private:
     TpAccount*              mpAccount;
     TpChannel*              mpChannel;
     gchar*                  mpAddress;
-    DBusConnection*         mpTube;
+    GDBusConnection*        mpTube;
+    guint                   maObjectRegistrationId;
     TelePacketQueue         maPacketQueue;
     TpTubeChannelState      meTubeChannelState;
 
diff --git a/tubes/inc/tubes/manager.hxx b/tubes/inc/tubes/manager.hxx
index 75e298c..9aef847 100644
--- a/tubes/inc/tubes/manager.hxx
+++ b/tubes/inc/tubes/manager.hxx
@@ -43,7 +43,9 @@
 #include <boost/signals2.hpp>
 
 // For testing purposes, we might need more in future.
+#define LIBO_TUBES_DBUS_INTERFACE "org.libreoffice.calc"
 #define LIBO_TUBES_DBUS_MSG_METHOD "LibOMsg"
+#define LIBO_TUBES_DBUS_PATH "/org/libreoffice/calc"
 
 typedef ::std::vector<TeleConferencePtr> TeleConferenceVector;
 
diff --git a/tubes/source/conference.cxx b/tubes/source/conference.cxx
index 824b9c8..9c2e8d7 100644
--- a/tubes/source/conference.cxx
+++ b/tubes/source/conference.cxx
@@ -57,59 +57,62 @@ struct InfoLogger
 #define INFO_LOGGER(s)
 #endif // SAL_LOG_INFO
 
-
-static DBusHandlerResult TeleConference_DBusMessageHandler(
-        DBusConnection* pConnection,
-        DBusMessage*    pMessage,
-        void*           pUserData
-        )
+void TeleConference::methodCallHandler(
+    GDBusConnection*       /*pConnection*/,
+    const gchar*           pSender,
+    const gchar*           /*pObjectPath*/,
+    const gchar*           pInterfaceName,
+    const gchar*           pMethodName,
+    GVariant*              pParameters,
+    GDBusMethodInvocation* pInvocation,
+    void*                  pUserData)
 {
-    INFO_LOGGER_F( "TeleConference_DBusMessageHandler");
-
-    SAL_WARN_IF( !pConnection || !pMessage, "tubes", "TeleConference_DBusMessageHandler: unhandled");
-    if (!pConnection || !pMessage)
-        return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+    INFO_LOGGER_F( "TeleConference::methodCallHandler");
 
     TeleConference* pConference = reinterpret_cast<TeleConference*>(pUserData);
-    SAL_WARN_IF( !pConference, "tubes", "TeleConference_DBusMessageHandler: no conference");
+    SAL_WARN_IF( !pConference, "tubes", "TeleConference::methodCallHandler: no conference");
     if (!pConference)
-        return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+        return;
 
     TeleManager* pManager = pConference->getManager();
-    SAL_WARN_IF( !pManager, "tubes", "TeleConference_DBusMessageHandler: no manager");
+    SAL_WARN_IF( !pManager, "tubes", "TeleConference::methodCallHandler: no manager");
     if (!pManager)
-        return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+        return;
 
-    if (dbus_message_is_method_call( pMessage, pManager->getFullServiceName().getStr(), LIBO_TUBES_DBUS_MSG_METHOD))
+    if (tp_strdiff (pMethodName, LIBO_TUBES_DBUS_MSG_METHOD))
     {
-        const char* pSender = dbus_message_get_sender( pMessage);
-
-        DBusError aDBusError;
-        dbus_error_init( &aDBusError);
-        const char* pPacketData = 0;
-        int nPacketSize = 0;
-        if (dbus_message_get_args( pMessage, &aDBusError,
-                    DBUS_TYPE_ARRAY, DBUS_TYPE_BYTE, &pPacketData, &nPacketSize,
-                    DBUS_TYPE_INVALID))
-        {
-            SAL_INFO( "tubes", "TeleConference_DBusMessageHandler: received packet from sender "
-                    << (pSender ? pSender : "(null)") << " with size " << nPacketSize);
-            pConference->queue( pSender, pPacketData, nPacketSize);
-            return DBUS_HANDLER_RESULT_HANDLED;
-        }
-        else
-        {
-            SAL_INFO( "tubes", "TeleConference_DBusMessageHandler: unhandled message from sender "
-                    << (pSender ? pSender : "(null)") << " " << aDBusError.message);
-            dbus_error_free( &aDBusError);
-        }
+        g_dbus_method_invocation_return_error ( pInvocation,
+                G_DBUS_ERROR, G_DBUS_ERROR_UNKNOWN_METHOD,
+                "Unknown method '%s' on interface %s",
+                pMethodName, pInterfaceName );
+        return;
     }
-    else
+
+    if (!g_variant_is_of_type ( pParameters, G_VARIANT_TYPE ("(ay)")))
     {
-        SAL_INFO( "tubes", "TeleConference_DBusMessageHandler: unhandled method");
+        g_dbus_method_invocation_return_error ( pInvocation,
+                G_DBUS_ERROR, G_DBUS_ERROR_INVALID_ARGS,
+                "'%s' takes an array of bytes, not %s",
+                pMethodName,
+                g_variant_get_type_string (pParameters));
+        return;
     }
 
-    return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+    GVariant *ay;
+    g_variant_get( pParameters, "(@ay)", &ay);
+    const char* pPacketData = reinterpret_cast<const char*>( g_variant_get_data( ay));
+    gsize nPacketSize = g_variant_get_size( ay);
+
+    SAL_WARN_IF( !pPacketData, "tubes", "TeleConference::methodCallHandler: couldn't get packet data");
+    if (!pPacketData)
+        return;
+
+    SAL_INFO( "tubes", "TeleConference::methodCallHandler: received packet from sender "
+            << (pSender ? pSender : "(null)") << " with size " << nPacketSize);
+    pConference->queue( pSender, pPacketData, nPacketSize);
+    g_dbus_method_invocation_return_value( pInvocation, 0 );
+
+    g_variant_unref( ay);
 }
 
 
@@ -335,21 +338,46 @@ bool TeleConference::setTube(  const char* pAddress )
 
     OSL_ENSURE( !mpTube, "TeleConference::setTube: already tubed");
 
-    DBusError aDBusError;
-    dbus_error_init( &aDBusError);
+    GError *aError = NULL;
 
-    mpTube = dbus_connection_open_private( pAddress, &aDBusError);
+    mpTube = g_dbus_connection_new_for_address_sync( pAddress,
+            G_DBUS_CONNECTION_FLAGS_AUTHENTICATION_CLIENT,
+            NULL, NULL, &aError);
     if (!mpTube)
     {
-        SAL_WARN( "tubes", "TeleConference::setTube: no dbus connection: " << aDBusError.message);
-        dbus_error_free( &aDBusError);
+        SAL_WARN( "tubes", "TeleConference::setTube: no dbus connection: " << aError->message);
+        g_clear_error( &aError);
         return false;
     }
 
-    dbus_connection_setup_with_g_main( mpTube, mpManager->getMainContext());
-    dbus_connection_add_filter( mpTube, TeleConference_DBusMessageHandler, this, NULL);
+    GDBusNodeInfo *introspection_data;
+    guint registration_id;
+    static const GDBusInterfaceVTable interface_vtable =
+    {
+        &TeleConference::methodCallHandler,
+        NULL,
+        NULL,
+        { NULL },
+    };
+    static const gchar introspection_xml[] =
+        "<node>"
+        "  <interface name='" LIBO_TUBES_DBUS_INTERFACE "'>"
+        "    <method name='" LIBO_TUBES_DBUS_MSG_METHOD "'>"
+        "      <arg type='ay' name='packet' direction='in'/>"
+        "    </method>"
+        "  </interface>"
+        "</node>";
+
+    introspection_data = g_dbus_node_info_new_for_xml (introspection_xml, NULL);
+    g_assert (introspection_data != NULL);
+
+    registration_id = g_dbus_connection_register_object( mpTube,
+            LIBO_TUBES_DBUS_PATH, introspection_data->interfaces[0],
+            &interface_vtable, this, NULL, NULL);
+    g_assert (registration_id > 0);
+
+    g_dbus_node_info_unref (introspection_data);
 
-    /* TODO: anything else? */
     return true;
 }
 
@@ -383,9 +411,9 @@ void TeleConference::finalize()
 
     if (mpTube)
     {
-        dbus_connection_remove_filter( mpTube, TeleConference_DBusMessageHandler, this);
-        dbus_connection_close( mpTube);
-        dbus_connection_unref( mpTube);
+        g_dbus_connection_unregister_object( mpTube, maObjectRegistrationId);
+        g_dbus_connection_close_sync( mpTube, NULL, NULL );
+        g_object_unref( mpTube );
         mpTube = NULL;
     }
 
@@ -411,35 +439,29 @@ bool TeleConference::sendPacket( TelePacket& rPacket )
     if (!(mpManager && mpTube))
         return false;
 
-    DBusMessage* pMessage = dbus_message_new_method_call(
-            mpManager->getFullServiceName().getStr(),
-            mpManager->getFullObjectPath().getStr(),
-            mpManager->getFullServiceName().getStr(),
-            LIBO_TUBES_DBUS_MSG_METHOD);
-    SAL_WARN_IF( !pMessage, "tubes", "TeleConference::sendPacket: no DBusMessage");
-    if (!pMessage)
-        return false;
-
-    const char* pPacketData = rPacket.getData();
-    dbus_message_append_args( pMessage,
-            DBUS_TYPE_ARRAY, DBUS_TYPE_BYTE, &pPacketData, rPacket.getSize(),
-            DBUS_TYPE_INVALID);
-
-#if defined SAL_LOG_INFO
-    const char* pSrc = dbus_message_get_sender( pMessage);
-    SAL_INFO_IF( pSrc, "tubes", "TeleConference::sendPacket: from " << pSrc);
-    const char* pDst = dbus_message_get_destination( pMessage);
-    SAL_INFO_IF( pDst, "tubes", "TeleConference::sendPacket:  to  " << pDst);
-#endif
-
-    bool bSent = dbus_connection_send( mpTube, pMessage, NULL);
-    SAL_WARN_IF( !bSent, "tubes", "TeleConference::sendPacket: not sent");
+    /* FIXME: in GLib 2.32 we can use g_variant_new_fixed_array(). It does
+     * essentially this.
+     */
+    void* pData = g_memdup( rPacket.getData(), rPacket.getSize() );
+    GVariant *pParameters = g_variant_new_from_data( G_VARIANT_TYPE("(ay)"),
+            pData, rPacket.getSize(),
+            FALSE,
+            g_free, pData);
+
+    g_dbus_connection_call( mpTube,
+            NULL, /* bus name; in multi-user case we'd address this to the master. */
+            LIBO_TUBES_DBUS_PATH,
+            LIBO_TUBES_DBUS_INTERFACE,
+            LIBO_TUBES_DBUS_MSG_METHOD,
+            pParameters, /* consumes the floating reference */
+            NULL,
+            G_DBUS_CALL_FLAGS_NONE,
+            -1, NULL, NULL, NULL);
 
     /* FIXME: need to impose an ordering on packets. */
     queue( rPacket );
 
-    dbus_message_unref( pMessage);
-    return bSent;
+    return true;
 }
 
 
commit 1570df6f5623f62f587ea6c460491c09769fe614
Author: Will Thompson <will.thompson at collabora.co.uk>
Date:   Fri Mar 30 18:43:22 2012 +0100

    tubes: move Accept() logic into conference
    
    This makes sense, because the flow for Accept() and Offer() is basically
    symmetrical, and then conference becomes solely responsible for the
    handling of channels once they've been requested/given to us.
    
    While we're at it we also fix both code paths to work correctly if the
    state becomes Open before Accept/Offer returns (which is possible).

diff --git a/tubes/inc/tubes/conference.hxx b/tubes/inc/tubes/conference.hxx
index f4ae973..4ae49c8 100644
--- a/tubes/inc/tubes/conference.hxx
+++ b/tubes/inc/tubes/conference.hxx
@@ -82,36 +82,39 @@ public:
     void                    setChannel( TpAccount* pAccount, TpChannel* pChannel );
     TpChannel*              getChannel() const  { return mpChannel; }
     bool                    offerTube();
-    bool                    acceptTube( const char* pAddress );
+    bool                    acceptTube();
     /// got tube accepted on other end as well?
     bool                    isTubeOpen() const { return meTubeChannelState == TP_TUBE_CHANNEL_STATE_OPEN; }
 
     // Only for callbacks.
     void                    setTubeOfferedHandlerInvoked( bool b ) { mbTubeOfferedHandlerInvoked = b; }
     bool                    isTubeOfferedHandlerInvoked() const { return mbTubeOfferedHandlerInvoked; }
-    void                    setTubeChannelStateChangedHandlerInvoked( bool b )
-                                { mbTubeChannelStateChangedHandlerInvoked = b; }
-    bool                    isTubeChannelStateChangedHandlerInvoked() const
-                                { return mbTubeChannelStateChangedHandlerInvoked; }
+    bool                    isTubeChannelStateChangedToOpen() const
+                                { return meTubeChannelState == TP_TUBE_CHANNEL_STATE_OPEN; };
     void                    setTubeChannelState( TpTubeChannelState eState ) { meTubeChannelState = eState; }
 
+    static void             TubeChannelStateChangedHandler(TpChannel*, guint, void*, GObject*);
     static void             TubeOfferedHandler(TpChannel* pChannel, const gchar* pAddress, const GError* pError,
                                                gpointer pUserData, GObject*pWeakObject);
+    static void             TubeAcceptedHandler(TpChannel* pChannel, const gchar* pAddress, const GError* pError,
+                                               gpointer pUserData, GObject*pWeakObject);
     static void             FTReady( EmpathyFTHandler *handler, GError *error, gpointer user_data);
 
 private:
+    bool                    tryToOpen();
+    bool                    spinUntilTubeEstablished();
     bool                    setTube( const char* pTube );
 
     rtl::OString            maSessionId;
     TeleManager*            mpManager;
     TpAccount*              mpAccount;
     TpChannel*              mpChannel;
+    gchar*                  mpAddress;
     DBusConnection*         mpTube;
     TelePacketQueue         maPacketQueue;
     TpTubeChannelState      meTubeChannelState;
 
     bool                    mbTubeOfferedHandlerInvoked : 1;
-    bool                    mbTubeChannelStateChangedHandlerInvoked : 1;
 
     // hide from the public
     using boost::enable_shared_from_this<TeleConference>::shared_from_this;
diff --git a/tubes/inc/tubes/manager.hxx b/tubes/inc/tubes/manager.hxx
index 74d0424..75e298c 100644
--- a/tubes/inc/tubes/manager.hxx
+++ b/tubes/inc/tubes/manager.hxx
@@ -131,8 +131,6 @@ public:
 
     void                    disconnect();
 
-    void                    acceptTube( TpAccount* pAccount, TpChannel* pChannel, const char* pAddress );
-
     /** Send data to all registered conferences.
 
         @returns to how many conferences the packet was send
@@ -217,6 +215,16 @@ public:
 /* Callbacks; not for use outside this class. */
     static void             TransferDone( EmpathyFTHandler *handler, TpFileTransferChannel *, gpointer user_data);
 
+    static void             DBusChannelHandler(
+        TpSimpleHandler*            /*handler*/,
+        TpAccount*                  pAccount,
+        TpConnection*               /*connection*/,
+        GList*                      pChannels,
+        GList*                      /*requests_satisfied*/,
+        gint64                      /*user_action_time*/,
+        TpHandleChannelsContext*    pContext,
+        gpointer                    pUserData);
+
 private:
     void                    ensureLegacyChannel( TpAccount* pAccount, TpContact* pBuddy );
 
diff --git a/tubes/source/conference.cxx b/tubes/source/conference.cxx
index 82eb1e7..824b9c8 100644
--- a/tubes/source/conference.cxx
+++ b/tubes/source/conference.cxx
@@ -169,34 +169,48 @@ void TeleConference::TubeOfferedHandler(
     if (pChannel != pConference->getChannel())
         return;
 
-    pConference->setTube( pAddress );
+    pConference->mpAddress = g_strdup( pAddress );
+    pConference->tryToOpen();
 }
 
 
-static void TeleConference_TubeChannelStateChangedHandler(
+bool TeleConference::tryToOpen()
+{
+    if (mpTube)
+        return true;
+
+    if (!isTubeOpen())
+        return false;
+
+    if (!mpAddress)
+        return false;
+
+    return setTube( mpAddress);
+}
+
+void TeleConference::TubeChannelStateChangedHandler(
         TpChannel*  pChannel,
         guint       nState,
         gpointer    pUserData,
         GObject*    /*weak_object*/
         )
 {
-    INFO_LOGGER_F( "TeleConference_TubeChannelStateChangedHandler");
+    INFO_LOGGER_F( "TeleConference::TubeChannelStateChangedHandler");
 
-    SAL_INFO( "tubes", "TeleConference_TubeChannelStateChangedHandler: state: " << static_cast<sal_uInt32>(nState));
+    SAL_INFO( "tubes", "TeleConference::TubeChannelStateChangedHandler: state: " << static_cast<sal_uInt32>(nState));
 
     TeleConference* pConference = reinterpret_cast<TeleConference*>(pUserData);
     SAL_WARN_IF( !pConference, "tubes", "TeleConference_DBusMessageHandler: no conference");
     if (!pConference)
         return;
 
-    pConference->setTubeChannelStateChangedHandlerInvoked( true);
-
     SAL_WARN_IF( pChannel != pConference->getChannel(), "tubes",
-            "TeleConference_TubeChannelStateChangedHandler: not my channel");
+            "TeleConference::TubeChannelStateChangedHandler: not my channel");
     if (pChannel != pConference->getChannel())
         return;
 
     pConference->setTubeChannelState( static_cast<TpTubeChannelState>(nState));
+    pConference->tryToOpen();
 }
 
 
@@ -204,18 +218,14 @@ TeleConference::TeleConference( TeleManager* pManager, TpAccount* pAccount, TpCh
     :
         maSessionId( rSessionId ),
         mpManager( pManager),
-        mpAccount( pAccount),
-        mpChannel( pChannel),
+        mpAccount( NULL),
+        mpChannel( NULL),
+        mpAddress( NULL),
         mpTube( NULL),
         meTubeChannelState( TP_TUBE_CHANNEL_STATE_NOT_OFFERED),
-        mbTubeOfferedHandlerInvoked( false),
-        mbTubeChannelStateChangedHandlerInvoked( false)
+        mbTubeOfferedHandlerInvoked( false)
 {
-    if (mpAccount)
-        g_object_ref( mpAccount);
-
-    if (mpChannel)
-        g_object_ref( mpChannel);
+    setChannel( pAccount, pChannel );
 }
 
 
@@ -234,30 +244,59 @@ void TeleConference::setChannel( TpAccount *pAccount, TpChannel* pChannel )
         g_object_unref( mpAccount);
 
     mpChannel = pChannel;
-    if (mpChannel)
+    if (mpChannel) {
         g_object_ref( mpChannel);
 
+        /* TODO: remember the TpProxySignalConnection and disconnect in finalize */
+        GError* pError = NULL;
+        TpProxySignalConnection* pProxySignalConnection =
+            tp_cli_channel_interface_tube_connect_to_tube_channel_state_changed(
+                    mpChannel,
+                    &TeleConference::TubeChannelStateChangedHandler,
+                    this,
+                    NULL,
+                    NULL,
+                    &pError);
+
+        if (!pProxySignalConnection || pError)
+        {
+            SAL_WARN_IF( pError, "tubes",
+                "TeleConference::setChannel: channel state changed error: " << pError->message);
+            g_error_free( pError);
+        }
+    }
+
     mpAccount = pAccount;
     if (mpAccount)
         g_object_ref( mpAccount);
 }
 
 
-bool TeleConference::acceptTube( const char* pAddress )
+bool TeleConference::spinUntilTubeEstablished()
 {
-    INFO_LOGGER( "TeleConference::acceptTube");
+    mpManager->iterateLoop( this, &TeleConference::isTubeOfferedHandlerInvoked);
+    mpManager->iterateLoop( this, &TeleConference::isTubeChannelStateChangedToOpen);
 
-    SAL_WARN_IF( !pAddress, "tubes", "TeleConference::acceptTube: no address");
-    if (!pAddress)
-        return false;
-    SAL_INFO( "tubes", "TeleConference::acceptTube: address: " << pAddress);
+    bool bOpen = isTubeOpen();
+    SAL_INFO( "tubes", "TeleConference::spinUntilTubeEstablished: tube open: " << bOpen);
+    return bOpen;
+}
+
+
+bool TeleConference::acceptTube()
+{
+    INFO_LOGGER( "TeleConference::acceptTube");
 
     SAL_WARN_IF( !mpChannel, "tubes", "TeleConference::acceptTube: no channel setup");
     SAL_WARN_IF( mpTube, "tubes", "TeleConference::acceptTube: already tubed");
     if (!mpChannel || mpTube)
         return false;
 
-    return setTube( pAddress );
+    tp_cli_channel_type_dbus_tube_call_accept( mpChannel, -1,
+            TP_SOCKET_ACCESS_CONTROL_CREDENTIALS,
+            &TeleConference::TubeOfferedHandler,
+            this, NULL, NULL);
+    return spinUntilTubeEstablished();
 }
 
 
@@ -269,8 +308,6 @@ bool TeleConference::offerTube()
     if (!mpChannel)
         return false;
 
-    setTubeOfferedHandlerInvoked( false);
-
     // We must pass a hash table, it could be empty though.
     /* TODO: anything meaningful to go in here? */
     GHashTable* pParams = tp_asv_new(
@@ -287,35 +324,8 @@ bool TeleConference::offerTube()
             NULL,                                   // destroy
             NULL);                                  // weak_object
 
-    mpManager->iterateLoop( this, &TeleConference::isTubeOfferedHandlerInvoked);
-
     g_hash_table_unref( pParams);
-
-    setTubeChannelStateChangedHandlerInvoked( false);
-
-    /* TODO: remember the TpProxySignalConnection for further use? */
-    GError* pError = NULL;
-    TpProxySignalConnection* pProxySignalConnection =
-        tp_cli_channel_interface_tube_connect_to_tube_channel_state_changed(
-                mpChannel,
-                TeleConference_TubeChannelStateChangedHandler,
-                this,
-                NULL,
-                NULL,
-                &pError);
-
-    if (!pProxySignalConnection || pError)
-    {
-        SAL_WARN_IF( pError, "tubes", "TeleConference::offerTube: channel state changed error: " << pError->message);
-        g_error_free( pError);
-        return false;
-    }
-
-    mpManager->iterateLoop( this, &TeleConference::isTubeChannelStateChangedHandlerInvoked);
-
-    bool bOpen = isTubeOpen();
-    SAL_INFO( "tubes", "TeleConference::offerTube: tube open: " << bOpen);
-    return bOpen;
+    return spinUntilTubeEstablished();
 }
 
 
@@ -379,6 +389,12 @@ void TeleConference::finalize()
         mpTube = NULL;
     }
 
+    if (mpAddress)
+    {
+        g_free( mpAddress);
+        mpAddress = NULL;
+    }
+
     TeleConferencePtr pThis( shared_from_this());
     mpManager->unregisterConference( pThis);
 
diff --git a/tubes/source/manager.cxx b/tubes/source/manager.cxx
index b9ecfd0..32589f1 100644
--- a/tubes/source/manager.cxx
+++ b/tubes/source/manager.cxx
@@ -92,38 +92,7 @@ public:
 };
 
 
-static void TeleManager_DBusTubeAcceptHandler(
-        TpChannel*      pChannel,
-        const char*     pAddress,
-        const GError*   pError,
-        gpointer        pUserData,
-        GObject*        pWeakObject)
-{
-    INFO_LOGGER_F( "TeleManager_DBusTubeAcceptHandler");
-
-    TpAccount* pAccount = TP_ACCOUNT(pWeakObject);
-
-    SAL_WARN_IF( pError, "tubes", "TeleManager_DBusTubeAcceptHandler: entered with error: " << pError->message);
-    if (pError)
-    {
-        g_object_unref(pAccount);
-        return;
-    }
-
-    TeleManager* pManager = reinterpret_cast<TeleManager*>(pUserData);
-    SAL_WARN_IF( !pManager, "tubes", "TeleManager_DBusTubeAcceptHandler: no manager");
-    if (!pManager)
-    {
-        g_object_unref(pAccount);
-        return;
-    }
-
-    pManager->acceptTube( pAccount, pChannel, pAddress);
-    g_object_unref (pAccount);
-}
-
-
-static void TeleManager_DBusChannelHandler(
+void TeleManager::DBusChannelHandler(
         TpSimpleHandler*            /*handler*/,
         TpAccount*                  pAccount,
         TpConnection*               /*connection*/,
@@ -134,10 +103,10 @@ static void TeleManager_DBusChannelHandler(
         gpointer                    pUserData)
 {
     bool aAccepted = false;
-    INFO_LOGGER_F( "TeleManager_DBusChannelHandler");
+    INFO_LOGGER_F( "TeleManager::DBusChannelHandler");
 
     TeleManager* pManager = reinterpret_cast<TeleManager*>(pUserData);
-    SAL_WARN_IF( !pManager, "tubes", "TeleManager_DBusChannelHandler: no manager");
+    SAL_WARN_IF( !pManager, "tubes", "TeleManager::DBusChannelHandler: no manager");
     if (!pManager)
         return;
 
@@ -147,18 +116,17 @@ static void TeleManager_DBusChannelHandler(
         if (!pChannel)
             continue;
 
-        SAL_INFO( "tubes", "TeleManager_DBusChannelHandler: incoming dbus channel: "
+        SAL_INFO( "tubes", "TeleManager::DBusChannelHandler: incoming dbus channel: "
                 << tp_channel_get_identifier( pChannel));
 
         if (tp_channel_get_channel_type_id( pChannel) == TP_IFACE_QUARK_CHANNEL_TYPE_DBUS_TUBE)
         {
             SAL_INFO( "tubes", "accepting");
             aAccepted = true;
-            g_object_ref( pAccount);
-            tp_cli_channel_type_dbus_tube_call_accept( pChannel, -1,
-                    TP_SOCKET_ACCESS_CONTROL_CREDENTIALS,
-                    TeleManager_DBusTubeAcceptHandler, pUserData, NULL,
-                    G_OBJECT (pAccount));
+
+            TeleConferencePtr pConference( new TeleConference( pManager, pAccount, pChannel, ""));
+            pManager->maConferences.push_back( pConference);
+            pConference->acceptTube();
         }
         else
         {
@@ -456,7 +424,7 @@ bool TeleManager::connect()
             FALSE,                          // requests
             getFullClientName().getStr(),   // name
             FALSE,                          // uniquify
-            TeleManager_DBusChannelHandler, // callback
+            &TeleManager::DBusChannelHandler, // callback
             this,                           // user_data
             NULL                            // destroy
             );
@@ -847,22 +815,6 @@ void TeleManager::disconnect()
 }
 
 
-void TeleManager::acceptTube( TpAccount* pAccount, TpChannel* pChannel, const char* pAddress )
-{
-    INFO_LOGGER( "TeleManager::acceptTube");
-
-    SAL_INFO( "tubes", "TeleManager::acceptTube: address " << pAddress);
-
-    SAL_WARN_IF( !pChannel || !pAddress, "tubes", "TeleManager::acceptTube: no channel or no address");
-    if (!pChannel || !pAddress)
-        return;
-
-    TeleConferencePtr pConference( new TeleConference( this, pAccount, pChannel, ""));
-    maConferences.push_back( pConference);
-    pConference->acceptTube( pAddress);
-}
-
-
 void TeleManager::setAccountManagerReady( bool bPrepared)
 {
     pImpl->meAccountManagerStatus = (bPrepared ? AMS_PREPARED : AMS_UNPREPARABLE);
commit 54703c99532af997da321b98d6e97cb67fbaf161
Author: Will Thompson <will.thompson at collabora.co.uk>
Date:   Fri Mar 30 15:58:03 2012 +0100

    tubes: reduce code duplication when opening connection

diff --git a/tubes/inc/tubes/conference.hxx b/tubes/inc/tubes/conference.hxx
index 35812bb..f4ae973 100644
--- a/tubes/inc/tubes/conference.hxx
+++ b/tubes/inc/tubes/conference.hxx
@@ -82,7 +82,6 @@ public:
     void                    setChannel( TpAccount* pAccount, TpChannel* pChannel );
     TpChannel*              getChannel() const  { return mpChannel; }
     bool                    offerTube();
-    bool                    setTube( DBusConnection* pTube );
     bool                    acceptTube( const char* pAddress );
     /// got tube accepted on other end as well?
     bool                    isTubeOpen() const { return meTubeChannelState == TP_TUBE_CHANNEL_STATE_OPEN; }
@@ -96,9 +95,12 @@ public:
                                 { return mbTubeChannelStateChangedHandlerInvoked; }
     void                    setTubeChannelState( TpTubeChannelState eState ) { meTubeChannelState = eState; }
 
+    static void             TubeOfferedHandler(TpChannel* pChannel, const gchar* pAddress, const GError* pError,
+                                               gpointer pUserData, GObject*pWeakObject);
     static void             FTReady( EmpathyFTHandler *handler, GError *error, gpointer user_data);
 
 private:
+    bool                    setTube( const char* pTube );
 
     rtl::OString            maSessionId;
     TeleManager*            mpManager;
diff --git a/tubes/source/conference.cxx b/tubes/source/conference.cxx
index f91799f..82eb1e7 100644
--- a/tubes/source/conference.cxx
+++ b/tubes/source/conference.cxx
@@ -138,15 +138,15 @@ static void TeleConference_ChannelCloseHandler(
 }
 
 
-static void TeleConference_TubeOfferedHandler(
+void TeleConference::TubeOfferedHandler(
         TpChannel*      pChannel,
-        const gchar*    pOutAddress,
+        const gchar*    pAddress,
         const GError*   pError,
         gpointer        pUserData,
         GObject*        /*weak_object*/
         )
 {
-    INFO_LOGGER_F( "TeleConference_TubeOfferedHandler");
+    INFO_LOGGER_F( "TeleConference::TubeOfferedHandler");
 
     TeleConference* pConference = reinterpret_cast<TeleConference*>(pUserData);
     SAL_WARN_IF( !pConference, "tubes", "TeleConference_TubeOfferedHandler: no conference");
@@ -157,29 +157,19 @@ static void TeleConference_TubeOfferedHandler(
 
     // "can't find contact ... presence" means contact is not a contact.
     /* FIXME: detect and handle */
-    SAL_WARN_IF( pError, "tubes", "TeleConference_TubeOfferedHandler: entered with error: " << pError->message);
+    SAL_WARN_IF( pError, "tubes", "TeleConference::TubeOfferedHandler: entered with error: " << pError->message);
     if (pError)
         return;
 
-    SAL_WARN_IF( !pOutAddress, "tubes", "TeleConference_TubeOfferedHandler: no out address");
-    if (!pOutAddress)
+    SAL_WARN_IF( !pAddress, "tubes", "TeleConference::TubeOfferedHandler: no address");
+    if (!pAddress)
         return;
 
-    SAL_WARN_IF( pChannel != pConference->getChannel(), "tubes", "TeleConference_TubeOfferedHandler: not my channel");
+    SAL_WARN_IF( pChannel != pConference->getChannel(), "tubes", "TeleConference::TubeOfferedHandler: not my channel");
     if (pChannel != pConference->getChannel())
         return;
 
-    DBusError aDBusError;
-    dbus_error_init( &aDBusError);
-    DBusConnection* pTube = dbus_connection_open_private( pOutAddress, &aDBusError);
-    if (!pTube)
-    {
-        SAL_WARN( "tubes", "TeleConference_TubeOfferedHandler: no dbus connection: " << aDBusError.message);
-        dbus_error_free( &aDBusError);
-        return;
-    }
-
-    pConference->setTube( pTube);
+    pConference->setTube( pAddress );
 }
 
 
@@ -267,20 +257,7 @@ bool TeleConference::acceptTube( const char* pAddress )
     if (!mpChannel || mpTube)
         return false;
 
-    DBusError aDBusError;
-    dbus_error_init( &aDBusError);
-    mpTube = dbus_connection_open_private( pAddress, &aDBusError);
-    if (!mpTube)
-    {
-        SAL_WARN( "tubes", "TeleConference::acceptTube: no dbus connection: " << aDBusError.message);
-        dbus_error_free( &aDBusError);
-        return false;
-    }
-
-    dbus_connection_setup_with_g_main( mpTube, mpManager->getMainContext());
-    dbus_connection_add_filter( mpTube, TeleConference_DBusMessageHandler, this, NULL);
-
-    return true;
+    return setTube( pAddress );
 }
 
 
@@ -305,7 +282,7 @@ bool TeleConference::offerTube()
             -1,                                     // timeout_ms
             pParams,                                // in_parameters
             TP_SOCKET_ACCESS_CONTROL_CREDENTIALS,   // in_access_control
-            TeleConference_TubeOfferedHandler,      // callback
+            &TeleConference::TubeOfferedHandler,    // callback
             this,                                   // user_data
             NULL,                                   // destroy
             NULL);                                  // weak_object
@@ -342,18 +319,27 @@ bool TeleConference::offerTube()
 }
 
 
-bool TeleConference::setTube( DBusConnection* pTube )
+bool TeleConference::setTube(  const char* pAddress )
 {
     INFO_LOGGER( "TeleConference::setTube");
 
     OSL_ENSURE( !mpTube, "TeleConference::setTube: already tubed");
-    mpTube = pTube;
+
+    DBusError aDBusError;
+    dbus_error_init( &aDBusError);
+
+    mpTube = dbus_connection_open_private( pAddress, &aDBusError);
+    if (!mpTube)
+    {
+        SAL_WARN( "tubes", "TeleConference::setTube: no dbus connection: " << aDBusError.message);
+        dbus_error_free( &aDBusError);
+        return false;
+    }
 
     dbus_connection_setup_with_g_main( mpTube, mpManager->getMainContext());
     dbus_connection_add_filter( mpTube, TeleConference_DBusMessageHandler, this, NULL);
 
     /* TODO: anything else? */
-
     return true;
 }
 


More information about the Libreoffice-commits mailing list