summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatúš Kukan <matus.kukan@gmail.com>2012-07-13 22:42:48 +0200
committerMatúš Kukan <matus.kukan@gmail.com>2012-07-17 16:40:25 +0200
commit53b180a49af8aaa25b9b38a8b020113483f0af6b (patch)
treee784ec91a5a2b6614cfc8c050891c2ff0104d9e4
parent019f35d7e4e4494af3a11429219cb361897a7872 (diff)
tubes: associate the document directly with TeleConference
Packet communication now goes directly through TeleConference and TeleManager is used only for receiving files and new channels. This should also allow collaboration of different documents with different contacts independently. Change-Id: Iaf719dce156f1c4c9edc3db4ff0964dec0e0c944
-rw-r--r--sc/source/ui/collab/contacts.cxx38
-rw-r--r--sc/source/ui/collab/sendfunc.cxx25
-rw-r--r--sc/source/ui/collab/sendfunc.hxx7
-rw-r--r--tubes/inc/tubes/conference.hxx11
-rw-r--r--tubes/inc/tubes/manager.hxx13
-rw-r--r--tubes/source/conference.cxx2
-rw-r--r--tubes/source/manager.cxx48
7 files changed, 83 insertions, 61 deletions
diff --git a/sc/source/ui/collab/contacts.cxx b/sc/source/ui/collab/contacts.cxx
index 67002c2053a6..ac16c3947b5e 100644
--- a/sc/source/ui/collab/contacts.cxx
+++ b/sc/source/ui/collab/contacts.cxx
@@ -51,6 +51,7 @@ class TubeContacts : public ModelessDialog
SvxSimpleTableContainer maListContainer;
SvxSimpleTable maList;
TeleManager* mpManager;
+ ScDocFuncSend* mpSender;
DECL_LINK( BtnConnectHdl, void * );
DECL_LINK( BtnListenHdl, void * );
@@ -70,6 +71,19 @@ class TubeContacts : public ModelessDialog
{
fprintf( stderr, "Could not register client handlers.\n" );
}
+ else
+ {
+ // FIXME: These signals should not be bind to a document specific code.
+
+ // Receiving file is not related to any document.
+ mpManager->sigFileReceived.connect( boost::bind(
+ &ScDocFuncRecv::fileReceived, mpSender->GetReceiver(), _1 ) );
+
+ // TODO: It's still not clear to me who should take care of this signal
+ // and what exactly it is supposed to happen.
+ mpManager->sigConferenceCreated.connect( boost::bind(
+ &ScDocFuncSend::SetCollaboration, mpSender, _1 ) );
+ }
}
void StartBuddySession()
@@ -82,9 +96,12 @@ class TubeContacts : public ModelessDialog
TpAccount* pAccount = pAC->mpAccount;
TpContact* pContact = pAC->mpContact;
fprintf( stderr, "picked %s\n", tp_contact_get_identifier( pContact ) );
- if (!mpManager->startBuddySession( pAccount, pContact ))
+ TeleConference* pConference = mpManager->startBuddySession( pAccount, pContact );
+ if (!pConference)
fprintf( stderr, "could not start session with %s\n",
tp_contact_get_identifier( pContact ) );
+ else
+ mpSender->SetCollaboration( pConference );
}
}
@@ -97,8 +114,12 @@ class TubeContacts : public ModelessDialog
{
TpAccount* pAccount = pAC->mpAccount;
fprintf( stderr, "picked %s\n", tp_account_get_display_name( pAccount ) );
- if (!mpManager->startGroupSession( pAccount, rtl::OUString("liboroom"), rtl::OUString("conference.jabber.org") ))
+ TeleConference* pConference = mpManager->startGroupSession( pAccount,
+ rtl::OUString("liboroom"), rtl::OUString("conference.jabber.org") );
+ if (!pConference)
fprintf( stderr, "could not start group session\n" );
+ else
+ mpSender->SetCollaboration( pConference );
}
}
@@ -114,24 +135,19 @@ public:
{
ScDocShell *pScDocShell = dynamic_cast<ScDocShell*> (SfxObjectShell::Current());
ScDocFunc *pDocFunc = pScDocShell ? &pScDocShell->GetDocFunc() : NULL;
- ScDocFuncSend *pSender = dynamic_cast<ScDocFuncSend*> (pDocFunc);
- if (!pSender)
+ mpSender = dynamic_cast<ScDocFuncSend*> (pDocFunc);
+ if (!mpSender)
{
// 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 );
+ mpSender = new ScDocFuncSend( *pScDocShell, pReceiver );
+ pScDocShell->SetDocFunc( mpSender );
// FIXME: Who should really own TeleManager and where it can be destroyed ?
// Take reference, so TeleManager does not get destroyed after closing dialog:
mpManager = TeleManager::get();
- mpManager->sigPacketReceived.connect( boost::bind(
- &ScDocFuncRecv::packetReceived, pReceiver, _1, _2 ));
- mpManager->sigFileReceived.connect( boost::bind(
- &ScDocFuncRecv::fileReceived, pReceiver, _1 ));
-
if (mpManager->createAccountManager())
{
mpManager->prepareAccountManager();
diff --git a/sc/source/ui/collab/sendfunc.cxx b/sc/source/ui/collab/sendfunc.cxx
index 1a1021359473..e5e6c54beb09 100644
--- a/sc/source/ui/collab/sendfunc.cxx
+++ b/sc/source/ui/collab/sendfunc.cxx
@@ -105,7 +105,7 @@ void ScDocFuncRecv::RecvMessage( const rtl::OString &rString )
}
}
-void ScDocFuncRecv::packetReceived( TeleConference*, TelePacket &rPacket )
+void ScDocFuncRecv::packetReceived( TelePacket &rPacket )
{
rtl::OString aString( rPacket.getData(), rPacket.getSize() );
RecvMessage( aString );
@@ -220,10 +220,10 @@ extern "C"
void ScDocFuncSend::SendMessage( ScChangeOpWriter &rOp )
{
fprintf( stderr, "Op: '%s'\n", rOp.toString().getStr() );
- if (mpManager)
+ if (mpConference)
{
TelePacket aPacket( "sender", rOp.toString().getStr(), rOp.toString().getLength() );
- mpManager->sendPacket( aPacket );
+ mpConference->sendPacket( aPacket );
}
else // local demo mode
mpDirect->RecvMessage( rOp.toString() );
@@ -254,8 +254,8 @@ void ScDocFuncSend::SendFile( const rtl::OUString &rURL )
fprintf( stderr, "Temp file is '%s'\n",
rtl::OUStringToOString( aFileURL, RTL_TEXTENCODING_UTF8 ).getStr() );
- if (mpManager)
- mpManager->sendFile( aFileURL, file_sent_cb, NULL );
+ if (mpConference)
+ mpConference->sendFile( aFileURL, file_sent_cb, NULL );
else
mpDirect->fileReceived( aFileURL );
@@ -267,7 +267,7 @@ void ScDocFuncSend::SendFile( const rtl::OUString &rURL )
ScDocFuncSend::ScDocFuncSend( ScDocShell& rDocSh, ScDocFuncRecv *pDirect )
: ScDocFunc( rDocSh ),
mpDirect( pDirect ),
- mpManager( NULL )
+ mpConference( NULL )
{
fprintf( stderr, "Sender created !\n" );
}
@@ -275,9 +275,22 @@ ScDocFuncSend::ScDocFuncSend( ScDocShell& rDocSh, ScDocFuncRecv *pDirect )
ScDocFuncSend::~ScDocFuncSend()
{
fprintf( stderr, "Sender destroyed !\n" );
+ mpConference->close();
delete mpDirect;
}
+void ScDocFuncSend::SetCollaboration( TeleConference* pConference )
+{
+ mpConference = pConference;
+ mpConference->sigPacketReceived.connect( boost::bind(
+ &ScDocFuncRecv::packetReceived, mpDirect, _1 ) );
+}
+
+ScDocFuncRecv* ScDocFuncSend::GetReceiver()
+{
+ return mpDirect;
+}
+
void ScDocFuncSend::EnterListAction( sal_uInt16 nNameResId )
{
// Want to group these operations for the other side ...
diff --git a/sc/source/ui/collab/sendfunc.hxx b/sc/source/ui/collab/sendfunc.hxx
index bae2ad373ad0..1bcbe237c246 100644
--- a/sc/source/ui/collab/sendfunc.hxx
+++ b/sc/source/ui/collab/sendfunc.hxx
@@ -217,7 +217,7 @@ public:
ScDocFuncRecv( ScDocFuncDirect *pChain );
virtual ~ScDocFuncRecv();
- void packetReceived( TeleConference*, TelePacket &rPacket );
+ void packetReceived( TelePacket &rPacket );
virtual void fileReceived( const rtl::OUString &rStr );
virtual void RecvMessage( const rtl::OString &rString );
@@ -226,7 +226,7 @@ public:
class ScDocFuncSend : public ScDocFunc
{
ScDocFuncRecv *mpDirect;
- TeleManager *mpManager;
+ TeleConference *mpConference;
void SendMessage( ScChangeOpWriter &rOp );
void SendFile( const rtl::OUString &rURL );
@@ -237,6 +237,9 @@ public:
ScDocFuncSend( ScDocShell& rDocSh, ScDocFuncRecv *pDirect );
virtual ~ScDocFuncSend();
+ void SetCollaboration( TeleConference* pConference );
+ ScDocFuncRecv* GetReceiver();
+
virtual void EnterListAction( sal_uInt16 nNameResId );
virtual void EndListAction();
diff --git a/tubes/inc/tubes/conference.hxx b/tubes/inc/tubes/conference.hxx
index b5ca996751c1..4849b4254b1e 100644
--- a/tubes/inc/tubes/conference.hxx
+++ b/tubes/inc/tubes/conference.hxx
@@ -38,6 +38,7 @@
#include <rtl/ustring.hxx>
#include <telepathy-glib/telepathy-glib.h>
#include <queue>
+#include <tubes/warnings_guard_boost_signals2.hpp>
typedef ::std::queue<TelePacket> TelePacketQueue;
@@ -52,7 +53,7 @@ public:
~TeleConference();
/// Close channel and call finalize()
- void close();
+ TUBES_DLLPUBLIC void close();
/// Unrefs, unregisters from manager and calls dtor if last reference!
void finalize();
@@ -62,18 +63,20 @@ public:
/** @param rPacket
non-const on purpose, see TelePacket::getData()
*/
- bool sendPacket( TelePacket& rPacket );
+ TUBES_DLLPUBLIC bool sendPacket( TelePacket& rPacket );
/** Pop a received packet. */
- TUBES_DLLPUBLIC bool popPacket( TelePacket& rPacket );
+ bool popPacket( TelePacket& rPacket );
/** Queue incoming data as TelePacket */
void queue( const char* pDBusSender, const char* pPacket, int nSize );
void queue( TelePacket &rPacket );
+ /** Emitted when a packet is received. */
+ boost::signals2::signal<void (TelePacket&)> sigPacketReceived;
typedef void (*FileSentCallback)( bool aSuccess, void* pUserData);
- void sendFile( rtl::OUString &localUri, FileSentCallback pCallback, void* pUserData);
+ TUBES_DLLPUBLIC void sendFile( rtl::OUString &localUri, FileSentCallback pCallback, void* pUserData);
// --- following only to be called only by manager's callbacks ---
// TODO: make friends instead
diff --git a/tubes/inc/tubes/manager.hxx b/tubes/inc/tubes/manager.hxx
index 6eb7915e31bd..a15d101cb3cf 100644
--- a/tubes/inc/tubes/manager.hxx
+++ b/tubes/inc/tubes/manager.hxx
@@ -121,7 +121,7 @@ public:
empty, only the conference's UUID is used and rConferenceRoom is
ignored, hopefully resulting in a local DBus tube.
*/
- bool startGroupSession( TpAccount *pAccount,
+ TeleConference* startGroupSession( TpAccount *pAccount,
const rtl::OUString& rConferenceRoom,
const rtl::OUString& rConferenceServer );
@@ -133,7 +133,7 @@ public:
@param pBuddy
The buddy to be connected. Must be a contact of pAccount.
*/
- bool startBuddySession( TpAccount *pAccount, TpContact *pBuddy );
+ TeleConference* startBuddySession( TpAccount *pAccount, TpContact *pBuddy );
void unregisterConference( TeleConferencePtr pConference );
@@ -145,13 +145,6 @@ public:
*/
sal_uInt32 sendPacket( const TelePacket& rPacket ) const;
- /** Emitted when a packet is received, with a TeleConference*
- pointing to the instance that received the packet.
- */
- boost::signals2::signal<void (TeleConference*, TelePacket&)> sigPacketReceived;
- /* FIXME: listen to a signal on the conference rather than having it call us */
- void callbackOnRecieved( TeleConference* pConference, TelePacket& rPacket ) const;
-
/** Pop a received data packet.
XXX This needs to be elaborated to pop from a specific conference, or
@@ -166,6 +159,8 @@ public:
boost::signals2::signal<void ( const rtl::OUString &localUri )> sigFileReceived;
+ boost::signals2::signal<void (TeleConference*)> sigConferenceCreated;
+
/// Only for use with MainLoopFlusher
GMainLoop* getMainLoop() const;
diff --git a/tubes/source/conference.cxx b/tubes/source/conference.cxx
index 458063ba1f08..1b5a397dc007 100644
--- a/tubes/source/conference.cxx
+++ b/tubes/source/conference.cxx
@@ -411,7 +411,7 @@ void TeleConference::queue( TelePacket &rPacket )
maPacketQueue.push( rPacket);
- getManager()->callbackOnRecieved( this, rPacket);
+ sigPacketReceived( rPacket );
}
diff --git a/tubes/source/manager.cxx b/tubes/source/manager.cxx
index 944d33a9b503..b524942071b1 100644
--- a/tubes/source/manager.cxx
+++ b/tubes/source/manager.cxx
@@ -124,9 +124,9 @@ void TeleManager::DBusChannelHandler(
SAL_INFO( "tubes", "accepting");
aAccepted = true;
- TeleConferencePtr pConference( new TeleConference( pManager, pAccount, TP_DBUS_TUBE_CHANNEL( pChannel ) ) );
- pManager->maConferences.push_back( pConference);
+ TeleConference* pConference = new TeleConference( pManager, pAccount, TP_DBUS_TUBE_CHANNEL( pChannel ) );
pConference->acceptTube();
+ pManager->sigConferenceCreated( pConference );
}
else
{
@@ -506,7 +506,7 @@ bool TeleManager::registerClients()
/* TODO: factor out common code with startBuddySession() */
-bool TeleManager::startGroupSession( TpAccount *pAccount,
+TeleConference* TeleManager::startGroupSession( TpAccount *pAccount,
const rtl::OUString& rUConferenceRoom,
const rtl::OUString& rUConferenceServer )
{
@@ -514,11 +514,6 @@ bool TeleManager::startGroupSession( TpAccount *pAccount,
OString aSessionId( TeleManager::createUuid());
- TeleConferencePtr pConference( new TeleConference( this, NULL, NULL ) );
- maConferences.push_back( pConference);
-
- /* TODO: associate the document with this session and conference */
-
/* FIXME: does this work at all _creating_ a MUC? */
// Use conference and server if given, else create conference.
OString aConferenceRoom( OUStringToOString( rUConferenceRoom, RTL_TEXTENCODING_UTF8));
@@ -552,20 +547,25 @@ bool TeleManager::startGroupSession( TpAccount *pAccount,
if (!pChannelRequest)
{
g_hash_table_unref( pRequest);
- return false;
+ return NULL;
}
setChannelReadyHandlerInvoked( false);
+ TeleConference* pConference = new TeleConference( this, NULL, NULL );
+
tp_account_channel_request_create_and_handle_channel_async(
- pChannelRequest, NULL, TeleManager_ChannelReadyHandler, pConference.get());
+ pChannelRequest, NULL, TeleManager_ChannelReadyHandler, pConference);
iterateLoop( &TeleManager::isChannelReadyHandlerInvoked);
g_object_unref( pChannelRequest);
g_hash_table_unref( pRequest);
- return pConference->getChannel() != NULL && pConference->isTubeOpen();
+ if (!pConference->getChannel() || !pConference->isTubeOpen())
+ return NULL;
+
+ return pConference;
}
@@ -598,16 +598,12 @@ void TeleManager::ensureLegacyChannel( TpAccount* pAccount, TpContact* pBuddy )
/* TODO: factor out common code with startGroupSession() */
-bool TeleManager::startBuddySession( TpAccount *pAccount, TpContact *pBuddy )
+TeleConference* TeleManager::startBuddySession( TpAccount *pAccount, TpContact *pBuddy )
{
INFO_LOGGER( "TeleManager::startBuddySession");
ensureLegacyChannel( pAccount, pBuddy );
- TeleConferencePtr pConference( new TeleConference( this, NULL, NULL ) );
- maConferences.push_back( pConference);
-
- /* TODO: associate the document with this session and conference */
const char *pIdentifier = tp_contact_get_identifier( pBuddy);
SAL_INFO( "tubes", "TeleManager::startBuddySession: creating channel request from "
<< tp_account_get_path_suffix( pAccount)
@@ -626,20 +622,25 @@ bool TeleManager::startBuddySession( TpAccount *pAccount, TpContact *pBuddy )
if (!pChannelRequest)
{
g_hash_table_unref( pRequest);
- return false;
+ return NULL;
}
setChannelReadyHandlerInvoked( false);
+ TeleConference* pConference = new TeleConference( this, NULL, NULL );
+
tp_account_channel_request_create_and_handle_channel_async(
- pChannelRequest, NULL, TeleManager_ChannelReadyHandler, pConference.get());
+ pChannelRequest, NULL, TeleManager_ChannelReadyHandler, pConference );
iterateLoop( &TeleManager::isChannelReadyHandlerInvoked);
g_object_unref( pChannelRequest);
g_hash_table_unref( pRequest);
- return pConference->getChannel() != NULL && pConference->isTubeOpen();
+ if (!pConference->getChannel() || !pConference->isTubeOpen())
+ return NULL;
+
+ return pConference;
}
void TeleManager::prepareAccountManager()
@@ -750,15 +751,6 @@ sal_uInt32 TeleManager::sendPacket( const TelePacket& rPacket ) const
return nSent;
}
-
-void TeleManager::callbackOnRecieved( TeleConference* pConference, TelePacket& rPacket) const
-{
- INFO_LOGGER( "TeleManager::callbackOnRecieved");
-
- sigPacketReceived( pConference, rPacket );
-}
-
-
bool TeleManager::popPacket( TelePacket& rPacket )
{
INFO_LOGGER( "TeleManager::popPacket");