Remoto - VFS: VFS_tcp_server Class Reference
Remoto - VFS

Open a listening TCP port for other clients to connect to. More...

#include <VFS_tcp_server.h>

Inheritance diagram for VFS_tcp_server:
VFS_node VFS_httpd VFS_tcp_export VFS_httpd_browser

Public Slots

virtual void clientError (QAbstractSocket::SocketError error)
 A socket error has occurred. More...
 
virtual void clientMessage (QByteArray message)
 A message has been received. More...
 
virtual bool listen ()
 Open the server socket and listen for new connections. More...
 
- Public Slots inherited from VFS_node
virtual void applyDiff (VFS_request *r)
 Apply a diff received via subscription. More...
 
virtual void executeRequest (VFS_request *t)
 Based on the VFS_request::requestType, execute the function associated with an operation. More...
 
void notifySubscribers (VFS_node *origin, VFS_request *t)
 Propagate a diff to subscribers. More...
 
virtual void receiveResponse (VFS_request *t)
 Once a VFS_request has been completed, a response will be issued back to its _origin. More...
 
void remove (bool andDelete)
 Remove a child node. More...
 
virtual void remove (VFS_node *node=nullptr, QString *name=nullptr, QString user="server")
 Remove a child node from this node. More...
 
virtual void subtreeRequest (VFS_request *t)
 find() the target of a VFS_request, and execute the request More...
 
virtual void unsubscribeAll (VFS_node *n)
 Remove all references to a subscriber from this node. More...
 

Public Member Functions

 VFS_tcp_server (quint16 port=0, QHostAddress address=QHostAddress::Any, bool ssl=false, QString sslCertPath="", QString sslKeyPath="")
 Create a VFS_tcp_server node. More...
 
virtual ~VFS_tcp_server ()
 
virtual bool isContainer ()
 A server is a container. More...
 
virtual QString reportDetails ()
 Report details of this node. More...
 
- Public Member Functions inherited from VFS_node
Q_INVOKABLE VFS_node ()
 The VFS_node constructor will add its instance to the VFS_node::__allNodes global node registry, observing thread safety rules. More...
 
virtual ~VFS_node ()
 VFS_node destructor. More...
 
virtual VFS_nodeappend (QString name, VFS_node *node, bool containerCheck=true, QString user="server")
 Append a VFS_node as a child of this node. More...
 
QString className ()
 Return the class name of a node. More...
 
virtual VFS_requestcreateRequest (VFS_request::requestType type, QString path, QString user="unknown", QJsonDocument data=QJsonDocument(), QJsonObject metadata=QJsonObject(), bool dontDelete=false)
 Create a new VFS_request with this object as _origin. More...
 
VFS_nodefind (QString path)
 Find a node by string path. More...
 
virtual VFS_nodefind (VFS_request *r)
 Find a node using a VFS_request. More...
 
VFS_nodefindChildWithName (QString name)
 Check if a child with a given name exists. More...
 
virtual VFS_nodemount ()
 Mount this node. More...
 
QString uniqueChildName (QString name)
 Generate a unique child name. More...
 
virtual VFS_nodeunmount ()
 Unmount this node. More...
 
virtual bool validChildName (QString name)
 Check if a node name is valid. More...
 

Protected Slots

virtual void closeConnection ()
 Close a socket connection. More...
 
virtual void createNewConnection ()
 The server has received a new connection request. More...
 

Protected Member Functions

virtual VFS_tcp_clientnewClient (QTcpSocket *socket, bool ssl=false, QSslConfiguration sslConfiguration=QSslConfiguration())
 Create a new VFS_tcp_client with the new socket. More...
 
virtual void newConnection (VFS_tcp_client *c)
 Attach the clientMessage handler. More...
 
- Protected Member Functions inherited from VFS_node
virtual void aclDefaults (VFS_request *r)
 Return default values and features associated wth this node. More...
 
void addACLDefault (QJsonObject &acl, bool value, QString description="")
 Add a default value to the acl object. More...
 
void addACLFeature (QJsonObject &acl, QString feature, bool value, QString description="")
 Add a feature to the acl object. More...
 
void addACLFeatureGroup (QJsonObject &acl, QString feature, QString group, bool value)
 Add a feature group to the acl object. More...
 
void addACLFeatureUser (QJsonObject &acl, QString feature, QString user, bool value)
 Add a feature user to the acl object. More...
 
void addACLGroup (QJsonObject &acl, QString group, bool value)
 Add a group to the acl object. More...
 
void addACLUser (QJsonObject &acl, QString user, bool value)
 Add a user to the acl object. More...
 
virtual QByteArray icon ()
 Fetch the icon for a node. More...
 
virtual void issueRequest (VFS_node *target, VFS_request *t)
 Issue a VFS_request to its target. More...
 
