1 package net.systemeD.halcyon.connection {
5 import flash.system.Security;
7 import org.iotashan.oauth.*;
9 import net.systemeD.halcyon.MapEvent;
10 import net.systemeD.halcyon.connection.bboxes.*;
13 * XMLBaseConnection is the common code between connecting to an OSM server
14 * (i.e. XMLConnection) and connecting to a standalone .osm file (i.e. OSMConnection)
15 * and so mainly concerns itself with /map -call-ish related matters
17 public class XMLBaseConnection extends Connection {
19 public function XMLBaseConnection(name:String,api:String,policy:String,initparams:Object) {
20 super(name,api,policy,initparams);
23 protected function loadedMap(event:Event):void {
24 var map:XML = new XML(URLLoader(event.target).data);
26 if (map.name().localName=="osmError") {
27 dispatchEvent(new MapEvent(MapEvent.ERROR, { message: "Couldn't load the map: " + map.message } ));
34 var node:Node, newNode:Node;
35 var unusedNodes:Object={};
36 var createdEntities:Array=[];
38 var minlon:Number, maxlon:Number, minlat:Number, maxlat:Number;
39 var singleEntityRequest:Boolean=true;
40 if (map.bounds.@minlon.length()) {
41 minlon=map.bounds.@minlon;
42 maxlon=map.bounds.@maxlon;
43 minlat=map.bounds.@minlat;
44 maxlat=map.bounds.@maxlat;
45 singleEntityRequest=false;
46 fetchSet.add(new Box().fromBbox(minlon,minlat,maxlon,maxlat));
49 for each(var relData:XML in map.relation) {
50 id = Number(relData.@id);
51 version = uint(relData.@version);
52 uid = Number(relData.@uid);
53 timestamp = relData.@timestamp;
55 var rel:Relation = getRelation(id);
56 if ( rel == null || !rel.loaded || singleEntityRequest ) {
57 tags = parseTags(relData.tag);
58 var members:Array = [];
59 for each(var memberXML:XML in relData.member) {
60 var type:String = memberXML.@type.toLowerCase();
61 var role:String = memberXML.@role;
62 var memberID:Number = Number(memberXML.@ref);
63 var member:Entity = null;
64 if ( type == "node" ) {
65 member = getNode(memberID);
66 if ( member == null ) {
67 member = new Node(this,memberID,0,{},false,0,0);
68 setNode(Node(member),true);
69 } else if (member.isDeleted()) {
70 member.setDeletedState(false);
72 } else if ( type == "way" ) {
73 member = getWay(memberID);
75 member = new Way(this,memberID,0,{},false,[]);
76 setWay(Way(member),true);
78 } else if ( type == "relation" ) {
79 member = getRelation(memberID);
81 member = new Relation(this,memberID,0,{},false,[]);
82 setRelation(Relation(member),true);
87 members.push(new RelationMember(member, role));
91 rel=new Relation(this, id, version, tags, true, members, uid, timestamp);
92 setRelation(rel, false);
93 createdEntities.push(rel);
95 rel.update(version, tags, true, false, members, uid, timestamp);
96 sendEvent(new EntityEvent(NEW_RELATION, rel), false);
101 for each(var nodeData:XML in map.node) {
102 id = Number(nodeData.@id);
104 newNode = new Node(this,
106 uint(nodeData.@version),
107 parseTags(nodeData.tag),
109 Number(nodeData.@lat),
110 Number(nodeData.@lon),
111 Number(nodeData.@uid),
112 nodeData.@timestamp);
113 if ( inlineStatus ) { newNode.status = nodeData.@status; }
115 if ( singleEntityRequest ) {
116 // it's a revert request, so create/update the node
117 setOrUpdateNode(newNode, true);
118 } else if ( node == null || !node.loaded) {
119 // the node didn't exist before, so create/update it
120 newNode.parentsLoaded=newNode.within(minlon,maxlon,minlat,maxlat);
121 setOrUpdateNode(newNode, true);
122 createdEntities.push(newNode);
124 // the node's already in memory, but store it in case one of the new ways needs it
125 if (newNode.within(minlon,maxlon,minlat,maxlat)) newNode.parentsLoaded=true;
126 unusedNodes[id]=newNode;
130 for each(var data:XML in map.way) {
131 id = Number(data.@id);
132 version = uint(data.@version);
133 uid = Number(data.@uid);
134 timestamp = data.@timestamp;
136 var way:Way = getWay(id);
137 if ( way == null || !way.loaded || singleEntityRequest) {
138 var nodelist:Array = [];
139 for each(var nd:XML in data.nd) {
140 var nodeid:Number=Number(nd.@ref)
141 if (getNode(nodeid).isDeleted() && unusedNodes[nodeid]) {
142 setOrUpdateNode(unusedNodes[nodeid], true);
144 nodelist.push(getNode(nodeid));
146 tags = parseTags(data.tag);
148 way=new Way(this, id, version, tags, true, nodelist, uid, timestamp)
149 if ( inlineStatus ) { way.status = data.@status; }
151 createdEntities.push(way);
154 way.update(version, tags, true, true, nodelist, uid, timestamp);
155 if ( inlineStatus ) { way.status = data.@status; }
156 sendEvent(new EntityEvent(NEW_WAY, way), false);
163 dispatchEvent(new Event(LOAD_COMPLETED));
165 if (statusFetcher) statusFetcher.fetch(createdEntities);
168 protected function registerPOINodes():void {
169 for each (var nodeID:Number in getAllNodeIDs()) {
170 var node:Node = getNode(nodeID);
171 if (!node.hasParentWays)
176 private function parseTags(tagElements:XMLList):Object {
177 var tags:Object = {};
178 for each (var tagEl:XML in tagElements)
179 tags[tagEl.@k] = tagEl.@v;