summaryrefslogtreecommitdiffstats
path: root/lib/edoors/door.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lib/edoors/door.rb')
-rw-r--r--lib/edoors/door.rb94
1 files changed, 94 insertions, 0 deletions
diff --git a/lib/edoors/door.rb b/lib/edoors/door.rb
new file mode 100644
index 0000000..ecbf4a9
--- /dev/null
+++ b/lib/edoors/door.rb
@@ -0,0 +1,94 @@
+#! /usr/bin/env ruby
+# -*- coding: UTF-8 -*-
+#
+# Copyright 2012 Jérémy Zurcher <jeremy@asynk.ch>
+#
+# This file is part of edoors-ruby.
+#
+# edoors-ruby is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# edoors-ruby is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with edoors-ruby. If not, see <http://www.gnu.org/licenses/>.
+
+#
+module Edoors
+ #
+ class Door < Iota
+ #
+ def initialize n, p
+ super n, p
+ @saved = nil
+ end
+ #
+ def to_json *a
+ {
+ 'kls' => self.class.name,
+ 'name' => @name
+ }.merge(hibernate!).to_json *a
+ end
+ #
+ def self.json_create o
+ raise Edoors::Exception.new "JSON #{o['kls']} != #{self.name}" if o['kls'] != self.name
+ door = self.new o['name'], o['parent']
+ door.resume! o
+ door
+ end
+ #
+ def require_p p_kls
+ @spin.require_p p_kls
+ end
+ #
+ def release_p p
+ @saved=nil if @saved==p # particle is released, all is good
+ @spin.release_p p
+ end
+ #
+ def garbage
+ puts " ! #{path} didn't give back #{@saved}" if @spin.debug_errors
+ puts "\t#{@saved.data Edoors::FIELD_ERROR_MSG}" if @saved.action==Edoors::ACT_ERROR
+ release_p @saved
+ @saved = nil
+ end
+ #
+ def process_p p
+ @viewer.receive_p p if @viewer
+ @saved = p
+ receive_p p
+ garbage if not @saved.nil?
+ end
+ #
+ def process_sys_p p
+ # nothing todo with it now
+ @spin.release_p p
+ end
+ #
+ def _send sys, p, a=nil, d=nil
+ p.init! self
+ p.set_dst! a, d||self if a
+ @saved=nil if @saved==p # particle is sent back the data, all is good
+ # daddy will know what to do
+ sys ? @parent.send_sys_p(p) : @parent.send_p(p)
+ end
+ private :_send
+ #
+ def send_p p, a=nil, d=nil
+ _send false, p, a, d
+ end
+ #
+ def send_sys_p p, a=nil, d=nil
+ _send true, p, a, d
+ end
+ #
+ end
+ #
+end
+#
+# EOF