/** ** ============================== ** O O O OOOO ** O O O O O O ** O O O O O O ** OOOO OOOO O OOO OOOO ** O O O O O O O ** O O O O O O O ** OOOO OOOO O O OOOO ** ============================== ** Dr. Stefan Bosse http://www.bsslab.de ** ** COPYRIGHT: THIS SOFTWARE, EXECUTABLE AND SOURCE CODE IS OWNED ** BY THE AUTHOR(S). ** THIS SOURCE CODE MAY NOT BE COPIED, EXTRACTED, ** MODIFIED, OR OTHERWISE USED IN A CONTEXT ** OUTSIDE OF THE SOFTWARE SYSTEM. ** ** $AUTHORS: Stefan Bosse ** $INITIAL: (C) 2006-2019 bLAB ** $CREATED: 09-01-19 by sbosse. ** $VERSION: 1.1.7 ** $INFO: ** ** Cordova Node-Webkit Wrapper (emulation API) ** ** $ENDOFINFO ** */ var nw = require("nw.gui"); gui = nw if (typeof navigator == 'undefined') navigator = {} if (typeof cordova == 'undefined') cordova = {} // cordova-plugin-contacts // TODO navigator.contacts = { fieldType : { id:1, displayName:2, name:3 }, find : function (fields,onsucc,onerr,options) { onerr('not supported'); } }; ContactFindOptions = function () { return {} } // Disable what ever of geolocation service is in nw // delete navigator.geolocation; // Use JAM satelite localization instead navigator.geolocation.getCurrentPosition = function (ondata,onerror) { if (Network && Network.location && ondata) ondata({coords:{latitude:Network.location.gps.lat,longitude:Network.location.gps.lon}}); else if (onerror) onerror({message:'Currently not active'}); } function docReady(callback, context) { "use strict"; // The public function name defaults to window.docReady // but you can modify the last line of this function to pass in a different object or method name // if you want to put them in a different namespace and those will be used instead of // window.docReady(...) var baseObj = window; var readyList = []; var readyFired = false; var readyEventHandlersInstalled = false; // call this when the document is ready // this function protects itself against being called more than once function ready() { if (!readyFired) { // this must be set to true before we start calling callbacks readyFired = true; for (var i = 0; i < readyList.length; i++) { // if a callback here happens to add new ready handlers, // the docReady() function will see that it already fired // and will schedule the callback to run right after // this event loop finishes so all handlers will still execute // in order and no new ones will be added to the readyList // while we are processing the list readyList[i].fn.call(window, readyList[i].ctx); } // allow any closures held by these functions to free readyList = []; } } function readyStateChange() { if ( document.readyState === "complete" ) { ready(); } } // This is the one public interface // docReady(fn, context); // the context argument is optional - if present, it will be passed // as an argument to the callback if (typeof callback !== "function") { throw new TypeError("callback for docReady(fn) must be a function"); } // if ready has already fired, then just schedule the callback // to fire asynchronously, but right away if (readyFired) { setTimeout(function() {callback(context);}, 1); return; } else { // add the function and context to the list readyList.push({fn: callback, ctx: context}); } // if document already ready to go, schedule the ready function to run // IE only safe when readyState is "complete", others safe when readyState is "interactive" if (document.readyState === "complete" || (!document.attachEvent && document.readyState === "interactive")) { setTimeout(ready, 1); } else if (!readyEventHandlersInstalled) { // otherwise if we don't have event handlers installed, install them if (document.addEventListener) { // first choice is DOMContentLoaded event document.addEventListener("DOMContentLoaded", ready, false); // backup is window load event window.addEventListener("load", ready, false); } else { // must be IE document.attachEvent("onreadystatechange", readyStateChange); window.attachEvent("onload", ready); } readyEventHandlersInstalled = true; } }; docReady(function () { console.log('load event') var event = new Event('deviceready'); document.dispatchEvent(event); }); // cordova-plugin-sensors sensors = { addSensorListener: function (sensor, mode, fevent, ferr) { ferr('Not supported'); }, } // cordova-plugin-file cordova.file = { applicationDirectory: '/', applicationStorageDirectory:'/', dataDirectory: '/', downloadDirectory: (process.env._HOME||process.env.HOME||"/"), externalRootDirectory: "/", tempDirectory: "/tmp/", userDirectory: (process.env._HOME||process.env.HOME||"/"), } var fs = require('fs'); // Find Download directory .. if (fs.existsSync(cordova.file.userDirectory+'/Downloads')) cordova.file.downloadDirectory=cordova.file.userDirectory+'/Downloads'; else if (fs.existsSync(cordova.file.userDirectory+'/downloads')) cordova.file.downloadDirectory=cordova.file.userDirectory+'/downloads'; // Find app root directory if (fs.existsSync(process.cwd()+'/app.html')) cordova.file.applicationDirectory=process.cwd(); else if (fs.existsSync(process.cwd()+'/app/app.html')) cordova.file.applicationDirectory=process.cwd()+'/app'; cordova.file.dataDirectory = cordova.file.applicationDirectory+'/data' window.resolveLocalFileSystemURL = function (path, cb, onerror1) { var resolvedPath = path; var fileSystem = { file: function (cb, onerror2) { if (!fs.existsSync(resolvedPath)) { if (onerror2) onerror2('Not existing: '+resolvedPath); else if (onerror1) onerror1('Not existing: '+resolvedPath); return; }; cb(resolvedPath); }, createReader: function () { var reader = { readEntries : function (cb,onerror2) { if (!fs.existsSync(resolvedPath)) { if (onerror2) onerror2('Not existing: '+resolvedPath); else if (onerror1) onerror1('Not existing: '+resolvedPath); return; }; try { var entries = fs.readdirSync(resolvedPath); if (entries) cb(entries.map( function (name) { try { var stat = fs.lstatSync(resolvedPath+'/'+name); if (stat.isDirectory()) return {isFile:false,isDirectory:true,name:name}; else return {isFile:true,isDirectory:false,name:name}; } catch (err) { return null }; }).filter( function (entry) { if (!entry) return; if (entry.name!='..' && entry.name[0]=='.') return; return entry; })); } catch (err) { if (onerror2) onerror2(err+': '+resolvedPath); else if (onerror1) onerror1(err+': '+resolvedPath); } } } return reader; }, createWriter: function (cb) { var fileWriter = { write: function (blob) { } } cb(fileWriter); }, getFile: function (filename, options, cb, onerror2) { var pathToFile=path+'/'+filename; if (options.create) { var fileWriter = {} fileWriter.write = function (blob) { // log(pathToFile) try { fs.writeFileSync(pathToFile, blob.data, 'utf8'); if (fileWriter.onwriteend) fileWriter.onwriteend(); } catch (e) { var errmsg = 'Write of file '+pathToFile+' failed: '+e.toString(); if (fileWriter.onerror) fileWriter.onerror(errmsg); else if (onerror2) onerror2(errmsg); } } var file = { createWriter: function (cb2) { cb2(fileWriter) } } cb(file) } else { // CHeck if file exists if (fs.existsSync(pathToFile)) cb({}); else if (onerror2) onerror2('No such file: '+pathToFile); } } } cb(fileSystem); } function FileReader () { this.onloadend = function () {}; } FileReader.prototype.readAsText = function (pathToFile) { var data = 'Hello World'; try { this.result = fs.readFileSync(pathToFile,'utf8'); if (this.onloadend) this.onloadend(); } catch (err) { if (this.onerror) this.onerror(err); } } function Blob(data,options) { this.data=data; this.options=options; }