diff -r ee7ade660c0b -r e2f79e68418a qmsk/net/socket/_address.pyx --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qmsk/net/socket/_address.pyx Fri Sep 25 21:34:04 2009 +0300 @@ -0,0 +1,97 @@ + + +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) + +