Console: Implement skeleton executor
g0dil [Thu, 20 Mar 2008 00:06:23 +0000 (00:06 +0000)]
Console: Connect server to parser and executor

git-svn-id: https://svn.berlios.de/svnroot/repos/senf/trunk@749 270642c3-0616-0410-b53a-bc976706d245

Console/Executor.cc [new file with mode: 0644]
Console/Executor.hh [new file with mode: 0644]
Console/Server.cc
Console/Server.ih

diff --git a/Console/Executor.cc b/Console/Executor.cc
new file mode 100644 (file)
index 0000000..0a9285a
--- /dev/null
@@ -0,0 +1,59 @@
+// $Id$
+//
+// Copyright (C) 2008 
+// Fraunhofer Institute for Open Communication Systems (FOKUS)
+// Competence Center NETwork research (NET), St. Augustin, GERMANY
+//     Stefan Bund <g0dil@berlios.de>
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the
+// Free Software Foundation, Inc.,
+// 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+
+/** \file
+    \brief Executor non-inline non-template implementation */
+
+#include "Executor.hh"
+//#include "Executor.ih"
+
+// Custom includes
+
+//#include "Executor.mpp"
+#define prefix_
+///////////////////////////////cc.p////////////////////////////////////////
+
+///////////////////////////////////////////////////////////////////////////
+// senf::console::Executor
+
+prefix_ bool senf::console::Executor::operator()(ParseCommandInfo const & command,
+                                                 std::ostream & output)
+{
+#   warning Implement Executor::operator()
+    SENF_LOG(( "Executing '" << command.commandPath() << "'" ));
+    return true;
+}
+
+///////////////////////////////cc.e////////////////////////////////////////
+#undef prefix_
+//#include "Executor.mpp"
+
+\f
+// Local Variables:
+// mode: c++
+// fill-column: 100
+// comment-column: 40
+// c-file-style: "senf"
+// indent-tabs-mode: nil
+// ispell-local-dictionary: "american"
+// compile-command: "scons -u test"
+// End:
diff --git a/Console/Executor.hh b/Console/Executor.hh
new file mode 100644 (file)
index 0000000..7be8db3
--- /dev/null
@@ -0,0 +1,79 @@
+// $Id$
+//
+// Copyright (C) 2008 
+// Fraunhofer Institute for Open Communication Systems (FOKUS)
+// Competence Center NETwork research (NET), St. Augustin, GERMANY
+//     Stefan Bund <g0dil@berlios.de>
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the
+// Free Software Foundation, Inc.,
+// 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+
+/** \file
+    \brief Executor public header */
+
+#ifndef HH_Executor_
+#define HH_Executor_ 1
+
+// Custom includes
+#include "Parse.hh"
+#include "../Utils/Logger/SenfLog.hh"
+
+//#include "Executor.mpp"
+///////////////////////////////hh.p////////////////////////////////////////
+
+namespace senf {
+namespace console {
+
+    /** \brief
+      */
+    class Executor
+    {
+        SENF_LOG_CLASS_AREA();
+        SENF_LOG_DEFAULT_LEVEL( senf::log::NOTICE );
+    public:
+        ///////////////////////////////////////////////////////////////////////////
+        // Types
+
+        typedef boost::iterator_range< ParseCommandInfo::argument_iterator> Arguments;
+
+        ///////////////////////////////////////////////////////////////////////////
+        
+        bool operator()(ParseCommandInfo const & command, std::ostream & output);
+    
+    protected:
+
+    private:
+
+    };
+
+
+}}
+
+///////////////////////////////hh.e////////////////////////////////////////
+//#include "Executor.cci"
+//#include "Executor.ct"
+//#include "Executor.cti"
+#endif
+
+\f
+// Local Variables:
+// mode: c++
+// fill-column: 100
+// comment-column: 40
+// c-file-style: "senf"
+// indent-tabs-mode: nil
+// ispell-local-dictionary: "american"
+// compile-command: "scons -u test"
+// End:
index 8137f86..0fd831d 100644 (file)
 #include "Server.ih"
 
 // Custom includes
+#include <unistd.h>
+#include <iostream>
 #include <boost/algorithm/string/trim.hpp>
+#include <boost/iostreams/device/file_descriptor.hpp>
+#include <boost/iostreams/stream.hpp>
 #include "../Utils/senfassert.hh"
 #include "../Utils/membind.hh"
 #include "../Utils/Logger/SenfLog.hh"
 
 prefix_ void senf::console::start(senf::INet4SocketAddress const & address)
 {
-    senf::console::detail::Server::start(senf::TCPv4ServerSocketHandle(address));
+    senf::TCPv4ServerSocketHandle handle (address);
+    handle.protocol().reuseaddr();
+    senf::console::detail::Server::start(handle);
     SENF_LOG((detail::Server::SENFLogArea)(log::NOTICE)( 
                  "Console server started at " << address ));
 }
 
 prefix_ void senf::console::start(senf::INet6SocketAddress const & address)
 {
-    senf::console::detail::Server::start(senf::TCPv6ServerSocketHandle(address));
+    senf::TCPv6ServerSocketHandle handle (address);
+    handle.protocol().reuseaddr();
+    senf::console::detail::Server::start(handle);
     SENF_LOG((detail::Server::SENFLogArea)(log::NOTICE)( 
                  "Console server started at " << address ));
 }
@@ -91,8 +99,9 @@ prefix_ void senf::console::detail::Server::removeClient(Client & client)
 // senf::console::detail::Client
 
 prefix_ senf::console::detail::Client::Client(ClientHandle handle)
-    : handle_ (handle)
+    : handle_ (handle), out_(::dup(handle.fd()))
 {
+    out_ << "# " << std::flush;
     ReadHelper<ClientHandle>::dispatch( handle_, 16384u, ReadUntil("\n"),
                                         senf::membind(&Client::clientData, this) );
 }
@@ -114,11 +123,22 @@ prefix_ void senf::console::detail::Client::clientData(ReadHelper<ClientHandle>:
         return;
     }
 
+#   warning fix Client::clientData implementation
+    // Remove the 'dup' needed here so we don't close the same fd twice (see Client constructor)
+    // Make output non-blocking
+    // Don't register a new ReadHelper every round
+
     std::string data (tail_ + helper->data());
     tail_ = helper->tail();
     boost::trim(data); // Gets rid of superfluous  \r or \n characters
 
-    SENF_LOG(( this << ": " << data ));
+    ParseCommandInfo command;
+    if (parser_.parseCommand(data, command))
+        executor_(command, out_);
+    else 
+        out_ << "syntax error" << std::endl;
+
+    out_ << "# " << std::flush;
     ReadHelper<ClientHandle>::dispatch( handle_, 16384u, ReadUntil("\n"),
                                         senf::membind(&Client::clientData, this) );
 }
index 8355450..d25aed3 100644 (file)
 #include <boost/utility.hpp>
 #include <boost/scoped_ptr.hpp>
 #include <boost/shared_ptr.hpp>
+#include <boost/iostreams/device/file_descriptor.hpp>
+#include <boost/iostreams/stream.hpp>
 #include "../Utils/intrusive_refcount.hh"
 #include "../Socket/Protocols/INet/TCPSocketHandle.hh"
 #include "../Socket/ServerSocketHandle.hh"
 #include "../Scheduler/Scheduler.hh"
 #include "../Scheduler/ReadHelper.hh"
+#include "Parse.hh"
+#include "Executor.hh"
 
 ///////////////////////////////ih.p////////////////////////////////////////
 
@@ -105,6 +109,11 @@ namespace detail {
         
         ClientHandle handle_;
         std::string tail_;
+        SingleCommandParser parser_;
+        Executor executor_;
+
+        typedef boost::iostreams::stream<boost::iostreams::file_descriptor_sink> fdostream;
+        fdostream out_;
 
         friend class Server;
     };