PiScan/piScan_backend/src/server/ServerManager.h

121 lines
2.5 KiB
C++

/*
* ServerManager.h
*
* Created on: Oct 22, 2018
* Author: ezra
*/
#ifndef SERVER_SERVERMANAGER_H_
#define SERVER_SERVERMANAGER_H_
#include "messages.h"
class Connection;
class ClientRequest;
class ServerInterface;
class ServerManager;
class Connection : public MessageReceiver {
public:
enum ConnectionLevel {
RECEIVE_ONLY,
VIEWER,
FULL_CONTROL,
};
enum AudioReceive {
AUDIO_NONE,
AUDIO_RECEIVE,
};
Connection(ConnectionLevel lvl, AudioReceive aud);
virtual void giveMessage(Message message) = 0;
void disconnect();
private:
friend class ServerManager;
int _handle;
ConnectionLevel _level;
AudioReceive _audio;
ServerInterface _serverManager;
void _notifyDisconnected();
};
class ClientRequest : public Message {
public:
enum {
REQUEST,
NOTIFY_DISCONNECTED,
};
enum RequestType {
SYSTEM_FUNCTION,
SCANNER_FUNCTION,
DATABASE_RETRIEVE,
DATABASE_MODIFY,
CONFIG_RETRIEVE,
CONFIG_MODIFY,
};
ClientRequest(Connection client, unsigned char dst);
private:
static const Connection::ConnectionLevel permissionMap = {
[SYSTEM_FUNCTION] = Connection::ConnectionLevel::FULL_CONTROL,
[SCANNER_FUNCTION] = Connection::ConnectionLevel::FULL_CONTROL,
[DATABASE_RETRIEVE] = Connection::ConnectionLevel::VIEWER,
[DATABASE_MODIFY] = Connection::ConnectionLevel::FULL_CONTROL,
[CONFIG_RETRIEVE] = Connection::ConnectionLevel::VIEWER,
[CONFIG_MODIFY] = Connection::ConnectionLevel::FULL_CONTROL,
};
friend class ServerManager;
Connection src;
RequestType requestType;
void (*_callback)(void*);
};
class ServerInterface {
public:
ServerInterface() = 0;
virtual ~ServerInterface();
enum RequestResponse {
RQ_ACCEPTED,
RQ_DENIED,
RQ_INSUFFICIENT_PERMISSION,
RQ_INVALID_HANDLE,
};
virtual RequestResponse requestConnection(Connection::Connection client) = 0;
virtual RequestResponse giveRequest(ClientRequest request) = 0;
};
class ServerManager : public MessageReceiver, ServerInterface {
public:
ServerManager(MessageReceiver central);
void start();
void allowConnections();
void disconnectClients();
void giveMessage(Message message);
protected:
private:
moodycamel::ConcurrentQueue _queue;
int _activeConnections;
Connection _connections[];
MessageReceiver _centralQueue;
void _queueThreadFunc(void);
void _handleMessage(Message message);
void _addConnection(Connection::Connection client);
RequestResponse requestConnection(Connection::Connection client);
RequestResponse giveRequest(ClientRequest request);
};
#endif /* SERVER_SERVERMANAGER_H_ */