qmsk/net/socket/_address.pyx
author Tero Marttila <terom@fixme.fi>
Mon, 05 Oct 2009 17:12:29 +0300
changeset 58 ecd89f9605ac
parent 49 e2f79e68418a
permissions -rw-r--r--
use logging for nc.py


cdef class sockaddr :
    cdef void _init_family (self, platform.sa_family_t family=platform.AF_UNSPEC) :
        self.family = family

    # XXX:use size_t
    cdef int _get_sockaddr (self, platform.sockaddr **sa_ptr, platform.socklen_t *sa_len) except -1 :
        """
            Get the sockaddr pointer and sockaddr length for this address
        """ 

        raise NotImplementedError()

    cdef platform.sockaddr* _get_sockaddr_ptr (self) except NULL :
        """
            Get the sockaddr pointer
        """

        cdef platform.sockaddr *sa
        cdef platform.socklen_t sa_len

        self._get_sockaddr(&sa, &sa_len)

        return sa
    
    cdef platform.socklen_t _get_sockaddr_len (self) except -1 :
        """
            Get the sockaddr len
        """

        cdef platform.sockaddr *sa
        cdef platform.socklen_t sa_len

        self._get_sockaddr(&sa, &sa_len)

        return sa_len

    cdef int _set_sockaddr (self, platform.sockaddr *sa, size_t sa_len) except -1 :
        """
            Set the sockaddr value for this address; sa_len must match!
        """

        raise NotImplementedError()

    def getnameinfo (self) :
        """
            Returns a (host, serv) tuple for this address à la getnameinfo

            >>> addr = sockaddr_in()
            >>> assert addr.getnameinfo() == (addr.addr, str(addr.port))
        """

        cdef platform.sockaddr *sa
        cdef platform.socklen_t sa_len

        # XXX: take as args?
        cdef int flags = platform.NI_NUMERICHOST | platform.NI_NUMERICSERV
        
        # get our abstract sockaddr
        self._get_sockaddr(&sa, &sa_len)

        # get nice text format
        return platform.getnameinfo(sa, sa_len, flags)

    property addr :
        """
            The ASCII literal network address
        """

        def __get__ (self) :
            """
                Default implmentation using getnameinfo()
            """

            addr, port = self.getnameinfo()

            return addr

    property port :
        """
            The integer port number
        """

        def __get__ (self) :
            """
                Default implementation using getnameinfo() and int()
            """

            addr, port = self.getnameinfo()

            return int(port)
    
    def __repr__ (self) :
        return "sockaddr(%d, %s, %d)" % (self.family, self.addr, self.port)