virtual void issueRequest (VFS_request *t)
 A convenience function. More...
 
virtual void issueResponse (VFS_request *t)
 Once a request has been completed, issue a response. More...
 
virtual void ls (VFS_request *r)
 List the contents of this node. More...
 
virtual void releaseLock (VFS_request *r)
 Release a lock on this node. More...
 
virtual void report (VFS_request *r)
 Report debugging information about the current state of this node. More...
 
virtual void requestLock (VFS_request *r)
 Request a lock on this node. More...
 
virtual void rm (VFS_request *r)
 Remove a child entry from a node, or the node itself. More...
 
virtual void submit (VFS_request *r)
 Submit a diff to a node. More...
 
virtual void subscribe (VFS_request *r)
 Add an entry to this node's _subscription list. More...
 
virtual void unsubscribe (VFS_request *r)
 Remove an entry from this node's _subscription list. More...
 
virtual void unsubscribePath (QString path)
 Unsubscribe all references to a subpath. More...
 
virtual void write (VFS_request *r)
 Write data to this node. More...
 

Protected Attributes

QHostAddress _listenAddress
 Address(es) allowed to connect, or 0.0.0.0 if all are allowed. More...
 
quint16 _port
 TCP port to listen on, or 0 to find an available one. More...
 
VFSQTcpServer _socket
 TCP socket used for connections. More...
 
bool _ssl
 Use ssl? More...
 
QString _sslCertPath
 ssl cert file path More...
 
QSslConfiguration _sslConfiguration
 ssl config built up from below paths More...
 
QString _sslKeyPath
 ssl key file path More...
 
- Protected Attributes inherited from VFS_node
VFS_children _children
 This node's children. More...
 
QMutex _lock
 A recursive mutex that is local to this node. More...
 
VFS_subscriptionType _subscribers
 This node's subscribers. These subscribers will receive diff notifications. More...
 

Private Member Functions

virtual void metadata (VFS_request *r)
 Fetch the metadata for this node. More...
 
virtual void read (VFS_request *r)
 Read the state of this node, which is the result of ls(). More...
 

Additional Inherited Members

- Signals inherited from VFS_node
void diff (VFS_node *origin, VFS_request *t)
 Emit a diff, which will trigger notifySubscribers() for a mounted node. More...
 
void finished (bool andDelete=false)
 Emitted if a thread fails to create its node, or a node is rm()'d, or any other reason a node has completed its lifecycle. It is deleted if andDelete==true. More...
 
void mounted ()
 Emitted when a node is mount()ed. More...
 
void unmounted (VFS_node *self)
 Emitted when a node is unmount()ed. More...
 
- Static Public Member Functions inherited from VFS_node
static bool __isNode (VFS_node *)
 Check to see if a node is in the global registry. More...
 
static QString code (QString nodename, QString libname, QString &error)
 Fetch code or any other resource from a node. More...
 

Detailed Description

Open a listening TCP port for other clients to connect to.

This class manages client connections and appends new connections as children of itself. Diffs are emitted to subscribers when clients connect and disconnect.

Subclasses must be used to make the functionality more specific; this class should never be instantiated without a subclass implementation.

Most notably, the newClient() function should be overridden, which will return a VFS_tcp_client subclass that provides useful functionality, as the base class does nothing.

Note
If the _socket is set to listen with _port 0, the operating system will choose a port for this connection. The log will report the actual port being used.

If the node was created using port 0, a first available port will be selected. If the actual port is needed by some other process, a read() on this node will report the port that was selected.

Todo:
Add SSL options

Definition at line 29 of file VFS_tcp_server.h.

Constructor & Destructor Documentation

◆ VFS_tcp_server()

VFS_tcp_server::VFS_tcp_server ( quint16  port = 0,
QHostAddress  address = QHostAddress::Any,
bool  ssl = false,
QString  sslCertPath = "",
QString  sslKeyPath = "" 
)
explicit

Create a VFS_tcp_server node.

Parameters
portThe port to listen on
addressThe allowable addresses to connect from.
sslIs it in ssl mode?
sslCertPathThe path to the cert file
sslKeyPathThe path to the key file

This creates the node and connects to the VFS::initialized event.

Definition at line 145 of file VFS_tcp_server.cpp.

◆ ~VFS_tcp_server()

VFS_tcp_server::~VFS_tcp_server ( )
virtual

Definition at line 158 of file VFS_tcp_server.cpp.

Member Function Documentation

◆ clientError

void VFS_tcp_server::clientError ( QAbstractSocket::SocketError  error)
virtualslot

A socket error has occurred.

Log it as an error/warning, but do nothing.

Parameters
errorThe error

Definition at line 394 of file VFS_tcp_server.cpp.

