1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
|
/** \file ServerCatchcopy.h
\brief Define the server of catchcopy
\author alpha_one_x86
\licence GPL3, see the file COPYING */
#ifndef SERVERCATCHCOPY_H
#define SERVERCATCHCOPY_H
#include <QObject>
#include <QLocalSocket>
#include <QLocalServer>
#include <QStringList>
#include <QString>
#include <QByteArray>
#include <QTimer>
/// \brief Define the server of catchcopy
class ServerCatchcopy : public QObject
{
Q_OBJECT
public:
ServerCatchcopy();
~ServerCatchcopy();
/// \brief return if is listening
bool isListening() const;
/// \brief try listen
bool listen();
/// \brief try close the server
void close();
/// \brief get the error string on the QLocalServer
const QString errorStringServer() const;
/// \brief get the general error string
const QString errorString() const;
/// \brief set the name of the server
void setName(const QString & name);
/// \brief get the name
QString getName() const;
/// \brief to get a client list
QStringList clientsList() const;
private:
QString pathSocket;
QString name;
QString error_string;
QLocalServer server;
quint32 idNextClient;
struct Client
{
quint32 id;
QLocalSocket *socket;
QByteArray data;
bool haveData;
quint32 dataSize;
bool firstProtocolReplied;
QList<quint32> queryNoReplied;
QTimer *detectTimeOut;
QString name;
};
QList<Client> clientList;
struct LinkGlobalToLocalClient
{
quint32 idClient;
quint32 orderId;
quint32 globalOrderId;
};
QList<LinkGlobalToLocalClient> LinkGlobalToLocalClientList;
enum inputReturnType{Ok,Replied,ExtensionWrong,WrongArgument,WrongArgumentListSize,UnknowOrder};
inputReturnType parseInputCurrentProtocol(const quint32 &client,const quint32 &orderId,const QStringList &returnList);
bool clientIdFound(const quint32 &id) const;
quint32 nextOrderId;
QList<quint32> orderList;
quint32 incrementOrderId();
void emitNewCopyWithoutDestination(const quint32 &client,const quint32 &orderId,const QStringList &sources);
void emitNewCopy(const quint32 &client,const quint32 &orderId,const QStringList &sources,const QString &destination);
void emitNewMoveWithoutDestination(const quint32 &client,const quint32 &orderId,const QStringList &sources);
void emitNewMove(const quint32 &client,const quint32 &orderId,const QStringList &sources,const QString &destination);
bool checkDataIntegrity(const QByteArray &data);
protected:
void parseInput(const quint32 &client,const quint32 &orderId,const QStringList &returnList);
private slots:
void newConnection();
void connectionError(const QLocalSocket::LocalSocketError &error);
void disconnected();
void readyRead();
void checkTimeOut();
public slots:
/// \brief disconnect one client
void disconnectClient(const quint32 &id);
/// \brief reply to a client with QStringList
void reply(const quint32 &client,const quint32 &orderId,const quint32 &returnCode,const QStringList &returnList);
/// \brief reply to a client
void reply(const quint32 &client,const quint32 &orderId,const quint32 &returnCode,const QString &returnString);
//reply
/// \brief send if the protocol is supported
void protocolSupported(const quint32 &client,const quint32 &orderId,const bool &value);
/// \brief send incorrect arguement list size
void incorrectArgumentListSize(const quint32 &client,const quint32 &orderId);
/// \brief send incorrect arguement
void incorrectArgument(const quint32 &client,const quint32 &orderId);
/// \brief the client is registred
void clientRegistered(const quint32 &client,const quint32 &orderId);
/// \brief send the server name
void serverName(const quint32 &client,const quint32 &orderId,const QString &name);
/// \brief send the copy is finished
void copyFinished(const quint32 &client,const quint32 &orderId,const bool &withError);
/// \brief send the copy is canceled
void copyCanceled(const quint32 &client,const quint32 &orderId);
/// \brief send the copy is finished by global is order
void copyFinished(const quint32 &globalOrderId,const bool &withError);
/// \brief send copy cancel by global is order
void copyCanceled(const quint32 &globalOrderId);
/// \brief send the unknow order
void unknowOrder(const quint32 &client,const quint32 &orderId);
signals:
/// \brief send connected client
void connectedClient(const quint32 &id);
/// \brief send disconnect client
void disconnectedClient(const quint32 &id);
/// \brief have new query
void newQuery(const quint32 &client,const quint32 &orderId,const QStringList &returnList);
/// \brief have new error
void error(const QString &error);
void communicationError(const QString &error);
//query
/// \brief ask the protocol compatility
void askProtocolCompatibility(const quint32 &client,const quint32 &orderId,const QString &version);
/// \brief ask protocol extension
void askProtocolExtension(const quint32 &client,const quint32 &orderId,const QString &extension);
/// \brief ask protocol extension with version
void askProtocolExtension(const quint32 &client,const quint32 &orderId,const QString &extension,const QString &version);
/// \brief send the client name, without query id
void clientName(const quint32 &client,const QString &name);
/// \brief send the client have ask the server name
void askServerName(const quint32 &client,const quint32 &orderId);
/// \brief copy is send, by globalOrderId, without destination
void newCopyWithoutDestination(const quint32 &globalOrderId,const QStringList &sources);
/// \brief copy is send, by globalOrderId, with destination
void newCopy(const quint32 &globalOrderId,const QStringList &sources,const QString &destination);
/// \brief move is send, by globalOrderId, without destination
void newMoveWithoutDestination(const quint32 &globalOrderId,const QStringList &sources);
/// \brief move is send, by globalOrderId, with destination
void newMove(const quint32 &globalOrderId,const QStringList &sources,const QString &destination);
};
#endif // SERVERCATCHCOPY_H
|