diff options
author | amatus <amatus@foxxy> | 2010-07-02 00:15:21 -0700 |
---|---|---|
committer | amatus <amatus@foxxy> | 2010-07-02 00:15:21 -0700 |
commit | 37c04bb0419e5ed7d32b6238f5899f05933fb8ee (patch) | |
tree | 32603fbb97b90c67e127367b76158c4630e9bc53 /src | |
parent | 8309bd394749e7e9e9f953ad00aa7959ddbebebf (diff) |
Use a map of maps for collections of transports.
Diffstat (limited to 'src')
-rw-r--r-- | src/org/gnu/clojure/gnunet/hello.clj | 48 | ||||
-rw-r--r-- | src/org/gnu/clojure/gnunet/peer.clj | 11 |
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))) |