summaryrefslogtreecommitdiff
path: root/kademlia/contact.py
diff options
context:
space:
mode:
authorYuval Adam <yuv.adm@gmail.com>2012-01-17 11:04:05 +0200
committerYuval Adam <yuv.adm@gmail.com>2012-01-17 11:04:05 +0200
commitea59a72d6f6d31c53b95531dd9700bdd13a2fafc (patch)
tree9724c99c1747ab1aed6c88f7a1a118cfc18d4b43 /kademlia/contact.py
parent984794de2eaa8de85dd91aa4a3fcdf7045226f4b (diff)
initial kademlia files
Diffstat (limited to 'kademlia/contact.py')
-rw-r--r--kademlia/contact.py58
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