summaryrefslogtreecommitdiff
path: root/server/connection.h
diff options
context:
space:
mode:
Diffstat (limited to 'server/connection.h')
-rw-r--r--server/connection.h90
1 files changed, 90 insertions, 0 deletions
diff --git a/server/connection.h b/server/connection.h
new file mode 100644
index 0000000..f68f84a
--- /dev/null
+++ b/server/connection.h
@@ -0,0 +1,90 @@
+/*
+ * $Id: connection.h,v 1.3 2005/05/09 20:22:29 lordjaxom Exp $
+ */
+
+#ifndef VDR_STREAMDEV_SERVER_CONNECTION_H
+#define VDR_STREAMDEV_SERVER_CONNECTION_H
+
+#include "tools/socket.h"
+#include "common.h"
+
+class cChannel;
+class cDevice;
+
+/* Basic capabilities of a straight text-based protocol, most functions
+ virtual to support more complicated protocols */
+
+class cServerConnection: public cListObject, public cTBSocket
+{
+private:
+ const char *m_Protocol;
+ bool m_DeferClose;
+ bool m_Pending;
+
+ char m_ReadBuffer[MAXPARSEBUFFER];
+ uint m_ReadBytes;
+
+ char m_WriteBuffer[MAXPARSEBUFFER];
+ uint m_WriteBytes;
+ uint m_WriteIndex;
+
+protected:
+ /* Will be called when a command terminated by a newline has been
+ received */
+ virtual bool Command(char *Cmd) = 0;
+
+ /* Will put Message into the response queue, which will be sent in the next
+ server cycle. Note that Message will be line-terminated by Respond.
+ Only one line at a time may be sent. If there are lines to follow, set
+ Last to false. Command(NULL) will be called in the next cycle, so you can
+ post the next line. */
+ virtual bool Respond(const char *Message, bool Last = true, ...)
+ __attribute__ ((format (printf, 2, 4)));
+
+public:
+ /* If you derive, specify a short string such as HTTP for Protocol, which
+ will be displayed in error messages */
+ cServerConnection(const char *Protocol);
+ virtual ~cServerConnection();
+
+ /* Gets called if the client has been accepted by the core */
+ virtual void Welcome(void) { }
+
+ /* Gets called if the client has been rejected by the core */
+ virtual void Reject(void) { DeferClose(); }
+
+ /* Get the client socket's file number */
+ virtual int Socket(void) const { return (int)*this; }
+
+ /* Determine if there is data to send or any command pending */
+ virtual bool HasData(void) const;
+
+ /* Gets called by server when the socket can accept more data. Writes
+ the buffer filled up by Respond(). Calls Command(NULL) if there is a
+ command pending. Returns false in case of an error */
+ virtual bool Write(void);
+
+ /* Gets called by server when there is incoming data to read. Calls
+ Command() for each line. Returns false in case of an error, or if
+ the connection shall be closed and removed by the server */
+ virtual bool Read(void);
+
+ /* Will make the socket close after sending all queued output data */
+ void DeferClose(void) { m_DeferClose = true; }
+
+ /* Will retrieve an unused device for transmitting data. Use the returned
+ cDevice in a following call to StartTransfer */
+ cDevice *GetDevice(const cChannel *Channel, int Priority);
+
+ virtual void Flushed(void) {}
+
+ virtual void Detach(void) = 0;
+ virtual void Attach(void) = 0;
+};
+
+inline bool cServerConnection::HasData(void) const
+{
+ return m_WriteBytes > 0 || m_Pending || m_DeferClose;
+}
+
+#endif // VDR_STREAMDEV_SERVER_CONNECTION_H