From: Richard Fairhurst Date: Sun, 12 Oct 2008 23:11:37 +0000 (+0000) Subject: Potlatch 0.10e X-Git-Tag: live~8678 X-Git-Url: https://git.openstreetmap.org./rails.git/commitdiff_plain/caa20ccc403b1227baf62e951d2f30d13710e80e Potlatch 0.10e --- diff --git a/app/controllers/amf_controller.rb b/app/controllers/amf_controller.rb index 70f8f427d..306b3dec8 100644 --- a/app/controllers/amf_controller.rb +++ b/app/controllers/amf_controller.rb @@ -10,10 +10,10 @@ # # == General structure # -# Apart from the talk method (which distributes the requests from the -# AMF message), each method generally takes arguments in the order they were -# sent by the Potlatch SWF. Do not assume typing has been preserved. Methods -# all return an array to the SWF. +# Apart from the amf_read and amf_write methods (which distribute the requests +# from the AMF message), each method generally takes arguments in the order +# they were sent by the Potlatch SWF. Do not assume typing has been preserved. +# Methods all return an array to the SWF. # # == Debugging # @@ -31,16 +31,15 @@ class AmfController < ApplicationController session :off before_filter :check_write_availability - # Main AMF handler: processes the raw AMF string (using AMF library) and + # Main AMF handlers: process the raw AMF string (using AMF library) and # calls each action (private method) accordingly. + # ** FIXME: refactor to reduce duplication of code across read/write - def talk - req=StringIO.new(request.raw_post+0.chr) # Get POST data as request - # (cf http://www.ruby-forum.com/topic/122163) - req.read(2) # Skip version indicator and client ID - results={} # Results of each body - renumberednodes={} # Shared across repeated putways - renumberedways={} # Shared across repeated putways + def amf_read + req=StringIO.new(request.raw_post+0.chr)# Get POST data as request + # (cf http://www.ruby-forum.com/topic/122163) + req.read(2) # Skip version indicator and client ID + results={} # Results of each body # Parse request @@ -69,6 +68,36 @@ class AmfController < ApplicationController when 'getway_old'; results[index]=AMF.putdata(index,getway_old(args[0].to_i,args[1].to_i)) when 'getway_history'; results[index]=AMF.putdata(index,getway_history(args[0].to_i)) when 'getnode_history'; results[index]=AMF.putdata(index,getnode_history(args[0].to_i)) + when 'findrelations'; results[index]=AMF.putdata(index,findrelations(*args)) + when 'getpoi'; results[index]=AMF.putdata(index,getpoi(*args)) + end + end + sendresponse(results) + end + + def amf_write + req=StringIO.new(request.raw_post+0.chr) + req.read(2) + results={} + renumberednodes={} # Shared across repeated putways + renumberedways={} # Shared across repeated putways + + headers=AMF.getint(req) # Read number of headers + headers.times do # Read each header + name=AMF.getstring(req) # | + req.getc # | skip boolean + value=AMF.getvalue(req) # | + header["name"]=value # | + end + + bodies=AMF.getint(req) # Read number of bodies + bodies.times do # Read each body + message=AMF.getstring(req) # | get message name + index=AMF.getstring(req) # | get index in response sequence + bytes=AMF.getlong(req) # | get total size in bytes + args=AMF.getvalue(req) # | get response (probably an array) + + case message when 'putway'; r=putway(renumberednodes,*args) renumberednodes=r[3] if r[1] != r[2] @@ -76,22 +105,11 @@ class AmfController < ApplicationController end results[index]=AMF.putdata(index,r) when 'putrelation'; results[index]=AMF.putdata(index,putrelation(renumberednodes, renumberedways, *args)) - when 'findrelations'; results[index]=AMF.putdata(index,findrelations(*args)) when 'deleteway'; results[index]=AMF.putdata(index,deleteway(args[0],args[1].to_i)) when 'putpoi'; results[index]=AMF.putdata(index,putpoi(*args)) - when 'getpoi'; results[index]=AMF.putdata(index,getpoi(*args)) end end - - # Write out response - - a,b=results.length.divmod(256) - render :content_type => "application/x-amf", :text => proc { |response, output| - output.write 0.chr+0.chr+0.chr+0.chr+a.chr+b.chr - results.each do |k,v| - output.write(v) - end - } + sendresponse(results) end private @@ -275,11 +293,10 @@ class AmfController < ApplicationController if mid < 0 mid = renumberednodes[mid] if m[0] == 'node' mid = renumberedways[mid] if m[0] == 'way' - if mid < 0 - return -2, "Negative ID unresolved" + if mid + typedmembers << [m[0], mid, m[2]] end end - typedmembers << [m[0], mid, m[2]] end # assign new contents @@ -523,6 +540,18 @@ class AmfController < ApplicationController return ((a/0.0000001).round==(b/0.0000001).round) end + # Send AMF response + + def sendresponse(results) + a,b=results.length.divmod(256) + render :content_type => "application/x-amf", :text => proc { |response, output| + output.write 0.chr+0.chr+0.chr+0.chr+a.chr+b.chr + results.each do |k,v| + output.write(v) + end + } + end + # ==================================================================== # Alternative SQL queries for getway/whichways diff --git a/config/potlatch/presets.txt b/config/potlatch/presets.txt index ecca87d72..464204edb 100644 --- a/config/potlatch/presets.txt +++ b/config/potlatch/presets.txt @@ -62,7 +62,7 @@ winding hole: place=,waterway=turning_point mooring: place=,waterway=mooring point/railway -station: place=,railway=station +station: place=,railway=station,name=(type name here) viaduct: place=,railway=viaduct level crossing: place=,railway=crossing diff --git a/config/routes.rb b/config/routes.rb index f040e1c1d..b7d570980 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -54,7 +54,8 @@ ActionController::Routing::Routes.draw do |map| # Potlatch API - map.connect "api/#{API_VERSION}/amf", :controller =>'amf', :action =>'talk' + map.connect "api/#{API_VERSION}/amf/read", :controller =>'amf', :action =>'amf_read' + map.connect "api/#{API_VERSION}/amf/write", :controller =>'amf', :action =>'amf_write' map.connect "api/#{API_VERSION}/swf/trackpoints", :controller =>'swf', :action =>'trackpoints' # Data browsing diff --git a/public/potlatch/potlatch.swf b/public/potlatch/potlatch.swf index 4d2dc0b2e..c5ef661de 100755 Binary files a/public/potlatch/potlatch.swf and b/public/potlatch/potlatch.swf differ