|
|
@ -88,7 +88,7 @@ define([
|
|
|
|
// This structure is used for caching media data and blob urls for each media cryptpad url
|
|
|
|
// This structure is used for caching media data and blob urls for each media cryptpad url
|
|
|
|
var mediasData = {};
|
|
|
|
var mediasData = {};
|
|
|
|
|
|
|
|
|
|
|
|
var getMediaSources = function() {
|
|
|
|
var getMediasSources = APP.getMediasSources = function() {
|
|
|
|
if (!content.mediasSources) {
|
|
|
|
if (!content.mediasSources) {
|
|
|
|
content.mediasSources = {}
|
|
|
|
content.mediasSources = {}
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -745,7 +745,7 @@ define([
|
|
|
|
var name = data.name;
|
|
|
|
var name = data.name;
|
|
|
|
|
|
|
|
|
|
|
|
// Add image to the list
|
|
|
|
// Add image to the list
|
|
|
|
var mediasSources = getMediaSources();
|
|
|
|
var mediasSources = getMediasSources();
|
|
|
|
mediasSources[name] = data;
|
|
|
|
mediasSources[name] = data;
|
|
|
|
|
|
|
|
|
|
|
|
APP.getImageURL(name, function(url) {
|
|
|
|
APP.getImageURL(name, function(url) {
|
|
|
@ -758,25 +758,6 @@ define([
|
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
|
|
|
Util.fetch(data.src, function (err, u8) {
|
|
|
|
|
|
|
|
FileCrypto.decrypt(u8, Nacl.util.decodeBase64(data.key), function (err, res) {
|
|
|
|
|
|
|
|
if (err || !res.content) { console.log("cryptpad decode fail"); return APP.AddImageErrorCallback(err); }
|
|
|
|
|
|
|
|
var url = URL.createObjectURL(res.content);
|
|
|
|
|
|
|
|
var hiddendata = "#src=" + encodeURIComponent(data.src) + ",key=" + encodeURIComponent(data.key) + ",name=" + encodeURIComponent(data.name);
|
|
|
|
|
|
|
|
var name = data.name + hiddendata;
|
|
|
|
|
|
|
|
// store media content for potential export
|
|
|
|
|
|
|
|
var reader = new FileReader();
|
|
|
|
|
|
|
|
reader.onloadend = (event) => {
|
|
|
|
|
|
|
|
mediasContent[name] = reader.result;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
reader.readAsArrayBuffer(res.content);
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
APP.AddImage = function(cb1, cb2) {
|
|
|
|
APP.AddImage = function(cb1, cb2) {
|
|
|
|
APP.AddImageSuccessCallback = cb1;
|
|
|
|
APP.AddImageSuccessCallback = cb1;
|
|
|
|
APP.AddImageErrorCallback = cb2;
|
|
|
|
APP.AddImageErrorCallback = cb2;
|
|
|
@ -787,7 +768,7 @@ define([
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
APP.getImageURL = function(name, callback) {
|
|
|
|
APP.getImageURL = function(name, callback) {
|
|
|
|
var mediasSources = getMediaSources();
|
|
|
|
var mediasSources = getMediasSources();
|
|
|
|
var data = mediasSources[name];
|
|
|
|
var data = mediasSources[name];
|
|
|
|
|
|
|
|
|
|
|
|
if (typeof data === 'undefined') {
|
|
|
|
if (typeof data === 'undefined') {
|
|
|
@ -804,14 +785,17 @@ define([
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
Util.fetch(data.src, function (err, u8) {
|
|
|
|
Util.fetch(data.src, function (err, u8) {
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
|
|
|
console.log("Decrypt with key " + data.key);
|
|
|
|
FileCrypto.decrypt(u8, Nacl.util.decodeBase64(data.key), function (err, res) {
|
|
|
|
FileCrypto.decrypt(u8, Nacl.util.decodeBase64(data.key), function (err, res) {
|
|
|
|
if (err || !res.content) { callback(""); }
|
|
|
|
if (err || !res.content) { console.log("Decrypting failed"); callback(""); }
|
|
|
|
var blobUrl = URL.createObjectURL(res.content);
|
|
|
|
var blobUrl = URL.createObjectURL(res.content);
|
|
|
|
// store media blobUrl and content for cache and export
|
|
|
|
// store media blobUrl and content for cache and export
|
|
|
|
var mediaData = { blobUrl : blobUrl, content : "" };
|
|
|
|
var mediaData = { blobUrl : blobUrl, content : "" };
|
|
|
|
mediasData[data.src] = mediaData;
|
|
|
|
mediasData[data.src] = mediaData;
|
|
|
|
var reader = new FileReader();
|
|
|
|
var reader = new FileReader();
|
|
|
|
reader.onloadend = (event) => {
|
|
|
|
reader.onloadend = (event) => {
|
|
|
|
|
|
|
|
console.log("MediaData set");
|
|
|
|
mediaData.content = reader.result;
|
|
|
|
mediaData.content = reader.result;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
reader.readAsArrayBuffer(res.content);
|
|
|
|
reader.readAsArrayBuffer(res.content);
|
|
|
@ -819,6 +803,10 @@ define([
|
|
|
|
window.frames[0].AscCommon.g_oDocumentUrls.addImageUrl(data.name, blobUrl);
|
|
|
|
window.frames[0].AscCommon.g_oDocumentUrls.addImageUrl(data.name, blobUrl);
|
|
|
|
callback(blobUrl);
|
|
|
|
callback(blobUrl);
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
} catch(e) {
|
|
|
|
|
|
|
|
console.log("Exception decrypting image " + data.name);
|
|
|
|
|
|
|
|
callback("");
|
|
|
|
|
|
|
|
}
|
|
|
|
});
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
@ -863,16 +851,14 @@ define([
|
|
|
|
// Adding images
|
|
|
|
// Adding images
|
|
|
|
for (var mediaFileName in window.frames[0].AscCommon.g_oDocumentUrls.urls) {
|
|
|
|
for (var mediaFileName in window.frames[0].AscCommon.g_oDocumentUrls.urls) {
|
|
|
|
var mediaFileName = mediaFileName.substring(6);
|
|
|
|
var mediaFileName = mediaFileName.substring(6);
|
|
|
|
var mediasSources = getMediaSources();
|
|
|
|
var mediasSources = getMediasSources();
|
|
|
|
var mediaSource = mediasSources[mediaFileName];
|
|
|
|
var mediaSource = mediasSources[mediaFileName];
|
|
|
|
var mediaData = (typeof mediaSource === 'undefined') ? mediaSource : mediasData[mediaSource.src];
|
|
|
|
var mediaData = (typeof mediaSource === 'undefined') ? mediaSource : mediasData[mediaSource.src];
|
|
|
|
if (typeof mediaData !== 'undefined') {
|
|
|
|
if (typeof mediaData !== 'undefined') {
|
|
|
|
console.log("Writing media data " + mediaFileName);
|
|
|
|
console.log("Writing media data " + mediaFileName);
|
|
|
|
console.log("Data");
|
|
|
|
console.log("Data");
|
|
|
|
var fileData = mediaData.content;
|
|
|
|
var fileData = mediaData.content;
|
|
|
|
console.log(fileData);
|
|
|
|
|
|
|
|
x2t.FS.writeFile('/working/media/' + mediaFileName, new Uint8Array(fileData));
|
|
|
|
x2t.FS.writeFile('/working/media/' + mediaFileName, new Uint8Array(fileData));
|
|
|
|
x2t.FS.writeFile('/working/media/myimage.png', new Uint8Array(fileData));
|
|
|
|
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
|
console.log("Could not find media content for " + mediaFileName);
|
|
|
|
console.log("Could not find media content for " + mediaFileName);
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -889,15 +875,22 @@ define([
|
|
|
|
// running conversion
|
|
|
|
// running conversion
|
|
|
|
x2t.ccall("runX2T", ["number"], ["string"], ["/working/params.xml"]);
|
|
|
|
x2t.ccall("runX2T", ["number"], ["string"], ["/working/params.xml"]);
|
|
|
|
// reading output file from working disk (in memory)
|
|
|
|
// reading output file from working disk (in memory)
|
|
|
|
|
|
|
|
try {
|
|
|
|
var result = x2t.FS.readFile('/working/' + fileName + "." + outputFormat);
|
|
|
|
var result = x2t.FS.readFile('/working/' + fileName + "." + outputFormat);
|
|
|
|
|
|
|
|
} catch (e) {
|
|
|
|
|
|
|
|
console.log("Failed reading converted file");
|
|
|
|
|
|
|
|
return "";
|
|
|
|
|
|
|
|
}
|
|
|
|
return result;
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
var x2tSaveAndConvertDataInternal = function(x2t, data, filename, extension, finalFilename) {
|
|
|
|
var x2tSaveAndConvertDataInternal = function(x2t, data, filename, extension, finalFilename) {
|
|
|
|
var xlsData = x2tConvertDataInternal(x2t, data, filename, extension);
|
|
|
|
var xlsData = x2tConvertDataInternal(x2t, data, filename, extension);
|
|
|
|
|
|
|
|
if (xlsData!="") {
|
|
|
|
var blob = new Blob([xlsData], {type: "application/bin;charset=utf-8"});
|
|
|
|
var blob = new Blob([xlsData], {type: "application/bin;charset=utf-8"});
|
|
|
|
saveAs(blob, finalFilename);
|
|
|
|
saveAs(blob, finalFilename);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
var x2tSaveAndConvertData = function(data, filename, extension, finalFilename) {
|
|
|
|
var x2tSaveAndConvertData = function(data, filename, extension, finalFilename) {
|
|
|
|
// Perform the x2t conversion
|
|
|
|
// Perform the x2t conversion
|
|
|
@ -937,15 +930,84 @@ define([
|
|
|
|
});
|
|
|
|
});
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var x2tImportImagesInternal = function(x2t, images, i, callback) {
|
|
|
|
|
|
|
|
if (i>=images.length) {
|
|
|
|
|
|
|
|
callback();
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
console.log("Import image " + i);
|
|
|
|
|
|
|
|
var handleFileData = {
|
|
|
|
|
|
|
|
name: images[i],
|
|
|
|
|
|
|
|
mediasSources: getMediasSources(),
|
|
|
|
|
|
|
|
callback: function() {
|
|
|
|
|
|
|
|
console.log("next image");
|
|
|
|
|
|
|
|
x2tImportImagesInternal(x2t, images, i+1, callback);
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
var filePath = "/working/media/" + images[i];
|
|
|
|
|
|
|
|
console.log("Import filename " + filePath);
|
|
|
|
|
|
|
|
var fileData = x2t.FS.readFile("/working/media/" + images[i], { encoding : "binary" });
|
|
|
|
|
|
|
|
console.log("Importing data");
|
|
|
|
|
|
|
|
console.log("Buffer");
|
|
|
|
|
|
|
|
console.log(fileData.buffer);
|
|
|
|
|
|
|
|
var blob = new Blob([fileData.buffer], {type: 'image/png'});
|
|
|
|
|
|
|
|
blob.name = images[i];
|
|
|
|
|
|
|
|
APP.FMImages.handleFile(blob, handleFileData);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var x2tImportImages = function (x2t, callback) {
|
|
|
|
|
|
|
|
if (!APP.FMImages) {
|
|
|
|
|
|
|
|
var fmConfigImages = {
|
|
|
|
|
|
|
|
noHandlers: true,
|
|
|
|
|
|
|
|
noStore: true,
|
|
|
|
|
|
|
|
body: $('body'),
|
|
|
|
|
|
|
|
onUploaded: function (ev, data) {
|
|
|
|
|
|
|
|
if (!ev.callback) { return; }
|
|
|
|
|
|
|
|
console.log("Image uploaded at " + data.url);
|
|
|
|
|
|
|
|
var parsed = Hash.parsePadUrl(data.url);
|
|
|
|
|
|
|
|
if (parsed.type === 'file') {
|
|
|
|
|
|
|
|
var secret = Hash.getSecrets('file', parsed.hash, data.password);
|
|
|
|
|
|
|
|
var fileHost = privateData.fileHost || privateData.origin;
|
|
|
|
|
|
|
|
var src = fileHost + Hash.getBlobPathFromHex(secret.channel);
|
|
|
|
|
|
|
|
var key = Hash.encodeBase64(secret.keys.cryptKey);
|
|
|
|
|
|
|
|
console.log("Final src: " + src);
|
|
|
|
|
|
|
|
ev.mediasSources[ev.name] = { name : ev.name, src : src, key : key };
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
ev.callback();
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
APP.FMImages = common.createFileManager(fmConfigImages);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
var x2tConvertData = function (x2t, data, filename, extension) {
|
|
|
|
// Import Images
|
|
|
|
|
|
|
|
console.log("Import Images");
|
|
|
|
|
|
|
|
var files = x2t.FS.readdir("/working/media/");
|
|
|
|
|
|
|
|
var images = [];
|
|
|
|
|
|
|
|
files.forEach(file => {
|
|
|
|
|
|
|
|
if (file!="." && file!="..")
|
|
|
|
|
|
|
|
images.push(file);
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
x2tImportImagesInternal(x2t, images, 0, function() {
|
|
|
|
|
|
|
|
console.log("Sync media sources elements");
|
|
|
|
|
|
|
|
console.log(getMediasSources());
|
|
|
|
|
|
|
|
APP.onLocal();
|
|
|
|
|
|
|
|
console.log("Import Images finalized");
|
|
|
|
|
|
|
|
callback();
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var x2tConvertData = function (x2t, data, filename, extension, callback) {
|
|
|
|
var convertedContent;
|
|
|
|
var convertedContent;
|
|
|
|
if (filename.endsWith(".ods")) {
|
|
|
|
if (filename.endsWith(".ods")) {
|
|
|
|
convertedContent = x2tConvertDataInternal(x2t, new Uint8Array(data), filename, "xlsx");
|
|
|
|
convertedContent = x2tConvertDataInternal(x2t, new Uint8Array(data), filename, "xlsx");
|
|
|
|
return x2tConvertDataInternal(x2t, convertedContent, filename + ".xlsx", extension);
|
|
|
|
convertedContent = x2tConvertDataInternal(x2t, convertedContent, filename + ".xlsx", extension);
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
|
return x2tConvertDataInternal(x2t, new Uint8Array(data), filename, extension);
|
|
|
|
convertedContent = x2tConvertDataInternal(x2t, new Uint8Array(data), filename, extension);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
x2tImportImages(x2t, function() {
|
|
|
|
|
|
|
|
callback(convertedContent);
|
|
|
|
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
var importXLSXFile = function(content, filename) {
|
|
|
|
var importXLSXFile = function(content, filename) {
|
|
|
@ -957,8 +1019,9 @@ define([
|
|
|
|
x2t.run();
|
|
|
|
x2t.run();
|
|
|
|
if (x2tInitialized) {
|
|
|
|
if (x2tInitialized) {
|
|
|
|
console.log("x2t runtime already initialized");
|
|
|
|
console.log("x2t runtime already initialized");
|
|
|
|
var convertedContent = x2tConvertData(x2t, new Uint8Array(content), filename.name, "bin");
|
|
|
|
x2tConvertData(x2t, new Uint8Array(content), filename.name, "bin", function(convertedContent) {
|
|
|
|
importFile(convertedContent);
|
|
|
|
importFile(convertedContent);
|
|
|
|
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
x2t.onRuntimeInitialized = function() {
|
|
|
|
x2t.onRuntimeInitialized = function() {
|
|
|
@ -966,8 +1029,9 @@ define([
|
|
|
|
// Init x2t js module
|
|
|
|
// Init x2t js module
|
|
|
|
x2tInit(x2t);
|
|
|
|
x2tInit(x2t);
|
|
|
|
x2tInitialized = true;
|
|
|
|
x2tInitialized = true;
|
|
|
|
var convertedContent = x2tConvertData(x2t, new Uint8Array(content), filename.name, "bin");
|
|
|
|
var convertedContent = x2tConvertData(x2t, new Uint8Array(content), filename.name, "bin", function(convertedContent) {
|
|
|
|
importFile(convertedContent);
|
|
|
|
importFile(convertedContent);
|
|
|
|
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -980,6 +1044,9 @@ define([
|
|
|
|
if (m.length > 1) {
|
|
|
|
if (m.length > 1) {
|
|
|
|
return void UI.alert(Messages.oo_cantUpload);
|
|
|
|
return void UI.alert(Messages.oo_cantUpload);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (content=="") {
|
|
|
|
|
|
|
|
return void UI.alert(Messages.oo_cantUpload);
|
|
|
|
|
|
|
|
}
|
|
|
|
var blob = new Blob([content], {type: 'plain/text'});
|
|
|
|
var blob = new Blob([content], {type: 'plain/text'});
|
|
|
|
var file = getFileType();
|
|
|
|
var file = getFileType();
|
|
|
|
blob.name = (metadataMgr.getMetadataLazy().title || file.doc) + '.' + file.type;
|
|
|
|
blob.name = (metadataMgr.getMetadataLazy().title || file.doc) + '.' + file.type;
|
|
|
|