summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authoramatus <amatus@foxxy>2010-07-02 00:15:21 -0700
committeramatus <amatus@foxxy>2010-07-02 00:15:21 -0700
commit37c04bb0419e5ed7d32b6238f5899f05933fb8ee (patch)
tree32603fbb97b90c67e127367b76158c4630e9bc53 /src
parent8309bd394749e7e9e9f953ad00aa7959ddbebebf (diff)
Use a map of maps for collections of transports.
Diffstat (limited to 'src')
-rw-r--r--src/org/gnu/clojure/gnunet/hello.clj48
-rw-r--r--src/org/gnu/clojure/gnunet/peer.clj11
2 files changed, 50 insertions, 9 deletions
diff --git a/src/org/gnu/clojure/gnunet/hello.clj b/src/org/gnu/clojure/gnunet/hello.clj
index 6370954..3630b23 100644
--- a/src/org/gnu/clojure/gnunet/hello.clj
+++ b/src/org/gnu/clojure/gnunet/hello.clj
@@ -1,6 +1,7 @@
(ns org.gnu.clojure.gnunet.hello
(:use (org.gnu.clojure.gnunet parser message identity crypto)
- clojure.contrib.monads))
+ clojure.contrib.monads)
+ (:import java.util.Date))
(def message-type-hello 16)
@@ -21,13 +22,54 @@
:expiration expiration
:bytes encoded-address}))
+(defn list-transports
+ "Generate a list of transport descriptions."
+ [transport-map]
+ (for [transport transport-map
+ address (val transport)]
+ {:name (key transport)
+ :bytes (key address)
+ :expiration (val address)}))
+
(defn encode-hello
"Encode a hello message."
[hello]
(concat
(encode-int32 0)
(encode-rsa-public-key (:public-key hello))
- (mapcat encode-transport (:transports hello))))
+ (mapcat encode-transport (list-transports (:transports hello)))))
+
+(defn my-max
+ "Return the maximum in a collection of comparable values."
+ [& coll]
+ (last (sort coll)))
+
+(defn merge-transports
+ "Merge a list of transport descriptions into a map of maps of
+ expiration times, keyed first by transport name and then by
+ transport address, and then filter by min-expiration"
+ [min-expiration transport-map transport-list]
+ (reduce (fn [transport-map transport]
+ (let [addresses (transport-map
+ (:name transport)
+ {(:bytes transport) (:expiration transport)})
+ expiration (addresses
+ (:bytes transport)
+ (:expiration transport))]
+ (if (and
+ (< 0 (compare min-expiration expiration))
+ (< 0 (compare min-expiration (:expiration transport))))
+ (let [less-addresses (dissoc addresses (:bytes transport))]
+ (if (empty? less-addresses)
+ (dissoc transport-map (:name transport))
+ (assoc transport-map (:name transport) less-addresses)))
+ (assoc transport-map
+ (:name transport)
+ (assoc addresses
+ (:bytes transport)
+ (my-max (:expiration transport) expiration))))))
+ transport-map
+ transport-list))
(def parse-hello
(domonad parser-m [padding parse-uint32
@@ -35,4 +77,4 @@
public-key parse-rsa-public-key
transports (none-or-more parse-transport)]
{:public-key public-key
- :transports transports}))
+ :transports (merge-transports (Date. (long 0)) {} transports)}))
diff --git a/src/org/gnu/clojure/gnunet/peer.clj b/src/org/gnu/clojure/gnunet/peer.clj
index 0c3a0d6..7859826 100644
--- a/src/org/gnu/clojure/gnunet/peer.clj
+++ b/src/org/gnu/clojure/gnunet/peer.clj
@@ -1,5 +1,5 @@
(ns org.gnu.clojure.gnunet.peer
- (:use (org.gnu.clojure.gnunet identity))
+ (:use (org.gnu.clojure.gnunet identity hello))
(:import java.util.Date))
(defstruct remote-peer
@@ -27,19 +27,18 @@
(struct-map peer
:public-key (.getPublic (:keypair options))
:id (generate-id (.getPublic (:keypair options)))
- :transports-agent (agent [])
+ :transports-agent (agent {})
:private-key (.getPrivate (:keypair options))
:remote-peers-agent (agent {})))
-(def filter-expired-transports
- (partial filter #(< (:expiration %) (Date.))))
-
;; Event - Peer receives a HELLO message
(defn admit-hello!
[peer hello]
(letfn [(update-transports
[transports new-transports]
- (filter-expired-transports (concat transports new-transports)))
+ (merge-transports (Date.)
+ transports
+ (list-transports new-transports)))
(update-remote-peers
[remote-peers hello]
(let [id (vec (generate-id (:public-key hello)))