class AmfController < ApplicationController require 'stringio' # Still to do: # - all db interaction # - user authentication # - (also pass lat/lon through from view tab to edit tab) # to log: # RAILS_DEFAULT_LOGGER.error("Args: #{args[0]}, #{args[1]}, #{args[2]}, #{args[3]}") # ==================================================================== # Main AMF handler # ---- talk process AMF request def talk req=StringIO.new(request.raw_post) # Get POST data as request req.read(2) # Skip version indicator and client ID results={} # Results of each body # ------------- # Parse request headers=getint(req) # Read number of headers for i in (1..headers) # Read each header name=getstring(req) # | req.getc # | skip boolean value=getvalue(req) # | header["name"]=value # | end bodies=getint(req) # Read number of bodies for i in (1..bodies) # Read each body message=getstring(req) # | get message name index=getstring(req) # | get index in response sequence bytes=getlong(req) # | get total size in bytes args=getvalue(req) # | get response (probably an array) case message when 'getpresets'; results[index]=putdata(index,getpresets) when 'whichways'; results[index]=putdata(index,whichways(args)) when 'getway'; results[index]=putdata(index,getway(args)) when 'putway'; results[index]=putdata(index,putway(args)) when 'deleteway'; results[index]=putdata(index,deleteway(args)) end end # ------------------ # Write out response response.headers["Content-Type"]="application/x-amf" a,b=results.length.divmod(256) ans=0.chr+0.chr+0.chr+0.chr+a.chr+b.chr results.each do |k,v| ans+=v end render :text=>ans end # ==================================================================== # Remote calls def getpresets presets={} presetmenus={}; presetmenus['point']=[]; presetmenus['way']=[] presetnames={}; presetnames['point']={}; presetnames['way']={} presettype='' presetcategory='' File.open("config/potlatch/presets.txt") do |file| file.each_line {|line| t=line.chomp if (t=~/(\w+)\/(\w+)/) then presettype=$1 presetcategory=$2 presetmenus[presettype].push(presetcategory) presetnames[presettype][presetcategory]=["(no preset)"] elsif (t=~/^(.+):\s?(.+)$/) then pre=$1; kv=$2 presetnames[presettype][presetcategory].push(pre) presets[pre]={} kv.split(',').each {|a| if (a=~/^(.+)=(.*)$/) then presets[pre][$1]=$2 end } end } end [presets,presetmenus,presetnames] end def whichways(args) waylist=WaySegment.find_by_sql("SELECT DISTINCT current_way_segments.id AS wayid"+ " FROM current_way_segments,current_segments,current_nodes "+ " WHERE segment_id=current_segments.id "+ " AND node_a=current_nodes.id "+ " AND (latitude BETWEEN "+(args[1].to_f-0.01).to_s+" AND "+(args[3].to_f+0.01).to_s+") "+ " AND (longitude BETWEEN "+(args[0].to_f-0.01).to_s+" AND "+(args[2].to_f+0.01).to_s+")") ways=[] waylist.each {|a| ways<