# -*- coding: utf-8 -*-
#
# Copyright (C) 2015, Maximilian Köhl <mail@koehlma.de>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
from __future__ import print_function, unicode_literals, division
import enum
from .library import ffi, lib
__all__ = ['StatusCode', 'UVError', 'HandleClosedError']
[docs]class StatusCode(enum.IntEnum):
SUCCESS = 0
"""
Success.
"""
E2BIG = lib.UV_E2BIG
EACCES = lib.UV_EACCES
EADDRINUSE = lib.UV_EADDRINUSE
EADDRNOTAVAIL = lib.UV_EADDRNOTAVAIL
EAFNOSUPPORT = lib.UV_EAFNOSUPPORT
EAGAIN = lib.UV_EAGAIN
EAI_ADDRFAMILY = lib.UV_EAI_ADDRFAMILY
EAI_AGAIN = lib.UV_EAI_AGAIN
EAI_BADFLAGS = lib.UV_EAI_BADFLAGS
EAI_BADHINTS = lib.UV_EAI_BADHINTS
EAI_CANCELED = lib.UV_EAI_CANCELED
EAI_FAIL = lib.UV_EAI_FAIL
EAI_FAMILY = lib.UV_EAI_FAMILY
EAI_MEMORY = lib.UV_EAI_MEMORY
EAI_NODATA = lib.UV_EAI_NODATA
EAI_NONAME = lib.UV_EAI_NONAME
EAI_OVERFLOW = lib.UV_EAI_OVERFLOW
EAI_PROTOCOL = lib.UV_EAI_PROTOCOL
EAI_SERVICE = lib.UV_EAI_SERVICE
EAI_SOCKTYPE = lib.UV_EAI_SOCKTYPE
EALREADY = lib.UV_EALREADY
EBADF = lib.UV_EBADF
EBUSY = lib.UV_EBUSY
ECANCELED = lib.UV_ECANCELED
ECHARSET = lib.UV_ECHARSET
ECONNABORTED = lib.UV_ECONNABORTED
ECONNREFUSED = lib.UV_ECONNREFUSED
ECONNRESET = lib.UV_ECONNRESET
EDESTADDRREQ = lib.UV_EDESTADDRREQ
EEXIST = lib.UV_EEXIST
EFAULT = lib.UV_EFAULT
EFBIG = lib.UV_EFBIG
EHOSTUNREACH = lib.UV_EHOSTUNREACH
EINTR = lib.UV_EINTR
EINVAL = lib.UV_EINVAL
EIO = lib.UV_EIO
EISCONN = lib.UV_EISCONN
EISDIR = lib.UV_EISDIR
ELOOP = lib.UV_ELOOP
EMFILE = lib.UV_EMFILE
EMSGSIZE = lib.UV_EMSGSIZE
ENAMETOOLONG = lib.UV_ENAMETOOLONG
ENETDOWN = lib.UV_ENETDOWN
ENETUNREACH = lib.UV_ENETUNREACH
ENFILE = lib.UV_ENFILE
ENOBUFS = lib.UV_ENOBUFS
ENODEV = lib.UV_ENODEV
ENOENT = lib.UV_ENOENT
ENOMEM = lib.UV_ENOMEM
ENONET = lib.UV_ENONET
ENOPROTOOPT = lib.UV_ENOPROTOOPT
ENOSPC = lib.UV_ENOSPC
ENOSYS = lib.UV_ENOSYS
ENOTCONN = lib.UV_ENOTCONN
ENOTDIR = lib.UV_ENOTDIR
ENOTEMPTY = lib.UV_ENOTEMPTY
ENOTSOCK = lib.UV_ENOTSOCK
ENOTSUP = lib.UV_ENOTSUP
EPERM = lib.UV_EPERM
EPIPE = lib.UV_EPIPE
EPROTO = lib.UV_EPROTO
EPROTONOSUPPORT = lib.UV_EPROTONOSUPPORT
EPROTOTYPE = lib.UV_EPROTOTYPE
ERANGE = lib.UV_ERANGE
EROFS = lib.UV_EROFS
ESHUTDOWN = lib.UV_ESHUTDOWN
ESPIPE = lib.UV_ESPIPE
ESRCH = lib.UV_ESRCH
ETIMEDOUT = lib.UV_ETIMEDOUT
ETXTBSY = lib.UV_ETXTBSY
EXDEV = lib.UV_EXDEV
UNKNOWN = lib.UV_UNKNOWN
EOF = lib.UV_EOF
ENXIO = lib.UV_ENXIO
EMLINK = lib.UV_EMLINK
EHOSTDOWN = lib.UV_EHOSTDOWN
def get_status_code(code):
if not code: return StatusCode.SUCCESS
try: return StatusCode(code)
except ValueError: return code
[docs]class UVError(OSError):
def __init__(self, code, message=None):
try:
self.code = StatusCode(code)
self.name = ffi.string(lib.uv_err_name(code)).decode()
message = message or ffi.string(lib.uv_strerror(code)).decode()
except ValueError:
self.code = code
self.name = 'UNKNOWN'
message = 'some unknown error occoured'
super(UVError, self).__init__(code, '[%s] %s' % (self.name, message))
class ClosedError(UVError):
def __init__(self):
message = 'invalid operation on closed structure'
super(ClosedError, self).__init__(StatusCode.EINVAL, message)
[docs]class HandleClosedError(ClosedError): pass
[docs]class LoopClosedError(ClosedError): pass