Jean-Yves Didier

Grosses corrections de bugs sur le protocole réseau.

Définition des vraies erreurs du protocole (et non pas des programmes).
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;
......