WriteablePolicy,
ConnectedCommunicationPolicy>::policy > Handle;
- NonblockingSocketSink(Handle handle);
+ NonblockingSocketSink(Client & client);
std::streamsize write(const char * s, std::streamsize n);
+
+ Client & client() const;
private:
- Handle handle_;
+ Client & client_;
};
typedef boost::iostreams::stream<NonblockingSocketSink> NonblockingSocketOStream;
{
public:
typedef ServerHandle::ClientSocketHandle ClientHandle;
- typedef NonblockingSocketOStream OutputStream;
virtual ~ClientReader() = 0;
+ // Called by subclasses to get information from the Client
+
Client & client() const;
std::string promptString() const;
ClientHandle handle() const;
- OutputStream & stream() 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();
+ void translate(std::string & data);
protected:
ClientReader(Client & client);
private:
virtual void v_disablePrompt() = 0;
virtual void v_enablePrompt() = 0;
+ virtual void v_translate(std::string & data) = 0;
Client & client_;
};
private:
virtual void v_disablePrompt();
virtual void v_enablePrompt();
+ virtual void v_translate(std::string & data);
void clientData(senf::ReadHelper<ClientHandle>::ptr helper);
void showPrompt();
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_;
+ };
}}}