diff --git a/www/js/app.js b/www/js/app.js
index d105e610..a1744ebe 100644
--- a/www/js/app.js
+++ b/www/js/app.js
@@ -98,7 +98,7 @@ define(['jquery', 'zimArchiveLoader', 'uiUtil', 'util', 'utf8', 'images', 'cooki
}
$(document).ready(resizeIFrame);
$(window).resize(function() {
- resizeIFrame;
+ resizeIFrame();
// We need to load any images exposed by the resize
var scrollFunc = document.getElementById('articleContent').contentWindow;
scrollFunc = scrollFunc ? scrollFunc.onscroll : null;
@@ -1351,17 +1351,31 @@ define(['jquery', 'zimArchiveLoader', 'uiUtil', 'util', 'utf8', 'images', 'cooki
return new abstractFilesystemAccess.StorageFirefoxOS(s);
});
}
-
if (storages !== null && storages.length > 0 ||
- typeof Windows !== 'undefined' && typeof Windows.Storage !== 'undefined') {
+ typeof Windows !== 'undefined' && typeof Windows.Storage !== 'undefined' ||
+ typeof window.fs !== 'undefined') {
// Make a fake first access to device storage, in order to ask the user for confirmation if necessary.
// This way, it is only done once at this moment, instead of being done several times in callbacks
// After that, we can start looking for archives
//storages[0].get("fake-file-to-read").then(searchForArchivesInPreferencesOrStorage,
if (!params.pickedFile) {
searchForArchivesInPreferencesOrStorage();
- } else {
+ } else if (typeof window.fs === 'undefined') {
processPickedFileUWP(params.pickedFile);
+ } else {
+ // We're in an Electron app with a packaged file that we need to read from the node File System
+ console.log("Loading packaged ZIM for Electron...");
+ // Create a fake File object (this avoids extensive patching of later code)
+ var file = {};
+ file.name = params.packagedFile;
+ // @TODO: Use fs.stat to query the file size
+ file.size = 824209647;
+ // @TODO: Create a params.filePath in init.js
+ file.path = 'archives';
+ file.readMode = 'electron';
+ setLocalArchiveFromFileList([file]);
+ params.pickedFile = file;
+ document.getElementById('hideFileSelectors').style.display = params.showFileSelectors ? 'inline' : 'none';
}
} else {
// If DeviceStorage is not available, we display the file select components
@@ -1799,6 +1813,13 @@ define(['jquery', 'zimArchiveLoader', 'uiUtil', 'util', 'utf8', 'images', 'cooki
params.pickedFolder = params.localStorage;
scanUWPFolderforArchives(params.localStorage);
if (!params.rescan) setLocalArchiveFromArchiveList(params.storedFile);
+ } else if (typeof window.fs !== 'undefined') {
+ // We're in an Electron packaged app
+ params.storedFile = params.packagedFile || '';
+ if (!params.rescan) {
+ if (params.showFileSelectors) $('input:checkbox[name=displayFileSelectors]').click();
+ }
+ setLocalArchiveFromFileList([params.pickedFile]);
}
}
@@ -1807,6 +1828,7 @@ define(['jquery', 'zimArchiveLoader', 'uiUtil', 'util', 'utf8', 'images', 'cooki
*/
function setLocalArchiveFromFileSelect() {
setLocalArchiveFromFileList(document.getElementById('archiveFilesLegacy').files);
+ params.rescan = false;
}
/**
diff --git a/www/js/lib/util.js b/www/js/lib/util.js
index 9bdaf873..710ce171 100644
--- a/www/js/lib/util.js
+++ b/www/js/lib/util.js
@@ -20,6 +20,7 @@
* along with Kiwix (file LICENSE-GPLv3.txt). If not, see
*/
'use strict';
+
define(['q'], function (q) {
/**
@@ -204,21 +205,37 @@ define(['q'], function (q) {
/**
* Reads a Uint8Array from the given file starting at byte offset begin and
* for given size.
- * @param {File} file
- * @param {Integer} begin
- * @param {Integer} size
+ * @param {File} file The file to read
+ * @param {Integer} begin The first byte in the file to read
+ * @param {Integer} size The number of bytes to read
* @returns {Promise} Promise
*/
function readFileSlice(file, begin, size) {
var deferred = q.defer();
- var reader = new FileReader();
- reader.onload = function (e) {
- deferred.resolve(new Uint8Array(e.target.result));
- };
- reader.onerror = reader.onabort = function (e) {
- deferred.reject(e);
- };
- reader.readAsArrayBuffer(file.slice(begin, begin + size));
+ if (file.readMode === 'electron') {
+ // We are reading a packaged file and have to use Electron fs.read (so we don't have to pick the file)
+ var buffer = new Uint8Array(size);
+ // @TODO: Add errorchecking to electron routine
+ fs.open(file.path + '/' + file.name, 'r', function (err, fd) {
+ fs.read(fd, buffer, 0, size, begin, function (err, bytesRead, data) {
+ deferred.resolve(data);
+ // console.log(buffer.toString('utf8'));
+ fs.close(fd, function (err) {
+ if (err) console.log('Could not close file...', err);
+ });
+ });
+ });
+ } else {
+ // We are reading a picked file, so use vanilla JS methods
+ var reader = new FileReader();
+ reader.onload = function (e) {
+ deferred.resolve(new Uint8Array(e.target.result));
+ };
+ reader.onerror = reader.onabort = function (e) {
+ deferred.reject(e);
+ };
+ reader.readAsArrayBuffer(file.slice(begin, begin + size));
+ }
return deferred.promise;
}