1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00
ruby--ruby/lib/xmlrpc/utils.rb
matz f3d25fdd9c * gc.c (id2ref): recycle check should be done by klass == 0.
[ruby-core:01408]

* eval.c (Init_Thread): Continuation#[] added.  [ruby-talk:79028]

* parse.y (mlhs_node): should allow "::Foo" (colon3) as lhs.

* parse.y (lhs): ditto.

* parse.y (yylex): should return tCOLON3 right after kCLASS.
  [ruby-talk:78918]

* error.c (exc_initialize): was converting argument to string too
  eagerly.  Only check was needed. [ruby-talk:78958]


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@4390 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2003-08-14 17:20:14 +00:00

172 lines
3.6 KiB
Ruby

#
# Defines ParserWriterChooseMixin, which makes it possible to choose a
# different XML writer and/or XML parser then the default one.
# The Mixin is used in client.rb (class Client) and server.rb (class
# BasicServer)
#
# Copyright (C) 2001, 2002, 2003 by Michael Neumann (mneumann@ntecs.de)
#
# $Id$
#
module XMLRPC
#
# This module enables a user-class to be marshalled
# by XML-RPC for Ruby into a Hash, with one additional
# key/value pair "___class___" => ClassName
#
module Marshallable
def __get_instance_variables
instance_variables.collect {|var| [var[1..-1], eval(var)] }
end
def __set_instance_variable(key, value)
eval("@#$1 = value") if key =~ /^([\w_][\w_0-9]*)$/
end
end
module ParserWriterChooseMixin
def set_writer(writer)
@create = Create.new(writer)
self
end
def set_parser(parser)
@parser = parser
self
end
private
def create
# if set_writer was not already called then call it now
if @create.nil? then
set_writer(Config::DEFAULT_WRITER.new)
end
@create
end
def parser
# if set_parser was not already called then call it now
if @parser.nil? then
set_parser(Config::DEFAULT_PARSER.new)
end
@parser
end
end # module ParserWriterChooseMixin
module Service
#
# base class for Service Interface definitions, used
# by BasicServer#add_handler
#
class BasicInterface
attr_reader :prefix, :methods
def initialize(prefix)
@prefix = prefix
@methods = []
end
def add_method(sig, help=nil, meth_name=nil)
mname = nil
sig = [sig] if sig.kind_of? String
sig = sig.collect do |s|
name, si = parse_sig(s)
raise "Wrong signatures!" if mname != nil and name != mname
mname = name
si
end
@methods << [mname, meth_name || mname, sig, help]
end
private # ---------------------------------
def parse_sig(sig)
# sig is a String
if sig =~ /^\s*(\w+)\s+([^(]+)(\(([^)]*)\))?\s*$/
params = [$1]
name = $2.strip
$4.split(",").each {|i| params << i.strip} if $4 != nil
return name, params
else
raise "Syntax error in signature"
end
end
end # class BasicInterface
#
# class which wraps a Service Interface definition, used
# by BasicServer#add_handler
#
class Interface < BasicInterface
def initialize(prefix, &p)
raise "No interface specified" if p.nil?
super(prefix)
instance_eval(&p)
end
def get_methods(obj, delim=".")
prefix = @prefix + delim
@methods.collect { |name, meth, sig, help|
[prefix + name, obj.method(meth).to_proc, sig, help]
}
end
private # ---------------------------------
def meth(*a)
add_method(*a)
end
end # class Interface
class PublicInstanceMethodsInterface < BasicInterface
def initialize(prefix)
super(prefix)
end
def get_methods(obj, delim=".")
prefix = @prefix + delim
obj.class.public_instance_methods.collect { |name|
[prefix + name, obj.method(name).to_proc, nil, nil]
}
end
end
end # module Service
#
# short-form to create a Service::Interface
#
def self.interface(prefix, &p)
Service::Interface.new(prefix, &p)
end
# short-cut for creating a PublicInstanceMethodsInterface
def self.iPIMethods(prefix)
Service::PublicInstanceMethodsInterface.new(prefix)
end
module ParseContentType
def parse_content_type(str)
a, *b = str.split(";")
return a.strip, *b
end
end
end # module XMLRPC