Jean-Yves Didier

Correction de certaines fuites mémoires, homogénéisation des codes

d'erreur.
This diff is collapsed. Click to expand it.
...@@ -45,30 +45,36 @@ QHash<int,QString> ARCS::Network::initErrors() ...@@ -45,30 +45,36 @@ QHash<int,QString> ARCS::Network::initErrors()
45 res[404]="CALL_REQUEST: wrong signal name (%1)"; 45 res[404]="CALL_REQUEST: wrong signal name (%1)";
46 46
47 res[405]="IFACE_REQUEST: time out with error '%1'"; 47 res[405]="IFACE_REQUEST: time out with error '%1'";
48 + res[409]="IFACE_REQUEST: network error (while writing frame): '%1'";
48 49
49 res[413]="CONNECT_REQUEST: wrong destination (%1)"; 50 res[413]="CONNECT_REQUEST: wrong destination (%1)";
50 res[414]="CONNECT_REQUEST: wrong port number (%1)"; 51 res[414]="CONNECT_REQUEST: wrong port number (%1)";
51 res[415]="CONNECT_REQUEST: wrong slot name (%1)"; 52 res[415]="CONNECT_REQUEST: wrong slot name (%1)";
52 - res[416]="CONNECT_REQUEST: received invalid response"; 53 + res[417]="CONNECT_REQUEST: network error (while connecting): '%1'";
53 - res[417]="CONNECT_REQUEST: received null response"; 54 + res[418]="CONNECT_REQUEST: network error (while reading frame): '%1'";
54 - res[418]="CONNECT_REQUEST: network error '%1'"; 55 + res[419]="CONNECT_REQUEST: network error (while writing frame): '%1'";
55 - res[419]="CONNECT_REQUEST: network error '%1'";
56 56
57 res[424]="DISCONNECT_REQUEST: wrong source name (%1)"; 57 res[424]="DISCONNECT_REQUEST: wrong source name (%1)";
58 - res[429]="DISCONNECT_REQUEST: network error '%1'"; 58 + res[427]="DISCONNECT_REQUEST: network error (while connecting): '%1'";
59 + res[429]="DISCONNECT_REQUEST: network error (while writing frame): '%1'";
59 60
60 res[435]="SLOT_REQUEST: wrong slot name (%1)"; 61 res[435]="SLOT_REQUEST: wrong slot name (%1)";
61 - // classification hasardeuse 62 + res[437]="SLOT_REQUEST: network error (while connecting): '%1'";
62 - res[439]="SLOT_REQUEST: network error '%1'"; 63 + res[438]="SLOT_REQUEST: network error (while reading frame): '%1'";
64 + res[439]="SLOT_REQUEST: network error (while writing frame): '%1'";
63 65
64 res[440]="SIGNAL_REQUEST: wrong id (%1)"; 66 res[440]="SIGNAL_REQUEST: wrong id (%1)";
65 res[441]="SIGNAL_REQUEST: wrong port number (%1)"; 67 res[441]="SIGNAL_REQUEST: wrong port number (%1)";
66 res[444]="SIGNAL_REQUEST: wrong signal name (%1)"; 68 res[444]="SIGNAL_REQUEST: wrong signal name (%1)";
69 + res[447]="SIGNAL_REQUEST: network error (while connecting): '%1'";
67 // classification hasardeuse 70 // classification hasardeuse
68 - res[449]="SIGNAL_REQUEST: network error '%1'"; 71 + res[449]="SIGNAL_REQUEST: network error (while writing frame): '%1'";
69 72
70 res[467]="IFACE_RESPONSE: received invalid response"; 73 res[467]="IFACE_RESPONSE: received invalid response";
71 - res[468]="IFACE_RESPONSE: received null response"; 74 + res[468]="IFACE_RESPONSE: network error (while reading frame): '%1'";
75 +
76 + res[486]="SLOT_RESPONSE: received invalid response";
77 + res[488]="SLOT_RESPONSE: network error (while reading frame): '%1'";
72 78
73 79
74 /////////////////////////////////////////////////////////////////////////// 80 ///////////////////////////////////////////////////////////////////////////
...@@ -129,6 +135,7 @@ void ARCSNetworkFrame::setType(ARCSNetworkFrames t) ...@@ -129,6 +135,7 @@ void ARCSNetworkFrame::setType(ARCSNetworkFrames t)
129 break; 135 break;
130 case SLOT_RESPONSE: 136 case SLOT_RESPONSE:
131 data = new ARCSNetworkSlotResponse(); // nouvelle trame 137 data = new ARCSNetworkSlotResponse(); // nouvelle trame
138 + break;
132 default: 139 default:
133 type = INVALID; 140 type = INVALID;
134 data = 0 ; 141 data = 0 ;
...@@ -145,10 +152,7 @@ ARCSNetworkFrame* ARCSNetworkFrame::readFrame(QIODevice* device) ...@@ -145,10 +152,7 @@ ARCSNetworkFrame* ARCSNetworkFrame::readFrame(QIODevice* device)
145 while (device->bytesAvailable() < (int)sizeof(quint32)) 152 while (device->bytesAvailable() < (int)sizeof(quint32))
146 { 153 {
147 if (!device->waitForReadyRead(TimeOut)) 154 if (!device->waitForReadyRead(TimeOut))
148 - {
149 - std::cerr << "[Network] Read type - " << qPrintable(device->errorString()) << std::endl;
150 return 0; 155 return 0;
151 - }
152 } 156 }
153 157
154 quint32 blockSize; 158 quint32 blockSize;
...@@ -160,10 +164,7 @@ ARCSNetworkFrame* ARCSNetworkFrame::readFrame(QIODevice* device) ...@@ -160,10 +164,7 @@ ARCSNetworkFrame* ARCSNetworkFrame::readFrame(QIODevice* device)
160 while (device->bytesAvailable() < blockSize) 164 while (device->bytesAvailable() < blockSize)
161 { 165 {
162 if (!device->waitForReadyRead(TimeOut)) 166 if (!device->waitForReadyRead(TimeOut))
163 - {
164 - std::cerr << "[Network] Read data - " << qPrintable(device->errorString()) << std::endl;
165 return 0; 167 return 0;
166 - }
167 } 168 }
168 169
169 ARCSNetworkFrame* frame = new ARCSNetworkFrame(); 170 ARCSNetworkFrame* frame = new ARCSNetworkFrame();
...@@ -172,7 +173,7 @@ ARCSNetworkFrame* ARCSNetworkFrame::readFrame(QIODevice* device) ...@@ -172,7 +173,7 @@ ARCSNetworkFrame* ARCSNetworkFrame::readFrame(QIODevice* device)
172 } 173 }
173 174
174 175
175 -void ARCSNetworkFrame::writeFrame(QIODevice* device) 176 +bool ARCSNetworkFrame::writeFrame(QIODevice* device)
176 { 177 {
177 QByteArray block; 178 QByteArray block;
178 179
...@@ -185,10 +186,10 @@ void ARCSNetworkFrame::writeFrame(QIODevice* device) ...@@ -185,10 +186,10 @@ void ARCSNetworkFrame::writeFrame(QIODevice* device)
185 186
186 device->write(block); 187 device->write(block);
187 188
188 - if (!device->waitForBytesWritten(TimeOut)) 189 + return device->waitForBytesWritten(TimeOut);
189 - { 190 + /*{
190 std::cerr << "[Network] Didn't wait enough to write all bytes" << std::endl; 191 std::cerr << "[Network] Didn't wait enough to write all bytes" << std::endl;
191 - } 192 + }*/
192 } 193 }
193 194
194 195
......
...@@ -64,7 +64,7 @@ public: ...@@ -64,7 +64,7 @@ public:
64 ARCSNetworkData* getData() const { return data; } 64 ARCSNetworkData* getData() const { return data; }
65 65
66 static ARCSNetworkFrame* readFrame(QIODevice* device); 66 static ARCSNetworkFrame* readFrame(QIODevice* device);
67 - void writeFrame(QIODevice* device); 67 + bool writeFrame(QIODevice* device);
68 static int TimeOut ; 68 static int TimeOut ;
69 69
70 private: 70 private:
...@@ -194,14 +194,14 @@ class ARCSNetworkSlotResponse : public ARCSNetworkData ...@@ -194,14 +194,14 @@ class ARCSNetworkSlotResponse : public ARCSNetworkData
194 public: 194 public:
195 ARCSNetworkSlotResponse() {} 195 ARCSNetworkSlotResponse() {}
196 196
197 - QString getSlot() { return slotName; } 197 + //QString getSlot() { return slotName; }
198 - void setSlot(QString s) { slotName = s ; } 198 + //void setSlot(QString s) { slotName = s ; }
199 int getId() { return id; } 199 int getId() { return id; }
200 void setId(int i) { id = i ;} 200 void setId(int i) { id = i ;}
201 - virtual void serialize(QDataStream& stream) { stream << id <<slotName ; } 201 + virtual void serialize(QDataStream& stream) { stream << id /*<<slotName*/ ; }
202 - virtual void deserialize(QDataStream& stream) { stream >> id >> slotName; } 202 + virtual void deserialize(QDataStream& stream) { stream >> id /*>> slotName*/; }
203 private: 203 private:
204 - QString slotName; 204 + //QString slotName;
205 int id; 205 int id;
206 }; 206 };
207 207
......
...@@ -24,7 +24,6 @@ void ARCSNetworkServerThread::handleRequest(QTcpSocket* socket) ...@@ -24,7 +24,6 @@ void ARCSNetworkServerThread::handleRequest(QTcpSocket* socket)
24 { 24 {
25 25
26 ARCSNetworkFrame* request = ARCSNetworkFrame::readFrame(socket); 26 ARCSNetworkFrame* request = ARCSNetworkFrame::readFrame(socket);
27 - //std::cout << "Recieved request" << request->getType() << std::endl;
28 if (request == 0) 27 if (request == 0)
29 { 28 {
30 ARCS::Network::logError(600); 29 ARCS::Network::logError(600);
...@@ -58,7 +57,7 @@ void ARCSNetworkServerThread::handleRequest(QTcpSocket* socket) ...@@ -58,7 +57,7 @@ void ARCSNetworkServerThread::handleRequest(QTcpSocket* socket)
58 ; 57 ;
59 }; 58 };
60 59
61 - // 3 dconnexion 60 + // 3 deconnexion
62 socket->disconnectFromHost(); 61 socket->disconnectFromHost();
63 delete request; 62 delete request;
64 } 63 }
...@@ -81,25 +80,19 @@ void ARCSNetworkServerThread::handleConnectRequest(ARCSNetworkConnectRequest* an ...@@ -81,25 +80,19 @@ void ARCSNetworkServerThread::handleConnectRequest(ARCSNetworkConnectRequest* an
81 80
82 ARCSNetworkFrame request(ARCSNetworkFrame::SLOT_REQUEST); 81 ARCSNetworkFrame request(ARCSNetworkFrame::SLOT_REQUEST);
83 ((ARCSNetworkSlotRequest*)request.getData())->setSlot(ancr->getSlot()); 82 ((ARCSNetworkSlotRequest*)request.getData())->setSlot(ancr->getSlot());
84 - //std::cout << "liste de slots reu " << qPrintable(ancr->getSlot()) << std::endl;
85 - /** implementation sans aucun sens
86 - if ( !(request.isValid()))
87 - {
88 - std::cerr <<"Erreur 436 : SLOT_REQUEST error : Trame invalide"<< std::endl;
89 - }*/
90 request.writeFrame(socketDest); 83 request.writeFrame(socketDest);
91 84
92 ARCSNetworkFrame* response = ARCSNetworkFrame::readFrame(socketDest); 85 ARCSNetworkFrame* response = ARCSNetworkFrame::readFrame(socketDest);
93 if (response ) 86 if (response )
94 { 87 {
95 - if (response->getType() != ARCSNetworkFrame::CONNECT_RESPONSE) 88 + if (response->getType() != ARCSNetworkFrame::SLOT_RESPONSE)
96 //! \todo process if it is an error frame 89 //! \todo process if it is an error frame
97 - ARCS::Network::logError(416); 90 + ARCS::Network::logError(486);
98 else 91 else
99 - id = ((ARCSNetworkConnectResponse*)response->getData())->getId(); 92 + id = ((ARCSNetworkSlotResponse*)response->getData())->getId();
100 } 93 }
101 else 94 else
102 - ARCS::Network::logError(417); 95 + ARCS::Network::logError(488);
103 96
104 97
105 socketDest->disconnectFromHost(); 98 socketDest->disconnectFromHost();
...@@ -113,32 +106,16 @@ void ARCSNetworkServerThread::handleConnectRequest(ARCSNetworkConnectRequest* an ...@@ -113,32 +106,16 @@ void ARCSNetworkServerThread::handleConnectRequest(ARCSNetworkConnectRequest* an
113 ARCSNetworkFrame frame(ARCSNetworkFrame::ACK_RESPONSE); 106 ARCSNetworkFrame frame(ARCSNetworkFrame::ACK_RESPONSE);
114 ((ARCSNetworkAckResponse*)frame.getData())->setId(id); // utilit du id ? 107 ((ARCSNetworkAckResponse*)frame.getData())->setId(id); // utilit du id ?
115 frame.writeFrame(socket); 108 frame.writeFrame(socket);
116 - /** implementation sans aucun sens
117 - if ((QString*)ARCSNetworkServer::getInstance()->getSignals()!=ancr->getSignal())
118 - {
119 - std::cerr << "Erreur 444 :SIGNAL_REQUEST error : signal name not found " << qPrintable(socket->errorString()) << std::endl;
120 - return ;
121 - }*/
122 -
123 } 109 }
124 110
125 111
126 void ARCSNetworkServerThread::handleSlotRequest(ARCSNetworkSlotRequest* ansr, QTcpSocket* socket) 112 void ARCSNetworkServerThread::handleSlotRequest(ARCSNetworkSlotRequest* ansr, QTcpSocket* socket)
127 { 113 {
128 int id = -1; 114 int id = -1;
129 - //std::cout << "[Server] Recieved a slot request on " << qPrintable(ansr->getSlot()) << std::endl;
130 id = ARCSNetworkServer::getInstance()->createSignalStub(ansr->getSlot()); 115 id = ARCSNetworkServer::getInstance()->createSignalStub(ansr->getSlot());
131 - //std::cout << "liste de slots " << qPrintable(ansr->getSlot()) << std::endl; 116 + ARCSNetworkFrame frame(ARCSNetworkFrame::SLOT_RESPONSE);
132 - //std::cout << "le id est " << id <<std::endl;
133 - ARCSNetworkFrame frame(ARCSNetworkFrame::CONNECT_RESPONSE);
134 - ((ARCSNetworkConnectResponse*)frame.getData())->setId(id);
135 - /** bricolage mal ralis
136 - *ARCSNetworkFrame frame(ARCSNetworkFrame::SLOT_RESPONSE);
137 ((ARCSNetworkSlotResponse*)frame.getData())->setId(id); 117 ((ARCSNetworkSlotResponse*)frame.getData())->setId(id);
138 - ((ARCSNetworkSlotResponse*)frame.getData())->setSlot(ansr->getSlot());*/
139 frame.writeFrame(socket); 118 frame.writeFrame(socket);
140 - /* if (ARCSNetworkServer::getInstance()->getSlots()!=ansr->getSlot())
141 - std::cerr <<"Erreur 435 : SLOT_REQUEST error : slot name is wrong: le nom du slot est erron " << std::endl;*/
142 } 119 }
143 120
144 121
...@@ -150,15 +127,6 @@ void ARCSNetworkServerThread::handleInterfaceRequest(QTcpSocket* socket) ...@@ -150,15 +127,6 @@ void ARCSNetworkServerThread::handleInterfaceRequest(QTcpSocket* socket)
150 ((ARCSNetworkInterfaceResponse*)frame.getData())->setSlots(slotList); 127 ((ARCSNetworkInterfaceResponse*)frame.getData())->setSlots(slotList);
151 ((ARCSNetworkInterfaceResponse*)frame.getData())->setSignals(signalList); 128 ((ARCSNetworkInterfaceResponse*)frame.getData())->setSignals(signalList);
152 frame.writeFrame(socket); 129 frame.writeFrame(socket);
153 - /** rien voir avec la smantique de la fonction
154 - if ((ARCSNetworkServer::getInstance()->getSignals())!=signalList)
155 - {
156 - std ::cerr <<"Erreur XXX :SIGNAL_REQUEST error : signal name not found"<< std::endl;
157 - }
158 - if ((ARCSNetworkServer::getInstance()->getSlots())!=slotList)
159 - {
160 - std ::cerr <<"Erreur XXX :SIGNAL_REQUEST error : signal name not found"<< std::endl;
161 - }*/
162 } 130 }
163 131
164 132
...@@ -168,17 +136,11 @@ void ARCSNetworkServerThread::handleDisconnectRequest(ARCSNetworkDisconnectReque ...@@ -168,17 +136,11 @@ void ARCSNetworkServerThread::handleDisconnectRequest(ARCSNetworkDisconnectReque
168 ARCSNetworkFrame frame(ARCSNetworkFrame::CONNECT_RESPONSE); 136 ARCSNetworkFrame frame(ARCSNetworkFrame::CONNECT_RESPONSE);
169 ((ARCSNetworkConnectResponse*)frame.getData())->setId(0); 137 ((ARCSNetworkConnectResponse*)frame.getData())->setId(0);
170 frame.writeFrame(socket); 138 frame.writeFrame(socket);
171 - /*if ((ARCSNetworkServer::getInstance()->getSignals())!=andr->getSignal())
172 - {
173 - std ::cerr <<"Erreur 424 :DISCONNECT_REQUEST error : signal name not found"<< std::endl;
174 - }*/
175 } 139 }
176 140
177 141
178 void ARCSNetworkServerThread::handleSignalRequest(ARCSNetworkSignalRequest* ansr, QTcpSocket* socket) 142 void ARCSNetworkServerThread::handleSignalRequest(ARCSNetworkSignalRequest* ansr, QTcpSocket* socket)
179 { 143 {
180 -
181 - //std::cout << "[Server] Recieved a signal connect on "<<
182 ARCSNetworkServer::getInstance()->createSlotStub(ansr->getSignal(), 144 ARCSNetworkServer::getInstance()->createSlotStub(ansr->getSignal(),
183 ansr->getId(), 145 ansr->getId(),
184 ansr->getPort(), 146 ansr->getPort(),
...@@ -186,27 +148,14 @@ void ARCSNetworkServerThread::handleSignalRequest(ARCSNetworkSignalRequest* ansr ...@@ -186,27 +148,14 @@ void ARCSNetworkServerThread::handleSignalRequest(ARCSNetworkSignalRequest* ansr
186 ARCSNetworkFrame frame(ARCSNetworkFrame::CONNECT_RESPONSE); 148 ARCSNetworkFrame frame(ARCSNetworkFrame::CONNECT_RESPONSE);
187 ((ARCSNetworkConnectResponse*)frame.getData())->setId(0); 149 ((ARCSNetworkConnectResponse*)frame.getData())->setId(0);
188 frame.writeFrame(socket); 150 frame.writeFrame(socket);
189 -
190 - /** pourrissage en rgle de code.
191 - if ((ARCSNetworkServer::getInstance()->getPort())!=ansr->getPort())
192 - {
193 - std::cerr <<"Erreur 441: SIGNAL _REQUEST error : port number is false"<< std::endl;
194 - }
195 - if ((ARCSNetworkServer::getInstance()->getSignals())!=ansr->getSignal())
196 - {
197 - std ::cerr <<"Erreur 444 :SIGNAL_REQUEST error : signal name not found"<< std::endl;
198 - }*/
199 -
200 } 151 }
201 152
202 153
203 void ARCSNetworkServerThread::handleCallRequest(ARCSNetworkCallRequest* ancr, QTcpSocket* socket) 154 void ARCSNetworkServerThread::handleCallRequest(ARCSNetworkCallRequest* ancr, QTcpSocket* socket)
204 { 155 {
205 - //std::cout << "[Server] Recieved a call request." << std::endl;
206 ARCSNetworkServer::getInstance()->call(ancr->getId(), ancr->getParams()); 156 ARCSNetworkServer::getInstance()->call(ancr->getId(), ancr->getParams());
207 ARCSNetworkFrame frame(ARCSNetworkFrame::ACK_RESPONSE); 157 ARCSNetworkFrame frame(ARCSNetworkFrame::ACK_RESPONSE);
208 ((ARCSNetworkAckResponse*)frame.getData())->setId(0); // utilit du id ? 158 ((ARCSNetworkAckResponse*)frame.getData())->setId(0); // utilit du id ?
209 - //std::cout<< "Acquittement: paquets reus !" << std::endl;
210 frame.writeFrame(socket); 159 frame.writeFrame(socket);
211 } 160 }
212 161
...@@ -265,8 +214,6 @@ void ARCSNetworkServer::run() ...@@ -265,8 +214,6 @@ void ARCSNetworkServer::run()
265 void ARCSNetworkServer::setInterface(QString name) 214 void ARCSNetworkServer::setInterface(QString name)
266 { 215 {
267 interface = ARCSApplicationComponent::getRunningInstance()->getContext()->getComponent(name); 216 interface = ARCSApplicationComponent::getRunningInstance()->getContext()->getComponent(name);
268 - //std::cout << "le nom du composant est "<< qPrintable(getComponent(name)) << std::endl;
269 -
270 } 217 }
271 218
272 219
...@@ -279,7 +226,6 @@ void ARCSNetworkServer::getInterface(QStringList & slotList, QStringList & signa ...@@ -279,7 +226,6 @@ void ARCSNetworkServer::getInterface(QStringList & slotList, QStringList & signa
279 } 226 }
280 else 227 else
281 ARCS::Network::logError(603); 228 ARCS::Network::logError(603);
282 -
283 } 229 }
284 230
285 void ARCSNetworkServer::startServer() 231 void ARCSNetworkServer::startServer()
...@@ -310,7 +256,6 @@ int ARCSNetworkServer::createSignalStub(QString s) ...@@ -310,7 +256,6 @@ int ARCSNetworkServer::createSignalStub(QString s)
310 id = proxySignalsMap[s]; 256 id = proxySignalsMap[s];
311 else 257 else
312 { 258 {
313 -
314 ARCSNetworkProxySignal* ans = new ARCSNetworkProxySignal(this); 259 ARCSNetworkProxySignal* ans = new ARCSNetworkProxySignal(this);
315 ans->setSignal(s); 260 ans->setSignal(s);
316 proxySignals.append(ans); 261 proxySignals.append(ans);
...@@ -320,11 +265,6 @@ int ARCSNetworkServer::createSignalStub(QString s) ...@@ -320,11 +265,6 @@ int ARCSNetworkServer::createSignalStub(QString s)
320 ARCSAbstractComponent::connect(s,interface, s); 265 ARCSAbstractComponent::connect(s,interface, s);
321 else 266 else
322 ARCS::Network::logError(603); 267 ARCS::Network::logError(603);
323 - /** bricolage hasardeux
324 - if (!interface)
325 - {
326 - std::cerr <<"Erreur 415 : CONNECT_REQUEST error : slot name is wrong : pas de cration de proxysignal" << std::endl;
327 - }*/
328 } 268 }
329 269
330 return id; 270 return id;
...@@ -345,8 +285,6 @@ int ARCSNetworkServer::createSlotStub(QString signal, int id, quint16 port,QStri ...@@ -345,8 +285,6 @@ int ARCSNetworkServer::createSlotStub(QString signal, int id, quint16 port,QStri
345 else 285 else
346 ARCS::Network::logError(603); 286 ARCS::Network::logError(603);
347 287
348 - /*std::cerr <<"Erreur 435x : SLOT_REQUEST error : slot name is wrong: pas de cration de proxyslot" << std::endl;*/
349 -
350 return 0; 288 return 0;
351 } 289 }
352 290
...@@ -369,19 +307,11 @@ ARCSNetworkProxySignal* ARCSNetworkServer::getProxySignal(QString s) ...@@ -369,19 +307,11 @@ ARCSNetworkProxySignal* ARCSNetworkServer::getProxySignal(QString s)
369 } 307 }
370 else 308 else
371 { 309 {
372 - //if (proxySignalsMap.contains(s)) --> pourrissage en rgle
373 - //{
374 proxy = new ARCSNetworkProxySignal(this); 310 proxy = new ARCSNetworkProxySignal(this);
375 proxy->setSignal(s); 311 proxy->setSignal(s);
376 proxySignals.append(proxy); 312 proxySignals.append(proxy);
377 proxy->setId(proxySignals.count()-1); 313 proxy->setId(proxySignals.count()-1);
378 proxySignalsMap.insert(s, proxySignals.count()-1); 314 proxySignalsMap.insert(s, proxySignals.count()-1);
379 - /** pourrissage en rgle }
380 - else
381 - {
382 - std::cerr << "Erreur 435 : SLOT_REQUEST error : slot name is not found: pas de cration de proxyslot"<< std::endl;
383 - }*/
384 -
385 } 315 }
386 return proxy; 316 return proxy;
387 } 317 }
......