diff options
Diffstat (limited to 'kademlia/contact.py')
| -rw-r--r-- | kademlia/contact.py | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/kademlia/contact.py b/kademlia/contact.py new file mode 100644 index 0000000..9fc4ed4 --- /dev/null +++ b/kademlia/contact.py @@ -0,0 +1,58 @@ +#!/usr/bin/env python +# +# This library is free software, distributed under the terms of +# the GNU Lesser General Public License Version 3, or any later version. +# See the COPYING file included in this archive +# +# The docstrings in this module contain epytext markup; API documentation +# may be created by processing this file with epydoc: http://epydoc.sf.net + +class Contact(object): + """ Encapsulation for remote contact + + This class contains information on a single remote contact, and also + provides a direct RPC API to the remote node which it represents + """ + def __init__(self, id, ipAddress, udpPort, networkProtocol, firstComm=0): + self.id = id + self.address = ipAddress + self.port = udpPort + self._networkProtocol = networkProtocol + self.commTime = firstComm + + def __eq__(self, other): + if isinstance(other, Contact): + return self.id == other.id + elif isinstance(other, str): + return self.id == other + else: + return False + + def __ne__(self, other): + if isinstance(other, Contact): + return self.id != other.id + elif isinstance(other, str): + return self.id != other + else: + return True + + def __str__(self): + return '<%s.%s object; IP address: %s, UDP port: %d>' % (self.__module__, self.__class__.__name__, self.address, self.port) + + def __getattr__(self, name): + """ This override allows the host node to call a method of the remote + node (i.e. this contact) as if it was a local function. + + For instance, if C{remoteNode} is a instance of C{Contact}, the + following will result in C{remoteNode}'s C{test()} method to be + called with argument C{123}:: + remoteNode.test(123) + + Such a RPC method call will return a Deferred, which will callback + when the contact responds with the result (or an error occurs). + This happens via this contact's C{_networkProtocol} object (i.e. the + host Node's C{_protocol} object). + """ + def _sendRPC(*args, **kwargs): + return self._networkProtocol.sendRPC(self, name, args, **kwargs) + return _sendRPC |
