1 package net.systemeD.halcyon.connection {
5 import flash.system.Security;
7 import org.iotashan.oauth.*;
9 import net.systemeD.halcyon.MapEvent;
12 * XMLBaseConnection is the common code between connecting to an OSM server
13 * (i.e. XMLConnection) and connecting to a standalone .osm file (i.e. OSMConnection)
14 * and so mainly concerns itself with /map -call-ish related matters
16 public class XMLBaseConnection extends Connection {
18 public function XMLBaseConnection(name:String,api:String,policy:String,initparams:Object) {
19 super(name,api,policy,initparams);
22 protected function loadedMap(event:Event):void {
23 var map:XML = new XML(URLLoader(event.target).data);
25 if (map.localName=="osmError") {
26 dispatchEvent(new MapEvent(MapEvent.ERROR, { message: "Couldn't load the map: " + map.message } ));
33 var node:Node, newNode:Node;
34 var unusedNodes:Object={};
35 var createdEntities:Array=[];
37 var minlon:Number, maxlon:Number, minlat:Number, maxlat:Number;
38 var singleEntityRequest:Boolean=true;
39 if (map.bounds.@minlon.length()) {
40 minlon=map.bounds.@minlon;
41 maxlon=map.bounds.@maxlon;
42 minlat=map.bounds.@minlat;
43 maxlat=map.bounds.@maxlat;
44 singleEntityRequest=false;
47 for each(var relData:XML in map.relation) {
48 id = Number(relData.@id);
49 version = uint(relData.@version);
50 uid = Number(relData.@uid);
51 timestamp = relData.@timestamp;
53 var rel:Relation = getRelation(id);
54 if ( rel == null || !rel.loaded || singleEntityRequest ) {
55 tags = parseTags(relData.tag);
56 var members:Array = [];
57 for each(var memberXML:XML in relData.member) {
58 var type:String = memberXML.@type.toLowerCase();
59 var role:String = memberXML.@role;
60 var memberID:Number = Number(memberXML.@ref);
61 var member:Entity = null;
62 if ( type == "node" ) {
63 member = getNode(memberID);
64 if ( member == null ) {
65 member = new Node(this,memberID,0,{},false,0,0);
66 setNode(Node(member),true);
67 } else if (member.isDeleted()) {
68 member.setDeletedState(false);
70 } else if ( type == "way" ) {
71 member = getWay(memberID);
73 member = new Way(this,memberID,0,{},false,[]);
74 setWay(Way(member),true);
76 } else if ( type == "relation" ) {
77 member = getRelation(memberID);
79 member = new Relation(this,memberID,0,{},false,[]);
80 setRelation(Relation(member),true);
85 members.push(new RelationMember(member, role));
89 rel=new Relation(this, id, version, tags, true, members, uid, timestamp);
90 setRelation(rel, false);
91 createdEntities.push(rel);
93 rel.update(version, tags, true, false, members, uid, timestamp);
94 sendEvent(new EntityEvent(NEW_RELATION, rel), false);
99 for each(var nodeData:XML in map.node) {
100 id = Number(nodeData.@id);
102 newNode = new Node(this,
104 uint(nodeData.@version),
105 parseTags(nodeData.tag),
107 Number(nodeData.@lat),
108 Number(nodeData.@lon),
109 Number(nodeData.@uid),
110 nodeData.@timestamp);
112 if ( singleEntityRequest ) {
113 // it's a revert request, so create/update the node
114 setOrUpdateNode(newNode, true);
115 } else if ( node == null || !node.loaded) {
116 // the node didn't exist before, so create/update it
117 newNode.parentsLoaded=newNode.within(minlon,maxlon,minlat,maxlat);
118 setOrUpdateNode(newNode, true);
119 createdEntities.push(newNode);
121 // the node's already in memory, but store it in case one of the new ways needs it
122 if (newNode.within(minlon,maxlon,minlat,maxlat)) newNode.parentsLoaded=true;
123 unusedNodes[id]=newNode;
127 for each(var data:XML in map.way) {
128 id = Number(data.@id);
129 version = uint(data.@version);
130 uid = Number(data.@uid);
131 timestamp = data.@timestamp;
133 var way:Way = getWay(id);
134 if ( way == null || !way.loaded || singleEntityRequest) {
135 var nodelist:Array = [];
136 for each(var nd:XML in data.nd) {
137 var nodeid:Number=Number(nd.@ref)
138 if (getNode(nodeid).isDeleted() && unusedNodes[nodeid]) {
139 setOrUpdateNode(unusedNodes[nodeid], true);
141 nodelist.push(getNode(nodeid));
143 tags = parseTags(data.tag);
145 way=new Way(this, id, version, tags, true, nodelist, uid, timestamp)
147 createdEntities.push(way);
150 way.update(version, tags, true, true, nodelist, uid, timestamp);
151 sendEvent(new EntityEvent(NEW_WAY, way), false);
156 markBboxLoaded(minlon,maxlon,maxlat,minlat);
160 dispatchEvent(new Event(LOAD_COMPLETED));
162 if (statusFetcher) statusFetcher.fetch(createdEntities);
165 protected function registerPOINodes():void {
166 for each (var nodeID:Number in getAllNodeIDs()) {
167 var node:Node = getNode(nodeID);
168 if (!node.hasParentWays)
173 private function parseTags(tagElements:XMLList):Object {
174 var tags:Object = {};
175 for each (var tagEl:XML in tagElements)
176 tags[tagEl.@k] = tagEl.@v;