cordova.plugins.diagnostic
Version:
Cordova/Phonegap plugin to check the state of Location/WiFi/Camera/Bluetooth device settings.
166 lines (136 loc) • 4.46 kB
JavaScript
/**********
* Globals
**********/
const PLUGIN_NAME = "Diagnostic plugin";
const PLUGIN_ID = "cordova.plugins.diagnostic";
const PREFERENCE_NAME = PLUGIN_ID + ".modules";
const MODULES = [
"LOCATION",
"BLUETOOTH",
"WIFI",
"CAMERA",
"NOTIFICATIONS",
"MICROPHONE",
"CONTACTS",
"CALENDAR",
"REMINDERS",
"MOTION",
"NFC",
"EXTERNAL_STORAGE",
"AIRPLANE_MODE"
];
const COMMENT_START = "<!--";
const COMMENT_END = "-->";
// Node dependencies
var path, cwd, fs;
// External dependencies
var et;
// Internal dependencies
var logger;
var projectPath, modulesPath, pluginNodePath, pluginScriptsPath, configXmlPath, pluginXmlPath, configXmlData, pluginXmlText;
/*********************
* Internal functions
*********************/
var run = function (){
var configuredModules = getSelectedModules();
logger.verbose("Modules: " + configuredModules);
readPluginXml();
enableAllModules();
if(configuredModules){
MODULES.forEach(function(module){
if(configuredModules.indexOf(module) === -1){
disableModule(module);
}
});
}
writePluginXml();
};
var handleError = function (error) {
error = PLUGIN_NAME + " - ERROR: " + error;
if(logger){
logger.error(error);
}else{
console.log(error);
console.error(error)
}
return error;
};
// Parses a given file into an elementtree object
var parseElementtreeSync = function(filename) {
var contents = fs.readFileSync(filename, 'utf-8');
if(contents) {
//Windows is the BOM. Skip the Byte Order Mark.
contents = contents.substring(contents.indexOf('<'));
}
return new et.ElementTree(et.XML(contents));
};
// Parses the config.xml into an elementtree object and stores in the config object
var getConfigXml = function() {
if(!configXmlData) {
configXmlData = parseElementtreeSync(configXmlPath);
}
return configXmlData;
};
var readPluginXml = function(){
pluginXmlText = fs.readFileSync(pluginXmlPath, 'utf-8');
};
var writePluginXml = function(){
fs.writeFileSync(pluginXmlPath, pluginXmlText, 'utf-8');
};
var getSelectedModules = function(){
var modules = null;
var preference = getConfigXml().findall("preference[@name='"+PREFERENCE_NAME+"']")[0];
if(preference){
modules = preference.attrib.value.split(' ');
}
return modules;
};
var enableAllModules = function(){
MODULES.forEach(function(module){
var commentedStartRegExp = new RegExp(getModuleStart(module)+COMMENT_START, "g");
var commentedEndRegExp = new RegExp(COMMENT_END+getModuleEnd(module), "g");
if(pluginXmlText.match(commentedStartRegExp)){
pluginXmlText = pluginXmlText.replace(commentedStartRegExp, getModuleStart(module));
pluginXmlText = pluginXmlText.replace(commentedEndRegExp, getModuleEnd(module));
}
});
};
var disableModule = function(module){
var commentedStart = getModuleStart(module)+COMMENT_START;
var commentedEnd = COMMENT_END+getModuleEnd(module);
pluginXmlText = pluginXmlText.replace(new RegExp(getModuleStart(module), "g"), commentedStart);
pluginXmlText = pluginXmlText.replace(new RegExp(getModuleEnd(module), "g"), commentedEnd);
};
var getModuleStart = function(module){
return "<!--BEGIN_MODULE "+module+"-->";
};
var getModuleEnd = function(module){
return "<!--END_MODULE "+module+"-->";
};
/**********
* Main
**********/
var main = function() {
try{
fs = require('fs');
path = require('path');
cwd = path.resolve();
pluginNodePath = cwd;
modulesPath = path.resolve(pluginNodePath, "..");
projectPath = path.resolve(modulesPath, "..");
pluginScriptsPath = path.resolve(pluginNodePath, "scripts");
logger = require(path.resolve(pluginScriptsPath, "logger.js"))(modulesPath, PLUGIN_ID);
et = require(path.resolve(modulesPath, "elementtree"));
}catch(e){
handleError("Failed to load dependencies. If using cordova@6 CLI, ensure this plugin is installed with the --fetch option or run 'npm install "+PLUGIN_ID+"': " + e.message);
}
try{
configXmlPath = path.join(projectPath, 'config.xml');
pluginXmlPath = path.join(pluginNodePath, "plugin.xml");
run();
}catch(e){
handleError(e.message);
}
};
main();