diff options
-rw-r--r-- | sc/Library_sc.mk | 18 | ||||
-rw-r--r-- | sc/source/ui/collab/collab.cxx | 4 | ||||
-rw-r--r-- | sc/source/ui/collab/sendfunc.cxx | 96 | ||||
-rw-r--r-- | sc/source/ui/docshell/docsh.cxx | 7 | ||||
-rw-r--r-- | sc/source/ui/inc/collab.hxx | 7 | ||||
-rw-r--r-- | tubes/Module_tubes.mk | 6 | ||||
-rw-r--r-- | tubes/README | 18 | ||||
-rw-r--r-- | tubes/inc/tubes/manager.hxx | 2 |
8 files changed, 119 insertions, 39 deletions
diff --git a/sc/Library_sc.mk b/sc/Library_sc.mk index 551ad07df564..09ddcce9c83a 100644 --- a/sc/Library_sc.mk +++ b/sc/Library_sc.mk @@ -48,10 +48,25 @@ $(eval $(call gb_Library_add_linked_libs,sc,\ tubes \ )) +$(eval $(call gb_Library_add_cxxflags,sc,\ + $$(TELEPATHY_CFLAGS) \ + -DENABLE_TELEPATHY \ +)) + +$(eval $(call gb_Library_add_libs,sc,\ + $$(TELEPATHY_LIBS) \ +)) + $(eval $(call gb_Library_use_externals,sc,\ telepathy \ )) +$(eval $(call gb_Library_add_exception_objects,sc,\ + sc/source/ui/collab/collab \ + sc/source/ui/collab/contacts \ + sc/source/ui/collab/sendfunc \ +)) + endif $(eval $(call gb_Library_use_libraries,sc,\ @@ -328,9 +343,6 @@ $(eval $(call gb_Library_add_exception_objects,sc,\ sc/source/ui/cctrl/popmenu \ sc/source/ui/cctrl/tbinsert \ sc/source/ui/cctrl/tbzoomsliderctrl \ - sc/source/ui/collab/collab \ - sc/source/ui/collab/contacts \ - sc/source/ui/collab/sendfunc \ sc/source/ui/dbgui/asciiopt \ sc/source/ui/dbgui/consdlg \ sc/source/ui/dbgui/csvcontrol \ diff --git a/sc/source/ui/collab/collab.cxx b/sc/source/ui/collab/collab.cxx index a03f4f84e66a..d14b42e26eb2 100644 --- a/sc/source/ui/collab/collab.cxx +++ b/sc/source/ui/collab/collab.cxx @@ -52,11 +52,11 @@ ScCollaboration::~ScCollaboration() } -void ScCollaboration::receivedFile( rtl::OUString &rFileURL ) +void ScCollaboration::receivedFile( const rtl::OUString &rFileURL ) { fprintf( stderr, "file recieved '%s'\n", rtl::OUStringToOString( rFileURL, RTL_TEXTENCODING_UTF8 ).getStr() ); - sigFileReceived( &rFileURL ); + sigFileReceived( rFileURL ); } void ScCollaboration::packetReceivedCallback( TeleConference *pConference, TelePacket &rPacket ) diff --git a/sc/source/ui/collab/sendfunc.cxx b/sc/source/ui/collab/sendfunc.cxx index 50551360de54..aa16ce9c124d 100644 --- a/sc/source/ui/collab/sendfunc.cxx +++ b/sc/source/ui/collab/sendfunc.cxx @@ -254,15 +254,17 @@ public: }; -class ScDocFuncRecv : public ScDocFunc +class ScDocFuncRecv { boost::shared_ptr<ScDocFuncDirect> mpChain; boost::shared_ptr<ScCollaboration> mpCollab; + +protected: + ScDocFuncRecv() {} public: // FIXME: really ScDocFunc should be an abstract base - ScDocFuncRecv( ScDocShell& rDocSh, boost::shared_ptr<ScDocFuncDirect>& pChain ) - : ScDocFunc( rDocSh ), - mpChain( pChain ) + ScDocFuncRecv( boost::shared_ptr<ScDocFuncDirect>& pChain ) + : mpChain( pChain ) { fprintf( stderr, "Receiver created !\n" ); } @@ -274,9 +276,9 @@ public: } void packetReceived( TeleConference* pConference, const rtl::OString & ); - void fileReceived( rtl::OUString *rStr ); - void RecvMessage( const rtl::OString &rString ) + virtual void fileReceived( const rtl::OUString &rStr ); + virtual void RecvMessage( const rtl::OString &rString ) { try { ScChangeOpReader aReader( rtl::OUString( rString.getStr(), @@ -318,15 +320,15 @@ void ScDocFuncRecv::packetReceived( TeleConference*, const rtl::OString &rStr) RecvMessage( rStr); } -void ScDocFuncRecv::fileReceived( rtl::OUString *pStr ) +void ScDocFuncRecv::fileReceived( const rtl::OUString &rStr ) { fprintf( stderr, "incoming file '%s'\n", - rtl::OUStringToOString( *pStr, RTL_TEXTENCODING_UTF8 ).getStr() ); + rtl::OUStringToOString( rStr, RTL_TEXTENCODING_UTF8 ).getStr() ); // using the frame::XLoadable interface fails with a DoubleInitializationException /* css::uno::Sequence < css::beans::PropertyValue > aLoadArgs(5); aLoadArgs[0].Name = rtl::OUString( "URL" ); - aLoadArgs[0].Value <<= (*pStr); + aLoadArgs[0].Value <<= rpStr; aLoadArgs[1].Name = rtl::OUString( "FilterName" ); aLoadArgs[1].Value <<= rtl::OUString( "calc8" ); aLoadArgs[2].Name = rtl::OUString( "Referer" ); @@ -366,7 +368,7 @@ void ScDocFuncRecv::fileReceived( rtl::OUString *pStr ) "com.sun.star.frame.Desktop" ), css::uno::UNO_QUERY_THROW ); css::uno::Reference < css::util::XCloseable > xDoc( - xLoader->loadComponentFromURL( *pStr, "_blank", 0, args ), + xLoader->loadComponentFromURL( rStr, "_blank", 0, args ), css::uno::UNO_QUERY_THROW ); } catch ( css::uno::Exception& e ) @@ -376,9 +378,49 @@ void ScDocFuncRecv::fileReceived( rtl::OUString *pStr ) } } +/* + * Provides a local bus that doesn't require an IM channel for + * quick demoing, export INTERCEPT=demo # to enable. + */ +class ScDocFuncDemo : public ScDocFuncRecv +{ + std::vector< boost::shared_ptr<ScDocFuncRecv> > maClients; + public: + // FIXME: really ScDocFuncRecv should be an abstract base + ScDocFuncDemo() + : ScDocFuncRecv() + { + fprintf( stderr, "Receiver created !\n" ); + } + virtual ~ScDocFuncDemo() {} + + void add_client (const boost::shared_ptr<ScDocFuncRecv> &aClient) + { + maClients.push_back( aClient ); + } + + virtual void RecvMessage( const rtl::OString &rString ) + { + // FIXME: Lifecycle nightmare + std::vector< boost::shared_ptr<ScDocFuncRecv> > aCopy( maClients ); + for (std::vector< boost::shared_ptr<ScDocFuncRecv> >::iterator i + = aCopy.begin(); i != aCopy.end(); i++) + (*i)->RecvMessage(rString); + } + + virtual void fileReceived( const rtl::OUString &rStr ) + { + // FIXME: Lifecycle nightmare + std::vector< boost::shared_ptr<ScDocFuncRecv> > aCopy( maClients ); + for (std::vector< boost::shared_ptr<ScDocFuncRecv> >::iterator i + = aCopy.begin(); i != aCopy.end(); i++) + (*i)->fileReceived( rStr ); + } +}; + class ScDocFuncSend : public ScDocFunc { - boost::shared_ptr<ScDocFuncRecv> mpChain; + boost::shared_ptr<ScDocFuncRecv> mpDirect; boost::shared_ptr<ScCollaboration> mpCollab; void SendMessage( ScChangeOpWriter &rOp ) @@ -386,8 +428,8 @@ class ScDocFuncSend : public ScDocFunc fprintf( stderr, "Op: '%s'\n", rOp.toString().getStr() ); if (mpCollab) mpCollab->sendPacket( rOp.toString()); - else - mpChain->RecvMessage( rOp.toString() ); + else // local demo mode + mpDirect->RecvMessage( rOp.toString() ); } void SendFile( const rtl::OUString &rURL ) @@ -417,14 +459,18 @@ class ScDocFuncSend : public ScDocFunc if ( mpCollab ) mpCollab->sendFile( aFileURL ); + else + mpDirect->fileReceived( aFileURL ); + + // FIXME: unlink the file after send ... } public: // FIXME: really ScDocFunc should be an abstract base, so // we don't need the rDocSh hack/pointer - ScDocFuncSend( ScDocShell& rDocSh, boost::shared_ptr<ScDocFuncRecv>& pChain ) + ScDocFuncSend( ScDocShell& rDocSh, boost::shared_ptr<ScDocFuncRecv> pDirect ) : ScDocFunc( rDocSh ), - mpChain( pChain ) + mpDirect( pDirect ) { fprintf( stderr, "Sender created !\n" ); } @@ -488,7 +534,7 @@ public: sal_Bool bInterpret, sal_Bool bApi ) { fprintf( stderr, "put data\n" ); - return mpChain->PutData( rPos, rEngine, bInterpret, bApi ); + return ScDocFunc::PutData( rPos, rEngine, bInterpret, bApi ); } virtual sal_Bool SetCellText( const ScAddress& rPos, const String& rText, @@ -498,7 +544,7 @@ public: { fprintf( stderr, "set cell text '%s'\n", rtl::OUStringToOString( rText, RTL_TEXTENCODING_UTF8 ).getStr() ); - return mpChain->SetCellText( rPos, rText, bInterpret, bEnglish, bApi, rFormulaNmsp, eGrammar ); + return ScDocFunc::SetCellText( rPos, rText, bInterpret, bEnglish, bApi, rFormulaNmsp, eGrammar ); } virtual bool ShowNote( const ScAddress& rPos, bool bShow = true ) @@ -536,7 +582,7 @@ public: sal_Bool bRecord, sal_Bool bApi ) { fprintf( stderr, "Apply Attributes\n" ); - return mpChain->ApplyAttributes( rMark, rPattern, bRecord, bApi ); + return ScDocFunc::ApplyAttributes( rMark, rPattern, bRecord, bApi ); } virtual sal_Bool ApplyStyle( const ScMarkData& rMark, const String& rStyleName, @@ -544,14 +590,14 @@ public: { fprintf( stderr, "Apply Style '%s'\n", rtl::OUStringToOString( rStyleName, RTL_TEXTENCODING_UTF8 ).getStr() ); - return mpChain->ApplyStyle( rMark, rStyleName, bRecord, bApi ); + return ScDocFunc::ApplyStyle( rMark, rStyleName, bRecord, bApi ); } virtual sal_Bool MergeCells( const ScCellMergeOption& rOption, sal_Bool bContents, sal_Bool bRecord, sal_Bool bApi ) { fprintf( stderr, "Merge cells\n" ); - return mpChain->MergeCells( rOption, bContents, bRecord, bApi ); + return ScDocFunc::MergeCells( rOption, bContents, bRecord, bApi ); } }; @@ -567,13 +613,17 @@ SC_DLLPRIVATE ScDocFunc *ScDocShell::CreateDocFunc() if (getenv ("INTERCEPT")) { boost::shared_ptr<ScDocFuncDirect> pDirect( new ScDocFuncDirect( *this ) ); - boost::shared_ptr<ScDocFuncRecv> pReceiver( new ScDocFuncRecv( *this, pDirect ) ); - return new ScDocFuncSend( *this, pReceiver ); + boost::shared_ptr<ScDocFuncRecv> pReceiver( new ScDocFuncRecv( pDirect ) ); + + static boost::shared_ptr<ScDocFuncDemo> aDemoBus( new ScDocFuncDemo() ); + aDemoBus->add_client( pReceiver ); // a lifecycle horror no doubt. + + return new ScDocFuncSend( *this, boost::shared_ptr<ScDocFuncRecv>( aDemoBus.get() ) ); } else if (isCollabMode( bIsMaster )) { boost::shared_ptr<ScDocFuncDirect> pDirect( new ScDocFuncDirect( *this ) ); - boost::shared_ptr<ScDocFuncRecv> pReceiver( new ScDocFuncRecv( *this, pDirect ) ); + boost::shared_ptr<ScDocFuncRecv> pReceiver( new ScDocFuncRecv( pDirect ) ); ScDocFuncSend* pSender = new ScDocFuncSend( *this, pReceiver ); boost::shared_ptr<ScCollaboration> pCollab( new ScCollaboration ); pCollab->sigPacketReceived.connect( diff --git a/sc/source/ui/docshell/docsh.cxx b/sc/source/ui/docshell/docsh.cxx index 475f3b77115d..2c3d5ac0c445 100644 --- a/sc/source/ui/docshell/docsh.cxx +++ b/sc/source/ui/docshell/docsh.cxx @@ -2500,6 +2500,13 @@ sal_Bool ScDocShell::HasAutomaticTableName( const String& rFilter ) || rFilter.EqualsAscii( pFilterRtf ); } +#ifndef ENABLE_TELEPATHY +ScDocFunc *ScDocShell::CreateDocFunc() +{ + return new ScDocFuncDirect( *this ); +} +#endif + ScDocShell::ScDocShell( const ScDocShell& rShell ) : SvRefBase(), SotObject(), diff --git a/sc/source/ui/inc/collab.hxx b/sc/source/ui/inc/collab.hxx index e995d1bc3eba..65700c94ebbe 100644 --- a/sc/source/ui/inc/collab.hxx +++ b/sc/source/ui/inc/collab.hxx @@ -53,17 +53,16 @@ public: bool sendPacket( const rtl::OString& rString ); /** Emitted when a packet is received */ - boost::signals2::signal<void (TeleConference*, rtl::OString& rString )> sigPacketReceived; - bool recvPacket( rtl::OString& rString, TeleConference* pConference ); + boost::signals2::signal<void (TeleConference*, const rtl::OString& rString )> sigPacketReceived; void sendFile( rtl::OUString &rFileURL ); /** Emitted when a file is received */ - boost::signals2::signal<void ( rtl::OUString *pFileURL )> sigFileReceived; + boost::signals2::signal<void ( const rtl::OUString &pFileURL )> sigFileReceived; /* Internal callbacks */ void packetReceivedCallback( TeleConference *pConference, TelePacket &rPacket ); - void receivedFile( rtl::OUString &rFileURL ); + void receivedFile( const rtl::OUString &rFileURL ); private: diff --git a/tubes/Module_tubes.mk b/tubes/Module_tubes.mk index 5746ce5a5153..0fc35c486884 100644 --- a/tubes/Module_tubes.mk +++ b/tubes/Module_tubes.mk @@ -35,9 +35,9 @@ $(eval $(call gb_Module_add_targets,tubes,\ Executable_liboapprover \ )) -$(eval $(call gb_Module_add_check_targets,tubes,\ - CppunitTest_tubes_test \ -)) +# $(eval $(call gb_Module_add_check_targets,tubes,\ +# CppunitTest_tubes_test \ +# )) endif diff --git a/tubes/README b/tubes/README index d3733455aead..e8e12fbef998 100644 --- a/tubes/README +++ b/tubes/README @@ -1,4 +1,4 @@ -Interface to Telepathy Tubes. +* Interface to Telepathy Tubes. The idea is to provide 1-1 collaboration between contacts and many-many collaboration via MUCs, using Telepathy DBus Tubes over Jabber/XMPP. @@ -34,7 +34,19 @@ make everything service-activatable: Otherwise, you need to make sure liboapprover and a Telepathy-enabled LibreOffice are running. -Status 2012-03-23: + +* Demo modes + +This allows you to play with the interposing without having a telepathy +enabled setup: + + INTERCEPT=demo ./soffice -calc + +Create a bit of a document, type 'saveas' with spelling auto-correction +disabled, and bingo. + + +* Status 2012-03-23: * To do interesting things with this code build and run calc thus: @@ -52,7 +64,7 @@ empathy) and to have your opponent added and approved on both sides. 'saveme' to transfer your document as-is to the other side ... -Status 2012-03-20: +* Status 2012-03-20: * no LibO code depends on this module yet, so it is not built in a regular build, even if configured with --enable-telepathy, so cd tubes and make here diff --git a/tubes/inc/tubes/manager.hxx b/tubes/inc/tubes/manager.hxx index 9aef84706354..1aba675c0ab0 100644 --- a/tubes/inc/tubes/manager.hxx +++ b/tubes/inc/tubes/manager.hxx @@ -158,7 +158,7 @@ public: void sendFile( rtl::OUString &localUri, TeleConference::FileSentCallback pCallback, void* pUserData); - boost::signals2::signal<void ( rtl::OUString &localUri )> sigFileReceived; + boost::signals2::signal<void ( const rtl::OUString &localUri )> sigFileReceived; /// Only for use with MainLoopFlusher GMainLoop* getMainLoop() const; |