void UI::handleEvent(Event *iEvent) { LOG("Handle new event, type: " << iEvent->sprint()); switch (iEvent->type()) { case RESOLVE_RES: handleResponseEvent(iEvent); break; case RESOLVE_ERR: handleErrorEvent(iEvent); break; default: LOG_ERROR("Cannot handle event, type: " << iEvent->sprint()); } }
bool AWSServerSocket::handleWritableEvent(ESFFlag *isRunning, ESFLogger *logger) { ESF_ASSERT(false == _hasBeenRemoved); ESF_ASSERT(_buffer); ESF_ASSERT(false == _inReadMode); ESF_ASSERT(_buffer->isReadable()); ESFSSize result = 0; ESFError error = ESF_SUCCESS; while (isRunning->get() && _buffer->isReadable()) { result = _socket.send(_buffer); if (0 > result) { error = ESFGetLastError(); if (ESF_AGAIN == error) { if (_logger->isLoggable(ESFLogger::Debug)) { _logger->log(ESFLogger::Debug, __FILE__, __LINE__, "[socket:%d] Not ready for write", _socket.getSocketDescriptor()); } return true; // keep in multiplexer } if (ESF_INTR == error) { if (_logger->isLoggable(ESFLogger::Debug)) { _logger->log(ESFLogger::Debug, __FILE__, __LINE__, "[socket:%d] Interrupted", _socket.getSocketDescriptor()); } continue; } return handleErrorEvent(error, isRunning, logger); } if (_logger->isLoggable(ESFLogger::Debug)) { _logger->log(ESFLogger::Debug, __FILE__, __LINE__, "[socket:%d] Wrote %d bytes", _socket.getSocketDescriptor(), result); } } if (! isRunning->get()) { return false; // remove from multiplexer } if (_logger->isLoggable(ESFLogger::Debug)) { _logger->log(ESFLogger::Debug, __FILE__, __LINE__, "[socket:%d] Sent complete response", _socket.getSocketDescriptor()); } _inReadMode = true; _buffer->compact(); _BufferPool.releaseBuffer(_buffer); _buffer = 0; return true; // keep in multiplexer }
bool AWSServerSocket::handleReadableEvent(ESFFlag *isRunning, ESFLogger *logger) { ESF_ASSERT(false == _hasBeenRemoved); if (0 == _buffer) { _buffer = _BufferPool.acquireBuffer(); if (! _buffer) { if (_logger->isLoggable(ESFLogger::Error)) { _logger->log(ESFLogger::Error, __FILE__, __LINE__, "[socket:%d] Cannot acquire new buffer", _socket.getSocketDescriptor()); } return false; // remove from multiplexer } } ESF_ASSERT(_inReadMode); ESF_ASSERT(_buffer->isWritable()); ESFSSize result = 0; ESFError error = ESF_SUCCESS; while (isRunning->get() && _buffer->isWritable()) { result = _socket.receive(_buffer); if (0 > result) { error = ESFGetLastError(); if (ESF_AGAIN == error) { if (_logger->isLoggable(ESFLogger::Debug)) { _logger->log(ESFLogger::Debug, __FILE__, __LINE__, "[socket:%d] not ready for read", _socket.getSocketDescriptor()); } return true; // keep in multiplexer } if (ESF_INTR == error) { if (_logger->isLoggable(ESFLogger::Debug)) { _logger->log(ESFLogger::Debug, __FILE__, __LINE__, "[socket:%d] interrupted", _socket.getSocketDescriptor()); } continue; } return handleErrorEvent(error, isRunning, logger); } if (0 == result) { return handleEndOfFileEvent(isRunning, logger); } if (_logger->isLoggable(ESFLogger::Debug)) { _logger->log(ESFLogger::Debug, __FILE__, __LINE__, "[socket:%d] Read %d bytes", _socket.getSocketDescriptor(), result); } } if (! isRunning->get()) { return false; // remove from multiplexer } if (_logger->isLoggable(ESFLogger::Debug)) { _logger->log(ESFLogger::Debug, __FILE__, __LINE__, "[socket:%d] Received complete request", _socket.getSocketDescriptor()); } _inReadMode = false; ESF_ASSERT(wantWrite()); return handleWritableEvent(isRunning, logger); }