commit 7512c5f0ee46810240ca9c1eb9d32345bbb707fa
parent 1f6f48e5286f48ffcc87255ce3609d17100a8d9b
Author: Sergej Orlov <wladimirych@gmail.com>
Date: Mon, 19 Mar 2018 00:05:35 +0300
[tracks] temporary disable creating new links
Diffstat:
2 files changed, 93 insertions(+), 59 deletions(-)
diff --git a/src/lib/leaflet.control.track-list/lib/nktk.js b/src/lib/leaflet.control.track-list/lib/nktk.js
@@ -120,52 +120,103 @@ function deltaDecodeSegment(deltaLats, deltaLons) {
return points;
}
-function saveNktk(segments, name, color, measureTicksShown, waypoints, trackHidden) {
- const trackView = {
- view: {
- color,
- shown: !trackHidden,
- ticksShown: measureTicksShown,
+function packNumber(n) {
+ var bytes = [];
+ if (n >= -64 && n <= 63) {
+ n += 64;
+ bytes.push(n);
+ } else if (n >= -8192 && n <= 8191) {
+ n += 8192;
+ bytes.push((n & 0x7f) | 0x80);
+ bytes.push(n >> 7);
+ /* } else if (n >= -2097152 && n <= 2097151) {
+ n += 2097152;
+ bytes.push((n & 0x7f) | 0x80);
+ bytes.push(((n >> 7) & 0x7f) | 0x80);
+ bytes.push(n >> 14);
+ */
+ } else if (n >= -1048576 && n <= 1048575) {
+ n += 1048576;
+ bytes.push((n & 0x7f) | 0x80);
+ bytes.push(((n >> 7) & 0x7f) | 0x80);
+ bytes.push(n >> 14);
+ } else if (n >= -268435456 && n <= 268435455) {
+ n += 268435456;
+ bytes.push((n & 0x7f) | 0x80);
+ bytes.push(((n >> 7) & 0x7f) | 0x80);
+ bytes.push(((n >> 14) & 0x7f) | 0x80);
+ bytes.push(n >> 21);
+ } else {
+ throw new Error('Number ' + n + ' too big to pack in 29 bits');
+ }
+ return String.fromCharCode.apply(null, bytes);
+}
+
+function saveNktk(segments, name, color, measureTicksShown, wayPoints, trackHidden) {
+ var stringified = [];
+ stringified.push(packNumber(3)); // version
+ name = utf8.encode(name);
+ stringified.push(packNumber(name.length));
+ stringified.push(name);
+
+ var arcUnit = ((1 << 24) - 1) / 360;
+ segments = segments.filter(function(segment) {
+ return segment.length > 1;
}
- };
- const track = trackView.track = {name};
- if (segments && segments.length) {
- let deltaEncodedSegments = [];
- for (let segment of segments) {
- let {deltaLats, deltaLons} = deltaEncodeSegment(segment);
- deltaEncodedSegments.push({lats: deltaLats, lons: deltaLons});
+ );
+
+ stringified.push(packNumber(segments.length));
+ segments.forEach(function(points) {
+ var lastX = 0,
+ lastY = 0,
+ x, y,
+ deltaX, deltaY,
+ p;
+ stringified.push(packNumber(points.length));
+ for (var i = 0, len = points.length; i < len; i++) {
+ p = points[i];
+ x = Math.round(p.lng * arcUnit);
+ y = Math.round(p.lat * arcUnit);
+ deltaX = x - lastX;
+ deltaY = y - lastY;
+ stringified.push(packNumber(deltaX));
+ stringified.push(packNumber(deltaY));
+ lastX = x;
+ lastY = y;
+ }
}
- track.segments = deltaEncodedSegments;
- }
- if (waypoints && waypoints.length) {
- let midLon = 0,
- midLat = 0;
- waypoints.forEach((wp) => {
- midLon += wp.latlng.lng;
- midLat += wp.latlng.lat;
+ );
+ stringified.push(packNumber(+color || 0));
+ stringified.push(packNumber(measureTicksShown ? 1 : 0));
+ stringified.push(packNumber(trackHidden ? 1 : 0));
+
+ stringified.push(packNumber(wayPoints.length));
+ if (wayPoints.length) {
+ var midX = 0, midY = 0;
+ wayPoints.forEach(function(p) {
+ midX += p.latlng.lng;
+ midY += p.latlng.lat;
+ }
+ );
+ midX = Math.round(midX * arcUnit / wayPoints.length);
+ midY = Math.round(midY * arcUnit / wayPoints.length);
+ stringified.push(packNumber(midX));
+ stringified.push(packNumber(midY));
+ wayPoints.forEach(function(p) {
+ var deltaX = Math.round(p.latlng.lng * arcUnit) - midX,
+ deltaY = Math.round(p.latlng.lat * arcUnit) - midY,
+ symbol = 1,
+ name = utf8.encode(p.label);
+ stringified.push(packNumber(name.length));
+ stringified.push(name);
+ stringified.push(packNumber(symbol));
+ stringified.push(packNumber(deltaX));
+ stringified.push(packNumber(deltaY));
}
);
- midLon = Math.round(midLon * arcUnit / waypoints.length);
- midLat = Math.round(midLat * arcUnit / waypoints.length);
- track.waypoints = {
- midLat, midLon
- };
-
- let packedWaypoints = [];
- for (let waypoint of waypoints) {
- packedWaypoints.push({
- name: waypoint.label,
- lat: Math.round(waypoint.latlng.lat * arcUnit) - midLat,
- lon: Math.round(waypoint.latlng.lng * arcUnit) - midLon
- });
- }
- track.waypoints.waypoints = packedWaypoints;
}
- const pbf = new Pbf();
- const versionStr = String.fromCharCode(4 + 64);
- TrackView.write(trackView, pbf);
- const s = versionStr + arrayBufferToString(pbf.finish());
- return encodeUrlSafeBase64(s);
+
+ return encodeUrlSafeBase64(stringified.join(''));
}
function parseTrackUrlData(s) {
diff --git a/src/lib/leaflet.control.track-list/track-list.js b/src/lib/leaflet.control.track-list/track-list.js
@@ -20,9 +20,6 @@ import 'lib/leaflet.polyline-edit';
import 'lib/leaflet.polyline-measure';
import logging from 'lib/logging';
import {notify} from 'lib/notifications';
-import {fetch} from 'lib/xhr-promise';
-import config from 'config';
-import md5 from './lib/md5';
const TrackSegment = L.MeasuredLine.extend({
includes: L.Polyline.EditMixin,
@@ -466,22 +463,8 @@ L.Control.TrackList = L.Control.extend({
return;
}
let serialized = tracks.map((track) => this.trackToString(track)).join('/');
- const hashDigest = md5(serialized, null, true);
- const key = btoa(hashDigest).replace(/\//g, '_').replace(/\+/g, '-').replace(/=/g, '');
- const url = window.location + '&nktl=' + key;
+ const url = window.location + '&nktk=' + serialized;
copyToClipboard(url, mouseEvent);
- fetch(`${config.tracksStorageServer}/track/${key}`, {method: 'POST', data: serialized}).then((xhr) => {
- },
- (e) => {
- let message = e.message || e;
- if (e.xhr.status == 413) {
- message = 'track is too big';
- }
- logging.captureMessage('Failed to save track to server',
- {extra: {status: e.xhr.status, response: e.xhr.responseText}});
- alert('Error making link: ' + message);
- }
- );
},
copyTrackLinkToClipboard: function(track, mouseEvent) {