Пример #1
0
ProtocolHandler::ErrorCode BuiltinProtocolHandlersLocal::open(const Uri &uri, iint32 openMode)
{
    if (!d->m_opened.empty() && d->m_opened.isValid()) {
        IDEAL_DEBUG_WARNING("the uri " << d->m_opened.uri() << " was opened. Closing");
        close();
    }
    d->m_opened = uri;
    if (!uri.isValid()) {
        return InvalidURI;
    }
    iint32 oflag = 0;
    if ((openMode & Read) && (openMode & Write)) {
        oflag = O_RDWR;
    } else if (openMode & Read) {
        oflag = O_RDONLY;
    } else {
        oflag = O_WRONLY;
    }
    d->m_fd = ::open(uri.path().data(), oflag);
    if (d->m_fd > -1) {
        return NoError;
    }
    switch (errno) {
        case EACCES:
            return InsufficientPermissions;
            break;
        default:
            return UnknownError;
            break;
    }
}
Пример #2
0
ProtocolHandler::ErrorCode BuiltinProtocolHandlersHttp::open(const Uri &uri, iint32 openMode)
{
    if (!uri.isValid()) {
        return InvalidURI;
    }
    d->m_uri = uri;
    d->m_sockfd = ::socket(AF_INET, SOCK_STREAM, 0);
    if (d->m_sockfd == -1) {
        switch(errno) {
            case EACCES:
                return InsufficientPermissions;
                break;
            default:
                return UnknownError;
                break;
        }
    }
    struct hostent *const host = ::gethostbyname(uri.host().data());
    if (!host) {
        switch (h_errno) {
            case HOST_NOT_FOUND:
                return CouldNotResolveHost;
                break;
            default:
                return UnknownError;
                break;
        }
    }
    struct sockaddr_in destAddr;
    destAddr.sin_family = AF_INET;
    destAddr.sin_port = htons(uri.port() == -1 ? 80 : uri.port());
    destAddr.sin_addr.s_addr = ::inet_addr(inet_ntoa(*((struct in_addr*) host->h_addr)));
    memset(&(destAddr.sin_zero), '\0', 8);
    if (!::connect(d->m_sockfd, (struct sockaddr*) &destAddr, sizeof(struct sockaddr))) {
        d->sendCommand(Private::Get, uri);
    }
    switch(errno) {
        case EADDRNOTAVAIL:
        case ECONNREFUSED:
        case ENETUNREACH:
        case ETIMEDOUT:
            return CouldNotConnect;
            break;
        default:
            return UnknownError;
            break;
    }
}