sc/source/ui/collab/sendfunc.cxx | 72 ++++++++++++++++++++++++++------------- 1 file changed, 48 insertions(+), 24 deletions(-)
New commits: commit eb452d90e6f8afdff69649881f8b7f2ff0f7b047 Author: Eike Rathke <er...@redhat.com> Date: Wed Mar 28 20:24:32 2012 +0200 tubes: shared_ptr for ScDocFunc chains and ScCollaboration diff --git a/sc/source/ui/collab/sendfunc.cxx b/sc/source/ui/collab/sendfunc.cxx index c753eee..26f1ef5 100644 --- a/sc/source/ui/collab/sendfunc.cxx +++ b/sc/source/ui/collab/sendfunc.cxx @@ -256,20 +256,19 @@ public: class ScDocFuncRecv : public ScDocFunc { - ScDocFunc *mpChain; - ScCollaboration* mpCollab; + boost::shared_ptr<ScDocFuncDirect> mpChain; + boost::shared_ptr<ScCollaboration> mpCollab; public: // FIXME: really ScDocFunc should be an abstract base - ScDocFuncRecv( ScDocShell& rDocSh, ScDocFunc *pChain ) + ScDocFuncRecv( ScDocShell& rDocSh, boost::shared_ptr<ScDocFuncDirect>& pChain ) : ScDocFunc( rDocSh ), - mpChain( pChain ), - mpCollab( NULL) + mpChain( pChain ) { fprintf( stderr, "Receiver created !\n" ); } virtual ~ScDocFuncRecv() {} - void SetCollaboration( ScCollaboration* pCollab ) + void SetCollaboration( boost::shared_ptr<ScCollaboration>& pCollab ) { mpCollab = pCollab; } @@ -380,8 +379,8 @@ void ScDocFuncRecv::fileReceived( rtl::OUString *pStr ) class ScDocFuncSend : public ScDocFunc { - ScDocFuncRecv *mpChain; - ScCollaboration* mpCollab; + boost::shared_ptr<ScDocFuncRecv> mpChain; + boost::shared_ptr<ScCollaboration> mpCollab; void SendMessage( ScChangeOpWriter &rOp ) { @@ -424,16 +423,15 @@ class ScDocFuncSend : public ScDocFunc public: // FIXME: really ScDocFunc should be an abstract base, so // we don't need the rDocSh hack/pointer - ScDocFuncSend( ScDocShell& rDocSh, ScDocFuncRecv *pChain ) + ScDocFuncSend( ScDocShell& rDocSh, boost::shared_ptr<ScDocFuncRecv>& pChain ) : ScDocFunc( rDocSh ), - mpChain( pChain ), - mpCollab( NULL) + mpChain( pChain ) { fprintf( stderr, "Sender created !\n" ); } virtual ~ScDocFuncSend() {} - void SetCollaboration( ScCollaboration* pCollab ) + void SetCollaboration( boost::shared_ptr<ScCollaboration>& pCollab ) { mpCollab = pCollab; } @@ -562,20 +560,28 @@ public: SC_DLLPRIVATE ScDocFunc *ScDocShell::CreateDocFunc() { - // FIXME: the chains should be auto-ptrs, so should be collab + // With ScDocFuncDirect shared_ptr it should even be possible during + // runtime to replace a ScDocFuncDirect instance with a ScDocFuncSend + // chained instance (holding the same ScDocFuncDirect instance) and vice + // versa. bool bIsMaster = false; if (getenv ("INTERCEPT")) - return new ScDocFuncSend( *this, new ScDocFuncRecv( *this, new ScDocFuncDirect( *this ) ) ); + { + boost::shared_ptr<ScDocFuncDirect> pDirect( new ScDocFuncDirect( *this ) ); + boost::shared_ptr<ScDocFuncRecv> pReceiver( new ScDocFuncRecv( *this, pDirect ) ); + return new ScDocFuncSend( *this, pReceiver ); + } else if (isCollabMode( bIsMaster )) { - ScDocFuncRecv* pReceiver = new ScDocFuncRecv( *this, new ScDocFuncDirect( *this ) ); + boost::shared_ptr<ScDocFuncDirect> pDirect( new ScDocFuncDirect( *this ) ); + boost::shared_ptr<ScDocFuncRecv> pReceiver( new ScDocFuncRecv( *this, pDirect ) ); ScDocFuncSend* pSender = new ScDocFuncSend( *this, pReceiver ); - bool bOk = true; - ScCollaboration* pCollab = new ScCollaboration(); + boost::shared_ptr<ScCollaboration> pCollab( new ScCollaboration ); pCollab->sigPacketReceived.connect( - boost::bind( &ScDocFuncRecv::packetReceived, pReceiver, _1, _2 )); + boost::bind( &ScDocFuncRecv::packetReceived, pReceiver, _1, _2 )); pCollab->sigFileReceived.connect( - boost::bind( &ScDocFuncRecv::fileReceived, pReceiver, _1)); + boost::bind( &ScDocFuncRecv::fileReceived, pReceiver, _1)); + bool bOk = true; bOk = bOk && pCollab->initManager(!bIsMaster); if (bIsMaster) { @@ -590,7 +596,7 @@ SC_DLLPRIVATE ScDocFunc *ScDocShell::CreateDocFunc() else { fprintf( stderr, "Could not start collaboration.\n"); - delete pCollab; + // pCollab shared_ptr will be destructed } return pSender; } commit e41d2677b159f8179829b0cdcb290bc581c628ff Author: Eike Rathke <er...@redhat.com> Date: Wed Mar 28 20:24:23 2012 +0200 tubes: TeleManager::get() takes an argument initialize with same mode as collaboration diff --git a/sc/source/ui/collab/sendfunc.cxx b/sc/source/ui/collab/sendfunc.cxx index 3dddabf..c753eee 100644 --- a/sc/source/ui/collab/sendfunc.cxx +++ b/sc/source/ui/collab/sendfunc.cxx @@ -68,6 +68,18 @@ ScBaseCell *stringToCell( const rtl::OUString &rString ) return NULL; } +bool isCollabMode( bool& rbMaster ) +{ + const char* pEnv = getenv ("LIBO_TUBES"); + if (pEnv) + { + rbMaster = !strcmp( pEnv, "master"); + return true; + } + rbMaster = false; + return false; +} + // Ye noddy mangling - needs improvement ... // method name ';' then arguments ; separated @@ -452,7 +464,14 @@ public: SendFile( rText ); if ( rtl::OUString( rText ) == "contacts" ) - tubes::createContacts( TeleManager::get() ); + { + // For TeleManager::get() use the same master/slave mode we have + // for collaboration, if any. This is a hack anyway so don't care + // whether we really are in collab mode or not. + bool bIsMaster = false; + isCollabMode( bIsMaster ); + tubes::createContacts( TeleManager::get( bIsMaster ) ); + } return true; // needs some code auditing action } @@ -544,10 +563,10 @@ public: SC_DLLPRIVATE ScDocFunc *ScDocShell::CreateDocFunc() { // FIXME: the chains should be auto-ptrs, so should be collab - const char* pEnv; + bool bIsMaster = false; if (getenv ("INTERCEPT")) return new ScDocFuncSend( *this, new ScDocFuncRecv( *this, new ScDocFuncDirect( *this ) ) ); - else if ((pEnv = getenv ("LIBO_TUBES")) != NULL) + else if (isCollabMode( bIsMaster )) { ScDocFuncRecv* pReceiver = new ScDocFuncRecv( *this, new ScDocFuncDirect( *this ) ); ScDocFuncSend* pSender = new ScDocFuncSend( *this, pReceiver ); @@ -557,7 +576,6 @@ SC_DLLPRIVATE ScDocFunc *ScDocShell::CreateDocFunc() boost::bind( &ScDocFuncRecv::packetReceived, pReceiver, _1, _2 )); pCollab->sigFileReceived.connect( boost::bind( &ScDocFuncRecv::fileReceived, pReceiver, _1)); - bool bIsMaster = !strcmp( pEnv, "master"); bOk = bOk && pCollab->initManager(!bIsMaster); if (bIsMaster) { _______________________________________________ Libreoffice-commits mailing list Libreoffice-commits@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits