Merge pull request #1066 from OpenSpace/feature/iss-asset

Feature/iss asset
This commit is contained in:
Alexander Bock
2020-02-10 18:07:51 +01:00
committed by GitHub
56 changed files with 331 additions and 186 deletions
+4
View File
@@ -3,6 +3,10 @@
#Asset
scene/solarsystem/planets/earth/earth required
scene/solarsystem/planets/earth/satellites/satellites required
#Property
setPropertyValue {earth_satellites}.Renderable.Enabled false
#Time
relative -1d
+3
View File
@@ -1,6 +1,7 @@
asset.require('./base')
local earthAsset = asset.require('scene/solarsystem/planets/earth/earth')
asset.request('scene/solarsystem/planets/earth/satellites/satellites.asset')
asset.onInitialize(function ()
local now = openspace.time.currentWallTime()
@@ -10,6 +11,8 @@ asset.onInitialize(function ()
openspace.globebrowsing.goToGeo("Earth", 58.5877, 16.1924, 20000000)
openspace.markInterestingNodes({ "Earth", "Mars", "Moon", "Sun" })
openspace.setPropertyValue("{earth_satellites}.Renderable.Enabled", false)
end)
asset.onDeinitialize(function ()
@@ -1,5 +1,5 @@
local assetHelper = asset.require('util/asset_helper')
local shared = asset.require('../satellites_shared')
local shared = asset.require('util/tle_helper')
local group = {
Title = "Amateur Radio",
@@ -1,5 +1,5 @@
local assetHelper = asset.require('util/asset_helper')
local shared = asset.require('../satellites_shared')
local shared = asset.require('util/tle_helper')
local group = {
Title = "Experimental",
@@ -1,5 +1,5 @@
local assetHelper = asset.require('util/asset_helper')
local shared = asset.require('../satellites_shared')
local shared = asset.require('util/tle_helper')
local group = {
Title = "Geostationary",
@@ -1,5 +1,5 @@
local assetHelper = asset.require('util/asset_helper')
local shared = asset.require('../satellites_shared')
local shared = asset.require('util/tle_helper')
local group = {
Title = "GlobalStar",
@@ -1,5 +1,5 @@
local assetHelper = asset.require('util/asset_helper')
local shared = asset.require('../satellites_shared')
local shared = asset.require('util/tle_helper')
local group = {
Title = "Gorizont",
@@ -1,5 +1,5 @@
local assetHelper = asset.require('util/asset_helper')
local shared = asset.require('../satellites_shared')
local shared = asset.require('util/tle_helper')
local group = {
Title = "Intelsat",
@@ -1,5 +1,5 @@
local assetHelper = asset.require('util/asset_helper')
local shared = asset.require('../satellites_shared')
local shared = asset.require('util/tle_helper')
local group = {
Title = "Iridium",
@@ -1,5 +1,5 @@
local assetHelper = asset.require('util/asset_helper')
local shared = asset.require('../satellites_shared')
local shared = asset.require('util/tle_helper')
local group = {
Title = "Iridium NEXT",
@@ -1,5 +1,5 @@
local assetHelper = asset.require('util/asset_helper')
local shared = asset.require('../satellites_shared')
local shared = asset.require('util/tle_helper')
local group = {
Title = "Molniya",
@@ -1,5 +1,5 @@
local assetHelper = asset.require('util/asset_helper')
local shared = asset.require('../satellites_shared')
local shared = asset.require('util/tle_helper')
local group = {
Title = "Orbcomm",
@@ -1,5 +1,5 @@
local assetHelper = asset.require('util/asset_helper')
local shared = asset.require('../satellites_shared')
local shared = asset.require('util/tle_helper')
local group = {
Title = "Other comm",
@@ -1,5 +1,5 @@
local assetHelper = asset.require('util/asset_helper')
local shared = asset.require('../satellites_shared')
local shared = asset.require('util/tle_helper')
local group = {
Title = "Raduga",
@@ -1,5 +1,5 @@
local assetHelper = asset.require('util/asset_helper')
local shared = asset.require('../satellites_shared')
local shared = asset.require('util/tle_helper')
local group = {
Title = "SES",
@@ -1,5 +1,5 @@
local assetHelper = asset.require('util/asset_helper')
local shared = asset.require('../debris_shared')
local shared = asset.require('util/tle_helper')
local group = {
Title = "Indian ASAT test Debris",
@@ -1,5 +1,5 @@
local assetHelper = asset.require('util/asset_helper')
local shared = asset.require('../debris_shared')
local shared = asset.require('util/tle_helper')
local group = {
Title = "Breeze-M Breakup",
@@ -1,5 +1,5 @@
local assetHelper = asset.require('util/asset_helper')
local shared = asset.require('../debris_shared')
local shared = asset.require('util/tle_helper')
local group = {
Title = "Fengyun Debris",
@@ -1,5 +1,5 @@
local assetHelper = asset.require('util/asset_helper')
local shared = asset.require('../debris_shared')
local shared = asset.require('util/tle_helper')
local group = {
Title = "Iridium 33 Debris",
@@ -1,5 +1,5 @@
local assetHelper = asset.require('util/asset_helper')
local shared = asset.require('../debris_shared')
local shared = asset.require('util/tle_helper')
local group = {
Title = "Kosmos 2251 Debris",
@@ -1,67 +0,0 @@
local transforms = asset.require('scene/solarsystem/planets/earth/transforms')
local assetHelper = asset.require('util/asset_helper')
function downloadTLEFile(sceneAsset, url, name)
local identifier = name
identifier = identifier:gsub(" ", "")
identifier = identifier:gsub("&", "")
identifier = identifier:gsub("-", "")
return sceneAsset.syncedResource({
Name = "Satellite TLE Data (" .. name .. ")",
Type = "UrlSynchronization",
Identifier = "satellite_tle_data_" .. identifier,
Url = url
})
end
local registerSatelliteGroupObjects = function(containingAsset, group, tleFolder, shouldAddDuplicates)
local filename = group.Url:match("([^/]+)$")
local filenameSansExt = filename:gsub(filename:match("(%.%w+)$"), "")
local path = tleFolder .. "/" .. filename
function numLinesInFile(filename)
local ctr = 0
for _ in io.lines(filename) do ctr = ctr + 1 end
return ctr
end
-- Check format of a set of 3 TLE file lines and return nonzero if there is a format error
function isValidTLEFileFormat(lineArr)
function isEmpty(s) return s == nil or s == '' end
if isEmpty(lineArr[1]) or isEmpty(lineArr[2]) or isEmpty(lineArr[3]) then
return false
end
if string.sub(lineArr[2], 1, 2) ~= "1 " then
return false
end
if string.sub(lineArr[3], 1, 2) ~= "2 " then
return false
end
return true
end
function debris(title, file, color)
return {
Identifier = title,
Parent = transforms.EarthInertial.Identifier,
Renderable = {
Type = "RenderableSatellites",
Path = file,
Segments = 160,
Color = color,
Fade = 0.5
},
GUI = {
Path = "/Solar System/Planets/Earth/Satellites"
}
}
end
local Debris = debris(filenameSansExt, path, group.TrailColor)
assetHelper.registerSceneGraphNodesAndExport(containingAsset, { Debris })
end
asset.export("downloadTLEFile", downloadTLEFile)
asset.export("registerSatelliteGroupObjects", registerSatelliteGroupObjects)
@@ -1,5 +1,5 @@
local assetHelper = asset.require('util/asset_helper')
local shared = asset.require('../satellites_shared')
local shared = asset.require('util/tle_helper')
local group = {
Title = "100 Brightest",
@@ -1,5 +1,5 @@
local assetHelper = asset.require('util/asset_helper')
local shared = asset.require('../satellites_shared')
local shared = asset.require('util/tle_helper')
local group = {
Title = "CubeSat",
@@ -0,0 +1,119 @@
local assetHelper = asset.require('util/asset_helper')
local satelliteHelper = asset.require('util/tle_helper')
local transforms = asset.require('scene/solarsystem/planets/earth/transforms')
local sunTransforms = asset.require('scene/solarsystem/sun/transforms')
local url = "https://celestrak.com/satcat/tle.php?CATNR=25544"
local identifier = "ISS"
local filename = "ISS.txt"
local nodes = {}
local tle = satelliteHelper.downloadTLEFile(asset, url, identifier, filename)
local modelsLocation = asset.syncedResource({
Name = "ISS Models",
Type = "HttpSynchronization",
Identifier = "iss_model",
Version = 1
})
local initializeAndAddNodes = function()
local lineElement = satelliteHelper.makeSingleLineElement(tle, filename)
local period = satelliteHelper.getPeriodFromElement(lineElement)
local path = tle .. "\\" .. filename
-- TLE data is only relevant in EarthInertial frame which means the model
-- will inherit some irrelevant rotations from its parent. To get around that
-- we perform the reverse rotation back to EarthBarycenter frame after applying
-- the TLE translation
local iss = {
Identifier = identifier,
Parent = transforms.EarthInertial.Identifier,
Transform = {
Translation = {
Type = "TLETranslation",
Body = identifier,
Observer = transforms.EarthInertial.Identifier,
File = path,
LineNumber = 1
},
Rotation = {
Type = "SpiceRotation",
SourceFrame = "GALACTIC",
DestinationFrame = "J2000",
}
},
Tag = { "earth_satellite", "ISS" },
GUI = {
Path = "/Solar System/Planets/Earth/Satellites/ISS",
Hiden = true
}
}
local issModel = {
Identifier = identifier .. "_model",
Parent = iss.Identifier,
Transform = {
Rotation = {
Type = "FixedRotation",
Attached = "ISS_model",
XAxis = { 1.0, 0.0, 0.0 },
XAxisOrthogonal = true,
ZAxis = transforms.EarthInertial.Identifier
}
},
Renderable = {
Type = "RenderableModel",
Geometry = {
Type = "MultiModelGeometry",
GeometryFile = modelsLocation .. "/iss.obj"
},
ColorTexture = modelsLocation .. "/gray.png",
LightSources = assetHelper.getDefaultLightSources(sunTransforms.SolarSystemBarycenter.Identifier)
},
Tag = { "earth_satellite", "ISS" },
GUI = {
Path = "/Solar System/Planets/Earth/Satellites/ISS"
}
}
local issTrail = {
Identifier = identifier .. "_trail",
Parent = transforms.EarthInertial.Identifier,
Renderable = {
Type = "RenderableTrailOrbit",
Translation = {
Type = "TLETranslation",
Body = identifier,
Observer = transforms.EarthInertial.Identifier,
File = path,
LineNumber = 1
},
Color = { 0.9, 0.6715, 0.0 },
Fade = 1.5,
Period = period,
Resolution = 320
},
Tag = { "earth_satellite", "ISS" },
GUI = {
Path = "/Solar System/Planets/Earth/Satellites/ISS"
}
}
local myNodes = { iss, issModel, issTrail }
for _, node in ipairs(myNodes) do
openspace.addSceneGraphNode(node)
end
return myNodes
end
asset.onInitialize(function ()
nodes = initializeAndAddNodes()
end)
asset.onDeinitialize(function ()
openspace.removeSceneGraphNode(nodes[3].Identifier) -- Removing trail
openspace.removeSceneGraphNode(nodes[1].Identifier) -- Removing ISS and model recursively
end)
@@ -1,5 +1,5 @@
local assetHelper = asset.require('util/asset_helper')
local shared = asset.require('../satellites_shared')
local shared = asset.require('util/tle_helper')
local group = {
Title = "Military",
@@ -1,5 +1,5 @@
local assetHelper = asset.require('util/asset_helper')
local shared = asset.require('../satellites_shared')
local shared = asset.require('util/tle_helper')
local group = {
Title = "Other",
@@ -1,5 +1,5 @@
local assetHelper = asset.require('util/asset_helper')
local shared = asset.require('../satellites_shared')
local shared = asset.require('util/tle_helper')
local group = {
Title = "Radar Calibration",
@@ -1,5 +1,5 @@
local assetHelper = asset.require('util/asset_helper')
local shared = asset.require('../satellites_shared')
local shared = asset.require('util/tle_helper')
local group = {
Title = "SpaceStations",
@@ -1,5 +1,5 @@
local assetHelper = asset.require('util/asset_helper')
local shared = asset.require('../satellites_shared')
local shared = asset.require('util/tle_helper')
local group = {
Title = "Last 30 Days",
@@ -1,5 +1,5 @@
local assetHelper = asset.require('util/asset_helper')
local shared = asset.require('../satellites_shared')
local shared = asset.require('util/tle_helper')
local group = {
Title = "Beidou",
@@ -1,5 +1,5 @@
local assetHelper = asset.require('util/asset_helper')
local shared = asset.require('../satellites_shared')
local shared = asset.require('util/tle_helper')
local group = {
Title = "Galileo",
@@ -1,5 +1,5 @@
local assetHelper = asset.require('util/asset_helper')
local shared = asset.require('../satellites_shared')
local shared = asset.require('util/tle_helper')
local group = {
Title = "Glosnass",
@@ -1,5 +1,5 @@
local assetHelper = asset.require('util/asset_helper')
local shared = asset.require('../satellites_shared')
local shared = asset.require('util/tle_helper')
local group = {
Title = "GPS",
@@ -1,5 +1,5 @@
local assetHelper = asset.require('util/asset_helper')
local shared = asset.require('../satellites_shared')
local shared = asset.require('util/tle_helper')
local group = {
Title = "Russian LEO Navigation",
@@ -1,5 +1,5 @@
local assetHelper = asset.require('util/asset_helper')
local shared = asset.require('../satellites_shared')
local shared = asset.require('util/tle_helper')
local group = {
Title = "Navy Navigation Satellite System",
@@ -1,5 +1,5 @@
local assetHelper = asset.require('util/asset_helper')
local shared = asset.require('../satellites_shared')
local shared = asset.require('util/tle_helper')
local group = {
Title = "Satellite Based Augmentation System",
@@ -2,4 +2,5 @@ asset.request('./misc/brightest')
asset.request('./communications/geostationary')
asset.request('./navigation/gps')
asset.request('./misc/spacestations')
asset.request('./misc/iss')
asset.request('./misc/tle-new')
@@ -1,68 +0,0 @@
local transforms = asset.require('scene/solarsystem/planets/earth/transforms')
local assetHelper = asset.require('util/asset_helper')
function downloadTLEFile(sceneAsset, url, name)
local identifier = name
identifier = identifier:gsub(" ", "")
identifier = identifier:gsub("&", "")
identifier = identifier:gsub("-", "")
return sceneAsset.syncedResource({
Name = "Satellite TLE Data (" .. name .. ")",
Type = "UrlSynchronization",
Identifier = "satellite_tle_data_" .. identifier,
Url = url
})
end
local registerSatelliteGroupObjects = function(containingAsset, group, tleFolder, shouldAddDuplicates)
local filename = group.Url:match("([^/]+)$")
local filenameSansExt = filename:gsub(filename:match("(%.%w+)$"), "")
local path = tleFolder .. "/" .. filename
function numLinesInFile(filename)
local ctr = 0
for _ in io.lines(filename) do ctr = ctr + 1 end
return ctr
end
-- Check format of a set of 3 TLE file lines and return nonzero if there is a format error
function isValidTLEFileFormat(lineArr)
function isEmpty(s) return s == nil or s == '' end
if isEmpty(lineArr[1]) or isEmpty(lineArr[2]) or isEmpty(lineArr[3]) then
return false
end
if string.sub(lineArr[2], 1, 2) ~= "1 " then
return false
end
if string.sub(lineArr[3], 1, 2) ~= "2 " then
return false
end
return true
end
function satellites(title, file, color)
return {
Identifier = title,
Parent = transforms.EarthInertial.Identifier,
Renderable = {
Type = "RenderableSatellites",
Path = file,
Segments = 120,
Color = color,
Fade = 0.5
},
--Tag = { "earth_satellite_" .. group, "earth_satellite_" .. group .. "_trail"},
GUI = {
Path = "/Solar System/Planets/Earth/Satellites"
}
}
end
local SatelliteBatch = satellites(filenameSansExt, path, group.TrailColor)
assetHelper.registerSceneGraphNodesAndExport(containingAsset, { SatelliteBatch })
end
asset.export("downloadTLEFile", downloadTLEFile)
asset.export("registerSatelliteGroupObjects", registerSatelliteGroupObjects)
@@ -1,5 +1,5 @@
local assetHelper = asset.require('util/asset_helper')
local shared = asset.require('../satellites_shared')
local shared = asset.require('util/tle_helper')
local group = {
Title = "Education",
@@ -1,5 +1,5 @@
local assetHelper = asset.require('util/asset_helper')
local shared = asset.require('../satellites_shared')
local shared = asset.require('util/tle_helper')
local group = {
Title = "Engineering",
@@ -1,5 +1,5 @@
local assetHelper = asset.require('util/asset_helper')
local shared = asset.require('../satellites_shared')
local shared = asset.require('util/tle_helper')
local group = {
Title = "Geodect",
@@ -1,5 +1,5 @@
local assetHelper = asset.require('util/asset_helper')
local shared = asset.require('../satellites_shared')
local shared = asset.require('util/tle_helper')
local group = {
Title = "Space & Earth Science",
@@ -1,5 +1,5 @@
local assetHelper = asset.require('util/asset_helper')
local shared = asset.require('../satellites_shared')
local shared = asset.require('util/tle_helper')
local group = {
Title = "ARGOS",
@@ -1,5 +1,5 @@
local assetHelper = asset.require('util/asset_helper')
local shared = asset.require('../satellites_shared')
local shared = asset.require('util/tle_helper')
local group = {
Title = "Disaster Monitoring",
@@ -1,5 +1,5 @@
local assetHelper = asset.require('util/asset_helper')
local shared = asset.require('../satellites_shared')
local shared = asset.require('util/tle_helper')
local group = {
Title = "Earth Resources",
@@ -1,5 +1,5 @@
local assetHelper = asset.require('util/asset_helper')
local shared = asset.require('../satellites_shared')
local shared = asset.require('util/tle_helper')
local group = {
Title = "GOES",
@@ -1,5 +1,5 @@
local assetHelper = asset.require('util/asset_helper')
local shared = asset.require('../satellites_shared')
local shared = asset.require('util/tle_helper')
local group = {
Title = "NOAA",
@@ -1,5 +1,5 @@
local assetHelper = asset.require('util/asset_helper')
local shared = asset.require('../satellites_shared')
local shared = asset.require('util/tle_helper')
local group = {
Title = "Planet",
@@ -1,5 +1,5 @@
local assetHelper = asset.require('util/asset_helper')
local shared = asset.require('../satellites_shared')
local shared = asset.require('util/tle_helper')
local group = {
Title = "Search & Rescue (SARSAT)",
@@ -1,5 +1,5 @@
local assetHelper = asset.require('util/asset_helper')
local shared = asset.require('../satellites_shared')
local shared = asset.require('util/tle_helper')
local group = {
Title = "Spire",
@@ -1,5 +1,5 @@
local assetHelper = asset.require('util/asset_helper')
local shared = asset.require('../satellites_shared')
local shared = asset.require('util/tle_helper')
local group = {
Title = "Tracking and Data Relay Satellite System (TDRSS)",
@@ -1,5 +1,5 @@
local assetHelper = asset.require('util/asset_helper')
local shared = asset.require('../satellites_shared')
local shared = asset.require('util/tle_helper')
local group = {
Title = "Weather",
+110
View File
@@ -0,0 +1,110 @@
local transforms = asset.require('scene/solarsystem/planets/earth/transforms')
local assetHelper = asset.require('util/asset_helper')
function downloadTLEFile(sceneAsset, url, name, filename)
local identifier = name
identifier = identifier:gsub(" ", "")
identifier = identifier:gsub("&", "")
identifier = identifier:gsub("-", "")
local urlSyncTable = {
Name = "Satellite TLE Data (" .. name .. ")",
Type = "UrlSynchronization",
Identifier = "satellite_tle_data_" .. identifier,
Url = url
}
if (filename ~= '') then
urlSyncTable.Filename = filename
end
return sceneAsset.syncedResource(urlSyncTable)
end
-- Check format of a set of 3 TLE file lines and return nonzero if there is a format error
function isValidTLEFileFormat(lineArr)
function isEmpty(s) return s == nil or s == '' end
if isEmpty(lineArr[1]) or isEmpty(lineArr[2]) or isEmpty(lineArr[3]) then
return false
end
if string.sub(lineArr[2], 1, 2) ~= "1 " then
return false
end
if string.sub(lineArr[3], 1, 2) ~= "2 " then
return false
end
return true
end
local makeSingleLineElement = function(tle, filename)
local path = tle .. "\\" .. filename
local file = io.open(path, "r")
assert(file, "File not found: " .. path)
local line = {
file:read('*l'), --title line
file:read('*l'),
file:read('*l')
}
assert(isValidTLEFileFormat(line), "TLE file syntax error on line " .. 1 .. ": " .. path)
-- Trim string
line[1] = line[1]:gsub("^%s*(.-)%s*$", "%1")
line[1] = line[1]:gsub("%s+", "_")
line[1] = line[1]:gsub("[%-()]", "")
--local title = line[1]
return line
end
function numLinesInFile(filename)
local ctr = 0
for _ in io.lines(filename) do ctr = ctr + 1 end
return ctr
end
local getPeriodFromElement = function(element)
-- Get period from correct location of the string
local per = tonumber(string.sub(element[3], 53, 63))
-- Trail for 2x a single revolution
per = 1.0 / per
return per
end
function satellites(title, file, color, group)
return {
Identifier = title,
Parent = transforms.EarthInertial.Identifier,
Renderable = {
Type = "RenderableSatellites",
Path = file,
Segments = 120,
Color = color,
Fade = 1.5
},
Tag = { "earth_satellites" },
GUI = {
Path = "/Solar System/Planets/Earth/Satellites"
}
}
end
local registerSatelliteGroupObjects = function(containingAsset, group, tleFolder, shouldAddDuplicates)
local filename = group.Url:match("([^/]+)$")
local filenameSansExt = filename:gsub(filename:match("(%.%w+)$"), "")
local path = tleFolder .. "/" .. filename
local SatelliteBatch = satellites(filenameSansExt, path, group.TrailColor, group)
assetHelper.registerSceneGraphNodesAndExport(containingAsset, { SatelliteBatch })
end
asset.export("downloadTLEFile", downloadTLEFile)
asset.export("isValidTLEFileFormat", isValidTLEFileFormat)
asset.export("numLinesInFile", numLinesInFile)
asset.export("makeSingleLineElement", makeSingleLineElement)
asset.export("getPeriodFromElement", getPeriodFromElement)
asset.export("registerSatelliteGroupObjects", registerSatelliteGroupObjects)
@@ -71,6 +71,11 @@ namespace {
"Color",
"This value determines the RGB main color for the lines and points of the trail."
};
constexpr openspace::properties::Property::PropertyInfo TrailFadeInfo = {
"TrailFade",
"Trail Fade",
"This value determines how fast the trail fades and is an appearance property. "
};
constexpr const char* KeyFile = "Path";
constexpr const char* KeyLineNum = "LineNumber";
@@ -321,15 +326,24 @@ RenderableSatellites::RenderableSatellites(const ghoul::Dictionary& dictionary)
if (dictionary.hasKeyAndValue<glm::vec3>(LineColorInfo.identifier)) {
_appearance.lineColor = dictionary.value<glm::vec3>(LineColorInfo.identifier);
}
if (dictionary.hasKeyAndValue<double>("FadeInfo")) {
if (dictionary.hasKeyAndValue<double>(TrailFadeInfo.identifier)) {
_appearance.lineFade = static_cast<float>(
dictionary.value<double>("FadeInfo")
dictionary.value<double>(TrailFadeInfo.identifier)
);
}
else {
_appearance.lineFade = 20;
}
if (dictionary.hasKeyAndValue<double>(LineWidthInfo.identifier)) {
_appearance.lineWidth = static_cast<float>(
dictionary.value<double>(LineWidthInfo.identifier)
);
}
else {
_appearance.lineWidth = 2.0;
}
auto reinitializeTrailBuffers = [this]() {
initializeGL();
};
+31 -3
View File
@@ -43,8 +43,10 @@ namespace {
constexpr const char* KeyIdentifier = "Identifier";
constexpr const char* KeyOverride = "Override";
constexpr const char* KeyUseHash = "UseHash";
constexpr const char* KeyFilename = "Filename";
constexpr const char* TempSuffix = ".tmp";
constexpr const char* FileSuffix = ".txt";
} // namespace
namespace openspace {
@@ -90,6 +92,13 @@ documentation::Documentation UrlSynchronization::Documentation() {
"circumstances. If this is not desired, the URLSynchronization use the "
"bare directory name alone if this value is 'false'. If this value is "
"'false', the identifier has to be specified."
},
{
KeyFilename,
new StringVerifier,
Optional::Yes,
"Optional to provide filename to override the one which is otherwise "
"automatically created from the url. "
}
}
};
@@ -117,6 +126,14 @@ UrlSynchronization::UrlSynchronization(const ghoul::Dictionary& dict,
}
}
if (dict.hasValue<std::string>(KeyFilename)) {
_filename = dict.value<std::string>(KeyFilename);
std::size_t foundExt = _filename.find(FileSuffix);
if (foundExt == std::string::npos) {
_filename += FileSuffix;
}
}
bool useHash = true;
if (dict.hasValue<bool>(KeyUseHash)) {
useHash = dict.value<bool>(KeyUseHash);
@@ -181,11 +198,22 @@ void UrlSynchronization::start() {
std::vector<std::unique_ptr<AsyncHttpFileDownload>> downloads;
for (const std::string& url : _urls) {
const size_t lastSlash = url.find_last_of('/');
const std::string filename = url.substr(lastSlash + 1);
if (_filename.empty()) {
const size_t lastSlash = url.find_last_of('/');
std::string lastPartOfUrl = url.substr(lastSlash + 1);
// We can not create filenames with questionmarks
lastPartOfUrl.erase(std::remove(lastPartOfUrl.begin(), lastPartOfUrl.end(), '?'), lastPartOfUrl.end());
std::size_t foundExt = lastPartOfUrl.find(FileSuffix);
if (foundExt == std::string::npos) {
lastPartOfUrl += FileSuffix;
}
_filename = lastPartOfUrl;
}
std::string fileDestination = directory() +
ghoul::filesystem::FileSystem::PathSeparator + filename + TempSuffix;
ghoul::filesystem::FileSystem::PathSeparator + _filename + TempSuffix;
std::unique_ptr<AsyncHttpFileDownload> download =
std::make_unique<AsyncHttpFileDownload>(
+1
View File
@@ -58,6 +58,7 @@ private:
bool _forceOverride = false;
std::string _synchronizationRoot;
std::string _identifier;
std::string _filename;
std::atomic_bool _nTotalBytesKnown = false;
std::atomic_size_t _nTotalBytes = 0;