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