Ejemplo n.º 1
0
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());
    }
}
Ejemplo n.º 2
0
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
}
Ejemplo n.º 3
0
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);
}