aboutsummaryrefslogtreecommitdiff
path: root/src/filesys.cpp
Commit message (Expand)AuthorAge
* fix: extractZipFile is not part of Client but more generic.Loic Blot2021-05-06
* Use consistent temp folder path (#10892)rubenwardy2021-02-07
* Remove dead code (#10845)rubenwardy2021-01-22
* Fix some minor code issues all over the placesfan52020-12-24
* Clean up server-side translations, remove global variable (#10075)rubenwardy2020-09-16
* Server pushing media at runtime (#9961)sfan52020-06-13
* Fix a stringop-truncation GCC warningLoïc Blot2018-12-04
* Android: Fix recursive delete (#7882)stujones112018-11-21
* Really delete things in fs::RecursiveDelete (#7433)Vitaliy2018-08-18
* Android: Use correct temporary path (#7463)stujones112018-06-23
* Load files from subfolders in texturepacksnumber Zero2017-11-17
* Modernize various filesLoic Blot2017-08-18
* Fix RemoveRelatvePathComponentsShadowNinja2016-12-20
* Fix fs::RemoveRelativePathComponents for paths with a leading dot componentShadowNinja2016-11-24
* Use MoveFileEx to rename files on Windows (not rename)gregorycu2016-05-01
* filesys: safeWriteToFile(): Remove the target file before rename only on WindowsPerttu Ahola2016-01-01
* Add seperate cache pathShadowNinja2015-12-07
* Windows: Fix some warnings.Diego Martinez2015-07-09
* Add mod securityShadowNinja2015-05-16
* Tests: Modularize unit testingkwolekr2015-04-26
* Schematics: Prepend mod path to relative schematic filepathskwolekr2015-04-08
* Fix fs::GetRecursiveSubPaths trying to get directory lists for filesShadowNinja2014-12-24
* Rewrite fs:GetDirListing(file) by kahrlSmallJoker2014-12-10
* Ignore .name directories and filesSmallJoker2014-12-10
* Remove temporary file at safeWriteToFile()selat2014-08-16
* Add support for Android 2.3+sapier2014-06-29
* Omnicleanup: header cleanup, add ModApiUtil shared between game and mainmenuKahrl2013-08-14
* Dont write directly to files but rather write and copy a tmp filePilzAdam2013-08-13
* Fix various memory access problems detected by valgrindKahrl2013-08-07
* Replace C++ mainmenu by formspec powered onesapier2013-07-02
* Update Copyright YearsSfan52013-02-24
* Change Minetest-c55 to MinetestPilzAdam2013-02-24
* Switch the license to be LGPLv2/later, with small parts still remaining as GP...Perttu Ahola2012-06-05
* Add #include <unistd.h> to filesys.cppPerttu Ahola2012-04-06
* Better file/directory removal platform code and utilitiesPerttu Ahola2012-03-26
* Small fix to fs::GetDirListing when trying to list an inexistent directoryPerttu Ahola2012-03-25
* Fix filesys.cpp debug output to go into debug.txtPerttu Ahola2012-03-23
* Fix CreateAllDirs() (failed for relative fully non-existing path)Perttu Ahola2012-03-11
* Check symlinks with stat() to know if they are directories or notPerttu Ahola2011-12-04
* Add support for unix filesystems which yield DT_UNKNOWN in dirent->d_type, fa...Perttu Ahola2011-12-04
* Fix map delete on windows (concatenate paths correctly with / or \ depending ...Perttu Ahola2011-10-16
* Fix bug in posix file/directory removal wrapper, as pointed out by kahrlPerttu Ahola2011-09-06
* Windows.h -> windows.h for cross-mingw buildPerttu Ahola2011-08-14
* New map directory structure that avoids map size being limited by filesystemCiaran Gultnieks2011-05-18
* should work nowPerttu Ahola2011-01-26
* Little fixesPerttu Ahola2011-01-26
* Map deletion buttonPerttu Ahola2011-01-26
* removed boost support from filesys.cpp; default to posixPerttu Ahola2011-01-07
* license stuffPerttu Ahola2010-11-29
* Initial filesPerttu Ahola2010-11-27
n>; var factory = factorx; var originx = 7000 + 8 + 0.5; var originy = 7000 + 8 - 0.5; var zoom_level_real = 6; L.CRS.pr = L.extend({}, L.CRS.Simple, { projection: L.Projection.LonLat, transformation: new L.Transformation(factorx,factorx * originx,-factory,factory * originy), scale: function(zoom) { return Math.pow(2, zoom); }, zoom: function(scale) { return Math.log(scale) / Math.LN2; }, distance: function(latlng1, latlng2) { var dx = latlng2.lng - latlng1.lng , dy = latlng2.lat - latlng1.lat; return Math.sqrt(dx * dx + dy * dy); }, infinite: true }); // Init map mymap = L.map('mapid', { renderer: streetLabelsRenderer, editable: true, crs: L.CRS.pr }).setView([0, 0], 6); var mapheight = 16384; var mapwidth = mapheight; var sw = mymap.unproject([0, 0], zoom_level_real); var ne = mymap.unproject([mapwidth, mapheight], zoom_level_real); var layerbounds = new L.LatLngBounds(sw,ne); var layers = L.control.layers({}, {}).addTo(mymap); function load_svg(name, url, active=1) { var xhttp_ps = new XMLHttpRequest(); xhttp_ps.onreadystatechange = function() { if (this.readyState == 4) { if (this.status == 200) { var svgElement = document.createElementNS("http://www.w3.org/2000/svg", "svg"); svgElement.setAttribute('xmlns', "http://www.w3.org/2000/svg"); svgElement.setAttribute('viewBox', "0 0 16384 16384"); svgElement.innerHTML = xhttp_ps.responseText; var svgElementBounds = [[0, 0], [1000, 1000]]; var overlay = L.svgOverlay(svgElement, svgElementBounds); layers.addOverlay(overlay, name); if (active) overlay.addTo(mymap); return overlay; } else { alert("Error: Could not load SVG map layer (" + name + ")"); } } } ; xhttp_ps.open("GET", url, true); xhttp_ps.send(); } function load_tiles(name, id) { var satellite = L.tileLayer('https://notsyncing.net/maps.linux-forks.de/tiles/?id={id}&z={z}&x={x}&y={y}', { maxZoom: 14 /*8*/, maxNativeZoom: 6, minNativeZoom: 0, minZoom: 0, noWrap: true, attribution: 'Map data &copy; <a href="https://wiki.linux-forks.de/mediawiki/index.php/Maps">Linux-Forks</a>, ' + 'All rights reserved, ', id: id, tileSize: 256, zoomOffset: 0, opacity: 1.0, bounds: layerbounds }); layers.addBaseLayer(satellite, name); return satellite; } function load_geojson(name, url, iconname, iconcolor, active=1, style={}) { var xhttp_ps = new XMLHttpRequest(); xhttp_ps.onreadystatechange = function() { if (this.readyState == 4) { if (this.status == 200) { switch (iconname) { case "street": onEachFeature = null; pointToLayer = null; break; default: /* else it is a marker with the specified icon */ onEachFeature = function(feature, layer) { label = String(feature.properties.name) layer.bindPopup('<h1><a href="https://wiki.linux-forks.de/mediawiki/index.php/' + feature.properties.name + '">' + feature.properties.name + '</a> (' + feature.geometry.coordinates + ')</h1>' + '<p><img style="width:100%" src="' + feature.properties.image + '"></p>' + '<p>' + feature.properties.description + '</p>'); layer.bindTooltip(label, { permanent: true, direction: "center", className: "city-names" }).openTooltip().on('click', jump_to_marker); }; pointToLayer = function(feature, latlng) { label = String(feature.properties.name) return new L.marker(latlng,{ icon: L.AwesomeMarkers.icon({ icon: iconname, markerColor: iconcolor }) }).bindTooltip(label, { permanent: false, direction: "center", opacity: 0.7 }).openTooltip(); }; break; } var json = JSON.parse(xhttp_ps.responseText); var geojson = L.geoJSON(json, { style: style, onEachFeature: onEachFeature, pointToLayer: pointToLayer }); layers.addOverlay(geojson, name); if (active) geojson.addTo(mymap); return geojson; } else { console.log("Error: Could not load geojson map layer (" + name + ")."); } } } ; xhttp_ps.open("GET", url, true); xhttp_ps.send(); } load_tiles("Satellite (2020-04-09)", 'world-2020-04-09').addTo(mymap); load_tiles("Satellite (2019-05-04, wrong coords)", 'world-2019-05-04'); //load_svg("Test", "./overlay.svg", 0); load_geojson("Cities", "./geojson/cities.json", "city", "red"); load_geojson("Stations", "./geojson/stations.json", "train", "blue"); load_geojson("Shops", "./geojson/shops.json", "shopping-cart", "green"); load_geojson("Parks", "./geojson/parks.json", "tree", "darkgreen"); load_geojson("Libraries", "./geojson/libraries.json", "book-open", "darkblue"); load_geojson("CW Complexes", "./geojson/cw_complexes.json", "border-all", "black"); load_geojson("Courts", "./geojson/courts.json", "balance-scale", "black"); load_geojson("Waterway", "./geojson/waterway.json", "water", "darkblue"); load_geojson("Train Depots", "./geojson/depots.json", "wrench", "violet"); load_geojson("Streets", "./geojson/streets.json", "street", "blue", 0); L.control.scale().addTo(mymap); function get_current_location_str() { var latlng = mymap.getCenter(); return Math.round(latlng.lng) + "," + Math.round(latlng.lat) + "," + mymap.getZoom(); } /* Important: Do not use mymap.setView, use this function instead */ function jump_to(latlng, zoom = -1) { if (zoom == -1) zoom = mymap.getZoom(); if (!editor_mode) document.location.hash = "#" + Math.round(latlng.lng) + "," + Math.round(latlng.lat) + "," + zoom; else mymap.setView(latlng, zoom); } function jump_to_marker(e) { jump_to(e.target.getLatLng()); } function prompt_location() { var str = prompt("Enter coordinates to jump to:\n\n" + "Format: x, y [, zoom]", get_current_location_str()); if (str) { if (!editor_mode) document.location.hash = "#" + str; else onHashChange(null, "#" + str); } } var search_element; function toggle_search() { if (el = document.getElementById('searchbar')) { el.parentNode.removeChild(el); return; } if (!search_element) { search_element = document.createElement("div"); search_element.style.overflow = "scroll"; search_element.style.padding = "6px"; search_element.style.height = "100%"; search_element.innerHTML = '<input style="width:100%;" id="search_query" name="lifo_map_search" type="search" placeholder="Start typing to search..." onkeypress="search(event)"><div id="search_results"></div>' ; } td = document.getElementById('windowtr').insertCell(0); td.style.width = "400px"; td.style.borderRight = "1px solid black"; td.style.verticalAlign = "top"; td.id = "searchbar"; td.appendChild(search_element); document.getElementById('search_query').focus(); } function htmlEntities(str) { return String(str).replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;'); } function polyline_get_middle_coords(coords) { var ret = [2]; ret[0] = coords[0][0] + (coords[coords.length - 1][0] - coords[0][0]) / 2; ret[1] = coords[0][1] + (coords[coords.length - 1][1] - coords[0][1]) / 2; return ret; } var regex; function search(e) { var query = htmlEntities(document.getElementById("search_query").value); document.getElementById('search_results').innerHTML = ""; if (query.length > 0 || e.key == "Enter") { results = document.createElement("ul"); for (var i = 0; i < layers._layers.length; i++) { if (!layers._layers[i].layer._layers) continue; for (key in layers._layers[i].layer._layers) { item = layers._layers[i].layer._layers[key]; switch (item.feature.geometry.type) { case "Point": regex = new RegExp(query, 'i'); if (item.feature.properties.name.match(regex)) { el = document.createElement("li"); el.innerHTML = "[" + layers._layers[i].name + "] " + '<a href="#" onclick="layers._layers[' + i + '].layer._layers[' + item._leaflet_id + '].fire(\'click\'); return false;">' + item.feature.properties.name + "</a>"; results.appendChild(el); } break; case "LineString": regex = new RegExp(query, 'i'); if (item.feature.properties.name.match(regex)) { el = document.createElement("li"); zpos = polyline_get_middle_coords(item.feature.geometry.coordinates); el.innerHTML = "[" + layers._layers[i].name + "] " + '<a href="#" onclick="latLng2 = L.latLng(' + zpos[1] + ',' + zpos[0] + '); jump_to(latLng2); return false;">' + item.feature.properties.name + "</a>"; results.appendChild(el); } break; default: break; } } } document.getElementById('search_results').appendChild(results); } return false; } L.MyControl = L.Control.extend({ options: { position: 'topleft', callback: null, kind: '', html: '' }, onAdd: function (map) { var container = L.DomUtil.create('div', 'leaflet-control leaflet-bar'), link = L.DomUtil.create('a', '', container); link.href = '#'; link.title = this.options.title; link.innerHTML = this.options.html; L.DomEvent.on(link, 'click', L.DomEvent.stop) .on(link, 'click', function () { window.LAYER = this.options.callback.call(); }, this); return container; } }); L.SearchControl = L.MyControl.extend({ options: { position: 'topleft', callback: toggle_search, title: 'Search', html: '🔍' } }); L.GotoControl = L.MyControl.extend({ options: { position: 'topleft', callback: prompt_location, title: 'Jump to coordinates', html: '⌖' } }); mymap.addControl(new L.SearchControl()); mymap.addControl(new L.GotoControl()); var popup = L.popup(); L.AwesomeMarkers.Icon.prototype.options.prefix = 'fa'; var baseballIcon = L.AwesomeMarkers.icon({ icon: 'coffee', markerColor: 'red' }); function onMapClick(e) { popup.setLatLng(e.latlng).setContent("You clicked the map at " + e.latlng.toString()).openOn(mymap); } mymap.on('click', onMapClick); var is_user_drag = 0; function update_hash_from_position(e) { if (is_user_drag) is_user_drag = 0; else return; if (!editor_mode) document.location.hash = "#" + get_current_location_str(); } function dragstart(e) { is_user_drag = 1; } mymap.on('zoomend', function () {is_user_drag = 1; update_hash_from_position();}); mymap.on('moveend', update_hash_from_position); mymap.on('dragstart', function () { is_user_drag = 1;}); mymap.on('keydown', function (e) { if (e.originalEvent.code.match(/Arrow.*/)) is_user_drag = 1;}); function onHashChange(e, hash=null) { if (!hash) hash = document.location.hash; if (hash == "#" + get_current_location_str()) return; // We're already there coordstr = hash.slice(1).replace(/%20/g, "").split(","); if (coordstr.length < 2) coordstr.push(0); // Default y if (coordstr.length < 3) coordstr.push(mymap.getZoom()); // Default zoom var latlng = L.latLng(parseFloat(coordstr[1]), parseFloat(coordstr[0])); mymap.setView(latlng, parseInt(coordstr[2])); } window.addEventListener("hashchange", onHashChange, false); onHashChange(null);