From 13d45d30186072b1973ccd6a547bfc8ecce97af0 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Zurcher?= <jeremy@asynk.ch>
Date: Sun, 3 Jun 2012 11:16:59 +0200
Subject: cleanup routing, add direct through path

---
 lib/iotas/particle.rb | 16 ++++++++++++----
 lib/iotas/room.rb     | 52 ++++++++++++++++++++++++++-------------------------
 2 files changed, 39 insertions(+), 29 deletions(-)

diff --git a/lib/iotas/particle.rb b/lib/iotas/particle.rb
index 295d505..79cebfb 100644
--- a/lib/iotas/particle.rb
+++ b/lib/iotas/particle.rb
@@ -86,9 +86,9 @@ module Iotas
         #
         # called when sent
         def init! src
-            @dst = nil
             @src = src
             @ts = Time.now
+            @dst = @room = @door = @action = nil
         end
         #
         attr_reader :ts, :src, :dst, :room, :door, :action, :link_value, :payload
@@ -118,15 +118,22 @@ module Iotas
         end
         #
         def set_dst! a, d
-            @room = @door = nil
             @action = a
-            @dst = d
+            if d.is_a? Iotas::Iota
+                @dst = d
+            else
+                _split_path! d
+            end
         end
         #
         def split_dst!
             @dst = @room = @door = @action = nil
             return if (n = next_dst).nil?
             p, @action = n.split Iotas::ACT_SEP
+            _split_path! p
+        end
+        #
+        def _split_path! p
             i = p.rindex Iotas::PATH_SEP
             if i.nil?
                 @room = nil
@@ -137,6 +144,7 @@ module Iotas
             end
             @door = nil if @door.empty?
         end
+        private :_split_path!
         #
         def dst_routed! dst
             @dst = dst
@@ -150,7 +158,7 @@ module Iotas
         end
         #
         def apply_link! lnk
-            @src = lnk.door
+            init! lnk.door
             clear_dsts!
             add_dsts lnk.dsts
             set_link_fields lnk.fields
diff --git a/lib/iotas/room.rb b/lib/iotas/room.rb
index a64d46f..7ffc5f4 100644
--- a/lib/iotas/room.rb
+++ b/lib/iotas/room.rb
@@ -91,7 +91,7 @@ module Iotas
             nil
         end
         #
-        def try_links p
+        def _try_links p
             puts "   -> try_links ..." if @spin.debug_routing
             links = @links[p.src.name]
             return false if links.nil?
@@ -113,12 +113,13 @@ module Iotas
             end
             if pending_link
                 p.apply_link! pending_link
-                send_p p
+                _send false, p
             end
-            (not pending_link.nil?)
+            pending_link
         end
+        private :_try_links
         #
-        def route_p p
+        def _route p
             if p.room.nil? or p.room==path
                 if door = @iotas[p.door]
                     p.dst_routed! door
@@ -131,45 +132,46 @@ module Iotas
                 p.error! Iotas::ERROR_ROUTE_DNE
             end
         end
+        private :_route
         #
-        def send_p p
-            puts " * send_p #{(p.next_dst.nil? ? 'no dst' : p.next_dst)} ..." if @spin.debug_routing
-            if p.src.nil?
-                # do not route orphan particles !!
+        def _send sys, p
+            if not sys and p.src.nil?
+                # do not route non system orphan particles !!
                 p.error! Iotas::ERROR_ROUTE_NS, @spin
             elsif p.dst
-                # direct routing, nothing to do
+                # direct routing through pointer
+                return
+            elsif p.door
+                # direct routing through path
+                _route p
             elsif p.next_dst
                 p.split_dst!
                 if p.door
-                    route_p p
-                else
+                    _route p
+                elsif not sys
                     # boomerang
                     p.dst_routed! p.src
+                elsif p.action
+                    p.dst_routed! @spin
                 end
-            elsif try_links p
+            elsif not sys and _try_links p
                 return
             else
-                p.error! Iotas::ERROR_ROUTE_NDNL
+                p.error!( sys ? Iotas::ERROR_ROUTE_SND : Iotas::ERROR_ROUTE_NDNL)
             end
+        end
+        private :_send
+        #
+        def send_p p
+            puts " * send_p #{(p.next_dst.nil? ? 'no dst' : p.next_dst)} ..." if @spin.debug_routing
+            _send false, p
             puts "   -> #{p.dst.path}#{Iotas::ACT_SEP}#{p.action}" if @spin.debug_routing
             @spin.post_p p
         end
         #
         def send_sys_p p
             puts " * send_sys_p #{(p.next_dst.nil? ? 'no dst' : p.next_dst)} ..." if @spin.debug_routing
-            if p.dst
-                # direct routing, nothing to do
-            elsif p.next_dst
-                p.split_dst!
-                if p.door
-                    route_p p
-                elsif p.action
-                    p.dst_routed! @spin
-                end
-            else
-                p.error! Iotas::ERROR_ROUTE_SND
-            end
+            _send true, p
             puts "   -> #{p.dst.path}#{Iotas::ACT_SEP}#{p.action}" if @spin.debug_routing
             @spin.post_sys_p p
         end
-- 
cgit v1.1-2-g2b99