From 7cbf0b667cb309efd009aa6b0b102e10beef6d95 Mon Sep 17 00:00:00 2001 From: Tom Hughes Date: Thu, 28 Apr 2011 15:00:38 +0100 Subject: [PATCH] Request, and handle, errors in XML format when loading map data --- .../halcyon/connection/XMLBaseConnection.as | 224 +++++++++--------- .../halcyon/connection/XMLConnection.as | 1 + 2 files changed, 117 insertions(+), 108 deletions(-) diff --git a/net/systemeD/halcyon/connection/XMLBaseConnection.as b/net/systemeD/halcyon/connection/XMLBaseConnection.as index 7d083b5e..01c43609 100644 --- a/net/systemeD/halcyon/connection/XMLBaseConnection.as +++ b/net/systemeD/halcyon/connection/XMLBaseConnection.as @@ -6,6 +6,8 @@ package net.systemeD.halcyon.connection { import flash.net.*; import org.iotashan.oauth.*; + import net.systemeD.halcyon.MapEvent; + /** * XMLBaseConnection is the common code between connecting to an OSM server * (i.e. XMLConnection) and connecting to a standalone .osm file (i.e. OSMConnection) @@ -18,129 +20,135 @@ package net.systemeD.halcyon.connection { protected function loadedMap(event:Event):void { var map:XML = new XML(URLLoader(event.target).data); - var id:Number; - var version:uint; - var uid:Number; - var timestamp:String; - var tags:Object; - var node:Node, newNode:Node; - var unusedNodes:Object={}; + + if (map.localName=="osmError") { + dispatchEvent(new MapEvent(MapEvent.ERROR, { message: "Couldn't load the map: " + map.message } )); + } else { + var id:Number; + var version:uint; + var uid:Number; + var timestamp:String; + var tags:Object; + var node:Node, newNode:Node; + var unusedNodes:Object={}; - var minlon:Number, maxlon:Number, minlat:Number, maxlat:Number; - var singleEntityRequest:Boolean=true; - if (map.bounds.@minlon.length()) { - minlon=map.bounds.@minlon; - maxlon=map.bounds.@maxlon; - minlat=map.bounds.@minlat; - maxlat=map.bounds.@maxlat; - singleEntityRequest=false; - } + var minlon:Number, maxlon:Number, minlat:Number, maxlat:Number; + var singleEntityRequest:Boolean=true; + if (map.bounds.@minlon.length()) { + minlon=map.bounds.@minlon; + maxlon=map.bounds.@maxlon; + minlat=map.bounds.@minlat; + maxlat=map.bounds.@maxlat; + singleEntityRequest=false; + } - for each(var relData:XML in map.relation) { - id = Number(relData.@id); - version = uint(relData.@version); - uid = Number(relData.@uid); - timestamp = relData.@timestamp; + for each(var relData:XML in map.relation) { + id = Number(relData.@id); + version = uint(relData.@version); + uid = Number(relData.@uid); + timestamp = relData.@timestamp; - var rel:Relation = getRelation(id); - if ( rel == null || !rel.loaded ) { - tags = parseTags(relData.tag); - var members:Array = []; - for each(var memberXML:XML in relData.member) { - var type:String = memberXML.@type.toLowerCase(); - var role:String = memberXML.@role; - var memberID:Number = Number(memberXML.@ref); - var member:Entity = null; - if ( type == "node" ) { - member = getNode(memberID); - if ( member == null ) { - member = new Node(memberID,0,{},false,0,0); - setNode(Node(member),true); - } else if (member.isDeleted()) { - member.setDeletedState(false); - } - } else if ( type == "way" ) { - member = getWay(memberID); - if (member == null) { - member = new Way(memberID,0,{},false,[]); - setWay(Way(member),true); - } - } else if ( type == "relation" ) { - member = getRelation(memberID); - if (member == null) { - member = new Relation(memberID,0,{},false,[]); - setRelation(Relation(member),true); + var rel:Relation = getRelation(id); + if ( rel == null || !rel.loaded ) { + tags = parseTags(relData.tag); + var members:Array = []; + for each(var memberXML:XML in relData.member) { + var type:String = memberXML.@type.toLowerCase(); + var role:String = memberXML.@role; + var memberID:Number = Number(memberXML.@ref); + var member:Entity = null; + if ( type == "node" ) { + member = getNode(memberID); + if ( member == null ) { + member = new Node(memberID,0,{},false,0,0); + setNode(Node(member),true); + } else if (member.isDeleted()) { + member.setDeletedState(false); + } + } else if ( type == "way" ) { + member = getWay(memberID); + if (member == null) { + member = new Way(memberID,0,{},false,[]); + setWay(Way(member),true); + } + } else if ( type == "relation" ) { + member = getRelation(memberID); + if (member == null) { + member = new Relation(memberID,0,{},false,[]); + setRelation(Relation(member),true); + } } - } - if ( member != null ) - members.push(new RelationMember(member, role)); - } + if ( member != null ) + members.push(new RelationMember(member, role)); + } - if ( rel == null ) - setRelation(new Relation(id, version, tags, true, members, uid, timestamp), false); - else { - rel.update(version, tags, true, false, members, uid, timestamp); - sendEvent(new EntityEvent(NEW_RELATION, rel), false); + if ( rel == null ) + setRelation(new Relation(id, version, tags, true, members, uid, timestamp), false); + else { + rel.update(version, tags, true, false, members, uid, timestamp); + sendEvent(new EntityEvent(NEW_RELATION, rel), false); + } } } - } - for each(var nodeData:XML in map.node) { - id = Number(nodeData.@id); - node = getNode(id); - newNode = new Node(id, - uint(nodeData.@version), - parseTags(nodeData.tag), - true, - Number(nodeData.@lat), - Number(nodeData.@lon), - Number(nodeData.@uid), - nodeData.@timestamp); + for each(var nodeData:XML in map.node) { + id = Number(nodeData.@id); + node = getNode(id); + newNode = new Node(id, + uint(nodeData.@version), + parseTags(nodeData.tag), + true, + Number(nodeData.@lat), + Number(nodeData.@lon), + Number(nodeData.@uid), + nodeData.@timestamp); - if ( singleEntityRequest ) { - // it's a revert request, so create/update the node - setOrUpdateNode(newNode, true); - } else if ( node == null || !node.loaded) { - // the node didn't exist before, so create/update it - newNode.parentsLoaded=newNode.within(minlon,maxlon,minlat,maxlat); - setOrUpdateNode(newNode, true); - } else { - // the node's already in memory, but store it in case one of the new ways needs it - if (newNode.within(minlon,maxlon,minlat,maxlat)) newNode.parentsLoaded=true; - unusedNodes[id]=newNode; - } - } + if ( singleEntityRequest ) { + // it's a revert request, so create/update the node + setOrUpdateNode(newNode, true); + } else if ( node == null || !node.loaded) { + // the node didn't exist before, so create/update it + newNode.parentsLoaded=newNode.within(minlon,maxlon,minlat,maxlat); + setOrUpdateNode(newNode, true); + } else { + // the node's already in memory, but store it in case one of the new ways needs it + if (newNode.within(minlon,maxlon,minlat,maxlat)) newNode.parentsLoaded=true; + unusedNodes[id]=newNode; + } + } - for each(var data:XML in map.way) { - id = Number(data.@id); - version = uint(data.@version); - uid = Number(data.@uid); - timestamp = data.@timestamp; + for each(var data:XML in map.way) { + id = Number(data.@id); + version = uint(data.@version); + uid = Number(data.@uid); + timestamp = data.@timestamp; - var way:Way = getWay(id); - if ( way == null || !way.loaded || singleEntityRequest) { - var nodes:Array = []; - for each(var nd:XML in data.nd) { - var nodeid:Number=Number(nd.@ref) - if (getNode(nodeid).isDeleted() && unusedNodes[nodeid]) { - setOrUpdateNode(unusedNodes[nodeid], true); - } - nodes.push(getNode(nodeid)); - } - tags = parseTags(data.tag); - if ( way == null ) { - setWay(new Way(id, version, tags, true, nodes, uid, timestamp),false); - } else { - waycount++; - way.update(version, tags, true, true, nodes, uid, timestamp); - sendEvent(new EntityEvent(NEW_WAY, way), false); + var way:Way = getWay(id); + if ( way == null || !way.loaded || singleEntityRequest) { + var nodes:Array = []; + for each(var nd:XML in data.nd) { + var nodeid:Number=Number(nd.@ref) + if (getNode(nodeid).isDeleted() && unusedNodes[nodeid]) { + setOrUpdateNode(unusedNodes[nodeid], true); + } + nodes.push(getNode(nodeid)); + } + tags = parseTags(data.tag); + if ( way == null ) { + setWay(new Way(id, version, tags, true, nodes, uid, timestamp),false); + } else { + waycount++; + way.update(version, tags, true, true, nodes, uid, timestamp); + sendEvent(new EntityEvent(NEW_WAY, way), false); + } } } - } - markBboxLoaded(minlon,maxlon,maxlat,minlat); - registerPOINodes(); + markBboxLoaded(minlon,maxlon,maxlat,minlat); + registerPOINodes(); + } + dispatchEvent(new Event(LOAD_COMPLETED)); } diff --git a/net/systemeD/halcyon/connection/XMLConnection.as b/net/systemeD/halcyon/connection/XMLConnection.as index a76f5ff3..6a22bf4c 100644 --- a/net/systemeD/halcyon/connection/XMLConnection.as +++ b/net/systemeD/halcyon/connection/XMLConnection.as @@ -57,6 +57,7 @@ package net.systemeD.halcyon.connection { mapLoader.addEventListener(Event.COMPLETE, loadedMap); mapLoader.addEventListener(IOErrorEvent.IO_ERROR, errorOnMapLoad); mapLoader.addEventListener(HTTPStatusEvent.HTTP_STATUS, mapLoadStatus); + request.requestHeaders.push(new URLRequestHeader("X-Error-Format", "XML")); mapLoader.load(request); dispatchEvent(new Event(LOAD_STARTED)); } -- 2.30.0