| Module | OSC::Server |
| In: |
lib/osc/server.rb
|
Mixin for making servers. Your job is to read a packet and call dispatch(Packet.decode(raw)), ad infinitum (e.g. in a method named serve).
prock.respond_to?(:call) #=> true
Pass an OSC pattern, a typespec, and either prock or a block. The block/prock will be called if the pattern and typspec match. Numeric types will be coerced, so e.g. ‘fi’ would match ‘ii’ and the float would be coerced to an int.
# File lib/osc/server.rb, line 11
11: def add_method(pat, typespec, prock=nil, &block)
12: pat = Pattern.new(pat) unless Pattern === pat
13: if block_given? and prock
14: raise ArgumentError, 'Specify either a block or a Proc, not both.'
15: end
16: prock = block if block_given?
17: unless prock.respond_to?(:call)
18: raise ArgumentError, "Prock doesn't respond to :call"
19: end
20: unless typespec.nil? or typespec =~ /[ifsb]*/
21: raise ArgumentError, "Bad typespec '#{typespec}'"
22: end
23: @cb ||= []
24: @cb << [pat, typespec, prock]
25: end
dispatch the provided message. It can be raw or already decoded with Packet.decode
# File lib/osc/server.rb, line 29
29: def dispatch(mesg)
30: case mesg
31: when Bundle, Message
32: else
33: mesg = Packet.decode(mesg)
34: end
35:
36: case mesg
37: when Bundle; dispatch_bundle(mesg)
38: when Message
39: unless @cb.nil?
40: @cb.each do |pat, typespec, obj|
41: if pat.nil? or Pattern.intersect?(pat, mesg.address)
42: if typespec
43: if typespec.size == mesg.args.size
44: match = true
45: typespec.size.times do |i|
46: c = typespec[i]
47: case c
48: when ?i, ?f
49: match &&= (Numeric === mesg.args[i])
50: when ?s, ?b
51: match &&= (String === mesg.args[i])
52: end
53: end
54: if match
55: typespec.size.times do |i|
56: case typespec[i]
57: when ?i
58: mesg.args[i] = mesg.args[i].to_i
59: when ?f
60: mesg.args[i] = mesg.args[i].to_f
61: when ?s,?b
62: mesg.args[i] = mesg.args[i].to_s
63: mesg.args[i] = mesg.args[i].to_s
64: end
65: end
66:
67: obj.call(mesg)
68: end
69: end
70: else # no typespec
71: obj.call(mesg)
72: end
73: end # pattern match
74: end # @cb.each
75: end # unless @cb.nil?
76: else
77: raise "bad mesg"
78: end
79: end
May create a new thread to wait to dispatch according to p.timetag.
# File lib/osc/server.rb, line 82
82: def dispatch_bundle(p)
83: diff = p.timetag.to_f - TimeTag.now.to_f
84: if diff <= 0
85: p.each {|m| m.source = p.source; dispatch m}
86: else
87: Thread.new do
88: sleep diff
89: p.each {|m| m.source = p.source; dispatch m}
90: end
91: end
92: end