Sha256: 682dcffb901e563c72f9b27e6b9533387de7540350499d4ac7546034ef149179

Contents?: true

Size: 1.55 KB

Versions: 1

Compression:

Stored size: 1.55 KB

Contents

module ActionController
  module Acts
    module XmlrpcEndpoint
      def self.included(controller)
        controller.extend(ClassMethods)
      end

      module ClassMethods
        def exposes_xmlrpc_methods(options = {})
          configuration = { :method_prefix => nil }
          configuration.update(options) if options.is_a?(Hash)
          
          before_filter(:add_method_handlers, :only => [:xe_index])
          class_eval <<-EOV
            require 'xmlrpc/server'
            include ActionController::Acts::XmlrpcEndpoint::InstanceMethods

            def xe_method_prefix
              '#{configuration[:method_prefix]}'
            end
          EOV
        end
      end

      module InstanceMethods
        # TODO: add route automatically for this?
        def xe_index
          result = @xmlrpc_server.process(request.body)
          puts "\n\n----- BEGIN RESULT -----\n#{result}----- END RESULT -----\n\n"
          render :text => result, :content_type => 'text/xml'
        end

        private
      
        def add_method_handlers
          @xmlrpc_server = XMLRPC::BasicServer.new
          # loop through all the methods, adding them as handlers
          self.class.instance_methods(false).each do |method|
            unless ['xe_index', 'xe_method_prefix'].member?(method)
              puts "Adding XMLRPC method for #{method.to_s}"
              @xmlrpc_server.add_handler(xe_method_prefix + method) do |*args|
                self.send(method.to_sym, *args)
              end
            end
          end
        end
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
xmlrpc-endpoint-0.2.1 lib/action_controller/acts/xmlrpc_endpoint.rb