[Libreoffice-commits] .: Branch 'feature/tubes2' - sc/source

Michael Meeks michael at kemper.freedesktop.org
Thu Mar 22 05:32:58 PDT 2012


 sc/source/ui/collab/sendfunc.cxx |  189 ++++++++++++++++++++++++++++++++-------
 sc/source/ui/view/viewfunc.cxx   |    3 
 2 files changed, 156 insertions(+), 36 deletions(-)

New commits:
commit 503f0d340997c95d9077be0fec21ee07aa3d4a02
Author: Michael Meeks <michael.meeks at suse.com>
Date:   Thu Mar 22 12:31:15 2012 +0000

    tubes: chain noddy serialize & de-serialize to partial docfunc re-impl.

diff --git a/sc/source/ui/collab/sendfunc.cxx b/sc/source/ui/collab/sendfunc.cxx
index ccc785d..0de59bf 100644
--- a/sc/source/ui/collab/sendfunc.cxx
+++ b/sc/source/ui/collab/sendfunc.cxx
@@ -27,45 +27,172 @@
  */
 
 #include "sal/config.h"
+
+#include <vector>
+
 #include "cell.hxx"
 #include "docsh.hxx"
 #include "docfunc.hxx"
 
 namespace {
 
-// Ye noddy protocol !
-// method name ',' then arguments comma separated
-class ScChangeOp
+// Ye noddy mangling - needs improvement ...
+// method name ';' then arguments ; separated
+class ScChangeOpWriter
 {
   rtl::OUStringBuffer aMessage;
+  void appendSeparator()
+  {
+      aMessage.append( sal_Unicode( ';' ) );
+  }
 public:
-  ScChangeOp( const char *pName )
+
+  ScChangeOpWriter( const char *pName )
+  {
+      aMessage.appendAscii( pName );
+      appendSeparator();
+  }
+
+  void appendString( const rtl::OUString &rStr )
   {
-    aMessage.appendAscii( pName );
-    aMessage.append( sal_Unicode( ',' ) );
+      aMessage.append( rStr );
+      appendSeparator();
   }
 
-  void appendString( const ScAddress &rPos )
+  void appendString( const String &rStr )
   {
-    rtl::OUString aStr;
-    rPos.Format( aStr );
-    aMessage.append( aStr );
+      aMessage.append( rStr );
+      appendSeparator();
   }
 
   void appendAddress( const ScAddress &rPos )
   {
-    (void)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();
+  }
+
+  rtl::OString toString()
+  {
+      return rtl::OUStringToOString( aMessage.toString(), RTL_TEXTENCODING_UTF8 );
   }
 };
 
-class ScDocFuncIntercept : public ScDocFunc
+struct ProtocolError {
+    const char *message;
+};
+
+class ScChangeOpReader {
+    std::vector< rtl::OString > maArgs;
+
+public:
+
+    ScChangeOpReader( const rtl::OString &rString)
+    {
+        // will need to handle escaping etc.
+        for (sal_Int32 n = 0; n >= 0 && n < rString.getLength();)
+            maArgs.push_back( rString.getToken( 0, ';', n ) );
+    }
+    ~ScChangeOpReader() {}
+
+    rtl::OString getMethod()
+    {
+        return maArgs[0];
+    }
+
+    size_t getArgCount() { return maArgs.size(); }
+
+    rtl::OUString getString( sal_Int32 n )
+    {
+        if (n > 0 && (size_t)n < getArgCount() )
+            return rtl::OUString( maArgs[n].getStr(), maArgs[n].getLength(),
+                                  RTL_TEXTENCODING_UTF8 );
+        else
+            return rtl::OUString();
+    }
+
+    ScAddress getAddress( sal_Int32 n )
+    {
+        ScAddress aAddr;
+        rtl::OUString aToken( getString( n ) );
+        aAddr.Parse( aToken );
+        return aAddr;
+    }
+
+    bool getBool( sal_Int32 n )
+    {
+        if (n > 0 && (size_t)n < getArgCount() )
+            return maArgs[n].equalsIgnoreAsciiCase( "true" );
+        else
+            return false;
+    }
+};
+
+
+class ScDocFuncRecv : public ScDocFunc
 {
+    ScDocFunc *mpChain;
 public:
-    ScDocFuncIntercept( ScDocShell& rDocSh ) : ScDocFunc( rDocSh )
+    // FIXME: really ScDocFunc should be an abstract base
+    ScDocFuncRecv( ScDocShell& rDocSh, ScDocFunc *pChain )
+        : ScDocFunc( rDocSh ),
+          mpChain( pChain )
     {
-        fprintf( stderr, "Interceptor created !\n" );
+        fprintf( stderr, "Receiver created !\n" );
     }
-    virtual ~ScDocFuncIntercept() {}
+    virtual ~ScDocFuncRecv() {}
+
+    void RecvMessage( const rtl::OString &rString )
+    {
+        try {
+            ScChangeOpReader aReader( rString );
+            // FIXME: have some hash to enumeration mapping here
+            if ( aReader.getMethod() == "setNormalString" )
+                mpChain->SetNormalString( aReader.getAddress( 1 ), aReader.getString( 2 ),
+                                          aReader.getBool( 3 ) );
+            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 );
+        }
+    }
+};
+
+class ScDocFuncSend : public ScDocFunc
+{
+    ScDocFuncRecv *mpChain;
+
+    void SendMessage( ScChangeOpWriter &rOp )
+    {
+        fprintf( stderr, "Op: '%s'\n", rOp.toString().getStr() );
+        mpChain->RecvMessage( rOp.toString() );
+    }
+
+public:
+    // FIXME: really ScDocFunc should be an abstract base, so
+    // we don't need the rDocSh hack/pointer
+    ScDocFuncSend( ScDocShell& rDocSh, ScDocFuncRecv *pChain )
+            : ScDocFunc( rDocSh ),
+            mpChain( pChain )
+    {
+        fprintf( stderr, "Sender created !\n" );
+    }
+    virtual ~ScDocFuncSend() {}
+
     virtual void EnterListAction( sal_uInt16 nNameResId )
     {
         // Want to group these operations for the other side ...
@@ -74,34 +201,29 @@ public:
     virtual void EndListAction()
     {
     }
-    virtual ScBaseCell* InterpretEnglishString( const ScAddress& rPos, const String& rText,
-                                                const String& rFormulaNmsp,
-                                                const formula::FormulaGrammar::Grammar eGrammar,
-                                                short* pRetFormatType )
-    {
-        fprintf( stderr, "interp. english string '%s'\n",
-                 rtl::OUStringToOString( rText, RTL_TEXTENCODING_UTF8 ).getStr() );
-        return ScDocFunc::InterpretEnglishString( rPos, rText, rFormulaNmsp,
-                                                  eGrammar, pRetFormatType );
-    }
+
     virtual sal_Bool SetNormalString( const ScAddress& rPos, const String& rText, sal_Bool bApi )
     {
-        fprintf( stderr, "set normal string '%s'\n",
-                 rtl::OUStringToOString( rText, RTL_TEXTENCODING_UTF8 ).getStr() );
-        return ScDocFunc::SetNormalString( rPos, rText, bApi );
+        ScChangeOpWriter aOp( "setNormalString" );
+        aOp.appendAddress( rPos );
+        aOp.appendString( rText );
+        aOp.appendBool( bApi );
+        SendMessage( aOp );
+        //        return mpChain->SetNormalString( rPos, rText, bApi );
+        return true; // needs some code auditing action
     }
 
     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 );
-        return ScDocFunc::PutCell( rPos, pNewCell, bApi );
+        return mpChain->PutCell( rPos, pNewCell, bApi );
     }
 
     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 );
+        return mpChain->PutData( rPos, rEngine, bInterpret, bApi );
     }
 
     virtual sal_Bool SetCellText( const ScAddress& rPos, const String& rText,
@@ -111,13 +233,13 @@ public:
     {
         fprintf( stderr, "set cell text '%s'\n",
                  rtl::OUStringToOString( rText, RTL_TEXTENCODING_UTF8 ).getStr() );
-        return ScDocFunc::SetCellText( rPos, rText, bInterpret, bEnglish, bApi, rFormulaNmsp, eGrammar );
+        return mpChain->SetCellText( rPos, rText, bInterpret, bEnglish, bApi, rFormulaNmsp, eGrammar );
     }
 
     virtual bool ShowNote( const ScAddress& rPos, bool bShow = true )
     {
         fprintf( stderr, "%s note\n", bShow ? "show" : "hide" );
-        return ScDocFunc::ShowNote( rPos, bShow );
+        return mpChain->ShowNote( rPos, bShow );
     }
 };
 
@@ -125,8 +247,9 @@ public:
 
 SC_DLLPRIVATE ScDocFunc *ScDocShell::CreateDocFunc()
 {
+    // FIXME: the chains should be auto-ptrs.
     if (getenv ("INTERCEPT"))
-        return new ScDocFuncIntercept( *this );
+        return new ScDocFuncSend( *this, new ScDocFuncRecv( *this, new ScDocFuncDirect( *this ) ) );
     else
         return new ScDocFuncDirect( *this );
 }
diff --git a/sc/source/ui/view/viewfunc.cxx b/sc/source/ui/view/viewfunc.cxx
index 6277537..488accb 100644
--- a/sc/source/ui/view/viewfunc.cxx
+++ b/sc/source/ui/view/viewfunc.cxx
@@ -353,9 +353,6 @@ void ScViewFunc::EnterData( SCCOL nCol, SCROW nRow, SCTAB nTab,
     bool bRecord = pDoc->IsUndoEnabled();
     SCTAB i;
 
-    fprintf( stderr, "EnterData '%s'\n",
-             rtl::OUStringToOString( rString, RTL_TEXTENCODING_UTF8 ).getStr() );
-
     ScDocShell* pDocSh = GetViewData()->GetDocShell();
     ScDocFunc &rFunc = GetViewData()->GetDocFunc();
     ScDocShellModificator aModificator( *pDocSh );


More information about the Libreoffice-commits mailing list