// Custom includes
#include <boost/iostreams/concepts.hpp>
#include <boost/iostreams/stream.hpp>
+#include <set>
///////////////////////////////ih.p////////////////////////////////////////
namespace detail {
+ class ServerManager
+ : public senf::singleton<ServerManager>
+ {
+ public:
+ typedef boost::intrusive_ptr<Server> ptr;
+
+ protected:
+
+ private:
+ static void add(ptr server);
+ static void remove(ptr server);
+
+ typedef std::set<ptr> Servers;
+ Servers servers_;
+
+ friend class senf::console::Server;
+ };
+
/** \brief Internal: Nonblocking boost::iostreams::sink
The sink discards data if the output socket would.
+
+ \fixme Don't throw exceptions ... set stream error indicator (if at all)
*/
class NonblockingSocketSink
: public boost::iostreams::sink
NonblockingSocketSink(Client & client);
std::streamsize write(const char * s, std::streamsize n);
+
+ Client & client() const;
private:
Client & client_;
virtual ~ClientReader() = 0;
+ // Called by subclasses to get information from the Client
+
Client & client() const;
std::string promptString() const;
ClientHandle handle() const;
std::ostream & stream() const;
+
+ // Called by subclasses to perform actions in the Client
+
void stopClient();
-
- void handleInput(std::string const & input) const;
+ std::string::size_type handleInput(std::string const & input, bool incremental=false) const;
+
+ // Called by the Client
void disablePrompt();
void enablePrompt();
unsigned promptLen_;
bool promptActive_;
};
+
+ /** \brief Internal: Primitive ClientReader implementation
+
+ This implementation uses the cooked telnet mode to read lines from the console. It does not
+ support explicit line editing or any other advanced features.
+ */
+ class NoninteractiveClientReader
+ : public ClientReader
+ {
+ public:
+ NoninteractiveClientReader(Client & client);
+
+ private:
+ virtual void v_disablePrompt();
+ virtual void v_enablePrompt();
+ virtual void v_translate(std::string & data);
+
+ void newData(senf::Scheduler::EventId event);
+
+ SchedulerBinding binding_;
+ std::string buffer_;
+ };
}}}