source: subversion/applications/editors/potlatch/error.as @ 15276

Last change on this file since 15276 was 15276, checked in by richard, 10 years ago

improve error handling when connection fails; closes #1864 and #1871

  • Property svn:executable set to *
File size: 7.2 KB
Line 
1
2        // =====================================================================
3        // Error handling
4
5        function handleError(code,msg,result) {
6                if (code==-2 && msg.indexOf('allocate memory')>-1) { code=-1; }
7                switch (code) {
8                        case -1:        errorDialogue(msg,150); break;
9                        case -2:        errorDialogue(msg+iText("\n\nPlease e-mail richard\@systemeD.net with a bug report, saying what you were doing at the time.",'emailauthor'),200); break;
10                        case -3:        resolveConflict(msg,result); break;             // version conflict
11                        case -4:        deleteObject(msg,result[0]); break;             // object not found
12                        case -5:        break;                                                                  // not executed due to previous error
13                }
14        }
15
16        function errorDialogue(t,h) {
17                abortUpload();
18                _root.windows.attachMovie("modal","error",++windowdepth);
19                _root.windows.error.init(350,h,new Array(iText('Ok','ok')),null);
20                _root.windows.error.box.createTextField("prompt",2,7,9,325,h-30);
21                writeText(_root.windows.error.box.prompt,t);
22                _root.windows.error.box.prompt.selectable=true;
23        }
24
25        function handleWarning() {
26                abortUpload();
27                _root.windows.attachMovie("modal","error",++windowdepth);
28                _root.windows.error.init(275,130,new Array(iText('Retry','retry'),iText('Cancel','cancel')),handleWarningAction);
29                _root.windows.error.box.createTextField("prompt",2,7,9,250,100);
30        _root.uploading=false;
31                if (writeError) {
32                        writeText(_root.windows.error.box.prompt,iText("Sorry - the connection to the OpenStreetMap server failed. Any recent changes have not been saved.\n\nWould you like to try again?",'error_connectionfailed'));
33                } else {
34                        writeText(_root.windows.error.box.prompt,iText("Sorry - the OpenStreetMap server didn't respond when asked for data.\n\nWould you like to try again?",'error_readfailed'));
35                }
36        };
37
38        function handleWarningAction(choice) {
39                _root.panel.i_warning._visible=false;
40                _root.writesrequested=0;
41                _root.waysrequested=_root.waysreceived=_root.whichrequested=_root.whichreceived=0;
42        var retry=(choice==iText('Retry','retry'));
43                if (writeError) {
44                        // loop through all ways which are uploading, and reupload
45                        for (var q in _root.map.ways) {
46                                if (_root.map.ways[q].uploading) {
47                                        _root.map.ways[q].uploading=_root.map.ways[q].clean=false;
48                                        var z=_root.map.ways[q].path; for (var i in z) {
49                                                _root.map.ways[q].path[i].uploading=false;
50                                        }
51                                        if (!_root.sandbox && retry) { _root.map.ways[q].upload(); }
52                                }
53                        }
54                        for (var q in _root.map.relations) {
55                                if (_root.map.relations[q].uploading) {
56                                        _root.map.relations[q].uploading=root.map.relations[q].clean=false;
57                                        if (!_root.sandbox && retry) { _root.map.relations[q].upload(); }
58                                }
59                        }
60                        for (var q in _root.map.pois) {
61                                if (_root.map.pois[q].uploading) {
62                                        _root.map.pois[q].uploading=_root.map.pois[q].clean=false;
63                                        if (!_root.sandbox && retry) { _root.map.pois[q].upload(); }
64                                }
65                        }
66                        if (_root.sandbox && retry) { prepareUpload(); }
67                }
68                if (readError) { 
69                        bigedge_l=bigedge_b= 999999;
70                        bigedge_r=bigedge_t=-999999;
71                        whichWays();
72                }
73                writeError=false; readError=false;
74        };
75
76        // Delete object from Potlatch if server reports it doesn't exist
77
78        function deleteObject(type,id) {
79                switch (type) {
80                        case 'way':
81                                if (_root.map.ways[id]) {
82                                        var w=_root.map.ways[id];
83                                        w.removeNodeIndex();
84                                        memberDeleted('Way', id);
85                                        if (id==wayselected) { stopDrawing(); deselectAll(); }
86                                        removeMovieClip(_root.map.areas[id]);
87                                        removeMovieClip(w);
88                                }
89                                break;
90                        case 'relation':
91                                if (_root.map.relations[id]) {
92                                        var mems=_root.map.relations[id].members;
93                                        for (var i in mems) { var r=findLinkedHash(mems[i][0],mems[i][1]); delete r[id]; }
94                                        removeMovieClip(_root.map.relations[id]);
95                                }
96                                break;
97                        case 'node':
98                                if (_root.map.pois[id]) {
99                                        if (id==_poiselected) { deselectAll(); }
100                                        removeMovieClip(_root.map.pois[id]);
101                                }
102                                break;
103                }
104        }
105
106        // =====================================================================
107        // Conflict management
108
109        function resolveConflict(msg,result) {
110                //  msg[0] is type (node/way)
111                //  msg[1] is version
112                // (msg[2] is type actually causing conflict, and msg[3] id, if in a way)
113                //  result[0] is id
114                _root.cmsg=msg; _root.cresult=result;           // _root. so we can access them from the "Ok" function
115                var ctype=msg[0]; var cid=result[0];
116                var t1,t2;
117
118                abortUpload();
119                switch (ctype) {
120                        case 'way':             var n=getName(_root.map.ways[cid].attr,waynames); if (n) { n=" ("+n+")"; }
121                                                        t1=iText("Since you started editing, someone else has changed way $1$2.","conflict_waychanged",cid,n);
122                                                        t2=iText("Click 'Ok' to show the way.","conflict_visitway"); break;
123                        case 'node':    var n=getName(_root.map.pois[cid].attr,nodenames); if (n) { n=" ("+n+")"; }
124                                                        t1=iText("Since you started editing, someone else has changed point $1$2.","conflict_poichanged",cid,n);
125                                                        t2=iText("Click 'Ok' to show the point.","conflict_visitpoi"); break;
126                        case 'relation':var n=_root.map.relations[cid].verboseText(); if (n) { n=" ("+n+")"; }
127                                                        t1=iText("Since you started editing, someone else has changed relation $1$2.","conflict_relchanged",cid,n);
128                                                        t2=""; break;
129                }
130                _root.windows.attachMovie("modal","resolve",++windowdepth);
131                _root.windows.resolve.init(300,150,new Array('Ok'),function() { handleConflictAction(_root.windows.resolve.box.fixoption.selected); });
132                var box=_root.windows.resolve.box;
133
134                box.createTextField("prompt1",2,7,9,282,200);
135                writeText(box.prompt1,t1); var t=box.prompt1.textHeight;
136
137                box.attachMovie("radio","fixoption",3);
138                box.fixoption.addButton(10,t+22,iText("Download their version",'conflict_download'));
139                box.fixoption.addButton(10,t+40,iText("Overwrite their version",'conflict_overwrite'));
140                box.fixoption.select(1);
141
142                if (t2) {
143                        box.createTextField("prompt2",4,7,t+60,282,20);
144                        writeText(box.prompt2,t2);
145                }
146        }
147       
148        function handleConflictAction(choice) {
149                var tx,ty;
150                var ctype=_root.cmsg[0]; var cid=_root.cresult[0];
151                if              (ctype=='way'  && _root.map.ways[cid]) { preway=cid;  tx=_root.map.ways[cid].path[0].x; ty=_root.map.ways[cid].path[0].y; }
152                else if (ctype=='node' && _root.map.pois[cid]) { prenode=cid; tx=_root.nodes[cid].x; ty=_root.nodes[cid].y; }
153
154                if (choice==1) { deselectAll(); deleteObject(ctype,cid); }      // downloading new version, so delete old one from Potlatch
155                if (tx && ty && (tx<long2coord(_root.edge_l) || tx>long2coord(_root.edge_r) || ty<lat2coord(_root.edge_t) || ty>lat2coord(_root.edge_b))) {
156                        updateCoords(tx,ty);
157                }
158
159                if (choice==1) {
160                        // download new (more up-to-date) version and select it
161                        whichWays(true);
162                } else {
163                        // select problem object
164                        if              (ctype=='way' ) { _root.map.ways[cid].select(); }
165                        else if (ctype=='node') { _root.map.pois[cid].select(); }
166                        // change version number
167                        var v=_root.cmsg[1]; var rtype,rid;
168                        if (_root.cmsg[2]) { rtype=_root.cmsg[2]; rid=_root.cmsg[3]; ctype=ctype+","+rtype; }
169                        switch (ctype) {
170                                case 'way,way':         _root.map.ways[cid].version=v; _root.map.ways[cid].clean=false; break;
171                                case 'way,node':        _root.nodes[rid].version=v; _root.nodes[rid].markDirty(); _root.map.ways[cid].clean=false; break;
172                                case 'node':            _root.nodes[cid].version=v; _root.nodes[cid].markDirty(); _root.map.pois[cid].clean=false; break;
173                                case 'relation':        _root.map.relations[cid].version=v; _root.map.relations[cid].clean=false; break;
174                        }
175                }
176        }
Note: See TracBrowser for help on using the repository browser.