switch to new MPL based Fraunhofer FOKUS Public License
[senf.git] / senf / Utils / Console / Server.hh
index c538a5b..b2cdca6 100644 (file)
@@ -1,24 +1,29 @@
 // $Id$
 //
-// Copyright (C) 2008 
+// 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.
+// The contents of this file are subject to the Fraunhofer FOKUS Public License
+// Version 1.0 (the "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at 
+// http://senf.berlios.de/license.html
 //
-// 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.
+// The Fraunhofer FOKUS Public License Version 1.0 is based on, 
+// but modifies the Mozilla Public License Version 1.1.
+// See the full license text for the amendments.
 //
-// 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.
+// Software distributed under the License is distributed on an "AS IS" basis, 
+// WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License 
+// for the specific language governing rights and limitations under the License.
+//
+// The Original Code is Fraunhofer FOKUS code.
+//
+// The Initial Developer of the Original Code is Fraunhofer-Gesellschaft e.V. 
+// (registered association), Hansastraße 27 c, 80686 Munich, Germany.
+// All Rights Reserved.
+//
+// Contributor(s):
+//   Stefan Bund <g0dil@berlios.de>
 
 /** \file
     \brief Server public header */
 #include <set>
 #include <boost/utility.hpp>
 #include <boost/scoped_ptr.hpp>
-#include <boost/shared_ptr.hpp>
-#include <senf/Utils/intrusive_refcount.hh>
-#include <senf/Socket/Protocols/INet/TCPSocketHandle.hh>
-#include <senf/Socket/ServerSocketHandle.hh>
-#include <senf/Scheduler/Scheduler.hh>
-#include <senf/Scheduler/ReadHelper.hh>
-#include "Parse.hh"
-#include "Executor.hh"
+#include <senf/Scheduler/FdEvent.hh>
+#include <senf/Scheduler/TimerEvent.hh>
 #include <senf/Socket/Protocols/INet/INetAddressing.hh>
 #include <senf/Utils/Logger.hh>
+#include <senf/Utils/intrusive_refcount.hh>
+#include "Executor.hh"
 
 //#include "Server.mpp"
 #include "Server.ih"
-///////////////////////////////hh.p////////////////////////////////////////
+//-/////////////////////////////////////////////////////////////////////////////////////////////////
 
 namespace senf {
 namespace console {
@@ -70,14 +71,14 @@ namespace console {
         SENF_LOG_CLASS_AREA();
         SENF_LOG_DEFAULT_LEVEL( senf::log::NOTICE );
     public:
-        ///////////////////////////////////////////////////////////////////////////
+        //-////////////////////////////////////////////////////////////////////////
         // Types
-        
+
         typedef detail::ServerHandle ServerHandle;
 
         enum Mode { Automatic, Interactive, Noninteractive };
 
-        ///////////////////////////////////////////////////////////////////////////
+        //-////////////////////////////////////////////////////////////////////////
 
         static Server & start(senf::INet4SocketAddress const & address);
                                         ///< Start server on given IPv4 address/port
@@ -98,9 +99,9 @@ namespace console {
 
         Mode mode() const;              ///< Get mode
                                         /**< \see \ref mode(Mode) */
-        
+
         Server & mode(Mode mode);       ///< Set mode
-                                        /**< There are two Server types: 
+                                        /**< There are two Server types:
                                              \li An interactive server displays a command prompt and
                                                  optionally supports command-line editing.
                                              \li A non-interactive server does not display any
@@ -115,7 +116,7 @@ namespace console {
                                              opened. */
 
         void stop();                    ///< Stop the server
-                                        /**< All clients will be closed 
+                                        /**< All clients will be closed
                                              \warning The Server instance itself will be deleted */
 
     protected:
@@ -127,19 +128,19 @@ namespace console {
 
         void newClient(int event);
         void removeClient(Client & client);
-        
+
         ServerHandle handle_;
         scheduler::FdEvent event_;
         DirectoryNode::ptr root_;
         Mode mode_;
-        
+
         typedef std::set< boost::intrusive_ptr<Client> > Clients;
         Clients clients_;
         std::string name_;
-        
+
         friend class Client;
     };
-    
+
     /** \brief Server client instance
 
         Whenever a new client connects, a new instance of this class is created. This class shows a
@@ -149,7 +150,7 @@ namespace console {
         \ingroup console_access
      */
     class Client
-        : public senf::intrusive_refcount, 
+        : public senf::intrusive_refcount,
           private boost::base_from_member< detail::NonblockingSocketOStream >,
           public senf::log::IOStreamTarget
     {
@@ -174,7 +175,7 @@ namespace console {
         ClientHandle handle() const;    ///< Get the client's network socket handle
         std::ostream & stream();        ///< Get client's output stream
                                         /**< Data sent to this stream is sent out over the network
-                                             via the client's socket handle. Write operation is 
+                                             via the client's socket handle. Write operation is
                                              non-blocking and data may be dropped. Data is written
                                              using Client::write(). */
         std::string promptString() const; ///< Get the prompt string
@@ -204,18 +205,18 @@ namespace console {
                                              will return the associated Client instance reference.
                                              \throws std::bad_cast if \a os is not associated with a
                                                  Client instance. */
-        static unsigned getWidth(std::ostream & os, unsigned defaultWidth = 0, 
+        static unsigned getWidth(std::ostream & os, unsigned defaultWidth = 0,
                                  unsigned minWidth = 0);
                                         ///< Get width of client console if possible
                                         /**< If possible, the width of the client console attached
                                              to the stream \a os is returned. If this is not
                                              possible, the \a defaultValue will be used.
-                                             
+
                                              If the width obtained this way is smaller than \a
                                              minWidth, \a defaultValue will be returned instead. */
 
     protected:
-        
+
     private:
         Client(Server & server, ClientHandle handle);
 
@@ -223,10 +224,10 @@ namespace console {
         void setNoninteractive();
 
         size_t handleInput(std::string input, bool incremental = false);
-        virtual void v_write(senf::log::time_type timestamp, std::string const & stream, 
-                             std::string const & area, unsigned level, 
+        virtual void v_write(senf::log::time_type timestamp, std::string const & stream,
+                             std::string const & area, unsigned level,
                              std::string const & message);
-        
+
         Server & server_;
         ClientHandle handle_;
         scheduler::FdEvent readevent_;
@@ -242,15 +243,15 @@ namespace console {
         friend class detail::ClientReader;
         friend class detail::NonblockingSocketSink;
 
-        class SysBacktrace 
+        class SysBacktrace
         {
             SysBacktrace();
             static void  backtrace(std::ostream & os);
             static SysBacktrace instance_;
         };
-        
+
     };
-        
+
     /** \brief Output Console Client instance as it's string representation
         \related Client
      */
@@ -263,7 +264,7 @@ namespace console {
 
 }}
 
-///////////////////////////////hh.e////////////////////////////////////////
+//-/////////////////////////////////////////////////////////////////////////////////////////////////
 #include "Server.cci"
 //#include "Server.ct"
 //#include "Server.cti"