summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatúš Kukan <matus.kukan@gmail.com>2012-06-16 22:39:35 +0200
committerMatúš Kukan <matus.kukan@gmail.com>2012-07-17 16:40:15 +0200
commit0b4ab5f2ece9b6f0d7f6a04bc68fc255be8a3379 (patch)
tree3b7b6b7daae7279dd08eaba5e35ab5c8ee731005
parenttubes: start collaboration from the contacts widget (diff)
downloadcore-0b4ab5f2ece9b6f0d7f6a04bc68fc255be8a3379.tar.gz
core-0b4ab5f2ece9b6f0d7f6a04bc68fc255be8a3379.zip
tubes: extract class definitions to sendfunc.hxx
-rw-r--r--sc/source/ui/collab/sendfunc.cxx568
-rw-r--r--sc/source/ui/collab/sendfunc.hxx266
2 files changed, 448 insertions, 386 deletions
diff --git a/sc/source/ui/collab/sendfunc.cxx b/sc/source/ui/collab/sendfunc.cxx
index a4a8e232dc63..ee623e4b7e9c 100644
--- a/sc/source/ui/collab/sendfunc.cxx
+++ b/sc/source/ui/collab/sendfunc.cxx
@@ -35,6 +35,7 @@
#include "contacts.hxx"
#include "docsh.hxx"
#include "docfunc.hxx"
+#include "sendfunc.hxx"
#include <tubes/manager.hxx>
#include <tubes/conference.hxx>
#include <tubes/contact-list.hxx>
@@ -57,18 +58,6 @@ namespace css = ::com::sun::star;
namespace {
-rtl::OUString cellToString( ScBaseCell *pCell )
-{
- (void)pCell; // FIXME: implement me
- return rtl::OUString();
-}
-
-ScBaseCell *stringToCell( const rtl::OUString &rString )
-{
- (void)rString; // FIXME: implement me
- return NULL;
-}
-
bool isCollabMode( bool& rbMaster )
{
const char* pEnv = getenv ("LIBO_TUBES");
@@ -81,234 +70,50 @@ bool isCollabMode( bool& rbMaster )
return false;
}
+}
-// Ye noddy mangling - needs improvement ...
-// method name ';' then arguments ; separated
-class ScChangeOpWriter
+// FIXME: really ScDocFunc should be an abstract base
+ScDocFuncRecv::ScDocFuncRecv( boost::shared_ptr<ScDocFuncDirect>& pChain )
+ : mpChain( pChain )
{
- rtl::OUStringBuffer aMessage;
- void appendSeparator()
- {
- aMessage.append( sal_Unicode( ';' ) );
- }
-public:
-
- ScChangeOpWriter( const char *pName )
- {
- aMessage.appendAscii( pName );
- appendSeparator();
- }
-
- void appendString( const rtl::OUString &rStr )
- {
- if ( rStr.indexOf( sal_Unicode( '"' ) ) >= 0 ||
- rStr.indexOf( sal_Unicode( ';' ) ) >= 0 )
- {
- String aQuoted( rStr );
- ScGlobal::AddQuotes( aQuoted, sal_Unicode( '"' ) );
- aMessage.append( aQuoted );
- }
- else
- aMessage.append( rStr );
- appendSeparator();
- }
-
- void appendAddress( const ScAddress &rPos )
- {
- rtl::OUString aStr;
- rPos.Format( aStr, SCA_VALID );
- aMessage.append( aStr );
- appendSeparator();
- }
-
- void appendInt( sal_Int32 i )
- {
- aMessage.append( i );
- appendSeparator();
- }
-
- void appendBool( sal_Bool b )
- {
- aMessage.appendAscii( b ? "true" : "false" );
- appendSeparator();
- }
-
- void appendCell( ScBaseCell *pCell )
- {
- appendString( cellToString( pCell ) );
- }
-
- rtl::OString toString()
- {
- return rtl::OUStringToOString( aMessage.toString(), RTL_TEXTENCODING_UTF8 );
- }
-};
-
-struct ProtocolError {
- const char *message;
-};
-
-class ScChangeOpReader {
- std::vector< rtl::OUString > maArgs;
-
-public:
-
- ScChangeOpReader( const rtl::OUString &rString)
- {
- // will need to handle escaping etc.
- // Surely someone else wrote this before ! [!?]
- enum {
- IN_TEXT, CHECK_QUOTE, FIND_LAST_QUOTE, SKIP_SEMI
- } eState = CHECK_QUOTE;
-
- sal_Int32 nStart = 0;
- for (sal_Int32 n = 0; n < rString.getLength(); n++)
- {
- if (rString[n] == '\\')
- {
- n++; // skip next char
- continue;
- }
- switch (eState) {
- case CHECK_QUOTE:
- if (rString[n] == '"')
- {
- nStart = n + 1;
- eState = FIND_LAST_QUOTE;
- break;
- }
- // else drop through
- case IN_TEXT:
- if (rString[n] == ';')
- {
- maArgs.push_back( rString.copy( nStart, n - nStart ) );
- nStart = n + 1;
- eState = CHECK_QUOTE;
- }
- break;
- case FIND_LAST_QUOTE:
- if (rString[n] == '"')
- {
- maArgs.push_back( rString.copy( nStart, n - nStart ) );
- eState = SKIP_SEMI;
- break;
- }
- break;
- case SKIP_SEMI:
- if (rString[n] == ';')
- {
- nStart = n + 1;
- eState = CHECK_QUOTE;
- }
- break;
- }
- }
- if ( nStart < rString.getLength())
- maArgs.push_back( rString.copy( nStart, rString.getLength() - nStart ) );
-
- for (size_t i = 0; i < maArgs.size(); i++)
- fprintf( stderr, "arg %d: '%s'\n", (int)i,
- rtl::OUStringToOString( maArgs[i], RTL_TEXTENCODING_UTF8).getStr() );
- }
- ~ScChangeOpReader() {}
-
- rtl::OUString getMethod()
- {
- return maArgs[0];
- }
-
- size_t getArgCount() { return maArgs.size(); }
-
- rtl::OUString getString( sal_Int32 n )
- {
- if (n > 0 && (size_t)n < getArgCount() )
- {
- String aUStr( maArgs[ n ] );
- ScGlobal::EraseQuotes( aUStr );
- return aUStr;
- } else
- return rtl::OUString();
- }
-
- ScAddress getAddress( sal_Int32 n )
- {
- ScAddress aAddr;
- rtl::OUString aToken( getString( n ) );
- aAddr.Parse( aToken );
- return aAddr;
- }
-
- sal_Int32 getInt( sal_Int32 n )
- {
- return getString( n ).toInt32();
- }
-
- bool getBool( sal_Int32 n )
- {
- return getString( n ).equalsIgnoreAsciiCase( "true" );
- }
-
- ScBaseCell *getCell( sal_Int32 n )
- {
- return stringToCell( getString( n ) );
- }
-};
-
+ fprintf( stderr, "Receiver created !\n" );
+}
-class ScDocFuncRecv
+void ScDocFuncRecv::RecvMessage( const rtl::OString &rString )
{
- boost::shared_ptr<ScDocFuncDirect> mpChain;
-
-protected:
- ScDocFuncRecv() {}
-public:
- // FIXME: really ScDocFunc should be an abstract base
- ScDocFuncRecv( boost::shared_ptr<ScDocFuncDirect>& pChain )
- : mpChain( pChain )
- {
- fprintf( stderr, "Receiver created !\n" );
- }
- virtual ~ScDocFuncRecv() {}
-
- void packetReceived( TeleConference*, TelePacket &rPacket );
-
- virtual void fileReceived( const rtl::OUString &rStr );
- virtual void RecvMessage( const rtl::OString &rString )
- {
- try {
- ScChangeOpReader aReader( rtl::OUString( rString.getStr(),
- rString.getLength(),
- RTL_TEXTENCODING_UTF8 ) );
- // FIXME: have some hash to enumeration mapping here
- if ( aReader.getMethod() == "setNormalString" )
- mpChain->SetNormalString( aReader.getAddress( 1 ), aReader.getString( 2 ),
- aReader.getBool( 3 ) );
- else if ( aReader.getMethod() == "putCell" )
- {
- ScBaseCell *pNewCell = aReader.getCell( 2 );
- if ( pNewCell )
- mpChain->PutCell( aReader.getAddress( 1 ), pNewCell, aReader.getBool( 3 ) );
- }
- else if ( aReader.getMethod() == "enterListAction" )
- mpChain->EnterListAction( aReader.getInt( 1 ) );
- else if ( aReader.getMethod() == "endListAction" )
- mpChain->EndListAction();
- else if ( aReader.getMethod() == "showNote" )
- mpChain->ShowNote( aReader.getAddress( 1 ), aReader.getBool( 2 ) );
- else if ( aReader.getMethod() == "setNoteText" )
- mpChain->SetNoteText( aReader.getAddress( 1 ), aReader.getString( 2 ),
+ try {
+ ScChangeOpReader aReader( rtl::OUString( rString.getStr(),
+ rString.getLength(),
+ RTL_TEXTENCODING_UTF8 ) );
+ // FIXME: have some hash to enumeration mapping here
+ if ( aReader.getMethod() == "setNormalString" )
+ mpChain->SetNormalString( aReader.getAddress( 1 ), aReader.getString( 2 ),
aReader.getBool( 3 ) );
- else if ( aReader.getMethod() == "renameTable" )
- mpChain->RenameTable( aReader.getInt( 1 ), aReader.getString( 2 ),
- aReader.getBool( 3 ), aReader.getBool( 4 ) );
- else
- fprintf( stderr, "Error: unknown message '%s' (%d)\n",
- rString.getStr(), (int)aReader.getArgCount() );
- } catch (const ProtocolError &e) {
- fprintf( stderr, "Error: protocol twisting '%s'\n", e.message );
+ else if ( aReader.getMethod() == "putCell" )
+ {
+ ScBaseCell *pNewCell = aReader.getCell( 2 );
+ if ( pNewCell )
+ mpChain->PutCell( aReader.getAddress( 1 ), pNewCell, aReader.getBool( 3 ) );
}
+ else if ( aReader.getMethod() == "enterListAction" )
+ mpChain->EnterListAction( aReader.getInt( 1 ) );
+ else if ( aReader.getMethod() == "endListAction" )
+ mpChain->EndListAction();
+ else if ( aReader.getMethod() == "showNote" )
+ mpChain->ShowNote( aReader.getAddress( 1 ), aReader.getBool( 2 ) );
+ else if ( aReader.getMethod() == "setNoteText" )
+ mpChain->SetNoteText( aReader.getAddress( 1 ), aReader.getString( 2 ),
+ aReader.getBool( 3 ) );
+ else if ( aReader.getMethod() == "renameTable" )
+ mpChain->RenameTable( aReader.getInt( 1 ), aReader.getString( 2 ),
+ aReader.getBool( 3 ), aReader.getBool( 4 ) );
+ else
+ fprintf( stderr, "Error: unknown message '%s' (%d)\n",
+ rString.getStr(), (int)aReader.getArgCount() );
+ } catch (const ProtocolError &e) {
+ fprintf( stderr, "Error: protocol twisting '%s'\n", e.message );
}
-};
+}
void ScDocFuncRecv::packetReceived( TeleConference*, TelePacket &rPacket )
{
@@ -422,187 +227,178 @@ extern "C"
}
}
-class ScDocFuncSend : public ScDocFunc
+void ScDocFuncSend::SendMessage( ScChangeOpWriter &rOp )
{
- boost::shared_ptr<ScDocFuncRecv> mpDirect;
- TeleManager *mpManager;
-
- void SendMessage( ScChangeOpWriter &rOp )
+ fprintf( stderr, "Op: '%s'\n", rOp.toString().getStr() );
+ if (mpManager)
{
- fprintf( stderr, "Op: '%s'\n", rOp.toString().getStr() );
- if (mpManager)
- {
- TelePacket aPacket( "sender", rOp.toString().getStr(), rOp.toString().getLength() );
- mpManager->sendPacket( aPacket );
- }
- else // local demo mode
- mpDirect->RecvMessage( rOp.toString() );
+ TelePacket aPacket( "sender", rOp.toString().getStr(), rOp.toString().getLength() );
+ mpManager->sendPacket( aPacket );
}
+ else // local demo mode
+ mpDirect->RecvMessage( rOp.toString() );
+}
- void SendFile( const rtl::OUString &rURL )
- {
- (void)rURL;
+void ScDocFuncSend::SendFile( const rtl::OUString &rURL )
+{
+ (void)rURL;
- String aTmpPath = utl::TempFile::CreateTempName();
- aTmpPath.Append( rtl::OUString( ".ods" ) );
+ String aTmpPath = utl::TempFile::CreateTempName();
+ aTmpPath.Append( rtl::OUString( ".ods" ) );
- rtl::OUString aFileURL;
- ::utl::LocalFileHelper::ConvertPhysicalNameToURL( aTmpPath, aFileURL );
+ rtl::OUString aFileURL;
+ ::utl::LocalFileHelper::ConvertPhysicalNameToURL( aTmpPath, aFileURL );
- ::comphelper::MediaDescriptor aDescriptor;
- // some issue with hyperlinks:
- aDescriptor[::comphelper::MediaDescriptor::PROP_DOCUMENTBASEURL()] <<= ::rtl::OUString();
- try {
- css::uno::Reference< css::document::XDocumentRecovery > xDocRecovery(
- rDocShell.GetBaseModel(), css::uno::UNO_QUERY_THROW);
+ ::comphelper::MediaDescriptor aDescriptor;
+ // some issue with hyperlinks:
+ aDescriptor[::comphelper::MediaDescriptor::PROP_DOCUMENTBASEURL()] <<= ::rtl::OUString();
+ try {
+ css::uno::Reference< css::document::XDocumentRecovery > xDocRecovery(
+ rDocShell.GetBaseModel(), css::uno::UNO_QUERY_THROW);
- xDocRecovery->storeToRecoveryFile( aFileURL, aDescriptor.getAsConstPropertyValueList() );
- } catch (const css::uno::Exception &ex) {
- fprintf( stderr, "exception foo !\n" );
- }
+ xDocRecovery->storeToRecoveryFile( aFileURL, aDescriptor.getAsConstPropertyValueList() );
+ } catch (const css::uno::Exception &ex) {
+ fprintf( stderr, "exception foo !\n" );
+ }
- fprintf( stderr, "Temp file is '%s'\n",
- rtl::OUStringToOString( aFileURL, RTL_TEXTENCODING_UTF8 ).getStr() );
+ fprintf( stderr, "Temp file is '%s'\n",
+ rtl::OUStringToOString( aFileURL, RTL_TEXTENCODING_UTF8 ).getStr() );
- if (mpManager)
- mpManager->sendFile( aFileURL, file_sent_cb, NULL );
- else
- mpDirect->fileReceived( aFileURL );
+ if (mpManager)
+ mpManager->sendFile( aFileURL, file_sent_cb, NULL );
+ else
+ mpDirect->fileReceived( aFileURL );
- // FIXME: unlink the file after send ...
- }
+ // 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> pDirect )
- : ScDocFunc( rDocSh ),
- mpDirect( pDirect ),
- mpManager( NULL )
- {
- fprintf( stderr, "Sender created !\n" );
- }
- virtual ~ScDocFuncSend() {}
+// FIXME: really ScDocFunc should be an abstract base, so
+// we don't need the rDocSh hack/pointer
+ScDocFuncSend::ScDocFuncSend( ScDocShell& rDocSh, boost::shared_ptr<ScDocFuncRecv> pDirect )
+ : ScDocFunc( rDocSh ),
+ mpDirect( pDirect ),
+ mpManager( NULL )
+{
+ fprintf( stderr, "Sender created !\n" );
+}
- void SetCollaboration( TeleManager *pManager )
- {
- mpManager = pManager;
- }
+void ScDocFuncSend::SetCollaboration( TeleManager *pManager )
+{
+ mpManager = pManager;
+}
- virtual void EnterListAction( sal_uInt16 nNameResId )
- {
- // Want to group these operations for the other side ...
- String aUndo( ScGlobal::GetRscString( nNameResId ) );
- ScChangeOpWriter aOp( "enterListAction" );
- aOp.appendInt( nNameResId ); // nasty but translate-able ...
- SendMessage( aOp );
- }
- virtual void EndListAction()
- {
- ScChangeOpWriter aOp( "endListAction" );
- SendMessage( aOp );
- }
+void ScDocFuncSend::EnterListAction( sal_uInt16 nNameResId )
+{
+ // Want to group these operations for the other side ...
+ String aUndo( ScGlobal::GetRscString( nNameResId ) );
+ ScChangeOpWriter aOp( "enterListAction" );
+ aOp.appendInt( nNameResId ); // nasty but translate-able ...
+ SendMessage( aOp );
+}
- virtual sal_Bool SetNormalString( const ScAddress& rPos, const String& rText, sal_Bool bApi )
- {
- ScChangeOpWriter aOp( "setNormalString" );
- aOp.appendAddress( rPos );
- aOp.appendString( rText );
- aOp.appendBool( bApi );
- SendMessage( aOp );
+void ScDocFuncSend::EndListAction()
+{
+ ScChangeOpWriter aOp( "endListAction" );
+ SendMessage( aOp );
+}
- if ( rtl::OUString( rText ) == "saveme" )
- SendFile( rText );
+sal_Bool ScDocFuncSend::SetNormalString( const ScAddress& rPos, const String& rText, sal_Bool bApi )
+{
+ ScChangeOpWriter aOp( "setNormalString" );
+ aOp.appendAddress( rPos );
+ aOp.appendString( rText );
+ aOp.appendBool( bApi );
+ SendMessage( aOp );
- if ( rtl::OUString( rText ) == "contacts" )
- tubes::createContacts( mpManager );
+ if ( rtl::OUString( rText ) == "saveme" )
+ SendFile( rText );
- return true; // needs some code auditing action
- }
+ if ( rtl::OUString( rText ) == "contacts" )
+ tubes::createContacts( mpManager );
- virtual sal_Bool PutCell( const ScAddress& rPos, ScBaseCell* pNewCell, sal_Bool bApi )
- {
- fprintf( stderr, "put cell '%p' type %d %d\n", pNewCell, pNewCell->GetCellType(), bApi );
- ScChangeOpWriter aOp( "putCell" );
- aOp.appendAddress( rPos );
- aOp.appendCell( pNewCell );
- aOp.appendBool( bApi );
- SendMessage( aOp );
- return true; // needs some code auditing action
- }
+ return true; // needs some code auditing action
+}
- virtual sal_Bool PutData( const ScAddress& rPos, ScEditEngineDefaulter& rEngine,
- sal_Bool bInterpret, sal_Bool bApi )
- {
- fprintf( stderr, "put data\n" );
- return ScDocFunc::PutData( rPos, rEngine, bInterpret, bApi );
- }
+sal_Bool ScDocFuncSend::PutCell( const ScAddress& rPos, ScBaseCell* pNewCell, sal_Bool bApi )
+{
+ fprintf( stderr, "put cell '%p' type %d %d\n", pNewCell, pNewCell->GetCellType(), bApi );
+ ScChangeOpWriter aOp( "putCell" );
+ aOp.appendAddress( rPos );
+ aOp.appendCell( pNewCell );
+ aOp.appendBool( bApi );
+ SendMessage( aOp );
+ return true; // needs some code auditing action
+}
- virtual sal_Bool SetCellText( const ScAddress& rPos, const String& rText,
- sal_Bool bInterpret, sal_Bool bEnglish, sal_Bool bApi,
- const String& rFormulaNmsp,
- const formula::FormulaGrammar::Grammar eGrammar )
- {
- fprintf( stderr, "set cell text '%s'\n",
- rtl::OUStringToOString( rText, RTL_TEXTENCODING_UTF8 ).getStr() );
- return ScDocFunc::SetCellText( rPos, rText, bInterpret, bEnglish, bApi, rFormulaNmsp, eGrammar );
- }
+sal_Bool ScDocFuncSend::PutData( const ScAddress& rPos, ScEditEngineDefaulter& rEngine,
+ sal_Bool bInterpret, sal_Bool bApi )
+{
+ fprintf( stderr, "put data\n" );
+ return ScDocFunc::PutData( rPos, rEngine, bInterpret, bApi );
+}
- virtual bool ShowNote( const ScAddress& rPos, bool bShow = true )
- {
- ScChangeOpWriter aOp( "showNote" );
- aOp.appendAddress( rPos );
- aOp.appendBool( bShow );
- SendMessage( aOp );
- return true; // needs some code auditing action
- }
+sal_Bool ScDocFuncSend::SetCellText( const ScAddress& rPos, const String& rText,
+ sal_Bool bInterpret, sal_Bool bEnglish, sal_Bool bApi,
+ const String& rFormulaNmsp,
+ const formula::FormulaGrammar::Grammar eGrammar )
+{
+ fprintf( stderr, "set cell text '%s'\n",
+ rtl::OUStringToOString( rText, RTL_TEXTENCODING_UTF8 ).getStr() );
+ return ScDocFunc::SetCellText( rPos, rText, bInterpret, bEnglish, bApi, rFormulaNmsp, eGrammar );
+}
- virtual bool SetNoteText( const ScAddress& rPos, const String& rNoteText, sal_Bool bApi )
- {
- ScChangeOpWriter aOp( "setNoteText" );
- aOp.appendAddress( rPos );
- aOp.appendString( rNoteText );
- aOp.appendBool( bApi );
- SendMessage( aOp );
- return true; // needs some code auditing action
- }
+bool ScDocFuncSend::ShowNote( const ScAddress& rPos, bool bShow )
+{
+ ScChangeOpWriter aOp( "showNote" );
+ aOp.appendAddress( rPos );
+ aOp.appendBool( bShow );
+ SendMessage( aOp );
+ return true; // needs some code auditing action
+}
- virtual sal_Bool RenameTable( SCTAB nTab, const String& rName,
- sal_Bool bRecord, sal_Bool bApi )
- {
- ScChangeOpWriter aOp( "renameTable" );
- aOp.appendInt( nTab );
- aOp.appendString( rName );
- aOp.appendBool( bRecord );
- aOp.appendBool( bApi );
- SendMessage( aOp );
- return true; // needs some code auditing action
- }
+bool ScDocFuncSend::SetNoteText( const ScAddress& rPos, const String& rNoteText, sal_Bool bApi )
+{
+ ScChangeOpWriter aOp( "setNoteText" );
+ aOp.appendAddress( rPos );
+ aOp.appendString( rNoteText );
+ aOp.appendBool( bApi );
+ SendMessage( aOp );
+ return true; // needs some code auditing action
+}
- virtual sal_Bool ApplyAttributes( const ScMarkData& rMark, const ScPatternAttr& rPattern,
- sal_Bool bRecord, sal_Bool bApi )
- {
- fprintf( stderr, "Apply Attributes\n" );
- return ScDocFunc::ApplyAttributes( rMark, rPattern, bRecord, bApi );
- }
+sal_Bool ScDocFuncSend::RenameTable( SCTAB nTab, const String& rName,
+ sal_Bool bRecord, sal_Bool bApi )
+{
+ ScChangeOpWriter aOp( "renameTable" );
+ aOp.appendInt( nTab );
+ aOp.appendString( rName );
+ aOp.appendBool( bRecord );
+ aOp.appendBool( bApi );
+ SendMessage( aOp );
+ return true; // needs some code auditing action
+}
- virtual sal_Bool ApplyStyle( const ScMarkData& rMark, const String& rStyleName,
- sal_Bool bRecord, sal_Bool bApi )
- {
- fprintf( stderr, "Apply Style '%s'\n",
- rtl::OUStringToOString( rStyleName, RTL_TEXTENCODING_UTF8 ).getStr() );
- return ScDocFunc::ApplyStyle( rMark, rStyleName, bRecord, bApi );
- }
+sal_Bool ScDocFuncSend::ApplyAttributes( const ScMarkData& rMark, const ScPatternAttr& rPattern,
+ sal_Bool bRecord, sal_Bool bApi )
+{
+ fprintf( stderr, "Apply Attributes\n" );
+ return ScDocFunc::ApplyAttributes( rMark, rPattern, bRecord, bApi );
+}
- virtual sal_Bool MergeCells( const ScCellMergeOption& rOption, sal_Bool bContents,
- sal_Bool bRecord, sal_Bool bApi )
- {
- fprintf( stderr, "Merge cells\n" );
- return ScDocFunc::MergeCells( rOption, bContents, bRecord, bApi );
- }
-};
+sal_Bool ScDocFuncSend::ApplyStyle( const ScMarkData& rMark, const String& rStyleName,
+ sal_Bool bRecord, sal_Bool bApi )
+{
+ fprintf( stderr, "Apply Style '%s'\n",
+ rtl::OUStringToOString( rStyleName, RTL_TEXTENCODING_UTF8 ).getStr() );
+ return ScDocFunc::ApplyStyle( rMark, rStyleName, bRecord, bApi );
+}
-} // anonymous namespace
+sal_Bool ScDocFuncSend::MergeCells( const ScCellMergeOption& rOption, sal_Bool bContents,
+ sal_Bool bRecord, sal_Bool bApi )
+{
+ fprintf( stderr, "Merge cells\n" );
+ return ScDocFunc::MergeCells( rOption, bContents, bRecord, bApi );
+}
SC_DLLPRIVATE ScDocFunc *ScDocShell::CreateDocFunc()
{
diff --git a/sc/source/ui/collab/sendfunc.hxx b/sc/source/ui/collab/sendfunc.hxx
new file mode 100644
index 000000000000..bd388ddce051
--- /dev/null
+++ b/sc/source/ui/collab/sendfunc.hxx
@@ -0,0 +1,266 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef _SENDFUNC_HXX_
+#define _SENDFUNC_HXX_
+
+#include <sal/config.h>
+
+#include "cell.hxx"
+#include "docfunc.hxx"
+#include <tubes/conference.hxx>
+#include <tubes/manager.hxx>
+#include <tubes/packet.hxx>
+
+namespace {
+
+rtl::OUString cellToString( ScBaseCell *pCell )
+{
+ (void)pCell; // FIXME: implement me
+ return rtl::OUString();
+}
+
+ScBaseCell *stringToCell( const rtl::OUString &rString )
+{
+ (void)rString; // FIXME: implement me
+ return NULL;
+}
+
+// Ye noddy mangling - needs improvement ...
+// method name ';' then arguments ; separated
+class ScChangeOpWriter
+{
+ rtl::OUStringBuffer aMessage;
+ void appendSeparator()
+ {
+ aMessage.append( sal_Unicode( ';' ) );
+ }
+
+public:
+ ScChangeOpWriter( const char *pName )
+ {
+ aMessage.appendAscii( pName );
+ appendSeparator();
+ }
+
+ void appendString( const rtl::OUString &rStr )
+ {
+ if ( rStr.indexOf( sal_Unicode( '"' ) ) >= 0 ||
+ rStr.indexOf( sal_Unicode( ';' ) ) >= 0 )
+ {
+ String aQuoted( rStr );
+ ScGlobal::AddQuotes( aQuoted, sal_Unicode( '"' ) );
+ aMessage.append( aQuoted );
+ }
+ else
+ aMessage.append( rStr );
+ appendSeparator();
+ }
+
+ void appendAddress( const ScAddress &rPos )
+ {
+ rtl::OUString aStr;
+ rPos.Format( aStr, SCA_VALID );
+ aMessage.append( aStr );
+ appendSeparator();
+ }
+
+ void appendInt( sal_Int32 i )
+ {
+ aMessage.append( i );
+ appendSeparator();
+ }
+
+ void appendBool( sal_Bool b )
+ {
+ aMessage.appendAscii( b ? "true" : "false" );
+ appendSeparator();
+ }
+
+ void appendCell( ScBaseCell *pCell )
+ {
+ appendString( cellToString( pCell ) );
+ }
+
+ rtl::OString toString()
+ {
+ return rtl::OUStringToOString( aMessage.toString(), RTL_TEXTENCODING_UTF8 );
+ }
+};
+
+struct ProtocolError {
+ const char *message;
+};
+
+class ScChangeOpReader {
+ std::vector< rtl::OUString > maArgs;
+
+public:
+ ScChangeOpReader( const rtl::OUString &rString)
+ {
+ // will need to handle escaping etc.
+ // Surely someone else wrote this before ! [!?]
+ enum {
+ IN_TEXT, CHECK_QUOTE, FIND_LAST_QUOTE, SKIP_SEMI
+ } eState = CHECK_QUOTE;
+
+ sal_Int32 nStart = 0;
+ for (sal_Int32 n = 0; n < rString.getLength(); n++)
+ {
+ if (rString[n] == '\\')
+ {
+ n++; // skip next char
+ continue;
+ }
+ switch (eState) {
+ case CHECK_QUOTE:
+ if (rString[n] == '"')
+ {
+ nStart = n + 1;
+ eState = FIND_LAST_QUOTE;
+ break;
+ }
+ // else drop through
+ case IN_TEXT:
+ if (rString[n] == ';')
+ {
+ maArgs.push_back( rString.copy( nStart, n - nStart ) );
+ nStart = n + 1;
+ eState = CHECK_QUOTE;
+ }
+ break;
+ case FIND_LAST_QUOTE:
+ if (rString[n] == '"')
+ {
+ maArgs.push_back( rString.copy( nStart, n - nStart ) );
+ eState = SKIP_SEMI;
+ break;
+ }
+ break;
+ case SKIP_SEMI:
+ if (rString[n] == ';')
+ {
+ nStart = n + 1;
+ eState = CHECK_QUOTE;
+ }
+ break;
+ }
+ }
+ if ( nStart < rString.getLength())
+ maArgs.push_back( rString.copy( nStart, rString.getLength() - nStart ) );
+
+ for (size_t i = 0; i < maArgs.size(); i++)
+ fprintf( stderr, "arg %d: '%s'\n", (int)i,
+ rtl::OUStringToOString( maArgs[i], RTL_TEXTENCODING_UTF8).getStr() );
+ }
+ ~ScChangeOpReader() {}
+
+ rtl::OUString getMethod()
+ {
+ return maArgs[0];
+ }
+
+ size_t getArgCount() { return maArgs.size(); }
+
+ rtl::OUString getString( sal_Int32 n )
+ {
+ if (n > 0 && (size_t)n < getArgCount() )
+ {
+ String aUStr( maArgs[ n ] );
+ ScGlobal::EraseQuotes( aUStr );
+ return aUStr;
+ } else
+ return rtl::OUString();
+ }
+
+ ScAddress getAddress( sal_Int32 n )
+ {
+ ScAddress aAddr;
+ rtl::OUString aToken( getString( n ) );
+ aAddr.Parse( aToken );
+ return aAddr;
+ }
+
+ sal_Int32 getInt( sal_Int32 n )
+ {
+ return getString( n ).toInt32();
+ }
+
+ bool getBool( sal_Int32 n )
+ {
+ return getString( n ).equalsIgnoreAsciiCase( "true" );
+ }
+
+ ScBaseCell *getCell( sal_Int32 n )
+ {
+ return stringToCell( getString( n ) );
+ }
+};
+
+} // anonymous namespace
+
+class ScDocFuncRecv
+{
+ boost::shared_ptr<ScDocFuncDirect> mpChain;
+
+protected:
+ ScDocFuncRecv() {}
+
+public:
+ // FIXME: really ScDocFunc should be an abstract base
+ ScDocFuncRecv( boost::shared_ptr<ScDocFuncDirect>& pChain );
+ virtual ~ScDocFuncRecv() {}
+
+ void packetReceived( TeleConference*, TelePacket &rPacket );
+
+ virtual void fileReceived( const rtl::OUString &rStr );
+ virtual void RecvMessage( const rtl::OString &rString );
+};
+
+class ScDocFuncSend : public ScDocFunc
+{
+ boost::shared_ptr<ScDocFuncRecv> mpDirect;
+ TeleManager *mpManager;
+
+ void SendMessage( ScChangeOpWriter &rOp );
+ void SendFile( const rtl::OUString &rURL );
+
+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> pDirect );
+ virtual ~ScDocFuncSend() {}
+
+ void SetCollaboration( TeleManager *pManager );
+
+ virtual void EnterListAction( sal_uInt16 nNameResId );
+ virtual void EndListAction();
+
+ virtual sal_Bool SetNormalString( const ScAddress& rPos, const String& rText, sal_Bool bApi );
+ virtual sal_Bool PutCell( const ScAddress& rPos, ScBaseCell* pNewCell, sal_Bool bApi );
+ virtual sal_Bool PutData( const ScAddress& rPos, ScEditEngineDefaulter& rEngine,
+ sal_Bool bInterpret, sal_Bool bApi );
+ virtual sal_Bool SetCellText( const ScAddress& rPos, const String& rText,
+ sal_Bool bInterpret, sal_Bool bEnglish, sal_Bool bApi,
+ const String& rFormulaNmsp,
+ const formula::FormulaGrammar::Grammar eGrammar );
+ virtual bool ShowNote( const ScAddress& rPos, bool bShow = true );
+ virtual bool SetNoteText( const ScAddress& rPos, const String& rNoteText, sal_Bool bApi );
+ virtual sal_Bool RenameTable( SCTAB nTab, const String& rName, sal_Bool bRecord, sal_Bool bApi );
+ virtual sal_Bool ApplyAttributes( const ScMarkData& rMark, const ScPatternAttr& rPattern,
+ sal_Bool bRecord, sal_Bool bApi );
+ virtual sal_Bool ApplyStyle( const ScMarkData& rMark, const String& rStyleName,
+ sal_Bool bRecord, sal_Bool bApi );
+ virtual sal_Bool MergeCells( const ScCellMergeOption& rOption, sal_Bool bContents,
+ sal_Bool bRecord, sal_Bool bApi );
+};
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */