[SailfishDevel] How to install user (controlled) data files for my app avoiding /usr/share

Martin Kolman martin.kolman at gmail.com
Thu Jan 9 22:56:37 UTC 2014

9.1.2014 23:27, Wim de Vries:
> Thanks Thomas for the explanation.
> Indeed, I think I will stick to a minimal persistent data set  to 
> enable the user to play with.
> For the open/free data I will have a look at SF.
> The maps created by the user (with an accompanying  desktop 
> application) will have to be copied to sailfish via USB to a dir in 
> The good thing is that I am not in a hurry, don't expect many pilots 
> with a Jolla for now :-)
> And, in the long term ... A pilot Other Half!
Well, a TOH with barometer & a variometer application might be a nice 
combo for glider pilots. :)

> r
> wim
> On 01/09/2014 01:50 PM, Thomas Perl wrote:
>> Hi,
>> On 09 Jan 2014, at 09:05, Wim de Vries <wsvries at xs4all.nl> wrote:
>>> I am converting my aircraft navigation app to Sailfish.
>>> It comes (default) with OpenStreet based maps + 3D data files of 
>>> Western Europe (in RPM).
>>> Most users will use this map, but some users may use their home made 
>>> maps (generated by a PC application).
>>> In the latter case, the users will delete this W-Europe map (it 
>>> takes up quite some disk space).
>>> So far so good, but the installation/RPM is a problem:
>>> Harbour says that I should install the app data (very much bytes for 
>>> the W-Eu map) in /usr/share/$NAME and in the first run of the app, 
>>> copy them to $XDG_CONFIG_HOME/$NAME.
>>> But  now I am stuck with an enormous amount of (useless) data in 
>>> /usr/share/$NAME that cannot be removed.
>>> Any suggestions?
>> The “copy stuff to the home directory of the user” is only relevant 
>> if you want to e.g. ship default config files and install them to the 
>> config directory on first start (the suggestion was put in place when 
>> somebody wanted to install files to /home/nemo/.config/ in the RPM 
>> file, something that will also lead to unhappy people in case of 
>> package upgrades, and that was suggested as best practice if the code 
>> can’t deal with missing config files - which it ideally should ;)). 
>> For big files, obviously it doesn’t make sense to copy them to 
>> $XDG_CONFIG_HOME/$NAME. Instead, what you could do is install them to 
>> /usr/share/$NAME, and then just have a flag in $XDG_CONFIG_HOME/$NAME 
>> if the user wants to disable the system-wide data (of course, this 
>> doesn’t free the data, but in case hiding/not loading the data will 
>> improve e.g. the startup time or user experience, it could still make 
>> sense).
>> For data that the package manager installs, only the package manager 
>> should modify/remove the data. Making /usr/share/$NAME world-writable 
>> is not allowed per harbour rules, and for good reason - if the user 
>> would e.g. delete the pre-installed maps there, they would re-appear 
>> every time the app is upgraded, or if the user modifies the data 
>> there (or the app), these changes would be overwritten by a package 
>> upgrade.
>> Also, another thing: Having big pre-installed data in the app 
>> packaged (=inside the RPM) is bad, as it will require this data to be 
>> re-downloaded every time the package is installed, and (during 
>> installation time) will take up the space for the - temporarily 
>> downloaded - RPM and the extracted data (you will need ~ 400 MB free 
>> to extract a 200 MB RPM file with 200 MB of data inside, not taking 
>> into account compression and stuff).
>> So, you have an app plus some big data that probably doesn’t change 
>> as often as the code does (either it changes more often or it doesn’t 
>> change as often - the data doesn’t usually have anything to do with 
>> code updates to your app except if you happen to do some data format 
>> changes).
>> There are basically two options:
>>   1. Don’t ship any data with your application
>>      - Small download and upgrade size, no wasted space
>>      - For the “pre-packaged” maps, you could download them in the 
>> app on first start
>>   2. Ship data with your application, and don’t let the user delete it
>>      - No need to host any data packages
>>      - Package upgrades and first download will be unnecessarily large
>> I’d suggest you do variant 1: Users who have a good connection might 
>> not want/need to download much data upfront, they might just want to 
>> try out your app (=easier when it’s a smaller download) and only 
>> after they’ve tried and liked your app, they might go into the in-app 
>> menu and select something like “download pre-packaged maps”. As your 
>> data seems to be open in some sense, you might be able to either 
>> download it directly from the OSM servers, or you package it up and 
>> put it up on some hosting service (e.g. sourceforge.net works well 
>> for hosting such data downloads, including mirroring - but any other 
>> service or your own web server would work just as well).
>> If you really do want to ship the data with your package, it should 
>> not be possible to delete it, only possibly hide it from the UI of 
>> the application via a setting that is stored in 
>> $XDG_CONFIG_HOME/$NAME. By the way, all the data that you download 
>> should go into $XDG_DATA_HOME, not $XDG_CONFIG_HOME (as the name 
>> suggests — this will allow backup and cleanup applications in the 
>> future to e.g. backup / clean only the data directory (keeping the 
>> config in place) or only deleting only the data). For data that you 
>> basically cache from a web services, such as map tiles, 
>> $XDG_CACHE_HOME/$NAME might be an even better place.
>> Of course, you could also create a separate “Map pack” app entry for 
>> each pre-loaded packs that just contains the map data, although I’m 
>> not sure if we currently accept such “non-app” items (without a 
>> .desktop file and icon).
>> For the future, if somebody wants to brainstorm it on 
>> together.jolla.com, we could have separate “data packages” for each 
>> app on harbour that the store client takes care of installing and 
>> updating independent of the app, which would also result in better 
>> bandwidth usage (data is only downloaded when updated, app package 
>> updates can be downloaded and installed independently). On Google 
>> Play, this mechanism is called “APK Expansion Files”: 
>> http://developer.android.com/google/play/expansion-files.html - 
>> something similar to that could solve the problem in your case, but 
>> we’re not there yet.
>> HTH :)
>> Thomas
>> _______________________________________________
>> SailfishOS.org Devel mailing list
> _______________________________________________
> SailfishOS.org Devel mailing list

More information about the Devel mailing list