From: <kt...@us...> - 2009-09-01 02:35:56
|
Revision: 3344 http://milter-manager.svn.sourceforge.net/milter-manager/?rev=3344&view=rev Author: ktou Date: 2009-09-01 02:35:50 +0000 (Tue, 01 Sep 2009) Log Message: ----------- * binding/ruby/lib/milter/client.rb: a convenience class to make a milter by Ruby. Modified Paths: -------------- milter-manager/trunk/ChangeLog milter-manager/trunk/binding/ruby/lib/milter.rb Added Paths: ----------- milter-manager/trunk/binding/ruby/lib/milter/client.rb Modified: milter-manager/trunk/ChangeLog =================================================================== --- milter-manager/trunk/ChangeLog 2009-09-01 02:32:42 UTC (rev 3343) +++ milter-manager/trunk/ChangeLog 2009-09-01 02:35:50 UTC (rev 3344) @@ -1,5 +1,8 @@ 2009-09-01 Kouhei Sutou <ko...@cl...> + * binding/ruby/lib/milter/client.rb: a convenience class to make a + milter by Ruby. + * binding/ruby/src/toolkit/rb-milter-server-context.c: move signal converters to ... * binding/ruby/src/toolkit/rb-milter-core-private.[ch]: ... here. Added: milter-manager/trunk/binding/ruby/lib/milter/client.rb =================================================================== --- milter-manager/trunk/binding/ruby/lib/milter/client.rb (rev 0) +++ milter-manager/trunk/binding/ruby/lib/milter/client.rb 2009-09-01 02:35:50 UTC (rev 3344) @@ -0,0 +1,101 @@ +# Copyright (C) 2009 Kouhei Sutou <ko...@cl...> +# +# This library is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This library 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 Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this library. If not, see <http://www.gnu.org/licenses/>. + +module Milter + class Client + def register(session_class) + signal_connect("connection-established") do |_client, context| + setup_session(context, session_class) + end + end + + private + def setup_session(context, session_class) + session = session_class.new + context.instance_variable_set("@session", session) + + [:negotiate, :connect, :helo, :envelope_from, :envelope_recipient, + :data, :unknown, :header, :end_of_header, :body, :end_of_message, + :abort].each do |event| + if session.respond_to?(event) + context.signal_connect(event) do |_context, *args| + session_context = ClientSessionContext.new(_context) + session.send(event, session_context, *args) + session_context.status + end + end + end + end + end + + class ClientSession + def negotiate(context, option, macros_requests) + [:connect, :helo, :envelope_from, :envelope_recipient, + :body, :unknown, [:header, :headers], :end_of_header, + :body].each do |method_name, step_name| + if respond_to?(method_name) + step_name ||= method_name + step = Milter::Step.const_get("NO_#{step_name.to_s.upcase}") + option.remove_action(step) + end + end + context.status = :continue + end + end + + class ClientSessionContext + def initialize(context) + @context = context + @status = nil + end + + def status=(value) + case value + when String, Symbol + unless Milter::Status.const_defined?(value.to_s.upcase) + raise ArgumentError, "unknown status: <#{value.inspect}>" + end + when Milter::Status, nil + else + message = + "should be one of [String, Symbol, Milter::Status, nil]: " + + "<#{value.inspect}>" + raise ArgumentError, message + end + @status = value + end + + def status + status = @status || Milter::Status::DEFAULT + if status.is_a?(String) or status.is_a?(Symbol) + status = Milter::Status.const_get(status.to_s.upcase) + end + status + end + + def set_reply(code, extended_code, reason) + @context.set_reply(code, extended_code, reason) + if 400 <= code and code < 500 + self.status = :temporary_failure + elsif 500 <= code and code < 600 + self.status = :reject + end + end + + def method_missing(*args, &block) + @context.send(*args, &block) + end + end +end Modified: milter-manager/trunk/binding/ruby/lib/milter.rb =================================================================== --- milter-manager/trunk/binding/ruby/lib/milter.rb 2009-09-01 02:32:42 UTC (rev 3343) +++ milter-manager/trunk/binding/ruby/lib/milter.rb 2009-09-01 02:35:50 UTC (rev 3344) @@ -18,3 +18,4 @@ require 'milter_toolkit.so' require 'milter/toolkit' +require 'milter/client' This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |