diff options
Diffstat (limited to 'src/itoserver.cpp')
-rw-r--r-- | src/itoserver.cpp | 67 |
1 files changed, 66 insertions, 1 deletions
diff --git a/src/itoserver.cpp b/src/itoserver.cpp index 7426e8a..db5ae04 100644 --- a/src/itoserver.cpp +++ b/src/itoserver.cpp | |||
@@ -127,7 +127,8 @@ Bu::ItoServer::ItoClient::ItoClient( ItoServer &rSrv, int iSocket, int iPort, | |||
127 | FD_SET( iSocket, &fdActive ); | 127 | FD_SET( iSocket, &fdActive ); |
128 | 128 | ||
129 | pClient = new Client( | 129 | pClient = new Client( |
130 | new Bu::Socket( iSocket ) | 130 | new Bu::Socket( iSocket ), |
131 | new SrvClientLinkFactory( rSrv ) | ||
131 | ); | 132 | ); |
132 | } | 133 | } |
133 | 134 | ||
@@ -137,7 +138,10 @@ Bu::ItoServer::ItoClient::~ItoClient() | |||
137 | 138 | ||
138 | void *Bu::ItoServer::ItoClient::run() | 139 | void *Bu::ItoServer::ItoClient::run() |
139 | { | 140 | { |
141 | imProto.lock(); | ||
140 | rSrv.onNewConnection( pClient, iPort ); | 142 | rSrv.onNewConnection( pClient, iPort ); |
143 | pClient->processOutput(); | ||
144 | imProto.unlock(); | ||
141 | 145 | ||
142 | for(;;) | 146 | for(;;) |
143 | { | 147 | { |
@@ -151,14 +155,29 @@ void *Bu::ItoServer::ItoClient::run() | |||
151 | throw ExceptionBase("Error attempting to scan open connections."); | 155 | throw ExceptionBase("Error attempting to scan open connections."); |
152 | } | 156 | } |
153 | 157 | ||
158 | while( !qMsg.isEmpty() ) | ||
159 | { | ||
160 | imProto.lock(); | ||
161 | Bu::FString *pMsg = qMsg.dequeue(); | ||
162 | pClient->onMessage( *pMsg ); | ||
163 | delete pMsg; | ||
164 | pClient->processOutput(); | ||
165 | imProto.unlock(); | ||
166 | } | ||
167 | |||
154 | if( FD_ISSET( iSocket, &fdRead ) ) | 168 | if( FD_ISSET( iSocket, &fdRead ) ) |
155 | { | 169 | { |
170 | imProto.lock(); | ||
156 | pClient->processInput(); | 171 | pClient->processInput(); |
172 | imProto.unlock(); | ||
157 | if( !pClient->isOpen() ) | 173 | if( !pClient->isOpen() ) |
158 | { | 174 | { |
175 | imProto.lock(); | ||
159 | rSrv.onClosedConnection( pClient ); | 176 | rSrv.onClosedConnection( pClient ); |
177 | imProto.unlock(); | ||
160 | 178 | ||
161 | rSrv.clientCleanup( iSocket ); | 179 | rSrv.clientCleanup( iSocket ); |
180 | |||
162 | return NULL; | 181 | return NULL; |
163 | } | 182 | } |
164 | } | 183 | } |
@@ -166,9 +185,55 @@ void *Bu::ItoServer::ItoClient::run() | |||
166 | // Now we just try to write all the pending data on the socket. | 185 | // Now we just try to write all the pending data on the socket. |
167 | // this could be done better eventually, if we care about the socket | 186 | // this could be done better eventually, if we care about the socket |
168 | // wanting to accept writes (using a select). | 187 | // wanting to accept writes (using a select). |
188 | imProto.lock(); | ||
169 | pClient->processOutput(); | 189 | pClient->processOutput(); |
190 | imProto.unlock(); | ||
170 | } | 191 | } |
171 | 192 | ||
172 | return NULL; | 193 | return NULL; |
173 | } | 194 | } |
174 | 195 | ||
196 | Bu::ItoServer::SrvClientLink::SrvClientLink( ItoClient *pClient ) : | ||
197 | pClient( pClient ) | ||
198 | { | ||
199 | } | ||
200 | |||
201 | Bu::ItoServer::SrvClientLink::~SrvClientLink() | ||
202 | { | ||
203 | } | ||
204 | |||
205 | void Bu::ItoServer::SrvClientLink::sendMsg( const Bu::FString &sMsg ) | ||
206 | { | ||
207 | if( !pClient->imProto.trylock() ) | ||
208 | { | ||
209 | pClient->pClient->onMessage( sMsg ); | ||
210 | pClient->pClient->processOutput(); | ||
211 | pClient->imProto.unlock(); | ||
212 | } | ||
213 | else | ||
214 | { | ||
215 | Bu::FString *pMsg = new Bu::FString( sMsg ); | ||
216 | pClient->qMsg.enqueue( pMsg ); | ||
217 | } | ||
218 | } | ||
219 | |||
220 | Bu::ItoServer::SrvClientLinkFactory::SrvClientLinkFactory( | ||
221 | Bu::ItoServer &rSrv ) : | ||
222 | rSrv( rSrv ) | ||
223 | { | ||
224 | } | ||
225 | |||
226 | Bu::ItoServer::SrvClientLinkFactory::~SrvClientLinkFactory() | ||
227 | { | ||
228 | } | ||
229 | |||
230 | Bu::ClientLink *Bu::ItoServer::SrvClientLinkFactory::createLink( | ||
231 | Bu::Client *pClient ) | ||
232 | { | ||
233 | rSrv.imClients.lock(); | ||
234 | ItoClient *pCli = rSrv.hClients.get( *pClient->getSocket() ); | ||
235 | rSrv.imClients.unlock(); | ||
236 | |||
237 | return new SrvClientLink( pCli ); | ||
238 | } | ||
239 | |||