mirror of
https://projects.vdr-developer.org/git/vdr-plugin-streamdev.git
synced 2023-10-10 19:16:51 +02:00
95 lines
3.0 KiB
C++
95 lines
3.0 KiB
C++
/*
|
|
* $Id: connection.h,v 1.4 2007/04/02 10:32:34 schmirl 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);
|
|
|
|
/* Is polled regularely by the server. Returns true if the connection
|
|
needs to be terminated. */
|
|
virtual bool Abort(void) const = 0;
|
|
|
|
/* 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
|