Grosses corrections de bugs sur le protocole réseau.
Définition des vraies erreurs du protocole (et non pas des programmes).
Showing
9 changed files
with
157 additions
and
25 deletions
doc/network/manual.tex
0 → 100644
1 | +\documentclass[a4paper,12pt]{article} | ||
2 | +\usepackage[margin=2cm]{geometry} | ||
3 | +\usepackage{times} | ||
4 | + | ||
5 | +\title{ARCS Network module protocol specification} | ||
6 | +\author{Jean-Yves Didier} | ||
7 | + | ||
8 | + | ||
9 | +\begin{document} | ||
10 | + | ||
11 | +\maketitle | ||
12 | + | ||
13 | +\hspace{0.5cm} | ||
14 | +\hrule | ||
15 | +\hspace{0.5cm} | ||
16 | + | ||
17 | +\tabelofcontents | ||
18 | + | ||
19 | +\newpage | ||
20 | + | ||
21 | +The ARCS network module intends to ... | ||
22 | + | ||
23 | +\section{Definitions} | ||
24 | + | ||
25 | +\paragraph{Server} | ||
26 | + | ||
27 | +\paragraph{Client} | ||
28 | + | ||
29 | +\paragraph{Master} | ||
30 | + | ||
31 | +\paragraph{Slave} | ||
32 | + | ||
33 | +\section{Use cases} | ||
34 | + | ||
35 | +\section{Frame specifications} | ||
36 | + | ||
37 | +\section{Reference implementation} | ||
38 | + | ||
39 | + | ||
40 | + | ||
41 | + | ||
42 | +\end{document} | ||
... | \ No newline at end of file | ... | \ No newline at end of file |
... | @@ -181,18 +181,25 @@ void ARCSNetworkComponent::requestSlotConnect(ARCSNetworkProxySlot* anps) //chec | ... | @@ -181,18 +181,25 @@ void ARCSNetworkComponent::requestSlotConnect(ARCSNetworkProxySlot* anps) //chec |
181 | if (response ) | 181 | if (response ) |
182 | { | 182 | { |
183 | if (response->getType() != ARCSNetworkFrame::SLOT_RESPONSE) | 183 | if (response->getType() != ARCSNetworkFrame::SLOT_RESPONSE) |
184 | - //! \todo insérer traitement approprié | 184 | + { |
185 | - ARCS::Network::logError(486); | 185 | + //! \todo polish this thing |
186 | + if (response->getType() == ARCSNetworkFrame::ERR_RESPONSE) | ||
187 | + ARCS::Network::logError( | ||
188 | + ((ARCSNetworkErrResponse*)response->getData())->getErrId(), | ||
189 | + QString("for '") + this->getProperty("id").toString()+ | ||
190 | + "." + anps->getSlot() +"' (slot request)." | ||
191 | + ); | ||
192 | + else | ||
193 | + ARCS::Network::logError(486); | ||
194 | + } | ||
186 | else | 195 | else |
187 | { | 196 | { |
188 | anps->setSlotId(((ARCSNetworkSlotResponse*)response->getData())->getId()); | 197 | anps->setSlotId(((ARCSNetworkSlotResponse*)response->getData())->getId()); |
189 | } | 198 | } |
199 | + delete response; | ||
190 | } | 200 | } |
191 | else | 201 | else |
192 | ARCS::Network::logError(488,socket->errorString()); | 202 | ARCS::Network::logError(488,socket->errorString()); |
193 | - | ||
194 | - if (response) | ||
195 | - delete response; | ||
196 | } | 203 | } |
197 | 204 | ||
198 | 205 | ||
... | @@ -221,10 +228,19 @@ void ARCSNetworkComponent::requestSignalConnect(ARCSNetworkProxySignal* anps) // | ... | @@ -221,10 +228,19 @@ void ARCSNetworkComponent::requestSignalConnect(ARCSNetworkProxySignal* anps) // |
221 | } | 228 | } |
222 | 229 | ||
223 | ARCSNetworkFrame* response = ARCSNetworkFrame::readFrame(socket.data()); | 230 | ARCSNetworkFrame* response = ARCSNetworkFrame::readFrame(socket.data()); |
224 | - //! \todo insert something here in case of an error | ||
225 | if (response) | 231 | if (response) |
232 | + { | ||
233 | + if (response->getType() == ARCSNetworkFrame::ERR_RESPONSE) | ||
234 | + { | ||
235 | + ARCS::Network::logError( | ||
236 | + ((ARCSNetworkErrResponse*)response->getData())->getErrId(), | ||
237 | + QString("for '") + this->getProperty("id").toString()+ | ||
238 | + "." + anps->getSignal() +"' (signal request)." | ||
239 | + ); | ||
240 | + } | ||
226 | delete response; | 241 | delete response; |
227 | - //! \todo work on response to signal_request | 242 | + } |
243 | + | ||
228 | } | 244 | } |
229 | 245 | ||
230 | void ARCSNetworkComponent::requestSignalDisconnect(ARCSNetworkProxySignal* anps) //check | 246 | void ARCSNetworkComponent::requestSignalDisconnect(ARCSNetworkProxySignal* anps) //check |
... | @@ -248,10 +264,18 @@ void ARCSNetworkComponent::requestSignalDisconnect(ARCSNetworkProxySignal* anps) | ... | @@ -248,10 +264,18 @@ void ARCSNetworkComponent::requestSignalDisconnect(ARCSNetworkProxySignal* anps) |
248 | } | 264 | } |
249 | 265 | ||
250 | ARCSNetworkFrame* response = ARCSNetworkFrame::readFrame(socket.data()); | 266 | ARCSNetworkFrame* response = ARCSNetworkFrame::readFrame(socket.data()); |
251 | - //! \todo insert something here in case of an error | ||
252 | if (response) | 267 | if (response) |
268 | + { | ||
269 | + if (response->getType() == ARCSNetworkFrame::ERR_RESPONSE) | ||
270 | + { | ||
271 | + ARCS::Network::logError( | ||
272 | + ((ARCSNetworkErrResponse*)response->getData())->getErrId(), | ||
273 | + QString("for '") + this->getProperty("id").toString()+ | ||
274 | + "." + anps->getSignal() +"' (signal disconnect)." | ||
275 | + ); | ||
276 | + } | ||
253 | delete response; | 277 | delete response; |
254 | - //! \todo work on response to signal_request | 278 | + } |
255 | socket->disconnectFromHost(); | 279 | socket->disconnectFromHost(); |
256 | } | 280 | } |
257 | 281 | ||
... | @@ -287,16 +311,27 @@ bool ARCSNetworkComponent::genuineConnect (QString sig, ARCSAbstractComponent *d | ... | @@ -287,16 +311,27 @@ bool ARCSNetworkComponent::genuineConnect (QString sig, ARCSAbstractComponent *d |
287 | return false; | 311 | return false; |
288 | } | 312 | } |
289 | ARCSNetworkFrame* response = ARCSNetworkFrame::readFrame(socket.data()); | 313 | ARCSNetworkFrame* response = ARCSNetworkFrame::readFrame(socket.data()); |
290 | - //! \todo insert something here in case of an error | ||
291 | - //! \todo consume response appropriately | ||
292 | if (response) | 314 | if (response) |
315 | + { | ||
316 | + if (response->getType() == ARCSNetworkFrame::ERR_RESPONSE) | ||
317 | + { | ||
318 | + ARCS::Network::logError( | ||
319 | + ((ARCSNetworkErrResponse*)response->getData())->getErrId(), | ||
320 | + QString("for '") + this->getProperty("id").toString()+ | ||
321 | + "." + sig +"' to '" + dst->getProperty("id").toString() + | ||
322 | + "." + slt +"' (connection request)." | ||
323 | + ); | ||
324 | + delete response; | ||
325 | + return false; | ||
326 | + } | ||
293 | delete response; | 327 | delete response; |
328 | + } | ||
294 | //! \todo work on response to signal_request | 329 | //! \todo work on response to signal_request |
295 | return true; | 330 | return true; |
296 | } | 331 | } |
297 | 332 | ||
298 | 333 | ||
299 | -bool ARCSNetworkComponent::genuineDisconnect(QString sig, ARCSAbstractComponent* , QString ) //check | 334 | +bool ARCSNetworkComponent::genuineDisconnect(QString sig, ARCSAbstractComponent* dst, QString slt) //check |
300 | { | 335 | { |
301 | QSharedPointer<QTcpSocket> socket(new QTcpSocket()); | 336 | QSharedPointer<QTcpSocket> socket(new QTcpSocket()); |
302 | socket->connectToHost(hostName, port); | 337 | socket->connectToHost(hostName, port); |
... | @@ -315,12 +350,23 @@ bool ARCSNetworkComponent::genuineDisconnect(QString sig, ARCSAbstractComponent* | ... | @@ -315,12 +350,23 @@ bool ARCSNetworkComponent::genuineDisconnect(QString sig, ARCSAbstractComponent* |
315 | ARCS::Network::logError(429,socket->errorString()); | 350 | ARCS::Network::logError(429,socket->errorString()); |
316 | return false; | 351 | return false; |
317 | } | 352 | } |
353 | + | ||
318 | ARCSNetworkFrame* response = ARCSNetworkFrame::readFrame(socket.data()); | 354 | ARCSNetworkFrame* response = ARCSNetworkFrame::readFrame(socket.data()); |
319 | - //! \todo insert something here in case of an error | ||
320 | - //! \todo consume response appropriately | ||
321 | if (response) | 355 | if (response) |
356 | + { | ||
357 | + if (response->getType() == ARCSNetworkFrame::ERR_RESPONSE) | ||
358 | + { | ||
359 | + ARCS::Network::logError( | ||
360 | + ((ARCSNetworkErrResponse*)response->getData())->getErrId(), | ||
361 | + QString("for '") + this->getProperty("id").toString()+ | ||
362 | + "." + sig +"' to '" + dst->getProperty("id").toString() + | ||
363 | + "." + slt +"' (disconnection request)." | ||
364 | + ); | ||
365 | + delete response; | ||
366 | + return false; | ||
367 | + } | ||
322 | delete response; | 368 | delete response; |
323 | - //! \todo work on response to signal_request | 369 | + } |
324 | return true; | 370 | return true; |
325 | } | 371 | } |
326 | 372 | ... | ... |
... | @@ -30,6 +30,20 @@ QHash<int,QString> ARCS::Network::initErrors() | ... | @@ -30,6 +30,20 @@ QHash<int,QString> ARCS::Network::initErrors() |
30 | { | 30 | { |
31 | QHash<int,QString> res; | 31 | QHash<int,QString> res; |
32 | 32 | ||
33 | + | ||
34 | + res[10]="Interface not bound %1"; | ||
35 | + res[11]="Could not connect to remote component %1"; | ||
36 | + res[12]="Could not send frame to remote component %1"; | ||
37 | + // the error response should be declined in several other problems. | ||
38 | + res[13]="Received an error response from remote component %1"; | ||
39 | + res[14]="Received null response from remote component %1"; | ||
40 | + res[15]="Error response from remote component : undefined slot %1"; | ||
41 | + res[16]="Error response from remote component : undefined signal %1"; | ||
42 | + res[17]="Error response from remote component : wrong id %1"; | ||
43 | + res[25]="Undefined slot %1"; | ||
44 | + res[26]="Undefined signal %1"; | ||
45 | + res[27]="Wrong id %1"; | ||
46 | + | ||
33 | /////////////////////////////////////////////////////////////////////////// | 47 | /////////////////////////////////////////////////////////////////////////// |
34 | // general errors | 48 | // general errors |
35 | res[600]="error while receiving frame: '%1'"; | 49 | res[600]="error while receiving frame: '%1'"; |
... | @@ -93,6 +107,8 @@ QHash<int,QString> ARCS::Network::initErrors() | ... | @@ -93,6 +107,8 @@ QHash<int,QString> ARCS::Network::initErrors() |
93 | res[585]="SLOT_RESPONSE: wrong slot name (%1)"; | 107 | res[585]="SLOT_RESPONSE: wrong slot name (%1)"; |
94 | res[589]="SLOT_RESPONSE: error while writing frame: '%1'"; | 108 | res[589]="SLOT_RESPONSE: error while writing frame: '%1'"; |
95 | 109 | ||
110 | + res[599]="ERR_RESPONSE: error while writing frame: '%1'"; | ||
111 | + | ||
96 | return res; | 112 | return res; |
97 | } | 113 | } |
98 | 114 | ... | ... |
... | @@ -58,7 +58,7 @@ int ARCSNetworkProxySignal::cleanSignalConnect(QString, QString, QString, QStrin | ... | @@ -58,7 +58,7 @@ int ARCSNetworkProxySignal::cleanSignalConnect(QString, QString, QString, QStrin |
58 | } | 58 | } |
59 | 59 | ||
60 | 60 | ||
61 | -void ARCSNetworkProxySignal::call(QStringList sl) | 61 | +bool ARCSNetworkProxySignal::call(QStringList sl) |
62 | { | 62 | { |
63 | //1 prparer les donnes | 63 | //1 prparer les donnes |
64 | int nbargs = sl.count(); | 64 | int nbargs = sl.count(); |
... | @@ -77,7 +77,7 @@ void ARCSNetworkProxySignal::call(QStringList sl) | ... | @@ -77,7 +77,7 @@ void ARCSNetworkProxySignal::call(QStringList sl) |
77 | if (nbargs > typeIds.count()) | 77 | if (nbargs > typeIds.count()) |
78 | { | 78 | { |
79 | std::cerr << "[Network] Argument and type count mismatch (" << nbargs << ", "<< typeIds.count() << ")" << std::endl; | 79 | std::cerr << "[Network] Argument and type count mismatch (" << nbargs << ", "<< typeIds.count() << ")" << std::endl; |
80 | - return ; | 80 | + return false ; |
81 | } | 81 | } |
82 | 82 | ||
83 | for (int i = 0; i < nbargs; i++) | 83 | for (int i = 0; i < nbargs; i++) |
... | @@ -89,4 +89,5 @@ void ARCSNetworkProxySignal::call(QStringList sl) | ... | @@ -89,4 +89,5 @@ void ARCSNetworkProxySignal::call(QStringList sl) |
89 | 89 | ||
90 | //2 lancer l'appel l'aide de qt_metacall() ou qt_activate() | 90 | //2 lancer l'appel l'aide de qt_metacall() ou qt_activate() |
91 | qt_metacall( QMetaObject::InvokeMetaMethod ,metaObject()->methodCount(),args); | 91 | qt_metacall( QMetaObject::InvokeMetaMethod ,metaObject()->methodCount(),args); |
92 | + return true; | ||
92 | } | 93 | } | ... | ... |
... | @@ -26,7 +26,7 @@ public: | ... | @@ -26,7 +26,7 @@ public: |
26 | virtual int cleanSignalConnect(QString, QString, QString, QString); | 26 | virtual int cleanSignalConnect(QString, QString, QString, QString); |
27 | 27 | ||
28 | void setSignal(QString s); | 28 | void setSignal(QString s); |
29 | - void call(QStringList sl); | 29 | + bool call(QStringList sl); |
30 | QString getSignal() { return signalName; } | 30 | QString getSignal() { return signalName; } |
31 | void setId(int i) { id = i; } | 31 | void setId(int i) { id = i; } |
32 | int getId() { return id; } | 32 | int getId() { return id; } | ... | ... |
... | @@ -2,6 +2,7 @@ | ... | @@ -2,6 +2,7 @@ |
2 | #include "arcsnetworkframes.h" | 2 | #include "arcsnetworkframes.h" |
3 | #include "arcsnetworkserver.h" | 3 | #include "arcsnetworkserver.h" |
4 | #include "arcsnetworkcomponent.h" | 4 | #include "arcsnetworkcomponent.h" |
5 | +#include <arcs/arcsapplicationcomponent.h> | ||
5 | #include <arcs/arcsfactory.h> | 6 | #include <arcs/arcsfactory.h> |
6 | #include <QTcpSocket> | 7 | #include <QTcpSocket> |
7 | #include <QSharedPointer> | 8 | #include <QSharedPointer> |
... | @@ -60,11 +61,18 @@ int ARCSNetworkProxySlot::qt_metacall(QMetaObject::Call call,int id, void** argu | ... | @@ -60,11 +61,18 @@ int ARCSNetworkProxySlot::qt_metacall(QMetaObject::Call call,int id, void** argu |
60 | } | 61 | } |
61 | 62 | ||
62 | ARCSNetworkFrame* response = ARCSNetworkFrame::readFrame(socket.data()); | 63 | ARCSNetworkFrame* response = ARCSNetworkFrame::readFrame(socket.data()); |
63 | - | ||
64 | - //! \todo handle response appropriately | ||
65 | - // traitement de response -> Non c'est juste pour attendre de manire bloquante ! | ||
66 | if (response) | 64 | if (response) |
65 | + { | ||
66 | + if (response->getType() == ARCSNetworkFrame::ERR_RESPONSE) | ||
67 | + { | ||
68 | + ARCS::Network::logError( | ||
69 | + ((ARCSNetworkErrResponse*)response->getData())->getErrId(), | ||
70 | + QString("for slot id '") + slotId +"' (call request)." | ||
71 | + ); | ||
72 | + } | ||
67 | delete response; | 73 | delete response; |
74 | + } | ||
75 | + | ||
68 | return -1; | 76 | return -1; |
69 | } | 77 | } |
70 | 78 | ||
... | @@ -83,12 +91,22 @@ void ARCSNetworkProxySlot::setSlot(QString s) | ... | @@ -83,12 +91,22 @@ void ARCSNetworkProxySlot::setSlot(QString s) |
83 | 91 | ||
84 | 92 | ||
85 | 93 | ||
86 | -int ARCSNetworkProxySlot::prepareSlotConnect(QString , QString sltName, QString , QString , bool simulate) | 94 | +int ARCSNetworkProxySlot::prepareSlotConnect(QString , QString sltName, QString objectName , QString , bool simulate) |
87 | { | 95 | { |
88 | if (simulate) | 96 | if (simulate) |
89 | return 0; | 97 | return 0; |
90 | 98 | ||
91 | ARCSNetworkComponent* anc = dynamic_cast<ARCSNetworkComponent*>(home); | 99 | ARCSNetworkComponent* anc = dynamic_cast<ARCSNetworkComponent*>(home); |
100 | + | ||
101 | + ARCSNetworkComponent* anc2 = dynamic_cast<ARCSNetworkComponent*>( | ||
102 | + ARCSApplicationComponent::getRunningInstance()->getContext()->getComponent(objectName) | ||
103 | + ); | ||
104 | + | ||
105 | + // if anc2 is also a remote component then it is a connection between two | ||
106 | + // remote components, thus it is not necessary to handle it here. | ||
107 | + if (anc2 && anc) | ||
108 | + return -1; | ||
109 | + | ||
92 | if (anc) | 110 | if (anc) |
93 | anc->requestSlotConnect(this); | 111 | anc->requestSlotConnect(this); |
94 | //! \todo insrer ici un traitement appropri | 112 | //! \todo insrer ici un traitement appropri | ... | ... |
... | @@ -16,13 +16,16 @@ class ARCSNetworkProxySlot : public QObject, public ARCSQDynamicObject | ... | @@ -16,13 +16,16 @@ class ARCSNetworkProxySlot : public QObject, public ARCSQDynamicObject |
16 | public: | 16 | public: |
17 | ARCSNetworkProxySlot(ARCSAbstractComponent* aac, QObject* parent=0); | 17 | ARCSNetworkProxySlot(ARCSAbstractComponent* aac, QObject* parent=0); |
18 | 18 | ||
19 | - virtual int qt_metacall(QMetaObject::Call call, int id, void ** arguments); | 19 | + virtual int qt_metacall(QMetaObject::Call call, int id, void** arguments); |
20 | 20 | ||
21 | virtual QStringList getSignalList() { return QStringList(); } | 21 | virtual QStringList getSignalList() { return QStringList(); } |
22 | 22 | ||
23 | virtual QStringList getSlotList() { return QStringList(slotName);} | 23 | virtual QStringList getSlotList() { return QStringList(slotName);} |
24 | 24 | ||
25 | - virtual int prepareSlotConnect(QString sigName, QString sltName, QString objectName = QString::null, QString actualSignal = QString::null, bool simulate = false) ; | 25 | + virtual int prepareSlotConnect(QString sigName, QString sltName, |
26 | + QString objectName = QString::null, | ||
27 | + QString actualSignal = QString::null, | ||
28 | + bool simulate = false) ; | ||
26 | 29 | ||
27 | virtual int prepareSignalConnect(QString, QString, QString, QString, bool) | 30 | virtual int prepareSignalConnect(QString, QString, QString, QString, bool) |
28 | { return -1;} | 31 | { return -1;} | ... | ... |
This diff is collapsed. Click to expand it.
... | @@ -45,6 +45,8 @@ class ARCSNetworkServerThread : public QThread | ... | @@ -45,6 +45,8 @@ class ARCSNetworkServerThread : public QThread |
45 | void handleSignalRequest(ARCSNetworkSignalRequest* ansr, QTcpSocket* socket); | 45 | void handleSignalRequest(ARCSNetworkSignalRequest* ansr, QTcpSocket* socket); |
46 | void handleDisconnectRequest(ARCSNetworkDisconnectRequest* andr, QTcpSocket* socket); | 46 | void handleDisconnectRequest(ARCSNetworkDisconnectRequest* andr, QTcpSocket* socket); |
47 | void handleInterfaceRequest(QTcpSocket* socket); | 47 | void handleInterfaceRequest(QTcpSocket* socket); |
48 | + bool checkInterface(QTcpSocket* socket); | ||
49 | + void sendErrorFrame(int errId, QTcpSocket* socket); | ||
48 | 50 | ||
49 | 51 | ||
50 | int socketDescriptor; | 52 | int socketDescriptor; |
... | @@ -107,7 +109,7 @@ public: | ... | @@ -107,7 +109,7 @@ public: |
107 | * \param id id of the slot to call | 109 | * \param id id of the slot to call |
108 | * \param params serialized parameters of the slot | 110 | * \param params serialized parameters of the slot |
109 | */ | 111 | */ |
110 | - void call(int id, QStringList params); | 112 | + bool call(int id, QStringList params); |
111 | 113 | ||
112 | /*! \brief Creates a signal stub to connect to a slot of the interface | 114 | /*! \brief Creates a signal stub to connect to a slot of the interface |
113 | * \param s the name of the slot of the interface | 115 | * \param s the name of the slot of the interface |
... | @@ -124,6 +126,7 @@ public: | ... | @@ -124,6 +126,7 @@ public: |
124 | */ | 126 | */ |
125 | int createSlotStub(QString signal, int id, quint16 port, QString peer); | 127 | int createSlotStub(QString signal, int id, quint16 port, QString peer); |
126 | 128 | ||
129 | + bool isBound() { return interface != 0; } | ||
127 | 130 | ||
128 | void destroySlotStub(QString s); | 131 | void destroySlotStub(QString s); |
129 | 132 | ||
... | @@ -154,6 +157,9 @@ protected: | ... | @@ -154,6 +157,9 @@ protected: |
154 | 157 | ||
155 | 158 | ||
156 | private: | 159 | private: |
160 | + //bool checkInterface(); | ||
161 | + | ||
162 | + | ||
157 | ARCSNetworkServer(); | 163 | ARCSNetworkServer(); |
158 | static ARCSNetworkServer* instance; | 164 | static ARCSNetworkServer* instance; |
159 | bool inEventMode; | 165 | bool inEventMode; | ... | ... |
-
Please register or login to post a comment