Jean-Yves Didier

déplacement de la partie network

1 +<application mode="event">
2 + <context>
3 + <libraries>
4 + <library path="../../libs/sample"/>
5 + <library path="../../libs/network"/>
6 + </libraries>
7 + <components>
8 + <component id="b" type="Loop"></component>
9 + <component id="n" type="Network">arcs://localhost:2031</component>
10 + <component id="s" type="StateMachine">
11 + <statemachine>
12 + <first name="start"/>
13 + <last name="end"/>
14 + <transitions>
15 + <transition source="start" token="end" destination="end"/>
16 + </transitions>
17 + </statemachine>
18 + </component>
19 + </components>
20 + <constants>
21 + <constant id="iterations" type="int">5</constant>
22 + </constants>
23 + </context>
24 +
25 + <processes>
26 + <process controller="s">
27 + <sheet id="start">
28 + <connections>
29 + <link source="b" signal="newIteration(int)" destination="n" slot="display(int)"/>
30 + <link source="b" signal="sendToken(QString)" destination="s" slot="setToken(QString)" />
31 + </connections>
32 + <postconnections>
33 + <invoke destination="b" slot="setIterations(int)" type="constant">iterations</invoke>
34 + </postconnections>
35 + </sheet>
36 + <sheet id="end"/>
37 + </process>
38 +</processes>
39 +
40 +</application>
1 +<application mode="event">
2 + <context>
3 + <libraries>
4 + <library path="../../libs/sample"/>
5 + <library path="../../libs/network"/>
6 + </libraries>
7 + <components>
8 + <component id="n" type="Network">arcs://localhost:2030</component>
9 + <component id="d" type="DisplayInt"></component>
10 + <component id="s" type="StateMachine">
11 + <statemachine>
12 + <first name="start"/>
13 + <last name="end"/>
14 + <transitions>
15 + <transition source="start" token="end" destination="end"/>
16 + </transitions>
17 + </statemachine>
18 + </component>
19 + </components>
20 + <constants>
21 + <constant id="iterations" type="int">5</constant>
22 + </constants>
23 + </context>
24 +
25 + <processes>
26 + <process controller="s">
27 + <sheet id="start">
28 + <connections>
29 + <link source="n" signal="newIteration(int)" destination="d" slot="display(int)"/>
30 + </connections>
31 + <postconnections>
32 + <invoke destination="n" slot="setIterations(int)" type="constant">iterations</invoke>
33 + <invoke destination="s" slot="setToken(QString)" type="string">end</invoke>
34 + </postconnections>
35 + </sheet>
36 + <sheet id="end"/>
37 + </process>
38 +</processes>
39 +
40 +</application>
1 +<application mode="event">
2 + <context>
3 + <libraries>
4 + <library path="../../libs/sample"/>
5 + <library path="../../libs/network"/>
6 + </libraries>
7 + <components>
8 + <component id="n_l" type="Network">arcs://localhost:2030</component>
9 + <component id="n_di" type="Network">arcs://localhost:2031</component>
10 + <component id="s" type="StateMachine">
11 + <statemachine>
12 + <first name="start"/>
13 + <last name="end"/>
14 + <transitions>
15 + <transition source="start" token="end" destination="end"/>
16 + </transitions>
17 + </statemachine>
18 + </component>
19 + </components>
20 + <constants>
21 + <constant id="iterations" type="int">5</constant>
22 + </constants>
23 + </context>
24 +
25 + <processes>
26 + <process controller="s">
27 + <sheet id="start">
28 + <connections>
29 + <link source="n_l" signal="newIteration(int)" destination="n_di" slot="display(int)"/>
30 + </connections>
31 + <postconnections>
32 + <invoke destination="n_l" slot="setIterations(int)" type="constant">iterations</invoke>
33 + <invoke destination="s" slot="setToken(QString)" type="string">end</invoke>
34 + </postconnections>
35 + </sheet>
36 + <sheet id="end"/>
37 + </process>
38 +</processes>
39 +
40 +</application>
1 +<application mode="event">
2 + <context>
3 + <libraries>
4 + <library path="../../libs/sample"/>
5 + <library path="../../libs/network"/>
6 + </libraries>
7 + <components>
8 + <component id="d" type="DisplayInt"></component>
9 + <component id="n" type="ARCSNetworkConfigurator"></component>
10 + <component id="s" type="StateMachine">
11 + <statemachine>
12 + <first name="start"/>
13 + <last name="end"/>
14 + <transitions>
15 + <transition source="start" token="end" destination="end"/>
16 + </transitions>
17 + </statemachine>
18 + </component>
19 + </components>
20 + </context>
21 +
22 + <processes>
23 + <process controller="s">
24 + <sheet id="start">
25 + <preconnections>
26 + <invoke destination="n" slot="setPort(int)" type="int">2031</invoke>
27 + <invoke destination="n" slot="setInterface(QString)" type="string">d</invoke>
28 + </preconnections>
29 + </sheet>
30 + <sheet id="end"/>
31 + </process>
32 +</processes>
33 +
34 +</application>
1 +<application mode="event">
2 + <context>
3 + <libraries>
4 + <library path="../../libs/sample"/>
5 + <library path="../../libs/network"/>
6 + </libraries>
7 + <components>
8 + <component id="l" type="Loop"></component>
9 + <component id="n" type="ARCSNetworkConfigurator"></component>
10 + <component id="s" type="StateMachine">
11 + <statemachine>
12 + <first name="start"/>
13 + <last name="end"/>
14 + <transitions>
15 + <transition source="start" token="end" destination="end"/>
16 + </transitions>
17 + </statemachine>
18 + </component>
19 + </components>
20 + </context>
21 +
22 + <processes>
23 + <process controller="s">
24 + <sheet id="start">
25 + <preconnections>
26 + <invoke destination="n" slot="setPort(int)" type="int">2030</invoke>
27 + <invoke destination="n" slot="setInterface(QString)" type="string">l</invoke>
28 + </preconnections>
29 + </sheet>
30 + <sheet id="end"/>
31 + </process>
32 +</processes>
33 +
34 +</application>
This diff is collapsed. Click to expand it.
1 +#include<arcs/arcslibtoolkit.h>
2 +#include<QMetaType>
3 +#include<arcsnetworkfamily.h>
4 +#include<arcsnetworkcomponent.h>
5 +#include<arcsnetworkconfigurator.h>
6 +
7 +extern "C" DLL_EXPORT void arcsLibraryRegister(ARCSComponentMap* cmap, ARCSFamilyMap* fmap, ARCSTypeMap* )
8 +{
9 + cmap->insert("ARCSNetworkConfigurator",new ARCSNativeComponentTemplate<ARCSNetworkConfigurator>());
10 +
11 + fmap->insert("ARCSNetworkFamily",new ARCSNetworkFamily());
12 +
13 +}
14 +
15 +extern "C" DLL_EXPORT void arcsLibraryUnregister(ARCSComponentMap* cmap, ARCSFamilyMap* fmap, ARCSTypeMap* )
16 +{
17 + delete cmap->take("ARCSNetworkConfigurator");
18 +
19 + delete fmap->take("ARCSNetworkFamily");
20 +
21 +}
22 +
1 +#include "arcsnetworkcomponent.h"
2 +#include <arcs/arcsfactory.h>
3 +#include "arcsnetworkproxyslot.h"
4 +#include "arcsnetworkproxysignal.h"
5 +#include "arcsnetworkframes.h"
6 +
7 +#include <QTcpSocket>
8 +
9 +/********************************************************
10 + * ARCSRemote Component
11 + ************************************************************/
12 +
13 +ARCSNetworkComponent::ARCSNetworkComponent()
14 +{
15 + setType("Network");
16 + setFamily("Network");
17 +
18 + hostName = "localhost";
19 + port = 2020;
20 + connectStatus = false;
21 +}
22 +
23 +
24 +ARCSNetworkComponent::~ARCSNetworkComponent()
25 +{
26 +
27 +
28 +}
29 +
30 +QString ARCSNetworkComponent::toString()
31 +{
32 + return "arcs://" + hostName +":" + QString::number(port) + "/" ; //+ interface;
33 +}
34 +
35 +bool ARCSNetworkComponent::parseString(QString s)
36 +{
37 + // arcs://host:port/interface
38 +
39 + QString inter = s.section("/", 2,2);
40 + hostName = inter.section(":",0,0);
41 + QString portString = inter.section(":",1,1);
42 + interface = inter.section("/",3);
43 +
44 + if (!portString.isEmpty())
45 + {
46 + int tmp = portString.toInt();
47 + if (tmp > 0 && tmp < 65536)
48 + port = tmp;
49 + }
50 +
51 + if ( hostName.isEmpty() )
52 + return false;
53 +
54 +
55 + return true;
56 +}
57 +
58 +QStringList ARCSNetworkComponent::getSignals()
59 +{
60 + QStringList res;
61 + QTcpSocket* socket = new QTcpSocket();
62 + socket->connectToHost(hostName, port);
63 + if (!socket->waitForConnected(ARCSNetworkFrame::TimeOut))
64 + {
65 + std::cerr << "[Network] interface request error " << qPrintable(socket->errorString()) << std::endl;
66 + return res;
67 + }
68 +
69 + ARCSNetworkFrame request(ARCSNetworkFrame::IFACE_REQUEST);
70 + request.writeFrame(socket);
71 +
72 + ARCSNetworkFrame* response = ARCSNetworkFrame::readFrame(socket);
73 + if (response )
74 + {
75 + if (response->getType() != ARCSNetworkFrame::IFACE_RESPONSE)
76 + std::cerr << "[Network] invalid response recieved to interface request." << std::endl;
77 + else
78 + res = ((ARCSNetworkInterfaceResponse*)response->getData())->getSignals();
79 + }
80 + else
81 + std::cerr << "[Network] Null interface response recieved ! " << std::endl;
82 +
83 + socket->disconnectFromHost();
84 + if (response)
85 + delete response;
86 +
87 + return res;
88 +}
89 +
90 +
91 +QStringList ARCSNetworkComponent::getSlots()
92 +{
93 + QStringList res;
94 + QTcpSocket* socket = new QTcpSocket();
95 + socket->connectToHost(hostName, port);
96 + if (!socket->waitForConnected(ARCSNetworkFrame::TimeOut))
97 + {
98 + std::cerr << "[Network] interface request error " << qPrintable(socket->errorString()) << std::endl;
99 + return res;
100 + }
101 +
102 + ARCSNetworkFrame request(ARCSNetworkFrame::IFACE_REQUEST);
103 + request.writeFrame(socket);
104 +
105 + ARCSNetworkFrame* response = ARCSNetworkFrame::readFrame(socket);
106 + if (response )
107 + {
108 + if (response->getType() != ARCSNetworkFrame::IFACE_RESPONSE)
109 + std::cerr << "[Network] invalid response recieved to interface request." << std::endl;
110 + else
111 + res = ((ARCSNetworkInterfaceResponse*)response->getData())->getSlots();
112 + }
113 + else
114 + std::cerr << "[Network] Null interface response recieved ! " << std::endl;
115 +
116 + socket->disconnectFromHost();
117 + if (response)
118 + delete response;
119 +
120 + return res;
121 +}
122 +
123 +
124 +void ARCSNetworkComponent::getProxySlot (QString slot, ObjectList &obj, QStringList &proxySlot)
125 +{
126 + ARCSNetworkProxySlot* proxy;
127 + if (proxySlots.contains(slot))
128 + proxy = proxySlots[slot];
129 + else
130 + {
131 + proxy = new ARCSNetworkProxySlot(this);
132 + proxy->setHostname(hostName);
133 + proxy->setPort(port);
134 + proxySlots.insert(slot, proxy);
135 + }
136 +
137 + obj << proxy;
138 + proxy->setSlot(slot);
139 + proxySlot << slot ;
140 +}
141 +
142 +
143 +void ARCSNetworkComponent::requestSlotConnect(ARCSNetworkProxySlot* anps)
144 +{
145 + QTcpSocket* socket = new QTcpSocket(anps);
146 + socket->connectToHost(hostName, port);
147 + if (!socket->waitForConnected(ARCSNetworkFrame::TimeOut))
148 + {
149 + std::cerr << "[Network] slot request error " << qPrintable(socket->errorString()) << std::endl;
150 + return ;
151 + }
152 +
153 + ARCSNetworkFrame request(ARCSNetworkFrame::SLOT_REQUEST);
154 + ((ARCSNetworkSlotRequest*)request.getData())->setSlot(anps->getSlot());
155 + request.writeFrame(socket);
156 +
157 + ARCSNetworkFrame* response = ARCSNetworkFrame::readFrame(socket);
158 + if (response )
159 + {
160 + if (response->getType() != ARCSNetworkFrame::CONNECT_RESPONSE)
161 + std::cerr << "[Network] invalid response recieved to connect request." << std::endl;
162 + else
163 + anps->setSlotId(((ARCSNetworkConnectResponse*)response->getData())->getId());
164 + }
165 + else
166 + std::cerr << "[Network] Null connect response recieved ! " << std::endl;
167 +
168 + socket->disconnectFromHost();
169 + if (response)
170 + delete response;
171 +}
172 +
173 +
174 +void ARCSNetworkComponent::requestSignalConnect(ARCSNetworkProxySignal* anps)
175 +{
176 + QTcpSocket* socket = new QTcpSocket();
177 + socket->connectToHost(hostName, port);
178 + if (!socket->waitForConnected(ARCSNetworkFrame::TimeOut))
179 + {
180 + std::cerr << "[Network] signal request error " << qPrintable(socket->errorString()) << std::endl;
181 + return ;
182 + }
183 +
184 + ARCSNetworkFrame request(ARCSNetworkFrame::SIGNAL_REQUEST);
185 + ((ARCSNetworkSignalRequest*)request.getData())->setParams(
186 + anps->getId(),
187 + ARCSNetworkServer::getInstance()->getPort(),
188 + anps->getSignal()
189 + );
190 +
191 + request.writeFrame(socket);
192 +
193 + ARCSNetworkFrame* response = ARCSNetworkFrame::readFrame(socket);
194 + if (response)
195 + delete response;
196 +
197 + socket->disconnectFromHost();
198 + delete socket;
199 +}
200 +
201 +void ARCSNetworkComponent::requestSignalDisconnect(ARCSNetworkProxySignal* anps)
202 +{
203 + QTcpSocket* socket = new QTcpSocket();
204 + socket->connectToHost(hostName, port);
205 + if (!socket->waitForConnected(ARCSNetworkFrame::TimeOut))
206 + {
207 + std::cerr << "[Network] signal request error " << qPrintable(socket->errorString()) << std::endl;
208 + return ;
209 + }
210 +
211 + ARCSNetworkFrame request(ARCSNetworkFrame::DISCONNECT_REQUEST);
212 + ((ARCSNetworkDisconnectRequest*)request.getData())->setSignal(anps->getSignal());
213 +
214 + request.writeFrame(socket);
215 +
216 + ARCSNetworkFrame* response = ARCSNetworkFrame::readFrame(socket);
217 + if (response)
218 + delete response;
219 +
220 + socket->disconnectFromHost();
221 + delete socket;
222 +}
223 +
224 +
225 +
226 +void ARCSNetworkComponent::getProxySignal (QString signal, ObjectList &obj, QStringList &proxySignal)
227 +{
228 + QString id = getProperty("id").toString();
229 + ARCSNetworkProxySignal* proxy = ARCSNetworkServer::getInstance()->getProxySignal(signal);
230 + proxy->setHome(this);
231 + obj << proxy;
232 + proxySignal << signal;
233 +}
234 +
235 +
236 +bool ARCSNetworkComponent::genuineConnect (QString sig, ARCSAbstractComponent *dst, QString slt, bool )
237 +{
238 + QTcpSocket* socket = new QTcpSocket();
239 + socket->connectToHost(hostName, port);
240 + if (!socket->waitForConnected(ARCSNetworkFrame::TimeOut))
241 + {
242 + std::cerr << "[Network] call error " << qPrintable(socket->errorString()) << std::endl;
243 + return false;
244 + }
245 +
246 +
247 + ARCSNetworkFrame request(ARCSNetworkFrame::CONNECT_REQUEST);
248 + ((ARCSNetworkConnectRequest*)request.getData())->setParams(sig, dst->toString(), slt);
249 +
250 + request.writeFrame(socket);
251 + ARCSNetworkFrame* response = ARCSNetworkFrame::readFrame(socket);
252 + if (response)
253 + delete response;
254 +
255 + socket->disconnectFromHost();
256 + delete socket;
257 +
258 + return true;
259 +}
260 +
261 +
262 +bool ARCSNetworkComponent::genuineDisconnect(QString sig, ARCSAbstractComponent* , QString )
263 +{
264 + QTcpSocket* socket = new QTcpSocket();
265 + socket->connectToHost(hostName, port);
266 + if (!socket->waitForConnected(ARCSNetworkFrame::TimeOut))
267 + {
268 + std::cerr << "[Network] call error " << qPrintable(socket->errorString()) << std::endl;
269 + return false;
270 + }
271 +
272 +
273 + ARCSNetworkFrame request(ARCSNetworkFrame::DISCONNECT_REQUEST);
274 + ((ARCSNetworkDisconnectRequest*)request.getData())->setSignal(sig);
275 +
276 + request.writeFrame(socket);
277 + ARCSNetworkFrame* response = ARCSNetworkFrame::readFrame(socket);
278 + if (response)
279 + delete response;
280 +
281 + socket->disconnectFromHost();
282 + delete socket;
283 +
284 + return true;
285 +}
286 +
287 +
288 +
1 +#ifndef __ARCSREMOTECOMPONENT_H__
2 +#define __ARCSREMOTECOMPONENT_H__
3 +
4 +#include <arcs/arcsabstractcomponent.h>
5 +#include <arcs/arcsnativecomponent.h>
6 +#include <QHash>
7 +#include <QObject>
8 +#include "arcsnetworkserver.h"
9 +#include <iostream>
10 +
11 +
12 +class ARCSNetworkProxySlot;
13 +
14 +//! Class describing a remote component
15 +/*! This description is only intended to used at the master side of the application.
16 + *\author Jean-Yves Didier and Mehdi Chouiten
17 + * \ingroup network
18 + * \date July, the 9th, 2009
19 + */
20 + class ARCSNetworkComponent : public ARCSAbstractComponent
21 + {
22 + public:
23 + ARCSNetworkComponent();
24 + ~ARCSNetworkComponent();
25 +
26 + virtual QString toString();
27 + virtual bool parseString(QString s);
28 + virtual QStringList getSignals();
29 + virtual QStringList getSlots();
30 +
31 + void requestSlotConnect(ARCSNetworkProxySlot* anps);
32 + void requestSignalConnect(ARCSNetworkProxySignal* anps);
33 + void requestSignalDisconnect(ARCSNetworkProxySignal* anps);
34 +
35 +
36 + void clearProxySlots();
37 +
38 +
39 + protected:
40 + virtual void getProxySlot (QString slot, ObjectList &obj, QStringList &proxySlot);
41 +
42 + virtual void getProxySignal (QString signal, ObjectList &obj, QStringList &proxySignal);
43 +
44 + virtual bool genuineConnect (QString sig, ARCSAbstractComponent *dst, QString slt, bool queued=false);
45 +
46 + virtual bool genuineDisconnect (QString sig, ARCSAbstractComponent *dst, QString slt);
47 +
48 + virtual bool genuineInstanciate ()
49 + {
50 + if (!ARCSNetworkServer::getInstance()->isListening())
51 + ARCSNetworkServer::getInstance()->start();
52 + return true;
53 + }
54 +
55 + virtual void genuineDestroy ()
56 + {
57 + }
58 +
59 + virtual ARCSAbstractComponent * genuineClone ()
60 + {
61 + return 0;
62 + }
63 +
64 +private:
65 + QString hostName;
66 + QString interface;
67 + int port;
68 + bool connectStatus;
69 + QHash<QString, ARCSNetworkProxySlot*> proxySlots;
70 +};
71 +
72 +#endif // __ARCSREMOTECOMPONENT_H__
1 +#ifndef __ARCSNETWORKCONFIGURATOR_H__
2 +#define __ARCSNETWORKCONFIGURATOR_H__
3 +
4 +#include <QObject>
5 +#include "arcsnetworkserver.h"
6 +
7 +
8 +//! Simple component intended to configure a network server.
9 +/*! This should mainly be used in the slave side.
10 + * \author Jean-Yves Didier
11 + * \ingroup network
12 + * \date November, the 5th, 2009
13 + */
14 +class ARCSNetworkConfigurator : public QObject
15 +{
16 + Q_OBJECT
17 +
18 + public:
19 + ARCSNetworkConfigurator(QObject* parent=0) : QObject(parent) {} //!< ARCS Constructor
20 +
21 + public slots:
22 + /*! \brief Sets the interface to use and that will be seen from afar.
23 + * \param s The component name implementing the interface.
24 + */
25 + void setInterface(QString s) { ARCSNetworkServer::getInstance()->setInterface(s); }
26 + /*! \brief Sets the port to which the server is listening to.
27 + * \param i a port number ( 0 < i < 65536)
28 + */
29 + void setPort(int i) { ARCSNetworkServer::getInstance()->setPort(i); }
30 +};
31 +
32 +
33 +#endif // __ARCSNETWORKCONFIGURATOR_H__
1 +#ifndef __ARCSNETWORKFAMILY_H__
2 +#define __ARCSNETWORKFAMILY_H__
3 +
4 +#include <arcs/arcsabstractfamily.h>
5 +#include "arcsnetworkcomponent.h"
6 +
7 +
8 +/*!
9 + * \defgroup network Network distribution in ARCS
10 + *
11 + * This library is defining a very basic distributed protocol for ARCS applications.
12 + */
13 +
14 +//! Network component family
15 +/*!
16 + * \author Jean-Yves Didier
17 + * \date November, the 5th, 2009
18 + * \ingroup network
19 + */
20 +class ARCSNetworkFamily : public ARCSAbstractFamily
21 +{
22 + public:
23 + ARCSNetworkFamily() { }
24 + ~ARCSNetworkFamily() { }
25 +
26 + virtual QStringList factoryList() { return QStringList("Network"); }
27 + virtual bool addFactory(QString, ARCSAbstractComponent*) { return false; }
28 + virtual void removeFactory(QString) { }
29 + virtual ARCSAbstractComponent* instanciate(QString type)
30 + {
31 + if (type == "Network")
32 + return new ARCSNetworkComponent();
33 + return 0;
34 + }
35 +
36 + virtual void destroy(ARCSAbstractComponent* component)
37 + {
38 + delete component;
39 + }
40 +
41 + virtual QString name() const { return "ARCSNetworkFamily"; }
42 +
43 +};
44 +
45 +#endif // __ARCSNETWORKFAMILY_H__
1 +#include "arcsnetworkframes.h"
2 +#include <QDataStream>
3 +#include <QByteArray>
4 +#include <iostream>
5 +
6 +
7 +int ARCSNetworkFrame::TimeOut = -1; // 5000;
8 +
9 +
10 +void ARCSNetworkFrame::setType(ARCSNetworkFrames t)
11 +{
12 + if (data)
13 + delete data;
14 +
15 + type = t;
16 + switch(type)
17 + {
18 + case IFACE_REQUEST:
19 + data = new ARCSNetworkInterfaceRequest();
20 + break;
21 + case IFACE_RESPONSE:
22 + data = new ARCSNetworkInterfaceResponse();
23 + break;
24 + case CONNECT_REQUEST:
25 + data = new ARCSNetworkConnectRequest();
26 + break;
27 + case DISCONNECT_REQUEST:
28 + data = new ARCSNetworkDisconnectRequest();
29 + break;
30 + case CONNECT_RESPONSE:
31 + data = new ARCSNetworkConnectResponse();
32 + break;
33 + case CALL_REQUEST:
34 + data = new ARCSNetworkCallRequest();
35 + break;
36 + case CALL_RESPONSE:
37 + data = new ARCSNetworkCallResponse();
38 + break;
39 +
40 + case SLOT_REQUEST:
41 + data = new ARCSNetworkSlotRequest();
42 + break;
43 + case SIGNAL_REQUEST:
44 + data = new ARCSNetworkSignalRequest();
45 + break;
46 +
47 + default:
48 + type = INVALID;
49 + data = 0 ;
50 + }
51 +
52 +}
53 +
54 +
55 +
56 +
57 +ARCSNetworkFrame* ARCSNetworkFrame::readFrame(QIODevice* device)
58 +{
59 + // lecture de la taille
60 + while (device->bytesAvailable() < (int)sizeof(quint32))
61 + {
62 + if (!device->waitForReadyRead(TimeOut))
63 + {
64 + std::cerr << "[Network] Read type - " << qPrintable(device->errorString()) << std::endl;
65 + return 0;
66 + }
67 + }
68 +
69 + quint32 blockSize;
70 + QDataStream in(device);
71 + in.setVersion(QDataStream::Qt_4_5);
72 + in >> blockSize;
73 +
74 +
75 + while (device->bytesAvailable() < blockSize)
76 + {
77 + if (!device->waitForReadyRead(TimeOut))
78 + {
79 + std::cerr << "[Network] Read data - " << qPrintable(device->errorString()) << std::endl;
80 + return 0;
81 + }
82 + }
83 +
84 + ARCSNetworkFrame* frame = new ARCSNetworkFrame();
85 + in >> *frame;
86 + return frame;
87 +}
88 +
89 +
90 +void ARCSNetworkFrame::writeFrame(QIODevice* device)
91 +{
92 + QByteArray block;
93 +
94 + QDataStream out(&block, QIODevice::WriteOnly);
95 + out.setVersion(QDataStream::Qt_4_5);
96 + out << (quint32)0 ;
97 + out << *this ;
98 + out.device()->seek(0);
99 + out << (quint32)(block.size() - sizeof(quint32)) ;
100 +
101 + device->write(block);
102 +
103 + if (!device->waitForBytesWritten(TimeOut))
104 + {
105 + std::cerr << "[Network] Didn't wait enough to write all bytes" << std::endl;
106 + }
107 +}
108 +
109 +
110 +
111 +QDataStream &operator>>(QDataStream & stream, ARCSNetworkFrame& frame)
112 +{
113 + int type ;
114 + stream >> type ;
115 + frame.setType((ARCSNetworkFrame::ARCSNetworkFrames)type);
116 + frame.getData()->deserialize(stream);
117 + return stream;
118 +}
119 +
120 +
121 +QDataStream &operator<<(QDataStream & stream, const ARCSNetworkFrame& frame)
122 +{
123 + stream << (int)frame.getType();
124 + frame.getData()->serialize(stream);
125 + return stream;
126 +}
1 +#ifndef __ARCSNETWORKFRAMES_H__
2 +#define __ARCSNETWORKFRAMES_H__
3 +
4 +#include <QByteArray>
5 +#include <QStringList>
6 +#include <QDataStream>
7 +
8 +//! Base class for data in network frames.
9 +/*! It describes serialization/deserialization methods for data frames.
10 + * \author Jean-Yves Didier
11 + * \date November, the 5th, 2009
12 + * \ingroup network
13 + */
14 +class ARCSNetworkData
15 +{
16 +public:
17 + virtual ~ARCSNetworkData() {}
18 + virtual void serialize(QDataStream& stream) = 0;
19 + virtual void deserialize(QDataStream& stream) = 0;
20 +};
21 +
22 +//! Class implementing ARCS network frames
23 +/*! A frame is characterized by a type id and data depending on the type.
24 + * \author Jean-Yves Didier
25 + * \date November, the 5th, 2009
26 + * \ingroup network
27 + */
28 +class ARCSNetworkFrame
29 +{
30 +public:
31 + enum ARCSNetworkFrames {
32 + INVALID,
33 + CALL_REQUEST,
34 + SLOT_REQUEST,
35 + SIGNAL_REQUEST,
36 + CONNECT_REQUEST,
37 + DISCONNECT_REQUEST,
38 + IFACE_REQUEST,
39 +
40 + SLOT_RESPONSE,
41 + CONNECT_RESPONSE, /* A revoir, peut-tre un SLOT response */
42 + CALL_RESPONSE, /* A revoir, peut-tre un ACK response */
43 + ACK_RESPONSE,
44 + IFACE_RESPONSE
45 + };
46 +
47 + ARCSNetworkFrame() { type = INVALID; data = 0;}
48 + ARCSNetworkFrame(ARCSNetworkFrames t) { data = 0; setType(t); }
49 + ~ARCSNetworkFrame() { if (data != 0) delete data; }
50 + void setType(ARCSNetworkFrames t);
51 +
52 + bool isValid() { return type != INVALID; }
53 +
54 + ARCSNetworkFrames getType() const { return type; }
55 + ARCSNetworkData* getData() const { return data; }
56 +
57 + static ARCSNetworkFrame* readFrame(QIODevice* device);
58 + void writeFrame(QIODevice* device);
59 + static int TimeOut ;
60 +
61 +private:
62 + ARCSNetworkFrames type;
63 + ARCSNetworkData* data;
64 +};
65 +
66 +QDataStream &operator>>(QDataStream & stream, ARCSNetworkFrame& frame);
67 +QDataStream &operator<<(QDataStream & stream, const ARCSNetworkFrame& frame);
68 +
69 +
70 +class ARCSNetworkInterfaceRequest : public ARCSNetworkData
71 +{
72 +public:
73 + ARCSNetworkInterfaceRequest() {}
74 + virtual void serialize(QDataStream& ) {}
75 + void deserialize(QDataStream& ) {}
76 +};
77 +
78 +class ARCSNetworkInterfaceResponse : public ARCSNetworkData
79 +{
80 + public:
81 + ARCSNetworkInterfaceResponse() {}
82 + QStringList getSignals() { return signalList; }
83 + QStringList getSlots() { return slotList; }
84 + void setSignals(QStringList sl) { signalList = sl; }
85 + void setSlots(QStringList sl) { slotList = sl; }
86 +
87 + virtual void serialize(QDataStream& stream) { stream << slotList << signalList; }
88 + virtual void deserialize(QDataStream& stream) { stream >> slotList >> signalList; }
89 +
90 + private:
91 + QStringList signalList;
92 + QStringList slotList;
93 +};
94 +
95 +class ARCSNetworkConnectRequest : public ARCSNetworkData
96 +{
97 + public:
98 + ARCSNetworkConnectRequest() {}
99 + //QString getSource() { return source; }
100 + QString getDestination() { return destination; }
101 + QString getSignal() { return signalName; }
102 + QString getSlot() { return slotName; }
103 +
104 + void setParams(/*QString host,*/ QString sig, QString dst, QString slt)
105 + {
106 + //source = src;
107 + destination = dst;
108 + signalName = sig;
109 + slotName = slt;
110 + }
111 +
112 + virtual void serialize(QDataStream& stream) { stream /*<< source*/ << signalName << destination << slotName; }
113 + virtual void deserialize(QDataStream& stream) { stream /*>> source*/ >> signalName >> destination >> slotName; }
114 +
115 +private:
116 + //QString source;
117 + QString destination;
118 + QString slotName;
119 + QString signalName;
120 +};
121 +
122 +class ARCSNetworkConnectResponse : public ARCSNetworkData
123 +{
124 + public:
125 + ARCSNetworkConnectResponse() {}
126 +
127 + int getId() { return id; }
128 + void setId(int i) { id = i ;}
129 + virtual void serialize(QDataStream& stream) { stream << id ; }
130 + virtual void deserialize(QDataStream& stream) { stream >> id; }
131 +
132 + private:
133 + int id;
134 +};
135 +
136 +
137 +class ARCSNetworkSignalRequest : public ARCSNetworkData
138 +{
139 + public:
140 + ARCSNetworkSignalRequest() {}
141 +
142 + virtual void serialize(QDataStream& stream) { stream << id << port << signalName; }
143 + virtual void deserialize(QDataStream& stream) { stream >> id >> port >> signalName; }
144 +
145 + quint16 getPort() { return port;}
146 + void setPort(quint16 p) { port = p ;}
147 + int getId() { return id; }
148 + void setId(int i) { id = i ; }
149 + QString getSignal() { return signalName; }
150 + void setSignal(QString s) { signalName = s; }
151 + void setParams(int i, quint16 p, QString s) { id = i; port = p; signalName = s; }
152 +
153 + private:
154 + int id ;
155 + quint16 port;
156 + QString signalName;
157 +
158 +
159 +};
160 +
161 +
162 +//! Frame encapsulating a slot request.
163 +/*! Such frame is emitted when a master needs specific slot from a remote component.
164 + *
165 + * \author Jean-Yves Didier
166 + * \date November, the 12th, 2009
167 + * \ingroup network
168 + */
169 +class ARCSNetworkSlotRequest : public ARCSNetworkData
170 +{
171 + public:
172 + ARCSNetworkSlotRequest() {}
173 +
174 + QString getSlot() { return slotName; }
175 + void setSlot(QString s) { slotName = s ; }
176 + virtual void serialize(QDataStream& stream) { stream << slotName ; }
177 + virtual void deserialize(QDataStream& stream) { stream >> slotName; }
178 +
179 + private:
180 + QString slotName;
181 +};
182 +
183 +
184 +class ARCSNetworkDisconnectRequest : public ARCSNetworkData
185 +{
186 + public:
187 + ARCSNetworkDisconnectRequest() {}
188 +
189 + QString getSignal() { return signalName; }
190 + void setSignal(QString s) { signalName = s ; }
191 + virtual void serialize(QDataStream& stream) { stream << signalName ; }
192 + virtual void deserialize(QDataStream& stream) { stream >> signalName; }
193 +
194 + private:
195 + QString signalName;
196 +};
197 +
198 +
199 +
200 +
201 +class ARCSNetworkCallRequest : public ARCSNetworkData
202 +{
203 + public:
204 + ARCSNetworkCallRequest() {}
205 +
206 + int getId() { return id; }
207 + void setId(int i) { id = i ;}
208 + QStringList getParams() { return params; }
209 + void setParams(QStringList sl) { params = sl; }
210 + void setParams(int i, QStringList sl) { id = i; params = sl; }
211 +
212 + virtual void serialize(QDataStream& stream) { stream << id << params; }
213 + virtual void deserialize(QDataStream& stream) { stream >> id >> params; }
214 +
215 + private:
216 + int id;
217 + QStringList params;
218 +};
219 +
220 +
221 +class ARCSNetworkCallResponse : public ARCSNetworkData
222 +{
223 + public:
224 + ARCSNetworkCallResponse() {}
225 +
226 + virtual void serialize(QDataStream& ) { }
227 + virtual void deserialize(QDataStream& ) { }
228 +};
229 +
230 +
231 +
232 +#endif // ARCSNETWORKFRAMES_H
1 +#include "arcsnetworkproxysignal.h"
2 +#include <arcs/arcsfactory.h>
3 +#include "arcsnetworkserver.h"
4 +#include "arcsnetworkframes.h"
5 +#include "arcsnetworkcomponent.h"
6 +#include <arcs/arcsabstractcomponent.h>
7 +#include <QTcpSocket>
8 +
9 +
10 +int ARCSNetworkProxySignal::qt_metacall(QMetaObject::Call call, int id, void ** arguments)
11 +{
12 + id = QObject::qt_metacall(call,id, arguments);
13 +
14 + if (id == -1 || call != QMetaObject::InvokeMetaMethod)
15 + return -1;
16 +
17 + if (id < 0)
18 + return -1;
19 +
20 + QMetaObject::activate(this, metaObject(), id + metaObject()->methodCount(), arguments);
21 +
22 + return -1;
23 +}
24 +
25 +
26 +
27 +void ARCSNetworkProxySignal::setSignal(QString s)
28 +{
29 + paramTypes = s.section("(",1,1).section(")", 0,0).split(",");
30 + typeIds.clear();
31 +
32 + for (int i=0; i < paramTypes.count(); i++)
33 + typeIds.append(QMetaType::type(qPrintable(paramTypes.at(i))));
34 +
35 + signalName = s;
36 +}
37 +
38 +
39 +
40 +int ARCSNetworkProxySignal::prepareSignalConnect(QString, QString, QString, QString, bool)
41 +{
42 + ARCSNetworkComponent* anc = dynamic_cast<ARCSNetworkComponent*>(home);
43 + if (anc)
44 + anc->requestSignalConnect(this);
45 +
46 +
47 + return metaObject()->methodCount();
48 +}
49 +
50 +
51 +int ARCSNetworkProxySignal::cleanSignalConnect(QString, QString, QString, QString)
52 +{
53 + ARCSNetworkComponent* anc = dynamic_cast<ARCSNetworkComponent*>(home);
54 + if (anc)
55 + anc->requestSignalDisconnect(this);
56 +
57 + return metaObject()->methodCount();
58 +}
59 +
60 +
61 +void ARCSNetworkProxySignal::call(QStringList sl)
62 +{
63 + //1 prparer les donnes
64 + int nbargs = sl.count();
65 + void * args[nbargs+1];
66 + args[0] = 0 ;
67 +
68 + // dump des paramtres passs
69 + /*std::cout << "[Network] Obtained parameters: " ;
70 + for (int k = 0; k < sl.count(); k++)
71 + {
72 + std::cout << qPrintable(sl[k]) << " ";
73 + }
74 + std::cout << std::endl;*/
75 +
76 +
77 + if (nbargs > typeIds.count())
78 + {
79 + std::cerr << "[Network] Argument and type count mismatch (" << nbargs << ", "<< typeIds.count() << ")" << std::endl;
80 + return ;
81 + }
82 +
83 + for (int i = 0; i < nbargs; i++)
84 + {
85 + QVariant var = ARCSFactory::getInstance()->dataDeserialize(paramTypes[i],sl[i]); //ctx->argument(i).toVariant();
86 + var.convert((QVariant::Type)typeIds[i]);
87 + args[i+1] = var.data() ;
88 + }
89 +
90 + //2 lancer l'appel l'aide de qt_metacall() ou qt_activate()
91 + qt_metacall( QMetaObject::InvokeMetaMethod ,metaObject()->methodCount(),args);
92 +}
1 +#ifndef __ARCSNETWORKPROXYSIGNAL_H__
2 +#define __ARCSNETWORKPROXYSIGNAL_H__
3 +
4 +#include <arcs/arcsqdynamicobject.h>
5 +#include <QObject>
6 +
7 +class ARCSAbstractComponent;
8 +
9 +//! Class implementing a proxy for network signals
10 +/*!
11 + * \author Jean-Yves Didier
12 + * \date November, the 5th, 2009
13 + * \ingroup network
14 + */
15 +class ARCSNetworkProxySignal : public QObject, public ARCSQDynamicObject
16 +{
17 +public:
18 + ARCSNetworkProxySignal(ARCSAbstractComponent* aac, QObject* parent=0) : QObject(parent) { home = aac;}
19 +
20 + virtual int qt_metacall(QMetaObject::Call call, int id, void ** arguments);
21 + virtual QStringList getSignalList() { return QStringList(signalName); }
22 + virtual QStringList getSlotList() { return QStringList(); }
23 + virtual int prepareSlotConnect(QString, QString, QString, QString, bool) { return -1;}
24 + virtual int prepareSignalConnect(QString sigName, QString sltName, QString objectName, QString actualSlot, bool simulate = false);// { return 0;}
25 + virtual int cleanSlotConnect(QString, QString, QString, QString) { return 0;}
26 + virtual int cleanSignalConnect(QString, QString, QString, QString);
27 +
28 + void setSignal(QString s);
29 + void call(QStringList sl);
30 + QString getSignal() { return signalName; }
31 + void setId(int i) { id = i; }
32 + int getId() { return id; }
33 + void setHome(ARCSAbstractComponent* cmp) { home = cmp; }
34 +
35 +
36 +private:
37 + QList<int> typeIds;
38 + QStringList paramTypes;
39 + QString signalName;
40 + int id;
41 + ARCSAbstractComponent* home;
42 +};
43 +
44 +
45 +#endif // __ARCSNETWORKPROXYSIGNAL_H__
1 +#include "arcsnetworkproxyslot.h"
2 +#include "arcsnetworkframes.h"
3 +#include "arcsnetworkserver.h"
4 +#include "arcsnetworkcomponent.h"
5 +#include <arcs/arcsfactory.h>
6 +#include <QTcpSocket>
7 +#include <iostream>
8 +
9 +ARCSNetworkProxySlot::ARCSNetworkProxySlot(ARCSAbstractComponent* cmp, QObject* parent) : QObject(parent)
10 +{
11 + slotId = -1;
12 + home = cmp;
13 +}
14 +
15 +
16 +
17 +int ARCSNetworkProxySlot::qt_metacall(QMetaObject::Call call,int id, void** arguments)
18 +{
19 + // should implement a call here !
20 + id = QObject::qt_metacall(call,id, arguments);
21 + if (id < 0 || call != QMetaObject::InvokeMetaMethod)
22 + return id;
23 +
24 + if (id != 0)
25 + return -1;
26 +
27 + if (slotId == -1)
28 + return -1;
29 +
30 + QStringList request;
31 + for (int i =0; i < typeIds.count(); i++)
32 + {
33 + int it = typeIds[i];
34 +
35 + if (it != QMetaType::Void)
36 + {
37 + QVariant v(it, arguments[i+1]);
38 + request << ARCSFactory::getInstance()->dataSerialize(v);
39 + }
40 + }
41 +
42 + // call here slot with all its params.
43 + QTcpSocket* socket = new QTcpSocket(this);
44 + socket->connectToHost(hostName, port);
45 + if (!socket->waitForConnected(ARCSNetworkFrame::TimeOut))
46 + {
47 + std::cerr << "[Network] call error " << qPrintable(socket->errorString()) << std::endl;
48 + std::cerr << "[Network] params are " << qPrintable(hostName) << ": " << port
49 + << " (" << this << ")" << std::endl;
50 + return -1;
51 + }
52 + // cration de la frame
53 + ARCSNetworkFrame frameRequest(ARCSNetworkFrame::CALL_REQUEST);
54 + ((ARCSNetworkCallRequest*)frameRequest.getData())->setParams(slotId, request);
55 + frameRequest.writeFrame(socket);
56 +
57 + ARCSNetworkFrame* response = ARCSNetworkFrame::readFrame(socket);
58 +
59 + // traitement de response -> Non c'est juste pour attendre de manire bloquante !
60 + socket->disconnectFromHost();
61 + if (response)
62 + delete response;
63 + delete socket;
64 + return -1;
65 +}
66 +
67 +
68 +void ARCSNetworkProxySlot::setSlot(QString s)
69 +{
70 + QStringList paramTypes = s.section("(",1,1).section(")", 0,0).split(",");
71 + typeIds.clear();
72 +
73 + for (int i=0; i < paramTypes.count(); i++)
74 + typeIds.append(QMetaType::type(qPrintable(paramTypes.at(i))));
75 +
76 + slotName = s;
77 +}
78 +
79 +
80 +
81 +
82 +int ARCSNetworkProxySlot::prepareSlotConnect(QString , QString sltName, QString , QString , bool simulate)
83 +{
84 + if (simulate)
85 + return 0;
86 +
87 + ARCSNetworkComponent* anc = dynamic_cast<ARCSNetworkComponent*>(home);
88 + if (anc)
89 + anc->requestSlotConnect(this);
90 +
91 +
92 +
93 + if (metaObject()->indexOfSlot(qPrintable(sltName)) != -1)
94 + {
95 + return metaObject()->indexOfSlot(qPrintable(sltName));
96 + }
97 +
98 + return metaObject()->methodCount();
99 +}
100 +
101 +
102 +
103 +
1 +#ifndef __ARCSNETWORKPROXYSLOT_H__
2 +#define __ARCSNETWORKPROXYSLOT_H__
3 +
4 +#include <arcs/arcsqdynamicobject.h>
5 +#include <QObject>
6 +
7 +class ARCSAbstractComponent;
8 +
9 +//! Class implementing a proxy for slots
10 +/*! \author Jean-Yves Didier
11 + * \date November, the 16th, 2009
12 + * \ingroup network
13 + */
14 +class ARCSNetworkProxySlot : public QObject, public ARCSQDynamicObject
15 +{
16 +public:
17 + ARCSNetworkProxySlot(ARCSAbstractComponent* aac, QObject* parent=0);
18 +
19 + virtual int qt_metacall(QMetaObject::Call call, int id, void ** arguments);
20 +
21 + virtual QStringList getSignalList() { return QStringList(); }
22 +
23 + virtual QStringList getSlotList() { return QStringList(slotName);}
24 +
25 + virtual int prepareSlotConnect(QString sigName, QString sltName, QString objectName = QString::null, QString actualSignal = QString::null, bool simulate = false) ;
26 +
27 + virtual int prepareSignalConnect(QString, QString, QString, QString, bool)
28 + { return -1;}
29 +
30 + virtual int cleanSlotConnect(QString, QString, QString, QString)
31 + { return metaObject()->methodCount(); }
32 +
33 + virtual int cleanSignalConnect(QString, QString, QString, QString)
34 + { return -1; }
35 +
36 + void setSlot(QString s ); // { slotName = s ;}
37 + void setHostname(QString s) { hostName = s; }
38 + void setPort(int i) { port = i; }
39 + void setSlotId(int i) { slotId = i;}
40 + QString getSlot() { return slotName; }
41 +
42 +private:
43 + QList<int> typeIds;
44 + QString slotName;
45 + QString hostName;
46 + int port;
47 + int slotId;
48 + ARCSAbstractComponent* home;
49 +};
50 +
51 +#endif // __ARCSNETWORKPROXYSLOT_H__
This diff is collapsed. Click to expand it.
1 +#ifndef __ARCSNETWORKSERVER_H__
2 +#define __ARCSNETWORKSERVER_H__
3 +
4 +#include <QTcpServer>
5 +#include <QObject>
6 +#include <arcs/arcsabstractcomponent.h>
7 +#include <QThread>
8 +#include <iostream>
9 +
10 +
11 +class ARCSNetworkConnectRequest;
12 +class ARCSNetworkDisconnectRequest;
13 +class ARCSNetworkCallRequest;
14 +class ARCSNetworkSignalRequest;
15 +class ARCSNetworkSlotRequest;
16 +class ARCSNetworkProxySignal;
17 +class ARCSNetworkProxySlot;
18 +
19 +//! A thread processing requests performed on the server
20 +/*! \author Jean-Yves Didier
21 + * \date November, the 13th, 2009
22 + * \ingroup network
23 + */
24 +class ARCSNetworkServerThread : public QThread
25 +{
26 + Q_OBJECT
27 +
28 + public:
29 + /*! Constructor
30 + * \param sd a socket descriptor to which the thread will listen.
31 + * \param parent a QObject which is parent to the thread.
32 + */
33 + ARCSNetworkServerThread(int sd, QObject* parent) : QThread(parent), socketDescriptor(sd) {}
34 +
35 + protected:
36 + virtual void run();//!< Thread main loop
37 +
38 + private:
39 + void handleRequest(QTcpSocket* socket);
40 + void handleConnectRequest(ARCSNetworkConnectRequest* ancr, QTcpSocket* socket);
41 + void handleCallRequest(ARCSNetworkCallRequest* ancr, QTcpSocket* socket);
42 + void handleSlotRequest(ARCSNetworkSlotRequest* ansr, QTcpSocket* socket);
43 + void handleSignalRequest(ARCSNetworkSignalRequest* ansr, QTcpSocket* socket);
44 + void handleDisconnectRequest(ARCSNetworkDisconnectRequest* andr, QTcpSocket* socket);
45 + void handleInterfaceRequest(QTcpSocket* socket);
46 +
47 +
48 + int socketDescriptor;
49 +};
50 +
51 +//! Actual implementation of the server
52 +/*! This class is a trick in order to have a server generated in the right thread.
53 + * \author Jean-Yves Didier
54 + * \date November, the 13th, 2009
55 + * \ingroup network
56 + */
57 +class ARCSNetworkThreadedServer : public QTcpServer
58 +{
59 + Q_OBJECT
60 +
61 + public:
62 + ARCSNetworkThreadedServer(QObject* parent = 0) : QTcpServer(parent) {} //!< Default constructor
63 +
64 + protected:
65 + /*!
66 + */
67 + void incomingConnection(int socketDescriptor)
68 + {
69 + ARCSNetworkServerThread* thread = new ARCSNetworkServerThread(socketDescriptor, this);
70 + connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater()));
71 + thread->start();
72 + }
73 +};
74 +
75 +
76 +
77 +//! Class implementing a server for each network component, as well as applications needing network support.
78 +/*! This class is implemented as a singleton since we only need one instance of a server running for an application.
79 + * The server is, at the same time a thread and an abstract component which is not directly exposed.
80 + * \author Jean-Yves Didier
81 + * \date November, the 13th, 2009
82 + * \ingroup network
83 + */
84 +class ARCSNetworkServer : public QThread, public ARCSAbstractComponent
85 +{
86 +Q_OBJECT
87 +
88 +public:
89 + static ARCSNetworkServer* getInstance(); //!< Singleton design pattern: mainly for lazy instanciation
90 + int getPort() { return port; } //!< Returns the port which is listened by the server
91 + void setInterface(QString name);//!< Sets the interface, i.e. the name of the component to which we want to apply distributed properties.
92 + void setPort(int i) { port= (quint16)i; start(); } //!< Sets the port, the server will listen to.
93 + bool isListening() { return server?server->isListening():false; } //!< Tells wether the server is active or not.
94 +
95 + /*! Construct and return a proxy for a given signal
96 + * \param s the name of the signal for which we will generate a proxy
97 + * \return a proxy signal
98 + */
99 + ARCSNetworkProxySignal* getProxySignal(QString s);
100 +
101 + QString getHostName() ; //!< Returns the host name of the current machine.
102 + QString getURL(); //!< Returns the url of the current server
103 +
104 + /*! \brief Triggers and calls a list of params to perform a call on a given slot.
105 + * \param id id of the slot to call
106 + * \param params serialized parameters of the slot
107 + */
108 + void call(int id, QStringList params);
109 +
110 + /*! \brief Creates a signal stub to connect to a slot of the interface
111 + * \param s the name of the slot of the interface
112 + * \return an id
113 + */
114 + int createSignalStub(QString s);
115 +
116 + /*! \brief Creates a slot stub to connect from a signal of the interface
117 + * Such a stub has to connect to another server
118 + * \param signal name of the signal to connect from
119 + * \param id id of the signal generated
120 + * \param port port number of the remote server
121 + * \param peer hostname of the remote server
122 + */
123 + int createSlotStub(QString signal, int id, quint16 port, QString peer);
124 +
125 +
126 + void destroySlotStub(QString s);
127 +
128 + void getInterface(QStringList& slotList, QStringList& signalList);
129 +
130 +
131 + // importé de ARCSNetworkStub
132 + virtual QString toString() { return QString(); }
133 + virtual bool parseString(QString) { return false; }
134 + virtual QStringList getSignals() { return QStringList(); }
135 + virtual QStringList getSlots() {return QStringList(); }
136 +
137 +
138 +protected:
139 + virtual void run();//< server thread.
140 +
141 + // importé de ARCSNetworkStub
142 + virtual void getProxySlot (QString slot, ObjectList &obj, QStringList &proxySlot);
143 + virtual void getProxySignal (QString signal, ObjectList &obj, QStringList &proxySignal);
144 + virtual bool genuineConnect (QString, ARCSAbstractComponent *, QString, bool) { return false; }
145 + virtual bool genuineDisconnect (QString, ARCSAbstractComponent *, QString) { return false; }
146 + virtual bool genuineInstanciate () { return true; }
147 + virtual void genuineDestroy () { }
148 + virtual ARCSAbstractComponent* genuineClone () { return 0; }
149 + virtual QVariant getGenuineComponentInstance() { return QVariant(); }
150 +
151 +
152 +
153 +private:
154 + ARCSNetworkServer();
155 + static ARCSNetworkServer* instance;
156 + bool inEventMode;
157 +
158 + ARCSNetworkThreadedServer* server;
159 +
160 +
161 + quint16 port;
162 + ARCSAbstractComponent* interface;
163 +
164 + // a server will have to maintain a list of proxy objects.
165 + QList<ARCSNetworkProxySignal*> proxySignals ;
166 + QHash<QString, int> proxySignalsMap;
167 +
168 + QHash<QString, ARCSNetworkProxySlot*> proxySlots;
169 +
170 +
171 +};
172 +
173 +
174 +#endif // __ARCSNETWORKSERVER_H__
1 +<library>
2 + <headers>
3 + <header name="arcsnetworkfamily.h"/>
4 + <header name="arcsnetworkcomponent.h"/>
5 + <header name="arcsnetworkconfigurator.h"/>
6 +
7 + </headers>
8 + <components>
9 + <component name="ARCSNetworkConfigurator"/>
10 + </components>
11 + <families>
12 + <family name="ARCSNetworkFamily"/>
13 + </families>
14 +</library>
1 +/****************************************************************************
2 +** Meta object code from reading C++ file 'arcsnetworkconfigurator.h'
3 +**
4 +** Created: Thu Jul 25 19:38:39 2013
5 +** by: The Qt Meta Object Compiler version 63 (Qt 4.8.4)
6 +**
7 +** WARNING! All changes made in this file will be lost!
8 +*****************************************************************************/
9 +
10 +#include "arcsnetworkconfigurator.h"
11 +#if !defined(Q_MOC_OUTPUT_REVISION)
12 +#error "The header file 'arcsnetworkconfigurator.h' doesn't include <QObject>."
13 +#elif Q_MOC_OUTPUT_REVISION != 63
14 +#error "This file was generated using the moc from 4.8.4. It"
15 +#error "cannot be used with the include files from this version of Qt."
16 +#error "(The moc has changed too much.)"
17 +#endif
18 +
19 +QT_BEGIN_MOC_NAMESPACE
20 +static const uint qt_meta_data_ARCSNetworkConfigurator[] = {
21 +
22 + // content:
23 + 6, // revision
24 + 0, // classname
25 + 0, 0, // classinfo
26 + 2, 14, // methods
27 + 0, 0, // properties
28 + 0, 0, // enums/sets
29 + 0, 0, // constructors
30 + 0, // flags
31 + 0, // signalCount
32 +
33 + // slots: signature, parameters, type, tag, flags
34 + 27, 25, 24, 24, 0x0a,
35 + 51, 49, 24, 24, 0x0a,
36 +
37 + 0 // eod
38 +};
39 +
40 +static const char qt_meta_stringdata_ARCSNetworkConfigurator[] = {
41 + "ARCSNetworkConfigurator\0\0s\0"
42 + "setInterface(QString)\0i\0setPort(int)\0"
43 +};
44 +
45 +void ARCSNetworkConfigurator::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a)
46 +{
47 + if (_c == QMetaObject::InvokeMetaMethod) {
48 + Q_ASSERT(staticMetaObject.cast(_o));
49 + ARCSNetworkConfigurator *_t = static_cast<ARCSNetworkConfigurator *>(_o);
50 + switch (_id) {
51 + case 0: _t->setInterface((*reinterpret_cast< QString(*)>(_a[1]))); break;
52 + case 1: _t->setPort((*reinterpret_cast< int(*)>(_a[1]))); break;
53 + default: ;
54 + }
55 + }
56 +}
57 +
58 +const QMetaObjectExtraData ARCSNetworkConfigurator::staticMetaObjectExtraData = {
59 + 0, qt_static_metacall
60 +};
61 +
62 +const QMetaObject ARCSNetworkConfigurator::staticMetaObject = {
63 + { &QObject::staticMetaObject, qt_meta_stringdata_ARCSNetworkConfigurator,
64 + qt_meta_data_ARCSNetworkConfigurator, &staticMetaObjectExtraData }
65 +};
66 +
67 +#ifdef Q_NO_DATA_RELOCATION
68 +const QMetaObject &ARCSNetworkConfigurator::getStaticMetaObject() { return staticMetaObject; }
69 +#endif //Q_NO_DATA_RELOCATION
70 +
71 +const QMetaObject *ARCSNetworkConfigurator::metaObject() const
72 +{
73 + return QObject::d_ptr->metaObject ? QObject::d_ptr->metaObject : &staticMetaObject;
74 +}
75 +
76 +void *ARCSNetworkConfigurator::qt_metacast(const char *_clname)
77 +{
78 + if (!_clname) return 0;
79 + if (!strcmp(_clname, qt_meta_stringdata_ARCSNetworkConfigurator))
80 + return static_cast<void*>(const_cast< ARCSNetworkConfigurator*>(this));
81 + return QObject::qt_metacast(_clname);
82 +}
83 +
84 +int ARCSNetworkConfigurator::qt_metacall(QMetaObject::Call _c, int _id, void **_a)
85 +{
86 + _id = QObject::qt_metacall(_c, _id, _a);
87 + if (_id < 0)
88 + return _id;
89 + if (_c == QMetaObject::InvokeMetaMethod) {
90 + if (_id < 2)
91 + qt_static_metacall(this, _c, _id, _a);
92 + _id -= 2;
93 + }
94 + return _id;
95 +}
96 +QT_END_MOC_NAMESPACE
1 +/****************************************************************************
2 +** Meta object code from reading C++ file 'arcsnetworkserver.h'
3 +**
4 +** Created: Thu Jul 25 19:38:39 2013
5 +** by: The Qt Meta Object Compiler version 63 (Qt 4.8.4)
6 +**
7 +** WARNING! All changes made in this file will be lost!
8 +*****************************************************************************/
9 +
10 +#include "arcsnetworkserver.h"
11 +#if !defined(Q_MOC_OUTPUT_REVISION)
12 +#error "The header file 'arcsnetworkserver.h' doesn't include <QObject>."
13 +#elif Q_MOC_OUTPUT_REVISION != 63
14 +#error "This file was generated using the moc from 4.8.4. It"
15 +#error "cannot be used with the include files from this version of Qt."
16 +#error "(The moc has changed too much.)"
17 +#endif
18 +
19 +QT_BEGIN_MOC_NAMESPACE
20 +static const uint qt_meta_data_ARCSNetworkServerThread[] = {
21 +
22 + // content:
23 + 6, // revision
24 + 0, // classname
25 + 0, 0, // classinfo
26 + 0, 0, // methods
27 + 0, 0, // properties
28 + 0, 0, // enums/sets
29 + 0, 0, // constructors
30 + 0, // flags
31 + 0, // signalCount
32 +
33 + 0 // eod
34 +};
35 +
36 +static const char qt_meta_stringdata_ARCSNetworkServerThread[] = {
37 + "ARCSNetworkServerThread\0"
38 +};
39 +
40 +void ARCSNetworkServerThread::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a)
41 +{
42 + Q_UNUSED(_o);
43 + Q_UNUSED(_id);
44 + Q_UNUSED(_c);
45 + Q_UNUSED(_a);
46 +}
47 +
48 +const QMetaObjectExtraData ARCSNetworkServerThread::staticMetaObjectExtraData = {
49 + 0, qt_static_metacall
50 +};
51 +
52 +const QMetaObject ARCSNetworkServerThread::staticMetaObject = {
53 + { &QThread::staticMetaObject, qt_meta_stringdata_ARCSNetworkServerThread,
54 + qt_meta_data_ARCSNetworkServerThread, &staticMetaObjectExtraData }
55 +};
56 +
57 +#ifdef Q_NO_DATA_RELOCATION
58 +const QMetaObject &ARCSNetworkServerThread::getStaticMetaObject() { return staticMetaObject; }
59 +#endif //Q_NO_DATA_RELOCATION
60 +
61 +const QMetaObject *ARCSNetworkServerThread::metaObject() const
62 +{
63 + return QObject::d_ptr->metaObject ? QObject::d_ptr->metaObject : &staticMetaObject;
64 +}
65 +
66 +void *ARCSNetworkServerThread::qt_metacast(const char *_clname)
67 +{
68 + if (!_clname) return 0;
69 + if (!strcmp(_clname, qt_meta_stringdata_ARCSNetworkServerThread))
70 + return static_cast<void*>(const_cast< ARCSNetworkServerThread*>(this));
71 + return QThread::qt_metacast(_clname);
72 +}
73 +
74 +int ARCSNetworkServerThread::qt_metacall(QMetaObject::Call _c, int _id, void **_a)
75 +{
76 + _id = QThread::qt_metacall(_c, _id, _a);
77 + if (_id < 0)
78 + return _id;
79 + return _id;
80 +}
81 +static const uint qt_meta_data_ARCSNetworkThreadedServer[] = {
82 +
83 + // content:
84 + 6, // revision
85 + 0, // classname
86 + 0, 0, // classinfo
87 + 0, 0, // methods
88 + 0, 0, // properties
89 + 0, 0, // enums/sets
90 + 0, 0, // constructors
91 + 0, // flags
92 + 0, // signalCount
93 +
94 + 0 // eod
95 +};
96 +
97 +static const char qt_meta_stringdata_ARCSNetworkThreadedServer[] = {
98 + "ARCSNetworkThreadedServer\0"
99 +};
100 +
101 +void ARCSNetworkThreadedServer::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a)
102 +{
103 + Q_UNUSED(_o);
104 + Q_UNUSED(_id);
105 + Q_UNUSED(_c);
106 + Q_UNUSED(_a);
107 +}
108 +
109 +const QMetaObjectExtraData ARCSNetworkThreadedServer::staticMetaObjectExtraData = {
110 + 0, qt_static_metacall
111 +};
112 +
113 +const QMetaObject ARCSNetworkThreadedServer::staticMetaObject = {
114 + { &QTcpServer::staticMetaObject, qt_meta_stringdata_ARCSNetworkThreadedServer,
115 + qt_meta_data_ARCSNetworkThreadedServer, &staticMetaObjectExtraData }
116 +};
117 +
118 +#ifdef Q_NO_DATA_RELOCATION
119 +const QMetaObject &ARCSNetworkThreadedServer::getStaticMetaObject() { return staticMetaObject; }
120 +#endif //Q_NO_DATA_RELOCATION
121 +
122 +const QMetaObject *ARCSNetworkThreadedServer::metaObject() const
123 +{
124 + return QObject::d_ptr->metaObject ? QObject::d_ptr->metaObject : &staticMetaObject;
125 +}
126 +
127 +void *ARCSNetworkThreadedServer::qt_metacast(const char *_clname)
128 +{
129 + if (!_clname) return 0;
130 + if (!strcmp(_clname, qt_meta_stringdata_ARCSNetworkThreadedServer))
131 + return static_cast<void*>(const_cast< ARCSNetworkThreadedServer*>(this));
132 + return QTcpServer::qt_metacast(_clname);
133 +}
134 +
135 +int ARCSNetworkThreadedServer::qt_metacall(QMetaObject::Call _c, int _id, void **_a)
136 +{
137 + _id = QTcpServer::qt_metacall(_c, _id, _a);
138 + if (_id < 0)
139 + return _id;
140 + return _id;
141 +}
142 +static const uint qt_meta_data_ARCSNetworkServer[] = {
143 +
144 + // content:
145 + 6, // revision
146 + 0, // classname
147 + 0, 0, // classinfo
148 + 0, 0, // methods
149 + 0, 0, // properties
150 + 0, 0, // enums/sets
151 + 0, 0, // constructors
152 + 0, // flags
153 + 0, // signalCount
154 +
155 + 0 // eod
156 +};
157 +
158 +static const char qt_meta_stringdata_ARCSNetworkServer[] = {
159 + "ARCSNetworkServer\0"
160 +};
161 +
162 +void ARCSNetworkServer::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a)
163 +{
164 + Q_UNUSED(_o);
165 + Q_UNUSED(_id);
166 + Q_UNUSED(_c);
167 + Q_UNUSED(_a);
168 +}
169 +
170 +const QMetaObjectExtraData ARCSNetworkServer::staticMetaObjectExtraData = {
171 + 0, qt_static_metacall
172 +};
173 +
174 +const QMetaObject ARCSNetworkServer::staticMetaObject = {
175 + { &QThread::staticMetaObject, qt_meta_stringdata_ARCSNetworkServer,
176 + qt_meta_data_ARCSNetworkServer, &staticMetaObjectExtraData }
177 +};
178 +
179 +#ifdef Q_NO_DATA_RELOCATION
180 +const QMetaObject &ARCSNetworkServer::getStaticMetaObject() { return staticMetaObject; }
181 +#endif //Q_NO_DATA_RELOCATION
182 +
183 +const QMetaObject *ARCSNetworkServer::metaObject() const
184 +{
185 + return QObject::d_ptr->metaObject ? QObject::d_ptr->metaObject : &staticMetaObject;
186 +}
187 +
188 +void *ARCSNetworkServer::qt_metacast(const char *_clname)
189 +{
190 + if (!_clname) return 0;
191 + if (!strcmp(_clname, qt_meta_stringdata_ARCSNetworkServer))
192 + return static_cast<void*>(const_cast< ARCSNetworkServer*>(this));
193 + if (!strcmp(_clname, "ARCSAbstractComponent"))
194 + return static_cast< ARCSAbstractComponent*>(const_cast< ARCSNetworkServer*>(this));
195 + return QThread::qt_metacast(_clname);
196 +}
197 +
198 +int ARCSNetworkServer::qt_metacall(QMetaObject::Call _c, int _id, void **_a)
199 +{
200 + _id = QThread::qt_metacall(_c, _id, _a);
201 + if (_id < 0)
202 + return _id;
203 + return _id;
204 +}
205 +QT_END_MOC_NAMESPACE
1 +unix:TEMPLATE = lib
2 +win32:TEMPLATE = lib
3 +INCLUDEPATH += $$(ARCSDIR)/include
4 +INCLUDEPATH +=.
5 +LIBRARIES += -L$$(ARCSDIR)/lib \
6 + -larcs
7 +LIBS += -L$$(ARCSDIR)/lib \
8 + -larcs
9 +CONFIG += dll
10 +QT = core \
11 + network
12 +
13 +DESTDIR=../libs
14 +DLLDESTDIR=../libs
15 +
16 +HEADERS += arcsnetworkcomponent.h \
17 + arcsnetworkfamily.h \
18 + arcsnetworkserver.h \
19 + arcsnetworkframes.h \
20 + arcsnetworkconfigurator.h \
21 + arcsnetworkproxyslot.h \
22 + arcsnetworkproxysignal.h
23 +HEADERS +=
24 +SOURCES += arcsnetworkcomponent.cpp \
25 + arcsnetworkserver.cpp \
26 + arcsnetworkframes.cpp \
27 + arcsnetworkproxyslot.cpp \
28 + arcsnetworkproxysignal.cpp
29 +SOURCES +=
30 +ALXFILE = libnetwork.alx
31 +OTHER_FILES += libnetwork.alx
32 +arcslibrary.output = alm_${QMAKE_FILE_BASE}.cpp
33 +arcslibrary.input = ALXFILE
34 +arcslibrary.commands = arcslibmaker \
35 + ${QMAKE_FILE_NAME}
36 +arcslibrary.variable_out = SOURCES
37 +QMAKE_EXTRA_COMPILERS += arcslibrary