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 | |||
