qmsk/net/socket/_address.pyx
changeset 49 e2f79e68418a
equal deleted inserted replaced
48:ee7ade660c0b 49:e2f79e68418a
       
     1 
       
     2 
       
     3 cdef class sockaddr :
       
     4     cdef void _init_family (self, platform.sa_family_t family=platform.AF_UNSPEC) :
       
     5         self.family = family
       
     6 
       
     7     # XXX:use size_t
       
     8     cdef int _get_sockaddr (self, platform.sockaddr **sa_ptr, platform.socklen_t *sa_len) except -1 :
       
     9         """
       
    10             Get the sockaddr pointer and sockaddr length for this address
       
    11         """ 
       
    12 
       
    13         raise NotImplementedError()
       
    14 
       
    15     cdef platform.sockaddr* _get_sockaddr_ptr (self) except NULL :
       
    16         """
       
    17             Get the sockaddr pointer
       
    18         """
       
    19 
       
    20         cdef platform.sockaddr *sa
       
    21         cdef platform.socklen_t sa_len
       
    22 
       
    23         self._get_sockaddr(&sa, &sa_len)
       
    24 
       
    25         return sa
       
    26     
       
    27     cdef platform.socklen_t _get_sockaddr_len (self) except -1 :
       
    28         """
       
    29             Get the sockaddr len
       
    30         """
       
    31 
       
    32         cdef platform.sockaddr *sa
       
    33         cdef platform.socklen_t sa_len
       
    34 
       
    35         self._get_sockaddr(&sa, &sa_len)
       
    36 
       
    37         return sa_len
       
    38 
       
    39     cdef int _set_sockaddr (self, platform.sockaddr *sa, size_t sa_len) except -1 :
       
    40         """
       
    41             Set the sockaddr value for this address; sa_len must match!
       
    42         """
       
    43 
       
    44         raise NotImplementedError()
       
    45 
       
    46     def getnameinfo (self) :
       
    47         """
       
    48             Returns a (host, serv) tuple for this address à la getnameinfo
       
    49 
       
    50             >>> addr = sockaddr_in()
       
    51             >>> assert addr.getnameinfo() == (addr.addr, str(addr.port))
       
    52         """
       
    53 
       
    54         cdef platform.sockaddr *sa
       
    55         cdef platform.socklen_t sa_len
       
    56 
       
    57         # XXX: take as args?
       
    58         cdef int flags = platform.NI_NUMERICHOST | platform.NI_NUMERICSERV
       
    59         
       
    60         # get our abstract sockaddr
       
    61         self._get_sockaddr(&sa, &sa_len)
       
    62 
       
    63         # get nice text format
       
    64         return platform.getnameinfo(sa, sa_len, flags)
       
    65 
       
    66     property addr :
       
    67         """
       
    68             The ASCII literal network address
       
    69         """
       
    70 
       
    71         def __get__ (self) :
       
    72             """
       
    73                 Default implmentation using getnameinfo()
       
    74             """
       
    75 
       
    76             addr, port = self.getnameinfo()
       
    77 
       
    78             return addr
       
    79 
       
    80     property port :
       
    81         """
       
    82             The integer port number
       
    83         """
       
    84 
       
    85         def __get__ (self) :
       
    86             """
       
    87                 Default implementation using getnameinfo() and int()
       
    88             """
       
    89 
       
    90             addr, port = self.getnameinfo()
       
    91 
       
    92             return int(port)
       
    93     
       
    94     def __repr__ (self) :
       
    95         return "sockaddr(%d, %s, %d)" % (self.family, self.addr, self.port)
       
    96 
       
    97