◆ clientMessage

void VFS_tcp_server::clientMessage ( QByteArray  message)
virtualslot

A message has been received.

Parameters
messageThe message

Subclasses will want to implement a protocol here

Definition at line 372 of file VFS_tcp_server.cpp.

◆ closeConnection

void VFS_tcp_server::closeConnection ( )
protectedvirtualslot

Close a socket connection.

This will also remove it as a child from this VFS_tcp_server node.

Definition at line 344 of file VFS_tcp_server.cpp.

◆ createNewConnection

void VFS_tcp_server::createNewConnection ( )
protectedvirtualslot

The server has received a new connection request.

Call newCilent() with the new socket, and attach error and connection handlers.

Definition at line 265 of file VFS_tcp_server.cpp.

◆ isContainer()

bool VFS_tcp_server::isContainer ( )
virtual

A server is a container.

Returns
true

Connections will be placed as children of this node.

Reimplemented from VFS_node.

Reimplemented in VFS_httpd.

Definition at line 170 of file VFS_tcp_server.cpp.

◆ listen

bool VFS_tcp_server::listen ( )
virtualslot

Open the server socket and listen for new connections.

Returns
The open state of the socket.

This is triggered from VFS::initialized().

If the node was created using port 0, a first available port was selected. If the actual port is needed by some other process, a metadata() on this node will provide the actual port that was selected.

Definition at line 186 of file VFS_tcp_server.cpp.

◆ metadata()

void VFS_tcp_server::metadata ( VFS_request r)
privatevirtual

Fetch the metadata for this node.

Parameters
rThe VFS_request object

This will also include the address and port that this node is listening on.

If the node was created using port 0, a first available port was selected. If the actual port is needed by some other process, the metadata() from this node will provide the actual port and address that was selected.

Reimplemented from VFS_node.

Definition at line 425 of file VFS_tcp_server.cpp.

◆ newClient()

VFS_tcp_client * VFS_tcp_server::newClient ( QTcpSocket *  socket,
bool  ssl = false,
QSslConfiguration  sslConfiguration = QSslConfiguration() 
)
protectedvirtual

Create a new VFS_tcp_client with the new socket.

Parameters
socketThe new socket, created by the server socket
sslWhether or not to use ssl
sslConfigurationThe ssl configuration (probably coming from the server)
Returns
The new VFS_tcp_client

This is for subclasses to provide their own subclass instance of a VFS_tcp_client

Reimplemented in VFS_tcp_export.

Definition at line 332 of file VFS_tcp_server.cpp.

◆ newConnection()

void VFS_tcp_server::newConnection ( VFS_tcp_client client)
protectedvirtual

Attach the clientMessage handler.

Parameters
clientThe new VFS_tcp_cient
Todo:
This method should perform some form of authorization on the new client

Definition at line 305 of file VFS_tcp_server.cpp.

◆ read()

void VFS_tcp_server::read ( VFS_request r)
privatevirtual

Read the state of this node, which is the result of ls().

Parameters
rThe VFS_request object

Reimplemented from VFS_node.

Definition at line 408 of file VFS_tcp_server.cpp.

◆ reportDetails()

QString VFS_tcp_server::reportDetails ( )
virtual

Report details of this node.

This will include the socket address and port, as well as the open state of the socket.

Reimplemented from VFS_node.

Reimplemented in VFS_tcp_export.

Definition at line 254 of file VFS_tcp_server.cpp.

Member Data Documentation

◆ _listenAddress

QHostAddress VFS_tcp_server::_listenAddress
protected

Address(es) allowed to connect, or 0.0.0.0 if all are allowed.

Definition at line 41 of file VFS_tcp_server.h.

◆ _port

quint16 VFS_tcp_server::_port
protected

TCP port to listen on, or 0 to find an available one.

Definition at line 42 of file VFS_tcp_server.h.

◆ _socket

VFSQTcpServer VFS_tcp_server::_socket
protected

TCP socket used for connections.

Definition at line 47 of file VFS_tcp_server.h.

◆ _ssl

bool VFS_tcp_server::_ssl
protected

Use ssl?

Definition at line 43 of file VFS_tcp_server.h.

◆ _sslCertPath

QString VFS_tcp_server::_sslCertPath
protected

ssl cert file path

Definition at line 45 of file VFS_tcp_server.h.

◆ _sslConfiguration

QSslConfiguration VFS_tcp_server::_sslConfiguration
protected

ssl config built up from below paths

Definition at line 44 of file VFS_tcp_server.h.

◆ _sslKeyPath

QString VFS_tcp_server::_sslKeyPath
protected

ssl key file path

Definition at line 46 of file VFS_tcp_server.h.


The documentation for this class was generated from the following files: