summaryrefslogtreecommitdiff
path: root/tubes/source/conference.cxx
diff options
context:
space:
mode:
authorEike Rathke <erack@redhat.com>2012-03-20 20:24:33 +0100
committerMatúš Kukan <matus.kukan@gmail.com>2012-07-17 16:39:20 +0200
commit6b16cc2ca82027bac2306a062c6a61b5800e6853 (patch)
tree6978079549fc005b6952c83b6e19594002cac687 /tubes/source/conference.cxx
parent894151477330cea23f92247132c5c64065a2eb14 (diff)
restructure things to one account manager and one connection
tubes are offered and accepted now, sending/receiving works YAY! Thanks to Will Thompson from Collabora.
Diffstat (limited to 'tubes/source/conference.cxx')
-rw-r--r--tubes/source/conference.cxx113
1 files changed, 91 insertions, 22 deletions
diff --git a/tubes/source/conference.cxx b/tubes/source/conference.cxx
index 3195df6bceab..a5a6604ff90c 100644
--- a/tubes/source/conference.cxx
+++ b/tubes/source/conference.cxx
@@ -93,14 +93,14 @@ static DBusHandlerResult TeleConference_DBusMessageHandler(
DBUS_TYPE_INVALID))
{
SAL_INFO( "tubes", "TeleConference_DBusMessageHandler: received packet from sender "
- << pSender << " with size " << nPacketSize);
+ << (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 << " " << aDBusError.message);
+ << (pSender ? pSender : "(null)") << " " << aDBusError.message);
dbus_error_free( &aDBusError);
}
}
@@ -148,6 +148,13 @@ static void TeleConference_TubeOfferedHandler(
{
INFO_LOGGER_F( "TeleConference_TubeOfferedHandler");
+ TeleConference* pConference = reinterpret_cast<TeleConference*>(pUserData);
+ SAL_WARN_IF( !pConference, "tubes", "TeleConference_TubeOfferedHandler: no conference");
+ if (!pConference)
+ return;
+
+ pConference->setTubeOfferedHandlerInvoked( true);
+
// "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);
@@ -158,11 +165,6 @@ static void TeleConference_TubeOfferedHandler(
if (!pOutAddress)
return;
- TeleConference* pConference = reinterpret_cast<TeleConference*>(pUserData);
- SAL_WARN_IF( !pConference, "tubes", "TeleConference_TubeOfferedHandler: no conference");
- if (!pConference)
- return;
-
SAL_WARN_IF( pChannel != pConference->getChannel(), "tubes", "TeleConference_TubeOfferedHandler: not my channel");
if (pChannel != pConference->getChannel())
return;
@@ -172,8 +174,6 @@ static void TeleConference_TubeOfferedHandler(
if (!pManager)
return;
- pConference->setTubeOfferedHandlerInvoked( true);
-
DBusError aDBusError;
dbus_error_init( &aDBusError);
DBusConnection* pTube = dbus_connection_open_private( pOutAddress, &aDBusError);
@@ -188,13 +188,42 @@ static void TeleConference_TubeOfferedHandler(
}
+static void TeleConference_TubeChannelStateChangedHandler(
+ TpChannel* pChannel,
+ guint nState,
+ gpointer pUserData,
+ GObject* /*weak_object*/
+ )
+{
+ INFO_LOGGER_F( "TeleConference_TubeChannelStateChangedHandler");
+
+ 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");
+ if (pChannel != pConference->getChannel())
+ return;
+
+ pConference->setTubeChannelState( static_cast<TpTubeChannelState>(nState));
+}
+
+
TeleConference::TeleConference( TeleManager* pManager, TpChannel* pChannel, const rtl::OString& rSessionId )
:
maSessionId( rSessionId ),
mpManager( pManager),
mpChannel( pChannel),
mpTube( NULL),
- mbTubeOfferedHandlerInvoked( false)
+ meTubeChannelState( TP_TUBE_CHANNEL_STATE_NOT_OFFERED),
+ mbTubeOfferedHandlerInvoked( false),
+ mbTubeChannelStateChangedHandlerInvoked( false)
{
if (mpChannel)
g_object_ref( mpChannel);
@@ -265,27 +294,51 @@ bool TeleConference::offerTube()
setTubeOfferedHandlerInvoked( false);
- // There must be a hash table with some content.
+ // We must pass a hash table, it could be empty though.
/* TODO: anything meaningful to go in here? */
GHashTable* pParams = tp_asv_new(
"LibreOffice", G_TYPE_STRING, "Collaboration",
NULL);
tp_cli_channel_type_dbus_tube_call_offer(
- mpChannel, // proxy
- -1, // timeout_ms
- pParams, // in_parameters
- TP_SOCKET_ACCESS_CONTROL_LOCALHOST, // in_access_control
- TeleConference_TubeOfferedHandler, // callback
- this, // user_data
- NULL, // destroy
- NULL); // weak_object
+ mpChannel, // proxy
+ -1, // timeout_ms
+ pParams, // in_parameters
+ TP_SOCKET_ACCESS_CONTROL_CREDENTIALS, // in_access_control
+ TeleConference_TubeOfferedHandler, // callback
+ this, // user_data
+ NULL, // destroy
+ NULL); // weak_object
mpManager->iterateLoop( this, &TeleConference::isTubeOfferedHandlerInvoked);
g_hash_table_unref( pParams);
- return true;
+ 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;
}
@@ -364,8 +417,12 @@ bool TeleConference::sendPacket( TelePacket& rPacket ) const
DBUS_TYPE_ARRAY, DBUS_TYPE_BYTE, &pPacketData, rPacket.getSize(),
DBUS_TYPE_INVALID);
- SAL_INFO( "tubes", "TeleConference::sendPacket: from " <<
- dbus_message_get_sender( pMessage) << " to " << dbus_message_get_destination( pMessage));
+#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");
@@ -381,4 +438,16 @@ void TeleConference::queue( const char* pDBusSender, const char* pPacketData, in
maPacketQueue.push( TelePacket( pDBusSender, pPacketData, nPacketSize));
}
+
+bool TeleConference::popPacket( TelePacket& rPacket )
+{
+ INFO_LOGGER( "TeleConference::popPacket");
+
+ if (maPacketQueue.empty())
+ return false;
+ rPacket = maPacketQueue.front();
+ maPacketQueue.pop();
+ return true;
+}
+
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */