diff options
author | Matúš Kukan <matus.kukan@gmail.com> | 2012-07-13 22:42:48 +0200 |
---|---|---|
committer | Matúš Kukan <matus.kukan@gmail.com> | 2012-07-17 16:40:25 +0200 |
commit | 53b180a49af8aaa25b9b38a8b020113483f0af6b (patch) | |
tree | e784ec91a5a2b6614cfc8c050891c2ff0104d9e4 | |
parent | 019f35d7e4e4494af3a11429219cb361897a7872 (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.cxx | 38 | ||||
-rw-r--r-- | sc/source/ui/collab/sendfunc.cxx | 25 | ||||
-rw-r--r-- | sc/source/ui/collab/sendfunc.hxx | 7 | ||||
-rw-r--r-- | tubes/inc/tubes/conference.hxx | 11 | ||||
-rw-r--r-- | tubes/inc/tubes/manager.hxx | 13 | ||||
-rw-r--r-- | tubes/source/conference.cxx | 2 | ||||
-rw-r--r-- | tubes/source/manager.cxx | 48 |
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"); |