From 59ad3551b1f52c251236ac532b0c61b434a0ac4c Mon Sep 17 00:00:00 2001 From: Suraj Pindoria Date: Mon, 7 Jul 2014 17:00:21 -0700 Subject: [PATCH 01/16] Created Plugman "publish" submodule --- cordova-lib/spec-plugman/{ => publish}/publish.spec.js | 4 ++-- cordova-lib/spec-plugman/{ => publish}/unpublish.spec.js | 4 ++-- cordova-lib/src/plugman/plugman.js | 4 ++-- cordova-lib/src/plugman/{ => publish}/publish.js | 2 +- cordova-lib/src/plugman/{ => publish}/unpublish.js | 2 +- 5 files changed, 8 insertions(+), 8 deletions(-) rename cordova-lib/spec-plugman/{ => publish}/publish.spec.js (90%) rename cordova-lib/spec-plugman/{ => publish}/unpublish.spec.js (89%) rename cordova-lib/src/plugman/{ => publish}/publish.js (95%) rename cordova-lib/src/plugman/{ => publish}/unpublish.js (95%) diff --git a/cordova-lib/spec-plugman/publish.spec.js b/cordova-lib/spec-plugman/publish/publish.spec.js similarity index 90% rename from cordova-lib/spec-plugman/publish.spec.js rename to cordova-lib/spec-plugman/publish/publish.spec.js index f5ebf41fb..766f1aa58 100644 --- a/cordova-lib/spec-plugman/publish.spec.js +++ b/cordova-lib/spec-plugman/publish/publish.spec.js @@ -16,9 +16,9 @@ specific language governing permissions and limitations under the License. */ -var publish = require('../src/plugman/publish'), +var publish = require('../../src/plugman/publish/publish'), Q = require('q'), - registry = require('../src/plugman/registry/registry'); + registry = require('../../src/plugman/registry/registry'); describe('publish', function() { it('should publish a plugin', function() { diff --git a/cordova-lib/spec-plugman/unpublish.spec.js b/cordova-lib/spec-plugman/publish/unpublish.spec.js similarity index 89% rename from cordova-lib/spec-plugman/unpublish.spec.js rename to cordova-lib/spec-plugman/publish/unpublish.spec.js index f678ea2db..eddafe8a0 100644 --- a/cordova-lib/spec-plugman/unpublish.spec.js +++ b/cordova-lib/spec-plugman/publish/unpublish.spec.js @@ -16,9 +16,9 @@ specific language governing permissions and limitations under the License. */ -var unpublish = require('../src/plugman/unpublish'), +var unpublish = require('../../src/plugman/publish/unpublish'), Q = require('q'), - registry = require('../src/plugman/registry/registry'); + registry = require('../../src/plugman/registry/registry'); describe('unpublish', function() { it('should unpublish a plugin', function() { diff --git a/cordova-lib/src/plugman/plugman.js b/cordova-lib/src/plugman/plugman.js index a7acb202c..235c36597 100644 --- a/cordova-lib/src/plugman/plugman.js +++ b/cordova-lib/src/plugman/plugman.js @@ -73,8 +73,8 @@ addProperty(plugman, 'prepare', './prepare'); addProperty(plugman, 'config', './config', true); addProperty(plugman, 'owner', './owner', true); addProperty(plugman, 'adduser', './adduser', true); -addProperty(plugman, 'publish', './publish', true); -addProperty(plugman, 'unpublish', './unpublish', true); +addProperty(plugman, 'publish', './publish/publish', true); +addProperty(plugman, 'unpublish', './publish/unpublish', true); addProperty(plugman, 'search', './search', true); addProperty(plugman, 'info', './info', true); addProperty(plugman, 'create', './create', true); diff --git a/cordova-lib/src/plugman/publish.js b/cordova-lib/src/plugman/publish/publish.js similarity index 95% rename from cordova-lib/src/plugman/publish.js rename to cordova-lib/src/plugman/publish/publish.js index fc8212553..f7a7a36e2 100644 --- a/cordova-lib/src/plugman/publish.js +++ b/cordova-lib/src/plugman/publish/publish.js @@ -21,7 +21,7 @@ indent:4, unused:vars, latedef:nofunc */ -var registry = require('./registry/registry'); +var registry = require('../registry/registry'); module.exports = function(plugin_path) { // plugin_path is an array of paths diff --git a/cordova-lib/src/plugman/unpublish.js b/cordova-lib/src/plugman/publish/unpublish.js similarity index 95% rename from cordova-lib/src/plugman/unpublish.js rename to cordova-lib/src/plugman/publish/unpublish.js index c66dc8260..525792ac6 100644 --- a/cordova-lib/src/plugman/unpublish.js +++ b/cordova-lib/src/plugman/publish/unpublish.js @@ -21,7 +21,7 @@ indent:4, unused:vars, latedef:nofunc */ -var registry = require('./registry/registry'); +var registry = require('../registry/registry'); module.exports = function(plugin) { return registry.unpublish(plugin); From 13c675c92be3272a25ec6db703ad28670bb78651 Mon Sep 17 00:00:00 2001 From: Suraj Pindoria Date: Mon, 7 Jul 2014 17:20:13 -0700 Subject: [PATCH 02/16] Created Plugman "prepare" submodule --- .../spec-plugman/{ => prepare}/prepare.spec.js | 8 ++++---- cordova-lib/src/plugman/plugman.js | 2 +- .../{ => prepare}/prepare-browserify.js | 18 +++++++++--------- .../src/plugman/{ => prepare}/prepare.js | 16 ++++++++-------- 4 files changed, 22 insertions(+), 22 deletions(-) rename cordova-lib/spec-plugman/{ => prepare}/prepare.spec.js (93%) rename cordova-lib/src/plugman/{ => prepare}/prepare-browserify.js (94%) rename cordova-lib/src/plugman/{ => prepare}/prepare.js (95%) diff --git a/cordova-lib/spec-plugman/prepare.spec.js b/cordova-lib/spec-plugman/prepare/prepare.spec.js similarity index 93% rename from cordova-lib/spec-plugman/prepare.spec.js rename to cordova-lib/spec-plugman/prepare/prepare.spec.js index 01df9f48e..7e22454e3 100644 --- a/cordova-lib/spec-plugman/prepare.spec.js +++ b/cordova-lib/spec-plugman/prepare/prepare.spec.js @@ -16,14 +16,14 @@ specific language governing permissions and limitations under the License. */ -var platforms = require('../src/plugman/platforms'), - prepare = require('../src/plugman/prepare'), - common = require('../src/plugman/platforms/common'); +var platforms = require('../../src/plugman/platforms'), + prepare = require('../../src/plugman/prepare/prepare'), + common = require('../../src/plugman/platforms/common'); fs = require('fs'), os = require('osenv'), path = require('path'), shell = require('shelljs'), - config_changes = require('../src/plugman/util/config-changes'), + config_changes = require('../../src/plugman/util/config-changes'), temp = __dirname, plugins_dir = path.join(temp, 'plugins'); diff --git a/cordova-lib/src/plugman/plugman.js b/cordova-lib/src/plugman/plugman.js index 235c36597..595388845 100644 --- a/cordova-lib/src/plugman/plugman.js +++ b/cordova-lib/src/plugman/plugman.js @@ -69,7 +69,7 @@ var plugman = { addProperty(plugman, 'install', './install', true); addProperty(plugman, 'uninstall', './uninstall', true); addProperty(plugman, 'fetch', './fetch', true); -addProperty(plugman, 'prepare', './prepare'); +addProperty(plugman, 'prepare', './prepare/prepare'); addProperty(plugman, 'config', './config', true); addProperty(plugman, 'owner', './owner', true); addProperty(plugman, 'adduser', './adduser', true); diff --git a/cordova-lib/src/plugman/prepare-browserify.js b/cordova-lib/src/plugman/prepare/prepare-browserify.js similarity index 94% rename from cordova-lib/src/plugman/prepare-browserify.js rename to cordova-lib/src/plugman/prepare/prepare-browserify.js index 1a1cdf919..9e9f4c2c0 100644 --- a/cordova-lib/src/plugman/prepare-browserify.js +++ b/cordova-lib/src/plugman/prepare/prepare-browserify.js @@ -22,20 +22,20 @@ unused:false, expr:true */ -var platform_modules = require('./platforms'), +var platform_modules = require('../platforms'), path = require('path'), - config_changes = require('./util/config-changes'), - xml_helpers = require('../util/xml-helpers'), - wp8 = require('./platforms/wp8'), - windows8 = require('./platforms/windows8'), - common = require('./platforms/common'), + config_changes = require('../util/config-changes'), + xml_helpers = require('../../util/xml-helpers'), + wp8 = require('../platforms/wp8'), + windows8 = require('../platforms/windows8'), + common = require('../platforms/common'), fs = require('fs'), shell = require('shelljs'), util = require('util'), - events = require('../events'), - plugman = require('./plugman'), + events = require('../../events'), + plugman = require('../plugman'), et = require('elementtree'), - prepareNamespace = require('./util/prepare-namespace'), + prepareNamespace = require('../util/prepare-namespace'), bundle = require('cordova-js/tasks/lib/bundle-browserify'), requireTr = require('cordova-js/tasks/lib/require-tr'), writeLicenseHeader = require('cordova-js/tasks/lib/write-license-header'); diff --git a/cordova-lib/src/plugman/prepare.js b/cordova-lib/src/plugman/prepare/prepare.js similarity index 95% rename from cordova-lib/src/plugman/prepare.js rename to cordova-lib/src/plugman/prepare/prepare.js index 961141ed8..872eae965 100644 --- a/cordova-lib/src/plugman/prepare.js +++ b/cordova-lib/src/plugman/prepare/prepare.js @@ -22,18 +22,18 @@ expr:true, quotmark:false */ -var platform_modules = require('./platforms'), +var platform_modules = require('../platforms'), path = require('path'), - config_changes = require('./util/config-changes'), - xml_helpers = require('../util/xml-helpers'), - wp8 = require('./platforms/wp8'), - windows = require('./platforms/windows'), - common = require('./platforms/common'), + config_changes = require('../util/config-changes'), + xml_helpers = require('../../util/xml-helpers'), + wp8 = require('../platforms/wp8'), + windows = require('../platforms/windows'), + common = require('../platforms/common'), fs = require('fs'), shell = require('shelljs'), util = require('util'), - events = require('../events'), - plugman = require('./plugman'); + events = require('../../events'), + plugman = require('../plugman'); // Called on --prepare. // Sets up each plugin's Javascript code to be loaded properly. From a5ed25c702f0f01265d27057f779a1cd14d581d1 Mon Sep 17 00:00:00 2001 From: Suraj Pindoria Date: Tue, 8 Jul 2014 13:24:15 -0700 Subject: [PATCH 03/16] Created spec folders for the new submodules --- .../prepare/prepare.spec.js | 0 .../publish/publish.spec.js | 0 .../publish/unpublish.spec.js | 0 3 files changed, 0 insertions(+), 0 deletions(-) rename cordova-lib/{spec-plugman => spec-plugman-prepare}/prepare/prepare.spec.js (100%) rename cordova-lib/{spec-plugman => spec-plugman-publish}/publish/publish.spec.js (100%) rename cordova-lib/{spec-plugman => spec-plugman-publish}/publish/unpublish.spec.js (100%) diff --git a/cordova-lib/spec-plugman/prepare/prepare.spec.js b/cordova-lib/spec-plugman-prepare/prepare/prepare.spec.js similarity index 100% rename from cordova-lib/spec-plugman/prepare/prepare.spec.js rename to cordova-lib/spec-plugman-prepare/prepare/prepare.spec.js diff --git a/cordova-lib/spec-plugman/publish/publish.spec.js b/cordova-lib/spec-plugman-publish/publish/publish.spec.js similarity index 100% rename from cordova-lib/spec-plugman/publish/publish.spec.js rename to cordova-lib/spec-plugman-publish/publish/publish.spec.js diff --git a/cordova-lib/spec-plugman/publish/unpublish.spec.js b/cordova-lib/spec-plugman-publish/publish/unpublish.spec.js similarity index 100% rename from cordova-lib/spec-plugman/publish/unpublish.spec.js rename to cordova-lib/spec-plugman-publish/publish/unpublish.spec.js From ea2322e775db7c35c9bac89af69efb6fef1afd4f Mon Sep 17 00:00:00 2001 From: Suraj Pindoria Date: Tue, 8 Jul 2014 13:38:30 -0700 Subject: [PATCH 04/16] Removed an extra folder under spec --- .../spec-plugman-prepare/{prepare => }/prepare.spec.js | 8 ++++---- .../spec-plugman-publish/{publish => }/publish.spec.js | 4 ++-- .../spec-plugman-publish/{publish => }/unpublish.spec.js | 4 ++-- 3 files changed, 8 insertions(+), 8 deletions(-) rename cordova-lib/spec-plugman-prepare/{prepare => }/prepare.spec.js (93%) rename cordova-lib/spec-plugman-publish/{publish => }/publish.spec.js (90%) rename cordova-lib/spec-plugman-publish/{publish => }/unpublish.spec.js (89%) diff --git a/cordova-lib/spec-plugman-prepare/prepare/prepare.spec.js b/cordova-lib/spec-plugman-prepare/prepare.spec.js similarity index 93% rename from cordova-lib/spec-plugman-prepare/prepare/prepare.spec.js rename to cordova-lib/spec-plugman-prepare/prepare.spec.js index 7e22454e3..e9bedeba3 100644 --- a/cordova-lib/spec-plugman-prepare/prepare/prepare.spec.js +++ b/cordova-lib/spec-plugman-prepare/prepare.spec.js @@ -16,14 +16,14 @@ specific language governing permissions and limitations under the License. */ -var platforms = require('../../src/plugman/platforms'), - prepare = require('../../src/plugman/prepare/prepare'), - common = require('../../src/plugman/platforms/common'); +var platforms = require('../src/plugman/platforms'), + prepare = require('../src/plugman/prepare/prepare'), + common = require('../src/plugman/platforms/common'); fs = require('fs'), os = require('osenv'), path = require('path'), shell = require('shelljs'), - config_changes = require('../../src/plugman/util/config-changes'), + config_changes = require('../src/plugman/util/config-changes'), temp = __dirname, plugins_dir = path.join(temp, 'plugins'); diff --git a/cordova-lib/spec-plugman-publish/publish/publish.spec.js b/cordova-lib/spec-plugman-publish/publish.spec.js similarity index 90% rename from cordova-lib/spec-plugman-publish/publish/publish.spec.js rename to cordova-lib/spec-plugman-publish/publish.spec.js index 766f1aa58..266db9658 100644 --- a/cordova-lib/spec-plugman-publish/publish/publish.spec.js +++ b/cordova-lib/spec-plugman-publish/publish.spec.js @@ -16,9 +16,9 @@ specific language governing permissions and limitations under the License. */ -var publish = require('../../src/plugman/publish/publish'), +var publish = require('../src/plugman/publish/publish'), Q = require('q'), - registry = require('../../src/plugman/registry/registry'); + registry = require('../src/plugman/registry/registry'); describe('publish', function() { it('should publish a plugin', function() { diff --git a/cordova-lib/spec-plugman-publish/publish/unpublish.spec.js b/cordova-lib/spec-plugman-publish/unpublish.spec.js similarity index 89% rename from cordova-lib/spec-plugman-publish/publish/unpublish.spec.js rename to cordova-lib/spec-plugman-publish/unpublish.spec.js index eddafe8a0..d3e8dd81c 100644 --- a/cordova-lib/spec-plugman-publish/publish/unpublish.spec.js +++ b/cordova-lib/spec-plugman-publish/unpublish.spec.js @@ -16,9 +16,9 @@ specific language governing permissions and limitations under the License. */ -var unpublish = require('../../src/plugman/publish/unpublish'), +var unpublish = require('../src/plugman/publish/unpublish'), Q = require('q'), - registry = require('../../src/plugman/registry/registry'); + registry = require('../src/plugman/registry/registry'); describe('unpublish', function() { it('should unpublish a plugin', function() { From 8eaa26943f402682754d33173e80bdddb53b4095 Mon Sep 17 00:00:00 2001 From: Suraj Pindoria Date: Fri, 11 Jul 2014 10:54:23 -0700 Subject: [PATCH 05/16] Created Plugman "install" submodule --- .../install.spec.js | 2 +- .../uninstall.spec.js | 4 ++-- .../platforms/amazon-fireos.spec.js | 2 +- .../spec-plugman/platforms/android.spec.js | 2 +- .../platforms/blackberry10.spec.js | 2 +- .../spec-plugman/platforms/ios.spec.js | 2 +- .../spec-plugman/platforms/windows8.spec.js | 2 +- .../spec-plugman/platforms/wp8.spec.js | 2 +- .../src/plugman/{ => install}/install.js | 18 +++++++-------- .../src/plugman/{ => install}/uninstall.js | 22 +++++++++---------- cordova-lib/src/plugman/plugman.js | 4 ++-- 11 files changed, 31 insertions(+), 31 deletions(-) rename cordova-lib/{spec-plugman => spec-plugman-install}/install.spec.js (99%) rename cordova-lib/{spec-plugman => spec-plugman-install}/uninstall.spec.js (99%) rename cordova-lib/src/plugman/{ => install}/install.js (97%) rename cordova-lib/src/plugman/{ => install}/uninstall.js (95%) diff --git a/cordova-lib/spec-plugman/install.spec.js b/cordova-lib/spec-plugman-install/install.spec.js similarity index 99% rename from cordova-lib/spec-plugman/install.spec.js rename to cordova-lib/spec-plugman-install/install.spec.js index 3fe84284f..3e3da45cc 100644 --- a/cordova-lib/spec-plugman/install.spec.js +++ b/cordova-lib/spec-plugman-install/install.spec.js @@ -16,7 +16,7 @@ specific language governing permissions and limitations under the License. */ -var install = require('../src/plugman/install'), +var install = require('../src/plugman/install/install'), actions = require('../src/plugman/util/action-stack'), config_changes = require('../src/plugman/util/config-changes'), xml_helpers = require('../src/util/xml-helpers'), diff --git a/cordova-lib/spec-plugman/uninstall.spec.js b/cordova-lib/spec-plugman-install/uninstall.spec.js similarity index 99% rename from cordova-lib/spec-plugman/uninstall.spec.js rename to cordova-lib/spec-plugman-install/uninstall.spec.js index 8b5593eff..4efa79547 100644 --- a/cordova-lib/spec-plugman/uninstall.spec.js +++ b/cordova-lib/spec-plugman-install/uninstall.spec.js @@ -16,8 +16,8 @@ specific language governing permissions and limitations under the License. */ -var uninstall = require('../src/plugman/uninstall'), - install = require('../src/plugman/install'), +var uninstall = require('../src/plugman/install/uninstall'), + install = require('../src/plugman/install/install'), actions = require('../src/plugman/util/action-stack'), config_changes = require('../src/plugman/util/config-changes'), events = require('../src/events'), diff --git a/cordova-lib/spec-plugman/platforms/amazon-fireos.spec.js b/cordova-lib/spec-plugman/platforms/amazon-fireos.spec.js index 5025fd392..a2fdbf46e 100644 --- a/cordova-lib/spec-plugman/platforms/amazon-fireos.spec.js +++ b/cordova-lib/spec-plugman/platforms/amazon-fireos.spec.js @@ -18,7 +18,7 @@ */ var amazon_fireos = require('../../src/plugman/platforms/amazon-fireos'), common = require('../../src/plugman/platforms/common'), - install = require('../../src/plugman/install'), + install = require('../../src/plugman/install/install'), path = require('path'), fs = require('fs'), shell = require('shelljs'), diff --git a/cordova-lib/spec-plugman/platforms/android.spec.js b/cordova-lib/spec-plugman/platforms/android.spec.js index 0ead8bf84..dc7801ae2 100644 --- a/cordova-lib/spec-plugman/platforms/android.spec.js +++ b/cordova-lib/spec-plugman/platforms/android.spec.js @@ -19,7 +19,7 @@ var android = require('../../src/plugman/platforms/android'), android_project = require('../../src/plugman/util/android-project'), common = require('../../src/plugman/platforms/common'), - install = require('../../src/plugman/install'), + install = require('../../src/plugman/install/install'), path = require('path'), fs = require('fs'), shell = require('shelljs'), diff --git a/cordova-lib/spec-plugman/platforms/blackberry10.spec.js b/cordova-lib/spec-plugman/platforms/blackberry10.spec.js index f2b2249f4..9a4121263 100644 --- a/cordova-lib/spec-plugman/platforms/blackberry10.spec.js +++ b/cordova-lib/spec-plugman/platforms/blackberry10.spec.js @@ -18,7 +18,7 @@ */ var blackberry10 = require('../../src/plugman/platforms/blackberry10'), common = require('../../src/plugman/platforms/common'), - install = require('../../src/plugman/install'), + install = require('../../src/plugman/install/install'), path = require('path'), fs = require('fs'), shell = require('shelljs'), diff --git a/cordova-lib/spec-plugman/platforms/ios.spec.js b/cordova-lib/spec-plugman/platforms/ios.spec.js index cc8dcfdb0..4684c6c33 100644 --- a/cordova-lib/spec-plugman/platforms/ios.spec.js +++ b/cordova-lib/spec-plugman/platforms/ios.spec.js @@ -17,7 +17,7 @@ under the License. */ var ios = require('../../src/plugman/platforms/ios'), - install = require('../../src/plugman/install'), + install = require('../../src/plugman/install/install'), path = require('path'), fs = require('fs'), et = require('elementtree'), diff --git a/cordova-lib/spec-plugman/platforms/windows8.spec.js b/cordova-lib/spec-plugman/platforms/windows8.spec.js index ee68bd890..3276b6932 100644 --- a/cordova-lib/spec-plugman/platforms/windows8.spec.js +++ b/cordova-lib/spec-plugman/platforms/windows8.spec.js @@ -18,7 +18,7 @@ */ var windows8 = require('../../src/plugman/platforms/windows'), common = require('../../src/plugman/platforms/common'), - install = require('../../src/plugman/install'), + install = require('../../src/plugman/install/install'), path = require('path'), fs = require('fs'), shell = require('shelljs'), diff --git a/cordova-lib/spec-plugman/platforms/wp8.spec.js b/cordova-lib/spec-plugman/platforms/wp8.spec.js index 6679445d4..8080a2638 100644 --- a/cordova-lib/spec-plugman/platforms/wp8.spec.js +++ b/cordova-lib/spec-plugman/platforms/wp8.spec.js @@ -18,7 +18,7 @@ */ var wp8 = require('../../src/plugman/platforms/wp8'), common = require('../../src/plugman/platforms/common'), - install = require('../../src/plugman/install'), + install = require('../../src/plugman/install/install'), path = require('path'), fs = require('fs'), shell = require('shelljs'), diff --git a/cordova-lib/src/plugman/install.js b/cordova-lib/src/plugman/install/install.js similarity index 97% rename from cordova-lib/src/plugman/install.js rename to cordova-lib/src/plugman/install/install.js index 6a8bea2b6..363d4f5b2 100644 --- a/cordova-lib/src/plugman/install.js +++ b/cordova-lib/src/plugman/install/install.js @@ -24,20 +24,20 @@ var path = require('path'), fs = require('fs'), - action_stack = require('./util/action-stack'), + action_stack = require('../util/action-stack'), dep_graph = require('dep-graph'), child_process = require('child_process'), semver = require('semver'), - config_changes = require('./util/config-changes'), - PluginInfo = require('../PluginInfo'), - CordovaError = require('../CordovaError'), + config_changes = require('../util/config-changes'), + PluginInfo = require('../../PluginInfo'), + CordovaError = require('../../CordovaError'), Q = require('q'), - platform_modules = require('./platforms'), + platform_modules = require('../platforms'), os = require('os'), underscore = require('underscore'), shell = require('shelljs'), - events = require('../events'), - plugman = require('./plugman'), + events = require('../../events'), + plugman = require('../plugman'), isWindows = (os.platform().substr(0,3) === 'win'); /* INSTALL FLOW @@ -204,7 +204,7 @@ function callEngineScripts(engines) { // return only the engines we care about/need function getEngines(pluginElement, platform, project_dir, plugin_dir){ var engines = pluginElement.findall('engines/engine'); - var defaultEngines = require('./util/default-engines')(project_dir); + var defaultEngines = require('../util/default-engines')(project_dir); var uncheckedEngines = []; var cordovaEngineIndex, cordovaPlatformEngineIndex, theName, platformIndex, defaultPlatformIndex; // load in known defaults and update when necessary @@ -382,7 +382,7 @@ function tryFetchDependency(dep, install, options) { if ( dep.url == '.' ) { // Look up the parent plugin's fetch metadata and determine the correct URL. - var fetchdata = require('./util/metadata').get_fetch_metadata(install.top_plugin_dir); + var fetchdata = require('../util/metadata').get_fetch_metadata(install.top_plugin_dir); if (!fetchdata || !(fetchdata.source && fetchdata.source.type)) { relativePath = dep.subdir || dep.id; diff --git a/cordova-lib/src/plugman/uninstall.js b/cordova-lib/src/plugman/install/uninstall.js similarity index 95% rename from cordova-lib/src/plugman/uninstall.js rename to cordova-lib/src/plugman/install/uninstall.js index c145da27a..a0a248804 100644 --- a/cordova-lib/src/plugman/uninstall.js +++ b/cordova-lib/src/plugman/install/uninstall.js @@ -25,18 +25,18 @@ var path = require('path'), fs = require('fs'), shell= require('shelljs'), - config_changes = require('./util/config-changes'), - xml_helpers = require('../util/xml-helpers'), - action_stack = require('./util/action-stack'), - dependencies = require('./util/dependencies'), - CordovaError = require('../CordovaError'), + config_changes = require('../util/config-changes'), + xml_helpers = require('../../util/xml-helpers'), + action_stack = require('../util/action-stack'), + dependencies = require('../util/dependencies'), + CordovaError = require('../../CordovaError'), underscore = require('underscore'), Q = require('q'), underscore = require('underscore'), - events = require('../events'), - platform_modules = require('./platforms'), - plugman = require('./plugman'), - promiseutil = require('../util/promise-util'); + events = require('../../events'), + platform_modules = require('../platforms'), + plugman = require('../plugman'), + promiseutil = require('../../util/promise-util'); // possible options: cli_variables, www_dir // Returns a promise. @@ -244,7 +244,7 @@ function runUninstallPlatform(actions, platform, project_dir, plugin_dir, plugin // Returns a promise. function handleUninstall(actions, platform, plugin_id, plugin_et, project_dir, www_dir, plugins_dir, plugin_dir, is_top_level) { - var platform_modules = require('./platforms'); + var platform_modules = require('../platforms'); var handler = platform_modules[platform]; var platformTag = plugin_et.find('./platform[@name="'+platform+'"]'); // CB-6976 Windows Universal Apps. For smooth transition and to prevent mass api failures @@ -303,7 +303,7 @@ function handleUninstall(actions, platform, plugin_id, plugin_et, project_dir, w } // queue up asset installation - var common = require('./platforms/common'); + var common = require('../platforms/common'); assets && assets.forEach(function(asset) { actions.push(actions.createAction(common.asset.uninstall, [asset, www_dir, plugin_id], common.asset.install, [asset, plugin_dir, www_dir])); }); diff --git a/cordova-lib/src/plugman/plugman.js b/cordova-lib/src/plugman/plugman.js index 595388845..a3f568ec2 100644 --- a/cordova-lib/src/plugman/plugman.js +++ b/cordova-lib/src/plugman/plugman.js @@ -66,8 +66,8 @@ var plugman = { raw: {} }; -addProperty(plugman, 'install', './install', true); -addProperty(plugman, 'uninstall', './uninstall', true); +addProperty(plugman, 'install', './install/install', true); +addProperty(plugman, 'uninstall', './install/uninstall', true); addProperty(plugman, 'fetch', './fetch', true); addProperty(plugman, 'prepare', './prepare/prepare'); addProperty(plugman, 'config', './config', true); From 4c4c394ef69be433dd5711fba0a881172fe4334e Mon Sep 17 00:00:00 2001 From: Suraj Pindoria Date: Fri, 11 Jul 2014 12:00:56 -0700 Subject: [PATCH 06/16] Created Plugman "misc" submodule --- .../adduser.spec.js | 2 +- .../{spec-plugman => spec-plugman-misc}/config.spec.js | 2 +- .../{spec-plugman => spec-plugman-misc}/info.spec.js | 2 +- .../{spec-plugman => spec-plugman-misc}/owner.spec.js | 2 +- .../{spec-plugman => spec-plugman-misc}/search.spec.js | 2 +- cordova-lib/src/plugman/{ => misc}/adduser.js | 2 +- cordova-lib/src/plugman/{ => misc}/config.js | 2 +- cordova-lib/src/plugman/{ => misc}/info.js | 2 +- cordova-lib/src/plugman/{ => misc}/owner.js | 2 +- cordova-lib/src/plugman/{ => misc}/search.js | 2 +- cordova-lib/src/plugman/plugman.js | 10 +++++----- 11 files changed, 15 insertions(+), 15 deletions(-) rename cordova-lib/{spec-plugman => spec-plugman-misc}/adduser.spec.js (95%) rename cordova-lib/{spec-plugman => spec-plugman-misc}/config.spec.js (95%) rename cordova-lib/{spec-plugman => spec-plugman-misc}/info.spec.js (96%) rename cordova-lib/{spec-plugman => spec-plugman-misc}/owner.spec.js (95%) rename cordova-lib/{spec-plugman => spec-plugman-misc}/search.spec.js (95%) rename cordova-lib/src/plugman/{ => misc}/adduser.js (95%) rename cordova-lib/src/plugman/{ => misc}/config.js (95%) rename cordova-lib/src/plugman/{ => misc}/info.js (95%) rename cordova-lib/src/plugman/{ => misc}/owner.js (95%) rename cordova-lib/src/plugman/{ => misc}/search.js (95%) diff --git a/cordova-lib/spec-plugman/adduser.spec.js b/cordova-lib/spec-plugman-misc/adduser.spec.js similarity index 95% rename from cordova-lib/spec-plugman/adduser.spec.js rename to cordova-lib/spec-plugman-misc/adduser.spec.js index e98dae562..6bafc07bd 100644 --- a/cordova-lib/spec-plugman/adduser.spec.js +++ b/cordova-lib/spec-plugman-misc/adduser.spec.js @@ -16,7 +16,7 @@ specific language governing permissions and limitations under the License. */ -var adduser = require('../src/plugman/adduser'), +var adduser = require('../src/plugman/misc/adduser'), Q = require('q'), registry = require('../src/plugman/registry/registry'); diff --git a/cordova-lib/spec-plugman/config.spec.js b/cordova-lib/spec-plugman-misc/config.spec.js similarity index 95% rename from cordova-lib/spec-plugman/config.spec.js rename to cordova-lib/spec-plugman-misc/config.spec.js index a70624fb1..7dc4c8fee 100644 --- a/cordova-lib/spec-plugman/config.spec.js +++ b/cordova-lib/spec-plugman-misc/config.spec.js @@ -16,7 +16,7 @@ specific language governing permissions and limitations under the License. */ -var config = require('../src/plugman/config'), +var config = require('../src/plugman/misc/config'), Q = require('q'), registry = require('../src/plugman/registry/registry'); diff --git a/cordova-lib/spec-plugman/info.spec.js b/cordova-lib/spec-plugman-misc/info.spec.js similarity index 96% rename from cordova-lib/spec-plugman/info.spec.js rename to cordova-lib/spec-plugman-misc/info.spec.js index 7b4e46009..b660b008b 100644 --- a/cordova-lib/spec-plugman/info.spec.js +++ b/cordova-lib/spec-plugman-misc/info.spec.js @@ -16,7 +16,7 @@ specific language governing permissions and limitations under the License. */ -var search = require('../src/plugman/info'), +var search = require('../src/plugman/misc/info'), Q = require('q'), registry = require('../src/plugman/registry/registry'); diff --git a/cordova-lib/spec-plugman/owner.spec.js b/cordova-lib/spec-plugman-misc/owner.spec.js similarity index 95% rename from cordova-lib/spec-plugman/owner.spec.js rename to cordova-lib/spec-plugman-misc/owner.spec.js index 0e25d6d2a..90da13150 100644 --- a/cordova-lib/spec-plugman/owner.spec.js +++ b/cordova-lib/spec-plugman-misc/owner.spec.js @@ -16,7 +16,7 @@ specific language governing permissions and limitations under the License. */ -var owner = require('../src/plugman/owner'), +var owner = require('../src/plugman/misc/owner'), Q = require('q'), registry = require('../src/plugman/registry/registry'); diff --git a/cordova-lib/spec-plugman/search.spec.js b/cordova-lib/spec-plugman-misc/search.spec.js similarity index 95% rename from cordova-lib/spec-plugman/search.spec.js rename to cordova-lib/spec-plugman-misc/search.spec.js index 800c0a4f3..a28fc1f04 100644 --- a/cordova-lib/spec-plugman/search.spec.js +++ b/cordova-lib/spec-plugman-misc/search.spec.js @@ -16,7 +16,7 @@ specific language governing permissions and limitations under the License. */ -var search = require('../src/plugman/search'), +var search = require('../src/plugman/misc/search'), Q = require('q'), registry = require('../src/plugman/registry/registry'); diff --git a/cordova-lib/src/plugman/adduser.js b/cordova-lib/src/plugman/misc/adduser.js similarity index 95% rename from cordova-lib/src/plugman/adduser.js rename to cordova-lib/src/plugman/misc/adduser.js index 474edc6ea..499c50e63 100644 --- a/cordova-lib/src/plugman/adduser.js +++ b/cordova-lib/src/plugman/misc/adduser.js @@ -21,7 +21,7 @@ indent:4, unused:vars, latedef:nofunc */ -var registry = require('./registry/registry'); +var registry = require('../registry/registry'); module.exports = function() { return registry.adduser(null); diff --git a/cordova-lib/src/plugman/config.js b/cordova-lib/src/plugman/misc/config.js similarity index 95% rename from cordova-lib/src/plugman/config.js rename to cordova-lib/src/plugman/misc/config.js index 7e68207a0..8c4d87305 100644 --- a/cordova-lib/src/plugman/config.js +++ b/cordova-lib/src/plugman/misc/config.js @@ -21,7 +21,7 @@ indent:4, unused:vars, latedef:nofunc */ -var registry = require('./registry/registry'); +var registry = require('../registry/registry'); module.exports = function(params) { return registry.config(params); diff --git a/cordova-lib/src/plugman/info.js b/cordova-lib/src/plugman/misc/info.js similarity index 95% rename from cordova-lib/src/plugman/info.js rename to cordova-lib/src/plugman/misc/info.js index 90bf40ce2..bd07bf470 100644 --- a/cordova-lib/src/plugman/info.js +++ b/cordova-lib/src/plugman/misc/info.js @@ -21,7 +21,7 @@ indent:4, unused:vars, latedef:nofunc */ -var registry = require('./registry/registry'); +var registry = require('../registry/registry'); // Returns a promise. module.exports = function(plugin) { diff --git a/cordova-lib/src/plugman/owner.js b/cordova-lib/src/plugman/misc/owner.js similarity index 95% rename from cordova-lib/src/plugman/owner.js rename to cordova-lib/src/plugman/misc/owner.js index f059c5434..8e88fd9ce 100644 --- a/cordova-lib/src/plugman/owner.js +++ b/cordova-lib/src/plugman/misc/owner.js @@ -21,7 +21,7 @@ indent:4, unused:vars, latedef:nofunc */ -var registry = require('./registry/registry'); +var registry = require('../registry/registry'); // Returns a promise. module.exports = function(args) { diff --git a/cordova-lib/src/plugman/search.js b/cordova-lib/src/plugman/misc/search.js similarity index 95% rename from cordova-lib/src/plugman/search.js rename to cordova-lib/src/plugman/misc/search.js index f2cd3d892..67a9dbfbc 100644 --- a/cordova-lib/src/plugman/search.js +++ b/cordova-lib/src/plugman/misc/search.js @@ -21,7 +21,7 @@ indent:4, unused:vars, latedef:nofunc */ -var registry = require('./registry/registry'); +var registry = require('../registry/registry'); module.exports = function(search_opts) { return registry.search(search_opts); diff --git a/cordova-lib/src/plugman/plugman.js b/cordova-lib/src/plugman/plugman.js index a3f568ec2..bdcfd0b24 100644 --- a/cordova-lib/src/plugman/plugman.js +++ b/cordova-lib/src/plugman/plugman.js @@ -70,13 +70,13 @@ addProperty(plugman, 'install', './install/install', true); addProperty(plugman, 'uninstall', './install/uninstall', true); addProperty(plugman, 'fetch', './fetch', true); addProperty(plugman, 'prepare', './prepare/prepare'); -addProperty(plugman, 'config', './config', true); -addProperty(plugman, 'owner', './owner', true); -addProperty(plugman, 'adduser', './adduser', true); +addProperty(plugman, 'config', './misc/config', true); +addProperty(plugman, 'owner', './misc/owner', true); +addProperty(plugman, 'adduser', './misc/adduser', true); addProperty(plugman, 'publish', './publish/publish', true); addProperty(plugman, 'unpublish', './publish/unpublish', true); -addProperty(plugman, 'search', './search', true); -addProperty(plugman, 'info', './info', true); +addProperty(plugman, 'search', './misc/search', true); +addProperty(plugman, 'info', './misc/info', true); addProperty(plugman, 'create', './create', true); addProperty(plugman, 'platform', './platform_operation', true); addProperty(plugman, 'config_changes', './util/config-changes'); From 51d9c6c75297e1f0f021290fca8741cdf3d656f6 Mon Sep 17 00:00:00 2001 From: Suraj Pindoria Date: Fri, 11 Jul 2014 14:22:03 -0700 Subject: [PATCH 07/16] Created Plugman "create" submodule --- .../create.spec.js | 2 +- .../fetch.spec.js | 2 +- cordova-lib/src/plugman/{ => create}/create.js | 4 ++-- cordova-lib/src/plugman/{ => create}/fetch.js | 13 +++++++------ cordova-lib/src/plugman/plugman.js | 4 ++-- 5 files changed, 13 insertions(+), 12 deletions(-) rename cordova-lib/{spec-plugman => spec-plugman-create}/create.spec.js (98%) rename cordova-lib/{spec-plugman => spec-plugman-create}/fetch.spec.js (99%) rename cordova-lib/src/plugman/{ => create}/create.js (95%) rename cordova-lib/src/plugman/{ => create}/fetch.js (95%) diff --git a/cordova-lib/spec-plugman/create.spec.js b/cordova-lib/spec-plugman-create/create.spec.js similarity index 98% rename from cordova-lib/spec-plugman/create.spec.js rename to cordova-lib/spec-plugman-create/create.spec.js index 561ad7318..49e6c8cef 100644 --- a/cordova-lib/spec-plugman/create.spec.js +++ b/cordova-lib/spec-plugman-create/create.spec.js @@ -16,7 +16,7 @@ specific language governing permissions and limitations under the License. */ -var create = require('../src/plugman/create'), +var create = require('../src/plugman/create/create'), Q = require('q'), fs = require('fs'), shell = require('shelljs'), diff --git a/cordova-lib/spec-plugman/fetch.spec.js b/cordova-lib/spec-plugman-create/fetch.spec.js similarity index 99% rename from cordova-lib/spec-plugman/fetch.spec.js rename to cordova-lib/spec-plugman-create/fetch.spec.js index b2a9f19e1..c6c037ff3 100644 --- a/cordova-lib/spec-plugman/fetch.spec.js +++ b/cordova-lib/spec-plugman-create/fetch.spec.js @@ -16,7 +16,7 @@ specific language governing permissions and limitations under the License. */ -var fetch = require('../src/plugman/fetch'), +var fetch = require('../src/plugman/create/fetch'), fs = require('fs'), os = require('osenv'), path = require('path'), diff --git a/cordova-lib/src/plugman/create.js b/cordova-lib/src/plugman/create/create.js similarity index 95% rename from cordova-lib/src/plugman/create.js rename to cordova-lib/src/plugman/create/create.js index 684b126c8..34546590a 100644 --- a/cordova-lib/src/plugman/create.js +++ b/cordova-lib/src/plugman/create/create.js @@ -26,11 +26,11 @@ var Q = require('q'), path = require('path'), shell = require('shelljs'), et = require('elementtree'), - CordovaError = require('../CordovaError'); + CordovaError = require('../../CordovaError'); module.exports = function create( name, id, version, pluginPath, options ) { var cwd = pluginPath + '/' + name + '/', - templatesDir = path.join(__dirname, '..', '..', 'templates/'), + templatesDir = path.join(__dirname, '..', '..', '..', 'templates/'), baseJS, root, pluginName, diff --git a/cordova-lib/src/plugman/fetch.js b/cordova-lib/src/plugman/create/fetch.js similarity index 95% rename from cordova-lib/src/plugman/fetch.js rename to cordova-lib/src/plugman/create/fetch.js index ddc432bc3..dcdb83d94 100644 --- a/cordova-lib/src/plugman/fetch.js +++ b/cordova-lib/src/plugman/create/fetch.js @@ -24,14 +24,15 @@ var shell = require('shelljs'), fs = require('fs'), url = require('url'), - PluginInfo = require('../PluginInfo'), - plugins = require('./util/plugins'), - CordovaError = require('../CordovaError'), - events = require('../events'), - metadata = require('./util/metadata'), + PluginInfo = require('../../PluginInfo'), + plugins = require('../util/plugins'), + xml_helpers = require('../../util/xml-helpers'), + CordovaError = require('../../CordovaError'), + events = require('../../events'), + metadata = require('../util/metadata'), path = require('path'), Q = require('q'), - registry = require('./registry/registry'); + registry = require('../registry/registry'); // Cache of PluginInfo objects for plugins in search path. var localPlugins = null; diff --git a/cordova-lib/src/plugman/plugman.js b/cordova-lib/src/plugman/plugman.js index bdcfd0b24..03d9893b1 100644 --- a/cordova-lib/src/plugman/plugman.js +++ b/cordova-lib/src/plugman/plugman.js @@ -68,7 +68,7 @@ var plugman = { addProperty(plugman, 'install', './install/install', true); addProperty(plugman, 'uninstall', './install/uninstall', true); -addProperty(plugman, 'fetch', './fetch', true); +addProperty(plugman, 'fetch', './create/fetch', true); addProperty(plugman, 'prepare', './prepare/prepare'); addProperty(plugman, 'config', './misc/config', true); addProperty(plugman, 'owner', './misc/owner', true); @@ -77,7 +77,7 @@ addProperty(plugman, 'publish', './publish/publish', true); addProperty(plugman, 'unpublish', './publish/unpublish', true); addProperty(plugman, 'search', './misc/search', true); addProperty(plugman, 'info', './misc/info', true); -addProperty(plugman, 'create', './create', true); +addProperty(plugman, 'create', './create/create', true); addProperty(plugman, 'platform', './platform_operation', true); addProperty(plugman, 'config_changes', './util/config-changes'); From 5416fad73b98e26955b75530286f8606a0995f49 Mon Sep 17 00:00:00 2001 From: Suraj Pindoria Date: Mon, 14 Jul 2014 14:41:36 -0700 Subject: [PATCH 08/16] Create Cordova "build" submodule --- .../build.spec.js | 0 .../compile.spec.js | 0 .../prepare.spec.js | 2 +- cordova-lib/src/cordova/{ => build}/build.js | 8 ++++---- cordova-lib/src/cordova/{ => build}/compile.js | 6 +++--- cordova-lib/src/cordova/{ => build}/prepare.js | 12 ++++++------ cordova-lib/src/cordova/cordova.js | 6 +++--- 7 files changed, 17 insertions(+), 17 deletions(-) rename cordova-lib/{spec-cordova => spec-cordova-build}/build.spec.js (100%) rename cordova-lib/{spec-cordova => spec-cordova-build}/compile.spec.js (100%) rename cordova-lib/{spec-cordova => spec-cordova-build}/prepare.spec.js (99%) rename cordova-lib/src/cordova/{ => build}/build.js (87%) rename cordova-lib/src/cordova/{ => build}/compile.js (92%) rename cordova-lib/src/cordova/{ => build}/prepare.js (95%) diff --git a/cordova-lib/spec-cordova/build.spec.js b/cordova-lib/spec-cordova-build/build.spec.js similarity index 100% rename from cordova-lib/spec-cordova/build.spec.js rename to cordova-lib/spec-cordova-build/build.spec.js diff --git a/cordova-lib/spec-cordova/compile.spec.js b/cordova-lib/spec-cordova-build/compile.spec.js similarity index 100% rename from cordova-lib/spec-cordova/compile.spec.js rename to cordova-lib/spec-cordova-build/compile.spec.js diff --git a/cordova-lib/spec-cordova/prepare.spec.js b/cordova-lib/spec-cordova-build/prepare.spec.js similarity index 99% rename from cordova-lib/spec-cordova/prepare.spec.js rename to cordova-lib/spec-cordova-build/prepare.spec.js index 475b90eec..8a888f4e8 100644 --- a/cordova-lib/spec-cordova/prepare.spec.js +++ b/cordova-lib/spec-cordova-build/prepare.spec.js @@ -22,7 +22,7 @@ var cordova = require('../src/cordova/cordova'), path = require('path'), fs = require('fs'), util = require('../src/cordova/util'), - prepare = require('../src/cordova/prepare'), + prepare = require('../src/cordova/build/prepare'), lazy_load = require('../src/cordova/lazy_load'), ConfigParser = require('../src/configparser/ConfigParser'), platforms = require('../src/cordova/platforms'), diff --git a/cordova-lib/src/cordova/build.js b/cordova-lib/src/cordova/build/build.js similarity index 87% rename from cordova-lib/src/cordova/build.js rename to cordova-lib/src/cordova/build/build.js index 384d9e275..3843423db 100644 --- a/cordova-lib/src/cordova/build.js +++ b/cordova-lib/src/cordova/build/build.js @@ -21,8 +21,8 @@ indent:4, unused:vars, latedef:nofunc */ -var cordova_util = require('./util'), - hooker = require('./hooker'); +var cordova_util = require('../util'), + hooker = require('../hooker'); // Returns a promise. module.exports = function build(options) { @@ -42,9 +42,9 @@ module.exports = function build(options) { var hooks = new hooker(projectRoot); return hooks.fire('before_build', options) .then(function() { - return require('./cordova').raw.prepare(options); + return require('../cordova').raw.prepare(options); }).then(function() { - return require('./cordova').raw.compile(options); + return require('../cordova').raw.compile(options); }).then(function() { return hooks.fire('after_build', options); }); diff --git a/cordova-lib/src/cordova/compile.js b/cordova-lib/src/cordova/build/compile.js similarity index 92% rename from cordova-lib/src/cordova/compile.js rename to cordova-lib/src/cordova/build/compile.js index 814d3eb1d..39fe270ce 100644 --- a/cordova-lib/src/cordova/compile.js +++ b/cordova-lib/src/cordova/build/compile.js @@ -22,9 +22,9 @@ */ var path = require('path'), - cordova_util = require('./util'), - hooker = require('./hooker'), - superspawn = require('./superspawn'); + cordova_util = require('../util'), + hooker = require('../hooker'), + superspawn = require('../superspawn'); // Returns a promise. module.exports = function compile(options) { diff --git a/cordova-lib/src/cordova/prepare.js b/cordova-lib/src/cordova/build/prepare.js similarity index 95% rename from cordova-lib/src/cordova/prepare.js rename to cordova-lib/src/cordova/build/prepare.js index 9ba56102e..868c0dec6 100644 --- a/cordova-lib/src/cordova/prepare.js +++ b/cordova-lib/src/cordova/build/prepare.js @@ -21,17 +21,17 @@ indent:4, unused:vars, latedef:nofunc */ -var cordova_util = require('./util'), - ConfigParser = require('../configparser/ConfigParser'), +var cordova_util = require('../util'), + ConfigParser = require('../../configparser/ConfigParser'), path = require('path'), - platforms = require('./platforms'), + platforms = require('../platforms'), fs = require('fs'), shell = require('shelljs'), et = require('elementtree'), - hooker = require('./hooker'), - events = require('../events'), + hooker = require('../hooker'), + events = require('../../events'), Q = require('q'), - plugman = require('../plugman/plugman'); + plugman = require('../../plugman/plugman'); // Returns a promise. exports = module.exports = prepare; diff --git a/cordova-lib/src/cordova/cordova.js b/cordova-lib/src/cordova/cordova.js index 95110c94b..57fb3cf18 100644 --- a/cordova-lib/src/cordova/cordova.js +++ b/cordova-lib/src/cordova/cordova.js @@ -57,8 +57,8 @@ exports.findProjectRoot = function(opt_startDir) { // To use a promise instead, call the APIs via cordova.raw.FOO(), which returns // a promise instead of using a final-parameter-callback. var addModuleProperty = cordova_util.addModuleProperty; -addModuleProperty(module, 'prepare', './prepare', true); -addModuleProperty(module, 'build', './build', true); +addModuleProperty(module, 'prepare', './build/prepare', true); +addModuleProperty(module, 'build', './build/build', true); addModuleProperty(module, 'help', './help'); addModuleProperty(module, 'config', './config'); addModuleProperty(module, 'create', './create', true); @@ -68,7 +68,7 @@ addModuleProperty(module, 'plugins', './plugin', true); addModuleProperty(module, 'serve', './serve'); addModuleProperty(module, 'platform', './platform', true); addModuleProperty(module, 'platforms', './platform', true); -addModuleProperty(module, 'compile', './compile', true); +addModuleProperty(module, 'compile', './build/compile', true); addModuleProperty(module, 'run', './run', true); addModuleProperty(module, 'info', './info', true); addModuleProperty(module, 'save', './save', true); From d8d924ebb8ee6cf36e6c77ea3d0c4d7c0fe0d3e1 Mon Sep 17 00:00:00 2001 From: Suraj Pindoria Date: Mon, 14 Jul 2014 15:49:06 -0700 Subject: [PATCH 09/16] Created Cordova "project" submodule --- .../create.spec.js | 2 +- .../emulate.spec.js | 0 .../fixtures/base/.cordova/config.json | 22 + .../fixtures/base/merges/.svn | 0 .../fixtures/base/plugins/.svn | 0 .../fixtures/base/www/config.xml | 14 + .../fixtures/base/www/css/index.css | 115 ++ .../fixtures/base/www/img/logo.png | Bin 0 -> 21814 bytes .../fixtures/base/www/index.html | 43 + .../fixtures/base/www/js/index.js | 49 + .../fixtures/base/www/spec.html | 68 + .../fixtures/hooks_bat/fail/fail.bat | 2 + .../fixtures/hooks_bat/test/.dotted.bat | 2 + .../fixtures/hooks_bat/test/07.bat | 3 + .../fixtures/hooks_bat/test/1.bat | 5 + .../fixtures/hooks_sh/fail/fail.sh | 1 + .../fixtures/hooks_sh/test/.dotted.sh | 1 + .../fixtures/hooks_sh/test/07.sh | 2 + .../fixtures/hooks_sh/test/1.sh | 4 + .../fixtures/platforms/android-lib/VERSION | 1 + .../framework/assets/www/cordova.js | 1 + .../platforms/android/AndroidManifest.xml | 14 + .../platforms/android/assets/www/config.xml | 14 + .../platforms/android/assets/www/cordova.js | 1712 +++++++++++++++++ .../android/assets/www/cordova_plugins.js | 3 + .../android/assets/www/css/index.css | 115 ++ .../platforms/android/assets/www/img/logo.png | Bin 0 -> 21814 bytes .../platforms/android/assets/www/index.html | 43 + .../platforms/android/assets/www/js/index.js | 49 + .../platforms/android/assets/www/spec.html | 68 + .../fixtures/platforms/android/build.xml | 92 + .../fixtures/platforms/android/cordova/build | 35 + .../platforms/android/cordova/check_reqs | 27 + .../fixtures/platforms/android/cordova/clean | 34 + .../platforms/android/cordova/defaults.xml | 50 + .../platforms/android/cordova/lib/appinfo.js | 41 + .../platforms/android/cordova/lib/build.js | 89 + .../android/cordova/lib/check_reqs.js | 78 + .../platforms/android/cordova/lib/clean.js | 43 + .../platforms/android/cordova/lib/device.js | 95 + .../platforms/android/cordova/lib/emulator.js | 337 ++++ .../android/cordova/lib/install-device | 38 + .../android/cordova/lib/install-emulator | 38 + .../android/cordova/lib/list-devices | 28 + .../android/cordova/lib/list-emulator-images | 29 + .../cordova/lib/list-started-emulators | 29 + .../platforms/android/cordova/lib/log.js | 43 + .../platforms/android/cordova/lib/run.js | 124 ++ .../android/cordova/lib/start-emulator | 38 + .../fixtures/platforms/android/cordova/log | 33 + .../fixtures/platforms/android/cordova/run | 35 + .../platforms/android/cordova/version | 25 + .../platforms/android/local.properties | 10 + .../platforms/android/proguard-project.txt | 20 + .../platforms/android/project.properties | 14 + .../android/res/drawable-hdpi/icon.png | Bin 0 -> 6080 bytes .../android/res/drawable-ldpi/icon.png | Bin 0 -> 3096 bytes .../android/res/drawable-mdpi/icon.png | Bin 0 -> 4090 bytes .../android/res/drawable-xhdpi/icon.png | Bin 0 -> 7685 bytes .../platforms/android/res/drawable/icon.png | Bin 0 -> 7685 bytes .../platforms/android/res/values/strings.xml | 4 + .../platforms/android/res/xml/config.xml | 18 + .../android/src/org/testing/TestBase.java | 37 + .../fixtures/plugins/ChildBrowser/plugin.xml | 126 ++ .../src/android/ChildBrowser.java | 19 + .../plugins/ChildBrowser/www/childbrowser.js | 19 + .../ChildBrowser/www/childbrowser/image.jpg | 1 + .../ChildBrowser/www/childbrowser_file.html | 1 + .../fixtures/plugins/android/plugin.xml | 14 + .../plugins/android/src/android/Android.java | 0 .../android/src/android/SomethingWithR.java | 6 + .../fixtures/plugins/android/www/android.js | 0 .../fixtures/plugins/fake1/plugin.xml | 10 + .../fixtures/plugins/test/plugin.xml | 14 + .../fixtures/plugins/test/www/test.js | 0 .../projects/android/AndroidManifest.xml | 69 + .../projects/android/assets/www/.gitkeep | 0 .../projects/android/res/xml/config.xml | 54 + .../fixtures/projects/android/src/.gitkeep | 0 .../fixtures/projects/windows/bom_test.xml | 24 + .../fixtures/templates/no_content_config.xml | 19 + .../restore.spec.js | 0 .../run.spec.js | 0 .../save.spec.js | 0 cordova-lib/src/cordova/cordova.js | 10 +- .../src/cordova/{ => project}/create.js | 16 +- .../src/cordova/{ => project}/emulate.js | 8 +- .../src/cordova/{ => project}/restore.js | 8 +- cordova-lib/src/cordova/{ => project}/run.js | 8 +- cordova-lib/src/cordova/{ => project}/save.js | 8 +- 90 files changed, 4241 insertions(+), 30 deletions(-) rename cordova-lib/{spec-cordova => spec-cordova-project}/create.spec.js (98%) rename cordova-lib/{spec-cordova => spec-cordova-project}/emulate.spec.js (100%) create mode 100644 cordova-lib/spec-cordova-project/fixtures/base/.cordova/config.json create mode 100644 cordova-lib/spec-cordova-project/fixtures/base/merges/.svn create mode 100644 cordova-lib/spec-cordova-project/fixtures/base/plugins/.svn create mode 100644 cordova-lib/spec-cordova-project/fixtures/base/www/config.xml create mode 100644 cordova-lib/spec-cordova-project/fixtures/base/www/css/index.css create mode 100644 cordova-lib/spec-cordova-project/fixtures/base/www/img/logo.png create mode 100644 cordova-lib/spec-cordova-project/fixtures/base/www/index.html create mode 100644 cordova-lib/spec-cordova-project/fixtures/base/www/js/index.js create mode 100644 cordova-lib/spec-cordova-project/fixtures/base/www/spec.html create mode 100644 cordova-lib/spec-cordova-project/fixtures/hooks_bat/fail/fail.bat create mode 100644 cordova-lib/spec-cordova-project/fixtures/hooks_bat/test/.dotted.bat create mode 100644 cordova-lib/spec-cordova-project/fixtures/hooks_bat/test/07.bat create mode 100644 cordova-lib/spec-cordova-project/fixtures/hooks_bat/test/1.bat create mode 100755 cordova-lib/spec-cordova-project/fixtures/hooks_sh/fail/fail.sh create mode 100755 cordova-lib/spec-cordova-project/fixtures/hooks_sh/test/.dotted.sh create mode 100755 cordova-lib/spec-cordova-project/fixtures/hooks_sh/test/07.sh create mode 100755 cordova-lib/spec-cordova-project/fixtures/hooks_sh/test/1.sh create mode 100644 cordova-lib/spec-cordova-project/fixtures/platforms/android-lib/VERSION create mode 100644 cordova-lib/spec-cordova-project/fixtures/platforms/android-lib/framework/assets/www/cordova.js create mode 100644 cordova-lib/spec-cordova-project/fixtures/platforms/android/AndroidManifest.xml create mode 100644 cordova-lib/spec-cordova-project/fixtures/platforms/android/assets/www/config.xml create mode 100644 cordova-lib/spec-cordova-project/fixtures/platforms/android/assets/www/cordova.js create mode 100644 cordova-lib/spec-cordova-project/fixtures/platforms/android/assets/www/cordova_plugins.js create mode 100644 cordova-lib/spec-cordova-project/fixtures/platforms/android/assets/www/css/index.css create mode 100644 cordova-lib/spec-cordova-project/fixtures/platforms/android/assets/www/img/logo.png create mode 100644 cordova-lib/spec-cordova-project/fixtures/platforms/android/assets/www/index.html create mode 100644 cordova-lib/spec-cordova-project/fixtures/platforms/android/assets/www/js/index.js create mode 100644 cordova-lib/spec-cordova-project/fixtures/platforms/android/assets/www/spec.html create mode 100644 cordova-lib/spec-cordova-project/fixtures/platforms/android/build.xml create mode 100755 cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/build create mode 100755 cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/check_reqs create mode 100755 cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/clean create mode 100644 cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/defaults.xml create mode 100755 cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/lib/appinfo.js create mode 100755 cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/lib/build.js create mode 100755 cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/lib/check_reqs.js create mode 100755 cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/lib/clean.js create mode 100755 cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/lib/device.js create mode 100755 cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/lib/emulator.js create mode 100755 cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/lib/install-device create mode 100755 cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/lib/install-emulator create mode 100755 cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/lib/list-devices create mode 100755 cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/lib/list-emulator-images create mode 100755 cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/lib/list-started-emulators create mode 100755 cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/lib/log.js create mode 100755 cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/lib/run.js create mode 100755 cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/lib/start-emulator create mode 100755 cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/log create mode 100755 cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/run create mode 100755 cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/version create mode 100644 cordova-lib/spec-cordova-project/fixtures/platforms/android/local.properties create mode 100644 cordova-lib/spec-cordova-project/fixtures/platforms/android/proguard-project.txt create mode 100644 cordova-lib/spec-cordova-project/fixtures/platforms/android/project.properties create mode 100644 cordova-lib/spec-cordova-project/fixtures/platforms/android/res/drawable-hdpi/icon.png create mode 100644 cordova-lib/spec-cordova-project/fixtures/platforms/android/res/drawable-ldpi/icon.png create mode 100644 cordova-lib/spec-cordova-project/fixtures/platforms/android/res/drawable-mdpi/icon.png create mode 100644 cordova-lib/spec-cordova-project/fixtures/platforms/android/res/drawable-xhdpi/icon.png create mode 100644 cordova-lib/spec-cordova-project/fixtures/platforms/android/res/drawable/icon.png create mode 100644 cordova-lib/spec-cordova-project/fixtures/platforms/android/res/values/strings.xml create mode 100644 cordova-lib/spec-cordova-project/fixtures/platforms/android/res/xml/config.xml create mode 100644 cordova-lib/spec-cordova-project/fixtures/platforms/android/src/org/testing/TestBase.java create mode 100644 cordova-lib/spec-cordova-project/fixtures/plugins/ChildBrowser/plugin.xml create mode 100644 cordova-lib/spec-cordova-project/fixtures/plugins/ChildBrowser/src/android/ChildBrowser.java create mode 100644 cordova-lib/spec-cordova-project/fixtures/plugins/ChildBrowser/www/childbrowser.js create mode 100644 cordova-lib/spec-cordova-project/fixtures/plugins/ChildBrowser/www/childbrowser/image.jpg create mode 100644 cordova-lib/spec-cordova-project/fixtures/plugins/ChildBrowser/www/childbrowser_file.html create mode 100644 cordova-lib/spec-cordova-project/fixtures/plugins/android/plugin.xml create mode 100644 cordova-lib/spec-cordova-project/fixtures/plugins/android/src/android/Android.java create mode 100644 cordova-lib/spec-cordova-project/fixtures/plugins/android/src/android/SomethingWithR.java create mode 100644 cordova-lib/spec-cordova-project/fixtures/plugins/android/www/android.js create mode 100644 cordova-lib/spec-cordova-project/fixtures/plugins/fake1/plugin.xml create mode 100644 cordova-lib/spec-cordova-project/fixtures/plugins/test/plugin.xml create mode 100644 cordova-lib/spec-cordova-project/fixtures/plugins/test/www/test.js create mode 100644 cordova-lib/spec-cordova-project/fixtures/projects/android/AndroidManifest.xml create mode 100644 cordova-lib/spec-cordova-project/fixtures/projects/android/assets/www/.gitkeep create mode 100644 cordova-lib/spec-cordova-project/fixtures/projects/android/res/xml/config.xml create mode 100644 cordova-lib/spec-cordova-project/fixtures/projects/android/src/.gitkeep create mode 100644 cordova-lib/spec-cordova-project/fixtures/projects/windows/bom_test.xml create mode 100644 cordova-lib/spec-cordova-project/fixtures/templates/no_content_config.xml rename cordova-lib/{spec-cordova => spec-cordova-project}/restore.spec.js (100%) rename cordova-lib/{spec-cordova => spec-cordova-project}/run.spec.js (100%) rename cordova-lib/{spec-cordova => spec-cordova-project}/save.spec.js (100%) rename cordova-lib/src/cordova/{ => project}/create.js (95%) rename cordova-lib/src/cordova/{ => project}/emulate.js (89%) rename cordova-lib/src/cordova/{ => project}/restore.js (93%) rename cordova-lib/src/cordova/{ => project}/run.js (89%) rename cordova-lib/src/cordova/{ => project}/save.js (93%) diff --git a/cordova-lib/spec-cordova/create.spec.js b/cordova-lib/spec-cordova-project/create.spec.js similarity index 98% rename from cordova-lib/spec-cordova/create.spec.js rename to cordova-lib/spec-cordova-project/create.spec.js index a7e5c0806..29f104b7f 100644 --- a/cordova-lib/spec-cordova/create.spec.js +++ b/cordova-lib/spec-cordova-project/create.spec.js @@ -17,7 +17,7 @@ under the License. */ -var helpers = require('./helpers'), +var helpers = require('../spec-cordova/helpers'), path = require('path'), fs = require('fs'), shell = require('shelljs'), diff --git a/cordova-lib/spec-cordova/emulate.spec.js b/cordova-lib/spec-cordova-project/emulate.spec.js similarity index 100% rename from cordova-lib/spec-cordova/emulate.spec.js rename to cordova-lib/spec-cordova-project/emulate.spec.js diff --git a/cordova-lib/spec-cordova-project/fixtures/base/.cordova/config.json b/cordova-lib/spec-cordova-project/fixtures/base/.cordova/config.json new file mode 100644 index 000000000..4f52ca7f0 --- /dev/null +++ b/cordova-lib/spec-cordova-project/fixtures/base/.cordova/config.json @@ -0,0 +1,22 @@ +{ + "id": "org.testing", + "name":"TestBase", + "lib": { + "android": { + "url": "/some/junk/path", + "version": "dev", + "id": "cordova-android-dev" + }, + "ios": { + "url": "/some/junk/path", + "version": "dev", + "id": "cordova-ios-dev" + }, + "wp8": { + "url": "/some/junk/path", + "version": "dev", + "id": "cordova-wp8-dev" + } + } +} + diff --git a/cordova-lib/spec-cordova-project/fixtures/base/merges/.svn b/cordova-lib/spec-cordova-project/fixtures/base/merges/.svn new file mode 100644 index 000000000..e69de29bb diff --git a/cordova-lib/spec-cordova-project/fixtures/base/plugins/.svn b/cordova-lib/spec-cordova-project/fixtures/base/plugins/.svn new file mode 100644 index 000000000..e69de29bb diff --git a/cordova-lib/spec-cordova-project/fixtures/base/www/config.xml b/cordova-lib/spec-cordova-project/fixtures/base/www/config.xml new file mode 100644 index 000000000..9e7b9e046 --- /dev/null +++ b/cordova-lib/spec-cordova-project/fixtures/base/www/config.xml @@ -0,0 +1,14 @@ + + + TestBase + + A sample Apache Cordova application that responds to the deviceready event. + + + Apache Cordova Team + + + + + + diff --git a/cordova-lib/spec-cordova-project/fixtures/base/www/css/index.css b/cordova-lib/spec-cordova-project/fixtures/base/www/css/index.css new file mode 100644 index 000000000..51daa797c --- /dev/null +++ b/cordova-lib/spec-cordova-project/fixtures/base/www/css/index.css @@ -0,0 +1,115 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +* { + -webkit-tap-highlight-color: rgba(0,0,0,0); /* make transparent link selection, adjust last value opacity 0 to 1.0 */ +} + +body { + -webkit-touch-callout: none; /* prevent callout to copy image, etc when tap to hold */ + -webkit-text-size-adjust: none; /* prevent webkit from resizing text to fit */ + -webkit-user-select: none; /* prevent copy paste, to allow, change 'none' to 'text' */ + background-color:#E4E4E4; + background-image:linear-gradient(top, #A7A7A7 0%, #E4E4E4 51%); + background-image:-webkit-linear-gradient(top, #A7A7A7 0%, #E4E4E4 51%); + background-image:-ms-linear-gradient(top, #A7A7A7 0%, #E4E4E4 51%); + background-image:-webkit-gradient( + linear, + left top, + left bottom, + color-stop(0, #A7A7A7), + color-stop(0.51, #E4E4E4) + ); + background-attachment:fixed; + font-family:'HelveticaNeue-Light', 'HelveticaNeue', Helvetica, Arial, sans-serif; + font-size:12px; + height:100%; + margin:0px; + padding:0px; + text-transform:uppercase; + width:100%; +} + +/* Portrait layout (default) */ +.app { + background:url(../img/logo.png) no-repeat center top; /* 170px x 200px */ + position:absolute; /* position in the center of the screen */ + left:50%; + top:50%; + height:50px; /* text area height */ + width:225px; /* text area width */ + text-align:center; + padding:180px 0px 0px 0px; /* image height is 200px (bottom 20px are overlapped with text) */ + margin:-115px 0px 0px -112px; /* offset vertical: half of image height and text area height */ + /* offset horizontal: half of text area width */ +} + +/* Landscape layout (with min-width) */ +@media screen and (min-aspect-ratio: 1/1) and (min-width:400px) { + .app { + background-position:left center; + padding:75px 0px 75px 170px; /* padding-top + padding-bottom + text area = image height */ + margin:-90px 0px 0px -198px; /* offset vertical: half of image height */ + /* offset horizontal: half of image width and text area width */ + } +} + +h1 { + font-size:24px; + font-weight:normal; + margin:0px; + overflow:visible; + padding:0px; + text-align:center; +} + +.event { + border-radius:4px; + -webkit-border-radius:4px; + color:#FFFFFF; + font-size:12px; + margin:0px 30px; + padding:2px 0px; +} + +.event.listening { + background-color:#333333; + display:block; +} + +.event.received { + background-color:#4B946A; + display:none; +} + +@keyframes fade { + from { opacity: 1.0; } + 50% { opacity: 0.4; } + to { opacity: 1.0; } +} + +@-webkit-keyframes fade { + from { opacity: 1.0; } + 50% { opacity: 0.4; } + to { opacity: 1.0; } +} + +.blink { + animation:fade 3000ms infinite; + -webkit-animation:fade 3000ms infinite; +} diff --git a/cordova-lib/spec-cordova-project/fixtures/base/www/img/logo.png b/cordova-lib/spec-cordova-project/fixtures/base/www/img/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..9519e7dd78adb6e44548c08510a7bf02442a7697 GIT binary patch literal 21814 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 + + + + + + + + + Hello World + + +
+

Apache Cordova

+ +
+ + + + + diff --git a/cordova-lib/spec-cordova-project/fixtures/base/www/js/index.js b/cordova-lib/spec-cordova-project/fixtures/base/www/js/index.js new file mode 100644 index 000000000..31d9064eb --- /dev/null +++ b/cordova-lib/spec-cordova-project/fixtures/base/www/js/index.js @@ -0,0 +1,49 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +var app = { + // Application Constructor + initialize: function() { + this.bindEvents(); + }, + // Bind Event Listeners + // + // Bind any events that are required on startup. Common events are: + // 'load', 'deviceready', 'offline', and 'online'. + bindEvents: function() { + document.addEventListener('deviceready', this.onDeviceReady, false); + }, + // deviceready Event Handler + // + // The scope of 'this' is the event. In order to call the 'receivedEvent' + // function, we must explicity call 'app.receivedEvent(...);' + onDeviceReady: function() { + app.receivedEvent('deviceready'); + }, + // Update DOM on a Received Event + receivedEvent: function(id) { + var parentElement = document.getElementById(id); + var listeningElement = parentElement.querySelector('.listening'); + var receivedElement = parentElement.querySelector('.received'); + + listeningElement.setAttribute('style', 'display:none;'); + receivedElement.setAttribute('style', 'display:block;'); + + console.log('Received Event: ' + id); + } +}; diff --git a/cordova-lib/spec-cordova-project/fixtures/base/www/spec.html b/cordova-lib/spec-cordova-project/fixtures/base/www/spec.html new file mode 100644 index 000000000..71f00de05 --- /dev/null +++ b/cordova-lib/spec-cordova-project/fixtures/base/www/spec.html @@ -0,0 +1,68 @@ + + + + + Jasmine Spec Runner + + + + + + + + + + + + + + + + + + + + diff --git a/cordova-lib/spec-cordova-project/fixtures/hooks_bat/fail/fail.bat b/cordova-lib/spec-cordova-project/fixtures/hooks_bat/fail/fail.bat new file mode 100644 index 000000000..a89b4c89c --- /dev/null +++ b/cordova-lib/spec-cordova-project/fixtures/hooks_bat/fail/fail.bat @@ -0,0 +1,2 @@ +@ECHO OFF +EXIT /B 1 diff --git a/cordova-lib/spec-cordova-project/fixtures/hooks_bat/test/.dotted.bat b/cordova-lib/spec-cordova-project/fixtures/hooks_bat/test/.dotted.bat new file mode 100644 index 000000000..ada7136e5 --- /dev/null +++ b/cordova-lib/spec-cordova-project/fixtures/hooks_bat/test/.dotted.bat @@ -0,0 +1,2 @@ +@ECHO OFF +ECHO "Dotted files in hook dirs should not be called" > dotted_hook_should_not_fire.txt \ No newline at end of file diff --git a/cordova-lib/spec-cordova-project/fixtures/hooks_bat/test/07.bat b/cordova-lib/spec-cordova-project/fixtures/hooks_bat/test/07.bat new file mode 100644 index 000000000..a88c8c590 --- /dev/null +++ b/cordova-lib/spec-cordova-project/fixtures/hooks_bat/test/07.bat @@ -0,0 +1,3 @@ +@ECHO OFF +rem ECHO this is script 0 in %~dp0 +ECHO b >> hooks_order.txt diff --git a/cordova-lib/spec-cordova-project/fixtures/hooks_bat/test/1.bat b/cordova-lib/spec-cordova-project/fixtures/hooks_bat/test/1.bat new file mode 100644 index 000000000..be004c530 --- /dev/null +++ b/cordova-lib/spec-cordova-project/fixtures/hooks_bat/test/1.bat @@ -0,0 +1,5 @@ +@ECHO OFF +rem ECHO this is script 1 in %~dp0 +ECHO a >> hooks_order.txt +ECHO %1 > hooks_params.txt +node -e "console.log(JSON.stringify(process.env, null, 2))" > hooks_env.json diff --git a/cordova-lib/spec-cordova-project/fixtures/hooks_sh/fail/fail.sh b/cordova-lib/spec-cordova-project/fixtures/hooks_sh/fail/fail.sh new file mode 100755 index 000000000..379a4c986 --- /dev/null +++ b/cordova-lib/spec-cordova-project/fixtures/hooks_sh/fail/fail.sh @@ -0,0 +1 @@ +exit 1 diff --git a/cordova-lib/spec-cordova-project/fixtures/hooks_sh/test/.dotted.sh b/cordova-lib/spec-cordova-project/fixtures/hooks_sh/test/.dotted.sh new file mode 100755 index 000000000..e5fa07f91 --- /dev/null +++ b/cordova-lib/spec-cordova-project/fixtures/hooks_sh/test/.dotted.sh @@ -0,0 +1 @@ +echo "Dotted files in hook dirs should not be called" > dotted_hook_should_not_fire.txt diff --git a/cordova-lib/spec-cordova-project/fixtures/hooks_sh/test/07.sh b/cordova-lib/spec-cordova-project/fixtures/hooks_sh/test/07.sh new file mode 100755 index 000000000..f410ee21f --- /dev/null +++ b/cordova-lib/spec-cordova-project/fixtures/hooks_sh/test/07.sh @@ -0,0 +1,2 @@ +#echo "this is script 0 in `pwd`"; +echo b >> hooks_order.txt diff --git a/cordova-lib/spec-cordova-project/fixtures/hooks_sh/test/1.sh b/cordova-lib/spec-cordova-project/fixtures/hooks_sh/test/1.sh new file mode 100755 index 000000000..892869d7c --- /dev/null +++ b/cordova-lib/spec-cordova-project/fixtures/hooks_sh/test/1.sh @@ -0,0 +1,4 @@ +#echo "this is script 1 in `pwd`"; +echo a >> hooks_order.txt +echo $1 > hooks_params.txt +node -e "console.log(JSON.stringify(process.env, null, 2))" > hooks_env.json diff --git a/cordova-lib/spec-cordova-project/fixtures/platforms/android-lib/VERSION b/cordova-lib/spec-cordova-project/fixtures/platforms/android-lib/VERSION new file mode 100644 index 000000000..15a279981 --- /dev/null +++ b/cordova-lib/spec-cordova-project/fixtures/platforms/android-lib/VERSION @@ -0,0 +1 @@ +3.3.0 diff --git a/cordova-lib/spec-cordova-project/fixtures/platforms/android-lib/framework/assets/www/cordova.js b/cordova-lib/spec-cordova-project/fixtures/platforms/android-lib/framework/assets/www/cordova.js new file mode 100644 index 000000000..91c51fce2 --- /dev/null +++ b/cordova-lib/spec-cordova-project/fixtures/platforms/android-lib/framework/assets/www/cordova.js @@ -0,0 +1 @@ +This is a placeholder file. diff --git a/cordova-lib/spec-cordova-project/fixtures/platforms/android/AndroidManifest.xml b/cordova-lib/spec-cordova-project/fixtures/platforms/android/AndroidManifest.xml new file mode 100644 index 000000000..be3f245f7 --- /dev/null +++ b/cordova-lib/spec-cordova-project/fixtures/platforms/android/AndroidManifest.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/cordova-lib/spec-cordova-project/fixtures/platforms/android/assets/www/config.xml b/cordova-lib/spec-cordova-project/fixtures/platforms/android/assets/www/config.xml new file mode 100644 index 000000000..9e7b9e046 --- /dev/null +++ b/cordova-lib/spec-cordova-project/fixtures/platforms/android/assets/www/config.xml @@ -0,0 +1,14 @@ + + + TestBase + + A sample Apache Cordova application that responds to the deviceready event. + + + Apache Cordova Team + + + + + + diff --git a/cordova-lib/spec-cordova-project/fixtures/platforms/android/assets/www/cordova.js b/cordova-lib/spec-cordova-project/fixtures/platforms/android/assets/www/cordova.js new file mode 100644 index 000000000..07e3feb46 --- /dev/null +++ b/cordova-lib/spec-cordova-project/fixtures/platforms/android/assets/www/cordova.js @@ -0,0 +1,1712 @@ +// Platform: android +// 3.1.0 +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ +;(function() { +var CORDOVA_JS_BUILD_LABEL = '3.1.0'; +// file: lib/scripts/require.js + +var require, + define; + +(function () { + var modules = {}, + // Stack of moduleIds currently being built. + requireStack = [], + // Map of module ID -> index into requireStack of modules currently being built. + inProgressModules = {}, + SEPERATOR = "."; + + + + function build(module) { + var factory = module.factory, + localRequire = function (id) { + var resultantId = id; + //Its a relative path, so lop off the last portion and add the id (minus "./") + if (id.charAt(0) === ".") { + resultantId = module.id.slice(0, module.id.lastIndexOf(SEPERATOR)) + SEPERATOR + id.slice(2); + } + return require(resultantId); + }; + module.exports = {}; + delete module.factory; + factory(localRequire, module.exports, module); + return module.exports; + } + + require = function (id) { + if (!modules[id]) { + throw "module " + id + " not found"; + } else if (id in inProgressModules) { + var cycle = requireStack.slice(inProgressModules[id]).join('->') + '->' + id; + throw "Cycle in require graph: " + cycle; + } + if (modules[id].factory) { + try { + inProgressModules[id] = requireStack.length; + requireStack.push(id); + return build(modules[id]); + } finally { + delete inProgressModules[id]; + requireStack.pop(); + } + } + return modules[id].exports; + }; + + define = function (id, factory) { + if (modules[id]) { + throw "module " + id + " already defined"; + } + + modules[id] = { + id: id, + factory: factory + }; + }; + + define.remove = function (id) { + delete modules[id]; + }; + + define.moduleMap = modules; +})(); + +//Export for use in node +if (typeof module === "object" && typeof require === "function") { + module.exports.require = require; + module.exports.define = define; +} + +// file: lib/cordova.js +define("cordova", function(require, exports, module) { + + +var channel = require('cordova/channel'); +var platform = require('cordova/platform'); + +/** + * Intercept calls to addEventListener + removeEventListener and handle deviceready, + * resume, and pause events. + */ +var m_document_addEventListener = document.addEventListener; +var m_document_removeEventListener = document.removeEventListener; +var m_window_addEventListener = window.addEventListener; +var m_window_removeEventListener = window.removeEventListener; + +/** + * Houses custom event handlers to intercept on document + window event listeners. + */ +var documentEventHandlers = {}, + windowEventHandlers = {}; + +document.addEventListener = function(evt, handler, capture) { + var e = evt.toLowerCase(); + if (typeof documentEventHandlers[e] != 'undefined') { + documentEventHandlers[e].subscribe(handler); + } else { + m_document_addEventListener.call(document, evt, handler, capture); + } +}; + +window.addEventListener = function(evt, handler, capture) { + var e = evt.toLowerCase(); + if (typeof windowEventHandlers[e] != 'undefined') { + windowEventHandlers[e].subscribe(handler); + } else { + m_window_addEventListener.call(window, evt, handler, capture); + } +}; + +document.removeEventListener = function(evt, handler, capture) { + var e = evt.toLowerCase(); + // If unsubscribing from an event that is handled by a plugin + if (typeof documentEventHandlers[e] != "undefined") { + documentEventHandlers[e].unsubscribe(handler); + } else { + m_document_removeEventListener.call(document, evt, handler, capture); + } +}; + +window.removeEventListener = function(evt, handler, capture) { + var e = evt.toLowerCase(); + // If unsubscribing from an event that is handled by a plugin + if (typeof windowEventHandlers[e] != "undefined") { + windowEventHandlers[e].unsubscribe(handler); + } else { + m_window_removeEventListener.call(window, evt, handler, capture); + } +}; + +function createEvent(type, data) { + var event = document.createEvent('Events'); + event.initEvent(type, false, false); + if (data) { + for (var i in data) { + if (data.hasOwnProperty(i)) { + event[i] = data[i]; + } + } + } + return event; +} + + +var cordova = { + define:define, + require:require, + version:CORDOVA_JS_BUILD_LABEL, + platformId:platform.id, + /** + * Methods to add/remove your own addEventListener hijacking on document + window. + */ + addWindowEventHandler:function(event) { + return (windowEventHandlers[event] = channel.create(event)); + }, + addStickyDocumentEventHandler:function(event) { + return (documentEventHandlers[event] = channel.createSticky(event)); + }, + addDocumentEventHandler:function(event) { + return (documentEventHandlers[event] = channel.create(event)); + }, + removeWindowEventHandler:function(event) { + delete windowEventHandlers[event]; + }, + removeDocumentEventHandler:function(event) { + delete documentEventHandlers[event]; + }, + /** + * Retrieve original event handlers that were replaced by Cordova + * + * @return object + */ + getOriginalHandlers: function() { + return {'document': {'addEventListener': m_document_addEventListener, 'removeEventListener': m_document_removeEventListener}, + 'window': {'addEventListener': m_window_addEventListener, 'removeEventListener': m_window_removeEventListener}}; + }, + /** + * Method to fire event from native code + * bNoDetach is required for events which cause an exception which needs to be caught in native code + */ + fireDocumentEvent: function(type, data, bNoDetach) { + var evt = createEvent(type, data); + if (typeof documentEventHandlers[type] != 'undefined') { + if( bNoDetach ) { + documentEventHandlers[type].fire(evt); + } + else { + setTimeout(function() { + // Fire deviceready on listeners that were registered before cordova.js was loaded. + if (type == 'deviceready') { + document.dispatchEvent(evt); + } + documentEventHandlers[type].fire(evt); + }, 0); + } + } else { + document.dispatchEvent(evt); + } + }, + fireWindowEvent: function(type, data) { + var evt = createEvent(type,data); + if (typeof windowEventHandlers[type] != 'undefined') { + setTimeout(function() { + windowEventHandlers[type].fire(evt); + }, 0); + } else { + window.dispatchEvent(evt); + } + }, + + /** + * Plugin callback mechanism. + */ + // Randomize the starting callbackId to avoid collisions after refreshing or navigating. + // This way, it's very unlikely that any new callback would get the same callbackId as an old callback. + callbackId: Math.floor(Math.random() * 2000000000), + callbacks: {}, + callbackStatus: { + NO_RESULT: 0, + OK: 1, + CLASS_NOT_FOUND_EXCEPTION: 2, + ILLEGAL_ACCESS_EXCEPTION: 3, + INSTANTIATION_EXCEPTION: 4, + MALFORMED_URL_EXCEPTION: 5, + IO_EXCEPTION: 6, + INVALID_ACTION: 7, + JSON_EXCEPTION: 8, + ERROR: 9 + }, + + /** + * Called by native code when returning successful result from an action. + */ + callbackSuccess: function(callbackId, args) { + try { + cordova.callbackFromNative(callbackId, true, args.status, [args.message], args.keepCallback); + } catch (e) { + console.log("Error in error callback: " + callbackId + " = "+e); + } + }, + + /** + * Called by native code when returning error result from an action. + */ + callbackError: function(callbackId, args) { + // TODO: Deprecate callbackSuccess and callbackError in favour of callbackFromNative. + // Derive success from status. + try { + cordova.callbackFromNative(callbackId, false, args.status, [args.message], args.keepCallback); + } catch (e) { + console.log("Error in error callback: " + callbackId + " = "+e); + } + }, + + /** + * Called by native code when returning the result from an action. + */ + callbackFromNative: function(callbackId, success, status, args, keepCallback) { + var callback = cordova.callbacks[callbackId]; + if (callback) { + if (success && status == cordova.callbackStatus.OK) { + callback.success && callback.success.apply(null, args); + } else if (!success) { + callback.fail && callback.fail.apply(null, args); + } + + // Clear callback if not expecting any more results + if (!keepCallback) { + delete cordova.callbacks[callbackId]; + } + } + }, + addConstructor: function(func) { + channel.onCordovaReady.subscribe(function() { + try { + func(); + } catch(e) { + console.log("Failed to run constructor: " + e); + } + }); + } +}; + + +module.exports = cordova; + +}); + +// file: lib/android/android/nativeapiprovider.js +define("cordova/android/nativeapiprovider", function(require, exports, module) { + +/** + * Exports the ExposedJsApi.java object if available, otherwise exports the PromptBasedNativeApi. + */ + +var nativeApi = this._cordovaNative || require('cordova/android/promptbasednativeapi'); +var currentApi = nativeApi; + +module.exports = { + get: function() { return currentApi; }, + setPreferPrompt: function(value) { + currentApi = value ? require('cordova/android/promptbasednativeapi') : nativeApi; + }, + // Used only by tests. + set: function(value) { + currentApi = value; + } +}; + +}); + +// file: lib/android/android/promptbasednativeapi.js +define("cordova/android/promptbasednativeapi", function(require, exports, module) { + +/** + * Implements the API of ExposedJsApi.java, but uses prompt() to communicate. + * This is used only on the 2.3 simulator, where addJavascriptInterface() is broken. + */ + +module.exports = { + exec: function(service, action, callbackId, argsJson) { + return prompt(argsJson, 'gap:'+JSON.stringify([service, action, callbackId])); + }, + setNativeToJsBridgeMode: function(value) { + prompt(value, 'gap_bridge_mode:'); + }, + retrieveJsMessages: function(fromOnlineEvent) { + return prompt(+fromOnlineEvent, 'gap_poll:'); + } +}; + +}); + +// file: lib/common/argscheck.js +define("cordova/argscheck", function(require, exports, module) { + +var exec = require('cordova/exec'); +var utils = require('cordova/utils'); + +var moduleExports = module.exports; + +var typeMap = { + 'A': 'Array', + 'D': 'Date', + 'N': 'Number', + 'S': 'String', + 'F': 'Function', + 'O': 'Object' +}; + +function extractParamName(callee, argIndex) { + return (/.*?\((.*?)\)/).exec(callee)[1].split(', ')[argIndex]; +} + +function checkArgs(spec, functionName, args, opt_callee) { + if (!moduleExports.enableChecks) { + return; + } + var errMsg = null; + var typeName; + for (var i = 0; i < spec.length; ++i) { + var c = spec.charAt(i), + cUpper = c.toUpperCase(), + arg = args[i]; + // Asterix means allow anything. + if (c == '*') { + continue; + } + typeName = utils.typeName(arg); + if ((arg === null || arg === undefined) && c == cUpper) { + continue; + } + if (typeName != typeMap[cUpper]) { + errMsg = 'Expected ' + typeMap[cUpper]; + break; + } + } + if (errMsg) { + errMsg += ', but got ' + typeName + '.'; + errMsg = 'Wrong type for parameter "' + extractParamName(opt_callee || args.callee, i) + '" of ' + functionName + ': ' + errMsg; + // Don't log when running unit tests. + if (typeof jasmine == 'undefined') { + console.error(errMsg); + } + throw TypeError(errMsg); + } +} + +function getValue(value, defaultValue) { + return value === undefined ? defaultValue : value; +} + +moduleExports.checkArgs = checkArgs; +moduleExports.getValue = getValue; +moduleExports.enableChecks = true; + + +}); + +// file: lib/common/base64.js +define("cordova/base64", function(require, exports, module) { + +var base64 = exports; + +base64.fromArrayBuffer = function(arrayBuffer) { + var array = new Uint8Array(arrayBuffer); + return uint8ToBase64(array); +}; + +//------------------------------------------------------------------------------ + +/* This code is based on the performance tests at http://jsperf.com/b64tests + * This 12-bit-at-a-time algorithm was the best performing version on all + * platforms tested. + */ + +var b64_6bit = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; +var b64_12bit; + +var b64_12bitTable = function() { + b64_12bit = []; + for (var i=0; i<64; i++) { + for (var j=0; j<64; j++) { + b64_12bit[i*64+j] = b64_6bit[i] + b64_6bit[j]; + } + } + b64_12bitTable = function() { return b64_12bit; }; + return b64_12bit; +}; + +function uint8ToBase64(rawData) { + var numBytes = rawData.byteLength; + var output=""; + var segment; + var table = b64_12bitTable(); + for (var i=0;i> 12]; + output += table[segment & 0xfff]; + } + if (numBytes - i == 2) { + segment = (rawData[i] << 16) + (rawData[i+1] << 8); + output += table[segment >> 12]; + output += b64_6bit[(segment & 0xfff) >> 6]; + output += '='; + } else if (numBytes - i == 1) { + segment = (rawData[i] << 16); + output += table[segment >> 12]; + output += '=='; + } + return output; +} + +}); + +// file: lib/common/builder.js +define("cordova/builder", function(require, exports, module) { + +var utils = require('cordova/utils'); + +function each(objects, func, context) { + for (var prop in objects) { + if (objects.hasOwnProperty(prop)) { + func.apply(context, [objects[prop], prop]); + } + } +} + +function clobber(obj, key, value) { + exports.replaceHookForTesting(obj, key); + obj[key] = value; + // Getters can only be overridden by getters. + if (obj[key] !== value) { + utils.defineGetter(obj, key, function() { + return value; + }); + } +} + +function assignOrWrapInDeprecateGetter(obj, key, value, message) { + if (message) { + utils.defineGetter(obj, key, function() { + console.log(message); + delete obj[key]; + clobber(obj, key, value); + return value; + }); + } else { + clobber(obj, key, value); + } +} + +function include(parent, objects, clobber, merge) { + each(objects, function (obj, key) { + try { + var result = obj.path ? require(obj.path) : {}; + + if (clobber) { + // Clobber if it doesn't exist. + if (typeof parent[key] === 'undefined') { + assignOrWrapInDeprecateGetter(parent, key, result, obj.deprecated); + } else if (typeof obj.path !== 'undefined') { + // If merging, merge properties onto parent, otherwise, clobber. + if (merge) { + recursiveMerge(parent[key], result); + } else { + assignOrWrapInDeprecateGetter(parent, key, result, obj.deprecated); + } + } + result = parent[key]; + } else { + // Overwrite if not currently defined. + if (typeof parent[key] == 'undefined') { + assignOrWrapInDeprecateGetter(parent, key, result, obj.deprecated); + } else { + // Set result to what already exists, so we can build children into it if they exist. + result = parent[key]; + } + } + + if (obj.children) { + include(result, obj.children, clobber, merge); + } + } catch(e) { + utils.alert('Exception building cordova JS globals: ' + e + ' for key "' + key + '"'); + } + }); +} + +/** + * Merge properties from one object onto another recursively. Properties from + * the src object will overwrite existing target property. + * + * @param target Object to merge properties into. + * @param src Object to merge properties from. + */ +function recursiveMerge(target, src) { + for (var prop in src) { + if (src.hasOwnProperty(prop)) { + if (target.prototype && target.prototype.constructor === target) { + // If the target object is a constructor override off prototype. + clobber(target.prototype, prop, src[prop]); + } else { + if (typeof src[prop] === 'object' && typeof target[prop] === 'object') { + recursiveMerge(target[prop], src[prop]); + } else { + clobber(target, prop, src[prop]); + } + } + } + } +} + +exports.buildIntoButDoNotClobber = function(objects, target) { + include(target, objects, false, false); +}; +exports.buildIntoAndClobber = function(objects, target) { + include(target, objects, true, false); +}; +exports.buildIntoAndMerge = function(objects, target) { + include(target, objects, true, true); +}; +exports.recursiveMerge = recursiveMerge; +exports.assignOrWrapInDeprecateGetter = assignOrWrapInDeprecateGetter; +exports.replaceHookForTesting = function() {}; + +}); + +// file: lib/common/channel.js +define("cordova/channel", function(require, exports, module) { + +var utils = require('cordova/utils'), + nextGuid = 1; + +/** + * Custom pub-sub "channel" that can have functions subscribed to it + * This object is used to define and control firing of events for + * cordova initialization, as well as for custom events thereafter. + * + * The order of events during page load and Cordova startup is as follows: + * + * onDOMContentLoaded* Internal event that is received when the web page is loaded and parsed. + * onNativeReady* Internal event that indicates the Cordova native side is ready. + * onCordovaReady* Internal event fired when all Cordova JavaScript objects have been created. + * onDeviceReady* User event fired to indicate that Cordova is ready + * onResume User event fired to indicate a start/resume lifecycle event + * onPause User event fired to indicate a pause lifecycle event + * onDestroy* Internal event fired when app is being destroyed (User should use window.onunload event, not this one). + * + * The events marked with an * are sticky. Once they have fired, they will stay in the fired state. + * All listeners that subscribe after the event is fired will be executed right away. + * + * The only Cordova events that user code should register for are: + * deviceready Cordova native code is initialized and Cordova APIs can be called from JavaScript + * pause App has moved to background + * resume App has returned to foreground + * + * Listeners can be registered as: + * document.addEventListener("deviceready", myDeviceReadyListener, false); + * document.addEventListener("resume", myResumeListener, false); + * document.addEventListener("pause", myPauseListener, false); + * + * The DOM lifecycle events should be used for saving and restoring state + * window.onload + * window.onunload + * + */ + +/** + * Channel + * @constructor + * @param type String the channel name + */ +var Channel = function(type, sticky) { + this.type = type; + // Map of guid -> function. + this.handlers = {}; + // 0 = Non-sticky, 1 = Sticky non-fired, 2 = Sticky fired. + this.state = sticky ? 1 : 0; + // Used in sticky mode to remember args passed to fire(). + this.fireArgs = null; + // Used by onHasSubscribersChange to know if there are any listeners. + this.numHandlers = 0; + // Function that is called when the first listener is subscribed, or when + // the last listener is unsubscribed. + this.onHasSubscribersChange = null; +}, + channel = { + /** + * Calls the provided function only after all of the channels specified + * have been fired. All channels must be sticky channels. + */ + join: function(h, c) { + var len = c.length, + i = len, + f = function() { + if (!(--i)) h(); + }; + for (var j=0; jNative bridge. + POLLING: 0, + // For LOAD_URL to be viable, it would need to have a work-around for + // the bug where the soft-keyboard gets dismissed when a message is sent. + LOAD_URL: 1, + // For the ONLINE_EVENT to be viable, it would need to intercept all event + // listeners (both through addEventListener and window.ononline) as well + // as set the navigator property itself. + ONLINE_EVENT: 2, + // Uses reflection to access private APIs of the WebView that can send JS + // to be executed. + // Requires Android 3.2.4 or above. + PRIVATE_API: 3 + }, + jsToNativeBridgeMode, // Set lazily. + nativeToJsBridgeMode = nativeToJsModes.ONLINE_EVENT, + pollEnabled = false, + messagesFromNative = []; + +function androidExec(success, fail, service, action, args) { + // Set default bridge modes if they have not already been set. + // By default, we use the failsafe, since addJavascriptInterface breaks too often + if (jsToNativeBridgeMode === undefined) { + androidExec.setJsToNativeBridgeMode(jsToNativeModes.JS_OBJECT); + } + + // Process any ArrayBuffers in the args into a string. + for (var i = 0; i < args.length; i++) { + if (utils.typeName(args[i]) == 'ArrayBuffer') { + args[i] = base64.fromArrayBuffer(args[i]); + } + } + + var callbackId = service + cordova.callbackId++, + argsJson = JSON.stringify(args); + + if (success || fail) { + cordova.callbacks[callbackId] = {success:success, fail:fail}; + } + + if (jsToNativeBridgeMode == jsToNativeModes.LOCATION_CHANGE) { + window.location = 'http://cdv_exec/' + service + '#' + action + '#' + callbackId + '#' + argsJson; + } else { + var messages = nativeApiProvider.get().exec(service, action, callbackId, argsJson); + // If argsJson was received by Java as null, try again with the PROMPT bridge mode. + // This happens in rare circumstances, such as when certain Unicode characters are passed over the bridge on a Galaxy S2. See CB-2666. + if (jsToNativeBridgeMode == jsToNativeModes.JS_OBJECT && messages === "@Null arguments.") { + androidExec.setJsToNativeBridgeMode(jsToNativeModes.PROMPT); + androidExec(success, fail, service, action, args); + androidExec.setJsToNativeBridgeMode(jsToNativeModes.JS_OBJECT); + return; + } else { + androidExec.processMessages(messages); + } + } +} + +function pollOnceFromOnlineEvent() { + pollOnce(true); +} + +function pollOnce(opt_fromOnlineEvent) { + var msg = nativeApiProvider.get().retrieveJsMessages(!!opt_fromOnlineEvent); + androidExec.processMessages(msg); +} + +function pollingTimerFunc() { + if (pollEnabled) { + pollOnce(); + setTimeout(pollingTimerFunc, 50); + } +} + +function hookOnlineApis() { + function proxyEvent(e) { + cordova.fireWindowEvent(e.type); + } + // The network module takes care of firing online and offline events. + // It currently fires them only on document though, so we bridge them + // to window here (while first listening for exec()-releated online/offline + // events). + window.addEventListener('online', pollOnceFromOnlineEvent, false); + window.addEventListener('offline', pollOnceFromOnlineEvent, false); + cordova.addWindowEventHandler('online'); + cordova.addWindowEventHandler('offline'); + document.addEventListener('online', proxyEvent, false); + document.addEventListener('offline', proxyEvent, false); +} + +hookOnlineApis(); + +androidExec.jsToNativeModes = jsToNativeModes; +androidExec.nativeToJsModes = nativeToJsModes; + +androidExec.setJsToNativeBridgeMode = function(mode) { + if (mode == jsToNativeModes.JS_OBJECT && !window._cordovaNative) { + console.log('Falling back on PROMPT mode since _cordovaNative is missing. Expected for Android 3.2 and lower only.'); + mode = jsToNativeModes.PROMPT; + } + nativeApiProvider.setPreferPrompt(mode == jsToNativeModes.PROMPT); + jsToNativeBridgeMode = mode; +}; + +androidExec.setNativeToJsBridgeMode = function(mode) { + if (mode == nativeToJsBridgeMode) { + return; + } + if (nativeToJsBridgeMode == nativeToJsModes.POLLING) { + pollEnabled = false; + } + + nativeToJsBridgeMode = mode; + // Tell the native side to switch modes. + nativeApiProvider.get().setNativeToJsBridgeMode(mode); + + if (mode == nativeToJsModes.POLLING) { + pollEnabled = true; + setTimeout(pollingTimerFunc, 1); + } +}; + +// Processes a single message, as encoded by NativeToJsMessageQueue.java. +function processMessage(message) { + try { + var firstChar = message.charAt(0); + if (firstChar == 'J') { + eval(message.slice(1)); + } else if (firstChar == 'S' || firstChar == 'F') { + var success = firstChar == 'S'; + var keepCallback = message.charAt(1) == '1'; + var spaceIdx = message.indexOf(' ', 2); + var status = +message.slice(2, spaceIdx); + var nextSpaceIdx = message.indexOf(' ', spaceIdx + 1); + var callbackId = message.slice(spaceIdx + 1, nextSpaceIdx); + var payloadKind = message.charAt(nextSpaceIdx + 1); + var payload; + if (payloadKind == 's') { + payload = message.slice(nextSpaceIdx + 2); + } else if (payloadKind == 't') { + payload = true; + } else if (payloadKind == 'f') { + payload = false; + } else if (payloadKind == 'N') { + payload = null; + } else if (payloadKind == 'n') { + payload = +message.slice(nextSpaceIdx + 2); + } else if (payloadKind == 'A') { + var data = message.slice(nextSpaceIdx + 2); + var bytes = window.atob(data); + var arraybuffer = new Uint8Array(bytes.length); + for (var i = 0; i < bytes.length; i++) { + arraybuffer[i] = bytes.charCodeAt(i); + } + payload = arraybuffer.buffer; + } else if (payloadKind == 'S') { + payload = window.atob(message.slice(nextSpaceIdx + 2)); + } else { + payload = JSON.parse(message.slice(nextSpaceIdx + 1)); + } + cordova.callbackFromNative(callbackId, success, status, [payload], keepCallback); + } else { + console.log("processMessage failed: invalid message:" + message); + } + } catch (e) { + console.log("processMessage failed: Message: " + message); + console.log("processMessage failed: Error: " + e); + console.log("processMessage failed: Stack: " + e.stack); + } +} + +// This is called from the NativeToJsMessageQueue.java. +androidExec.processMessages = function(messages) { + if (messages) { + messagesFromNative.push(messages); + // Check for the reentrant case, and enqueue the message if that's the case. + if (messagesFromNative.length > 1) { + return; + } + while (messagesFromNative.length) { + // Don't unshift until the end so that reentrancy can be detected. + messages = messagesFromNative[0]; + // The Java side can send a * message to indicate that it + // still has messages waiting to be retrieved. + if (messages == '*') { + messagesFromNative.shift(); + window.setTimeout(pollOnce, 0); + return; + } + + var spaceIdx = messages.indexOf(' '); + var msgLen = +messages.slice(0, spaceIdx); + var message = messages.substr(spaceIdx + 1, msgLen); + messages = messages.slice(spaceIdx + msgLen + 1); + processMessage(message); + if (messages) { + messagesFromNative[0] = messages; + } else { + messagesFromNative.shift(); + } + } + } +}; + +module.exports = androidExec; + +}); + +// file: lib/common/init.js +define("cordova/init", function(require, exports, module) { + +var channel = require('cordova/channel'); +var cordova = require('cordova'); +var modulemapper = require('cordova/modulemapper'); +var platform = require('cordova/platform'); +var pluginloader = require('cordova/pluginloader'); + +var platformInitChannelsArray = [channel.onNativeReady, channel.onPluginsReady]; + +function logUnfiredChannels(arr) { + for (var i = 0; i < arr.length; ++i) { + if (arr[i].state != 2) { + console.log('Channel not fired: ' + arr[i].type); + } + } +} + +window.setTimeout(function() { + if (channel.onDeviceReady.state != 2) { + console.log('deviceready has not fired after 5 seconds.'); + logUnfiredChannels(platformInitChannelsArray); + logUnfiredChannels(channel.deviceReadyChannelsArray); + } +}, 5000); + +// Replace navigator before any modules are required(), to ensure it happens as soon as possible. +// We replace it so that properties that can't be clobbered can instead be overridden. +function replaceNavigator(origNavigator) { + var CordovaNavigator = function() {}; + CordovaNavigator.prototype = origNavigator; + var newNavigator = new CordovaNavigator(); + // This work-around really only applies to new APIs that are newer than Function.bind. + // Without it, APIs such as getGamepads() break. + if (CordovaNavigator.bind) { + for (var key in origNavigator) { + if (typeof origNavigator[key] == 'function') { + newNavigator[key] = origNavigator[key].bind(origNavigator); + } + } + } + return newNavigator; +} +if (window.navigator) { + window.navigator = replaceNavigator(window.navigator); +} + +if (!window.console) { + window.console = { + log: function(){} + }; +} +if (!window.console.warn) { + window.console.warn = function(msg) { + this.log("warn: " + msg); + }; +} + +// Register pause, resume and deviceready channels as events on document. +channel.onPause = cordova.addDocumentEventHandler('pause'); +channel.onResume = cordova.addDocumentEventHandler('resume'); +channel.onDeviceReady = cordova.addStickyDocumentEventHandler('deviceready'); + +// Listen for DOMContentLoaded and notify our channel subscribers. +if (document.readyState == 'complete' || document.readyState == 'interactive') { + channel.onDOMContentLoaded.fire(); +} else { + document.addEventListener('DOMContentLoaded', function() { + channel.onDOMContentLoaded.fire(); + }, false); +} + +// _nativeReady is global variable that the native side can set +// to signify that the native code is ready. It is a global since +// it may be called before any cordova JS is ready. +if (window._nativeReady) { + channel.onNativeReady.fire(); +} + +modulemapper.clobbers('cordova', 'cordova'); +modulemapper.clobbers('cordova/exec', 'cordova.exec'); +modulemapper.clobbers('cordova/exec', 'Cordova.exec'); + +// Call the platform-specific initialization. +platform.bootstrap && platform.bootstrap(); + +pluginloader.load(function() { + channel.onPluginsReady.fire(); +}); + +/** + * Create all cordova objects once native side is ready. + */ +channel.join(function() { + modulemapper.mapModules(window); + + platform.initialize && platform.initialize(); + + // Fire event to notify that all objects are created + channel.onCordovaReady.fire(); + + // Fire onDeviceReady event once page has fully loaded, all + // constructors have run and cordova info has been received from native + // side. + channel.join(function() { + require('cordova').fireDocumentEvent('deviceready'); + }, channel.deviceReadyChannelsArray); + +}, platformInitChannelsArray); + + +}); + +// file: lib/common/modulemapper.js +define("cordova/modulemapper", function(require, exports, module) { + +var builder = require('cordova/builder'), + moduleMap = define.moduleMap, + symbolList, + deprecationMap; + +exports.reset = function() { + symbolList = []; + deprecationMap = {}; +}; + +function addEntry(strategy, moduleName, symbolPath, opt_deprecationMessage) { + if (!(moduleName in moduleMap)) { + throw new Error('Module ' + moduleName + ' does not exist.'); + } + symbolList.push(strategy, moduleName, symbolPath); + if (opt_deprecationMessage) { + deprecationMap[symbolPath] = opt_deprecationMessage; + } +} + +// Note: Android 2.3 does have Function.bind(). +exports.clobbers = function(moduleName, symbolPath, opt_deprecationMessage) { + addEntry('c', moduleName, symbolPath, opt_deprecationMessage); +}; + +exports.merges = function(moduleName, symbolPath, opt_deprecationMessage) { + addEntry('m', moduleName, symbolPath, opt_deprecationMessage); +}; + +exports.defaults = function(moduleName, symbolPath, opt_deprecationMessage) { + addEntry('d', moduleName, symbolPath, opt_deprecationMessage); +}; + +exports.runs = function(moduleName) { + addEntry('r', moduleName, null); +}; + +function prepareNamespace(symbolPath, context) { + if (!symbolPath) { + return context; + } + var parts = symbolPath.split('.'); + var cur = context; + for (var i = 0, part; part = parts[i]; ++i) { + cur = cur[part] = cur[part] || {}; + } + return cur; +} + +exports.mapModules = function(context) { + var origSymbols = {}; + context.CDV_origSymbols = origSymbols; + for (var i = 0, len = symbolList.length; i < len; i += 3) { + var strategy = symbolList[i]; + var moduleName = symbolList[i + 1]; + var module = require(moduleName); + // + if (strategy == 'r') { + continue; + } + var symbolPath = symbolList[i + 2]; + var lastDot = symbolPath.lastIndexOf('.'); + var namespace = symbolPath.substr(0, lastDot); + var lastName = symbolPath.substr(lastDot + 1); + + var deprecationMsg = symbolPath in deprecationMap ? 'Access made to deprecated symbol: ' + symbolPath + '. ' + deprecationMsg : null; + var parentObj = prepareNamespace(namespace, context); + var target = parentObj[lastName]; + + if (strategy == 'm' && target) { + builder.recursiveMerge(target, module); + } else if ((strategy == 'd' && !target) || (strategy != 'd')) { + if (!(symbolPath in origSymbols)) { + origSymbols[symbolPath] = target; + } + builder.assignOrWrapInDeprecateGetter(parentObj, lastName, module, deprecationMsg); + } + } +}; + +exports.getOriginalSymbol = function(context, symbolPath) { + var origSymbols = context.CDV_origSymbols; + if (origSymbols && (symbolPath in origSymbols)) { + return origSymbols[symbolPath]; + } + var parts = symbolPath.split('.'); + var obj = context; + for (var i = 0; i < parts.length; ++i) { + obj = obj && obj[parts[i]]; + } + return obj; +}; + +exports.reset(); + + +}); + +// file: lib/android/platform.js +define("cordova/platform", function(require, exports, module) { + +module.exports = { + id: 'android', + bootstrap: function() { + var channel = require('cordova/channel'), + cordova = require('cordova'), + exec = require('cordova/exec'), + modulemapper = require('cordova/modulemapper'); + + // Tell the native code that a page change has occurred. + exec(null, null, 'PluginManager', 'startup', []); + // Tell the JS that the native side is ready. + channel.onNativeReady.fire(); + + // TODO: Extract this as a proper plugin. + modulemapper.clobbers('cordova/plugin/android/app', 'navigator.app'); + + // Inject a listener for the backbutton on the document. + var backButtonChannel = cordova.addDocumentEventHandler('backbutton'); + backButtonChannel.onHasSubscribersChange = function() { + // If we just attached the first handler or detached the last handler, + // let native know we need to override the back button. + exec(null, null, "App", "overrideBackbutton", [this.numHandlers == 1]); + }; + + // Add hardware MENU and SEARCH button handlers + cordova.addDocumentEventHandler('menubutton'); + cordova.addDocumentEventHandler('searchbutton'); + + // Let native code know we are all done on the JS side. + // Native code will then un-hide the WebView. + channel.onCordovaReady.subscribe(function() { + exec(null, null, "App", "show", []); + }); + } +}; + +}); + +// file: lib/android/plugin/android/app.js +define("cordova/plugin/android/app", function(require, exports, module) { + +var exec = require('cordova/exec'); + +module.exports = { + /** + * Clear the resource cache. + */ + clearCache:function() { + exec(null, null, "App", "clearCache", []); + }, + + /** + * Load the url into the webview or into new browser instance. + * + * @param url The URL to load + * @param props Properties that can be passed in to the activity: + * wait: int => wait msec before loading URL + * loadingDialog: "Title,Message" => display a native loading dialog + * loadUrlTimeoutValue: int => time in msec to wait before triggering a timeout error + * clearHistory: boolean => clear webview history (default=false) + * openExternal: boolean => open in a new browser (default=false) + * + * Example: + * navigator.app.loadUrl("http://server/myapp/index.html", {wait:2000, loadingDialog:"Wait,Loading App", loadUrlTimeoutValue: 60000}); + */ + loadUrl:function(url, props) { + exec(null, null, "App", "loadUrl", [url, props]); + }, + + /** + * Cancel loadUrl that is waiting to be loaded. + */ + cancelLoadUrl:function() { + exec(null, null, "App", "cancelLoadUrl", []); + }, + + /** + * Clear web history in this web view. + * Instead of BACK button loading the previous web page, it will exit the app. + */ + clearHistory:function() { + exec(null, null, "App", "clearHistory", []); + }, + + /** + * Go to previous page displayed. + * This is the same as pressing the backbutton on Android device. + */ + backHistory:function() { + exec(null, null, "App", "backHistory", []); + }, + + /** + * Override the default behavior of the Android back button. + * If overridden, when the back button is pressed, the "backKeyDown" JavaScript event will be fired. + * + * Note: The user should not have to call this method. Instead, when the user + * registers for the "backbutton" event, this is automatically done. + * + * @param override T=override, F=cancel override + */ + overrideBackbutton:function(override) { + exec(null, null, "App", "overrideBackbutton", [override]); + }, + + /** + * Exit and terminate the application. + */ + exitApp:function() { + return exec(null, null, "App", "exitApp", []); + } +}; + +}); + +// file: lib/common/pluginloader.js +define("cordova/pluginloader", function(require, exports, module) { + +var modulemapper = require('cordova/modulemapper'); + +// Helper function to inject a + + + + diff --git a/cordova-lib/spec-cordova-project/fixtures/platforms/android/assets/www/js/index.js b/cordova-lib/spec-cordova-project/fixtures/platforms/android/assets/www/js/index.js new file mode 100644 index 000000000..31d9064eb --- /dev/null +++ b/cordova-lib/spec-cordova-project/fixtures/platforms/android/assets/www/js/index.js @@ -0,0 +1,49 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +var app = { + // Application Constructor + initialize: function() { + this.bindEvents(); + }, + // Bind Event Listeners + // + // Bind any events that are required on startup. Common events are: + // 'load', 'deviceready', 'offline', and 'online'. + bindEvents: function() { + document.addEventListener('deviceready', this.onDeviceReady, false); + }, + // deviceready Event Handler + // + // The scope of 'this' is the event. In order to call the 'receivedEvent' + // function, we must explicity call 'app.receivedEvent(...);' + onDeviceReady: function() { + app.receivedEvent('deviceready'); + }, + // Update DOM on a Received Event + receivedEvent: function(id) { + var parentElement = document.getElementById(id); + var listeningElement = parentElement.querySelector('.listening'); + var receivedElement = parentElement.querySelector('.received'); + + listeningElement.setAttribute('style', 'display:none;'); + receivedElement.setAttribute('style', 'display:block;'); + + console.log('Received Event: ' + id); + } +}; diff --git a/cordova-lib/spec-cordova-project/fixtures/platforms/android/assets/www/spec.html b/cordova-lib/spec-cordova-project/fixtures/platforms/android/assets/www/spec.html new file mode 100644 index 000000000..71f00de05 --- /dev/null +++ b/cordova-lib/spec-cordova-project/fixtures/platforms/android/assets/www/spec.html @@ -0,0 +1,68 @@ + + + + + Jasmine Spec Runner + + + + + + + + + + + + + + + + + + + + diff --git a/cordova-lib/spec-cordova-project/fixtures/platforms/android/build.xml b/cordova-lib/spec-cordova-project/fixtures/platforms/android/build.xml new file mode 100644 index 000000000..9674edf7d --- /dev/null +++ b/cordova-lib/spec-cordova-project/fixtures/platforms/android/build.xml @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/build b/cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/build new file mode 100755 index 000000000..7028eb812 --- /dev/null +++ b/cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/build @@ -0,0 +1,35 @@ +#!/usr/bin/env node + +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ + +var build = require('./lib/build'), + reqs = require('./lib/check_reqs'), + args = process.argv; + +// Support basic help commands +if(args[2] == '--help' || args[2] == '/?' || args[2] == '-h' || + args[2] == 'help' || args[2] == '-help' || args[2] == '/help') { + build.help(); +} else if(reqs.run()) { + build.run(args[2]); + process.exit(0); +} else { + process.exit(2); +} diff --git a/cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/check_reqs b/cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/check_reqs new file mode 100755 index 000000000..4a8abee46 --- /dev/null +++ b/cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/check_reqs @@ -0,0 +1,27 @@ +#!/usr/bin/env node + +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ + +var check_reqs = require('./lib/check_reqs'); + +if(!check_reqs.run()) { + process.exit(2); +} + diff --git a/cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/clean b/cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/clean new file mode 100755 index 000000000..70c4ca80e --- /dev/null +++ b/cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/clean @@ -0,0 +1,34 @@ +#!/usr/bin/env node + +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ + +var clean = require('./lib/clean'), + reqs = require('./lib/check_reqs'), + args = process.argv; + +// Usage support for when args are given +if(args.length > 2) { + clean.help(); +} else if(reqs.run()) { + clean.run(); + process.exit(0); +} else { + process.exit(2); +} diff --git a/cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/defaults.xml b/cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/defaults.xml new file mode 100644 index 000000000..24e572540 --- /dev/null +++ b/cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/defaults.xml @@ -0,0 +1,50 @@ + + + + Hello Cordova + + + A sample Apache Cordova application that responds to the deviceready event. + + + + Apache Cordova Team + + + + + + + + + + + + + + diff --git a/cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/lib/appinfo.js b/cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/lib/appinfo.js new file mode 100755 index 000000000..1f8ebe2cf --- /dev/null +++ b/cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/lib/appinfo.js @@ -0,0 +1,41 @@ +#!/usr/bin/env node + +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ + +var path = require('path'); +var fs = require('fs'); +var cachedAppInfo = null; + +function readAppInfoFromManifest() { + var manifestPath = path.join(__dirname, '..', '..', 'AndroidManifest.xml'); + var manifestData = fs.readFileSync(manifestPath, {encoding:'utf8'}); + var packageName = /\bpackage\s*=\s*"(.+?)"/.exec(manifestData); + if (!packageName) throw new Error('Could not find package name within ' + manifestPath); + var activityTag = //.exec(manifestData); + if (!activityTag) throw new Error('Could not find within ' + manifestPath); + var activityName = /\bandroid:name\s*=\s*"(.+?)"/.exec(activityTag); + if (!activityName) throw new Error('Could not find android:name within ' + manifestPath); + + return packageName[1] + '/.' + activityName[1]; +} + +exports.getActivityName = function() { + return cachedAppInfo = cachedAppInfo || readAppInfoFromManifest(); +}; diff --git a/cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/lib/build.js b/cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/lib/build.js new file mode 100755 index 000000000..7bc33ca27 --- /dev/null +++ b/cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/lib/build.js @@ -0,0 +1,89 @@ +#!/usr/bin/env node + +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ + +var shell = require('shelljs'), + clean = require('./clean'), + path = require('path'), + fs = require('fs'), + ROOT = path.join(__dirname, '..', '..'); + +/* + * Builds the project with ant. + */ +module.exports.run = function(build_type) { + //default build type + build_type = typeof build_type !== 'undefined' ? build_type : "--debug"; + var cmd; + switch(build_type) { + case '--debug' : + clean.run(); + cmd = 'ant debug -f ' + path.join(ROOT, 'build.xml'); + break; + case '--release' : + clean.run(); + cmd = 'ant release -f ' + path.join(ROOT, 'build.xml'); + break; + case '--nobuild' : + console.log('Skipping build...'); + break; + default : + console.error('Build option \'' + build_type + '\' not recognized.'); + process.exit(2); + break; + } + if(cmd) { + var result = shell.exec(cmd, {silent:false, async:false}); + if(result.code > 0) { + console.error('ERROR: Failed to build android project.'); + console.error(result.output); + process.exit(2); + } + } +} + +/* + * Gets the path to the apk file, if not such file exists then + * the script will error out. (should we error or just return undefined?) + */ +module.exports.get_apk = function() { + if(fs.existsSync(path.join(ROOT, 'bin'))) { + var bin_files = fs.readdirSync(path.join(ROOT, 'bin')); + for (file in bin_files) { + if(path.extname(bin_files[file]) == '.apk') { + return path.join(ROOT, 'bin', bin_files[file]); + } + } + console.error('ERROR : No .apk found in \'bin\' folder'); + process.exit(2); + } else { + console.error('ERROR : unable to find project bin folder, could not locate .apk'); + process.exit(2); + } +} + +module.exports.help = function() { + console.log('Usage: ' + path.relative(process.cwd(), path.join(ROOT, 'cordova', 'build')) + ' [build_type]'); + console.log('Build Types : '); + console.log(' \'--debug\': Default build, will build project in using ant debug'); + console.log(' \'--release\': will build project using ant release'); + console.log(' \'--nobuild\': will skip build process (can be used with run command)'); + process.exit(0); +} diff --git a/cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/lib/check_reqs.js b/cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/lib/check_reqs.js new file mode 100755 index 000000000..c064499f1 --- /dev/null +++ b/cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/lib/check_reqs.js @@ -0,0 +1,78 @@ +#!/usr/bin/env node + +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ + +var shell = require('shelljs'), + path = require('path'), + fs = require('fs'), + ROOT = path.join(__dirname, '..', '..'); + +// Get valid target from framework/project.properties +module.exports.get_target = function() { + if(fs.existsSync(path.join(ROOT, 'framework', 'project.properties'))) { + var target = shell.grep(/target=android-[\d+]/, path.join(ROOT, 'framework', 'project.properties')); + return target.split('=')[1].replace('\n', '').replace('\r', '').replace(' ', ''); + } else if (fs.existsSync(path.join(ROOT, 'project.properties'))) { + // if no target found, we're probably in a project and project.properties is in ROOT. + var target = shell.grep(/target=android-[\d+]/, path.join(ROOT, 'project.properties')); + return target.split('=')[1].replace('\n', '').replace('\r', '').replace(' ', ''); + } +} + +module.exports.check_ant = function() { + var test = shell.exec('ant -version', {silent:true, async:false}); + if(test.code > 0) { + console.error('ERROR : executing command \'ant\', make sure you have ant installed and added to your path.'); + return false; + } + return true; +} + +module.exports.check_java = function() { + if(process.env.JAVA_HOME) { + var test = shell.exec('java', {silent:true, async:false}); + if(test.code > 0) { + console.error('ERROR : executing command \'java\', make sure you java environment is set up. Including your JDK and JRE.'); + return false; + } + return true; + } else { + console.error('ERROR : Make sure JAVA_HOME is set, as well as paths to your JDK and JRE for java.'); + return false; + } +} + +module.exports.check_android = function() { + var valid_target = this.get_target(); + var targets = shell.exec('android list targets', {silent:true, async:false}); + + if(targets.code > 0 && targets.output.match(/command\snot\sfound/)) { + console.error('The command \"android\" failed. Make sure you have the latest Android SDK installed, and the \"android\" command (inside the tools/ folder) is added to your path.'); + return false; + } else if(!targets.output.match(valid_target)) { + console.error('Please install Android target ' + valid_target.split('-')[1] + ' (the Android newest SDK). Make sure you have the latest Android tools installed as well. Run \"android\" from your command-line to install/update any missing SDKs or tools.'); + return false; + } + return true; +} + +module.exports.run = function() { + return this.check_ant() && this.check_java && this.check_android(); +} diff --git a/cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/lib/clean.js b/cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/lib/clean.js new file mode 100755 index 000000000..8f140153e --- /dev/null +++ b/cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/lib/clean.js @@ -0,0 +1,43 @@ +#!/usr/bin/env node + +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ + +var shell = require('shelljs'), + path = require('path'), + ROOT = path.join(__dirname, '..', '..'); + +/* + * Cleans the project using ant + */ +module.exports.run = function() { + var cmd = 'ant clean -f ' + path.join(ROOT, 'build.xml'); + var result = shell.exec(cmd, {silent:false, async:false}); + if (result.code > 0) { + console.error('ERROR: Failed to clean android project.'); + console.error(result.output); + process.exit(2); + } +} + +module.exports.help = function() { + console.log('Usage: ' + path.relative(process.cwd(), path.join(ROOT, 'cordova', 'clean'))); + console.log('Cleans the project directory.'); + process.exit(0); +} diff --git a/cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/lib/device.js b/cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/lib/device.js new file mode 100755 index 000000000..363dc2bd0 --- /dev/null +++ b/cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/lib/device.js @@ -0,0 +1,95 @@ +#!/usr/bin/env node + +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ + +var shell = require('shelljs'), + path = require('path'), + build = require('./build'), + appinfo = require('./appinfo'), + exec = require('child_process').exec, + ROOT = path.join(__dirname, '..', '..'); + +/** + * Returns a list of the device ID's found + */ +module.exports.list = function() { + var cmd = 'adb devices'; + var result = shell.exec(cmd, {silent:true, async:false}); + if (result.code > 0) { + console.error('Failed to execute android command \'' + cmd + '\'.'); + process.exit(2); + } else { + var response = result.output.split('\n'); + var device_list = []; + for (var i = 1; i < response.length; i++) { + if (response[i].match(/\w+\tdevice/) && !response[i].match(/emulator/)) { + device_list.push(response[i].replace(/\tdevice/, '').replace('\r', '')); + } + } + return device_list; + } +} + +/* + * Installs a previously built application on the device + * and launches it. + */ +module.exports.install = function(target) { + var device_list = this.list(); + if (device_list.length > 0) { + // default device + target = typeof target !== 'undefined' ? target : device_list[0]; + if (device_list.indexOf(target) > -1) { + var apk_path = build.get_apk(); + var launchName = appinfo.getActivityName(); + console.log('Installing app on device...'); + cmd = 'adb -s ' + target + ' install -r ' + apk_path; + var install = shell.exec(cmd, {silent:false, async:false}); + if (install.error || install.output.match(/Failure/)) { + console.error('ERROR : Failed to install apk to device : '); + console.error(install.output); + process.exit(2); + } + + //unlock screen + cmd = 'adb -s ' + target + ' shell input keyevent 82'; + shell.exec(cmd, {silent:true, async:false}); + + // launch the application + console.log('Launching application...'); + cmd = 'adb -s ' + target + ' shell am start -W -a android.intent.action.MAIN -n ' + launchName; + var launch = shell.exec(cmd, {silent:true, async:false}); + if(launch.code > 0) { + console.error('ERROR : Failed to launch application on emulator : ' + launch.error); + console.error(launch.output); + process.exit(2); + } else { + console.log('LAUNCH SUCCESS'); + } + } else { + console.error('ERROR : Unable to find target \'' + target + '\'.'); + console.error('Failed to deploy to device.'); + process.exit(2); + } + } else { + console.error('ERROR : Failed to deploy to device, no devices found.'); + process.exit(2); + } +} diff --git a/cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/lib/emulator.js b/cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/lib/emulator.js new file mode 100755 index 000000000..cc658a9b9 --- /dev/null +++ b/cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/lib/emulator.js @@ -0,0 +1,337 @@ +#!/usr/bin/env node + +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ + +var shell = require('shelljs'), + path = require('path'), + appinfo = require('./appinfo'), + build = require('./build'), + ROOT = path.join(__dirname, '..', '..'), + new_emulator = 'cordova_emulator'; + +/** + * Returns a list of emulator images in the form of objects + * { + name : , + path : , + target : , + abi : , + skin : + } + */ +module.exports.list_images = function() { + var cmd = 'android list avds'; + var result = shell.exec(cmd, {silent:true, async:false}); + if (result.code > 0) { + console.error('Failed to execute android command \'' + cmd + '\'.'); + process.exit(2); + } else { + var response = result.output.split('\n'); + var emulator_list = []; + for (var i = 1; i < response.length; i++) { + // To return more detailed information use img_obj + var img_obj = {}; + if (response[i].match(/Name:\s/)) { + img_obj['name'] = response[i].split('Name: ')[1].replace('\r', ''); + if (response[i + 1].match(/Path:\s/)) { + i++; + img_obj['path'] = response[i].split('Path: ')[1].replace('\r', ''); + } + if (response[i + 1].match(/\(API\slevel\s/)) { + i++; + img_obj['target'] = response[i].replace('\r', ''); + } + if (response[i + 1].match(/ABI:\s/)) { + i++; + img_obj['abi'] = response[i].split('ABI: ')[1].replace('\r', ''); + } + if (response[i + 1].match(/Skin:\s/)) { + i++; + img_obj['skin'] = response[i].split('Skin: ')[1].replace('\r', ''); + } + + emulator_list.push(img_obj); + } + /* To just return a list of names use this + if (response[i].match(/Name:\s/)) { + emulator_list.push(response[i].split('Name: ')[1].replace('\r', ''); + }*/ + + } + return emulator_list; + } +} + +/** + * Will return the closest avd to the projects target + * or undefined if no avds exist. + */ +module.exports.best_image = function() { + var project_target = this.get_target().replace('android-', ''); + var images = this.list_images(); + var closest = 9999; + var best = images[0]; + for (i in images) { + var target = images[i].target; + if(target) { + var num = target.split('(API level ')[1].replace(')', ''); + if (num == project_target) { + return images[i]; + } else if (project_target - num < closest && project_target > num) { + var closest = project_target - num; + best = images[i]; + } + } + } + return best; +} + +module.exports.list_started = function() { + var cmd = 'adb devices'; + var result = shell.exec(cmd, {silent:true, async:false}); + if (result.code > 0) { + console.error('Failed to execute android command \'' + cmd + '\'.'); + process.exit(2); + } else { + var response = result.output.split('\n'); + var started_emulator_list = []; + for (var i = 1; i < response.length; i++) { + if (response[i].match(/device/) && response[i].match(/emulator/)) { + started_emulator_list.push(response[i].replace(/\tdevice/, '').replace('\r', '')); + } + } + return started_emulator_list; + } +} + +module.exports.get_target = function() { + var target = shell.grep(/target=android-[\d+]/, path.join(ROOT, 'project.properties')); + return target.split('=')[1].replace('\n', '').replace('\r', '').replace(' ', ''); +} + +module.exports.list_targets = function() { + var target_out = shell.exec('android list targets', {silent:true, async:false}).output.split('\n'); + var targets = []; + for (var i = target_out.length; i >= 0; i--) { + if(target_out[i].match(/id:/)) { + targets.push(targets[i].split(' ')[1]); + } + } + return targets; +} + +/* + * Starts an emulator with the given ID, + * and returns the started ID of that emulator. + * If no ID is given it will used the first image availible, + * if no image is availible it will error out (maybe create one?). + */ +module.exports.start = function(emulator_ID) { + var started_emulators = this.list_started(); + var num_started = started_emulators.length; + if (typeof emulator_ID === 'undefined') { + var emulator_list = this.list_images(); + if (emulator_list.length > 0) { + emulator_ID = this.best_image().name; + console.log('WARNING : no emulator specified, defaulting to ' + emulator_ID); + } else { + console.error('ERROR : No emulator images (avds) found, if you would like to create an'); + console.error(' avd follow the instructions provided here : '); + console.error(' http://developer.android.com/tools/devices/index.html') + console.error(' Or run \'android create avd --name --target \' '); + console.error(' in on the command line.'); + process.exit(2); + /*console.log('WARNING : no emulators availible, creating \'' + new_emulator + '\'.'); + this.create_image(new_emulator, this.get_target()); + emulator_ID = new_emulator;*/ + } + } + + var pipe_null = (process.platform == 'win32' || process.platform == 'win64'? '> NUL' : '> /dev/null'); + var cmd = 'emulator -avd ' + emulator_ID + ' ' + pipe_null + ' &'; + if(process.platform == 'win32' || process.platform == 'win64') { + cmd = '%comspec% /c start cmd /c ' + cmd; + } + var result = shell.exec(cmd, {silent:true, async:false}, function(code, output) { + if (code > 0) { + console.error('Failed to execute android command \'' + cmd + '\'.'); + console.error(output); + process.exit(2); + } + }); + + // wait for emulator to start + console.log('Waiting for emulator...'); + var new_started = this.wait_for_emulator(num_started); + var emulator_id; + if (new_started.length > 1) { + for (i in new_started) { + console.log(new_started[i]); + console.log(started_emulators.indexOf(new_started[i])); + if (started_emulators.indexOf(new_started[i]) < 0) { + emulator_id = new_started[i]; + } + } + } else { + emulator_id = new_started[0]; + } + if (!emulator_id) { + console.error('ERROR : Failed to start emulator, could not find new emulator'); + process.exit(2); + } + + //wait for emulator to boot up + process.stdout.write('Booting up emulator (this may take a while)...'); + this.wait_for_boot(emulator_id); + console.log('BOOT COMPLETE'); + + //unlock screen + cmd = 'adb -s ' + emulator_id + ' shell input keyevent 82'; + shell.exec(cmd, {silent:false, async:false}); + + //return the new emulator id for the started emulators + return emulator_id; +} + +/* + * Waits for the new emulator to apear on the started-emulator list. + */ +module.exports.wait_for_emulator = function(num_running) { + var new_started = this.list_started(); + if (new_started.length > num_running) { + return new_started; + } else { + this.sleep(1); + return this.wait_for_emulator(num_running); + } +} + +/* + * Waits for the boot animation property of the emulator to switch to 'stopped' + */ +module.exports.wait_for_boot = function(emulator_id) { + var cmd; + // ShellJS opens a lot of file handles, and the default on OS X is too small. + // TODO : This is not working, need to find a better way to increese the ulimit. + if(process.platform == 'win32' || process.platform == 'win64') { + cmd = 'adb -s ' + emulator_id + ' shell getprop init.svc.bootanim'; + } else { + cmd = 'ulimit -S -n 4096; adb -s ' + emulator_id + ' shell getprop init.svc.bootanim'; + } + var boot_anim = shell.exec(cmd, {silent:true, async:false}); + if (boot_anim.output.match(/stopped/)) { + return; + } else { + process.stdout.write('.'); + this.sleep(3); + return this.wait_for_boot(emulator_id); + } +} + +/* + * TODO : find a better way to wait for the emulator (maybe using async methods?) + */ +module.exports.sleep = function(time_sec) { + if (process.platform == 'win32' || process.platform == 'win64') { + shell.exec('ping 127.0.0.1 -n ' + time_sec, {silent:true, async:false}); + } else { + shell.exec('sleep ' + time_sec, {silent:true, async:false}); + } +} + +/* + * Create avd + * TODO : Enter the stdin input required to complete the creation of an avd. + */ +module.exports.create_image = function(name, target) { + console.log('Creating avd named ' + name); + if (target) { + var cmd = 'android create avd --name ' + name + ' --target ' + target; + var create = shell.exec(cmd, {sient:false, async:false}); + if (create.error) { + console.error('ERROR : Failed to create emulator image : '); + console.error(' Do you have the latest android targets including ' + target + '?'); + console.error(create.output); + process.exit(2); + } + } else { + console.log('WARNING : Project target not found, creating avd with a different target but the project may fail to install.'); + var cmd = 'android create avd --name ' + name + ' --target ' + this.list_targets()[0]; + var create = shell.exec(cmd, {sient:false, async:false}); + if (create.error) { + console.error('ERROR : Failed to create emulator image : '); + console.error(create.output); + process.exit(2); + } + console.error('ERROR : Unable to create an avd emulator, no targets found.'); + console.error('Please insure you have targets availible by runing the "android" command'). + process.exit(2); + } +} + +/* + * Installs a previously built application on the emulator and launches it. + * If no target is specified, then it picks one. + * If no started emulators are found, error out. + */ +module.exports.install = function(target) { + var emulator_list = this.list_started(); + if (emulator_list.length < 1) { + console.error('ERROR : No started emulators found, please start an emultor before deploying your project.'); + process.exit(2); + /*console.log('WARNING : No started emulators found, attemting to start an avd...'); + this.start(this.best_image().name);*/ + } + // default emulator + target = typeof target !== 'undefined' ? target : emulator_list[0]; + if (emulator_list.indexOf(target) > -1) { + console.log('Installing app on emulator...'); + var apk_path = build.get_apk(); + var cmd = 'adb -s ' + target + ' install -r ' + apk_path; + var install = shell.exec(cmd, {sient:false, async:false}); + if (install.error || install.output.match(/Failure/)) { + console.error('ERROR : Failed to install apk to emulator : '); + console.error(install.output); + process.exit(2); + } + + //unlock screen + cmd = 'adb -s ' + target + ' shell input keyevent 82'; + shell.exec(cmd, {silent:true, async:false}); + + // launch the application + console.log('Launching application...'); + var launchName = appinfo.getActivityName(); + cmd = 'adb -s ' + target + ' shell am start -W -a android.intent.action.MAIN -n ' + launchName; + console.log(cmd); + var launch = shell.exec(cmd, {silent:false, async:false}); + if(launch.code > 0) { + console.error('ERROR : Failed to launch application on emulator : ' + launch.error); + console.error(launch.output); + process.exit(2); + } else { + console.log('LAUNCH SUCCESS'); + } + } else { + console.error('ERROR : Unable to find target \'' + target + '\'.'); + console.error('Failed to deploy to emulator.'); + process.exit(2); + } +} diff --git a/cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/lib/install-device b/cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/lib/install-device new file mode 100755 index 000000000..679efbf97 --- /dev/null +++ b/cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/lib/install-device @@ -0,0 +1,38 @@ +#!/usr/bin/env node + +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ + +var device = require('./device'), + args = process.argv; + +if(args.length > 2) { + var install_target; + if (args[2].substring(0, 9) == '--target=') { + install_target = args[2].substring(9, args[2].length); + device.install(install_target); + process.exit(0); + } else { + console.error('ERROR : argument \'' + args[2] + '\' not recognized.'); + process.exit(2); + } +} else { + device.install(); + process.exit(0); +} diff --git a/cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/lib/install-emulator b/cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/lib/install-emulator new file mode 100755 index 000000000..c006eb264 --- /dev/null +++ b/cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/lib/install-emulator @@ -0,0 +1,38 @@ +#!/usr/bin/env node + +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ + +var emulator = require('./emulator'), + args = process.argv; + +if(args.length > 2) { + var install_target; + if (args[2].substring(0, 9) == '--target=') { + install_target = args[2].substring(9, args[2].length); + emulator.install(install_target); + process.exit(0); + } else { + console.error('ERROR : argument \'' + args[2] + '\' not recognized.'); + process.exit(2); + } +} else { + emulator.install(); + process.exit(0); +} diff --git a/cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/lib/list-devices b/cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/lib/list-devices new file mode 100755 index 000000000..3ef4efab2 --- /dev/null +++ b/cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/lib/list-devices @@ -0,0 +1,28 @@ +#!/usr/bin/env node + +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ + +var devices = require('./device'); + +// Usage support for when args are given +var device_list = devices.list(); +for(device in device_list) { + console.log(device_list[device]); +} diff --git a/cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/lib/list-emulator-images b/cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/lib/list-emulator-images new file mode 100755 index 000000000..3230537a7 --- /dev/null +++ b/cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/lib/list-emulator-images @@ -0,0 +1,29 @@ +#!/usr/bin/env node + +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ + +var emulators = require('./emulator'); + +// Usage support for when args are given +var emulator_list = emulators.list_images(); +for(emulator in emulator_list) { + console.log(emulator_list[emulator].name); + process.exit(0); +} diff --git a/cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/lib/list-started-emulators b/cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/lib/list-started-emulators new file mode 100755 index 000000000..525a64c17 --- /dev/null +++ b/cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/lib/list-started-emulators @@ -0,0 +1,29 @@ +#!/usr/bin/env node + +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ + +var emulators = require('./emulator'); + +// Usage support for when args are given +var emulator_list = emulators.list_started(); +for(emulator in emulator_list) { + console.log(emulator_list[emulator]); + process.exit(0); +} diff --git a/cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/lib/log.js b/cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/lib/log.js new file mode 100755 index 000000000..b85cf6063 --- /dev/null +++ b/cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/lib/log.js @@ -0,0 +1,43 @@ +#!/usr/bin/env node + +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ + +var shell = require('shelljs'), + path = require('path'), + ROOT = path.join(__dirname, '..', '..'); + +/* + * Starts running logcat in the shell. + */ +module.exports.run = function() { + var cmd = 'adb logcat | grep -v nativeGetEnabledTags'; + var result = shell.exec(cmd, {silent:false, async:false}); + if (result.code > 0) { + console.error('ERROR: Failed to run logcat command.'); + console.error(result.output); + process.exit(2); + } +} + +module.exports.help = function() { + console.log('Usage: ' + path.relative(process.cwd(), path.join(ROOT, 'cordova', 'log'))); + console.log('Gives the logcat output on the command line.'); + process.exit(0); +} diff --git a/cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/lib/run.js b/cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/lib/run.js new file mode 100755 index 000000000..787d12325 --- /dev/null +++ b/cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/lib/run.js @@ -0,0 +1,124 @@ +#!/usr/bin/env node + +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ + +var path = require('path'), + build = require('./build'), + emulator = require('./emulator'), + device = require('./device'), + ROOT = path.join(__dirname, '..', '..'); + +/* + * Runs the application on a device if availible. + * If not device is found, it will use a started emulator. + * If no started emulators are found it will attempt to start an avd. + * If no avds are found it will error out. + */ + module.exports.run = function(args) { + var build_type; + var install_target; + + for (var i=2; i -1) { + device.install(install_target); + } else if (started_emulators.indexOf(install_target) > -1) { + emulator.install(install_target); + } else { + // if target emulator isn't started, then start it. + var emulator_ID; + for(avd in avds) { + if(avds[avd].name == install_target) { + emulator_ID = emulator.start(install_target); + emulator.install(emulator_ID); + break; + } + } + if(!emulator_ID) { + console.error('ERROR : Target \'' + install_target + '\' not found, unalbe to run project'); + process.exit(2); + } + } + } else { + // no target given, deploy to device if availible, otherwise use the emulator. + var device_list = device.list(); + if (device_list.length > 0) { + console.log('WARNING : No target specified, deploying to device \'' + device_list[0] + '\'.'); + device.install(device_list[0]) + } else { + var emulator_list = emulator.list_started(); + if (emulator_list.length > 0) { + console.log('WARNING : No target specified, deploying to emulator \'' + emulator_list[0] + '\'.'); + emulator.install(emulator_list[0]); + } else { + console.log('WARNING : No started emulators found, starting an emulator.'); + var best_avd = emulator.best_image(); + if(best_avd) { + var emulator_ID = emulator.start(best_avd.name); + console.log('WARNING : No target specified, deploying to emulator \'' + emulator_ID + '\'.'); + emulator.install(emulator_ID); + } else { + emulator.start(); + } + } + } + } +} + +module.exports.help = function() { + console.log('Usage: ' + path.relative(process.cwd(), path.join(ROOT, 'cordova', 'run')) + ' [options]'); + console.log('Build options :'); + console.log(' --debug : Builds project in debug mode'); + console.log(' --release : Builds project in release mode'); + console.log(' --nobuild : Runs the currently built project without recompiling'); + console.log('Deploy options :'); + console.log(' --device : Will deploy the built project to a device'); + console.log(' --emulator : Will deploy the built project to an emulator if one exists'); + console.log(' --target= : Installs to the target with the specified id.'); + process.exit(0); +} diff --git a/cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/lib/start-emulator b/cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/lib/start-emulator new file mode 100755 index 000000000..5d6c4dd9e --- /dev/null +++ b/cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/lib/start-emulator @@ -0,0 +1,38 @@ +#!/usr/bin/env node + +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ + +var emulator = require('./emulator'), + args = process.argv; + +if(args.length > 2) { + var install_target; + if (args[2].substring(0, 9) == '--target=') { + install_target = args[2].substring(9, args[2].length); + emulator.start(install_target); + process.exit(0); + } else { + console.error('ERROR : argument \'' + args[2] + '\' not recognized.'); + process.exit(2); + } +} else { + emulator.start(); + process.exit(0); +} diff --git a/cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/log b/cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/log new file mode 100755 index 000000000..087325f8d --- /dev/null +++ b/cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/log @@ -0,0 +1,33 @@ +#!/usr/bin/env node + +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ + +var log = require('./lib/log'), + reqs = require('./lib/check_reqs'), + args = process.argv; + +// Usage support for when args are given +if(args.length > 2) { + log.help(); +} else if(reqs.run()) { + log.run(); +} else { + process.exit(2); +} diff --git a/cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/run b/cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/run new file mode 100755 index 000000000..57d73459b --- /dev/null +++ b/cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/run @@ -0,0 +1,35 @@ +#!/usr/bin/env node + +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ + +var run = require('./lib/run'), + reqs = require('./lib/check_reqs'), + args = process.argv; + +// Support basic help commands +if (args[2] == '--help' || args[2] == '/?' || args[2] == '-h' || + args[2] == 'help' || args[2] == '-help' || args[2] == '/help') { + run.help(); +} else if(reqs.run()) { + run.run(args); + process.exit(0); +} else { + process.exit(2); +} diff --git a/cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/version b/cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/version new file mode 100755 index 000000000..de1a76dd4 --- /dev/null +++ b/cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/version @@ -0,0 +1,25 @@ +#!/usr/bin/env node + +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ + +// Coho updates this line: +var VERSION = "3.1.0"; + +console.log(VERSION); diff --git a/cordova-lib/spec-cordova-project/fixtures/platforms/android/local.properties b/cordova-lib/spec-cordova-project/fixtures/platforms/android/local.properties new file mode 100644 index 000000000..d3f507212 --- /dev/null +++ b/cordova-lib/spec-cordova-project/fixtures/platforms/android/local.properties @@ -0,0 +1,10 @@ +# This file is automatically generated by Android Tools. +# Do not modify this file -- YOUR CHANGES WILL BE ERASED! +# +# This file must *NOT* be checked into Version Control Systems, +# as it contains information specific to your local configuration. + +# location of the SDK. This is only used by Ant +# For customization when using a Version Control System, please read the +# header note. +sdk.dir=/Users/braden/cordova/android/android-sdk-macosx diff --git a/cordova-lib/spec-cordova-project/fixtures/platforms/android/proguard-project.txt b/cordova-lib/spec-cordova-project/fixtures/platforms/android/proguard-project.txt new file mode 100644 index 000000000..f2fe1559a --- /dev/null +++ b/cordova-lib/spec-cordova-project/fixtures/platforms/android/proguard-project.txt @@ -0,0 +1,20 @@ +# To enable ProGuard in your project, edit project.properties +# to define the proguard.config property as described in that file. +# +# Add project specific ProGuard rules here. +# By default, the flags in this file are appended to flags specified +# in ${sdk.dir}/tools/proguard/proguard-android.txt +# You can edit the include path and order by changing the ProGuard +# include property in project.properties. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# Add any project specific keep options here: + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} diff --git a/cordova-lib/spec-cordova-project/fixtures/platforms/android/project.properties b/cordova-lib/spec-cordova-project/fixtures/platforms/android/project.properties new file mode 100644 index 000000000..a3ee5ab64 --- /dev/null +++ b/cordova-lib/spec-cordova-project/fixtures/platforms/android/project.properties @@ -0,0 +1,14 @@ +# This file is automatically generated by Android Tools. +# Do not modify this file -- YOUR CHANGES WILL BE ERASED! +# +# This file must be checked in Version Control Systems. +# +# To customize properties used by the Ant build system edit +# "ant.properties", and override values to adapt the script to your +# project structure. +# +# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home): +#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt + +# Project target. +target=android-17 diff --git a/cordova-lib/spec-cordova-project/fixtures/platforms/android/res/drawable-hdpi/icon.png b/cordova-lib/spec-cordova-project/fixtures/platforms/android/res/drawable-hdpi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..4d27634485b3a20d8a0188107e84812f4f71084b GIT binary patch literal 6080 zcmbVQWmHscyB@kl0Vx%Rc%`R+p}SK`8U%)6K$wtW7+OLJkr3%dKvIw{X%wVWLIDvJ zMLHzKgKvE2{CL;*iZj*;3DiM5qL3y?M`z!AZ;|o<0GX?snWdMdfxavPiv~IV z#(;d#xC=G_Ag|fS?i(83`FtAPfS9fT1ujL`n<_k(HE^g+PISU%VIEJe^%+P1H62 z)^)K`;C1!#!pVZcL?RJH6bE5FQDCTyj0_k81H)iq7YH%DFUHH!M+}4K`$vL05|8k7 z!+E)3F~Hvv9i6ZQF9qHUOaF2KjWaO#k6;Y`??7FI4D92G14BU&FdF^auRqavFB9bd zn(?n_yqPZ!2{u9Eu>?=VMLt~k{vlt)?!PPg4ZN^M_LisHMN%9+)UgNx8j11JQCHx- zH~~4kIm@c6XhLPA)MTVpVNkd<6sjVjBCakY1C>&Ns7Pr@LH?2PZ(K=;BwSKmLJba= zfI^`fP#H-Xh_s3dR8m?~N*tyF|A(uC!FxGk5XgV@x?Sk~o2&X?xw2}WNJlTMrx_OO z@lOR9xnjMrcvmbAsAeh&f&vX35pI~@JHHe3m%r*rPd9I*v!*8&4g530vTpxk0Zd&J zrlJOci%Y^_|L*x;T<8B!)W8?UfPa_A|0$P$wk~S$_w+x-f3f&a`yeqFJ>z-N9PawO zl>h+qrjELbna|w1jg80kY2R~{cM}^ZMe0eSdjIZE(x%|$o6t~J1LNGFyQVCctQ&&u zBy`AX3D)}w5sHmibSMkRDPJQaqANJQ-gQ#b+hbZYqd>#1uhji5TU3Ie@pJx14SzJT zCHUverUm^<6K_Fj;rWKFef#>_QQqEP)@2rt&%et|dc1$m&D|Msj-c*}D>w{yOZP{A z7tbe= zdiUsKiOC<_DI?;z&!&ZBkLM2EynG@}FISTbN|U9=qQ~C-xD*rfcy#a1sVS#+VR0Dh zL;aC2(dYxl8y6pR^u_JuWN-1AoXaJ-jgK6Zv!v2zm@2bpEwNmM)9rgi34%i=T<>#R zP)XqHorw4p9_*%&6@yH6@LBqFZW(Z=s;Wu_HDdRyJL0)unm)DB5r-*#IUnUTCPP9z zFmhK-2GYUX4xg%z<4Vih*@1F$a3z0~Mnk3P$F&u;QYz;Q?#my`1|Fn=PwJORzKsBL z=5O&0DW4;aoQks-h~f2mdp@AJq$XgQ*m^!9bF_oddy?3+1`HqAMJ zKr&AYOZbSEV_?{@U9&2pyZm8w80W9vUuNN!UJf2+0ibS|#D1hOYc!-@yUTOzdbFJtiN#~C zv@@ses8g4OOA$uyoDPUbhHXco4wEib*KcEGNqk|0+P#iO<$!3^S?jFK;C?(HZ-8Sc z%`HiT%qUv3M#pB`n?Rpl_y+aCUBZSmQnO~mw!xZI-CV$K3-!z)>{VwsvaZ$hK=x-h z@lL)v>?*sz(CVF-M={R;CpY?vmI3?k|D_59vs`3 z%Cl=3F)ytob&HQrO`-Cp)v|ZC{A176`AsVk-#ncsr5(YlFTolBZwe3MzlIj*G(SzyJW5lt zDGaAe67PFZ^kouhDh1&u`LYydx_?XHR}w20G%?u|(kBcUZm04c1fMXHe#OIxQS$F- zDg3zW1#*a?s-3`;>H3w($e{VL!^Z`mbwp;oo2I)uY&PruKyb81+j5Kevs%jciZ+wS z{n)sF&gB;6{2_A#`w8~-D+YGQ(LYsTTf4qY!uwWW&+K!MwmCOoT#ry-8O!$lrG=>? zzU|Gbx++`OoAjv{MDHF+)3a+@&l$%DDt`rIL>CHlUPhu9Iy#hRj-N(WwQ+LjSd>jw zIsmlz%8=Su?$!w>iP$_7cMGVu%YORerA~-0Y468vnUGmR+63~cMqtkIRDI{BoB`fK zv0zp&#j#eL8bT855D%KNWYHzVTdoo7T`IgP-@8*A zVu`vMf_SeynBUMW+y`Z?8LGnjv046bRclfyw#nAb_)e`okf&$3YyU@r%GZ6j%sGJI zRm#hz>3Wy-$7D_D=J(2_dUwCGG%QsQn{32SRmL`TirNLI*xK56=He%za-Ui%nrU%2 zw16`ahce0O>Yx0!vWSuH$R~M>{3ES}(r?#F6Xp0Gxs1+}7sj)3Y_Jl>$?`;U;WI9H z{-GNtOnnud_3Jh+i6p`AMh)vUr`b}}7hF{4sdLaX^6tQ?Knt8HzMngw_OfmDT3n|C z-iWi#L8y#+ON;b@Ay%389>D49Qt&Wf!=PsQcwx=YW9&-BvGP@P@ZCLS=;eA2(0fs< z_uuv~jUy_{{dZMXeBEBT^QhY2-^TQ(zy<4WKf9FJP*iVyha@JgHws-gwKm%mPodYR zdL0~2^X|*C8F^Enadn4Mx5P)Zz7`;yq(dKoa=0mXAUlPM9iIcAGf6V)Cs<*F3Ft@_ zw6~6 zJ-4`6+1A|E08md%*h19urzT_ggLRCrGAVmEu7e4fHi?mR?G0`9Te))56tTtoJr7~l z+hNTPS+(3qCeNQr{>c7`>;4y#ax9Am4d27#IbGnv(fX~4=%Wp-`#;3ZQd4=#rq*BE z!M->_$A){3*w>vO*%mExVz07jSjT^V0?>KCt@605^{9%TUQ(;kpqSC0-CT;R06>dk zra=iQ=|>a^Xza`Q>{BO+hdBd)5q|`If%`1g%YcD0ecpNjaKTjMJXfnKbORY?lZ1TP8bl0Bsx!f~Xg6Sfb`JQD}T@OM# zCD>(=YkjBKZgkk{=NfrI)SBT+#7L`^FX(~eM&thE2$j1CgxUf-< z#KHQTGRkhpdNT6wyHJ#qtnqj4rav%n-Wv*8)vQvNa~J_!BUD`NbXXNH*;GwYlvwGB z#GIpuJrrS?>ODj7$h7izO|1kh#mmn#0Fp%B6(*3@`rvwM?i zN{7PJ(N`+wxphB^EZ8AmhD^~LpKNm)T0APO#^0I9a=orxxNqMpvk@%9LjT3v`IVsA zQxYyNPL{RJhSoRVr<`4x8RB=xCHn+ILlu(xZTa0hEjc%8>F2JexOe6g9zeqt6415V zH?E=JEGkm4m2ODh?$($tBIZU>k?}hVJ zov8%8@lm=nGgV5-Udvf0X2|Y!HlQ|bHE-=yUvAIa|KE#%@YoW^hDnqzHIs_foTk6aJ?0QZ2DkEinzVPoN1D>O z^$`DuY3I$HO5Q5=^<98^bD_Fy%%u z2+fs6)3Z~OE<~M7Mx*U(tc$X;N*x%R^x#HC`X$=e+;I|AThF^#$1}P(ql|1OPETGx z*<(q#ZT{1<@Waqfs0r6~i+i9q!bHJ)oh|mGXQ5)CT9jk)ETU=&IXzTi-=pkt-{&fU zkn~0GsuOo}ZKLknI>`?W>XsiLkUz&WbTlf!2iJM#X?croKA`riwJrF=dC&H(93GLT ziCy4dk?VpJL{eavKJllAnxxv;ou{YJ-($TrvP5wydpt?t;GMBcU6D=M^?G@ zJD=^Z+jC5ICppA#M5SMQW{N-INRfT=J?GA(dzUnLMYdiH)L1ZGkyNF;v4%`HuRN!X zmrWBb{NnO$TfE&s764!R@z#7`wi$OoFDOs~vQZ7bx7FI<9{k}^DYx>PbxoWn)XS-?iRU-;%F@1)f^=nQ zE+zTot|kh2>y-RV|JO8xaZ0$&Fo#W1ID=R&=I-dQma@~=}VvsYU^uU{gcC&F%Ee%m+2v6E0P1j+ZpEExak>OPw-nVH7-Z;Z3^3 z8P7*c*xG)05J&P_xLgLT4Tw#TCpCH&OyXaZE1d=|`Y#5)*(~#D-n!S}>*|?FoAJ8w zK3R1$igF%5qA-^vV!=u>m%nf|M3It5eD#HBoWjY=(-ftUD~*fUuZ!DBY5hk0YKG_O*wcff$ z3Mhqh#>^IF`{~O0?iSn-VOwUi!|`|R-Q6tA4%1Ctm@`x_5l=pPp=(6WjOddL=JU2v z*y&-m7NwlO|Lf;knC#`C93gg=C_hx%1cd>3fBiXGF!qZhA8*kywHbfU|U$>G}tvEe8HRd36!1M+4 zEt!}ylb6h{=;t#>JDSKPuShdzR}pm*sBxLir=Lnpiyjx{1f4XDrUm3KC1r4Um)@2o zoJfd?+UD=AqN48{bz$28e7}~KY zPI3C&Oix*A(>}Cf>Z})oz7?hn3zt{5J_+M;NU>!(aH=XM%Z%x>qSBjjpLAyswh#t< zJtG7sWM^feKl*paX#_o{af)5UTJ$3;$XyI`g51-ja68WpDm?=6=D$f-r5s{p zobTo`pwNPe(iDKHMC%WpxfLf^-sRwAIz`7%i0!tVp=kO_4V3EW$>d{IDyQ79)7*@{ z_MK3MV66$8#Sp})Sq^6A=H?O+lL|dw3yC~eTImvE!xgF58fA^9wfBB@&CRhAxw582 zl61xT$xcF+4_i+-J~n&?Fqetw(Ve|NYv4BggNL2H#3e=?HEeqbSf+@42Jke$GCf_X zQ4(=VCA_{j@2LarrEU`?b)j&%Zo0r{~?x?6_qdn^tzZCZDSM7~q#CcB? zGct~$ez|49-Uv4md*~13-b(F zvlmb^D<8p$fx+zwBdf&GD%jUFatBc|(aqJWv9S*iXZPNJ_H6p&(2{NxY};t0=)GuMay~J6<6`@uCg{@3*adwT^WQzg(ECKdQO}=gOSvn()h3-Gu$RY9Xb8;H*v9h;` zoQ2`>ckG+4 z*Jn9B>kr@bHfVRCRfkjeWVSHzX>pfjEYr>HK9!$x&eNQB3=GU!3 z8Ydz9>1KDRE!E?&MmO8PjRwL@_OL5gSyo+S~j32bXAWI(43+?vBAmjpfN x7!UQ(CucrH2U}Yz;xlIQ9|EqN9x0Jf0&+IH2i=|^UjP25uA^b7UZLs``adt{1eE{) literal 0 HcmV?d00001 diff --git a/cordova-lib/spec-cordova-project/fixtures/platforms/android/res/drawable-ldpi/icon.png b/cordova-lib/spec-cordova-project/fixtures/platforms/android/res/drawable-ldpi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..cd5032a4f2e0b734d4bdece13564c4b55de963a6 GIT binary patch literal 3096 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 literal 0 HcmV?d00001 diff --git a/cordova-lib/spec-cordova-project/fixtures/platforms/android/res/drawable-mdpi/icon.png b/cordova-lib/spec-cordova-project/fixtures/platforms/android/res/drawable-mdpi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..e79c6062c1dcd9e98f092dbd7e51b5b76dd897d2 GIT binary patch literal 4090 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 literal 0 HcmV?d00001 diff --git a/cordova-lib/spec-cordova-project/fixtures/platforms/android/res/drawable-xhdpi/icon.png b/cordova-lib/spec-cordova-project/fixtures/platforms/android/res/drawable-xhdpi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..ec7ffbfbdafc58df28e6e89041ee21acd0f6177e GIT binary patch literal 7685 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 literal 0 HcmV?d00001 diff --git a/cordova-lib/spec-cordova-project/fixtures/platforms/android/res/drawable/icon.png b/cordova-lib/spec-cordova-project/fixtures/platforms/android/res/drawable/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..ec7ffbfbdafc58df28e6e89041ee21acd0f6177e GIT binary patch literal 7685 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 literal 0 HcmV?d00001 diff --git a/cordova-lib/spec-cordova-project/fixtures/platforms/android/res/values/strings.xml b/cordova-lib/spec-cordova-project/fixtures/platforms/android/res/values/strings.xml new file mode 100644 index 000000000..1e706b395 --- /dev/null +++ b/cordova-lib/spec-cordova-project/fixtures/platforms/android/res/values/strings.xml @@ -0,0 +1,4 @@ + + + TestBase + diff --git a/cordova-lib/spec-cordova-project/fixtures/platforms/android/res/xml/config.xml b/cordova-lib/spec-cordova-project/fixtures/platforms/android/res/xml/config.xml new file mode 100644 index 000000000..17ca23749 --- /dev/null +++ b/cordova-lib/spec-cordova-project/fixtures/platforms/android/res/xml/config.xml @@ -0,0 +1,18 @@ + + + Hello Cordova + + A sample Apache Cordova application that responds to the deviceready event. + + + + + + + + Apache Cordova Team + + + + + diff --git a/cordova-lib/spec-cordova-project/fixtures/platforms/android/src/org/testing/TestBase.java b/cordova-lib/spec-cordova-project/fixtures/platforms/android/src/org/testing/TestBase.java new file mode 100644 index 000000000..928e074c2 --- /dev/null +++ b/cordova-lib/spec-cordova-project/fixtures/platforms/android/src/org/testing/TestBase.java @@ -0,0 +1,37 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. + */ + +package org.testing; + +import android.os.Bundle; +import org.apache.cordova.*; + +public class TestBase extends CordovaActivity +{ + @Override + public void onCreate(Bundle savedInstanceState) + { + super.onCreate(savedInstanceState); + super.init(); + // Set by in config.xml + super.loadUrl(Config.getStartUrl()); + //super.loadUrl("file:///android_asset/www/index.html") + } +} + diff --git a/cordova-lib/spec-cordova-project/fixtures/plugins/ChildBrowser/plugin.xml b/cordova-lib/spec-cordova-project/fixtures/plugins/ChildBrowser/plugin.xml new file mode 100644 index 000000000..11ddd86d3 --- /dev/null +++ b/cordova-lib/spec-cordova-project/fixtures/plugins/ChildBrowser/plugin.xml @@ -0,0 +1,126 @@ + + + + + + Child Browser + + + + + + + + + + + + + + No matter what platform you are installing to, this notice is very important. + + + + + + + + + + + + + + + + + + + + + + Please make sure you read this because it is very important to complete the installation of your plugin. + + + + + + + + + + + + + + + $APP_ID + + + + + + PackageName + $PACKAGE_NAME + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cordova-lib/spec-cordova-project/fixtures/plugins/ChildBrowser/src/android/ChildBrowser.java b/cordova-lib/spec-cordova-project/fixtures/plugins/ChildBrowser/src/android/ChildBrowser.java new file mode 100644 index 000000000..5263b0c5d --- /dev/null +++ b/cordova-lib/spec-cordova-project/fixtures/plugins/ChildBrowser/src/android/ChildBrowser.java @@ -0,0 +1,19 @@ +/* + * + * Copyright 2013 Anis Kadri + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + diff --git a/cordova-lib/spec-cordova-project/fixtures/plugins/ChildBrowser/www/childbrowser.js b/cordova-lib/spec-cordova-project/fixtures/plugins/ChildBrowser/www/childbrowser.js new file mode 100644 index 000000000..5263b0c5d --- /dev/null +++ b/cordova-lib/spec-cordova-project/fixtures/plugins/ChildBrowser/www/childbrowser.js @@ -0,0 +1,19 @@ +/* + * + * Copyright 2013 Anis Kadri + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + diff --git a/cordova-lib/spec-cordova-project/fixtures/plugins/ChildBrowser/www/childbrowser/image.jpg b/cordova-lib/spec-cordova-project/fixtures/plugins/ChildBrowser/www/childbrowser/image.jpg new file mode 100644 index 000000000..257cc5642 --- /dev/null +++ b/cordova-lib/spec-cordova-project/fixtures/plugins/ChildBrowser/www/childbrowser/image.jpg @@ -0,0 +1 @@ +foo diff --git a/cordova-lib/spec-cordova-project/fixtures/plugins/ChildBrowser/www/childbrowser_file.html b/cordova-lib/spec-cordova-project/fixtures/plugins/ChildBrowser/www/childbrowser_file.html new file mode 100644 index 000000000..6de7b8c69 --- /dev/null +++ b/cordova-lib/spec-cordova-project/fixtures/plugins/ChildBrowser/www/childbrowser_file.html @@ -0,0 +1 @@ +This is a test file. diff --git a/cordova-lib/spec-cordova-project/fixtures/plugins/android/plugin.xml b/cordova-lib/spec-cordova-project/fixtures/plugins/android/plugin.xml new file mode 100644 index 000000000..d8f561906 --- /dev/null +++ b/cordova-lib/spec-cordova-project/fixtures/plugins/android/plugin.xml @@ -0,0 +1,14 @@ + + + + Android Plugin + + + + + + + diff --git a/cordova-lib/spec-cordova-project/fixtures/plugins/android/src/android/Android.java b/cordova-lib/spec-cordova-project/fixtures/plugins/android/src/android/Android.java new file mode 100644 index 000000000..e69de29bb diff --git a/cordova-lib/spec-cordova-project/fixtures/plugins/android/src/android/SomethingWithR.java b/cordova-lib/spec-cordova-project/fixtures/plugins/android/src/android/SomethingWithR.java new file mode 100644 index 000000000..c3af060d9 --- /dev/null +++ b/cordova-lib/spec-cordova-project/fixtures/plugins/android/src/android/SomethingWithR.java @@ -0,0 +1,6 @@ +import com.yourapp.R; + +import android.app.*; + +public class SomethingWithR { +} diff --git a/cordova-lib/spec-cordova-project/fixtures/plugins/android/www/android.js b/cordova-lib/spec-cordova-project/fixtures/plugins/android/www/android.js new file mode 100644 index 000000000..e69de29bb diff --git a/cordova-lib/spec-cordova-project/fixtures/plugins/fake1/plugin.xml b/cordova-lib/spec-cordova-project/fixtures/plugins/fake1/plugin.xml new file mode 100644 index 000000000..ffdc650ad --- /dev/null +++ b/cordova-lib/spec-cordova-project/fixtures/plugins/fake1/plugin.xml @@ -0,0 +1,10 @@ + + + + Fake1 + Cordova fake plugin for tests + Apache 2.0 + cordova,cli,test + diff --git a/cordova-lib/spec-cordova-project/fixtures/plugins/test/plugin.xml b/cordova-lib/spec-cordova-project/fixtures/plugins/test/plugin.xml new file mode 100644 index 000000000..774eda1de --- /dev/null +++ b/cordova-lib/spec-cordova-project/fixtures/plugins/test/plugin.xml @@ -0,0 +1,14 @@ + + + + Test Plugin + + + + + + + diff --git a/cordova-lib/spec-cordova-project/fixtures/plugins/test/www/test.js b/cordova-lib/spec-cordova-project/fixtures/plugins/test/www/test.js new file mode 100644 index 000000000..e69de29bb diff --git a/cordova-lib/spec-cordova-project/fixtures/projects/android/AndroidManifest.xml b/cordova-lib/spec-cordova-project/fixtures/projects/android/AndroidManifest.xml new file mode 100644 index 000000000..0c528031c --- /dev/null +++ b/cordova-lib/spec-cordova-project/fixtures/projects/android/AndroidManifest.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cordova-lib/spec-cordova-project/fixtures/projects/android/assets/www/.gitkeep b/cordova-lib/spec-cordova-project/fixtures/projects/android/assets/www/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/cordova-lib/spec-cordova-project/fixtures/projects/android/res/xml/config.xml b/cordova-lib/spec-cordova-project/fixtures/projects/android/res/xml/config.xml new file mode 100644 index 000000000..d37aba5cd --- /dev/null +++ b/cordova-lib/spec-cordova-project/fixtures/projects/android/res/xml/config.xml @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cordova-lib/spec-cordova-project/fixtures/projects/android/src/.gitkeep b/cordova-lib/spec-cordova-project/fixtures/projects/android/src/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/cordova-lib/spec-cordova-project/fixtures/projects/windows/bom_test.xml b/cordova-lib/spec-cordova-project/fixtures/projects/windows/bom_test.xml new file mode 100644 index 000000000..57cadf65d --- /dev/null +++ b/cordova-lib/spec-cordova-project/fixtures/projects/windows/bom_test.xml @@ -0,0 +1,24 @@ + + + + + diff --git a/cordova-lib/spec-cordova-project/fixtures/templates/no_content_config.xml b/cordova-lib/spec-cordova-project/fixtures/templates/no_content_config.xml new file mode 100644 index 000000000..7c4ef3d2c --- /dev/null +++ b/cordova-lib/spec-cordova-project/fixtures/templates/no_content_config.xml @@ -0,0 +1,19 @@ + + + Hello Cordova + + + A sample Apache Cordova application that responds to the deviceready event. + + + + Apache Cordova Team + + + + + + diff --git a/cordova-lib/spec-cordova/restore.spec.js b/cordova-lib/spec-cordova-project/restore.spec.js similarity index 100% rename from cordova-lib/spec-cordova/restore.spec.js rename to cordova-lib/spec-cordova-project/restore.spec.js diff --git a/cordova-lib/spec-cordova/run.spec.js b/cordova-lib/spec-cordova-project/run.spec.js similarity index 100% rename from cordova-lib/spec-cordova/run.spec.js rename to cordova-lib/spec-cordova-project/run.spec.js diff --git a/cordova-lib/spec-cordova/save.spec.js b/cordova-lib/spec-cordova-project/save.spec.js similarity index 100% rename from cordova-lib/spec-cordova/save.spec.js rename to cordova-lib/spec-cordova-project/save.spec.js diff --git a/cordova-lib/src/cordova/cordova.js b/cordova-lib/src/cordova/cordova.js index 57fb3cf18..57867a3ee 100644 --- a/cordova-lib/src/cordova/cordova.js +++ b/cordova-lib/src/cordova/cordova.js @@ -61,17 +61,17 @@ addModuleProperty(module, 'prepare', './build/prepare', true); addModuleProperty(module, 'build', './build/build', true); addModuleProperty(module, 'help', './help'); addModuleProperty(module, 'config', './config'); -addModuleProperty(module, 'create', './create', true); -addModuleProperty(module, 'emulate', './emulate', true); +addModuleProperty(module, 'create', './project/create', true); +addModuleProperty(module, 'emulate', './project/emulate', true); addModuleProperty(module, 'plugin', './plugin', true); addModuleProperty(module, 'plugins', './plugin', true); addModuleProperty(module, 'serve', './serve'); addModuleProperty(module, 'platform', './platform', true); addModuleProperty(module, 'platforms', './platform', true); addModuleProperty(module, 'compile', './build/compile', true); -addModuleProperty(module, 'run', './run', true); +addModuleProperty(module, 'run', './project/run', true); addModuleProperty(module, 'info', './info', true); -addModuleProperty(module, 'save', './save', true); -addModuleProperty(module, 'restore', './restore', true); +addModuleProperty(module, 'save', './project/save', true); +addModuleProperty(module, 'restore', './project/restore', true); diff --git a/cordova-lib/src/cordova/create.js b/cordova-lib/src/cordova/project/create.js similarity index 95% rename from cordova-lib/src/cordova/create.js rename to cordova-lib/src/cordova/project/create.js index bd0cab164..2d81c6bab 100644 --- a/cordova-lib/src/cordova/create.js +++ b/cordova-lib/src/cordova/project/create.js @@ -24,13 +24,13 @@ var path = require('path'), fs = require('fs'), shell = require('shelljs'), - events = require('../events'), - config = require('./config'), - lazy_load = require('./lazy_load'), + events = require('../../events'), + config = require('../config'), + lazy_load = require('../lazy_load'), Q = require('q'), - CordovaError = require('../CordovaError'), - ConfigParser = require('../configparser/ConfigParser'), - cordova_util = require('./util'); + CordovaError = require('../../CordovaError'), + ConfigParser = require('../../configparser/ConfigParser'), + cordova_util = require('../util'); var DEFAULT_NAME = 'HelloCordova', DEFAULT_ID = 'io.cordova.hellocordova'; @@ -220,13 +220,13 @@ function create(dir, id, name, cfg) { if (!custom_hooks) { shell.mkdir(path.join(dir, 'hooks')); // Add hooks README.md - shell.cp(path.join(__dirname, '..', '..', 'templates', 'hooks-README.md'), path.join(dir, 'hooks', 'README.md')); + shell.cp(path.join(__dirname, '..', '..', '..', 'templates', 'hooks-README.md'), path.join(dir, 'hooks', 'README.md')); } // Add template config.xml for apps that are missing it var configPath = cordova_util.projectConfig(dir); if (!fs.existsSync(configPath)) { - var template_config_xml = path.join(__dirname, '..', '..', 'templates', 'config.xml'); + var template_config_xml = path.join(__dirname, '..', '..', '..', 'templates', 'config.xml'); shell.cp(template_config_xml, configPath); // Write out id and name to config.xml var conf = new ConfigParser(configPath); diff --git a/cordova-lib/src/cordova/emulate.js b/cordova-lib/src/cordova/project/emulate.js similarity index 89% rename from cordova-lib/src/cordova/emulate.js rename to cordova-lib/src/cordova/project/emulate.js index 2f23197ec..78983f172 100644 --- a/cordova-lib/src/cordova/emulate.js +++ b/cordova-lib/src/cordova/project/emulate.js @@ -21,10 +21,10 @@ indent:4, unused:vars, latedef:nofunc */ -var cordova_util = require('./util'), +var cordova_util = require('../util'), path = require('path'), - hooker = require('./hooker'), - superspawn = require('./superspawn'), + hooker = require('../hooker'), + superspawn = require('../superspawn'), Q = require('q'); // Returns a promise. @@ -36,7 +36,7 @@ module.exports = function emulate(options) { return hooks.fire('before_emulate', options) .then(function() { // Run a prepare first! - return require('./cordova').raw.prepare(options.platforms); + return require('../cordova').raw.prepare(options.platforms); }).then(function() { // Deploy in parallel (output gets intermixed though...) return Q.all(options.platforms.map(function(platform) { diff --git a/cordova-lib/src/cordova/restore.js b/cordova-lib/src/cordova/project/restore.js similarity index 93% rename from cordova-lib/src/cordova/restore.js rename to cordova-lib/src/cordova/project/restore.js index 2ef3f66ef..7024ec2f5 100644 --- a/cordova-lib/src/cordova/restore.js +++ b/cordova-lib/src/cordova/project/restore.js @@ -21,13 +21,13 @@ indent:4, unused:vars, latedef:nofunc */ -var cordova_util = require('./util'), - ConfigParser = require('../configparser/ConfigParser'), +var cordova_util = require('../util'), + ConfigParser = require('../../configparser/ConfigParser'), path = require('path'), Q = require('q'), fs = require('fs'), - plugin = require('./plugin'), - events = require('../events'); + plugin = require('../plugin'), + events = require('../../events'); module.exports = restore; function restore(target){ diff --git a/cordova-lib/src/cordova/run.js b/cordova-lib/src/cordova/project/run.js similarity index 89% rename from cordova-lib/src/cordova/run.js rename to cordova-lib/src/cordova/project/run.js index f1debb658..e0741574c 100644 --- a/cordova-lib/src/cordova/run.js +++ b/cordova-lib/src/cordova/project/run.js @@ -21,10 +21,10 @@ indent:4, unused:vars, latedef:nofunc */ -var cordova_util = require('./util'), +var cordova_util = require('../util'), path = require('path'), - hooker = require('./hooker'), - superspawn = require('./superspawn'), + hooker = require('../hooker'), + superspawn = require('../superspawn'), Q = require('q'); // Returns a promise. @@ -36,7 +36,7 @@ module.exports = function run(options) { return hooks.fire('before_run', options) .then(function() { // Run a prepare first, then shell out to run - return require('./cordova').raw.prepare(options.platforms); + return require('../cordova').raw.prepare(options.platforms); }).then(function() { // Deploy in parallel (output gets intermixed though...) return Q.all(options.platforms.map(function(platform) { diff --git a/cordova-lib/src/cordova/save.js b/cordova-lib/src/cordova/project/save.js similarity index 93% rename from cordova-lib/src/cordova/save.js rename to cordova-lib/src/cordova/project/save.js index af0460b7b..b99a61438 100644 --- a/cordova-lib/src/cordova/save.js +++ b/cordova-lib/src/cordova/project/save.js @@ -22,12 +22,12 @@ */ -var cordova_util = require('./util'), - ConfigParser = require('../configparser/ConfigParser'), +var cordova_util = require('../util'), + ConfigParser = require('../../configparser/ConfigParser'), path = require('path'), - xml = require('../util/xml-helpers'), + xml = require('../../util/xml-helpers'), Q = require('q'), - events = require('../events'); + events = require('../../events'); module.exports = save; function save(target, opts){ From 0ed9a95a8c2d0dce0f5f2dabd7953d8aa20f7753 Mon Sep 17 00:00:00 2001 From: Suraj Pindoria Date: Mon, 14 Jul 2014 17:12:34 -0700 Subject: [PATCH 10/16] Fixed tests for plugman --- .../spec-plugman-create/plugins/.gitkeep | 0 .../plugins/AndroidJS/plugin.xml | 34 + .../plugins/AndroidJS/www/android.js | 1 + .../plugins/ChildBrowser/plugin.xml | 124 + .../src/android/ChildBrowser.java | 19 + .../ios/ChildBrowser.bundle/arrow_left.png | Bin 0 -> 2946 bytes .../ios/ChildBrowser.bundle/arrow_left@2x.png | Bin 0 -> 2946 bytes .../ios/ChildBrowser.bundle/arrow_right.png | Bin 0 -> 2946 bytes .../ChildBrowser.bundle/arrow_right@2x.png | Bin 0 -> 2946 bytes .../ios/ChildBrowser.bundle/but_refresh.png | Bin 0 -> 3369 bytes .../ChildBrowser.bundle/but_refresh@2x.png | Bin 0 -> 3369 bytes .../src/ios/ChildBrowser.bundle/compass.png | Bin 0 -> 3035 bytes .../ios/ChildBrowser.bundle/compass@2x.png | Bin 0 -> 3035 bytes .../src/ios/ChildBrowserCommand.h | 49 + .../src/ios/ChildBrowserCommand.m | 86 + .../src/ios/ChildBrowserViewController.h | 73 + .../src/ios/ChildBrowserViewController.m | 239 + .../src/ios/ChildBrowserViewController.xib | 875 ++ .../ChildBrowser/src/ios/TargetDirTest.h | 20 + .../ChildBrowser/src/ios/TargetDirTest.m | 1 + .../src/ios/preserveDirs/PreserveDirsTest.h | 20 + .../src/ios/preserveDirs/PreserveDirsTest.m | 1 + .../plugins/ChildBrowser/www/childbrowser.js | 19 + .../ChildBrowser/www/childbrowser/image.jpg | 1 + .../ChildBrowser/www/childbrowser_file.html | 1 + .../plugins/ConfigTestPlugin/plugin.xml | 37 + .../plugins/Contacts/plugin.xml | 128 + .../Contacts/src/android/ContactAccessor.java | 198 + .../src/android/ContactAccessorSdk5.java | 2183 +++++ .../Contacts/src/android/ContactManager.java | 122 + .../src/blackberry10/ContactActivity.js | 26 + .../src/blackberry10/ContactAddress.js | 30 + .../Contacts/src/blackberry10/ContactError.js | 30 + .../Contacts/src/blackberry10/ContactField.js | 27 + .../src/blackberry10/ContactFindOptions.js | 50 + .../Contacts/src/blackberry10/ContactName.js | 39 + .../Contacts/src/blackberry10/ContactNews.js | 26 + .../src/blackberry10/ContactOrganization.js | 22 + .../Contacts/src/blackberry10/ContactPhoto.js | 23 + .../src/blackberry10/contactConsts.js | 225 + .../Contacts/src/blackberry10/contactUtils.js | 223 + .../Contacts/src/blackberry10/index.js | 374 + .../Contacts/src/blackberry10/plugin.xml | 41 + .../plugins/Contacts/src/ios/CDVContact.h | 136 + .../plugins/Contacts/src/ios/CDVContact.m | 1752 ++++ .../plugins/Contacts/src/ios/CDVContacts.h | 151 + .../plugins/Contacts/src/ios/CDVContacts.m | 593 ++ .../plugins/Contacts/src/wp/Contacts.cs | 664 ++ .../plugins/Contacts/www/Contact.js | 177 + .../plugins/Contacts/www/ContactAddress.js | 46 + .../plugins/Contacts/www/ContactError.js | 42 + .../plugins/Contacts/www/ContactField.js | 37 + .../Contacts/www/ContactFindOptions.js | 34 + .../plugins/Contacts/www/ContactName.js | 41 + .../Contacts/www/ContactOrganization.js | 44 + .../plugins/Contacts/www/contacts.js | 76 + .../plugins/Contacts/www/ios/Contact.js | 51 + .../plugins/Contacts/www/ios/contacts.js | 62 + .../plugins/DummyPlugin/android-resource.xml | 1 + .../plugins/DummyPlugin/plugin.xml | 187 + .../DummyPlugin/src/android/DummyPlugin.java | 19 + .../DummyPlugin/src/blackberry10/index.js | 19 + .../src/ios/Custom.framework/someFheader.h | 0 .../src/ios/Custom.framework/somebinlib | 0 .../DummyPlugin/src/ios/DummyPlugin.bundle | 0 .../DummyPlugin/src/ios/DummyPluginCommand.h | 0 .../DummyPlugin/src/ios/DummyPluginCommand.m | 0 .../DummyPlugin/src/ios/SourceWithFramework.m | 0 .../DummyPlugin/src/ios/TargetDirTest.h | 0 .../DummyPlugin/src/ios/TargetDirTest.m | 0 .../DummyPlugin/src/ios/libsqlite3.dylib | 0 .../plugins/DummyPlugin/src/tizen/dummer.js | 0 .../DummyPlugin/src/windows8/dummer.js | 0 .../DummyPlugin/src/wp7/DummyPlugin.cs | 19 + .../DummyPlugin/src/wp8/DummyPlugin.cs | 19 + .../plugins/DummyPlugin/www/dummyplugin.js | 19 + .../DummyPlugin/www/dummyplugin/image.jpg | 1 + .../plugins/EnginePlugin/megaBoringVersion | 23 + .../plugins/EnginePlugin/megaFunVersion | 23 + .../plugins/EnginePlugin/plugin.xml | 33 + .../plugins/EnginePluginAndroid/plugin.xml | 32 + .../plugins/EnginePluginiOS/plugin.xml | 34 + .../plugins/FaultyPlugin/plugin.xml | 147 + .../src/android/FaultyPlugin.java | 19 + .../FaultyPlugin/src/blackberry10/client.js | 0 .../FaultyPlugin/src/ios/FaultyPlugin.h | 49 + .../FaultyPlugin/src/ios/FaultyPlugin.m | 86 + .../FaultyPlugin/src/windows8/faultyPlugin.js | 0 .../FaultyPlugin/src/wp7/FaultyPlugin.cs | 19 + .../FaultyPlugin/src/wp8/FaultyPlugin.cs | 19 + .../plugins/VariablePlugin/plugin.xml | 59 + .../plugins/WebNotifications/plugin.xml | 47 + .../src/ios/AppDelegate.m.diff | 18 + .../src/ios/WebNotifications.h | 35 + .../src/ios/WebNotifications.m | 124 + .../WebNotifications/www/webnotifications.js | 123 + .../plugins/WeblessPlugin/plugin.xml | 80 + .../src/android/WeblessPlugin.java | 19 + .../ios/WeblessPlugin.bundle/arrow_left.png | Bin 0 -> 2946 bytes .../WeblessPlugin.bundle/arrow_left@2x.png | Bin 0 -> 2946 bytes .../ios/WeblessPlugin.bundle/arrow_right.png | Bin 0 -> 2946 bytes .../WeblessPlugin.bundle/arrow_right@2x.png | Bin 0 -> 2946 bytes .../ios/WeblessPlugin.bundle/but_refresh.png | Bin 0 -> 3369 bytes .../WeblessPlugin.bundle/but_refresh@2x.png | Bin 0 -> 3369 bytes .../src/ios/WeblessPlugin.bundle/compass.png | Bin 0 -> 3035 bytes .../ios/WeblessPlugin.bundle/compass@2x.png | Bin 0 -> 3035 bytes .../src/ios/WeblessPluginCommand.h | 49 + .../src/ios/WeblessPluginCommand.m | 86 + .../src/ios/WeblessPluginViewController.h | 73 + .../src/ios/WeblessPluginViewController.m | 239 + .../src/ios/WeblessPluginViewController.xib | 875 ++ .../plugins/cordova.echo/.gitignore | 1 + .../plugins/cordova.echo/plugin.xml | 24 + .../cordova.echo/src/blackberry10/index.js | 85 + .../blackberry10/native/device/echoJnext.so | Bin 0 -> 1291818 bytes .../native/public/json/autolink.h | 19 + .../blackberry10/native/public/json/config.h | 43 + .../native/public/json/features.h | 42 + .../native/public/json/forwards.h | 39 + .../blackberry10/native/public/json/json.h | 10 + .../blackberry10/native/public/json/reader.h | 196 + .../blackberry10/native/public/json/value.h | 1069 +++ .../blackberry10/native/public/json/writer.h | 174 + .../native/public/json_batchallocator.h | 125 + .../native/public/json_internalarray.inl | 448 + .../native/public/json_internalmap.inl | 607 ++ .../native/public/json_reader.cpp | 894 ++ .../blackberry10/native/public/json_value.cpp | 1726 ++++ .../native/public/json_valueiterator.inl | 292 + .../native/public/json_writer.cpp | 829 ++ .../src/blackberry10/native/public/plugin.cpp | 320 + .../src/blackberry10/native/public/plugin.h | 70 + .../blackberry10/native/public/tokenizer.cpp | 222 + .../blackberry10/native/public/tokenizer.h | 55 + .../native/simulator/echoJnext.so | Bin 0 -> 231778 bytes .../src/blackberry10/native/src/echo.cpp | 121 + .../src/blackberry10/native/src/echo.hpp | 45 + .../plugins/cordova.echo/www/client.js | 53 + .../plugins/dependencies/A/plugin.xml | 60 + .../plugins/dependencies/A/src/android/A.java | 0 .../dependencies/A/src/ios/APluginCommand.h | 0 .../dependencies/A/src/ios/APluginCommand.m | 0 .../plugins/dependencies/A/www/plugin-a.js | 0 .../plugins/dependencies/B/plugin.xml | 60 + .../plugins/dependencies/B/src/android/B.java | 0 .../dependencies/B/src/ios/BPluginCommand.h | 0 .../dependencies/B/src/ios/BPluginCommand.m | 0 .../plugins/dependencies/B/www/plugin-b.js | 0 .../plugins/dependencies/C/plugin.xml | 57 + .../plugins/dependencies/C/src/android/C.java | 0 .../dependencies/C/src/ios/CPluginCommand.h | 0 .../dependencies/C/src/ios/CPluginCommand.m | 0 .../plugins/dependencies/C/www/plugin-c.js | 0 .../plugins/dependencies/D/plugin.xml | 57 + .../plugins/dependencies/D/src/android/D.java | 0 .../dependencies/D/src/ios/DPluginCommand.h | 0 .../dependencies/D/src/ios/DPluginCommand.m | 0 .../plugins/dependencies/D/www/plugin-d.js | 0 .../plugins/dependencies/E/plugin.xml | 59 + .../plugins/dependencies/E/src/android/E.java | 0 .../dependencies/E/src/ios/EPluginCommand.h | 0 .../dependencies/E/src/ios/EPluginCommand.m | 0 .../plugins/dependencies/E/www/plugin-d.js | 0 .../plugins/dependencies/F/plugin.xml | 60 + .../plugins/dependencies/F/src/android/F.java | 0 .../dependencies/F/src/ios/FPluginCommand.h | 0 .../dependencies/F/src/ios/FPluginCommand.m | 0 .../plugins/dependencies/F/www/plugin-f.js | 0 .../plugins/dependencies/G/plugin.xml | 59 + .../plugins/dependencies/G/src/android/G.java | 0 .../dependencies/G/src/ios/EPluginCommand.m | 0 .../dependencies/G/src/ios/GPluginCommand.h | 0 .../plugins/dependencies/G/www/plugin-g.js | 0 .../plugins/dependencies/H/plugin.xml | 59 + .../plugins/dependencies/H/src/android/H.java | 0 .../dependencies/H/src/ios/HPluginCommand.h | 0 .../dependencies/H/src/ios/HPluginCommand.m | 0 .../plugins/dependencies/H/www/plugin-h.js | 0 .../plugins/dependencies/README.md | 10 + .../plugins/dependencies/meta/D/plugin.xml | 61 + .../dependencies/meta/D/src/android/D.java | 0 .../meta/D/src/ios/DPluginCommand.h | 0 .../meta/D/src/ios/DPluginCommand.m | 0 .../dependencies/meta/D/www/plugin-d.js | 0 .../dependencies/meta/subdir/E/plugin.xml | 57 + .../meta/subdir/E/src/android/E.java | 0 .../meta/subdir/E/src/ios/EPluginCommand.h | 0 .../meta/subdir/E/src/ios/EPluginCommand.m | 0 .../meta/subdir/E/www/plugin-e.js | 0 .../plugins/dependencies/subdir/E/plugin.xml | 57 + .../dependencies/subdir/E/src/android/E.java | 0 .../subdir/E/src/ios/EPluginCommand.h | 0 .../subdir/E/src/ios/EPluginCommand.m | 0 .../dependencies/subdir/E/www/plugin-e.js | 0 .../plugins/multiple-children/plugin.xml | 108 + .../shared-deps-multi-child/plugin.xml | 34 + cordova-lib/spec-plugman-install/common.js | 80 + .../spec-plugman-install/plugins/.gitkeep | 0 .../plugins/AndroidJS/plugin.xml | 34 + .../plugins/AndroidJS/www/android.js | 1 + .../plugins/ChildBrowser/plugin.xml | 124 + .../src/android/ChildBrowser.java | 19 + .../ios/ChildBrowser.bundle/arrow_left.png | Bin 0 -> 2946 bytes .../ios/ChildBrowser.bundle/arrow_left@2x.png | Bin 0 -> 2946 bytes .../ios/ChildBrowser.bundle/arrow_right.png | Bin 0 -> 2946 bytes .../ChildBrowser.bundle/arrow_right@2x.png | Bin 0 -> 2946 bytes .../ios/ChildBrowser.bundle/but_refresh.png | Bin 0 -> 3369 bytes .../ChildBrowser.bundle/but_refresh@2x.png | Bin 0 -> 3369 bytes .../src/ios/ChildBrowser.bundle/compass.png | Bin 0 -> 3035 bytes .../ios/ChildBrowser.bundle/compass@2x.png | Bin 0 -> 3035 bytes .../src/ios/ChildBrowserCommand.h | 49 + .../src/ios/ChildBrowserCommand.m | 86 + .../src/ios/ChildBrowserViewController.h | 73 + .../src/ios/ChildBrowserViewController.m | 239 + .../src/ios/ChildBrowserViewController.xib | 875 ++ .../ChildBrowser/src/ios/TargetDirTest.h | 20 + .../ChildBrowser/src/ios/TargetDirTest.m | 1 + .../src/ios/preserveDirs/PreserveDirsTest.h | 20 + .../src/ios/preserveDirs/PreserveDirsTest.m | 1 + .../plugins/ChildBrowser/www/childbrowser.js | 19 + .../ChildBrowser/www/childbrowser/image.jpg | 1 + .../ChildBrowser/www/childbrowser_file.html | 1 + .../plugins/ConfigTestPlugin/plugin.xml | 37 + .../plugins/Contacts/plugin.xml | 128 + .../Contacts/src/android/ContactAccessor.java | 198 + .../src/android/ContactAccessorSdk5.java | 2183 +++++ .../Contacts/src/android/ContactManager.java | 122 + .../src/blackberry10/ContactActivity.js | 26 + .../src/blackberry10/ContactAddress.js | 30 + .../Contacts/src/blackberry10/ContactError.js | 30 + .../Contacts/src/blackberry10/ContactField.js | 27 + .../src/blackberry10/ContactFindOptions.js | 50 + .../Contacts/src/blackberry10/ContactName.js | 39 + .../Contacts/src/blackberry10/ContactNews.js | 26 + .../src/blackberry10/ContactOrganization.js | 22 + .../Contacts/src/blackberry10/ContactPhoto.js | 23 + .../src/blackberry10/contactConsts.js | 225 + .../Contacts/src/blackberry10/contactUtils.js | 223 + .../Contacts/src/blackberry10/index.js | 374 + .../Contacts/src/blackberry10/plugin.xml | 41 + .../plugins/Contacts/src/ios/CDVContact.h | 136 + .../plugins/Contacts/src/ios/CDVContact.m | 1752 ++++ .../plugins/Contacts/src/ios/CDVContacts.h | 151 + .../plugins/Contacts/src/ios/CDVContacts.m | 593 ++ .../plugins/Contacts/src/wp/Contacts.cs | 664 ++ .../plugins/Contacts/www/Contact.js | 177 + .../plugins/Contacts/www/ContactAddress.js | 46 + .../plugins/Contacts/www/ContactError.js | 42 + .../plugins/Contacts/www/ContactField.js | 37 + .../Contacts/www/ContactFindOptions.js | 34 + .../plugins/Contacts/www/ContactName.js | 41 + .../Contacts/www/ContactOrganization.js | 44 + .../plugins/Contacts/www/contacts.js | 76 + .../plugins/Contacts/www/ios/Contact.js | 51 + .../plugins/Contacts/www/ios/contacts.js | 62 + .../plugins/DummyPlugin/android-resource.xml | 1 + .../plugins/DummyPlugin/plugin.xml | 187 + .../DummyPlugin/src/android/DummyPlugin.java | 19 + .../DummyPlugin/src/blackberry10/index.js | 19 + .../src/ios/Custom.framework/someFheader.h | 0 .../src/ios/Custom.framework/somebinlib | 0 .../DummyPlugin/src/ios/DummyPlugin.bundle | 0 .../DummyPlugin/src/ios/DummyPluginCommand.h | 0 .../DummyPlugin/src/ios/DummyPluginCommand.m | 0 .../DummyPlugin/src/ios/SourceWithFramework.m | 0 .../DummyPlugin/src/ios/TargetDirTest.h | 0 .../DummyPlugin/src/ios/TargetDirTest.m | 0 .../DummyPlugin/src/ios/libsqlite3.dylib | 0 .../plugins/DummyPlugin/src/tizen/dummer.js | 0 .../DummyPlugin/src/windows8/dummer.js | 0 .../DummyPlugin/src/wp7/DummyPlugin.cs | 19 + .../DummyPlugin/src/wp8/DummyPlugin.cs | 19 + .../plugins/DummyPlugin/www/dummyplugin.js | 19 + .../DummyPlugin/www/dummyplugin/image.jpg | 1 + .../plugins/EnginePlugin/megaBoringVersion | 23 + .../plugins/EnginePlugin/megaFunVersion | 23 + .../plugins/EnginePlugin/plugin.xml | 33 + .../plugins/EnginePluginAndroid/plugin.xml | 32 + .../plugins/EnginePluginiOS/plugin.xml | 34 + .../plugins/FaultyPlugin/plugin.xml | 147 + .../src/android/FaultyPlugin.java | 19 + .../FaultyPlugin/src/blackberry10/client.js | 0 .../FaultyPlugin/src/ios/FaultyPlugin.h | 49 + .../FaultyPlugin/src/ios/FaultyPlugin.m | 86 + .../FaultyPlugin/src/windows8/faultyPlugin.js | 0 .../FaultyPlugin/src/wp7/FaultyPlugin.cs | 19 + .../FaultyPlugin/src/wp8/FaultyPlugin.cs | 19 + .../plugins/VariablePlugin/plugin.xml | 59 + .../plugins/WebNotifications/plugin.xml | 47 + .../src/ios/AppDelegate.m.diff | 18 + .../src/ios/WebNotifications.h | 35 + .../src/ios/WebNotifications.m | 124 + .../WebNotifications/www/webnotifications.js | 123 + .../plugins/WeblessPlugin/plugin.xml | 80 + .../src/android/WeblessPlugin.java | 19 + .../ios/WeblessPlugin.bundle/arrow_left.png | Bin 0 -> 2946 bytes .../WeblessPlugin.bundle/arrow_left@2x.png | Bin 0 -> 2946 bytes .../ios/WeblessPlugin.bundle/arrow_right.png | Bin 0 -> 2946 bytes .../WeblessPlugin.bundle/arrow_right@2x.png | Bin 0 -> 2946 bytes .../ios/WeblessPlugin.bundle/but_refresh.png | Bin 0 -> 3369 bytes .../WeblessPlugin.bundle/but_refresh@2x.png | Bin 0 -> 3369 bytes .../src/ios/WeblessPlugin.bundle/compass.png | Bin 0 -> 3035 bytes .../ios/WeblessPlugin.bundle/compass@2x.png | Bin 0 -> 3035 bytes .../src/ios/WeblessPluginCommand.h | 49 + .../src/ios/WeblessPluginCommand.m | 86 + .../src/ios/WeblessPluginViewController.h | 73 + .../src/ios/WeblessPluginViewController.m | 239 + .../src/ios/WeblessPluginViewController.xib | 875 ++ .../plugins/cordova.echo/.gitignore | 1 + .../plugins/cordova.echo/plugin.xml | 24 + .../cordova.echo/src/blackberry10/index.js | 85 + .../blackberry10/native/device/echoJnext.so | Bin 0 -> 1291818 bytes .../native/public/json/autolink.h | 19 + .../blackberry10/native/public/json/config.h | 43 + .../native/public/json/features.h | 42 + .../native/public/json/forwards.h | 39 + .../blackberry10/native/public/json/json.h | 10 + .../blackberry10/native/public/json/reader.h | 196 + .../blackberry10/native/public/json/value.h | 1069 +++ .../blackberry10/native/public/json/writer.h | 174 + .../native/public/json_batchallocator.h | 125 + .../native/public/json_internalarray.inl | 448 + .../native/public/json_internalmap.inl | 607 ++ .../native/public/json_reader.cpp | 894 ++ .../blackberry10/native/public/json_value.cpp | 1726 ++++ .../native/public/json_valueiterator.inl | 292 + .../native/public/json_writer.cpp | 829 ++ .../src/blackberry10/native/public/plugin.cpp | 320 + .../src/blackberry10/native/public/plugin.h | 70 + .../blackberry10/native/public/tokenizer.cpp | 222 + .../blackberry10/native/public/tokenizer.h | 55 + .../native/simulator/echoJnext.so | Bin 0 -> 231778 bytes .../src/blackberry10/native/src/echo.cpp | 121 + .../src/blackberry10/native/src/echo.hpp | 45 + .../plugins/cordova.echo/www/client.js | 53 + .../plugins/dependencies/A/plugin.xml | 60 + .../plugins/dependencies/A/src/android/A.java | 0 .../dependencies/A/src/ios/APluginCommand.h | 0 .../dependencies/A/src/ios/APluginCommand.m | 0 .../plugins/dependencies/A/www/plugin-a.js | 0 .../plugins/dependencies/B/plugin.xml | 60 + .../plugins/dependencies/B/src/android/B.java | 0 .../dependencies/B/src/ios/BPluginCommand.h | 0 .../dependencies/B/src/ios/BPluginCommand.m | 0 .../plugins/dependencies/B/www/plugin-b.js | 0 .../plugins/dependencies/C/plugin.xml | 57 + .../plugins/dependencies/C/src/android/C.java | 0 .../dependencies/C/src/ios/CPluginCommand.h | 0 .../dependencies/C/src/ios/CPluginCommand.m | 0 .../plugins/dependencies/C/www/plugin-c.js | 0 .../plugins/dependencies/D/plugin.xml | 57 + .../plugins/dependencies/D/src/android/D.java | 0 .../dependencies/D/src/ios/DPluginCommand.h | 0 .../dependencies/D/src/ios/DPluginCommand.m | 0 .../plugins/dependencies/D/www/plugin-d.js | 0 .../plugins/dependencies/E/plugin.xml | 59 + .../plugins/dependencies/E/src/android/E.java | 0 .../dependencies/E/src/ios/EPluginCommand.h | 0 .../dependencies/E/src/ios/EPluginCommand.m | 0 .../plugins/dependencies/E/www/plugin-d.js | 0 .../plugins/dependencies/F/plugin.xml | 60 + .../plugins/dependencies/F/src/android/F.java | 0 .../dependencies/F/src/ios/FPluginCommand.h | 0 .../dependencies/F/src/ios/FPluginCommand.m | 0 .../plugins/dependencies/F/www/plugin-f.js | 0 .../plugins/dependencies/G/plugin.xml | 59 + .../plugins/dependencies/G/src/android/G.java | 0 .../dependencies/G/src/ios/EPluginCommand.m | 0 .../dependencies/G/src/ios/GPluginCommand.h | 0 .../plugins/dependencies/G/www/plugin-g.js | 0 .../plugins/dependencies/H/plugin.xml | 59 + .../plugins/dependencies/H/src/android/H.java | 0 .../dependencies/H/src/ios/HPluginCommand.h | 0 .../dependencies/H/src/ios/HPluginCommand.m | 0 .../plugins/dependencies/H/www/plugin-h.js | 0 .../plugins/dependencies/README.md | 10 + .../plugins/dependencies/meta/D/plugin.xml | 61 + .../dependencies/meta/D/src/android/D.java | 0 .../meta/D/src/ios/DPluginCommand.h | 0 .../meta/D/src/ios/DPluginCommand.m | 0 .../dependencies/meta/D/www/plugin-d.js | 0 .../dependencies/meta/subdir/E/plugin.xml | 57 + .../meta/subdir/E/src/android/E.java | 0 .../meta/subdir/E/src/ios/EPluginCommand.h | 0 .../meta/subdir/E/src/ios/EPluginCommand.m | 0 .../meta/subdir/E/www/plugin-e.js | 0 .../plugins/dependencies/subdir/E/plugin.xml | 57 + .../dependencies/subdir/E/src/android/E.java | 0 .../subdir/E/src/ios/EPluginCommand.h | 0 .../subdir/E/src/ios/EPluginCommand.m | 0 .../dependencies/subdir/E/www/plugin-e.js | 0 .../plugins/multiple-children/plugin.xml | 108 + .../shared-deps-multi-child/plugin.xml | 34 + .../spec-plugman-install/projects/.gitkeep | 0 .../android_install/AndroidManifest.xml | 20 + .../cordova/android_sdk_version | 1 + .../projects/android_install/cordova/version | 1 + .../android_install/cordova/version.bat | 2 + .../projects/android_one/AndroidManifest.xml | 71 + .../projects/android_one/assets/www/.gitkeep | 0 .../android_one/assets/www/cordova.js | 6848 ++++++++++++++ .../projects/android_one/cordova/build | 23 + .../projects/android_one/cordova/clean | 23 + .../projects/android_one/cordova/lib/cordova | 386 + .../android_one/cordova/lib/install-device | 23 + .../android_one/cordova/lib/install-emulator | 23 + .../android_one/cordova/lib/list-devices | 23 + .../cordova/lib/list-emulator-images | 23 + .../cordova/lib/list-started-emulators | 23 + .../android_one/cordova/lib/start-emulator | 23 + .../projects/android_one/cordova/log | 23 + .../projects/android_one/cordova/run | 23 + .../projects/android_one/cordova/version | 32 + .../projects/android_one/res/xml/plugins.xml | 38 + .../projects/android_one/src/.gitkeep | 0 .../projects/android_two/AndroidManifest.xml | 69 + .../projects/android_two/assets/www/.gitkeep | 0 .../projects/android_two/res/xml/config.xml | 54 + .../projects/android_two/src/.gitkeep | 0 .../android_two_no_perms/AndroidManifest.xml | 49 + .../android_two_no_perms/assets/www/.gitkeep | 0 .../android_two_no_perms/res/xml/config.xml | 54 + .../android_two_no_perms/src/.gitkeep | 0 .../android_uninstall/AndroidManifest.xml | 20 + .../android_uninstall/cordova/version | 1 + .../android_uninstall/cordova/version.bat | 2 + .../native/device/chrome/.gitkeep | 0 .../native/device/plugins/jnext/auth.txt | 3 + .../native/simulator/chrome/.gitkeep | 0 .../native/simulator/plugins/jnext/auth.txt | 3 + .../projects/blackberry10/www/config.xml | 97 + .../CordovaLib.xcodeproj/project.pbxproj | 636 ++ .../SampleApp.xcodeproj/project.orig.pbxproj | 498 + .../SampleApp.xcodeproj/project.pbxproj | 496 + .../SampleApp/SampleApp-Info.plist | 78 + .../ios-config-xml/SampleApp/config.xml | 59 + .../projects/ios-config-xml/www/.gitkeep | 0 .../CordovaLib.xcodeproj/project.pbxproj | 636 ++ .../SampleApp.xcodeproj/project.orig.pbxproj | 498 + .../SampleApp.xcodeproj/project.pbxproj | 498 + .../ios-plist/SampleApp/PhoneGap.plist | 53 + .../ios-plist/SampleApp/SampleApp-Info.plist | 80 + .../projects/ios-plist/www/.gitkeep | 0 .../multiple-children/AndroidManifest.xml | 69 + .../multiple-children/res/xml/plugins.xml | 38 + .../projects/tizen/www/config.xml | 2 + .../windows8/CordovaApp_TemporaryKey.pfx | Bin 0 -> 2504 bytes .../projects/windows8/TestApp.jsproj | 81 + .../projects/windows8/TestApp.sln | 46 + .../projects/windows8/package.appxmanifest | 27 + .../projects/windows8/www/cordova-2.6.0.js | 8075 +++++++++++++++++ .../projects/windows8/www/css/index.css | 115 + .../projects/windows8/www/img/logo.png | Bin 0 -> 11600 bytes .../projects/windows8/www/img/smalllogo.png | Bin 0 -> 2831 bytes .../windows8/www/img/splashscreen.png | Bin 0 -> 24855 bytes .../projects/windows8/www/img/storelogo.png | Bin 0 -> 4052 bytes .../projects/windows8/www/index.html | 42 + .../projects/windows8/www/js/index.js | 49 + .../projects/wp8/CordovaAppProj.csproj | 136 + .../projects/wp8/Properties/WMAppManifest.xml | 39 + .../projects/www-only/.gitkeep | 0 461 files changed, 60662 insertions(+) create mode 100644 cordova-lib/spec-plugman-create/plugins/.gitkeep create mode 100644 cordova-lib/spec-plugman-create/plugins/AndroidJS/plugin.xml create mode 100644 cordova-lib/spec-plugman-create/plugins/AndroidJS/www/android.js create mode 100644 cordova-lib/spec-plugman-create/plugins/ChildBrowser/plugin.xml create mode 100644 cordova-lib/spec-plugman-create/plugins/ChildBrowser/src/android/ChildBrowser.java create mode 100644 cordova-lib/spec-plugman-create/plugins/ChildBrowser/src/ios/ChildBrowser.bundle/arrow_left.png create mode 100644 cordova-lib/spec-plugman-create/plugins/ChildBrowser/src/ios/ChildBrowser.bundle/arrow_left@2x.png create mode 100644 cordova-lib/spec-plugman-create/plugins/ChildBrowser/src/ios/ChildBrowser.bundle/arrow_right.png create mode 100644 cordova-lib/spec-plugman-create/plugins/ChildBrowser/src/ios/ChildBrowser.bundle/arrow_right@2x.png create mode 100644 cordova-lib/spec-plugman-create/plugins/ChildBrowser/src/ios/ChildBrowser.bundle/but_refresh.png create mode 100644 cordova-lib/spec-plugman-create/plugins/ChildBrowser/src/ios/ChildBrowser.bundle/but_refresh@2x.png create mode 100644 cordova-lib/spec-plugman-create/plugins/ChildBrowser/src/ios/ChildBrowser.bundle/compass.png create mode 100644 cordova-lib/spec-plugman-create/plugins/ChildBrowser/src/ios/ChildBrowser.bundle/compass@2x.png create mode 100644 cordova-lib/spec-plugman-create/plugins/ChildBrowser/src/ios/ChildBrowserCommand.h create mode 100644 cordova-lib/spec-plugman-create/plugins/ChildBrowser/src/ios/ChildBrowserCommand.m create mode 100644 cordova-lib/spec-plugman-create/plugins/ChildBrowser/src/ios/ChildBrowserViewController.h create mode 100644 cordova-lib/spec-plugman-create/plugins/ChildBrowser/src/ios/ChildBrowserViewController.m create mode 100644 cordova-lib/spec-plugman-create/plugins/ChildBrowser/src/ios/ChildBrowserViewController.xib create mode 100644 cordova-lib/spec-plugman-create/plugins/ChildBrowser/src/ios/TargetDirTest.h create mode 100644 cordova-lib/spec-plugman-create/plugins/ChildBrowser/src/ios/TargetDirTest.m create mode 100644 cordova-lib/spec-plugman-create/plugins/ChildBrowser/src/ios/preserveDirs/PreserveDirsTest.h create mode 100644 cordova-lib/spec-plugman-create/plugins/ChildBrowser/src/ios/preserveDirs/PreserveDirsTest.m create mode 100644 cordova-lib/spec-plugman-create/plugins/ChildBrowser/www/childbrowser.js create mode 100644 cordova-lib/spec-plugman-create/plugins/ChildBrowser/www/childbrowser/image.jpg create mode 100644 cordova-lib/spec-plugman-create/plugins/ChildBrowser/www/childbrowser_file.html create mode 100644 cordova-lib/spec-plugman-create/plugins/ConfigTestPlugin/plugin.xml create mode 100644 cordova-lib/spec-plugman-create/plugins/Contacts/plugin.xml create mode 100644 cordova-lib/spec-plugman-create/plugins/Contacts/src/android/ContactAccessor.java create mode 100644 cordova-lib/spec-plugman-create/plugins/Contacts/src/android/ContactAccessorSdk5.java create mode 100755 cordova-lib/spec-plugman-create/plugins/Contacts/src/android/ContactManager.java create mode 100644 cordova-lib/spec-plugman-create/plugins/Contacts/src/blackberry10/ContactActivity.js create mode 100644 cordova-lib/spec-plugman-create/plugins/Contacts/src/blackberry10/ContactAddress.js create mode 100644 cordova-lib/spec-plugman-create/plugins/Contacts/src/blackberry10/ContactError.js create mode 100644 cordova-lib/spec-plugman-create/plugins/Contacts/src/blackberry10/ContactField.js create mode 100644 cordova-lib/spec-plugman-create/plugins/Contacts/src/blackberry10/ContactFindOptions.js create mode 100644 cordova-lib/spec-plugman-create/plugins/Contacts/src/blackberry10/ContactName.js create mode 100644 cordova-lib/spec-plugman-create/plugins/Contacts/src/blackberry10/ContactNews.js create mode 100644 cordova-lib/spec-plugman-create/plugins/Contacts/src/blackberry10/ContactOrganization.js create mode 100644 cordova-lib/spec-plugman-create/plugins/Contacts/src/blackberry10/ContactPhoto.js create mode 100644 cordova-lib/spec-plugman-create/plugins/Contacts/src/blackberry10/contactConsts.js create mode 100644 cordova-lib/spec-plugman-create/plugins/Contacts/src/blackberry10/contactUtils.js create mode 100644 cordova-lib/spec-plugman-create/plugins/Contacts/src/blackberry10/index.js create mode 100644 cordova-lib/spec-plugman-create/plugins/Contacts/src/blackberry10/plugin.xml create mode 100644 cordova-lib/spec-plugman-create/plugins/Contacts/src/ios/CDVContact.h create mode 100644 cordova-lib/spec-plugman-create/plugins/Contacts/src/ios/CDVContact.m create mode 100644 cordova-lib/spec-plugman-create/plugins/Contacts/src/ios/CDVContacts.h create mode 100644 cordova-lib/spec-plugman-create/plugins/Contacts/src/ios/CDVContacts.m create mode 100644 cordova-lib/spec-plugman-create/plugins/Contacts/src/wp/Contacts.cs create mode 100644 cordova-lib/spec-plugman-create/plugins/Contacts/www/Contact.js create mode 100644 cordova-lib/spec-plugman-create/plugins/Contacts/www/ContactAddress.js create mode 100644 cordova-lib/spec-plugman-create/plugins/Contacts/www/ContactError.js create mode 100644 cordova-lib/spec-plugman-create/plugins/Contacts/www/ContactField.js create mode 100644 cordova-lib/spec-plugman-create/plugins/Contacts/www/ContactFindOptions.js create mode 100644 cordova-lib/spec-plugman-create/plugins/Contacts/www/ContactName.js create mode 100644 cordova-lib/spec-plugman-create/plugins/Contacts/www/ContactOrganization.js create mode 100644 cordova-lib/spec-plugman-create/plugins/Contacts/www/contacts.js create mode 100644 cordova-lib/spec-plugman-create/plugins/Contacts/www/ios/Contact.js create mode 100644 cordova-lib/spec-plugman-create/plugins/Contacts/www/ios/contacts.js create mode 100644 cordova-lib/spec-plugman-create/plugins/DummyPlugin/android-resource.xml create mode 100644 cordova-lib/spec-plugman-create/plugins/DummyPlugin/plugin.xml create mode 100644 cordova-lib/spec-plugman-create/plugins/DummyPlugin/src/android/DummyPlugin.java create mode 100644 cordova-lib/spec-plugman-create/plugins/DummyPlugin/src/blackberry10/index.js create mode 100644 cordova-lib/spec-plugman-create/plugins/DummyPlugin/src/ios/Custom.framework/someFheader.h create mode 100644 cordova-lib/spec-plugman-create/plugins/DummyPlugin/src/ios/Custom.framework/somebinlib create mode 100644 cordova-lib/spec-plugman-create/plugins/DummyPlugin/src/ios/DummyPlugin.bundle create mode 100644 cordova-lib/spec-plugman-create/plugins/DummyPlugin/src/ios/DummyPluginCommand.h create mode 100644 cordova-lib/spec-plugman-create/plugins/DummyPlugin/src/ios/DummyPluginCommand.m create mode 100644 cordova-lib/spec-plugman-create/plugins/DummyPlugin/src/ios/SourceWithFramework.m create mode 100644 cordova-lib/spec-plugman-create/plugins/DummyPlugin/src/ios/TargetDirTest.h create mode 100644 cordova-lib/spec-plugman-create/plugins/DummyPlugin/src/ios/TargetDirTest.m create mode 100644 cordova-lib/spec-plugman-create/plugins/DummyPlugin/src/ios/libsqlite3.dylib create mode 100644 cordova-lib/spec-plugman-create/plugins/DummyPlugin/src/tizen/dummer.js create mode 100644 cordova-lib/spec-plugman-create/plugins/DummyPlugin/src/windows8/dummer.js create mode 100644 cordova-lib/spec-plugman-create/plugins/DummyPlugin/src/wp7/DummyPlugin.cs create mode 100644 cordova-lib/spec-plugman-create/plugins/DummyPlugin/src/wp8/DummyPlugin.cs create mode 100644 cordova-lib/spec-plugman-create/plugins/DummyPlugin/www/dummyplugin.js create mode 100644 cordova-lib/spec-plugman-create/plugins/DummyPlugin/www/dummyplugin/image.jpg create mode 100755 cordova-lib/spec-plugman-create/plugins/EnginePlugin/megaBoringVersion create mode 100755 cordova-lib/spec-plugman-create/plugins/EnginePlugin/megaFunVersion create mode 100644 cordova-lib/spec-plugman-create/plugins/EnginePlugin/plugin.xml create mode 100644 cordova-lib/spec-plugman-create/plugins/EnginePluginAndroid/plugin.xml create mode 100644 cordova-lib/spec-plugman-create/plugins/EnginePluginiOS/plugin.xml create mode 100644 cordova-lib/spec-plugman-create/plugins/FaultyPlugin/plugin.xml create mode 100644 cordova-lib/spec-plugman-create/plugins/FaultyPlugin/src/android/FaultyPlugin.java create mode 100644 cordova-lib/spec-plugman-create/plugins/FaultyPlugin/src/blackberry10/client.js create mode 100644 cordova-lib/spec-plugman-create/plugins/FaultyPlugin/src/ios/FaultyPlugin.h create mode 100644 cordova-lib/spec-plugman-create/plugins/FaultyPlugin/src/ios/FaultyPlugin.m create mode 100644 cordova-lib/spec-plugman-create/plugins/FaultyPlugin/src/windows8/faultyPlugin.js create mode 100644 cordova-lib/spec-plugman-create/plugins/FaultyPlugin/src/wp7/FaultyPlugin.cs create mode 100644 cordova-lib/spec-plugman-create/plugins/FaultyPlugin/src/wp8/FaultyPlugin.cs create mode 100644 cordova-lib/spec-plugman-create/plugins/VariablePlugin/plugin.xml create mode 100644 cordova-lib/spec-plugman-create/plugins/WebNotifications/plugin.xml create mode 100644 cordova-lib/spec-plugman-create/plugins/WebNotifications/src/ios/AppDelegate.m.diff create mode 100644 cordova-lib/spec-plugman-create/plugins/WebNotifications/src/ios/WebNotifications.h create mode 100644 cordova-lib/spec-plugman-create/plugins/WebNotifications/src/ios/WebNotifications.m create mode 100644 cordova-lib/spec-plugman-create/plugins/WebNotifications/www/webnotifications.js create mode 100644 cordova-lib/spec-plugman-create/plugins/WeblessPlugin/plugin.xml create mode 100644 cordova-lib/spec-plugman-create/plugins/WeblessPlugin/src/android/WeblessPlugin.java create mode 100644 cordova-lib/spec-plugman-create/plugins/WeblessPlugin/src/ios/WeblessPlugin.bundle/arrow_left.png create mode 100644 cordova-lib/spec-plugman-create/plugins/WeblessPlugin/src/ios/WeblessPlugin.bundle/arrow_left@2x.png create mode 100644 cordova-lib/spec-plugman-create/plugins/WeblessPlugin/src/ios/WeblessPlugin.bundle/arrow_right.png create mode 100644 cordova-lib/spec-plugman-create/plugins/WeblessPlugin/src/ios/WeblessPlugin.bundle/arrow_right@2x.png create mode 100644 cordova-lib/spec-plugman-create/plugins/WeblessPlugin/src/ios/WeblessPlugin.bundle/but_refresh.png create mode 100644 cordova-lib/spec-plugman-create/plugins/WeblessPlugin/src/ios/WeblessPlugin.bundle/but_refresh@2x.png create mode 100644 cordova-lib/spec-plugman-create/plugins/WeblessPlugin/src/ios/WeblessPlugin.bundle/compass.png create mode 100644 cordova-lib/spec-plugman-create/plugins/WeblessPlugin/src/ios/WeblessPlugin.bundle/compass@2x.png create mode 100644 cordova-lib/spec-plugman-create/plugins/WeblessPlugin/src/ios/WeblessPluginCommand.h create mode 100644 cordova-lib/spec-plugman-create/plugins/WeblessPlugin/src/ios/WeblessPluginCommand.m create mode 100644 cordova-lib/spec-plugman-create/plugins/WeblessPlugin/src/ios/WeblessPluginViewController.h create mode 100644 cordova-lib/spec-plugman-create/plugins/WeblessPlugin/src/ios/WeblessPluginViewController.m create mode 100644 cordova-lib/spec-plugman-create/plugins/WeblessPlugin/src/ios/WeblessPluginViewController.xib create mode 100644 cordova-lib/spec-plugman-create/plugins/cordova.echo/.gitignore create mode 100644 cordova-lib/spec-plugman-create/plugins/cordova.echo/plugin.xml create mode 100644 cordova-lib/spec-plugman-create/plugins/cordova.echo/src/blackberry10/index.js create mode 100755 cordova-lib/spec-plugman-create/plugins/cordova.echo/src/blackberry10/native/device/echoJnext.so create mode 100644 cordova-lib/spec-plugman-create/plugins/cordova.echo/src/blackberry10/native/public/json/autolink.h create mode 100644 cordova-lib/spec-plugman-create/plugins/cordova.echo/src/blackberry10/native/public/json/config.h create mode 100644 cordova-lib/spec-plugman-create/plugins/cordova.echo/src/blackberry10/native/public/json/features.h create mode 100644 cordova-lib/spec-plugman-create/plugins/cordova.echo/src/blackberry10/native/public/json/forwards.h create mode 100644 cordova-lib/spec-plugman-create/plugins/cordova.echo/src/blackberry10/native/public/json/json.h create mode 100644 cordova-lib/spec-plugman-create/plugins/cordova.echo/src/blackberry10/native/public/json/reader.h create mode 100644 cordova-lib/spec-plugman-create/plugins/cordova.echo/src/blackberry10/native/public/json/value.h create mode 100644 cordova-lib/spec-plugman-create/plugins/cordova.echo/src/blackberry10/native/public/json/writer.h create mode 100644 cordova-lib/spec-plugman-create/plugins/cordova.echo/src/blackberry10/native/public/json_batchallocator.h create mode 100644 cordova-lib/spec-plugman-create/plugins/cordova.echo/src/blackberry10/native/public/json_internalarray.inl create mode 100644 cordova-lib/spec-plugman-create/plugins/cordova.echo/src/blackberry10/native/public/json_internalmap.inl create mode 100644 cordova-lib/spec-plugman-create/plugins/cordova.echo/src/blackberry10/native/public/json_reader.cpp create mode 100644 cordova-lib/spec-plugman-create/plugins/cordova.echo/src/blackberry10/native/public/json_value.cpp create mode 100644 cordova-lib/spec-plugman-create/plugins/cordova.echo/src/blackberry10/native/public/json_valueiterator.inl create mode 100644 cordova-lib/spec-plugman-create/plugins/cordova.echo/src/blackberry10/native/public/json_writer.cpp create mode 100644 cordova-lib/spec-plugman-create/plugins/cordova.echo/src/blackberry10/native/public/plugin.cpp create mode 100644 cordova-lib/spec-plugman-create/plugins/cordova.echo/src/blackberry10/native/public/plugin.h create mode 100644 cordova-lib/spec-plugman-create/plugins/cordova.echo/src/blackberry10/native/public/tokenizer.cpp create mode 100644 cordova-lib/spec-plugman-create/plugins/cordova.echo/src/blackberry10/native/public/tokenizer.h create mode 100644 cordova-lib/spec-plugman-create/plugins/cordova.echo/src/blackberry10/native/simulator/echoJnext.so create mode 100644 cordova-lib/spec-plugman-create/plugins/cordova.echo/src/blackberry10/native/src/echo.cpp create mode 100644 cordova-lib/spec-plugman-create/plugins/cordova.echo/src/blackberry10/native/src/echo.hpp create mode 100644 cordova-lib/spec-plugman-create/plugins/cordova.echo/www/client.js create mode 100644 cordova-lib/spec-plugman-create/plugins/dependencies/A/plugin.xml create mode 100644 cordova-lib/spec-plugman-create/plugins/dependencies/A/src/android/A.java create mode 100644 cordova-lib/spec-plugman-create/plugins/dependencies/A/src/ios/APluginCommand.h create mode 100644 cordova-lib/spec-plugman-create/plugins/dependencies/A/src/ios/APluginCommand.m create mode 100644 cordova-lib/spec-plugman-create/plugins/dependencies/A/www/plugin-a.js create mode 100644 cordova-lib/spec-plugman-create/plugins/dependencies/B/plugin.xml create mode 100644 cordova-lib/spec-plugman-create/plugins/dependencies/B/src/android/B.java create mode 100644 cordova-lib/spec-plugman-create/plugins/dependencies/B/src/ios/BPluginCommand.h create mode 100644 cordova-lib/spec-plugman-create/plugins/dependencies/B/src/ios/BPluginCommand.m create mode 100644 cordova-lib/spec-plugman-create/plugins/dependencies/B/www/plugin-b.js create mode 100644 cordova-lib/spec-plugman-create/plugins/dependencies/C/plugin.xml create mode 100644 cordova-lib/spec-plugman-create/plugins/dependencies/C/src/android/C.java create mode 100644 cordova-lib/spec-plugman-create/plugins/dependencies/C/src/ios/CPluginCommand.h create mode 100644 cordova-lib/spec-plugman-create/plugins/dependencies/C/src/ios/CPluginCommand.m create mode 100644 cordova-lib/spec-plugman-create/plugins/dependencies/C/www/plugin-c.js create mode 100644 cordova-lib/spec-plugman-create/plugins/dependencies/D/plugin.xml create mode 100644 cordova-lib/spec-plugman-create/plugins/dependencies/D/src/android/D.java create mode 100644 cordova-lib/spec-plugman-create/plugins/dependencies/D/src/ios/DPluginCommand.h create mode 100644 cordova-lib/spec-plugman-create/plugins/dependencies/D/src/ios/DPluginCommand.m create mode 100644 cordova-lib/spec-plugman-create/plugins/dependencies/D/www/plugin-d.js create mode 100644 cordova-lib/spec-plugman-create/plugins/dependencies/E/plugin.xml create mode 100644 cordova-lib/spec-plugman-create/plugins/dependencies/E/src/android/E.java create mode 100644 cordova-lib/spec-plugman-create/plugins/dependencies/E/src/ios/EPluginCommand.h create mode 100644 cordova-lib/spec-plugman-create/plugins/dependencies/E/src/ios/EPluginCommand.m create mode 100644 cordova-lib/spec-plugman-create/plugins/dependencies/E/www/plugin-d.js create mode 100644 cordova-lib/spec-plugman-create/plugins/dependencies/F/plugin.xml create mode 100644 cordova-lib/spec-plugman-create/plugins/dependencies/F/src/android/F.java create mode 100644 cordova-lib/spec-plugman-create/plugins/dependencies/F/src/ios/FPluginCommand.h create mode 100644 cordova-lib/spec-plugman-create/plugins/dependencies/F/src/ios/FPluginCommand.m create mode 100644 cordova-lib/spec-plugman-create/plugins/dependencies/F/www/plugin-f.js create mode 100644 cordova-lib/spec-plugman-create/plugins/dependencies/G/plugin.xml create mode 100644 cordova-lib/spec-plugman-create/plugins/dependencies/G/src/android/G.java create mode 100644 cordova-lib/spec-plugman-create/plugins/dependencies/G/src/ios/EPluginCommand.m create mode 100644 cordova-lib/spec-plugman-create/plugins/dependencies/G/src/ios/GPluginCommand.h create mode 100644 cordova-lib/spec-plugman-create/plugins/dependencies/G/www/plugin-g.js create mode 100644 cordova-lib/spec-plugman-create/plugins/dependencies/H/plugin.xml create mode 100644 cordova-lib/spec-plugman-create/plugins/dependencies/H/src/android/H.java create mode 100644 cordova-lib/spec-plugman-create/plugins/dependencies/H/src/ios/HPluginCommand.h create mode 100644 cordova-lib/spec-plugman-create/plugins/dependencies/H/src/ios/HPluginCommand.m create mode 100644 cordova-lib/spec-plugman-create/plugins/dependencies/H/www/plugin-h.js create mode 100644 cordova-lib/spec-plugman-create/plugins/dependencies/README.md create mode 100644 cordova-lib/spec-plugman-create/plugins/dependencies/meta/D/plugin.xml create mode 100644 cordova-lib/spec-plugman-create/plugins/dependencies/meta/D/src/android/D.java create mode 100644 cordova-lib/spec-plugman-create/plugins/dependencies/meta/D/src/ios/DPluginCommand.h create mode 100644 cordova-lib/spec-plugman-create/plugins/dependencies/meta/D/src/ios/DPluginCommand.m create mode 100644 cordova-lib/spec-plugman-create/plugins/dependencies/meta/D/www/plugin-d.js create mode 100644 cordova-lib/spec-plugman-create/plugins/dependencies/meta/subdir/E/plugin.xml create mode 100644 cordova-lib/spec-plugman-create/plugins/dependencies/meta/subdir/E/src/android/E.java create mode 100644 cordova-lib/spec-plugman-create/plugins/dependencies/meta/subdir/E/src/ios/EPluginCommand.h create mode 100644 cordova-lib/spec-plugman-create/plugins/dependencies/meta/subdir/E/src/ios/EPluginCommand.m create mode 100644 cordova-lib/spec-plugman-create/plugins/dependencies/meta/subdir/E/www/plugin-e.js create mode 100644 cordova-lib/spec-plugman-create/plugins/dependencies/subdir/E/plugin.xml create mode 100644 cordova-lib/spec-plugman-create/plugins/dependencies/subdir/E/src/android/E.java create mode 100644 cordova-lib/spec-plugman-create/plugins/dependencies/subdir/E/src/ios/EPluginCommand.h create mode 100644 cordova-lib/spec-plugman-create/plugins/dependencies/subdir/E/src/ios/EPluginCommand.m create mode 100644 cordova-lib/spec-plugman-create/plugins/dependencies/subdir/E/www/plugin-e.js create mode 100644 cordova-lib/spec-plugman-create/plugins/multiple-children/plugin.xml create mode 100644 cordova-lib/spec-plugman-create/plugins/shared-deps-multi-child/plugin.xml create mode 100644 cordova-lib/spec-plugman-install/common.js create mode 100644 cordova-lib/spec-plugman-install/plugins/.gitkeep create mode 100644 cordova-lib/spec-plugman-install/plugins/AndroidJS/plugin.xml create mode 100644 cordova-lib/spec-plugman-install/plugins/AndroidJS/www/android.js create mode 100644 cordova-lib/spec-plugman-install/plugins/ChildBrowser/plugin.xml create mode 100644 cordova-lib/spec-plugman-install/plugins/ChildBrowser/src/android/ChildBrowser.java create mode 100644 cordova-lib/spec-plugman-install/plugins/ChildBrowser/src/ios/ChildBrowser.bundle/arrow_left.png create mode 100644 cordova-lib/spec-plugman-install/plugins/ChildBrowser/src/ios/ChildBrowser.bundle/arrow_left@2x.png create mode 100644 cordova-lib/spec-plugman-install/plugins/ChildBrowser/src/ios/ChildBrowser.bundle/arrow_right.png create mode 100644 cordova-lib/spec-plugman-install/plugins/ChildBrowser/src/ios/ChildBrowser.bundle/arrow_right@2x.png create mode 100644 cordova-lib/spec-plugman-install/plugins/ChildBrowser/src/ios/ChildBrowser.bundle/but_refresh.png create mode 100644 cordova-lib/spec-plugman-install/plugins/ChildBrowser/src/ios/ChildBrowser.bundle/but_refresh@2x.png create mode 100644 cordova-lib/spec-plugman-install/plugins/ChildBrowser/src/ios/ChildBrowser.bundle/compass.png create mode 100644 cordova-lib/spec-plugman-install/plugins/ChildBrowser/src/ios/ChildBrowser.bundle/compass@2x.png create mode 100644 cordova-lib/spec-plugman-install/plugins/ChildBrowser/src/ios/ChildBrowserCommand.h create mode 100644 cordova-lib/spec-plugman-install/plugins/ChildBrowser/src/ios/ChildBrowserCommand.m create mode 100644 cordova-lib/spec-plugman-install/plugins/ChildBrowser/src/ios/ChildBrowserViewController.h create mode 100644 cordova-lib/spec-plugman-install/plugins/ChildBrowser/src/ios/ChildBrowserViewController.m create mode 100644 cordova-lib/spec-plugman-install/plugins/ChildBrowser/src/ios/ChildBrowserViewController.xib create mode 100644 cordova-lib/spec-plugman-install/plugins/ChildBrowser/src/ios/TargetDirTest.h create mode 100644 cordova-lib/spec-plugman-install/plugins/ChildBrowser/src/ios/TargetDirTest.m create mode 100644 cordova-lib/spec-plugman-install/plugins/ChildBrowser/src/ios/preserveDirs/PreserveDirsTest.h create mode 100644 cordova-lib/spec-plugman-install/plugins/ChildBrowser/src/ios/preserveDirs/PreserveDirsTest.m create mode 100644 cordova-lib/spec-plugman-install/plugins/ChildBrowser/www/childbrowser.js create mode 100644 cordova-lib/spec-plugman-install/plugins/ChildBrowser/www/childbrowser/image.jpg create mode 100644 cordova-lib/spec-plugman-install/plugins/ChildBrowser/www/childbrowser_file.html create mode 100644 cordova-lib/spec-plugman-install/plugins/ConfigTestPlugin/plugin.xml create mode 100644 cordova-lib/spec-plugman-install/plugins/Contacts/plugin.xml create mode 100644 cordova-lib/spec-plugman-install/plugins/Contacts/src/android/ContactAccessor.java create mode 100644 cordova-lib/spec-plugman-install/plugins/Contacts/src/android/ContactAccessorSdk5.java create mode 100755 cordova-lib/spec-plugman-install/plugins/Contacts/src/android/ContactManager.java create mode 100644 cordova-lib/spec-plugman-install/plugins/Contacts/src/blackberry10/ContactActivity.js create mode 100644 cordova-lib/spec-plugman-install/plugins/Contacts/src/blackberry10/ContactAddress.js create mode 100644 cordova-lib/spec-plugman-install/plugins/Contacts/src/blackberry10/ContactError.js create mode 100644 cordova-lib/spec-plugman-install/plugins/Contacts/src/blackberry10/ContactField.js create mode 100644 cordova-lib/spec-plugman-install/plugins/Contacts/src/blackberry10/ContactFindOptions.js create mode 100644 cordova-lib/spec-plugman-install/plugins/Contacts/src/blackberry10/ContactName.js create mode 100644 cordova-lib/spec-plugman-install/plugins/Contacts/src/blackberry10/ContactNews.js create mode 100644 cordova-lib/spec-plugman-install/plugins/Contacts/src/blackberry10/ContactOrganization.js create mode 100644 cordova-lib/spec-plugman-install/plugins/Contacts/src/blackberry10/ContactPhoto.js create mode 100644 cordova-lib/spec-plugman-install/plugins/Contacts/src/blackberry10/contactConsts.js create mode 100644 cordova-lib/spec-plugman-install/plugins/Contacts/src/blackberry10/contactUtils.js create mode 100644 cordova-lib/spec-plugman-install/plugins/Contacts/src/blackberry10/index.js create mode 100644 cordova-lib/spec-plugman-install/plugins/Contacts/src/blackberry10/plugin.xml create mode 100644 cordova-lib/spec-plugman-install/plugins/Contacts/src/ios/CDVContact.h create mode 100644 cordova-lib/spec-plugman-install/plugins/Contacts/src/ios/CDVContact.m create mode 100644 cordova-lib/spec-plugman-install/plugins/Contacts/src/ios/CDVContacts.h create mode 100644 cordova-lib/spec-plugman-install/plugins/Contacts/src/ios/CDVContacts.m create mode 100644 cordova-lib/spec-plugman-install/plugins/Contacts/src/wp/Contacts.cs create mode 100644 cordova-lib/spec-plugman-install/plugins/Contacts/www/Contact.js create mode 100644 cordova-lib/spec-plugman-install/plugins/Contacts/www/ContactAddress.js create mode 100644 cordova-lib/spec-plugman-install/plugins/Contacts/www/ContactError.js create mode 100644 cordova-lib/spec-plugman-install/plugins/Contacts/www/ContactField.js create mode 100644 cordova-lib/spec-plugman-install/plugins/Contacts/www/ContactFindOptions.js create mode 100644 cordova-lib/spec-plugman-install/plugins/Contacts/www/ContactName.js create mode 100644 cordova-lib/spec-plugman-install/plugins/Contacts/www/ContactOrganization.js create mode 100644 cordova-lib/spec-plugman-install/plugins/Contacts/www/contacts.js create mode 100644 cordova-lib/spec-plugman-install/plugins/Contacts/www/ios/Contact.js create mode 100644 cordova-lib/spec-plugman-install/plugins/Contacts/www/ios/contacts.js create mode 100644 cordova-lib/spec-plugman-install/plugins/DummyPlugin/android-resource.xml create mode 100644 cordova-lib/spec-plugman-install/plugins/DummyPlugin/plugin.xml create mode 100644 cordova-lib/spec-plugman-install/plugins/DummyPlugin/src/android/DummyPlugin.java create mode 100644 cordova-lib/spec-plugman-install/plugins/DummyPlugin/src/blackberry10/index.js create mode 100644 cordova-lib/spec-plugman-install/plugins/DummyPlugin/src/ios/Custom.framework/someFheader.h create mode 100644 cordova-lib/spec-plugman-install/plugins/DummyPlugin/src/ios/Custom.framework/somebinlib create mode 100644 cordova-lib/spec-plugman-install/plugins/DummyPlugin/src/ios/DummyPlugin.bundle create mode 100644 cordova-lib/spec-plugman-install/plugins/DummyPlugin/src/ios/DummyPluginCommand.h create mode 100644 cordova-lib/spec-plugman-install/plugins/DummyPlugin/src/ios/DummyPluginCommand.m create mode 100644 cordova-lib/spec-plugman-install/plugins/DummyPlugin/src/ios/SourceWithFramework.m create mode 100644 cordova-lib/spec-plugman-install/plugins/DummyPlugin/src/ios/TargetDirTest.h create mode 100644 cordova-lib/spec-plugman-install/plugins/DummyPlugin/src/ios/TargetDirTest.m create mode 100644 cordova-lib/spec-plugman-install/plugins/DummyPlugin/src/ios/libsqlite3.dylib create mode 100644 cordova-lib/spec-plugman-install/plugins/DummyPlugin/src/tizen/dummer.js create mode 100644 cordova-lib/spec-plugman-install/plugins/DummyPlugin/src/windows8/dummer.js create mode 100644 cordova-lib/spec-plugman-install/plugins/DummyPlugin/src/wp7/DummyPlugin.cs create mode 100644 cordova-lib/spec-plugman-install/plugins/DummyPlugin/src/wp8/DummyPlugin.cs create mode 100644 cordova-lib/spec-plugman-install/plugins/DummyPlugin/www/dummyplugin.js create mode 100644 cordova-lib/spec-plugman-install/plugins/DummyPlugin/www/dummyplugin/image.jpg create mode 100755 cordova-lib/spec-plugman-install/plugins/EnginePlugin/megaBoringVersion create mode 100755 cordova-lib/spec-plugman-install/plugins/EnginePlugin/megaFunVersion create mode 100644 cordova-lib/spec-plugman-install/plugins/EnginePlugin/plugin.xml create mode 100644 cordova-lib/spec-plugman-install/plugins/EnginePluginAndroid/plugin.xml create mode 100644 cordova-lib/spec-plugman-install/plugins/EnginePluginiOS/plugin.xml create mode 100644 cordova-lib/spec-plugman-install/plugins/FaultyPlugin/plugin.xml create mode 100644 cordova-lib/spec-plugman-install/plugins/FaultyPlugin/src/android/FaultyPlugin.java create mode 100644 cordova-lib/spec-plugman-install/plugins/FaultyPlugin/src/blackberry10/client.js create mode 100644 cordova-lib/spec-plugman-install/plugins/FaultyPlugin/src/ios/FaultyPlugin.h create mode 100644 cordova-lib/spec-plugman-install/plugins/FaultyPlugin/src/ios/FaultyPlugin.m create mode 100644 cordova-lib/spec-plugman-install/plugins/FaultyPlugin/src/windows8/faultyPlugin.js create mode 100644 cordova-lib/spec-plugman-install/plugins/FaultyPlugin/src/wp7/FaultyPlugin.cs create mode 100644 cordova-lib/spec-plugman-install/plugins/FaultyPlugin/src/wp8/FaultyPlugin.cs create mode 100644 cordova-lib/spec-plugman-install/plugins/VariablePlugin/plugin.xml create mode 100644 cordova-lib/spec-plugman-install/plugins/WebNotifications/plugin.xml create mode 100644 cordova-lib/spec-plugman-install/plugins/WebNotifications/src/ios/AppDelegate.m.diff create mode 100644 cordova-lib/spec-plugman-install/plugins/WebNotifications/src/ios/WebNotifications.h create mode 100644 cordova-lib/spec-plugman-install/plugins/WebNotifications/src/ios/WebNotifications.m create mode 100644 cordova-lib/spec-plugman-install/plugins/WebNotifications/www/webnotifications.js create mode 100644 cordova-lib/spec-plugman-install/plugins/WeblessPlugin/plugin.xml create mode 100644 cordova-lib/spec-plugman-install/plugins/WeblessPlugin/src/android/WeblessPlugin.java create mode 100644 cordova-lib/spec-plugman-install/plugins/WeblessPlugin/src/ios/WeblessPlugin.bundle/arrow_left.png create mode 100644 cordova-lib/spec-plugman-install/plugins/WeblessPlugin/src/ios/WeblessPlugin.bundle/arrow_left@2x.png create mode 100644 cordova-lib/spec-plugman-install/plugins/WeblessPlugin/src/ios/WeblessPlugin.bundle/arrow_right.png create mode 100644 cordova-lib/spec-plugman-install/plugins/WeblessPlugin/src/ios/WeblessPlugin.bundle/arrow_right@2x.png create mode 100644 cordova-lib/spec-plugman-install/plugins/WeblessPlugin/src/ios/WeblessPlugin.bundle/but_refresh.png create mode 100644 cordova-lib/spec-plugman-install/plugins/WeblessPlugin/src/ios/WeblessPlugin.bundle/but_refresh@2x.png create mode 100644 cordova-lib/spec-plugman-install/plugins/WeblessPlugin/src/ios/WeblessPlugin.bundle/compass.png create mode 100644 cordova-lib/spec-plugman-install/plugins/WeblessPlugin/src/ios/WeblessPlugin.bundle/compass@2x.png create mode 100644 cordova-lib/spec-plugman-install/plugins/WeblessPlugin/src/ios/WeblessPluginCommand.h create mode 100644 cordova-lib/spec-plugman-install/plugins/WeblessPlugin/src/ios/WeblessPluginCommand.m create mode 100644 cordova-lib/spec-plugman-install/plugins/WeblessPlugin/src/ios/WeblessPluginViewController.h create mode 100644 cordova-lib/spec-plugman-install/plugins/WeblessPlugin/src/ios/WeblessPluginViewController.m create mode 100644 cordova-lib/spec-plugman-install/plugins/WeblessPlugin/src/ios/WeblessPluginViewController.xib create mode 100644 cordova-lib/spec-plugman-install/plugins/cordova.echo/.gitignore create mode 100644 cordova-lib/spec-plugman-install/plugins/cordova.echo/plugin.xml create mode 100644 cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/index.js create mode 100755 cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/device/echoJnext.so create mode 100644 cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/public/json/autolink.h create mode 100644 cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/public/json/config.h create mode 100644 cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/public/json/features.h create mode 100644 cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/public/json/forwards.h create mode 100644 cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/public/json/json.h create mode 100644 cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/public/json/reader.h create mode 100644 cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/public/json/value.h create mode 100644 cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/public/json/writer.h create mode 100644 cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/public/json_batchallocator.h create mode 100644 cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/public/json_internalarray.inl create mode 100644 cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/public/json_internalmap.inl create mode 100644 cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/public/json_reader.cpp create mode 100644 cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/public/json_value.cpp create mode 100644 cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/public/json_valueiterator.inl create mode 100644 cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/public/json_writer.cpp create mode 100644 cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/public/plugin.cpp create mode 100644 cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/public/plugin.h create mode 100644 cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/public/tokenizer.cpp create mode 100644 cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/public/tokenizer.h create mode 100644 cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/simulator/echoJnext.so create mode 100644 cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/src/echo.cpp create mode 100644 cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/src/echo.hpp create mode 100644 cordova-lib/spec-plugman-install/plugins/cordova.echo/www/client.js create mode 100644 cordova-lib/spec-plugman-install/plugins/dependencies/A/plugin.xml create mode 100644 cordova-lib/spec-plugman-install/plugins/dependencies/A/src/android/A.java create mode 100644 cordova-lib/spec-plugman-install/plugins/dependencies/A/src/ios/APluginCommand.h create mode 100644 cordova-lib/spec-plugman-install/plugins/dependencies/A/src/ios/APluginCommand.m create mode 100644 cordova-lib/spec-plugman-install/plugins/dependencies/A/www/plugin-a.js create mode 100644 cordova-lib/spec-plugman-install/plugins/dependencies/B/plugin.xml create mode 100644 cordova-lib/spec-plugman-install/plugins/dependencies/B/src/android/B.java create mode 100644 cordova-lib/spec-plugman-install/plugins/dependencies/B/src/ios/BPluginCommand.h create mode 100644 cordova-lib/spec-plugman-install/plugins/dependencies/B/src/ios/BPluginCommand.m create mode 100644 cordova-lib/spec-plugman-install/plugins/dependencies/B/www/plugin-b.js create mode 100644 cordova-lib/spec-plugman-install/plugins/dependencies/C/plugin.xml create mode 100644 cordova-lib/spec-plugman-install/plugins/dependencies/C/src/android/C.java create mode 100644 cordova-lib/spec-plugman-install/plugins/dependencies/C/src/ios/CPluginCommand.h create mode 100644 cordova-lib/spec-plugman-install/plugins/dependencies/C/src/ios/CPluginCommand.m create mode 100644 cordova-lib/spec-plugman-install/plugins/dependencies/C/www/plugin-c.js create mode 100644 cordova-lib/spec-plugman-install/plugins/dependencies/D/plugin.xml create mode 100644 cordova-lib/spec-plugman-install/plugins/dependencies/D/src/android/D.java create mode 100644 cordova-lib/spec-plugman-install/plugins/dependencies/D/src/ios/DPluginCommand.h create mode 100644 cordova-lib/spec-plugman-install/plugins/dependencies/D/src/ios/DPluginCommand.m create mode 100644 cordova-lib/spec-plugman-install/plugins/dependencies/D/www/plugin-d.js create mode 100644 cordova-lib/spec-plugman-install/plugins/dependencies/E/plugin.xml create mode 100644 cordova-lib/spec-plugman-install/plugins/dependencies/E/src/android/E.java create mode 100644 cordova-lib/spec-plugman-install/plugins/dependencies/E/src/ios/EPluginCommand.h create mode 100644 cordova-lib/spec-plugman-install/plugins/dependencies/E/src/ios/EPluginCommand.m create mode 100644 cordova-lib/spec-plugman-install/plugins/dependencies/E/www/plugin-d.js create mode 100644 cordova-lib/spec-plugman-install/plugins/dependencies/F/plugin.xml create mode 100644 cordova-lib/spec-plugman-install/plugins/dependencies/F/src/android/F.java create mode 100644 cordova-lib/spec-plugman-install/plugins/dependencies/F/src/ios/FPluginCommand.h create mode 100644 cordova-lib/spec-plugman-install/plugins/dependencies/F/src/ios/FPluginCommand.m create mode 100644 cordova-lib/spec-plugman-install/plugins/dependencies/F/www/plugin-f.js create mode 100644 cordova-lib/spec-plugman-install/plugins/dependencies/G/plugin.xml create mode 100644 cordova-lib/spec-plugman-install/plugins/dependencies/G/src/android/G.java create mode 100644 cordova-lib/spec-plugman-install/plugins/dependencies/G/src/ios/EPluginCommand.m create mode 100644 cordova-lib/spec-plugman-install/plugins/dependencies/G/src/ios/GPluginCommand.h create mode 100644 cordova-lib/spec-plugman-install/plugins/dependencies/G/www/plugin-g.js create mode 100644 cordova-lib/spec-plugman-install/plugins/dependencies/H/plugin.xml create mode 100644 cordova-lib/spec-plugman-install/plugins/dependencies/H/src/android/H.java create mode 100644 cordova-lib/spec-plugman-install/plugins/dependencies/H/src/ios/HPluginCommand.h create mode 100644 cordova-lib/spec-plugman-install/plugins/dependencies/H/src/ios/HPluginCommand.m create mode 100644 cordova-lib/spec-plugman-install/plugins/dependencies/H/www/plugin-h.js create mode 100644 cordova-lib/spec-plugman-install/plugins/dependencies/README.md create mode 100644 cordova-lib/spec-plugman-install/plugins/dependencies/meta/D/plugin.xml create mode 100644 cordova-lib/spec-plugman-install/plugins/dependencies/meta/D/src/android/D.java create mode 100644 cordova-lib/spec-plugman-install/plugins/dependencies/meta/D/src/ios/DPluginCommand.h create mode 100644 cordova-lib/spec-plugman-install/plugins/dependencies/meta/D/src/ios/DPluginCommand.m create mode 100644 cordova-lib/spec-plugman-install/plugins/dependencies/meta/D/www/plugin-d.js create mode 100644 cordova-lib/spec-plugman-install/plugins/dependencies/meta/subdir/E/plugin.xml create mode 100644 cordova-lib/spec-plugman-install/plugins/dependencies/meta/subdir/E/src/android/E.java create mode 100644 cordova-lib/spec-plugman-install/plugins/dependencies/meta/subdir/E/src/ios/EPluginCommand.h create mode 100644 cordova-lib/spec-plugman-install/plugins/dependencies/meta/subdir/E/src/ios/EPluginCommand.m create mode 100644 cordova-lib/spec-plugman-install/plugins/dependencies/meta/subdir/E/www/plugin-e.js create mode 100644 cordova-lib/spec-plugman-install/plugins/dependencies/subdir/E/plugin.xml create mode 100644 cordova-lib/spec-plugman-install/plugins/dependencies/subdir/E/src/android/E.java create mode 100644 cordova-lib/spec-plugman-install/plugins/dependencies/subdir/E/src/ios/EPluginCommand.h create mode 100644 cordova-lib/spec-plugman-install/plugins/dependencies/subdir/E/src/ios/EPluginCommand.m create mode 100644 cordova-lib/spec-plugman-install/plugins/dependencies/subdir/E/www/plugin-e.js create mode 100644 cordova-lib/spec-plugman-install/plugins/multiple-children/plugin.xml create mode 100644 cordova-lib/spec-plugman-install/plugins/shared-deps-multi-child/plugin.xml create mode 100644 cordova-lib/spec-plugman-install/projects/.gitkeep create mode 100644 cordova-lib/spec-plugman-install/projects/android_install/AndroidManifest.xml create mode 100644 cordova-lib/spec-plugman-install/projects/android_install/cordova/android_sdk_version create mode 100644 cordova-lib/spec-plugman-install/projects/android_install/cordova/version create mode 100644 cordova-lib/spec-plugman-install/projects/android_install/cordova/version.bat create mode 100644 cordova-lib/spec-plugman-install/projects/android_one/AndroidManifest.xml create mode 100644 cordova-lib/spec-plugman-install/projects/android_one/assets/www/.gitkeep create mode 100644 cordova-lib/spec-plugman-install/projects/android_one/assets/www/cordova.js create mode 100755 cordova-lib/spec-plugman-install/projects/android_one/cordova/build create mode 100755 cordova-lib/spec-plugman-install/projects/android_one/cordova/clean create mode 100755 cordova-lib/spec-plugman-install/projects/android_one/cordova/lib/cordova create mode 100755 cordova-lib/spec-plugman-install/projects/android_one/cordova/lib/install-device create mode 100755 cordova-lib/spec-plugman-install/projects/android_one/cordova/lib/install-emulator create mode 100755 cordova-lib/spec-plugman-install/projects/android_one/cordova/lib/list-devices create mode 100755 cordova-lib/spec-plugman-install/projects/android_one/cordova/lib/list-emulator-images create mode 100755 cordova-lib/spec-plugman-install/projects/android_one/cordova/lib/list-started-emulators create mode 100755 cordova-lib/spec-plugman-install/projects/android_one/cordova/lib/start-emulator create mode 100755 cordova-lib/spec-plugman-install/projects/android_one/cordova/log create mode 100755 cordova-lib/spec-plugman-install/projects/android_one/cordova/run create mode 100755 cordova-lib/spec-plugman-install/projects/android_one/cordova/version create mode 100644 cordova-lib/spec-plugman-install/projects/android_one/res/xml/plugins.xml create mode 100644 cordova-lib/spec-plugman-install/projects/android_one/src/.gitkeep create mode 100644 cordova-lib/spec-plugman-install/projects/android_two/AndroidManifest.xml create mode 100644 cordova-lib/spec-plugman-install/projects/android_two/assets/www/.gitkeep create mode 100644 cordova-lib/spec-plugman-install/projects/android_two/res/xml/config.xml create mode 100644 cordova-lib/spec-plugman-install/projects/android_two/src/.gitkeep create mode 100644 cordova-lib/spec-plugman-install/projects/android_two_no_perms/AndroidManifest.xml create mode 100644 cordova-lib/spec-plugman-install/projects/android_two_no_perms/assets/www/.gitkeep create mode 100644 cordova-lib/spec-plugman-install/projects/android_two_no_perms/res/xml/config.xml create mode 100644 cordova-lib/spec-plugman-install/projects/android_two_no_perms/src/.gitkeep create mode 100644 cordova-lib/spec-plugman-install/projects/android_uninstall/AndroidManifest.xml create mode 100644 cordova-lib/spec-plugman-install/projects/android_uninstall/cordova/version create mode 100644 cordova-lib/spec-plugman-install/projects/android_uninstall/cordova/version.bat create mode 100644 cordova-lib/spec-plugman-install/projects/blackberry10/native/device/chrome/.gitkeep create mode 100644 cordova-lib/spec-plugman-install/projects/blackberry10/native/device/plugins/jnext/auth.txt create mode 100644 cordova-lib/spec-plugman-install/projects/blackberry10/native/simulator/chrome/.gitkeep create mode 100644 cordova-lib/spec-plugman-install/projects/blackberry10/native/simulator/plugins/jnext/auth.txt create mode 100644 cordova-lib/spec-plugman-install/projects/blackberry10/www/config.xml create mode 100644 cordova-lib/spec-plugman-install/projects/ios-config-xml/CordovaLib/CordovaLib.xcodeproj/project.pbxproj create mode 100644 cordova-lib/spec-plugman-install/projects/ios-config-xml/SampleApp.xcodeproj/project.orig.pbxproj create mode 100644 cordova-lib/spec-plugman-install/projects/ios-config-xml/SampleApp.xcodeproj/project.pbxproj create mode 100644 cordova-lib/spec-plugman-install/projects/ios-config-xml/SampleApp/SampleApp-Info.plist create mode 100644 cordova-lib/spec-plugman-install/projects/ios-config-xml/SampleApp/config.xml create mode 100644 cordova-lib/spec-plugman-install/projects/ios-config-xml/www/.gitkeep create mode 100644 cordova-lib/spec-plugman-install/projects/ios-plist/CordovaLib/CordovaLib.xcodeproj/project.pbxproj create mode 100644 cordova-lib/spec-plugman-install/projects/ios-plist/SampleApp.xcodeproj/project.orig.pbxproj create mode 100644 cordova-lib/spec-plugman-install/projects/ios-plist/SampleApp.xcodeproj/project.pbxproj create mode 100644 cordova-lib/spec-plugman-install/projects/ios-plist/SampleApp/PhoneGap.plist create mode 100644 cordova-lib/spec-plugman-install/projects/ios-plist/SampleApp/SampleApp-Info.plist create mode 100644 cordova-lib/spec-plugman-install/projects/ios-plist/www/.gitkeep create mode 100644 cordova-lib/spec-plugman-install/projects/multiple-children/AndroidManifest.xml create mode 100644 cordova-lib/spec-plugman-install/projects/multiple-children/res/xml/plugins.xml create mode 100644 cordova-lib/spec-plugman-install/projects/tizen/www/config.xml create mode 100644 cordova-lib/spec-plugman-install/projects/windows8/CordovaApp_TemporaryKey.pfx create mode 100644 cordova-lib/spec-plugman-install/projects/windows8/TestApp.jsproj create mode 100644 cordova-lib/spec-plugman-install/projects/windows8/TestApp.sln create mode 100644 cordova-lib/spec-plugman-install/projects/windows8/package.appxmanifest create mode 100644 cordova-lib/spec-plugman-install/projects/windows8/www/cordova-2.6.0.js create mode 100644 cordova-lib/spec-plugman-install/projects/windows8/www/css/index.css create mode 100644 cordova-lib/spec-plugman-install/projects/windows8/www/img/logo.png create mode 100644 cordova-lib/spec-plugman-install/projects/windows8/www/img/smalllogo.png create mode 100644 cordova-lib/spec-plugman-install/projects/windows8/www/img/splashscreen.png create mode 100644 cordova-lib/spec-plugman-install/projects/windows8/www/img/storelogo.png create mode 100644 cordova-lib/spec-plugman-install/projects/windows8/www/index.html create mode 100644 cordova-lib/spec-plugman-install/projects/windows8/www/js/index.js create mode 100644 cordova-lib/spec-plugman-install/projects/wp8/CordovaAppProj.csproj create mode 100644 cordova-lib/spec-plugman-install/projects/wp8/Properties/WMAppManifest.xml create mode 100644 cordova-lib/spec-plugman-install/projects/www-only/.gitkeep diff --git a/cordova-lib/spec-plugman-create/plugins/.gitkeep b/cordova-lib/spec-plugman-create/plugins/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/cordova-lib/spec-plugman-create/plugins/AndroidJS/plugin.xml b/cordova-lib/spec-plugman-create/plugins/AndroidJS/plugin.xml new file mode 100644 index 000000000..1a687494f --- /dev/null +++ b/cordova-lib/spec-plugman-create/plugins/AndroidJS/plugin.xml @@ -0,0 +1,34 @@ + + + + + + JavaScript in yo droidz + + + + + + + + diff --git a/cordova-lib/spec-plugman-create/plugins/AndroidJS/www/android.js b/cordova-lib/spec-plugman-create/plugins/AndroidJS/www/android.js new file mode 100644 index 000000000..d268b7d3a --- /dev/null +++ b/cordova-lib/spec-plugman-create/plugins/AndroidJS/www/android.js @@ -0,0 +1 @@ +{}; diff --git a/cordova-lib/spec-plugman-create/plugins/ChildBrowser/plugin.xml b/cordova-lib/spec-plugman-create/plugins/ChildBrowser/plugin.xml new file mode 100644 index 000000000..030f8cada --- /dev/null +++ b/cordova-lib/spec-plugman-create/plugins/ChildBrowser/plugin.xml @@ -0,0 +1,124 @@ + + + + + + Child Browser + + + + + + + + + + + + + + No matter what platform you are installing to, this notice is very important. + + + + + + + + + + + + + + + + + + + + + + Please make sure you read this because it is very important to complete the installation of your plugin. + + + + + + + + + + + + + $APP_ID + + + + + + PackageName + $PACKAGE_NAME + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cordova-lib/spec-plugman-create/plugins/ChildBrowser/src/android/ChildBrowser.java b/cordova-lib/spec-plugman-create/plugins/ChildBrowser/src/android/ChildBrowser.java new file mode 100644 index 000000000..5263b0c5d --- /dev/null +++ b/cordova-lib/spec-plugman-create/plugins/ChildBrowser/src/android/ChildBrowser.java @@ -0,0 +1,19 @@ +/* + * + * Copyright 2013 Anis Kadri + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + diff --git a/cordova-lib/spec-plugman-create/plugins/ChildBrowser/src/ios/ChildBrowser.bundle/arrow_left.png b/cordova-lib/spec-plugman-create/plugins/ChildBrowser/src/ios/ChildBrowser.bundle/arrow_left.png new file mode 100644 index 0000000000000000000000000000000000000000..530e12babde279931dc58cb36e2af4d9b7d52acc GIT binary patch literal 2946 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 literal 0 HcmV?d00001 diff --git a/cordova-lib/spec-plugman-create/plugins/ChildBrowser/src/ios/ChildBrowser.bundle/arrow_left@2x.png b/cordova-lib/spec-plugman-create/plugins/ChildBrowser/src/ios/ChildBrowser.bundle/arrow_left@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..530e12babde279931dc58cb36e2af4d9b7d52acc GIT binary patch literal 2946 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 literal 0 HcmV?d00001 diff --git a/cordova-lib/spec-plugman-create/plugins/ChildBrowser/src/ios/ChildBrowser.bundle/arrow_right.png b/cordova-lib/spec-plugman-create/plugins/ChildBrowser/src/ios/ChildBrowser.bundle/arrow_right.png new file mode 100644 index 0000000000000000000000000000000000000000..8b3d855e884f8aa8b5d2c78139fa63ff4b5826d9 GIT binary patch literal 2946 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 literal 0 HcmV?d00001 diff --git a/cordova-lib/spec-plugman-create/plugins/ChildBrowser/src/ios/ChildBrowser.bundle/arrow_right@2x.png b/cordova-lib/spec-plugman-create/plugins/ChildBrowser/src/ios/ChildBrowser.bundle/arrow_right@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..8b3d855e884f8aa8b5d2c78139fa63ff4b5826d9 GIT binary patch literal 2946 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 literal 0 HcmV?d00001 diff --git a/cordova-lib/spec-plugman-create/plugins/ChildBrowser/src/ios/ChildBrowser.bundle/but_refresh.png b/cordova-lib/spec-plugman-create/plugins/ChildBrowser/src/ios/ChildBrowser.bundle/but_refresh.png new file mode 100644 index 0000000000000000000000000000000000000000..309b6bdb255b8784cf884e6fa2bde3febe36da5f GIT binary patch literal 3369 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 literal 0 HcmV?d00001 diff --git a/cordova-lib/spec-plugman-create/plugins/ChildBrowser/src/ios/ChildBrowser.bundle/compass@2x.png b/cordova-lib/spec-plugman-create/plugins/ChildBrowser/src/ios/ChildBrowser.bundle/compass@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..46a890174edb858abbef991828153aea289a3a49 GIT binary patch literal 3035 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 literal 0 HcmV?d00001 diff --git a/cordova-lib/spec-plugman-create/plugins/ChildBrowser/src/ios/ChildBrowserCommand.h b/cordova-lib/spec-plugman-create/plugins/ChildBrowser/src/ios/ChildBrowserCommand.h new file mode 100644 index 000000000..6a23ab6f0 --- /dev/null +++ b/cordova-lib/spec-plugman-create/plugins/ChildBrowser/src/ios/ChildBrowserCommand.h @@ -0,0 +1,49 @@ +/* + * + * Copyright 2013 Anis Kadri + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +// +// PhoneGap ! ChildBrowserCommand +// +// +// Created by Jesse MacFadyen on 10-05-29. +// Copyright 2010 Nitobi. All rights reserved. +// + +#import +#ifdef PHONEGAP_FRAMEWORK + #import +#else + #import "PGPlugin.h" +#endif +#import "ChildBrowserViewController.h" + + + +@interface ChildBrowserCommand : PGPlugin { + + ChildBrowserViewController* childBrowser; +} + +@property (nonatomic, retain) ChildBrowserViewController *childBrowser; + + +- (void) showWebPage:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options; +-(void) onChildLocationChange:(NSString*)newLoc; + +@end diff --git a/cordova-lib/spec-plugman-create/plugins/ChildBrowser/src/ios/ChildBrowserCommand.m b/cordova-lib/spec-plugman-create/plugins/ChildBrowser/src/ios/ChildBrowserCommand.m new file mode 100644 index 000000000..38aaf6497 --- /dev/null +++ b/cordova-lib/spec-plugman-create/plugins/ChildBrowser/src/ios/ChildBrowserCommand.m @@ -0,0 +1,86 @@ +// + +// +// +// Created by Jesse MacFadyen on 10-05-29. +// Copyright 2010 Nitobi. All rights reserved. +// Copyright (c) 2011, IBM Corporation +// Copyright 2011, Randy McMillan +// + +#import "ChildBrowserCommand.h" + +#ifdef PHONEGAP_FRAMEWORK + #import +#else + #import "PhoneGapViewController.h" +#endif + + +@implementation ChildBrowserCommand + +@synthesize childBrowser; + +- (void) showWebPage:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options // args: url +{ + + if(childBrowser == NULL) + { + childBrowser = [[ ChildBrowserViewController alloc ] initWithScale:FALSE ]; + childBrowser.delegate = self; + } + +/* // TODO: Work in progress + NSString* strOrientations = [ options objectForKey:@"supportedOrientations"]; + NSArray* supportedOrientations = [strOrientations componentsSeparatedByString:@","]; +*/ + PhoneGapViewController* cont = (PhoneGapViewController*)[ super appViewController ]; + childBrowser.supportedOrientations = cont.supportedOrientations; + + if ([cont respondsToSelector:@selector(presentViewController)]) { + //Reference UIViewController.h Line:179 for update to iOS 5 difference - @RandyMcMillan + [cont presentViewController:childBrowser animated:YES completion:nil]; + } else { + [ cont presentModalViewController:childBrowser animated:YES ]; + } + + NSString *url = (NSString*) [arguments objectAtIndex:0]; + + [childBrowser loadURL:url ]; + +} + +-(void) close:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options // args: url +{ + [ childBrowser closeBrowser]; + +} + +-(void) onClose +{ + NSString* jsCallback = [NSString stringWithFormat:@"ChildBrowser._onClose();",@""]; + [self.webView stringByEvaluatingJavaScriptFromString:jsCallback]; +} + +-(void) onOpenInSafari +{ + NSString* jsCallback = [NSString stringWithFormat:@"ChildBrowser._onOpenExternal();",@""]; + [self.webView stringByEvaluatingJavaScriptFromString:jsCallback]; +} + + +-(void) onChildLocationChange:(NSString*)newLoc +{ + + NSString* tempLoc = [NSString stringWithFormat:@"%@",newLoc]; + NSString* encUrl = [tempLoc stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; + + NSString* jsCallback = [NSString stringWithFormat:@"ChildBrowser._onLocationChange('%@');",encUrl]; + [self.webView stringByEvaluatingJavaScriptFromString:jsCallback]; + +} + + + + +@end diff --git a/cordova-lib/spec-plugman-create/plugins/ChildBrowser/src/ios/ChildBrowserViewController.h b/cordova-lib/spec-plugman-create/plugins/ChildBrowser/src/ios/ChildBrowserViewController.h new file mode 100644 index 000000000..d6fc139d5 --- /dev/null +++ b/cordova-lib/spec-plugman-create/plugins/ChildBrowser/src/ios/ChildBrowserViewController.h @@ -0,0 +1,73 @@ +/* + * + * Copyright 2013 Anis Kadri + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +// +// ChildBrowserViewController.h +// +// Created by Jesse MacFadyen on 21/07/09. +// Copyright 2009 Nitobi. All rights reserved. +// + +#import + +@protocol ChildBrowserDelegate + + + +/* + * onChildLocationChanging:newLoc + * + * Discussion: + * Invoked when a new page has loaded + */ +-(void) onChildLocationChange:(NSString*)newLoc; +-(void) onOpenInSafari; +-(void) onClose; +@end + + +@interface ChildBrowserViewController : UIViewController < UIWebViewDelegate > { + IBOutlet UIWebView* webView; + IBOutlet UIBarButtonItem* closeBtn; + IBOutlet UIBarButtonItem* refreshBtn; + IBOutlet UILabel* addressLabel; + IBOutlet UIBarButtonItem* backBtn; + IBOutlet UIBarButtonItem* fwdBtn; + IBOutlet UIBarButtonItem* safariBtn; + IBOutlet UIActivityIndicatorView* spinner; + BOOL scaleEnabled; + BOOL isImage; + NSString* imageURL; + NSArray* supportedOrientations; + id delegate; +} + +@property (nonatomic, retain)id delegate; +@property (nonatomic, retain) NSArray* supportedOrientations; +@property(retain) NSString* imageURL; +@property(assign) BOOL isImage; + +- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation) interfaceOrientation; +- (ChildBrowserViewController*)initWithScale:(BOOL)enabled; +- (IBAction)onDoneButtonPress:(id)sender; +- (IBAction)onSafariButtonPress:(id)sender; +- (void)loadURL:(NSString*)url; +-(void)closeBrowser; + +@end diff --git a/cordova-lib/spec-plugman-create/plugins/ChildBrowser/src/ios/ChildBrowserViewController.m b/cordova-lib/spec-plugman-create/plugins/ChildBrowser/src/ios/ChildBrowserViewController.m new file mode 100644 index 000000000..167ef9801 --- /dev/null +++ b/cordova-lib/spec-plugman-create/plugins/ChildBrowser/src/ios/ChildBrowserViewController.m @@ -0,0 +1,239 @@ +// +// ChildBrowserViewController.m +// +// Created by Jesse MacFadyen on 21/07/09. +// Copyright 2009 Nitobi. All rights reserved. +// Copyright (c) 2011, IBM Corporation +// Copyright 2011, Randy McMillan +// + +#import "ChildBrowserViewController.h" + + +@implementation ChildBrowserViewController + +@synthesize imageURL; +@synthesize supportedOrientations; +@synthesize isImage; +@synthesize delegate; + +/* + // The designated initializer. Override if you create the controller programmatically and want to perform customization that is not appropriate for viewDidLoad. +- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { + if (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) { + // Custom initialization + } + return self; +} +*/ + ++ (NSString*) resolveImageResource:(NSString*)resource +{ + NSString* systemVersion = [[UIDevice currentDevice] systemVersion]; + BOOL isLessThaniOS4 = ([systemVersion compare:@"4.0" options:NSNumericSearch] == NSOrderedAscending); + + // the iPad image (nor retina) differentiation code was not in 3.x, and we have to explicitly set the path + if (isLessThaniOS4) + { + return [NSString stringWithFormat:@"%@.png", resource]; + } + + return resource; +} + + +- (ChildBrowserViewController*)initWithScale:(BOOL)enabled +{ + self = [super init]; + + + scaleEnabled = enabled; + + return self; +} + +// Implement viewDidLoad to do additional setup after loading the view, typically from a nib. +- (void)viewDidLoad { + [super viewDidLoad]; + + refreshBtn.image = [UIImage imageNamed:[[self class] resolveImageResource:@"ChildBrowser.bundle/but_refresh"]]; + backBtn.image = [UIImage imageNamed:[[self class] resolveImageResource:@"ChildBrowser.bundle/arrow_left"]]; + fwdBtn.image = [UIImage imageNamed:[[self class] resolveImageResource:@"ChildBrowser.bundle/arrow_right"]]; + safariBtn.image = [UIImage imageNamed:[[self class] resolveImageResource:@"ChildBrowser.bundle/compass"]]; + + webView.delegate = self; + webView.scalesPageToFit = TRUE; + webView.backgroundColor = [UIColor whiteColor]; + NSLog(@"View did load"); +} + + + + + +- (void)didReceiveMemoryWarning { + // Releases the view if it doesn't have a superview. + [super didReceiveMemoryWarning]; + + // Release any cached data, images, etc that aren't in use. +} + +- (void)viewDidUnload { + // Release any retained subviews of the main view. + // e.g. self.myOutlet = nil; + NSLog(@"View did UN-load"); +} + + +- (void)dealloc { + + webView.delegate = nil; + + [webView release]; + [closeBtn release]; + [refreshBtn release]; + [addressLabel release]; + [backBtn release]; + [fwdBtn release]; + [safariBtn release]; + [spinner release]; + [ supportedOrientations release]; + [super dealloc]; +} + +-(void)closeBrowser +{ + + if(delegate != NULL) + { + [delegate onClose]; + } + if ([self respondsToSelector:@selector(presentingViewController)]) { + //Reference UIViewController.h Line:179 for update to iOS 5 difference - @RandyMcMillan + [[self presentingViewController] dismissViewControllerAnimated:YES completion:nil]; + } else { + [[self parentViewController] dismissModalViewControllerAnimated:YES]; + } +} + +-(IBAction) onDoneButtonPress:(id)sender +{ + [ self closeBrowser]; + + NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"about:blank"]]; + [webView loadRequest:request]; +} + + +-(IBAction) onSafariButtonPress:(id)sender +{ + + if(delegate != NULL) + { + [delegate onOpenInSafari]; + } + + if(isImage) + { + NSURL* pURL = [[ [NSURL alloc] initWithString:imageURL ] autorelease]; + [ [ UIApplication sharedApplication ] openURL:pURL ]; + } + else + { + NSURLRequest *request = webView.request; + [[UIApplication sharedApplication] openURL:request.URL]; + } + + +} + +- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation) interfaceOrientation +{ + BOOL autoRotate = [self.supportedOrientations count] > 1; // autorotate if only more than 1 orientation supported + if (autoRotate) + { + if ([self.supportedOrientations containsObject: + [NSNumber numberWithInt:interfaceOrientation]]) { + return YES; + } + } + + return NO; +} + + + + +- (void)loadURL:(NSString*)url +{ + NSLog(@"Opening Url : %@",url); + + if( [url hasSuffix:@".png" ] || + [url hasSuffix:@".jpg" ] || + [url hasSuffix:@".jpeg" ] || + [url hasSuffix:@".bmp" ] || + [url hasSuffix:@".gif" ] ) + { + [ imageURL release ]; + imageURL = [url copy]; + isImage = YES; + NSString* htmlText = @""; + htmlText = [ htmlText stringByReplacingOccurrencesOfString:@"IMGSRC" withString:url ]; + + [webView loadHTMLString:htmlText baseURL:[NSURL URLWithString:@""]]; + + } + else + { + imageURL = @""; + isImage = NO; + NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:url]]; + [webView loadRequest:request]; + } + webView.hidden = NO; +} + + +- (void)webViewDidStartLoad:(UIWebView *)sender { + addressLabel.text = @"Loading..."; + backBtn.enabled = webView.canGoBack; + fwdBtn.enabled = webView.canGoForward; + + [ spinner startAnimating ]; + +} + +- (void)webViewDidFinishLoad:(UIWebView *)sender +{ + NSURLRequest *request = webView.request; + NSLog(@"New Address is : %@",request.URL.absoluteString); + addressLabel.text = request.URL.absoluteString; + backBtn.enabled = webView.canGoBack; + fwdBtn.enabled = webView.canGoForward; + [ spinner stopAnimating ]; + + if(delegate != NULL) + { + [delegate onChildLocationChange:request.URL.absoluteString]; + } + +} + +- (void)webView:(UIWebView *)wv didFailLoadWithError:(NSError *)error { + NSLog (@"webView:didFailLoadWithError"); + [spinner stopAnimating]; + addressLabel.text = @"Failed"; + if (error != NULL) { + UIAlertView *errorAlert = [[UIAlertView alloc] + initWithTitle: [error localizedDescription] + message: [error localizedFailureReason] + delegate:nil + cancelButtonTitle:@"OK" + otherButtonTitles:nil]; + [errorAlert show]; + [errorAlert release]; + } +} + + +@end diff --git a/cordova-lib/spec-plugman-create/plugins/ChildBrowser/src/ios/ChildBrowserViewController.xib b/cordova-lib/spec-plugman-create/plugins/ChildBrowser/src/ios/ChildBrowserViewController.xib new file mode 100644 index 000000000..cc8dd6592 --- /dev/null +++ b/cordova-lib/spec-plugman-create/plugins/ChildBrowser/src/ios/ChildBrowserViewController.xib @@ -0,0 +1,875 @@ + + + + 768 + 10K540 + 851 + 1038.36 + 461.00 + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + 141 + + + YES + + + YES + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + YES + + YES + + + YES + + + + YES + + IBFilesOwner + IBCocoaTouchFramework + + + IBFirstResponder + IBCocoaTouchFramework + + + + 292 + + YES + + + -2147483374 + {480, 229} + + + + 1 + MCAwIDAAA + + YES + YES + IBCocoaTouchFramework + 1 + YES + + + + 266 + {{0, 256}, {480, 44}} + + + NO + NO + IBCocoaTouchFramework + 1 + + YES + + IBCocoaTouchFramework + 1 + + 0 + + + IBCocoaTouchFramework + + 5 + + + IBCocoaTouchFramework + + + + IBCocoaTouchFramework + + 5 + + + IBCocoaTouchFramework + 32 + + + + IBCocoaTouchFramework + + 5 + + + IBCocoaTouchFramework + 32 + + + + IBCocoaTouchFramework + + 5 + + + IBCocoaTouchFramework + 32 + + + + IBCocoaTouchFramework + + 5 + + + + + + 270 + {{5, 230}, {418, 21}} + + + + 4 + MC42NjY2NjY2OSAwAA + + NO + YES + NO + IBCocoaTouchFramework + Loading... + + Helvetica + 13 + 16 + + + 3 + MQA + + + 1 + NO + 10 + + + + -2147483383 + {{454, 231}, {20, 20}} + + NO + NO + NO + IBCocoaTouchFramework + + + {{0, 20}, {480, 300}} + + + 3 + MC41AA + + 2 + + + + + 3 + + IBCocoaTouchFramework + + + + + YES + + + webView + + + + 17 + + + + addressLabel + + + + 18 + + + + backBtn + + + + 19 + + + + fwdBtn + + + + 22 + + + + refreshBtn + + + + 23 + + + + onDoneButtonPress: + + + + 26 + + + + reload + + + + 27 + + + + goBack + + + + 28 + + + + goForward + + + + 29 + + + + onSafariButtonPress: + + + + 31 + + + + view + + + + 35 + + + + spinner + + + + 36 + + + + safariBtn + + + + 40 + + + + + YES + + 0 + + + + + + 1 + + + YES + + + + + + + + + -1 + + + File's Owner + + + -2 + + + + + 4 + + + + + 6 + + + YES + + + + + + + + + + + + + + + 7 + + + + + 8 + + + Bar Button Item (Reload) + + + 9 + + + Bar Button Item (Go Back) + + + 10 + + + Bar Button Item (Go Forward) + + + 11 + + + Bar Button Item (Safari) + + + 13 + + + + + 14 + + + + + 15 + + + + + 32 + + + + + 37 + + + + + 38 + + + + + 39 + + + + + + + YES + + YES + -1.CustomClassName + -2.CustomClassName + 1.IBEditorWindowLastContentRect + 1.IBPluginDependency + 10.IBPluginDependency + 11.IBPluginDependency + 13.IBPluginDependency + 13.IBViewBoundsToFrameTransform + 14.IBPluginDependency + 15.IBPluginDependency + 32.IBPluginDependency + 32.IBViewBoundsToFrameTransform + 37.IBPluginDependency + 38.IBPluginDependency + 39.IBPluginDependency + 4.IBPluginDependency + 4.IBViewBoundsToFrameTransform + 6.IBPluginDependency + 6.IBViewBoundsToFrameTransform + 7.IBPluginDependency + 8.IBPluginDependency + 9.IBPluginDependency + + + YES + ChildBrowserViewController + UIResponder + {{250, 643}, {480, 320}} + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABCoAAAwygAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABD5gAAw3kAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABB8AAAwwUAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAAAAAAAAw10AAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + + YES + + + YES + + + + + YES + + + YES + + + + 40 + + + + YES + + ChildBrowserViewController + UIViewController + + YES + + YES + onDoneButtonPress: + onSafariButtonPress: + + + YES + id + id + + + + YES + + YES + onDoneButtonPress: + onSafariButtonPress: + + + YES + + onDoneButtonPress: + id + + + onSafariButtonPress: + id + + + + + YES + + YES + addressLabel + backBtn + closeBtn + delegate + fwdBtn + refreshBtn + safariBtn + spinner + webView + + + YES + UILabel + UIBarButtonItem + UIBarButtonItem + id + UIBarButtonItem + UIBarButtonItem + UIBarButtonItem + UIActivityIndicatorView + UIWebView + + + + YES + + YES + addressLabel + backBtn + closeBtn + delegate + fwdBtn + refreshBtn + safariBtn + spinner + webView + + + YES + + addressLabel + UILabel + + + backBtn + UIBarButtonItem + + + closeBtn + UIBarButtonItem + + + delegate + id + + + fwdBtn + UIBarButtonItem + + + refreshBtn + UIBarButtonItem + + + safariBtn + UIBarButtonItem + + + spinner + UIActivityIndicatorView + + + webView + UIWebView + + + + + IBProjectSource + Plugins/ChildBrowser/ChildBrowserViewController.h + + + + + YES + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSError.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSFileManager.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyValueCoding.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyValueObserving.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyedArchiver.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSObject.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSRunLoop.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSThread.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSURL.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSURLConnection.h + + + + NSObject + + IBFrameworkSource + QuartzCore.framework/Headers/CAAnimation.h + + + + NSObject + + IBFrameworkSource + QuartzCore.framework/Headers/CALayer.h + + + + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UIAccessibility.h + + + + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UINibLoading.h + + + + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UIResponder.h + + + + UIActivityIndicatorView + UIView + + IBFrameworkSource + UIKit.framework/Headers/UIActivityIndicatorView.h + + + + UIBarButtonItem + UIBarItem + + IBFrameworkSource + UIKit.framework/Headers/UIBarButtonItem.h + + + + UIBarItem + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UIBarItem.h + + + + UILabel + UIView + + IBFrameworkSource + UIKit.framework/Headers/UILabel.h + + + + UIResponder + NSObject + + + + UISearchBar + UIView + + IBFrameworkSource + UIKit.framework/Headers/UISearchBar.h + + + + UISearchDisplayController + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UISearchDisplayController.h + + + + UIToolbar + UIView + + IBFrameworkSource + UIKit.framework/Headers/UIToolbar.h + + + + UIView + + IBFrameworkSource + UIKit.framework/Headers/UIPrintFormatter.h + + + + UIView + + IBFrameworkSource + UIKit.framework/Headers/UITextField.h + + + + UIView + UIResponder + + IBFrameworkSource + UIKit.framework/Headers/UIView.h + + + + UIViewController + + IBFrameworkSource + MediaPlayer.framework/Headers/MPMoviePlayerViewController.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UINavigationController.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UIPopoverController.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UISplitViewController.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UITabBarController.h + + + + UIViewController + UIResponder + + IBFrameworkSource + UIKit.framework/Headers/UIViewController.h + + + + UIWebView + UIView + + IBFrameworkSource + UIKit.framework/Headers/UIWebView.h + + + + + 0 + IBCocoaTouchFramework + + com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS + + + + com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS + + + + com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 + + + YES + + 3 + 141 + + diff --git a/cordova-lib/spec-plugman-create/plugins/ChildBrowser/src/ios/TargetDirTest.h b/cordova-lib/spec-plugman-create/plugins/ChildBrowser/src/ios/TargetDirTest.h new file mode 100644 index 000000000..60a1403a2 --- /dev/null +++ b/cordova-lib/spec-plugman-create/plugins/ChildBrowser/src/ios/TargetDirTest.h @@ -0,0 +1,20 @@ +/* + * + * Copyright 2013 Anis Kadri + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + + diff --git a/cordova-lib/spec-plugman-create/plugins/ChildBrowser/src/ios/TargetDirTest.m b/cordova-lib/spec-plugman-create/plugins/ChildBrowser/src/ios/TargetDirTest.m new file mode 100644 index 000000000..8d1c8b69c --- /dev/null +++ b/cordova-lib/spec-plugman-create/plugins/ChildBrowser/src/ios/TargetDirTest.m @@ -0,0 +1 @@ + diff --git a/cordova-lib/spec-plugman-create/plugins/ChildBrowser/src/ios/preserveDirs/PreserveDirsTest.h b/cordova-lib/spec-plugman-create/plugins/ChildBrowser/src/ios/preserveDirs/PreserveDirsTest.h new file mode 100644 index 000000000..60a1403a2 --- /dev/null +++ b/cordova-lib/spec-plugman-create/plugins/ChildBrowser/src/ios/preserveDirs/PreserveDirsTest.h @@ -0,0 +1,20 @@ +/* + * + * Copyright 2013 Anis Kadri + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + + diff --git a/cordova-lib/spec-plugman-create/plugins/ChildBrowser/src/ios/preserveDirs/PreserveDirsTest.m b/cordova-lib/spec-plugman-create/plugins/ChildBrowser/src/ios/preserveDirs/PreserveDirsTest.m new file mode 100644 index 000000000..8d1c8b69c --- /dev/null +++ b/cordova-lib/spec-plugman-create/plugins/ChildBrowser/src/ios/preserveDirs/PreserveDirsTest.m @@ -0,0 +1 @@ + diff --git a/cordova-lib/spec-plugman-create/plugins/ChildBrowser/www/childbrowser.js b/cordova-lib/spec-plugman-create/plugins/ChildBrowser/www/childbrowser.js new file mode 100644 index 000000000..5263b0c5d --- /dev/null +++ b/cordova-lib/spec-plugman-create/plugins/ChildBrowser/www/childbrowser.js @@ -0,0 +1,19 @@ +/* + * + * Copyright 2013 Anis Kadri + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + diff --git a/cordova-lib/spec-plugman-create/plugins/ChildBrowser/www/childbrowser/image.jpg b/cordova-lib/spec-plugman-create/plugins/ChildBrowser/www/childbrowser/image.jpg new file mode 100644 index 000000000..257cc5642 --- /dev/null +++ b/cordova-lib/spec-plugman-create/plugins/ChildBrowser/www/childbrowser/image.jpg @@ -0,0 +1 @@ +foo diff --git a/cordova-lib/spec-plugman-create/plugins/ChildBrowser/www/childbrowser_file.html b/cordova-lib/spec-plugman-create/plugins/ChildBrowser/www/childbrowser_file.html new file mode 100644 index 000000000..6de7b8c69 --- /dev/null +++ b/cordova-lib/spec-plugman-create/plugins/ChildBrowser/www/childbrowser_file.html @@ -0,0 +1 @@ +This is a test file. diff --git a/cordova-lib/spec-plugman-create/plugins/ConfigTestPlugin/plugin.xml b/cordova-lib/spec-plugman-create/plugins/ConfigTestPlugin/plugin.xml new file mode 100644 index 000000000..54b489573 --- /dev/null +++ b/cordova-lib/spec-plugman-create/plugins/ConfigTestPlugin/plugin.xml @@ -0,0 +1,37 @@ + + + + + + Does Code Fil Write Even Work? Hopefully the Tests Will Tell Us + + + + + + + + + + + diff --git a/cordova-lib/spec-plugman-create/plugins/Contacts/plugin.xml b/cordova-lib/spec-plugman-create/plugins/Contacts/plugin.xml new file mode 100644 index 000000000..622eb2a2f --- /dev/null +++ b/cordova-lib/spec-plugman-create/plugins/Contacts/plugin.xml @@ -0,0 +1,128 @@ + + + + Contacts + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + access_pimdomain_contacts + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cordova-lib/spec-plugman-create/plugins/Contacts/src/android/ContactAccessor.java b/cordova-lib/spec-plugman-create/plugins/Contacts/src/android/ContactAccessor.java new file mode 100644 index 000000000..24ef9c61d --- /dev/null +++ b/cordova-lib/spec-plugman-create/plugins/Contacts/src/android/ContactAccessor.java @@ -0,0 +1,198 @@ +/* + * Copyright (C) 2009 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.cordova.core; + +import java.util.HashMap; + +import android.util.Log; +import android.webkit.WebView; + +import org.apache.cordova.CordovaInterface; +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +/** + * This abstract class defines SDK-independent API for communication with + * Contacts Provider. The actual implementation used by the application depends + * on the level of API available on the device. If the API level is Cupcake or + * Donut, we want to use the {@link ContactAccessorSdk3_4} class. If it is + * Eclair or higher, we want to use {@link ContactAccessorSdk5}. + */ +public abstract class ContactAccessor { + + protected final String LOG_TAG = "ContactsAccessor"; + protected CordovaInterface mApp; + protected WebView mView; + + /** + * Check to see if the data associated with the key is required to + * be populated in the Contact object. + * @param key + * @param map created by running buildPopulationSet. + * @return true if the key data is required + */ + protected boolean isRequired(String key, HashMap map) { + Boolean retVal = map.get(key); + return (retVal == null) ? false : retVal.booleanValue(); + } + + /** + * Create a hash map of what data needs to be populated in the Contact object + * @param fields the list of fields to populate + * @return the hash map of required data + */ + protected HashMap buildPopulationSet(JSONArray fields) { + HashMap map = new HashMap(); + + String key; + try { + if (fields.length() == 1 && fields.getString(0).equals("*")) { + map.put("displayName", true); + map.put("name", true); + map.put("nickname", true); + map.put("phoneNumbers", true); + map.put("emails", true); + map.put("addresses", true); + map.put("ims", true); + map.put("organizations", true); + map.put("birthday", true); + map.put("note", true); + map.put("urls", true); + map.put("photos", true); + map.put("categories", true); + } + else { + for (int i=0; i + * This implementation has several advantages: + *
    + *
  • It sees contacts from multiple accounts. + *
  • It works with aggregated contacts. So for example, if the contact is the result + * of aggregation of two raw contacts from different accounts, it may return the name from + * one and the phone number from the other. + *
  • It is efficient because it uses the more efficient current API. + *
  • Not obvious in this particular example, but it has access to new kinds + * of data available exclusively through the new APIs. Exercise for the reader: add support + * for nickname (see {@link android.provider.ContactsContract.CommonDataKinds.Nickname}) or + * social status updates (see {@link android.provider.ContactsContract.StatusUpdates}). + *
+ */ + +public class ContactAccessorSdk5 extends ContactAccessor { + + /** + * Keep the photo size under the 1 MB blog limit. + */ + private static final long MAX_PHOTO_SIZE = 1048576; + + private static final String EMAIL_REGEXP = ".+@.+\\.+.+"; /* @.*/ + + /** + * A static map that converts the JavaScript property name to Android database column name. + */ + private static final Map dbMap = new HashMap(); + static { + dbMap.put("id", ContactsContract.Data.CONTACT_ID); + dbMap.put("displayName", ContactsContract.Contacts.DISPLAY_NAME); + dbMap.put("name", ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME); + dbMap.put("name.formatted", ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME); + dbMap.put("name.familyName", ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME); + dbMap.put("name.givenName", ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME); + dbMap.put("name.middleName", ContactsContract.CommonDataKinds.StructuredName.MIDDLE_NAME); + dbMap.put("name.honorificPrefix", ContactsContract.CommonDataKinds.StructuredName.PREFIX); + dbMap.put("name.honorificSuffix", ContactsContract.CommonDataKinds.StructuredName.SUFFIX); + dbMap.put("nickname", ContactsContract.CommonDataKinds.Nickname.NAME); + dbMap.put("phoneNumbers", ContactsContract.CommonDataKinds.Phone.NUMBER); + dbMap.put("phoneNumbers.value", ContactsContract.CommonDataKinds.Phone.NUMBER); + dbMap.put("emails", ContactsContract.CommonDataKinds.Email.DATA); + dbMap.put("emails.value", ContactsContract.CommonDataKinds.Email.DATA); + dbMap.put("addresses", ContactsContract.CommonDataKinds.StructuredPostal.FORMATTED_ADDRESS); + dbMap.put("addresses.formatted", ContactsContract.CommonDataKinds.StructuredPostal.FORMATTED_ADDRESS); + dbMap.put("addresses.streetAddress", ContactsContract.CommonDataKinds.StructuredPostal.STREET); + dbMap.put("addresses.locality", ContactsContract.CommonDataKinds.StructuredPostal.CITY); + dbMap.put("addresses.region", ContactsContract.CommonDataKinds.StructuredPostal.REGION); + dbMap.put("addresses.postalCode", ContactsContract.CommonDataKinds.StructuredPostal.POSTCODE); + dbMap.put("addresses.country", ContactsContract.CommonDataKinds.StructuredPostal.COUNTRY); + dbMap.put("ims", ContactsContract.CommonDataKinds.Im.DATA); + dbMap.put("ims.value", ContactsContract.CommonDataKinds.Im.DATA); + dbMap.put("organizations", ContactsContract.CommonDataKinds.Organization.COMPANY); + dbMap.put("organizations.name", ContactsContract.CommonDataKinds.Organization.COMPANY); + dbMap.put("organizations.department", ContactsContract.CommonDataKinds.Organization.DEPARTMENT); + dbMap.put("organizations.title", ContactsContract.CommonDataKinds.Organization.TITLE); + dbMap.put("birthday", ContactsContract.CommonDataKinds.Event.CONTENT_ITEM_TYPE); + dbMap.put("note", ContactsContract.CommonDataKinds.Note.NOTE); + dbMap.put("photos.value", ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE); + //dbMap.put("categories.value", null); + dbMap.put("urls", ContactsContract.CommonDataKinds.Website.URL); + dbMap.put("urls.value", ContactsContract.CommonDataKinds.Website.URL); + } + + /** + * Create an contact accessor. + */ + public ContactAccessorSdk5(WebView view, CordovaInterface context) { + mApp = context; + mView = view; + } + + /** + * This method takes the fields required and search options in order to produce an + * array of contacts that matches the criteria provided. + * @param fields an array of items to be used as search criteria + * @param options that can be applied to contact searching + * @return an array of contacts + */ + @Override + public JSONArray search(JSONArray fields, JSONObject options) { + // Get the find options + String searchTerm = ""; + int limit = Integer.MAX_VALUE; + boolean multiple = true; + + if (options != null) { + searchTerm = options.optString("filter"); + if (searchTerm.length() == 0) { + searchTerm = "%"; + } + else { + searchTerm = "%" + searchTerm + "%"; + } + + try { + multiple = options.getBoolean("multiple"); + if (!multiple) { + limit = 1; + } + } catch (JSONException e) { + // Multiple was not specified so we assume the default is true. + } + } + else { + searchTerm = "%"; + } + + + //Log.d(LOG_TAG, "Search Term = " + searchTerm); + //Log.d(LOG_TAG, "Field Length = " + fields.length()); + //Log.d(LOG_TAG, "Fields = " + fields.toString()); + + // Loop through the fields the user provided to see what data should be returned. + HashMap populate = buildPopulationSet(fields); + + // Build the ugly where clause and where arguments for one big query. + WhereOptions whereOptions = buildWhereClause(fields, searchTerm); + + // Get all the id's where the search term matches the fields passed in. + Cursor idCursor = mApp.getActivity().getContentResolver().query(ContactsContract.Data.CONTENT_URI, + new String[] { ContactsContract.Data.CONTACT_ID }, + whereOptions.getWhere(), + whereOptions.getWhereArgs(), + ContactsContract.Data.CONTACT_ID + " ASC"); + + // Create a set of unique ids + Set contactIds = new HashSet(); + int idColumn = -1; + while (idCursor.moveToNext()) { + if (idColumn < 0) { + idColumn = idCursor.getColumnIndex(ContactsContract.Data.CONTACT_ID); + } + contactIds.add(idCursor.getString(idColumn)); + } + idCursor.close(); + + // Build a query that only looks at ids + WhereOptions idOptions = buildIdClause(contactIds, searchTerm); + + // Determine which columns we should be fetching. + HashSet columnsToFetch = new HashSet(); + columnsToFetch.add(ContactsContract.Data.CONTACT_ID); + columnsToFetch.add(ContactsContract.Data.RAW_CONTACT_ID); + columnsToFetch.add(ContactsContract.Data.MIMETYPE); + + if (isRequired("displayName", populate)) { + columnsToFetch.add(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME); + } + if (isRequired("name", populate)) { + columnsToFetch.add(ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME); + columnsToFetch.add(ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME); + columnsToFetch.add(ContactsContract.CommonDataKinds.StructuredName.MIDDLE_NAME); + columnsToFetch.add(ContactsContract.CommonDataKinds.StructuredName.PREFIX); + columnsToFetch.add(ContactsContract.CommonDataKinds.StructuredName.SUFFIX); + } + if (isRequired("phoneNumbers", populate)) { + columnsToFetch.add(ContactsContract.CommonDataKinds.Phone._ID); + columnsToFetch.add(ContactsContract.CommonDataKinds.Phone.NUMBER); + columnsToFetch.add(ContactsContract.CommonDataKinds.Phone.TYPE); + } + if (isRequired("emails", populate)) { + columnsToFetch.add(ContactsContract.CommonDataKinds.Email._ID); + columnsToFetch.add(ContactsContract.CommonDataKinds.Email.DATA); + columnsToFetch.add(ContactsContract.CommonDataKinds.Email.TYPE); + } + if (isRequired("addresses", populate)) { + columnsToFetch.add(ContactsContract.CommonDataKinds.StructuredPostal._ID); + columnsToFetch.add(ContactsContract.CommonDataKinds.Organization.TYPE); + columnsToFetch.add(ContactsContract.CommonDataKinds.StructuredPostal.FORMATTED_ADDRESS); + columnsToFetch.add(ContactsContract.CommonDataKinds.StructuredPostal.STREET); + columnsToFetch.add(ContactsContract.CommonDataKinds.StructuredPostal.CITY); + columnsToFetch.add(ContactsContract.CommonDataKinds.StructuredPostal.REGION); + columnsToFetch.add(ContactsContract.CommonDataKinds.StructuredPostal.POSTCODE); + columnsToFetch.add(ContactsContract.CommonDataKinds.StructuredPostal.COUNTRY); + } + if (isRequired("organizations", populate)) { + columnsToFetch.add(ContactsContract.CommonDataKinds.Organization._ID); + columnsToFetch.add(ContactsContract.CommonDataKinds.Organization.TYPE); + columnsToFetch.add(ContactsContract.CommonDataKinds.Organization.DEPARTMENT); + columnsToFetch.add(ContactsContract.CommonDataKinds.Organization.COMPANY); + columnsToFetch.add(ContactsContract.CommonDataKinds.Organization.TITLE); + } + if (isRequired("ims", populate)) { + columnsToFetch.add(ContactsContract.CommonDataKinds.Im._ID); + columnsToFetch.add(ContactsContract.CommonDataKinds.Im.DATA); + columnsToFetch.add(ContactsContract.CommonDataKinds.Im.TYPE); + } + if (isRequired("note", populate)) { + columnsToFetch.add(ContactsContract.CommonDataKinds.Note.NOTE); + } + if (isRequired("nickname", populate)) { + columnsToFetch.add(ContactsContract.CommonDataKinds.Nickname.NAME); + } + if (isRequired("urls", populate)) { + columnsToFetch.add(ContactsContract.CommonDataKinds.Website._ID); + columnsToFetch.add(ContactsContract.CommonDataKinds.Website.URL); + columnsToFetch.add(ContactsContract.CommonDataKinds.Website.TYPE); + } + if (isRequired("birthday", populate)) { + columnsToFetch.add(ContactsContract.CommonDataKinds.Event.START_DATE); + columnsToFetch.add(ContactsContract.CommonDataKinds.Event.TYPE); + } + if (isRequired("photos", populate)) { + columnsToFetch.add(ContactsContract.CommonDataKinds.Photo._ID); + } + + // Do the id query + Cursor c = mApp.getActivity().getContentResolver().query(ContactsContract.Data.CONTENT_URI, + columnsToFetch.toArray(new String[] {}), + idOptions.getWhere(), + idOptions.getWhereArgs(), + ContactsContract.Data.CONTACT_ID + " ASC"); + + JSONArray contacts = populateContactArray(limit, populate, c); + return contacts; + } + + /** + * A special search that finds one contact by id + * + * @param id contact to find by id + * @return a JSONObject representing the contact + * @throws JSONException + */ + public JSONObject getContactById(String id) throws JSONException { + // Do the id query + Cursor c = mApp.getActivity().getContentResolver().query(ContactsContract.Data.CONTENT_URI, + null, + ContactsContract.Data.CONTACT_ID + " = ? ", + new String[] { id }, + ContactsContract.Data.CONTACT_ID + " ASC"); + + JSONArray fields = new JSONArray(); + fields.put("*"); + + HashMap populate = buildPopulationSet(fields); + + JSONArray contacts = populateContactArray(1, populate, c); + + if (contacts.length() == 1) { + return contacts.getJSONObject(0); + } else { + return null; + } + } + + /** + * Creates an array of contacts from the cursor you pass in + * + * @param limit max number of contacts for the array + * @param populate whether or not you should populate a certain value + * @param c the cursor + * @return a JSONArray of contacts + */ + private JSONArray populateContactArray(int limit, + HashMap populate, Cursor c) { + + String contactId = ""; + String rawId = ""; + String oldContactId = ""; + boolean newContact = true; + String mimetype = ""; + + JSONArray contacts = new JSONArray(); + JSONObject contact = new JSONObject(); + JSONArray organizations = new JSONArray(); + JSONArray addresses = new JSONArray(); + JSONArray phones = new JSONArray(); + JSONArray emails = new JSONArray(); + JSONArray ims = new JSONArray(); + JSONArray websites = new JSONArray(); + JSONArray photos = new JSONArray(); + + // Column indices + int colContactId = c.getColumnIndex(ContactsContract.Data.CONTACT_ID); + int colRawContactId = c.getColumnIndex(ContactsContract.Data.RAW_CONTACT_ID); + int colMimetype = c.getColumnIndex(ContactsContract.Data.MIMETYPE); + int colDisplayName = c.getColumnIndex(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME); + int colNote = c.getColumnIndex(ContactsContract.CommonDataKinds.Note.NOTE); + int colNickname = c.getColumnIndex(ContactsContract.CommonDataKinds.Nickname.NAME); + int colBirthday = c.getColumnIndex(ContactsContract.CommonDataKinds.Event.START_DATE); + int colEventType = c.getColumnIndex(ContactsContract.CommonDataKinds.Event.TYPE); + + if (c.getCount() > 0) { + while (c.moveToNext() && (contacts.length() <= (limit - 1))) { + try { + contactId = c.getString(colContactId); + rawId = c.getString(colRawContactId); + + // If we are in the first row set the oldContactId + if (c.getPosition() == 0) { + oldContactId = contactId; + } + + // When the contact ID changes we need to push the Contact object + // to the array of contacts and create new objects. + if (!oldContactId.equals(contactId)) { + // Populate the Contact object with it's arrays + // and push the contact into the contacts array + contacts.put(populateContact(contact, organizations, addresses, phones, + emails, ims, websites, photos)); + + // Clean up the objects + contact = new JSONObject(); + organizations = new JSONArray(); + addresses = new JSONArray(); + phones = new JSONArray(); + emails = new JSONArray(); + ims = new JSONArray(); + websites = new JSONArray(); + photos = new JSONArray(); + + // Set newContact to true as we are starting to populate a new contact + newContact = true; + } + + // When we detect a new contact set the ID and display name. + // These fields are available in every row in the result set returned. + if (newContact) { + newContact = false; + contact.put("id", contactId); + contact.put("rawId", rawId); + } + + // Grab the mimetype of the current row as it will be used in a lot of comparisons + mimetype = c.getString(colMimetype); + + if (mimetype.equals(ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE)) { + contact.put("displayName", c.getString(colDisplayName)); + } + + if (mimetype.equals(ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE) + && isRequired("name", populate)) { + contact.put("name", nameQuery(c)); + } + else if (mimetype.equals(ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE) + && isRequired("phoneNumbers", populate)) { + phones.put(phoneQuery(c)); + } + else if (mimetype.equals(ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE) + && isRequired("emails", populate)) { + emails.put(emailQuery(c)); + } + else if (mimetype.equals(ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_ITEM_TYPE) + && isRequired("addresses", populate)) { + addresses.put(addressQuery(c)); + } + else if (mimetype.equals(ContactsContract.CommonDataKinds.Organization.CONTENT_ITEM_TYPE) + && isRequired("organizations", populate)) { + organizations.put(organizationQuery(c)); + } + else if (mimetype.equals(ContactsContract.CommonDataKinds.Im.CONTENT_ITEM_TYPE) + && isRequired("ims", populate)) { + ims.put(imQuery(c)); + } + else if (mimetype.equals(ContactsContract.CommonDataKinds.Note.CONTENT_ITEM_TYPE) + && isRequired("note", populate)) { + contact.put("note", c.getString(colNote)); + } + else if (mimetype.equals(ContactsContract.CommonDataKinds.Nickname.CONTENT_ITEM_TYPE) + && isRequired("nickname", populate)) { + contact.put("nickname", c.getString(colNickname)); + } + else if (mimetype.equals(ContactsContract.CommonDataKinds.Website.CONTENT_ITEM_TYPE) + && isRequired("urls", populate)) { + websites.put(websiteQuery(c)); + } + else if (mimetype.equals(ContactsContract.CommonDataKinds.Event.CONTENT_ITEM_TYPE)) { + if (isRequired("birthday", populate) && + ContactsContract.CommonDataKinds.Event.TYPE_BIRTHDAY == c.getInt(colEventType)) { + contact.put("birthday", c.getString(colBirthday)); + } + } + else if (mimetype.equals(ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE) + && isRequired("photos", populate)) { + photos.put(photoQuery(c, contactId)); + } + } catch (JSONException e) { + Log.e(LOG_TAG, e.getMessage(), e); + } + + // Set the old contact ID + oldContactId = contactId; + + } + + // Push the last contact into the contacts array + if (contacts.length() < limit) { + contacts.put(populateContact(contact, organizations, addresses, phones, + emails, ims, websites, photos)); + } + } + c.close(); + return contacts; + } + + /** + * Builds a where clause all all the ids passed into the method + * @param contactIds a set of unique contact ids + * @param searchTerm what to search for + * @return an object containing the selection and selection args + */ + private WhereOptions buildIdClause(Set contactIds, String searchTerm) { + WhereOptions options = new WhereOptions(); + + // If the user is searching for every contact then short circuit the method + // and return a shorter where clause to be searched. + if (searchTerm.equals("%")) { + options.setWhere("(" + ContactsContract.Data.CONTACT_ID + " LIKE ? )"); + options.setWhereArgs(new String[] { searchTerm }); + return options; + } + + // This clause means that there are specific ID's to be populated + Iterator it = contactIds.iterator(); + StringBuffer buffer = new StringBuffer("("); + + while (it.hasNext()) { + buffer.append("'" + it.next() + "'"); + if (it.hasNext()) { + buffer.append(","); + } + } + buffer.append(")"); + + options.setWhere(ContactsContract.Data.CONTACT_ID + " IN " + buffer.toString()); + options.setWhereArgs(null); + + return options; + } + + /** + * Create a new contact using a JSONObject to hold all the data. + * @param contact + * @param organizations array of organizations + * @param addresses array of addresses + * @param phones array of phones + * @param emails array of emails + * @param ims array of instant messenger addresses + * @param websites array of websites + * @param photos + * @return + */ + private JSONObject populateContact(JSONObject contact, JSONArray organizations, + JSONArray addresses, JSONArray phones, JSONArray emails, + JSONArray ims, JSONArray websites, JSONArray photos) { + try { + // Only return the array if it has at least one entry + if (organizations.length() > 0) { + contact.put("organizations", organizations); + } + if (addresses.length() > 0) { + contact.put("addresses", addresses); + } + if (phones.length() > 0) { + contact.put("phoneNumbers", phones); + } + if (emails.length() > 0) { + contact.put("emails", emails); + } + if (ims.length() > 0) { + contact.put("ims", ims); + } + if (websites.length() > 0) { + contact.put("urls", websites); + } + if (photos.length() > 0) { + contact.put("photos", photos); + } + } catch (JSONException e) { + Log.e(LOG_TAG, e.getMessage(), e); + } + return contact; + } + + /** + * Take the search criteria passed into the method and create a SQL WHERE clause. + * @param fields the properties to search against + * @param searchTerm the string to search for + * @return an object containing the selection and selection args + */ + private WhereOptions buildWhereClause(JSONArray fields, String searchTerm) { + + ArrayList where = new ArrayList(); + ArrayList whereArgs = new ArrayList(); + + WhereOptions options = new WhereOptions(); + + /* + * Special case where the user wants all fields returned + */ + if (isWildCardSearch(fields)) { + // Get all contacts with all properties + if ("%".equals(searchTerm)) { + options.setWhere("(" + ContactsContract.Contacts.DISPLAY_NAME + " LIKE ? )"); + options.setWhereArgs(new String[] { searchTerm }); + return options; + } else { + // Get all contacts that match the filter but return all properties + where.add("(" + dbMap.get("displayName") + " LIKE ? )"); + whereArgs.add(searchTerm); + where.add("(" + dbMap.get("name") + " LIKE ? AND " + + ContactsContract.Data.MIMETYPE + " = ? )"); + whereArgs.add(searchTerm); + whereArgs.add(ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE); + where.add("(" + dbMap.get("nickname") + " LIKE ? AND " + + ContactsContract.Data.MIMETYPE + " = ? )"); + whereArgs.add(searchTerm); + whereArgs.add(ContactsContract.CommonDataKinds.Nickname.CONTENT_ITEM_TYPE); + where.add("(" + dbMap.get("phoneNumbers") + " LIKE ? AND " + + ContactsContract.Data.MIMETYPE + " = ? )"); + whereArgs.add(searchTerm); + whereArgs.add(ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE); + where.add("(" + dbMap.get("emails") + " LIKE ? AND " + + ContactsContract.Data.MIMETYPE + " = ? )"); + whereArgs.add(searchTerm); + whereArgs.add(ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE); + where.add("(" + dbMap.get("addresses") + " LIKE ? AND " + + ContactsContract.Data.MIMETYPE + " = ? )"); + whereArgs.add(searchTerm); + whereArgs.add(ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_ITEM_TYPE); + where.add("(" + dbMap.get("ims") + " LIKE ? AND " + + ContactsContract.Data.MIMETYPE + " = ? )"); + whereArgs.add(searchTerm); + whereArgs.add(ContactsContract.CommonDataKinds.Im.CONTENT_ITEM_TYPE); + where.add("(" + dbMap.get("organizations") + " LIKE ? AND " + + ContactsContract.Data.MIMETYPE + " = ? )"); + whereArgs.add(searchTerm); + whereArgs.add(ContactsContract.CommonDataKinds.Organization.CONTENT_ITEM_TYPE); + where.add("(" + dbMap.get("note") + " LIKE ? AND " + + ContactsContract.Data.MIMETYPE + " = ? )"); + whereArgs.add(searchTerm); + whereArgs.add(ContactsContract.CommonDataKinds.Note.CONTENT_ITEM_TYPE); + where.add("(" + dbMap.get("urls") + " LIKE ? AND " + + ContactsContract.Data.MIMETYPE + " = ? )"); + whereArgs.add(searchTerm); + whereArgs.add(ContactsContract.CommonDataKinds.Website.CONTENT_ITEM_TYPE); + } + } + + /* + * Special case for when the user wants all the contacts but + */ + if ("%".equals(searchTerm)) { + options.setWhere("(" + ContactsContract.Contacts.DISPLAY_NAME + " LIKE ? )"); + options.setWhereArgs(new String[] { searchTerm }); + return options; + } + + String key; + try { + //Log.d(LOG_TAG, "How many fields do we have = " + fields.length()); + for (int i = 0; i < fields.length(); i++) { + key = fields.getString(i); + + if (key.equals("id")) { + where.add("(" + dbMap.get(key) + " = ? )"); + whereArgs.add(searchTerm.substring(1, searchTerm.length() - 1)); + } + else if (key.startsWith("displayName")) { + where.add("(" + dbMap.get(key) + " LIKE ? )"); + whereArgs.add(searchTerm); + } + else if (key.startsWith("name")) { + where.add("(" + dbMap.get(key) + " LIKE ? AND " + + ContactsContract.Data.MIMETYPE + " = ? )"); + whereArgs.add(searchTerm); + whereArgs.add(ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE); + } + else if (key.startsWith("nickname")) { + where.add("(" + dbMap.get(key) + " LIKE ? AND " + + ContactsContract.Data.MIMETYPE + " = ? )"); + whereArgs.add(searchTerm); + whereArgs.add(ContactsContract.CommonDataKinds.Nickname.CONTENT_ITEM_TYPE); + } + else if (key.startsWith("phoneNumbers")) { + where.add("(" + dbMap.get(key) + " LIKE ? AND " + + ContactsContract.Data.MIMETYPE + " = ? )"); + whereArgs.add(searchTerm); + whereArgs.add(ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE); + } + else if (key.startsWith("emails")) { + where.add("(" + dbMap.get(key) + " LIKE ? AND " + + ContactsContract.Data.MIMETYPE + " = ? )"); + whereArgs.add(searchTerm); + whereArgs.add(ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE); + } + else if (key.startsWith("addresses")) { + where.add("(" + dbMap.get(key) + " LIKE ? AND " + + ContactsContract.Data.MIMETYPE + " = ? )"); + whereArgs.add(searchTerm); + whereArgs.add(ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_ITEM_TYPE); + } + else if (key.startsWith("ims")) { + where.add("(" + dbMap.get(key) + " LIKE ? AND " + + ContactsContract.Data.MIMETYPE + " = ? )"); + whereArgs.add(searchTerm); + whereArgs.add(ContactsContract.CommonDataKinds.Im.CONTENT_ITEM_TYPE); + } + else if (key.startsWith("organizations")) { + where.add("(" + dbMap.get(key) + " LIKE ? AND " + + ContactsContract.Data.MIMETYPE + " = ? )"); + whereArgs.add(searchTerm); + whereArgs.add(ContactsContract.CommonDataKinds.Organization.CONTENT_ITEM_TYPE); + } + // else if (key.startsWith("birthday")) { +// where.add("(" + dbMap.get(key) + " LIKE ? AND " +// + ContactsContract.Data.MIMETYPE + " = ? )"); +// } + else if (key.startsWith("note")) { + where.add("(" + dbMap.get(key) + " LIKE ? AND " + + ContactsContract.Data.MIMETYPE + " = ? )"); + whereArgs.add(searchTerm); + whereArgs.add(ContactsContract.CommonDataKinds.Note.CONTENT_ITEM_TYPE); + } + else if (key.startsWith("urls")) { + where.add("(" + dbMap.get(key) + " LIKE ? AND " + + ContactsContract.Data.MIMETYPE + " = ? )"); + whereArgs.add(searchTerm); + whereArgs.add(ContactsContract.CommonDataKinds.Website.CONTENT_ITEM_TYPE); + } + } + } catch (JSONException e) { + Log.e(LOG_TAG, e.getMessage(), e); + } + + // Creating the where string + StringBuffer selection = new StringBuffer(); + for (int i = 0; i < where.size(); i++) { + selection.append(where.get(i)); + if (i != (where.size() - 1)) { + selection.append(" OR "); + } + } + options.setWhere(selection.toString()); + + // Creating the where args array + String[] selectionArgs = new String[whereArgs.size()]; + for (int i = 0; i < whereArgs.size(); i++) { + selectionArgs[i] = whereArgs.get(i); + } + options.setWhereArgs(selectionArgs); + + return options; + } + + /** + * If the user passes in the '*' wildcard character for search then they want all fields for each contact + * + * @param fields + * @return true if wildcard search requested, false otherwise + */ + private boolean isWildCardSearch(JSONArray fields) { + // Only do a wildcard search if we are passed ["*"] + if (fields.length() == 1) { + try { + if ("*".equals(fields.getString(0))) { + return true; + } + } catch (JSONException e) { + return false; + } + } + return false; + } + + /** + * Create a ContactOrganization JSONObject + * @param cursor the current database row + * @return a JSONObject representing a ContactOrganization + */ + private JSONObject organizationQuery(Cursor cursor) { + JSONObject organization = new JSONObject(); + try { + organization.put("id", cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Organization._ID))); + organization.put("pref", false); // Android does not store pref attribute + organization.put("type", getOrgType(cursor.getInt(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Organization.TYPE)))); + organization.put("department", cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Organization.DEPARTMENT))); + organization.put("name", cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Organization.COMPANY))); + organization.put("title", cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Organization.TITLE))); + } catch (JSONException e) { + Log.e(LOG_TAG, e.getMessage(), e); + } + return organization; + } + + /** + * Create a ContactAddress JSONObject + * @param cursor the current database row + * @return a JSONObject representing a ContactAddress + */ + private JSONObject addressQuery(Cursor cursor) { + JSONObject address = new JSONObject(); + try { + address.put("id", cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal._ID))); + address.put("pref", false); // Android does not store pref attribute + address.put("type", getAddressType(cursor.getInt(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Organization.TYPE)))); + address.put("formatted", cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.FORMATTED_ADDRESS))); + address.put("streetAddress", cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.STREET))); + address.put("locality", cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.CITY))); + address.put("region", cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.REGION))); + address.put("postalCode", cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.POSTCODE))); + address.put("country", cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.COUNTRY))); + } catch (JSONException e) { + Log.e(LOG_TAG, e.getMessage(), e); + } + return address; + } + + /** + * Create a ContactName JSONObject + * @param cursor the current database row + * @return a JSONObject representing a ContactName + */ + private JSONObject nameQuery(Cursor cursor) { + JSONObject contactName = new JSONObject(); + try { + String familyName = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME)); + String givenName = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME)); + String middleName = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredName.MIDDLE_NAME)); + String honorificPrefix = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredName.PREFIX)); + String honorificSuffix = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredName.SUFFIX)); + + // Create the formatted name + StringBuffer formatted = new StringBuffer(""); + if (honorificPrefix != null) { + formatted.append(honorificPrefix + " "); + } + if (givenName != null) { + formatted.append(givenName + " "); + } + if (middleName != null) { + formatted.append(middleName + " "); + } + if (familyName != null) { + formatted.append(familyName); + } + if (honorificSuffix != null) { + formatted.append(" " + honorificSuffix); + } + + contactName.put("familyName", familyName); + contactName.put("givenName", givenName); + contactName.put("middleName", middleName); + contactName.put("honorificPrefix", honorificPrefix); + contactName.put("honorificSuffix", honorificSuffix); + contactName.put("formatted", formatted); + } catch (JSONException e) { + Log.e(LOG_TAG, e.getMessage(), e); + } + return contactName; + } + + /** + * Create a ContactField JSONObject + * @param cursor the current database row + * @return a JSONObject representing a ContactField + */ + private JSONObject phoneQuery(Cursor cursor) { + JSONObject phoneNumber = new JSONObject(); + try { + phoneNumber.put("id", cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone._ID))); + phoneNumber.put("pref", false); // Android does not store pref attribute + phoneNumber.put("value", cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER))); + phoneNumber.put("type", getPhoneType(cursor.getInt(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.TYPE)))); + } catch (JSONException e) { + Log.e(LOG_TAG, e.getMessage(), e); + } catch (Exception excp) { + Log.e(LOG_TAG, excp.getMessage(), excp); + } + return phoneNumber; + } + + /** + * Create a ContactField JSONObject + * @param cursor the current database row + * @return a JSONObject representing a ContactField + */ + private JSONObject emailQuery(Cursor cursor) { + JSONObject email = new JSONObject(); + try { + email.put("id", cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Email._ID))); + email.put("pref", false); // Android does not store pref attribute + email.put("value", cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA))); + email.put("type", getContactType(cursor.getInt(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Email.TYPE)))); + } catch (JSONException e) { + Log.e(LOG_TAG, e.getMessage(), e); + } + return email; + } + + /** + * Create a ContactField JSONObject + * @param cursor the current database row + * @return a JSONObject representing a ContactField + */ + private JSONObject imQuery(Cursor cursor) { + JSONObject im = new JSONObject(); + try { + im.put("id", cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Im._ID))); + im.put("pref", false); // Android does not store pref attribute + im.put("value", cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Im.DATA))); + im.put("type", getImType(cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Im.PROTOCOL)))); + } catch (JSONException e) { + Log.e(LOG_TAG, e.getMessage(), e); + } + return im; + } + + /** + * Create a ContactField JSONObject + * @param cursor the current database row + * @return a JSONObject representing a ContactField + */ + private JSONObject websiteQuery(Cursor cursor) { + JSONObject website = new JSONObject(); + try { + website.put("id", cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Website._ID))); + website.put("pref", false); // Android does not store pref attribute + website.put("value", cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Website.URL))); + website.put("type", getContactType(cursor.getInt(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Website.TYPE)))); + } catch (JSONException e) { + Log.e(LOG_TAG, e.getMessage(), e); + } + return website; + } + + /** + * Create a ContactField JSONObject + * @param contactId + * @return a JSONObject representing a ContactField + */ + private JSONObject photoQuery(Cursor cursor, String contactId) { + JSONObject photo = new JSONObject(); + try { + photo.put("id", cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Photo._ID))); + photo.put("pref", false); + photo.put("type", "url"); + Uri person = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, (new Long(contactId))); + Uri photoUri = Uri.withAppendedPath(person, ContactsContract.Contacts.Photo.CONTENT_DIRECTORY); + photo.put("value", photoUri.toString()); + } catch (JSONException e) { + Log.e(LOG_TAG, e.getMessage(), e); + } + return photo; + } + + @Override + /** + * This method will save a contact object into the devices contacts database. + * + * @param contact the contact to be saved. + * @returns the id if the contact is successfully saved, null otherwise. + */ + public String save(JSONObject contact) { + AccountManager mgr = AccountManager.get(mApp.getActivity()); + Account[] accounts = mgr.getAccounts(); + String accountName = null; + String accountType = null; + + if (accounts.length == 1) { + accountName = accounts[0].name; + accountType = accounts[0].type; + } + else if (accounts.length > 1) { + for (Account a : accounts) { + if (a.type.contains("eas") && a.name.matches(EMAIL_REGEXP)) /*Exchange ActiveSync*/{ + accountName = a.name; + accountType = a.type; + break; + } + } + if (accountName == null) { + for (Account a : accounts) { + if (a.type.contains("com.google") && a.name.matches(EMAIL_REGEXP)) /*Google sync provider*/{ + accountName = a.name; + accountType = a.type; + break; + } + } + } + if (accountName == null) { + for (Account a : accounts) { + if (a.name.matches(EMAIL_REGEXP)) /*Last resort, just look for an email address...*/{ + accountName = a.name; + accountType = a.type; + break; + } + } + } + } + + String id = getJsonString(contact, "id"); + if (id == null) { + // Create new contact + return createNewContact(contact, accountType, accountName); + } else { + // Modify existing contact + return modifyContact(id, contact, accountType, accountName); + } + } + + /** + * Creates a new contact and stores it in the database + * + * @param id the raw contact id which is required for linking items to the contact + * @param contact the contact to be saved + * @param account the account to be saved under + */ + private String modifyContact(String id, JSONObject contact, String accountType, String accountName) { + // Get the RAW_CONTACT_ID which is needed to insert new values in an already existing contact. + // But not needed to update existing values. + int rawId = (new Integer(getJsonString(contact, "rawId"))).intValue(); + + // Create a list of attributes to add to the contact database + ArrayList ops = new ArrayList(); + + //Add contact type + ops.add(ContentProviderOperation.newUpdate(ContactsContract.RawContacts.CONTENT_URI) + .withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, accountType) + .withValue(ContactsContract.RawContacts.ACCOUNT_NAME, accountName) + .build()); + + // Modify name + JSONObject name; + try { + String displayName = getJsonString(contact, "displayName"); + name = contact.getJSONObject("name"); + if (displayName != null || name != null) { + ContentProviderOperation.Builder builder = ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI) + .withSelection(ContactsContract.Data.CONTACT_ID + "=? AND " + + ContactsContract.Data.MIMETYPE + "=?", + new String[] { id, ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE }); + + if (displayName != null) { + builder.withValue(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME, displayName); + } + + String familyName = getJsonString(name, "familyName"); + if (familyName != null) { + builder.withValue(ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME, familyName); + } + String middleName = getJsonString(name, "middleName"); + if (middleName != null) { + builder.withValue(ContactsContract.CommonDataKinds.StructuredName.MIDDLE_NAME, middleName); + } + String givenName = getJsonString(name, "givenName"); + if (givenName != null) { + builder.withValue(ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME, givenName); + } + String honorificPrefix = getJsonString(name, "honorificPrefix"); + if (honorificPrefix != null) { + builder.withValue(ContactsContract.CommonDataKinds.StructuredName.PREFIX, honorificPrefix); + } + String honorificSuffix = getJsonString(name, "honorificSuffix"); + if (honorificSuffix != null) { + builder.withValue(ContactsContract.CommonDataKinds.StructuredName.SUFFIX, honorificSuffix); + } + + ops.add(builder.build()); + } + } catch (JSONException e1) { + Log.d(LOG_TAG, "Could not get name"); + } + + // Modify phone numbers + JSONArray phones = null; + try { + phones = contact.getJSONArray("phoneNumbers"); + if (phones != null) { + // Delete all the phones + if (phones.length() == 0) { + ops.add(ContentProviderOperation.newDelete(ContactsContract.Data.CONTENT_URI) + .withSelection(ContactsContract.Data.RAW_CONTACT_ID + "=? AND " + + ContactsContract.Data.MIMETYPE + "=?", + new String[] { "" + rawId, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE }) + .build()); + } + // Modify or add a phone + else { + for (int i = 0; i < phones.length(); i++) { + JSONObject phone = (JSONObject) phones.get(i); + String phoneId = getJsonString(phone, "id"); + // This is a new phone so do a DB insert + if (phoneId == null) { + ContentValues contentValues = new ContentValues(); + contentValues.put(ContactsContract.Data.RAW_CONTACT_ID, rawId); + contentValues.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE); + contentValues.put(ContactsContract.CommonDataKinds.Phone.NUMBER, getJsonString(phone, "value")); + contentValues.put(ContactsContract.CommonDataKinds.Phone.TYPE, getPhoneType(getJsonString(phone, "type"))); + + ops.add(ContentProviderOperation.newInsert( + ContactsContract.Data.CONTENT_URI).withValues(contentValues).build()); + } + // This is an existing phone so do a DB update + else { + ops.add(ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI) + .withSelection(ContactsContract.CommonDataKinds.Phone._ID + "=? AND " + + ContactsContract.Data.MIMETYPE + "=?", + new String[] { phoneId, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE }) + .withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, getJsonString(phone, "value")) + .withValue(ContactsContract.CommonDataKinds.Phone.TYPE, getPhoneType(getJsonString(phone, "type"))) + .build()); + } + } + } + } + } catch (JSONException e) { + Log.d(LOG_TAG, "Could not get phone numbers"); + } + + // Modify emails + JSONArray emails = null; + try { + emails = contact.getJSONArray("emails"); + if (emails != null) { + // Delete all the emails + if (emails.length() == 0) { + ops.add(ContentProviderOperation.newDelete(ContactsContract.Data.CONTENT_URI) + .withSelection(ContactsContract.Data.RAW_CONTACT_ID + "=? AND " + + ContactsContract.Data.MIMETYPE + "=?", + new String[] { "" + rawId, ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE }) + .build()); + } + // Modify or add a email + else { + for (int i = 0; i < emails.length(); i++) { + JSONObject email = (JSONObject) emails.get(i); + String emailId = getJsonString(email, "id"); + // This is a new email so do a DB insert + if (emailId == null) { + ContentValues contentValues = new ContentValues(); + contentValues.put(ContactsContract.Data.RAW_CONTACT_ID, rawId); + contentValues.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE); + contentValues.put(ContactsContract.CommonDataKinds.Email.DATA, getJsonString(email, "value")); + contentValues.put(ContactsContract.CommonDataKinds.Email.TYPE, getContactType(getJsonString(email, "type"))); + + ops.add(ContentProviderOperation.newInsert( + ContactsContract.Data.CONTENT_URI).withValues(contentValues).build()); + } + // This is an existing email so do a DB update + else { + String emailValue=getJsonString(email, "value"); + if(!emailValue.isEmpty()) { + ops.add(ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI) + .withSelection(ContactsContract.CommonDataKinds.Email._ID + "=? AND " + + ContactsContract.Data.MIMETYPE + "=?", + new String[] { emailId, ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE }) + .withValue(ContactsContract.CommonDataKinds.Email.DATA, getJsonString(email, "value")) + .withValue(ContactsContract.CommonDataKinds.Email.TYPE, getContactType(getJsonString(email, "type"))) + .build()); + } else { + ops.add(ContentProviderOperation.newDelete(ContactsContract.Data.CONTENT_URI) + .withSelection(ContactsContract.CommonDataKinds.Email._ID + "=? AND " + + ContactsContract.Data.MIMETYPE + "=?", + new String[] { emailId, ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE }) + .build()); + } + } + } + } + } + } catch (JSONException e) { + Log.d(LOG_TAG, "Could not get emails"); + } + + // Modify addresses + JSONArray addresses = null; + try { + addresses = contact.getJSONArray("addresses"); + if (addresses != null) { + // Delete all the addresses + if (addresses.length() == 0) { + ops.add(ContentProviderOperation.newDelete(ContactsContract.Data.CONTENT_URI) + .withSelection(ContactsContract.Data.RAW_CONTACT_ID + "=? AND " + + ContactsContract.Data.MIMETYPE + "=?", + new String[] { "" + rawId, ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_ITEM_TYPE }) + .build()); + } + // Modify or add a address + else { + for (int i = 0; i < addresses.length(); i++) { + JSONObject address = (JSONObject) addresses.get(i); + String addressId = getJsonString(address, "id"); + // This is a new address so do a DB insert + if (addressId == null) { + ContentValues contentValues = new ContentValues(); + contentValues.put(ContactsContract.Data.RAW_CONTACT_ID, rawId); + contentValues.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_ITEM_TYPE); + contentValues.put(ContactsContract.CommonDataKinds.StructuredPostal.TYPE, getAddressType(getJsonString(address, "type"))); + contentValues.put(ContactsContract.CommonDataKinds.StructuredPostal.FORMATTED_ADDRESS, getJsonString(address, "formatted")); + contentValues.put(ContactsContract.CommonDataKinds.StructuredPostal.STREET, getJsonString(address, "streetAddress")); + contentValues.put(ContactsContract.CommonDataKinds.StructuredPostal.CITY, getJsonString(address, "locality")); + contentValues.put(ContactsContract.CommonDataKinds.StructuredPostal.REGION, getJsonString(address, "region")); + contentValues.put(ContactsContract.CommonDataKinds.StructuredPostal.POSTCODE, getJsonString(address, "postalCode")); + contentValues.put(ContactsContract.CommonDataKinds.StructuredPostal.COUNTRY, getJsonString(address, "country")); + + ops.add(ContentProviderOperation.newInsert( + ContactsContract.Data.CONTENT_URI).withValues(contentValues).build()); + } + // This is an existing address so do a DB update + else { + ops.add(ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI) + .withSelection(ContactsContract.CommonDataKinds.StructuredPostal._ID + "=? AND " + + ContactsContract.Data.MIMETYPE + "=?", + new String[] { addressId, ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_ITEM_TYPE }) + .withValue(ContactsContract.CommonDataKinds.StructuredPostal.TYPE, getAddressType(getJsonString(address, "type"))) + .withValue(ContactsContract.CommonDataKinds.StructuredPostal.FORMATTED_ADDRESS, getJsonString(address, "formatted")) + .withValue(ContactsContract.CommonDataKinds.StructuredPostal.STREET, getJsonString(address, "streetAddress")) + .withValue(ContactsContract.CommonDataKinds.StructuredPostal.CITY, getJsonString(address, "locality")) + .withValue(ContactsContract.CommonDataKinds.StructuredPostal.REGION, getJsonString(address, "region")) + .withValue(ContactsContract.CommonDataKinds.StructuredPostal.POSTCODE, getJsonString(address, "postalCode")) + .withValue(ContactsContract.CommonDataKinds.StructuredPostal.COUNTRY, getJsonString(address, "country")) + .build()); + } + } + } + } + } catch (JSONException e) { + Log.d(LOG_TAG, "Could not get addresses"); + } + + // Modify organizations + JSONArray organizations = null; + try { + organizations = contact.getJSONArray("organizations"); + if (organizations != null) { + // Delete all the organizations + if (organizations.length() == 0) { + ops.add(ContentProviderOperation.newDelete(ContactsContract.Data.CONTENT_URI) + .withSelection(ContactsContract.Data.RAW_CONTACT_ID + "=? AND " + + ContactsContract.Data.MIMETYPE + "=?", + new String[] { "" + rawId, ContactsContract.CommonDataKinds.Organization.CONTENT_ITEM_TYPE }) + .build()); + } + // Modify or add a organization + else { + for (int i = 0; i < organizations.length(); i++) { + JSONObject org = (JSONObject) organizations.get(i); + String orgId = getJsonString(org, "id"); + // This is a new organization so do a DB insert + if (orgId == null) { + ContentValues contentValues = new ContentValues(); + contentValues.put(ContactsContract.Data.RAW_CONTACT_ID, rawId); + contentValues.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Organization.CONTENT_ITEM_TYPE); + contentValues.put(ContactsContract.CommonDataKinds.Organization.TYPE, getOrgType(getJsonString(org, "type"))); + contentValues.put(ContactsContract.CommonDataKinds.Organization.DEPARTMENT, getJsonString(org, "department")); + contentValues.put(ContactsContract.CommonDataKinds.Organization.COMPANY, getJsonString(org, "name")); + contentValues.put(ContactsContract.CommonDataKinds.Organization.TITLE, getJsonString(org, "title")); + + ops.add(ContentProviderOperation.newInsert( + ContactsContract.Data.CONTENT_URI).withValues(contentValues).build()); + } + // This is an existing organization so do a DB update + else { + ops.add(ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI) + .withSelection(ContactsContract.CommonDataKinds.Organization._ID + "=? AND " + + ContactsContract.Data.MIMETYPE + "=?", + new String[] { orgId, ContactsContract.CommonDataKinds.Organization.CONTENT_ITEM_TYPE }) + .withValue(ContactsContract.CommonDataKinds.Organization.TYPE, getOrgType(getJsonString(org, "type"))) + .withValue(ContactsContract.CommonDataKinds.Organization.DEPARTMENT, getJsonString(org, "department")) + .withValue(ContactsContract.CommonDataKinds.Organization.COMPANY, getJsonString(org, "name")) + .withValue(ContactsContract.CommonDataKinds.Organization.TITLE, getJsonString(org, "title")) + .build()); + } + } + } + } + } catch (JSONException e) { + Log.d(LOG_TAG, "Could not get organizations"); + } + + // Modify IMs + JSONArray ims = null; + try { + ims = contact.getJSONArray("ims"); + if (ims != null) { + // Delete all the ims + if (ims.length() == 0) { + ops.add(ContentProviderOperation.newDelete(ContactsContract.Data.CONTENT_URI) + .withSelection(ContactsContract.Data.RAW_CONTACT_ID + "=? AND " + + ContactsContract.Data.MIMETYPE + "=?", + new String[] { "" + rawId, ContactsContract.CommonDataKinds.Im.CONTENT_ITEM_TYPE }) + .build()); + } + // Modify or add a im + else { + for (int i = 0; i < ims.length(); i++) { + JSONObject im = (JSONObject) ims.get(i); + String imId = getJsonString(im, "id"); + // This is a new IM so do a DB insert + if (imId == null) { + ContentValues contentValues = new ContentValues(); + contentValues.put(ContactsContract.Data.RAW_CONTACT_ID, rawId); + contentValues.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Im.CONTENT_ITEM_TYPE); + contentValues.put(ContactsContract.CommonDataKinds.Im.DATA, getJsonString(im, "value")); + contentValues.put(ContactsContract.CommonDataKinds.Im.TYPE, getImType(getJsonString(im, "type"))); + + ops.add(ContentProviderOperation.newInsert( + ContactsContract.Data.CONTENT_URI).withValues(contentValues).build()); + } + // This is an existing IM so do a DB update + else { + ops.add(ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI) + .withSelection(ContactsContract.CommonDataKinds.Im._ID + "=? AND " + + ContactsContract.Data.MIMETYPE + "=?", + new String[] { imId, ContactsContract.CommonDataKinds.Im.CONTENT_ITEM_TYPE }) + .withValue(ContactsContract.CommonDataKinds.Im.DATA, getJsonString(im, "value")) + .withValue(ContactsContract.CommonDataKinds.Im.TYPE, getContactType(getJsonString(im, "type"))) + .build()); + } + } + } + } + } catch (JSONException e) { + Log.d(LOG_TAG, "Could not get emails"); + } + + // Modify note + String note = getJsonString(contact, "note"); + ops.add(ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI) + .withSelection(ContactsContract.Data.CONTACT_ID + "=? AND " + + ContactsContract.Data.MIMETYPE + "=?", + new String[] { id, ContactsContract.CommonDataKinds.Note.CONTENT_ITEM_TYPE }) + .withValue(ContactsContract.CommonDataKinds.Note.NOTE, note) + .build()); + + // Modify nickname + String nickname = getJsonString(contact, "nickname"); + if (nickname != null) { + ops.add(ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI) + .withSelection(ContactsContract.Data.CONTACT_ID + "=? AND " + + ContactsContract.Data.MIMETYPE + "=?", + new String[] { id, ContactsContract.CommonDataKinds.Nickname.CONTENT_ITEM_TYPE }) + .withValue(ContactsContract.CommonDataKinds.Nickname.NAME, nickname) + .build()); + } + + // Modify urls + JSONArray websites = null; + try { + websites = contact.getJSONArray("urls"); + if (websites != null) { + // Delete all the websites + if (websites.length() == 0) { + Log.d(LOG_TAG, "This means we should be deleting all the phone numbers."); + ops.add(ContentProviderOperation.newDelete(ContactsContract.Data.CONTENT_URI) + .withSelection(ContactsContract.Data.RAW_CONTACT_ID + "=? AND " + + ContactsContract.Data.MIMETYPE + "=?", + new String[] { "" + rawId, ContactsContract.CommonDataKinds.Website.CONTENT_ITEM_TYPE }) + .build()); + } + // Modify or add a website + else { + for (int i = 0; i < websites.length(); i++) { + JSONObject website = (JSONObject) websites.get(i); + String websiteId = getJsonString(website, "id"); + // This is a new website so do a DB insert + if (websiteId == null) { + ContentValues contentValues = new ContentValues(); + contentValues.put(ContactsContract.Data.RAW_CONTACT_ID, rawId); + contentValues.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Website.CONTENT_ITEM_TYPE); + contentValues.put(ContactsContract.CommonDataKinds.Website.DATA, getJsonString(website, "value")); + contentValues.put(ContactsContract.CommonDataKinds.Website.TYPE, getContactType(getJsonString(website, "type"))); + + ops.add(ContentProviderOperation.newInsert( + ContactsContract.Data.CONTENT_URI).withValues(contentValues).build()); + } + // This is an existing website so do a DB update + else { + ops.add(ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI) + .withSelection(ContactsContract.CommonDataKinds.Website._ID + "=? AND " + + ContactsContract.Data.MIMETYPE + "=?", + new String[] { websiteId, ContactsContract.CommonDataKinds.Website.CONTENT_ITEM_TYPE }) + .withValue(ContactsContract.CommonDataKinds.Website.DATA, getJsonString(website, "value")) + .withValue(ContactsContract.CommonDataKinds.Website.TYPE, getContactType(getJsonString(website, "type"))) + .build()); + } + } + } + } + } catch (JSONException e) { + Log.d(LOG_TAG, "Could not get websites"); + } + + // Modify birthday + String birthday = getJsonString(contact, "birthday"); + if (birthday != null) { + ops.add(ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI) + .withSelection(ContactsContract.Data.CONTACT_ID + "=? AND " + + ContactsContract.Data.MIMETYPE + "=? AND " + + ContactsContract.CommonDataKinds.Event.TYPE + "=?", + new String[] { id, ContactsContract.CommonDataKinds.Event.CONTENT_ITEM_TYPE, new String("" + ContactsContract.CommonDataKinds.Event.TYPE_BIRTHDAY) }) + .withValue(ContactsContract.CommonDataKinds.Event.TYPE, ContactsContract.CommonDataKinds.Event.TYPE_BIRTHDAY) + .withValue(ContactsContract.CommonDataKinds.Event.START_DATE, birthday) + .build()); + } + + // Modify photos + JSONArray photos = null; + try { + photos = contact.getJSONArray("photos"); + if (photos != null) { + // Delete all the photos + if (photos.length() == 0) { + ops.add(ContentProviderOperation.newDelete(ContactsContract.Data.CONTENT_URI) + .withSelection(ContactsContract.Data.RAW_CONTACT_ID + "=? AND " + + ContactsContract.Data.MIMETYPE + "=?", + new String[] { "" + rawId, ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE }) + .build()); + } + // Modify or add a photo + else { + for (int i = 0; i < photos.length(); i++) { + JSONObject photo = (JSONObject) photos.get(i); + String photoId = getJsonString(photo, "id"); + byte[] bytes = getPhotoBytes(getJsonString(photo, "value")); + // This is a new photo so do a DB insert + if (photoId == null) { + ContentValues contentValues = new ContentValues(); + contentValues.put(ContactsContract.Data.RAW_CONTACT_ID, rawId); + contentValues.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE); + contentValues.put(ContactsContract.Data.IS_SUPER_PRIMARY, 1); + contentValues.put(ContactsContract.CommonDataKinds.Photo.PHOTO, bytes); + + ops.add(ContentProviderOperation.newInsert( + ContactsContract.Data.CONTENT_URI).withValues(contentValues).build()); + } + // This is an existing photo so do a DB update + else { + ops.add(ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI) + .withSelection(ContactsContract.CommonDataKinds.Photo._ID + "=? AND " + + ContactsContract.Data.MIMETYPE + "=?", + new String[] { photoId, ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE }) + .withValue(ContactsContract.Data.IS_SUPER_PRIMARY, 1) + .withValue(ContactsContract.CommonDataKinds.Photo.PHOTO, bytes) + .build()); + } + } + } + } + } catch (JSONException e) { + Log.d(LOG_TAG, "Could not get photos"); + } + + boolean retVal = true; + + //Modify contact + try { + mApp.getActivity().getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops); + } catch (RemoteException e) { + Log.e(LOG_TAG, e.getMessage(), e); + Log.e(LOG_TAG, Log.getStackTraceString(e), e); + retVal = false; + } catch (OperationApplicationException e) { + Log.e(LOG_TAG, e.getMessage(), e); + Log.e(LOG_TAG, Log.getStackTraceString(e), e); + retVal = false; + } + + // if the save was a success return the contact ID + if (retVal) { + return id; + } else { + return null; + } + } + + /** + * Add a website to a list of database actions to be performed + * + * @param ops the list of database actions + * @param website the item to be inserted + */ + private void insertWebsite(ArrayList ops, + JSONObject website) { + ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI) + .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0) + .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Website.CONTENT_ITEM_TYPE) + .withValue(ContactsContract.CommonDataKinds.Website.DATA, getJsonString(website, "value")) + .withValue(ContactsContract.CommonDataKinds.Website.TYPE, getContactType(getJsonString(website, "type"))) + .build()); + } + + /** + * Add an im to a list of database actions to be performed + * + * @param ops the list of database actions + * @param im the item to be inserted + */ + private void insertIm(ArrayList ops, JSONObject im) { + ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI) + .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0) + .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Im.CONTENT_ITEM_TYPE) + .withValue(ContactsContract.CommonDataKinds.Im.DATA, getJsonString(im, "value")) + .withValue(ContactsContract.CommonDataKinds.Im.TYPE, getImType(getJsonString(im, "type"))) + .build()); + } + + /** + * Add an organization to a list of database actions to be performed + * + * @param ops the list of database actions + * @param org the item to be inserted + */ + private void insertOrganization(ArrayList ops, + JSONObject org) { + ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI) + .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0) + .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Organization.CONTENT_ITEM_TYPE) + .withValue(ContactsContract.CommonDataKinds.Organization.TYPE, getOrgType(getJsonString(org, "type"))) + .withValue(ContactsContract.CommonDataKinds.Organization.DEPARTMENT, getJsonString(org, "department")) + .withValue(ContactsContract.CommonDataKinds.Organization.COMPANY, getJsonString(org, "name")) + .withValue(ContactsContract.CommonDataKinds.Organization.TITLE, getJsonString(org, "title")) + .build()); + } + + /** + * Add an address to a list of database actions to be performed + * + * @param ops the list of database actions + * @param address the item to be inserted + */ + private void insertAddress(ArrayList ops, + JSONObject address) { + ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI) + .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0) + .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_ITEM_TYPE) + .withValue(ContactsContract.CommonDataKinds.StructuredPostal.TYPE, getAddressType(getJsonString(address, "type"))) + .withValue(ContactsContract.CommonDataKinds.StructuredPostal.FORMATTED_ADDRESS, getJsonString(address, "formatted")) + .withValue(ContactsContract.CommonDataKinds.StructuredPostal.STREET, getJsonString(address, "streetAddress")) + .withValue(ContactsContract.CommonDataKinds.StructuredPostal.CITY, getJsonString(address, "locality")) + .withValue(ContactsContract.CommonDataKinds.StructuredPostal.REGION, getJsonString(address, "region")) + .withValue(ContactsContract.CommonDataKinds.StructuredPostal.POSTCODE, getJsonString(address, "postalCode")) + .withValue(ContactsContract.CommonDataKinds.StructuredPostal.COUNTRY, getJsonString(address, "country")) + .build()); + } + + /** + * Add an email to a list of database actions to be performed + * + * @param ops the list of database actions + * @param email the item to be inserted + */ + private void insertEmail(ArrayList ops, + JSONObject email) { + ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI) + .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0) + .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE) + .withValue(ContactsContract.CommonDataKinds.Email.DATA, getJsonString(email, "value")) + .withValue(ContactsContract.CommonDataKinds.Email.TYPE, getContactType(getJsonString(email, "type"))) + .build()); + } + + /** + * Add a phone to a list of database actions to be performed + * + * @param ops the list of database actions + * @param phone the item to be inserted + */ + private void insertPhone(ArrayList ops, + JSONObject phone) { + ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI) + .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0) + .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE) + .withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, getJsonString(phone, "value")) + .withValue(ContactsContract.CommonDataKinds.Phone.TYPE, getPhoneType(getJsonString(phone, "type"))) + .build()); + } + + /** + * Add a phone to a list of database actions to be performed + * + * @param ops the list of database actions + * @param phone the item to be inserted + */ + private void insertPhoto(ArrayList ops, + JSONObject photo) { + byte[] bytes = getPhotoBytes(getJsonString(photo, "value")); + ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI) + .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0) + .withValue(ContactsContract.Data.IS_SUPER_PRIMARY, 1) + .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE) + .withValue(ContactsContract.CommonDataKinds.Photo.PHOTO, bytes) + .build()); + } + + /** + * Gets the raw bytes from the supplied filename + * + * @param filename the file to read the bytes from + * @return a byte array + * @throws IOException + */ + private byte[] getPhotoBytes(String filename) { + ByteArrayOutputStream buffer = new ByteArrayOutputStream(); + try { + int bytesRead = 0; + long totalBytesRead = 0; + byte[] data = new byte[8192]; + InputStream in = getPathFromUri(filename); + + while ((bytesRead = in.read(data, 0, data.length)) != -1 && totalBytesRead <= MAX_PHOTO_SIZE) { + buffer.write(data, 0, bytesRead); + totalBytesRead += bytesRead; + } + + in.close(); + buffer.flush(); + } catch (FileNotFoundException e) { + Log.e(LOG_TAG, e.getMessage(), e); + } catch (IOException e) { + Log.e(LOG_TAG, e.getMessage(), e); + } + return buffer.toByteArray(); + } + + /** + * Get an input stream based on file path or uri content://, http://, file:// + * + * @param path + * @return an input stream + * @throws IOException + */ + private InputStream getPathFromUri(String path) throws IOException { + if (path.startsWith("content:")) { + Uri uri = Uri.parse(path); + return mApp.getActivity().getContentResolver().openInputStream(uri); + } + if (path.startsWith("http:") || path.startsWith("https:") || path.startsWith("file:")) { + URL url = new URL(path); + return url.openStream(); + } + else { + return new FileInputStream(path); + } + } + + /** + * Creates a new contact and stores it in the database + * + * @param contact the contact to be saved + * @param account the account to be saved under + */ + private String createNewContact(JSONObject contact, String accountType, String accountName) { + // Create a list of attributes to add to the contact database + ArrayList ops = new ArrayList(); + + //Add contact type + ops.add(ContentProviderOperation.newInsert(ContactsContract.RawContacts.CONTENT_URI) + .withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, accountType) + .withValue(ContactsContract.RawContacts.ACCOUNT_NAME, accountName) + .build()); + + // Add name + try { + JSONObject name = contact.optJSONObject("name"); + String displayName = contact.getString("displayName"); + if (displayName != null || name != null) { + ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI) + .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0) + .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE) + .withValue(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME, displayName) + .withValue(ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME, getJsonString(name, "familyName")) + .withValue(ContactsContract.CommonDataKinds.StructuredName.MIDDLE_NAME, getJsonString(name, "middleName")) + .withValue(ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME, getJsonString(name, "givenName")) + .withValue(ContactsContract.CommonDataKinds.StructuredName.PREFIX, getJsonString(name, "honorificPrefix")) + .withValue(ContactsContract.CommonDataKinds.StructuredName.SUFFIX, getJsonString(name, "honorificSuffix")) + .build()); + } + } catch (JSONException e) { + Log.d(LOG_TAG, "Could not get name object"); + } + + //Add phone numbers + JSONArray phones = null; + try { + phones = contact.getJSONArray("phoneNumbers"); + if (phones != null) { + for (int i = 0; i < phones.length(); i++) { + JSONObject phone = (JSONObject) phones.get(i); + insertPhone(ops, phone); + } + } + } catch (JSONException e) { + Log.d(LOG_TAG, "Could not get phone numbers"); + } + + // Add emails + JSONArray emails = null; + try { + emails = contact.getJSONArray("emails"); + if (emails != null) { + for (int i = 0; i < emails.length(); i++) { + JSONObject email = (JSONObject) emails.get(i); + insertEmail(ops, email); + } + } + } catch (JSONException e) { + Log.d(LOG_TAG, "Could not get emails"); + } + + // Add addresses + JSONArray addresses = null; + try { + addresses = contact.getJSONArray("addresses"); + if (addresses != null) { + for (int i = 0; i < addresses.length(); i++) { + JSONObject address = (JSONObject) addresses.get(i); + insertAddress(ops, address); + } + } + } catch (JSONException e) { + Log.d(LOG_TAG, "Could not get addresses"); + } + + // Add organizations + JSONArray organizations = null; + try { + organizations = contact.getJSONArray("organizations"); + if (organizations != null) { + for (int i = 0; i < organizations.length(); i++) { + JSONObject org = (JSONObject) organizations.get(i); + insertOrganization(ops, org); + } + } + } catch (JSONException e) { + Log.d(LOG_TAG, "Could not get organizations"); + } + + // Add IMs + JSONArray ims = null; + try { + ims = contact.getJSONArray("ims"); + if (ims != null) { + for (int i = 0; i < ims.length(); i++) { + JSONObject im = (JSONObject) ims.get(i); + insertIm(ops, im); + } + } + } catch (JSONException e) { + Log.d(LOG_TAG, "Could not get emails"); + } + + // Add note + String note = getJsonString(contact, "note"); + if (note != null) { + ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI) + .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0) + .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Note.CONTENT_ITEM_TYPE) + .withValue(ContactsContract.CommonDataKinds.Note.NOTE, note) + .build()); + } + + // Add nickname + String nickname = getJsonString(contact, "nickname"); + if (nickname != null) { + ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI) + .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0) + .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Nickname.CONTENT_ITEM_TYPE) + .withValue(ContactsContract.CommonDataKinds.Nickname.NAME, nickname) + .build()); + } + + // Add urls + JSONArray websites = null; + try { + websites = contact.getJSONArray("urls"); + if (websites != null) { + for (int i = 0; i < websites.length(); i++) { + JSONObject website = (JSONObject) websites.get(i); + insertWebsite(ops, website); + } + } + } catch (JSONException e) { + Log.d(LOG_TAG, "Could not get websites"); + } + + // Add birthday + String birthday = getJsonString(contact, "birthday"); + if (birthday != null) { + ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI) + .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0) + .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Event.CONTENT_ITEM_TYPE) + .withValue(ContactsContract.CommonDataKinds.Event.TYPE, ContactsContract.CommonDataKinds.Event.TYPE_BIRTHDAY) + .withValue(ContactsContract.CommonDataKinds.Event.START_DATE, birthday) + .build()); + } + + // Add photos + JSONArray photos = null; + try { + photos = contact.getJSONArray("photos"); + if (photos != null) { + for (int i = 0; i < photos.length(); i++) { + JSONObject photo = (JSONObject) photos.get(i); + insertPhoto(ops, photo); + } + } + } catch (JSONException e) { + Log.d(LOG_TAG, "Could not get photos"); + } + + String newId = null; + //Add contact + try { + ContentProviderResult[] cpResults = mApp.getActivity().getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops); + if (cpResults.length >= 0) { + newId = cpResults[0].uri.getLastPathSegment(); + } + } catch (RemoteException e) { + Log.e(LOG_TAG, e.getMessage(), e); + } catch (OperationApplicationException e) { + Log.e(LOG_TAG, e.getMessage(), e); + } + return newId; + } + + @Override + /** + * This method will remove a Contact from the database based on ID. + * @param id the unique ID of the contact to remove + */ + public boolean remove(String id) { + int result = 0; + Cursor cursor = mApp.getActivity().getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, + null, + ContactsContract.Contacts._ID + " = ?", + new String[] { id }, null); + if (cursor.getCount() == 1) { + cursor.moveToFirst(); + String lookupKey = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.LOOKUP_KEY)); + Uri uri = Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_LOOKUP_URI, lookupKey); + result = mApp.getActivity().getContentResolver().delete(uri, null, null); + } else { + Log.d(LOG_TAG, "Could not find contact with ID"); + } + + return (result > 0) ? true : false; + } + + /************************************************************************** + * + * All methods below this comment are used to convert from JavaScript + * text types to Android integer types and vice versa. + * + *************************************************************************/ + + /** + * Converts a string from the W3C Contact API to it's Android int value. + * @param string + * @return Android int value + */ + private int getPhoneType(String string) { + int type = ContactsContract.CommonDataKinds.Phone.TYPE_OTHER; + if (string != null) { + if ("home".equals(string.toLowerCase())) { + return ContactsContract.CommonDataKinds.Phone.TYPE_HOME; + } + else if ("mobile".equals(string.toLowerCase())) { + return ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE; + } + else if ("work".equals(string.toLowerCase())) { + return ContactsContract.CommonDataKinds.Phone.TYPE_WORK; + } + else if ("work fax".equals(string.toLowerCase())) { + return ContactsContract.CommonDataKinds.Phone.TYPE_FAX_WORK; + } + else if ("home fax".equals(string.toLowerCase())) { + return ContactsContract.CommonDataKinds.Phone.TYPE_FAX_HOME; + } + else if ("fax".equals(string.toLowerCase())) { + return ContactsContract.CommonDataKinds.Phone.TYPE_FAX_WORK; + } + else if ("pager".equals(string.toLowerCase())) { + return ContactsContract.CommonDataKinds.Phone.TYPE_PAGER; + } + else if ("other".equals(string.toLowerCase())) { + return ContactsContract.CommonDataKinds.Phone.TYPE_OTHER; + } + else if ("car".equals(string.toLowerCase())) { + return ContactsContract.CommonDataKinds.Phone.TYPE_CAR; + } + else if ("company main".equals(string.toLowerCase())) { + return ContactsContract.CommonDataKinds.Phone.TYPE_COMPANY_MAIN; + } + else if ("isdn".equals(string.toLowerCase())) { + return ContactsContract.CommonDataKinds.Phone.TYPE_ISDN; + } + else if ("main".equals(string.toLowerCase())) { + return ContactsContract.CommonDataKinds.Phone.TYPE_MAIN; + } + else if ("other fax".equals(string.toLowerCase())) { + return ContactsContract.CommonDataKinds.Phone.TYPE_OTHER_FAX; + } + else if ("radio".equals(string.toLowerCase())) { + return ContactsContract.CommonDataKinds.Phone.TYPE_RADIO; + } + else if ("telex".equals(string.toLowerCase())) { + return ContactsContract.CommonDataKinds.Phone.TYPE_TELEX; + } + else if ("work mobile".equals(string.toLowerCase())) { + return ContactsContract.CommonDataKinds.Phone.TYPE_WORK_MOBILE; + } + else if ("work pager".equals(string.toLowerCase())) { + return ContactsContract.CommonDataKinds.Phone.TYPE_WORK_PAGER; + } + else if ("assistant".equals(string.toLowerCase())) { + return ContactsContract.CommonDataKinds.Phone.TYPE_ASSISTANT; + } + else if ("mms".equals(string.toLowerCase())) { + return ContactsContract.CommonDataKinds.Phone.TYPE_MMS; + } + else if ("callback".equals(string.toLowerCase())) { + return ContactsContract.CommonDataKinds.Phone.TYPE_CALLBACK; + } + else if ("tty ttd".equals(string.toLowerCase())) { + return ContactsContract.CommonDataKinds.Phone.TYPE_TTY_TDD; + } + else if ("custom".equals(string.toLowerCase())) { + return ContactsContract.CommonDataKinds.Phone.TYPE_CUSTOM; + } + } + return type; + } + + /** + * getPhoneType converts an Android phone type into a string + * @param type + * @return phone type as string. + */ + private String getPhoneType(int type) { + String stringType; + switch (type) { + case ContactsContract.CommonDataKinds.Phone.TYPE_CUSTOM: + stringType = "custom"; + break; + case ContactsContract.CommonDataKinds.Phone.TYPE_FAX_HOME: + stringType = "home fax"; + break; + case ContactsContract.CommonDataKinds.Phone.TYPE_FAX_WORK: + stringType = "work fax"; + break; + case ContactsContract.CommonDataKinds.Phone.TYPE_HOME: + stringType = "home"; + break; + case ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE: + stringType = "mobile"; + break; + case ContactsContract.CommonDataKinds.Phone.TYPE_PAGER: + stringType = "pager"; + break; + case ContactsContract.CommonDataKinds.Phone.TYPE_WORK: + stringType = "work"; + break; + case ContactsContract.CommonDataKinds.Phone.TYPE_CALLBACK: + stringType = "callback"; + break; + case ContactsContract.CommonDataKinds.Phone.TYPE_CAR: + stringType = "car"; + break; + case ContactsContract.CommonDataKinds.Phone.TYPE_COMPANY_MAIN: + stringType = "company main"; + break; + case ContactsContract.CommonDataKinds.Phone.TYPE_OTHER_FAX: + stringType = "other fax"; + break; + case ContactsContract.CommonDataKinds.Phone.TYPE_RADIO: + stringType = "radio"; + break; + case ContactsContract.CommonDataKinds.Phone.TYPE_TELEX: + stringType = "telex"; + break; + case ContactsContract.CommonDataKinds.Phone.TYPE_TTY_TDD: + stringType = "tty tdd"; + break; + case ContactsContract.CommonDataKinds.Phone.TYPE_WORK_MOBILE: + stringType = "work mobile"; + break; + case ContactsContract.CommonDataKinds.Phone.TYPE_WORK_PAGER: + stringType = "work pager"; + break; + case ContactsContract.CommonDataKinds.Phone.TYPE_ASSISTANT: + stringType = "assistant"; + break; + case ContactsContract.CommonDataKinds.Phone.TYPE_MMS: + stringType = "mms"; + break; + case ContactsContract.CommonDataKinds.Phone.TYPE_ISDN: + stringType = "isdn"; + break; + case ContactsContract.CommonDataKinds.Phone.TYPE_OTHER: + default: + stringType = "other"; + break; + } + return stringType; + } + + /** + * Converts a string from the W3C Contact API to it's Android int value. + * @param string + * @return Android int value + */ + private int getContactType(String string) { + int type = ContactsContract.CommonDataKinds.Email.TYPE_OTHER; + if (string != null) { + if ("home".equals(string.toLowerCase())) { + return ContactsContract.CommonDataKinds.Email.TYPE_HOME; + } + else if ("work".equals(string.toLowerCase())) { + return ContactsContract.CommonDataKinds.Email.TYPE_WORK; + } + else if ("other".equals(string.toLowerCase())) { + return ContactsContract.CommonDataKinds.Email.TYPE_OTHER; + } + else if ("mobile".equals(string.toLowerCase())) { + return ContactsContract.CommonDataKinds.Email.TYPE_MOBILE; + } + else if ("custom".equals(string.toLowerCase())) { + return ContactsContract.CommonDataKinds.Email.TYPE_CUSTOM; + } + } + return type; + } + + /** + * getPhoneType converts an Android phone type into a string + * @param type + * @return phone type as string. + */ + private String getContactType(int type) { + String stringType; + switch (type) { + case ContactsContract.CommonDataKinds.Email.TYPE_CUSTOM: + stringType = "custom"; + break; + case ContactsContract.CommonDataKinds.Email.TYPE_HOME: + stringType = "home"; + break; + case ContactsContract.CommonDataKinds.Email.TYPE_WORK: + stringType = "work"; + break; + case ContactsContract.CommonDataKinds.Email.TYPE_MOBILE: + stringType = "mobile"; + break; + case ContactsContract.CommonDataKinds.Email.TYPE_OTHER: + default: + stringType = "other"; + break; + } + return stringType; + } + + /** + * Converts a string from the W3C Contact API to it's Android int value. + * @param string + * @return Android int value + */ + private int getOrgType(String string) { + int type = ContactsContract.CommonDataKinds.Organization.TYPE_OTHER; + if (string != null) { + if ("work".equals(string.toLowerCase())) { + return ContactsContract.CommonDataKinds.Organization.TYPE_WORK; + } + else if ("other".equals(string.toLowerCase())) { + return ContactsContract.CommonDataKinds.Organization.TYPE_OTHER; + } + else if ("custom".equals(string.toLowerCase())) { + return ContactsContract.CommonDataKinds.Organization.TYPE_CUSTOM; + } + } + return type; + } + + /** + * getPhoneType converts an Android phone type into a string + * @param type + * @return phone type as string. + */ + private String getOrgType(int type) { + String stringType; + switch (type) { + case ContactsContract.CommonDataKinds.Organization.TYPE_CUSTOM: + stringType = "custom"; + break; + case ContactsContract.CommonDataKinds.Organization.TYPE_WORK: + stringType = "work"; + break; + case ContactsContract.CommonDataKinds.Organization.TYPE_OTHER: + default: + stringType = "other"; + break; + } + return stringType; + } + + /** + * Converts a string from the W3C Contact API to it's Android int value. + * @param string + * @return Android int value + */ + private int getAddressType(String string) { + int type = ContactsContract.CommonDataKinds.StructuredPostal.TYPE_OTHER; + if (string != null) { + if ("work".equals(string.toLowerCase())) { + return ContactsContract.CommonDataKinds.StructuredPostal.TYPE_WORK; + } + else if ("other".equals(string.toLowerCase())) { + return ContactsContract.CommonDataKinds.StructuredPostal.TYPE_OTHER; + } + else if ("home".equals(string.toLowerCase())) { + return ContactsContract.CommonDataKinds.StructuredPostal.TYPE_HOME; + } + } + return type; + } + + /** + * getPhoneType converts an Android phone type into a string + * @param type + * @return phone type as string. + */ + private String getAddressType(int type) { + String stringType; + switch (type) { + case ContactsContract.CommonDataKinds.StructuredPostal.TYPE_HOME: + stringType = "home"; + break; + case ContactsContract.CommonDataKinds.StructuredPostal.TYPE_WORK: + stringType = "work"; + break; + case ContactsContract.CommonDataKinds.StructuredPostal.TYPE_OTHER: + default: + stringType = "other"; + break; + } + return stringType; + } + + /** + * Converts a string from the W3C Contact API to it's Android int value. + * @param string + * @return Android int value + */ + private int getImType(String string) { + int type = ContactsContract.CommonDataKinds.Im.PROTOCOL_CUSTOM; + if (string != null) { + if ("aim".equals(string.toLowerCase())) { + return ContactsContract.CommonDataKinds.Im.PROTOCOL_AIM; + } + else if ("google talk".equals(string.toLowerCase())) { + return ContactsContract.CommonDataKinds.Im.PROTOCOL_GOOGLE_TALK; + } + else if ("icq".equals(string.toLowerCase())) { + return ContactsContract.CommonDataKinds.Im.PROTOCOL_ICQ; + } + else if ("jabber".equals(string.toLowerCase())) { + return ContactsContract.CommonDataKinds.Im.PROTOCOL_JABBER; + } + else if ("msn".equals(string.toLowerCase())) { + return ContactsContract.CommonDataKinds.Im.PROTOCOL_MSN; + } + else if ("netmeeting".equals(string.toLowerCase())) { + return ContactsContract.CommonDataKinds.Im.PROTOCOL_NETMEETING; + } + else if ("qq".equals(string.toLowerCase())) { + return ContactsContract.CommonDataKinds.Im.PROTOCOL_QQ; + } + else if ("skype".equals(string.toLowerCase())) { + return ContactsContract.CommonDataKinds.Im.PROTOCOL_SKYPE; + } + else if ("yahoo".equals(string.toLowerCase())) { + return ContactsContract.CommonDataKinds.Im.PROTOCOL_YAHOO; + } + } + return type; + } + + /** + * getPhoneType converts an Android phone type into a string + * @param type + * @return phone type as string. + */ + @SuppressWarnings("unused") + private String getImType(int type) { + String stringType; + switch (type) { + case ContactsContract.CommonDataKinds.Im.PROTOCOL_AIM: + stringType = "AIM"; + break; + case ContactsContract.CommonDataKinds.Im.PROTOCOL_GOOGLE_TALK: + stringType = "Google Talk"; + break; + case ContactsContract.CommonDataKinds.Im.PROTOCOL_ICQ: + stringType = "ICQ"; + break; + case ContactsContract.CommonDataKinds.Im.PROTOCOL_JABBER: + stringType = "Jabber"; + break; + case ContactsContract.CommonDataKinds.Im.PROTOCOL_MSN: + stringType = "MSN"; + break; + case ContactsContract.CommonDataKinds.Im.PROTOCOL_NETMEETING: + stringType = "NetMeeting"; + break; + case ContactsContract.CommonDataKinds.Im.PROTOCOL_QQ: + stringType = "QQ"; + break; + case ContactsContract.CommonDataKinds.Im.PROTOCOL_SKYPE: + stringType = "Skype"; + break; + case ContactsContract.CommonDataKinds.Im.PROTOCOL_YAHOO: + stringType = "Yahoo"; + break; + default: + stringType = "custom"; + break; + } + return stringType; + } +} + diff --git a/cordova-lib/spec-plugman-create/plugins/Contacts/src/android/ContactManager.java b/cordova-lib/spec-plugman-create/plugins/Contacts/src/android/ContactManager.java new file mode 100755 index 000000000..1c086e1f3 --- /dev/null +++ b/cordova-lib/spec-plugman-create/plugins/Contacts/src/android/ContactManager.java @@ -0,0 +1,122 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ +package org.apache.cordova.core; + +import org.apache.cordova.CallbackContext; +import org.apache.cordova.CordovaPlugin; +import org.apache.cordova.PluginResult; +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; +import android.util.Log; + +public class ContactManager extends CordovaPlugin { + + private ContactAccessor contactAccessor; + private static final String LOG_TAG = "Contact Query"; + + public static final int UNKNOWN_ERROR = 0; + public static final int INVALID_ARGUMENT_ERROR = 1; + public static final int TIMEOUT_ERROR = 2; + public static final int PENDING_OPERATION_ERROR = 3; + public static final int IO_ERROR = 4; + public static final int NOT_SUPPORTED_ERROR = 5; + public static final int PERMISSION_DENIED_ERROR = 20; + + /** + * Constructor. + */ + public ContactManager() { + } + + /** + * Executes the request and returns PluginResult. + * + * @param action The action to execute. + * @param args JSONArray of arguments for the plugin. + * @param callbackContext The callback context used when calling back into JavaScript. + * @return True if the action was valid, false otherwise. + */ + public boolean execute(String action, JSONArray args, final CallbackContext callbackContext) throws JSONException { + /** + * Check to see if we are on an Android 1.X device. If we are return an error as we + * do not support this as of Cordova 1.0. + */ + if (android.os.Build.VERSION.RELEASE.startsWith("1.")) { + callbackContext.sendPluginResult(new PluginResult(PluginResult.Status.ERROR, ContactManager.NOT_SUPPORTED_ERROR)); + return true; + } + + /** + * Only create the contactAccessor after we check the Android version or the program will crash + * older phones. + */ + if (this.contactAccessor == null) { + this.contactAccessor = new ContactAccessorSdk5(this.webView, this.cordova); + } + + if (action.equals("search")) { + final JSONArray filter = args.getJSONArray(0); + final JSONObject options = args.getJSONObject(1); + this.cordova.getThreadPool().execute(new Runnable() { + public void run() { + JSONArray res = contactAccessor.search(filter, options); + callbackContext.success(res); + } + }); + } + else if (action.equals("save")) { + final JSONObject contact = args.getJSONObject(0); + this.cordova.getThreadPool().execute(new Runnable() { + public void run() { + JSONObject res = null; + String id = contactAccessor.save(contact); + if (id != null) { + try { + res = contactAccessor.getContactById(id); + } catch (JSONException e) { + Log.e(LOG_TAG, "JSON fail.", e); + } + } + if (res != null) { + callbackContext.success(res); + } else { + callbackContext.sendPluginResult(new PluginResult(PluginResult.Status.ERROR, UNKNOWN_ERROR)); + } + } + }); + } + else if (action.equals("remove")) { + final String contactId = args.getString(0); + this.cordova.getThreadPool().execute(new Runnable() { + public void run() { + if (contactAccessor.remove(contactId)) { + callbackContext.success(); + } else { + callbackContext.sendPluginResult(new PluginResult(PluginResult.Status.ERROR, UNKNOWN_ERROR)); + } + } + }); + } + else { + return false; + } + return true; + } +} diff --git a/cordova-lib/spec-plugman-create/plugins/Contacts/src/blackberry10/ContactActivity.js b/cordova-lib/spec-plugman-create/plugins/Contacts/src/blackberry10/ContactActivity.js new file mode 100644 index 000000000..f0f82b362 --- /dev/null +++ b/cordova-lib/spec-plugman-create/plugins/Contacts/src/blackberry10/ContactActivity.js @@ -0,0 +1,26 @@ +/* + * Copyright 2012 Research In Motion Limited. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +var ContactActivity = function (args) { + this.direction = args.direction || null; + this.description = args.description || ""; + this.mimeType = args.mimeType || ""; + this.timestamp = new Date(parseInt(args.timestamp, 10)) || null; +}; + +Object.defineProperty(ContactActivity, "INCOMING", {"value": true}); +Object.defineProperty(ContactActivity, "OUTGOING", {"value": false}); + +module.exports = ContactActivity; diff --git a/cordova-lib/spec-plugman-create/plugins/Contacts/src/blackberry10/ContactAddress.js b/cordova-lib/spec-plugman-create/plugins/Contacts/src/blackberry10/ContactAddress.js new file mode 100644 index 000000000..1ba9fe40a --- /dev/null +++ b/cordova-lib/spec-plugman-create/plugins/Contacts/src/blackberry10/ContactAddress.js @@ -0,0 +1,30 @@ +/* + * Copyright 2012 Research In Motion Limited. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +var ContactAddress = function (properties) { + this.type = properties && properties.type ? properties.type : ""; + this.streetAddress = properties && properties.streetAddress ? properties.streetAddress : ""; + this.streetOther = properties && properties.streetOther ? properties.streetOther : ""; + this.locality = properties && properties.locality ? properties.locality : ""; + this.region = properties && properties.region ? properties.region : ""; + this.postalCode = properties && properties.postalCode ? properties.postalCode : ""; + this.country = properties && properties.country ? properties.country : ""; +}; + +Object.defineProperty(ContactAddress, "HOME", {"value": "home"}); +Object.defineProperty(ContactAddress, "WORK", {"value": "work"}); +Object.defineProperty(ContactAddress, "OTHER", {"value": "other"}); + +module.exports = ContactAddress; diff --git a/cordova-lib/spec-plugman-create/plugins/Contacts/src/blackberry10/ContactError.js b/cordova-lib/spec-plugman-create/plugins/Contacts/src/blackberry10/ContactError.js new file mode 100644 index 000000000..f20f85e45 --- /dev/null +++ b/cordova-lib/spec-plugman-create/plugins/Contacts/src/blackberry10/ContactError.js @@ -0,0 +1,30 @@ +/* + * Copyright 2012 Research In Motion Limited. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +var ContactError = function (code, msg) { + this.code = code; + this.message = msg; +}; + +Object.defineProperty(ContactError, "UNKNOWN_ERROR", { "value": 0 }); +Object.defineProperty(ContactError, "INVALID_ARGUMENT_ERROR", { "value": 1 }); +Object.defineProperty(ContactError, "TIMEOUT_ERROR", { "value": 2 }); +Object.defineProperty(ContactError, "PENDING_OPERATION_ERROR", { "value": 3 }); +Object.defineProperty(ContactError, "IO_ERROR", { "value": 4 }); +Object.defineProperty(ContactError, "NOT_SUPPORTED_ERROR", { "value": 5 }); +Object.defineProperty(ContactError, "PERMISSION_DENIED_ERROR", { "value": 20 }); + +module.exports = ContactError; + diff --git a/cordova-lib/spec-plugman-create/plugins/Contacts/src/blackberry10/ContactField.js b/cordova-lib/spec-plugman-create/plugins/Contacts/src/blackberry10/ContactField.js new file mode 100644 index 000000000..aad735c14 --- /dev/null +++ b/cordova-lib/spec-plugman-create/plugins/Contacts/src/blackberry10/ContactField.js @@ -0,0 +1,27 @@ +/* + * Copyright 2012 Research In Motion Limited. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +var ContactField = function (type, value) { + this.type = type || ""; + this.value = value || ""; +}; + +Object.defineProperty(ContactField, "HOME", {"value": "home"}); +Object.defineProperty(ContactField, "WORK", {"value": "work"}); +Object.defineProperty(ContactField, "OTHER", {"value": "other"}); +Object.defineProperty(ContactField, "MOBILE", {"value": "mobile"}); +Object.defineProperty(ContactField, "DIRECT", {"value": "direct"}); + +module.exports = ContactField; diff --git a/cordova-lib/spec-plugman-create/plugins/Contacts/src/blackberry10/ContactFindOptions.js b/cordova-lib/spec-plugman-create/plugins/Contacts/src/blackberry10/ContactFindOptions.js new file mode 100644 index 000000000..8be830ddf --- /dev/null +++ b/cordova-lib/spec-plugman-create/plugins/Contacts/src/blackberry10/ContactFindOptions.js @@ -0,0 +1,50 @@ +/* + * Copyright 2012 Research In Motion Limited. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * ContactFindOptions. + * @constructor + * @param filter search fields + * @param sort sort fields and order + * @param limit max number of contacts to return + * @param favorite if set, only favorite contacts will be returned + */ + +var ContactFindOptions = function (filter, sort, limit, favorite) { + this.filter = filter || null; + this.sort = sort || null; + this.limit = limit || -1; // -1 for returning all results + this.favorite = favorite || false; + this.includeAccounts = []; + this.excludeAccounts = []; +}; + +Object.defineProperty(ContactFindOptions, "SEARCH_FIELD_GIVEN_NAME", { "value": 0 }); +Object.defineProperty(ContactFindOptions, "SEARCH_FIELD_FAMILY_NAME", { "value": 1 }); +Object.defineProperty(ContactFindOptions, "SEARCH_FIELD_ORGANIZATION_NAME", { "value": 2 }); +Object.defineProperty(ContactFindOptions, "SEARCH_FIELD_PHONE", { "value": 3 }); +Object.defineProperty(ContactFindOptions, "SEARCH_FIELD_EMAIL", { "value": 4 }); +Object.defineProperty(ContactFindOptions, "SEARCH_FIELD_BBMPIN", { "value": 5 }); +Object.defineProperty(ContactFindOptions, "SEARCH_FIELD_LINKEDIN", { "value": 6 }); +Object.defineProperty(ContactFindOptions, "SEARCH_FIELD_TWITTER", { "value": 7 }); +Object.defineProperty(ContactFindOptions, "SEARCH_FIELD_VIDEO_CHAT", { "value": 8 }); + +Object.defineProperty(ContactFindOptions, "SORT_FIELD_GIVEN_NAME", { "value": 0 }); +Object.defineProperty(ContactFindOptions, "SORT_FIELD_FAMILY_NAME", { "value": 1 }); +Object.defineProperty(ContactFindOptions, "SORT_FIELD_ORGANIZATION_NAME", { "value": 2 }); + +module.exports = ContactFindOptions; + diff --git a/cordova-lib/spec-plugman-create/plugins/Contacts/src/blackberry10/ContactName.js b/cordova-lib/spec-plugman-create/plugins/Contacts/src/blackberry10/ContactName.js new file mode 100644 index 000000000..9b7475347 --- /dev/null +++ b/cordova-lib/spec-plugman-create/plugins/Contacts/src/blackberry10/ContactName.js @@ -0,0 +1,39 @@ +/* + * Copyright 2012 Research In Motion Limited. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +function toFormattedName(properties) { + var formatted = ""; + if (properties && properties.givenName) { + formatted = properties.givenName; + if (properties && properties.familyName) { + formatted += " " + properties.familyName; + } + } + return formatted; +} + +var ContactName = function (properties) { + this.familyName = properties && properties.familyName ? properties.familyName : ""; + this.givenName = properties && properties.givenName ? properties.givenName : ""; + this.formatted = toFormattedName(properties); + this.middleName = properties && properties.middleName ? properties.middleName : ""; + this.honorificPrefix = properties && properties.honorificPrefix ? properties.honorificPrefix : ""; + this.honorificSuffix = properties && properties.honorificSuffix ? properties.honorificSuffix : ""; + this.phoneticFamilyName = properties && properties.phoneticFamilyName ? properties.phoneticFamilyName : ""; + this.phoneticGivenName = properties && properties.phoneticGivenName ? properties.phoneticGivenName : ""; +}; + +module.exports = ContactName; diff --git a/cordova-lib/spec-plugman-create/plugins/Contacts/src/blackberry10/ContactNews.js b/cordova-lib/spec-plugman-create/plugins/Contacts/src/blackberry10/ContactNews.js new file mode 100644 index 000000000..9fb86dcda --- /dev/null +++ b/cordova-lib/spec-plugman-create/plugins/Contacts/src/blackberry10/ContactNews.js @@ -0,0 +1,26 @@ +/* + * Copyright 2012 Research In Motion Limited. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +var ContactNews = function (args) { + this.title = args.title || ""; + this.body = args.body || ""; + this.articleSource = args.articleSource || ""; + this.companies = args.companies || []; + this.publishedAt = new Date(parseInt(args.publishedAt, 10)) || null; + this.uri = args.uri || ""; + this.type = args.type || ""; +}; + +module.exports = ContactNews; diff --git a/cordova-lib/spec-plugman-create/plugins/Contacts/src/blackberry10/ContactOrganization.js b/cordova-lib/spec-plugman-create/plugins/Contacts/src/blackberry10/ContactOrganization.js new file mode 100644 index 000000000..987310f7c --- /dev/null +++ b/cordova-lib/spec-plugman-create/plugins/Contacts/src/blackberry10/ContactOrganization.js @@ -0,0 +1,22 @@ +/* + * Copyright 2012 Research In Motion Limited. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +var ContactOrganization = function (properties) { + this.name = properties && properties.name ? properties.name : ""; + this.department = properties && properties.department ? properties.department : ""; + this.title = properties && properties.title ? properties.title : ""; +}; + +module.exports = ContactOrganization; diff --git a/cordova-lib/spec-plugman-create/plugins/Contacts/src/blackberry10/ContactPhoto.js b/cordova-lib/spec-plugman-create/plugins/Contacts/src/blackberry10/ContactPhoto.js new file mode 100644 index 000000000..eeaa2632e --- /dev/null +++ b/cordova-lib/spec-plugman-create/plugins/Contacts/src/blackberry10/ContactPhoto.js @@ -0,0 +1,23 @@ +/* + * Copyright 2012 Research In Motion Limited. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +var ContactPhoto = function (originalFilePath, pref) { + this.originalFilePath = originalFilePath || ""; + this.pref = pref || false; + this.largeFilePath = ""; + this.smallFilePath = ""; +}; + +module.exports = ContactPhoto; diff --git a/cordova-lib/spec-plugman-create/plugins/Contacts/src/blackberry10/contactConsts.js b/cordova-lib/spec-plugman-create/plugins/Contacts/src/blackberry10/contactConsts.js new file mode 100644 index 000000000..ef2520620 --- /dev/null +++ b/cordova-lib/spec-plugman-create/plugins/Contacts/src/blackberry10/contactConsts.js @@ -0,0 +1,225 @@ +/* +* Copyright 2012 Research In Motion Limited. +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + +var ATTRIBUTE_KIND, + ATTRIBUTE_SUBKIND, + kindAttributeMap = {}, + subKindAttributeMap = {}, + _TITLE = 26, + _START_DATE = 43, + _END_DATE = 44; + +function populateKindAttributeMap() { + ATTRIBUTE_KIND = { + Invalid: 0, + Phone: 1, + Fax: 2, + Pager: 3, + Email: 4, + Website: 5, + Feed: 6, + Profile: 7, + Family: 8, + Person: 9, + Date: 10, + Group: 11, + Name: 12, + StockSymbol: 13, + Ranking: 14, + OrganizationAffiliation: 15, + Education: 16, + Note: 17, + InstantMessaging: 18, + VideoChat: 19, + ConnectionCount: 20, + Hidden: 21, + Biography: 22, + Sound: 23, + Notification: 24, + MessageSound: 25, + MessageNotification: 26 + }; + + kindAttributeMap[ATTRIBUTE_KIND.Phone] = "phoneNumbers"; + kindAttributeMap[ATTRIBUTE_KIND.Fax] = "faxNumbers"; + kindAttributeMap[ATTRIBUTE_KIND.Pager] = "pagerNumber"; + kindAttributeMap[ATTRIBUTE_KIND.Email] = "emails"; + kindAttributeMap[ATTRIBUTE_KIND.Website] = "urls"; + kindAttributeMap[ATTRIBUTE_KIND.Profile] = "socialNetworks"; + kindAttributeMap[ATTRIBUTE_KIND.OrganizationAffiliation] = "organizations"; + kindAttributeMap[ATTRIBUTE_KIND.Education] = "education"; + kindAttributeMap[ATTRIBUTE_KIND.Note] = "note"; + kindAttributeMap[ATTRIBUTE_KIND.InstantMessaging] = "ims"; + kindAttributeMap[ATTRIBUTE_KIND.VideoChat] = "videoChat"; + kindAttributeMap[ATTRIBUTE_KIND.Sound] = "ringtone"; +} + +function populateSubKindAttributeMap() { + ATTRIBUTE_SUBKIND = { + Invalid: 0, + Other: 1, + Home: 2, + Work: 3, + PhoneMobile: 4, + FaxDirect: 5, + Blog: 6, + WebsiteResume: 7, + WebsitePortfolio: 8, + WebsitePersonal: 9, + WebsiteCompany: 10, + ProfileFacebook: 11, + ProfileTwitter: 12, + ProfileLinkedIn: 13, + ProfileGist: 14, + ProfileTungle: 15, + FamilySpouse: 16, + FamilyChild: 17, + FamilyParent: 18, + PersonManager: 19, + PersonAssistant: 20, + DateBirthday: 21, + DateAnniversary: 22, + GroupDepartment: 23, + NameGiven: 24, + NameSurname: 25, + Title: _TITLE, + NameSuffix: 27, + NameMiddle: 28, + NameNickname: 29, + NameAlias: 30, + NameDisplayName: 31, + NamePhoneticGiven: 32, + NamePhoneticSurname: 33, + StockSymbolNyse: 34, + StockSymbolNasdaq: 35, + StockSymbolTse: 36, + StockSymbolLse: 37, + StockSymbolTsx: 38, + RankingKlout: 39, + RankingTrstRank: 40, + OrganizationAffiliationName: 41, + OrganizationAffiliationPhoneticName: 42, + OrganizationAffiliationTitle: _TITLE, + StartDate: _START_DATE, + EndDate: _END_DATE, + OrganizationAffiliationDetails: 45, + EducationInstitutionName: 46, + EducationStartDate: _START_DATE, + EducationEndDate: _END_DATE, + EducationDegree: 47, + EducationConcentration: 48, + EducationActivities: 49, + EducationNotes: 50, + InstantMessagingBbmPin: 51, + InstantMessagingAim: 52, + InstantMessagingAliwangwang: 53, + InstantMessagingGoogleTalk: 54, + InstantMessagingSametime: 55, + InstantMessagingIcq: 56, + InstantMessagingIrc: 57, + InstantMessagingJabber: 58, + InstantMessagingMsLcs: 59, + InstantMessagingMsn: 60, + InstantMessagingQq: 61, + InstantMessagingSkype: 62, + InstantMessagingYahooMessenger: 63, + InstantMessagingYahooMessengerJapan: 64, + VideoChatBbPlaybook: 65, + HiddenLinkedIn: 66, + HiddenFacebook: 67, + HiddenTwitter: 68, + ConnectionCountLinkedIn: 69, + ConnectionCountFacebook: 70, + ConnectionCountTwitter: 71, + HiddenChecksum: 72, + HiddenSpeedDial: 73, + BiographyFacebook: 74, + BiographyTwitter: 75, + BiographyLinkedIn: 76, + SoundRingtone: 77, + SimContactType: 78, + EcoID: 79, + Personal: 80, + StockSymbolAll: 81, + NotificationVibration: 82, + NotificationLED: 83, + MessageNotificationVibration: 84, + MessageNotificationLED: 85, + MessageNotificationDuringCall: 86, + VideoChatPin: 87 + }; + + subKindAttributeMap[ATTRIBUTE_SUBKIND.Other] = "other"; + subKindAttributeMap[ATTRIBUTE_SUBKIND.Home] = "home"; + subKindAttributeMap[ATTRIBUTE_SUBKIND.Work] = "work"; + subKindAttributeMap[ATTRIBUTE_SUBKIND.PhoneMobile] = "mobile"; + subKindAttributeMap[ATTRIBUTE_SUBKIND.FaxDirect] = "direct"; + subKindAttributeMap[ATTRIBUTE_SUBKIND.Blog] = "blog"; + subKindAttributeMap[ATTRIBUTE_SUBKIND.WebsiteResume] = "resume"; + subKindAttributeMap[ATTRIBUTE_SUBKIND.WebsitePortfolio] = "portfolio"; + subKindAttributeMap[ATTRIBUTE_SUBKIND.WebsitePersonal] = "personal"; + subKindAttributeMap[ATTRIBUTE_SUBKIND.WebsiteCompany] = "company"; + subKindAttributeMap[ATTRIBUTE_SUBKIND.ProfileFacebook] = "facebook"; + subKindAttributeMap[ATTRIBUTE_SUBKIND.ProfileTwitter] = "twitter"; + subKindAttributeMap[ATTRIBUTE_SUBKIND.ProfileLinkedIn] = "linkedin"; + subKindAttributeMap[ATTRIBUTE_SUBKIND.ProfileGist] = "gist"; + subKindAttributeMap[ATTRIBUTE_SUBKIND.ProfileTungle] = "tungle"; + subKindAttributeMap[ATTRIBUTE_SUBKIND.DateBirthday] = "birthday"; + subKindAttributeMap[ATTRIBUTE_SUBKIND.DateAnniversary] = "anniversary"; + subKindAttributeMap[ATTRIBUTE_SUBKIND.NameGiven] = "givenName"; + subKindAttributeMap[ATTRIBUTE_SUBKIND.NameSurname] = "familyName"; + subKindAttributeMap[ATTRIBUTE_SUBKIND.Title] = "honorificPrefix"; + subKindAttributeMap[ATTRIBUTE_SUBKIND.NameSuffix] = "honorificSuffix"; + subKindAttributeMap[ATTRIBUTE_SUBKIND.NameMiddle] = "middleName"; + subKindAttributeMap[ATTRIBUTE_SUBKIND.NamePhoneticGiven] = "phoneticGivenName"; + subKindAttributeMap[ATTRIBUTE_SUBKIND.NamePhoneticSurname] = "phoneticFamilyName"; + subKindAttributeMap[ATTRIBUTE_SUBKIND.NameNickname] = "nickname"; + subKindAttributeMap[ATTRIBUTE_SUBKIND.NameDisplayName] = "displayName"; + subKindAttributeMap[ATTRIBUTE_SUBKIND.OrganizationAffiliationName] = "name"; + subKindAttributeMap[ATTRIBUTE_SUBKIND.OrganizationAffiliationDetails] = "department"; + subKindAttributeMap[ATTRIBUTE_SUBKIND.Title] = "title"; + subKindAttributeMap[ATTRIBUTE_SUBKIND.InstantMessagingBbmPin] = "BbmPin"; + subKindAttributeMap[ATTRIBUTE_SUBKIND.InstantMessagingAim] = "Aim"; + subKindAttributeMap[ATTRIBUTE_SUBKIND.InstantMessagingAliwangwang] = "Aliwangwang"; + subKindAttributeMap[ATTRIBUTE_SUBKIND.InstantMessagingGoogleTalk] = "GoogleTalk"; + subKindAttributeMap[ATTRIBUTE_SUBKIND.InstantMessagingSametime] = "Sametime"; + subKindAttributeMap[ATTRIBUTE_SUBKIND.InstantMessagingIcq] = "Icq"; + subKindAttributeMap[ATTRIBUTE_SUBKIND.InstantMessagingJabber] = "Jabber"; + subKindAttributeMap[ATTRIBUTE_SUBKIND.InstantMessagingMsLcs] = "MsLcs"; + subKindAttributeMap[ATTRIBUTE_SUBKIND.InstantMessagingSkype] = "Skype"; + subKindAttributeMap[ATTRIBUTE_SUBKIND.InstantMessagingYahooMessenger] = "YahooMessenger"; + subKindAttributeMap[ATTRIBUTE_SUBKIND.InstantMessagingYahooMessengerJapan] = "YahooMessegerJapan"; + subKindAttributeMap[ATTRIBUTE_SUBKIND.VideoChatBbPlaybook] = "BbPlaybook"; + subKindAttributeMap[ATTRIBUTE_SUBKIND.SoundRingtone] = "ringtone"; + subKindAttributeMap[ATTRIBUTE_SUBKIND.Personal] = "personal"; +} + +module.exports = { + getKindAttributeMap: function () { + if (!ATTRIBUTE_KIND) { + populateKindAttributeMap(); + } + + return kindAttributeMap; + }, + getSubKindAttributeMap: function () { + if (!ATTRIBUTE_SUBKIND) { + populateSubKindAttributeMap(); + } + + return subKindAttributeMap; + } +}; diff --git a/cordova-lib/spec-plugman-create/plugins/Contacts/src/blackberry10/contactUtils.js b/cordova-lib/spec-plugman-create/plugins/Contacts/src/blackberry10/contactUtils.js new file mode 100644 index 000000000..cd022c4fa --- /dev/null +++ b/cordova-lib/spec-plugman-create/plugins/Contacts/src/blackberry10/contactUtils.js @@ -0,0 +1,223 @@ +/* + * Copyright 2012 Research In Motion Limited. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +var self, + ContactFindOptions = require("./ContactFindOptions"), + ContactError = require("./ContactError"), + ContactName = require("./ContactName"), + ContactOrganization = require("./ContactOrganization"), + ContactAddress = require("./ContactAddress"), + ContactField = require("./ContactField"), + contactConsts = require("./contactConsts"), + ContactPhoto = require("./ContactPhoto"), + ContactNews = require("./ContactNews"), + ContactActivity = require("./ContactActivity"); + +function populateFieldArray(contactProps, field, ClassName) { + if (contactProps[field]) { + var list = [], + obj; + + contactProps[field].forEach(function (args) { + if (ClassName === ContactField) { + list.push(new ClassName(args.type, args.value)); + } else if (ClassName === ContactPhoto) { + obj = new ContactPhoto(args.originalFilePath, args.pref); + obj.largeFilePath = args.largeFilePath; + obj.smallFilePath = args.smallFilePath; + list.push(obj); + } else if (ClassName === ContactNews) { + obj = new ContactNews(args); + list.push(obj); + } else if (ClassName === ContactActivity) { + obj = new ContactActivity(args); + list.push(obj); + } else { + list.push(new ClassName(args)); + } + }); + contactProps[field] = list; + } +} + +function populateDate(contactProps, field) { + if (contactProps[field]) { + contactProps[field] = new Date(contactProps[field]); + } +} + +function validateFindArguments(findOptions) { + var error = false; + + // findOptions is mandatory + if (!findOptions) { + error = true; + } else { + // findOptions.filter is optional + if (findOptions.filter) { + findOptions.filter.forEach(function (f) { + switch (f.fieldName) { + case ContactFindOptions.SEARCH_FIELD_GIVEN_NAME: + case ContactFindOptions.SEARCH_FIELD_FAMILY_NAME: + case ContactFindOptions.SEARCH_FIELD_ORGANIZATION_NAME: + case ContactFindOptions.SEARCH_FIELD_PHONE: + case ContactFindOptions.SEARCH_FIELD_EMAIL: + case ContactFindOptions.SEARCH_FIELD_BBMPIN: + case ContactFindOptions.SEARCH_FIELD_LINKEDIN: + case ContactFindOptions.SEARCH_FIELD_TWITTER: + case ContactFindOptions.SEARCH_FIELD_VIDEO_CHAT: + break; + default: + error = true; + } + + if (!f.fieldValue) { + error = true; + } + }); + } + + //findOptions.limit is optional + if (findOptions.limit) { + if (typeof findOptions.limit !== "number") { + error = true; + } + } + + //findOptions.favorite is optional + if (findOptions.favorite) { + if (typeof findOptions.favorite !== "boolean") { + error = true; + } + } + + // findOptions.sort is optional + if (!error && findOptions.sort && Array.isArray(findOptions.sort)) { + findOptions.sort.forEach(function (s) { + switch (s.fieldName) { + case ContactFindOptions.SORT_FIELD_GIVEN_NAME: + case ContactFindOptions.SORT_FIELD_FAMILY_NAME: + case ContactFindOptions.SORT_FIELD_ORGANIZATION_NAME: + break; + default: + error = true; + } + + if (s.desc === undefined || typeof s.desc !== "boolean") { + error = true; + } + }); + } + + if (!error && findOptions.includeAccounts) { + if (!Array.isArray(findOptions.includeAccounts)) { + error = true; + } else { + findOptions.includeAccounts.forEach(function (acct) { + if (!error && (!acct.id || window.isNaN(window.parseInt(acct.id, 10)))) { + error = true; + } + }); + } + } + + if (!error && findOptions.excludeAccounts) { + if (!Array.isArray(findOptions.excludeAccounts)) { + error = true; + } else { + findOptions.excludeAccounts.forEach(function (acct) { + if (!error && (!acct.id || window.isNaN(window.parseInt(acct.id, 10)))) { + error = true; + } + }); + } + } + } + return !error; +} + +function validateContactsPickerFilter(filter) { + var isValid = true, + availableFields = {}; + + if (typeof(filter) === "undefined") { + isValid = false; + } else { + if (filter && Array.isArray(filter)) { + availableFields = contactConsts.getKindAttributeMap(); + filter.forEach(function (e) { + isValid = isValid && Object.getOwnPropertyNames(availableFields).reduce( + function (found, key) { + return found || availableFields[key] === e; + }, false); + }); + } + } + + return isValid; +} + +function validateContactsPickerOptions(options) { + var isValid = false, + mode = options.mode; + + if (typeof(options) === "undefined") { + isValid = false; + } else { + isValid = mode === ContactPickerOptions.MODE_SINGLE || mode === ContactPickerOptions.MODE_MULTIPLE || mode === ContactPickerOptions.MODE_ATTRIBUTE; + + // if mode is attribute, fields must be defined + if (mode === ContactPickerOptions.MODE_ATTRIBUTE && !validateContactsPickerFilter(options.fields)) { + isValid = false; + } + } + + return isValid; +} + +self = module.exports = { + populateContact: function (contact) { + if (contact.name) { + contact.name = new ContactName(contact.name); + } + + populateFieldArray(contact, "addresses", ContactAddress); + populateFieldArray(contact, "organizations", ContactOrganization); + populateFieldArray(contact, "emails", ContactField); + populateFieldArray(contact, "phoneNumbers", ContactField); + populateFieldArray(contact, "faxNumbers", ContactField); + populateFieldArray(contact, "pagerNumbers", ContactField); + populateFieldArray(contact, "ims", ContactField); + populateFieldArray(contact, "socialNetworks", ContactField); + populateFieldArray(contact, "urls", ContactField); + populateFieldArray(contact, "photos", ContactPhoto); + populateFieldArray(contact, "news", ContactNews); + populateFieldArray(contact, "activities", ContactActivity); + // TODO categories + + populateDate(contact, "birthday"); + populateDate(contact, "anniversary"); + }, + invokeErrorCallback: function (errorCallback, code) { + if (errorCallback) { + errorCallback(new ContactError(code)); + } + }, + validateFindArguments: validateFindArguments, + validateContactsPickerFilter: validateContactsPickerFilter, + validateContactsPickerOptions: validateContactsPickerOptions +}; + diff --git a/cordova-lib/spec-plugman-create/plugins/Contacts/src/blackberry10/index.js b/cordova-lib/spec-plugman-create/plugins/Contacts/src/blackberry10/index.js new file mode 100644 index 000000000..09a4bd2a5 --- /dev/null +++ b/cordova-lib/spec-plugman-create/plugins/Contacts/src/blackberry10/index.js @@ -0,0 +1,374 @@ +/* + * Copyright 2013 Research In Motion Limited. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +var pimContacts, + contactUtils = require("./contactUtils"), + contactConsts = require("./contactConsts"), + ContactError = require("./ContactError"), + ContactName = require("./ContactName"), + ContactFindOptions = require("./ContactFindOptions"), + noop = function () {}; + +function getAccountFilters(options) { + if (options.includeAccounts) { + options.includeAccounts = options.includeAccounts.map(function (acct) { + return acct.id.toString(); + }); + } + + if (options.excludeAccounts) { + options.excludeAccounts = options.excludeAccounts.map(function (acct) { + return acct.id.toString(); + }); + } +} + +function populateSearchFields(fields) { + var i, + l, + key, + searchFieldsObject = {}, + searchFields = []; + + for (i = 0, l = fields.length; i < l; i++) { + if (fields[i] === "*") { + searchFieldsObject[ContactFindOptions.SEARCH_FIELD_GIVEN_NAME] = true; + searchFieldsObject[ContactFindOptions.SEARCH_FIELD_FAMILY_NAME] = true; + searchFieldsObject[ContactFindOptions.SEARCH_FIELD_PHONE] = true; + searchFieldsObject[ContactFindOptions.SEARCH_FIELD_EMAIL] = true; + searchFieldsObject[ContactFindOptions.SEARCH_FIELD_ORGANIZATION_NAME] = true; + } else if (fields[i] === "displayName" || fields[i] === "name") { + searchFieldsObject[ContactFindOptions.SEARCH_FIELD_GIVEN_NAME] = true; + searchFieldsObject[ContactFindOptions.SEARCH_FIELD_FAMILY_NAME] = true; + } else if (fields[i] === "nickname") { + // not supported by Cascades + } else if (fields[i] === "phoneNumbers") { + searchFieldsObject[ContactFindOptions.SEARCH_FIELD_PHONE] = true; + } else if (fields[i] === "emails") { + searchFieldsObject[ContactFindOptions.SEARCH_FIELD_EMAIL] = true; + } else if (field === "addresses") { + // not supported by Cascades + } else if (field === "ims") { + // not supported by Cascades + } else if (field === "organizations") { + searchFieldsObject[ContactFindOptions.SEARCH_FIELD_ORGANIZATION_NAME] = true; + } else if (field === "birthday") { + // not supported by Cascades + } else if (field === "note") { + // not supported by Cascades + } else if (field === "photos") { + // not supported by Cascades + } else if (field === "categories") { + // not supported by Cascades + } else if (field === "urls") { + // not supported by Cascades + } + } + + for (key in searchFieldsObject) { + if (searchFieldsObject.hasOwnProperty(key)) { + searchFields.push(window.parseInt(key)); + } + } + + return searchFields; +} + +function convertBirthday(birthday) { + //Convert date string from native to milliseconds since epoch for cordova-js + var birthdayInfo; + if (birthday) { + birthdayInfo = birthday.split("-"); + return new Date(birthdayInfo[0], birthdayInfo[1] - 1, birthdayInfo[2]).getTime(); + } else { + return null; + } +} + +function processJnextSaveData(result, JnextData) { + var data = JnextData, + birthdayInfo; + + if (data._success === true) { + data.birthday = convertBirthday(data.birthday); + result.callbackOk(data, false); + } else { + result.callbackError(data.code, false); + } +} + +function processJnextRemoveData(result, JnextData) { + var data = JnextData; + + if (data._success === true) { + result.callbackOk(data); + } else { + result.callbackError(ContactError.UNKNOWN_ERROR, false); + } +} + +function processJnextFindData(eventId, eventHandler, JnextData) { + var data = JnextData, + i, + l, + more = false, + resultsObject = {}, + birthdayInfo; + + if (data.contacts) { + for (i = 0, l = data.contacts.length; i < l; i++) { + data.contacts[i].birthday = convertBirthday(data.contacts[i].birthday); + data.contacts[i].name = new ContactName(data.contacts[i].name); + } + } else { + data.contacts = []; // if JnextData.contacts return null, return an empty array + } + + if (data._success === true) { + eventHandler.error = false; + } + + if (eventHandler.multiple) { + // Concatenate results; do not add the same contacts + for (i = 0, l = eventHandler.searchResult.length; i < l; i++) { + resultsObject[eventHandler.searchResult[i].id] = true; + } + + for (i = 0, l = data.contacts.length; i < l; i++) { + if (resultsObject[data.contacts[i].id]) { + // Already existing + } else { + eventHandler.searchResult.push(data.contacts[i]); + } + } + + // check if more search is required + eventHandler.searchFieldIndex++; + if (eventHandler.searchFieldIndex < eventHandler.searchFields.length) { + more = true; + } + } else { + eventHandler.searchResult = data.contacts; + } + + if (more) { + pimContacts.getInstance().invokeJnextSearch(eventId); + } else { + if (eventHandler.error) { + eventHandler.result.callbackError(data.code, false); + } else { + eventHandler.result.callbackOk(eventHandler.searchResult, false); + } + } +} + +module.exports = { + search: function (successCb, failCb, args, env) { + var cordovaFindOptions = {}, + result = new PluginResult(args, env), + key; + + for (key in args) { + if (args.hasOwnProperty(key)) { + cordovaFindOptions[key] = JSON.parse(decodeURIComponent(args[key])); + } + } + + pimContacts.getInstance().find(cordovaFindOptions, result, processJnextFindData); + result.noResult(true); + }, + save: function (successCb, failCb, args, env) { + var attributes = {}, + result = new PluginResult(args, env), + key, + nativeEmails = []; + + attributes = JSON.parse(decodeURIComponent(args[0])); + + //convert birthday format for our native .so file + if (attributes.birthday) { + attributes.birthday = new Date(attributes.birthday).toDateString(); + } + + if (attributes.emails) { + attributes.emails.forEach(function (email) { + if (email.value) { + if (email.type) { + nativeEmails.push({ "type" : email.type, "value" : email.value }); + } else { + nativeEmails.push({ "type" : "home", "value" : email.value }); + } + } + }); + attributes.emails = nativeEmails; + } + + if (attributes.id !== null) { + attributes.id = window.parseInt(attributes.id); + } + + attributes._eventId = result.callbackId; + pimContacts.getInstance().save(attributes, result, processJnextSaveData); + result.noResult(true); + }, + remove: function (successCb, failCb, args, env) { + var result = new PluginResult(args, env), + attributes = { + "contactId": window.parseInt(JSON.parse(decodeURIComponent(args[0]))), + "_eventId": result.callbackId + }; + + if (!window.isNaN(attributes.contactId)) { + pimContacts.getInstance().remove(attributes, result, processJnextRemoveData); + result.noResult(true); + } else { + result.error(ContactError.UNKNOWN_ERROR); + result.noResult(false); + } + } +}; + +/////////////////////////////////////////////////////////////////// +// JavaScript wrapper for JNEXT plugin +/////////////////////////////////////////////////////////////////// + +JNEXT.PimContacts = function () +{ + var self = this, + hasInstance = false; + + self.find = function (cordovaFindOptions, pluginResult, handler) { + //register find eventHandler for when JNEXT onEvent fires + self.eventHandlers[cordovaFindOptions.callbackId] = { + "result" : pluginResult, + "action" : "find", + "multiple" : cordovaFindOptions[1].filter ? true : false, + "fields" : cordovaFindOptions[0], + "searchFilter" : cordovaFindOptions[1].filter, + "searchFields" : cordovaFindOptions[1].filter ? populateSearchFields(cordovaFindOptions[0]) : null, + "searchFieldIndex" : 0, + "searchResult" : [], + "handler" : handler, + "error" : true + }; + + self.invokeJnextSearch(cordovaFindOptions.callbackId); + return ""; + }; + + self.invokeJnextSearch = function(eventId) { + var jnextArgs = {}, + findHandler = self.eventHandlers[eventId]; + + jnextArgs._eventId = eventId; + jnextArgs.fields = findHandler.fields; + jnextArgs.options = {}; + jnextArgs.options.filter = []; + + if (findHandler.multiple) { + jnextArgs.options.filter.push({ + "fieldName" : findHandler.searchFields[findHandler.searchFieldIndex], + "fieldValue" : findHandler.searchFilter + }); + //findHandler.searchFieldIndex++; + } + + JNEXT.invoke(self.m_id, "find " + JSON.stringify(jnextArgs)); + } + + self.getContact = function (args) { + return JSON.parse(JNEXT.invoke(self.m_id, "getContact " + JSON.stringify(args))); + }; + + self.save = function (args, pluginResult, handler) { + //register save eventHandler for when JNEXT onEvent fires + self.eventHandlers[args._eventId] = { + "result" : pluginResult, + "action" : "save", + "handler" : handler + }; + JNEXT.invoke(self.m_id, "save " + JSON.stringify(args)); + return ""; + }; + + self.remove = function (args, pluginResult, handler) { + //register remove eventHandler for when JNEXT onEvent fires + self.eventHandlers[args._eventId] = { + "result" : pluginResult, + "action" : "remove", + "handler" : handler + }; + JNEXT.invoke(self.m_id, "remove " + JSON.stringify(args)); + return ""; + }; + + self.getId = function () { + return self.m_id; + }; + + self.getContactAccounts = function () { + var value = JNEXT.invoke(self.m_id, "getContactAccounts"); + return JSON.parse(value); + }; + + self.init = function () { + if (!JNEXT.require("libpimcontacts")) { + return false; + } + + self.m_id = JNEXT.createObject("libpimcontacts.PimContacts"); + + if (self.m_id === "") { + return false; + } + + JNEXT.registerEvents(self); + }; + + // Handle data coming back from JNEXT native layer. Each async function registers a handler and a PluginResult object. + // When JNEXT fires onEvent we parse the result string back into JSON and trigger the appropriate handler (eventHandlers map + // uses callbackId as key), along with the actual data coming back from the native layer. Each function may have its own way of + // processing native data so we do not do any processing here. + + self.onEvent = function (strData) { + var arData = strData.split(" "), + strEventDesc = arData[0], + eventHandler, + args = {}; + + if (strEventDesc === "result") { + args.result = escape(strData.split(" ").slice(2).join(" ")); + eventHandler = self.eventHandlers[arData[1]]; + if (eventHandler.action === "save" || eventHandler.action === "remove") { + eventHandler.handler(eventHandler.result, JSON.parse(decodeURIComponent(args.result))); + } else if (eventHandler.action === "find") { + eventHandler.handler(arData[1], eventHandler, JSON.parse(decodeURIComponent(args.result))); + } + } + }; + + self.m_id = ""; + self.eventHandlers = {}; + + self.getInstance = function () { + if (!hasInstance) { + self.init(); + hasInstance = true; + } + return self; + }; +}; + +pimContacts = new JNEXT.PimContacts(); diff --git a/cordova-lib/spec-plugman-create/plugins/Contacts/src/blackberry10/plugin.xml b/cordova-lib/spec-plugman-create/plugins/Contacts/src/blackberry10/plugin.xml new file mode 100644 index 000000000..d163585f2 --- /dev/null +++ b/cordova-lib/spec-plugman-create/plugins/Contacts/src/blackberry10/plugin.xml @@ -0,0 +1,41 @@ + + + + + + Contacts + + + + + + + + + + + + + + + + + + + diff --git a/cordova-lib/spec-plugman-create/plugins/Contacts/src/ios/CDVContact.h b/cordova-lib/spec-plugman-create/plugins/Contacts/src/ios/CDVContact.h new file mode 100644 index 000000000..5187efcdf --- /dev/null +++ b/cordova-lib/spec-plugman-create/plugins/Contacts/src/ios/CDVContact.h @@ -0,0 +1,136 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. + */ + +#import +#import +#import + +enum CDVContactError { + UNKNOWN_ERROR = 0, + INVALID_ARGUMENT_ERROR = 1, + TIMEOUT_ERROR = 2, + PENDING_OPERATION_ERROR = 3, + IO_ERROR = 4, + NOT_SUPPORTED_ERROR = 5, + PERMISSION_DENIED_ERROR = 20 +}; +typedef NSUInteger CDVContactError; + +@interface CDVContact : NSObject { + ABRecordRef record; // the ABRecord associated with this contact + NSDictionary* returnFields; // dictionary of fields to return when performing search +} + +@property (nonatomic, assign) ABRecordRef record; +@property (nonatomic, strong) NSDictionary* returnFields; + ++ (NSDictionary*)defaultABtoW3C; ++ (NSDictionary*)defaultW3CtoAB; ++ (NSSet*)defaultW3CtoNull; ++ (NSDictionary*)defaultObjectAndProperties; ++ (NSDictionary*)defaultFields; + ++ (NSDictionary*)calcReturnFields:(NSArray*)fields; +- (id)init; +- (id)initFromABRecord:(ABRecordRef)aRecord; +- (bool)setFromContactDict:(NSDictionary*)aContact asUpdate:(BOOL)bUpdate; + ++ (BOOL)needsConversion:(NSString*)W3Label; ++ (CFStringRef)convertContactTypeToPropertyLabel:(NSString*)label; ++ (NSString*)convertPropertyLabelToContactType:(NSString*)label; ++ (BOOL)isValidW3ContactType:(NSString*)label; +- (bool)setValue:(id)aValue forProperty:(ABPropertyID)aProperty inRecord:(ABRecordRef)aRecord asUpdate:(BOOL)bUpdate; + +- (NSDictionary*)toDictionary:(NSDictionary*)withFields; +- (NSNumber*)getDateAsNumber:(ABPropertyID)datePropId; +- (NSObject*)extractName; +- (NSObject*)extractMultiValue:(NSString*)propertyId; +- (NSObject*)extractAddresses; +- (NSObject*)extractIms; +- (NSObject*)extractOrganizations; +- (NSObject*)extractPhotos; + +- (NSMutableDictionary*)translateW3Dict:(NSDictionary*)dict forProperty:(ABPropertyID)prop; +- (bool)setMultiValueStrings:(NSArray*)fieldArray forProperty:(ABPropertyID)prop inRecord:(ABRecordRef)person asUpdate:(BOOL)bUpdate; +- (bool)setMultiValueDictionary:(NSArray*)array forProperty:(ABPropertyID)prop inRecord:(ABRecordRef)person asUpdate:(BOOL)bUpdate; +- (ABMultiValueRef)allocStringMultiValueFromArray:array; +- (ABMultiValueRef)allocDictMultiValueFromArray:array forProperty:(ABPropertyID)prop; +- (BOOL)foundValue:(NSString*)testValue inFields:(NSDictionary*)searchFields; +- (BOOL)testStringValue:(NSString*)testValue forW3CProperty:(NSString*)property; +- (BOOL)testDateValue:(NSString*)testValue forW3CProperty:(NSString*)property; +- (BOOL)searchContactFields:(NSArray*)fields forMVStringProperty:(ABPropertyID)propId withValue:testValue; +- (BOOL)testMultiValueStrings:(NSString*)testValue forProperty:(ABPropertyID)propId ofType:(NSString*)type; +- (NSArray*)valuesForProperty:(ABPropertyID)propId inRecord:(ABRecordRef)aRecord; +- (NSArray*)labelsForProperty:(ABPropertyID)propId inRecord:(ABRecordRef)aRecord; +- (BOOL)searchContactFields:(NSArray*)fields forMVDictionaryProperty:(ABPropertyID)propId withValue:(NSString*)testValue; + +@end + +// generic ContactField types +#define kW3ContactFieldType @"type" +#define kW3ContactFieldValue @"value" +#define kW3ContactFieldPrimary @"pref" +// Various labels for ContactField types +#define kW3ContactWorkLabel @"work" +#define kW3ContactHomeLabel @"home" +#define kW3ContactOtherLabel @"other" +#define kW3ContactPhoneFaxLabel @"fax" +#define kW3ContactPhoneMobileLabel @"mobile" +#define kW3ContactPhonePagerLabel @"pager" +#define kW3ContactUrlBlog @"blog" +#define kW3ContactUrlProfile @"profile" +#define kW3ContactImAIMLabel @"aim" +#define kW3ContactImICQLabel @"icq" +#define kW3ContactImMSNLabel @"msn" +#define kW3ContactImYahooLabel @"yahoo" +#define kW3ContactFieldId @"id" +// special translation for IM field value and type +#define kW3ContactImType @"type" +#define kW3ContactImValue @"value" + +// Contact object +#define kW3ContactId @"id" +#define kW3ContactName @"name" +#define kW3ContactFormattedName @"formatted" +#define kW3ContactGivenName @"givenName" +#define kW3ContactFamilyName @"familyName" +#define kW3ContactMiddleName @"middleName" +#define kW3ContactHonorificPrefix @"honorificPrefix" +#define kW3ContactHonorificSuffix @"honorificSuffix" +#define kW3ContactDisplayName @"displayName" +#define kW3ContactNickname @"nickname" +#define kW3ContactPhoneNumbers @"phoneNumbers" +#define kW3ContactAddresses @"addresses" +#define kW3ContactAddressFormatted @"formatted" +#define kW3ContactStreetAddress @"streetAddress" +#define kW3ContactLocality @"locality" +#define kW3ContactRegion @"region" +#define kW3ContactPostalCode @"postalCode" +#define kW3ContactCountry @"country" +#define kW3ContactEmails @"emails" +#define kW3ContactIms @"ims" +#define kW3ContactOrganizations @"organizations" +#define kW3ContactOrganizationName @"name" +#define kW3ContactTitle @"title" +#define kW3ContactDepartment @"department" +#define kW3ContactBirthday @"birthday" +#define kW3ContactNote @"note" +#define kW3ContactPhotos @"photos" +#define kW3ContactCategories @"categories" +#define kW3ContactUrls @"urls" diff --git a/cordova-lib/spec-plugman-create/plugins/Contacts/src/ios/CDVContact.m b/cordova-lib/spec-plugman-create/plugins/Contacts/src/ios/CDVContact.m new file mode 100644 index 000000000..82704ea05 --- /dev/null +++ b/cordova-lib/spec-plugman-create/plugins/Contacts/src/ios/CDVContact.m @@ -0,0 +1,1752 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. + */ + +#import "CDVContact.h" +#import + +#define DATE_OR_NULL(dateObj) ((aDate != nil) ? (id)([aDate descriptionWithLocale:[NSLocale currentLocale]]) : (id)([NSNull null])) +#define IS_VALID_VALUE(value) ((value != nil) && (![value isKindOfClass:[NSNull class]])) + +static NSDictionary* org_apache_cordova_contacts_W3CtoAB = nil; +static NSDictionary* org_apache_cordova_contacts_ABtoW3C = nil; +static NSSet* org_apache_cordova_contacts_W3CtoNull = nil; +static NSDictionary* org_apache_cordova_contacts_objectAndProperties = nil; +static NSDictionary* org_apache_cordova_contacts_defaultFields = nil; + +@implementation CDVContact : NSObject + + @synthesize returnFields; + +- (id)init +{ + if ((self = [super init]) != nil) { + ABRecordRef rec = ABPersonCreate(); + self.record = rec; + if (rec) { + CFRelease(rec); + } + } + return self; +} + +- (id)initFromABRecord:(ABRecordRef)aRecord +{ + if ((self = [super init]) != nil) { + self.record = aRecord; + } + return self; +} + +/* synthesize 'record' ourselves to have retain properties for CF types */ + +- (void)setRecord:(ABRecordRef)aRecord +{ + if (record != NULL) { + CFRelease(record); + } + if (aRecord != NULL) { + record = CFRetain(aRecord); + } +} + +- (ABRecordRef)record +{ + return record; +} + +/* Rather than creating getters and setters for each AddressBook (AB) Property, generic methods are used to deal with + * simple properties, MultiValue properties( phone numbers and emails) and MultiValueDictionary properties (Ims and addresses). + * The dictionaries below are used to translate between the W3C identifiers and the AB properties. Using the dictionaries, + * allows looping through sets of properties to extract from or set into the W3C dictionary to/from the ABRecord. + */ + +/* The two following dictionaries translate between W3C properties and AB properties. It currently mixes both + * Properties (kABPersonAddressProperty for example) and Strings (kABPersonAddressStreetKey) so users should be aware of + * what types of values are expected. + * a bit. +*/ ++ (NSDictionary*)defaultABtoW3C +{ + if (org_apache_cordova_contacts_ABtoW3C == nil) { + org_apache_cordova_contacts_ABtoW3C = [NSDictionary dictionaryWithObjectsAndKeys: + kW3ContactNickname, [NSNumber numberWithInt:kABPersonNicknameProperty], + kW3ContactGivenName, [NSNumber numberWithInt:kABPersonFirstNameProperty], + kW3ContactFamilyName, [NSNumber numberWithInt:kABPersonLastNameProperty], + kW3ContactMiddleName, [NSNumber numberWithInt:kABPersonMiddleNameProperty], + kW3ContactHonorificPrefix, [NSNumber numberWithInt:kABPersonPrefixProperty], + kW3ContactHonorificSuffix, [NSNumber numberWithInt:kABPersonSuffixProperty], + kW3ContactPhoneNumbers, [NSNumber numberWithInt:kABPersonPhoneProperty], + kW3ContactAddresses, [NSNumber numberWithInt:kABPersonAddressProperty], + kW3ContactStreetAddress, kABPersonAddressStreetKey, + kW3ContactLocality, kABPersonAddressCityKey, + kW3ContactRegion, kABPersonAddressStateKey, + kW3ContactPostalCode, kABPersonAddressZIPKey, + kW3ContactCountry, kABPersonAddressCountryKey, + kW3ContactEmails, [NSNumber numberWithInt:kABPersonEmailProperty], + kW3ContactIms, [NSNumber numberWithInt:kABPersonInstantMessageProperty], + kW3ContactOrganizations, [NSNumber numberWithInt:kABPersonOrganizationProperty], + kW3ContactOrganizationName, [NSNumber numberWithInt:kABPersonOrganizationProperty], + kW3ContactTitle, [NSNumber numberWithInt:kABPersonJobTitleProperty], + kW3ContactDepartment, [NSNumber numberWithInt:kABPersonDepartmentProperty], + kW3ContactBirthday, [NSNumber numberWithInt:kABPersonBirthdayProperty], + kW3ContactUrls, [NSNumber numberWithInt:kABPersonURLProperty], + kW3ContactNote, [NSNumber numberWithInt:kABPersonNoteProperty], + nil]; + } + + return org_apache_cordova_contacts_ABtoW3C; +} + ++ (NSDictionary*)defaultW3CtoAB +{ + if (org_apache_cordova_contacts_W3CtoAB == nil) { + org_apache_cordova_contacts_W3CtoAB = [NSDictionary dictionaryWithObjectsAndKeys: + [NSNumber numberWithInt:kABPersonNicknameProperty], kW3ContactNickname, + [NSNumber numberWithInt:kABPersonFirstNameProperty], kW3ContactGivenName, + [NSNumber numberWithInt:kABPersonLastNameProperty], kW3ContactFamilyName, + [NSNumber numberWithInt:kABPersonMiddleNameProperty], kW3ContactMiddleName, + [NSNumber numberWithInt:kABPersonPrefixProperty], kW3ContactHonorificPrefix, + [NSNumber numberWithInt:kABPersonSuffixProperty], kW3ContactHonorificSuffix, + [NSNumber numberWithInt:kABPersonPhoneProperty], kW3ContactPhoneNumbers, + [NSNumber numberWithInt:kABPersonAddressProperty], kW3ContactAddresses, + kABPersonAddressStreetKey, kW3ContactStreetAddress, + kABPersonAddressCityKey, kW3ContactLocality, + kABPersonAddressStateKey, kW3ContactRegion, + kABPersonAddressZIPKey, kW3ContactPostalCode, + kABPersonAddressCountryKey, kW3ContactCountry, + [NSNumber numberWithInt:kABPersonEmailProperty], kW3ContactEmails, + [NSNumber numberWithInt:kABPersonInstantMessageProperty], kW3ContactIms, + [NSNumber numberWithInt:kABPersonOrganizationProperty], kW3ContactOrganizations, + [NSNumber numberWithInt:kABPersonJobTitleProperty], kW3ContactTitle, + [NSNumber numberWithInt:kABPersonDepartmentProperty], kW3ContactDepartment, + [NSNumber numberWithInt:kABPersonBirthdayProperty], kW3ContactBirthday, + [NSNumber numberWithInt:kABPersonNoteProperty], kW3ContactNote, + [NSNumber numberWithInt:kABPersonURLProperty], kW3ContactUrls, + kABPersonInstantMessageUsernameKey, kW3ContactImValue, + kABPersonInstantMessageServiceKey, kW3ContactImType, + [NSNull null], kW3ContactFieldType, /* include entries in dictionary to indicate ContactField properties */ + [NSNull null], kW3ContactFieldValue, + [NSNull null], kW3ContactFieldPrimary, + [NSNull null], kW3ContactFieldId, + [NSNumber numberWithInt:kABPersonOrganizationProperty], kW3ContactOrganizationName, /* careful, name is used multiple times*/ + nil]; + } + return org_apache_cordova_contacts_W3CtoAB; +} + ++ (NSSet*)defaultW3CtoNull +{ + // these are values that have no AddressBook Equivalent OR have not been implemented yet + if (org_apache_cordova_contacts_W3CtoNull == nil) { + org_apache_cordova_contacts_W3CtoNull = [NSSet setWithObjects:kW3ContactDisplayName, + kW3ContactCategories, kW3ContactFormattedName, nil]; + } + return org_apache_cordova_contacts_W3CtoNull; +} + +/* + * The objectAndProperties dictionary contains the all of the properties of the W3C Contact Objects specified by the key + * Used in calcReturnFields, and various extract methods + */ ++ (NSDictionary*)defaultObjectAndProperties +{ + if (org_apache_cordova_contacts_objectAndProperties == nil) { + org_apache_cordova_contacts_objectAndProperties = [NSDictionary dictionaryWithObjectsAndKeys: + [NSArray arrayWithObjects:kW3ContactGivenName, kW3ContactFamilyName, + kW3ContactMiddleName, kW3ContactHonorificPrefix, kW3ContactHonorificSuffix, kW3ContactFormattedName, nil], kW3ContactName, + [NSArray arrayWithObjects:kW3ContactStreetAddress, kW3ContactLocality, kW3ContactRegion, + kW3ContactPostalCode, kW3ContactCountry, /*kW3ContactAddressFormatted,*/ nil], kW3ContactAddresses, + [NSArray arrayWithObjects:kW3ContactOrganizationName, kW3ContactTitle, kW3ContactDepartment, nil], kW3ContactOrganizations, + [NSArray arrayWithObjects:kW3ContactFieldType, kW3ContactFieldValue, kW3ContactFieldPrimary, nil], kW3ContactPhoneNumbers, + [NSArray arrayWithObjects:kW3ContactFieldType, kW3ContactFieldValue, kW3ContactFieldPrimary, nil], kW3ContactEmails, + [NSArray arrayWithObjects:kW3ContactFieldType, kW3ContactFieldValue, kW3ContactFieldPrimary, nil], kW3ContactPhotos, + [NSArray arrayWithObjects:kW3ContactFieldType, kW3ContactFieldValue, kW3ContactFieldPrimary, nil], kW3ContactUrls, + [NSArray arrayWithObjects:kW3ContactImValue, kW3ContactImType, nil], kW3ContactIms, + nil]; + } + return org_apache_cordova_contacts_objectAndProperties; +} + ++ (NSDictionary*)defaultFields +{ + if (org_apache_cordova_contacts_defaultFields == nil) { + org_apache_cordova_contacts_defaultFields = [NSDictionary dictionaryWithObjectsAndKeys: + [[CDVContact defaultObjectAndProperties] objectForKey:kW3ContactName], kW3ContactName, + [NSNull null], kW3ContactNickname, + [[CDVContact defaultObjectAndProperties] objectForKey:kW3ContactAddresses], kW3ContactAddresses, + [[CDVContact defaultObjectAndProperties] objectForKey:kW3ContactOrganizations], kW3ContactOrganizations, + [[CDVContact defaultObjectAndProperties] objectForKey:kW3ContactPhoneNumbers], kW3ContactPhoneNumbers, + [[CDVContact defaultObjectAndProperties] objectForKey:kW3ContactEmails], kW3ContactEmails, + [[CDVContact defaultObjectAndProperties] objectForKey:kW3ContactIms], kW3ContactIms, + [[CDVContact defaultObjectAndProperties] objectForKey:kW3ContactPhotos], kW3ContactPhotos, + [[CDVContact defaultObjectAndProperties] objectForKey:kW3ContactUrls], kW3ContactUrls, + [NSNull null], kW3ContactBirthday, + [NSNull null], kW3ContactNote, + nil]; + } + return org_apache_cordova_contacts_defaultFields; +} + +/* Translate W3C Contact data into ABRecordRef + * + * New contact information comes in as a NSMutableDictionary. All Null entries in Contact object are set + * as [NSNull null] in the dictionary when translating from the JSON input string of Contact data. However, if + * user did not set a value within a Contact object or sub-object (by not using the object constructor) some data + * may not exist. + * bUpdate = YES indicates this is a save of an existing record + */ +- (bool)setFromContactDict:(NSDictionary*)aContact asUpdate:(BOOL)bUpdate +{ + if (![aContact isKindOfClass:[NSDictionary class]]) { + return FALSE; // can't do anything if no dictionary! + } + + ABRecordRef person = self.record; + bool bSuccess = TRUE; + CFErrorRef error; + + // set name info + // iOS doesn't have displayName - might have to pull parts from it to create name + bool bName = false; + NSDictionary* dict = [aContact valueForKey:kW3ContactName]; + if ([dict isKindOfClass:[NSDictionary class]]) { + bName = true; + NSArray* propArray = [[CDVContact defaultObjectAndProperties] objectForKey:kW3ContactName]; + + for (id i in propArray) { + if (![(NSString*)i isEqualToString : kW3ContactFormattedName]) { // kW3ContactFormattedName is generated from ABRecordCopyCompositeName() and can't be set + [self setValue:[dict valueForKey:i] forProperty:(ABPropertyID)[(NSNumber*)[[CDVContact defaultW3CtoAB] objectForKey:i] intValue] + inRecord:person asUpdate:bUpdate]; + } + } + } + + id nn = [aContact valueForKey:kW3ContactNickname]; + if (![nn isKindOfClass:[NSNull class]]) { + bName = true; + [self setValue:nn forProperty:kABPersonNicknameProperty inRecord:person asUpdate:bUpdate]; + } + if (!bName) { + // if no name or nickname - try and use displayName as W3Contact must have displayName or ContactName + [self setValue:[aContact valueForKey:kW3ContactDisplayName] forProperty:kABPersonNicknameProperty + inRecord:person asUpdate:bUpdate]; + } + + // set phoneNumbers + // NSLog(@"setting phoneNumbers"); + NSArray* array = [aContact valueForKey:kW3ContactPhoneNumbers]; + if ([array isKindOfClass:[NSArray class]]) { + [self setMultiValueStrings:array forProperty:kABPersonPhoneProperty inRecord:person asUpdate:bUpdate]; + } + // set Emails + // NSLog(@"setting emails"); + array = [aContact valueForKey:kW3ContactEmails]; + if ([array isKindOfClass:[NSArray class]]) { + [self setMultiValueStrings:array forProperty:kABPersonEmailProperty inRecord:person asUpdate:bUpdate]; + } + // set Urls + // NSLog(@"setting urls"); + array = [aContact valueForKey:kW3ContactUrls]; + if ([array isKindOfClass:[NSArray class]]) { + [self setMultiValueStrings:array forProperty:kABPersonURLProperty inRecord:person asUpdate:bUpdate]; + } + + // set multivalue dictionary properties + // set addresses: streetAddress, locality, region, postalCode, country + // set ims: value = username, type = servicetype + // iOS addresses and im are a MultiValue Properties with label, value=dictionary of info, and id + // NSLog(@"setting addresses"); + error = nil; + array = [aContact valueForKey:kW3ContactAddresses]; + if ([array isKindOfClass:[NSArray class]]) { + [self setMultiValueDictionary:array forProperty:kABPersonAddressProperty inRecord:person asUpdate:bUpdate]; + } + // ims + // NSLog(@"setting ims"); + array = [aContact valueForKey:kW3ContactIms]; + if ([array isKindOfClass:[NSArray class]]) { + [self setMultiValueDictionary:array forProperty:kABPersonInstantMessageProperty inRecord:person asUpdate:bUpdate]; + } + + // organizations + // W3C ContactOrganization has pref, type, name, title, department + // iOS only supports name, title, department + // NSLog(@"setting organizations"); + // TODO this may need work - should Organization information be removed when array is empty?? + array = [aContact valueForKey:kW3ContactOrganizations]; // iOS only supports one organization - use first one + if ([array isKindOfClass:[NSArray class]]) { + BOOL bRemove = NO; + NSDictionary* dict = nil; + if ([array count] > 0) { + dict = [array objectAtIndex:0]; + } else { + // remove the organization info entirely + bRemove = YES; + } + if ([dict isKindOfClass:[NSDictionary class]] || (bRemove == YES)) { + [self setValue:(bRemove ? @"" : [dict valueForKey:@"name"]) forProperty:kABPersonOrganizationProperty inRecord:person asUpdate:bUpdate]; + [self setValue:(bRemove ? @"" : [dict valueForKey:kW3ContactTitle]) forProperty:kABPersonJobTitleProperty inRecord:person asUpdate:bUpdate]; + [self setValue:(bRemove ? @"" : [dict valueForKey:kW3ContactDepartment]) forProperty:kABPersonDepartmentProperty inRecord:person asUpdate:bUpdate]; + } + } + // add dates + // Dates come in as milliseconds in NSNumber Object + id ms = [aContact valueForKey:kW3ContactBirthday]; + NSDate* aDate = nil; + if (ms && [ms isKindOfClass:[NSNumber class]]) { + double msValue = [ms doubleValue]; + msValue = msValue / 1000; + aDate = [NSDate dateWithTimeIntervalSince1970:msValue]; + } + if ((aDate != nil) || [ms isKindOfClass:[NSString class]]) { + [self setValue:aDate != nil ? aDate:ms forProperty:kABPersonBirthdayProperty inRecord:person asUpdate:bUpdate]; + } + // don't update creation date + // modification date will get updated when save + // anniversary is removed from W3C Contact api Dec 9, 2010 spec - don't waste time on it yet + + // kABPersonDateProperty + + // kABPersonAnniversaryLabel + + // iOS doesn't have gender - ignore + // note + [self setValue:[aContact valueForKey:kW3ContactNote] forProperty:kABPersonNoteProperty inRecord:person asUpdate:bUpdate]; + + // iOS doesn't have preferredName- ignore + + // photo + array = [aContact valueForKey:kW3ContactPhotos]; + if ([array isKindOfClass:[NSArray class]]) { + if (bUpdate && ([array count] == 0)) { + // remove photo + bSuccess = ABPersonRemoveImageData(person, &error); + } else if ([array count] > 0) { + NSDictionary* dict = [array objectAtIndex:0]; // currently only support one photo + if ([dict isKindOfClass:[NSDictionary class]]) { + id value = [dict objectForKey:kW3ContactFieldValue]; + if ([value isKindOfClass:[NSString class]]) { + if (bUpdate && ([value length] == 0)) { + // remove the current image + bSuccess = ABPersonRemoveImageData(person, &error); + } else { + // use this image + // don't know if string is encoded or not so first unencode it then encode it again + NSString* cleanPath = [value stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; + NSURL* photoUrl = [NSURL URLWithString:[cleanPath stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]; + // caller is responsible for checking for a connection, if no connection this will fail + NSError* err = nil; + NSData* data = nil; + if (photoUrl) { + data = [NSData dataWithContentsOfURL:photoUrl options:NSDataReadingUncached error:&err]; + } + if (data && ([data length] > 0)) { + bSuccess = ABPersonSetImageData(person, (__bridge CFDataRef)data, &error); + } + if (!data || !bSuccess) { + NSLog(@"error setting contact image: %@", (err != nil ? [err localizedDescription] : @"")); + } + } + } + } + } + } + + // TODO WebURLs + + // TODO timezone + + return bSuccess; +} + +/* Set item into an AddressBook Record for the specified property. + * aValue - the value to set into the address book (code checks for null or [NSNull null] + * aProperty - AddressBook property ID + * aRecord - the record to update + * bUpdate - whether this is a possible update vs a new entry + * RETURN + * true - property was set (or input value as null) + * false - property was not set + */ +- (bool)setValue:(id)aValue forProperty:(ABPropertyID)aProperty inRecord:(ABRecordRef)aRecord asUpdate:(BOOL)bUpdate +{ + bool bSuccess = true; // if property was null, just ignore and return success + CFErrorRef error; + + if (aValue && ![aValue isKindOfClass:[NSNull class]]) { + if (bUpdate && ([aValue isKindOfClass:[NSString class]] && ([aValue length] == 0))) { // if updating, empty string means to delete + aValue = NULL; + } // really only need to set if different - more efficient to just update value or compare and only set if necessary??? + bSuccess = ABRecordSetValue(aRecord, aProperty, (__bridge CFTypeRef)aValue, &error); + if (!bSuccess) { + NSLog(@"error setting %d property", aProperty); + } + } + + return bSuccess; +} + +- (bool)removeProperty:(ABPropertyID)aProperty inRecord:(ABRecordRef)aRecord +{ + CFErrorRef err; + bool bSuccess = ABRecordRemoveValue(aRecord, aProperty, &err); + + if (!bSuccess) { + CFStringRef errDescription = CFErrorCopyDescription(err); + NSLog(@"Unable to remove property %d: %@", aProperty, errDescription); + CFRelease(errDescription); + } + return bSuccess; +} + +- (bool)addToMultiValue:(ABMultiValueRef)multi fromDictionary:dict +{ + bool bSuccess = FALSE; + id value = [dict valueForKey:kW3ContactFieldValue]; + + if (IS_VALID_VALUE(value)) { + CFStringRef label = [CDVContact convertContactTypeToPropertyLabel:[dict valueForKey:kW3ContactFieldType]]; + bSuccess = ABMultiValueAddValueAndLabel(multi, (__bridge CFTypeRef)value, label, NULL); + if (!bSuccess) { + NSLog(@"Error setting Value: %@ and label: %@", value, label); + } + } + return bSuccess; +} + +- (ABMultiValueRef)allocStringMultiValueFromArray:array +{ + ABMutableMultiValueRef multi = ABMultiValueCreateMutable(kABMultiStringPropertyType); + + for (NSDictionary* dict in array) { + [self addToMultiValue:multi fromDictionary:dict]; + } + + return multi; // caller is responsible for releasing multi +} + +- (bool)setValue:(CFTypeRef)value forProperty:(ABPropertyID)prop inRecord:(ABRecordRef)person +{ + CFErrorRef error; + bool bSuccess = ABRecordSetValue(person, prop, value, &error); + + if (!bSuccess) { + NSLog(@"Error setting value for property: %d", prop); + } + return bSuccess; +} + +/* Set MultiValue string properties into Address Book Record. + * NSArray* fieldArray - array of dictionaries containing W3C properties to be set into record + * ABPropertyID prop - the property to be set (generally used for phones and emails) + * ABRecordRef person - the record to set values into + * BOOL bUpdate - whether or not to update date or set as new. + * When updating: + * empty array indicates to remove entire property + * empty string indicates to remove + * [NSNull null] do not modify (keep existing record value) + * RETURNS + * bool false indicates error + * + * used for phones and emails + */ +- (bool)setMultiValueStrings:(NSArray*)fieldArray forProperty:(ABPropertyID)prop inRecord:(ABRecordRef)person asUpdate:(BOOL)bUpdate +{ + bool bSuccess = TRUE; + ABMutableMultiValueRef multi = nil; + + if (!bUpdate) { + multi = [self allocStringMultiValueFromArray:fieldArray]; + bSuccess = [self setValue:multi forProperty:prop inRecord:person]; + } else if (bUpdate && ([fieldArray count] == 0)) { + // remove entire property + bSuccess = [self removeProperty:prop inRecord:person]; + } else { // check for and apply changes + ABMultiValueRef copy = ABRecordCopyValue(person, prop); + if (copy != nil) { + multi = ABMultiValueCreateMutableCopy(copy); + CFRelease(copy); + + for (NSDictionary* dict in fieldArray) { + id val; + NSString* label = nil; + val = [dict valueForKey:kW3ContactFieldValue]; + label = (__bridge NSString*)[CDVContact convertContactTypeToPropertyLabel:[dict valueForKey:kW3ContactFieldType]]; + if (IS_VALID_VALUE(val)) { + // is an update, find index of entry with matching id, if values are different, update. + id idValue = [dict valueForKey:kW3ContactFieldId]; + int identifier = [idValue isKindOfClass:[NSNumber class]] ? [idValue intValue] : -1; + CFIndex i = identifier >= 0 ? ABMultiValueGetIndexForIdentifier(multi, identifier) : kCFNotFound; + if (i != kCFNotFound) { + if ([val length] == 0) { + // remove both value and label + ABMultiValueRemoveValueAndLabelAtIndex(multi, i); + } else { + NSString* valueAB = (__bridge_transfer NSString*)ABMultiValueCopyValueAtIndex(multi, i); + NSString* labelAB = (__bridge_transfer NSString*)ABMultiValueCopyLabelAtIndex(multi, i); + if ((valueAB == nil) || ![val isEqualToString:valueAB]) { + ABMultiValueReplaceValueAtIndex(multi, (__bridge CFTypeRef)val, i); + } + if ((labelAB == nil) || ![label isEqualToString:labelAB]) { + ABMultiValueReplaceLabelAtIndex(multi, (__bridge CFStringRef)label, i); + } + } + } else { + // is a new value - insert + [self addToMultiValue:multi fromDictionary:dict]; + } + } // end of if value + } // end of for + } else { // adding all new value(s) + multi = [self allocStringMultiValueFromArray:fieldArray]; + } + // set the (updated) copy as the new value + bSuccess = [self setValue:multi forProperty:prop inRecord:person]; + } + + if (multi) { + CFRelease(multi); + } + + return bSuccess; +} + +// used for ims and addresses +- (ABMultiValueRef)allocDictMultiValueFromArray:array forProperty:(ABPropertyID)prop +{ + ABMutableMultiValueRef multi = ABMultiValueCreateMutable(kABMultiDictionaryPropertyType); + NSMutableDictionary* newDict; + NSMutableDictionary* addDict; + + for (NSDictionary* dict in array) { + newDict = [self translateW3Dict:dict forProperty:prop]; + addDict = [NSMutableDictionary dictionaryWithCapacity:2]; + if (newDict) { // create a new dictionary with a Label and Value, value is the dictionary previously created + // June, 2011 W3C Contact spec adds type into ContactAddress book + // get the type out of the original dictionary for address + NSString* addrType = (NSString*)[dict valueForKey:kW3ContactFieldType]; + if (!addrType) { + addrType = (NSString*)kABOtherLabel; + } + NSObject* typeValue = ((prop == kABPersonInstantMessageProperty) ? (NSObject*)kABOtherLabel : addrType); + // NSLog(@"typeValue: %@", typeValue); + [addDict setObject:typeValue forKey:kW3ContactFieldType]; // im labels will be set as Other and address labels as type from dictionary + [addDict setObject:newDict forKey:kW3ContactFieldValue]; + [self addToMultiValue:multi fromDictionary:addDict]; + } + } + + return multi; // caller is responsible for releasing +} + +// used for ims and addresses to convert W3 dictionary of values to AB Dictionary +// got messier when June, 2011 W3C Contact spec added type field into ContactAddress +- (NSMutableDictionary*)translateW3Dict:(NSDictionary*)dict forProperty:(ABPropertyID)prop +{ + NSArray* propArray = [[CDVContact defaultObjectAndProperties] valueForKey:[[CDVContact defaultABtoW3C] objectForKey:[NSNumber numberWithInt:prop]]]; + + NSMutableDictionary* newDict = [NSMutableDictionary dictionaryWithCapacity:1]; + id value; + + for (NSString* key in propArray) { // for each W3 Contact key get the value + if (((value = [dict valueForKey:key]) != nil) && ![value isKindOfClass:[NSNull class]]) { + // if necessary convert the W3 value to AB Property label + NSString* setValue = value; + if ([CDVContact needsConversion:key]) { // IM types must be converted + setValue = (NSString*)[CDVContact convertContactTypeToPropertyLabel:value]; + // IMs must have a valid AB value! + if ((prop == kABPersonInstantMessageProperty) && [setValue isEqualToString:(NSString*)kABOtherLabel]) { + setValue = @""; // try empty string + } + } + // set the AB value into the dictionary + [newDict setObject:setValue forKey:(NSString*)[[CDVContact defaultW3CtoAB] valueForKey:(NSString*)key]]; + } + } + + if ([newDict count] == 0) { + newDict = nil; // no items added + } + return newDict; +} + +/* set multivalue dictionary properties into an AddressBook Record + * NSArray* array - array of dictionaries containing the W3C properties to set into the record + * ABPropertyID prop - the property id for the multivalue dictionary (addresses and ims) + * ABRecordRef person - the record to set the values into + * BOOL bUpdate - YES if this is an update to an existing record + * When updating: + * empty array indicates to remove entire property + * value/label == "" indicates to remove + * value/label == [NSNull null] do not modify (keep existing record value) + * RETURN + * bool false indicates fatal error + * + * iOS addresses and im are a MultiValue Properties with label, value=dictionary of info, and id + * set addresses: streetAddress, locality, region, postalCode, country + * set ims: value = username, type = servicetype + * there are some special cases in here for ims - needs cleanup / simplification + * + */ +- (bool)setMultiValueDictionary:(NSArray*)array forProperty:(ABPropertyID)prop inRecord:(ABRecordRef)person asUpdate:(BOOL)bUpdate +{ + bool bSuccess = FALSE; + ABMutableMultiValueRef multi = nil; + + if (!bUpdate) { + multi = [self allocDictMultiValueFromArray:array forProperty:prop]; + bSuccess = [self setValue:multi forProperty:prop inRecord:person]; + } else if (bUpdate && ([array count] == 0)) { + // remove property + bSuccess = [self removeProperty:prop inRecord:person]; + } else { // check for and apply changes + ABMultiValueRef copy = ABRecordCopyValue(person, prop); + if (copy) { + multi = ABMultiValueCreateMutableCopy(copy); + CFRelease(copy); + // get the W3C values for this property + NSArray* propArray = [[CDVContact defaultObjectAndProperties] valueForKey:[[CDVContact defaultABtoW3C] objectForKey:[NSNumber numberWithInt:prop]]]; + id value; + id valueAB; + + for (NSDictionary* field in array) { + NSMutableDictionary* dict; + // find the index for the current property + id idValue = [field valueForKey:kW3ContactFieldId]; + int identifier = [idValue isKindOfClass:[NSNumber class]] ? [idValue intValue] : -1; + CFIndex idx = identifier >= 0 ? ABMultiValueGetIndexForIdentifier(multi, identifier) : kCFNotFound; + BOOL bUpdateLabel = NO; + if (idx != kCFNotFound) { + dict = [NSMutableDictionary dictionaryWithCapacity:1]; + // NSDictionary* existingDictionary = (NSDictionary*)ABMultiValueCopyValueAtIndex(multi, idx); + CFTypeRef existingDictionary = ABMultiValueCopyValueAtIndex(multi, idx); + NSString* existingABLabel = (__bridge_transfer NSString*)ABMultiValueCopyLabelAtIndex(multi, idx); + NSString* testLabel = [field valueForKey:kW3ContactFieldType]; + // fixes cb-143 where setting empty label could cause address to not be removed + // (because empty label would become 'other' in convertContactTypeToPropertyLabel + // which may not have matched existing label thus resulting in an incorrect updating of the label + // and the address not getting removed at the end of the for loop) + if (testLabel && [testLabel isKindOfClass:[NSString class]] && ([testLabel length] > 0)) { + CFStringRef w3cLabel = [CDVContact convertContactTypeToPropertyLabel:testLabel]; + if (w3cLabel && ![existingABLabel isEqualToString:(__bridge NSString*)w3cLabel]) { + // replace the label + ABMultiValueReplaceLabelAtIndex(multi, w3cLabel, idx); + bUpdateLabel = YES; + } + } // else was invalid or empty label string so do not update + + for (id k in propArray) { + value = [field valueForKey:k]; + bool bSet = (value != nil && ![value isKindOfClass:[NSNull class]] && ([value isKindOfClass:[NSString class]] && [value length] > 0)); + // if there is a contact value, put it into dictionary + if (bSet) { + NSString* setValue = [CDVContact needsConversion:(NSString*)k] ? (NSString*)[CDVContact convertContactTypeToPropertyLabel:value] : value; + [dict setObject:setValue forKey:(NSString*)[[CDVContact defaultW3CtoAB] valueForKey:(NSString*)k]]; + } else if ((value == nil) || ([value isKindOfClass:[NSString class]] && ([value length] != 0))) { + // value not provided in contact dictionary - if prop exists in AB dictionary, preserve it + valueAB = [(__bridge NSDictionary*)existingDictionary valueForKey : [[CDVContact defaultW3CtoAB] valueForKey:k]]; + if (valueAB != nil) { + [dict setValue:valueAB forKey:[[CDVContact defaultW3CtoAB] valueForKey:k]]; + } + } // else if value == "" it will not be added into updated dict and thus removed + } // end of for loop (moving here fixes cb-143, need to end for loop before replacing or removing multivalue) + + if ([dict count] > 0) { + // something was added into new dict, + ABMultiValueReplaceValueAtIndex(multi, (__bridge CFTypeRef)dict, idx); + } else if (!bUpdateLabel) { + // nothing added into new dict and no label change so remove this property entry + ABMultiValueRemoveValueAndLabelAtIndex(multi, idx); + } + + CFRelease(existingDictionary); + } else { + // not found in multivalue so add it + dict = [self translateW3Dict:field forProperty:prop]; + if (dict) { + NSMutableDictionary* addDict = [NSMutableDictionary dictionaryWithCapacity:2]; + // get the type out of the original dictionary for address + NSObject* typeValue = ((prop == kABPersonInstantMessageProperty) ? (NSObject*)kABOtherLabel : (NSString*)[field valueForKey:kW3ContactFieldType]); + // NSLog(@"typeValue: %@", typeValue); + [addDict setObject:typeValue forKey:kW3ContactFieldType]; // im labels will be set as Other and address labels as type from dictionary + [addDict setObject:dict forKey:kW3ContactFieldValue]; + [self addToMultiValue:multi fromDictionary:addDict]; + } + } + } // end of looping through dictionaries + + // set the (updated) copy as the new value + bSuccess = [self setValue:multi forProperty:prop inRecord:person]; + } + } // end of copy and apply changes + if (multi) { + CFRelease(multi); + } + + return bSuccess; +} + +/* Determine which W3C labels need to be converted + */ ++ (BOOL)needsConversion:(NSString*)W3Label +{ + BOOL bConvert = NO; + + if ([W3Label isEqualToString:kW3ContactFieldType] || [W3Label isEqualToString:kW3ContactImType]) { + bConvert = YES; + } + return bConvert; +} + +/* Translation of property type labels contact API ---> iPhone + * + * phone: work, home, other, mobile, fax, pager --> + * kABWorkLabel, kABHomeLabel, kABOtherLabel, kABPersonPhoneMobileLabel, kABPersonHomeFAXLabel || kABPersonHomeFAXLabel, kABPersonPhonePagerLabel + * emails: work, home, other ---> kABWorkLabel, kABHomeLabel, kABOtherLabel + * ims: aim, gtalk, icq, xmpp, msn, skype, qq, yahoo --> kABPersonInstantMessageService + (AIM, ICG, MSN, Yahoo). No support for gtalk, xmpp, skype, qq + * addresses: work, home, other --> kABWorkLabel, kABHomeLabel, kABOtherLabel + * + * + */ ++ (CFStringRef)convertContactTypeToPropertyLabel:(NSString*)label +{ + CFStringRef type; + + if ([label isKindOfClass:[NSNull class]] || ![label isKindOfClass:[NSString class]]) { + type = NULL; // no label + } else if ([label caseInsensitiveCompare:kW3ContactWorkLabel] == NSOrderedSame) { + type = kABWorkLabel; + } else if ([label caseInsensitiveCompare:kW3ContactHomeLabel] == NSOrderedSame) { + type = kABHomeLabel; + } else if ([label caseInsensitiveCompare:kW3ContactOtherLabel] == NSOrderedSame) { + type = kABOtherLabel; + } else if ([label caseInsensitiveCompare:kW3ContactPhoneMobileLabel] == NSOrderedSame) { + type = kABPersonPhoneMobileLabel; + } else if ([label caseInsensitiveCompare:kW3ContactPhonePagerLabel] == NSOrderedSame) { + type = kABPersonPhonePagerLabel; + } else if ([label caseInsensitiveCompare:kW3ContactImAIMLabel] == NSOrderedSame) { + type = kABPersonInstantMessageServiceAIM; + } else if ([label caseInsensitiveCompare:kW3ContactImICQLabel] == NSOrderedSame) { + type = kABPersonInstantMessageServiceICQ; + } else if ([label caseInsensitiveCompare:kW3ContactImMSNLabel] == NSOrderedSame) { + type = kABPersonInstantMessageServiceMSN; + } else if ([label caseInsensitiveCompare:kW3ContactImYahooLabel] == NSOrderedSame) { + type = kABPersonInstantMessageServiceYahoo; + } else if ([label caseInsensitiveCompare:kW3ContactUrlProfile] == NSOrderedSame) { + type = kABPersonHomePageLabel; + } else { + type = kABOtherLabel; + } + + return type; +} + ++ (NSString*)convertPropertyLabelToContactType:(NSString*)label +{ + NSString* type = nil; + + if (label != nil) { // improve efficiency...... + if ([label isEqualToString:(NSString*)kABPersonPhoneMobileLabel]) { + type = kW3ContactPhoneMobileLabel; + } else if ([label isEqualToString:(NSString*)kABPersonPhoneHomeFAXLabel] || + [label isEqualToString:(NSString*)kABPersonPhoneWorkFAXLabel]) { + type = kW3ContactPhoneFaxLabel; + } else if ([label isEqualToString:(NSString*)kABPersonPhonePagerLabel]) { + type = kW3ContactPhonePagerLabel; + } else if ([label isEqualToString:(NSString*)kABHomeLabel]) { + type = kW3ContactHomeLabel; + } else if ([label isEqualToString:(NSString*)kABWorkLabel]) { + type = kW3ContactWorkLabel; + } else if ([label isEqualToString:(NSString*)kABOtherLabel]) { + type = kW3ContactOtherLabel; + } else if ([label isEqualToString:(NSString*)kABPersonInstantMessageServiceAIM]) { + type = kW3ContactImAIMLabel; + } else if ([label isEqualToString:(NSString*)kABPersonInstantMessageServiceICQ]) { + type = kW3ContactImICQLabel; + } else if ([label isEqualToString:(NSString*)kABPersonInstantMessageServiceJabber]) { + type = kW3ContactOtherLabel; + } else if ([label isEqualToString:(NSString*)kABPersonInstantMessageServiceMSN]) { + type = kW3ContactImMSNLabel; + } else if ([label isEqualToString:(NSString*)kABPersonInstantMessageServiceYahoo]) { + type = kW3ContactImYahooLabel; + } else if ([label isEqualToString:(NSString*)kABPersonHomePageLabel]) { + type = kW3ContactUrlProfile; + } else { + type = kW3ContactOtherLabel; + } + } + return type; +} + +/* Check if the input label is a valid W3C ContactField.type. This is used when searching, + * only search field types if the search string is a valid type. If we converted any search + * string to a ABPropertyLabel it could convert to kABOtherLabel which is probably not want + * the user wanted to search for and could skew the results. + */ ++ (BOOL)isValidW3ContactType:(NSString*)label +{ + BOOL isValid = NO; + + if ([label isKindOfClass:[NSNull class]] || ![label isKindOfClass:[NSString class]]) { + isValid = NO; // no label + } else if ([label caseInsensitiveCompare:kW3ContactWorkLabel] == NSOrderedSame) { + isValid = YES; + } else if ([label caseInsensitiveCompare:kW3ContactHomeLabel] == NSOrderedSame) { + isValid = YES; + } else if ([label caseInsensitiveCompare:kW3ContactOtherLabel] == NSOrderedSame) { + isValid = YES; + } else if ([label caseInsensitiveCompare:kW3ContactPhoneMobileLabel] == NSOrderedSame) { + isValid = YES; + } else if ([label caseInsensitiveCompare:kW3ContactPhonePagerLabel] == NSOrderedSame) { + isValid = YES; + } else if ([label caseInsensitiveCompare:kW3ContactImAIMLabel] == NSOrderedSame) { + isValid = YES; + } else if ([label caseInsensitiveCompare:kW3ContactImICQLabel] == NSOrderedSame) { + isValid = YES; + } else if ([label caseInsensitiveCompare:kW3ContactImMSNLabel] == NSOrderedSame) { + isValid = YES; + } else if ([label caseInsensitiveCompare:kW3ContactImYahooLabel] == NSOrderedSame) { + isValid = YES; + } else { + isValid = NO; + } + + return isValid; +} + +/* Create a new Contact Dictionary object from an ABRecordRef that contains information in a format such that + * it can be returned to JavaScript callback as JSON object string. + * Uses: + * ABRecordRef set into Contact Object + * NSDictionary withFields indicates which fields to return from the AddressBook Record + * + * JavaScript Contact: + * @param {DOMString} id unique identifier + * @param {DOMString} displayName + * @param {ContactName} name + * @param {DOMString} nickname + * @param {ContactField[]} phoneNumbers array of phone numbers + * @param {ContactField[]} emails array of email addresses + * @param {ContactAddress[]} addresses array of addresses + * @param {ContactField[]} ims instant messaging user ids + * @param {ContactOrganization[]} organizations + * @param {DOMString} published date contact was first created + * @param {DOMString} updated date contact was last updated + * @param {DOMString} birthday contact's birthday + * @param (DOMString} anniversary contact's anniversary + * @param {DOMString} gender contact's gender + * @param {DOMString} note user notes about contact + * @param {DOMString} preferredUsername + * @param {ContactField[]} photos + * @param {ContactField[]} tags + * @param {ContactField[]} relationships + * @param {ContactField[]} urls contact's web sites + * @param {ContactAccounts[]} accounts contact's online accounts + * @param {DOMString} timezone UTC time zone offset + * @param {DOMString} connected + */ + +- (NSDictionary*)toDictionary:(NSDictionary*)withFields +{ + // if not a person type record bail out for now + if (ABRecordGetRecordType(self.record) != kABPersonType) { + return NULL; + } + id value = nil; + self.returnFields = withFields; + + NSMutableDictionary* nc = [NSMutableDictionary dictionaryWithCapacity:1]; // new contact dictionary to fill in from ABRecordRef + // id + [nc setObject:[NSNumber numberWithInt:ABRecordGetRecordID(self.record)] forKey:kW3ContactId]; + if (self.returnFields == nil) { + // if no returnFields specified, W3C says to return empty contact (but Cordova will at least return id) + return nc; + } + if ([self.returnFields objectForKey:kW3ContactDisplayName]) { + // displayname requested - iOS doesn't have so return null + [nc setObject:[NSNull null] forKey:kW3ContactDisplayName]; + // may overwrite below if requested ContactName and there are no values + } + // nickname + if ([self.returnFields valueForKey:kW3ContactNickname]) { + value = (__bridge_transfer NSString*)ABRecordCopyValue(self.record, kABPersonNicknameProperty); + [nc setObject:(value != nil) ? value:[NSNull null] forKey:kW3ContactNickname]; + } + + // name dictionary + // NSLog(@"getting name info"); + NSObject* data = [self extractName]; + if (data != nil) { + [nc setObject:data forKey:kW3ContactName]; + } + if ([self.returnFields objectForKey:kW3ContactDisplayName] && ((data == nil) || ([(NSDictionary*)data objectForKey : kW3ContactFormattedName] == [NSNull null]))) { + // user asked for displayName which iOS doesn't support but there is no other name data being returned + // try and use Composite Name so some name is returned + id tryName = (__bridge_transfer NSString*)ABRecordCopyCompositeName(self.record); + if (tryName != nil) { + [nc setObject:tryName forKey:kW3ContactDisplayName]; + } else { + // use nickname or empty string + value = (__bridge_transfer NSString*)ABRecordCopyValue(self.record, kABPersonNicknameProperty); + [nc setObject:(value != nil) ? value:@"" forKey:kW3ContactDisplayName]; + } + } + // phoneNumbers array + // NSLog(@"getting phoneNumbers"); + value = [self extractMultiValue:kW3ContactPhoneNumbers]; + if (value != nil) { + [nc setObject:value forKey:kW3ContactPhoneNumbers]; + } + // emails array + // NSLog(@"getting emails"); + value = [self extractMultiValue:kW3ContactEmails]; + if (value != nil) { + [nc setObject:value forKey:kW3ContactEmails]; + } + // urls array + value = [self extractMultiValue:kW3ContactUrls]; + if (value != nil) { + [nc setObject:value forKey:kW3ContactUrls]; + } + // addresses array + // NSLog(@"getting addresses"); + value = [self extractAddresses]; + if (value != nil) { + [nc setObject:value forKey:kW3ContactAddresses]; + } + // im array + // NSLog(@"getting ims"); + value = [self extractIms]; + if (value != nil) { + [nc setObject:value forKey:kW3ContactIms]; + } + // organization array (only info for one organization in iOS) + // NSLog(@"getting organizations"); + value = [self extractOrganizations]; + if (value != nil) { + [nc setObject:value forKey:kW3ContactOrganizations]; + } + + // for simple properties, could make this a bit more efficient by storing all simple properties in a single + // array in the returnFields dictionary and setting them via a for loop through the array + + // add dates + // NSLog(@"getting dates"); + NSNumber* ms; + + /** Contact Revision field removed from June 16, 2011 version of specification + + if ([self.returnFields valueForKey:kW3ContactUpdated]){ + ms = [self getDateAsNumber: kABPersonModificationDateProperty]; + if (!ms){ + // try and get published date + ms = [self getDateAsNumber: kABPersonCreationDateProperty]; + } + if (ms){ + [nc setObject: ms forKey:kW3ContactUpdated]; + } + + } + */ + + if ([self.returnFields valueForKey:kW3ContactBirthday]) { + ms = [self getDateAsNumber:kABPersonBirthdayProperty]; + if (ms) { + [nc setObject:ms forKey:kW3ContactBirthday]; + } + } + + /* Anniversary removed from 12-09-2010 W3C Contacts api spec + if ([self.returnFields valueForKey:kW3ContactAnniversary]){ + // Anniversary date is stored in a multivalue property + ABMultiValueRef multi = ABRecordCopyValue(self.record, kABPersonDateProperty); + if (multi){ + CFStringRef label = nil; + CFIndex count = ABMultiValueGetCount(multi); + // see if contains an Anniversary date + for(CFIndex i=0; i 0) { // ?? this will always be true since we set id,label,primary field?? + [(NSMutableArray*)addresses addObject : newAddress]; + } + CFRelease(dict); + } // end of loop through addresses + } else { + addresses = [NSNull null]; + } + if (multi) { + CFRelease(multi); + } + + return addresses; +} + +/* Create array of Dictionaries to match JavaScript ContactField object for ims + * type one of [aim, gtalk, icq, xmpp, msn, skype, qq, yahoo] needs other as well + * value + * (bool) primary + * id + * + * iOS IMs are a MultiValue Properties with label, value=dictionary of IM details (service, username), and id + */ +- (NSObject*)extractIms +{ + NSArray* fields = [self.returnFields objectForKey:kW3ContactIms]; + + if (fields == nil) { // no name fields requested + return nil; + } + NSObject* imArray; + ABMultiValueRef multi = ABRecordCopyValue(self.record, kABPersonInstantMessageProperty); + CFIndex count = multi ? ABMultiValueGetCount(multi) : 0; + if (count) { + imArray = [NSMutableArray arrayWithCapacity:count]; + + for (CFIndex i = 0; i < ABMultiValueGetCount(multi); i++) { + NSMutableDictionary* newDict = [NSMutableDictionary dictionaryWithCapacity:3]; + // iOS has label property (work, home, other) for each IM but W3C contact API doesn't use + CFDictionaryRef dict = (CFDictionaryRef)ABMultiValueCopyValueAtIndex(multi, i); + CFStringRef value; // all values should be CFStringRefs / NSString* + bool bFound; + if ([fields containsObject:kW3ContactFieldValue]) { + // value = user name + bFound = CFDictionaryGetValueIfPresent(dict, kABPersonInstantMessageUsernameKey, (void*)&value); + if (bFound && (value != NULL)) { + CFRetain(value); + [newDict setObject:(__bridge id)value forKey:kW3ContactFieldValue]; + CFRelease(value); + } else { + [newDict setObject:[NSNull null] forKey:kW3ContactFieldValue]; + } + } + if ([fields containsObject:kW3ContactFieldType]) { + bFound = CFDictionaryGetValueIfPresent(dict, kABPersonInstantMessageServiceKey, (void*)&value); + if (bFound && (value != NULL)) { + CFRetain(value); + [newDict setObject:(id)[[CDVContact class] convertPropertyLabelToContactType : (__bridge NSString*)value] forKey:kW3ContactFieldType]; + CFRelease(value); + } else { + [newDict setObject:[NSNull null] forKey:kW3ContactFieldType]; + } + } + // always set ID + id identifier = [NSNumber numberWithUnsignedInt:ABMultiValueGetIdentifierAtIndex(multi, i)]; + [newDict setObject:(identifier != nil) ? identifier:[NSNull null] forKey:kW3ContactFieldId]; + + [(NSMutableArray*)imArray addObject : newDict]; + CFRelease(dict); + } + } else { + imArray = [NSNull null]; + } + + if (multi) { + CFRelease(multi); + } + return imArray; +} + +/* Create array of Dictionaries to match JavaScript ContactOrganization object + * pref - not supported in iOS + * type - not supported in iOS + * name + * department + * title + */ + +- (NSObject*)extractOrganizations +{ + NSArray* fields = [self.returnFields objectForKey:kW3ContactOrganizations]; + + if (fields == nil) { // no name fields requested + return nil; + } + NSObject* array = nil; + NSMutableDictionary* newDict = [NSMutableDictionary dictionaryWithCapacity:5]; + id value; + int validValueCount = 0; + + for (id i in fields) { + id key = [[CDVContact defaultW3CtoAB] valueForKey:i]; + if (key && [key isKindOfClass:[NSNumber class]]) { + value = (__bridge_transfer NSString*)ABRecordCopyValue(self.record, (ABPropertyID)[[[CDVContact defaultW3CtoAB] valueForKey:i] intValue]); + if (value != nil) { + // if there are no organization values we should return null for organization + // this counter keeps indicates if any organization values have been set + validValueCount++; + } + [newDict setObject:(value != nil) ? value:[NSNull null] forKey:i]; + } else { // not a key iOS supports, set to null + [newDict setObject:[NSNull null] forKey:i]; + } + } + + if (([newDict count] > 0) && (validValueCount > 0)) { + // add pref and type + // they are not supported by iOS and thus these values never change + [newDict setObject:@"false" forKey:kW3ContactFieldPrimary]; + [newDict setObject:[NSNull null] forKey:kW3ContactFieldType]; + array = [NSMutableArray arrayWithCapacity:1]; + [(NSMutableArray*)array addObject : newDict]; + } else { + array = [NSNull null]; + } + return array; +} + +// W3C Contacts expects an array of photos. Can return photos in more than one format, currently +// just returning the default format +// Save the photo data into tmp directory and return FileURI - temp directory is deleted upon application exit +- (NSObject*)extractPhotos +{ + NSMutableArray* photos = nil; + + if (ABPersonHasImageData(self.record)) { + CFDataRef photoData = ABPersonCopyImageData(self.record); + NSData* data = (__bridge NSData*)photoData; + // write to temp directory and store URI in photos array + // get the temp directory path + NSString* docsPath = [NSTemporaryDirectory()stringByStandardizingPath]; + NSError* err = nil; + NSString* filePath = [NSString stringWithFormat:@"%@/photo_XXXXX", docsPath]; + char template[filePath.length + 1]; + strcpy(template, [filePath cStringUsingEncoding:NSASCIIStringEncoding]); + mkstemp(template); + filePath = [[NSFileManager defaultManager] + stringWithFileSystemRepresentation:template + length:strlen(template)]; + + // save file + if ([data writeToFile:filePath options:NSAtomicWrite error:&err]) { + photos = [NSMutableArray arrayWithCapacity:1]; + NSMutableDictionary* newDict = [NSMutableDictionary dictionaryWithCapacity:2]; + [newDict setObject:filePath forKey:kW3ContactFieldValue]; + [newDict setObject:@"url" forKey:kW3ContactFieldType]; + [newDict setObject:@"false" forKey:kW3ContactFieldPrimary]; + [photos addObject:newDict]; + } + + CFRelease(photoData); + } + return photos; +} + +/** + * given an array of W3C Contact field names, create a dictionary of field names to extract + * if field name represents an object, return all properties for that object: "name" - returns all properties in ContactName + * if field name is an explicit property, return only those properties: "name.givenName - returns a ContactName with only ContactName.givenName + * if field contains ONLY ["*"] return all fields + * dictionary format: + * key is W3Contact #define + * value is NSMutableArray* for complex keys: name,addresses,organizations, phone, emails, ims + * value is [NSNull null] for simple keys +*/ ++ (NSDictionary*)calcReturnFields:(NSArray*)fieldsArray // NSLog(@"getting self.returnFields"); +{ + NSMutableDictionary* d = [NSMutableDictionary dictionaryWithCapacity:1]; + + if ((fieldsArray != nil) && [fieldsArray isKindOfClass:[NSArray class]]) { + if (([fieldsArray count] == 1) && [[fieldsArray objectAtIndex:0] isEqualToString:@"*"]) { + return [CDVContact defaultFields]; // return all fields + } + + for (id i in fieldsArray) { + NSMutableArray* keys = nil; + NSString* fieldStr = nil; + if ([i isKindOfClass:[NSNumber class]]) { + fieldStr = [i stringValue]; + } else { + fieldStr = i; + } + + // see if this is specific property request in object - object.property + NSArray* parts = [fieldStr componentsSeparatedByString:@"."]; // returns original string if no separator found + NSString* name = [parts objectAtIndex:0]; + NSString* property = nil; + if ([parts count] > 1) { + property = [parts objectAtIndex:1]; + } + // see if this is a complex field by looking for its array of properties in objectAndProperties dictionary + id fields = [[CDVContact defaultObjectAndProperties] objectForKey:name]; + + // if find complex name (name,addresses,organizations, phone, emails, ims) in fields, add name as key + // with array of associated properties as the value + if ((fields != nil) && (property == nil)) { // request was for full object + keys = [NSMutableArray arrayWithArray:fields]; + if (keys != nil) { + [d setObject:keys forKey:name]; // will replace if prop array already exists + } + } else if ((fields != nil) && (property != nil)) { + // found an individual property request in form of name.property + // verify is real property name by using it as key in W3CtoAB + id abEquiv = [[CDVContact defaultW3CtoAB] objectForKey:property]; + if (abEquiv || [[CDVContact defaultW3CtoNull] containsObject:property]) { + // if existing array add to it + if ((keys = [d objectForKey:name]) != nil) { + [keys addObject:property]; + } else { + keys = [NSMutableArray arrayWithObject:property]; + [d setObject:keys forKey:name]; + } + } else { + NSLog(@"Contacts.find -- request for invalid property ignored: %@.%@", name, property); + } + } else { // is an individual property, verify is real property name by using it as key in W3CtoAB + id valid = [[CDVContact defaultW3CtoAB] objectForKey:name]; + if (valid || [[CDVContact defaultW3CtoNull] containsObject:name]) { + [d setObject:[NSNull null] forKey:name]; + } + } + } + } + if ([d count] == 0) { + // no array or nothing in the array. W3C spec says to return nothing + return nil; // [Contact defaultFields]; + } + return d; +} + +/* + * Search for the specified value in each of the fields specified in the searchFields dictionary. + * NSString* value - the string value to search for (need clarification from W3C on how to search for dates) + * NSDictionary* searchFields - a dictionary created via calcReturnFields where the key is the top level W3C + * object and the object is the array of specific fields within that object or null if it is a single property + * RETURNS + * YES as soon as a match is found in any of the fields + * NO - the specified value does not exist in any of the fields in this contact + * + * Note: I'm not a fan of returning in the middle of methods but have done it some in this method in order to + * keep the code simpler. bgibson + */ +- (BOOL)foundValue:(NSString*)testValue inFields:(NSDictionary*)searchFields +{ + BOOL bFound = NO; + + if ((testValue == nil) || ![testValue isKindOfClass:[NSString class]] || ([testValue length] == 0)) { + // nothing to find so return NO + return NO; + } + NSInteger valueAsInt = [testValue integerValue]; + + // per W3C spec, always include id in search + int recordId = ABRecordGetRecordID(self.record); + if (valueAsInt && (recordId == valueAsInt)) { + return YES; + } + + if (searchFields == nil) { + // no fields to search + return NO; + } + + if ([searchFields valueForKey:kW3ContactNickname]) { + bFound = [self testStringValue:testValue forW3CProperty:kW3ContactNickname]; + if (bFound == YES) { + return bFound; + } + } + + if ([searchFields valueForKeyIsArray:kW3ContactName]) { + // test name fields. All are string properties obtained via ABRecordCopyValue except kW3ContactFormattedName + NSArray* fields = [searchFields valueForKey:kW3ContactName]; + + for (NSString* testItem in fields) { + if ([testItem isEqualToString:kW3ContactFormattedName]) { + NSString* propValue = (__bridge_transfer NSString*)ABRecordCopyCompositeName(self.record); + if ((propValue != nil) && ([propValue length] > 0)) { + NSRange range = [propValue rangeOfString:testValue options:NSCaseInsensitiveSearch]; + bFound = (range.location != NSNotFound); + propValue = nil; + } + } else { + bFound = [self testStringValue:testValue forW3CProperty:testItem]; + } + + if (bFound) { + break; + } + } + } + if (!bFound && [searchFields valueForKeyIsArray:kW3ContactPhoneNumbers]) { + bFound = [self searchContactFields:(NSArray*)[searchFields valueForKey:kW3ContactPhoneNumbers] + forMVStringProperty:kABPersonPhoneProperty withValue:testValue]; + } + if (!bFound && [searchFields valueForKeyIsArray:kW3ContactEmails]) { + bFound = [self searchContactFields:(NSArray*)[searchFields valueForKey:kW3ContactEmails] + forMVStringProperty:kABPersonEmailProperty withValue:testValue]; + } + + if (!bFound && [searchFields valueForKeyIsArray:kW3ContactAddresses]) { + bFound = [self searchContactFields:[searchFields valueForKey:kW3ContactAddresses] + forMVDictionaryProperty:kABPersonAddressProperty withValue:testValue]; + } + + if (!bFound && [searchFields valueForKeyIsArray:kW3ContactIms]) { + bFound = [self searchContactFields:[searchFields valueForKey:kW3ContactIms] + forMVDictionaryProperty:kABPersonInstantMessageProperty withValue:testValue]; + } + + if (!bFound && [searchFields valueForKeyIsArray:kW3ContactOrganizations]) { + NSArray* fields = [searchFields valueForKey:kW3ContactOrganizations]; + + for (NSString* testItem in fields) { + bFound = [self testStringValue:testValue forW3CProperty:testItem]; + if (bFound == YES) { + break; + } + } + } + if (!bFound && [searchFields valueForKey:kW3ContactNote]) { + bFound = [self testStringValue:testValue forW3CProperty:kW3ContactNote]; + } + + // if searching for a date field is requested, get the date field as a localized string then look for match against testValue in date string + // searching for photos is not supported + if (!bFound && [searchFields valueForKey:kW3ContactBirthday]) { + bFound = [self testDateValue:testValue forW3CProperty:kW3ContactBirthday]; + } + if (!bFound && [searchFields valueForKeyIsArray:kW3ContactUrls]) { + bFound = [self searchContactFields:(NSArray*)[searchFields valueForKey:kW3ContactUrls] + forMVStringProperty:kABPersonURLProperty withValue:testValue]; + } + + return bFound; +} + +/* + * Test for the existence of a given string within the value of a ABPersonRecord string property based on the W3c property name. + * + * IN: + * NSString* testValue - the value to find - search is case insensitive + * NSString* property - the W3c property string + * OUT: + * BOOL YES if the given string was found within the property value + * NO if the testValue was not found, W3C property string was invalid or the AddressBook property was not a string + */ +- (BOOL)testStringValue:(NSString*)testValue forW3CProperty:(NSString*)property +{ + BOOL bFound = NO; + + if ([[CDVContact defaultW3CtoAB] valueForKeyIsNumber:property]) { + ABPropertyID propId = [[[CDVContact defaultW3CtoAB] objectForKey:property] intValue]; + if (ABPersonGetTypeOfProperty(propId) == kABStringPropertyType) { + NSString* propValue = (__bridge_transfer NSString*)ABRecordCopyValue(self.record, propId); + if ((propValue != nil) && ([propValue length] > 0)) { + NSPredicate* containPred = [NSPredicate predicateWithFormat:@"SELF contains[cd] %@", testValue]; + bFound = [containPred evaluateWithObject:propValue]; + // NSRange range = [propValue rangeOfString:testValue options: NSCaseInsensitiveSearch]; + // bFound = (range.location != NSNotFound); + } + } + } + return bFound; +} + +/* + * Test for the existence of a given Date string within the value of a ABPersonRecord datetime property based on the W3c property name. + * + * IN: + * NSString* testValue - the value to find - search is case insensitive + * NSString* property - the W3c property string + * OUT: + * BOOL YES if the given string was found within the localized date string value + * NO if the testValue was not found, W3C property string was invalid or the AddressBook property was not a DateTime + */ +- (BOOL)testDateValue:(NSString*)testValue forW3CProperty:(NSString*)property +{ + BOOL bFound = NO; + + if ([[CDVContact defaultW3CtoAB] valueForKeyIsNumber:property]) { + ABPropertyID propId = [[[CDVContact defaultW3CtoAB] objectForKey:property] intValue]; + if (ABPersonGetTypeOfProperty(propId) == kABDateTimePropertyType) { + NSDate* date = (__bridge_transfer NSDate*)ABRecordCopyValue(self.record, propId); + if (date != nil) { + NSString* dateString = [date descriptionWithLocale:[NSLocale currentLocale]]; + NSPredicate* containPred = [NSPredicate predicateWithFormat:@"SELF contains[cd] %@", testValue]; + bFound = [containPred evaluateWithObject:dateString]; + } + } + } + return bFound; +} + +/* + * Search the specified fields within an AddressBook multivalue string property for the specified test value. + * Used for phoneNumbers, emails and urls. + * IN: + * NSArray* fields - the fields to search for within the multistring property (value and/or type) + * ABPropertyID - the property to search + * NSString* testValue - the value to search for. Will convert between W3C types and AB types. Will only + * search for types if the testValue is a valid ContactField type. + * OUT: + * YES if the test value was found in one of the specified fields + * NO if the test value was not found + */ +- (BOOL)searchContactFields:(NSArray*)fields forMVStringProperty:(ABPropertyID)propId withValue:testValue +{ + BOOL bFound = NO; + + for (NSString* type in fields) { + NSString* testString = nil; + if ([type isEqualToString:kW3ContactFieldType]) { + if ([CDVContact isValidW3ContactType:testValue]) { + // only search types if the filter string is a valid ContactField.type + testString = (NSString*)[CDVContact convertContactTypeToPropertyLabel:testValue]; + } + } else { + testString = testValue; + } + + if (testString != nil) { + bFound = [self testMultiValueStrings:testString forProperty:propId ofType:type]; + } + if (bFound == YES) { + break; + } + } + + return bFound; +} + +/* + * Searches a multiString value of the specified type for the specified test value. + * + * IN: + * NSString* testValue - the value to test for + * ABPropertyID propId - the property id of the multivalue property to search + * NSString* type - the W3C contact type to search for (value or type) + * OUT: + * YES is the test value was found + * NO if the test value was not found + */ +- (BOOL)testMultiValueStrings:(NSString*)testValue forProperty:(ABPropertyID)propId ofType:(NSString*)type +{ + BOOL bFound = NO; + + if (ABPersonGetTypeOfProperty(propId) == kABMultiStringPropertyType) { + NSArray* valueArray = nil; + if ([type isEqualToString:kW3ContactFieldType]) { + valueArray = [self labelsForProperty:propId inRecord:self.record]; + } else if ([type isEqualToString:kW3ContactFieldValue]) { + valueArray = [self valuesForProperty:propId inRecord:self.record]; + } + if (valueArray) { + NSString* valuesAsString = [valueArray componentsJoinedByString:@" "]; + NSPredicate* containPred = [NSPredicate predicateWithFormat:@"SELF contains[cd] %@", testValue]; + bFound = [containPred evaluateWithObject:valuesAsString]; + } + } + return bFound; +} + +/* + * Returns the array of values for a multivalue string property of the specified property id + */ +- (__autoreleasing NSArray*)valuesForProperty:(ABPropertyID)propId inRecord:(ABRecordRef)aRecord +{ + ABMultiValueRef multi = ABRecordCopyValue(aRecord, propId); + NSArray* values = (__bridge_transfer NSArray*)ABMultiValueCopyArrayOfAllValues(multi); + + CFRelease(multi); + return values; +} + +/* + * Returns the array of labels for a multivalue string property of the specified property id + */ +- (NSArray*)labelsForProperty:(ABPropertyID)propId inRecord:(ABRecordRef)aRecord +{ + ABMultiValueRef multi = ABRecordCopyValue(aRecord, propId); + CFIndex count = ABMultiValueGetCount(multi); + NSMutableArray* labels = [NSMutableArray arrayWithCapacity:count]; + + for (int i = 0; i < count; i++) { + NSString* label = (__bridge_transfer NSString*)ABMultiValueCopyLabelAtIndex(multi, i); + if (label) { + [labels addObject:label]; + } + } + + CFRelease(multi); + return labels; +} + +/* search for values within MultiValue Dictionary properties Address or IM property + * IN: + * (NSArray*) fields - the array of W3C field names to search within + * (ABPropertyID) propId - the AddressBook property that returns a multivalue dictionary + * (NSString*) testValue - the string to search for within the specified fields + * + */ +- (BOOL)searchContactFields:(NSArray*)fields forMVDictionaryProperty:(ABPropertyID)propId withValue:(NSString*)testValue +{ + BOOL bFound = NO; + + NSArray* values = [self valuesForProperty:propId inRecord:self.record]; // array of dictionaries (as CFDictionaryRef) + int dictCount = [values count]; + + // for ims dictionary contains with service (w3C type) and username (W3c value) + // for addresses dictionary contains street, city, state, zip, country + for (int i = 0; i < dictCount; i++) { + CFDictionaryRef dict = (__bridge CFDictionaryRef)[values objectAtIndex:i]; + + for (NSString* member in fields) { + NSString* abKey = [[CDVContact defaultW3CtoAB] valueForKey:member]; // im and address fields are all strings + CFStringRef abValue = nil; + if (abKey) { + NSString* testString = nil; + if ([member isEqualToString:kW3ContactImType]) { + if ([CDVContact isValidW3ContactType:testValue]) { + // only search service/types if the filter string is a valid ContactField.type + testString = (NSString*)[CDVContact convertContactTypeToPropertyLabel:testValue]; + } + } else { + testString = testValue; + } + if (testString != nil) { + BOOL bExists = CFDictionaryGetValueIfPresent(dict, (__bridge const void*)abKey, (void*)&abValue); + if (bExists) { + CFRetain(abValue); + NSPredicate* containPred = [NSPredicate predicateWithFormat:@"SELF contains[cd] %@", testString]; + bFound = [containPred evaluateWithObject:(__bridge id)abValue]; + CFRelease(abValue); + } + } + } + if (bFound == YES) { + break; + } + } // end of for each member in fields + + if (bFound == YES) { + break; + } + } // end of for each dictionary + + return bFound; +} + +@end diff --git a/cordova-lib/spec-plugman-create/plugins/Contacts/src/ios/CDVContacts.h b/cordova-lib/spec-plugman-create/plugins/Contacts/src/ios/CDVContacts.h new file mode 100644 index 000000000..e3deb21b4 --- /dev/null +++ b/cordova-lib/spec-plugman-create/plugins/Contacts/src/ios/CDVContacts.h @@ -0,0 +1,151 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. + */ + +#import +#import +#import +#import +#import "CDVContact.h" + +@interface CDVContacts : CDVPlugin +{ + ABAddressBookRef addressBook; +} + +/* + * newContact - create a new contact via the GUI + * + * arguments: + * 1: successCallback: this is the javascript function that will be called with the newly created contactId + */ +- (void)newContact:(CDVInvokedUrlCommand*)command; + +/* + * displayContact - IN PROGRESS + * + * arguments: + * 1: recordID of the contact to display in the iPhone contact display + * 2: successCallback - currently not used + * 3: error callback + * options: + * allowsEditing: set to true to allow the user to edit the contact - currently not supported + */ +- (void)displayContact:(CDVInvokedUrlCommand*)command; + +/* + * chooseContact + * + * arguments: + * 1: this is the javascript function that will be called with the contact data as a JSON object (as the first param) + * options: + * allowsEditing: set to true to not choose the contact, but to edit it in the iPhone contact editor + */ +- (void)chooseContact:(CDVInvokedUrlCommand*)command; + +- (void)newPersonViewController:(ABNewPersonViewController*)newPersonViewController didCompleteWithNewPerson:(ABRecordRef)person; +- (BOOL)personViewController:(ABPersonViewController*)personViewController shouldPerformDefaultActionForPerson:(ABRecordRef)person + property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifierForValue; + +/* + * search - searches for contacts. Only person records are currently supported. + * + * arguments: + * 1: successcallback - this is the javascript function that will be called with the array of found contacts + * 2: errorCallback - optional javascript function to be called in the event of an error with an error code. + * options: dictionary containing ContactFields and ContactFindOptions + * fields - ContactFields array + * findOptions - ContactFindOptions object as dictionary + * + */ +- (void)search:(CDVInvokedUrlCommand*)command; + +/* + * save - saves a new contact or updates and existing contact + * + * arguments: + * 1: success callback - this is the javascript function that will be called with the JSON representation of the saved contact + * search calls a fixed navigator.service.contacts._findCallback which then calls the success callback stored before making the call into obj-c + */ +- (void)save:(CDVInvokedUrlCommand*)command; + +/* + * remove - removes a contact from the address book + * + * arguments: + * 1: 1: successcallback - this is the javascript function that will be called with a (now) empty contact object + * + * options: dictionary containing Contact object to remove + * contact - Contact object as dictionary + */ +- (void)remove:(CDVInvokedUrlCommand*)command; + +// - (void) dealloc; + +@end + +@interface CDVContactsPicker : ABPeoplePickerNavigationController +{ + BOOL allowsEditing; + NSString* callbackId; + NSDictionary* options; + NSDictionary* pickedContactDictionary; +} + +@property BOOL allowsEditing; +@property (copy) NSString* callbackId; +@property (nonatomic, strong) NSDictionary* options; +@property (nonatomic, strong) NSDictionary* pickedContactDictionary; + +@end + +@interface CDVNewContactsController : ABNewPersonViewController +{ + NSString* callbackId; +} +@property (copy) NSString* callbackId; +@end + +/* ABPersonViewController does not have any UI to dismiss. Adding navigationItems to it does not work properly, the navigationItems are lost when the app goes into the background. + The solution was to create an empty NavController in front of the ABPersonViewController. This + causes the ABPersonViewController to have a back button. By subclassing the ABPersonViewController, + we can override viewWillDisappear and take down the entire NavigationController at that time. + */ +@interface CDVDisplayContactViewController : ABPersonViewController +{} +@property (nonatomic, strong) CDVPlugin* contactsPlugin; + +@end +@interface CDVAddressBookAccessError : NSObject +{} +@property (assign) CDVContactError errorCode; +- (CDVAddressBookAccessError*)initWithCode:(CDVContactError)code; +@end + +typedef void (^ CDVAddressBookWorkerBlock)( + ABAddressBookRef addressBook, + CDVAddressBookAccessError* error + ); +@interface CDVAddressBookHelper : NSObject +{} + +- (void)createAddressBook:(CDVAddressBookWorkerBlock)workerBlock; +@end diff --git a/cordova-lib/spec-plugman-create/plugins/Contacts/src/ios/CDVContacts.m b/cordova-lib/spec-plugman-create/plugins/Contacts/src/ios/CDVContacts.m new file mode 100644 index 000000000..3ca3e814d --- /dev/null +++ b/cordova-lib/spec-plugman-create/plugins/Contacts/src/ios/CDVContacts.m @@ -0,0 +1,593 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. + */ + +#import "CDVContacts.h" +#import +#import +#import +//#import "CDVNotification.h" + +@implementation CDVContactsPicker + +@synthesize allowsEditing; +@synthesize callbackId; +@synthesize options; +@synthesize pickedContactDictionary; + +@end +@implementation CDVNewContactsController + +@synthesize callbackId; + +@end + +@implementation CDVContacts + +// no longer used since code gets AddressBook for each operation. +// If address book changes during save or remove operation, may get error but not much we can do about it +// If address book changes during UI creation, display or edit, we don't control any saves so no need for callback + +/*void addressBookChanged(ABAddressBookRef addressBook, CFDictionaryRef info, void* context) +{ + // note that this function is only called when another AddressBook instance modifies + // the address book, not the current one. For example, through an OTA MobileMe sync + Contacts* contacts = (Contacts*)context; + [contacts addressBookDirty]; + }*/ + +- (CDVPlugin*)initWithWebView:(UIWebView*)theWebView +{ + self = (CDVContacts*)[super initWithWebView:(UIWebView*)theWebView]; + + /*if (self) { + addressBook = ABAddressBookCreate(); + ABAddressBookRegisterExternalChangeCallback(addressBook, addressBookChanged, self); + }*/ + + return self; +} + +// overridden to clean up Contact statics +- (void)onAppTerminate +{ + // NSLog(@"Contacts::onAppTerminate"); +} + +// iPhone only method to create a new contact through the GUI +- (void)newContact:(CDVInvokedUrlCommand*)command +{ + NSString* callbackId = command.callbackId; + + CDVAddressBookHelper* abHelper = [[CDVAddressBookHelper alloc] init]; + CDVContacts* __weak weakSelf = self; // play it safe to avoid retain cycles + + [abHelper createAddressBook: ^(ABAddressBookRef addrBook, CDVAddressBookAccessError* errCode) { + if (addrBook == NULL) { + // permission was denied or other error just return (no error callback) + return; + } + CDVNewContactsController* npController = [[CDVNewContactsController alloc] init]; + npController.addressBook = addrBook; // a CF retaining assign + CFRelease(addrBook); + + npController.newPersonViewDelegate = self; + npController.callbackId = callbackId; + + UINavigationController* navController = [[UINavigationController alloc] initWithRootViewController:npController]; + + if ([weakSelf.viewController respondsToSelector:@selector(presentViewController:::)]) { + [weakSelf.viewController presentViewController:navController animated:YES completion:nil]; + } else { + [weakSelf.viewController presentModalViewController:navController animated:YES]; + } + }]; +} + +- (void)newPersonViewController:(ABNewPersonViewController*)newPersonViewController didCompleteWithNewPerson:(ABRecordRef)person +{ + ABRecordID recordId = kABRecordInvalidID; + CDVNewContactsController* newCP = (CDVNewContactsController*)newPersonViewController; + NSString* callbackId = newCP.callbackId; + + if (person != NULL) { + // return the contact id + recordId = ABRecordGetRecordID(person); + } + + if ([newPersonViewController respondsToSelector:@selector(presentingViewController)]) { + [[newPersonViewController presentingViewController] dismissViewControllerAnimated:YES completion:nil]; + } else { + [[newPersonViewController parentViewController] dismissModalViewControllerAnimated:YES]; + } + + CDVPluginResult* result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsInt:recordId]; + [self.commandDelegate sendPluginResult:result callbackId:callbackId]; +} + +- (void)displayContact:(CDVInvokedUrlCommand*)command +{ + NSString* callbackId = command.callbackId; + ABRecordID recordID = [[command.arguments objectAtIndex:0] intValue]; + NSDictionary* options = [command.arguments objectAtIndex:1 withDefault:[NSNull null]]; + bool bEdit = [options isKindOfClass:[NSNull class]] ? false : [options existsValue:@"true" forKey:@"allowsEditing"]; + + CDVAddressBookHelper* abHelper = [[CDVAddressBookHelper alloc] init]; + CDVContacts* __weak weakSelf = self; // play it safe to avoid retain cycles + + [abHelper createAddressBook: ^(ABAddressBookRef addrBook, CDVAddressBookAccessError* errCode) { + if (addrBook == NULL) { + // permission was denied or other error - return error + CDVPluginResult* result = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageToErrorObject:errCode ? errCode.errorCode:UNKNOWN_ERROR]; + [weakSelf.commandDelegate sendPluginResult:result callbackId:callbackId]; + return; + } + ABRecordRef rec = ABAddressBookGetPersonWithRecordID(addrBook, recordID); + + if (rec) { + CDVDisplayContactViewController* personController = [[CDVDisplayContactViewController alloc] init]; + personController.displayedPerson = rec; + personController.personViewDelegate = self; + personController.allowsEditing = NO; + + // create this so DisplayContactViewController will have a "back" button. + UIViewController* parentController = [[UIViewController alloc] init]; + UINavigationController* navController = [[UINavigationController alloc] initWithRootViewController:parentController]; + + [navController pushViewController:personController animated:YES]; + + if ([self.viewController respondsToSelector:@selector(presentViewController:::)]) { + [self.viewController presentViewController:navController animated:YES completion:nil]; + } else { + [self.viewController presentModalViewController:navController animated:YES]; + } + + if (bEdit) { + // create the editing controller and push it onto the stack + ABPersonViewController* editPersonController = [[ABPersonViewController alloc] init]; + editPersonController.displayedPerson = rec; + editPersonController.personViewDelegate = self; + editPersonController.allowsEditing = YES; + [navController pushViewController:editPersonController animated:YES]; + } + } else { + // no record, return error + CDVPluginResult* result = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsInt:UNKNOWN_ERROR]; + [weakSelf.commandDelegate sendPluginResult:result callbackId:callbackId]; + } + CFRelease(addrBook); + }]; +} + +- (BOOL)personViewController:(ABPersonViewController*)personViewController shouldPerformDefaultActionForPerson:(ABRecordRef)person + property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifierForValue +{ + return YES; +} + +- (void)chooseContact:(CDVInvokedUrlCommand*)command +{ + NSString* callbackId = command.callbackId; + NSDictionary* options = [command.arguments objectAtIndex:0 withDefault:[NSNull null]]; + + CDVContactsPicker* pickerController = [[CDVContactsPicker alloc] init]; + + pickerController.peoplePickerDelegate = self; + pickerController.callbackId = callbackId; + pickerController.options = options; + pickerController.pickedContactDictionary = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithInt:kABRecordInvalidID], kW3ContactId, nil]; + pickerController.allowsEditing = (BOOL)[options existsValue : @"true" forKey : @"allowsEditing"]; + + if ([self.viewController respondsToSelector:@selector(presentViewController:::)]) { + [self.viewController presentViewController:pickerController animated:YES completion:nil]; + } else { + [self.viewController presentModalViewController:pickerController animated:YES]; + } +} + +- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController*)peoplePicker + shouldContinueAfterSelectingPerson:(ABRecordRef)person +{ + CDVContactsPicker* picker = (CDVContactsPicker*)peoplePicker; + NSNumber* pickedId = [NSNumber numberWithInt:ABRecordGetRecordID(person)]; + + if (picker.allowsEditing) { + ABPersonViewController* personController = [[ABPersonViewController alloc] init]; + personController.displayedPerson = person; + personController.personViewDelegate = self; + personController.allowsEditing = picker.allowsEditing; + // store id so can get info in peoplePickerNavigationControllerDidCancel + picker.pickedContactDictionary = [NSDictionary dictionaryWithObjectsAndKeys:pickedId, kW3ContactId, nil]; + + [peoplePicker pushViewController:personController animated:YES]; + } else { + // Retrieve and return pickedContact information + CDVContact* pickedContact = [[CDVContact alloc] initFromABRecord:(ABRecordRef)person]; + NSArray* fields = [picker.options objectForKey:@"fields"]; + NSDictionary* returnFields = [[CDVContact class] calcReturnFields:fields]; + picker.pickedContactDictionary = [pickedContact toDictionary:returnFields]; + + CDVPluginResult* result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDictionary:picker.pickedContactDictionary]; + [self.commandDelegate sendPluginResult:result callbackId:picker.callbackId]; + + if ([picker respondsToSelector:@selector(presentingViewController)]) { + [[picker presentingViewController] dismissViewControllerAnimated:YES completion:nil]; + } else { + [[picker parentViewController] dismissModalViewControllerAnimated:YES]; + } + } + return NO; +} + +- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController*)peoplePicker + shouldContinueAfterSelectingPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier +{ + return YES; +} + +- (void)peoplePickerNavigationControllerDidCancel:(ABPeoplePickerNavigationController*)peoplePicker +{ + // return contactId or invalid if none picked + CDVContactsPicker* picker = (CDVContactsPicker*)peoplePicker; + + if (picker.allowsEditing) { + // get the info after possible edit + // if we got this far, user has already approved/ disapproved addressBook access + ABAddressBookRef addrBook = nil; +#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 60000 + if (&ABAddressBookCreateWithOptions != NULL) { + addrBook = ABAddressBookCreateWithOptions(NULL, NULL); + } else +#endif + { + // iOS 4 & 5 + addrBook = ABAddressBookCreate(); + } + ABRecordRef person = ABAddressBookGetPersonWithRecordID(addrBook, [[picker.pickedContactDictionary objectForKey:kW3ContactId] integerValue]); + if (person) { + CDVContact* pickedContact = [[CDVContact alloc] initFromABRecord:(ABRecordRef)person]; + NSArray* fields = [picker.options objectForKey:@"fields"]; + NSDictionary* returnFields = [[CDVContact class] calcReturnFields:fields]; + picker.pickedContactDictionary = [pickedContact toDictionary:returnFields]; + } + CFRelease(addrBook); + } + CDVPluginResult* result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDictionary:picker.pickedContactDictionary]; + [self.commandDelegate sendPluginResult:result callbackId:picker.callbackId]; + + if ([peoplePicker respondsToSelector:@selector(presentingViewController)]) { + [[peoplePicker presentingViewController] dismissViewControllerAnimated:YES completion:nil]; + } else { + [[peoplePicker parentViewController] dismissModalViewControllerAnimated:YES]; + } +} + +- (void)search:(CDVInvokedUrlCommand*)command +{ + NSString* callbackId = command.callbackId; + NSArray* fields = [command.arguments objectAtIndex:0]; + NSDictionary* findOptions = [command.arguments objectAtIndex:1 withDefault:[NSNull null]]; + + [self.commandDelegate runInBackground:^{ + // from Apple: Important You must ensure that an instance of ABAddressBookRef is used by only one thread. + // which is why address book is created within the dispatch queue. + // more details here: http: //blog.byadrian.net/2012/05/05/ios-addressbook-framework-and-gcd/ + CDVAddressBookHelper* abHelper = [[CDVAddressBookHelper alloc] init]; + CDVContacts* __weak weakSelf = self; // play it safe to avoid retain cycles + // it gets uglier, block within block..... + [abHelper createAddressBook: ^(ABAddressBookRef addrBook, CDVAddressBookAccessError* errCode) { + if (addrBook == NULL) { + // permission was denied or other error - return error + CDVPluginResult* result = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageToErrorObject:errCode ? errCode.errorCode:UNKNOWN_ERROR]; + [weakSelf.commandDelegate sendPluginResult:result callbackId:callbackId]; + return; + } + + NSArray* foundRecords = nil; + // get the findOptions values + BOOL multiple = NO; // default is false + NSString* filter = nil; + if (![findOptions isKindOfClass:[NSNull class]]) { + id value = nil; + filter = (NSString*)[findOptions objectForKey:@"filter"]; + value = [findOptions objectForKey:@"multiple"]; + if ([value isKindOfClass:[NSNumber class]]) { + // multiple is a boolean that will come through as an NSNumber + multiple = [(NSNumber*)value boolValue]; + // NSLog(@"multiple is: %d", multiple); + } + } + + NSDictionary* returnFields = [[CDVContact class] calcReturnFields:fields]; + + NSMutableArray* matches = nil; + if (!filter || [filter isEqualToString:@""]) { + // get all records + foundRecords = (__bridge_transfer NSArray*)ABAddressBookCopyArrayOfAllPeople(addrBook); + if (foundRecords && ([foundRecords count] > 0)) { + // create Contacts and put into matches array + // doesn't make sense to ask for all records when multiple == NO but better check + int xferCount = multiple == YES ? [foundRecords count] : 1; + matches = [NSMutableArray arrayWithCapacity:xferCount]; + + for (int k = 0; k < xferCount; k++) { + CDVContact* xferContact = [[CDVContact alloc] initFromABRecord:(__bridge ABRecordRef)[foundRecords objectAtIndex:k]]; + [matches addObject:xferContact]; + xferContact = nil; + } + } + } else { + foundRecords = (__bridge_transfer NSArray*)ABAddressBookCopyArrayOfAllPeople(addrBook); + matches = [NSMutableArray arrayWithCapacity:1]; + BOOL bFound = NO; + int testCount = [foundRecords count]; + + for (int j = 0; j < testCount; j++) { + CDVContact* testContact = [[CDVContact alloc] initFromABRecord:(__bridge ABRecordRef)[foundRecords objectAtIndex:j]]; + if (testContact) { + bFound = [testContact foundValue:filter inFields:returnFields]; + if (bFound) { + [matches addObject:testContact]; + } + testContact = nil; + } + } + } + NSMutableArray* returnContacts = [NSMutableArray arrayWithCapacity:1]; + + if ((matches != nil) && ([matches count] > 0)) { + // convert to JS Contacts format and return in callback + // - returnFields determines what properties to return + @autoreleasepool { + int count = multiple == YES ? [matches count] : 1; + + for (int i = 0; i < count; i++) { + CDVContact* newContact = [matches objectAtIndex:i]; + NSDictionary* aContact = [newContact toDictionary:returnFields]; + [returnContacts addObject:aContact]; + } + } + } + // return found contacts (array is empty if no contacts found) + CDVPluginResult* result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsArray:returnContacts]; + [weakSelf.commandDelegate sendPluginResult:result callbackId:callbackId]; + // NSLog(@"findCallback string: %@", jsString); + + if (addrBook) { + CFRelease(addrBook); + } + }]; + }]; // end of workQueue block + + return; +} + +- (void)save:(CDVInvokedUrlCommand*)command +{ + NSString* callbackId = command.callbackId; + NSDictionary* contactDict = [command.arguments objectAtIndex:0]; + + [self.commandDelegate runInBackground:^{ + CDVAddressBookHelper* abHelper = [[CDVAddressBookHelper alloc] init]; + CDVContacts* __weak weakSelf = self; // play it safe to avoid retain cycles + + [abHelper createAddressBook: ^(ABAddressBookRef addrBook, CDVAddressBookAccessError* errorCode) { + CDVPluginResult* result = nil; + if (addrBook == NULL) { + // permission was denied or other error - return error + result = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsInt:errorCode ? errorCode.errorCode:UNKNOWN_ERROR]; + [weakSelf.commandDelegate sendPluginResult:result callbackId:callbackId]; + return; + } + + bool bIsError = FALSE, bSuccess = FALSE; + BOOL bUpdate = NO; + CDVContactError errCode = UNKNOWN_ERROR; + CFErrorRef error; + NSNumber* cId = [contactDict valueForKey:kW3ContactId]; + CDVContact* aContact = nil; + ABRecordRef rec = nil; + if (cId && ![cId isKindOfClass:[NSNull class]]) { + rec = ABAddressBookGetPersonWithRecordID(addrBook, [cId intValue]); + if (rec) { + aContact = [[CDVContact alloc] initFromABRecord:rec]; + bUpdate = YES; + } + } + if (!aContact) { + aContact = [[CDVContact alloc] init]; + } + + bSuccess = [aContact setFromContactDict:contactDict asUpdate:bUpdate]; + if (bSuccess) { + if (!bUpdate) { + bSuccess = ABAddressBookAddRecord(addrBook, [aContact record], &error); + } + if (bSuccess) { + bSuccess = ABAddressBookSave(addrBook, &error); + } + if (!bSuccess) { // need to provide error codes + bIsError = TRUE; + errCode = IO_ERROR; + } else { + // give original dictionary back? If generate dictionary from saved contact, have no returnFields specified + // so would give back all fields (which W3C spec. indicates is not desired) + // for now (while testing) give back saved, full contact + NSDictionary* newContact = [aContact toDictionary:[CDVContact defaultFields]]; + // NSString* contactStr = [newContact JSONRepresentation]; + result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDictionary:newContact]; + } + } else { + bIsError = TRUE; + errCode = IO_ERROR; + } + CFRelease(addrBook); + + if (bIsError) { + result = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsInt:errCode]; + } + + if (result) { + [weakSelf.commandDelegate sendPluginResult:result callbackId:callbackId]; + } + }]; + }]; // end of queue +} + +- (void)remove:(CDVInvokedUrlCommand*)command +{ + NSString* callbackId = command.callbackId; + NSNumber* cId = [command.arguments objectAtIndex:0]; + + CDVAddressBookHelper* abHelper = [[CDVAddressBookHelper alloc] init]; + CDVContacts* __weak weakSelf = self; // play it safe to avoid retain cycles + + [abHelper createAddressBook: ^(ABAddressBookRef addrBook, CDVAddressBookAccessError* errorCode) { + CDVPluginResult* result = nil; + if (addrBook == NULL) { + // permission was denied or other error - return error + result = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsInt:errorCode ? errorCode.errorCode:UNKNOWN_ERROR]; + [weakSelf.commandDelegate sendPluginResult:result callbackId:callbackId]; + return; + } + + bool bIsError = FALSE, bSuccess = FALSE; + CDVContactError errCode = UNKNOWN_ERROR; + CFErrorRef error; + ABRecordRef rec = nil; + if (cId && ![cId isKindOfClass:[NSNull class]] && ([cId intValue] != kABRecordInvalidID)) { + rec = ABAddressBookGetPersonWithRecordID(addrBook, [cId intValue]); + if (rec) { + bSuccess = ABAddressBookRemoveRecord(addrBook, rec, &error); + if (!bSuccess) { + bIsError = TRUE; + errCode = IO_ERROR; + } else { + bSuccess = ABAddressBookSave(addrBook, &error); + if (!bSuccess) { + bIsError = TRUE; + errCode = IO_ERROR; + } else { + // set id to null + // [contactDict setObject:[NSNull null] forKey:kW3ContactId]; + // result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDictionary: contactDict]; + result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK]; + // NSString* contactStr = [contactDict JSONRepresentation]; + } + } + } else { + // no record found return error + bIsError = TRUE; + errCode = UNKNOWN_ERROR; + } + } else { + // invalid contact id provided + bIsError = TRUE; + errCode = INVALID_ARGUMENT_ERROR; + } + + if (addrBook) { + CFRelease(addrBook); + } + if (bIsError) { + result = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsInt:errCode]; + } + if (result) { + [weakSelf.commandDelegate sendPluginResult:result callbackId:callbackId]; + } + }]; + return; +} + +@end + +/* ABPersonViewController does not have any UI to dismiss. Adding navigationItems to it does not work properly + * The navigationItems are lost when the app goes into the background. The solution was to create an empty + * NavController in front of the ABPersonViewController. This will cause the ABPersonViewController to have a back button. By subclassing the ABPersonViewController, we can override viewDidDisappear and take down the entire NavigationController. + */ +@implementation CDVDisplayContactViewController +@synthesize contactsPlugin; + +- (void)viewWillDisappear:(BOOL)animated +{ + [super viewWillDisappear:animated]; + + if ([self respondsToSelector:@selector(presentingViewController)]) { + [[self presentingViewController] dismissViewControllerAnimated:YES completion:nil]; + } else { + [[self parentViewController] dismissModalViewControllerAnimated:YES]; + } +} + +@end +@implementation CDVAddressBookAccessError + +@synthesize errorCode; + +- (CDVAddressBookAccessError*)initWithCode:(CDVContactError)code +{ + self = [super init]; + if (self) { + self.errorCode = code; + } + return self; +} + +@end + +@implementation CDVAddressBookHelper + +/** + * NOTE: workerBlock is responsible for releasing the addressBook that is passed to it + */ +- (void)createAddressBook:(CDVAddressBookWorkerBlock)workerBlock +{ + // TODO: this probably should be reworked - seems like the workerBlock can just create and release its own AddressBook, + // and also this important warning from (http://developer.apple.com/library/ios/#documentation/ContactData/Conceptual/AddressBookProgrammingGuideforiPhone/Chapters/BasicObjects.html): + // "Important: Instances of ABAddressBookRef cannot be used by multiple threads. Each thread must make its own instance." + ABAddressBookRef addressBook; + +#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 60000 + if (&ABAddressBookCreateWithOptions != NULL) { + CFErrorRef error = nil; + // CFIndex status = ABAddressBookGetAuthorizationStatus(); + addressBook = ABAddressBookCreateWithOptions(NULL, &error); + // NSLog(@"addressBook access: %lu", status); + ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error) { + // callback can occur in background, address book must be accessed on thread it was created on + dispatch_sync(dispatch_get_main_queue(), ^{ + if (error) { + workerBlock(NULL, [[CDVAddressBookAccessError alloc] initWithCode:UNKNOWN_ERROR]); + } else if (!granted) { + workerBlock(NULL, [[CDVAddressBookAccessError alloc] initWithCode:PERMISSION_DENIED_ERROR]); + } else { + // access granted + workerBlock(addressBook, [[CDVAddressBookAccessError alloc] initWithCode:UNKNOWN_ERROR]); + } + }); + }); + } else +#endif + { + // iOS 4 or 5 no checks needed + addressBook = ABAddressBookCreate(); + workerBlock(addressBook, NULL); + } +} + +@end diff --git a/cordova-lib/spec-plugman-create/plugins/Contacts/src/wp/Contacts.cs b/cordova-lib/spec-plugman-create/plugins/Contacts/src/wp/Contacts.cs new file mode 100644 index 000000000..6789bb8a0 --- /dev/null +++ b/cordova-lib/spec-plugman-create/plugins/Contacts/src/wp/Contacts.cs @@ -0,0 +1,664 @@ +/* + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +using Microsoft.Phone.Tasks; +using Microsoft.Phone.UserData; +using System; +using System.Collections; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Runtime.Serialization; +using System.Windows; +using DeviceContacts = Microsoft.Phone.UserData.Contacts; + + +namespace WPCordovaClassLib.Cordova.Commands +{ + [DataContract] + public class SearchOptions + { + [DataMember] + public string filter { get; set; } + [DataMember] + public bool multiple { get; set; } + } + + [DataContract] + public class ContactSearchParams + { + [DataMember] + public string[] fields { get; set; } + [DataMember] + public SearchOptions options { get; set; } + } + + [DataContract] + public class JSONContactAddress + { + [DataMember] + public string formatted { get; set; } + [DataMember] + public string type { get; set; } + [DataMember] + public string streetAddress { get; set; } + [DataMember] + public string locality { get; set; } + [DataMember] + public string region { get; set; } + [DataMember] + public string postalCode { get; set; } + [DataMember] + public string country { get; set; } + [DataMember] + public bool pref { get; set; } + } + + [DataContract] + public class JSONContactName + { + [DataMember] + public string formatted { get; set; } + [DataMember] + public string familyName { get; set; } + [DataMember] + public string givenName { get; set; } + [DataMember] + public string middleName { get; set; } + [DataMember] + public string honorificPrefix { get; set; } + [DataMember] + public string honorificSuffix { get; set; } + } + + [DataContract] + public class JSONContactField + { + [DataMember] + public string type { get; set; } + [DataMember] + public string value { get; set; } + [DataMember] + public bool pref { get; set; } + } + + [DataContract] + public class JSONContactOrganization + { + [DataMember] + public string type { get; set; } + [DataMember] + public string name { get; set; } + [DataMember] + public bool pref { get; set; } + [DataMember] + public string department { get; set; } + [DataMember] + public string title { get; set; } + } + + [DataContract] + public class JSONContact + { + [DataMember] + public string id { get; set; } + [DataMember] + public string rawId { get; set; } + [DataMember] + public string displayName { get; set; } + [DataMember] + public string nickname { get; set; } + [DataMember] + public string note { get; set; } + + [DataMember] + public JSONContactName name { get; set; } + + [DataMember] + public JSONContactField[] emails { get; set; } + + [DataMember] + public JSONContactField[] phoneNumbers { get; set; } + + [DataMember] + public JSONContactField[] ims { get; set; } + + [DataMember] + public JSONContactField[] photos { get; set; } + + [DataMember] + public JSONContactField[] categories { get; set; } + + [DataMember] + public JSONContactField[] urls { get; set; } + + [DataMember] + public JSONContactOrganization[] organizations { get; set; } + + [DataMember] + public JSONContactAddress[] addresses { get; set; } + } + + + public class Contacts : BaseCommand + { + + public const int UNKNOWN_ERROR = 0; + public const int INVALID_ARGUMENT_ERROR = 1; + public const int TIMEOUT_ERROR = 2; + public const int PENDING_OPERATION_ERROR = 3; + public const int IO_ERROR = 4; + public const int NOT_SUPPORTED_ERROR = 5; + public const int PERMISSION_DENIED_ERROR = 20; + public const int SYNTAX_ERR = 8; + + public Contacts() + { + + } + + // refer here for contact properties we can access: http://msdn.microsoft.com/en-us/library/microsoft.phone.tasks.savecontacttask_members%28v=VS.92%29.aspx + public void save(string jsonContact) + { + + // jsonContact is actually an array of 1 {contact} + string[] args = JSON.JsonHelper.Deserialize(jsonContact); + + + JSONContact contact = JSON.JsonHelper.Deserialize(args[0]); + + SaveContactTask contactTask = new SaveContactTask(); + + if (contact.nickname != null) + { + contactTask.Nickname = contact.nickname; + } + if (contact.urls != null && contact.urls.Length > 0) + { + contactTask.Website = contact.urls[0].value; + } + if (contact.note != null) + { + contactTask.Notes = contact.note; + } + + #region contact.name + if (contact.name != null) + { + if (contact.name.givenName != null) + contactTask.FirstName = contact.name.givenName; + if (contact.name.familyName != null) + contactTask.LastName = contact.name.familyName; + if (contact.name.middleName != null) + contactTask.MiddleName = contact.name.middleName; + if (contact.name.honorificSuffix != null) + contactTask.Suffix = contact.name.honorificSuffix; + if (contact.name.honorificPrefix != null) + contactTask.Title = contact.name.honorificPrefix; + } + #endregion + + #region contact.org + if (contact.organizations != null && contact.organizations.Count() > 0) + { + contactTask.Company = contact.organizations[0].name; + contactTask.JobTitle = contact.organizations[0].title; + } + #endregion + + #region contact.phoneNumbers + if (contact.phoneNumbers != null && contact.phoneNumbers.Length > 0) + { + foreach (JSONContactField field in contact.phoneNumbers) + { + string fieldType = field.type.ToLower(); + if (fieldType == "work") + { + contactTask.WorkPhone = field.value; + } + else if (fieldType == "home") + { + contactTask.HomePhone = field.value; + } + else if (fieldType == "mobile") + { + contactTask.MobilePhone = field.value; + } + } + } + #endregion + + #region contact.emails + + if (contact.emails != null && contact.emails.Length > 0) + { + + // set up different email types if they are not explicitly defined + foreach (string type in new string[] { "personal", "work", "other" }) + { + foreach (JSONContactField field in contact.emails) + { + if (field != null && String.IsNullOrEmpty(field.type)) + { + field.type = type; + break; + } + } + } + + foreach (JSONContactField field in contact.emails) + { + if (field != null) + { + if (field.type != null && field.type != "other") + { + string fieldType = field.type.ToLower(); + if (fieldType == "work") + { + contactTask.WorkEmail = field.value; + } + else if (fieldType == "home" || fieldType == "personal") + { + contactTask.PersonalEmail = field.value; + } + } + else + { + contactTask.OtherEmail = field.value; + } + } + + } + } + #endregion + + if (contact.note != null && contact.note.Length > 0) + { + contactTask.Notes = contact.note; + } + + #region contact.addresses + if (contact.addresses != null && contact.addresses.Length > 0) + { + foreach (JSONContactAddress address in contact.addresses) + { + if (address.type == null) + { + address.type = "home"; // set a default + } + string fieldType = address.type.ToLower(); + if (fieldType == "work") + { + contactTask.WorkAddressCity = address.locality; + contactTask.WorkAddressCountry = address.country; + contactTask.WorkAddressState = address.region; + contactTask.WorkAddressStreet = address.streetAddress; + contactTask.WorkAddressZipCode = address.postalCode; + } + else if (fieldType == "home" || fieldType == "personal") + { + contactTask.HomeAddressCity = address.locality; + contactTask.HomeAddressCountry = address.country; + contactTask.HomeAddressState = address.region; + contactTask.HomeAddressStreet = address.streetAddress; + contactTask.HomeAddressZipCode = address.postalCode; + } + else + { + // no other address fields available ... + Debug.WriteLine("Creating contact with unsupported address type :: " + address.type); + } + } + } + #endregion + + + contactTask.Completed += new EventHandler(ContactSaveTaskCompleted); + contactTask.Show(); + } + + void ContactSaveTaskCompleted(object sender, SaveContactResult e) + { + SaveContactTask task = sender as SaveContactTask; + + if (e.TaskResult == TaskResult.OK) + { + + Deployment.Current.Dispatcher.BeginInvoke(() => + { + DeviceContacts deviceContacts = new DeviceContacts(); + deviceContacts.SearchCompleted += new EventHandler(postAdd_SearchCompleted); + + string displayName = String.Format("{0}{2}{1}", task.FirstName, task.LastName, String.IsNullOrEmpty(task.FirstName) ? "" : " "); + + deviceContacts.SearchAsync(displayName, FilterKind.DisplayName, task); + }); + + + } + else if (e.TaskResult == TaskResult.Cancel) + { + DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, "Operation cancelled.")); + } + } + + void postAdd_SearchCompleted(object sender, ContactsSearchEventArgs e) + { + if (e.Results.Count() > 0) + { + List foundContacts = new List(); + + int n = (from Contact contact in e.Results select contact.GetHashCode()).Max(); + Contact newContact = (from Contact contact in e.Results + where contact.GetHashCode() == n + select contact).First(); + + DispatchCommandResult(new PluginResult(PluginResult.Status.OK, FormatJSONContact(newContact, null))); + } + else + { + DispatchCommandResult(new PluginResult(PluginResult.Status.NO_RESULT)); + } + } + + + + public void remove(string id) + { + // note id is wrapped in [] and always has exactly one string ... + DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, "{\"code\":" + NOT_SUPPORTED_ERROR + "}")); + } + + public void search(string searchCriteria) + { + string[] args = JSON.JsonHelper.Deserialize(searchCriteria); + + ContactSearchParams searchParams = new ContactSearchParams(); + try + { + searchParams.fields = JSON.JsonHelper.Deserialize(args[0]); + searchParams.options = JSON.JsonHelper.Deserialize(args[1]); + } + catch (Exception) + { + DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, INVALID_ARGUMENT_ERROR)); + return; + } + + if (searchParams.options == null) + { + searchParams.options = new SearchOptions(); + searchParams.options.filter = ""; + searchParams.options.multiple = true; + } + + DeviceContacts deviceContacts = new DeviceContacts(); + deviceContacts.SearchCompleted += new EventHandler(contacts_SearchCompleted); + + // default is to search all fields + FilterKind filterKind = FilterKind.None; + // if only one field is specified, we will try the 3 available DeviceContact search filters + if (searchParams.fields.Count() == 1) + { + if (searchParams.fields.Contains("name")) + { + filterKind = FilterKind.DisplayName; + } + else if (searchParams.fields.Contains("emails")) + { + filterKind = FilterKind.EmailAddress; + } + else if (searchParams.fields.Contains("phoneNumbers")) + { + filterKind = FilterKind.PhoneNumber; + } + } + + try + { + + deviceContacts.SearchAsync(searchParams.options.filter, filterKind, searchParams); + } + catch (Exception ex) + { + Debug.WriteLine("search contacts exception :: " + ex.Message); + } + } + + private void contacts_SearchCompleted(object sender, ContactsSearchEventArgs e) + { + ContactSearchParams searchParams = (ContactSearchParams)e.State; + + List foundContacts = null; + + // if we have multiple search fields + if (searchParams.options.filter.Length > 0 && searchParams.fields.Count() > 1) + { + foundContacts = new List(); + if (searchParams.fields.Contains("emails")) + { + foundContacts.AddRange(from Contact con in e.Results + from ContactEmailAddress a in con.EmailAddresses + where a.EmailAddress.Contains(searchParams.options.filter) + select con); + } + if (searchParams.fields.Contains("displayName")) + { + foundContacts.AddRange(from Contact con in e.Results + where con.DisplayName.Contains(searchParams.options.filter) + select con); + } + if (searchParams.fields.Contains("name")) + { + foundContacts.AddRange(from Contact con in e.Results + where con.CompleteName != null && con.CompleteName.ToString().Contains(searchParams.options.filter) + select con); + } + if (searchParams.fields.Contains("phoneNumbers")) + { + foundContacts.AddRange(from Contact con in e.Results + from ContactPhoneNumber a in con.PhoneNumbers + where a.PhoneNumber.Contains(searchParams.options.filter) + select con); + } + if (searchParams.fields.Contains("urls")) + { + foundContacts.AddRange(from Contact con in e.Results + from string a in con.Websites + where a.Contains(searchParams.options.filter) + select con); + } + } + else + { + foundContacts = new List(e.Results); + } + + //List contactList = new List(); + + string strResult = ""; + + IEnumerable distinctContacts = foundContacts.Distinct(); + + foreach (Contact contact in distinctContacts) + { + strResult += FormatJSONContact(contact, null) + ","; + //contactList.Add(FormatJSONContact(contact, null)); + if (!searchParams.options.multiple) + { + break; // just return the first item + } + } + PluginResult result = new PluginResult(PluginResult.Status.OK); + result.Message = "[" + strResult.TrimEnd(',') + "]"; + DispatchCommandResult(result); + + } + + private string FormatJSONPhoneNumbers(Contact con) + { + string retVal = ""; + string contactFieldFormat = "\"type\":\"{0}\",\"value\":\"{1}\",\"pref\":\"false\""; + foreach (ContactPhoneNumber number in con.PhoneNumbers) + { + + string contactField = string.Format(contactFieldFormat, + number.Kind.ToString(), + number.PhoneNumber); + + retVal += "{" + contactField + "},"; + } + return retVal.TrimEnd(','); + } + + private string FormatJSONEmails(Contact con) + { + string retVal = ""; + string contactFieldFormat = "\"type\":\"{0}\",\"value\":\"{1}\",\"pref\":\"false\""; + foreach (ContactEmailAddress address in con.EmailAddresses) + { + string contactField = string.Format(contactFieldFormat, + address.Kind.ToString(), + address.EmailAddress); + + retVal += "{" + contactField + "},"; + } + return retVal.TrimEnd(','); + } + + private string getFormattedJSONAddress(ContactAddress address, bool isPreferred) + { + + string addressFormatString = "\"pref\":{0}," + // bool + "\"type\":\"{1}\"," + + "\"formatted\":\"{2}\"," + + "\"streetAddress\":\"{3}\"," + + "\"locality\":\"{4}\"," + + "\"region\":\"{5}\"," + + "\"postalCode\":\"{6}\"," + + "\"country\":\"{7}\""; + + string formattedAddress = address.PhysicalAddress.AddressLine1 + " " + + address.PhysicalAddress.AddressLine2 + " " + + address.PhysicalAddress.City + " " + + address.PhysicalAddress.StateProvince + " " + + address.PhysicalAddress.CountryRegion + " " + + address.PhysicalAddress.PostalCode; + + string jsonAddress = string.Format(addressFormatString, + isPreferred ? "\"true\"" : "\"false\"", + address.Kind.ToString(), + formattedAddress, + address.PhysicalAddress.AddressLine1 + " " + address.PhysicalAddress.AddressLine2, + address.PhysicalAddress.City, + address.PhysicalAddress.StateProvince, + address.PhysicalAddress.PostalCode, + address.PhysicalAddress.CountryRegion); + + //Debug.WriteLine("getFormattedJSONAddress returning :: " + jsonAddress); + + return "{" + jsonAddress + "}"; + } + + private string FormatJSONAddresses(Contact con) + { + string retVal = ""; + foreach (ContactAddress address in con.Addresses) + { + retVal += this.getFormattedJSONAddress(address, false) + ","; + } + + //Debug.WriteLine("FormatJSONAddresses returning :: " + retVal); + return retVal.TrimEnd(','); + } + + private string FormatJSONWebsites(Contact con) + { + string retVal = ""; + foreach (string website in con.Websites) + { + retVal += "\"" + website + "\","; + } + return retVal.TrimEnd(','); + } + + /* + * formatted: The complete name of the contact. (DOMString) + familyName: The contacts family name. (DOMString) + givenName: The contacts given name. (DOMString) + middleName: The contacts middle name. (DOMString) + honorificPrefix: The contacts prefix (example Mr. or Dr.) (DOMString) + honorificSuffix: The contacts suffix (example Esq.). (DOMString) + */ + private string FormatJSONName(Contact con) + { + string retVal = ""; + string formatStr = "\"formatted\":\"{0}\"," + + "\"familyName\":\"{1}\"," + + "\"givenName\":\"{2}\"," + + "\"middleName\":\"{3}\"," + + "\"honorificPrefix\":\"{4}\"," + + "\"honorificSuffix\":\"{5}\""; + + if (con.CompleteName != null) + { + retVal = string.Format(formatStr, + con.CompleteName.FirstName + " " + con.CompleteName.LastName, // TODO: does this need suffix? middlename? + con.CompleteName.LastName, + con.CompleteName.FirstName, + con.CompleteName.MiddleName, + con.CompleteName.Title, + con.CompleteName.Suffix); + } + else + { + retVal = string.Format(formatStr,"","","","","",""); + } + + return "{" + retVal + "}"; + } + + private string FormatJSONContact(Contact con, string[] fields) + { + + string contactFormatStr = "\"id\":\"{0}\"," + + "\"displayName\":\"{1}\"," + + "\"nickname\":\"{2}\"," + + "\"phoneNumbers\":[{3}]," + + "\"emails\":[{4}]," + + "\"addresses\":[{5}]," + + "\"urls\":[{6}]," + + "\"name\":{7}," + + "\"note\":\"{8}\"," + + "\"birthday\":\"{9}\""; + + + string jsonContact = String.Format(contactFormatStr, + con.GetHashCode(), + con.DisplayName, + con.CompleteName != null ? con.CompleteName.Nickname : "", + FormatJSONPhoneNumbers(con), + FormatJSONEmails(con), + FormatJSONAddresses(con), + FormatJSONWebsites(con), + FormatJSONName(con), + con.Notes.FirstOrDefault(), + con.Birthdays.FirstOrDefault()); + + //Debug.WriteLine("jsonContact = " + jsonContact); + // JSON requires new line characters be escaped + return "{" + jsonContact.Replace("\n", "\\n") + "}"; + } + } +} diff --git a/cordova-lib/spec-plugman-create/plugins/Contacts/www/Contact.js b/cordova-lib/spec-plugman-create/plugins/Contacts/www/Contact.js new file mode 100644 index 000000000..9c46a0cc7 --- /dev/null +++ b/cordova-lib/spec-plugman-create/plugins/Contacts/www/Contact.js @@ -0,0 +1,177 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +var argscheck = require('cordova/argscheck'), + exec = require('cordova/exec'), + ContactError = require('./ContactError'), + utils = require('cordova/utils'); + +/** +* Converts primitives into Complex Object +* Currently only used for Date fields +*/ +function convertIn(contact) { + var value = contact.birthday; + try { + contact.birthday = new Date(parseFloat(value)); + } catch (exception){ + console.log("Cordova Contact convertIn error: exception creating date."); + } + return contact; +} + +/** +* Converts Complex objects into primitives +* Only conversion at present is for Dates. +**/ + +function convertOut(contact) { + var value = contact.birthday; + if (value !== null) { + // try to make it a Date object if it is not already + if (!utils.isDate(value)){ + try { + value = new Date(value); + } catch(exception){ + value = null; + } + } + if (utils.isDate(value)){ + value = value.valueOf(); // convert to milliseconds + } + contact.birthday = value; + } + return contact; +} + +/** +* Contains information about a single contact. +* @constructor +* @param {DOMString} id unique identifier +* @param {DOMString} displayName +* @param {ContactName} name +* @param {DOMString} nickname +* @param {Array.} phoneNumbers array of phone numbers +* @param {Array.} emails array of email addresses +* @param {Array.} addresses array of addresses +* @param {Array.} ims instant messaging user ids +* @param {Array.} organizations +* @param {DOMString} birthday contact's birthday +* @param {DOMString} note user notes about contact +* @param {Array.} photos +* @param {Array.} categories +* @param {Array.} urls contact's web sites +*/ +var Contact = function (id, displayName, name, nickname, phoneNumbers, emails, addresses, + ims, organizations, birthday, note, photos, categories, urls) { + this.id = id || null; + this.rawId = null; + this.displayName = displayName || null; + this.name = name || null; // ContactName + this.nickname = nickname || null; + this.phoneNumbers = phoneNumbers || null; // ContactField[] + this.emails = emails || null; // ContactField[] + this.addresses = addresses || null; // ContactAddress[] + this.ims = ims || null; // ContactField[] + this.organizations = organizations || null; // ContactOrganization[] + this.birthday = birthday || null; + this.note = note || null; + this.photos = photos || null; // ContactField[] + this.categories = categories || null; // ContactField[] + this.urls = urls || null; // ContactField[] +}; + +/** +* Removes contact from device storage. +* @param successCB success callback +* @param errorCB error callback +*/ +Contact.prototype.remove = function(successCB, errorCB) { + argscheck.checkArgs('FF', 'Contact.remove', arguments); + var fail = errorCB && function(code) { + errorCB(new ContactError(code)); + }; + if (this.id === null) { + fail(ContactError.UNKNOWN_ERROR); + } + else { + exec(successCB, fail, "Contacts", "remove", [this.id]); + } +}; + +/** +* Creates a deep copy of this Contact. +* With the contact ID set to null. +* @return copy of this Contact +*/ +Contact.prototype.clone = function() { + var clonedContact = utils.clone(this); + clonedContact.id = null; + clonedContact.rawId = null; + + function nullIds(arr) { + if (arr) { + for (var i = 0; i < arr.length; ++i) { + arr[i].id = null; + } + } + } + + // Loop through and clear out any id's in phones, emails, etc. + nullIds(clonedContact.phoneNumbers); + nullIds(clonedContact.emails); + nullIds(clonedContact.addresses); + nullIds(clonedContact.ims); + nullIds(clonedContact.organizations); + nullIds(clonedContact.categories); + nullIds(clonedContact.photos); + nullIds(clonedContact.urls); + return clonedContact; +}; + +/** +* Persists contact to device storage. +* @param successCB success callback +* @param errorCB error callback +*/ +Contact.prototype.save = function(successCB, errorCB) { + argscheck.checkArgs('FFO', 'Contact.save', arguments); + var fail = errorCB && function(code) { + errorCB(new ContactError(code)); + }; + var success = function(result) { + if (result) { + if (successCB) { + var fullContact = require('./contacts').create(result); + successCB(convertIn(fullContact)); + } + } + else { + // no Entry object returned + fail(ContactError.UNKNOWN_ERROR); + } + }; + var dupContact = convertOut(utils.clone(this)); + exec(success, fail, "Contacts", "save", [dupContact]); +}; + + +module.exports = Contact; diff --git a/cordova-lib/spec-plugman-create/plugins/Contacts/www/ContactAddress.js b/cordova-lib/spec-plugman-create/plugins/Contacts/www/ContactAddress.js new file mode 100644 index 000000000..3d39086dc --- /dev/null +++ b/cordova-lib/spec-plugman-create/plugins/Contacts/www/ContactAddress.js @@ -0,0 +1,46 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +/** +* Contact address. +* @constructor +* @param {DOMString} id unique identifier, should only be set by native code +* @param formatted // NOTE: not a W3C standard +* @param streetAddress +* @param locality +* @param region +* @param postalCode +* @param country +*/ + +var ContactAddress = function(pref, type, formatted, streetAddress, locality, region, postalCode, country) { + this.id = null; + this.pref = (typeof pref != 'undefined' ? pref : false); + this.type = type || null; + this.formatted = formatted || null; + this.streetAddress = streetAddress || null; + this.locality = locality || null; + this.region = region || null; + this.postalCode = postalCode || null; + this.country = country || null; +}; + +module.exports = ContactAddress; diff --git a/cordova-lib/spec-plugman-create/plugins/Contacts/www/ContactError.js b/cordova-lib/spec-plugman-create/plugins/Contacts/www/ContactError.js new file mode 100644 index 000000000..01b229ad5 --- /dev/null +++ b/cordova-lib/spec-plugman-create/plugins/Contacts/www/ContactError.js @@ -0,0 +1,42 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +/** + * ContactError. + * An error code assigned by an implementation when an error has occurred + * @constructor + */ +var ContactError = function(err) { + this.code = (typeof err != 'undefined' ? err : null); +}; + +/** + * Error codes + */ +ContactError.UNKNOWN_ERROR = 0; +ContactError.INVALID_ARGUMENT_ERROR = 1; +ContactError.TIMEOUT_ERROR = 2; +ContactError.PENDING_OPERATION_ERROR = 3; +ContactError.IO_ERROR = 4; +ContactError.NOT_SUPPORTED_ERROR = 5; +ContactError.PERMISSION_DENIED_ERROR = 20; + +module.exports = ContactError; diff --git a/cordova-lib/spec-plugman-create/plugins/Contacts/www/ContactField.js b/cordova-lib/spec-plugman-create/plugins/Contacts/www/ContactField.js new file mode 100644 index 000000000..e84107a43 --- /dev/null +++ b/cordova-lib/spec-plugman-create/plugins/Contacts/www/ContactField.js @@ -0,0 +1,37 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +/** +* Generic contact field. +* @constructor +* @param {DOMString} id unique identifier, should only be set by native code // NOTE: not a W3C standard +* @param type +* @param value +* @param pref +*/ +var ContactField = function(type, value, pref) { + this.id = null; + this.type = (type && type.toString()) || null; + this.value = (value && value.toString()) || null; + this.pref = (typeof pref != 'undefined' ? pref : false); +}; + +module.exports = ContactField; diff --git a/cordova-lib/spec-plugman-create/plugins/Contacts/www/ContactFindOptions.js b/cordova-lib/spec-plugman-create/plugins/Contacts/www/ContactFindOptions.js new file mode 100644 index 000000000..bd8bf3562 --- /dev/null +++ b/cordova-lib/spec-plugman-create/plugins/Contacts/www/ContactFindOptions.js @@ -0,0 +1,34 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +/** + * ContactFindOptions. + * @constructor + * @param filter used to match contacts against + * @param multiple boolean used to determine if more than one contact should be returned + */ + +var ContactFindOptions = function(filter, multiple) { + this.filter = filter || ''; + this.multiple = (typeof multiple != 'undefined' ? multiple : false); +}; + +module.exports = ContactFindOptions; diff --git a/cordova-lib/spec-plugman-create/plugins/Contacts/www/ContactName.js b/cordova-lib/spec-plugman-create/plugins/Contacts/www/ContactName.js new file mode 100644 index 000000000..15cf60b5f --- /dev/null +++ b/cordova-lib/spec-plugman-create/plugins/Contacts/www/ContactName.js @@ -0,0 +1,41 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +/** +* Contact name. +* @constructor +* @param formatted // NOTE: not part of W3C standard +* @param familyName +* @param givenName +* @param middle +* @param prefix +* @param suffix +*/ +var ContactName = function(formatted, familyName, givenName, middle, prefix, suffix) { + this.formatted = formatted || null; + this.familyName = familyName || null; + this.givenName = givenName || null; + this.middleName = middle || null; + this.honorificPrefix = prefix || null; + this.honorificSuffix = suffix || null; +}; + +module.exports = ContactName; diff --git a/cordova-lib/spec-plugman-create/plugins/Contacts/www/ContactOrganization.js b/cordova-lib/spec-plugman-create/plugins/Contacts/www/ContactOrganization.js new file mode 100644 index 000000000..5dd242bdd --- /dev/null +++ b/cordova-lib/spec-plugman-create/plugins/Contacts/www/ContactOrganization.js @@ -0,0 +1,44 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +/** +* Contact organization. +* @constructor +* @param {DOMString} id unique identifier, should only be set by native code // NOTE: not a W3C standard +* @param name +* @param dept +* @param title +* @param startDate +* @param endDate +* @param location +* @param desc +*/ + +var ContactOrganization = function(pref, type, name, dept, title) { + this.id = null; + this.pref = (typeof pref != 'undefined' ? pref : false); + this.type = type || null; + this.name = name || null; + this.department = dept || null; + this.title = title || null; +}; + +module.exports = ContactOrganization; diff --git a/cordova-lib/spec-plugman-create/plugins/Contacts/www/contacts.js b/cordova-lib/spec-plugman-create/plugins/Contacts/www/contacts.js new file mode 100644 index 000000000..5e6b4dbe6 --- /dev/null +++ b/cordova-lib/spec-plugman-create/plugins/Contacts/www/contacts.js @@ -0,0 +1,76 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +var argscheck = require('cordova/argscheck'), + exec = require('cordova/exec'), + ContactError = require('./ContactError'), + utils = require('cordova/utils'), + Contact = require('./Contact'); + +/** +* Represents a group of Contacts. +* @constructor +*/ +var contacts = { + /** + * Returns an array of Contacts matching the search criteria. + * @param fields that should be searched + * @param successCB success callback + * @param errorCB error callback + * @param {ContactFindOptions} options that can be applied to contact searching + * @return array of Contacts matching search criteria + */ + find:function(fields, successCB, errorCB, options) { + argscheck.checkArgs('afFO', 'contacts.find', arguments); + if (!fields.length) { + errorCB && errorCB(new ContactError(ContactError.INVALID_ARGUMENT_ERROR)); + } else { + var win = function(result) { + var cs = []; + for (var i = 0, l = result.length; i < l; i++) { + cs.push(contacts.create(result[i])); + } + successCB(cs); + }; + exec(win, errorCB, "Contacts", "search", [fields, options]); + } + }, + + /** + * This function creates a new contact, but it does not persist the contact + * to device storage. To persist the contact to device storage, invoke + * contact.save(). + * @param properties an object whose properties will be examined to create a new Contact + * @returns new Contact object + */ + create:function(properties) { + argscheck.checkArgs('O', 'contacts.create', arguments); + var contact = new Contact(); + for (var i in properties) { + if (typeof contact[i] !== 'undefined' && properties.hasOwnProperty(i)) { + contact[i] = properties[i]; + } + } + return contact; + } +}; + +module.exports = contacts; diff --git a/cordova-lib/spec-plugman-create/plugins/Contacts/www/ios/Contact.js b/cordova-lib/spec-plugman-create/plugins/Contacts/www/ios/Contact.js new file mode 100644 index 000000000..b40c41acc --- /dev/null +++ b/cordova-lib/spec-plugman-create/plugins/Contacts/www/ios/Contact.js @@ -0,0 +1,51 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +var exec = require('cordova/exec'), + ContactError = require('./ContactError'); + +/** + * Provides iOS Contact.display API. + */ +module.exports = { + display : function(errorCB, options) { + /* + * Display a contact using the iOS Contact Picker UI + * NOT part of W3C spec so no official documentation + * + * @param errorCB error callback + * @param options object + * allowsEditing: boolean AS STRING + * "true" to allow editing the contact + * "false" (default) display contact + */ + + if (this.id === null) { + if (typeof errorCB === "function") { + var errorObj = new ContactError(ContactError.UNKNOWN_ERROR); + errorCB(errorObj); + } + } + else { + exec(null, errorCB, "Contacts","displayContact", [this.id, options]); + } + } +}; diff --git a/cordova-lib/spec-plugman-create/plugins/Contacts/www/ios/contacts.js b/cordova-lib/spec-plugman-create/plugins/Contacts/www/ios/contacts.js new file mode 100644 index 000000000..67cf421fd --- /dev/null +++ b/cordova-lib/spec-plugman-create/plugins/Contacts/www/ios/contacts.js @@ -0,0 +1,62 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +var exec = require('cordova/exec'); + +/** + * Provides iOS enhanced contacts API. + */ +module.exports = { + newContactUI : function(successCallback) { + /* + * Create a contact using the iOS Contact Picker UI + * NOT part of W3C spec so no official documentation + * + * returns: the id of the created contact as param to successCallback + */ + exec(successCallback, null, "Contacts","newContact", []); + }, + chooseContact : function(successCallback, options) { + /* + * Select a contact using the iOS Contact Picker UI + * NOT part of W3C spec so no official documentation + * + * @param errorCB error callback + * @param options object + * allowsEditing: boolean AS STRING + * "true" to allow editing the contact + * "false" (default) display contact + * fields: array of fields to return in contact object (see ContactOptions.fields) + * + * @returns + * id of contact selected + * ContactObject + * if no fields provided contact contains just id information + * if fields provided contact object contains information for the specified fields + * + */ + var win = function(result) { + var fullContact = require('./contacts').create(result); + successCallback(fullContact.id, fullContact); + }; + exec(win, null, "Contacts","chooseContact", [options]); + } +}; diff --git a/cordova-lib/spec-plugman-create/plugins/DummyPlugin/android-resource.xml b/cordova-lib/spec-plugman-create/plugins/DummyPlugin/android-resource.xml new file mode 100644 index 000000000..421376db9 --- /dev/null +++ b/cordova-lib/spec-plugman-create/plugins/DummyPlugin/android-resource.xml @@ -0,0 +1 @@ +dummy diff --git a/cordova-lib/spec-plugman-create/plugins/DummyPlugin/plugin.xml b/cordova-lib/spec-plugman-create/plugins/DummyPlugin/plugin.xml new file mode 100644 index 000000000..0e884433c --- /dev/null +++ b/cordova-lib/spec-plugman-create/plugins/DummyPlugin/plugin.xml @@ -0,0 +1,187 @@ + + + + + + + dummyplugin + + my description + Jackson Badman + dummy,plugin + BSD + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + .dummy1 + + + + + .dummy2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cordova-lib/spec-plugman-create/plugins/DummyPlugin/src/android/DummyPlugin.java b/cordova-lib/spec-plugman-create/plugins/DummyPlugin/src/android/DummyPlugin.java new file mode 100644 index 000000000..5263b0c5d --- /dev/null +++ b/cordova-lib/spec-plugman-create/plugins/DummyPlugin/src/android/DummyPlugin.java @@ -0,0 +1,19 @@ +/* + * + * Copyright 2013 Anis Kadri + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + diff --git a/cordova-lib/spec-plugman-create/plugins/DummyPlugin/src/blackberry10/index.js b/cordova-lib/spec-plugman-create/plugins/DummyPlugin/src/blackberry10/index.js new file mode 100644 index 000000000..5263b0c5d --- /dev/null +++ b/cordova-lib/spec-plugman-create/plugins/DummyPlugin/src/blackberry10/index.js @@ -0,0 +1,19 @@ +/* + * + * Copyright 2013 Anis Kadri + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + diff --git a/cordova-lib/spec-plugman-create/plugins/DummyPlugin/src/ios/Custom.framework/someFheader.h b/cordova-lib/spec-plugman-create/plugins/DummyPlugin/src/ios/Custom.framework/someFheader.h new file mode 100644 index 000000000..e69de29bb diff --git a/cordova-lib/spec-plugman-create/plugins/DummyPlugin/src/ios/Custom.framework/somebinlib b/cordova-lib/spec-plugman-create/plugins/DummyPlugin/src/ios/Custom.framework/somebinlib new file mode 100644 index 000000000..e69de29bb diff --git a/cordova-lib/spec-plugman-create/plugins/DummyPlugin/src/ios/DummyPlugin.bundle b/cordova-lib/spec-plugman-create/plugins/DummyPlugin/src/ios/DummyPlugin.bundle new file mode 100644 index 000000000..e69de29bb diff --git a/cordova-lib/spec-plugman-create/plugins/DummyPlugin/src/ios/DummyPluginCommand.h b/cordova-lib/spec-plugman-create/plugins/DummyPlugin/src/ios/DummyPluginCommand.h new file mode 100644 index 000000000..e69de29bb diff --git a/cordova-lib/spec-plugman-create/plugins/DummyPlugin/src/ios/DummyPluginCommand.m b/cordova-lib/spec-plugman-create/plugins/DummyPlugin/src/ios/DummyPluginCommand.m new file mode 100644 index 000000000..e69de29bb diff --git a/cordova-lib/spec-plugman-create/plugins/DummyPlugin/src/ios/SourceWithFramework.m b/cordova-lib/spec-plugman-create/plugins/DummyPlugin/src/ios/SourceWithFramework.m new file mode 100644 index 000000000..e69de29bb diff --git a/cordova-lib/spec-plugman-create/plugins/DummyPlugin/src/ios/TargetDirTest.h b/cordova-lib/spec-plugman-create/plugins/DummyPlugin/src/ios/TargetDirTest.h new file mode 100644 index 000000000..e69de29bb diff --git a/cordova-lib/spec-plugman-create/plugins/DummyPlugin/src/ios/TargetDirTest.m b/cordova-lib/spec-plugman-create/plugins/DummyPlugin/src/ios/TargetDirTest.m new file mode 100644 index 000000000..e69de29bb diff --git a/cordova-lib/spec-plugman-create/plugins/DummyPlugin/src/ios/libsqlite3.dylib b/cordova-lib/spec-plugman-create/plugins/DummyPlugin/src/ios/libsqlite3.dylib new file mode 100644 index 000000000..e69de29bb diff --git a/cordova-lib/spec-plugman-create/plugins/DummyPlugin/src/tizen/dummer.js b/cordova-lib/spec-plugman-create/plugins/DummyPlugin/src/tizen/dummer.js new file mode 100644 index 000000000..e69de29bb diff --git a/cordova-lib/spec-plugman-create/plugins/DummyPlugin/src/windows8/dummer.js b/cordova-lib/spec-plugman-create/plugins/DummyPlugin/src/windows8/dummer.js new file mode 100644 index 000000000..e69de29bb diff --git a/cordova-lib/spec-plugman-create/plugins/DummyPlugin/src/wp7/DummyPlugin.cs b/cordova-lib/spec-plugman-create/plugins/DummyPlugin/src/wp7/DummyPlugin.cs new file mode 100644 index 000000000..273dc3b3f --- /dev/null +++ b/cordova-lib/spec-plugman-create/plugins/DummyPlugin/src/wp7/DummyPlugin.cs @@ -0,0 +1,19 @@ +/* + * + * Copyright 2013 Benn Mapes + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + diff --git a/cordova-lib/spec-plugman-create/plugins/DummyPlugin/src/wp8/DummyPlugin.cs b/cordova-lib/spec-plugman-create/plugins/DummyPlugin/src/wp8/DummyPlugin.cs new file mode 100644 index 000000000..273dc3b3f --- /dev/null +++ b/cordova-lib/spec-plugman-create/plugins/DummyPlugin/src/wp8/DummyPlugin.cs @@ -0,0 +1,19 @@ +/* + * + * Copyright 2013 Benn Mapes + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + diff --git a/cordova-lib/spec-plugman-create/plugins/DummyPlugin/www/dummyplugin.js b/cordova-lib/spec-plugman-create/plugins/DummyPlugin/www/dummyplugin.js new file mode 100644 index 000000000..5263b0c5d --- /dev/null +++ b/cordova-lib/spec-plugman-create/plugins/DummyPlugin/www/dummyplugin.js @@ -0,0 +1,19 @@ +/* + * + * Copyright 2013 Anis Kadri + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + diff --git a/cordova-lib/spec-plugman-create/plugins/DummyPlugin/www/dummyplugin/image.jpg b/cordova-lib/spec-plugman-create/plugins/DummyPlugin/www/dummyplugin/image.jpg new file mode 100644 index 000000000..257cc5642 --- /dev/null +++ b/cordova-lib/spec-plugman-create/plugins/DummyPlugin/www/dummyplugin/image.jpg @@ -0,0 +1 @@ +foo diff --git a/cordova-lib/spec-plugman-create/plugins/EnginePlugin/megaBoringVersion b/cordova-lib/spec-plugman-create/plugins/EnginePlugin/megaBoringVersion new file mode 100755 index 000000000..cbf791148 --- /dev/null +++ b/cordova-lib/spec-plugman-create/plugins/EnginePlugin/megaBoringVersion @@ -0,0 +1,23 @@ +#! /bin/sh + +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# + +echo 4.0.0 +exit 0 \ No newline at end of file diff --git a/cordova-lib/spec-plugman-create/plugins/EnginePlugin/megaFunVersion b/cordova-lib/spec-plugman-create/plugins/EnginePlugin/megaFunVersion new file mode 100755 index 000000000..1e4c706fa --- /dev/null +++ b/cordova-lib/spec-plugman-create/plugins/EnginePlugin/megaFunVersion @@ -0,0 +1,23 @@ +#! /bin/sh + +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# + +echo 1.0.0 +exit 0 \ No newline at end of file diff --git a/cordova-lib/spec-plugman-create/plugins/EnginePlugin/plugin.xml b/cordova-lib/spec-plugman-create/plugins/EnginePlugin/plugin.xml new file mode 100644 index 000000000..a58f19efe --- /dev/null +++ b/cordova-lib/spec-plugman-create/plugins/EnginePlugin/plugin.xml @@ -0,0 +1,33 @@ + + + + + + Engine Choo Choo + + + + + + + + + diff --git a/cordova-lib/spec-plugman-create/plugins/EnginePluginAndroid/plugin.xml b/cordova-lib/spec-plugman-create/plugins/EnginePluginAndroid/plugin.xml new file mode 100644 index 000000000..fe2bce242 --- /dev/null +++ b/cordova-lib/spec-plugman-create/plugins/EnginePluginAndroid/plugin.xml @@ -0,0 +1,32 @@ + + + + + + Engine Choo Choo + + + + + + + + diff --git a/cordova-lib/spec-plugman-create/plugins/EnginePluginiOS/plugin.xml b/cordova-lib/spec-plugman-create/plugins/EnginePluginiOS/plugin.xml new file mode 100644 index 000000000..d7a9a8e7b --- /dev/null +++ b/cordova-lib/spec-plugman-create/plugins/EnginePluginiOS/plugin.xml @@ -0,0 +1,34 @@ + + + + + + Engine Choo Choo + + + + + + + + + + diff --git a/cordova-lib/spec-plugman-create/plugins/FaultyPlugin/plugin.xml b/cordova-lib/spec-plugman-create/plugins/FaultyPlugin/plugin.xml new file mode 100644 index 000000000..706db4521 --- /dev/null +++ b/cordova-lib/spec-plugman-create/plugins/FaultyPlugin/plugin.xml @@ -0,0 +1,147 @@ + + + + + + Faulty Plugin + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cordova-lib/spec-plugman-create/plugins/FaultyPlugin/src/android/FaultyPlugin.java b/cordova-lib/spec-plugman-create/plugins/FaultyPlugin/src/android/FaultyPlugin.java new file mode 100644 index 000000000..5263b0c5d --- /dev/null +++ b/cordova-lib/spec-plugman-create/plugins/FaultyPlugin/src/android/FaultyPlugin.java @@ -0,0 +1,19 @@ +/* + * + * Copyright 2013 Anis Kadri + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + diff --git a/cordova-lib/spec-plugman-create/plugins/FaultyPlugin/src/blackberry10/client.js b/cordova-lib/spec-plugman-create/plugins/FaultyPlugin/src/blackberry10/client.js new file mode 100644 index 000000000..e69de29bb diff --git a/cordova-lib/spec-plugman-create/plugins/FaultyPlugin/src/ios/FaultyPlugin.h b/cordova-lib/spec-plugman-create/plugins/FaultyPlugin/src/ios/FaultyPlugin.h new file mode 100644 index 000000000..6a23ab6f0 --- /dev/null +++ b/cordova-lib/spec-plugman-create/plugins/FaultyPlugin/src/ios/FaultyPlugin.h @@ -0,0 +1,49 @@ +/* + * + * Copyright 2013 Anis Kadri + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +// +// PhoneGap ! ChildBrowserCommand +// +// +// Created by Jesse MacFadyen on 10-05-29. +// Copyright 2010 Nitobi. All rights reserved. +// + +#import +#ifdef PHONEGAP_FRAMEWORK + #import +#else + #import "PGPlugin.h" +#endif +#import "ChildBrowserViewController.h" + + + +@interface ChildBrowserCommand : PGPlugin { + + ChildBrowserViewController* childBrowser; +} + +@property (nonatomic, retain) ChildBrowserViewController *childBrowser; + + +- (void) showWebPage:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options; +-(void) onChildLocationChange:(NSString*)newLoc; + +@end diff --git a/cordova-lib/spec-plugman-create/plugins/FaultyPlugin/src/ios/FaultyPlugin.m b/cordova-lib/spec-plugman-create/plugins/FaultyPlugin/src/ios/FaultyPlugin.m new file mode 100644 index 000000000..38aaf6497 --- /dev/null +++ b/cordova-lib/spec-plugman-create/plugins/FaultyPlugin/src/ios/FaultyPlugin.m @@ -0,0 +1,86 @@ +// + +// +// +// Created by Jesse MacFadyen on 10-05-29. +// Copyright 2010 Nitobi. All rights reserved. +// Copyright (c) 2011, IBM Corporation +// Copyright 2011, Randy McMillan +// + +#import "ChildBrowserCommand.h" + +#ifdef PHONEGAP_FRAMEWORK + #import +#else + #import "PhoneGapViewController.h" +#endif + + +@implementation ChildBrowserCommand + +@synthesize childBrowser; + +- (void) showWebPage:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options // args: url +{ + + if(childBrowser == NULL) + { + childBrowser = [[ ChildBrowserViewController alloc ] initWithScale:FALSE ]; + childBrowser.delegate = self; + } + +/* // TODO: Work in progress + NSString* strOrientations = [ options objectForKey:@"supportedOrientations"]; + NSArray* supportedOrientations = [strOrientations componentsSeparatedByString:@","]; +*/ + PhoneGapViewController* cont = (PhoneGapViewController*)[ super appViewController ]; + childBrowser.supportedOrientations = cont.supportedOrientations; + + if ([cont respondsToSelector:@selector(presentViewController)]) { + //Reference UIViewController.h Line:179 for update to iOS 5 difference - @RandyMcMillan + [cont presentViewController:childBrowser animated:YES completion:nil]; + } else { + [ cont presentModalViewController:childBrowser animated:YES ]; + } + + NSString *url = (NSString*) [arguments objectAtIndex:0]; + + [childBrowser loadURL:url ]; + +} + +-(void) close:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options // args: url +{ + [ childBrowser closeBrowser]; + +} + +-(void) onClose +{ + NSString* jsCallback = [NSString stringWithFormat:@"ChildBrowser._onClose();",@""]; + [self.webView stringByEvaluatingJavaScriptFromString:jsCallback]; +} + +-(void) onOpenInSafari +{ + NSString* jsCallback = [NSString stringWithFormat:@"ChildBrowser._onOpenExternal();",@""]; + [self.webView stringByEvaluatingJavaScriptFromString:jsCallback]; +} + + +-(void) onChildLocationChange:(NSString*)newLoc +{ + + NSString* tempLoc = [NSString stringWithFormat:@"%@",newLoc]; + NSString* encUrl = [tempLoc stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; + + NSString* jsCallback = [NSString stringWithFormat:@"ChildBrowser._onLocationChange('%@');",encUrl]; + [self.webView stringByEvaluatingJavaScriptFromString:jsCallback]; + +} + + + + +@end diff --git a/cordova-lib/spec-plugman-create/plugins/FaultyPlugin/src/windows8/faultyPlugin.js b/cordova-lib/spec-plugman-create/plugins/FaultyPlugin/src/windows8/faultyPlugin.js new file mode 100644 index 000000000..e69de29bb diff --git a/cordova-lib/spec-plugman-create/plugins/FaultyPlugin/src/wp7/FaultyPlugin.cs b/cordova-lib/spec-plugman-create/plugins/FaultyPlugin/src/wp7/FaultyPlugin.cs new file mode 100644 index 000000000..5263b0c5d --- /dev/null +++ b/cordova-lib/spec-plugman-create/plugins/FaultyPlugin/src/wp7/FaultyPlugin.cs @@ -0,0 +1,19 @@ +/* + * + * Copyright 2013 Anis Kadri + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + diff --git a/cordova-lib/spec-plugman-create/plugins/FaultyPlugin/src/wp8/FaultyPlugin.cs b/cordova-lib/spec-plugman-create/plugins/FaultyPlugin/src/wp8/FaultyPlugin.cs new file mode 100644 index 000000000..5263b0c5d --- /dev/null +++ b/cordova-lib/spec-plugman-create/plugins/FaultyPlugin/src/wp8/FaultyPlugin.cs @@ -0,0 +1,19 @@ +/* + * + * Copyright 2013 Anis Kadri + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + diff --git a/cordova-lib/spec-plugman-create/plugins/VariablePlugin/plugin.xml b/cordova-lib/spec-plugman-create/plugins/VariablePlugin/plugin.xml new file mode 100644 index 000000000..9eff72975 --- /dev/null +++ b/cordova-lib/spec-plugman-create/plugins/VariablePlugin/plugin.xml @@ -0,0 +1,59 @@ + + + + + + Use Variables + + + + Remember that your api key is $API_KEY! + + + + + $PACKAGE_NAME + + + + + + + + + $PACKAGE_NAME + + + + + + + + + $PACKAGE_NAME + + + + + + diff --git a/cordova-lib/spec-plugman-create/plugins/WebNotifications/plugin.xml b/cordova-lib/spec-plugman-create/plugins/WebNotifications/plugin.xml new file mode 100644 index 000000000..b9026f18e --- /dev/null +++ b/cordova-lib/spec-plugman-create/plugins/WebNotifications/plugin.xml @@ -0,0 +1,47 @@ + + + + + + Web Notifications + + + + + + + + + + + + + + + + + + + + diff --git a/cordova-lib/spec-plugman-create/plugins/WebNotifications/src/ios/AppDelegate.m.diff b/cordova-lib/spec-plugman-create/plugins/WebNotifications/src/ios/AppDelegate.m.diff new file mode 100644 index 000000000..754d079fc --- /dev/null +++ b/cordova-lib/spec-plugman-create/plugins/WebNotifications/src/ios/AppDelegate.m.diff @@ -0,0 +1,18 @@ +- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification +{ + // Note: if app wasn't running, you can still get a LN and then it doesn't call this function, + // I think it calls app start but notifies you that LN caused the app start or something like that. + + //UIApplicationState state = [application applicationState]; + //BOOL wasForeground = (state == UIApplicationStateActive); + + //NSString *title = [notification.userInfo objectForKey:@"title"]; + //NSString *body = [notification.userInfo objectForKey:@"body"]; + NSString *tag = [notification.userInfo objectForKey:@"tag"]; + + [(WebNotifications*)[self.viewController getCommandInstance:@"WebNotifications"] clickNotification:tag]; + + application.applicationIconBadgeNumber = 0; + application.scheduledLocalNotifications = [NSArray arrayWithArray:application.scheduledLocalNotifications]; // "hack" to clear seen notifications +} + diff --git a/cordova-lib/spec-plugman-create/plugins/WebNotifications/src/ios/WebNotifications.h b/cordova-lib/spec-plugman-create/plugins/WebNotifications/src/ios/WebNotifications.h new file mode 100644 index 000000000..1702f4071 --- /dev/null +++ b/cordova-lib/spec-plugman-create/plugins/WebNotifications/src/ios/WebNotifications.h @@ -0,0 +1,35 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. + */ + +#import +#import + +@interface WebNotifications : CDVPlugin { +} + +@property (nonatomic, strong) NSMutableArray* activeNotifications; + +- (CDVPlugin*)initWithWebView:(UIWebView*)theWebView; + +- (void)createNotification:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options; +- (void)closeNotification:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options; + +- (void)clickNotification:(NSString*)tag; + +@end diff --git a/cordova-lib/spec-plugman-create/plugins/WebNotifications/src/ios/WebNotifications.m b/cordova-lib/spec-plugman-create/plugins/WebNotifications/src/ios/WebNotifications.m new file mode 100644 index 000000000..6f0c11ff6 --- /dev/null +++ b/cordova-lib/spec-plugman-create/plugins/WebNotifications/src/ios/WebNotifications.m @@ -0,0 +1,124 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. + */ + +#define Log(fmt, ...) NSLog((@"%d: %s " fmt), __LINE__, __PRETTY_FUNCTION__, ##__VA_ARGS__); + +#import "WebNotifications.h" +#import "MainViewController.h" + +@implementation WebNotifications + +@synthesize activeNotifications; + +- (CDVPlugin*)initWithWebView:(UIWebView*)theWebView +{ + self = [super init]; + if (self) { + self.activeNotifications = [NSMutableArray array]; + } + return self; +} + +- (void)createNotification:(CDVInvokedUrlCommand*)command +{ + NSDictionary* options = [command.arguments objectAtIndex:0]; + + // w3c options: + NSString *title = [options objectForKey:@"title"]; + NSString *body = [options objectForKey:@"body"]; + NSString *tag = [options objectForKey:@"tag"]; + //NSString *iconUrl = [options objectForKey:@"iconUrl"]; // Not supported + + // cordova option extensions: + NSUInteger delay = [[options objectForKey:@"delay"] unsignedIntegerValue]; + NSString *soundUrl = [options objectForKey:@"soundUrl"]; + NSInteger badgeNumber = [[options objectForKey:@"badgeNumber"] intValue]; + + Log(@"addNotification title: %@ body: %@ tag: %@ delay: %u badge: %u", title, body, tag, delay, badgeNumber); + + //NSString *action = [options objectForKey:@"action"]; + //bool hasAction = ([[options objectForKey:@"hasAction"] intValue] == 1) ? YES : NO; + //alertAction + + UILocalNotification *notif = [[UILocalNotification alloc] init]; + notif.alertBody = [NSString stringWithFormat:@"[%@] %@: %@", tag, title, body]; + notif.timeZone = [NSTimeZone defaultTimeZone]; + + notif.soundName = soundUrl; + notif.applicationIconBadgeNumber = badgeNumber; + + NSDictionary *userDict = [NSDictionary dictionaryWithObjectsAndKeys:title,@"title",body,@"body",tag,@"tag",nil]; + notif.userInfo = userDict; + + if (delay != 0) { + notif.fireDate = [[NSDate date] addTimeInterval:delay]; + //notif.repeatInterval = [[repeatDict objectForKey: repeat] intValue]; + + [[UIApplication sharedApplication] scheduleLocalNotification:notif]; + } else { + [[UIApplication sharedApplication] presentLocalNotificationNow:notif]; + } + + [self.activeNotifications addObject:notif]; +} + +- (void)closeNotification:(CDVInvokedUrlCommand*)command +{ +// command.callbackId; + NSDictionary* options = [command.arguments objectAtIndex:0]; + NSString *tag = [options objectForKey:@"tag"]; + + NSArray *notifications = [[UIApplication sharedApplication] scheduledLocalNotifications]; + for (UILocalNotification *notification in notifications) { + if ([[notification.userInfo objectForKey:@"tag"] isEqualToString:tag]) { + Log(@"Cancelling notification with tag: %@", tag); + [[UIApplication sharedApplication] cancelLocalNotification:notification]; + [self.activeNotifications removeObject:notification]; + [self.commandDelegate sendPluginResult:[CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsInt:0] callbackId:command.callbackId]; + } + } + [self.commandDelegate sendPluginResult:[CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsInt:0] callbackId:command.callbackId]; +} + +- (void)clickNotification:(NSString*)tag { + NSString *jsCallBack; + + jsCallBack = [NSString stringWithFormat:@"window.Notification.callOnclickByTag('%@')", tag]; + [((CDVViewController*)self.viewController).webView stringByEvaluatingJavaScriptFromString:jsCallBack]; + + NSArray *scheduledNotifications = [[UIApplication sharedApplication] scheduledLocalNotifications]; + NSMutableArray *toDiscard = [NSMutableArray array]; + for (UILocalNotification *notification in self.activeNotifications) { + if (![scheduledNotifications containsObject:notification]) { + // This notification is active, but no longer scheduled, so it must be displayed + jsCallBack = [NSString stringWithFormat:@"window.Notification.callOncloseByTag('%@')", [notification.userInfo objectForKey:@"tag"]]; + [((CDVViewController*)self.viewController).webView stringByEvaluatingJavaScriptFromString:jsCallBack]; + [toDiscard addObject:notification]; + } + } + [self.activeNotifications removeObjectsInArray:toDiscard]; +} + +/* +- (void)cancelAllNotifications:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options { + [[UIApplication sharedApplication] cancelAllLocalNotifications]; +} +*/ + +@end diff --git a/cordova-lib/spec-plugman-create/plugins/WebNotifications/www/webnotifications.js b/cordova-lib/spec-plugman-create/plugins/WebNotifications/www/webnotifications.js new file mode 100644 index 000000000..6597337a2 --- /dev/null +++ b/cordova-lib/spec-plugman-create/plugins/WebNotifications/www/webnotifications.js @@ -0,0 +1,123 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. + */ + +/* + * The W3C window.Notification API: http://www.w3.org/TR/notifications/ + */ +if (typeof window.Notification == 'undefined') { + + /** + * Creates and shows a new notification. + * @param title + * @param options + */ + window.Notification = function(title, options) { + options = options || {}; + + this.title = title || 'defaultTitle'; + + // w3c options: + this.body = options.body || ''; + this.tag = options.tag || 'defaultTag'; + this.iconUrl = options.iconUrl || ''; + // titleDir, bodyDir are not supported + + // cordova option extensions: + this.delay = options.delay || 0; + this.soundUrl = options.soundUrl || ''; + this.badgeNumber = options.badgeNumber || 0; + + // there must be one unique notification per tag, so close any existing outstanding notifications + if (window.Notification.active[this.tag]) + window.Notification.active[this.tag].close(); + window.Notification.active[this.tag] = this; + + // Spec claims these must be defined + this.onclick = options.onclick; + this.onerror = options.onerror; + this.onclose = options.onclose; + this.onshow = options.onshow; + if (this.onshow) { + console.log("Warning, WebNotifications plugin will never call onshow"); // this may change on other platforms + } + + var self = this; + cordova.exec(null, function(error) { + if (self.onerror) { + self.onerror(error); + } + }, 'WebNotifications', 'createNotification', [{ + tag: this.tag, + title: this.title, + body: this.body, + delay: this.delay, + }]); + }; + + // TODO: change name to something internal looking? + window.Notification.permission = 'granted'; + + window.Notification.requestPermission = function(callback) { + setTimeout(function() { + callback(window.Notification.permission); + }, 0); + }; + + // Not part of the W3C API. Used by the native side to call onclick handlers. + // TODO: change name to something internal looking? + window.Notification.callOnclickByTag = function(tag) { + var notification = window.Notification.active[tag]; + if (notification && notification.onclick && typeof notification.onclick == 'function') { + notification.onclick(tag); + } + delete window.Notification.active[tag]; + }; + + window.Notification.callOncloseByTag = function(tag) { + var notification = window.Notification.active[tag]; + if (notification && notification.onclose && typeof notification.onclose == 'function') { + notification.onclose(tag); + } + delete window.Notification.active[tag]; + }; + + // A global map of notifications by tag, so their onclick callbacks can be called. + // TODO: change name to something internal looking? + window.Notification.active = {}; + + /** + * Dismiss a notification. + */ + window.Notification.prototype.close = function() { + var self = this; + cordova.exec(function() { + if (self.onclose) { + self.onclose(); + } + delete window.Notification[self.tag]; + }, function(error) { + if (self.onerror) { + self.onerror(error); + } + delete window.Notification[self.tag]; + }, 'WebNotifications', 'closeNotification', [{ + tag: this.tag, + }]); + }; +} diff --git a/cordova-lib/spec-plugman-create/plugins/WeblessPlugin/plugin.xml b/cordova-lib/spec-plugman-create/plugins/WeblessPlugin/plugin.xml new file mode 100644 index 000000000..f91909618 --- /dev/null +++ b/cordova-lib/spec-plugman-create/plugins/WeblessPlugin/plugin.xml @@ -0,0 +1,80 @@ + + + + + + Webless Plugin + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cordova-lib/spec-plugman-create/plugins/WeblessPlugin/src/android/WeblessPlugin.java b/cordova-lib/spec-plugman-create/plugins/WeblessPlugin/src/android/WeblessPlugin.java new file mode 100644 index 000000000..5263b0c5d --- /dev/null +++ b/cordova-lib/spec-plugman-create/plugins/WeblessPlugin/src/android/WeblessPlugin.java @@ -0,0 +1,19 @@ +/* + * + * Copyright 2013 Anis Kadri + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + diff --git a/cordova-lib/spec-plugman-create/plugins/WeblessPlugin/src/ios/WeblessPlugin.bundle/arrow_left.png b/cordova-lib/spec-plugman-create/plugins/WeblessPlugin/src/ios/WeblessPlugin.bundle/arrow_left.png new file mode 100644 index 0000000000000000000000000000000000000000..530e12babde279931dc58cb36e2af4d9b7d52acc GIT binary patch literal 2946 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 literal 0 HcmV?d00001 diff --git a/cordova-lib/spec-plugman-create/plugins/WeblessPlugin/src/ios/WeblessPlugin.bundle/arrow_left@2x.png b/cordova-lib/spec-plugman-create/plugins/WeblessPlugin/src/ios/WeblessPlugin.bundle/arrow_left@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..530e12babde279931dc58cb36e2af4d9b7d52acc GIT binary patch literal 2946 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 literal 0 HcmV?d00001 diff --git a/cordova-lib/spec-plugman-create/plugins/WeblessPlugin/src/ios/WeblessPlugin.bundle/arrow_right.png b/cordova-lib/spec-plugman-create/plugins/WeblessPlugin/src/ios/WeblessPlugin.bundle/arrow_right.png new file mode 100644 index 0000000000000000000000000000000000000000..8b3d855e884f8aa8b5d2c78139fa63ff4b5826d9 GIT binary patch literal 2946 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 literal 0 HcmV?d00001 diff --git a/cordova-lib/spec-plugman-create/plugins/WeblessPlugin/src/ios/WeblessPlugin.bundle/arrow_right@2x.png b/cordova-lib/spec-plugman-create/plugins/WeblessPlugin/src/ios/WeblessPlugin.bundle/arrow_right@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..8b3d855e884f8aa8b5d2c78139fa63ff4b5826d9 GIT binary patch literal 2946 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 literal 0 HcmV?d00001 diff --git a/cordova-lib/spec-plugman-create/plugins/WeblessPlugin/src/ios/WeblessPlugin.bundle/but_refresh.png b/cordova-lib/spec-plugman-create/plugins/WeblessPlugin/src/ios/WeblessPlugin.bundle/but_refresh.png new file mode 100644 index 0000000000000000000000000000000000000000..309b6bdb255b8784cf884e6fa2bde3febe36da5f GIT binary patch literal 3369 zcmV+^4c79BP)KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z00071NklqXceu3pjFUc z5JW9nxT#Gm!$sC6T|_2SNH}+Xem#N#yGs*zT|V@Fmqnc{N|i_&-u;dR2EW- z3W&9Ax{t-PI1~dpU^B2C7y=rBE}$HE1-y*4Ip6|tbqb1_9mQ&mdRV=yeo)`|SAK@> zQ@^P<)s5o=s7s+L0_8P>-mKr%7Qt zCVhT~{uR1ma!oN%1)Kny;!scHHgwE!Eo*=^z@4~p-+_U^Tau=zN$riu{pz_$8FP$M zbz3HVOG8(rDY~eRMSy$isyx8+9z{SiPzp={oxrC;Q$=0a6Tstz;G*SW4+8xQ5nwFr zU-6I%9$+Hu6+vPJ4=@;ZWiV&K1KdyMtw6~ZZVX{TD3;h0)=k9tk*PJCXg&1%U^1*a9b1Z+tff=9q8&>O{OEwDa{{QiUm-iB{G zFg{aFE>llMA^Do@Y?9}HWag@0)Hbyx-T6!>n3N5`8DL*KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z00071NklqXceu3pjFUc z5JW9nxT#Gm!$sC6T|_2SNH}+Xem#N#yGs*zT|V@Fmqnc{N|i_&-u;dR2EW- z3W&9Ax{t-PI1~dpU^B2C7y=rBE}$HE1-y*4Ip6|tbqb1_9mQ&mdRV=yeo)`|SAK@> zQ@^P<)s5o=s7s+L0_8P>-mKr%7Qt zCVhT~{uR1ma!oN%1)Kny;!scHHgwE!Eo*=^z@4~p-+_U^Tau=zN$riu{pz_$8FP$M zbz3HVOG8(rDY~eRMSy$isyx8+9z{SiPzp={oxrC;Q$=0a6Tstz;G*SW4+8xQ5nwFr zU-6I%9$+Hu6+vPJ4=@;ZWiV&K1KdyMtw6~ZZVX{TD3;h0)=k9tk*PJCXg&1%U^1*a9b1Z+tff=9q8&>O{OEwDa{{QiUm-iB{G zFg{aFE>llMA^Do@Y?9}HWag@0)Hbyx-T6!>n3N5`8DL*KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z00037NkljX3|tA7fD|NDLM0#p2S}&{BvnEsa6c`xgY$0Ef_!-dWs`Spn5FB%dzXgmY$T=*-a9vF+9ZXNMiY)In%UwoItWe7TX< zrS>KBkKm;smzo4h%cxjEYNx`V207|90PKjE6*W2d+_#EDVgRfFqG(aASv(XLC15Xr zvpOYhXK?QAp7v#p6++qO;-DGF#8d`Y6`x}yz)E?R?9E63%{YoYyN;%~q^MS8N9^-+ zOyH(58)uPgZ5q+YMdk6pk002ovPDHLkV1h<3rv3l` literal 0 HcmV?d00001 diff --git a/cordova-lib/spec-plugman-create/plugins/WeblessPlugin/src/ios/WeblessPlugin.bundle/compass@2x.png b/cordova-lib/spec-plugman-create/plugins/WeblessPlugin/src/ios/WeblessPlugin.bundle/compass@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..46a890174edb858abbef991828153aea289a3a49 GIT binary patch literal 3035 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 literal 0 HcmV?d00001 diff --git a/cordova-lib/spec-plugman-create/plugins/WeblessPlugin/src/ios/WeblessPluginCommand.h b/cordova-lib/spec-plugman-create/plugins/WeblessPlugin/src/ios/WeblessPluginCommand.h new file mode 100644 index 000000000..6a23ab6f0 --- /dev/null +++ b/cordova-lib/spec-plugman-create/plugins/WeblessPlugin/src/ios/WeblessPluginCommand.h @@ -0,0 +1,49 @@ +/* + * + * Copyright 2013 Anis Kadri + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +// +// PhoneGap ! ChildBrowserCommand +// +// +// Created by Jesse MacFadyen on 10-05-29. +// Copyright 2010 Nitobi. All rights reserved. +// + +#import +#ifdef PHONEGAP_FRAMEWORK + #import +#else + #import "PGPlugin.h" +#endif +#import "ChildBrowserViewController.h" + + + +@interface ChildBrowserCommand : PGPlugin { + + ChildBrowserViewController* childBrowser; +} + +@property (nonatomic, retain) ChildBrowserViewController *childBrowser; + + +- (void) showWebPage:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options; +-(void) onChildLocationChange:(NSString*)newLoc; + +@end diff --git a/cordova-lib/spec-plugman-create/plugins/WeblessPlugin/src/ios/WeblessPluginCommand.m b/cordova-lib/spec-plugman-create/plugins/WeblessPlugin/src/ios/WeblessPluginCommand.m new file mode 100644 index 000000000..38aaf6497 --- /dev/null +++ b/cordova-lib/spec-plugman-create/plugins/WeblessPlugin/src/ios/WeblessPluginCommand.m @@ -0,0 +1,86 @@ +// + +// +// +// Created by Jesse MacFadyen on 10-05-29. +// Copyright 2010 Nitobi. All rights reserved. +// Copyright (c) 2011, IBM Corporation +// Copyright 2011, Randy McMillan +// + +#import "ChildBrowserCommand.h" + +#ifdef PHONEGAP_FRAMEWORK + #import +#else + #import "PhoneGapViewController.h" +#endif + + +@implementation ChildBrowserCommand + +@synthesize childBrowser; + +- (void) showWebPage:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options // args: url +{ + + if(childBrowser == NULL) + { + childBrowser = [[ ChildBrowserViewController alloc ] initWithScale:FALSE ]; + childBrowser.delegate = self; + } + +/* // TODO: Work in progress + NSString* strOrientations = [ options objectForKey:@"supportedOrientations"]; + NSArray* supportedOrientations = [strOrientations componentsSeparatedByString:@","]; +*/ + PhoneGapViewController* cont = (PhoneGapViewController*)[ super appViewController ]; + childBrowser.supportedOrientations = cont.supportedOrientations; + + if ([cont respondsToSelector:@selector(presentViewController)]) { + //Reference UIViewController.h Line:179 for update to iOS 5 difference - @RandyMcMillan + [cont presentViewController:childBrowser animated:YES completion:nil]; + } else { + [ cont presentModalViewController:childBrowser animated:YES ]; + } + + NSString *url = (NSString*) [arguments objectAtIndex:0]; + + [childBrowser loadURL:url ]; + +} + +-(void) close:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options // args: url +{ + [ childBrowser closeBrowser]; + +} + +-(void) onClose +{ + NSString* jsCallback = [NSString stringWithFormat:@"ChildBrowser._onClose();",@""]; + [self.webView stringByEvaluatingJavaScriptFromString:jsCallback]; +} + +-(void) onOpenInSafari +{ + NSString* jsCallback = [NSString stringWithFormat:@"ChildBrowser._onOpenExternal();",@""]; + [self.webView stringByEvaluatingJavaScriptFromString:jsCallback]; +} + + +-(void) onChildLocationChange:(NSString*)newLoc +{ + + NSString* tempLoc = [NSString stringWithFormat:@"%@",newLoc]; + NSString* encUrl = [tempLoc stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; + + NSString* jsCallback = [NSString stringWithFormat:@"ChildBrowser._onLocationChange('%@');",encUrl]; + [self.webView stringByEvaluatingJavaScriptFromString:jsCallback]; + +} + + + + +@end diff --git a/cordova-lib/spec-plugman-create/plugins/WeblessPlugin/src/ios/WeblessPluginViewController.h b/cordova-lib/spec-plugman-create/plugins/WeblessPlugin/src/ios/WeblessPluginViewController.h new file mode 100644 index 000000000..d6fc139d5 --- /dev/null +++ b/cordova-lib/spec-plugman-create/plugins/WeblessPlugin/src/ios/WeblessPluginViewController.h @@ -0,0 +1,73 @@ +/* + * + * Copyright 2013 Anis Kadri + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +// +// ChildBrowserViewController.h +// +// Created by Jesse MacFadyen on 21/07/09. +// Copyright 2009 Nitobi. All rights reserved. +// + +#import + +@protocol ChildBrowserDelegate + + + +/* + * onChildLocationChanging:newLoc + * + * Discussion: + * Invoked when a new page has loaded + */ +-(void) onChildLocationChange:(NSString*)newLoc; +-(void) onOpenInSafari; +-(void) onClose; +@end + + +@interface ChildBrowserViewController : UIViewController < UIWebViewDelegate > { + IBOutlet UIWebView* webView; + IBOutlet UIBarButtonItem* closeBtn; + IBOutlet UIBarButtonItem* refreshBtn; + IBOutlet UILabel* addressLabel; + IBOutlet UIBarButtonItem* backBtn; + IBOutlet UIBarButtonItem* fwdBtn; + IBOutlet UIBarButtonItem* safariBtn; + IBOutlet UIActivityIndicatorView* spinner; + BOOL scaleEnabled; + BOOL isImage; + NSString* imageURL; + NSArray* supportedOrientations; + id delegate; +} + +@property (nonatomic, retain)id delegate; +@property (nonatomic, retain) NSArray* supportedOrientations; +@property(retain) NSString* imageURL; +@property(assign) BOOL isImage; + +- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation) interfaceOrientation; +- (ChildBrowserViewController*)initWithScale:(BOOL)enabled; +- (IBAction)onDoneButtonPress:(id)sender; +- (IBAction)onSafariButtonPress:(id)sender; +- (void)loadURL:(NSString*)url; +-(void)closeBrowser; + +@end diff --git a/cordova-lib/spec-plugman-create/plugins/WeblessPlugin/src/ios/WeblessPluginViewController.m b/cordova-lib/spec-plugman-create/plugins/WeblessPlugin/src/ios/WeblessPluginViewController.m new file mode 100644 index 000000000..167ef9801 --- /dev/null +++ b/cordova-lib/spec-plugman-create/plugins/WeblessPlugin/src/ios/WeblessPluginViewController.m @@ -0,0 +1,239 @@ +// +// ChildBrowserViewController.m +// +// Created by Jesse MacFadyen on 21/07/09. +// Copyright 2009 Nitobi. All rights reserved. +// Copyright (c) 2011, IBM Corporation +// Copyright 2011, Randy McMillan +// + +#import "ChildBrowserViewController.h" + + +@implementation ChildBrowserViewController + +@synthesize imageURL; +@synthesize supportedOrientations; +@synthesize isImage; +@synthesize delegate; + +/* + // The designated initializer. Override if you create the controller programmatically and want to perform customization that is not appropriate for viewDidLoad. +- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { + if (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) { + // Custom initialization + } + return self; +} +*/ + ++ (NSString*) resolveImageResource:(NSString*)resource +{ + NSString* systemVersion = [[UIDevice currentDevice] systemVersion]; + BOOL isLessThaniOS4 = ([systemVersion compare:@"4.0" options:NSNumericSearch] == NSOrderedAscending); + + // the iPad image (nor retina) differentiation code was not in 3.x, and we have to explicitly set the path + if (isLessThaniOS4) + { + return [NSString stringWithFormat:@"%@.png", resource]; + } + + return resource; +} + + +- (ChildBrowserViewController*)initWithScale:(BOOL)enabled +{ + self = [super init]; + + + scaleEnabled = enabled; + + return self; +} + +// Implement viewDidLoad to do additional setup after loading the view, typically from a nib. +- (void)viewDidLoad { + [super viewDidLoad]; + + refreshBtn.image = [UIImage imageNamed:[[self class] resolveImageResource:@"ChildBrowser.bundle/but_refresh"]]; + backBtn.image = [UIImage imageNamed:[[self class] resolveImageResource:@"ChildBrowser.bundle/arrow_left"]]; + fwdBtn.image = [UIImage imageNamed:[[self class] resolveImageResource:@"ChildBrowser.bundle/arrow_right"]]; + safariBtn.image = [UIImage imageNamed:[[self class] resolveImageResource:@"ChildBrowser.bundle/compass"]]; + + webView.delegate = self; + webView.scalesPageToFit = TRUE; + webView.backgroundColor = [UIColor whiteColor]; + NSLog(@"View did load"); +} + + + + + +- (void)didReceiveMemoryWarning { + // Releases the view if it doesn't have a superview. + [super didReceiveMemoryWarning]; + + // Release any cached data, images, etc that aren't in use. +} + +- (void)viewDidUnload { + // Release any retained subviews of the main view. + // e.g. self.myOutlet = nil; + NSLog(@"View did UN-load"); +} + + +- (void)dealloc { + + webView.delegate = nil; + + [webView release]; + [closeBtn release]; + [refreshBtn release]; + [addressLabel release]; + [backBtn release]; + [fwdBtn release]; + [safariBtn release]; + [spinner release]; + [ supportedOrientations release]; + [super dealloc]; +} + +-(void)closeBrowser +{ + + if(delegate != NULL) + { + [delegate onClose]; + } + if ([self respondsToSelector:@selector(presentingViewController)]) { + //Reference UIViewController.h Line:179 for update to iOS 5 difference - @RandyMcMillan + [[self presentingViewController] dismissViewControllerAnimated:YES completion:nil]; + } else { + [[self parentViewController] dismissModalViewControllerAnimated:YES]; + } +} + +-(IBAction) onDoneButtonPress:(id)sender +{ + [ self closeBrowser]; + + NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"about:blank"]]; + [webView loadRequest:request]; +} + + +-(IBAction) onSafariButtonPress:(id)sender +{ + + if(delegate != NULL) + { + [delegate onOpenInSafari]; + } + + if(isImage) + { + NSURL* pURL = [[ [NSURL alloc] initWithString:imageURL ] autorelease]; + [ [ UIApplication sharedApplication ] openURL:pURL ]; + } + else + { + NSURLRequest *request = webView.request; + [[UIApplication sharedApplication] openURL:request.URL]; + } + + +} + +- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation) interfaceOrientation +{ + BOOL autoRotate = [self.supportedOrientations count] > 1; // autorotate if only more than 1 orientation supported + if (autoRotate) + { + if ([self.supportedOrientations containsObject: + [NSNumber numberWithInt:interfaceOrientation]]) { + return YES; + } + } + + return NO; +} + + + + +- (void)loadURL:(NSString*)url +{ + NSLog(@"Opening Url : %@",url); + + if( [url hasSuffix:@".png" ] || + [url hasSuffix:@".jpg" ] || + [url hasSuffix:@".jpeg" ] || + [url hasSuffix:@".bmp" ] || + [url hasSuffix:@".gif" ] ) + { + [ imageURL release ]; + imageURL = [url copy]; + isImage = YES; + NSString* htmlText = @""; + htmlText = [ htmlText stringByReplacingOccurrencesOfString:@"IMGSRC" withString:url ]; + + [webView loadHTMLString:htmlText baseURL:[NSURL URLWithString:@""]]; + + } + else + { + imageURL = @""; + isImage = NO; + NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:url]]; + [webView loadRequest:request]; + } + webView.hidden = NO; +} + + +- (void)webViewDidStartLoad:(UIWebView *)sender { + addressLabel.text = @"Loading..."; + backBtn.enabled = webView.canGoBack; + fwdBtn.enabled = webView.canGoForward; + + [ spinner startAnimating ]; + +} + +- (void)webViewDidFinishLoad:(UIWebView *)sender +{ + NSURLRequest *request = webView.request; + NSLog(@"New Address is : %@",request.URL.absoluteString); + addressLabel.text = request.URL.absoluteString; + backBtn.enabled = webView.canGoBack; + fwdBtn.enabled = webView.canGoForward; + [ spinner stopAnimating ]; + + if(delegate != NULL) + { + [delegate onChildLocationChange:request.URL.absoluteString]; + } + +} + +- (void)webView:(UIWebView *)wv didFailLoadWithError:(NSError *)error { + NSLog (@"webView:didFailLoadWithError"); + [spinner stopAnimating]; + addressLabel.text = @"Failed"; + if (error != NULL) { + UIAlertView *errorAlert = [[UIAlertView alloc] + initWithTitle: [error localizedDescription] + message: [error localizedFailureReason] + delegate:nil + cancelButtonTitle:@"OK" + otherButtonTitles:nil]; + [errorAlert show]; + [errorAlert release]; + } +} + + +@end diff --git a/cordova-lib/spec-plugman-create/plugins/WeblessPlugin/src/ios/WeblessPluginViewController.xib b/cordova-lib/spec-plugman-create/plugins/WeblessPlugin/src/ios/WeblessPluginViewController.xib new file mode 100644 index 000000000..cc8dd6592 --- /dev/null +++ b/cordova-lib/spec-plugman-create/plugins/WeblessPlugin/src/ios/WeblessPluginViewController.xib @@ -0,0 +1,875 @@ + + + + 768 + 10K540 + 851 + 1038.36 + 461.00 + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + 141 + + + YES + + + YES + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + YES + + YES + + + YES + + + + YES + + IBFilesOwner + IBCocoaTouchFramework + + + IBFirstResponder + IBCocoaTouchFramework + + + + 292 + + YES + + + -2147483374 + {480, 229} + + + + 1 + MCAwIDAAA + + YES + YES + IBCocoaTouchFramework + 1 + YES + + + + 266 + {{0, 256}, {480, 44}} + + + NO + NO + IBCocoaTouchFramework + 1 + + YES + + IBCocoaTouchFramework + 1 + + 0 + + + IBCocoaTouchFramework + + 5 + + + IBCocoaTouchFramework + + + + IBCocoaTouchFramework + + 5 + + + IBCocoaTouchFramework + 32 + + + + IBCocoaTouchFramework + + 5 + + + IBCocoaTouchFramework + 32 + + + + IBCocoaTouchFramework + + 5 + + + IBCocoaTouchFramework + 32 + + + + IBCocoaTouchFramework + + 5 + + + + + + 270 + {{5, 230}, {418, 21}} + + + + 4 + MC42NjY2NjY2OSAwAA + + NO + YES + NO + IBCocoaTouchFramework + Loading... + + Helvetica + 13 + 16 + + + 3 + MQA + + + 1 + NO + 10 + + + + -2147483383 + {{454, 231}, {20, 20}} + + NO + NO + NO + IBCocoaTouchFramework + + + {{0, 20}, {480, 300}} + + + 3 + MC41AA + + 2 + + + + + 3 + + IBCocoaTouchFramework + + + + + YES + + + webView + + + + 17 + + + + addressLabel + + + + 18 + + + + backBtn + + + + 19 + + + + fwdBtn + + + + 22 + + + + refreshBtn + + + + 23 + + + + onDoneButtonPress: + + + + 26 + + + + reload + + + + 27 + + + + goBack + + + + 28 + + + + goForward + + + + 29 + + + + onSafariButtonPress: + + + + 31 + + + + view + + + + 35 + + + + spinner + + + + 36 + + + + safariBtn + + + + 40 + + + + + YES + + 0 + + + + + + 1 + + + YES + + + + + + + + + -1 + + + File's Owner + + + -2 + + + + + 4 + + + + + 6 + + + YES + + + + + + + + + + + + + + + 7 + + + + + 8 + + + Bar Button Item (Reload) + + + 9 + + + Bar Button Item (Go Back) + + + 10 + + + Bar Button Item (Go Forward) + + + 11 + + + Bar Button Item (Safari) + + + 13 + + + + + 14 + + + + + 15 + + + + + 32 + + + + + 37 + + + + + 38 + + + + + 39 + + + + + + + YES + + YES + -1.CustomClassName + -2.CustomClassName + 1.IBEditorWindowLastContentRect + 1.IBPluginDependency + 10.IBPluginDependency + 11.IBPluginDependency + 13.IBPluginDependency + 13.IBViewBoundsToFrameTransform + 14.IBPluginDependency + 15.IBPluginDependency + 32.IBPluginDependency + 32.IBViewBoundsToFrameTransform + 37.IBPluginDependency + 38.IBPluginDependency + 39.IBPluginDependency + 4.IBPluginDependency + 4.IBViewBoundsToFrameTransform + 6.IBPluginDependency + 6.IBViewBoundsToFrameTransform + 7.IBPluginDependency + 8.IBPluginDependency + 9.IBPluginDependency + + + YES + ChildBrowserViewController + UIResponder + {{250, 643}, {480, 320}} + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABCoAAAwygAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABD5gAAw3kAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABB8AAAwwUAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAAAAAAAAw10AAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + + YES + + + YES + + + + + YES + + + YES + + + + 40 + + + + YES + + ChildBrowserViewController + UIViewController + + YES + + YES + onDoneButtonPress: + onSafariButtonPress: + + + YES + id + id + + + + YES + + YES + onDoneButtonPress: + onSafariButtonPress: + + + YES + + onDoneButtonPress: + id + + + onSafariButtonPress: + id + + + + + YES + + YES + addressLabel + backBtn + closeBtn + delegate + fwdBtn + refreshBtn + safariBtn + spinner + webView + + + YES + UILabel + UIBarButtonItem + UIBarButtonItem + id + UIBarButtonItem + UIBarButtonItem + UIBarButtonItem + UIActivityIndicatorView + UIWebView + + + + YES + + YES + addressLabel + backBtn + closeBtn + delegate + fwdBtn + refreshBtn + safariBtn + spinner + webView + + + YES + + addressLabel + UILabel + + + backBtn + UIBarButtonItem + + + closeBtn + UIBarButtonItem + + + delegate + id + + + fwdBtn + UIBarButtonItem + + + refreshBtn + UIBarButtonItem + + + safariBtn + UIBarButtonItem + + + spinner + UIActivityIndicatorView + + + webView + UIWebView + + + + + IBProjectSource + Plugins/ChildBrowser/ChildBrowserViewController.h + + + + + YES + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSError.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSFileManager.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyValueCoding.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyValueObserving.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyedArchiver.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSObject.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSRunLoop.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSThread.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSURL.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSURLConnection.h + + + + NSObject + + IBFrameworkSource + QuartzCore.framework/Headers/CAAnimation.h + + + + NSObject + + IBFrameworkSource + QuartzCore.framework/Headers/CALayer.h + + + + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UIAccessibility.h + + + + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UINibLoading.h + + + + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UIResponder.h + + + + UIActivityIndicatorView + UIView + + IBFrameworkSource + UIKit.framework/Headers/UIActivityIndicatorView.h + + + + UIBarButtonItem + UIBarItem + + IBFrameworkSource + UIKit.framework/Headers/UIBarButtonItem.h + + + + UIBarItem + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UIBarItem.h + + + + UILabel + UIView + + IBFrameworkSource + UIKit.framework/Headers/UILabel.h + + + + UIResponder + NSObject + + + + UISearchBar + UIView + + IBFrameworkSource + UIKit.framework/Headers/UISearchBar.h + + + + UISearchDisplayController + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UISearchDisplayController.h + + + + UIToolbar + UIView + + IBFrameworkSource + UIKit.framework/Headers/UIToolbar.h + + + + UIView + + IBFrameworkSource + UIKit.framework/Headers/UIPrintFormatter.h + + + + UIView + + IBFrameworkSource + UIKit.framework/Headers/UITextField.h + + + + UIView + UIResponder + + IBFrameworkSource + UIKit.framework/Headers/UIView.h + + + + UIViewController + + IBFrameworkSource + MediaPlayer.framework/Headers/MPMoviePlayerViewController.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UINavigationController.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UIPopoverController.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UISplitViewController.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UITabBarController.h + + + + UIViewController + UIResponder + + IBFrameworkSource + UIKit.framework/Headers/UIViewController.h + + + + UIWebView + UIView + + IBFrameworkSource + UIKit.framework/Headers/UIWebView.h + + + + + 0 + IBCocoaTouchFramework + + com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS + + + + com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS + + + + com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 + + + YES + + 3 + 141 + + diff --git a/cordova-lib/spec-plugman-create/plugins/cordova.echo/.gitignore b/cordova-lib/spec-plugman-create/plugins/cordova.echo/.gitignore new file mode 100644 index 000000000..e43b0f988 --- /dev/null +++ b/cordova-lib/spec-plugman-create/plugins/cordova.echo/.gitignore @@ -0,0 +1 @@ +.DS_Store diff --git a/cordova-lib/spec-plugman-create/plugins/cordova.echo/plugin.xml b/cordova-lib/spec-plugman-create/plugins/cordova.echo/plugin.xml new file mode 100644 index 000000000..a9145e778 --- /dev/null +++ b/cordova-lib/spec-plugman-create/plugins/cordova.echo/plugin.xml @@ -0,0 +1,24 @@ + + + + + + + + cordova echo + + + + + + + + + + + + + + diff --git a/cordova-lib/spec-plugman-create/plugins/cordova.echo/src/blackberry10/index.js b/cordova-lib/spec-plugman-create/plugins/cordova.echo/src/blackberry10/index.js new file mode 100644 index 000000000..0759a20eb --- /dev/null +++ b/cordova-lib/spec-plugman-create/plugins/cordova.echo/src/blackberry10/index.js @@ -0,0 +1,85 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +var echoJNext, + _event = require("../../lib/event"), + winCallback = null, + failCallback = null; + +module.exports = { + doEcho: function (success, fail, args) { + var invokeData = { "message" : JSON.parse(decodeURIComponent(args.message)) }; + try { + success(echoJNext.getEchoJNext(invokeData)); + } catch (e) { + fail(-1, e); + } + } +}; + +/////////////////////////////////////////////////////////////////// +// JavaScript wrapper for JNEXT plugin +/////////////////////////////////////////////////////////////////// + +JNEXT.EchoJNext = function () +{ + var _self = this; + + _self.getEchoJNext = function (args) { + return JNEXT.invoke(_self._id, "doEcho " + JSON.stringify(args)); + }; + + _self.getId = function () { + return _self._id; + }; + + _self.init = function () { + if (!JNEXT.require("echoJnext")) { + return false; + } + + _self._id = JNEXT.createObject("echoJnext.Echo"); + + if (!_self._id || _self._id === "") { + return false; + } + + JNEXT.registerEvents(_self); + }; + + _self.onEvent = function (strData) { + var arData = strData.split(" "), + strEventId = arData[0], + args = arData[1], + info = {}; + + if (strEventId === "cordova.echo.callback") { + _event.trigger("echoCallback", args); + } + + }; + + _self._id = ""; + + _self.init(); +}; + +echoJNext = new JNEXT.EchoJNext(); diff --git a/cordova-lib/spec-plugman-create/plugins/cordova.echo/src/blackberry10/native/device/echoJnext.so b/cordova-lib/spec-plugman-create/plugins/cordova.echo/src/blackberry10/native/device/echoJnext.so new file mode 100755 index 0000000000000000000000000000000000000000..169714a07120b9679dfa9339e5ceb24eec47010e GIT binary patch literal 1291818 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

o#K0MD@q{FL0iEn&YKi>{YKHXptoc=u> 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 z

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

^SxS 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�&8`@3JylY4Vr=l^xCbDi@!pZoR_oMJq?h4a(t<;TU{^0a(dD{}cU z^3$cCeHyuZ|5pL`)%lNizg^-XVgKWQ|5u?Smw0EX%I}!sWomxw_9R~(uJ1;r->l}d z{K%mH@%wkB;;kzEZk1ksh}}(pMCtES`toD#u72`Era%1krbX$mclIAw6VGpe<@-3z zeqx`q|F{YHA><!y+$qSmcX745#1eu$TWwVR;wDJ--<4?>xmv zoc@;l=BxAz9Ts`yaJam-4vRd~VXr+7i+uJc;q)sV_R=2-%d;F7`8tOs|4j~yJaROg zKGk87Z$B26A9h&e13$C!9sIeR@s;neFyDt!>BvRDJkj>A)ThQ_uRMn()N3L?`6g47 z-)=`P`b(0+`7Lu;*be3-)`KYVUj-tlvmMV{5(@^JoK zp!%oAk&Aw>6std%MSkS`uv~s*#sB#JZIR;U zZ-o6%{1%lyMWcDig5ZYmAO21O+uT&g)EIb}XD*YOz-%jb5EBymXzq8V>QTnN03b%h_uP}F4 z=^Iq~%}T#g={G8U`Eeire(0;MlM%IE4YQgZq6JXhYNo>%_{v$m0o_-$t|y0>90}x@*_*G{#M0%Rr>WR zeY4U(+&i3K@;AfwyGf-#rt~-V4W}QW(r;DiH!J-kikp>wq+dAyEX4~{dAn8m9HqZR z>F-ney-X_rGG@}cj+H)&t|0``K9Uqc3%9s%+VKrx6)zpZ+lhx6eqpt zA5r>+nc?z}sr0ETeUZ{%t+?~IOnv?Jr>9E4PU&YT{WPV&Q|V_Z{Y<4ldqB87MM^(Q z>2Ff{IZ7@+zU6;>f0n1@M_Q40ye^!6rmBz5uTtsHRr-aheEG32w|)ziev#7OuJp^5 z{IHVOD0%Aj;quxJ40Dqz|Ah2Pzd_|cP{|vWys#DdY$e~Q>Z9}9sPyNm@^&hD;a9@# z-Kz3mpwi2ar@7;kvM@Y97AbxCacx(>i_&jW`jH#L`aPBYGNms+UgzeYq4ZZO{Y6TD zjgqfZ@+_6#dZphhD_s6u#UoVuO)C8YrN2*cxk|rPrEgLCF{R(E^iu|h>)WXGcPss! zN`Ie{7YzyL*P`UfL&Ngi!8GG~hEApdm?)bM=@&iiVG%T#YROO$d z(l1l`E0um{rQf3TQXe1E=9)lcUyKL+UPZ&Lbcsy*2-ER}w~($7)yWlEl>3?Vm!G{|F^7 zQu6Xvqu7dpT7N`GK(IDJQzzFgI3n9}d1^lOyBlSml}g@lOE|wZO1?nJm#Ol!e$Tvce(P0!SxUZ1$%~XcXLLBf&8qwp z(kuNIrN32`H&^K&Q~J$Hf1lEC`|a@j+pY8~$As(OQR(kf`UCUB`l(94Md_C+{a#A{ zh|*uK^mCMcWW8yRzdmkO`fZhbuac)I`7tGLEC{!+K$Wl4&sF-JRsPGAJXOgzD*1@9 z;qr@A`8xf0rN3lcIDMl^-&2*pROv5M`e{nP^R40hGab3?XItX;xBUBPop+e=@;OIw zjp9bd%M`aL&U`DJf05#H#SMygD^B@iIKNcIX^MAFGy4AXrW_?dpyUNg-m^BGzDUW( zD|w}o&sXvWC10cDjY_^w$rma4ZY5u;DU!e5omxa?WQ2Gm%e9fe={&-d1B9(r<(r;4o zW+h*yAx4uhQoz z{Y^?s(-4|U#j$XEBzd$zf$S% zQ~EVZf1T2AQTjWTe(Lmadp4=`M^ySWr61W~{F@*Drrj0JudR|7wIZM0ihNls@|{Ya z+Hm^%^lC+(r{s}EroFyDciSiHSA$xA_c`nNuc*p?*nPjCb38uv-!Evso=m(?*T|nt z)!{RJzo2=QN#vhTrT#3;?Nt4yac~|hmu&Y)6DbHKE=r2?GH7WaQbn+AZ(g$t& z9P(dI{_;!Zrv5dKT=bhAmiFv+Smf*H+Wb7Z!y<2)XXTS9uZi;HE6YuJ#~iunFL}u7 zOMdGd7Wu}9t$ZH&EhN9sIr(jM#uw+S};JMSqFIlHWRqMLuGo&2JL<6{`9bI&#r(a9HwN z@hwIy}$;w6l zh{KX!bL{Sxaqxe<8nS^8135Ux6bR{lXtv zeaUaU!y;eru*f$#Eb@$H;q(I?7Wp!VCH+c=Mc(DvaQf~Ji+q8@l75lHBJcH+aQX~~ zMLu&ySU%Tbk+*v;Ebr*B$di8>mbY_Q2k7O5UR6bCtYVac5P&PQP2}m%bRTe|MGsh$_EQ>5owQk(W(>`uokfO21igTcy8S z$y1d4NGtNpHR1LYs`_^$&V;5Rr&W+=_6~y^{G+%X-dC~(x0jHGnM{8 zr9W5cXDR&!O20+%LX|#8r9Yzdvwj|KUz19or_$#r{pCu(Q0dQB`kP(~msh0pw`%z> z!}^<4dF3j7xzgYKayb2VmA*!$->vj#zYsq_m}`U0h&r}P&o{TijeQSo?{zDcFutn|y3{xYS%PwB^${z|2v zvnkyExr!TA`ZX&30;NA+>91G%ElR)iwQ%{1RQgRSeWlW0u6U_Rzg4AQt@N9fe5aD{ zR`SD2p7DCP{wr1aI{iSUKU48Km42Tpf40)!r1V>q{xYS1M9DWRdE^x{U;XuLZ!7Z1 z8{zir^j%t!XSE_PY(*YZ^3963tNzjT+phH6s`l?w@)RX+w>jK?E$^x1a~1Da_0#DW zDE$LUzq6{(VWodW>8C3FHCw{`XiKnq0-OW7Oqc`l2F-whrAog>=|_GSF26?UHz@s7r9V^YH!A%srN2b+T$O&VO21U;FI4&ql>Szwzu@=b z_BE;Wi&XkWN`JZ1Z&Lalw}CF=EB%#9f2q=6qvY$9e7%xySMmd@ zJgt9N>2Ff`rR)f|cdL^3Qu0l2onC*dk~gdT_9^*pB~SiiIDai4(TaRwEAo{}enj=3 zE^pJ$aD9@05caS8RQ-4F3hSpR{T8KvMCl(<@{WHB=U1S(i^@Ops;Qs9{*PDsOBDB1 z>D#LGOO<|x(oa$Po0WcNC7=IxxIL*#zO)tj`c~vSTahR44ws*$+N0~UQ0b3Q`aM1V0>%~bk1O1@Ib^OStAlGmv6 zw0_5T!u2aqJX57FROO9V`uh~mRq2aV`WB^MuH^0ZhU-_O%|Zn(aciknpW2GyRJ(vQ3s&TqL&->A~JRr+(4yt|SwQ1Yx+S(l1i_Ym~fE$=56S zQYG)M%G3I7-w)R>P3dn^`7coV&58%A^jlT>-Acb%$=iJpuFq~IPgU|9Ri4%_Rr*U6 z7pV06RC&vlev6WCR`Md1-w~x>a3I{i$R=YCemu~qcJV(jf{x#gb znBu*ve4T!-(ocTIjJH4k^Hh1ulzxiRFI4)Qlzx$t?^W_HD!+22-|=tZ_SPtQhLXn= zHz@s?O5RhIul1KG{l*W&^~q4_8&!F8mHt-6GgbPzDt)ukpR4p2DE*X=!u4CEA)*r9*QLeEBzKFPd*y% zk4%-{5vAX#^dqmC{`S|KFH`z?O8917!4N8BFlCMKVIo?RrQ&#U&yE_CGbzV3GJBT9+pe&c#a-mxv;FATfy|8!|K z_4D8Vk@o@oPbcsD+GgJwV5DoLH|fpiOx_2Q{z|^fw@0YjI8DB}?QOPSE7J1C!A+*09F5us#|Hs0w z!9@XAz*i+FNAd!G7@h%dq+MpbdbPFnk^D0pmi8VvCoDhau*esk8R0*&t1t4J6w4x?>9EL4&$serv_I?a@crGnj@&D+v(=aUW;-nM z!i&T5Qinwz>l&6Xa9HF;mxbkx4vRc9H7w6^Smepw!t#R4EsK2V7cEQuS34~75k124 z@eYf8=M`ajvzj04mm9gi-n;Wf$~)ksm;7d4Y4qEA^KG`nBJbEUEbrp5$k$yJmTz)c z*d1miir0?b)o_Q{&8k(eHR|IKP>Sn^pP-m43F;->dW+m41`bUz!#! zzeS~=tI{u5`WY)sdVjnYDE*B}KTGK^Qu@1<{s^Vtr1Xy{{X(U`OzC$_H}&=XW2w?# zsr1(?{WVJ7tmHK+zx7JLWAAYJ`xMVq={KqLElPi>(%-7|+w}>Tw^HdhEB!R3zgx*i zDEU4mFK|0X4$uku@@^fLy9+f#Hym=~$^ zO)7o4(qE?J^Obz&;BfxUD*u%#{cNSbSLv@&`b(95i_%}O^w%r>O-jC7$wv$c*Z-Kx zf2&Ggr1ZP|)TH`V=bOtJ0^c z^hHX4&CTKbT2%U;D*bw;e@yA8DgAv)zwJs>o^NlNO26F*Blr8eNO4D%K1-!9SNf?+ zKS$}$R{D8LzFf%*m3(6>^4+b-BO}A@tyJ7g)nAw2sPsoD{UTN0CZ%7f^vjk0cBNmc z^lOxU@~CioYLtG1((k48XDa&r1D#-^k*vl!`5O5RzOr}Z0@eu~O(p^|r2@|CT~cPe>z zRUe&Sq`1V0@DwRA($(OexZ*E0?q!oF`apCsp@-thJ=V`g>51rp~rJtwTyH&{xRDOj@Kke3V z{fm@*ypoqId1EW`^{vQ{^s?p4^QEKkT=uu-c}3ARRxZz%2HqWhzSQW*4{+W;3wEC` zrK;ykh0g@rXPzg0PQEB7_{j65;rvYz!ROFtqxfsDQ~%EB3wPw-P5s>d_%iY%$U6t} zEI6ewIkF(&(Qp%7={%2Vxy`mu%4>JKaUWzQ`Hhhmdc-BRNtSl(z`3 z8J`^K74Q$?-EdmKtKpOh$&sBr;xp~pTV%_Z`W$dr&exZ2=6}3T*T~8GYyBjf{tfas zpHua3dAZeZMqjv+M5aEG-x_(l$bRJ8k(>4;$rm?O`1WA*8=U@-`nLV8sX^DsX!9rk zJz0H3KQmrl`^Y8aZ#aQ(Z4r6TxIJ}+Z?_-|rmDl31$PYVQOn%vyCPl{Z@0asD@P2r7abo1+fS-V0u1oZu z4~qO}@W{U;dht;d%oBX%JB#jyUrtMobm4E&|1Wp~_YJNMII~?O z^7w^Gad|%c=6$~WJoG2QGa8b-{Dtp_=di!HB1r!;_@Y~rJUf#7H^a|3>EDL;@O=Tx z1N~3oS$8LS_AB{a#TV&}{G(0(LwFnh@2i3S<)7z|;3Mt11@3TVQluw;OL+_6{m=R= z`K^FwF@LiH`CIU|-z7yh1$+x%v@??XJf{AS!`X|HBIU>>{c>2opISz^8{dbw4PKR+ z6v+tE?}Z1yml*G_I;m9fkw3rgu=ubC;OC!Uax&i~|L?-v_9S|CA@%+C(-ja!d=ggL0@VEI0HQ{Du4?d-&O|ILS2(0`>t`X8rO3HK#>&(o#;XLX`~znU0{Arn3y&gK0B@#n&i!o}EYUcgJ?wcIBk81PZ}5TpN< zfQQks9}^E5ULwrz;Wkho8P9F7+{eJIz4ji4dvr>QTpFZ5>%vH6*W1?K2Epgtn;6Lq zg%7=&821Oy z!7BrQnSwuE3%m7efv@5Hpd8vR_3L&C`Txk)X8=5l@w+^b{~BI#uiw8?-*@0$)c5K@ zekTok=|wwV9)dgk*!r7ga2xK6&J6U=@5&#+NBaLVc8}#$<%KF zJbIh0?-zRDzc<(;pAR>31bYssj0s;r4G>d%N&Uk;qv59o_EL=d18zYyI_G>h}tKFYjxl2J$O< zh3Ee;_~n8muRlcpcKFTftbPr=uFRib(qG?zR}mkX{FcK9xi4e-a|gTBdi6gJcf}uw8OnHk zA)WEsVdvAMu=%9$$M@i|%on5IgFxY3{1?lXSD%saGU5&SoX5AQ=EK=vPm24yd2lZN zQ}m_0zrcHlXHx^dpb!3Ta$@AsfP28#@cnq=PenfuevQr61qnWHgO7K#+A6Ic%`(U<;g)0giXWxWvl z7w!g|Pbz;5fZNj^Gyf{#Z0_rmjaUC4!wLA8p9lO)c-8|+krr6;+Xj!EkrkA6ye{w{-k-Q2 zkk5e6c`7NAO#e#$-+;|W#{VgJ*MHe~;7xdEuwNDZ58w$+etm^IWYQmZC&vBHE$~&F zt-tsMoQr>)P2SS~=MG@}XwQ&M@@ds@Tz-!euRp1R_C62{}NPLV!v8~R`DLG*{i8G*m*K(6E9d9!W2Q~`JTz}9~UoUqrfpF;-X zzy4zV!_VMnh}R~Pzx3yR_#pe4E&*RYi2l7RDek{-g`cH=vjTY;yrLvAQWJ0tHXj-P zhv6C6qx7BR-{vdW*BjOzro*|+KZ^C_&%%#5x%OX0QHtEtb! z@V&bdBTIww-+}k!T7P$OHg?W>n-%1j0bj#>H}-Q2d==kcVDeiCZ+X{_-#_4&r(142 z9RJMvFq{0OzXrnd_Wz%bKHtfbT)8YE>TmP~Mo^X|a z-X;0J3Xf*~oAzJ9#FgJ8>rH;$_?GhV@LJ~ACfYChb?~hB?fgl|#add zSHO?aAE`n8w!!mwpVsg{;XSlZ>_f(@=qAQtz*k zsb6>a&{4a7eGh*2vZM%Z-OK-VxV;mPT`~gyH<11g#y1}xFrRoZXm1tVq0sl2lK(w$ zHqnywkJNV){MtqvpOlPbJ@|q3KWpHrFIs!QXcX-mnH*^h(r3fwBlbQ5-s`Lnli}xI zv+aKlzUXoMO;F$0;hDq_VsBEv_hIu9|MLkvkNuU{pU5w~1^=_w#?$lQdH9D*kxP5N z4fnV_DZc)!f_LTF{rhL|;%Dr6+eLZ!&v7;$7y`e>e4H5McRT!UhTVUB4PM3kNekp_ z;4R3_`fw1Qg?};a`TS_gn_}&=A8bCU{Ba{Z?fZ$5Z}Yd*e-gZ7Nm688Fn;slN9Nk` zTLibEJTssE2;YW3Huit+7?Zp77yl2x#`@Yh$iD}Ci19V^`A6{4H0yu<48O^K)Z|y2 z&w6sJwfD#2EyPns{t7I=x7UvRWxYHAzl41m|IxJodwJUS_x13{*IEBJ8J@uX`UOFI ze+*yKiS{M=YW%Km8@J`E=lq?(l?n ztbN=KA7cMF6Pe^U4<4D|@4v*}ehR17`TL6w_>)&8J^RV-f&LM=9)D}vd)YX~FFiTF z9u9_cFR=c!5blb-n)t33o?n_ASxSCV-lOm|&a+H@FTjsqk`&n(l(z+5{JX?RWwKx2 z(pxEy^XSw-{uB5%{DH~;2;77Fg{6V~attQ{e`4grVRwJ`2;7PNi5cJ3@KNS}R*?SE z+pz!p665VJfYaM2d-1o_{~mZyzKzeHg4?rxnEZYZA8`D`2k=hze>BHy|1mhziI3Xe zj{m{GoBk+<-SytOl)Na-&*FaI5U73bh@jfXqJ@_U_~NiY8461bTAX+?qmp9**7yrL1gwD%YACg(hRD}2u3#K^M1AAAb$ zA^ysW`1%uyu~+;F)51&t82m2hWnBXPKHRm~^3UKwoJX1VZGro?O^(M0e}_A;|1{}u zn20}TJ?<6cHywVqiyi-Y@QU~Be(N20#znS%|A1Y8`K1!}@AZCvh(Eaz?%U{}zl%Lo z2w!aXL-)dNy#6q}f&GB#|MsQCC-2+y^_lPl>XRDOw@q0%KF@>)JjZ!@U=P25ullv^ zpTtR=N6^0=gY;SO3gk4y>)#h(^AUf$S@C=DYxgI{u%Eaf z;Md^+wC90<%gb4BcwTaOz|X_a-+*^qWBv1fc#&h@$6@o4I)1(~ykEW>cK81a;2kge=hM>OeXx68a{g5O z>$GI=d`jZq(eO3&KW5?e&n)2mh*sEuMaEFg7aB z2i4`g{esAB_~lu)KfVVKVt%Fu^|_#)_WZ#5n}^|9#Q#RV0-h7K=QV$ZvtiTz1Mm!| zy*EwgJdSwS$Q$9&5Bckr)c+CTCle#hLHX~&gYUKe?DKbFziaGz6NBaVrLRR_?B$2B z`~2*m@Gd7Fzpw%MP&=MO;T@mYc>bsGJl5Y!gYn!7n~&JUJMgnkeR|Eno*3`W$i#l1 zhu!_nHrU+{9)_>!XU{{=z8n9%$*z}!;CGMP_-PiLS>^v8k*pUF!&A>o^6ouIf4v6p z8En_j&)}{f+5N)#_b`8t+3~E0>)9_91@(O!mfzP-f~Ei7gBRav$Gh`P%42;s>*X!* zyX=q6_`M3d@$X;Zi}qOiz5HJ6k9eXmD6av2`9}YIRr+fVyn^%73j+BsM4$NDl-Kra z^dIxv`1`A1cfYz3-obi1EJ*)H*nJ*+5Z-dP|9jceUnyVbyqxps=K}p(-~k=|`$i(4 z3J;?Hq`txrz@41u8!yB1`|#b7%Y1HzXR%)#9^`ibevJ0d4LG%t-{WC_n*~dLec*Y- zb9u0|zXmR5{gDYN{5^OY=bc>w`QPD}GVS<%X%_RJ^KxTv1K>l`?fF9O<{{SETx_{m$@{i#9d+hwY z_#xDNH(6c{4_aoQN52kl`M^F8yLC44H1^t#{KZ}; z!*3EVnEqG@Kh1f#)L-iRYk1p18?Sx{m#yLcN0KkUXAb_Pg8MRwKK~Iuj{nUG(jS7y z9n%l|S~u>DbrB{4M&Q!_c<9WS_6q!egEN`O|PQ_HOFC3*O?)@05AW zKl*=Bkl$$7J-?`hw>ak)Prz3ZUmE-Q@T@mu)WVfMb!F5x@u z{^vt@+Ji~n{zB~OoQLTz&bLPd^;rlHIxE?GJ|yyGa5wH3T^h(gKc9GPjP-w$VD~)c z3Ah{mUmoapegu2PA6^&mP4EiF^Spp7;azvx`S~DxoOsss-;YI~^R#2wi`3^8_+#SF zenI-AN3lQbF(cqB;i;T|iaI8vFe{ z+@AW1y-I(~SV(%}%iaOcfuCu%{^dB_2LEivbJXMEcqDE#bi?09_$&%-~7Jxcqo_%7qg`9{xx`@-&h znit{XTNAzYRqFRDoP9In7x??jo}mApwe7tQezw5+(_(lK@orI&|4!I_etHP*JJg;h z_gsQv@JZpn*>E=Td?tTOeT(1~JkK%pUjn=L<(`FiM65sfJ=~_)+UFto-g$|U?c^uz zx#UUWXU-G*1^M@fJ8Vphd@tY?a6R|CFjKGm1O)E=){Eeau%E_2J^*&_yXL`rxL&@6X-=Zy?w)_V`VB>Q*}*e}a$Cv-b0M(RZGAcKiYR5%%9-Ab*M1 zuY}$Ez1P9VQ&{g3{Q5iqui$)tEBaEuZ^5@MBVyf zg)8Rz{y_K{_}Lq+e|QTX$o^USTlUZU;5Xl}>&NJ4!_Q+H;YU8R_PiXv<_c?{2VwJ( z{!IKa^A&%a#^2K3o^XP5p6~+f#&aLSV<#p>vXXrLYkz`$Tx;8Z1Keh4Qe;Yy-)-={ z#Dl2;uYnV&|HT0xfwQ+-|9{VN{4ep3kuQc97u)lc58?KlADRB{v4Z|vV*T?x_$d8v z{Fz5NVs)76%L-gA_f=&y$|9zEe_@F&Jz3t@LZ``_?wm5K5D{oCP+ z9NWHgeu_V!e`>?AHQ2q6{~laC+OD6;D_K8jZ+VdZb~yVo zyIxI$XW-w51@hm(M_G&-1O5PBscn;?m z^8^01qo2aR9fZrUp96uscr||nACcF>$;HI$*sF}^eQ+E4CkvT3|KS1nM`@49{{hSQ z^L2z}Kaui0<6UU&V>FyQJIT90CHi;49oRpl2KnuR53xU)8F0TBum{GcXTT%j!R&W4 zU`byAn~${r9(bkWUmt~!InS?t>gY@R*2AxHKVd}RzYoGM&#?aL+!u*g*V*w+hbuV$ zF!ojoU&Q=3@x#OLo|NRs*T`Gy_e0oxq`Y6kqZ{n_{25+bX6N5W@H);j+o3D>Yum43 zy~JPQX1)GSg;$KS_eDm-Yn^!Y3AmGUp1lL^%6Ug=kp8^2%m@10^ydV4%b$`WzYOHt z;B@v&GJaD3ci`SSzVo$smZm|qXu^*s|_%VL~ITCvY+coqIC zE#PP2$IDpnn4cnl4|d;=NqUL=>5rU1|BG-o^Cv6dTVeNk&zv^8w%&(_l^FEo}2m1+J#(7s!#IN5rIKep&=)Zyf-fYKr6FeAuHumriJYg*L59)i) zf8);v*yn8*!@E9A^u|Z*^;+1ypEC+JADMp>;0o4fV;?_<-T35paKiO=ex3Jg)_?93 zbs??v?=|p>ANuoG$}534u-+9Q7rqB>Pycog^jE^W-mvYt4a0 ze`4=nya>DZZT}l~*Y6Ku_kEVWuj2nWzcb}cgm{#(SK;mW>$c=4{`xIR z@5G;umpL!1wa}+SKnUcop_`HTu$jzlV>mwd?(m&8#mk+Wo+f z;3uiifkaY@!Ah>dC=aE`zO2# zf8R5xU;E#L_k#^^*Pi};b}4@yyl1vuADiL9?^*wN$#3aj_DAD`{QAKih__}3d^21> zpYxfs{r21ryYCxLg%1*68GG9dn~%)*ci^4D{!aYc-{Co(lOwx>`POwS_QH5oqAUG< zHN1mhCkK}L-wZGQy}fVr0z9FezaEJEJ@^`DJ#M!x{61GlIN@uIM^IiCyysFI4^4ot z;k?Ay*JJSGw7)c{&vUSQA9(}((hdIoL#glCzoWnKKc>H?z~&?V;BLip;L!bD*uBsE zU+|o!#CW{;d-zGm9wD-nbyp-v;MKnJ>Y7==ndK zXT6dbk8d7=yUnual|O;q_ls`$1NA2!zck2iI=q(i3saxR;KvL7`vX$HeQ+Vqmt_1T z-u(zZ_z!#kq)RjYuGz*1)vz0nErZP`g+JE9V|l(XjK3xS8+TBibD!+1@N3W5`*}0q zgT#A{f&S~F@5E~#!!JAW>J@KM{@3mJ4T0VFm8ZeGIREY(ul3kVkj2-@`u?1$;L= zhw~ki{x7h5U*f`D*r#K!bKs}*?EStU!5uqQ7{alo^!Q z8$QZ?5YxU%a3}nYv5#HwNY2BJ{KmIQ7<^9>^Zxbl;7a1V!2Y}MVLlyo?kB_UeXF0s?TL>~d*6ol?6Tv3 z+n@12#HXge>)_+e|5(KDzi+{-I4?Hx58;ulZ>GK--(kId+m3f%ct7pAob+PfcfzZk z_jT?QeaJc8?vu z-LQL~^l$LmHFkX;^Dg6!zrHreuLe%I!G0e>BfNq0irInuIk=JaUdCR|n|=+q?_=A0 z6fS1HH}+EU9_NqfC!;U%%u?9BKd~9^cEsx6^cNI^kCagguXWukVjDc+PqsaO zgCDykDSm%>+&=1uKT9Pq8IK0I_yxPZ&xg%N%6kgF$no#n;i+SiA}s4(`kwpQKRV|( z&^_hHZefb$CMNj@^a zFNfz)pMgPn(}aoV%>11X?_x80MIiqk?4DQu3V!^Kq{zxZe!&6Oi|edExC!pmo9`D1 zH@Tb=X{0f{)Je(8o z`|xPz`R|2?@XxG=KSM6#Jp$f8ob%y8{|9jPcsqXofM;<7)9kl<2l@B@i23qm`~0B--qK*#;~&BwGv9j#`dtolABFvVDlGejOxS(@ zZ#aA}>zA?5@51hV-VLz(KETkA$td{9c#MPH_bH~qhi`oOm{myre(Mg}G1BIpF#5V#j~~9Ue@))-jMj^bhQ_e{$q^0lx%qVEr@x z{?Blm`jAKI}d}-w4kkUX}8tJ@3NqeagSV?)RS*A7g)jzq}wQ|5tE5 z^F!vpq<;%`_kV}rzO2`#eMe#Uec&%2XT6wZ?>pWGcjI}LvClGi7xUM=ANC2HFf%do zLQsC&PpR*#*8lZ~rxsg(TL|ypXUF$0VW&UdgWLa<^Si(v+kZxT@efxA`9A@_#QAHN zfM0~&`)nV;?*8Lk0=)#{do#Y-a0m8ZX1?DIe|*4>*DCm`JnR4V!d*-4eV;ERBt(k$ zC&tgur@=GI6C>XZ>eDFl3vK!(@RJYw_a$XK*20f)-rO(H-wn4Zx6d0oCMJZwAE*yp zmT%|VM0o6E8-LvcyZ4<}z~&=1z8XH>J1Ig4>e=`E@HXm~icIYN?4*Ry{_RTmW6o<# z|9%U0?}J~EoDgYZ{>c26_FMzMyvf?b5_mE5!=(Qe?C$q2Xp<27{*Eug&$8Z_^{NCu z$ot82gZe!UyZ-rqVDpjo?S$R?g&)E0_ceU}tb|B*p+CQ+zCGb>_t@umm2ju+oCn}P zq(44{-Sf0gXOn-r-B0v~-TMP$;BF7u^XMt?@t@i8p9eofJZ9pJ|A8N;d}DuyVE6sd z!EF;F*IZ`P-vQ4WV%MJ^!|wgv)$r_6J08D=-Seky@Ko*##Df0JJ15+K6X9&?e<^b5 zpSxi<9$yB#&m(>T-`2&>r@x5&d;a;Aq(A#yc&0y}gue*8@%}*Ao&R^hhaRx^BkzIT z`ymg*t8TUS`ZVm`7rXRx*bn!8HU;gQ1-tK)JO;bZPq)ESSuAA!N&Q;j8UM8F^(E~n ze})~;>)~~*-~M`bUSu?EK4O0*4vP)n1JA*pyYsi$(|ULX>t$-dSGA`-pV<3#!{CwB z-{>!cpJ%*HJoFFPeZOG@Kj`G1Cr*M7^89#Rkbex`&-v6>0{$O(7W32C+t4r2U)=XH z^_c~mkF=)=cHggD13%{2<5t+czdt60`u)Jhe?NlV{(BYP!gl{>wtfI(C!a1 z;YTZg*!5`!Y(D4l$9?cT=3^>< zOa4#5BhO<#qbB)nhu5)Rl(Ccj;y>UySK9A0>2*HelE?E~p%$H3+z{XZGrf2aMvml=+{1M>Uev79%3 zo4=(!e}mhjKR@6rJ0(PpvY$8O{X=*K&#TP(xdE2n&67_Gy|M{*pU?gkevQNB)ySp( zZCU8Iu>M>COL+s~L7Wei27IRk0>MY>KO1(}`)A;fo9+9M7hOpEiSJGPF#vYIZ{`-* z{l10<*nJ-IF}!QA{r;nz&WtDfIb%Ns@Vy7^`+!xj`AGe~4!i5q_u*@vON#79ChdI% zE_34l-@r3IwdW;mFG`4P=xWacu7>Av-=K)}(m!>uYYz{?gNQH9{Qf*&G~n*<2EoO< z?0We)oLs^APqJU1AH#2cJ1KG`sNV+I{eG!SE}_0R+4XZY?0!GV@8FjQ+Wu}wpuhhu zYajFBbZ0+yao2>%)9k0r{EES47xO%m`78bN6zqQA*stJcsO*}cejkaP`Ya0iBZC(; z-22Fz;HST6=i?vY{lB&MgQAzQey_3o8tmTp8;is9;?U?VP z-vAG0e<h84f>-K*C zaCkrudw+Wz?0z4_6YxvyZ%z6?!|i!K+bbyVpKv<+qqKng_DG0KYtQ&GZKOY|;o|+a zJ^uqgPCO<3A@UDk^O5=WF+7Opf#2nCY0u}bz&~@pzcJt&VDl0E0(i$N8&A~0t2Wy8 zkoBdO#i<^2+VlIJxGVX5Cg;I$W7d+X2>|KP;8OW{X4 zS$lW`cHb9y8+Pxnb-arBit`Wgpt7G&gWdN_AA+A{y)oncBe)Fv=^4~-9c(_bK5c;A z`(J;Ak8-|h#-s3R{FUR6ieU4R{;P-G_cxz`$KGJ?cRvri_cK2CCG7n(>klTw^I89{ zA}?A07Q*uTnNm05AHzNHcg9|}!0!E~tXl%w}xIze_$_WJ)a8i zpJ2`4EOko|=GbVfQ}v0@(E@%i*=T_Ib+N zu=_seKVkQNLSWsq>Hm7zUBA}BBlG_2wF4LmOu ze<|_rKG?l~oHT&=ko!5Q$fZ49VfTI4{_ub&{O@ZN`A^|lmnBEmqc8P&3oagF&pXe* z4u47e#hyfdEj)qqtHVM5<#3xn*m&z5_~;wf-s-NWzn%DD7u;*S{eIAca0T}TjQzD| zBXJw&m$QTT=*zJCKHZ)0ZtjbuQNFbQ9=MqIQ*(m)d>0-;|H%3#>&a4h^jzOROZ|TV zuVVd74fH>O-TUL`4WfTo&rN*a9iCTU*Xx^MH(t3NcJC9_!MpNpeDDlBgXg=ZykElZ zd2E}nu%7XJTH51{7u-PmI>J)_{_tql3p4(sVE6g+6gc4}-cJbjgInP?>{reD*!BkU zt1|C*pBw1{Z*#_f8tlG*b_|~2oS)y4Mg2I>sKkt=|0cuk`+WDnhlbht{4;no&r?V=s9`IkrUyXy0vtODYyT;#+*%VGEXOE$uL$j|tjvxef|CffI-E`r_r#W%t3 zdR7lt^t0d3unczJKivnv`E47I9Fz19C3^iO_3JPUe@OjOsIS;}claphKdC|ezYpK` z8@ryh&89r=7nCCx`{@Gjdc}^%Bk(-RGySm`cJG(}6n4Mg{rZs-DWuZ1NL(= zK2pCcV0XVd7Ovrae^cLwVe^so=v(l|TdY6qaU=eW`PdNH(;(PwPJ_{}ucF-`n6_l{{~w8KS=%evI|b*kj^NVf#NDF5buYjR*P9h28f(m%vvo z^2bm5d!@+N+WzQtGv@~{+jxGK@OS+Eo#-!yN3KtdycO)9R>I~ZX7b`7h(M z7QTx8zyqefc`)~5#s_>0obLGVhhg{ol3s(|?*r;On*L_~nRswCyb1qi)}IP^-i!A8 z0KW}Cd#ycRXo9Cz+xJyIfZg}86UGofvp%E-^}7(B_l&*YGX-|vkA4Jp{lU}l0B67b z8`zy6e}&!e?`e~dy>R}vp7O+=y1=3PJh1yb<9nhXe8j$1!0!8|o8f0T-!t=TNCEzp z`DOe|DQrHH{!ZAv-|;5wzK`<}ya9VK=LbE z=Y3-R=VEvd`>kbx{!ie=?DvfSe*u2-xV4{u!c*BF#N(lHjK6bUb{*{A$DawO)S3PE zxsmzsYs4!J!Fv50*nL0XqFWOp+nxL1z2Uyh7kSKG%BsJjM;Kz#- z2^TtzO&RdN?=?A;*p8$_0{xZ)S9)e$Pw&z_h!XLkG`LYSDX9H~ijerkvIB5ER z99(>tE&n0WcjAGzU&VhB@5F-oFM_wsu<`DCxEt~LQif65cYPFpk!|g#4$g7np$Fjh z^rx9$9g5ihaeps0$p6c*dmkq%@)r|5`;z=$gtK$)ec%t^dsFQApHqy#Yh&N9?*p&; zv%TM14j<$EL~KpYOTGpl{WA$(LI0(qFY#%#j;cxI3&ZkWK{sFt^9qDDPubf{R`4ezA`g0U{Nqv70yWh9{ z9_)TULuAO<+!4dFM~#b4tE-EQ8$2d=@Th`lU97k^R$mk6>HXt>R+h#8ERIB@H5Db% zDF4mN9m;>Z7e`8JV|B6mNt3QE;a{_JqQl1w9+@2-l6_RX3K!Zkae`L`7X}dUi$?g`%2~9+i%Z(IZkqMR8@t-B5K^ zw79A?T3S{YtF15bIIW_>&$?f9+>qRY{7Cf15w{E(Jc9J~6QjA&czt5kca~LE++9}d z)vl(pesV=sP|+L5QIY(zSoU<9KD@rFBzr*J-9eqm{ItRmnN=eP7v|^Qo~=uEikMPI z&F`wMhy|rbZy%L$6aO|MJ+q>2Xf^#^T{*P8xVE?ijci8S$a`m$AT6$_I#Da{W=Ai* zcYQ@wte`qSR$EauIeW^OJP`)Dr1zO#Tv=ZhmsVtFGKe%&jObKKQ%}&h!hTO=ZPX|Lr1AlFKOy z4jYahGmpKFv{qwAF~j@!!IhQOCB;lT+LPX|v}{swePt~Ek9JVgPf)kRFychv$@4N6 zax#6Dzb&~>nm3=l0g6{F*Gw=>&sM}A#q{){)l;W3M7dRys?*cz%3=X$V}2(aG(XwU z^lS`afLBhzjGD6S)2fcSIX^9WYK>v(C)mf$-t6(qs*GWFCuZQPluc_@Wk7M=&|vat zV{~)MEUr5Pt-i%|xhJt|H=};Vbz@u8p|D}q^%E=0PTPKR8d6Y6%SM(>oye>>QP<5ZJ!5iN%-0;n z>Qxu+ijz1M>qI=Cf_E#`>q75}s_YW^*tr}3C+FYN`@3Fg!DRik;*A#&|`irxll$I`cZeca+(i-Y@v4yvpK|GVuYSS$vXqISr|= zx(nBSO>ym1iCxBe#Ih}Qi4qUdVZ9@DWtEd^%POPQlP2L;`lRy@#kD2n(d^s;bTHEh zYSA*{3(6)SVUY2yWzj0u(h~Wjwrp};#4jmYQ(jzG);l_>y0)aOH2jb8@(DC<91|zj zd!gv$s`{wOq?U}QPOYwr)YM*6S6@?8T^pnRRb>q^qcU+ujQAvIkeA`L3_)G2rnb7~ z+B8$}*r7v+lB%bYT~&xKI&H1suB{5uTZb^1}8qr>?ntFvJD$DBRAF}g{(aWeQuBgquIlnHyPc%Dw#Kg4h?CieLQ4Dr=_Vm00 zF~|H^zeyF9mC>r)ygc7D1LGTzEwz#5C3}h_pH9=$qGN6@@T|CC+$ciEXh}mu@x+Sh z>Am^8t|D4eSzK2am0ln^B%$dTBF2(CX@=t)vgxnVvT5~YxmdMSwl_7*?prpsCN{(C z7h0JX9V$a85oN1=;O3nDH+iddnG@chSD)KGtHZ<3~Od|M0JTY zCo_s&Q5(FjG|XuX%c{&?|DVz`!ppcUlOpsQG)$TtW$bis1U*1b)XG=Stg4?{Lo^t} zr20k+DoXv1Q3XqsP2T;cvk_pt7;Cbs%g)BUSblw%<9o&Q{$9m$31uZ18iEb>uc*tO zR$pA{FT;LL6osXoXk~7>P7jMs2Udrbgv^f4mr?cYE+aa!xFK7c^5Cd3ND8NiG8yuk z8O)E8JMSv4Esa*!#H1#DnG4c!5~xevbN$MkXsS}a*m{27Xf{Jw5Y6u&&F@DQd-uog ztLjRMD~oHRHL==wR=BjuL4V5zNM>fRa?-1PWt%iHR|0eXVBb@gJrU)C>1oj_X0wdx z08%h_k&4Cfzr@73B?!_>*f^LeS|UADlAS#)%`u+z-g(8b^1-!}>&1&RV7{ktr(}4} zoMa+;mHa;$u)cJ4T^Rw%kZ7jq_w4+kfpHpp%ey(S`cPXuJCJec7ad!|fad1;qtahS zBvS@Oy4;yTCRp)DVnB2_OIwU#V({Z`mCW+$il>)(ZiRVihKo7lPq5-vy+q#hy!==n znSN*BGjSN6A>}fQyax4;;!D$`^no#I<4lL9=jIRRUzu^mtdi6aS0T#*>t$qW+0>G$ zvhN<{Mkf+FdH*I>cJcu{gF4#z)jv9RVs(90Y4#ZG-E^bm`){uqHgCU~VxSlU&FBAU zY5%Cdt`!HfF>KBRCB^=}tITicsoVLV9+kl37L5Csr>Eaa#$@1~LED>hn{F`2k4zBil%y@(N>SO0UOA!@d+I#D5yoG89!oPdN)w{B+YI3aH z4~5)#Zdh@wcuZNPELwh%rj`9Nbl`O&q2U3W)!{Kw?K}xn22>! zRYC~UJ*_y)%#z}o;*yGZ08~jNcfvYCwz2d+cG2;c8(a=UE6YdmL}FvFhw27IIl8K= ztC(DsJ!OhNRqGgXX0BH+%t1F(B2+i9{9pE^@s9nybHVBvxQ}5ciEV=EDwCA}K7OoN zR!Wr4(!tu@J37vbZX|54i^Z328|>s^csOZ)#qTS&HpY)rPnBt~t}2%mgrekh@~nCX z_46xc0%qTo#mckur~%=l1RZ^&V`Rcf)EVoI?VmdG@MrwLaDpe3CGfeYb2$02{t~+0 zSrH5N6cVnao33QDdvd=mwU!=`P_(xU7xhn917o%f`E^s`Q{LGij4ALEs!c+Ae>My! z*&+DtPa9rb7xNDjZFT!aZ>f(}#EheIH(9+2UF(94Rln$%Vh+nxOkI(8GYuFc<6<&6 z^Tl6!Kw{{??a~8&1gb1B#1cNQH|QA&5mSF_ejOp|q|PNH%?GBCp!7&cp`hfmX-e<=z|mvec? zMU)1ss*HzOdt0xqUs*5yb63ezb@;zjL-s)@Szrb@`=E*Jq04xh5*W>yhO55C#+P)n z=J*z>9bGWT`%q3`Pi`>o*x9Mg?0>m9=#gTI>g6c3IdqE)oqih=GUI!i9nqPNyl19_ z(cT;u(-DJUqiX|yyCa$?&V@OC6Ctte4M(}A7Pk!RO9F4Nc7A42KFvIEJK*04Y@Gdp z?7ldGAy9*79xNOu+nJwo6%Ce8FXUtSXl?I(k`=H|Z|@ma zaMU??5*vRnroN>rpR-)=NY#C)<#qfiJz{(qu#r<7klD>nd}!l~MqR&Rj`Cz{g%6t| zyEgZ9j>DGVEbWB#wUu}e%k`E9@2E34y3A*T8@+Yp$iiWPEuD1!#{FhSHjj1VM~3Mc zCO|O@w4eIKa}xg~fl!5j#XHmcmx7fbKW}m4L^^YLS#hkMV_nSSN?7L63|ZlON?wSh~ZvlM|1zycu|!c~2ev6*O+!60OCJ zL1Hv#ePB!^W(dx$;^q)+;!bH~tveU90I?8yYm4m0PJOmO@Mbpja^CE1B>HnC7_F)2 zL{I|TYX7upV*Ml=5})McNzQ!p>SG*1^^q-tcj_SRt#iVn;CR_TaZ$T~e`)r3HX%Kj zDRq`}>)?52*(uNLh?=8QNa7iMe6JLbE1hljsQhYkfOh&5@&Bc-^fxZ{;MT;KC!LED z&7>2};6dzCbVjQ$@q{_lEg0v`WUmWa-z5-89eJS(VKZz;Me6ucP8d69-M0}RdqZ}jaISiI`Pz4)^KL_6x@v2pm>ez z=kGhb8J=I!ug-g}WrsiR0%R}Rua;*%JV7chDdAB|eB#M5@~LVk7Saa`VbWU*IaRm0 z-R-!mGd*VSN5`?XYbBPlM-qN_mRp$pTcA~sW#ybb0f6EVNJ4K@Se=Dc*dQt|G@AxO*lnSCoZNEF`r@`l`z_0 zCOAnR9yF=dl3O2bXN!5}vAefFH?cc62ISyAe?}b-KS$P0_BQ|jcOf}PMAg+?vWl>d zm(=kqo3eWlx5Z;mxm#9N>pmzZ=A2qlH?=rcQhqukJL3_GMDfx zUp9Mo`9E*e+#pz;g~cOcI`7|(S%wqnNX){4XZ%@@JWQX$$L}h$%C;6~$2Y}ic(OmB zrn*M%3CLX`ucT^bT)wv|cq3w$hBM62J-M;I*M>MY5RmO7M)1FU+;4X?W@+b6LRtKI zj6B8(y6{BD9A5B^J7&U8VHrEoI{lIOKU&R#XOLrp2ZmBU*Gc`eVDn5ex0TVKS|N+q zX%3NbUaZX04u5|UdXnjH?)?MvnEOOtI>c{#W^_0=D7cEt177}>Gf8(tH>RwP$Gg$$ z+US@vv)`7PQ&3%5eOFnn#0HG^P`Nb0Bm8(Rf*2>08$jMg3~%r0K3(vi6&Dbaq^pM} zx8FDp3;H*wUGIw0APi!2QZuQ+f8I?g1Iijo%4+0l@99VU3>GcUw_d%Y8M@jX!c4i$As3s2 zRh;c}aOEaSkT==vSWXcf$)+E}kyZH&jyUq`YDRct==I+JeN7uzX?+=wuS;jNOLi^DU#^|)N<4l}&js9akQ zp3{k{H+S5tSMkZ0p6Q)6u?*M6%ypUnXJ-uZ9Q5Cuyk=$wmsY5<*UtEDm1<|p0- zQ-lv^zWo?eF}XZ;Lj3F=<$6bta=^`Y+GxPFP3&?-kUUYopUqQafi$Z<(f8z1d z03Pvj@09gl`cq!Wh+B#}R>J)=IYtp&r}rOLUsG8@6Y-dN)%-O>{3_mBJDFg;J^7|q z_5+@y;RwQaG(>Bsev~L3>EEh5`6{j-<8(isqcLP4kuqXA0^j6fs3`#MPf$vU1+a@-GX!2?h#?md%#= z3tJVWNRHi#bol-R zCerGr(#<)(Se)!^_=N4O_9JpLE_f0Y-_<%R5o0LL33@cRGsp$Dlid`|?ps^RneM5A zl2*c9$6H8g{>9*6C2*U|Kl$sp*lZpbB5_r6zI7&dE#ykW>7MC~;UqsetZ=Q8D{p?0 zvc$!=bW%&Nr%rK~A-zAB(aVbKf=mB$m7h!1;UL?4YBFwkUOX?~FH@iwneY;syZDRN zNzA8TFwalA$-v0i{+cn2Z_wlxg+$>0$!jydt#FHFfUHVh?*6ry;M$2-71@_@wTfOQ z3S|ewMF(!Yv@$MU!>i5tX8dx4zN(rbakdv)j|n{3X%^^zFW#>ScGlj&pRn|qNq*|E z;NL8@Ch$=9ZoO}MC)B`Sb-ja`6R&Res|el^ikn-IKD~EIeJwA##Jup)55D9QVqgEd z7RNmJVy5=VW<3MS{b1iT@woA~z`O&8_~m@xuItsIx= zKtWH(f5}!%{?47X;L7v=Q9%Q|3oG)DLw25juhuIsKUNvb4enN}AXCDM?1{LdV0{Zt z<~(oluiQ2a-#ZPNDVGXQVWwQdzL7h6C4TSwt4sX8mbqSN!pXRg=PZHyS;2~CCtqtL z=dM?$U7q86#?V=&8B6#Lb@*6nC<# z{Qd^`B!?fx`9UCc;zDC8=r3`n3TfjrBK|=6BulO`d#^Sba#1S1H^-pzM{X5w%Xmg3 z?$2xhh=_SDGIVU~J?`qq=9z~Frw(a(F^Fj}ic`FdnPmeG;YTl?1!b zGfOrA_gPb0=6g`y3?UaOmDc>5XFk}>q^a1VJQ)d_(D13TNtMNuy<0gLV;{Lq?LEwu zH>-#!PVwdrXW@QSN$>RapU#;#JWeuZ3@k$t+!N*;Tgv!<_tF;LBfXDvDjb{$n`ay9 zRI{J&e1c5~ofY?1XX;ktZqRe1a>W}PV=_r7B0*04u8V#i##!+c)0?OCO7Yy|&uve5 zkJC=%|F5_&+iv4Xw)H0w97OWbmMLFZmYbL0vHL#N0zrs^MFKb&D5<~x?wB$ovnp!< zLG@Wa?QT&7sxo8Tu_MB=6`a0wQziDMMQ~3cax2ISypBp<=x{vewxwquo2P0OJbhWI zN@4}8O>P46LcL(3X|LdRjE?zBpkr=4fv6ZSQ^z*CEw?i(RDaO8THR+bnzC(x>Ulp-s?818fx> z)UF&;!#+9|7&9e`=g$kYzd!Dt(2!$2)TIb+knZI1+Df?gw_}PtVrxy0eom5O_m*M} zRcty7xrfHKE#9qnBf>bvs9PR5Rcy_7#S@jz_|VUrUxU$w_&^J2P~iU|kZ5*b_2{|u zKK|xhdeK+wCXHB+<>?)oBUU$!U07 zc?W~3+oH@D9+t+PWc`7U{>pqNLeLr5c4#1Zr%zcd>;oAX(K;S2&sL94C{-YjiAyMx z7Z7^6(5(xgIRS_xxvxhy-S`={2+YcsR&O#XS@)E5L>I&t!6-d8Sz!soxPkpf+SyuM z$ZIPnBqdMRQ&JpXOose~e6;)Nk`AHQ=SdpGh}&t#zJQUdPL#cw<-Zj1>6v-^+B``zPA9yks-`2!4v-Q;05Ud^WS zPxC1?$U^q0F80gMzhYQPa808Vh9j+z&AFV0HuUzdQwT2E_VGr(pS?d@Bm(E->@vL< z2o9IjSg3~1et_-}V-hGw7~|n=A7)^p=NShq0+1#1?ntg^WR0hX zjfnCgEkZQRg-M4bPn2(AUJPpY=;KUCIFW^;@m}-nCw$2HL$!IF%~t#yq%eE7R$8<` z*0LLClfyy6P2;2FRjd#)eZCWmURH)~^JPx}$BzWMYi>lY9WbtfW^enqh@KKTJ0#yf z&@+@M=BYct&3djC`s9~r`gsJm-UwHCRXs#A&cl0kbD^FIlF^#dIL1>=JcS9BjOtPp$`Vpfe z8r_9~mjHW{-}tHe{TX~hso1}zp6VGJRKepfZ`a>{Ma>k`YDlUUUq#j2TiPJJpFl(0 z@sJWax4ze5&;yKfos9{@MHMk)%>3(9GVZAwi3XvD34?{(xPU7>r_Hz-rkKt8_N zhS;x}=mN5xz;Z|v(!T+tEdA|xLY>v3-&eD!J~$?EzMBwdX|p~3`gvl-42Suk9t-dB z4+HrL19UP69WiB3<|WtB@pf6sz#tf0oSsoyjPF6=*N4p=-{g<8Q{a6I_vNk}`{5jg z#Qy?YE*xEJ0qft{MxsR_La46>=ZeybNK9*VcS?h%#Ps6nL-F7ewrYWyyUVXExyRL% z$F@R4>bXZMUF3{9GY))H8%ZmKK&SxX8xP7Y;Ig5Hd_+*P_6sPoFe5`bsa&Hr-C`v* zr6EJ5V^7=&6uN@k5u9v4FLxU>QEjTtOotr6^wFPVamq+$AC|`YOjXY#HHOAY^jdbG; z-S>vrC*fRjF?s_Xg@c_VFRNBGMpM+d!N15fWZ2Zm2A9XN=%X=Opi82Qv3n^S-NK#s zg^@63V6&KackE##_l`L4!c9-oL3Q@t#Wb9Qy$RXrPL`LXqXG=|`UT85g(u)&;Fvz0 zn%E0!@QJqn)$X=&hMovt z9s!(EVj^Wcb@H9nk%Hh2Z^q*~e4s6slRSCy){`|MBS_DNH9{U*x@HTw2w4Ec#4vLq zuZ0{Agy$n#=fby`P3ZJ8eIYqcb7*n=srhuh%%&iKtT<2yKn^$}n0g&tRgV_hzJnk? zdR+(m;nQR+npb_g1yOG|Gih|hL9`Ih>ZYzKM5-78H$MjYLnM&_)^NBM3R1=9ACpXk69+&%%lb`V{Uel_e%+a+ag! zD(GvYEZr^Tg{$rB%10xf`CQrD4lT_8*9w6dp{9oflR{FU9q4F9eE86p6LvUR8!JF93!JbBH4(cPvGNw=b5I^o50#%anSM>TkV#fLG8(@BHilJwL zWmFvlnF!S~nxqqE$#zF}l53l`_B)hlOzLoSjtun7SnE-W*;lxIHc08b@)%f@61Z;R z2;a~Pq`jbUl82DwuNaZe@y81PK*-)%CG&+IM?7NS^6m?cOZYB;N?Z7@fkd4JLf%Y1 zB+!J+kF@@duB8y2=_g!ozHI=yg5$wVIt+~r@-3cBft=D&6ag6AiXlq-bL)tl(;ib|MXc-lS6=0l~Qfkgvr`bO4`7e#S(Z7OD6s~dkeMB);DHf-=|Up=JO3pPr@ zrgT_i8FCVvC6ef)zc_JI%>zfvSx+zhS>C;_SN8lG?K>R9TKkTiql8Qn5;0I;&Nv6b zP+~2RCTTMwgt0S74RPMyl+z)~9nE$>V{nNP=Ck!D^fiWx*y|u$t|fsgM&aPX`E&T7 zRk-Jh{NW&SEg*2TI zL3kT{pPzi#!Q1CAQQm&j%N#=lm@SuJQa{;3IW%$VIgOEcaKv9HwugkF!T9_Tn+kQ* z>m7(H#Av9^@^@dX>1w~4u`sA&9@(!j(2YFH5GWl*$#6qQy>p2AUv54xzdlVC-=$%Q z{AlboZK@vH`V#bd4Cpc?OeWNTx+q-zO-xC9+{MLo{IvQo!-(@N9!My7w{Hg{Sm<|A zl&ayh8l5y5GX<`%RmYn6L{a)Vw881ku;)bnv`OWUaP9v3B)l2f}V~w}7|1F1t zRKdKHX=LC;qCSgL=hNMoSw^%zR97UvY$=Ptj6#O!d+_PK@nT(OHFg_JMG!biq@z5* z77uE22d7pgtbveWCKb{Kt7`A?N>No@;KlJlf2%Cdf5_4D>fR++NjZ?Fc(}|CXLqul z3ybD;6%-EyxeiG~1Z_ic>m2iyXKR#*v^o@eYb_#Z7W?q~og&Ty4mzZxTl<}B+=B;~ zj(u%%TlTil@nn@ncu$<9(YnGY*TC?@85xSvfrd9v>@%;G7UR|7#+^6hesP)X>+o+J z>g_np_bunn7g*P#S;V`gj5~)^#F~a(j*v%64w(Eu`MbbewsMh9xz!E|9AIr)cr*86 z?^)sHBv+n2D_0VH4Ubh4 zWA|W#k-uWI2h!0S6bWM`Gw$^Z>FAGwmur`ggUXyt#F^DQ`T`%0SWnd^VTAxlOiaC3 z`{WBU6wP^i1~H=}o&hbxP@!+!>6_e{kW~NN@kU<$aQS*yoDR~^6qpqRleC}8k|aM8 z;t`JLnIL>7Hm#dX!g#J#-<~!;@I{zRwv%PJJpM{8Z9^E@@wBT)oiLLuIq**ni;n3? zwZj`3txAG#SH=fzOC)f*VoKh zz|V@VBv7|-3PU!@_Be8q%cMF*Ly~FANMpmv#XPJF$7N%%OXJipoFwM|+~8reX^GPn1yUC; z#f~@Z;<^eRI^s`7Dn~&e`er3EHqU02$4pZ`Hq%;?D@qfiydpLpj%Z3ShnJQwY4F0C zb+BR1`}$-!b@mhz<2CgdS}R)}<|{o)Q&!Mk0U9LywQX()`YDhlr=7a-C?lPK?4T#; zfrJ=Bo1M|`Y|J_GweBPGGvno1^{)-4vx}}$yE*vq^e=*uVsEX42EOC>falu#tvH1L zy&8X@f7mZ@RN&*r7%P^%)(e&MP4&mqa${Xv`7k6-m2@q2-M7B%;KPeVUASzg z;6})9)9r_V6rxj`=$%3|_A72OZ(EIwUR12B%b+beqtDu0x#5%@Y?4EZPa{hcyD#aX zad@w!ydmDQZYwz-bdko9{`@)iCtt@{^r zC~nu_ct*Ks;$0mtmTR;^(Hi-GxkVFk%yR2s70U%9Fs2&8xwDPLI)25yL*a_AWZe~t zhUkN!&XICa5+{PcP})shP+&r{gGRdjm$I^2m@DK%ZH8$*IDwfz81G|`*u>AB86AN+ zX~ZKMg7`-N$Mqv5hBp?piVfUuEn48A+3rvCMgV7u%2B7YP=Xl7aJX=%;d2TuW?m*L1&+^~I z))c)tMzc7_%&%u4b1XTnqm>V5P|lXzOuf$B>XJDG6h92z3hQM^(O8R{F)?gz!kIVY zVKm)^CbW#fE}F028zLqS()>C535id_@Oiq%Bg8Nm#DKvjt0I0$pF{~O=?EwWXnI}U zt-p{u$#rcs#e|d&s7#^+ETj}l zT?#G%%V~-UswHa+oJwCEj1|GSmc`b)&kER4^MT@%?8GU=B`FVIlaya`YeS(Ij?c?j zgiQI2!|JHG$mDe%EwNFNeA0qBpRMk8PqG()c8|EVo+`}sG8*4)i@b!2y_*0q+~3f_ zaWW*LWW=4ljm-PTb&76%T8dCP;q+nji2CjuCpeTG@S#%>JQyrL)}elo9M%gnNg}H? z+j!pJMU(Z*HXh28)@|^Mqz1I8f%A6+|Cm!?U~JlhFHfQw*dEsTy;^4?ORFa=4=-{N zmCYrpho;;?OPCM>!)l8JdVz$1J{pu5xYAngO)>^E8=70Vp^U+Fd*dHQJ z2UQhpZcnnh1FozdjUeeK%ZPUmoo>m!I`OtI3uUr2;T!pOk_gw94#tb4)BnDKqHHT# zsfy>FOVD}Y&0&)*gozCQ;6ud-N$yCy>B8OEl!UgJ{m=nVfW{2{ zB#(_n8xo&@X0iRu-kSWlHP;ZogVuHTHyfMt^=w6`(bYeo&q-Kl@qb&a>omf-yL!0W zUPR{r$cpIqkJry*RucYj8HUACU$0?UVsDa|0p4B^827YT_CDKwoDpq}cFJwEmiGH* zxoApFFLqda6p~YRIl7f?-`PeTmjeN$8?|D~%Z++H03aureNCRo<$=Z^;U0i)>Z9N- z(;Y#P%`|{T5`HNZ#;ryrk+!ZYsS}{n!p(lf=TB@F$$U6r1Ns!LsXUAa!NgoM#uM7u z+H=+kMoK+);cRQf1>Dm~~LrxV)A7Wb#%x zZ;b@I2UFM`qjg?Z`EqHh909Hvi)8?Q|lTDRzsFxy)iMIC>`G*!S7KT zZ*CXN8Nb7`N=t0;z7hZEqFr5J_LwwX3tnif+Mq~F%8G%^t!abMW=3ixlzWz07%4(i z4F)f#+X|^#FG^wZGXYUBR&r~#j-a9(Cp&q9+?DRL_%Z!3u;7$&6uHgJz^^ddGK@8Z zXSQp?`Ry5?5D?P{>3kTZpgOI94!gy8ga9a!y41AVf(_X7eME5v3;alDG-|6Gkj*j`02wEY!y;JT+M|nL!&8^v~Z2L zq7`{Ia2Rgs8X`j!A)8yM)hhZ#0%>@3>r|o+v6C z-DU%dKmki3#5cxQ@O4+zZU7cpTqxMnaJ|`J z@EImXl3Zaf6w0<>{eHt}mFE#?AJy~I9Nb?Fzh|fin9rxB1`Q?2e&Lbij*U=9-Gob` z{P!Frf4OA!Re#-#tLr62=J>hgi3Ma!vW>_{Aw_37Y|2J^k4oTyNGI#vVmp7DRk+5b zUgVxpN8&yuKW7z>*+T=#X)f~`r`e}k8&1~U3a&sEEz6P~Kro_1q&(kKvT5#A3gK z&&^ki3J4{R4KcmrVd|Tl@n#tcXq2ZAaII5nm0y;IKk zB)LZi>!O&KYIf}ge68(!?H_cR@Q+I?P|C{F3UAW6Z~^q39$2iU@&ST)H3VvSdX#&# z{kIuxQg5Clsm!t=pezDVE~o2)Z7x@oU9e+vmA2#ypzvxb@GA96cZl&AAd7%eTQ*74 zI%Cu$i3ki5f@eLljV)SMy=?P0)~ZbAs3cS=r>k1)-lK|JwK?o#*~%8Q(IbuHu_)+@ zW`qCHbwcEs!%iQO&H-nSkH<9^MxwLgG;cu2))95lk*!S}U4ytvDPqKnY!#{K^WmC% zT`eZD0#OQME^fy%xf^GLlR~VEoMrjFtGwLpO9HEGL#1sLNwEThA_;O*<=(7VA@DiA z9tsZp5o3y;%>YQ?JUM|$d;kY8ZiT{?xe&$le|4B*P;BNl2>;xfb_%I4#bvhn` z?{D+1eDguPG7*iwg3zAkAkf`o&qA>0CY^>#4#M5VO3P4WNi7p!VIS>Ye{_U>yw+eq zvPXGdOOrtWR8KIs+=7Un#;3YQg*7;q(vcoo@Jj1udpP>MQ; zaQ%Vl4x8^A1P#KZkFMZad<_$)q0*2wYaB@jeHG9XIuj~z<1uhH?OJ*0SI-q!D0Qqw z%v}I4`^$_*hLHsUg(3QHybR$cwQ*uJJdxjl3KPPaW_=IiB&4^ru`*$(Bo4$*xBG>Y z^bTf%BDW+dZj3Y}Ar?Lp-b!K6G`*sWA(Y@OP6li%G<83!y%fNO9)2a{ge&bTXgbH- z=j5b^9w<_sT!EY8_?P8CjRY$Rt~{8@4!rX9PQw`Qp*ZOhvVgW{OR!Gr1 zgaW;fyqL9GAPi{AuR*|rb)@chG0!6J^QDrZIo}Bwnu8*vq(?FGJfz>EL?U)yPCfVlsdDTu%^^3ER}dqcAY}T0Giqpc5^F z>3N;11T7ZMDAJ-QYWznRlY4>de_q_*pe_o|jYI@)V=DdEOJ1aE#8-H6nb81;2Y??@ zAT6gyKuG6~7_hX;vC(6bH&$Mj4F`|W2)+P6MiIbV7k(u04$z0`Ga9phlCcc$c8lp2 z_bX2jE?(n?maK8mh3DC|d#Z|yBgwch;%j>sMbGA4FJqfOuh$ba=eqOeSD*$QqBqe0 z@b*8D*&cZbjP`5VdLp$e%w+}>0WHQ*x3)G6f_r9LsuQ%Ijv83&gVtI_Oq^T zSBu-C|F0R(#$bC?8}=Rio4$unxa1bhoStz7HydpeQX6D4md{+BV27+B9DA2Zklmpp zgrFR>KWryxnvk(UVp;nIcIMVn8G_=547%ihMfx+KtN$2ge5~u)s}tuS2)-xypjj0T zZBGV6i8ncuGcTRhAf?J(7xq3FveoEc{I=zCocU_n1J9bLz$yI2qE(8|FV-^*;M>fk zN+#vQ>p0;nwHhX@hrd5Enzw(2iUmLht0-jvOIl7k9PKrU2MogVTTF^Z6Y>9iemQ&YjBYuXN3cJ2;Ft&?Qt!{)9YGtD=s%41oj zVo3ES3(VFDk!H5;yVJi4HAYIvX@o;%eA{bh07hv4Xy9^Cv`&#QTtiAO&CDU*Q@JVO zN@;3H`sL;n;7jx(A>YNwyd$>@WP)vfXVipVVD7MF&75RFJL;gsyQl4^$H@b@+}0&+ zphUPK!@BW8wV!!Rj}kynzbKDw3b16s{Xk6VGLi35I)x);&yMeJ%5yDciIw+~0Y9|$ zJfpFrYl{GCXJZ{dWpmy`V}17f@jD1UH9MV#X%tEHX&_ST(h{i+dbncoE`2)oA~jVM zp1$T*E{3_pG7NDkYDtoj>U%nWs6xZ^bh*4f`dSX)^20G9xoVTI?oF264mp3y+xn9L`)rtnRa7G%LKg zQ|vBU5D(E_VWvAlNBH;q%j)ADgn5fSRIKv#WsG{03~(aTyeHD?adit%XM@fP#=0-9 zKzceTXn-iu{81j@B4gBbpcZ}zXH3vUfV`S76>ghgFj`Y?Fjyy|caX=w@{>1p zByNb{8Jn^+_)W%Jm5s$9+nc8vamjtIX$Fj5Pqm_0ijSjrs8bAzaSyJJ;3aF)n#|Fl z`fWN}MVzo04~19*YOWi~U=`%XYVLv$7++@9VRO74K~no^i%d>C zwDQ7t3k`U6rY!sdCLv5GJCtI;TT=xWx&RWSeB@S^dQ-+lJichS2hL*j`ITvYFdsoU z*?H-72By~F4_bO2XjldwY$(>t%I-@JqYW{6WsV z9-o*OdV{ud8plo9L3&c4B_UDA;0=z4K%++vur zE%`88t1sO-=`f<5#0+v7ngrBG*NZhys?9O2E`_Xze$vzG8`w}23k)4Qgx1!NWqmM z91IpNEIyZjA0XO|0&lPV3ww42|o8qX z+k^vj@GF2(5f9{5ty;;w6!j7MUmqA8LV&X=S{bYg@5Z>5M6BEP3`={=>_Ibo)ys%O zDqBtXJ`jI}??Wk#3|BhfS(^{|bd;Gg->83rjE6O086ki1^&deT{4c(RM$lpdm_`78 zf8yIl=fCb&kLZ@BD$Vs0|Lr?jeY{LQP(46C1mEJ(gPd$Ixj;$6KQ7V+fVy5%L9;!L zqi%pX_eo%=F-Mp^ork+sx-i}bf!F}yD_5&=fT7S*n-Gm3!dD3d*^+#`(AJGkh-s{F z0J@zxNEB`%_Z*%BeOf-EL(6+Gd8&ja4y>Y$qd7=j`e(L6NB=0620F00O5ir?k(5#g z0Wew9V*vmT4qpsO5){alh+*R&7jo$1qkC0{l+0+Y0e#)?+01&aIRCUlMQglLTi(;p z)1Pj>8?zMZ*XCJZ5gl8%WFLF@!bnQWZMmO^wmIX5xT}AZ%pTkDdCABl;MHfA+R?>B zwOiOw58)2d{TpIxrxz?xT<^J|{-z)(eTYwIyH9Ac7j22QAbhk4iUGYI#5=DLKfz93 z(Fn(YJxcR}1B6=zpka)e6 zB}Dt8(}tl_F<^}oM39NHojT1x2`w_e)KfyGl3G^%jXd@xWue7HnR?o#CfW!c)<1@P zrCk;H5oy-wbh&toQCHhpv^J&yFk9F6^G_5h6SavwKUac!U|8W*O2+ktKA#5wV@1Z* zU9KmwE(3#jp#gkjWP8sG4oKD?(NYKBIMd`|f81`k`rCn)k}F_6vm!@61|U7BM_bEZ$A-mI5Xu z^1$tqmPoeUDqkR(I^%uWcpjX)PMF7=8qcWH3Hyf_9nUuaapw2bo#xjs6hb0( z)4*J-YZB`L$N0E^Un+v6qDj|NTx5qICj}a+__)IQVL})#!xpk+a!?rF1LGAPcf(pr z7Hg2h3(LWOu7dJi8EQv~6J4rKi6eXe%lsab0E7M&1veS&uVoK!yGA4ALVv=Czx_P1 zOo)IwrJQ6qNZ$SR^dd`yAgrhX^2*r* zQanIFfXpF$?L;!mJLEJHNMF5XTP1CfnB-Z5yeEUZII7}0?~*y~oS+wEksSe6v)wPB zs>yVUnYqEK6Z4|+GU`zW1+IQ2py-mQ_VVo0<8EW?n4rX-gjOuaQiQtagr|e(ZE0dk z7N&;&pMqkM+)}I^3eYg>h|IMvXrlxqNV}{Ei{1d7)vzEN-e^H7lqa}doGrB~u{*{c z)PMn8OdFI@FfW612Mq|Co*+ER5;SUJprOQXs$Q9Un_oLm|TN}V$j?QHVPK^JgTI4 zQLN+*vTv?8r@|}}1nd%!<^$1=M3nh`GzuRbVMK_H+e6HZK)uMrAoh6&r<%Su`FL>B zcSK>F@hfok+psLjMHWwITfLU^3DhDb}ds)%GDsKo(mb1OB zIB7#_IXZD8FLd0+Pcl|NNV9T!N&ZMXl2nr~Q%pow&9^Sz-m5nPun{@xR0BxMn@%i3 z`X4;jdG+%>Qbkz_!*PQ_3ci?t`j#2ngShiDOb{J9EWfWTrDvGb)PN`2#CmS})-p5!r|5f zZVH7HoIbxhYCl%+0L`N`R+}Xm{P|74ElO`_Mm}0y^e9Vaw(!J#om;UDKEku~ zv^@mVd5&rB_(q=?B}`}hY)^IX1mlv(Q>P#X^_n8Z!k%W zNei@R8sqdZ@^kmZgX?eR!4L2GVo-gx;`JOeKg*o;G3W*d)XNo&!fi#uo#YRYCf+&! zUmJ4|ksfc+;8pYP{#FBDr$1$vyTVjcslF*{|KpU$f(e95zp2+4UJ`-;vtRYCR~c0Y zcbcKSJ*;^k3gIbL-o0zTKqI2`(@GL4M?_wc72aNm(ds1epyV^UzD_Y?9UON`g zacp-qmK}v7Fz9KZ2HX0LZv#X4rOPz&pjM|UIins@5SbVuwjhDa?0t;-`7L`N71x>aCC~%QoF}3`Cgf*N{P6{tek+q z-qks94cOMz^z-ua?PT#QS_nY~r0@=TR`qW6A5uQ(SXi?D4_FX#9(cB1AnIB5Z|vQ$ zkTJAun?3q5o%MPqk>qIhZ3PURN8sl0rJwAp`7CZ*`ZuKT5bCYnOsB)&)Sp-i za+OjYKM)<`gT@y**K0JwM#%YM%ll1nWP-iea&|h!@myOgTn^WDy=u*Dn0#a3Q<^d4 z*FVTLiB^Pk6Y7_#&FR)Nr9FyR+h(X8WX?#vRhIQeTnim0x{{t6M2X? zGLt%;aqMoTC9^h%2evZY3-^pG%68Blf>OA`@#oy`4qwHLZ)yzW36Z$S;$mtZh!gEh z%PZr|_%AngEeC+AxWlQ=9S9Pctc|v+nQ{+A#GHda<7E|Q;(wII&ZCcrGnbwqyd9j| zBg)o9m`))@E=_Rfz*YY77Rie@Pb&NEtxjo~J29NzAiEj~g8lkXO_-7}CniX`8D(@5 z;`un3BEt|UcL-Q!-T}+QH%vldeS|A69bJe^oSUj6Pyw4wV5ksOb4-H+&r*tnv+hPj zNYkht7`>P03pjI!pVX?@*>~9Ojk5x|82|r*{bSc1Aa=Z5-%1lUFIKTZ8m~TpB#Kke z6c(4zoV#Y+YbXRsRTlZQTO^24trHUGtYZ#K5;jOV8!1wJi)^Djxv4Sm9&vA?&Rdso zH_$EiEZz0h1}oi>JJ2W2GtE3scwv}m-@3V4I?%Dh zr#Z>*kZU4LP3I)%G)gPSHW=xvpPpt<)6cvF0ZG}L4Jrv}+WSY7=#pj~`jtvNC!Z^M zpzg+?A(7)Ig*;<@B&w?KvtspVuo)?Sv_3;mVM_Oxsl=zzVi)S;jwFgE&O7U1l9f|ja8?7r;0lF&7?c;qwqzE1oT39p ztD8cnXab8uEHr^Ltj~wIXRFB?jV+|0Ko|_@vdlYO&&pL9Z$-w~lUMmE6?>MYPB1Bq zuzq0BfnYMF*yQ$oTzVjJa@zbDH-8CA z5)FI#zq{pjcCXSEK*Mmn9i(wxn+Z8kow@xBDUnfZL?kTK47@%^I=y|*AU6F)AFQ5I z)20Cv_WNd({q`cp0Z0l%8i2wA%5qwM3W;s#D>VBy-ndZ{1UEsEjxZVR3(!)8YJlNx ztLZhEX|Q_R^Xl#MmU~F`v}0(5UrQsInB&(SZJOK?gh7`2>3x`Q6D->ss>Lls)0lSP zbc;|jIfejIH#vrqRl6BCZrJFd>8x(a`Q0zL_UR@8gWocTTPRxfFelM(Sw-{Dv2Uiq zT`+AAhh78m>Ss$jx09F?)0F6SNh7x3^=0$bIfw08e`6un2%sa%g`F77Q?h z+N?X~+IcDC+trFEh*|8;F1SCiKQ1`798^Vn13kA{O>3Ze|@hQ47OT*oltdTxIYmt8or)!8PQmWNtzAjFX zCZidYjVko3M{KPIx*)GOI)0!LLB|iAAyW)bh7exbZ+)S2m#`okjv%PU4}h0R;0unU zF`(&RZFSK`VoO3K@LFG-S0YRd#~T;}l|Mf8unyfNf99y;Q+80!bsrO(dnIpQ5R03~ z1hH`OcQM0yG@36E{>|?xl;Tv#5_W7`qa6bk@zv`dl|{`MSFo<={g&LLuX=A*umamp zqUNRhKD4#EDCWRv#O}SCY`i5i#+WL36xw&S*sbWDV zP8KZ@?rQoaKXxlHz`a?(7}Xst1-GJp&&)d6X73&m(ui#T@-NO4C?1zsOX`D}E2`|EkY+UEA??-Oa>vQHg>E@wb239Gj=AN)gyD{fPm@O=Bbqgr z1bWazl?D)Gc+G}}d#nJ?Yw@sFol6>j%D&MF^KW6N_+5x)k zILntlXtK5LAQx6(Af@-^UosgQ?;SQdXWS+oAc2H0b~t z=u*uqrc9{K5I2DdB2BU1)deu)dhbz_`${{tU=M=z+|&4(f5p)!8bbh%S~~KDaCIq~ zGf1cLoVZ(5$%LKT66*~5*iuTyVK@#3-`Uk!_d<0VjhK92VX6QP!O^BV99Aug)nGz( zKP62Bo$r_NIp79wXc+E6bU6>%NWh{X@M5?`uQ|mz#u^K(CYM8iyx)%HRK4d?-`Oi_ z@BwQ%Djp;$7gWf_77TDkeQX z2nf$-Gk)s=WC#x+1en_|?I^U8%;Uz18Ub3mBg(clB+7%89%E}(HG4+!zM+4KyR4f}Fy8F=%9nQN#3?mIc~pG9SYiblBIBD6^Phk)fGsXh zU$VqrDMDeQe;ywcA6KM7qV@9xOMxkAc1+}C`}q^UxP0T_w518B1aF)x&(i24OkO*VKVrK<3 zlyrEc#$WHQ`A%ITOa)Fmnx1GL@1R|N`gHXOBNDplFRJlu_T_%QhS55$E~|gx=AXzb z%elPZr15;@Q)E&^HU0dhqLyF!SbmRyFk#INfY|9492repeP;4zzWI~(O|p84nf`lC z9$uqlb8o0i-GJByYrNY$&Ss2>@Lz9|vxez3FntC0OpYG!;zU>A64Mg=%$FK&W)nEo z(K%4%`?qxzy(tjwFzSPB=pG%ca@?c(ytUC0@;)>N{~4DjjxIRI=K&>OC+quax!S&` zp(rqOGS~o^5cMGT7>LqVj@rYKnQ25pL<)m<7JQ^>(xBt)E_$CPf*%^wZP3nf$c8=}LT)Mu7l;h)ym#vn3iZ`PKSYq7C{6?Gg!n}^hlL?j!v#mD(Y3Et` zT7IHKO9t}wxcLtX<_#oo59giS;EB-5a^dx1M{)0D`oFvRdS*6Ml{n!6YT|&DMAVP= zYw+J6)@X&iS6zF_qP_5zf^rydRbR$05gc7aDnF*BFnq`nf>E!71()Q=;x+!LLQKcH G`2PU_Q{dSE literal 0 HcmV?d00001 diff --git a/cordova-lib/spec-plugman-create/plugins/cordova.echo/src/blackberry10/native/public/json/autolink.h b/cordova-lib/spec-plugman-create/plugins/cordova.echo/src/blackberry10/native/public/json/autolink.h new file mode 100644 index 000000000..37c9258ed --- /dev/null +++ b/cordova-lib/spec-plugman-create/plugins/cordova.echo/src/blackberry10/native/public/json/autolink.h @@ -0,0 +1,19 @@ +#ifndef JSON_AUTOLINK_H_INCLUDED +# define JSON_AUTOLINK_H_INCLUDED + +# include "config.h" + +# ifdef JSON_IN_CPPTL +# include +# endif + +# if !defined(JSON_NO_AUTOLINK) && !defined(JSON_DLL_BUILD) && !defined(JSON_IN_CPPTL) +# define CPPTL_AUTOLINK_NAME "json" +# undef CPPTL_AUTOLINK_DLL +# ifdef JSON_DLL +# define CPPTL_AUTOLINK_DLL +# endif +# include "autolink.h" +# endif + +#endif // JSON_AUTOLINK_H_INCLUDED diff --git a/cordova-lib/spec-plugman-create/plugins/cordova.echo/src/blackberry10/native/public/json/config.h b/cordova-lib/spec-plugman-create/plugins/cordova.echo/src/blackberry10/native/public/json/config.h new file mode 100644 index 000000000..5d334cbc5 --- /dev/null +++ b/cordova-lib/spec-plugman-create/plugins/cordova.echo/src/blackberry10/native/public/json/config.h @@ -0,0 +1,43 @@ +#ifndef JSON_CONFIG_H_INCLUDED +# define JSON_CONFIG_H_INCLUDED + +/// If defined, indicates that json library is embedded in CppTL library. +//# define JSON_IN_CPPTL 1 + +/// If defined, indicates that json may leverage CppTL library +//# define JSON_USE_CPPTL 1 +/// If defined, indicates that cpptl vector based map should be used instead of std::map +/// as Value container. +//# define JSON_USE_CPPTL_SMALLMAP 1 +/// If defined, indicates that Json specific container should be used +/// (hash table & simple deque container with customizable allocator). +/// THIS FEATURE IS STILL EXPERIMENTAL! +//# define JSON_VALUE_USE_INTERNAL_MAP 1 +/// Force usage of standard new/malloc based allocator instead of memory pool based allocator. +/// The memory pools allocator used optimization (initializing Value and ValueInternalLink +/// as if it was a POD) that may cause some validation tool to report errors. +/// Only has effects if JSON_VALUE_USE_INTERNAL_MAP is defined. +//# define JSON_USE_SIMPLE_INTERNAL_ALLOCATOR 1 + +/// If defined, indicates that Json use exception to report invalid type manipulation +/// instead of C assert macro. +# define JSON_USE_EXCEPTION 1 + +# ifdef JSON_IN_CPPTL +# include +# ifndef JSON_USE_CPPTL +# define JSON_USE_CPPTL 1 +# endif +# endif + +# ifdef JSON_IN_CPPTL +# define JSON_API CPPTL_API +# elif defined(JSON_DLL_BUILD) +# define JSON_API __declspec(dllexport) +# elif defined(JSON_DLL) +# define JSON_API __declspec(dllimport) +# else +# define JSON_API +# endif + +#endif // JSON_CONFIG_H_INCLUDED diff --git a/cordova-lib/spec-plugman-create/plugins/cordova.echo/src/blackberry10/native/public/json/features.h b/cordova-lib/spec-plugman-create/plugins/cordova.echo/src/blackberry10/native/public/json/features.h new file mode 100644 index 000000000..5a9adec11 --- /dev/null +++ b/cordova-lib/spec-plugman-create/plugins/cordova.echo/src/blackberry10/native/public/json/features.h @@ -0,0 +1,42 @@ +#ifndef CPPTL_JSON_FEATURES_H_INCLUDED +# define CPPTL_JSON_FEATURES_H_INCLUDED + +# include "forwards.h" + +namespace Json { + + /** \brief Configuration passed to reader and writer. + * This configuration object can be used to force the Reader or Writer + * to behave in a standard conforming way. + */ + class JSON_API Features + { + public: + /** \brief A configuration that allows all features and assumes all strings are UTF-8. + * - C & C++ comments are allowed + * - Root object can be any JSON value + * - Assumes Value strings are encoded in UTF-8 + */ + static Features all(); + + /** \brief A configuration that is strictly compatible with the JSON specification. + * - Comments are forbidden. + * - Root object must be either an array or an object value. + * - Assumes Value strings are encoded in UTF-8 + */ + static Features strictMode(); + + /** \brief Initialize the configuration like JsonConfig::allFeatures; + */ + Features(); + + /// \c true if comments are allowed. Default: \c true. + bool allowComments_; + + /// \c true if root must be either an array or an object value. Default: \c false. + bool strictRoot_; + }; + +} // namespace Json + +#endif // CPPTL_JSON_FEATURES_H_INCLUDED diff --git a/cordova-lib/spec-plugman-create/plugins/cordova.echo/src/blackberry10/native/public/json/forwards.h b/cordova-lib/spec-plugman-create/plugins/cordova.echo/src/blackberry10/native/public/json/forwards.h new file mode 100644 index 000000000..d0ce8300c --- /dev/null +++ b/cordova-lib/spec-plugman-create/plugins/cordova.echo/src/blackberry10/native/public/json/forwards.h @@ -0,0 +1,39 @@ +#ifndef JSON_FORWARDS_H_INCLUDED +# define JSON_FORWARDS_H_INCLUDED + +# include "config.h" + +namespace Json { + + // writer.h + class FastWriter; + class StyledWriter; + + // reader.h + class Reader; + + // features.h + class Features; + + // value.h + typedef int Int; + typedef unsigned int UInt; + class StaticString; + class Path; + class PathArgument; + class Value; + class ValueIteratorBase; + class ValueIterator; + class ValueConstIterator; +#ifdef JSON_VALUE_USE_INTERNAL_MAP + class ValueAllocator; + class ValueMapAllocator; + class ValueInternalLink; + class ValueInternalArray; + class ValueInternalMap; +#endif // #ifdef JSON_VALUE_USE_INTERNAL_MAP + +} // namespace Json + + +#endif // JSON_FORWARDS_H_INCLUDED diff --git a/cordova-lib/spec-plugman-create/plugins/cordova.echo/src/blackberry10/native/public/json/json.h b/cordova-lib/spec-plugman-create/plugins/cordova.echo/src/blackberry10/native/public/json/json.h new file mode 100644 index 000000000..c71ed65ab --- /dev/null +++ b/cordova-lib/spec-plugman-create/plugins/cordova.echo/src/blackberry10/native/public/json/json.h @@ -0,0 +1,10 @@ +#ifndef JSON_JSON_H_INCLUDED +# define JSON_JSON_H_INCLUDED + +# include "autolink.h" +# include "value.h" +# include "reader.h" +# include "writer.h" +# include "features.h" + +#endif // JSON_JSON_H_INCLUDED diff --git a/cordova-lib/spec-plugman-create/plugins/cordova.echo/src/blackberry10/native/public/json/reader.h b/cordova-lib/spec-plugman-create/plugins/cordova.echo/src/blackberry10/native/public/json/reader.h new file mode 100644 index 000000000..ee1d6a244 --- /dev/null +++ b/cordova-lib/spec-plugman-create/plugins/cordova.echo/src/blackberry10/native/public/json/reader.h @@ -0,0 +1,196 @@ +#ifndef CPPTL_JSON_READER_H_INCLUDED +# define CPPTL_JSON_READER_H_INCLUDED + +# include "features.h" +# include "value.h" +# include +# include +# include +# include + +namespace Json { + + /** \brief Unserialize a JSON document into a Value. + * + */ + class JSON_API Reader + { + public: + typedef char Char; + typedef const Char *Location; + + /** \brief Constructs a Reader allowing all features + * for parsing. + */ + Reader(); + + /** \brief Constructs a Reader allowing the specified feature set + * for parsing. + */ + Reader( const Features &features ); + + /** \brief Read a Value from a JSON document. + * \param document UTF-8 encoded string containing the document to read. + * \param root [out] Contains the root value of the document if it was + * successfully parsed. + * \param collectComments \c true to collect comment and allow writing them back during + * serialization, \c false to discard comments. + * This parameter is ignored if Features::allowComments_ + * is \c false. + * \return \c true if the document was successfully parsed, \c false if an error occurred. + */ + bool parse( const std::string &document, + Value &root, + bool collectComments = true ); + + /** \brief Read a Value from a JSON document. + * \param document UTF-8 encoded string containing the document to read. + * \param root [out] Contains the root value of the document if it was + * successfully parsed. + * \param collectComments \c true to collect comment and allow writing them back during + * serialization, \c false to discard comments. + * This parameter is ignored if Features::allowComments_ + * is \c false. + * \return \c true if the document was successfully parsed, \c false if an error occurred. + */ + bool parse( const char *beginDoc, const char *endDoc, + Value &root, + bool collectComments = true ); + + /// \brief Parse from input stream. + /// \see Json::operator>>(std::istream&, Json::Value&). + bool parse( std::istream &is, + Value &root, + bool collectComments = true ); + + /** \brief Returns a user friendly string that list errors in the parsed document. + * \return Formatted error message with the list of errors with their location in + * the parsed document. An empty string is returned if no error occurred + * during parsing. + */ + std::string getFormatedErrorMessages() const; + + private: + enum TokenType + { + tokenEndOfStream = 0, + tokenObjectBegin, + tokenObjectEnd, + tokenArrayBegin, + tokenArrayEnd, + tokenString, + tokenNumber, + tokenTrue, + tokenFalse, + tokenNull, + tokenArraySeparator, + tokenMemberSeparator, + tokenComment, + tokenError + }; + + class Token + { + public: + TokenType type_; + Location start_; + Location end_; + }; + + class ErrorInfo + { + public: + Token token_; + std::string message_; + Location extra_; + }; + + typedef std::deque Errors; + + bool expectToken( TokenType type, Token &token, const char *message ); + bool readToken( Token &token ); + void skipSpaces(); + bool match( Location pattern, + int patternLength ); + bool readComment(); + bool readCStyleComment(); + bool readCppStyleComment(); + bool readString(); + void readNumber(); + bool readValue(); + bool readObject( Token &token ); + bool readArray( Token &token ); + bool decodeNumber( Token &token ); + bool decodeString( Token &token ); + bool decodeString( Token &token, std::string &decoded ); + bool decodeDouble( Token &token ); + bool decodeUnicodeCodePoint( Token &token, + Location ¤t, + Location end, + unsigned int &unicode ); + bool decodeUnicodeEscapeSequence( Token &token, + Location ¤t, + Location end, + unsigned int &unicode ); + bool addError( const std::string &message, + Token &token, + Location extra = 0 ); + bool recoverFromError( TokenType skipUntilToken ); + bool addErrorAndRecover( const std::string &message, + Token &token, + TokenType skipUntilToken ); + void skipUntilSpace(); + Value ¤tValue(); + Char getNextChar(); + void getLocationLineAndColumn( Location location, + int &line, + int &column ) const; + std::string getLocationLineAndColumn( Location location ) const; + void addComment( Location begin, + Location end, + CommentPlacement placement ); + void skipCommentTokens( Token &token ); + + typedef std::stack Nodes; + Nodes nodes_; + Errors errors_; + std::string document_; + Location begin_; + Location end_; + Location current_; + Location lastValueEnd_; + Value *lastValue_; + std::string commentsBefore_; + Features features_; + bool collectComments_; + }; + + /** \brief Read from 'sin' into 'root'. + + Always keep comments from the input JSON. + + This can be used to read a file into a particular sub-object. + For example: + \code + Json::Value root; + cin >> root["dir"]["file"]; + cout << root; + \endcode + Result: + \verbatim + { + "dir": { + "file": { + // The input stream JSON would be nested here. + } + } + } + \endverbatim + \throw std::exception on parse error. + \see Json::operator<<() + */ + std::istream& operator>>( std::istream&, Value& ); + +} // namespace Json + +#endif // CPPTL_JSON_READER_H_INCLUDED diff --git a/cordova-lib/spec-plugman-create/plugins/cordova.echo/src/blackberry10/native/public/json/value.h b/cordova-lib/spec-plugman-create/plugins/cordova.echo/src/blackberry10/native/public/json/value.h new file mode 100644 index 000000000..912b8304f --- /dev/null +++ b/cordova-lib/spec-plugman-create/plugins/cordova.echo/src/blackberry10/native/public/json/value.h @@ -0,0 +1,1069 @@ +#ifndef CPPTL_JSON_H_INCLUDED +# define CPPTL_JSON_H_INCLUDED + +# include "forwards.h" +# include +# include + +# ifndef JSON_USE_CPPTL_SMALLMAP +# include +# else +# include +# endif +# ifdef JSON_USE_CPPTL +# include +# endif + +/** \brief JSON (JavaScript Object Notation). + */ +namespace Json { + + /** \brief Type of the value held by a Value object. + */ + enum ValueType + { + nullValue = 0, ///< 'null' value + intValue, ///< signed integer value + uintValue, ///< unsigned integer value + realValue, ///< double value + stringValue, ///< UTF-8 string value + booleanValue, ///< bool value + arrayValue, ///< array value (ordered list) + objectValue ///< object value (collection of name/value pairs). + }; + + enum CommentPlacement + { + commentBefore = 0, ///< a comment placed on the line before a value + commentAfterOnSameLine, ///< a comment just after a value on the same line + commentAfter, ///< a comment on the line after a value (only make sense for root value) + numberOfCommentPlacement + }; + +//# ifdef JSON_USE_CPPTL +// typedef CppTL::AnyEnumerator EnumMemberNames; +// typedef CppTL::AnyEnumerator EnumValues; +//# endif + + /** \brief Lightweight wrapper to tag static string. + * + * Value constructor and objectValue member assignment takes advantage of the + * StaticString and avoid the cost of string duplication when storing the + * string or the member name. + * + * Example of usage: + * \code + * Json::Value aValue( StaticString("some text") ); + * Json::Value object; + * static const StaticString code("code"); + * object[code] = 1234; + * \endcode + */ + class JSON_API StaticString + { + public: + explicit StaticString( const char *czstring ) + : str_( czstring ) + { + } + + operator const char *() const + { + return str_; + } + + const char *c_str() const + { + return str_; + } + + private: + const char *str_; + }; + + /** \brief Represents a JSON value. + * + * This class is a discriminated union wrapper that can represents a: + * - signed integer [range: Value::minInt - Value::maxInt] + * - unsigned integer (range: 0 - Value::maxUInt) + * - double + * - UTF-8 string + * - boolean + * - 'null' + * - an ordered list of Value + * - collection of name/value pairs (javascript object) + * + * The type of the held value is represented by a #ValueType and + * can be obtained using type(). + * + * values of an #objectValue or #arrayValue can be accessed using operator[]() methods. + * Non const methods will automatically create the a #nullValue element + * if it does not exist. + * The sequence of an #arrayValue will be automatically resize and initialized + * with #nullValue. resize() can be used to enlarge or truncate an #arrayValue. + * + * The get() methods can be used to obtains default value in the case the required element + * does not exist. + * + * It is possible to iterate over the list of a #objectValue values using + * the getMemberNames() method. + */ + class JSON_API Value + { + friend class ValueIteratorBase; +# ifdef JSON_VALUE_USE_INTERNAL_MAP + friend class ValueInternalLink; + friend class ValueInternalMap; +# endif + public: + typedef std::vector Members; + typedef ValueIterator iterator; + typedef ValueConstIterator const_iterator; + typedef Json::UInt UInt; + typedef Json::Int Int; + typedef UInt ArrayIndex; + + static const Value null; + static const Int minInt; + static const Int maxInt; + static const UInt maxUInt; + + private: +#ifndef JSONCPP_DOC_EXCLUDE_IMPLEMENTATION +# ifndef JSON_VALUE_USE_INTERNAL_MAP + class CZString + { + public: + enum DuplicationPolicy + { + noDuplication = 0, + duplicate, + duplicateOnCopy + }; + CZString( int index ); + CZString( const char *cstr, DuplicationPolicy allocate ); + CZString( const CZString &other ); + ~CZString(); + CZString &operator =( const CZString &other ); + bool operator<( const CZString &other ) const; + bool operator==( const CZString &other ) const; + int index() const; + const char *c_str() const; + bool isStaticString() const; + private: + void swap( CZString &other ); + const char *cstr_; + int index_; + }; + + public: +# ifndef JSON_USE_CPPTL_SMALLMAP + typedef std::map ObjectValues; +# else + typedef CppTL::SmallMap ObjectValues; +# endif // ifndef JSON_USE_CPPTL_SMALLMAP +# endif // ifndef JSON_VALUE_USE_INTERNAL_MAP +#endif // ifndef JSONCPP_DOC_EXCLUDE_IMPLEMENTATION + + public: + /** \brief Create a default Value of the given type. + + This is a very useful constructor. + To create an empty array, pass arrayValue. + To create an empty object, pass objectValue. + Another Value can then be set to this one by assignment. + This is useful since clear() and resize() will not alter types. + + Examples: + \code + Json::Value null_value; // null + Json::Value arr_value(Json::arrayValue); // [] + Json::Value obj_value(Json::objectValue); // {} + \endcode + */ + Value( ValueType type = nullValue ); + Value( Int value ); + Value( UInt value ); + Value( double value ); + Value( const char *value ); + Value( const char *beginValue, const char *endValue ); + /** \brief Constructs a value from a static string. + + * Like other value string constructor but do not duplicate the string for + * internal storage. The given string must remain alive after the call to this + * constructor. + * Example of usage: + * \code + * Json::Value aValue( StaticString("some text") ); + * \endcode + */ + Value( const StaticString &value ); + Value( const std::string &value ); +# ifdef JSON_USE_CPPTL + Value( const CppTL::ConstString &value ); +# endif + Value( bool value ); + Value( const Value &other ); + ~Value(); + + Value &operator=( const Value &other ); + /// Swap values. + /// \note Currently, comments are intentionally not swapped, for + /// both logic and efficiency. + void swap( Value &other ); + + ValueType type() const; + + bool operator <( const Value &other ) const; + bool operator <=( const Value &other ) const; + bool operator >=( const Value &other ) const; + bool operator >( const Value &other ) const; + + bool operator ==( const Value &other ) const; + bool operator !=( const Value &other ) const; + + int compare( const Value &other ); + + const char *asCString() const; + std::string asString() const; +# ifdef JSON_USE_CPPTL + CppTL::ConstString asConstString() const; +# endif + Int asInt() const; + UInt asUInt() const; + double asDouble() const; + bool asBool() const; + + bool isNull() const; + bool isBool() const; + bool isInt() const; + bool isUInt() const; + bool isIntegral() const; + bool isDouble() const; + bool isNumeric() const; + bool isString() const; + bool isArray() const; + bool isObject() const; + + bool isConvertibleTo( ValueType other ) const; + + /// Number of values in array or object + UInt size() const; + + /// \brief Return true if empty array, empty object, or null; + /// otherwise, false. + bool empty() const; + + /// Return isNull() + bool operator!() const; + + /// Remove all object members and array elements. + /// \pre type() is arrayValue, objectValue, or nullValue + /// \post type() is unchanged + void clear(); + + /// Resize the array to size elements. + /// New elements are initialized to null. + /// May only be called on nullValue or arrayValue. + /// \pre type() is arrayValue or nullValue + /// \post type() is arrayValue + void resize( UInt size ); + + /// Access an array element (zero based index ). + /// If the array contains less than index element, then null value are inserted + /// in the array so that its size is index+1. + /// (You may need to say 'value[0u]' to get your compiler to distinguish + /// this from the operator[] which takes a string.) + Value &operator[]( UInt index ); + /// Access an array element (zero based index ) + /// (You may need to say 'value[0u]' to get your compiler to distinguish + /// this from the operator[] which takes a string.) + const Value &operator[]( UInt index ) const; + /// If the array contains at least index+1 elements, returns the element value, + /// otherwise returns defaultValue. + Value get( UInt index, + const Value &defaultValue ) const; + /// Return true if index < size(). + bool isValidIndex( UInt index ) const; + /// \brief Append value to array at the end. + /// + /// Equivalent to jsonvalue[jsonvalue.size()] = value; + Value &append( const Value &value ); + + /// Access an object value by name, create a null member if it does not exist. + Value &operator[]( const char *key ); + /// Access an object value by name, returns null if there is no member with that name. + const Value &operator[]( const char *key ) const; + /// Access an object value by name, create a null member if it does not exist. + Value &operator[]( const std::string &key ); + /// Access an object value by name, returns null if there is no member with that name. + const Value &operator[]( const std::string &key ) const; + /** \brief Access an object value by name, create a null member if it does not exist. + + * If the object as no entry for that name, then the member name used to store + * the new entry is not duplicated. + * Example of use: + * \code + * Json::Value object; + * static const StaticString code("code"); + * object[code] = 1234; + * \endcode + */ + Value &operator[]( const StaticString &key ); +# ifdef JSON_USE_CPPTL + /// Access an object value by name, create a null member if it does not exist. + Value &operator[]( const CppTL::ConstString &key ); + /// Access an object value by name, returns null if there is no member with that name. + const Value &operator[]( const CppTL::ConstString &key ) const; +# endif + /// Return the member named key if it exist, defaultValue otherwise. + Value get( const char *key, + const Value &defaultValue ) const; + /// Return the member named key if it exist, defaultValue otherwise. + Value get( const std::string &key, + const Value &defaultValue ) const; +# ifdef JSON_USE_CPPTL + /// Return the member named key if it exist, defaultValue otherwise. + Value get( const CppTL::ConstString &key, + const Value &defaultValue ) const; +# endif + /// \brief Remove and return the named member. + /// + /// Do nothing if it did not exist. + /// \return the removed Value, or null. + /// \pre type() is objectValue or nullValue + /// \post type() is unchanged + Value removeMember( const char* key ); + /// Same as removeMember(const char*) + Value removeMember( const std::string &key ); + + /// Return true if the object has a member named key. + bool isMember( const char *key ) const; + /// Return true if the object has a member named key. + bool isMember( const std::string &key ) const; +# ifdef JSON_USE_CPPTL + /// Return true if the object has a member named key. + bool isMember( const CppTL::ConstString &key ) const; +# endif + + /// \brief Return a list of the member names. + /// + /// If null, return an empty list. + /// \pre type() is objectValue or nullValue + /// \post if type() was nullValue, it remains nullValue + Members getMemberNames() const; + +//# ifdef JSON_USE_CPPTL +// EnumMemberNames enumMemberNames() const; +// EnumValues enumValues() const; +//# endif + + /// Comments must be //... or /* ... */ + void setComment( const char *comment, + CommentPlacement placement ); + /// Comments must be //... or /* ... */ + void setComment( const std::string &comment, + CommentPlacement placement ); + bool hasComment( CommentPlacement placement ) const; + /// Include delimiters and embedded newlines. + std::string getComment( CommentPlacement placement ) const; + + std::string toStyledString() const; + + const_iterator begin() const; + const_iterator end() const; + + iterator begin(); + iterator end(); + + private: + Value &resolveReference( const char *key, + bool isStatic ); + +# ifdef JSON_VALUE_USE_INTERNAL_MAP + inline bool isItemAvailable() const + { + return itemIsUsed_ == 0; + } + + inline void setItemUsed( bool isUsed = true ) + { + itemIsUsed_ = isUsed ? 1 : 0; + } + + inline bool isMemberNameStatic() const + { + return memberNameIsStatic_ == 0; + } + + inline void setMemberNameIsStatic( bool isStatic ) + { + memberNameIsStatic_ = isStatic ? 1 : 0; + } +# endif // # ifdef JSON_VALUE_USE_INTERNAL_MAP + + private: + struct CommentInfo + { + CommentInfo(); + ~CommentInfo(); + + void setComment( const char *text ); + + char *comment_; + }; + + //struct MemberNamesTransform + //{ + // typedef const char *result_type; + // const char *operator()( const CZString &name ) const + // { + // return name.c_str(); + // } + //}; + + union ValueHolder + { + Int int_; + UInt uint_; + double real_; + bool bool_; + char *string_; +# ifdef JSON_VALUE_USE_INTERNAL_MAP + ValueInternalArray *array_; + ValueInternalMap *map_; +#else + ObjectValues *map_; +# endif + } value_; + ValueType type_ : 8; + int allocated_ : 1; // Notes: if declared as bool, bitfield is useless. +# ifdef JSON_VALUE_USE_INTERNAL_MAP + unsigned int itemIsUsed_ : 1; // used by the ValueInternalMap container. + int memberNameIsStatic_ : 1; // used by the ValueInternalMap container. +# endif + CommentInfo *comments_; + }; + + + /** \brief Experimental and untested: represents an element of the "path" to access a node. + */ + class PathArgument + { + public: + friend class Path; + + PathArgument(); + PathArgument( UInt index ); + PathArgument( const char *key ); + PathArgument( const std::string &key ); + + private: + enum Kind + { + kindNone = 0, + kindIndex, + kindKey + }; + std::string key_; + UInt index_; + Kind kind_; + }; + + /** \brief Experimental and untested: represents a "path" to access a node. + * + * Syntax: + * - "." => root node + * - ".[n]" => elements at index 'n' of root node (an array value) + * - ".name" => member named 'name' of root node (an object value) + * - ".name1.name2.name3" + * - ".[0][1][2].name1[3]" + * - ".%" => member name is provided as parameter + * - ".[%]" => index is provided as parameter + */ + class Path + { + public: + Path( const std::string &path, + const PathArgument &a1 = PathArgument(), + const PathArgument &a2 = PathArgument(), + const PathArgument &a3 = PathArgument(), + const PathArgument &a4 = PathArgument(), + const PathArgument &a5 = PathArgument() ); + + const Value &resolve( const Value &root ) const; + Value resolve( const Value &root, + const Value &defaultValue ) const; + /// Creates the "path" to access the specified node and returns a reference on the node. + Value &make( Value &root ) const; + + private: + typedef std::vector InArgs; + typedef std::vector Args; + + void makePath( const std::string &path, + const InArgs &in ); + void addPathInArg( const std::string &path, + const InArgs &in, + InArgs::const_iterator &itInArg, + PathArgument::Kind kind ); + void invalidPath( const std::string &path, + int location ); + + Args args_; + }; + + /** \brief Experimental do not use: Allocator to customize member name and string value memory management done by Value. + * + * - makeMemberName() and releaseMemberName() are called to respectively duplicate and + * free an Json::objectValue member name. + * - duplicateStringValue() and releaseStringValue() are called similarly to + * duplicate and free a Json::stringValue value. + */ + class ValueAllocator + { + public: + enum { unknown = (unsigned)-1 }; + + virtual ~ValueAllocator(); + + virtual char *makeMemberName( const char *memberName ) = 0; + virtual void releaseMemberName( char *memberName ) = 0; + virtual char *duplicateStringValue( const char *value, + unsigned int length = unknown ) = 0; + virtual void releaseStringValue( char *value ) = 0; + }; + +#ifdef JSON_VALUE_USE_INTERNAL_MAP + /** \brief Allocator to customize Value internal map. + * Below is an example of a simple implementation (default implementation actually + * use memory pool for speed). + * \code + class DefaultValueMapAllocator : public ValueMapAllocator + { + public: // overridden from ValueMapAllocator + virtual ValueInternalMap *newMap() + { + return new ValueInternalMap(); + } + + virtual ValueInternalMap *newMapCopy( const ValueInternalMap &other ) + { + return new ValueInternalMap( other ); + } + + virtual void destructMap( ValueInternalMap *map ) + { + delete map; + } + + virtual ValueInternalLink *allocateMapBuckets( unsigned int size ) + { + return new ValueInternalLink[size]; + } + + virtual void releaseMapBuckets( ValueInternalLink *links ) + { + delete [] links; + } + + virtual ValueInternalLink *allocateMapLink() + { + return new ValueInternalLink(); + } + + virtual void releaseMapLink( ValueInternalLink *link ) + { + delete link; + } + }; + * \endcode + */ + class JSON_API ValueMapAllocator + { + public: + virtual ~ValueMapAllocator(); + virtual ValueInternalMap *newMap() = 0; + virtual ValueInternalMap *newMapCopy( const ValueInternalMap &other ) = 0; + virtual void destructMap( ValueInternalMap *map ) = 0; + virtual ValueInternalLink *allocateMapBuckets( unsigned int size ) = 0; + virtual void releaseMapBuckets( ValueInternalLink *links ) = 0; + virtual ValueInternalLink *allocateMapLink() = 0; + virtual void releaseMapLink( ValueInternalLink *link ) = 0; + }; + + /** \brief ValueInternalMap hash-map bucket chain link (for internal use only). + * \internal previous_ & next_ allows for bidirectional traversal. + */ + class JSON_API ValueInternalLink + { + public: + enum { itemPerLink = 6 }; // sizeof(ValueInternalLink) = 128 on 32 bits architecture. + enum InternalFlags { + flagAvailable = 0, + flagUsed = 1 + }; + + ValueInternalLink(); + + ~ValueInternalLink(); + + Value items_[itemPerLink]; + char *keys_[itemPerLink]; + ValueInternalLink *previous_; + ValueInternalLink *next_; + }; + + + /** \brief A linked page based hash-table implementation used internally by Value. + * \internal ValueInternalMap is a traditional bucket based hash-table, with a linked + * list in each bucket to handle collision. There is an addional twist in that + * each node of the collision linked list is a page containing a fixed amount of + * value. This provides a better compromise between memory usage and speed. + * + * Each bucket is made up of a chained list of ValueInternalLink. The last + * link of a given bucket can be found in the 'previous_' field of the following bucket. + * The last link of the last bucket is stored in tailLink_ as it has no following bucket. + * Only the last link of a bucket may contains 'available' item. The last link always + * contains at least one element unless is it the bucket one very first link. + */ + class JSON_API ValueInternalMap + { + friend class ValueIteratorBase; + friend class Value; + public: + typedef unsigned int HashKey; + typedef unsigned int BucketIndex; + +# ifndef JSONCPP_DOC_EXCLUDE_IMPLEMENTATION + struct IteratorState + { + IteratorState() + : map_(0) + , link_(0) + , itemIndex_(0) + , bucketIndex_(0) + { + } + ValueInternalMap *map_; + ValueInternalLink *link_; + BucketIndex itemIndex_; + BucketIndex bucketIndex_; + }; +# endif // ifndef JSONCPP_DOC_EXCLUDE_IMPLEMENTATION + + ValueInternalMap(); + ValueInternalMap( const ValueInternalMap &other ); + ValueInternalMap &operator =( const ValueInternalMap &other ); + ~ValueInternalMap(); + + void swap( ValueInternalMap &other ); + + BucketIndex size() const; + + void clear(); + + bool reserveDelta( BucketIndex growth ); + + bool reserve( BucketIndex newItemCount ); + + const Value *find( const char *key ) const; + + Value *find( const char *key ); + + Value &resolveReference( const char *key, + bool isStatic ); + + void remove( const char *key ); + + void doActualRemove( ValueInternalLink *link, + BucketIndex index, + BucketIndex bucketIndex ); + + ValueInternalLink *&getLastLinkInBucket( BucketIndex bucketIndex ); + + Value &setNewItem( const char *key, + bool isStatic, + ValueInternalLink *link, + BucketIndex index ); + + Value &unsafeAdd( const char *key, + bool isStatic, + HashKey hashedKey ); + + HashKey hash( const char *key ) const; + + int compare( const ValueInternalMap &other ) const; + + private: + void makeBeginIterator( IteratorState &it ) const; + void makeEndIterator( IteratorState &it ) const; + static bool equals( const IteratorState &x, const IteratorState &other ); + static void increment( IteratorState &iterator ); + static void incrementBucket( IteratorState &iterator ); + static void decrement( IteratorState &iterator ); + static const char *key( const IteratorState &iterator ); + static const char *key( const IteratorState &iterator, bool &isStatic ); + static Value &value( const IteratorState &iterator ); + static int distance( const IteratorState &x, const IteratorState &y ); + + private: + ValueInternalLink *buckets_; + ValueInternalLink *tailLink_; + BucketIndex bucketsSize_; + BucketIndex itemCount_; + }; + + /** \brief A simplified deque implementation used internally by Value. + * \internal + * It is based on a list of fixed "page", each page contains a fixed number of items. + * Instead of using a linked-list, a array of pointer is used for fast item look-up. + * Look-up for an element is as follow: + * - compute page index: pageIndex = itemIndex / itemsPerPage + * - look-up item in page: pages_[pageIndex][itemIndex % itemsPerPage] + * + * Insertion is amortized constant time (only the array containing the index of pointers + * need to be reallocated when items are appended). + */ + class JSON_API ValueInternalArray + { + friend class Value; + friend class ValueIteratorBase; + public: + enum { itemsPerPage = 8 }; // should be a power of 2 for fast divide and modulo. + typedef Value::ArrayIndex ArrayIndex; + typedef unsigned int PageIndex; + +# ifndef JSONCPP_DOC_EXCLUDE_IMPLEMENTATION + struct IteratorState // Must be a POD + { + IteratorState() + : array_(0) + , currentPageIndex_(0) + , currentItemIndex_(0) + { + } + ValueInternalArray *array_; + Value **currentPageIndex_; + unsigned int currentItemIndex_; + }; +# endif // ifndef JSONCPP_DOC_EXCLUDE_IMPLEMENTATION + + ValueInternalArray(); + ValueInternalArray( const ValueInternalArray &other ); + ValueInternalArray &operator =( const ValueInternalArray &other ); + ~ValueInternalArray(); + void swap( ValueInternalArray &other ); + + void clear(); + void resize( ArrayIndex newSize ); + + Value &resolveReference( ArrayIndex index ); + + Value *find( ArrayIndex index ) const; + + ArrayIndex size() const; + + int compare( const ValueInternalArray &other ) const; + + private: + static bool equals( const IteratorState &x, const IteratorState &other ); + static void increment( IteratorState &iterator ); + static void decrement( IteratorState &iterator ); + static Value &dereference( const IteratorState &iterator ); + static Value &unsafeDereference( const IteratorState &iterator ); + static int distance( const IteratorState &x, const IteratorState &y ); + static ArrayIndex indexOf( const IteratorState &iterator ); + void makeBeginIterator( IteratorState &it ) const; + void makeEndIterator( IteratorState &it ) const; + void makeIterator( IteratorState &it, ArrayIndex index ) const; + + void makeIndexValid( ArrayIndex index ); + + Value **pages_; + ArrayIndex size_; + PageIndex pageCount_; + }; + + /** \brief Experimental: do not use. Allocator to customize Value internal array. + * Below is an example of a simple implementation (actual implementation use + * memory pool). + \code +class DefaultValueArrayAllocator : public ValueArrayAllocator +{ +public: // overridden from ValueArrayAllocator + virtual ~DefaultValueArrayAllocator() + { + } + + virtual ValueInternalArray *newArray() + { + return new ValueInternalArray(); + } + + virtual ValueInternalArray *newArrayCopy( const ValueInternalArray &other ) + { + return new ValueInternalArray( other ); + } + + virtual void destruct( ValueInternalArray *array ) + { + delete array; + } + + virtual void reallocateArrayPageIndex( Value **&indexes, + ValueInternalArray::PageIndex &indexCount, + ValueInternalArray::PageIndex minNewIndexCount ) + { + ValueInternalArray::PageIndex newIndexCount = (indexCount*3)/2 + 1; + if ( minNewIndexCount > newIndexCount ) + newIndexCount = minNewIndexCount; + void *newIndexes = realloc( indexes, sizeof(Value*) * newIndexCount ); + if ( !newIndexes ) + throw std::bad_alloc(); + indexCount = newIndexCount; + indexes = static_cast( newIndexes ); + } + virtual void releaseArrayPageIndex( Value **indexes, + ValueInternalArray::PageIndex indexCount ) + { + if ( indexes ) + free( indexes ); + } + + virtual Value *allocateArrayPage() + { + return static_cast( malloc( sizeof(Value) * ValueInternalArray::itemsPerPage ) ); + } + + virtual void releaseArrayPage( Value *value ) + { + if ( value ) + free( value ); + } +}; + \endcode + */ + class JSON_API ValueArrayAllocator + { + public: + virtual ~ValueArrayAllocator(); + virtual ValueInternalArray *newArray() = 0; + virtual ValueInternalArray *newArrayCopy( const ValueInternalArray &other ) = 0; + virtual void destructArray( ValueInternalArray *array ) = 0; + /** \brief Reallocate array page index. + * Reallocates an array of pointer on each page. + * \param indexes [input] pointer on the current index. May be \c NULL. + * [output] pointer on the new index of at least + * \a minNewIndexCount pages. + * \param indexCount [input] current number of pages in the index. + * [output] number of page the reallocated index can handle. + * \b MUST be >= \a minNewIndexCount. + * \param minNewIndexCount Minimum number of page the new index must be able to + * handle. + */ + virtual void reallocateArrayPageIndex( Value **&indexes, + ValueInternalArray::PageIndex &indexCount, + ValueInternalArray::PageIndex minNewIndexCount ) = 0; + virtual void releaseArrayPageIndex( Value **indexes, + ValueInternalArray::PageIndex indexCount ) = 0; + virtual Value *allocateArrayPage() = 0; + virtual void releaseArrayPage( Value *value ) = 0; + }; +#endif // #ifdef JSON_VALUE_USE_INTERNAL_MAP + + + /** \brief base class for Value iterators. + * + */ + class ValueIteratorBase + { + public: + typedef unsigned int size_t; + typedef int difference_type; + typedef ValueIteratorBase SelfType; + + ValueIteratorBase(); +#ifndef JSON_VALUE_USE_INTERNAL_MAP + explicit ValueIteratorBase( const Value::ObjectValues::iterator ¤t ); +#else + ValueIteratorBase( const ValueInternalArray::IteratorState &state ); + ValueIteratorBase( const ValueInternalMap::IteratorState &state ); +#endif + + bool operator ==( const SelfType &other ) const + { + return isEqual( other ); + } + + bool operator !=( const SelfType &other ) const + { + return !isEqual( other ); + } + + difference_type operator -( const SelfType &other ) const + { + return computeDistance( other ); + } + + /// Return either the index or the member name of the referenced value as a Value. + Value key() const; + + /// Return the index of the referenced Value. -1 if it is not an arrayValue. + UInt index() const; + + /// Return the member name of the referenced Value. "" if it is not an objectValue. + const char *memberName() const; + + protected: + Value &deref() const; + + void increment(); + + void decrement(); + + difference_type computeDistance( const SelfType &other ) const; + + bool isEqual( const SelfType &other ) const; + + void copy( const SelfType &other ); + + private: +#ifndef JSON_VALUE_USE_INTERNAL_MAP + Value::ObjectValues::iterator current_; + // Indicates that iterator is for a null value. + bool isNull_; +#else + union + { + ValueInternalArray::IteratorState array_; + ValueInternalMap::IteratorState map_; + } iterator_; + bool isArray_; +#endif + }; + + /** \brief const iterator for object and array value. + * + */ + class ValueConstIterator : public ValueIteratorBase + { + friend class Value; + public: + typedef unsigned int size_t; + typedef int difference_type; + typedef const Value &reference; + typedef const Value *pointer; + typedef ValueConstIterator SelfType; + + ValueConstIterator(); + private: + /*! \internal Use by Value to create an iterator. + */ +#ifndef JSON_VALUE_USE_INTERNAL_MAP + explicit ValueConstIterator( const Value::ObjectValues::iterator ¤t ); +#else + ValueConstIterator( const ValueInternalArray::IteratorState &state ); + ValueConstIterator( const ValueInternalMap::IteratorState &state ); +#endif + public: + SelfType &operator =( const ValueIteratorBase &other ); + + SelfType operator++( int ) + { + SelfType temp( *this ); + ++*this; + return temp; + } + + SelfType operator--( int ) + { + SelfType temp( *this ); + --*this; + return temp; + } + + SelfType &operator--() + { + decrement(); + return *this; + } + + SelfType &operator++() + { + increment(); + return *this; + } + + reference operator *() const + { + return deref(); + } + }; + + + /** \brief Iterator for object and array value. + */ + class ValueIterator : public ValueIteratorBase + { + friend class Value; + public: + typedef unsigned int size_t; + typedef int difference_type; + typedef Value &reference; + typedef Value *pointer; + typedef ValueIterator SelfType; + + ValueIterator(); + ValueIterator( const ValueConstIterator &other ); + ValueIterator( const ValueIterator &other ); + private: + /*! \internal Use by Value to create an iterator. + */ +#ifndef JSON_VALUE_USE_INTERNAL_MAP + explicit ValueIterator( const Value::ObjectValues::iterator ¤t ); +#else + ValueIterator( const ValueInternalArray::IteratorState &state ); + ValueIterator( const ValueInternalMap::IteratorState &state ); +#endif + public: + + SelfType &operator =( const SelfType &other ); + + SelfType operator++( int ) + { + SelfType temp( *this ); + ++*this; + return temp; + } + + SelfType operator--( int ) + { + SelfType temp( *this ); + --*this; + return temp; + } + + SelfType &operator--() + { + decrement(); + return *this; + } + + SelfType &operator++() + { + increment(); + return *this; + } + + reference operator *() const + { + return deref(); + } + }; + + +} // namespace Json + + +#endif // CPPTL_JSON_H_INCLUDED diff --git a/cordova-lib/spec-plugman-create/plugins/cordova.echo/src/blackberry10/native/public/json/writer.h b/cordova-lib/spec-plugman-create/plugins/cordova.echo/src/blackberry10/native/public/json/writer.h new file mode 100644 index 000000000..16cf022b2 --- /dev/null +++ b/cordova-lib/spec-plugman-create/plugins/cordova.echo/src/blackberry10/native/public/json/writer.h @@ -0,0 +1,174 @@ +#ifndef JSON_WRITER_H_INCLUDED +# define JSON_WRITER_H_INCLUDED + +# include "value.h" +# include +# include +# include + +namespace Json { + + class Value; + + /** \brief Abstract class for writers. + */ + class JSON_API Writer + { + public: + virtual ~Writer(); + + virtual std::string write( const Value &root ) = 0; + }; + + /** \brief Outputs a Value in JSON format without formatting (not human friendly). + * + * The JSON document is written in a single line. It is not intended for 'human' consumption, + * but may be useful to support feature such as RPC where bandwidth is limited. + * \sa Reader, Value + */ + class JSON_API FastWriter : public Writer + { + public: + FastWriter(); + virtual ~FastWriter(){} + + void enableYAMLCompatibility(); + + public: // overridden from Writer + virtual std::string write( const Value &root ); + + private: + void writeValue( const Value &value ); + + std::string document_; + bool yamlCompatibilityEnabled_; + }; + + /** \brief Writes a Value in JSON format in a human friendly way. + * + * The rules for line break and indent are as follow: + * - Object value: + * - if empty then print {} without indent and line break + * - if not empty the print '{', line break & indent, print one value per line + * and then unindent and line break and print '}'. + * - Array value: + * - if empty then print [] without indent and line break + * - if the array contains no object value, empty array or some other value types, + * and all the values fit on one lines, then print the array on a single line. + * - otherwise, it the values do not fit on one line, or the array contains + * object or non empty array, then print one value per line. + * + * If the Value have comments then they are outputed according to their #CommentPlacement. + * + * \sa Reader, Value, Value::setComment() + */ + class JSON_API StyledWriter: public Writer + { + public: + StyledWriter(); + virtual ~StyledWriter(){} + + public: // overridden from Writer + /** \brief Serialize a Value in JSON format. + * \param root Value to serialize. + * \return String containing the JSON document that represents the root value. + */ + virtual std::string write( const Value &root ); + + private: + void writeValue( const Value &value ); + void writeArrayValue( const Value &value ); + bool isMultineArray( const Value &value ); + void pushValue( const std::string &value ); + void writeIndent(); + void writeWithIndent( const std::string &value ); + void indent(); + void unindent(); + void writeCommentBeforeValue( const Value &root ); + void writeCommentAfterValueOnSameLine( const Value &root ); + bool hasCommentForValue( const Value &value ); + static std::string normalizeEOL( const std::string &text ); + + typedef std::vector ChildValues; + + ChildValues childValues_; + std::string document_; + std::string indentString_; + int rightMargin_; + int indentSize_; + bool addChildValues_; + }; + + /** \brief Writes a Value in JSON format in a human friendly way, + to a stream rather than to a string. + * + * The rules for line break and indent are as follow: + * - Object value: + * - if empty then print {} without indent and line break + * - if not empty the print '{', line break & indent, print one value per line + * and then unindent and line break and print '}'. + * - Array value: + * - if empty then print [] without indent and line break + * - if the array contains no object value, empty array or some other value types, + * and all the values fit on one lines, then print the array on a single line. + * - otherwise, it the values do not fit on one line, or the array contains + * object or non empty array, then print one value per line. + * + * If the Value have comments then they are outputed according to their #CommentPlacement. + * + * \param indentation Each level will be indented by this amount extra. + * \sa Reader, Value, Value::setComment() + */ + class JSON_API StyledStreamWriter + { + public: + StyledStreamWriter( std::string indentation="\t" ); + ~StyledStreamWriter(){} + + public: + /** \brief Serialize a Value in JSON format. + * \param out Stream to write to. (Can be ostringstream, e.g.) + * \param root Value to serialize. + * \note There is no point in deriving from Writer, since write() should not return a value. + */ + void write( std::ostream &out, const Value &root ); + + private: + void writeValue( const Value &value ); + void writeArrayValue( const Value &value ); + bool isMultineArray( const Value &value ); + void pushValue( const std::string &value ); + void writeIndent(); + void writeWithIndent( const std::string &value ); + void indent(); + void unindent(); + void writeCommentBeforeValue( const Value &root ); + void writeCommentAfterValueOnSameLine( const Value &root ); + bool hasCommentForValue( const Value &value ); + static std::string normalizeEOL( const std::string &text ); + + typedef std::vector ChildValues; + + ChildValues childValues_; + std::ostream* document_; + std::string indentString_; + int rightMargin_; + std::string indentation_; + bool addChildValues_; + }; + + std::string JSON_API valueToString( Int value ); + std::string JSON_API valueToString( UInt value ); + std::string JSON_API valueToString( double value ); + std::string JSON_API valueToString( bool value ); + std::string JSON_API valueToQuotedString( const char *value ); + + /// \brief Output using the StyledStreamWriter. + /// \see Json::operator>>() + std::ostream& operator<<( std::ostream&, const Value &root ); + +} // namespace Json + + + +#endif // JSON_WRITER_H_INCLUDED diff --git a/cordova-lib/spec-plugman-create/plugins/cordova.echo/src/blackberry10/native/public/json_batchallocator.h b/cordova-lib/spec-plugman-create/plugins/cordova.echo/src/blackberry10/native/public/json_batchallocator.h new file mode 100644 index 000000000..141ca77a2 --- /dev/null +++ b/cordova-lib/spec-plugman-create/plugins/cordova.echo/src/blackberry10/native/public/json_batchallocator.h @@ -0,0 +1,125 @@ +#ifndef JSONCPP_BATCHALLOCATOR_H_INCLUDED +# define JSONCPP_BATCHALLOCATOR_H_INCLUDED + +# include +# include + +# ifndef JSONCPP_DOC_EXCLUDE_IMPLEMENTATION + +namespace Json { + +/* Fast memory allocator. + * + * This memory allocator allocates memory for a batch of object (specified by + * the page size, the number of object in each page). + * + * It does not allow the destruction of a single object. All the allocated objects + * can be destroyed at once. The memory can be either released or reused for future + * allocation. + * + * The in-place new operator must be used to construct the object using the pointer + * returned by allocate. + */ +template +class BatchAllocator +{ +public: + typedef AllocatedType Type; + + BatchAllocator( unsigned int objectsPerPage = 255 ) + : freeHead_( 0 ) + , objectsPerPage_( objectsPerPage ) + { +// printf( "Size: %d => %s\n", sizeof(AllocatedType), typeid(AllocatedType).name() ); + assert( sizeof(AllocatedType) * objectPerAllocation >= sizeof(AllocatedType *) ); // We must be able to store a slist in the object free space. + assert( objectsPerPage >= 16 ); + batches_ = allocateBatch( 0 ); // allocated a dummy page + currentBatch_ = batches_; + } + + ~BatchAllocator() + { + for ( BatchInfo *batch = batches_; batch; ) + { + BatchInfo *nextBatch = batch->next_; + free( batch ); + batch = nextBatch; + } + } + + /// allocate space for an array of objectPerAllocation object. + /// @warning it is the responsibility of the caller to call objects constructors. + AllocatedType *allocate() + { + if ( freeHead_ ) // returns node from free list. + { + AllocatedType *object = freeHead_; + freeHead_ = *(AllocatedType **)object; + return object; + } + if ( currentBatch_->used_ == currentBatch_->end_ ) + { + currentBatch_ = currentBatch_->next_; + while ( currentBatch_ && currentBatch_->used_ == currentBatch_->end_ ) + currentBatch_ = currentBatch_->next_; + + if ( !currentBatch_ ) // no free batch found, allocate a new one + { + currentBatch_ = allocateBatch( objectsPerPage_ ); + currentBatch_->next_ = batches_; // insert at the head of the list + batches_ = currentBatch_; + } + } + AllocatedType *allocated = currentBatch_->used_; + currentBatch_->used_ += objectPerAllocation; + return allocated; + } + + /// Release the object. + /// @warning it is the responsibility of the caller to actually destruct the object. + void release( AllocatedType *object ) + { + assert( object != 0 ); + *(AllocatedType **)object = freeHead_; + freeHead_ = object; + } + +private: + struct BatchInfo + { + BatchInfo *next_; + AllocatedType *used_; + AllocatedType *end_; + AllocatedType buffer_[objectPerAllocation]; + }; + + // disabled copy constructor and assignment operator. + BatchAllocator( const BatchAllocator & ); + void operator =( const BatchAllocator &); + + static BatchInfo *allocateBatch( unsigned int objectsPerPage ) + { + const unsigned int mallocSize = sizeof(BatchInfo) - sizeof(AllocatedType)* objectPerAllocation + + sizeof(AllocatedType) * objectPerAllocation * objectsPerPage; + BatchInfo *batch = static_cast( malloc( mallocSize ) ); + batch->next_ = 0; + batch->used_ = batch->buffer_; + batch->end_ = batch->buffer_ + objectsPerPage; + return batch; + } + + BatchInfo *batches_; + BatchInfo *currentBatch_; + /// Head of a single linked list within the allocated space of freed object + AllocatedType *freeHead_; + unsigned int objectsPerPage_; +}; + + +} // namespace Json + +# endif // ifndef JSONCPP_DOC_INCLUDE_IMPLEMENTATION + +#endif // JSONCPP_BATCHALLOCATOR_H_INCLUDED + diff --git a/cordova-lib/spec-plugman-create/plugins/cordova.echo/src/blackberry10/native/public/json_internalarray.inl b/cordova-lib/spec-plugman-create/plugins/cordova.echo/src/blackberry10/native/public/json_internalarray.inl new file mode 100644 index 000000000..9b985d258 --- /dev/null +++ b/cordova-lib/spec-plugman-create/plugins/cordova.echo/src/blackberry10/native/public/json_internalarray.inl @@ -0,0 +1,448 @@ +// included by json_value.cpp +// everything is within Json namespace + +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// class ValueInternalArray +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// + +ValueArrayAllocator::~ValueArrayAllocator() +{ +} + +// ////////////////////////////////////////////////////////////////// +// class DefaultValueArrayAllocator +// ////////////////////////////////////////////////////////////////// +#ifdef JSON_USE_SIMPLE_INTERNAL_ALLOCATOR +class DefaultValueArrayAllocator : public ValueArrayAllocator +{ +public: // overridden from ValueArrayAllocator + virtual ~DefaultValueArrayAllocator() + { + } + + virtual ValueInternalArray *newArray() + { + return new ValueInternalArray(); + } + + virtual ValueInternalArray *newArrayCopy( const ValueInternalArray &other ) + { + return new ValueInternalArray( other ); + } + + virtual void destructArray( ValueInternalArray *array ) + { + delete array; + } + + virtual void reallocateArrayPageIndex( Value **&indexes, + ValueInternalArray::PageIndex &indexCount, + ValueInternalArray::PageIndex minNewIndexCount ) + { + ValueInternalArray::PageIndex newIndexCount = (indexCount*3)/2 + 1; + if ( minNewIndexCount > newIndexCount ) + newIndexCount = minNewIndexCount; + void *newIndexes = realloc( indexes, sizeof(Value*) * newIndexCount ); + if ( !newIndexes ) + throw std::bad_alloc(); + indexCount = newIndexCount; + indexes = static_cast( newIndexes ); + } + virtual void releaseArrayPageIndex( Value **indexes, + ValueInternalArray::PageIndex indexCount ) + { + if ( indexes ) + free( indexes ); + } + + virtual Value *allocateArrayPage() + { + return static_cast( malloc( sizeof(Value) * ValueInternalArray::itemsPerPage ) ); + } + + virtual void releaseArrayPage( Value *value ) + { + if ( value ) + free( value ); + } +}; + +#else // #ifdef JSON_USE_SIMPLE_INTERNAL_ALLOCATOR +/// @todo make this thread-safe (lock when accessign batch allocator) +class DefaultValueArrayAllocator : public ValueArrayAllocator +{ +public: // overridden from ValueArrayAllocator + virtual ~DefaultValueArrayAllocator() + { + } + + virtual ValueInternalArray *newArray() + { + ValueInternalArray *array = arraysAllocator_.allocate(); + new (array) ValueInternalArray(); // placement new + return array; + } + + virtual ValueInternalArray *newArrayCopy( const ValueInternalArray &other ) + { + ValueInternalArray *array = arraysAllocator_.allocate(); + new (array) ValueInternalArray( other ); // placement new + return array; + } + + virtual void destructArray( ValueInternalArray *array ) + { + if ( array ) + { + array->~ValueInternalArray(); + arraysAllocator_.release( array ); + } + } + + virtual void reallocateArrayPageIndex( Value **&indexes, + ValueInternalArray::PageIndex &indexCount, + ValueInternalArray::PageIndex minNewIndexCount ) + { + ValueInternalArray::PageIndex newIndexCount = (indexCount*3)/2 + 1; + if ( minNewIndexCount > newIndexCount ) + newIndexCount = minNewIndexCount; + void *newIndexes = realloc( indexes, sizeof(Value*) * newIndexCount ); + if ( !newIndexes ) + throw std::bad_alloc(); + indexCount = newIndexCount; + indexes = static_cast( newIndexes ); + } + virtual void releaseArrayPageIndex( Value **indexes, + ValueInternalArray::PageIndex indexCount ) + { + if ( indexes ) + free( indexes ); + } + + virtual Value *allocateArrayPage() + { + return static_cast( pagesAllocator_.allocate() ); + } + + virtual void releaseArrayPage( Value *value ) + { + if ( value ) + pagesAllocator_.release( value ); + } +private: + BatchAllocator arraysAllocator_; + BatchAllocator pagesAllocator_; +}; +#endif // #ifdef JSON_USE_SIMPLE_INTERNAL_ALLOCATOR + +static ValueArrayAllocator *&arrayAllocator() +{ + static DefaultValueArrayAllocator defaultAllocator; + static ValueArrayAllocator *arrayAllocator = &defaultAllocator; + return arrayAllocator; +} + +static struct DummyArrayAllocatorInitializer { + DummyArrayAllocatorInitializer() + { + arrayAllocator(); // ensure arrayAllocator() statics are initialized before main(). + } +} dummyArrayAllocatorInitializer; + +// ////////////////////////////////////////////////////////////////// +// class ValueInternalArray +// ////////////////////////////////////////////////////////////////// +bool +ValueInternalArray::equals( const IteratorState &x, + const IteratorState &other ) +{ + return x.array_ == other.array_ + && x.currentItemIndex_ == other.currentItemIndex_ + && x.currentPageIndex_ == other.currentPageIndex_; +} + + +void +ValueInternalArray::increment( IteratorState &it ) +{ + JSON_ASSERT_MESSAGE( it.array_ && + (it.currentPageIndex_ - it.array_->pages_)*itemsPerPage + it.currentItemIndex_ + != it.array_->size_, + "ValueInternalArray::increment(): moving iterator beyond end" ); + ++(it.currentItemIndex_); + if ( it.currentItemIndex_ == itemsPerPage ) + { + it.currentItemIndex_ = 0; + ++(it.currentPageIndex_); + } +} + + +void +ValueInternalArray::decrement( IteratorState &it ) +{ + JSON_ASSERT_MESSAGE( it.array_ && it.currentPageIndex_ == it.array_->pages_ + && it.currentItemIndex_ == 0, + "ValueInternalArray::decrement(): moving iterator beyond end" ); + if ( it.currentItemIndex_ == 0 ) + { + it.currentItemIndex_ = itemsPerPage-1; + --(it.currentPageIndex_); + } + else + { + --(it.currentItemIndex_); + } +} + + +Value & +ValueInternalArray::unsafeDereference( const IteratorState &it ) +{ + return (*(it.currentPageIndex_))[it.currentItemIndex_]; +} + + +Value & +ValueInternalArray::dereference( const IteratorState &it ) +{ + JSON_ASSERT_MESSAGE( it.array_ && + (it.currentPageIndex_ - it.array_->pages_)*itemsPerPage + it.currentItemIndex_ + < it.array_->size_, + "ValueInternalArray::dereference(): dereferencing invalid iterator" ); + return unsafeDereference( it ); +} + +void +ValueInternalArray::makeBeginIterator( IteratorState &it ) const +{ + it.array_ = const_cast( this ); + it.currentItemIndex_ = 0; + it.currentPageIndex_ = pages_; +} + + +void +ValueInternalArray::makeIterator( IteratorState &it, ArrayIndex index ) const +{ + it.array_ = const_cast( this ); + it.currentItemIndex_ = index % itemsPerPage; + it.currentPageIndex_ = pages_ + index / itemsPerPage; +} + + +void +ValueInternalArray::makeEndIterator( IteratorState &it ) const +{ + makeIterator( it, size_ ); +} + + +ValueInternalArray::ValueInternalArray() + : pages_( 0 ) + , size_( 0 ) + , pageCount_( 0 ) +{ +} + + +ValueInternalArray::ValueInternalArray( const ValueInternalArray &other ) + : pages_( 0 ) + , pageCount_( 0 ) + , size_( other.size_ ) +{ + PageIndex minNewPages = other.size_ / itemsPerPage; + arrayAllocator()->reallocateArrayPageIndex( pages_, pageCount_, minNewPages ); + JSON_ASSERT_MESSAGE( pageCount_ >= minNewPages, + "ValueInternalArray::reserve(): bad reallocation" ); + IteratorState itOther; + other.makeBeginIterator( itOther ); + Value *value; + for ( ArrayIndex index = 0; index < size_; ++index, increment(itOther) ) + { + if ( index % itemsPerPage == 0 ) + { + PageIndex pageIndex = index / itemsPerPage; + value = arrayAllocator()->allocateArrayPage(); + pages_[pageIndex] = value; + } + new (value) Value( dereference( itOther ) ); + } +} + + +ValueInternalArray & +ValueInternalArray::operator =( const ValueInternalArray &other ) +{ + ValueInternalArray temp( other ); + swap( temp ); + return *this; +} + + +ValueInternalArray::~ValueInternalArray() +{ + // destroy all constructed items + IteratorState it; + IteratorState itEnd; + makeBeginIterator( it); + makeEndIterator( itEnd ); + for ( ; !equals(it,itEnd); increment(it) ) + { + Value *value = &dereference(it); + value->~Value(); + } + // release all pages + PageIndex lastPageIndex = size_ / itemsPerPage; + for ( PageIndex pageIndex = 0; pageIndex < lastPageIndex; ++pageIndex ) + arrayAllocator()->releaseArrayPage( pages_[pageIndex] ); + // release pages index + arrayAllocator()->releaseArrayPageIndex( pages_, pageCount_ ); +} + + +void +ValueInternalArray::swap( ValueInternalArray &other ) +{ + Value **tempPages = pages_; + pages_ = other.pages_; + other.pages_ = tempPages; + ArrayIndex tempSize = size_; + size_ = other.size_; + other.size_ = tempSize; + PageIndex tempPageCount = pageCount_; + pageCount_ = other.pageCount_; + other.pageCount_ = tempPageCount; +} + +void +ValueInternalArray::clear() +{ + ValueInternalArray dummy; + swap( dummy ); +} + + +void +ValueInternalArray::resize( ArrayIndex newSize ) +{ + if ( newSize == 0 ) + clear(); + else if ( newSize < size_ ) + { + IteratorState it; + IteratorState itEnd; + makeIterator( it, newSize ); + makeIterator( itEnd, size_ ); + for ( ; !equals(it,itEnd); increment(it) ) + { + Value *value = &dereference(it); + value->~Value(); + } + PageIndex pageIndex = (newSize + itemsPerPage - 1) / itemsPerPage; + PageIndex lastPageIndex = size_ / itemsPerPage; + for ( ; pageIndex < lastPageIndex; ++pageIndex ) + arrayAllocator()->releaseArrayPage( pages_[pageIndex] ); + size_ = newSize; + } + else if ( newSize > size_ ) + resolveReference( newSize ); +} + + +void +ValueInternalArray::makeIndexValid( ArrayIndex index ) +{ + // Need to enlarge page index ? + if ( index >= pageCount_ * itemsPerPage ) + { + PageIndex minNewPages = (index + 1) / itemsPerPage; + arrayAllocator()->reallocateArrayPageIndex( pages_, pageCount_, minNewPages ); + JSON_ASSERT_MESSAGE( pageCount_ >= minNewPages, "ValueInternalArray::reserve(): bad reallocation" ); + } + + // Need to allocate new pages ? + ArrayIndex nextPageIndex = + (size_ % itemsPerPage) != 0 ? size_ - (size_%itemsPerPage) + itemsPerPage + : size_; + if ( nextPageIndex <= index ) + { + PageIndex pageIndex = nextPageIndex / itemsPerPage; + PageIndex pageToAllocate = (index - nextPageIndex) / itemsPerPage + 1; + for ( ; pageToAllocate-- > 0; ++pageIndex ) + pages_[pageIndex] = arrayAllocator()->allocateArrayPage(); + } + + // Initialize all new entries + IteratorState it; + IteratorState itEnd; + makeIterator( it, size_ ); + size_ = index + 1; + makeIterator( itEnd, size_ ); + for ( ; !equals(it,itEnd); increment(it) ) + { + Value *value = &dereference(it); + new (value) Value(); // Construct a default value using placement new + } +} + +Value & +ValueInternalArray::resolveReference( ArrayIndex index ) +{ + if ( index >= size_ ) + makeIndexValid( index ); + return pages_[index/itemsPerPage][index%itemsPerPage]; +} + +Value * +ValueInternalArray::find( ArrayIndex index ) const +{ + if ( index >= size_ ) + return 0; + return &(pages_[index/itemsPerPage][index%itemsPerPage]); +} + +ValueInternalArray::ArrayIndex +ValueInternalArray::size() const +{ + return size_; +} + +int +ValueInternalArray::distance( const IteratorState &x, const IteratorState &y ) +{ + return indexOf(y) - indexOf(x); +} + + +ValueInternalArray::ArrayIndex +ValueInternalArray::indexOf( const IteratorState &iterator ) +{ + if ( !iterator.array_ ) + return ArrayIndex(-1); + return ArrayIndex( + (iterator.currentPageIndex_ - iterator.array_->pages_) * itemsPerPage + + iterator.currentItemIndex_ ); +} + + +int +ValueInternalArray::compare( const ValueInternalArray &other ) const +{ + int sizeDiff( size_ - other.size_ ); + if ( sizeDiff != 0 ) + return sizeDiff; + + for ( ArrayIndex index =0; index < size_; ++index ) + { + int diff = pages_[index/itemsPerPage][index%itemsPerPage].compare( + other.pages_[index/itemsPerPage][index%itemsPerPage] ); + if ( diff != 0 ) + return diff; + } + return 0; +} diff --git a/cordova-lib/spec-plugman-create/plugins/cordova.echo/src/blackberry10/native/public/json_internalmap.inl b/cordova-lib/spec-plugman-create/plugins/cordova.echo/src/blackberry10/native/public/json_internalmap.inl new file mode 100644 index 000000000..ef37991c8 --- /dev/null +++ b/cordova-lib/spec-plugman-create/plugins/cordova.echo/src/blackberry10/native/public/json_internalmap.inl @@ -0,0 +1,607 @@ +// included by json_value.cpp +// everything is within Json namespace + +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// class ValueInternalMap +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// + +/** \internal MUST be safely initialized using memset( this, 0, sizeof(ValueInternalLink) ); + * This optimization is used by the fast allocator. + */ +ValueInternalLink::ValueInternalLink() + : previous_( 0 ) + , next_( 0 ) +{ +} + +ValueInternalLink::~ValueInternalLink() +{ + for ( int index =0; index < itemPerLink; ++index ) + { + if ( !items_[index].isItemAvailable() ) + { + if ( !items_[index].isMemberNameStatic() ) + free( keys_[index] ); + } + else + break; + } +} + + + +ValueMapAllocator::~ValueMapAllocator() +{ +} + +#ifdef JSON_USE_SIMPLE_INTERNAL_ALLOCATOR +class DefaultValueMapAllocator : public ValueMapAllocator +{ +public: // overridden from ValueMapAllocator + virtual ValueInternalMap *newMap() + { + return new ValueInternalMap(); + } + + virtual ValueInternalMap *newMapCopy( const ValueInternalMap &other ) + { + return new ValueInternalMap( other ); + } + + virtual void destructMap( ValueInternalMap *map ) + { + delete map; + } + + virtual ValueInternalLink *allocateMapBuckets( unsigned int size ) + { + return new ValueInternalLink[size]; + } + + virtual void releaseMapBuckets( ValueInternalLink *links ) + { + delete [] links; + } + + virtual ValueInternalLink *allocateMapLink() + { + return new ValueInternalLink(); + } + + virtual void releaseMapLink( ValueInternalLink *link ) + { + delete link; + } +}; +#else +/// @todo make this thread-safe (lock when accessign batch allocator) +class DefaultValueMapAllocator : public ValueMapAllocator +{ +public: // overridden from ValueMapAllocator + virtual ValueInternalMap *newMap() + { + ValueInternalMap *map = mapsAllocator_.allocate(); + new (map) ValueInternalMap(); // placement new + return map; + } + + virtual ValueInternalMap *newMapCopy( const ValueInternalMap &other ) + { + ValueInternalMap *map = mapsAllocator_.allocate(); + new (map) ValueInternalMap( other ); // placement new + return map; + } + + virtual void destructMap( ValueInternalMap *map ) + { + if ( map ) + { + map->~ValueInternalMap(); + mapsAllocator_.release( map ); + } + } + + virtual ValueInternalLink *allocateMapBuckets( unsigned int size ) + { + return new ValueInternalLink[size]; + } + + virtual void releaseMapBuckets( ValueInternalLink *links ) + { + delete [] links; + } + + virtual ValueInternalLink *allocateMapLink() + { + ValueInternalLink *link = linksAllocator_.allocate(); + memset( link, 0, sizeof(ValueInternalLink) ); + return link; + } + + virtual void releaseMapLink( ValueInternalLink *link ) + { + link->~ValueInternalLink(); + linksAllocator_.release( link ); + } +private: + BatchAllocator mapsAllocator_; + BatchAllocator linksAllocator_; +}; +#endif + +static ValueMapAllocator *&mapAllocator() +{ + static DefaultValueMapAllocator defaultAllocator; + static ValueMapAllocator *mapAllocator = &defaultAllocator; + return mapAllocator; +} + +static struct DummyMapAllocatorInitializer { + DummyMapAllocatorInitializer() + { + mapAllocator(); // ensure mapAllocator() statics are initialized before main(). + } +} dummyMapAllocatorInitializer; + + + +// h(K) = value * K >> w ; with w = 32 & K prime w.r.t. 2^32. + +/* +use linked list hash map. +buckets array is a container. +linked list element contains 6 key/values. (memory = (16+4) * 6 + 4 = 124) +value have extra state: valid, available, deleted +*/ + + +ValueInternalMap::ValueInternalMap() + : buckets_( 0 ) + , tailLink_( 0 ) + , bucketsSize_( 0 ) + , itemCount_( 0 ) +{ +} + + +ValueInternalMap::ValueInternalMap( const ValueInternalMap &other ) + : buckets_( 0 ) + , tailLink_( 0 ) + , bucketsSize_( 0 ) + , itemCount_( 0 ) +{ + reserve( other.itemCount_ ); + IteratorState it; + IteratorState itEnd; + other.makeBeginIterator( it ); + other.makeEndIterator( itEnd ); + for ( ; !equals(it,itEnd); increment(it) ) + { + bool isStatic; + const char *memberName = key( it, isStatic ); + const Value &aValue = value( it ); + resolveReference(memberName, isStatic) = aValue; + } +} + + +ValueInternalMap & +ValueInternalMap::operator =( const ValueInternalMap &other ) +{ + ValueInternalMap dummy( other ); + swap( dummy ); + return *this; +} + + +ValueInternalMap::~ValueInternalMap() +{ + if ( buckets_ ) + { + for ( BucketIndex bucketIndex =0; bucketIndex < bucketsSize_; ++bucketIndex ) + { + ValueInternalLink *link = buckets_[bucketIndex].next_; + while ( link ) + { + ValueInternalLink *linkToRelease = link; + link = link->next_; + mapAllocator()->releaseMapLink( linkToRelease ); + } + } + mapAllocator()->releaseMapBuckets( buckets_ ); + } +} + + +void +ValueInternalMap::swap( ValueInternalMap &other ) +{ + ValueInternalLink *tempBuckets = buckets_; + buckets_ = other.buckets_; + other.buckets_ = tempBuckets; + ValueInternalLink *tempTailLink = tailLink_; + tailLink_ = other.tailLink_; + other.tailLink_ = tempTailLink; + BucketIndex tempBucketsSize = bucketsSize_; + bucketsSize_ = other.bucketsSize_; + other.bucketsSize_ = tempBucketsSize; + BucketIndex tempItemCount = itemCount_; + itemCount_ = other.itemCount_; + other.itemCount_ = tempItemCount; +} + + +void +ValueInternalMap::clear() +{ + ValueInternalMap dummy; + swap( dummy ); +} + + +ValueInternalMap::BucketIndex +ValueInternalMap::size() const +{ + return itemCount_; +} + +bool +ValueInternalMap::reserveDelta( BucketIndex growth ) +{ + return reserve( itemCount_ + growth ); +} + +bool +ValueInternalMap::reserve( BucketIndex newItemCount ) +{ + if ( !buckets_ && newItemCount > 0 ) + { + buckets_ = mapAllocator()->allocateMapBuckets( 1 ); + bucketsSize_ = 1; + tailLink_ = &buckets_[0]; + } +// BucketIndex idealBucketCount = (newItemCount + ValueInternalLink::itemPerLink) / ValueInternalLink::itemPerLink; + return true; +} + + +const Value * +ValueInternalMap::find( const char *key ) const +{ + if ( !bucketsSize_ ) + return 0; + HashKey hashedKey = hash( key ); + BucketIndex bucketIndex = hashedKey % bucketsSize_; + for ( const ValueInternalLink *current = &buckets_[bucketIndex]; + current != 0; + current = current->next_ ) + { + for ( BucketIndex index=0; index < ValueInternalLink::itemPerLink; ++index ) + { + if ( current->items_[index].isItemAvailable() ) + return 0; + if ( strcmp( key, current->keys_[index] ) == 0 ) + return ¤t->items_[index]; + } + } + return 0; +} + + +Value * +ValueInternalMap::find( const char *key ) +{ + const ValueInternalMap *constThis = this; + return const_cast( constThis->find( key ) ); +} + + +Value & +ValueInternalMap::resolveReference( const char *key, + bool isStatic ) +{ + HashKey hashedKey = hash( key ); + if ( bucketsSize_ ) + { + BucketIndex bucketIndex = hashedKey % bucketsSize_; + ValueInternalLink **previous = 0; + BucketIndex index; + for ( ValueInternalLink *current = &buckets_[bucketIndex]; + current != 0; + previous = ¤t->next_, current = current->next_ ) + { + for ( index=0; index < ValueInternalLink::itemPerLink; ++index ) + { + if ( current->items_[index].isItemAvailable() ) + return setNewItem( key, isStatic, current, index ); + if ( strcmp( key, current->keys_[index] ) == 0 ) + return current->items_[index]; + } + } + } + + reserveDelta( 1 ); + return unsafeAdd( key, isStatic, hashedKey ); +} + + +void +ValueInternalMap::remove( const char *key ) +{ + HashKey hashedKey = hash( key ); + if ( !bucketsSize_ ) + return; + BucketIndex bucketIndex = hashedKey % bucketsSize_; + for ( ValueInternalLink *link = &buckets_[bucketIndex]; + link != 0; + link = link->next_ ) + { + BucketIndex index; + for ( index =0; index < ValueInternalLink::itemPerLink; ++index ) + { + if ( link->items_[index].isItemAvailable() ) + return; + if ( strcmp( key, link->keys_[index] ) == 0 ) + { + doActualRemove( link, index, bucketIndex ); + return; + } + } + } +} + +void +ValueInternalMap::doActualRemove( ValueInternalLink *link, + BucketIndex index, + BucketIndex bucketIndex ) +{ + // find last item of the bucket and swap it with the 'removed' one. + // set removed items flags to 'available'. + // if last page only contains 'available' items, then deallocate it (it's empty) + ValueInternalLink *&lastLink = getLastLinkInBucket( index ); + BucketIndex lastItemIndex = 1; // a link can never be empty, so start at 1 + for ( ; + lastItemIndex < ValueInternalLink::itemPerLink; + ++lastItemIndex ) // may be optimized with dicotomic search + { + if ( lastLink->items_[lastItemIndex].isItemAvailable() ) + break; + } + + BucketIndex lastUsedIndex = lastItemIndex - 1; + Value *valueToDelete = &link->items_[index]; + Value *valueToPreserve = &lastLink->items_[lastUsedIndex]; + if ( valueToDelete != valueToPreserve ) + valueToDelete->swap( *valueToPreserve ); + if ( lastUsedIndex == 0 ) // page is now empty + { // remove it from bucket linked list and delete it. + ValueInternalLink *linkPreviousToLast = lastLink->previous_; + if ( linkPreviousToLast != 0 ) // can not deleted bucket link. + { + mapAllocator()->releaseMapLink( lastLink ); + linkPreviousToLast->next_ = 0; + lastLink = linkPreviousToLast; + } + } + else + { + Value dummy; + valueToPreserve->swap( dummy ); // restore deleted to default Value. + valueToPreserve->setItemUsed( false ); + } + --itemCount_; +} + + +ValueInternalLink *& +ValueInternalMap::getLastLinkInBucket( BucketIndex bucketIndex ) +{ + if ( bucketIndex == bucketsSize_ - 1 ) + return tailLink_; + ValueInternalLink *&previous = buckets_[bucketIndex+1].previous_; + if ( !previous ) + previous = &buckets_[bucketIndex]; + return previous; +} + + +Value & +ValueInternalMap::setNewItem( const char *key, + bool isStatic, + ValueInternalLink *link, + BucketIndex index ) +{ + char *duplicatedKey = valueAllocator()->makeMemberName( key ); + ++itemCount_; + link->keys_[index] = duplicatedKey; + link->items_[index].setItemUsed(); + link->items_[index].setMemberNameIsStatic( isStatic ); + return link->items_[index]; // items already default constructed. +} + + +Value & +ValueInternalMap::unsafeAdd( const char *key, + bool isStatic, + HashKey hashedKey ) +{ + JSON_ASSERT_MESSAGE( bucketsSize_ > 0, "ValueInternalMap::unsafeAdd(): internal logic error." ); + BucketIndex bucketIndex = hashedKey % bucketsSize_; + ValueInternalLink *&previousLink = getLastLinkInBucket( bucketIndex ); + ValueInternalLink *link = previousLink; + BucketIndex index; + for ( index =0; index < ValueInternalLink::itemPerLink; ++index ) + { + if ( link->items_[index].isItemAvailable() ) + break; + } + if ( index == ValueInternalLink::itemPerLink ) // need to add a new page + { + ValueInternalLink *newLink = mapAllocator()->allocateMapLink(); + index = 0; + link->next_ = newLink; + previousLink = newLink; + link = newLink; + } + return setNewItem( key, isStatic, link, index ); +} + + +ValueInternalMap::HashKey +ValueInternalMap::hash( const char *key ) const +{ + HashKey hash = 0; + while ( *key ) + hash += *key++ * 37; + return hash; +} + + +int +ValueInternalMap::compare( const ValueInternalMap &other ) const +{ + int sizeDiff( itemCount_ - other.itemCount_ ); + if ( sizeDiff != 0 ) + return sizeDiff; + // Strict order guaranty is required. Compare all keys FIRST, then compare values. + IteratorState it; + IteratorState itEnd; + makeBeginIterator( it ); + makeEndIterator( itEnd ); + for ( ; !equals(it,itEnd); increment(it) ) + { + if ( !other.find( key( it ) ) ) + return 1; + } + + // All keys are equals, let's compare values + makeBeginIterator( it ); + for ( ; !equals(it,itEnd); increment(it) ) + { + const Value *otherValue = other.find( key( it ) ); + int valueDiff = value(it).compare( *otherValue ); + if ( valueDiff != 0 ) + return valueDiff; + } + return 0; +} + + +void +ValueInternalMap::makeBeginIterator( IteratorState &it ) const +{ + it.map_ = const_cast( this ); + it.bucketIndex_ = 0; + it.itemIndex_ = 0; + it.link_ = buckets_; +} + + +void +ValueInternalMap::makeEndIterator( IteratorState &it ) const +{ + it.map_ = const_cast( this ); + it.bucketIndex_ = bucketsSize_; + it.itemIndex_ = 0; + it.link_ = 0; +} + + +bool +ValueInternalMap::equals( const IteratorState &x, const IteratorState &other ) +{ + return x.map_ == other.map_ + && x.bucketIndex_ == other.bucketIndex_ + && x.link_ == other.link_ + && x.itemIndex_ == other.itemIndex_; +} + + +void +ValueInternalMap::incrementBucket( IteratorState &iterator ) +{ + ++iterator.bucketIndex_; + JSON_ASSERT_MESSAGE( iterator.bucketIndex_ <= iterator.map_->bucketsSize_, + "ValueInternalMap::increment(): attempting to iterate beyond end." ); + if ( iterator.bucketIndex_ == iterator.map_->bucketsSize_ ) + iterator.link_ = 0; + else + iterator.link_ = &(iterator.map_->buckets_[iterator.bucketIndex_]); + iterator.itemIndex_ = 0; +} + + +void +ValueInternalMap::increment( IteratorState &iterator ) +{ + JSON_ASSERT_MESSAGE( iterator.map_, "Attempting to iterator using invalid iterator." ); + ++iterator.itemIndex_; + if ( iterator.itemIndex_ == ValueInternalLink::itemPerLink ) + { + JSON_ASSERT_MESSAGE( iterator.link_ != 0, + "ValueInternalMap::increment(): attempting to iterate beyond end." ); + iterator.link_ = iterator.link_->next_; + if ( iterator.link_ == 0 ) + incrementBucket( iterator ); + } + else if ( iterator.link_->items_[iterator.itemIndex_].isItemAvailable() ) + { + incrementBucket( iterator ); + } +} + + +void +ValueInternalMap::decrement( IteratorState &iterator ) +{ + if ( iterator.itemIndex_ == 0 ) + { + JSON_ASSERT_MESSAGE( iterator.map_, "Attempting to iterate using invalid iterator." ); + if ( iterator.link_ == &iterator.map_->buckets_[iterator.bucketIndex_] ) + { + JSON_ASSERT_MESSAGE( iterator.bucketIndex_ > 0, "Attempting to iterate beyond beginning." ); + --(iterator.bucketIndex_); + } + iterator.link_ = iterator.link_->previous_; + iterator.itemIndex_ = ValueInternalLink::itemPerLink - 1; + } +} + + +const char * +ValueInternalMap::key( const IteratorState &iterator ) +{ + JSON_ASSERT_MESSAGE( iterator.link_, "Attempting to iterate using invalid iterator." ); + return iterator.link_->keys_[iterator.itemIndex_]; +} + +const char * +ValueInternalMap::key( const IteratorState &iterator, bool &isStatic ) +{ + JSON_ASSERT_MESSAGE( iterator.link_, "Attempting to iterate using invalid iterator." ); + isStatic = iterator.link_->items_[iterator.itemIndex_].isMemberNameStatic(); + return iterator.link_->keys_[iterator.itemIndex_]; +} + + +Value & +ValueInternalMap::value( const IteratorState &iterator ) +{ + JSON_ASSERT_MESSAGE( iterator.link_, "Attempting to iterate using invalid iterator." ); + return iterator.link_->items_[iterator.itemIndex_]; +} + + +int +ValueInternalMap::distance( const IteratorState &x, const IteratorState &y ) +{ + int offset = 0; + IteratorState it = x; + while ( !equals( it, y ) ) + increment( it ); + return offset; +} diff --git a/cordova-lib/spec-plugman-create/plugins/cordova.echo/src/blackberry10/native/public/json_reader.cpp b/cordova-lib/spec-plugman-create/plugins/cordova.echo/src/blackberry10/native/public/json_reader.cpp new file mode 100644 index 000000000..750088c65 --- /dev/null +++ b/cordova-lib/spec-plugman-create/plugins/cordova.echo/src/blackberry10/native/public/json_reader.cpp @@ -0,0 +1,894 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +#if _MSC_VER >= 1400 // VC++ 8.0 +#pragma warning( disable : 4996 ) // disable warning about strdup being deprecated. +#endif + +namespace Json { + +// QNX is strict about declaring C symbols in the std namespace. +#ifdef __QNXNTO__ +using std::memcpy; +using std::sprintf; +using std::sscanf; +#endif + +// Implementation of class Features +// //////////////////////////////// + +Features::Features() + : allowComments_( true ) + , strictRoot_( false ) +{ +} + + +Features +Features::all() +{ + return Features(); +} + + +Features +Features::strictMode() +{ + Features features; + features.allowComments_ = false; + features.strictRoot_ = true; + return features; +} + +// Implementation of class Reader +// //////////////////////////////// + + +static inline bool +in( Reader::Char c, Reader::Char c1, Reader::Char c2, Reader::Char c3, Reader::Char c4 ) +{ + return c == c1 || c == c2 || c == c3 || c == c4; +} + +static inline bool +in( Reader::Char c, Reader::Char c1, Reader::Char c2, Reader::Char c3, Reader::Char c4, Reader::Char c5 ) +{ + return c == c1 || c == c2 || c == c3 || c == c4 || c == c5; +} + + +static bool +containsNewLine( Reader::Location begin, + Reader::Location end ) +{ + for ( ;begin < end; ++begin ) + if ( *begin == '\n' || *begin == '\r' ) + return true; + return false; +} + +static std::string codePointToUTF8(unsigned int cp) +{ + std::string result; + + // based on description from http://en.wikipedia.org/wiki/UTF-8 + + if (cp <= 0x7f) + { + result.resize(1); + result[0] = static_cast(cp); + } + else if (cp <= 0x7FF) + { + result.resize(2); + result[1] = static_cast(0x80 | (0x3f & cp)); + result[0] = static_cast(0xC0 | (0x1f & (cp >> 6))); + } + else if (cp <= 0xFFFF) + { + result.resize(3); + result[2] = static_cast(0x80 | (0x3f & cp)); + result[1] = 0x80 | static_cast((0x3f & (cp >> 6))); + result[0] = 0xE0 | static_cast((0xf & (cp >> 12))); + } + else if (cp <= 0x10FFFF) + { + result.resize(4); + result[3] = static_cast(0x80 | (0x3f & cp)); + result[2] = static_cast(0x80 | (0x3f & (cp >> 6))); + result[1] = static_cast(0x80 | (0x3f & (cp >> 12))); + result[0] = static_cast(0xF0 | (0x7 & (cp >> 18))); + } + + return result; +} + + +// Class Reader +// ////////////////////////////////////////////////////////////////// + +Reader::Reader() + : features_( Features::all() ) +{ +} + + +Reader::Reader( const Features &features ) + : features_( features ) +{ +} + + +bool +Reader::parse( const std::string &document, + Value &root, + bool collectComments ) +{ + document_ = document; + const char *begin = document_.c_str(); + const char *end = begin + document_.length(); + return parse( begin, end, root, collectComments ); +} + + +bool +Reader::parse( std::istream& sin, + Value &root, + bool collectComments ) +{ + //std::istream_iterator begin(sin); + //std::istream_iterator end; + // Those would allow streamed input from a file, if parse() were a + // template function. + + // Since std::string is reference-counted, this at least does not + // create an extra copy. + std::string doc; + std::getline(sin, doc, (char)EOF); + return parse( doc, root, collectComments ); +} + +bool +Reader::parse( const char *beginDoc, const char *endDoc, + Value &root, + bool collectComments ) +{ + if ( !features_.allowComments_ ) + { + collectComments = false; + } + + begin_ = beginDoc; + end_ = endDoc; + collectComments_ = collectComments; + current_ = begin_; + lastValueEnd_ = 0; + lastValue_ = 0; + commentsBefore_ = ""; + errors_.clear(); + while ( !nodes_.empty() ) + nodes_.pop(); + nodes_.push( &root ); + + bool successful = readValue(); + Token token; + skipCommentTokens( token ); + if ( collectComments_ && !commentsBefore_.empty() ) + root.setComment( commentsBefore_, commentAfter ); + if ( features_.strictRoot_ ) + { + if ( !root.isArray() && !root.isObject() ) + { + // Set error location to start of doc, ideally should be first token found in doc + token.type_ = tokenError; + token.start_ = beginDoc; + token.end_ = endDoc; + addError( "A valid JSON document must be either an array or an object value.", + token ); + return false; + } + } + return successful; +} + + +bool +Reader::readValue() +{ + Token token; + skipCommentTokens( token ); + bool successful = true; + + if ( collectComments_ && !commentsBefore_.empty() ) + { + currentValue().setComment( commentsBefore_, commentBefore ); + commentsBefore_ = ""; + } + + + switch ( token.type_ ) + { + case tokenObjectBegin: + successful = readObject( token ); + break; + case tokenArrayBegin: + successful = readArray( token ); + break; + case tokenNumber: + successful = decodeNumber( token ); + break; + case tokenString: + successful = decodeString( token ); + break; + case tokenTrue: + currentValue() = true; + break; + case tokenFalse: + currentValue() = false; + break; + case tokenNull: + currentValue() = Value(); + break; + default: + return addError( "Syntax error: value, object or array expected.", token ); + } + + if ( collectComments_ ) + { + lastValueEnd_ = current_; + lastValue_ = ¤tValue(); + } + + return successful; +} + + +void +Reader::skipCommentTokens( Token &token ) +{ + if ( features_.allowComments_ ) + { + do + { + readToken( token ); + } + while ( token.type_ == tokenComment ); + } + else + { + readToken( token ); + } +} + + +bool +Reader::expectToken( TokenType type, Token &token, const char *message ) +{ + readToken( token ); + if ( token.type_ != type ) + return addError( message, token ); + return true; +} + + +bool +Reader::readToken( Token &token ) +{ + skipSpaces(); + token.start_ = current_; + Char c = getNextChar(); + bool ok = true; + switch ( c ) + { + case '{': + token.type_ = tokenObjectBegin; + break; + case '}': + token.type_ = tokenObjectEnd; + break; + case '[': + token.type_ = tokenArrayBegin; + break; + case ']': + token.type_ = tokenArrayEnd; + break; + case '"': + token.type_ = tokenString; + ok = readString(); + break; + case '/': + token.type_ = tokenComment; + ok = readComment(); + break; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case '-': + token.type_ = tokenNumber; + readNumber(); + break; + case 't': + token.type_ = tokenTrue; + ok = match( "rue", 3 ); + break; + case 'f': + token.type_ = tokenFalse; + ok = match( "alse", 4 ); + break; + case 'n': + token.type_ = tokenNull; + ok = match( "ull", 3 ); + break; + case ',': + token.type_ = tokenArraySeparator; + break; + case ':': + token.type_ = tokenMemberSeparator; + break; + case 0: + token.type_ = tokenEndOfStream; + break; + default: + ok = false; + break; + } + if ( !ok ) + token.type_ = tokenError; + token.end_ = current_; + return true; +} + + +void +Reader::skipSpaces() +{ + while ( current_ != end_ ) + { + Char c = *current_; + if ( c == ' ' || c == '\t' || c == '\r' || c == '\n' ) + ++current_; + else + break; + } +} + + +bool +Reader::match( Location pattern, + int patternLength ) +{ + if ( end_ - current_ < patternLength ) + return false; + int index = patternLength; + while ( index-- ) + if ( current_[index] != pattern[index] ) + return false; + current_ += patternLength; + return true; +} + + +bool +Reader::readComment() +{ + Location commentBegin = current_ - 1; + Char c = getNextChar(); + bool successful = false; + if ( c == '*' ) + successful = readCStyleComment(); + else if ( c == '/' ) + successful = readCppStyleComment(); + if ( !successful ) + return false; + + if ( collectComments_ ) + { + CommentPlacement placement = commentBefore; + if ( lastValueEnd_ && !containsNewLine( lastValueEnd_, commentBegin ) ) + { + if ( c != '*' || !containsNewLine( commentBegin, current_ ) ) + placement = commentAfterOnSameLine; + } + + addComment( commentBegin, current_, placement ); + } + return true; +} + + +void +Reader::addComment( Location begin, + Location end, + CommentPlacement placement ) +{ + assert( collectComments_ ); + if ( placement == commentAfterOnSameLine ) + { + assert( lastValue_ != 0 ); + lastValue_->setComment( std::string( begin, end ), placement ); + } + else + { + if ( !commentsBefore_.empty() ) + commentsBefore_ += "\n"; + commentsBefore_ += std::string( begin, end ); + } +} + + +bool +Reader::readCStyleComment() +{ + while ( current_ != end_ ) + { + Char c = getNextChar(); + if ( c == '*' && *current_ == '/' ) + break; + } + return getNextChar() == '/'; +} + + +bool +Reader::readCppStyleComment() +{ + while ( current_ != end_ ) + { + Char c = getNextChar(); + if ( c == '\r' || c == '\n' ) + break; + } + return true; +} + + +void +Reader::readNumber() +{ + while ( current_ != end_ ) + { + if ( !(*current_ >= '0' && *current_ <= '9') && + !in( *current_, '.', 'e', 'E', '+', '-' ) ) + break; + ++current_; + } +} + +bool +Reader::readString() +{ + Char c = 0; + while ( current_ != end_ ) + { + c = getNextChar(); + if ( c == '\\' ) + getNextChar(); + else if ( c == '"' ) + break; + } + return c == '"'; +} + + +bool +Reader::readObject( Token &tokenStart ) +{ + Token tokenName; + Token something = tokenStart; + std::string name; + currentValue() = Value( objectValue ); + while ( readToken( tokenName ) ) + { + bool initialTokenOk = true; + while ( tokenName.type_ == tokenComment && initialTokenOk ) + initialTokenOk = readToken( tokenName ); + if ( !initialTokenOk ) + break; + if ( tokenName.type_ == tokenObjectEnd && name.empty() ) // empty object + return true; + if ( tokenName.type_ != tokenString ) + break; + + name = ""; + if ( !decodeString( tokenName, name ) ) + return recoverFromError( tokenObjectEnd ); + + Token colon; + if ( !readToken( colon ) || colon.type_ != tokenMemberSeparator ) + { + return addErrorAndRecover( "Missing ':' after object member name", + colon, + tokenObjectEnd ); + } + Value &value = currentValue()[ name ]; + nodes_.push( &value ); + bool ok = readValue(); + nodes_.pop(); + if ( !ok ) // error already set + return recoverFromError( tokenObjectEnd ); + + Token comma; + if ( !readToken( comma ) + || ( comma.type_ != tokenObjectEnd && + comma.type_ != tokenArraySeparator && + comma.type_ != tokenComment ) ) + { + return addErrorAndRecover( "Missing ',' or '}' in object declaration", + comma, + tokenObjectEnd ); + } + bool finalizeTokenOk = true; + while ( comma.type_ == tokenComment && + finalizeTokenOk ) + finalizeTokenOk = readToken( comma ); + if ( comma.type_ == tokenObjectEnd ) + return true; + } + return addErrorAndRecover( "Missing '}' or object member name", + tokenName, + tokenObjectEnd ); +} + + +bool +Reader::readArray( Token &tokenStart ) +{ + Token something = tokenStart; + currentValue() = Value( arrayValue ); + skipSpaces(); + if ( *current_ == ']' ) // empty array + { + Token endArray; + readToken( endArray ); + return true; + } + int index = 0; + while ( true ) + { + Value &value = currentValue()[ index++ ]; + nodes_.push( &value ); + bool ok = readValue(); + nodes_.pop(); + if ( !ok ) // error already set + return recoverFromError( tokenArrayEnd ); + + Token token; + // Accept Comment after last item in the array. + ok = readToken( token ); + while ( token.type_ == tokenComment && ok ) + { + ok = readToken( token ); + } + bool badTokenType = ( token.type_ == tokenArraySeparator && + token.type_ == tokenArrayEnd ); + if ( !ok || badTokenType ) + { + return addErrorAndRecover( "Missing ',' or ']' in array declaration", + token, + tokenArrayEnd ); + } + if ( token.type_ == tokenArrayEnd ) + break; + } + return true; +} + + +bool +Reader::decodeNumber( Token &token ) +{ + bool isDouble = false; + for ( Location inspect = token.start_; inspect != token.end_; ++inspect ) + { + isDouble = isDouble + || in( *inspect, '.', 'e', 'E', '+' ) + || ( *inspect == '-' && inspect != token.start_ ); + } + if ( isDouble ) + return decodeDouble( token ); + Location current = token.start_; + bool isNegative = *current == '-'; + if ( isNegative ) + ++current; + Value::UInt threshold = (isNegative ? Value::UInt(-Value::minInt) + : Value::maxUInt) / 10; + Value::UInt value = 0; + while ( current < token.end_ ) + { + Char c = *current++; + if ( c < '0' || c > '9' ) + return addError( "'" + std::string( token.start_, token.end_ ) + "' is not a number.", token ); + if ( value >= threshold ) + return decodeDouble( token ); + value = value * 10 + Value::UInt(c - '0'); + } + if ( isNegative ) + currentValue() = -Value::Int( value ); + else if ( value <= Value::UInt(Value::maxInt) ) + currentValue() = Value::Int( value ); + else + currentValue() = value; + return true; +} + + +bool +Reader::decodeDouble( Token &token ) +{ + double value = 0; + const int bufferSize = 32; + int count; + int length = int(token.end_ - token.start_); + if ( length <= bufferSize ) + { + Char buffer[bufferSize]; + memcpy( buffer, token.start_, length ); + buffer[length] = 0; + count = sscanf( buffer, "%lf", &value ); + } + else + { + std::string buffer( token.start_, token.end_ ); + count = sscanf( buffer.c_str(), "%lf", &value ); + } + + if ( count != 1 ) + return addError( "'" + std::string( token.start_, token.end_ ) + "' is not a number.", token ); + currentValue() = value; + return true; +} + + +bool +Reader::decodeString( Token &token ) +{ + std::string decoded; + if ( !decodeString( token, decoded ) ) + return false; + currentValue() = decoded; + return true; +} + + +bool +Reader::decodeString( Token &token, std::string &decoded ) +{ + decoded.reserve( token.end_ - token.start_ - 2 ); + Location current = token.start_ + 1; // skip '"' + Location end = token.end_ - 1; // do not include '"' + while ( current != end ) + { + Char c = *current++; + if ( c == '"' ) + break; + else if ( c == '\\' ) + { + if ( current == end ) + return addError( "Empty escape sequence in string", token, current ); + Char escape = *current++; + switch ( escape ) + { + case '"': decoded += '"'; break; + case '/': decoded += '/'; break; + case '\\': decoded += '\\'; break; + case 'b': decoded += '\b'; break; + case 'f': decoded += '\f'; break; + case 'n': decoded += '\n'; break; + case 'r': decoded += '\r'; break; + case 't': decoded += '\t'; break; + case 'u': + { + unsigned int unicode; + if ( !decodeUnicodeCodePoint( token, current, end, unicode ) ) + return false; + decoded += codePointToUTF8(unicode); + } + break; + default: + return addError( "Bad escape sequence in string", token, current ); + } + } + else + { + decoded += c; + } + } + return true; +} + +bool +Reader::decodeUnicodeCodePoint( Token &token, + Location ¤t, + Location end, + unsigned int &unicode ) +{ + + if ( !decodeUnicodeEscapeSequence( token, current, end, unicode ) ) + return false; + if (unicode >= 0xD800 && unicode <= 0xDBFF) + { + // surrogate pairs + if (end - current < 6) + return addError( "additional six characters expected to parse unicode surrogate pair.", token, current ); + unsigned int surrogatePair; + if (*(current++) == '\\' && *(current++)== 'u') + { + if (decodeUnicodeEscapeSequence( token, current, end, surrogatePair )) + { + unicode = 0x10000 + ((unicode & 0x3FF) << 10) + (surrogatePair & 0x3FF); + } + else + return false; + } + else + return addError( "expecting another \\u token to begin the second half of a unicode surrogate pair", token, current ); + } + return true; +} + +bool +Reader::decodeUnicodeEscapeSequence( Token &token, + Location ¤t, + Location end, + unsigned int &unicode ) +{ + if ( end - current < 4 ) + return addError( "Bad unicode escape sequence in string: four digits expected.", token, current ); + unicode = 0; + for ( int index =0; index < 4; ++index ) + { + Char c = *current++; + unicode *= 16; + if ( c >= '0' && c <= '9' ) + unicode += c - '0'; + else if ( c >= 'a' && c <= 'f' ) + unicode += c - 'a' + 10; + else if ( c >= 'A' && c <= 'F' ) + unicode += c - 'A' + 10; + else + return addError( "Bad unicode escape sequence in string: hexadecimal digit expected.", token, current ); + } + return true; +} + + +bool +Reader::addError( const std::string &message, + Token &token, + Location extra ) +{ + ErrorInfo info; + info.token_ = token; + info.message_ = message; + info.extra_ = extra; + errors_.push_back( info ); + return false; +} + + +bool +Reader::recoverFromError( TokenType skipUntilToken ) +{ + int errorCount = int(errors_.size()); + Token skip; + while ( true ) + { + if ( !readToken(skip) ) + errors_.resize( errorCount ); // discard errors caused by recovery + if ( skip.type_ == skipUntilToken || skip.type_ == tokenEndOfStream ) + break; + } + errors_.resize( errorCount ); + return false; +} + + +bool +Reader::addErrorAndRecover( const std::string &message, + Token &token, + TokenType skipUntilToken ) +{ + addError( message, token ); + return recoverFromError( skipUntilToken ); +} + + +Value & +Reader::currentValue() +{ + return *(nodes_.top()); +} + + +Reader::Char +Reader::getNextChar() +{ + if ( current_ == end_ ) + return 0; + return *current_++; +} + + +void +Reader::getLocationLineAndColumn( Location location, + int &line, + int &column ) const +{ + Location current = begin_; + Location lastLineStart = current; + line = 0; + while ( current < location && current != end_ ) + { + Char c = *current++; + if ( c == '\r' ) + { + if ( *current == '\n' ) + ++current; + lastLineStart = current; + ++line; + } + else if ( c == '\n' ) + { + lastLineStart = current; + ++line; + } + } + // column & line start at 1 + column = int(location - lastLineStart) + 1; + ++line; +} + + +std::string +Reader::getLocationLineAndColumn( Location location ) const +{ + int line, column; + getLocationLineAndColumn( location, line, column ); + char buffer[18+16+16+1]; + sprintf( buffer, "Line %d, Column %d", line, column ); + return buffer; +} + + +std::string +Reader::getFormatedErrorMessages() const +{ + std::string formattedMessage; + for ( Errors::const_iterator itError = errors_.begin(); + itError != errors_.end(); + ++itError ) + { + const ErrorInfo &error = *itError; + formattedMessage += "* " + getLocationLineAndColumn( error.token_.start_ ) + "\n"; + formattedMessage += " " + error.message_ + "\n"; + if ( error.extra_ ) + formattedMessage += "See " + getLocationLineAndColumn( error.extra_ ) + " for detail.\n"; + } + return formattedMessage; +} + + +std::istream& operator>>( std::istream &sin, Value &root ) +{ + Json::Reader reader; + bool ok = reader.parse(sin, root, true); + //JSON_ASSERT( ok ); + if (!ok) throw std::runtime_error(reader.getFormatedErrorMessages()); + return sin; +} + + +} // namespace Json diff --git a/cordova-lib/spec-plugman-create/plugins/cordova.echo/src/blackberry10/native/public/json_value.cpp b/cordova-lib/spec-plugman-create/plugins/cordova.echo/src/blackberry10/native/public/json_value.cpp new file mode 100644 index 000000000..67638ca15 --- /dev/null +++ b/cordova-lib/spec-plugman-create/plugins/cordova.echo/src/blackberry10/native/public/json_value.cpp @@ -0,0 +1,1726 @@ +#include +#include +#include +#include +#include +#include +#include +#ifdef JSON_USE_CPPTL +# include +#endif +#include // size_t +#ifndef JSON_USE_SIMPLE_INTERNAL_ALLOCATOR +# include "json_batchallocator.h" +#endif // #ifndef JSON_USE_SIMPLE_INTERNAL_ALLOCATOR + +#define JSON_ASSERT_UNREACHABLE assert( false ) +#define JSON_ASSERT( condition ) assert( condition ); // @todo <= change this into an exception throw +#define JSON_ASSERT_MESSAGE( condition, message ) if (!( condition )) throw std::runtime_error( message ); + +namespace Json { + +// QNX is strict about declaring C symbols in the std namespace. +#ifdef __QNXNTO__ +using std::memcpy; +using std::strchr; +using std::strcmp; +using std::strlen; +#endif + +const Value Value::null; +const Int Value::minInt = Int( ~(UInt(-1)/2) ); +const Int Value::maxInt = Int( UInt(-1)/2 ); +const UInt Value::maxUInt = UInt(-1); + +// A "safe" implementation of strdup. Allow null pointer to be passed. +// Also avoid warning on msvc80. +// +//inline char *safeStringDup( const char *czstring ) +//{ +// if ( czstring ) +// { +// const size_t length = (unsigned int)( strlen(czstring) + 1 ); +// char *newString = static_cast( malloc( length ) ); +// memcpy( newString, czstring, length ); +// return newString; +// } +// return 0; +//} +// +//inline char *safeStringDup( const std::string &str ) +//{ +// if ( !str.empty() ) +// { +// const size_t length = str.length(); +// char *newString = static_cast( malloc( length + 1 ) ); +// memcpy( newString, str.c_str(), length ); +// newString[length] = 0; +// return newString; +// } +// return 0; +//} + +ValueAllocator::~ValueAllocator() +{ +} + +class DefaultValueAllocator : public ValueAllocator +{ +public: + virtual ~DefaultValueAllocator() + { + } + + virtual char *makeMemberName( const char *memberName ) + { + return duplicateStringValue( memberName ); + } + + virtual void releaseMemberName( char *memberName ) + { + releaseStringValue( memberName ); + } + + virtual char *duplicateStringValue( const char *value, + unsigned int length = unknown ) + { + //@todo investigate this old optimization + //if ( !value || value[0] == 0 ) + // return 0; + + if ( length == unknown ) + length = (unsigned int)strlen(value); + char *newString = static_cast( malloc( length + 1 ) ); + memcpy( newString, value, length ); + newString[length] = 0; + return newString; + } + + virtual void releaseStringValue( char *value ) + { + if ( value ) + free( value ); + } +}; + +static ValueAllocator *&valueAllocator() +{ + static DefaultValueAllocator defaultAllocator; + static ValueAllocator *valueAllocator = &defaultAllocator; + return valueAllocator; +} + +static struct DummyValueAllocatorInitializer { + DummyValueAllocatorInitializer() + { + valueAllocator(); // ensure valueAllocator() statics are initialized before main(). + } +} dummyValueAllocatorInitializer; + + + +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// ValueInternals... +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +#ifdef JSON_VALUE_USE_INTERNAL_MAP +# include "json_internalarray.inl" +# include "json_internalmap.inl" +#endif // JSON_VALUE_USE_INTERNAL_MAP + +# include "json_valueiterator.inl" + + +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// class Value::CommentInfo +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// + + +Value::CommentInfo::CommentInfo() + : comment_( 0 ) +{ +} + +Value::CommentInfo::~CommentInfo() +{ + if ( comment_ ) + valueAllocator()->releaseStringValue( comment_ ); +} + + +void +Value::CommentInfo::setComment( const char *text ) +{ + if ( comment_ ) + valueAllocator()->releaseStringValue( comment_ ); + JSON_ASSERT( text ); + JSON_ASSERT_MESSAGE( text[0]=='\0' || text[0]=='/', "Comments must start with /"); + // It seems that /**/ style comments are acceptable as well. + comment_ = valueAllocator()->duplicateStringValue( text ); +} + + +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// class Value::CZString +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +# ifndef JSON_VALUE_USE_INTERNAL_MAP + +// Notes: index_ indicates if the string was allocated when +// a string is stored. + +Value::CZString::CZString( int index ) + : cstr_( 0 ) + , index_( index ) +{ +} + +Value::CZString::CZString( const char *cstr, DuplicationPolicy allocate ) + : cstr_( allocate == duplicate ? valueAllocator()->makeMemberName(cstr) + : cstr ) + , index_( allocate ) +{ +} + +Value::CZString::CZString( const CZString &other ) +: cstr_( other.index_ != noDuplication && other.cstr_ != 0 + ? valueAllocator()->makeMemberName( other.cstr_ ) + : other.cstr_ ) + , index_( other.cstr_ ? (other.index_ == noDuplication ? noDuplication : duplicate) + : other.index_ ) +{ +} + +Value::CZString::~CZString() +{ + if ( cstr_ && index_ == duplicate ) + valueAllocator()->releaseMemberName( const_cast( cstr_ ) ); +} + +void +Value::CZString::swap( CZString &other ) +{ + std::swap( cstr_, other.cstr_ ); + std::swap( index_, other.index_ ); +} + +Value::CZString & +Value::CZString::operator =( const CZString &other ) +{ + CZString temp( other ); + swap( temp ); + return *this; +} + +bool +Value::CZString::operator<( const CZString &other ) const +{ + if ( cstr_ ) + return strcmp( cstr_, other.cstr_ ) < 0; + return index_ < other.index_; +} + +bool +Value::CZString::operator==( const CZString &other ) const +{ + if ( cstr_ ) + return strcmp( cstr_, other.cstr_ ) == 0; + return index_ == other.index_; +} + + +int +Value::CZString::index() const +{ + return index_; +} + + +const char * +Value::CZString::c_str() const +{ + return cstr_; +} + +bool +Value::CZString::isStaticString() const +{ + return index_ == noDuplication; +} + +#endif // ifndef JSON_VALUE_USE_INTERNAL_MAP + + +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// class Value::Value +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// + +/*! \internal Default constructor initialization must be equivalent to: + * memset( this, 0, sizeof(Value) ) + * This optimization is used in ValueInternalMap fast allocator. + */ +Value::Value( ValueType type ) + : type_( type ) + , allocated_( 0 ) + , comments_( 0 ) +# ifdef JSON_VALUE_USE_INTERNAL_MAP + , itemIsUsed_( 0 ) +#endif +{ + switch ( type ) + { + case nullValue: + break; + case intValue: + case uintValue: + value_.int_ = 0; + break; + case realValue: + value_.real_ = 0.0; + break; + case stringValue: + value_.string_ = 0; + break; +#ifndef JSON_VALUE_USE_INTERNAL_MAP + case arrayValue: + case objectValue: + value_.map_ = new ObjectValues(); + break; +#else + case arrayValue: + value_.array_ = arrayAllocator()->newArray(); + break; + case objectValue: + value_.map_ = mapAllocator()->newMap(); + break; +#endif + case booleanValue: + value_.bool_ = false; + break; + default: + JSON_ASSERT_UNREACHABLE; + } +} + + +Value::Value( Int value ) + : type_( intValue ) + , comments_( 0 ) +# ifdef JSON_VALUE_USE_INTERNAL_MAP + , itemIsUsed_( 0 ) +#endif +{ + value_.int_ = value; +} + + +Value::Value( UInt value ) + : type_( uintValue ) + , comments_( 0 ) +# ifdef JSON_VALUE_USE_INTERNAL_MAP + , itemIsUsed_( 0 ) +#endif +{ + value_.uint_ = value; +} + +Value::Value( double value ) + : type_( realValue ) + , comments_( 0 ) +# ifdef JSON_VALUE_USE_INTERNAL_MAP + , itemIsUsed_( 0 ) +#endif +{ + value_.real_ = value; +} + +Value::Value( const char *value ) + : type_( stringValue ) + , allocated_( true ) + , comments_( 0 ) +# ifdef JSON_VALUE_USE_INTERNAL_MAP + , itemIsUsed_( 0 ) +#endif +{ + value_.string_ = valueAllocator()->duplicateStringValue( value ); +} + + +Value::Value( const char *beginValue, + const char *endValue ) + : type_( stringValue ) + , allocated_( true ) + , comments_( 0 ) +# ifdef JSON_VALUE_USE_INTERNAL_MAP + , itemIsUsed_( 0 ) +#endif +{ + value_.string_ = valueAllocator()->duplicateStringValue( beginValue, + UInt(endValue - beginValue) ); +} + + +Value::Value( const std::string &value ) + : type_( stringValue ) + , allocated_( true ) + , comments_( 0 ) +# ifdef JSON_VALUE_USE_INTERNAL_MAP + , itemIsUsed_( 0 ) +#endif +{ + value_.string_ = valueAllocator()->duplicateStringValue( value.c_str(), + (unsigned int)value.length() ); + +} + +Value::Value( const StaticString &value ) + : type_( stringValue ) + , allocated_( false ) + , comments_( 0 ) +# ifdef JSON_VALUE_USE_INTERNAL_MAP + , itemIsUsed_( 0 ) +#endif +{ + value_.string_ = const_cast( value.c_str() ); +} + + +# ifdef JSON_USE_CPPTL +Value::Value( const CppTL::ConstString &value ) + : type_( stringValue ) + , allocated_( true ) + , comments_( 0 ) +# ifdef JSON_VALUE_USE_INTERNAL_MAP + , itemIsUsed_( 0 ) +#endif +{ + value_.string_ = valueAllocator()->duplicateStringValue( value, value.length() ); +} +# endif + +Value::Value( bool value ) + : type_( booleanValue ) + , comments_( 0 ) +# ifdef JSON_VALUE_USE_INTERNAL_MAP + , itemIsUsed_( 0 ) +#endif +{ + value_.bool_ = value; +} + + +Value::Value( const Value &other ) + : type_( other.type_ ) + , comments_( 0 ) +# ifdef JSON_VALUE_USE_INTERNAL_MAP + , itemIsUsed_( 0 ) +#endif +{ + switch ( type_ ) + { + case nullValue: + case intValue: + case uintValue: + case realValue: + case booleanValue: + value_ = other.value_; + break; + case stringValue: + if ( other.value_.string_ ) + { + value_.string_ = valueAllocator()->duplicateStringValue( other.value_.string_ ); + allocated_ = true; + } + else + value_.string_ = 0; + break; +#ifndef JSON_VALUE_USE_INTERNAL_MAP + case arrayValue: + case objectValue: + value_.map_ = new ObjectValues( *other.value_.map_ ); + break; +#else + case arrayValue: + value_.array_ = arrayAllocator()->newArrayCopy( *other.value_.array_ ); + break; + case objectValue: + value_.map_ = mapAllocator()->newMapCopy( *other.value_.map_ ); + break; +#endif + default: + JSON_ASSERT_UNREACHABLE; + } + if ( other.comments_ ) + { + comments_ = new CommentInfo[numberOfCommentPlacement]; + for ( int comment =0; comment < numberOfCommentPlacement; ++comment ) + { + const CommentInfo &otherComment = other.comments_[comment]; + if ( otherComment.comment_ ) + comments_[comment].setComment( otherComment.comment_ ); + } + } +} + + +Value::~Value() +{ + switch ( type_ ) + { + case nullValue: + case intValue: + case uintValue: + case realValue: + case booleanValue: + break; + case stringValue: + if ( allocated_ ) + valueAllocator()->releaseStringValue( value_.string_ ); + break; +#ifndef JSON_VALUE_USE_INTERNAL_MAP + case arrayValue: + case objectValue: + delete value_.map_; + break; +#else + case arrayValue: + arrayAllocator()->destructArray( value_.array_ ); + break; + case objectValue: + mapAllocator()->destructMap( value_.map_ ); + break; +#endif + default: + JSON_ASSERT_UNREACHABLE; + } + + if ( comments_ ) + delete[] comments_; +} + +Value & +Value::operator=( const Value &other ) +{ + Value temp( other ); + swap( temp ); + return *this; +} + +void +Value::swap( Value &other ) +{ + ValueType temp = type_; + type_ = other.type_; + other.type_ = temp; + std::swap( value_, other.value_ ); + int temp2 = allocated_; + allocated_ = other.allocated_; + other.allocated_ = temp2; +} + +ValueType +Value::type() const +{ + return type_; +} + + +int +Value::compare( const Value &other ) +{ + /* + int typeDelta = other.type_ - type_; + switch ( type_ ) + { + case nullValue: + + return other.type_ == type_; + case intValue: + if ( other.type_.isNumeric() + case uintValue: + case realValue: + case booleanValue: + break; + case stringValue, + break; + case arrayValue: + delete value_.array_; + break; + case objectValue: + delete value_.map_; + default: + JSON_ASSERT_UNREACHABLE; + } + */ + return 0; // unreachable +} + +bool +Value::operator <( const Value &other ) const +{ + int typeDelta = type_ - other.type_; + if ( typeDelta ) + return typeDelta < 0 ? true : false; + switch ( type_ ) + { + case nullValue: + return false; + case intValue: + return value_.int_ < other.value_.int_; + case uintValue: + return value_.uint_ < other.value_.uint_; + case realValue: + return value_.real_ < other.value_.real_; + case booleanValue: + return value_.bool_ < other.value_.bool_; + case stringValue: + return ( value_.string_ == 0 && other.value_.string_ ) + || ( other.value_.string_ + && value_.string_ + && strcmp( value_.string_, other.value_.string_ ) < 0 ); +#ifndef JSON_VALUE_USE_INTERNAL_MAP + case arrayValue: + case objectValue: + { + int delta = int( value_.map_->size() - other.value_.map_->size() ); + if ( delta ) + return delta < 0; + return (*value_.map_) < (*other.value_.map_); + } +#else + case arrayValue: + return value_.array_->compare( *(other.value_.array_) ) < 0; + case objectValue: + return value_.map_->compare( *(other.value_.map_) ) < 0; +#endif + default: + JSON_ASSERT_UNREACHABLE; + } + return 0; // unreachable +} + +bool +Value::operator <=( const Value &other ) const +{ + return !(other > *this); +} + +bool +Value::operator >=( const Value &other ) const +{ + return !(*this < other); +} + +bool +Value::operator >( const Value &other ) const +{ + return other < *this; +} + +bool +Value::operator ==( const Value &other ) const +{ + //if ( type_ != other.type_ ) + // GCC 2.95.3 says: + // attempt to take address of bit-field structure member `Json::Value::type_' + // Beats me, but a temp solves the problem. + int temp = other.type_; + if ( type_ != temp ) + return false; + switch ( type_ ) + { + case nullValue: + return true; + case intValue: + return value_.int_ == other.value_.int_; + case uintValue: + return value_.uint_ == other.value_.uint_; + case realValue: + return value_.real_ == other.value_.real_; + case booleanValue: + return value_.bool_ == other.value_.bool_; + case stringValue: + return ( value_.string_ == other.value_.string_ ) + || ( other.value_.string_ + && value_.string_ + && strcmp( value_.string_, other.value_.string_ ) == 0 ); +#ifndef JSON_VALUE_USE_INTERNAL_MAP + case arrayValue: + case objectValue: + return value_.map_->size() == other.value_.map_->size() + && (*value_.map_) == (*other.value_.map_); +#else + case arrayValue: + return value_.array_->compare( *(other.value_.array_) ) == 0; + case objectValue: + return value_.map_->compare( *(other.value_.map_) ) == 0; +#endif + default: + JSON_ASSERT_UNREACHABLE; + } + return 0; // unreachable +} + +bool +Value::operator !=( const Value &other ) const +{ + return !( *this == other ); +} + +const char * +Value::asCString() const +{ + JSON_ASSERT( type_ == stringValue ); + return value_.string_; +} + + +std::string +Value::asString() const +{ + switch ( type_ ) + { + case nullValue: + return ""; + case stringValue: + return value_.string_ ? value_.string_ : ""; + case booleanValue: + return value_.bool_ ? "true" : "false"; + case intValue: + case uintValue: + case realValue: + case arrayValue: + case objectValue: + JSON_ASSERT_MESSAGE( false, "Type is not convertible to string" ); + default: + JSON_ASSERT_UNREACHABLE; + } + return ""; // unreachable +} + +# ifdef JSON_USE_CPPTL +CppTL::ConstString +Value::asConstString() const +{ + return CppTL::ConstString( asString().c_str() ); +} +# endif + +Value::Int +Value::asInt() const +{ + switch ( type_ ) + { + case nullValue: + return 0; + case intValue: + return value_.int_; + case uintValue: + JSON_ASSERT_MESSAGE( value_.uint_ < (unsigned)maxInt, "integer out of signed integer range" ); + return value_.uint_; + case realValue: + JSON_ASSERT_MESSAGE( value_.real_ >= minInt && value_.real_ <= maxInt, "Real out of signed integer range" ); + return Int( value_.real_ ); + case booleanValue: + return value_.bool_ ? 1 : 0; + case stringValue: + case arrayValue: + case objectValue: + JSON_ASSERT_MESSAGE( false, "Type is not convertible to int" ); + default: + JSON_ASSERT_UNREACHABLE; + } + return 0; // unreachable; +} + +Value::UInt +Value::asUInt() const +{ + switch ( type_ ) + { + case nullValue: + return 0; + case intValue: + JSON_ASSERT_MESSAGE( value_.int_ >= 0, "Negative integer can not be converted to unsigned integer" ); + return value_.int_; + case uintValue: + return value_.uint_; + case realValue: + JSON_ASSERT_MESSAGE( value_.real_ >= 0 && value_.real_ <= maxUInt, "Real out of unsigned integer range" ); + return UInt( value_.real_ ); + case booleanValue: + return value_.bool_ ? 1 : 0; + case stringValue: + case arrayValue: + case objectValue: + JSON_ASSERT_MESSAGE( false, "Type is not convertible to uint" ); + default: + JSON_ASSERT_UNREACHABLE; + } + return 0; // unreachable; +} + +double +Value::asDouble() const +{ + switch ( type_ ) + { + case nullValue: + return 0.0; + case intValue: + return value_.int_; + case uintValue: + return value_.uint_; + case realValue: + return value_.real_; + case booleanValue: + return value_.bool_ ? 1.0 : 0.0; + case stringValue: + case arrayValue: + case objectValue: + JSON_ASSERT_MESSAGE( false, "Type is not convertible to double" ); + default: + JSON_ASSERT_UNREACHABLE; + } + return 0; // unreachable; +} + +bool +Value::asBool() const +{ + switch ( type_ ) + { + case nullValue: + return false; + case intValue: + case uintValue: + return value_.int_ != 0; + case realValue: + return value_.real_ != 0.0; + case booleanValue: + return value_.bool_; + case stringValue: + return value_.string_ && value_.string_[0] != 0; + case arrayValue: + case objectValue: + return value_.map_->size() != 0; + default: + JSON_ASSERT_UNREACHABLE; + } + return false; // unreachable; +} + + +bool +Value::isConvertibleTo( ValueType other ) const +{ + switch ( type_ ) + { + case nullValue: + return true; + case intValue: + return ( other == nullValue && value_.int_ == 0 ) + || other == intValue + || ( other == uintValue && value_.int_ >= 0 ) + || other == realValue + || other == stringValue + || other == booleanValue; + case uintValue: + return ( other == nullValue && value_.uint_ == 0 ) + || ( other == intValue && value_.uint_ <= (unsigned)maxInt ) + || other == uintValue + || other == realValue + || other == stringValue + || other == booleanValue; + case realValue: + return ( other == nullValue && value_.real_ == 0.0 ) + || ( other == intValue && value_.real_ >= minInt && value_.real_ <= maxInt ) + || ( other == uintValue && value_.real_ >= 0 && value_.real_ <= maxUInt ) + || other == realValue + || other == stringValue + || other == booleanValue; + case booleanValue: + return ( other == nullValue && value_.bool_ == false ) + || other == intValue + || other == uintValue + || other == realValue + || other == stringValue + || other == booleanValue; + case stringValue: + return other == stringValue + || ( other == nullValue && (!value_.string_ || value_.string_[0] == 0) ); + case arrayValue: + return other == arrayValue + || ( other == nullValue && value_.map_->size() == 0 ); + case objectValue: + return other == objectValue + || ( other == nullValue && value_.map_->size() == 0 ); + default: + JSON_ASSERT_UNREACHABLE; + } + return false; // unreachable; +} + + +/// Number of values in array or object +Value::UInt +Value::size() const +{ + switch ( type_ ) + { + case nullValue: + case intValue: + case uintValue: + case realValue: + case booleanValue: + case stringValue: + return 0; +#ifndef JSON_VALUE_USE_INTERNAL_MAP + case arrayValue: // size of the array is highest index + 1 + if ( !value_.map_->empty() ) + { + ObjectValues::const_iterator itLast = value_.map_->end(); + --itLast; + return (*itLast).first.index()+1; + } + return 0; + case objectValue: + return Int( value_.map_->size() ); +#else + case arrayValue: + return Int( value_.array_->size() ); + case objectValue: + return Int( value_.map_->size() ); +#endif + default: + JSON_ASSERT_UNREACHABLE; + } + return 0; // unreachable; +} + + +bool +Value::empty() const +{ + if ( isNull() || isArray() || isObject() ) + return size() == 0u; + else + return false; +} + + +bool +Value::operator!() const +{ + return isNull(); +} + + +void +Value::clear() +{ + JSON_ASSERT( type_ == nullValue || type_ == arrayValue || type_ == objectValue ); + + switch ( type_ ) + { +#ifndef JSON_VALUE_USE_INTERNAL_MAP + case arrayValue: + case objectValue: + value_.map_->clear(); + break; +#else + case arrayValue: + value_.array_->clear(); + break; + case objectValue: + value_.map_->clear(); + break; +#endif + default: + break; + } +} + +void +Value::resize( UInt newSize ) +{ + JSON_ASSERT( type_ == nullValue || type_ == arrayValue ); + if ( type_ == nullValue ) + *this = Value( arrayValue ); +#ifndef JSON_VALUE_USE_INTERNAL_MAP + UInt oldSize = size(); + if ( newSize == 0 ) + clear(); + else if ( newSize > oldSize ) + (*this)[ newSize - 1 ]; + else + { + for ( UInt index = newSize; index < oldSize; ++index ) + value_.map_->erase( index ); + assert( size() == newSize ); + } +#else + value_.array_->resize( newSize ); +#endif +} + + +Value & +Value::operator[]( UInt index ) +{ + JSON_ASSERT( type_ == nullValue || type_ == arrayValue ); + if ( type_ == nullValue ) + *this = Value( arrayValue ); +#ifndef JSON_VALUE_USE_INTERNAL_MAP + CZString key( index ); + ObjectValues::iterator it = value_.map_->lower_bound( key ); + if ( it != value_.map_->end() && (*it).first == key ) + return (*it).second; + + ObjectValues::value_type defaultValue( key, null ); + it = value_.map_->insert( it, defaultValue ); + return (*it).second; +#else + return value_.array_->resolveReference( index ); +#endif +} + + +const Value & +Value::operator[]( UInt index ) const +{ + JSON_ASSERT( type_ == nullValue || type_ == arrayValue ); + if ( type_ == nullValue ) + return null; +#ifndef JSON_VALUE_USE_INTERNAL_MAP + CZString key( index ); + ObjectValues::const_iterator it = value_.map_->find( key ); + if ( it == value_.map_->end() ) + return null; + return (*it).second; +#else + Value *value = value_.array_->find( index ); + return value ? *value : null; +#endif +} + + +Value & +Value::operator[]( const char *key ) +{ + return resolveReference( key, false ); +} + + +Value & +Value::resolveReference( const char *key, + bool isStatic ) +{ + JSON_ASSERT( type_ == nullValue || type_ == objectValue ); + if ( type_ == nullValue ) + *this = Value( objectValue ); +#ifndef JSON_VALUE_USE_INTERNAL_MAP + CZString actualKey( key, isStatic ? CZString::noDuplication + : CZString::duplicateOnCopy ); + ObjectValues::iterator it = value_.map_->lower_bound( actualKey ); + if ( it != value_.map_->end() && (*it).first == actualKey ) + return (*it).second; + + ObjectValues::value_type defaultValue( actualKey, null ); + it = value_.map_->insert( it, defaultValue ); + Value &value = (*it).second; + return value; +#else + return value_.map_->resolveReference( key, isStatic ); +#endif +} + + +Value +Value::get( UInt index, + const Value &defaultValue ) const +{ + const Value *value = &((*this)[index]); + return value == &null ? defaultValue : *value; +} + + +bool +Value::isValidIndex( UInt index ) const +{ + return index < size(); +} + + + +const Value & +Value::operator[]( const char *key ) const +{ + JSON_ASSERT( type_ == nullValue || type_ == objectValue ); + if ( type_ == nullValue ) + return null; +#ifndef JSON_VALUE_USE_INTERNAL_MAP + CZString actualKey( key, CZString::noDuplication ); + ObjectValues::const_iterator it = value_.map_->find( actualKey ); + if ( it == value_.map_->end() ) + return null; + return (*it).second; +#else + const Value *value = value_.map_->find( key ); + return value ? *value : null; +#endif +} + + +Value & +Value::operator[]( const std::string &key ) +{ + return (*this)[ key.c_str() ]; +} + + +const Value & +Value::operator[]( const std::string &key ) const +{ + return (*this)[ key.c_str() ]; +} + +Value & +Value::operator[]( const StaticString &key ) +{ + return resolveReference( key, true ); +} + + +# ifdef JSON_USE_CPPTL +Value & +Value::operator[]( const CppTL::ConstString &key ) +{ + return (*this)[ key.c_str() ]; +} + + +const Value & +Value::operator[]( const CppTL::ConstString &key ) const +{ + return (*this)[ key.c_str() ]; +} +# endif + + +Value & +Value::append( const Value &value ) +{ + return (*this)[size()] = value; +} + + +Value +Value::get( const char *key, + const Value &defaultValue ) const +{ + const Value *value = &((*this)[key]); + return value == &null ? defaultValue : *value; +} + + +Value +Value::get( const std::string &key, + const Value &defaultValue ) const +{ + return get( key.c_str(), defaultValue ); +} + +Value +Value::removeMember( const char* key ) +{ + JSON_ASSERT( type_ == nullValue || type_ == objectValue ); + if ( type_ == nullValue ) + return null; +#ifndef JSON_VALUE_USE_INTERNAL_MAP + CZString actualKey( key, CZString::noDuplication ); + ObjectValues::iterator it = value_.map_->find( actualKey ); + if ( it == value_.map_->end() ) + return null; + Value old(it->second); + value_.map_->erase(it); + return old; +#else + Value *value = value_.map_->find( key ); + if (value){ + Value old(*value); + value_.map_.remove( key ); + return old; + } else { + return null; + } +#endif +} + +Value +Value::removeMember( const std::string &key ) +{ + return removeMember( key.c_str() ); +} + +# ifdef JSON_USE_CPPTL +Value +Value::get( const CppTL::ConstString &key, + const Value &defaultValue ) const +{ + return get( key.c_str(), defaultValue ); +} +# endif + +bool +Value::isMember( const char *key ) const +{ + const Value *value = &((*this)[key]); + return value != &null; +} + + +bool +Value::isMember( const std::string &key ) const +{ + return isMember( key.c_str() ); +} + + +# ifdef JSON_USE_CPPTL +bool +Value::isMember( const CppTL::ConstString &key ) const +{ + return isMember( key.c_str() ); +} +#endif + +Value::Members +Value::getMemberNames() const +{ + JSON_ASSERT( type_ == nullValue || type_ == objectValue ); + if ( type_ == nullValue ) + return Value::Members(); + Members members; + members.reserve( value_.map_->size() ); +#ifndef JSON_VALUE_USE_INTERNAL_MAP + ObjectValues::const_iterator it = value_.map_->begin(); + ObjectValues::const_iterator itEnd = value_.map_->end(); + for ( ; it != itEnd; ++it ) + members.push_back( std::string( (*it).first.c_str() ) ); +#else + ValueInternalMap::IteratorState it; + ValueInternalMap::IteratorState itEnd; + value_.map_->makeBeginIterator( it ); + value_.map_->makeEndIterator( itEnd ); + for ( ; !ValueInternalMap::equals( it, itEnd ); ValueInternalMap::increment(it) ) + members.push_back( std::string( ValueInternalMap::key( it ) ) ); +#endif + return members; +} +// +//# ifdef JSON_USE_CPPTL +//EnumMemberNames +//Value::enumMemberNames() const +//{ +// if ( type_ == objectValue ) +// { +// return CppTL::Enum::any( CppTL::Enum::transform( +// CppTL::Enum::keys( *(value_.map_), CppTL::Type() ), +// MemberNamesTransform() ) ); +// } +// return EnumMemberNames(); +//} +// +// +//EnumValues +//Value::enumValues() const +//{ +// if ( type_ == objectValue || type_ == arrayValue ) +// return CppTL::Enum::anyValues( *(value_.map_), +// CppTL::Type() ); +// return EnumValues(); +//} +// +//# endif + + +bool +Value::isNull() const +{ + return type_ == nullValue; +} + + +bool +Value::isBool() const +{ + return type_ == booleanValue; +} + + +bool +Value::isInt() const +{ + return type_ == intValue; +} + + +bool +Value::isUInt() const +{ + return type_ == uintValue; +} + + +bool +Value::isIntegral() const +{ + return type_ == intValue + || type_ == uintValue + || type_ == booleanValue; +} + + +bool +Value::isDouble() const +{ + return type_ == realValue; +} + + +bool +Value::isNumeric() const +{ + return isIntegral() || isDouble(); +} + + +bool +Value::isString() const +{ + return type_ == stringValue; +} + + +bool +Value::isArray() const +{ + return type_ == nullValue || type_ == arrayValue; +} + + +bool +Value::isObject() const +{ + return type_ == nullValue || type_ == objectValue; +} + + +void +Value::setComment( const char *comment, + CommentPlacement placement ) +{ + if ( !comments_ ) + comments_ = new CommentInfo[numberOfCommentPlacement]; + comments_[placement].setComment( comment ); +} + + +void +Value::setComment( const std::string &comment, + CommentPlacement placement ) +{ + setComment( comment.c_str(), placement ); +} + + +bool +Value::hasComment( CommentPlacement placement ) const +{ + return comments_ != 0 && comments_[placement].comment_ != 0; +} + +std::string +Value::getComment( CommentPlacement placement ) const +{ + if ( hasComment(placement) ) + return comments_[placement].comment_; + return ""; +} + + +std::string +Value::toStyledString() const +{ + StyledWriter writer; + return writer.write( *this ); +} + + +Value::const_iterator +Value::begin() const +{ + switch ( type_ ) + { +#ifdef JSON_VALUE_USE_INTERNAL_MAP + case arrayValue: + if ( value_.array_ ) + { + ValueInternalArray::IteratorState it; + value_.array_->makeBeginIterator( it ); + return const_iterator( it ); + } + break; + case objectValue: + if ( value_.map_ ) + { + ValueInternalMap::IteratorState it; + value_.map_->makeBeginIterator( it ); + return const_iterator( it ); + } + break; +#else + case arrayValue: + case objectValue: + if ( value_.map_ ) + return const_iterator( value_.map_->begin() ); + break; +#endif + default: + break; + } + return const_iterator(); +} + +Value::const_iterator +Value::end() const +{ + switch ( type_ ) + { +#ifdef JSON_VALUE_USE_INTERNAL_MAP + case arrayValue: + if ( value_.array_ ) + { + ValueInternalArray::IteratorState it; + value_.array_->makeEndIterator( it ); + return const_iterator( it ); + } + break; + case objectValue: + if ( value_.map_ ) + { + ValueInternalMap::IteratorState it; + value_.map_->makeEndIterator( it ); + return const_iterator( it ); + } + break; +#else + case arrayValue: + case objectValue: + if ( value_.map_ ) + return const_iterator( value_.map_->end() ); + break; +#endif + default: + break; + } + return const_iterator(); +} + + +Value::iterator +Value::begin() +{ + switch ( type_ ) + { +#ifdef JSON_VALUE_USE_INTERNAL_MAP + case arrayValue: + if ( value_.array_ ) + { + ValueInternalArray::IteratorState it; + value_.array_->makeBeginIterator( it ); + return iterator( it ); + } + break; + case objectValue: + if ( value_.map_ ) + { + ValueInternalMap::IteratorState it; + value_.map_->makeBeginIterator( it ); + return iterator( it ); + } + break; +#else + case arrayValue: + case objectValue: + if ( value_.map_ ) + return iterator( value_.map_->begin() ); + break; +#endif + default: + break; + } + return iterator(); +} + +Value::iterator +Value::end() +{ + switch ( type_ ) + { +#ifdef JSON_VALUE_USE_INTERNAL_MAP + case arrayValue: + if ( value_.array_ ) + { + ValueInternalArray::IteratorState it; + value_.array_->makeEndIterator( it ); + return iterator( it ); + } + break; + case objectValue: + if ( value_.map_ ) + { + ValueInternalMap::IteratorState it; + value_.map_->makeEndIterator( it ); + return iterator( it ); + } + break; +#else + case arrayValue: + case objectValue: + if ( value_.map_ ) + return iterator( value_.map_->end() ); + break; +#endif + default: + break; + } + return iterator(); +} + + +// class PathArgument +// ////////////////////////////////////////////////////////////////// + +PathArgument::PathArgument() + : kind_( kindNone ) +{ +} + + +PathArgument::PathArgument( Value::UInt index ) + : index_( index ) + , kind_( kindIndex ) +{ +} + + +PathArgument::PathArgument( const char *key ) + : key_( key ) + , kind_( kindKey ) +{ +} + + +PathArgument::PathArgument( const std::string &key ) + : key_( key.c_str() ) + , kind_( kindKey ) +{ +} + +// class Path +// ////////////////////////////////////////////////////////////////// + +Path::Path( const std::string &path, + const PathArgument &a1, + const PathArgument &a2, + const PathArgument &a3, + const PathArgument &a4, + const PathArgument &a5 ) +{ + InArgs in; + in.push_back( &a1 ); + in.push_back( &a2 ); + in.push_back( &a3 ); + in.push_back( &a4 ); + in.push_back( &a5 ); + makePath( path, in ); +} + + +void +Path::makePath( const std::string &path, + const InArgs &in ) +{ + const char *current = path.c_str(); + const char *end = current + path.length(); + InArgs::const_iterator itInArg = in.begin(); + while ( current != end ) + { + if ( *current == '[' ) + { + ++current; + if ( *current == '%' ) + addPathInArg( path, in, itInArg, PathArgument::kindIndex ); + else + { + Value::UInt index = 0; + for ( ; current != end && *current >= '0' && *current <= '9'; ++current ) + index = index * 10 + Value::UInt(*current - '0'); + args_.push_back( index ); + } + if ( current == end || *current++ != ']' ) + invalidPath( path, int(current - path.c_str()) ); + } + else if ( *current == '%' ) + { + addPathInArg( path, in, itInArg, PathArgument::kindKey ); + ++current; + } + else if ( *current == '.' ) + { + ++current; + } + else + { + const char *beginName = current; + while ( current != end && !strchr( "[.", *current ) ) + ++current; + args_.push_back( std::string( beginName, current ) ); + } + } +} + + +void +Path::addPathInArg( const std::string &path, + const InArgs &in, + InArgs::const_iterator &itInArg, + PathArgument::Kind kind ) +{ + if ( itInArg == in.end() ) + { + // Error: missing argument %d + } + else if ( (*itInArg)->kind_ != kind ) + { + // Error: bad argument type + } + else + { + args_.push_back( **itInArg ); + } +} + + +void +Path::invalidPath( const std::string &path, + int location ) +{ + // Error: invalid path. +} + + +const Value & +Path::resolve( const Value &root ) const +{ + const Value *node = &root; + for ( Args::const_iterator it = args_.begin(); it != args_.end(); ++it ) + { + const PathArgument &arg = *it; + if ( arg.kind_ == PathArgument::kindIndex ) + { + if ( !node->isArray() || node->isValidIndex( arg.index_ ) ) + { + // Error: unable to resolve path (array value expected at position... + } + node = &((*node)[arg.index_]); + } + else if ( arg.kind_ == PathArgument::kindKey ) + { + if ( !node->isObject() ) + { + // Error: unable to resolve path (object value expected at position...) + } + node = &((*node)[arg.key_]); + if ( node == &Value::null ) + { + // Error: unable to resolve path (object has no member named '' at position...) + } + } + } + return *node; +} + + +Value +Path::resolve( const Value &root, + const Value &defaultValue ) const +{ + const Value *node = &root; + for ( Args::const_iterator it = args_.begin(); it != args_.end(); ++it ) + { + const PathArgument &arg = *it; + if ( arg.kind_ == PathArgument::kindIndex ) + { + if ( !node->isArray() || node->isValidIndex( arg.index_ ) ) + return defaultValue; + node = &((*node)[arg.index_]); + } + else if ( arg.kind_ == PathArgument::kindKey ) + { + if ( !node->isObject() ) + return defaultValue; + node = &((*node)[arg.key_]); + if ( node == &Value::null ) + return defaultValue; + } + } + return *node; +} + + +Value & +Path::make( Value &root ) const +{ + Value *node = &root; + for ( Args::const_iterator it = args_.begin(); it != args_.end(); ++it ) + { + const PathArgument &arg = *it; + if ( arg.kind_ == PathArgument::kindIndex ) + { + if ( !node->isArray() ) + { + // Error: node is not an array at position ... + } + node = &((*node)[arg.index_]); + } + else if ( arg.kind_ == PathArgument::kindKey ) + { + if ( !node->isObject() ) + { + // Error: node is not an object at position... + } + node = &((*node)[arg.key_]); + } + } + return *node; +} + + +} // namespace Json diff --git a/cordova-lib/spec-plugman-create/plugins/cordova.echo/src/blackberry10/native/public/json_valueiterator.inl b/cordova-lib/spec-plugman-create/plugins/cordova.echo/src/blackberry10/native/public/json_valueiterator.inl new file mode 100644 index 000000000..736e260ea --- /dev/null +++ b/cordova-lib/spec-plugman-create/plugins/cordova.echo/src/blackberry10/native/public/json_valueiterator.inl @@ -0,0 +1,292 @@ +// included by json_value.cpp +// everything is within Json namespace + + +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// class ValueIteratorBase +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// + +ValueIteratorBase::ValueIteratorBase() +#ifndef JSON_VALUE_USE_INTERNAL_MAP + : current_() + , isNull_( true ) +{ +} +#else + : isArray_( true ) + , isNull_( true ) +{ + iterator_.array_ = ValueInternalArray::IteratorState(); +} +#endif + + +#ifndef JSON_VALUE_USE_INTERNAL_MAP +ValueIteratorBase::ValueIteratorBase( const Value::ObjectValues::iterator ¤t ) + : current_( current ) + , isNull_( false ) +{ +} +#else +ValueIteratorBase::ValueIteratorBase( const ValueInternalArray::IteratorState &state ) + : isArray_( true ) +{ + iterator_.array_ = state; +} + + +ValueIteratorBase::ValueIteratorBase( const ValueInternalMap::IteratorState &state ) + : isArray_( false ) +{ + iterator_.map_ = state; +} +#endif + +Value & +ValueIteratorBase::deref() const +{ +#ifndef JSON_VALUE_USE_INTERNAL_MAP + return current_->second; +#else + if ( isArray_ ) + return ValueInternalArray::dereference( iterator_.array_ ); + return ValueInternalMap::value( iterator_.map_ ); +#endif +} + + +void +ValueIteratorBase::increment() +{ +#ifndef JSON_VALUE_USE_INTERNAL_MAP + ++current_; +#else + if ( isArray_ ) + ValueInternalArray::increment( iterator_.array_ ); + ValueInternalMap::increment( iterator_.map_ ); +#endif +} + + +void +ValueIteratorBase::decrement() +{ +#ifndef JSON_VALUE_USE_INTERNAL_MAP + --current_; +#else + if ( isArray_ ) + ValueInternalArray::decrement( iterator_.array_ ); + ValueInternalMap::decrement( iterator_.map_ ); +#endif +} + + +ValueIteratorBase::difference_type +ValueIteratorBase::computeDistance( const SelfType &other ) const +{ +#ifndef JSON_VALUE_USE_INTERNAL_MAP +# ifdef JSON_USE_CPPTL_SMALLMAP + return current_ - other.current_; +# else + // Iterator for null value are initialized using the default + // constructor, which initialize current_ to the default + // std::map::iterator. As begin() and end() are two instance + // of the default std::map::iterator, they can not be compared. + // To allow this, we handle this comparison specifically. + if ( isNull_ && other.isNull_ ) + { + return 0; + } + + + // Usage of std::distance is not portable (does not compile with Sun Studio 12 RogueWave STL, + // which is the one used by default). + // Using a portable hand-made version for non random iterator instead: + // return difference_type( std::distance( current_, other.current_ ) ); + difference_type myDistance = 0; + for ( Value::ObjectValues::iterator it = current_; it != other.current_; ++it ) + { + ++myDistance; + } + return myDistance; +# endif +#else + if ( isArray_ ) + return ValueInternalArray::distance( iterator_.array_, other.iterator_.array_ ); + return ValueInternalMap::distance( iterator_.map_, other.iterator_.map_ ); +#endif +} + + +bool +ValueIteratorBase::isEqual( const SelfType &other ) const +{ +#ifndef JSON_VALUE_USE_INTERNAL_MAP + if ( isNull_ ) + { + return other.isNull_; + } + return current_ == other.current_; +#else + if ( isArray_ ) + return ValueInternalArray::equals( iterator_.array_, other.iterator_.array_ ); + return ValueInternalMap::equals( iterator_.map_, other.iterator_.map_ ); +#endif +} + + +void +ValueIteratorBase::copy( const SelfType &other ) +{ +#ifndef JSON_VALUE_USE_INTERNAL_MAP + current_ = other.current_; +#else + if ( isArray_ ) + iterator_.array_ = other.iterator_.array_; + iterator_.map_ = other.iterator_.map_; +#endif +} + + +Value +ValueIteratorBase::key() const +{ +#ifndef JSON_VALUE_USE_INTERNAL_MAP + const Value::CZString czstring = (*current_).first; + if ( czstring.c_str() ) + { + if ( czstring.isStaticString() ) + return Value( StaticString( czstring.c_str() ) ); + return Value( czstring.c_str() ); + } + return Value( czstring.index() ); +#else + if ( isArray_ ) + return Value( ValueInternalArray::indexOf( iterator_.array_ ) ); + bool isStatic; + const char *memberName = ValueInternalMap::key( iterator_.map_, isStatic ); + if ( isStatic ) + return Value( StaticString( memberName ) ); + return Value( memberName ); +#endif +} + + +UInt +ValueIteratorBase::index() const +{ +#ifndef JSON_VALUE_USE_INTERNAL_MAP + const Value::CZString czstring = (*current_).first; + if ( !czstring.c_str() ) + return czstring.index(); + return Value::UInt( -1 ); +#else + if ( isArray_ ) + return Value::UInt( ValueInternalArray::indexOf( iterator_.array_ ) ); + return Value::UInt( -1 ); +#endif +} + + +const char * +ValueIteratorBase::memberName() const +{ +#ifndef JSON_VALUE_USE_INTERNAL_MAP + const char *name = (*current_).first.c_str(); + return name ? name : ""; +#else + if ( !isArray_ ) + return ValueInternalMap::key( iterator_.map_ ); + return ""; +#endif +} + + +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// class ValueConstIterator +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// + +ValueConstIterator::ValueConstIterator() +{ +} + + +#ifndef JSON_VALUE_USE_INTERNAL_MAP +ValueConstIterator::ValueConstIterator( const Value::ObjectValues::iterator ¤t ) + : ValueIteratorBase( current ) +{ +} +#else +ValueConstIterator::ValueConstIterator( const ValueInternalArray::IteratorState &state ) + : ValueIteratorBase( state ) +{ +} + +ValueConstIterator::ValueConstIterator( const ValueInternalMap::IteratorState &state ) + : ValueIteratorBase( state ) +{ +} +#endif + +ValueConstIterator & +ValueConstIterator::operator =( const ValueIteratorBase &other ) +{ + copy( other ); + return *this; +} + + +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// class ValueIterator +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// + +ValueIterator::ValueIterator() +{ +} + + +#ifndef JSON_VALUE_USE_INTERNAL_MAP +ValueIterator::ValueIterator( const Value::ObjectValues::iterator ¤t ) + : ValueIteratorBase( current ) +{ +} +#else +ValueIterator::ValueIterator( const ValueInternalArray::IteratorState &state ) + : ValueIteratorBase( state ) +{ +} + +ValueIterator::ValueIterator( const ValueInternalMap::IteratorState &state ) + : ValueIteratorBase( state ) +{ +} +#endif + +ValueIterator::ValueIterator( const ValueConstIterator &other ) + : ValueIteratorBase( other ) +{ +} + +ValueIterator::ValueIterator( const ValueIterator &other ) + : ValueIteratorBase( other ) +{ +} + +ValueIterator & +ValueIterator::operator =( const SelfType &other ) +{ + copy( other ); + return *this; +} diff --git a/cordova-lib/spec-plugman-create/plugins/cordova.echo/src/blackberry10/native/public/json_writer.cpp b/cordova-lib/spec-plugman-create/plugins/cordova.echo/src/blackberry10/native/public/json_writer.cpp new file mode 100644 index 000000000..a522ef6b0 --- /dev/null +++ b/cordova-lib/spec-plugman-create/plugins/cordova.echo/src/blackberry10/native/public/json_writer.cpp @@ -0,0 +1,829 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +#if _MSC_VER >= 1400 // VC++ 8.0 +#pragma warning( disable : 4996 ) // disable warning about strdup being deprecated. +#endif + +namespace Json { + +static bool isControlCharacter(char ch) +{ + return ch > 0 && ch <= 0x1F; +} + +static bool containsControlCharacter( const char* str ) +{ + while ( *str ) + { + if ( isControlCharacter( *(str++) ) ) + return true; + } + return false; +} +static void uintToString( unsigned int value, + char *¤t ) +{ + *--current = 0; + do + { + *--current = (value % 10) + '0'; + value /= 10; + } + while ( value != 0 ); +} + +std::string valueToString( Int value ) +{ + char buffer[32]; + char *current = buffer + sizeof(buffer); + bool isNegative = value < 0; + if ( isNegative ) + value = -value; + uintToString( UInt(value), current ); + if ( isNegative ) + *--current = '-'; + assert( current >= buffer ); + return current; +} + + +std::string valueToString( UInt value ) +{ + char buffer[32]; + char *current = buffer + sizeof(buffer); + uintToString( value, current ); + assert( current >= buffer ); + return current; +} + +std::string valueToString( double value ) +{ + char buffer[32]; +#if defined(_MSC_VER) && defined(__STDC_SECURE_LIB__) // Use secure version with visual studio 2005 to avoid warning. + sprintf_s(buffer, sizeof(buffer), "%#.16g", value); +#else + sprintf(buffer, "%#.16g", value); +#endif + char* ch = buffer + strlen(buffer) - 1; + if (*ch != '0') return buffer; // nothing to truncate, so save time + while(ch > buffer && *ch == '0'){ + --ch; + } + char* last_nonzero = ch; + while(ch >= buffer){ + switch(*ch){ + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + --ch; + continue; + case '.': + // Truncate zeroes to save bytes in output, but keep one. + *(last_nonzero+2) = '\0'; + return buffer; + default: + return buffer; + } + } + return buffer; +} + + +std::string valueToString( bool value ) +{ + return value ? "true" : "false"; +} + +std::string valueToQuotedString( const char *value ) +{ + // Not sure how to handle unicode... + if (strpbrk(value, "\"\\\b\f\n\r\t") == NULL && !containsControlCharacter( value )) + return std::string("\"") + value + "\""; + // We have to walk value and escape any special characters. + // Appending to std::string is not efficient, but this should be rare. + // (Note: forward slashes are *not* rare, but I am not escaping them.) + unsigned maxsize = strlen(value)*2 + 3; // allescaped+quotes+NULL + std::string result; + result.reserve(maxsize); // to avoid lots of mallocs + result += "\""; + for (const char* c=value; *c != 0; ++c) + { + switch(*c) + { + case '\"': + result += "\\\""; + break; + case '\\': + result += "\\\\"; + break; + case '\b': + result += "\\b"; + break; + case '\f': + result += "\\f"; + break; + case '\n': + result += "\\n"; + break; + case '\r': + result += "\\r"; + break; + case '\t': + result += "\\t"; + break; + //case '/': + // Even though \/ is considered a legal escape in JSON, a bare + // slash is also legal, so I see no reason to escape it. + // (I hope I am not misunderstanding something. + // blep notes: actually escaping \/ may be useful in javascript to avoid (*c); + result += oss.str(); + } + else + { + result += *c; + } + break; + } + } + result += "\""; + return result; +} + +// Class Writer +// ////////////////////////////////////////////////////////////////// +Writer::~Writer() +{ +} + + +// Class FastWriter +// ////////////////////////////////////////////////////////////////// + +FastWriter::FastWriter() + : yamlCompatibilityEnabled_( false ) +{ +} + + +void +FastWriter::enableYAMLCompatibility() +{ + yamlCompatibilityEnabled_ = true; +} + + +std::string +FastWriter::write( const Value &root ) +{ + document_ = ""; + writeValue( root ); + document_ += "\n"; + return document_; +} + + +void +FastWriter::writeValue( const Value &value ) +{ + switch ( value.type() ) + { + case nullValue: + document_ += "null"; + break; + case intValue: + document_ += valueToString( value.asInt() ); + break; + case uintValue: + document_ += valueToString( value.asUInt() ); + break; + case realValue: + document_ += valueToString( value.asDouble() ); + break; + case stringValue: + document_ += valueToQuotedString( value.asCString() ); + break; + case booleanValue: + document_ += valueToString( value.asBool() ); + break; + case arrayValue: + { + document_ += "["; + int size = value.size(); + for ( int index =0; index < size; ++index ) + { + if ( index > 0 ) + document_ += ","; + writeValue( value[index] ); + } + document_ += "]"; + } + break; + case objectValue: + { + Value::Members members( value.getMemberNames() ); + document_ += "{"; + for ( Value::Members::iterator it = members.begin(); + it != members.end(); + ++it ) + { + const std::string &name = *it; + if ( it != members.begin() ) + document_ += ","; + document_ += valueToQuotedString( name.c_str() ); + document_ += yamlCompatibilityEnabled_ ? ": " + : ":"; + writeValue( value[name] ); + } + document_ += "}"; + } + break; + } +} + + +// Class StyledWriter +// ////////////////////////////////////////////////////////////////// + +StyledWriter::StyledWriter() + : rightMargin_( 74 ) + , indentSize_( 3 ) +{ +} + + +std::string +StyledWriter::write( const Value &root ) +{ + document_ = ""; + addChildValues_ = false; + indentString_ = ""; + writeCommentBeforeValue( root ); + writeValue( root ); + writeCommentAfterValueOnSameLine( root ); + document_ += "\n"; + return document_; +} + + +void +StyledWriter::writeValue( const Value &value ) +{ + switch ( value.type() ) + { + case nullValue: + pushValue( "null" ); + break; + case intValue: + pushValue( valueToString( value.asInt() ) ); + break; + case uintValue: + pushValue( valueToString( value.asUInt() ) ); + break; + case realValue: + pushValue( valueToString( value.asDouble() ) ); + break; + case stringValue: + pushValue( valueToQuotedString( value.asCString() ) ); + break; + case booleanValue: + pushValue( valueToString( value.asBool() ) ); + break; + case arrayValue: + writeArrayValue( value); + break; + case objectValue: + { + Value::Members members( value.getMemberNames() ); + if ( members.empty() ) + pushValue( "{}" ); + else + { + writeWithIndent( "{" ); + indent(); + Value::Members::iterator it = members.begin(); + while ( true ) + { + const std::string &name = *it; + const Value &childValue = value[name]; + writeCommentBeforeValue( childValue ); + writeWithIndent( valueToQuotedString( name.c_str() ) ); + document_ += " : "; + writeValue( childValue ); + if ( ++it == members.end() ) + { + writeCommentAfterValueOnSameLine( childValue ); + break; + } + document_ += ","; + writeCommentAfterValueOnSameLine( childValue ); + } + unindent(); + writeWithIndent( "}" ); + } + } + break; + } +} + + +void +StyledWriter::writeArrayValue( const Value &value ) +{ + unsigned size = value.size(); + if ( size == 0 ) + pushValue( "[]" ); + else + { + bool isArrayMultiLine = isMultineArray( value ); + if ( isArrayMultiLine ) + { + writeWithIndent( "[" ); + indent(); + bool hasChildValue = !childValues_.empty(); + unsigned index =0; + while ( true ) + { + const Value &childValue = value[index]; + writeCommentBeforeValue( childValue ); + if ( hasChildValue ) + writeWithIndent( childValues_[index] ); + else + { + writeIndent(); + writeValue( childValue ); + } + if ( ++index == size ) + { + writeCommentAfterValueOnSameLine( childValue ); + break; + } + document_ += ","; + writeCommentAfterValueOnSameLine( childValue ); + } + unindent(); + writeWithIndent( "]" ); + } + else // output on a single line + { + assert( childValues_.size() == size ); + document_ += "[ "; + for ( unsigned index =0; index < size; ++index ) + { + if ( index > 0 ) + document_ += ", "; + document_ += childValues_[index]; + } + document_ += " ]"; + } + } +} + + +bool +StyledWriter::isMultineArray( const Value &value ) +{ + int size = value.size(); + bool isMultiLine = size*3 >= rightMargin_ ; + childValues_.clear(); + for ( int index =0; index < size && !isMultiLine; ++index ) + { + const Value &childValue = value[index]; + isMultiLine = isMultiLine || + ( (childValue.isArray() || childValue.isObject()) && + childValue.size() > 0 ); + } + if ( !isMultiLine ) // check if line length > max line length + { + childValues_.reserve( size ); + addChildValues_ = true; + int lineLength = 4 + (size-1)*2; // '[ ' + ', '*n + ' ]' + for ( int index =0; index < size && !isMultiLine; ++index ) + { + writeValue( value[index] ); + lineLength += int( childValues_[index].length() ); + isMultiLine = isMultiLine && hasCommentForValue( value[index] ); + } + addChildValues_ = false; + isMultiLine = isMultiLine || lineLength >= rightMargin_; + } + return isMultiLine; +} + + +void +StyledWriter::pushValue( const std::string &value ) +{ + if ( addChildValues_ ) + childValues_.push_back( value ); + else + document_ += value; +} + + +void +StyledWriter::writeIndent() +{ + if ( !document_.empty() ) + { + char last = document_[document_.length()-1]; + if ( last == ' ' ) // already indented + return; + if ( last != '\n' ) // Comments may add new-line + document_ += '\n'; + } + document_ += indentString_; +} + + +void +StyledWriter::writeWithIndent( const std::string &value ) +{ + writeIndent(); + document_ += value; +} + + +void +StyledWriter::indent() +{ + indentString_ += std::string( indentSize_, ' ' ); +} + + +void +StyledWriter::unindent() +{ + assert( int(indentString_.size()) >= indentSize_ ); + indentString_.resize( indentString_.size() - indentSize_ ); +} + + +void +StyledWriter::writeCommentBeforeValue( const Value &root ) +{ + if ( !root.hasComment( commentBefore ) ) + return; + document_ += normalizeEOL( root.getComment( commentBefore ) ); + document_ += "\n"; +} + + +void +StyledWriter::writeCommentAfterValueOnSameLine( const Value &root ) +{ + if ( root.hasComment( commentAfterOnSameLine ) ) + document_ += " " + normalizeEOL( root.getComment( commentAfterOnSameLine ) ); + + if ( root.hasComment( commentAfter ) ) + { + document_ += "\n"; + document_ += normalizeEOL( root.getComment( commentAfter ) ); + document_ += "\n"; + } +} + + +bool +StyledWriter::hasCommentForValue( const Value &value ) +{ + return value.hasComment( commentBefore ) + || value.hasComment( commentAfterOnSameLine ) + || value.hasComment( commentAfter ); +} + + +std::string +StyledWriter::normalizeEOL( const std::string &text ) +{ + std::string normalized; + normalized.reserve( text.length() ); + const char *begin = text.c_str(); + const char *end = begin + text.length(); + const char *current = begin; + while ( current != end ) + { + char c = *current++; + if ( c == '\r' ) // mac or dos EOL + { + if ( *current == '\n' ) // convert dos EOL + ++current; + normalized += '\n'; + } + else // handle unix EOL & other char + normalized += c; + } + return normalized; +} + + +// Class StyledStreamWriter +// ////////////////////////////////////////////////////////////////// + +StyledStreamWriter::StyledStreamWriter( std::string indentation ) + : document_(NULL) + , rightMargin_( 74 ) + , indentation_( indentation ) +{ +} + + +void +StyledStreamWriter::write( std::ostream &out, const Value &root ) +{ + document_ = &out; + addChildValues_ = false; + indentString_ = ""; + writeCommentBeforeValue( root ); + writeValue( root ); + writeCommentAfterValueOnSameLine( root ); + *document_ << "\n"; + document_ = NULL; // Forget the stream, for safety. +} + + +void +StyledStreamWriter::writeValue( const Value &value ) +{ + switch ( value.type() ) + { + case nullValue: + pushValue( "null" ); + break; + case intValue: + pushValue( valueToString( value.asInt() ) ); + break; + case uintValue: + pushValue( valueToString( value.asUInt() ) ); + break; + case realValue: + pushValue( valueToString( value.asDouble() ) ); + break; + case stringValue: + pushValue( valueToQuotedString( value.asCString() ) ); + break; + case booleanValue: + pushValue( valueToString( value.asBool() ) ); + break; + case arrayValue: + writeArrayValue( value); + break; + case objectValue: + { + Value::Members members( value.getMemberNames() ); + if ( members.empty() ) + pushValue( "{}" ); + else + { + writeWithIndent( "{" ); + indent(); + Value::Members::iterator it = members.begin(); + while ( true ) + { + const std::string &name = *it; + const Value &childValue = value[name]; + writeCommentBeforeValue( childValue ); + writeWithIndent( valueToQuotedString( name.c_str() ) ); + *document_ << " : "; + writeValue( childValue ); + if ( ++it == members.end() ) + { + writeCommentAfterValueOnSameLine( childValue ); + break; + } + *document_ << ","; + writeCommentAfterValueOnSameLine( childValue ); + } + unindent(); + writeWithIndent( "}" ); + } + } + break; + } +} + + +void +StyledStreamWriter::writeArrayValue( const Value &value ) +{ + unsigned size = value.size(); + if ( size == 0 ) + pushValue( "[]" ); + else + { + bool isArrayMultiLine = isMultineArray( value ); + if ( isArrayMultiLine ) + { + writeWithIndent( "[" ); + indent(); + bool hasChildValue = !childValues_.empty(); + unsigned index =0; + while ( true ) + { + const Value &childValue = value[index]; + writeCommentBeforeValue( childValue ); + if ( hasChildValue ) + writeWithIndent( childValues_[index] ); + else + { + writeIndent(); + writeValue( childValue ); + } + if ( ++index == size ) + { + writeCommentAfterValueOnSameLine( childValue ); + break; + } + *document_ << ","; + writeCommentAfterValueOnSameLine( childValue ); + } + unindent(); + writeWithIndent( "]" ); + } + else // output on a single line + { + assert( childValues_.size() == size ); + *document_ << "[ "; + for ( unsigned index =0; index < size; ++index ) + { + if ( index > 0 ) + *document_ << ", "; + *document_ << childValues_[index]; + } + *document_ << " ]"; + } + } +} + + +bool +StyledStreamWriter::isMultineArray( const Value &value ) +{ + int size = value.size(); + bool isMultiLine = size*3 >= rightMargin_ ; + childValues_.clear(); + for ( int index =0; index < size && !isMultiLine; ++index ) + { + const Value &childValue = value[index]; + isMultiLine = isMultiLine || + ( (childValue.isArray() || childValue.isObject()) && + childValue.size() > 0 ); + } + if ( !isMultiLine ) // check if line length > max line length + { + childValues_.reserve( size ); + addChildValues_ = true; + int lineLength = 4 + (size-1)*2; // '[ ' + ', '*n + ' ]' + for ( int index =0; index < size && !isMultiLine; ++index ) + { + writeValue( value[index] ); + lineLength += int( childValues_[index].length() ); + isMultiLine = isMultiLine && hasCommentForValue( value[index] ); + } + addChildValues_ = false; + isMultiLine = isMultiLine || lineLength >= rightMargin_; + } + return isMultiLine; +} + + +void +StyledStreamWriter::pushValue( const std::string &value ) +{ + if ( addChildValues_ ) + childValues_.push_back( value ); + else + *document_ << value; +} + + +void +StyledStreamWriter::writeIndent() +{ + /* + Some comments in this method would have been nice. ;-) + + if ( !document_.empty() ) + { + char last = document_[document_.length()-1]; + if ( last == ' ' ) // already indented + return; + if ( last != '\n' ) // Comments may add new-line + *document_ << '\n'; + } + */ + *document_ << '\n' << indentString_; +} + + +void +StyledStreamWriter::writeWithIndent( const std::string &value ) +{ + writeIndent(); + *document_ << value; +} + + +void +StyledStreamWriter::indent() +{ + indentString_ += indentation_; +} + + +void +StyledStreamWriter::unindent() +{ + assert( indentString_.size() >= indentation_.size() ); + indentString_.resize( indentString_.size() - indentation_.size() ); +} + + +void +StyledStreamWriter::writeCommentBeforeValue( const Value &root ) +{ + if ( !root.hasComment( commentBefore ) ) + return; + *document_ << normalizeEOL( root.getComment( commentBefore ) ); + *document_ << "\n"; +} + + +void +StyledStreamWriter::writeCommentAfterValueOnSameLine( const Value &root ) +{ + if ( root.hasComment( commentAfterOnSameLine ) ) + *document_ << " " + normalizeEOL( root.getComment( commentAfterOnSameLine ) ); + + if ( root.hasComment( commentAfter ) ) + { + *document_ << "\n"; + *document_ << normalizeEOL( root.getComment( commentAfter ) ); + *document_ << "\n"; + } +} + + +bool +StyledStreamWriter::hasCommentForValue( const Value &value ) +{ + return value.hasComment( commentBefore ) + || value.hasComment( commentAfterOnSameLine ) + || value.hasComment( commentAfter ); +} + + +std::string +StyledStreamWriter::normalizeEOL( const std::string &text ) +{ + std::string normalized; + normalized.reserve( text.length() ); + const char *begin = text.c_str(); + const char *end = begin + text.length(); + const char *current = begin; + while ( current != end ) + { + char c = *current++; + if ( c == '\r' ) // mac or dos EOL + { + if ( *current == '\n' ) // convert dos EOL + ++current; + normalized += '\n'; + } + else // handle unix EOL & other char + normalized += c; + } + return normalized; +} + + +std::ostream& operator<<( std::ostream &sout, const Value &root ) +{ + Json::StyledStreamWriter writer; + writer.write(sout, root); + return sout; +} + + +} // namespace Json diff --git a/cordova-lib/spec-plugman-create/plugins/cordova.echo/src/blackberry10/native/public/plugin.cpp b/cordova-lib/spec-plugman-create/plugins/cordova.echo/src/blackberry10/native/public/plugin.cpp new file mode 100644 index 000000000..387fceaf1 --- /dev/null +++ b/cordova-lib/spec-plugman-create/plugins/cordova.echo/src/blackberry10/native/public/plugin.cpp @@ -0,0 +1,320 @@ +#include "plugin.h" +#include "tokenizer.h" + +#ifdef _WINDOWS +#include +BOOL APIENTRY DllMain( HANDLE hModule, + DWORD ul_reason_for_call, + LPVOID lpReserved ) +{ + return TRUE; +} +#else +#include +#include + +extern int errno; +#endif + +SendPluginEv SendPluginEvent; + +string g_GetSysErrMsg( void ) +{ + string strError = "Unknown"; + // Problem loading +#ifdef _WINDOWS + int nErrorCode = GetLastError(); + LPTSTR s; + if ( ::FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, + NULL, nErrorCode, 0, ( LPTSTR ) &s, 0, NULL ) ) + { + strError = s; + } + else + { + char szBuf[ 20 ]; + _snprintf_s( szBuf, _countof(szBuf), 19, "%d", nErrorCode ); + strError = szBuf; + } +#else + char szError[80]; + if ( strerror_r( errno, szError, sizeof(szError) ) ) + { + strError = "no description found"; + } + else + { + strError = szError; + } +#endif + return strError; +} + +void g_sleep( unsigned int mseconds ) +{ +#ifdef _WINDOWS + Sleep( mseconds ); +#else + usleep( mseconds * 1000 ); +#endif +} + +string& g_trim( string& str ) +{ + // Whitespace characters + char whspc[] = " \t\r\n\v\f"; + + // Whack off first part + size_t pos = str.find_first_not_of( whspc ); + + if ( pos != string::npos ) + str.replace( 0, pos, "" ); + + // Whack off trailing stuff + pos = str.find_last_not_of( whspc ); + + if ( pos != string::npos ) + str.replace( pos + 1, str.length() - pos, "" ); + + return str; +} + +void g_tokenize( const string& str, const string& delimiters, vector& tokens ) +{ + tokenize( str, tokens, delimiters ); +} + +char* SetEventFunc( SendPluginEv funcPtr ) +{ + static char * szObjList = onGetObjList(); + SendPluginEvent = funcPtr; + return szObjList; +} + + +const int nMAXSIZE = 512; +char* g_pszRetVal = NULL; + +//----------------------------------------------------------- +// Map from an object Id to an object instance +//----------------------------------------------------------- +typedef std::map StringToJExt_T; + +//----------------------------------------------------------- +// Map from a browser context to an id mapping +//----------------------------------------------------------- +typedef std::map VoidToMap_T; + +VoidToMap_T g_context2Map; + +class GlobalSharedModule +{ + +public: + GlobalSharedModule( void ) + { + g_pszRetVal = new char[ nMAXSIZE ]; + } + + ~GlobalSharedModule() + { + delete [] g_pszRetVal; + + VoidToMap_T::iterator posMaps; + + for ( posMaps = g_context2Map.begin(); posMaps != g_context2Map.end(); ++posMaps ) + { + StringToJExt_T& id2Obj = *posMaps->second; + StringToJExt_T::iterator posMap; + + for ( posMap = id2Obj.begin(); posMap != id2Obj.end(); ++posMap ) + { + JSExt* pJSExt = posMap->second; + + if ( pJSExt->CanDelete() ) + { + delete pJSExt; + } + } + + id2Obj.erase( id2Obj.begin(), id2Obj.end() ); + } + + g_context2Map.erase( g_context2Map.begin(), g_context2Map.end() ); + } +}; + +GlobalSharedModule g_sharedModule; + +char* g_str2global( const string& strRetVal ) +{ + int nLen = strRetVal.size(); + + if ( nLen >= nMAXSIZE ) + { + delete [] g_pszRetVal; + g_pszRetVal = new char[ nLen + 1 ]; + } + + else + { + // To minimize the number of memory reallocations, the assumption + // is that in most times this will be the case + delete [] g_pszRetVal; + g_pszRetVal = new char[ nMAXSIZE ]; + } + + strcpy( g_pszRetVal, strRetVal.c_str() ); + return g_pszRetVal; +} + +bool g_unregisterObject( const string& strObjId, void* pContext ) +{ + // Called by the plugin extension implementation + // if the extension handles the deletion of its object + + StringToJExt_T * pID2Obj = NULL; + + VoidToMap_T::iterator iter = g_context2Map.find( pContext ); + + if ( iter != g_context2Map.end() ) + { + pID2Obj = iter->second; + } + else + { + return false; + } + + StringToJExt_T& mapID2Obj = *pID2Obj; + + StringToJExt_T::iterator r = mapID2Obj.find( strObjId ); + + if ( r == mapID2Obj.end() ) + { + return false; + } + + mapID2Obj.erase( strObjId ); + return true; +} + +char* InvokeFunction( const char* szCommand, void* pContext ) +{ + StringToJExt_T * pID2Obj = NULL; + + VoidToMap_T::iterator iter = g_context2Map.find( pContext ); + + if ( iter != g_context2Map.end() ) + { + pID2Obj = iter->second; + } + else + { + pID2Obj = new StringToJExt_T; + g_context2Map[ pContext ] = pID2Obj; + } + + StringToJExt_T& mapID2Obj = *pID2Obj; + + string strFullCommand = szCommand; + vector arParams; + g_tokenize( strFullCommand, " ", arParams ); + string strCommand = arParams[ 0 ]; + string strRetVal = szERROR; + + if ( strCommand == szCREATE ) + { + string strClassName = arParams[ 1 ]; + string strObjId = arParams[ 2 ]; + + StringToJExt_T::iterator r = mapID2Obj.find( strObjId ); + + if ( r != mapID2Obj.end() ) + { + strRetVal += strObjId; + strRetVal += " :Object already exists."; + return g_str2global( strRetVal ); + } + + JSExt* pJSExt = onCreateObject( strClassName, strObjId ); + + if ( pJSExt == NULL ) + { + strRetVal += strObjId; + strRetVal += " :Unknown object type "; + strRetVal += strClassName; + return g_str2global( strRetVal ); + } + + pJSExt->m_pContext = pContext; + mapID2Obj[ strObjId ] = pJSExt; + + strRetVal = szOK; + strRetVal += strObjId; + return g_str2global( strRetVal ); + } + else + if ( strCommand == szINVOKE ) + { + string strObjId = arParams[ 1 ]; + string strMethod = arParams[ 2 ]; + + StringToJExt_T::iterator r = mapID2Obj.find( strObjId ); + + if ( r == mapID2Obj.end() ) + { + strRetVal += strObjId; + strRetVal += " :No object found for id."; + return g_str2global( strRetVal ); + } + + JSExt* pJSExt = r->second; + + size_t nLoc = strFullCommand.find( strObjId ); + + if ( nLoc == string::npos ) + { + strRetVal += strObjId; + strRetVal += " :Internal InvokeMethod error."; + return g_str2global( strRetVal ); + } + + if ( strMethod == szDISPOSE ) + { + StringToJExt_T::iterator r = mapID2Obj.find( strObjId ); + + if ( r == mapID2Obj.end() ) + { + strRetVal = szERROR; + strRetVal += strObjId; + return g_str2global( strRetVal ); + } + + JSExt * pJSExt = mapID2Obj[ strObjId ]; + + if ( pJSExt->CanDelete() ) + { + delete pJSExt; + } + + mapID2Obj.erase( strObjId ); + strRetVal = szOK; + strRetVal += strObjId; + return g_str2global( strRetVal ); + } + + size_t nSuffixLoc = nLoc + strObjId.size(); + string strInvoke = strFullCommand.substr( nSuffixLoc ); + strInvoke = g_trim( strInvoke ); + strRetVal = pJSExt->InvokeMethod( strInvoke ); + return g_str2global( strRetVal ); + } + + strRetVal += " :Unknown command "; + strRetVal += strCommand; + return g_str2global( strRetVal ); +} + +//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + diff --git a/cordova-lib/spec-plugman-create/plugins/cordova.echo/src/blackberry10/native/public/plugin.h b/cordova-lib/spec-plugman-create/plugins/cordova.echo/src/blackberry10/native/public/plugin.h new file mode 100644 index 000000000..4ef711691 --- /dev/null +++ b/cordova-lib/spec-plugman-create/plugins/cordova.echo/src/blackberry10/native/public/plugin.h @@ -0,0 +1,70 @@ +#ifndef _PLUGIN_H +#define _PLUGIN_H + +#include +#include +#include +#include +//#include "tokenizer.h" + +using namespace std; + +//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +//%% Functions exported by this DLL +//%% Should always be only SetEventFunc and InvokeFunction +//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +// g++ requires extern "C" otherwise the names of SetEventFunc and InvokeFunction +// are mangled C++ style. MS Visual Studio doesn't seem to care though. +extern "C" +{ + typedef void (*SendPluginEv)( const char* szEvent, void* pContext ); + char* SetEventFunc(SendPluginEv funcPtr); + char* InvokeFunction( const char* szCommand, void* pContext ); +} + +// JNEXT Framework function of the form: +// typedef void (*SendPluginEv)( const char* szEvent ); +// used to notify JavaScript of an asynchronous event +extern SendPluginEv SendPluginEvent; + +///////////////////////////////////////////////////////////////////////// +// Constants and methods common to all JNEXT extensions types +///////////////////////////////////////////////////////////////////////// +#define szERROR "Error " +#define szOK "Ok " + +#define szDISPOSE "Dispose" +#define szINVOKE "InvokeMethod" +#define szCREATE "CreateObj" + +///////////////////////////////////////////////////////////////////////// +// Utility functions +///////////////////////////////////////////////////////////////////////// +string& g_trim( string& str ); +void g_tokenize(const string& str,const string& delimiters, vector& tokens); +char* g_str2static( const string& strRetVal ); +void g_sleep( unsigned int mseconds ); +bool g_unregisterObject( const string& strObjId, void* pContext ); + + +///////////////////////////////////////////////////////////////////////// +// Abstract extension object +///////////////////////////////////////////////////////////////////////// +class JSExt +{ +public: + virtual ~JSExt() {}; + virtual string InvokeMethod( const string& strCommand ) = 0; + virtual bool CanDelete( void ) = 0; + virtual void TryDelete( void ) {} +public: + void* m_pContext; +}; + +///////////////////////////////////////////////////////////////////////// +// Callback functions to be implemented by the plugin implementation +///////////////////////////////////////////////////////////////////////// +extern char* onGetObjList( void ); +extern JSExt* onCreateObject( const string& strClassName, const string& strObjId ); + +#endif diff --git a/cordova-lib/spec-plugman-create/plugins/cordova.echo/src/blackberry10/native/public/tokenizer.cpp b/cordova-lib/spec-plugman-create/plugins/cordova.echo/src/blackberry10/native/public/tokenizer.cpp new file mode 100644 index 000000000..4a39573b9 --- /dev/null +++ b/cordova-lib/spec-plugman-create/plugins/cordova.echo/src/blackberry10/native/public/tokenizer.cpp @@ -0,0 +1,222 @@ +/************************************************************************ +The zlib/libpng License + +Copyright (c) 2006 Joerg Wiedenmann + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from +the use of this software. + +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; +you must not claim that you wrote the original software. +If you use this software in a product, an acknowledgment +in the product documentation would be appreciated but is +not required. + +2. Altered source versions must be plainly marked as such, +and must not be misrepresented as being the original software. + +3. This notice may not be removed or altered from any source distribution. + +***********************************************************************/ + +/******************************************************************** + created: 2006-01-28 + filename: tokenizer.cpp + author: Jörg Wiedenmann + + purpose: A tokenizer function which provides a very + customizable way of breaking up strings. + + history: 2006-01-28, Original version + 2006-03-04, Fixed a small parsing bug, thanks Elias. +*********************************************************************/ + +#include "tokenizer.h" + +using namespace std; + +void tokenize ( const string& str, vector& result, + const string& delimiters, const string& delimiters_preserve, + const string& quote, const string& esc ) +{ + // clear the vector + if ( false == result.empty() ) + { + result.clear(); + } + + string::size_type pos = 0; // the current position (char) in the string + char ch = 0; // buffer for the current character + char delimiter = 0; // the buffer for the delimiter char which + // will be added to the tokens if the delimiter + // is preserved + char current_quote = 0; // the char of the current open quote + bool quoted = false; // indicator if there is an open quote + string token; // string buffer for the token + bool token_complete = false; // indicates if the current token is + // read to be added to the result vector + string::size_type len = str.length(); // length of the input-string + + // for every char in the input-string + while ( len > pos ) + { + // get the character of the string and reset the delimiter buffer + ch = str.at(pos); + delimiter = 0; + + // assume ch isn't a delimiter + bool add_char = true; + + // check ... + + // ... if the delimiter is an escaped character + bool escaped = false; // indicates if the next char is protected + if ( false == esc.empty() ) // check if esc-chars are provided + { + if ( string::npos != esc.find_first_of(ch) ) + { + // get the escaped char + ++pos; + if ( pos < len ) // if there are more chars left + { + // get the next one + ch = str.at(pos); + + // add the escaped character to the token + add_char = true; + } + else // cannot get any more characters + { + // don't add the esc-char + add_char = false; + } + + // ignore the remaining delimiter checks + escaped = true; + } + } + + // ... if the delimiter is a quote + if ( false == quote.empty() && false == escaped ) + { + // if quote chars are provided and the char isn't protected + if ( string::npos != quote.find_first_of(ch) ) + { + // if not quoted, set state to open quote and set + // the quote character + if ( false == quoted ) + { + quoted = true; + current_quote = ch; + + // don't add the quote-char to the token + add_char = false; + } + else // if quote is open already + { + // check if it is the matching character to close it + if ( current_quote == ch ) + { + // close quote and reset the quote character + quoted = false; + current_quote = 0; + + // don't add the quote-char to the token + add_char = false; + } + } // else + } + } + + // ... if the delimiter isn't preserved + if ( false == delimiters.empty() && false == escaped && + false == quoted ) + { + // if a delimiter is provided and the char isn't protected by + // quote or escape char + if ( string::npos != delimiters.find_first_of(ch) ) + { + // if ch is a delimiter and the token string isn't empty + // the token is complete + if ( false == token.empty() ) // BUGFIX: 2006-03-04 + { + token_complete = true; + } + + // don't add the delimiter to the token + add_char = false; + } + } + + // ... if the delimiter is preserved - add it as a token + bool add_delimiter = false; + if ( false == delimiters_preserve.empty() && false == escaped && + false == quoted ) + { + // if a delimiter which will be preserved is provided and the + // char isn't protected by quote or escape char + if ( string::npos != delimiters_preserve.find_first_of(ch) ) + { + // if ch is a delimiter and the token string isn't empty + // the token is complete + if ( false == token.empty() ) // BUGFIX: 2006-03-04 + { + token_complete = true; + } + + // don't add the delimiter to the token + add_char = false; + + // add the delimiter + delimiter = ch; + add_delimiter = true; + } + } + + + // add the character to the token + if ( true == add_char ) + { + // add the current char + token.push_back( ch ); + } + + // add the token if it is complete + if ( true == token_complete && false == token.empty() ) + { + // add the token string + result.push_back( token ); + + // clear the contents + token.clear(); + + // build the next token + token_complete = false; + } + + // add the delimiter + if ( true == add_delimiter ) + { + // the next token is the delimiter + string delim_token; + delim_token.push_back( delimiter ); + result.push_back( delim_token ); + + // REMOVED: 2006-03-04, Bugfix + } + + // repeat for the next character + ++pos; + } // while + + // add the final token + if ( false == token.empty() ) + { + result.push_back( token ); + } +} diff --git a/cordova-lib/spec-plugman-create/plugins/cordova.echo/src/blackberry10/native/public/tokenizer.h b/cordova-lib/spec-plugman-create/plugins/cordova.echo/src/blackberry10/native/public/tokenizer.h new file mode 100644 index 000000000..75f567ceb --- /dev/null +++ b/cordova-lib/spec-plugman-create/plugins/cordova.echo/src/blackberry10/native/public/tokenizer.h @@ -0,0 +1,55 @@ +/************************************************************************ +The zlib/libpng License + +Copyright (c) 2006 Joerg Wiedenmann + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from +the use of this software. + +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; + you must not claim that you wrote the original software. + If you use this software in a product, an acknowledgment + in the product documentation would be appreciated but is + not required. + +2. Altered source versions must be plainly marked as such, + and must not be misrepresented as being the original software. + +3. This notice may not be removed or altered from any source distribution. + +***********************************************************************/ + +/******************************************************************** + created: 2006-01-28 + filename: tokenizer.cpp + author: Jörg Wiedenmann + + purpose: A tokenizer function which provides a very + customizable way of breaking up strings. +*********************************************************************/ + +#include +#include +using namespace std; + +// Function to break up a string into tokens +// +// Parameters: +//----------- +// str = the input string that will be tokenized +// result = the tokens for str +// delimiters = the delimiter characters +// delimiters preserve = same as above, but the delimiter characters +// will be put into the result as a token +// quote = characters to protect the enclosed characters +// esc = characters to protect a single character +// + +void tokenize ( const string& str, vector& result, + const string& delimiters, const string& delimiters_preserve = "", + const string& quote = "\"", const string& esc = "\\" ); diff --git a/cordova-lib/spec-plugman-create/plugins/cordova.echo/src/blackberry10/native/simulator/echoJnext.so b/cordova-lib/spec-plugman-create/plugins/cordova.echo/src/blackberry10/native/simulator/echoJnext.so new file mode 100644 index 0000000000000000000000000000000000000000..2b3c5f5486d29871ad41fce91cbdcdf5c9347bec GIT binary patch literal 231778 zcmc$H349aP`u3z0EXdNb2m(sjv>-~-jTTe_wCqcu1quS`mM+jGG$|BCsDJ_jS`f9e zNEMW#s8zU#idqDrDp#xGy@-gFMT-};TtQK`?|IIgX(nmP;$QFAABSh2Is19f`<`Xa zWah>UA80Tb6z#8`QcoeX{7X^7fcyUKC%nQGqf%c9R@y49g})Y_*yTMx;p&qFD#HKt zhknZGgQ`;+D@qAm1L@BcBR}y|BEL~xIXE5t{iSP+G&R=-_vq-yvW+?JO3|m^7#Y)P z{tc1AD16-&WjUyCejH2Aw=!VR8Uk)E&=|8Wn(Jx3@y2tTdaCC8jf8o$hiej}`n)gIj_zO@9 z7B4`f8XA_g-06?2rS;1Lg8cd|_fJ@OxPRl+&I64_rqV%veu*Z zwpA7cSp5yr$_!)w7ec$VRsL0f@cczhCi-u0RJNdBu(8mfG+5y0R~V@bR9aY4tq&MW zj1L$s1qH@}j%EJ-BP=m5i2Q?cm0{fqI|cd$DD&DTc0QZy0><);3$Ozg21Y-Oa-l#m~PuDe(qnktw=qlj$a-Ik?f_f**JG@3HH%w3yMY z4+IvxnNZ-@Cg6ttijrVhv}gX%4Xt`83zU|pEk}2Twhu_E7t^ju!x%p$uwTOmhIT7% zSYT9wcZWc_jYfBD9uU^3rQ&Ct7d>#mx2xM0ww}*0|3@{w|~9-(pNbpvhF= zZ=GjR{2y4<hTpC=uygyaqG+>szCS=3qz&YTi!#Ux6 z{ke2EXXvhH;`&}4=jDBHv*G5D=>F#7x&Uszy!W6)4Hn{Ju_O-zm%=?Nxdw%}SOK>Z z?s2#$;rLgig7Oq_72F!h*8+>>^)tX{<+TRuaj{X765uAd7bSm5;>*BSnLC!xI5wQhU*L053WC4G+YeaAh_Xh zBj85CS>a;g#=?z*8xJ=Dj(_(6ZE%TjNpQ(m<{7VOBz)ge8k@uzpop3YY^5O1- z!My_aD%@*u{M#Z?W$OQ1ac>*kn>xQ8xPDv5 z_2J*a{deJZN&nrzz4H14i5~&?!Tl4iLf-on_?f(BdY|KZKit3I{tfpf+(Ed*aNodb zf0ejC0(TVdxV-;8@CSMQAK;I0KTCcJcv@bck@y?%cep>`&dYn3h<+HY;QZkH;rLe{ z*g#%iCow?c^%5Hco5<^?z(BYlxaM#z;99}8hT~rw;Eix?;ck-mZU%OM>j>8ct}EQF zaKUi5!SSz$L|)&4YZIJV-V2r3OJbx%hV3n{?*!fr*B@>G+(5WNaD(B7!VQDt-*Dgv zc|8g^1}+Y6th_f47%#6Gegdv1>i8sFPllTUmjIUtmkgHz$3HtT4K73SsS;IR=pcBe zyq5)Zz&YXa;AXVAH#oPknNt+{r7CEz_q1n z;BR*goV#ky$e68x)p^TD%z7+z%beiSDbdaqFMZ)R=)Uy3exG@%>kqdsD>`#;gQwTr zc-JYvAK$q3!`BXlesSF!Q?pwQSQYTbvQtgFRWAMf=woLNmcMC_ZnAh&!^+0QY`yIp+q|lc@ ze5w1#0}karIJ{ktm9w@zHT=Tp?;jX9@T-XrR)l=f$#g&B+#MfObo4@`vvb&ut$%Km zGi>6Xa=X3r=i!<6PCb7x=Kfvxb?zJ$IP}OLW2daETKC7hkx4Vxt{Y|z0vlS z#*Zv};rl@sHa%W+=3r8E%UN@RKby65zuolitxxRr`(g6{VR}PzT z-^(XH_Ios<_a{%ccWfW@`xkG{?ALqM2Rq+B{P>#@_Vxez_m3Ce|7CU6=@Dytz1Xlk zrnqT`_a|G|Sw;&Tqc-uNN1)Zdv@? zPhV~xRPw~m{Xwg$-@EInhGq9hgv7qrUhrpad+m$(rTdbb7Vp{@@o3OpZ=VZwoNu#m{gA~MzId~B(wcQUhb-&cY1rBc zt3LgHWP{I-gg1CA>8EvbKYsX^!2@3j|7hK)^E;;e;2Pa~!jC7?!y6=7*PZ=(Kw15{ z&V;pzj~;jIeqqJiy??Db^waMR*Ma}@<>{;LaXe92-fVqwz;8P?uE)KSwl4&2051G* z$+UNueYo>Nj|rpF3I-;Bm2qxJgHse~T-JBsyGcKpNA}8`|KiA%VIu~N{#9>J?ep&X!}I1HPij1P(#Jo1A9^YIRNI+-8n@hh zckrZd9%vP`I_;2O>BWM7hOcVa`17zE2R(jU@-acW&O}&y0Af|CnWcUwmQz z;339-U%day$dy|Yy2f4qbJL~2PUt8oB{EhpVLrtie$#uK0X?=78socZnB z-OE-7%>MSF8z*#X`$<_|y_8emzuRT~ft$*I`ljcMZbvTm-qiHTPA?<}Z))8BzT1Lw zd+t^Y%YC;-yVDK6mbc0c-hQG_L8lP&7HFM39wd%jio+kTz+*fYQXe6D}RV}TczG+cDu znjF7`kLG4rfBR;^pv9fTUz+zzz;BhWwj4C`$8H5J-ux-&pX&l<-}l24%{zq6=(geQ z%>Q()*Jo4L*T)u={wH_a1^=}jgC0)G{%J*Y<$Jf^zp2Rb-{Sfm?e~A;>hk&s(+4~M zc)MP=)}}9GvsR5W3|-r%!@C>vx*a&sKel2UZnxDIAw_=8Z>QUiyy~PuyHFWAe98ckR$~)pq~6p<6dkp3^w5dG_~V z=Wh7aeCC(TcGFXKEO~#{@`)J{Q!i{zA2FfnhJe{Qn-(+~GUG&gV&sf&_Urm=y1U`p zjvd<{z3o)LJCf^%+`lPkR+raX#@!JV`rw6M@0d6B{eK?$<=CetXNy@Y^Rh3!nAh!w zj&pywH(>R}okPZ+>v{dy0}q7e+|bD4AGCgGUt^=M-dPwu|K6im(QBh_svJ{PaJlpOXswUKmB|4yI-y{e6Zv8{!^xXzVW1a z#8W4Crbl+!wscBX#-+_i4I{^%>-SXQtn2{g$fXtK_l+u1u z=>9MBnk{Y~`btJ)+x+{?O=l)Q^p82KqHmuvub!h&eMs^n@Ee~t=~LpxqXU0C-*4`!O>-N}4}A2S6+ho~;gKWV zme1-tG-hkE?Y~j2G9SGA`#*kucwl||Te~OQK8zU?-gZvM*Jk!yIbmD(w5^>Vxb@d} zKRIz=?yraX51rU{`fXoNYwh3j#n(2^Ut2h<_561Rym)v0lM$)^Y2p|ka?|Si{w)qn zk8j^9zIeWI^_h2Xy0Pf_@LtP9fB5|8rswY}{iI{^M|&m>Yt$nA$>Y^SzcJ>&`dIgW z|N8K*^*_GYv+Bju?e4iXVd&&y!(B^aejnWSB(c;d-926-JI!f@Jhdr+gmZ>nrk@ikLml1%~$mf^TqlHm;H71Cx7EQ zPyd--?eU7m(|?N2pXo>U_VoAns^3Dd@?B`^8J=r0?T_Vork=*s_Kle6$rHTFf4f)s z&R+R9_X^+Dot%)*TCe&m7Iy%a=azI&9^u7Dd8NPCi!U4O8Na<(|Fn7KpY7Ejmh0M^ zW|7YCU3;D-{xo`BH)r|6 zyyfAQ{vfaT`{O+0pYv*;iC%n|#T}mId0p54$s@e_m%kV9>s6m`N4wKw`D47w|4Dzh zKhx*FhxSMQf>-$-%FujO{rk?Vy(fCfyIWtZfw5`CZqf<=k4?e4`g=Sh0S{7IDVI88 zEp0Z4=OoSHKWYfp?xhB?H^%VUJ)q+W2IUSJe=^EDW1~SCA^H7ipYBcF{(Bo@U++JP zLNmei@&;i4@@qeZ-L@lg4DF8n*C_@iQ^x-i`N!+>Z;XhOv3ayn#_x#dLO=b4eGaq> z(>saq4qf;GNcbmgfZZa~TNI)w?_d*=d(aI32Kw*NN=3O@`lq3P7dG+}y4q1`q>M#> z+0n+Je1-H`-v|?IIyMjMNxmKBHQ5YGw2a>#6(0yAbhk`@Y76WiVI!7%f6T9WH|&A+ zF^GM2azj7t5v+H&kFgiZgN;Y-t1!R&hGLI=u0gq7ruX3lv4^nP{{vE~!a!YXL*8~@z84U`$mEb**&>vOU zTLx$R1*5Rvip@*zWs^tUrYJ77-#{6@8S2xhfkEjm^K+n+7h}VXW+n*be+U(+YT<6L zH*tSWrTUzN`9FmI*izRYhok-hO$;^iJ%#+=dDe?G;GNj(ea5Z-t^9TcS$oA_uJ zQJ#^=FBSb$3*Qv&e;V>cFp=MDklz}e{O&`4+lv0yTgJ~r{$bF^o|3=Z5qpx*Uo^8? z{}`0#K7;7LEN?wz{KQCu@(<}>AN{2Id-Yim%XcUed%=0IAGlB64H^Bbue-cEZbJQU zHz*vJncipUA6uaxD5lVlVT|bK&hK56zwu~;0y8PXAB4U>eOlcYW_~M&p})*Ch-XgZO(GQK z82aPeGCd12YHV@0S3j@*J`wt;@9(oA{{qNgE6*#FpzmM1`{#Elic*Qq^JirG&!N4C zqrJz<@;wQAS27j$O}1wP2&NP4;VKzE5cRtg<@vV^ABK)UZk9pGkp4fRy(-aO-KBq< z_6R@Opjf5@P_evSM?eGbX=+IPmY z!cbK|$)82XDAkRJ1Dn8}2CCx)^IHIJIf*_f%Tw47&%ZEfr~RUT80>)&@lh<1Uu(4g zcP}HpEN??I^3(O_+{WlH;9B@!1}n_}-rNxN zhdx6MMEjgTLI*n;lzds9jYx0EO9t_bis=Q0;W_p&gLr1j`mRU&>h<#o5=wzRpuMF3 zPPEtl^Volv9LGD9#?W_&K-4!9`ZDeTgLuZw@WXn0>f<`}pDJDdSp|I>KHZ>PlFn0OUeLdgu?7Xho+!T!_4^L? z9%?PhTY--2f0H_2V*MAPq4fGUr6ZobK>s)&VSWS9KLXG{VrBdsD5hTDenrEr!T7=c z#_)Xy;rSBg8)#niuU5+IMvMnN4GO9){Ik+wFYsV6Q?~D_rf9z#49ff9EYDEb+tWIG z`&fXdzI+{n`s(c2#sPSCkB6gL{r-jivR$VSJyE{uD1$g#!1Bc-|6^wj%3PV>aSNU& zVf=-e68XQ0_zuKJwn9J5ebE1V7*KZE9vHt*8{G4~r_r&DI(-`sef7uqt(E6BwBH`I z-%y#~8t_TrF#96Exyg{{cW!&VAN_N4cZ0G``u87!=U|wB!VHV{`vm~K51YBmw-Ej3zvw?BW&8o?&)*drlm}(_ z6)0$%dkhLxOr%$c^nSqu?{(7u)=to8jPGbB;XecZOW==Y7W}#-%#TpMDd3dv&1TF` zvfcK6FVYXt*|#H*S8yMLn8#6Gm`W)o=zDv_r@d{Dj1FP`5hQpcW#!F~|LyMaIJO_= zr;sPdJLcB}@=ChRpe&PoG~%CxJYj}J`R+wQOTI8D-=kfap91^$;R(!Hr2h+O--l8D zyJY8sy#JJFF38_#tTDlUW93q2!z4u^#g$ zbW4%mUQFcl`g#NGodbsisGlrvl+jaP7ee1JVtgGS{X4|Nem3+I_2K$sIT~{5c|3cD zKkIia6zfZLb`(kQq&W1qod)G8l#}V7LC1W!0QOb-XN`wGerynD1L%JP_{Dt&aTb8Q zwFUhX^PO7|o_s9^k{(zubpvPqhfuJA(Eml!|2+%1PM_aL|GVomgYp~vS-v}AKUU!o zg{GhL(6RLT-Q^|(M1N``!{3T>?>hz^1ZVzzJHal8sQSY6u1EczE;A_4OMg2Wx*X}F zTZ`~vlQ6&d+C4wp3PXDKU3YjsbJpwY7POyhph0;U{fFsK_Oci6w!wPpdV{h-mhY>k zu#cF$jFS0PL!OPH?=WK`{$dNx(m=no`AQlTAJMw?JRtTWe6zg#~{L1E1bLwK8G-U^j^KPOQ%`w0}I} z!wiV|d8FF#^XT(W&$ZtH2^f}uG2@nj(ej_hyT`!N|vPd}ecMLOF~s%HUN zzNrw*7|081C+hb#`uiih(cfi#JHU`^hJK?Piuzavc-oKSjbI;O?>fr(pSSeX_c77X zFX;FE(m(nxj2F+S>lM}?-CeQj#;bN-_TY{YeB2wN#Fs!-I-+N{FvFJbkZyA&~q`laP@vdnPRlga(NdxFd6V+a@eecdd|GQ)m z=P}7skk9sS-TJd0{k43qdw*>U`u8IA@A@*oMYkjUM7RA&>F#gV zThPBF)%Yw=FyuF;vwOZB1H)K>@etia*sFQ4k11OW$`+a4vq=9i*3V3z@mrw%t-ASQ z8tQi*_0#gl(5Vdl3Nn%5KktM2Ci(-4A>yAy|9cqykNt!7{}T1N6ZM%W`Fn^ssh@j3 z^eW~Po9DRqo1!p&T41kH43sxWDTO@r`m+oPhw0|e`8Rv&%h=AaH=zb`=9%?rjQ*>) zFNa2Af8YtMUm;KWZ$$m_p$}^N1SuaO{@HMM|GpmmV-4(+S(d*D_AKFUgR%si@l8#! zAJEEezwSau`xuLb{WAOz=u1Cyip5`4q+jBDHSFNk> z!UT-Ha9cpPzzi3i;=zVSN0>pjc#ob_QTQ zcET;sd%X1T6e4cbjSokXaUK%uf!#9y&y6TA=6f)UqJDOiXIzXy!LTIwSokNvzoX=@ zV0~PK^`|P|M#?SyF~54=AkJ;GzwCy7RbxI3v5NR3yI{SB@kFy1S?EtY5)9%DJi|YX zf$C}9cy$CF?Z`9k{nzu5XB*vk^!Xs@ANm)|$Nseq{l5(TU&}8a?Re-2Y!dvLe)Du( zf3EI7QQnJD{#&3A3{U@luxGbVE+K=ivd*9d!935{(|*1)L4{nD*F3-Hydj9JKnqv^9`GOf3sL1~{nKE}4JuQ0OPdW6sCe{!b3{)Tdj}&@G`4Xhu=rDzv{vXOCmMVtj*rM>iMo7s8$w z>7PHKzQHJOApB{MC!jsb5g*-1^rwO7-}>=nDdefwry$7V5aiAHV!hE2`uhXULCgHs zPDJ~n|Elc~q@2R~sA;TQerdbSj7J;Y>z|G22zvcHG6L@d zEJpu1dSkG$ucnI}h`n#g+l;vBTj`8C#^c$S=xtNOm=4yjD zlTH3n1L!x#7cG7_bkvV08Sr+V8onVq>O3q4VA4eVU<7<3(LFys7l*Y7=Fcz-!aoM> zt$$urf`;y5Fo<_&SpJ2mpI*OiGzT+>D_~Y zPp=Oz`(r);`>e_14D@=bZahYFDCw1$Z_4tX7>)V+n+D|<$y>u-Ptw`z6{v5^e(wIY zu^aNkdTJ)ZGym&Q3;QJfqY(aBsM{V`aDTOg=?;_}f5%FnX-$H*~gZ|n_ruP=w@9yu^cc2*lN%RN4)5*U;@OR8; zj~w^@&pm_DURVTJu*W@Mk1dj~#>7mozt6+}Bhn`F;!LSI{@8xk$ef?GtpAE2I%>-|xY(e|nfcDk&Jragw4Ehu83F|u@4ZjrYHHwYtZGe3{s~exG zI2$mZg_%V9jl{W#VDvxD-nWDO(VrhVjf{$QpRYi#_0M;o z?v4Cl&sjd^_d5FjfpB#`#PY5~e){tweK9dyfbl?+*9Y*|pARX9e(2AKTta^O^C4Eq zYog+(zyyl={{lmJi$BJ9aOT&pJDz3V?Os21zR{8}l8EwDF`cd+0=N)XzAAN1#b zAk*8Lg#LZRAl@BidksZL+YbFkGm8HF9O|ck{`CjulX`t$hw|v_cQ@LzKgMgVf1gCb zr=q{xkskA7KQ^L2^RGEJ_g#=j0_=rL@BpRl6zCu9bu2i`b4w$H*NqR6DUiqK?)}l1 zP_c5|{OY?9M1+0R;zth0d8_#t-(-JU*}&5tOoKk0$NZQ2$^Jeg2+u;%$rj7}C!-g(jXn z3FGe%4;aLIvE-8=pIaaw%|2v6KlRUlo(%QW_m5z2^yharp+79r*^@ugF~3E5&>UiZ z_9gPy+oRTy=gG%mpJjOzTSj(kCo5-$UCpbPZAi8=BgKviC2K_=kmH!8rjk9A6-drc zwAr&$Y{`kP64h z*DTu%la|pS1c;fMMCz-!nRXUeG;Rd?Lq=M5420lR>lf=B5F#i8h{n@#c$zg&b68IH zfLwc`%MMxFlU+s|g7qMkG2MsH#Uk+CAAqBCm*)9CkD{k66U8X6B&)%rjB)?&*Unpjy#vpFVR$5 zNp%TC>l0O@XXI;D8YZ$*??xs%)n2A6gzBRu5$lS~$Z?8J7&ZjvK`XEKeKox3J&;yD z?Fd@Z6=54sqvDPwZ^-21Vl~x?8&Y#MZlu}7o|&JRlrh5`f@^1nEtyuu=0Xz+JH&R3 z8{%zHbcJx_<=SmCGICvciJ1)RnW(uJGVqaNtUE<^YI9~zT1K)BZJv`GHZwiZr8X12 zLUZ%7T^X>7K0G6n5~*-bmo5&PA~PpBG1DHNnwV^N+eEgJ-a~W{q;EZRz&6SgxGt-_M1Lcpyr7Ka>M&H4#$+D~XNGK1gBNNJV)SZwT%x6N8D9}t8 zqihyO*o2x=M8PXN5sf%ACRsI9p7oPf(yJvjOKC8;6$rqC4=4HX+=OSaakio2F-5H*BOFuEev)L%)>wZqs>Oi2`@7erp;kad1$NXDU5+$D7yn1R12UP2VqGf2f{u>+h{f2rmW^}D2nClzGf0U(=eNy z81<4}BXTgTspE$$Tv*y6){#2H6@xZRu}{yl4}qL8$m9Q*m>5m=BA_&|NO4+*Bh~?} zbLz?=eZ#XjF0#6q@?b2|8Bwzd15e7xysRW>hPz@~vLVTNxw#lIglYHTZ%(tjM%wdT z127-);VlxcWqY;6qnPyoha=WCE7Lw8Co2mX`ADRf2v$3gYT{*LAz>&9B%4U>7@m=B z@0Xo2ASW{~E1T6Glfk(VCs0v&PP%yAluwoVuaQDFN6WZkC6vMudi8cOr+E9f>vPSOk-jjlH*Jo zk`WWh3vpKr1ZW{`=nhZLw4)ndHn7)_rZZ$-K57^6y6HA#-X1mP%wss!C$Ar7W#S>2 zKc>0T)zMWS*2BYR;F{6I>=9P8Szg1suH5=!xI;@bbETdk7Y)~Lvb5&$G@nv;VN%Dy zT-$1_sj5euA=k15C*2e#Cnn3a^5>bn!!24yGCNX(Gt`D&wuJ7G_f)%>qE zPJ}ZlFUxVwkuaFmH}bs@w8LWJPjGFAlT zQbJv_z(A@CGJX1&H>g}0IIwVYrPiz(wV~=teJIk#MO9X!L##w;;yk;sv~!$Ico;*f zwK^DHDTgRWo--Y$CV3iH7a_G8CNeQ4MOZy;@nN!s$6@6oh6*;kM?3UNu_t4k9-Ey( zh;b$-I_$ADtJ%r0lOwTElaa@u9b?06V?RM>c&H@T?e#!gzRHT1I=3$?gd9pkCx;pKQJd3^BKD;!Vz|-GcnEAq{l2yR>+yu=5JBv{o>S ziCSIrI5FE()y!uDX{q$$OjhPDf;&C*q^7J|c(b||P*bKlMu|(Y524RU?S{G?l&R_} z%^87Nea5}ml~VfydaT-Cd!esoVkTL4#~%aR6)NX2>L{dczs1D%vWHdBnTate9X zlSgd9xVx;Bk$WUkHAsv^v97SxjLb~h|L|+cBou2P%;sZe#MxkFFmV_9h}4p?Dfs77 z3%A8^)6@pBsfLSkWpZK=nTdU`zbM^n7{j>hY0q`pvatxP-9S)fw!zdIS=Edf9)p*= z;cF)MHN9O9jMpBqroU+#h$NG-U7I^FHz!LSSH0A*R*aev7^}1~YGg6g=#}6KX$W)D zFE=-FmT&W*Dg%0BEwdmEHBTMGZ_0dESUu6>&)h~BsV&2nD zQFo7Jn-;KED~*ixUd#GgqHwldYdIt2VGa}huAjQt&(WTYVBglKw^#=WpAd7jJvA{e zQ{9NED}EiJu9%EDEGv;4|J(!`iHBg?jPP<J^&Y9Te7;~A} zy7{nb6ueT$Jmd1YON-|*UC?wtQ_SU2bf+s<9s=+g&OY6piO&Gxc$#j{*Xz7jF~gJb zpjbWtsMB(oO?a-ajWD`Njt_OYVut3h3_R1tW0=-XbO9yS*H=j6y8SG|WhJi`gI zjUweQ3VDtk|LeNc%H6xbUbP6bCc4ti=8WtaI75^|LZj*wqtRt1 zY`PYx8N_0^y4U7xn4s~wT+N&f(>Xo`R_APHOrP|R_Oh~c?drp>Mqwj5SKafgC6zF- z30CX2IV8i08B0dW5HSV_3+mAk?O6_&G+lpRJ+X|#84z1iP9BdwVV{P^^l!@!8&kS$ z^tE*#F!Cih^wF!IVT5JVvbhHZ)ri5ksOvCo6w>GJ_S8lly{~Qq!t1v8uvgR5P+-wP z)$pPVV_E0S$;9Jrv4&L(B})0XwYGOBb~yCL(?>5hhjV1gbJ?SDE;3O(hPl!*BPt`i z&W^86e`=3#>SJ*A{@+%4JnzHFF`d@d4Br?ByiU~pZH2&*ms}jI!h?1zlqyOrE^XO4 z*!ApZiwU=lpN1NQLuxrkHU3#PM*t_lWN0()imwwn%MR7@K77gE3od-y+i@oE*@~ulIB>Y$7~D%c-c^-OORG95s@DisBEWj-)fKcR%HyF#gl(KqMfbrX?lobLiBBcOaVr>;t4-PC zk-ZvO_8h(b>I&`KS1#T3?PE6KIo_2g*Y2X$s2ztwdoG4TF@E|8pcY5n8}Q+M#pdEE zZ_!%X)4IC0_5N>tPM*3S8Qb6HvB{^Nz0lhr)n3W%L7y8ELXk8DuIb5twU+oSaqNJ< zch)D5j|uzs_ti{&?ZRzDRZHSy7s+E!%-!Nw7LGii`nOdf!WJXm;<)@=LDyyV4Xf8o zoXgiQq-&cfvH2x*Lmv&h3%-}_;fd~bzAk%@hV(ewPvtqjXwRxnif8H!iqAxe8hBWXGWr?(@ zhf%bt!C!4q#YHC;BsH!HqC-!~BAsKlN&~w@=#$q0WVRu%K!RTgO+G0RIe-i5-E@rMcH8G2A zCTf|jR-y(-KWHjFzrHPRBfM)Kh{6TPMkYtry65M(n|JWtWR1Xn8rD&>AAAj%*o zu3}HcGk6S6h}HZdfxV6juu^gI=)U)JZ@pg~kG(|@ne=6Y(DHas355jBwV!Hw zjB>vH|9?Kf)SjMP(*sQ3!yIY~`=fsV)g6lGajjJBsjAz5R~s$NIV)RxvVr45**NW=xTIm8)gIopW*bvapYSE5eZR|hYFxZus{ptTGPW|Z~ZNJLby_&tUt82|(@?Ao8^9m!5 zZ3MQD^Sy6hU1H&UL2#N^Ql2-j@M2TVhTRokfl{Sc^M;caafZp3jiWy!V{>X2hT0W2 zA@TbK6XSG2v<=4`ZFlX8*UxK)z{?+O(-alxdo(d9g;L5$1s}oH`z7sY?yvI>n zv#(UF$UkQkktgPL$Wzl)_v?SjGp1_Y4A`nWg4(077ha7^?dP09}jxsfglCBm zgE`WDOadDA3UpXt+d5IZUt!mX-U#+jyih;F( zdppqcafs%1wdNq4<}X>kzvA(#^Pikwp?R6&`0?ZhXFZtywjW$o|?%w?9_Qs4yJK@@0rU#p@0~%S`r`P=+GhwKebyY3%@-sy z`AXZUnm0J>?&Be$qP^u4vi|neoLu|mOsi*2FPE7|NUzq`cF@p=+#Bhh#_#G2hCL*Y z#i*H!(OkTt%Xb-sCVGbmL5S4EOlW7FL6}HdZcd&9^8mep_R-{_A^Illmx^cdq6J4~ z$0B+D8buw$lt&BwiB#NsXEhHkJzsv-Z9VuXw+O4rTDN88DTg{kh0frQKgHqXfH;Ed zK5uIF@^PQB_4d)p-YbrJF3DryyV7(n6w@`mq@rZ`M(5?=bzxab8ZCr#B;~31Ff}uP^CAx`twPirnqMM?0H*ENjz+}Hf{C{r_Gr??_S|op0GQE zU&RqKD32+yzQk8Cuk{G-Ia$?vX+Qh(=UbUS`H_dCX?Ti*dTKvrgP-LR#_`Xm%Pm=- z2@lhT#6Q_r>q>YQ#roHmH~;TRHtX+6mcPUIH#CCw=rh%UA4`g|jYz`DR~H_eV`ae{ zF&x+E0!bM&j3`?9);*_)|||wkVsv2neU!%(~Ky;mYZU z|KHQU=4Rw?RLCdgawYQTl`0(F!k2M@A;+J1lIe70|2=({Hu!H)1DC_G~L@VVkfy~t7B+T+{6*S0mM zM%L@gWmK_t;43K?W8hZ>u0b7Z$GAd)nEbWZIqpxz^89U8{I;HLMwahiY>ia~g2KtN zVNCb6hpb9pH|DecaW&HXlieGM{CVAw6E4c_&u7nbrFzAZV)eRJdqcHmt>wMB=6=ZJ zwK)~Wqi5=*nUkenX*Or3-R_vGcaNaw{&R<#(=FuUhHFck+w9c@`xUl} zS8ETx%GUm?%Tu>N{{NMzE}8v*E0OkNBib9QI5AiAzWLOt+OF_lWcs}AkNk1MIuF}k zlm2POm=;!&?$={kj4i^9QRT!iGD4aPm4Zl3DeHg_3sRsPqc^ZFW83&47AtMsik8RZ1 zxBhBtQ`5{tuDY53Cq;-IDkNc!93-YzvG{>-dkTK=JTFswT@oEZOq*C7Oo*;Lc@n>V zj%~6b=&oY&gn1MXVDl|i{ZYWW4)p)k^{)F+z1yrpH`Q1C>NaJ6b+NR)gORcNE^!qF zxk?eJKRr-)<=yiDV`C)l)Df4YY!M|)dS!1Q9q88nUR$2aNOa{xg$*BHLpU^zSzH%AC}=kT*a0|^QqYE zDT%H`cqidIC0$pQ3ezH`YGuW z<9{K~Z z6Z#Kv8oqPKaKL!-$$m-^IdBsBt>_m-C%#`w{2t#0B;E@-66+b1GKmGmPw~xA;%bAk zhIk43L+pWeWxBu(Lv<2)-{WlC5kJQF*ccyJK|ULL zMh@Ihjt|{c5^q8~6Y;Ia)5Pb|-o#4=#h?8Z*jS=M{N11g5)YuAiTK8J7vg(pM@oiON3w%?T_`07`z6#J3?|;wC@E zO1#UU#1p6D`-Q}x4N9iO)5p;t!Bfazf}NE(iTxCu-%mCep+CeQ4a!nt0=`pC#P=G@ zh)?<{yCt4wdf@xWb760YUl^4A#Ajh|i1?=UA>u%^8xh}3KSrEnP^ySF=mQbohO8#` zfnE^t;otMbd!P@rlb@nJi1@~5OX6pc8}SIfnNEDjpcskxMq?LZZ^(x@7VShVL_eqm z;yb9-Ecbdp{lLy#Y_ z8OB2*zE5c)wm?51K929R6W@p2iRJiyGx0lo^Oe{E@)Q0TXNjM{-Vv<^C4sozPe~zW zL2g8Rzcy3cHz*FG6>=kXz;`2w9r3+N;wFq=M0`JT0r5?Y-$Z=Rb1CsAKV=QEAM}{G z5PCzAd_vh;O_W5x3)e$izP| z9uY^tE)v_qo)QmY93mFsJK{uqn{_J@-(B5K{1SGRcq8l}aVF$L#CJr?iE|CgJ|g;Y z1@R2@lvv=W93W1Bo)Q)4DG}c%Jx2T-^GG7bhm*uSKc$-JfE^>gjPZ-u1oK5=fubni z0>6ho5pTiVl$fk2jfuxGo)JgkTl2*KV%|V(swnM=7_W@P=8!*eKgK!Y8R!+UJ?0n0 zSj?Y@zhPcU48-@ciKi6BLd5rbqlx*DKe0LHc|?2@)=I>;yyJ*%F#Zw8L;l22%qNI; z$e%bJ`bKOC`4d|}--sC3UBp+RZ^UTGpNRQk0dXtW3i2o7gT%!|d|!D35#w74aV6wWeBGdw5*J`RB;vcV+lhNHA0cA=EF+dc{>1wr zf8uc1X<`b-Jz^V-cf|eBPhw}tpJ?$@Dv2*c{=^@kpTvcbKk*CbDRCO?G;tHw0mMw$ zQ{q#wr$>OTFn=VbK>oysVONQBAb(;e>?-jU*i~X%$e-wf{D}v!o*=G;{uAxce_|8Z zb7DK#RpLLO|HMPke_~5N#X^k1Jd(Hy^B!V*$e(C|{E5pUf8uoLKk)_3Cy5&&f8y_u zKk*L8pJ>21O1ugBPh1Q66JLk?i5alB#6;Lz;)_@(5c42^BEDU`l=uox8jH|@!q5s4up#Q{bjN`;5kUw!TS`4iV;o<@wqJeL>^`4a;ne_{aipBM)HCys&s6K6yJiCE8{C5FTP6TgA|KgRot z;!hk2`4gYV{EHZYc^t7n_4#)>_72otP_d-A%9{o=s)oo zoyukUw!M^q;r@`cHfl@+V?HC4smB>m=eX$e*|c<3Di-)=9)? zG5;gJ2l*2V4a#g{9L9g*LfC&|801g90rDr#gZzm`?0*o4LH@*zu>ZtT*ni?I%*Tlj zLH@*MkUw!a6L(;pM(m7rEioPPCyqpacpZapmEQn^g35dSUE1Q0JD1i6$orSpVkQ6@MhCQ3U0J5ee)25u$YNM0;BFVlm`3kB~&4lAjgC=i@p z>97LI35Vb?$V$3}JV9^me{Dy@0$@aAuXhh`d7ZIPyaBGQpX3dJ%c4;FHLU$%_R~ATJ>= z6g-8zl)ON27A<`{xkKQZB?EP3?>)_*Cvf?45-O2G@sF{+^cg0CdUD2DnAUPKOUM*Rg}LvAE5 z7QC1|n7mN%4df>B0>MkjBgq|tZzi{pCkS3jKA7Ap_*QZ&xkd2p7YI(#q;Ds82!4{hj66YbiYmRF+$#8K@(OZ`;1pf@0dkYz=gBL{ zje;wv5@ zCc*C{Paro6ZXt&?MEwPiCU=l4f)6IoC$IiP=s$S@d8Oc1@dL~)n|qNlNXRz3SL3Jh`d7Z{p5w@Wr80dFCs4${1ACD zd9mP?Vf*&Iu?0ePk1R`NyU6@p{J2>Fwj2_8>gL|!WRB=TbN zV!;#0OUMfaPa!WQFAzMPd^@>AaBR##{^SXQJIKq)t%75M2>Fv+1kWcwKyDIzHhCqv zQSbutD)K_u zbn-yKqsblQir|CE^U16KEA*edfV@(0EBPYw3c=&Z3(3m_k0&o8FBN2gpr=&nB-VHws=rUPT@# z_yY23az*e(8NDTgfegZzqo@HwnIjJb~OOco}&*d7$9C z$sOd1;N|4`kQb4c3Vw*Zn7mlG}M!^-B_Vg<9K*9aV ztH~9?1IW*kSN|;ZpPc8EPE-mWNFG35A$UvjK=Lxd+mN>*FBQB!xskkBa3gszd7Ys%ElNXRz3T`D|L|!3y9C;ymnc(r{MdYP|Pa-cSFBUw3yo9_^@D%b= z@&dur$+wd`1kWTdBTo?AL0(R772HK$L2eN|pZoy1N$}a^mE=aj3&^X;0|j3|UQMnD zzKHxRdG(J%|H+kx;FW?Gk_V7i2)>d$ki1OrBJwumrGl>^H0PMkr$H}3tmZHLS88NG4fLK0>P`u zx05>rKS^Fjo*;NNc{#aN@YCcKKxkd0u@_2HS;CGTIkQ)WJkf)Oe3LZ`FAXfw*OrB3( z{e#ed@&fWo!L8(r$SVYoBQGQ`6Fi>0h`dzrN#w=k#eyf0myj0(8l9vfyMBawHRPZ(AM)G38i^+q@3kBamZXz!byo5ZG+#&d8 zatnEa;HBh)$*qEKCAX4W1m8{`Pi_)?2YCXyQSdVIbn-yKcauBF6~W8N^U15Lg#MEk zkXH&`LB5E*Lh$|Mh2&*|A0RIxF9jdF`1ts7u~lPmeBpszAK)SK{F9MO=4WDhwIp!y z*kk6;rW&hCuk@#;N(c8(-SOS?Q%Mr{OogDj9{Jf3or7J(n8V%8c(l-UZRVQHP&^F8L zr|+3!o4iXVUmD2PxK&F&KqP;M@8laY`Dc*~lYarL27U4m`%HecNWL6T??vfNBKc1+ z;qp;>Gm{@6lON`l{B5|u3*xE;RIA6j z;5KTu*l*mWEyHnrX-gmj?p4dN%zpNsDU){<>i^J|<6`HZ46I@??s;I>Z}suK@U3Hr zrQ}V73gBYd7H%Xjd+a>Acej7-yy!PFs@mCM+16Va#j;q0xwLXVz10X&)wxwm<|~Mb znm1iGzi|(=JM_o&{iREL<}+;rT7^YPrS2m8mRk1t$bQKZ7o&dQYO`$qNn9}-#u zk=x{D4{%wqi#d;5k{1wL^$@*xUGNuDTQdKoG))bb4GgeWWuobp%r8VHD6(oKWGmLh zA1LC#t;Qc$^#ghrP19?lmq9H>qt}FPBSJrl(4JY19(^gVvGxCP_Ac;I7T4qVZn7i` zE^fdGsA$oKO2iAOt;9r&)J>2Q-2`_RsFz;URf`ph8Zx=l=NiZ4%V~(wig~JQy%+@R_Dm%| zY=``IBw!~BtcErWkF~U!e_b;bEwuesjlv4 z7eFyQ%adxDj@Zregsq0PJXX0_1mUYvfBbS9<9RqkPG*2~j0a}*glVY{n3TAmzdbF^C#UE)9 zRzEhAtZz}l8Y-Yl`4BSh3 zW!?x91xO}H#A2yrwLmi@3M=(~MudMDji!<_%sZh9>k-6f&PXK|BV`^fR)J*AGEaO& zESg>|TuvL5mTA}lXPiLzmWGg6f&7DjsQx}}=hHT-?lGeZwxPvgXG~R9DmmM9+!$4D z$Ljc1-SG-K8ZyeHZuz@>6JE==b9iSzbSw0;wIte=yDu0NtfxrO)BQV_HcN%()vj2K z6g{qG0?Ig=c1wlL&L|Lzx{Y4{$5D+Ui>n=9uO_RGZn9J;m>H+--J?J(6{Iuo zrG`c;2&+XnH6p0je!8hOGQQdRM{-jd^~Ow4Ja)vdB(qc3dOf}OJ#Eh}Z208B*3_Np z_?Jo!Scm53SRW8X$=EUIS#&pS%*?GaG&A~Oz4b8zN%^8a= zxEVE(oDYP_0%5Yx3KzEfhIlewRC3QqG@iOas=Q0PN-k}*)=%ykBlv9BO}|dlRQdF<+9*rAe2g$^Js(AIF0`YgQkNH`OFHJ| z6d$ysBZQ#7dy>tVn4i$bE-#|lvlNaf^BUB5|f!R?$QeZJ*`Qrrj7zHv0MnuNI9ZLMu zUf}OFhOhq^bB{TOPhFQ81Cf$3v?G-vWY%U0&+Je@{T@qR*IM+M*HcnnI7cQBwL&}9 zPoTdY+6k^GR~TB{Qt~>I^m;=&9=L6;(-pKTcg)ShFz`1O$j55fl{<1P zcbiwcX{60Ya*xluu{xdD9af*cgYL7-3uhJ|L_xibE?^iCbS#r;HfC&DywCS)nd?bl^Z~sB6w}u{Y_lp{|k*^N!1{>|z>Du9es=OxzQg7*>rS z4VuZC0#E!Tp5+0=L;dyRyLQ_;^{BE0#jSa)~2CJ86iQ3LImZtai0)CyHYS{|NEb3lbIWK?K)mhcu88^aFTgAfT=nWgzc=%==WiS0vgoi&;ip z3>-!UbzLgeo8JK?Y4Ez%izs8XYy3^2g5;5OLRcPaL}uGrg-u#!OXiK3GdP@{S4b!- z`Bmp!?I|4z&Knc9V};hgC1unJq=gbZUmq-`nl1W#}q&G0>4fdqM1Dz!s=ZQk9wjv1QPBlhWd!=5GkuLoH zYiPupn&siWcVoDkHlldO8+QSyG=>OY?n{K;hJe*0A{)jd-VKmy6+*-fI9$I*$KG3ySP1CU9H~Q zp^0s^J9p^0mWFoEbE&dZT`JK;L}r?-+3m4ji&wIEK$f+|G$Ty2OHDC;h#n?!ku%nw zxQS(@LFlmn&+gLgG9qaQidyZFMG~E|rlQts(~8@xlkb13;Ci~Q^|}LITx3}p zKYdd)%)xJX_Yy#6n^sBFb-L*V*``0}*OV1NWZyo~i-FgppzMhMbg$1o5!xW}GZ7Ww z3n8y1@aSoGoo@GPrrr6pv-Y;(c=670$YYz{cdq&xf@zcuAjh|dLHa@H@6dzi4 zPGUIFaJ(kV$lINPj47Bnj%!``9=GRf4m;&EKSy58Ly}8n#Ps{t2+>F z4DDCG+IS@(bCXPw1W}Nl(!{QB~;nJPUJIKDBnjdD-4w`u%?6NR^$}7mrvpig~dk zXtm2bP<~`5+MVIG^Sy%-$E7CcIC-@-2L>g4=^X1NYh!6BFz3Y5iplYUCVyk)fz)I# zZwDuKIxph@*rCGWk1n(P>6{rZ7ot}CG<#w}Zh63t`qkb~Wv<_)8ftP$3ry(5(*(1O z6StjZhcCrK>*rv(MAHicc;SFOQTnOJHN4@#vwe%TANYU<5sX4|&7^fqGy_jG15eamXvak3lTI`P zPt*g))M6Pefv+=N@-_G9v9Y3Y!DRnV(N2Mkb`qHo8+0w&UGfhR{<3P4Ern#9)Nm+C ze#NhTA<7tc2mr63295TGt-^pWXtaOK`9iV=r(>F?d-<%4q2&Y2J(T@e#EY*R#F@0t_u_B#Vo=QG( z2GAmZv?9yGvo4tBtyW_s0EjG0wvDKcDF<_79mK7;U|4*B`Z>o5-H~102i?^TdhEA2 zTAJMRJy9f;_%S-Y5_-m}T;V2GOjacoT5E+?r9y3CE40jtELUftC+(V5f7bqKWI4S3 z_(?moOgxP0usZvdbo#pM>10=~2-^a#E7@EaRzA=Ih)}ZoH2~-sn!e+kbqF0l)fom+ zWp|)0tU72REWDmYt={CMW`=mI0>OXTA)(zV8vk1j=FGy1Jc2i7+d@Yx^r#&gVV77n zyT_;PON$RD59cmCGaODOJD^@TCAotQ#<0cGiASR8#G~qgt?6|4{fMy1?RJD@=htHo zYZ^4k8fHZvC!=*|XJh3<)}al5_thR6Xcf#G6#Pr&L#e9=bvkD^@!`(LtV6Yj24o-q z);Uo>e!)B*;}R2X*Jp-16*nCuP^zrggmC3hnFbeYzt%dWAG zPt-I`_9mNiti0MoiNx*5g;@&*mGNomTEDFanfRG@j$OHYw4hP|?Taee7{}^)i!TiRTHDjy} zbqYP1k@G7xzMzNPnN@z6Oj=#*9Upp0WKIADS!@uyVK?Tq&o*0nwLDUP!#%evMy0MQ zv{E~H0Awq*pAS~ULH zNWR%R<0TmAJXx|O0P)@y;)T_tsKDz;B%9GB^OZ>pM%Ac3qfK&0+YD!W5^n4GmVsYj zPa1=+y`hTryO`-c0~46ZL+{E=LMx&ScaA&U`|>Ek?jMSj{Iqa4JFPeVW~TKm87QN8&tNH{E+4`f1io8iJ6_S&k)9+t9#(SZ#^X*00B zW|$uw9SxJgp0A#chNGi)MQuNQYD)1ww%JZn@e6=@^7S~`xF>TaYN z$!ov-k~WX6AEh){6zhIufCT@PziNg$Gpec)y{qXIR`()na3Z<>R=x&}w2>In;+tA3 zXpsPXNB|&H0|Ag)Djo3+tOh;oXjYc3KLTcQus+Ews?u})>AAkt`rDBr7UuxWO}tsA+>q}|3=loEo>OMV0Qs_<_xwEZeRjpViy_eWG#y3 z<8-GAk;0x>M^vd9!QH7Bgw>e7j~WD-uo}u!XNca(L1ShsdPxZ(zww&B+K(N#;N`4Il(0jUzg`acJfh4 zbT9N0?yMJW_yVOR9@}$Z$AJTumP_YUJ2{^=`US00(uxM|Ydjd;&q__?dG}xF-84Kk zr4tV!c<+4zOTU1zf=H@naaBy^!4jl4D;q12joD~J(aT0QjOvQ1Pc^NxvLTdFYNN=; z<$M&`_$lfv6a7*wfdWUi>i)xEm0bXy~&lRp~$;aWj{0uQkCY+ z`%+Ze->%y~+^hXJGVT8khR*3#qReZf>hfMqCeY;inF#3%G!gmvfC)31tdNS^6Rd9l zZD&DNP#@GZ&6Jdg;#Uj%JzC6u6OXb|DzgbI3+OV+M|l0N_zK!#bvrMdf0#$1+OYbj ze1EmiYH+B!qVZ>z2O;Jm~g`cVLw3_5-r38w377tHlM>y5|kX!xq}%?;ZU zgPl?q?BMtXBv8(qRC0LsM|3@Ft@vh%)9ov#S_hrMO$D`w2girh9wrGev1H@yf9uzh zB?+hJPQ~nRGKf4&l4gISN&UHTfowk2wdQKPM;K)iQ%`}UT`|?dhA`(n5D@&zz7ec{ zkWm*_l$9*}O4+zzO7u_J*}?jOAhU3&c(_46m7Ni6kiX6X*k1pLv^me{5T~Z>;$Xwa zJn7~t0#Dg(!TR<5T{xud+IV@{O~D2nV^6m&uj28!!9|b>vZ2Y1*GwO#62_ z@PC&U=p-qb5+hAnu8u z5XS9SU+>TiNPaaC|F;v+k0zK$8RL+V!oN5I;mbfs?zvo2;x))Ju!&OI`m83RlQt{T zto9=QcBC2hmJE-dTkWonH?g@qBH>TW(WZXas@F(ks9CRP-ZX`pdxccm0G{lez%(SF zDih^^+-yfXtE+rRuayxR%O7z~SaQ$Z;@E&<4Rs24qe84my^H9)Op$^;$v<|IFR5}$ z+UK27QZXWaYV|BHd?+%y7(N85s@Ti8fpNjj2EruYL@U%t$H`Wxw!0fiY061W@miIQ zNT=KZ;3>N%*wDh?(#qPz*+eeM!9}7o5{sj1C!sWO(uvx1q8`OBXsO?{puXk{ph@0j zOO6$3EW0iKorPzVeLMd3g+t5EV|`u|pCGb-292DNBF-b^(^rt?%Cbbfx@>l^L1fnX z3R@{>bj!X0AI|HZWIkNe&2=C0#NR#6d+w|bJ$zrQ}Y?E}## z|9D$g>U6S_shW*q+e{QQi0zT_n_{H8)D@^iJG4stGa|dM|3xFn!aN^kMPiHnd80zq zVrC+Bv1@Tv3JsA|8PAyTUqrP_RhAZ33SRfq#|&ldHR*?OPO(d4Kn^h7vR*blTHH}) zB39~EM6LgPe(}D{=R`f9vt=e|o&`l#WV_wl)gZ+b+QB?t+2GD25tMn9las66tRLB- z9i^e|aUXjU+rr8ALebJU^2(r_Nze^YRsC?#Is923HB94?;^HBbu8gV*XeRl}!l*hM z7p_;{U$S@aljf>xy_WXLJvU&bQ;Fp+#%{%NUR3>qNee^IdBOEAR~c%I|3tkBaCx;2 zUSokEcI|{~6NShiydnQ-DB1lY3=sP6iaB$VmdcN*~r@Jm_VNk2)lAEUBx*& z6iE1y7k@bHu+NtGvMi6UXO@SWV$_7J=(S;%(#2RmoVLc$GWD|IQB!D{b6oO}FW6AZ zLd<%-TISDjzT`^H^00b&z3%GBwzL?lAJJcCawb88dV)wNBQmakbn9-R{CjUnyj2f< z#6{{|>zxX%gMx>kgHUzhTu*$Q_CsaIC#HVMXyT@NQuC%G@ee{piC1#)6p*iJI#4OF zL+d6d5Bh`mtrht7$*V`F)7~BFE)hckz7sx(**D*AW2nX!2J4pQnWt+}`HsqbJ1lX+ zn-~mlDzS+5D060xC-7HCvOi_g&ZWHfq!N!t)mZoa$Lrkpcgg$H%=;BlWrL^me6C-LbSjUMhXaXWVyd}~33fuPYqZc5 zIPb{Qg*;6j&IvY%n~3s5&*k0t~-S^k@eurk+Eybd$F7%$#BA zR7T1qG-9eicnC>G;4b|y#V}NyiI}>~xNO}!jVL$V03P5rGmG1awtkj8IEaFegE=%$$1dk~@2HH_76 zixIRi0&W^<`xdNEL5FThjOh*{XQUd(@kb5+Gt&w3nEa@I@ESDArqdjsv)lQ5&nRx2 zXR~c20eQLDuEPU@_3fX*zAp(qL`Qvwh+vWpdSP`0%({!1wpwzqXQ{Z_@Va+orM&u@ z*rBVn+s;N9(ZC2RvWh69qaqCMnLUHb+i->V85YuVcZj3+H&B{(>v|Rs>X`B zMi*LFO}1i}Td}FB*mNlZS)nF?YpSA9&|YtZ!IaTe^q3dBLYL8r&T9+DEaH@hppgjQ z&t5=9hE}3!wRyV+Z3UmT$~jRh=ODtz)*$PJrK(>gJnpc6u9INuSH?LIt*6b@oHa%fj5YGq9$M*=rYW@2I5a&$ zQ$B43_s3Wf>f{6cDGx5VE3?=|EL3mo5+;OSl`2WLI@x%pUYMbnNOHkM3bD_|_bxx1 zE_EMBu9#Sl?d>veOEos<56~!M;PzPv)b&@5fs!^CkjiL}ms&bY3clUj1j>O)yG$?p-h!)!V2kWY~rn1$7{l?KIYAR+TkudJt0dgU_yjj2EJ z5};OlOihIl?ir}@x@m!P2Cq^LVU}E2UBV2Ha%;8Sim57;7U*VtTDQk>^bp!4G5zWY zmqTS3$f}eb_`60@GwFxvll;2gHD|Ya)Sb?Yd?F*q-1EzOX)l1&eT9$4bN2CunFtBn_P7 zgKH+(=LcW7aDnwvqkm#)s37q#oeNQ)zA0GF>jQJ-v0%O~4O_3&Fr~rg!(?Jjp@61J z=I=E1i0&Swd!`y&rY`48sK!2m@_+@V8e3|&XX)1OZarq}&i<{-bnBJ9T2JqReZFCD z2DYi_8KisE=^iMcmk?56_FMzGr}~40Xp9YdIt8q)6gPGjfAsOPZ1s}7D?H{qGs?0z zgk+~Mik;jd7&ZHo3kp0|-h#o%W_oTwMOe|!(D(^N*v`?dJ2P_YMlUAscXk6)dvdptl7djj>wG5Qe^{pmSYMTL((_`;vf z%e5+eM1l)_o8}`d#w>&|FA>P zU*kEozk}Dnk&;JHD#@>Uf(<{C58za&=CG#S(i*Fsqe?7as~q>=rJt22zWn1XB}~wA z;#Ffz)W|=k@=u^88cLfJarg`_yhTgKT+| zWLkTxA|dl7dhk^*i8zeuPiENMiFvh?J4wsJIeXuue(gF-3s3|g+M_v4>)m9x zu>YBnCc>G;}nP3)aL-T?`cKIlb{u&SUwXRkkc?|v)>Ha^<^gs9~O?mnUIi_RhP{?Er>H}m{ z4-nCBhT3nFz^ZGFWS~52piEwXf7=6OqSu@hQzw`yS}h!bnxrin`5qY57qY0Wdo|q8 zHp%SHMr}1k0*(EWf_A<=aliLqa=srMF%+F{-+nfxXaeP1Jm34tM1NjlxIJ-r{2hj7P(hcNKCKeFdKP3+)76}wIkCo_B zKL_JuDjy$!Qi(3nKh|%t-5EQmH>YLEtDL9xy0AjqRX)pWx*jPV&mW^2S(_k;I!g=> z%NZ0GiLkoOtRbh!uH4RnF}o^o(*fV4%e^=T`GOTUk_mwOSaQyKdWG4_O5Q!(?}?u% zfO72o-1+-s>P!QsZ}$00rvea?cAJld7VGv5>XGN zyI`#Dm#N;T4s`d{o4T^nJ%&<*`-|(To+a^L*ILZokJjr}`^QhFCI_lgQvy|(8aYhz z+HYhzbpevyUifBB8k2Duvi7tHUrWu>aNgxoYXC=yPIs#*&uCoeNHXEH-u3;2TILKy zOlE|0QVvmgNUv%&he^|i$Bi4T&iYO9;@(}|Ge&Y?!!%zarbsupIy0!T5=35KBfm!d zFE}Ollt~1{$(!C;NeY10UK`&!pt!T-U@-XrG6h`;c!sPJa*Nxt`V8&15b*p9799Hu zh?Tzvf$TjMnJXZ!)wZC|RTb=~)6`{cC91&I3L$N80#Gq-|~RZe@yAXq}Wf z1&UIIi*wnW>@fRUB{gjvvMKk?yHs{I_XMiEEoz0N>JCHsv5_`sPzNJ=JX1I=#0L95 z@~=Sd|J1pZuBk%VclK0Skv4#Q7a+g|>Wp+^owp?yyr!8kt;7BM)0@gB^#@tKp>>Sx zUEs%WaM`2_3L7vtMcrhWp0k1bQzF9W5cWNM%`#QkLI2AVPzQ5T0;Ij&5- z?Jlg0Or0hojZEDHU5+7B8sm&iUD+d38@h9>%2jHyXo1RAB1w^TDWBxu@I~8Zcw0oW zB5RSdbYiWRuQny+GBk#qC5J4^wGpvNNRDtivDVvykfuw`f_jqXBPA?cZ|~BfyXoFug=?4ho6k5k2G%>7%NZ24{VKHQKe7wU5xb-M~niBjP$nYrlmBMn7+n8i*0YBiJ1C@SudrDg7}cI9V#f^ zE2*G^P>QMaUIWv@v(l-}H24W-pwDI--8)k^*-8_su?Q6$V^35L&4t=x z>OpOELv1t3Y5y27GiQ*2yY`nxU{4g$Gu74Z_GV8(KWh0C2q&ife&kyXd@sv7eI}vz zDRF&j@5N0*sWOnlNcBIp_cOC({*P08qrppr>zJqZ#9uhpsXY$8Wl!xbdD@7F91i^4 zQ+piPlf!SEM_jEXLk(riW=>A1Iw667r=Klv`4|rTW97F6kkW@|Vy^k4UFMslX z65Han5c_nrwR-g3-o(zX6b{siR;&!D=^Ck*sgG|Ay~jyseVWspt>!4_wXz8HQBESN zZ}1u#afCDK9^t&rT}1l)W?Ax(mlmn0FEKN4nnLecuYdfM zJ~kLtKLlGNygg^Cry<+2ovofHSy9blgBrA^8+s&CKH7i+8I`H1hTsjPn(4)PSkew1RbVZ zhwQxInnPAir}jnj#;E66Nx+da3+6@%g7m9PL!F6}bwrYB=3^yEvt}pkoNGt6C+{l! zY~BS`luuNVzP?usb>56j! z5at^|6=|J=8>&8}lrE#jva$+K)U%|^@PF6$@*srpoNp#S1v>VE09O~}5_MkX+MisG z*Y)uqW()fL{D-ybEEJ%%AkbTD%c)0onI3R0m$Qpq(N1`-PE@SCm1x}x?M;RDgze+4 z%KhUvS&==e&9L8&?APb6M(c@~n}T}#^MIl}%&-1VYO$_$2H>sN@a884L@Gq;@pSZI zzTH39*mB~5!Hqlb9&^snMPya|RKpnp9K_Z=3RwawGiSuYYOfKcH2Dksa9q}xHD8d? zgd8pIRkNq6HJnY)%XG`+IGC(I)w2&W}AsD)=4Uo=wRaFGgir9+*uSTt3$C8oZTMeIdf1i2F+ zhj7N?nyfxM=L6K=*j#l{H-~d2fLKZvt*$k26!OhSBX2NI)olNKAK0v#6p`ih{PVfBriyh|u;0eCq!(g+a%f!Zy-qb*)$MBSCe0 z&X#x_{mfZ5t_sjcg{-A=7^ts8f-&=b_|sz-aGpp`krW>+=`crsf=P;xISwHwGl~zF zu9v@-KBO~yylnusOfgL@eTz)@zt9W_$!ZxUs^%d<>6Bb!!_rEwmk*vqm)lc+oovn^ zIbSBUu~y3=7;_*-V8}5e_h5`#4^_17DmoU(76XzKvX(x(WUUS`u(!in@8>TS^Ma1m zP$1Ye`1m)RYLFJxOFfD@<>vrdGfVZcru1sL4JXx5$ZKoq2>Exld=9INGbsG>7ktmm z3cTHknVBTkV2|{8`iR4qky3*k6v)-*t*q5&Yp6v6rEr4Tl{SpYb(u6qUM-bo)v2Y@ zjz1&$W9jo%sRjj#)nRM3JX0-9VY=NQQ=EwlYUzp#t6?JV1O-!>!Ji9xKp**It)C!0 z{Xe5;D)dPAo0`kQdxPs(&G8a_{HsGF4O>0d(k-+ICfSGej5Rk#X?&gGJsiJrg$yfl zqB$-f;J7mZGNqPYE<>-@|C+NkVKbcfAg1Om{4vepGX#VNEc#fFQ=-2no^#nOlboty zUCqDVgO)DU$g(-i!%Q85drs%HpTg$DBAd3BQwEl~WEgUd09*P^{)JBRC9I}q(0K^9 zr!@^UIx-`offB$Ny7y%iwUU}_3Oblt^RJt;UF=bhE? zJ^t31iB1-9Z5eQ(KH%`9)q6kIZK7)Pa{VE!HZ0RaW}y!3 z2lZP(RU==|Dr~)vin@M(z394YSBtIDu{kEOGIKs+g0V6n*E#1jta@=vRkar*(uU7T zm3PfX)wI+MTUpXF=L-AE0G^taz+c9`1KSwX`~|C`44-v1CzuC6)O8G zD2rc$>qw3|E(z;Mb2@z$p2LTIQyDkCb`;j*G}gaaC0I|#CZ}rFrljnAl~{Cr=GZ+m z`)4VY|M+*jk6Mvu)PHgOs3~UH7~$S3^;f7O{?2>glJ%zg7f`hGQt|-T2?^hLwFjBS zYS}udx8V!mfg@not-u@U+2`hw$t_DUTV3m+m4YpX|C0yJpdW$^Qqn8$KTXAS)0b#k z`+Sj{7f4JMSy(BbqiTx@w-B7K*vWOWQ2{*JtVo{Cd-Z*sDqTLXNbu0l!s(UE`J&Ev zBr{ej`6=?9xxb<3CXijv3zAnevbhOlF(M|Y>6<{rkH-t?03o?a)8}=o0c6|N9?Aoc zTubJ*x|V&n=0fvL`)aj!`8@FfO%r`izU?m=#GX^8EeUOLv)sPZ)O3x+%g+j>D3kZA zHw}$4QNlF!72V?Zx&_G*{_j@ni9&rnN3S{P zTQo9r&=M8J*Bxh_Z*#obZ%^@AvwhZNA+yE}tyb`7;o5!Ah#Zl{psKlV0I6wuE@Gok zYMqD@6D@G6Xa{p+fxfe0NW7fXgIm~2V$rNAk(dMi~>%QOAeP91WPv0S??^C94L$j0Tc3on+ zX4l$8pPn`Hz`7GI6K~6+QUMJ!DKJ@&1cDzTLokKP@;p-lM5fXg)GnYGJ1kHFKY<%qKY?iCNN|nIE#-KGE-WFClU7K@{Bd^PHoe?+Qu#++8Ew zH)f^C0;|1pptrr;?{lxsQ?-Znnz6Z=3&}w6rS9Cy%d8uuoo(%-yIrBXRf)YUC_Ypb z%XaL&Qli2Rlmq9k`i(kBx?fc&7j2n+buyd#Q!%-BEar=GKsp`SukmofnH607&4EYE zjD7CB?4d3#B>WmiVz90?MIEn5J{QW??C9YoH;9XDYH^6EbMZ+;q+eqlXt{{X#zair zbie-22Gq&=`x@TQxSq|eRH%zAV?KsK*S*KoqrAC(CePlZ3uz_kJtF10pyw?@Wnu40 zRb(hbs*>8;tuDN}nHQyIpbJsxPGV4(C18?%(BLhEb zoHDQ}JTUq9BLfdNh6hfcnbCA2hru-y{pLQYjNLM8P3~mk{WSHm^jZJTMzti=LyS_lRs&jHvfiukZjNgVy zKb|YFS>+zR54^O6!;~^wW(>&=UaW`t`*;K_ z<6$Rn*A6FV*A7sLe+@j5;6nqP3;9aB3nA;K#JM(oAn%uiyeB{FO&-c~2FRcM_zAkf zV3*`eTAZ9`y_)Q1rCke^v-)S6T1WD&uJwYavcAccqTDh*hsX)-p-Wa@$#-wR?>W7{ zH--JFN$E0g@W;)yR8KEy8Q7W8b<#IC(^mTgs!Wf+^0zWR-b}#~y-FKfp7GXigMsqw zQKNtRYEd8wpR$k{wf1lxPwKasA>G;P=lMrH=aMU3xiN@!mMptROt@JED4XAsMyzWc zrBTA>=!C7_cd)6;CKm_D3iCpeKHv@}{eLj?eFBy+vntEEd7_D3A1Z6+IBVzIV+Qa#Y5@(#$ z{v_|Bj^jMa%V4(4ezgnk+o8S5=71Q9ckb0gOvFi|PQ~B*e4#iF1Jrfsne2L-rq0$F z{OZ@)_4pxkG&q)o0-LzrRlFgyc09W6Jlz&qbK`T;gHk>nRaYYt^yItVYf*(nXnfb_ z=Eb>*ss{~hx#YM7(LhV|@;0Afdy4xXHFT-*5t+=AgM*B<3z>UJuA#&ajjDSe66h3} zUX%)L53367Bn2>(yC=4n-tLPJ;M5;>VC51M-;wVOtE3q|^SG}q?Qv4Cp_y3pRd{LY zJRJQ@Vp+V!Y3eW=MBIP$q}CufI>OkJ`}9;xlQNu8m-Vf^$S|`|8+DJbN)NfmIV`?O zm;|=oE4@^L=8XQ6U7~<`M7IwfyZuWrINM%)m07y=yUPTh&!yYt)!Y;#Wc$(LK4dG9 zwfldNZK|7{aH;uuWE(C1KV+-HAyNl9tC%4hR0B^00PU{Utq|&60JelmxD`${cS9u) zdJ|){gcKM;;x!#lCU4$I>aC3wx!-D&D1hOdG)l-hS?){vkz5DG>CO+trEW*uIC#W3 zrStuXUxR>zshMaCT3xC~U;QgXE1X{Ha{9;^zH;0@{*ziMZ2l51#V0AY$wOWG?0h-3 zMccK%C!13&9zPSu1X79xn{$K;YJMSsOb9sfob??g&5_`$YwXW~-thZYitzA?yzFQJ& zVCmHrXS=+31Nj-pDKA*Rgtz0jbxTb}Q~m^Rcb&8z_$;MnB^%;*X>Te{{B=8`Q>DIJ zuO*xi>RLM=2Y8@;yT9ZPf1+B9(H+<$dl>g0TU>lw(^YaH{$)0!F%^>nT=NkK3*FvN zX#kK8<_-&UEg{!^6mq*?jS(-@#_*Cv7n-55&j!gC@oXe8qE>h%E#1AB<*rOVpzg={ z>LqE@)Xb-Z+FO6wdwrfnb6GT0>1qq^%A-~?s#te;oDQ|$9eAX%!cT>Jo_j`iUW5am zJA||x`0OA(#KjgBy0F?QHD8?zKyOw+y$^w`c2U8Lj0&cbd_;S`CwuKe2vL>waV;)K z24Nj(Td&Ktnm|#Hk(sJ%9R?=mC|R<7q`KcgD>;(*SD#+U%? z7o5Kh5*eI})SC^O*ZpxeR^&O|VLTnA9+7<9qrx10qb8TU<4$|5@{z9dC1aUh^}5%8 zAItW-$w+{EFMO}|E^k>v?6z0xZf$gHx{T84+5C5~_yBp*gWa`^l)9Zug{_Z>HG=mo z=DWL^>R0Y}S&k~P2bK6qH8^uJpC4>?zRTxbIXK%U3<*Bm>|9NSZqvXCgXHsMY3dhW zoBi5nyom|+Q0@JVV>z9T-mg+4>NJHUn{kRX9%@tG%QYJQ#2)=#-J{?4=J+&K`x_zk zfnT_iP32QS{TubD&4IQ}l3eBdU!NA=XW{jh{b_1~ZuN&uD{aAk5XxW(lF#&S5>$DS}-dG4BNp@&^m1G zRd6tkh$lNnme%Y}?4hfxuF1_;EaaVN_;V$9BRlY;T?JC(*Mb(Ko4NxrMH81CNc>B^ zh=})*&5`OVJ!t#SWl+@kZigKQ{0e>nK}HVk9w~Y9JFE5h0y%{!a9YFf_DU~sd+ z0M(S?U6ERCmVoBnKyZ*zQ3GbVFJ&W!{cncs=Q8p8I@*KbM;u1Uc^h}(XY@o^eM9%$ z_OndR_vvFb*E1B^B&}JX#^^4O(FK)3wkM{Gh*xI}mJ|^W;ylZwK>EV9&OkYC>|PL1 zZD9BQ5uhw&0i<5~l}sZ9@t3fs?0m@%g#xkln?aA&rwr8KrlS9SSHi# z47V@k*p*x!&HV)K${J`~Yql;$pzQFcsj|h^!Q{VvrR9ORT$K=0!+r?SNfyhI`lRA` zN5g&kK}MiNKj2;Z)x{d8KmHV)vVo;OV>V9hgAL-?h&xJq@k;`_b&}RnMG^A9@nIk1 z0*EODDf8y<+7Vo{jTB137?Z1c%j4W2DH%!(IFb6!_nV!_E{{`1`rwTZ<5PC+cth#R zN@|`@1<&kH@tyP~b`7Z~1reQ89>pS*rO_zrp#Pc9_wIyrrmR}m>z+>ED&{i3$@c(s6mV|(G>!8g#b+$pnpYDHMRChBH+q5YVN(s4&7V3C2$j_ z|Bdh0zoU0--}wH$<~kwgir|`@4D}y#;prbje8j-}VFun4z!P!}(h9%diP{_ILtx`* z=xaPKbuM!9oKa4WcGx%uA4f%~mqqXCkD~f|IFa9IKwkwN)aE}Q#fc^C!qv4N_lU^d z-T#9PIaxML&ay$5e%Lve97(4a2Jh|4GGrxgPnIET&0K$kBxu^LK{UD_rY)T4mt=z* zl43gsH@@XU)ZExHOR(tP;LK>8TkXxvVA#rB@N zkFg4N&HX?4K&P~-;9pyB%J=2N!g~!LIv7Gt;>wbKDx96vSr zPf2yjk2>MOsq>)&pzz=*S$E#y4HMq2epV|J)>qnln4W9t0xHb*8u$M{B(v$2cj5ew z&b+kIO`!EyJ52>$%y^>ix`?jqMYyqG?V9!4vS__Gi)4PtO0ZtC5k_8wA7r_#b|W-6{BnKki%5|xGSBfb zBQi5wk@>ZGrbQ;iU?edCi(rEc(E%_KuncAfUg>t#1Wno_oD4o@801G)J|u&k*1xhlIcmU zBVzolNO_;CQW`N~^$AJ4y4LSMAX%&e$zpxW&0-Y^6g9=jDNFyWZr;joWQ`{?ow1U> zI!8DB2(8R4c+4HPWU)?18}r@d5jicLPxnM2#XXYL3Y3!6dN|Bow|JKKiCyIfm9l3f z&{*zR*W9jwU~IF$ty8Y?UBB4XVUmf%E0guuJ5x}*!0$;6jq<~+lEzFYn$_uy;@qWk zt~EPjYN+NsrKDfcwOp@=<;fFStZ6Hq?@P!|eYWfSOwG9vXSt$~ErTs#^{Sq0w)0KU zD3#cPK*>OBc`35h2}9fz&#RCutIxU01P+qG?zv(PkWU!)x$d3L@jgZ`0dxRyQnUY< z)pKSKf&yR@UwoN#VO{HrA3>1bKh9^$MBZXv#1#^Z%FpZc#1?5%oBaMAy=X`#FQ6tG z3=G34)(&xL8wRW!ThkXpcI4+ZjPv`A442K=k6{k`_S6Vhsif|A_QNw*6R$b%h@B8qr~LY?u1$$Bo%)j6CN4$f+du6Wp3SD<64?s`YSA zBe4Vt5hT|AK+m(b<}ok7yRh@5=44k6#Cn|H!vtT%PwxRN3#*4jIfj<;L`KQCBafGc zeZl%V6jL~CbyDMn#kr24!7RC3ouFO0jB_84t3!sAvbqzGYdMOE7SM}>jf9LhG0XW5 zP2|Aa7;q9b^F{NWOU2h15WQvb1ec1pAd{4k$)W;wDzOSK-Df5xzZoGr7+}8?0NuBw zA?EXJ_-53O#FNCSvKyjmNtlrTS;XNdZ+e_)fg!>l*M3PWb**l)U7E0fb!O*ZjFfGo z_ZKGUMt`7DAG>JwBc4X*>*j7Gs|M-Tb<&z&bQ=(_EC<<9ZijAe`#OxHm`eWAG(nFB;a1h?Ul&?rJ`X?fl!9SV|1^_bg!uy4mZ2rrBM%t!<;&FFCBa=B+t+nATYF7Npb$UmK z^PKd7$&^sP{5{Ae_>`MjrNwOON$AU;%+-}BgyF1Q5iQy1luKp>KY9plZWW>I<*E-* zZ{p%*7C5{U{k-e}k&#m@v&z^SBa3hPxC{{6e6qXu&{5%sR_sLRdpx`IaGIcI9=Dz8 z$051++mpWCp9-z&2sO)>u!&DS{7_zaDIXW-H6)wFN_t!t%UaU%w8(Xsmt1a>lOGZT1o2x z05of#--^<{!T@#0Z?lAUBRZ-KC_SZ<{P7WNVMRuighwTg$Bc?{ z^_k%_x)Uzd?Rk`$N}%+gA4%_9rFVq0Dy#x5Pl2Ti=xtLbugmBS5Ajl6P3fjW2uIih zzTIb=4*YE5QU*(V_gW1sq%<4+=CLo-;6Z?0Y79i3X> zO~}zC`IT(M4288?0HrkwY5iLT>TH%C*G)U+rTVu);wLo?uRVO;f}ypCOBN39^&<(+ zJ4{^va=~+2BXPC1%u9WGlOeFrtZ^60aZULZW!DDl-xP}I1do{vr;^2`VtP#CaB)kt zx(_m6U{Q4ciauqd^_H*P)A%`vGdFd+=D{duUfH?UfkbYFb6XV$0`r;X4T9Pq4NBzQ z8h#4Q3WJ-ur_p(}n(_BlbK~bzMpMXry8H-5Vp&vuk2#^h+!>zi&hQKtv3rbN)-$qa z9VuNc90@kua|8t@zg?rxyA#0mH6$PKL}b-u8f6@{T^h;y$Jnve#WQLbtcGt2;>(RT zDLG>6?_6Zb)9!EZPhU;(%&)To?D|!5u_L}fJS76?)QbR`-vuZ{+1jCzs5Cn=s;{E3 zLhcWs@ndJM(&z}WO%3Oac0qPKLQ;U{=?HC+Kl*$@CwjJ-`&^+8Ke;3aNVl6Ohi`;> z+&(^&lL(^fbhCf(aK?3ZWQF)o@`R(rs?)Swo=P;+xXaW&KF>pK{S&KVYJsR2ot7cM zn*)8r>J(!ToEs(fZR4@*!ti@*<}tUBxybiLnRdhM7%tFzKhg4nE`V{(Ox4a86Ck$(xRsVR_D>(eg$HG zO)Yt^3VZdGE$~m*@UhvavF1c-h8f&lQ!QQ~_A;QP*s8Ae<9qbhlA%kPi8eDhXupF) znFT7W+jh{FT8rf2bYifzmF><0`<}KoAJ{epWK)y8uxYot8IEumNA9ircv-uzAWH(q z)f3Vgf&q55-}#a~RDU^<9m^`6T1cE&I*8wX3p)QI!7#^j$B$$^7 zHXQPs=X1^wV_zWVTwP(*I&pBm+*@!&m%JZv4fzf*uqL=nG4Ys&I!fo0xMF{|x=F*{ zRVOp`v%hLe5!5{_U6LYp&29pEB(C%>ehHl)6Syi+MLcSB2k-T;XsbL{@1 zoigD>F|*e*AJ#MT6H2G}6USQx&Ys@66}PevRHmsdk_QjUXKmcuCl-0RkEDI#XilJ$k>OmVFO!^c?~>|~4RPA2U>#&p zx2sb;iCpV4pZr+-6n-1q&k@nm%Y2CeR+Y~=o~NbWgwGnnFKk!&xwy?e!yqsU;GdiY z&`kV%7(sz?nO^`>VP*}nCix8%x%WWEtK#C8`0?bRiaR$P%(=N)`~_Wy+xxxjc7KpNOFLoxVQnWLSJ(P=GqRoR6h!s? zjOF9P>N$jf>*~b~`h))HlaFoJ8|=1do7ek9la{1=G{i#-v?N7U`?pN%4~-c2jIY-Q zKN?T|Q}^hg2LK2n-qVf%*MU=O^Cj{~F}2k^krF+wn@@K5tCH=~@+U^sHd3Xxzp>Bn z(R_NZ%xjLuVq_l=Rpf{5GMpNU#PjUosCz7c{F;U=K0BWYI5kJF4fqtt`Qo_QDi&W`=UA>A6<8?#x7$6z)%eS2ovwC$I;HN$G)#YC~7MN;;aerw~{P%}EKGs=Ir+h-#fN~v717OA>T9Stn}?j`tr2{BK|Gk) z-`9_sN2HRG;Y^%Ak=$Zk>!0ot>E}06rN%I-79fRe1^|>0?-Y?K3GoQ-f)Y>CYmR9%9vKN+7`l_dI{+-ap`#qOY4?SmtZ^edbA@uWabd6gNv?2(4A3o<_d8G58DH`=&rfg;gb>vSdu3SHqntlFdj6W9xyT$q*1 z?jg?EUP-8tBN`%Cx!@L@FC$$w!}Z3?+A*CW`+V$Xj6OyTI8CsgzS_2&hT03 zlEvaB#%@g_Q^DiKgDCp4iT*IvMb9IDHJLo)k%LS06^{A!+-tdIjGL!dv@t zIZa@mOs=jGXoE1U|9iAq9fEODnv4(?D_%!tPu(RRzg;DnFLGh2$B;bWtnh) z(@k=h=0_5BV)7~=V~a;)TeG(KGh>UrtQ>8N*NOp5YWFr{iyK6xh%G)FHzU1r2mi)Y z*VQ}}3blpR5)ib9F#!~(4pj23mhOAlPOqIm+7oP;&nISUPxhDWwJMtvvn31*HOosp zeLjOFw;A8=!!T4fa}wAYQgTs(JK&nFe6p)p;}|8i>+C5$ENu-xpJ_OLAh*}NCMA>`+<0{ zjzFShwgfJdByfrPO3o*6$sur=L>nJ5M^m_{>B^$U$wiIPqS^&T-e7~A)$2YYE2M&< zi#&;wB$8^cDB{EvW^|pp1Oeb3bTV|2e20X1MP9CRo=oIZj#LpHRR*?m`9)vCL8qDrbzU@ND0x1m|8hQry)noB3X#KR5zTdqsADRX-joHOz0OizNPusFKYbCm0HNy=J)Vxh{T;YYK1i_ zUG6Vk;IlR)MsS@4Qb_uVefu>8(@5JbLF53|F0 z1xsM_+oOpo=qu5?@ru#~{=~4bbwCK;Y*nsRS3odS7z`zQEJ}|*IK-lGSrHXJmVw(c z4Vun%T793~Uaob2ug21iYM;wXFHH=K#jFDv_?u*M$A%w`_JRMxRoRyFd{`_Br^-+) zcrZq}GA)Cc7rzZ!=wwFEFXRz$*Ra-^NLJ6TN9ILh2f%Mtd;iheRZUKac)oC}aQ|%a zP&ix0uQ&6nv!Tw8&`wC~>BIh{6lCa=4bb+Tk|q-6$qLfc@OM)$!a>d{fpC?8vnsc!P#=ghfk<=N zOOT-OAY_}tmcvd{4scSRw&x0l1UX{7(Ry+XdNizm?>$Kvr01m!j$gjE0Db%qxDjmMB2#!_{0OY0e&VH|8ua#=cW+Mfj6#BfI}5B#imm zLtDJ~N6wiL>M|izBMZFu8YXF2-KIgMl$ma)=xkbyZW);;kSobwo0N)&_Ax&03ief<=lnN6V&dUUbl0Ht>EM}Emjr$96Vro5f ze6Hh;k>ZF+U|3qYcuoy(aLFHplvzdRrpInWvuZ^*TD-Tu>9Ku)(k^+ecFFe-5SP3X z#6;jC8!20@RWAwKLbVL0LlkULts116BG0-n1+CoBVhKs9AIXNKOC%&+(kCR9(n1m> zjq2{HEcnn8JF;lHET+T~HFXPPL>7x9w#)>ifBCDJEw;mSG`dKgMGG-+&6TuFEM{bH zyCxRF=qcSd%K~ES?2L^Xb=f+5I3ra{Zux|Gc1doeF*mWqiUq8BeiU{00O>N%e@kRB z@$cBsA{~JWwM#>b=OCYpz}AW^@pfAK_@!rgpneTb_|B=yWo`tzNJpTsq9Zr5SRE&? zLrb7%E{!6~(DBt{Lrc2l_kM^=_XLVN`SEFMAEiG_)J&NlMxciF1r|pv^brRqZ0o;v zXt79P^4~>CRTLwmxLAEx#HCWV)=kFNEU~XH8JX-Zvew5%0oN=pK44va=}31=e(Iph zt*MueGVn@j7A2l!Pji{fBbPhv(uqatN#msmtEGJFeYj#I6^z`A?P@{Yxl=eke==re zyq#F$#;KTUnJjVY)9uKYFmbe5iR!cI!rodHqKljo_yQw@)tS;EvcwKG=EA5u>BKN< zD{TdV$TBT!-xeG~weVaWK*ZE+PK9O`o9l6vkvpnuU3rt(f@}`(sjt&7lLH)+$pPNH zP54PBaG0bz-7=4u`pzcsBTW>@Bm}n@#4`geR@-l5j15;Y27}slds!C8xX6%b@ZocvrjF9<=G$PP@4@I@gJv1rpmqCERx)mmf{>BaPtD<%*Ltu^#5b+T)?BM zuEl>Q86aXHK_f;*9Tk;Gj6u;7NHshrJR~p)BmqS+KzKti%m5;R#37pDFfFZMz18-w zR$FdMtu5fS4=n-`w6r3nJ}OjHT2CCSs1%V}=KouJpL1p=3DkNo-#6r(v-e(m?e*Gg zzt(03iS-WvefCPz=kRw`^se}lbh478+?mn|hNM0nU#|MMKs7M4Llx@J%n%x~ z_yHNKti4*zS&Q-M;KO$R$A>IjwKVQC&^b76ga=AoDd#l312r~Z2r?}N>hktb=eQr_ z#$lj}{EOzchnhGGeZPX+9k_{E*?YvaGI!MOEVN#|o2Cl9FE#EQ9_$R^_EiDu^J0hO=P7WiE9Ye;}(m*({U@Ag(94*PwIrIy=wGkXW7G?W!tnP!&5T zKrfU!PjPxTGTg3xkyHCD%>a6I=LBdUYx78jgE|4)4HVpQl}w6T-)1hXX~!AV8C{vv z>Abkjo@#3@-eGHLp|D_*>~f5j4rD*=PzBu~B{ZP#J#5`brQ$AEL4K17Z_Pr|KzwW@rDwS~UdEu4$S<$Loc3D;Bt{IUQ zFZKnmEbh(?3Uj-&6-wVDCF7G*S?H{ z`O(?Z-g$yipkM#MD2;qCo6E8#S!mkxD*_>bvZuIT%78b#^$^nD3)Af{~^MCydT8)phm7b~1f zWaH~nE)SfK{dOIGcFxJ(IZpA_*}4o=b?~Yr*cK~28bu&R2}AfiH8+l8~$ zu@T0>*4lBZdJ%nYK++eHR|oW!=MlBB(aIB=sz;>;-FcNuuHL$gI3)PhTx33SwB*1L zv)g(d$HgMA#usHzOL~e!V z(7q^EAYP9>9wG>5vh~!ziP3>Z@m{J*LUERQmC_JRPf2+p+Sc)MR1h|Jc@MJZ(*7<+IBZtWECH1qcRQPH=JrN0HG_bUlvmpyNG^Q6-;uN=`I_J=sd- zmBPcMuxzZ#k+=0liU&?)tKC+PxnebPY}Vg?v&y%_)GN#@BTpM3U8xGk-5MUS0@ zQE$&+7cSR`4K3QcB%^UqVJLl6>?i{WcGg^(^>m>`@hJ#qtvEaUp?W@J=^3M9J$H>v zP+mbI@()}Pq> zm7z92HSNfzqKN+~nG4gaZmrLMbg^Ac5uuG}c(>@CCwC1!Nn9GHub;A_bd}C@-%}1526cj-WlR;O zF0B%aGEnA!WU-sm4|3l_JI4MK#^Q3`N#BK9%l>>Ks=W|{Q2@58X>eT|l?J0GIWN67&8QFZh}AN+_MX;o)Q zV5(u|eMGv9>u$JSSumSeyD`q(#vp{dh3)4)_L=7bCj9IS>M>f>sgh9tm|Q)mdzbG} zfDCQlg^xH#bG;5SJx8kqGkl0?8?v{m>pP_GXn?z~ZPd+hKUx*pAnlPYj|%T-^Ko8@ z4+T$Jy?td%v-L72Dn9bZ}4?yH`C z>RC*N8P1^kTPEuZOk4!kberpKRbU0*7IiU3R9)Kb(YLKrTh zP=dWjV5mnJ5W|3ofUp!2-tLP;g`klQA{{aNsx2id0jswN*TrxvvWta~uH5VD`NSNS zy=z!uVffHDdz2t*kzv{T&KQ#A&f7p-VKXV~IYkKxF}-b+n&H;$!Yv}6KXQch(iw99 z&vjHT{>30+l|lsv>i{f_WpfQz1=mw4L4Qg26eHJkV`ZoLzrKL!D2M1UgPu*q@3={? zMrsw!gbb4-M*`Lkk#pDPYO^6`H*57K2;TM>|0U#;yh5Jjepc@`P~)Iw?UDu8fOT!^ zSJBDwe3B-;hxEzW2f7yO_~glG!=~!bUKt&U%2hj79tblsQ1|XcN1T<;sl=J|jhuSX zt>V61a4RP(--7qTltT|gAsAO@t$S}xV7XNpPqHJxA$yG9*xjBgdX zS$(0Xn`_vR4L&}ucuGuqk*@zbz_iKYB1cA=^GRhr?Pti7=2SF%1=-k!9MKmddHYsa z9@Rdv8`1j(NvgMRZc>=H$r6vL9)~nbu3&GXEo>D_ryF2xgRm6Rc}#^8{B;l1$q7kO z+BU2=RI>}cNwb88(^Z3%OwfabF93nYM&8xU3~%G#ZSERZ<^N3BZJ^MK~S>M5e2s3U_h15_v$8?M$l=xVG#h)scsGbtR4 z#oA);AsD(3+ALKi>9~+MU_D!)S`+)dtv2>myg#gS)y|19u!xz`rXBBpP?0dK9rK!VB#`}J~J$qK7jMWm={&~N*>x? z)_SPnM7LT3?Fj@#srnaC81`0M6C~^7sad_y%=$4oR92Bcm9-yPV=JJv15#LR-GkjG zS?TxR^fU7d!kF@;tN@E!-=PaoAXnaGgZz`^lkjQ|NHH$fM>j}5t=&IxK>nDlB9QyU z#(YmHwJua`jh9cHG)K=JIKNQ@sY1kv#}11S2{y@ICW_cklPpM0?B9mGiextfzO4`# zl0}q|UT0mEwbM!e2@g{J1hFlM-ai3qHgBVv=>7f4P6d$-8+na1KgIuoiTu_0Sl^@c zutS=6@_#5-@X@*60dZ--7!*ZqDo~bBO$~krZ~|Uu{G}#a8x5wC zXjl|fTZ*6EBr=bXKfr?!i%lGfMQUtAaQYYI@sxSDv51Q)#L;7I%x6_D@2no93z@6vy!qSzE+0l z92xbN3}LNhVBf6o`QIB5x4sW(VPNP$>~iX@vVKa>!3PF55;L*Nx>`@a$j-%G{`Wj1 zhcp~&=-b%vo)NlRZPCoMhCm(g!Y6$clcUOpcE)}odCbs((8TI$=omW0erIW>+B3GR zG~kI&G|~iEp4v#t>NfW&;*2USc?LC@*UEnF*V9YABLSHn$cgP6QdLMnLojDonzIsN z&ldioT-uyBTCB^1(l6N7Wd%HJXI1m|b!H#*j}8$~Ck@i~fr+OQ}ZTji|=o zfyNd&btzl5^?O}T_TZ%1I-~km<*BW63NF=_!@5|kFYIrXK83%lcz64@T__M)qTp#(?@#Is7#S8ea(pnUa9=c zU}9Y26EhZXEb^}o6)`%kw%!H{nMMbZQsh!Z+wPlR!%8W+evSu`>zNpF6~bE7NAMG+ zyAzC9wyCxr1Q5X6n5>8g1{}l3xK@ZKdCJHWz5jY%$-oYSSWfe?AYOyCi{t{5NeBey z?dnr14Umr!D&ymjP-AGHI4px4Uab1*o}K zD0J=hvUYNKm8$X4QjtUHT<}~WIqNQZ^qC@x(XdAlVEvZ9lde?FWU?7&GW386(a=Wg zFUq2@sZpKKkE+cT)z&ENop5OzsZoE6n4YaX3N3yQa!I3t8E{C?LX3=+pwQw&tkGGC zoP~nhC+L?5q{sKd z5jySFhdT27I=tw#SAW^D7*`)-{r^L$7`wGUfE@zt`ZaEiYMxhhNb8HX`%7U3j%M8mF@@ zlJqIMRk{P#4-xn(Yp}N2o%ZTIF;B__JV7Vdc1?#~{X@vF(nH`R)i+SR$j$Y%<;(Z# zt$<1D)z#Sj-}mZGm~}4Z&-JrJ$bNss9=7DVo%1w5&Pcl<3s&)&-L~_0gmY z&E7_mPT8sVCDZ9Tb;0M9oqD$!2}N`K=e=V@(?$*xTQ_3bYpljLP5i`%!q9;&kYcDdes zgxG4kcc0j?ci(TF4J@TC-4RXIyYJ^nXHxGzc30`dQ}pipM@!ppW=GDK>)n^?4zttV zJqFhlyYE3h+N_k`eY_q+Ih%0BElBk4zizqnW- zr2BTKXGc@3ta>s>^GBpRYRi$c9BIR+UvoCR05lEp+qS`_LGjh)S*k zOE-1ckjlo;b8d&vdcKrZOB$5z*xm1g2-3v4h%MdyyLWWdkxe5-PAXKB+Rj~`qlt+uxjR9g!aec7&@ zVckQDbniN(r90A9k^cK|8o;_pVYA^zkCF9UC6}rN#s}DmoWcI%!`44wBdCb_#kuu_ zxqnW%b>(DF6?a@90!Q5j*OVUDT641Zg zXP(ucD{fZ;(bsEcqz^qB;UVUc zRuTU|mEM|E`mk)y)N{`g!$YC=6C}o|bX_NK^vd8TBZLNX6fA~aPhYOp^>*FYC-%VU z+&fk7Ax`c=NTMirVf);i?5gJYfX~c;-kcY|!CYQABx`Y(tfxJ(tBwsT@rL@E^?l77 z@X;?Q`oq!-ipCT#IV+YEsV_E%6>~;}l7wY9L==kZi|gNuS(=^I+%E|xxRakg?(Sif zB{#-w8P*jFyYCHQbv2aP>OYK$HMr$KCqjLftb3qpFf)+cSb(8qwDrM1$y|MxEe6wmGmt~u0_0N9B zM^nQmZd%eKviB7$#??OR%P%pFt0FJwwHCdW6^3cXD;Bpu5-2ntyU?>2Hyo3|CDezl zk1mwPtHb9KXrXtY0>JS?Qmd^U$dOJvR$AgAI#a0})>Dbr*TmUS<;>EO@NQ4@zDQ|F z=xVbnC$h2_|35O=tm^Cee4|$$21dG5HZq89{-Fx_Q#dj*D0ZhgF59ds_MGV7D^gWV zb}l74D^hmAb3zVv9|Dxw-Sc_>vICSZmDSwn80> z2Yg!e#CB#Oe8^r)*HR^Z4=0HqYN9pue1*-o24P`tG(!1+VZZe=+Oo)(9_IZMF*#;h z39*B^>g4lK0jZ^H(!NMJ+3^P^!?^!KV6owmHS?8&^vWSicFplfSNoca?qWOWCojbl z0StMGm{(=}z%dSX@8V#%OhNtVYYJ+Wb)b*7C5M4R>GqaqjLQ8yx%H|cRf{-MIR~Y+ zKwAH;i|Thr9DL40q4SXAJoI%Q2I`0K%#xF>rNtr(+%K*zdwV>#-z2msaLtBgcw6cW%JC5WsRQv|ChenHd{y9V?`L zO_SD<&S;e!Gm4xWMYgLYkJ=mi3o_YzV*dvhw;xJ0q;kk(M;3t69)|y6iK#;Je%o#11U!7|;Wuc#f*qyk00iTO>Dm z;|dD#BhWR&`$Z83O^R=RkOyl5$f@zd;PX{mMDL@B1d@I{t2xY*XiK*B>s*#!BCV6m z@CR{t6(S~|S42k+w1mHqWp_FA9}Pc((&2&@!4+DNbU#viaT z7jW1otb7o3M@m;)f6^)&yOv6;t#dVNxHLxeS@xyY!r{cci~n&w>2d*m=`NMW8bJoB za}(nv&YyJfUCAYcAt>E@%)xQ~l|3Qm%ABIsrI!|!<_0fhM=01|q|smqm&v?om36zO zjU$L+2~~Jw4s;WKtm3FSB3pJi6N?P^utu&eS5fq|by}gS`t&-g(u>^3N;0~J2ACxh z1=Gx?z#s~ggf4zYNXiyV;-c!saBH9_hI6uYaC!=Wh5+cgvy zor<=N4Tm^Zw-qX@7DKA+@S&a(+y3I%CF)Z}h381tbAdwkruDOS^;Shof{Vs8et4_Z zzh6W?cAW_#m7J1JUgR{(_Gdlk&Csml(vW^ui&OgAxPQOt-&5q@A9^8nVaIBwIvLMU z)xhR13R|-`q--70J6F}3Hej0swO7UEHUYVIhz81N_(qzj)xz1VRTe8{so?3eP&1h* z3s?`K=dyp)GuP`vcukve>zk78QTy(8DE1NJE)1WA{#ox-B$UWGUBvyr%z$zK?|^pP zX>hocEq=qk0oy)#((F1Q4tLnM0JU=?W&1UcI6j@kqaIqpekJm+d8E!%iWdAk9$k8l z&7<)UZ`E6>aiRiTIuZ}<=fErK)ertF*h64JerGH=kYhs;7OZ+}z`j@)RX~Aj1#z1N z`>NTL?Go?-2xPP1*XMQ4g6n#@EXY;DpUQ%X+QeCzk}Zh^^8qI;IE?aGQ_GWBpiO-q zQ-e)A9%1T{(D-YVcC`3kOELH$#w_<{>^7~}M16u**!=JuF$1~b6P}gn(dBV7AoujX z(=&V`Ep!F9_6pro6ye#kHF>huZyQfXM98z|_)0mp3O7TevYzw5#uWmpn3DW&B(m$= zvA!K)&PilSz|0Vs>H^^2<``tZry@K==PEPV9b{cbCu);?6iw?)>bGUNB!2==zrEDI zt?iNZUy|*Cgw%h2t|s}NbXV2~<2#W2Y35a%c3jQg3LOSYrV{*|N45jz*wJzbEgKK* zVLutrpgR$d8x9!31ty1^Lx;>X5$K6&eIrM#oZVy)oA|M2wVVasZEZmj$P3OYuLnD` zJL|boh32w;=2=8$ij@5(TDF&%Eez%2q21-Guj$j+u-9|mw$Jv453%TpnJ~-t2*rr< za@51=`;TZ5c!{OR0WD2443h3Wr^Rm7c9^3Y*K0kDU61j&t0(jkSDO0=@K!Ze%6>>I zJbRhX0xoT|#!Jo?o00?({~7j7g!f8pj`i5M6iPCrt%h<{bX{xwIdb8AFLiEXyqt>} z?``q+Vwp`2$}E)+OTC^?BCmb=y5ifc}J?e&#Amj3yS?dW!?)^-fyeCw5YB_Uhxi(G3$!| zOQxh#v=gyAot>h!gQcgQqP+}}O*uu|n~G?!)1BMCiM3YMl&)%8AzgR7+g;57vjb^a z%^SrWjbaGg{9@MXhvX$tT=Wvb%w94}a@Zch%|q(8)rh~5HBPG^wXxDFx>30rmg1;2 z!yq-wJf%A#7%~|*4mN_5uxG3kn%Ob&{9UD<`QcrVCH&5!NafLA z)P)<4`htDW1tLbfny_9IvdHcfe_`=&Kwe+TtG1<`@C0C69t&azY5X{cQ z6;%N_&muDUKG{hBW)H>6l2H1tt{z9wl>Cb9{7MxYKry}FTjF<@amteDciSW)OXbcr zl|J43;EY8YHnmj#);5TA4!@0jEJ59{i!Eha=H^R)xdU3W)|71_-j;t4Gb#Sv!LI!Y zT35N7aNO*aFdKHalpWyu1Lgyw#AH2}dEKn%x|R|xlugxrlttR2^fvTY<`RgEv4&Zb z%1zj*{*}91b`$Haa!=6T*zj8;c*R_g*{~^cgxe7$A?n|YQ@^zho`v=T!fe?i38l6ow~ zRD^u93%mFnzeez>(`6Z-b<=`7LmSORZsGPGm3O$xJ64U{lMc42$gSvV_$DK(`ItN~ zIO}6Qgz~hO=piA)IvFHlDw2?tec`#4g|i@o6A~^jNiBlonW5gC4;=lSije`D^e+EW&u#*L#Me?1V&=OP;z| z&x~|MK}O^dGR#bP(~c9D3&YTsqyhQS0s9z`_s$k7v_OT)CgJf4d5HLrSij}-WZC)r zLx?IOPEe`PG&6Lh`B+H$>Zl(_=)1Q26p~G=bG_CY8f4x-Nl}z-*{n*$HxJ}3zIg@z z2dud?4G_AzNFm*$HQ~349@sN2a01A%Jg8>EmT@QHQCi0ko7BiI(%-gS)6vk#+F2@X zcI6c5k*hD&It#~Vtb3SaYufR7U$mgiM@$U~h*i1TtjyuMoQQv;>F=vFHkYxzZ9OX2 zt*Pu|n+`%^v{Zi642Zk**XL|p?|~+;N&;%!N9V=q$w`w5l3{w(j5YTstx2PYD84$_ zr?`JGx45v?|DZ@!=)yI_JjIiOS;fnOEWz-V31TD0BK_LWv+R+) zqY-+KC{Anq zzo8Ndpy=NyRRJ%lw&hY=rC49;R2+QJQ~5|9@lX64opunn1f}$p$C>KenF)y~|G3;7 zrEq2uG+Oyog*8z+PJz_Nfwa!9v2~a-17HC?TXZSQL&Z9PsdZHbCGChmEm{TbkWfUUF6MVw9c;80VtsWy>RdrVsmE@M?Sbw-mWY&KvGAnXS?~oZOTWgjfr0dO) zk7zcmGxmwV6;sTj$g_u4g#p{RFqhe|0(c(VIq%r#T=JIy~SQJHu#!YEg6ra-fjco6(3~WNk^u6x}Y{ z%0i9cACPubSvM-q8+yRgCFee z7XN5H>eEN_#N~#Fk$;^lHbZHKAYZl`D**%kf`c;zY%z1u(D!XzU!qe0SL{a$x*QB# zZ}k*R%T^1y*?Haza_6U@DU)h+M@O#|Ea!0`=c`~TQ>*Q<+~8@4W#7|aIa{2R6fEy8 zNhYSovgrdkScBeKeueIDE|SiJy8&{M@QAu{2wyW2oewr^%KAi_C-Hzs-LheZJSdCM z60MeJeZKM7$X<=1YqOqK=~ZS%Mb>j0B$*MMx+X{8KEwu00TeICTJ>qO=p4*ysK1u3 zXYMn0*V9cjnyyD5zCPnju|?}-RQ-J(%?$yHV-g$n`86{wc%dA9*i^ylJ?GjoCAt$c zlIsH2H{&On{g%Ytl9-c{SWlw3B4f}zbEF)IYi*X6K@^rjS7w=&kIP|F0!yjS=16-6 zGdM=?UgY4Ew2t-&g>>Vh&5L-ncKij9>QOAW+7O$79Z~1?A{(R>bwsh>4I8r}(K~pL zY?#9TOU{t!Pin8CzWON|T5T#mU_l~fEzF>*+|sYeEc!BJAs&^IR2Ns}!V>r|ZiHSn zD_dGeYCq4Ol zvP=TAZr({(VBWul|37`g>~2;N4l*|q=wrto`la}ZS_$h^$-iA7N;m>|gprPhvOj%7 zBEj9CL;3i%_@j)*7>(Ei>!i5>t56mH5yhEO2&?>s><1!0ZkPlCv2XuWo*4TCGOd%$ zm^JMPQ9|yXL6g{ua3gE-8AZ#B7Zb#|_?SP}leJp5Xqn4>5`O(A=0X|{Wv%`bpTeJ~ zF~3sJB`d}KdwO;gh5B;>7VjX1Vv;n54)Rd{BF}Lm`zw6pBJHdeu7flrZ2$%HJ}%mw z^-Xba=+!*Cq+nz~aGE)$Z@9<^-a@TrJ^KR88zMz!#lXn5v5^YFg}UzLs_rc6K3}Gb z&H$>aE|YcUq$-!)B-K?EvvBrO(cV=9JkLj*OVO^$6lx}IAyTM66zd`L4&xEMwqg9| zU>|!Ce!Kiq@v$=Z&#);22jde zq=_<^Ax)$(c99}VE+BHuWejtQ&71PLt727G&uiR)bYoQ&=cO~O;bMwX+gg~$Zo)&_ zy4vHAhD;{ktizW`V{SdqV-&5-Y4N|cSWk%UHIz=NS+XJiYq) zl9ei^RSsJpV%gC`rrst{DoSkAak+WN!=H;cUFG$h;7LaDRWc)2g;L)M4P`Ym8m~cWUL(e2f3>sDBd_^lxe$ zv?^;gN4(esla=^pWPO9}7zTt~OwGGvn279{>WXM45*|*p-th212kl}G;TM?NGsoFMr!nDiu;jPXQ-8R-(t41>*1E_ zrsN`yJNPs=Kd+UbF43}`<<VNn`H1+7go0yiaJ*^Mp;|Mtn$Nh zQ!KXuM*R;5tV(EV`X7cwBiAs}t9&GmP;%6ua&3I8fTlASNra{1V&gnm@mHmU1j8h< zVyimNqS2Q^!Yr(SaO-YdLdET@)juRd-f`JXrKrZls<=QRk_0t&oOkKwtE?C37x90X zDO3D{Z=v-JQY<3d;1m$aah=kgM$w}*jxodovbxORj%9P1UK1>>DP-oW01-O7Kt^aF zg1UcQx}uCgQ%L3ELHJt)cM;X+v^|k6VLt+S2VEKwS|>Xn%Njdier5u5(O0+9m;aby&h>Ik#S!FI1UH^+Ry6(YsH9y8DaYLsID?~dRc4yuD z^cVD%Px7C&XJE2}}sdBZL#p zgXFu~se(K2*x8XeEz#j5G;dpVCJuadsLL~St6VmRm08*4xk9O^Iy>)(_QfN6FP9*b zUzZ4zSS~ARS|heG7g51GJKBpdgH~{H-Es>8!v`c zTKA@BCzAQTvkhZuuQ#^6@zTL}-a2&f&);AC>cQ7zX$N0__@O^5ozXZ-vtJ}amh!R$8< z#WDxHn82^%S7X6a7CEB>$?@j13@+o=l1)7RR30lT-Yo806_~q>DFx*@Gykhx+&-o% zfcxDnw2N<*IyqA(t&(xNI*A|ODg=*j72?OY3RA3)K2AuC;*#wJzjtjilkL@=rVku0 zKfy#`(~ds9PR-?mew)i`pq5~?=52!4UxmvXzZ{pdPR-*UZzyJdfAN8XZ*=7Ejj8;- z+~)5k!v9loci)%c?tpzRYY%=;vG$=K!={7H@?3tfPdnD`({|%4vNq>P=d8^fkiuHw z?F4H-%UYcO$daK+_8jz>zBOPq>F(Ou8ZHwFKT#PkRT(oIf4!m`ya-*5J&A6X=PK($ zJ&(?c#<|u|F)nyZk??BLtnL3)-MSgh6hFCA22U!%Swyt0)UD!LG1vYsc3qnndz0}s zs_q~5MCwX&%wP8f%Gcw#Ju7ced*|egCUJ!iTZ5^GeSsMM5(aa|D&pPl7Ci7j@Hox; zrJ#frH@ms(F5NV0WST9@Y1VyYj7Z4sZ1rG}ucytQw=QpZvHXlR*Qq>JbWe@+Qr21j z5Pq=2{05Dov~(eVP>;LiafdWf?;}(}4Ti;r&=4I9;YXxF9Vgz2)V#jkC(vu+lk_C# zA;{MH0$1)-v(;9wDNM;W?f7G+$ek}*naS~u!{+8GkQr}L=0g-8Gl!IVgV!*6;?hNC zy)sDqn@T%`k6T3A+2y}Q4h$IvRaqCPW~s3Qs}qSml1Fl+u34(CV9JsV?mblO4^=sj zt-OhBYXd%L#oR!&a(zX-(E5({NRgNBa-JrWys<7k`PWlqFcs=<7m_&Juo7_?@5aW8 zJf989);F$pso<;&Pq3;KX1_mEsF06hL>mrj!bdk>LQVFX$bfA>@Am2A;TPj1fAXY6 zgDKl@j>%yNdN=+mp(OMgM!nbb2c9CKy?k0SNUov34yS}IYF$~>#6J}M0#Oz_7!aHz z!8)SDWOz2ro3|@`G9Jo`^)HR3Q^}Cf-uf3}7r}HwRceWnz?49-uKbiH%Vrgy3V)_B zGKb}W6f0I``-4jq*f9cjj5iwe2+nXPfyAq#i2{I83Dt+ra)X9wB+iOm=YA>L6})0x zY+EuO)CC%OM@j<($Na7cszQb{F?veJ?#6uiF0~z1d!Gqx?!W3Ts>VewsG8ber~(1l z(*A3aKS$d(NQ3|asyxCU23CI&ywwY$H)N!jd5C4%ZLcDHf?lTejlZ9iU{d0xu!Q59<|VBJSfIYin|lrpN~yAbaQXky#0(I4rYh`-W<(vVnA6ka7m;DD)6 z3vcT~Iq^3G)?k3?uYgo@z2R+x(A!J-4i`b_VXB6?-;$0aDlcMJ#(RT#6&0lV6qLSg zG=C~5`l&stV$lHNx2S&G8k(x;q^rC2n9X!tY&EqQDxlABz#OE~sZg;Zxn;`$Gg+g1 zJ8}0F+c>C3G2)e;AZ;qkw&6L+MP7h<5JOb}Wd%phF9TdinoC2X8z%8hVv{zv&?4*T z2l7o&oYdA^x_9i@f@DhWAcIZGZYn*Ql0ij-BYzVSaJ~=1{?Wm_$w%lFRkO-yicQQB z;BBfGttp{PnfBJPL>*eZ@*Zu7hL?lIEp5l4BKxAFYP1t>Seq4TUJKr=07jbE^RT3= zsgs_SH%9Ug${+r5kD?S+fzxE%_-)>bRFSNEx6lw3X2IOBm+Y~Lf%sM_uGI$H@rS>v zMr+-{9$p%L_Au#L(Pqg{o$7Di_Q(dQZdhnm?1sqRVf~xe@%GtXk3u4{LEeBYS!7`~ zzEwV0pE#XHWP9j7$er5w{X$FRX}#is&A>YJxb0^&K#o~&Rw+W_eleFdkCBKG5Pl?R z{rd4#!40WiN|Yxy+^x7;`C}$~JP{GKHY?M1ncPc&dlKg`ot!7Nkz_wUrb{$1Md$)b zRdpU$2hOA+B6L3h31GB60*2gdA;ge9Tuk(&H?&k)Gmr<8=fYI2k=YS36lH?!#HI*uW z1x+SIBk^C9YP>;`Ch6@J)*fESp|i%W7e@SAF~Y8H58b&ao|qq(2Hg-Np~3&tEEn(_ zL?xXXmZ}=0h(v&xquwM4lf3;7=0-Q{vERx_vpX?`oLUXeT74n5t&LH&bThIu|A%1F z_6H~}?<&Sz4h7pDw7=MvCt#h#BG4MgQBxK%Cim0nLT{xeiyybA-6zEFm#Lq$99utV z_f?z8XuGf4N-u5qRoWh~UQrxVEr(+h$Rjk2i95AHw6r8|udR*|rD$3AUH=6{SK$gH zQPHusd--4$^-byKShc?G1J_M`adeE%ruw!+sg7w2KsP5362hCbDVAc!9>o?s)Jj zxyjhiy$MK(x-IutC>S!NZp-DHTq}4bZUUb=z30Fg6xp)|QVWMw>QyamhTzQ2fCT)J zn*rlT!8++?!11;&w_<3Vn*pI<%FTe{v2pskJGZV0YoK{L*UXxuyb)+xmSK+e4jC$! za6;amd>!Hmc_Y2Jgp<2&)7ZwR&P)jmc#y#%$uV5RbvhVX0%K@~0L*}ny|`Y|fnu+; z(Yo~+Lc=rd)?LJjeQDjJBFSQHWmI|;gX%O1aXR3Ti6L&g79o@W>lU33#%WsQYDKUM zS`oX#JWC1VISI`;XGr%*He-apqZmRun(_}vGhBMmAghVV)21EAx!bg8WX@t0KuO53 zK&-nOoSW4|49d>iUi9jcw8*QRkj`VLP0`1^e5|&CSIg+3+FR|}%gBM<)|dT7$sC<@ zPsZ~@Lb>%_vo^@mNh&2dkIn6{OT96cK(jenXiYsL2b9nT#QG#U)|JrCyBb#_R)3+n zkwIF`Txs<&Q;CR1*#s_=(M>z9rwI%*qMt+LGOsi&Emnqb~`!5`yP{t=u zV&JMidxg7wtbb{T=G1%PGvCrZ!eDm0v+8!Wb}j6U?w2Recc_i-0qZB|x(d`(@vbVF zy2o86g&tter)ftIkohuq3ezh4rp8z3vhXp8nAI8$+jk28RCTY!z?y+`*zQi@0q+O` z?d}v_dw`F!Gm_ctMPx|aDNIF)JB6=idia!g3M>8pU)?E8U8lQKSaI^ycM7Zezw({J z`D@1Iw~WefsbXJYeuq1S^VOZg`P?a-k5|du&u^@V_!#z`!a^4{txK1d@7yVz@7yWO z7w#0Ma7n&%r|>4RW2*3)>im{KK5+G&!uigf!dC%a?i8kG?i5a`xlRhpyjtTj+N|#s zrVe$dFn_yBJu!8sFmK!`oKo{X(LO1hR55o7yY-$0a8gfor!WvZy;C^fBjO`>3crGC zhzBxSD*6g{3V+L1Exp~O+7kH|c;|sw(w)L`pP!&fMG;Y;5(EL#2) zGhmIJFg`y)l6(@!ctL@SgNH=JvS~p2aR07lblKDaQnIH*Z)_Rin>l`sZ@V{YD=Z+ z|H_ssXU({rmQgt^RXL3-b2?b69A&9;uv9sYrK)2v?pP|Ji({#B97~nsSSr3?sVH2M z<5;SCh8K>d%4rGY09RY89LG{+170i@HDjq#YQA0yYfD9&wWXpCWvTd!rOL4_6>nIo zl$xIr?rKZrR*a>}@z@6VbqvF4EENztwNyD`sj93W3-qsGo<8}ruGKM5*V=>Dli$h4I0v?s*5Y#SlD*tu-G zCtPz4qkY--`!cO3VO1Z+3bwn0cH!%a%kj<0chJ7Lk9=I{$qYJsv$+47pff_kvS;Af zMRF7&L$2872-dkA6cx?eRdS9I31mh_k!hRU$vw^+xWb|-^w#Wdw7hsQe0ioJycz%oMQxUlnc7E?F+hh zT5sC?lj(X43i2UWbLYs^^GJO)_fG3GR4Z1g3=8*iE8CEiQ_65J_aN@&PJrF19e2`B z4fYPZYPpL$hl$T}CX_fQXO{g&&Z*ICPh>a4f3Ze(Z>YM$lnc2((8RT8gsQE4q(q#Q zAhyu@=qy*#w!6A-JlkHbTXkq>K<+BK*cr& zVk6{FMQl{Nd$c(|z0LagO@Nfi862P#Wdysc;?%fUU!4tZw%Cs{YPyKxjVW+ z7xe0cr}pJN2bix!|39KpvRx-rops>|P&Vj5u@?WYQ~bN8Rigae9OduD(5t=j{~bmt z<$qi(c1ta$3P zq)?^eTA`Ls+cEj?fDu`_ZlX^8T>Y|DL1P`fij zK8(uXe#SjC1Iy7G(v~A%EXPu1IZn!MyPcNMOPW@SiZf`!PZ!IPFP5X!u^eS!C6

|2>1|w_pD2<;;OK?fCcu*LJXRyo`WwzDWZ$oZfH1UA~v zHM^W(kaM1R00@`JIRPW7fclufd6B z1#XD~w`VnK`#T0(9xmFVYvWKhZjFDB0{_RxhTj>HvO~dsnyQM><(QVao>-B>{7^t} zzE4?7+Y&`i@JYyUj*D-ftfwn~r`jxLiTxP8rGS4wCX!nHhqP_FkZM(7>&*i$&u$b$ zg(2u@sOmG51xRoGu?DjuM*Qpdg_Qwip%{2Rm132m{w>wz0c$!yO_D;KDa;&lr#IMB zMxe*7snpHrvyhOx(T1JXR{xijD#+mRDT>;DUcd@tAF3&By@W*&T~WFb6{8~KNqa*F zYcD@0T@1-E3Rusc=_2i%nU~=)Cw`fwYhY(W(~hHU%z>`VsXtR}EK{6ga_sH)HAse3 zMCd;}uD$H(e;(c}Nypuk(;7qh+^4@kSH2#WuS`51?q7L`2o`(ot@$_EYE2x%z5V@% zBG0G$59fUzDSN$Wd&IwgaSydm-x@6gPl^A|ltON>R*tjU8}f-X==t39O464Ab;Luj zdybdO7X4Mf7n*WRi5@d2{Cr|dQ+io$%2c7Jm3{l=)z(T7YI{a>r0h^p+2N(PB!Q;w zsa1JSNTCYrJgKEh4m@!-nT_qt`(o!5YR}6)cRQX3TYp|pZ#Z1;Io=kahN6btrIjh* zPv4f!EHrUCL25xu?Gp;=mAO1RH82@*xFR-N)=|LqL=k}*50H83?NkF&IEKV)?37xb z?X;s@YUtRG-2P>U(mDRpt}QgAwYu#-F;Xt{P6$LiPV4yZIt6^7JxEQS)@rL&3apg2 zGKQdaNKH8I(Dg9Pqa=&mHeu8K2dXR3pl?xXDgk=;S6MS*3A5KJr!TB0KN4}i{5{b{ z9e;(*W72<84;q%AA`ulx4A+B502aLhS7nteY4x>nC>(zyv#82Zgh_Pgf@^6`q_uxT z=8%SLs4dG~oF(~eU(t43+RN48A=@06lSiP;Oax%@2qc>1%=Db#%!X&X z+P!SIG5i5{NCGgOW3our-hlN3>;OWhXp|c{a>j|Q)uvci0$hMc*`d4>p6$$$>v%9- zmFvQ2L8(*1Zee%dCq zCzj0numP;v&$Fwz$C*~%hr)zM{;EQw>buz|zn}`ZceDQ&%oC62QD8cYBWfI_g?UcBn|@~Bl%pX=;%@ebbi?%B>>uK6%{$%Q z>~mGcZy%P5zs%k2f0wpN?fdoY8SxvGD~=11bT|9C8V7YZ`#ez4ok!CLEy7TLw%YvC zv|}E%+J3Htlv`)|8R4!qInvFc2IYisoY5ZVR$JF;m<&P3;vMm)(5%jgR6ed|Bm;8t z=g}9DAb%sgV!ILN_CtRIQ)X$c4DBn~ffDVlTdf2|5M|?Ps^Ud_LMy}U>iX^y>#Wf%i*&ET)e{u{D`h~kQRW--SiiTG}j&aAHM}0aIxQp zTf|K#soJWfGCs;ymcgwGg5u!AMV0Hb?t70>n1frU!tDxMGQ|0$HQgv;YPVX=A$>h| z1EOhr^6!g6C-#I${@3^Dy*M5gTX^A`|hN62Nfy5^pV&Pk~fI2;mGTm3YU8h z2`;(Oao(27w{*uhj+GKQpQt)M)t3*DfZaJnjef1@xb2Yb)szme%=y<6HAuJqV!LSS z$YY5<^LPUD3jOHuDmBc1bLNo)kI@l>JppTg7KLQ>T~qm1OU@t}*kbrU)^^-!qwN6? zVtTe|$Isr9UU!tuRL19QTAu5(zJbeuyDK(@W5h~|{s|9p!9`5V?6@Xnd!qNhe|bD! z^h)HFrM*R7?eHe)l?RGm%DV3$c1Z$mouvSr@3wDb?0iNS(Xf=Adsg0FC8h!E#ckOC zeqjy@NBt5O1uwt#m&_a)(anqiL$&D?sb*q9F^VK=p=~~a4JNm9}*U-CTHC{ zKn5RdpO3F||4p!7V@pEQj&Xkx0%urLl+DPvb%&h;F0lATPLKP zUv#rPMz>rc$wfeYv#|N zRx^E`QCnYMSMOU?Q@?o5!dcyo;WY~v)&*j|REacIcQF~{ows_)=0Il=QuUk0F7)Jik!a39HX4Lv> z7f-KQRO?$TnHEm3_03u6TO6zhhrzy?b)kCSj5)LB1Q+{imn{O_+8G63w(#uQWi>Nu zr_WhXGhf3<0#P$##+=}sx`iYyp0mt1eRfTK4Z!OY)d&HEc(pE`i$hR!R!y*$?{n%4 z42_V`ss_r=uC4b?2~lcZ?LsL#t#%d-;WG`JUbk?DZ+6Z6nZCN2zM4}2G_LX)KA$n6 zwwAv$Vcm?{V9lKQ1>KFy=g%~*G_Lf`S?m)Q*7z2N7EG%J1OI|W!MjdPKSiihQr9S( zvsgsKcV+&SKB~L&HfmVttEsQAxr@4|&xa&JB4ff`3xhSwd`g}M`=?m{C6mDxFxK@Am@=FHGCJ)>@V zXhH45pl?BFaS$H(YUe1<)Hn?jgcmwsR9gy+^?gsqhhBa%{+RuD7k{7Ox1ZlpemSH~ z2o6HVrz#nr5WIeR@UBI*qo@0g3Bdt{>SgM*n#Hw-F>XTehWT|UVeR!ZYo^x*{pbpL zuAN`Ia8_{kR7FJ5AHEHkUpH&cbo&$U*VTs>2InlOwZAMu+Ux35v}Vpi-P8p&i>_H* z8c>V?JPJk9ZHBmK_a?MxR$#+OuBOurr>R8h z2-b&cjhQv`;lpWiYTIHAuUjC3vRF&X;$TgE(6tuW!Klv-a{)4oqIPCYXnwGLveF4;VQSsXsak+UDGWpQ+w*T5;NKc*7>D@# z(a_5;D;RLYEaTEC8JXRCoMBA4)R;2Gm@>_nGSir{(3nzhObHrOLdIZYVQBt*<5nZz zxZAk9!SD_C8MoeM-0Cy(v8cBhV?)N+8OHpOF@J_3YH1vK@?`v9{PKTxGJY$+HT*X7 zd!OIRr%uMV{o-W&U4A_`pN!wYuZCZQ-*5Ttb<9|wZ3N9btAKuAOD{xHvD){ z<-&Oj>y|Dw7Gm1y-sJQLx$X4$29K+AvZ$(5Cp`y$#5Z^}7PVfS ziR2Qx$1E^L%vrps4x5yyXgap12A6=gspypa^(?P2JS#Fh7i4<9Ees&&2cnQ_zkL$12E@1>Gn!tc`k*dqQKV|!*arw!}TWjsJ$(B<#ovyb#H zl0MWi$blP!?ZifiTDAJFUKG%f}9Y$-|(-rKY1(_oXvd0w|ZY86f@4C(r$#v!f z=V4&>gm%gYcj_Eb;0>pj6=V!6$Q+(T06CVohx}EHaBfP*VZ^=ZL&IK8E-D`_m1wjL zDI;fsr%@(_zHS*13qazeGIvm9AY~q=t(Q@s%hS?=Ox@awg6s(eMrA?f$b#&f3yejI zq|`jdK{&0X!>5YmrW<1cD*-I0(Dui8cI&X|S>=>Z8&lvN?r;qRMmW#NMQH+LUqD#E zdlGmzB*VK|IA7~BTI5;&d6oypDsAZY&>627#s!W}tRPKbJq(<4X}kBeM>^n^R$h=f zO!4K80`D+~O_Ky;Te?PfPhd9m?DPWT%<-x{{)A*C3eu2KDix9%cTo3J9QzvhC;DTa z+tX#TLzhxT76cCdjTFjz$0|(pt6zy7@}tF0NrWTn#(co$cnxDBbv)fk9nfBj-NXVf z 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 KM{=zB2>c(tnf}B8 literal 0 HcmV?d00001 diff --git a/cordova-lib/spec-plugman-create/plugins/cordova.echo/src/blackberry10/native/src/echo.cpp b/cordova-lib/spec-plugman-create/plugins/cordova.echo/src/blackberry10/native/src/echo.cpp new file mode 100644 index 000000000..0d5cc2f85 --- /dev/null +++ b/cordova-lib/spec-plugman-create/plugins/cordova.echo/src/blackberry10/native/src/echo.cpp @@ -0,0 +1,121 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + + +#include <../public/json/reader.h> +#include +#include +#include +#include +#include +#include +#include "echo.hpp" + +using namespace std; + +/** + * Default constructor. + */ +Echo::Echo(const std::string& id) : m_id(id) { +} + +/** + * Memory destructor. + */ +Echo::~Echo() { +} + +/** + * This method returns the list of objects implemented by this native + * extension. + */ +char* onGetObjList() { + static char name[] = "Echo"; + return name; +} + +/** + * This method is used by JNext to instantiate the Memory object when + * an object is created on the JavaScript server side. + */ +JSExt* onCreateObject(const string& className, const string& id) { + if (className == "Echo") { + return new Echo(id); + } + + return NULL; +} + +/** + * Method used by JNext to determine if the object can be deleted. + */ +bool Echo::CanDelete() { + return true; +} + +/** + * It will be called from JNext JavaScript side with passed string. + * This method implements the interface for the JavaScript to native binding + * for invoking native code. This method is triggered when JNext.invoke is + * called on the JavaScript side with this native objects id. + */ +string Echo::InvokeMethod(const string& command) { + int index = command.find_first_of(" "); + std::string method = command.substr(0, index); + + // read in arguments + Json::Value obj; + if (static_cast(command.length()) > index && index != -1) { + std::string jsonObject = command.substr(index + 1, command.length()); + Json::Reader reader; + + bool parse = reader.parse(jsonObject, obj); + if (!parse) { + fprintf(stderr, "%s", "error parsing\n"); + return "Cannot parse JSON object"; + } + } + + // Determine which function should be executed + if (method == "doEcho") { + std::string message = obj["message"].asString(); + if(message.length() > 0) { + return doEcho(message); + }else{ + return doEcho("Nothing to echo."); + } + }else{ + return doEcho("Unsupported Method"); + } +} + +/** + * Method that sends off Event message + */ +string Echo::doEcho(const std::string& message) { + std::string eventString = m_id; + eventString.append(" "); + eventString.append("cordova.echo.callback"); + eventString.append(" "); + eventString.append(message); + SendPluginEvent(eventString.c_str(), m_pContext); + return eventString; +} diff --git a/cordova-lib/spec-plugman-create/plugins/cordova.echo/src/blackberry10/native/src/echo.hpp b/cordova-lib/spec-plugman-create/plugins/cordova.echo/src/blackberry10/native/src/echo.hpp new file mode 100644 index 000000000..408be6964 --- /dev/null +++ b/cordova-lib/spec-plugman-create/plugins/cordova.echo/src/blackberry10/native/src/echo.hpp @@ -0,0 +1,45 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +#ifndef ECHO_HPP_ +#define ECHO_HPP_ + +#include +#include +#include "../public/plugin.h" + +class Echo: public JSExt { + +public: + explicit Echo(const std::string& id); + virtual ~Echo(); + +// Interfaces of JSExt + virtual bool CanDelete(); + virtual std::string InvokeMethod(const std::string& command); + +private: + std::string doEcho(const std::string& message); + + std::string m_id; +}; + +#endif /* ECHO_HPP_ */ diff --git a/cordova-lib/spec-plugman-create/plugins/cordova.echo/www/client.js b/cordova-lib/spec-plugman-create/plugins/cordova.echo/www/client.js new file mode 100644 index 000000000..4e7a1b3ce --- /dev/null +++ b/cordova-lib/spec-plugman-create/plugins/cordova.echo/www/client.js @@ -0,0 +1,53 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +var _self = {}, + _ID = require("./manifest.json").namespace, + win = null, + fail = null; + +function handleCallback(result) { + if (result) { + if(win){ + win(result); + } + } else { + if(fail){ + fail(result); + } + } + win = null; + fail = null; +} + +_self.doEcho = function (args, theWin, theFail) { + var data = { "message" : args.message || "" }; + + win = theWin; + fail = theFail; + + window.webworks.event.add(_ID, "echoCallback", handleCallback); + + return window.webworks.execSync(_ID, "doEcho", data); +}; + + +module.exports = _self; diff --git a/cordova-lib/spec-plugman-create/plugins/dependencies/A/plugin.xml b/cordova-lib/spec-plugman-create/plugins/dependencies/A/plugin.xml new file mode 100644 index 000000000..ec83e8c2f --- /dev/null +++ b/cordova-lib/spec-plugman-create/plugins/dependencies/A/plugin.xml @@ -0,0 +1,60 @@ + + + + + + Plugin A + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cordova-lib/spec-plugman-create/plugins/dependencies/A/src/android/A.java b/cordova-lib/spec-plugman-create/plugins/dependencies/A/src/android/A.java new file mode 100644 index 000000000..e69de29bb diff --git a/cordova-lib/spec-plugman-create/plugins/dependencies/A/src/ios/APluginCommand.h b/cordova-lib/spec-plugman-create/plugins/dependencies/A/src/ios/APluginCommand.h new file mode 100644 index 000000000..e69de29bb diff --git a/cordova-lib/spec-plugman-create/plugins/dependencies/A/src/ios/APluginCommand.m b/cordova-lib/spec-plugman-create/plugins/dependencies/A/src/ios/APluginCommand.m new file mode 100644 index 000000000..e69de29bb diff --git a/cordova-lib/spec-plugman-create/plugins/dependencies/A/www/plugin-a.js b/cordova-lib/spec-plugman-create/plugins/dependencies/A/www/plugin-a.js new file mode 100644 index 000000000..e69de29bb diff --git a/cordova-lib/spec-plugman-create/plugins/dependencies/B/plugin.xml b/cordova-lib/spec-plugman-create/plugins/dependencies/B/plugin.xml new file mode 100644 index 000000000..ee32e2d46 --- /dev/null +++ b/cordova-lib/spec-plugman-create/plugins/dependencies/B/plugin.xml @@ -0,0 +1,60 @@ + + + + + + Plugin B + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cordova-lib/spec-plugman-create/plugins/dependencies/B/src/android/B.java b/cordova-lib/spec-plugman-create/plugins/dependencies/B/src/android/B.java new file mode 100644 index 000000000..e69de29bb diff --git a/cordova-lib/spec-plugman-create/plugins/dependencies/B/src/ios/BPluginCommand.h b/cordova-lib/spec-plugman-create/plugins/dependencies/B/src/ios/BPluginCommand.h new file mode 100644 index 000000000..e69de29bb diff --git a/cordova-lib/spec-plugman-create/plugins/dependencies/B/src/ios/BPluginCommand.m b/cordova-lib/spec-plugman-create/plugins/dependencies/B/src/ios/BPluginCommand.m new file mode 100644 index 000000000..e69de29bb diff --git a/cordova-lib/spec-plugman-create/plugins/dependencies/B/www/plugin-b.js b/cordova-lib/spec-plugman-create/plugins/dependencies/B/www/plugin-b.js new file mode 100644 index 000000000..e69de29bb diff --git a/cordova-lib/spec-plugman-create/plugins/dependencies/C/plugin.xml b/cordova-lib/spec-plugman-create/plugins/dependencies/C/plugin.xml new file mode 100644 index 000000000..88c2d2cdb --- /dev/null +++ b/cordova-lib/spec-plugman-create/plugins/dependencies/C/plugin.xml @@ -0,0 +1,57 @@ + + + + + + Plugin C + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cordova-lib/spec-plugman-create/plugins/dependencies/C/src/android/C.java b/cordova-lib/spec-plugman-create/plugins/dependencies/C/src/android/C.java new file mode 100644 index 000000000..e69de29bb diff --git a/cordova-lib/spec-plugman-create/plugins/dependencies/C/src/ios/CPluginCommand.h b/cordova-lib/spec-plugman-create/plugins/dependencies/C/src/ios/CPluginCommand.h new file mode 100644 index 000000000..e69de29bb diff --git a/cordova-lib/spec-plugman-create/plugins/dependencies/C/src/ios/CPluginCommand.m b/cordova-lib/spec-plugman-create/plugins/dependencies/C/src/ios/CPluginCommand.m new file mode 100644 index 000000000..e69de29bb diff --git a/cordova-lib/spec-plugman-create/plugins/dependencies/C/www/plugin-c.js b/cordova-lib/spec-plugman-create/plugins/dependencies/C/www/plugin-c.js new file mode 100644 index 000000000..e69de29bb diff --git a/cordova-lib/spec-plugman-create/plugins/dependencies/D/plugin.xml b/cordova-lib/spec-plugman-create/plugins/dependencies/D/plugin.xml new file mode 100644 index 000000000..f07b06377 --- /dev/null +++ b/cordova-lib/spec-plugman-create/plugins/dependencies/D/plugin.xml @@ -0,0 +1,57 @@ + + + + + + Plugin D + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cordova-lib/spec-plugman-create/plugins/dependencies/D/src/android/D.java b/cordova-lib/spec-plugman-create/plugins/dependencies/D/src/android/D.java new file mode 100644 index 000000000..e69de29bb diff --git a/cordova-lib/spec-plugman-create/plugins/dependencies/D/src/ios/DPluginCommand.h b/cordova-lib/spec-plugman-create/plugins/dependencies/D/src/ios/DPluginCommand.h new file mode 100644 index 000000000..e69de29bb diff --git a/cordova-lib/spec-plugman-create/plugins/dependencies/D/src/ios/DPluginCommand.m b/cordova-lib/spec-plugman-create/plugins/dependencies/D/src/ios/DPluginCommand.m new file mode 100644 index 000000000..e69de29bb diff --git a/cordova-lib/spec-plugman-create/plugins/dependencies/D/www/plugin-d.js b/cordova-lib/spec-plugman-create/plugins/dependencies/D/www/plugin-d.js new file mode 100644 index 000000000..e69de29bb diff --git a/cordova-lib/spec-plugman-create/plugins/dependencies/E/plugin.xml b/cordova-lib/spec-plugman-create/plugins/dependencies/E/plugin.xml new file mode 100644 index 000000000..bb28fa12d --- /dev/null +++ b/cordova-lib/spec-plugman-create/plugins/dependencies/E/plugin.xml @@ -0,0 +1,59 @@ + + + + + + Plugin E + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cordova-lib/spec-plugman-create/plugins/dependencies/E/src/android/E.java b/cordova-lib/spec-plugman-create/plugins/dependencies/E/src/android/E.java new file mode 100644 index 000000000..e69de29bb diff --git a/cordova-lib/spec-plugman-create/plugins/dependencies/E/src/ios/EPluginCommand.h b/cordova-lib/spec-plugman-create/plugins/dependencies/E/src/ios/EPluginCommand.h new file mode 100644 index 000000000..e69de29bb diff --git a/cordova-lib/spec-plugman-create/plugins/dependencies/E/src/ios/EPluginCommand.m b/cordova-lib/spec-plugman-create/plugins/dependencies/E/src/ios/EPluginCommand.m new file mode 100644 index 000000000..e69de29bb diff --git a/cordova-lib/spec-plugman-create/plugins/dependencies/E/www/plugin-d.js b/cordova-lib/spec-plugman-create/plugins/dependencies/E/www/plugin-d.js new file mode 100644 index 000000000..e69de29bb diff --git a/cordova-lib/spec-plugman-create/plugins/dependencies/F/plugin.xml b/cordova-lib/spec-plugman-create/plugins/dependencies/F/plugin.xml new file mode 100644 index 000000000..86869bab4 --- /dev/null +++ b/cordova-lib/spec-plugman-create/plugins/dependencies/F/plugin.xml @@ -0,0 +1,60 @@ + + + + + + Plugin F + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cordova-lib/spec-plugman-create/plugins/dependencies/F/src/android/F.java b/cordova-lib/spec-plugman-create/plugins/dependencies/F/src/android/F.java new file mode 100644 index 000000000..e69de29bb diff --git a/cordova-lib/spec-plugman-create/plugins/dependencies/F/src/ios/FPluginCommand.h b/cordova-lib/spec-plugman-create/plugins/dependencies/F/src/ios/FPluginCommand.h new file mode 100644 index 000000000..e69de29bb diff --git a/cordova-lib/spec-plugman-create/plugins/dependencies/F/src/ios/FPluginCommand.m b/cordova-lib/spec-plugman-create/plugins/dependencies/F/src/ios/FPluginCommand.m new file mode 100644 index 000000000..e69de29bb diff --git a/cordova-lib/spec-plugman-create/plugins/dependencies/F/www/plugin-f.js b/cordova-lib/spec-plugman-create/plugins/dependencies/F/www/plugin-f.js new file mode 100644 index 000000000..e69de29bb diff --git a/cordova-lib/spec-plugman-create/plugins/dependencies/G/plugin.xml b/cordova-lib/spec-plugman-create/plugins/dependencies/G/plugin.xml new file mode 100644 index 000000000..0e365daf6 --- /dev/null +++ b/cordova-lib/spec-plugman-create/plugins/dependencies/G/plugin.xml @@ -0,0 +1,59 @@ + + + + + + Plugin G + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cordova-lib/spec-plugman-create/plugins/dependencies/G/src/android/G.java b/cordova-lib/spec-plugman-create/plugins/dependencies/G/src/android/G.java new file mode 100644 index 000000000..e69de29bb diff --git a/cordova-lib/spec-plugman-create/plugins/dependencies/G/src/ios/EPluginCommand.m b/cordova-lib/spec-plugman-create/plugins/dependencies/G/src/ios/EPluginCommand.m new file mode 100644 index 000000000..e69de29bb diff --git a/cordova-lib/spec-plugman-create/plugins/dependencies/G/src/ios/GPluginCommand.h b/cordova-lib/spec-plugman-create/plugins/dependencies/G/src/ios/GPluginCommand.h new file mode 100644 index 000000000..e69de29bb diff --git a/cordova-lib/spec-plugman-create/plugins/dependencies/G/www/plugin-g.js b/cordova-lib/spec-plugman-create/plugins/dependencies/G/www/plugin-g.js new file mode 100644 index 000000000..e69de29bb diff --git a/cordova-lib/spec-plugman-create/plugins/dependencies/H/plugin.xml b/cordova-lib/spec-plugman-create/plugins/dependencies/H/plugin.xml new file mode 100644 index 000000000..e72a19a06 --- /dev/null +++ b/cordova-lib/spec-plugman-create/plugins/dependencies/H/plugin.xml @@ -0,0 +1,59 @@ + + + + + + Plugin H + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cordova-lib/spec-plugman-create/plugins/dependencies/H/src/android/H.java b/cordova-lib/spec-plugman-create/plugins/dependencies/H/src/android/H.java new file mode 100644 index 000000000..e69de29bb diff --git a/cordova-lib/spec-plugman-create/plugins/dependencies/H/src/ios/HPluginCommand.h b/cordova-lib/spec-plugman-create/plugins/dependencies/H/src/ios/HPluginCommand.h new file mode 100644 index 000000000..e69de29bb diff --git a/cordova-lib/spec-plugman-create/plugins/dependencies/H/src/ios/HPluginCommand.m b/cordova-lib/spec-plugman-create/plugins/dependencies/H/src/ios/HPluginCommand.m new file mode 100644 index 000000000..e69de29bb diff --git a/cordova-lib/spec-plugman-create/plugins/dependencies/H/www/plugin-h.js b/cordova-lib/spec-plugman-create/plugins/dependencies/H/www/plugin-h.js new file mode 100644 index 000000000..e69de29bb diff --git a/cordova-lib/spec-plugman-create/plugins/dependencies/README.md b/cordova-lib/spec-plugman-create/plugins/dependencies/README.md new file mode 100644 index 000000000..0955be526 --- /dev/null +++ b/cordova-lib/spec-plugman-create/plugins/dependencies/README.md @@ -0,0 +1,10 @@ +Here's a general overview of how the plugins in this directory are dependent on each other: + + F + / \ + A \ B + / \ \ / \ + C '---D--' E + + + G <-> H diff --git a/cordova-lib/spec-plugman-create/plugins/dependencies/meta/D/plugin.xml b/cordova-lib/spec-plugman-create/plugins/dependencies/meta/D/plugin.xml new file mode 100644 index 000000000..941bd5755 --- /dev/null +++ b/cordova-lib/spec-plugman-create/plugins/dependencies/meta/D/plugin.xml @@ -0,0 +1,61 @@ + + + + + + Plugin D + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cordova-lib/spec-plugman-create/plugins/dependencies/meta/D/src/android/D.java b/cordova-lib/spec-plugman-create/plugins/dependencies/meta/D/src/android/D.java new file mode 100644 index 000000000..e69de29bb diff --git a/cordova-lib/spec-plugman-create/plugins/dependencies/meta/D/src/ios/DPluginCommand.h b/cordova-lib/spec-plugman-create/plugins/dependencies/meta/D/src/ios/DPluginCommand.h new file mode 100644 index 000000000..e69de29bb diff --git a/cordova-lib/spec-plugman-create/plugins/dependencies/meta/D/src/ios/DPluginCommand.m b/cordova-lib/spec-plugman-create/plugins/dependencies/meta/D/src/ios/DPluginCommand.m new file mode 100644 index 000000000..e69de29bb diff --git a/cordova-lib/spec-plugman-create/plugins/dependencies/meta/D/www/plugin-d.js b/cordova-lib/spec-plugman-create/plugins/dependencies/meta/D/www/plugin-d.js new file mode 100644 index 000000000..e69de29bb diff --git a/cordova-lib/spec-plugman-create/plugins/dependencies/meta/subdir/E/plugin.xml b/cordova-lib/spec-plugman-create/plugins/dependencies/meta/subdir/E/plugin.xml new file mode 100644 index 000000000..57d96d9ed --- /dev/null +++ b/cordova-lib/spec-plugman-create/plugins/dependencies/meta/subdir/E/plugin.xml @@ -0,0 +1,57 @@ + + + + + + Plugin E + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cordova-lib/spec-plugman-create/plugins/dependencies/meta/subdir/E/src/android/E.java b/cordova-lib/spec-plugman-create/plugins/dependencies/meta/subdir/E/src/android/E.java new file mode 100644 index 000000000..e69de29bb diff --git a/cordova-lib/spec-plugman-create/plugins/dependencies/meta/subdir/E/src/ios/EPluginCommand.h b/cordova-lib/spec-plugman-create/plugins/dependencies/meta/subdir/E/src/ios/EPluginCommand.h new file mode 100644 index 000000000..e69de29bb diff --git a/cordova-lib/spec-plugman-create/plugins/dependencies/meta/subdir/E/src/ios/EPluginCommand.m b/cordova-lib/spec-plugman-create/plugins/dependencies/meta/subdir/E/src/ios/EPluginCommand.m new file mode 100644 index 000000000..e69de29bb diff --git a/cordova-lib/spec-plugman-create/plugins/dependencies/meta/subdir/E/www/plugin-e.js b/cordova-lib/spec-plugman-create/plugins/dependencies/meta/subdir/E/www/plugin-e.js new file mode 100644 index 000000000..e69de29bb diff --git a/cordova-lib/spec-plugman-create/plugins/dependencies/subdir/E/plugin.xml b/cordova-lib/spec-plugman-create/plugins/dependencies/subdir/E/plugin.xml new file mode 100644 index 000000000..57d96d9ed --- /dev/null +++ b/cordova-lib/spec-plugman-create/plugins/dependencies/subdir/E/plugin.xml @@ -0,0 +1,57 @@ + + + + + + Plugin E + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cordova-lib/spec-plugman-create/plugins/dependencies/subdir/E/src/android/E.java b/cordova-lib/spec-plugman-create/plugins/dependencies/subdir/E/src/android/E.java new file mode 100644 index 000000000..e69de29bb diff --git a/cordova-lib/spec-plugman-create/plugins/dependencies/subdir/E/src/ios/EPluginCommand.h b/cordova-lib/spec-plugman-create/plugins/dependencies/subdir/E/src/ios/EPluginCommand.h new file mode 100644 index 000000000..e69de29bb diff --git a/cordova-lib/spec-plugman-create/plugins/dependencies/subdir/E/src/ios/EPluginCommand.m b/cordova-lib/spec-plugman-create/plugins/dependencies/subdir/E/src/ios/EPluginCommand.m new file mode 100644 index 000000000..e69de29bb diff --git a/cordova-lib/spec-plugman-create/plugins/dependencies/subdir/E/www/plugin-e.js b/cordova-lib/spec-plugman-create/plugins/dependencies/subdir/E/www/plugin-e.js new file mode 100644 index 000000000..e69de29bb diff --git a/cordova-lib/spec-plugman-create/plugins/multiple-children/plugin.xml b/cordova-lib/spec-plugman-create/plugins/multiple-children/plugin.xml new file mode 100644 index 000000000..fd10a04d5 --- /dev/null +++ b/cordova-lib/spec-plugman-create/plugins/multiple-children/plugin.xml @@ -0,0 +1,108 @@ + + + + + + Pushwoosh + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cordova-lib/spec-plugman-create/plugins/shared-deps-multi-child/plugin.xml b/cordova-lib/spec-plugman-create/plugins/shared-deps-multi-child/plugin.xml new file mode 100644 index 000000000..6c1747693 --- /dev/null +++ b/cordova-lib/spec-plugman-create/plugins/shared-deps-multi-child/plugin.xml @@ -0,0 +1,34 @@ + + + + + + Sharing Dependencies with the Multi-Child Plugin, woo + + + + + + + + diff --git a/cordova-lib/spec-plugman-install/common.js b/cordova-lib/spec-plugman-install/common.js new file mode 100644 index 000000000..731e6fb11 --- /dev/null +++ b/cordova-lib/spec-plugman-install/common.js @@ -0,0 +1,80 @@ +/** + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ + +var plugman = require('../src/plugman/plugman') +// nopt = require('nopt'); + +// var known_opts = { +// 'verbose' : Boolean, +// 'debug' : Number +// }, shortHands = { 'd' : ['--debug'] }; + +// var opt = nopt(known_opts, shortHands); +// var mapNames = { +// 'verbose' : 7, +// 'info' : 6, +// 'notice' : 5, +// 'warn' : 4, +// 'error' : 3 +// } + +// if(opt.verbose) +// opt.debug = 7; + +// if(opt.debug) { +// for(var i in mapNames) { +// if(mapNames[i] <= opt.debug) +// plugman.on(i, console.log); +// } + +// if(opt.debug >= 6) +// plugman.on('log', console.log); +// } + +module.exports = common = { + spy: { + getInstall: function(emitSpy){ + return common.spy.startsWith(emitSpy, 'Install start'); + }, + + getDeleted: function(emitSpy){ + return common.spy.startsWith(emitSpy, 'Deleted'); + }, + + startsWith: function(emitSpy, string) + { + var match = [], i; + for(i in emitSpy.argsForCall) { + if(emitSpy.argsForCall[i][1].substr(0, string.length) === string) + match.push(emitSpy.argsForCall[i][1]); + } + return match; + }, + + contains: function(emitSpy, string) + { + var match = [], i; + for(i in emitSpy.argsForCall) { + if(emitSpy.argsForCall[i][1].indexOf(string) >= 0) + match.push(emitSpy.argsForCall[i][1]); + } + return match; + } + } +}; diff --git a/cordova-lib/spec-plugman-install/plugins/.gitkeep b/cordova-lib/spec-plugman-install/plugins/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/cordova-lib/spec-plugman-install/plugins/AndroidJS/plugin.xml b/cordova-lib/spec-plugman-install/plugins/AndroidJS/plugin.xml new file mode 100644 index 000000000..1a687494f --- /dev/null +++ b/cordova-lib/spec-plugman-install/plugins/AndroidJS/plugin.xml @@ -0,0 +1,34 @@ + + + + + + JavaScript in yo droidz + + + + + + + + diff --git a/cordova-lib/spec-plugman-install/plugins/AndroidJS/www/android.js b/cordova-lib/spec-plugman-install/plugins/AndroidJS/www/android.js new file mode 100644 index 000000000..d268b7d3a --- /dev/null +++ b/cordova-lib/spec-plugman-install/plugins/AndroidJS/www/android.js @@ -0,0 +1 @@ +{}; diff --git a/cordova-lib/spec-plugman-install/plugins/ChildBrowser/plugin.xml b/cordova-lib/spec-plugman-install/plugins/ChildBrowser/plugin.xml new file mode 100644 index 000000000..030f8cada --- /dev/null +++ b/cordova-lib/spec-plugman-install/plugins/ChildBrowser/plugin.xml @@ -0,0 +1,124 @@ + + + + + + Child Browser + + + + + + + + + + + + + + No matter what platform you are installing to, this notice is very important. + + + + + + + + + + + + + + + + + + + + + + Please make sure you read this because it is very important to complete the installation of your plugin. + + + + + + + + + + + + + $APP_ID + + + + + + PackageName + $PACKAGE_NAME + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cordova-lib/spec-plugman-install/plugins/ChildBrowser/src/android/ChildBrowser.java b/cordova-lib/spec-plugman-install/plugins/ChildBrowser/src/android/ChildBrowser.java new file mode 100644 index 000000000..5263b0c5d --- /dev/null +++ b/cordova-lib/spec-plugman-install/plugins/ChildBrowser/src/android/ChildBrowser.java @@ -0,0 +1,19 @@ +/* + * + * Copyright 2013 Anis Kadri + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + diff --git a/cordova-lib/spec-plugman-install/plugins/ChildBrowser/src/ios/ChildBrowser.bundle/arrow_left.png b/cordova-lib/spec-plugman-install/plugins/ChildBrowser/src/ios/ChildBrowser.bundle/arrow_left.png new file mode 100644 index 0000000000000000000000000000000000000000..530e12babde279931dc58cb36e2af4d9b7d52acc GIT binary patch literal 2946 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 literal 0 HcmV?d00001 diff --git a/cordova-lib/spec-plugman-install/plugins/ChildBrowser/src/ios/ChildBrowser.bundle/arrow_left@2x.png b/cordova-lib/spec-plugman-install/plugins/ChildBrowser/src/ios/ChildBrowser.bundle/arrow_left@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..530e12babde279931dc58cb36e2af4d9b7d52acc GIT binary patch literal 2946 zcmV-|3w`v7P)KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z00023NklJtSbB+AdXk9fc_N}0iY0oLh#n)l{dG~XWw)(q<|6v| zU!5@@Gjq=L5OUHFnfVDp8A8~$RuP*5E1X?vTo=3f3`dV75sXl2<|{#gB~IFj7EE!_ z&BuZfHs0rLL4ifbaYPFy*o&i4@Z4yFThbBvVv=2Ql~eGlYqK<3eeNU|+*4wkQ*h5b s*RZQ+h;^=UUC$W1wtDaX>34A%0J_xqo=TAm_W%F@07*qoM6N<$f*=%oe*gdg literal 0 HcmV?d00001 diff --git a/cordova-lib/spec-plugman-install/plugins/ChildBrowser/src/ios/ChildBrowser.bundle/arrow_right.png b/cordova-lib/spec-plugman-install/plugins/ChildBrowser/src/ios/ChildBrowser.bundle/arrow_right.png new file mode 100644 index 0000000000000000000000000000000000000000..8b3d855e884f8aa8b5d2c78139fa63ff4b5826d9 GIT binary patch literal 2946 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 literal 0 HcmV?d00001 diff --git a/cordova-lib/spec-plugman-install/plugins/ChildBrowser/src/ios/ChildBrowser.bundle/arrow_right@2x.png b/cordova-lib/spec-plugman-install/plugins/ChildBrowser/src/ios/ChildBrowser.bundle/arrow_right@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..8b3d855e884f8aa8b5d2c78139fa63ff4b5826d9 GIT binary patch literal 2946 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 literal 0 HcmV?d00001 diff --git a/cordova-lib/spec-plugman-install/plugins/ChildBrowser/src/ios/ChildBrowser.bundle/but_refresh.png b/cordova-lib/spec-plugman-install/plugins/ChildBrowser/src/ios/ChildBrowser.bundle/but_refresh.png new file mode 100644 index 0000000000000000000000000000000000000000..309b6bdb255b8784cf884e6fa2bde3febe36da5f GIT binary patch literal 3369 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 literal 0 HcmV?d00001 diff --git a/cordova-lib/spec-plugman-install/plugins/ChildBrowser/src/ios/ChildBrowser.bundle/compass@2x.png b/cordova-lib/spec-plugman-install/plugins/ChildBrowser/src/ios/ChildBrowser.bundle/compass@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..46a890174edb858abbef991828153aea289a3a49 GIT binary patch literal 3035 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 literal 0 HcmV?d00001 diff --git a/cordova-lib/spec-plugman-install/plugins/ChildBrowser/src/ios/ChildBrowserCommand.h b/cordova-lib/spec-plugman-install/plugins/ChildBrowser/src/ios/ChildBrowserCommand.h new file mode 100644 index 000000000..6a23ab6f0 --- /dev/null +++ b/cordova-lib/spec-plugman-install/plugins/ChildBrowser/src/ios/ChildBrowserCommand.h @@ -0,0 +1,49 @@ +/* + * + * Copyright 2013 Anis Kadri + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +// +// PhoneGap ! ChildBrowserCommand +// +// +// Created by Jesse MacFadyen on 10-05-29. +// Copyright 2010 Nitobi. All rights reserved. +// + +#import +#ifdef PHONEGAP_FRAMEWORK + #import +#else + #import "PGPlugin.h" +#endif +#import "ChildBrowserViewController.h" + + + +@interface ChildBrowserCommand : PGPlugin { + + ChildBrowserViewController* childBrowser; +} + +@property (nonatomic, retain) ChildBrowserViewController *childBrowser; + + +- (void) showWebPage:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options; +-(void) onChildLocationChange:(NSString*)newLoc; + +@end diff --git a/cordova-lib/spec-plugman-install/plugins/ChildBrowser/src/ios/ChildBrowserCommand.m b/cordova-lib/spec-plugman-install/plugins/ChildBrowser/src/ios/ChildBrowserCommand.m new file mode 100644 index 000000000..38aaf6497 --- /dev/null +++ b/cordova-lib/spec-plugman-install/plugins/ChildBrowser/src/ios/ChildBrowserCommand.m @@ -0,0 +1,86 @@ +// + +// +// +// Created by Jesse MacFadyen on 10-05-29. +// Copyright 2010 Nitobi. All rights reserved. +// Copyright (c) 2011, IBM Corporation +// Copyright 2011, Randy McMillan +// + +#import "ChildBrowserCommand.h" + +#ifdef PHONEGAP_FRAMEWORK + #import +#else + #import "PhoneGapViewController.h" +#endif + + +@implementation ChildBrowserCommand + +@synthesize childBrowser; + +- (void) showWebPage:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options // args: url +{ + + if(childBrowser == NULL) + { + childBrowser = [[ ChildBrowserViewController alloc ] initWithScale:FALSE ]; + childBrowser.delegate = self; + } + +/* // TODO: Work in progress + NSString* strOrientations = [ options objectForKey:@"supportedOrientations"]; + NSArray* supportedOrientations = [strOrientations componentsSeparatedByString:@","]; +*/ + PhoneGapViewController* cont = (PhoneGapViewController*)[ super appViewController ]; + childBrowser.supportedOrientations = cont.supportedOrientations; + + if ([cont respondsToSelector:@selector(presentViewController)]) { + //Reference UIViewController.h Line:179 for update to iOS 5 difference - @RandyMcMillan + [cont presentViewController:childBrowser animated:YES completion:nil]; + } else { + [ cont presentModalViewController:childBrowser animated:YES ]; + } + + NSString *url = (NSString*) [arguments objectAtIndex:0]; + + [childBrowser loadURL:url ]; + +} + +-(void) close:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options // args: url +{ + [ childBrowser closeBrowser]; + +} + +-(void) onClose +{ + NSString* jsCallback = [NSString stringWithFormat:@"ChildBrowser._onClose();",@""]; + [self.webView stringByEvaluatingJavaScriptFromString:jsCallback]; +} + +-(void) onOpenInSafari +{ + NSString* jsCallback = [NSString stringWithFormat:@"ChildBrowser._onOpenExternal();",@""]; + [self.webView stringByEvaluatingJavaScriptFromString:jsCallback]; +} + + +-(void) onChildLocationChange:(NSString*)newLoc +{ + + NSString* tempLoc = [NSString stringWithFormat:@"%@",newLoc]; + NSString* encUrl = [tempLoc stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; + + NSString* jsCallback = [NSString stringWithFormat:@"ChildBrowser._onLocationChange('%@');",encUrl]; + [self.webView stringByEvaluatingJavaScriptFromString:jsCallback]; + +} + + + + +@end diff --git a/cordova-lib/spec-plugman-install/plugins/ChildBrowser/src/ios/ChildBrowserViewController.h b/cordova-lib/spec-plugman-install/plugins/ChildBrowser/src/ios/ChildBrowserViewController.h new file mode 100644 index 000000000..d6fc139d5 --- /dev/null +++ b/cordova-lib/spec-plugman-install/plugins/ChildBrowser/src/ios/ChildBrowserViewController.h @@ -0,0 +1,73 @@ +/* + * + * Copyright 2013 Anis Kadri + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +// +// ChildBrowserViewController.h +// +// Created by Jesse MacFadyen on 21/07/09. +// Copyright 2009 Nitobi. All rights reserved. +// + +#import + +@protocol ChildBrowserDelegate + + + +/* + * onChildLocationChanging:newLoc + * + * Discussion: + * Invoked when a new page has loaded + */ +-(void) onChildLocationChange:(NSString*)newLoc; +-(void) onOpenInSafari; +-(void) onClose; +@end + + +@interface ChildBrowserViewController : UIViewController < UIWebViewDelegate > { + IBOutlet UIWebView* webView; + IBOutlet UIBarButtonItem* closeBtn; + IBOutlet UIBarButtonItem* refreshBtn; + IBOutlet UILabel* addressLabel; + IBOutlet UIBarButtonItem* backBtn; + IBOutlet UIBarButtonItem* fwdBtn; + IBOutlet UIBarButtonItem* safariBtn; + IBOutlet UIActivityIndicatorView* spinner; + BOOL scaleEnabled; + BOOL isImage; + NSString* imageURL; + NSArray* supportedOrientations; + id delegate; +} + +@property (nonatomic, retain)id delegate; +@property (nonatomic, retain) NSArray* supportedOrientations; +@property(retain) NSString* imageURL; +@property(assign) BOOL isImage; + +- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation) interfaceOrientation; +- (ChildBrowserViewController*)initWithScale:(BOOL)enabled; +- (IBAction)onDoneButtonPress:(id)sender; +- (IBAction)onSafariButtonPress:(id)sender; +- (void)loadURL:(NSString*)url; +-(void)closeBrowser; + +@end diff --git a/cordova-lib/spec-plugman-install/plugins/ChildBrowser/src/ios/ChildBrowserViewController.m b/cordova-lib/spec-plugman-install/plugins/ChildBrowser/src/ios/ChildBrowserViewController.m new file mode 100644 index 000000000..167ef9801 --- /dev/null +++ b/cordova-lib/spec-plugman-install/plugins/ChildBrowser/src/ios/ChildBrowserViewController.m @@ -0,0 +1,239 @@ +// +// ChildBrowserViewController.m +// +// Created by Jesse MacFadyen on 21/07/09. +// Copyright 2009 Nitobi. All rights reserved. +// Copyright (c) 2011, IBM Corporation +// Copyright 2011, Randy McMillan +// + +#import "ChildBrowserViewController.h" + + +@implementation ChildBrowserViewController + +@synthesize imageURL; +@synthesize supportedOrientations; +@synthesize isImage; +@synthesize delegate; + +/* + // The designated initializer. Override if you create the controller programmatically and want to perform customization that is not appropriate for viewDidLoad. +- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { + if (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) { + // Custom initialization + } + return self; +} +*/ + ++ (NSString*) resolveImageResource:(NSString*)resource +{ + NSString* systemVersion = [[UIDevice currentDevice] systemVersion]; + BOOL isLessThaniOS4 = ([systemVersion compare:@"4.0" options:NSNumericSearch] == NSOrderedAscending); + + // the iPad image (nor retina) differentiation code was not in 3.x, and we have to explicitly set the path + if (isLessThaniOS4) + { + return [NSString stringWithFormat:@"%@.png", resource]; + } + + return resource; +} + + +- (ChildBrowserViewController*)initWithScale:(BOOL)enabled +{ + self = [super init]; + + + scaleEnabled = enabled; + + return self; +} + +// Implement viewDidLoad to do additional setup after loading the view, typically from a nib. +- (void)viewDidLoad { + [super viewDidLoad]; + + refreshBtn.image = [UIImage imageNamed:[[self class] resolveImageResource:@"ChildBrowser.bundle/but_refresh"]]; + backBtn.image = [UIImage imageNamed:[[self class] resolveImageResource:@"ChildBrowser.bundle/arrow_left"]]; + fwdBtn.image = [UIImage imageNamed:[[self class] resolveImageResource:@"ChildBrowser.bundle/arrow_right"]]; + safariBtn.image = [UIImage imageNamed:[[self class] resolveImageResource:@"ChildBrowser.bundle/compass"]]; + + webView.delegate = self; + webView.scalesPageToFit = TRUE; + webView.backgroundColor = [UIColor whiteColor]; + NSLog(@"View did load"); +} + + + + + +- (void)didReceiveMemoryWarning { + // Releases the view if it doesn't have a superview. + [super didReceiveMemoryWarning]; + + // Release any cached data, images, etc that aren't in use. +} + +- (void)viewDidUnload { + // Release any retained subviews of the main view. + // e.g. self.myOutlet = nil; + NSLog(@"View did UN-load"); +} + + +- (void)dealloc { + + webView.delegate = nil; + + [webView release]; + [closeBtn release]; + [refreshBtn release]; + [addressLabel release]; + [backBtn release]; + [fwdBtn release]; + [safariBtn release]; + [spinner release]; + [ supportedOrientations release]; + [super dealloc]; +} + +-(void)closeBrowser +{ + + if(delegate != NULL) + { + [delegate onClose]; + } + if ([self respondsToSelector:@selector(presentingViewController)]) { + //Reference UIViewController.h Line:179 for update to iOS 5 difference - @RandyMcMillan + [[self presentingViewController] dismissViewControllerAnimated:YES completion:nil]; + } else { + [[self parentViewController] dismissModalViewControllerAnimated:YES]; + } +} + +-(IBAction) onDoneButtonPress:(id)sender +{ + [ self closeBrowser]; + + NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"about:blank"]]; + [webView loadRequest:request]; +} + + +-(IBAction) onSafariButtonPress:(id)sender +{ + + if(delegate != NULL) + { + [delegate onOpenInSafari]; + } + + if(isImage) + { + NSURL* pURL = [[ [NSURL alloc] initWithString:imageURL ] autorelease]; + [ [ UIApplication sharedApplication ] openURL:pURL ]; + } + else + { + NSURLRequest *request = webView.request; + [[UIApplication sharedApplication] openURL:request.URL]; + } + + +} + +- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation) interfaceOrientation +{ + BOOL autoRotate = [self.supportedOrientations count] > 1; // autorotate if only more than 1 orientation supported + if (autoRotate) + { + if ([self.supportedOrientations containsObject: + [NSNumber numberWithInt:interfaceOrientation]]) { + return YES; + } + } + + return NO; +} + + + + +- (void)loadURL:(NSString*)url +{ + NSLog(@"Opening Url : %@",url); + + if( [url hasSuffix:@".png" ] || + [url hasSuffix:@".jpg" ] || + [url hasSuffix:@".jpeg" ] || + [url hasSuffix:@".bmp" ] || + [url hasSuffix:@".gif" ] ) + { + [ imageURL release ]; + imageURL = [url copy]; + isImage = YES; + NSString* htmlText = @""; + htmlText = [ htmlText stringByReplacingOccurrencesOfString:@"IMGSRC" withString:url ]; + + [webView loadHTMLString:htmlText baseURL:[NSURL URLWithString:@""]]; + + } + else + { + imageURL = @""; + isImage = NO; + NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:url]]; + [webView loadRequest:request]; + } + webView.hidden = NO; +} + + +- (void)webViewDidStartLoad:(UIWebView *)sender { + addressLabel.text = @"Loading..."; + backBtn.enabled = webView.canGoBack; + fwdBtn.enabled = webView.canGoForward; + + [ spinner startAnimating ]; + +} + +- (void)webViewDidFinishLoad:(UIWebView *)sender +{ + NSURLRequest *request = webView.request; + NSLog(@"New Address is : %@",request.URL.absoluteString); + addressLabel.text = request.URL.absoluteString; + backBtn.enabled = webView.canGoBack; + fwdBtn.enabled = webView.canGoForward; + [ spinner stopAnimating ]; + + if(delegate != NULL) + { + [delegate onChildLocationChange:request.URL.absoluteString]; + } + +} + +- (void)webView:(UIWebView *)wv didFailLoadWithError:(NSError *)error { + NSLog (@"webView:didFailLoadWithError"); + [spinner stopAnimating]; + addressLabel.text = @"Failed"; + if (error != NULL) { + UIAlertView *errorAlert = [[UIAlertView alloc] + initWithTitle: [error localizedDescription] + message: [error localizedFailureReason] + delegate:nil + cancelButtonTitle:@"OK" + otherButtonTitles:nil]; + [errorAlert show]; + [errorAlert release]; + } +} + + +@end diff --git a/cordova-lib/spec-plugman-install/plugins/ChildBrowser/src/ios/ChildBrowserViewController.xib b/cordova-lib/spec-plugman-install/plugins/ChildBrowser/src/ios/ChildBrowserViewController.xib new file mode 100644 index 000000000..cc8dd6592 --- /dev/null +++ b/cordova-lib/spec-plugman-install/plugins/ChildBrowser/src/ios/ChildBrowserViewController.xib @@ -0,0 +1,875 @@ + + + + 768 + 10K540 + 851 + 1038.36 + 461.00 + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + 141 + + + YES + + + YES + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + YES + + YES + + + YES + + + + YES + + IBFilesOwner + IBCocoaTouchFramework + + + IBFirstResponder + IBCocoaTouchFramework + + + + 292 + + YES + + + -2147483374 + {480, 229} + + + + 1 + MCAwIDAAA + + YES + YES + IBCocoaTouchFramework + 1 + YES + + + + 266 + {{0, 256}, {480, 44}} + + + NO + NO + IBCocoaTouchFramework + 1 + + YES + + IBCocoaTouchFramework + 1 + + 0 + + + IBCocoaTouchFramework + + 5 + + + IBCocoaTouchFramework + + + + IBCocoaTouchFramework + + 5 + + + IBCocoaTouchFramework + 32 + + + + IBCocoaTouchFramework + + 5 + + + IBCocoaTouchFramework + 32 + + + + IBCocoaTouchFramework + + 5 + + + IBCocoaTouchFramework + 32 + + + + IBCocoaTouchFramework + + 5 + + + + + + 270 + {{5, 230}, {418, 21}} + + + + 4 + MC42NjY2NjY2OSAwAA + + NO + YES + NO + IBCocoaTouchFramework + Loading... + + Helvetica + 13 + 16 + + + 3 + MQA + + + 1 + NO + 10 + + + + -2147483383 + {{454, 231}, {20, 20}} + + NO + NO + NO + IBCocoaTouchFramework + + + {{0, 20}, {480, 300}} + + + 3 + MC41AA + + 2 + + + + + 3 + + IBCocoaTouchFramework + + + + + YES + + + webView + + + + 17 + + + + addressLabel + + + + 18 + + + + backBtn + + + + 19 + + + + fwdBtn + + + + 22 + + + + refreshBtn + + + + 23 + + + + onDoneButtonPress: + + + + 26 + + + + reload + + + + 27 + + + + goBack + + + + 28 + + + + goForward + + + + 29 + + + + onSafariButtonPress: + + + + 31 + + + + view + + + + 35 + + + + spinner + + + + 36 + + + + safariBtn + + + + 40 + + + + + YES + + 0 + + + + + + 1 + + + YES + + + + + + + + + -1 + + + File's Owner + + + -2 + + + + + 4 + + + + + 6 + + + YES + + + + + + + + + + + + + + + 7 + + + + + 8 + + + Bar Button Item (Reload) + + + 9 + + + Bar Button Item (Go Back) + + + 10 + + + Bar Button Item (Go Forward) + + + 11 + + + Bar Button Item (Safari) + + + 13 + + + + + 14 + + + + + 15 + + + + + 32 + + + + + 37 + + + + + 38 + + + + + 39 + + + + + + + YES + + YES + -1.CustomClassName + -2.CustomClassName + 1.IBEditorWindowLastContentRect + 1.IBPluginDependency + 10.IBPluginDependency + 11.IBPluginDependency + 13.IBPluginDependency + 13.IBViewBoundsToFrameTransform + 14.IBPluginDependency + 15.IBPluginDependency + 32.IBPluginDependency + 32.IBViewBoundsToFrameTransform + 37.IBPluginDependency + 38.IBPluginDependency + 39.IBPluginDependency + 4.IBPluginDependency + 4.IBViewBoundsToFrameTransform + 6.IBPluginDependency + 6.IBViewBoundsToFrameTransform + 7.IBPluginDependency + 8.IBPluginDependency + 9.IBPluginDependency + + + YES + ChildBrowserViewController + UIResponder + {{250, 643}, {480, 320}} + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABCoAAAwygAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABD5gAAw3kAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABB8AAAwwUAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAAAAAAAAw10AAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + + YES + + + YES + + + + + YES + + + YES + + + + 40 + + + + YES + + ChildBrowserViewController + UIViewController + + YES + + YES + onDoneButtonPress: + onSafariButtonPress: + + + YES + id + id + + + + YES + + YES + onDoneButtonPress: + onSafariButtonPress: + + + YES + + onDoneButtonPress: + id + + + onSafariButtonPress: + id + + + + + YES + + YES + addressLabel + backBtn + closeBtn + delegate + fwdBtn + refreshBtn + safariBtn + spinner + webView + + + YES + UILabel + UIBarButtonItem + UIBarButtonItem + id + UIBarButtonItem + UIBarButtonItem + UIBarButtonItem + UIActivityIndicatorView + UIWebView + + + + YES + + YES + addressLabel + backBtn + closeBtn + delegate + fwdBtn + refreshBtn + safariBtn + spinner + webView + + + YES + + addressLabel + UILabel + + + backBtn + UIBarButtonItem + + + closeBtn + UIBarButtonItem + + + delegate + id + + + fwdBtn + UIBarButtonItem + + + refreshBtn + UIBarButtonItem + + + safariBtn + UIBarButtonItem + + + spinner + UIActivityIndicatorView + + + webView + UIWebView + + + + + IBProjectSource + Plugins/ChildBrowser/ChildBrowserViewController.h + + + + + YES + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSError.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSFileManager.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyValueCoding.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyValueObserving.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyedArchiver.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSObject.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSRunLoop.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSThread.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSURL.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSURLConnection.h + + + + NSObject + + IBFrameworkSource + QuartzCore.framework/Headers/CAAnimation.h + + + + NSObject + + IBFrameworkSource + QuartzCore.framework/Headers/CALayer.h + + + + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UIAccessibility.h + + + + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UINibLoading.h + + + + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UIResponder.h + + + + UIActivityIndicatorView + UIView + + IBFrameworkSource + UIKit.framework/Headers/UIActivityIndicatorView.h + + + + UIBarButtonItem + UIBarItem + + IBFrameworkSource + UIKit.framework/Headers/UIBarButtonItem.h + + + + UIBarItem + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UIBarItem.h + + + + UILabel + UIView + + IBFrameworkSource + UIKit.framework/Headers/UILabel.h + + + + UIResponder + NSObject + + + + UISearchBar + UIView + + IBFrameworkSource + UIKit.framework/Headers/UISearchBar.h + + + + UISearchDisplayController + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UISearchDisplayController.h + + + + UIToolbar + UIView + + IBFrameworkSource + UIKit.framework/Headers/UIToolbar.h + + + + UIView + + IBFrameworkSource + UIKit.framework/Headers/UIPrintFormatter.h + + + + UIView + + IBFrameworkSource + UIKit.framework/Headers/UITextField.h + + + + UIView + UIResponder + + IBFrameworkSource + UIKit.framework/Headers/UIView.h + + + + UIViewController + + IBFrameworkSource + MediaPlayer.framework/Headers/MPMoviePlayerViewController.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UINavigationController.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UIPopoverController.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UISplitViewController.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UITabBarController.h + + + + UIViewController + UIResponder + + IBFrameworkSource + UIKit.framework/Headers/UIViewController.h + + + + UIWebView + UIView + + IBFrameworkSource + UIKit.framework/Headers/UIWebView.h + + + + + 0 + IBCocoaTouchFramework + + com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS + + + + com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS + + + + com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 + + + YES + + 3 + 141 + + diff --git a/cordova-lib/spec-plugman-install/plugins/ChildBrowser/src/ios/TargetDirTest.h b/cordova-lib/spec-plugman-install/plugins/ChildBrowser/src/ios/TargetDirTest.h new file mode 100644 index 000000000..60a1403a2 --- /dev/null +++ b/cordova-lib/spec-plugman-install/plugins/ChildBrowser/src/ios/TargetDirTest.h @@ -0,0 +1,20 @@ +/* + * + * Copyright 2013 Anis Kadri + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + + diff --git a/cordova-lib/spec-plugman-install/plugins/ChildBrowser/src/ios/TargetDirTest.m b/cordova-lib/spec-plugman-install/plugins/ChildBrowser/src/ios/TargetDirTest.m new file mode 100644 index 000000000..8d1c8b69c --- /dev/null +++ b/cordova-lib/spec-plugman-install/plugins/ChildBrowser/src/ios/TargetDirTest.m @@ -0,0 +1 @@ + diff --git a/cordova-lib/spec-plugman-install/plugins/ChildBrowser/src/ios/preserveDirs/PreserveDirsTest.h b/cordova-lib/spec-plugman-install/plugins/ChildBrowser/src/ios/preserveDirs/PreserveDirsTest.h new file mode 100644 index 000000000..60a1403a2 --- /dev/null +++ b/cordova-lib/spec-plugman-install/plugins/ChildBrowser/src/ios/preserveDirs/PreserveDirsTest.h @@ -0,0 +1,20 @@ +/* + * + * Copyright 2013 Anis Kadri + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + + diff --git a/cordova-lib/spec-plugman-install/plugins/ChildBrowser/src/ios/preserveDirs/PreserveDirsTest.m b/cordova-lib/spec-plugman-install/plugins/ChildBrowser/src/ios/preserveDirs/PreserveDirsTest.m new file mode 100644 index 000000000..8d1c8b69c --- /dev/null +++ b/cordova-lib/spec-plugman-install/plugins/ChildBrowser/src/ios/preserveDirs/PreserveDirsTest.m @@ -0,0 +1 @@ + diff --git a/cordova-lib/spec-plugman-install/plugins/ChildBrowser/www/childbrowser.js b/cordova-lib/spec-plugman-install/plugins/ChildBrowser/www/childbrowser.js new file mode 100644 index 000000000..5263b0c5d --- /dev/null +++ b/cordova-lib/spec-plugman-install/plugins/ChildBrowser/www/childbrowser.js @@ -0,0 +1,19 @@ +/* + * + * Copyright 2013 Anis Kadri + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + diff --git a/cordova-lib/spec-plugman-install/plugins/ChildBrowser/www/childbrowser/image.jpg b/cordova-lib/spec-plugman-install/plugins/ChildBrowser/www/childbrowser/image.jpg new file mode 100644 index 000000000..257cc5642 --- /dev/null +++ b/cordova-lib/spec-plugman-install/plugins/ChildBrowser/www/childbrowser/image.jpg @@ -0,0 +1 @@ +foo diff --git a/cordova-lib/spec-plugman-install/plugins/ChildBrowser/www/childbrowser_file.html b/cordova-lib/spec-plugman-install/plugins/ChildBrowser/www/childbrowser_file.html new file mode 100644 index 000000000..6de7b8c69 --- /dev/null +++ b/cordova-lib/spec-plugman-install/plugins/ChildBrowser/www/childbrowser_file.html @@ -0,0 +1 @@ +This is a test file. diff --git a/cordova-lib/spec-plugman-install/plugins/ConfigTestPlugin/plugin.xml b/cordova-lib/spec-plugman-install/plugins/ConfigTestPlugin/plugin.xml new file mode 100644 index 000000000..54b489573 --- /dev/null +++ b/cordova-lib/spec-plugman-install/plugins/ConfigTestPlugin/plugin.xml @@ -0,0 +1,37 @@ + + + + + + Does Code Fil Write Even Work? Hopefully the Tests Will Tell Us + + + + + + + + + + + diff --git a/cordova-lib/spec-plugman-install/plugins/Contacts/plugin.xml b/cordova-lib/spec-plugman-install/plugins/Contacts/plugin.xml new file mode 100644 index 000000000..622eb2a2f --- /dev/null +++ b/cordova-lib/spec-plugman-install/plugins/Contacts/plugin.xml @@ -0,0 +1,128 @@ + + + + Contacts + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + access_pimdomain_contacts + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cordova-lib/spec-plugman-install/plugins/Contacts/src/android/ContactAccessor.java b/cordova-lib/spec-plugman-install/plugins/Contacts/src/android/ContactAccessor.java new file mode 100644 index 000000000..24ef9c61d --- /dev/null +++ b/cordova-lib/spec-plugman-install/plugins/Contacts/src/android/ContactAccessor.java @@ -0,0 +1,198 @@ +/* + * Copyright (C) 2009 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.cordova.core; + +import java.util.HashMap; + +import android.util.Log; +import android.webkit.WebView; + +import org.apache.cordova.CordovaInterface; +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +/** + * This abstract class defines SDK-independent API for communication with + * Contacts Provider. The actual implementation used by the application depends + * on the level of API available on the device. If the API level is Cupcake or + * Donut, we want to use the {@link ContactAccessorSdk3_4} class. If it is + * Eclair or higher, we want to use {@link ContactAccessorSdk5}. + */ +public abstract class ContactAccessor { + + protected final String LOG_TAG = "ContactsAccessor"; + protected CordovaInterface mApp; + protected WebView mView; + + /** + * Check to see if the data associated with the key is required to + * be populated in the Contact object. + * @param key + * @param map created by running buildPopulationSet. + * @return true if the key data is required + */ + protected boolean isRequired(String key, HashMap map) { + Boolean retVal = map.get(key); + return (retVal == null) ? false : retVal.booleanValue(); + } + + /** + * Create a hash map of what data needs to be populated in the Contact object + * @param fields the list of fields to populate + * @return the hash map of required data + */ + protected HashMap buildPopulationSet(JSONArray fields) { + HashMap map = new HashMap(); + + String key; + try { + if (fields.length() == 1 && fields.getString(0).equals("*")) { + map.put("displayName", true); + map.put("name", true); + map.put("nickname", true); + map.put("phoneNumbers", true); + map.put("emails", true); + map.put("addresses", true); + map.put("ims", true); + map.put("organizations", true); + map.put("birthday", true); + map.put("note", true); + map.put("urls", true); + map.put("photos", true); + map.put("categories", true); + } + else { + for (int i=0; i + * This implementation has several advantages: + *
    + *
  • It sees contacts from multiple accounts. + *
  • It works with aggregated contacts. So for example, if the contact is the result + * of aggregation of two raw contacts from different accounts, it may return the name from + * one and the phone number from the other. + *
  • It is efficient because it uses the more efficient current API. + *
  • Not obvious in this particular example, but it has access to new kinds + * of data available exclusively through the new APIs. Exercise for the reader: add support + * for nickname (see {@link android.provider.ContactsContract.CommonDataKinds.Nickname}) or + * social status updates (see {@link android.provider.ContactsContract.StatusUpdates}). + *
+ */ + +public class ContactAccessorSdk5 extends ContactAccessor { + + /** + * Keep the photo size under the 1 MB blog limit. + */ + private static final long MAX_PHOTO_SIZE = 1048576; + + private static final String EMAIL_REGEXP = ".+@.+\\.+.+"; /* @.*/ + + /** + * A static map that converts the JavaScript property name to Android database column name. + */ + private static final Map dbMap = new HashMap(); + static { + dbMap.put("id", ContactsContract.Data.CONTACT_ID); + dbMap.put("displayName", ContactsContract.Contacts.DISPLAY_NAME); + dbMap.put("name", ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME); + dbMap.put("name.formatted", ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME); + dbMap.put("name.familyName", ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME); + dbMap.put("name.givenName", ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME); + dbMap.put("name.middleName", ContactsContract.CommonDataKinds.StructuredName.MIDDLE_NAME); + dbMap.put("name.honorificPrefix", ContactsContract.CommonDataKinds.StructuredName.PREFIX); + dbMap.put("name.honorificSuffix", ContactsContract.CommonDataKinds.StructuredName.SUFFIX); + dbMap.put("nickname", ContactsContract.CommonDataKinds.Nickname.NAME); + dbMap.put("phoneNumbers", ContactsContract.CommonDataKinds.Phone.NUMBER); + dbMap.put("phoneNumbers.value", ContactsContract.CommonDataKinds.Phone.NUMBER); + dbMap.put("emails", ContactsContract.CommonDataKinds.Email.DATA); + dbMap.put("emails.value", ContactsContract.CommonDataKinds.Email.DATA); + dbMap.put("addresses", ContactsContract.CommonDataKinds.StructuredPostal.FORMATTED_ADDRESS); + dbMap.put("addresses.formatted", ContactsContract.CommonDataKinds.StructuredPostal.FORMATTED_ADDRESS); + dbMap.put("addresses.streetAddress", ContactsContract.CommonDataKinds.StructuredPostal.STREET); + dbMap.put("addresses.locality", ContactsContract.CommonDataKinds.StructuredPostal.CITY); + dbMap.put("addresses.region", ContactsContract.CommonDataKinds.StructuredPostal.REGION); + dbMap.put("addresses.postalCode", ContactsContract.CommonDataKinds.StructuredPostal.POSTCODE); + dbMap.put("addresses.country", ContactsContract.CommonDataKinds.StructuredPostal.COUNTRY); + dbMap.put("ims", ContactsContract.CommonDataKinds.Im.DATA); + dbMap.put("ims.value", ContactsContract.CommonDataKinds.Im.DATA); + dbMap.put("organizations", ContactsContract.CommonDataKinds.Organization.COMPANY); + dbMap.put("organizations.name", ContactsContract.CommonDataKinds.Organization.COMPANY); + dbMap.put("organizations.department", ContactsContract.CommonDataKinds.Organization.DEPARTMENT); + dbMap.put("organizations.title", ContactsContract.CommonDataKinds.Organization.TITLE); + dbMap.put("birthday", ContactsContract.CommonDataKinds.Event.CONTENT_ITEM_TYPE); + dbMap.put("note", ContactsContract.CommonDataKinds.Note.NOTE); + dbMap.put("photos.value", ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE); + //dbMap.put("categories.value", null); + dbMap.put("urls", ContactsContract.CommonDataKinds.Website.URL); + dbMap.put("urls.value", ContactsContract.CommonDataKinds.Website.URL); + } + + /** + * Create an contact accessor. + */ + public ContactAccessorSdk5(WebView view, CordovaInterface context) { + mApp = context; + mView = view; + } + + /** + * This method takes the fields required and search options in order to produce an + * array of contacts that matches the criteria provided. + * @param fields an array of items to be used as search criteria + * @param options that can be applied to contact searching + * @return an array of contacts + */ + @Override + public JSONArray search(JSONArray fields, JSONObject options) { + // Get the find options + String searchTerm = ""; + int limit = Integer.MAX_VALUE; + boolean multiple = true; + + if (options != null) { + searchTerm = options.optString("filter"); + if (searchTerm.length() == 0) { + searchTerm = "%"; + } + else { + searchTerm = "%" + searchTerm + "%"; + } + + try { + multiple = options.getBoolean("multiple"); + if (!multiple) { + limit = 1; + } + } catch (JSONException e) { + // Multiple was not specified so we assume the default is true. + } + } + else { + searchTerm = "%"; + } + + + //Log.d(LOG_TAG, "Search Term = " + searchTerm); + //Log.d(LOG_TAG, "Field Length = " + fields.length()); + //Log.d(LOG_TAG, "Fields = " + fields.toString()); + + // Loop through the fields the user provided to see what data should be returned. + HashMap populate = buildPopulationSet(fields); + + // Build the ugly where clause and where arguments for one big query. + WhereOptions whereOptions = buildWhereClause(fields, searchTerm); + + // Get all the id's where the search term matches the fields passed in. + Cursor idCursor = mApp.getActivity().getContentResolver().query(ContactsContract.Data.CONTENT_URI, + new String[] { ContactsContract.Data.CONTACT_ID }, + whereOptions.getWhere(), + whereOptions.getWhereArgs(), + ContactsContract.Data.CONTACT_ID + " ASC"); + + // Create a set of unique ids + Set contactIds = new HashSet(); + int idColumn = -1; + while (idCursor.moveToNext()) { + if (idColumn < 0) { + idColumn = idCursor.getColumnIndex(ContactsContract.Data.CONTACT_ID); + } + contactIds.add(idCursor.getString(idColumn)); + } + idCursor.close(); + + // Build a query that only looks at ids + WhereOptions idOptions = buildIdClause(contactIds, searchTerm); + + // Determine which columns we should be fetching. + HashSet columnsToFetch = new HashSet(); + columnsToFetch.add(ContactsContract.Data.CONTACT_ID); + columnsToFetch.add(ContactsContract.Data.RAW_CONTACT_ID); + columnsToFetch.add(ContactsContract.Data.MIMETYPE); + + if (isRequired("displayName", populate)) { + columnsToFetch.add(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME); + } + if (isRequired("name", populate)) { + columnsToFetch.add(ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME); + columnsToFetch.add(ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME); + columnsToFetch.add(ContactsContract.CommonDataKinds.StructuredName.MIDDLE_NAME); + columnsToFetch.add(ContactsContract.CommonDataKinds.StructuredName.PREFIX); + columnsToFetch.add(ContactsContract.CommonDataKinds.StructuredName.SUFFIX); + } + if (isRequired("phoneNumbers", populate)) { + columnsToFetch.add(ContactsContract.CommonDataKinds.Phone._ID); + columnsToFetch.add(ContactsContract.CommonDataKinds.Phone.NUMBER); + columnsToFetch.add(ContactsContract.CommonDataKinds.Phone.TYPE); + } + if (isRequired("emails", populate)) { + columnsToFetch.add(ContactsContract.CommonDataKinds.Email._ID); + columnsToFetch.add(ContactsContract.CommonDataKinds.Email.DATA); + columnsToFetch.add(ContactsContract.CommonDataKinds.Email.TYPE); + } + if (isRequired("addresses", populate)) { + columnsToFetch.add(ContactsContract.CommonDataKinds.StructuredPostal._ID); + columnsToFetch.add(ContactsContract.CommonDataKinds.Organization.TYPE); + columnsToFetch.add(ContactsContract.CommonDataKinds.StructuredPostal.FORMATTED_ADDRESS); + columnsToFetch.add(ContactsContract.CommonDataKinds.StructuredPostal.STREET); + columnsToFetch.add(ContactsContract.CommonDataKinds.StructuredPostal.CITY); + columnsToFetch.add(ContactsContract.CommonDataKinds.StructuredPostal.REGION); + columnsToFetch.add(ContactsContract.CommonDataKinds.StructuredPostal.POSTCODE); + columnsToFetch.add(ContactsContract.CommonDataKinds.StructuredPostal.COUNTRY); + } + if (isRequired("organizations", populate)) { + columnsToFetch.add(ContactsContract.CommonDataKinds.Organization._ID); + columnsToFetch.add(ContactsContract.CommonDataKinds.Organization.TYPE); + columnsToFetch.add(ContactsContract.CommonDataKinds.Organization.DEPARTMENT); + columnsToFetch.add(ContactsContract.CommonDataKinds.Organization.COMPANY); + columnsToFetch.add(ContactsContract.CommonDataKinds.Organization.TITLE); + } + if (isRequired("ims", populate)) { + columnsToFetch.add(ContactsContract.CommonDataKinds.Im._ID); + columnsToFetch.add(ContactsContract.CommonDataKinds.Im.DATA); + columnsToFetch.add(ContactsContract.CommonDataKinds.Im.TYPE); + } + if (isRequired("note", populate)) { + columnsToFetch.add(ContactsContract.CommonDataKinds.Note.NOTE); + } + if (isRequired("nickname", populate)) { + columnsToFetch.add(ContactsContract.CommonDataKinds.Nickname.NAME); + } + if (isRequired("urls", populate)) { + columnsToFetch.add(ContactsContract.CommonDataKinds.Website._ID); + columnsToFetch.add(ContactsContract.CommonDataKinds.Website.URL); + columnsToFetch.add(ContactsContract.CommonDataKinds.Website.TYPE); + } + if (isRequired("birthday", populate)) { + columnsToFetch.add(ContactsContract.CommonDataKinds.Event.START_DATE); + columnsToFetch.add(ContactsContract.CommonDataKinds.Event.TYPE); + } + if (isRequired("photos", populate)) { + columnsToFetch.add(ContactsContract.CommonDataKinds.Photo._ID); + } + + // Do the id query + Cursor c = mApp.getActivity().getContentResolver().query(ContactsContract.Data.CONTENT_URI, + columnsToFetch.toArray(new String[] {}), + idOptions.getWhere(), + idOptions.getWhereArgs(), + ContactsContract.Data.CONTACT_ID + " ASC"); + + JSONArray contacts = populateContactArray(limit, populate, c); + return contacts; + } + + /** + * A special search that finds one contact by id + * + * @param id contact to find by id + * @return a JSONObject representing the contact + * @throws JSONException + */ + public JSONObject getContactById(String id) throws JSONException { + // Do the id query + Cursor c = mApp.getActivity().getContentResolver().query(ContactsContract.Data.CONTENT_URI, + null, + ContactsContract.Data.CONTACT_ID + " = ? ", + new String[] { id }, + ContactsContract.Data.CONTACT_ID + " ASC"); + + JSONArray fields = new JSONArray(); + fields.put("*"); + + HashMap populate = buildPopulationSet(fields); + + JSONArray contacts = populateContactArray(1, populate, c); + + if (contacts.length() == 1) { + return contacts.getJSONObject(0); + } else { + return null; + } + } + + /** + * Creates an array of contacts from the cursor you pass in + * + * @param limit max number of contacts for the array + * @param populate whether or not you should populate a certain value + * @param c the cursor + * @return a JSONArray of contacts + */ + private JSONArray populateContactArray(int limit, + HashMap populate, Cursor c) { + + String contactId = ""; + String rawId = ""; + String oldContactId = ""; + boolean newContact = true; + String mimetype = ""; + + JSONArray contacts = new JSONArray(); + JSONObject contact = new JSONObject(); + JSONArray organizations = new JSONArray(); + JSONArray addresses = new JSONArray(); + JSONArray phones = new JSONArray(); + JSONArray emails = new JSONArray(); + JSONArray ims = new JSONArray(); + JSONArray websites = new JSONArray(); + JSONArray photos = new JSONArray(); + + // Column indices + int colContactId = c.getColumnIndex(ContactsContract.Data.CONTACT_ID); + int colRawContactId = c.getColumnIndex(ContactsContract.Data.RAW_CONTACT_ID); + int colMimetype = c.getColumnIndex(ContactsContract.Data.MIMETYPE); + int colDisplayName = c.getColumnIndex(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME); + int colNote = c.getColumnIndex(ContactsContract.CommonDataKinds.Note.NOTE); + int colNickname = c.getColumnIndex(ContactsContract.CommonDataKinds.Nickname.NAME); + int colBirthday = c.getColumnIndex(ContactsContract.CommonDataKinds.Event.START_DATE); + int colEventType = c.getColumnIndex(ContactsContract.CommonDataKinds.Event.TYPE); + + if (c.getCount() > 0) { + while (c.moveToNext() && (contacts.length() <= (limit - 1))) { + try { + contactId = c.getString(colContactId); + rawId = c.getString(colRawContactId); + + // If we are in the first row set the oldContactId + if (c.getPosition() == 0) { + oldContactId = contactId; + } + + // When the contact ID changes we need to push the Contact object + // to the array of contacts and create new objects. + if (!oldContactId.equals(contactId)) { + // Populate the Contact object with it's arrays + // and push the contact into the contacts array + contacts.put(populateContact(contact, organizations, addresses, phones, + emails, ims, websites, photos)); + + // Clean up the objects + contact = new JSONObject(); + organizations = new JSONArray(); + addresses = new JSONArray(); + phones = new JSONArray(); + emails = new JSONArray(); + ims = new JSONArray(); + websites = new JSONArray(); + photos = new JSONArray(); + + // Set newContact to true as we are starting to populate a new contact + newContact = true; + } + + // When we detect a new contact set the ID and display name. + // These fields are available in every row in the result set returned. + if (newContact) { + newContact = false; + contact.put("id", contactId); + contact.put("rawId", rawId); + } + + // Grab the mimetype of the current row as it will be used in a lot of comparisons + mimetype = c.getString(colMimetype); + + if (mimetype.equals(ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE)) { + contact.put("displayName", c.getString(colDisplayName)); + } + + if (mimetype.equals(ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE) + && isRequired("name", populate)) { + contact.put("name", nameQuery(c)); + } + else if (mimetype.equals(ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE) + && isRequired("phoneNumbers", populate)) { + phones.put(phoneQuery(c)); + } + else if (mimetype.equals(ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE) + && isRequired("emails", populate)) { + emails.put(emailQuery(c)); + } + else if (mimetype.equals(ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_ITEM_TYPE) + && isRequired("addresses", populate)) { + addresses.put(addressQuery(c)); + } + else if (mimetype.equals(ContactsContract.CommonDataKinds.Organization.CONTENT_ITEM_TYPE) + && isRequired("organizations", populate)) { + organizations.put(organizationQuery(c)); + } + else if (mimetype.equals(ContactsContract.CommonDataKinds.Im.CONTENT_ITEM_TYPE) + && isRequired("ims", populate)) { + ims.put(imQuery(c)); + } + else if (mimetype.equals(ContactsContract.CommonDataKinds.Note.CONTENT_ITEM_TYPE) + && isRequired("note", populate)) { + contact.put("note", c.getString(colNote)); + } + else if (mimetype.equals(ContactsContract.CommonDataKinds.Nickname.CONTENT_ITEM_TYPE) + && isRequired("nickname", populate)) { + contact.put("nickname", c.getString(colNickname)); + } + else if (mimetype.equals(ContactsContract.CommonDataKinds.Website.CONTENT_ITEM_TYPE) + && isRequired("urls", populate)) { + websites.put(websiteQuery(c)); + } + else if (mimetype.equals(ContactsContract.CommonDataKinds.Event.CONTENT_ITEM_TYPE)) { + if (isRequired("birthday", populate) && + ContactsContract.CommonDataKinds.Event.TYPE_BIRTHDAY == c.getInt(colEventType)) { + contact.put("birthday", c.getString(colBirthday)); + } + } + else if (mimetype.equals(ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE) + && isRequired("photos", populate)) { + photos.put(photoQuery(c, contactId)); + } + } catch (JSONException e) { + Log.e(LOG_TAG, e.getMessage(), e); + } + + // Set the old contact ID + oldContactId = contactId; + + } + + // Push the last contact into the contacts array + if (contacts.length() < limit) { + contacts.put(populateContact(contact, organizations, addresses, phones, + emails, ims, websites, photos)); + } + } + c.close(); + return contacts; + } + + /** + * Builds a where clause all all the ids passed into the method + * @param contactIds a set of unique contact ids + * @param searchTerm what to search for + * @return an object containing the selection and selection args + */ + private WhereOptions buildIdClause(Set contactIds, String searchTerm) { + WhereOptions options = new WhereOptions(); + + // If the user is searching for every contact then short circuit the method + // and return a shorter where clause to be searched. + if (searchTerm.equals("%")) { + options.setWhere("(" + ContactsContract.Data.CONTACT_ID + " LIKE ? )"); + options.setWhereArgs(new String[] { searchTerm }); + return options; + } + + // This clause means that there are specific ID's to be populated + Iterator it = contactIds.iterator(); + StringBuffer buffer = new StringBuffer("("); + + while (it.hasNext()) { + buffer.append("'" + it.next() + "'"); + if (it.hasNext()) { + buffer.append(","); + } + } + buffer.append(")"); + + options.setWhere(ContactsContract.Data.CONTACT_ID + " IN " + buffer.toString()); + options.setWhereArgs(null); + + return options; + } + + /** + * Create a new contact using a JSONObject to hold all the data. + * @param contact + * @param organizations array of organizations + * @param addresses array of addresses + * @param phones array of phones + * @param emails array of emails + * @param ims array of instant messenger addresses + * @param websites array of websites + * @param photos + * @return + */ + private JSONObject populateContact(JSONObject contact, JSONArray organizations, + JSONArray addresses, JSONArray phones, JSONArray emails, + JSONArray ims, JSONArray websites, JSONArray photos) { + try { + // Only return the array if it has at least one entry + if (organizations.length() > 0) { + contact.put("organizations", organizations); + } + if (addresses.length() > 0) { + contact.put("addresses", addresses); + } + if (phones.length() > 0) { + contact.put("phoneNumbers", phones); + } + if (emails.length() > 0) { + contact.put("emails", emails); + } + if (ims.length() > 0) { + contact.put("ims", ims); + } + if (websites.length() > 0) { + contact.put("urls", websites); + } + if (photos.length() > 0) { + contact.put("photos", photos); + } + } catch (JSONException e) { + Log.e(LOG_TAG, e.getMessage(), e); + } + return contact; + } + + /** + * Take the search criteria passed into the method and create a SQL WHERE clause. + * @param fields the properties to search against + * @param searchTerm the string to search for + * @return an object containing the selection and selection args + */ + private WhereOptions buildWhereClause(JSONArray fields, String searchTerm) { + + ArrayList where = new ArrayList(); + ArrayList whereArgs = new ArrayList(); + + WhereOptions options = new WhereOptions(); + + /* + * Special case where the user wants all fields returned + */ + if (isWildCardSearch(fields)) { + // Get all contacts with all properties + if ("%".equals(searchTerm)) { + options.setWhere("(" + ContactsContract.Contacts.DISPLAY_NAME + " LIKE ? )"); + options.setWhereArgs(new String[] { searchTerm }); + return options; + } else { + // Get all contacts that match the filter but return all properties + where.add("(" + dbMap.get("displayName") + " LIKE ? )"); + whereArgs.add(searchTerm); + where.add("(" + dbMap.get("name") + " LIKE ? AND " + + ContactsContract.Data.MIMETYPE + " = ? )"); + whereArgs.add(searchTerm); + whereArgs.add(ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE); + where.add("(" + dbMap.get("nickname") + " LIKE ? AND " + + ContactsContract.Data.MIMETYPE + " = ? )"); + whereArgs.add(searchTerm); + whereArgs.add(ContactsContract.CommonDataKinds.Nickname.CONTENT_ITEM_TYPE); + where.add("(" + dbMap.get("phoneNumbers") + " LIKE ? AND " + + ContactsContract.Data.MIMETYPE + " = ? )"); + whereArgs.add(searchTerm); + whereArgs.add(ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE); + where.add("(" + dbMap.get("emails") + " LIKE ? AND " + + ContactsContract.Data.MIMETYPE + " = ? )"); + whereArgs.add(searchTerm); + whereArgs.add(ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE); + where.add("(" + dbMap.get("addresses") + " LIKE ? AND " + + ContactsContract.Data.MIMETYPE + " = ? )"); + whereArgs.add(searchTerm); + whereArgs.add(ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_ITEM_TYPE); + where.add("(" + dbMap.get("ims") + " LIKE ? AND " + + ContactsContract.Data.MIMETYPE + " = ? )"); + whereArgs.add(searchTerm); + whereArgs.add(ContactsContract.CommonDataKinds.Im.CONTENT_ITEM_TYPE); + where.add("(" + dbMap.get("organizations") + " LIKE ? AND " + + ContactsContract.Data.MIMETYPE + " = ? )"); + whereArgs.add(searchTerm); + whereArgs.add(ContactsContract.CommonDataKinds.Organization.CONTENT_ITEM_TYPE); + where.add("(" + dbMap.get("note") + " LIKE ? AND " + + ContactsContract.Data.MIMETYPE + " = ? )"); + whereArgs.add(searchTerm); + whereArgs.add(ContactsContract.CommonDataKinds.Note.CONTENT_ITEM_TYPE); + where.add("(" + dbMap.get("urls") + " LIKE ? AND " + + ContactsContract.Data.MIMETYPE + " = ? )"); + whereArgs.add(searchTerm); + whereArgs.add(ContactsContract.CommonDataKinds.Website.CONTENT_ITEM_TYPE); + } + } + + /* + * Special case for when the user wants all the contacts but + */ + if ("%".equals(searchTerm)) { + options.setWhere("(" + ContactsContract.Contacts.DISPLAY_NAME + " LIKE ? )"); + options.setWhereArgs(new String[] { searchTerm }); + return options; + } + + String key; + try { + //Log.d(LOG_TAG, "How many fields do we have = " + fields.length()); + for (int i = 0; i < fields.length(); i++) { + key = fields.getString(i); + + if (key.equals("id")) { + where.add("(" + dbMap.get(key) + " = ? )"); + whereArgs.add(searchTerm.substring(1, searchTerm.length() - 1)); + } + else if (key.startsWith("displayName")) { + where.add("(" + dbMap.get(key) + " LIKE ? )"); + whereArgs.add(searchTerm); + } + else if (key.startsWith("name")) { + where.add("(" + dbMap.get(key) + " LIKE ? AND " + + ContactsContract.Data.MIMETYPE + " = ? )"); + whereArgs.add(searchTerm); + whereArgs.add(ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE); + } + else if (key.startsWith("nickname")) { + where.add("(" + dbMap.get(key) + " LIKE ? AND " + + ContactsContract.Data.MIMETYPE + " = ? )"); + whereArgs.add(searchTerm); + whereArgs.add(ContactsContract.CommonDataKinds.Nickname.CONTENT_ITEM_TYPE); + } + else if (key.startsWith("phoneNumbers")) { + where.add("(" + dbMap.get(key) + " LIKE ? AND " + + ContactsContract.Data.MIMETYPE + " = ? )"); + whereArgs.add(searchTerm); + whereArgs.add(ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE); + } + else if (key.startsWith("emails")) { + where.add("(" + dbMap.get(key) + " LIKE ? AND " + + ContactsContract.Data.MIMETYPE + " = ? )"); + whereArgs.add(searchTerm); + whereArgs.add(ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE); + } + else if (key.startsWith("addresses")) { + where.add("(" + dbMap.get(key) + " LIKE ? AND " + + ContactsContract.Data.MIMETYPE + " = ? )"); + whereArgs.add(searchTerm); + whereArgs.add(ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_ITEM_TYPE); + } + else if (key.startsWith("ims")) { + where.add("(" + dbMap.get(key) + " LIKE ? AND " + + ContactsContract.Data.MIMETYPE + " = ? )"); + whereArgs.add(searchTerm); + whereArgs.add(ContactsContract.CommonDataKinds.Im.CONTENT_ITEM_TYPE); + } + else if (key.startsWith("organizations")) { + where.add("(" + dbMap.get(key) + " LIKE ? AND " + + ContactsContract.Data.MIMETYPE + " = ? )"); + whereArgs.add(searchTerm); + whereArgs.add(ContactsContract.CommonDataKinds.Organization.CONTENT_ITEM_TYPE); + } + // else if (key.startsWith("birthday")) { +// where.add("(" + dbMap.get(key) + " LIKE ? AND " +// + ContactsContract.Data.MIMETYPE + " = ? )"); +// } + else if (key.startsWith("note")) { + where.add("(" + dbMap.get(key) + " LIKE ? AND " + + ContactsContract.Data.MIMETYPE + " = ? )"); + whereArgs.add(searchTerm); + whereArgs.add(ContactsContract.CommonDataKinds.Note.CONTENT_ITEM_TYPE); + } + else if (key.startsWith("urls")) { + where.add("(" + dbMap.get(key) + " LIKE ? AND " + + ContactsContract.Data.MIMETYPE + " = ? )"); + whereArgs.add(searchTerm); + whereArgs.add(ContactsContract.CommonDataKinds.Website.CONTENT_ITEM_TYPE); + } + } + } catch (JSONException e) { + Log.e(LOG_TAG, e.getMessage(), e); + } + + // Creating the where string + StringBuffer selection = new StringBuffer(); + for (int i = 0; i < where.size(); i++) { + selection.append(where.get(i)); + if (i != (where.size() - 1)) { + selection.append(" OR "); + } + } + options.setWhere(selection.toString()); + + // Creating the where args array + String[] selectionArgs = new String[whereArgs.size()]; + for (int i = 0; i < whereArgs.size(); i++) { + selectionArgs[i] = whereArgs.get(i); + } + options.setWhereArgs(selectionArgs); + + return options; + } + + /** + * If the user passes in the '*' wildcard character for search then they want all fields for each contact + * + * @param fields + * @return true if wildcard search requested, false otherwise + */ + private boolean isWildCardSearch(JSONArray fields) { + // Only do a wildcard search if we are passed ["*"] + if (fields.length() == 1) { + try { + if ("*".equals(fields.getString(0))) { + return true; + } + } catch (JSONException e) { + return false; + } + } + return false; + } + + /** + * Create a ContactOrganization JSONObject + * @param cursor the current database row + * @return a JSONObject representing a ContactOrganization + */ + private JSONObject organizationQuery(Cursor cursor) { + JSONObject organization = new JSONObject(); + try { + organization.put("id", cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Organization._ID))); + organization.put("pref", false); // Android does not store pref attribute + organization.put("type", getOrgType(cursor.getInt(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Organization.TYPE)))); + organization.put("department", cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Organization.DEPARTMENT))); + organization.put("name", cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Organization.COMPANY))); + organization.put("title", cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Organization.TITLE))); + } catch (JSONException e) { + Log.e(LOG_TAG, e.getMessage(), e); + } + return organization; + } + + /** + * Create a ContactAddress JSONObject + * @param cursor the current database row + * @return a JSONObject representing a ContactAddress + */ + private JSONObject addressQuery(Cursor cursor) { + JSONObject address = new JSONObject(); + try { + address.put("id", cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal._ID))); + address.put("pref", false); // Android does not store pref attribute + address.put("type", getAddressType(cursor.getInt(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Organization.TYPE)))); + address.put("formatted", cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.FORMATTED_ADDRESS))); + address.put("streetAddress", cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.STREET))); + address.put("locality", cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.CITY))); + address.put("region", cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.REGION))); + address.put("postalCode", cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.POSTCODE))); + address.put("country", cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.COUNTRY))); + } catch (JSONException e) { + Log.e(LOG_TAG, e.getMessage(), e); + } + return address; + } + + /** + * Create a ContactName JSONObject + * @param cursor the current database row + * @return a JSONObject representing a ContactName + */ + private JSONObject nameQuery(Cursor cursor) { + JSONObject contactName = new JSONObject(); + try { + String familyName = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME)); + String givenName = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME)); + String middleName = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredName.MIDDLE_NAME)); + String honorificPrefix = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredName.PREFIX)); + String honorificSuffix = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredName.SUFFIX)); + + // Create the formatted name + StringBuffer formatted = new StringBuffer(""); + if (honorificPrefix != null) { + formatted.append(honorificPrefix + " "); + } + if (givenName != null) { + formatted.append(givenName + " "); + } + if (middleName != null) { + formatted.append(middleName + " "); + } + if (familyName != null) { + formatted.append(familyName); + } + if (honorificSuffix != null) { + formatted.append(" " + honorificSuffix); + } + + contactName.put("familyName", familyName); + contactName.put("givenName", givenName); + contactName.put("middleName", middleName); + contactName.put("honorificPrefix", honorificPrefix); + contactName.put("honorificSuffix", honorificSuffix); + contactName.put("formatted", formatted); + } catch (JSONException e) { + Log.e(LOG_TAG, e.getMessage(), e); + } + return contactName; + } + + /** + * Create a ContactField JSONObject + * @param cursor the current database row + * @return a JSONObject representing a ContactField + */ + private JSONObject phoneQuery(Cursor cursor) { + JSONObject phoneNumber = new JSONObject(); + try { + phoneNumber.put("id", cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone._ID))); + phoneNumber.put("pref", false); // Android does not store pref attribute + phoneNumber.put("value", cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER))); + phoneNumber.put("type", getPhoneType(cursor.getInt(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.TYPE)))); + } catch (JSONException e) { + Log.e(LOG_TAG, e.getMessage(), e); + } catch (Exception excp) { + Log.e(LOG_TAG, excp.getMessage(), excp); + } + return phoneNumber; + } + + /** + * Create a ContactField JSONObject + * @param cursor the current database row + * @return a JSONObject representing a ContactField + */ + private JSONObject emailQuery(Cursor cursor) { + JSONObject email = new JSONObject(); + try { + email.put("id", cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Email._ID))); + email.put("pref", false); // Android does not store pref attribute + email.put("value", cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA))); + email.put("type", getContactType(cursor.getInt(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Email.TYPE)))); + } catch (JSONException e) { + Log.e(LOG_TAG, e.getMessage(), e); + } + return email; + } + + /** + * Create a ContactField JSONObject + * @param cursor the current database row + * @return a JSONObject representing a ContactField + */ + private JSONObject imQuery(Cursor cursor) { + JSONObject im = new JSONObject(); + try { + im.put("id", cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Im._ID))); + im.put("pref", false); // Android does not store pref attribute + im.put("value", cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Im.DATA))); + im.put("type", getImType(cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Im.PROTOCOL)))); + } catch (JSONException e) { + Log.e(LOG_TAG, e.getMessage(), e); + } + return im; + } + + /** + * Create a ContactField JSONObject + * @param cursor the current database row + * @return a JSONObject representing a ContactField + */ + private JSONObject websiteQuery(Cursor cursor) { + JSONObject website = new JSONObject(); + try { + website.put("id", cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Website._ID))); + website.put("pref", false); // Android does not store pref attribute + website.put("value", cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Website.URL))); + website.put("type", getContactType(cursor.getInt(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Website.TYPE)))); + } catch (JSONException e) { + Log.e(LOG_TAG, e.getMessage(), e); + } + return website; + } + + /** + * Create a ContactField JSONObject + * @param contactId + * @return a JSONObject representing a ContactField + */ + private JSONObject photoQuery(Cursor cursor, String contactId) { + JSONObject photo = new JSONObject(); + try { + photo.put("id", cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Photo._ID))); + photo.put("pref", false); + photo.put("type", "url"); + Uri person = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, (new Long(contactId))); + Uri photoUri = Uri.withAppendedPath(person, ContactsContract.Contacts.Photo.CONTENT_DIRECTORY); + photo.put("value", photoUri.toString()); + } catch (JSONException e) { + Log.e(LOG_TAG, e.getMessage(), e); + } + return photo; + } + + @Override + /** + * This method will save a contact object into the devices contacts database. + * + * @param contact the contact to be saved. + * @returns the id if the contact is successfully saved, null otherwise. + */ + public String save(JSONObject contact) { + AccountManager mgr = AccountManager.get(mApp.getActivity()); + Account[] accounts = mgr.getAccounts(); + String accountName = null; + String accountType = null; + + if (accounts.length == 1) { + accountName = accounts[0].name; + accountType = accounts[0].type; + } + else if (accounts.length > 1) { + for (Account a : accounts) { + if (a.type.contains("eas") && a.name.matches(EMAIL_REGEXP)) /*Exchange ActiveSync*/{ + accountName = a.name; + accountType = a.type; + break; + } + } + if (accountName == null) { + for (Account a : accounts) { + if (a.type.contains("com.google") && a.name.matches(EMAIL_REGEXP)) /*Google sync provider*/{ + accountName = a.name; + accountType = a.type; + break; + } + } + } + if (accountName == null) { + for (Account a : accounts) { + if (a.name.matches(EMAIL_REGEXP)) /*Last resort, just look for an email address...*/{ + accountName = a.name; + accountType = a.type; + break; + } + } + } + } + + String id = getJsonString(contact, "id"); + if (id == null) { + // Create new contact + return createNewContact(contact, accountType, accountName); + } else { + // Modify existing contact + return modifyContact(id, contact, accountType, accountName); + } + } + + /** + * Creates a new contact and stores it in the database + * + * @param id the raw contact id which is required for linking items to the contact + * @param contact the contact to be saved + * @param account the account to be saved under + */ + private String modifyContact(String id, JSONObject contact, String accountType, String accountName) { + // Get the RAW_CONTACT_ID which is needed to insert new values in an already existing contact. + // But not needed to update existing values. + int rawId = (new Integer(getJsonString(contact, "rawId"))).intValue(); + + // Create a list of attributes to add to the contact database + ArrayList ops = new ArrayList(); + + //Add contact type + ops.add(ContentProviderOperation.newUpdate(ContactsContract.RawContacts.CONTENT_URI) + .withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, accountType) + .withValue(ContactsContract.RawContacts.ACCOUNT_NAME, accountName) + .build()); + + // Modify name + JSONObject name; + try { + String displayName = getJsonString(contact, "displayName"); + name = contact.getJSONObject("name"); + if (displayName != null || name != null) { + ContentProviderOperation.Builder builder = ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI) + .withSelection(ContactsContract.Data.CONTACT_ID + "=? AND " + + ContactsContract.Data.MIMETYPE + "=?", + new String[] { id, ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE }); + + if (displayName != null) { + builder.withValue(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME, displayName); + } + + String familyName = getJsonString(name, "familyName"); + if (familyName != null) { + builder.withValue(ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME, familyName); + } + String middleName = getJsonString(name, "middleName"); + if (middleName != null) { + builder.withValue(ContactsContract.CommonDataKinds.StructuredName.MIDDLE_NAME, middleName); + } + String givenName = getJsonString(name, "givenName"); + if (givenName != null) { + builder.withValue(ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME, givenName); + } + String honorificPrefix = getJsonString(name, "honorificPrefix"); + if (honorificPrefix != null) { + builder.withValue(ContactsContract.CommonDataKinds.StructuredName.PREFIX, honorificPrefix); + } + String honorificSuffix = getJsonString(name, "honorificSuffix"); + if (honorificSuffix != null) { + builder.withValue(ContactsContract.CommonDataKinds.StructuredName.SUFFIX, honorificSuffix); + } + + ops.add(builder.build()); + } + } catch (JSONException e1) { + Log.d(LOG_TAG, "Could not get name"); + } + + // Modify phone numbers + JSONArray phones = null; + try { + phones = contact.getJSONArray("phoneNumbers"); + if (phones != null) { + // Delete all the phones + if (phones.length() == 0) { + ops.add(ContentProviderOperation.newDelete(ContactsContract.Data.CONTENT_URI) + .withSelection(ContactsContract.Data.RAW_CONTACT_ID + "=? AND " + + ContactsContract.Data.MIMETYPE + "=?", + new String[] { "" + rawId, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE }) + .build()); + } + // Modify or add a phone + else { + for (int i = 0; i < phones.length(); i++) { + JSONObject phone = (JSONObject) phones.get(i); + String phoneId = getJsonString(phone, "id"); + // This is a new phone so do a DB insert + if (phoneId == null) { + ContentValues contentValues = new ContentValues(); + contentValues.put(ContactsContract.Data.RAW_CONTACT_ID, rawId); + contentValues.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE); + contentValues.put(ContactsContract.CommonDataKinds.Phone.NUMBER, getJsonString(phone, "value")); + contentValues.put(ContactsContract.CommonDataKinds.Phone.TYPE, getPhoneType(getJsonString(phone, "type"))); + + ops.add(ContentProviderOperation.newInsert( + ContactsContract.Data.CONTENT_URI).withValues(contentValues).build()); + } + // This is an existing phone so do a DB update + else { + ops.add(ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI) + .withSelection(ContactsContract.CommonDataKinds.Phone._ID + "=? AND " + + ContactsContract.Data.MIMETYPE + "=?", + new String[] { phoneId, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE }) + .withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, getJsonString(phone, "value")) + .withValue(ContactsContract.CommonDataKinds.Phone.TYPE, getPhoneType(getJsonString(phone, "type"))) + .build()); + } + } + } + } + } catch (JSONException e) { + Log.d(LOG_TAG, "Could not get phone numbers"); + } + + // Modify emails + JSONArray emails = null; + try { + emails = contact.getJSONArray("emails"); + if (emails != null) { + // Delete all the emails + if (emails.length() == 0) { + ops.add(ContentProviderOperation.newDelete(ContactsContract.Data.CONTENT_URI) + .withSelection(ContactsContract.Data.RAW_CONTACT_ID + "=? AND " + + ContactsContract.Data.MIMETYPE + "=?", + new String[] { "" + rawId, ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE }) + .build()); + } + // Modify or add a email + else { + for (int i = 0; i < emails.length(); i++) { + JSONObject email = (JSONObject) emails.get(i); + String emailId = getJsonString(email, "id"); + // This is a new email so do a DB insert + if (emailId == null) { + ContentValues contentValues = new ContentValues(); + contentValues.put(ContactsContract.Data.RAW_CONTACT_ID, rawId); + contentValues.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE); + contentValues.put(ContactsContract.CommonDataKinds.Email.DATA, getJsonString(email, "value")); + contentValues.put(ContactsContract.CommonDataKinds.Email.TYPE, getContactType(getJsonString(email, "type"))); + + ops.add(ContentProviderOperation.newInsert( + ContactsContract.Data.CONTENT_URI).withValues(contentValues).build()); + } + // This is an existing email so do a DB update + else { + String emailValue=getJsonString(email, "value"); + if(!emailValue.isEmpty()) { + ops.add(ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI) + .withSelection(ContactsContract.CommonDataKinds.Email._ID + "=? AND " + + ContactsContract.Data.MIMETYPE + "=?", + new String[] { emailId, ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE }) + .withValue(ContactsContract.CommonDataKinds.Email.DATA, getJsonString(email, "value")) + .withValue(ContactsContract.CommonDataKinds.Email.TYPE, getContactType(getJsonString(email, "type"))) + .build()); + } else { + ops.add(ContentProviderOperation.newDelete(ContactsContract.Data.CONTENT_URI) + .withSelection(ContactsContract.CommonDataKinds.Email._ID + "=? AND " + + ContactsContract.Data.MIMETYPE + "=?", + new String[] { emailId, ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE }) + .build()); + } + } + } + } + } + } catch (JSONException e) { + Log.d(LOG_TAG, "Could not get emails"); + } + + // Modify addresses + JSONArray addresses = null; + try { + addresses = contact.getJSONArray("addresses"); + if (addresses != null) { + // Delete all the addresses + if (addresses.length() == 0) { + ops.add(ContentProviderOperation.newDelete(ContactsContract.Data.CONTENT_URI) + .withSelection(ContactsContract.Data.RAW_CONTACT_ID + "=? AND " + + ContactsContract.Data.MIMETYPE + "=?", + new String[] { "" + rawId, ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_ITEM_TYPE }) + .build()); + } + // Modify or add a address + else { + for (int i = 0; i < addresses.length(); i++) { + JSONObject address = (JSONObject) addresses.get(i); + String addressId = getJsonString(address, "id"); + // This is a new address so do a DB insert + if (addressId == null) { + ContentValues contentValues = new ContentValues(); + contentValues.put(ContactsContract.Data.RAW_CONTACT_ID, rawId); + contentValues.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_ITEM_TYPE); + contentValues.put(ContactsContract.CommonDataKinds.StructuredPostal.TYPE, getAddressType(getJsonString(address, "type"))); + contentValues.put(ContactsContract.CommonDataKinds.StructuredPostal.FORMATTED_ADDRESS, getJsonString(address, "formatted")); + contentValues.put(ContactsContract.CommonDataKinds.StructuredPostal.STREET, getJsonString(address, "streetAddress")); + contentValues.put(ContactsContract.CommonDataKinds.StructuredPostal.CITY, getJsonString(address, "locality")); + contentValues.put(ContactsContract.CommonDataKinds.StructuredPostal.REGION, getJsonString(address, "region")); + contentValues.put(ContactsContract.CommonDataKinds.StructuredPostal.POSTCODE, getJsonString(address, "postalCode")); + contentValues.put(ContactsContract.CommonDataKinds.StructuredPostal.COUNTRY, getJsonString(address, "country")); + + ops.add(ContentProviderOperation.newInsert( + ContactsContract.Data.CONTENT_URI).withValues(contentValues).build()); + } + // This is an existing address so do a DB update + else { + ops.add(ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI) + .withSelection(ContactsContract.CommonDataKinds.StructuredPostal._ID + "=? AND " + + ContactsContract.Data.MIMETYPE + "=?", + new String[] { addressId, ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_ITEM_TYPE }) + .withValue(ContactsContract.CommonDataKinds.StructuredPostal.TYPE, getAddressType(getJsonString(address, "type"))) + .withValue(ContactsContract.CommonDataKinds.StructuredPostal.FORMATTED_ADDRESS, getJsonString(address, "formatted")) + .withValue(ContactsContract.CommonDataKinds.StructuredPostal.STREET, getJsonString(address, "streetAddress")) + .withValue(ContactsContract.CommonDataKinds.StructuredPostal.CITY, getJsonString(address, "locality")) + .withValue(ContactsContract.CommonDataKinds.StructuredPostal.REGION, getJsonString(address, "region")) + .withValue(ContactsContract.CommonDataKinds.StructuredPostal.POSTCODE, getJsonString(address, "postalCode")) + .withValue(ContactsContract.CommonDataKinds.StructuredPostal.COUNTRY, getJsonString(address, "country")) + .build()); + } + } + } + } + } catch (JSONException e) { + Log.d(LOG_TAG, "Could not get addresses"); + } + + // Modify organizations + JSONArray organizations = null; + try { + organizations = contact.getJSONArray("organizations"); + if (organizations != null) { + // Delete all the organizations + if (organizations.length() == 0) { + ops.add(ContentProviderOperation.newDelete(ContactsContract.Data.CONTENT_URI) + .withSelection(ContactsContract.Data.RAW_CONTACT_ID + "=? AND " + + ContactsContract.Data.MIMETYPE + "=?", + new String[] { "" + rawId, ContactsContract.CommonDataKinds.Organization.CONTENT_ITEM_TYPE }) + .build()); + } + // Modify or add a organization + else { + for (int i = 0; i < organizations.length(); i++) { + JSONObject org = (JSONObject) organizations.get(i); + String orgId = getJsonString(org, "id"); + // This is a new organization so do a DB insert + if (orgId == null) { + ContentValues contentValues = new ContentValues(); + contentValues.put(ContactsContract.Data.RAW_CONTACT_ID, rawId); + contentValues.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Organization.CONTENT_ITEM_TYPE); + contentValues.put(ContactsContract.CommonDataKinds.Organization.TYPE, getOrgType(getJsonString(org, "type"))); + contentValues.put(ContactsContract.CommonDataKinds.Organization.DEPARTMENT, getJsonString(org, "department")); + contentValues.put(ContactsContract.CommonDataKinds.Organization.COMPANY, getJsonString(org, "name")); + contentValues.put(ContactsContract.CommonDataKinds.Organization.TITLE, getJsonString(org, "title")); + + ops.add(ContentProviderOperation.newInsert( + ContactsContract.Data.CONTENT_URI).withValues(contentValues).build()); + } + // This is an existing organization so do a DB update + else { + ops.add(ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI) + .withSelection(ContactsContract.CommonDataKinds.Organization._ID + "=? AND " + + ContactsContract.Data.MIMETYPE + "=?", + new String[] { orgId, ContactsContract.CommonDataKinds.Organization.CONTENT_ITEM_TYPE }) + .withValue(ContactsContract.CommonDataKinds.Organization.TYPE, getOrgType(getJsonString(org, "type"))) + .withValue(ContactsContract.CommonDataKinds.Organization.DEPARTMENT, getJsonString(org, "department")) + .withValue(ContactsContract.CommonDataKinds.Organization.COMPANY, getJsonString(org, "name")) + .withValue(ContactsContract.CommonDataKinds.Organization.TITLE, getJsonString(org, "title")) + .build()); + } + } + } + } + } catch (JSONException e) { + Log.d(LOG_TAG, "Could not get organizations"); + } + + // Modify IMs + JSONArray ims = null; + try { + ims = contact.getJSONArray("ims"); + if (ims != null) { + // Delete all the ims + if (ims.length() == 0) { + ops.add(ContentProviderOperation.newDelete(ContactsContract.Data.CONTENT_URI) + .withSelection(ContactsContract.Data.RAW_CONTACT_ID + "=? AND " + + ContactsContract.Data.MIMETYPE + "=?", + new String[] { "" + rawId, ContactsContract.CommonDataKinds.Im.CONTENT_ITEM_TYPE }) + .build()); + } + // Modify or add a im + else { + for (int i = 0; i < ims.length(); i++) { + JSONObject im = (JSONObject) ims.get(i); + String imId = getJsonString(im, "id"); + // This is a new IM so do a DB insert + if (imId == null) { + ContentValues contentValues = new ContentValues(); + contentValues.put(ContactsContract.Data.RAW_CONTACT_ID, rawId); + contentValues.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Im.CONTENT_ITEM_TYPE); + contentValues.put(ContactsContract.CommonDataKinds.Im.DATA, getJsonString(im, "value")); + contentValues.put(ContactsContract.CommonDataKinds.Im.TYPE, getImType(getJsonString(im, "type"))); + + ops.add(ContentProviderOperation.newInsert( + ContactsContract.Data.CONTENT_URI).withValues(contentValues).build()); + } + // This is an existing IM so do a DB update + else { + ops.add(ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI) + .withSelection(ContactsContract.CommonDataKinds.Im._ID + "=? AND " + + ContactsContract.Data.MIMETYPE + "=?", + new String[] { imId, ContactsContract.CommonDataKinds.Im.CONTENT_ITEM_TYPE }) + .withValue(ContactsContract.CommonDataKinds.Im.DATA, getJsonString(im, "value")) + .withValue(ContactsContract.CommonDataKinds.Im.TYPE, getContactType(getJsonString(im, "type"))) + .build()); + } + } + } + } + } catch (JSONException e) { + Log.d(LOG_TAG, "Could not get emails"); + } + + // Modify note + String note = getJsonString(contact, "note"); + ops.add(ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI) + .withSelection(ContactsContract.Data.CONTACT_ID + "=? AND " + + ContactsContract.Data.MIMETYPE + "=?", + new String[] { id, ContactsContract.CommonDataKinds.Note.CONTENT_ITEM_TYPE }) + .withValue(ContactsContract.CommonDataKinds.Note.NOTE, note) + .build()); + + // Modify nickname + String nickname = getJsonString(contact, "nickname"); + if (nickname != null) { + ops.add(ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI) + .withSelection(ContactsContract.Data.CONTACT_ID + "=? AND " + + ContactsContract.Data.MIMETYPE + "=?", + new String[] { id, ContactsContract.CommonDataKinds.Nickname.CONTENT_ITEM_TYPE }) + .withValue(ContactsContract.CommonDataKinds.Nickname.NAME, nickname) + .build()); + } + + // Modify urls + JSONArray websites = null; + try { + websites = contact.getJSONArray("urls"); + if (websites != null) { + // Delete all the websites + if (websites.length() == 0) { + Log.d(LOG_TAG, "This means we should be deleting all the phone numbers."); + ops.add(ContentProviderOperation.newDelete(ContactsContract.Data.CONTENT_URI) + .withSelection(ContactsContract.Data.RAW_CONTACT_ID + "=? AND " + + ContactsContract.Data.MIMETYPE + "=?", + new String[] { "" + rawId, ContactsContract.CommonDataKinds.Website.CONTENT_ITEM_TYPE }) + .build()); + } + // Modify or add a website + else { + for (int i = 0; i < websites.length(); i++) { + JSONObject website = (JSONObject) websites.get(i); + String websiteId = getJsonString(website, "id"); + // This is a new website so do a DB insert + if (websiteId == null) { + ContentValues contentValues = new ContentValues(); + contentValues.put(ContactsContract.Data.RAW_CONTACT_ID, rawId); + contentValues.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Website.CONTENT_ITEM_TYPE); + contentValues.put(ContactsContract.CommonDataKinds.Website.DATA, getJsonString(website, "value")); + contentValues.put(ContactsContract.CommonDataKinds.Website.TYPE, getContactType(getJsonString(website, "type"))); + + ops.add(ContentProviderOperation.newInsert( + ContactsContract.Data.CONTENT_URI).withValues(contentValues).build()); + } + // This is an existing website so do a DB update + else { + ops.add(ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI) + .withSelection(ContactsContract.CommonDataKinds.Website._ID + "=? AND " + + ContactsContract.Data.MIMETYPE + "=?", + new String[] { websiteId, ContactsContract.CommonDataKinds.Website.CONTENT_ITEM_TYPE }) + .withValue(ContactsContract.CommonDataKinds.Website.DATA, getJsonString(website, "value")) + .withValue(ContactsContract.CommonDataKinds.Website.TYPE, getContactType(getJsonString(website, "type"))) + .build()); + } + } + } + } + } catch (JSONException e) { + Log.d(LOG_TAG, "Could not get websites"); + } + + // Modify birthday + String birthday = getJsonString(contact, "birthday"); + if (birthday != null) { + ops.add(ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI) + .withSelection(ContactsContract.Data.CONTACT_ID + "=? AND " + + ContactsContract.Data.MIMETYPE + "=? AND " + + ContactsContract.CommonDataKinds.Event.TYPE + "=?", + new String[] { id, ContactsContract.CommonDataKinds.Event.CONTENT_ITEM_TYPE, new String("" + ContactsContract.CommonDataKinds.Event.TYPE_BIRTHDAY) }) + .withValue(ContactsContract.CommonDataKinds.Event.TYPE, ContactsContract.CommonDataKinds.Event.TYPE_BIRTHDAY) + .withValue(ContactsContract.CommonDataKinds.Event.START_DATE, birthday) + .build()); + } + + // Modify photos + JSONArray photos = null; + try { + photos = contact.getJSONArray("photos"); + if (photos != null) { + // Delete all the photos + if (photos.length() == 0) { + ops.add(ContentProviderOperation.newDelete(ContactsContract.Data.CONTENT_URI) + .withSelection(ContactsContract.Data.RAW_CONTACT_ID + "=? AND " + + ContactsContract.Data.MIMETYPE + "=?", + new String[] { "" + rawId, ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE }) + .build()); + } + // Modify or add a photo + else { + for (int i = 0; i < photos.length(); i++) { + JSONObject photo = (JSONObject) photos.get(i); + String photoId = getJsonString(photo, "id"); + byte[] bytes = getPhotoBytes(getJsonString(photo, "value")); + // This is a new photo so do a DB insert + if (photoId == null) { + ContentValues contentValues = new ContentValues(); + contentValues.put(ContactsContract.Data.RAW_CONTACT_ID, rawId); + contentValues.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE); + contentValues.put(ContactsContract.Data.IS_SUPER_PRIMARY, 1); + contentValues.put(ContactsContract.CommonDataKinds.Photo.PHOTO, bytes); + + ops.add(ContentProviderOperation.newInsert( + ContactsContract.Data.CONTENT_URI).withValues(contentValues).build()); + } + // This is an existing photo so do a DB update + else { + ops.add(ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI) + .withSelection(ContactsContract.CommonDataKinds.Photo._ID + "=? AND " + + ContactsContract.Data.MIMETYPE + "=?", + new String[] { photoId, ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE }) + .withValue(ContactsContract.Data.IS_SUPER_PRIMARY, 1) + .withValue(ContactsContract.CommonDataKinds.Photo.PHOTO, bytes) + .build()); + } + } + } + } + } catch (JSONException e) { + Log.d(LOG_TAG, "Could not get photos"); + } + + boolean retVal = true; + + //Modify contact + try { + mApp.getActivity().getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops); + } catch (RemoteException e) { + Log.e(LOG_TAG, e.getMessage(), e); + Log.e(LOG_TAG, Log.getStackTraceString(e), e); + retVal = false; + } catch (OperationApplicationException e) { + Log.e(LOG_TAG, e.getMessage(), e); + Log.e(LOG_TAG, Log.getStackTraceString(e), e); + retVal = false; + } + + // if the save was a success return the contact ID + if (retVal) { + return id; + } else { + return null; + } + } + + /** + * Add a website to a list of database actions to be performed + * + * @param ops the list of database actions + * @param website the item to be inserted + */ + private void insertWebsite(ArrayList ops, + JSONObject website) { + ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI) + .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0) + .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Website.CONTENT_ITEM_TYPE) + .withValue(ContactsContract.CommonDataKinds.Website.DATA, getJsonString(website, "value")) + .withValue(ContactsContract.CommonDataKinds.Website.TYPE, getContactType(getJsonString(website, "type"))) + .build()); + } + + /** + * Add an im to a list of database actions to be performed + * + * @param ops the list of database actions + * @param im the item to be inserted + */ + private void insertIm(ArrayList ops, JSONObject im) { + ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI) + .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0) + .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Im.CONTENT_ITEM_TYPE) + .withValue(ContactsContract.CommonDataKinds.Im.DATA, getJsonString(im, "value")) + .withValue(ContactsContract.CommonDataKinds.Im.TYPE, getImType(getJsonString(im, "type"))) + .build()); + } + + /** + * Add an organization to a list of database actions to be performed + * + * @param ops the list of database actions + * @param org the item to be inserted + */ + private void insertOrganization(ArrayList ops, + JSONObject org) { + ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI) + .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0) + .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Organization.CONTENT_ITEM_TYPE) + .withValue(ContactsContract.CommonDataKinds.Organization.TYPE, getOrgType(getJsonString(org, "type"))) + .withValue(ContactsContract.CommonDataKinds.Organization.DEPARTMENT, getJsonString(org, "department")) + .withValue(ContactsContract.CommonDataKinds.Organization.COMPANY, getJsonString(org, "name")) + .withValue(ContactsContract.CommonDataKinds.Organization.TITLE, getJsonString(org, "title")) + .build()); + } + + /** + * Add an address to a list of database actions to be performed + * + * @param ops the list of database actions + * @param address the item to be inserted + */ + private void insertAddress(ArrayList ops, + JSONObject address) { + ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI) + .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0) + .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_ITEM_TYPE) + .withValue(ContactsContract.CommonDataKinds.StructuredPostal.TYPE, getAddressType(getJsonString(address, "type"))) + .withValue(ContactsContract.CommonDataKinds.StructuredPostal.FORMATTED_ADDRESS, getJsonString(address, "formatted")) + .withValue(ContactsContract.CommonDataKinds.StructuredPostal.STREET, getJsonString(address, "streetAddress")) + .withValue(ContactsContract.CommonDataKinds.StructuredPostal.CITY, getJsonString(address, "locality")) + .withValue(ContactsContract.CommonDataKinds.StructuredPostal.REGION, getJsonString(address, "region")) + .withValue(ContactsContract.CommonDataKinds.StructuredPostal.POSTCODE, getJsonString(address, "postalCode")) + .withValue(ContactsContract.CommonDataKinds.StructuredPostal.COUNTRY, getJsonString(address, "country")) + .build()); + } + + /** + * Add an email to a list of database actions to be performed + * + * @param ops the list of database actions + * @param email the item to be inserted + */ + private void insertEmail(ArrayList ops, + JSONObject email) { + ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI) + .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0) + .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE) + .withValue(ContactsContract.CommonDataKinds.Email.DATA, getJsonString(email, "value")) + .withValue(ContactsContract.CommonDataKinds.Email.TYPE, getContactType(getJsonString(email, "type"))) + .build()); + } + + /** + * Add a phone to a list of database actions to be performed + * + * @param ops the list of database actions + * @param phone the item to be inserted + */ + private void insertPhone(ArrayList ops, + JSONObject phone) { + ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI) + .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0) + .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE) + .withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, getJsonString(phone, "value")) + .withValue(ContactsContract.CommonDataKinds.Phone.TYPE, getPhoneType(getJsonString(phone, "type"))) + .build()); + } + + /** + * Add a phone to a list of database actions to be performed + * + * @param ops the list of database actions + * @param phone the item to be inserted + */ + private void insertPhoto(ArrayList ops, + JSONObject photo) { + byte[] bytes = getPhotoBytes(getJsonString(photo, "value")); + ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI) + .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0) + .withValue(ContactsContract.Data.IS_SUPER_PRIMARY, 1) + .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE) + .withValue(ContactsContract.CommonDataKinds.Photo.PHOTO, bytes) + .build()); + } + + /** + * Gets the raw bytes from the supplied filename + * + * @param filename the file to read the bytes from + * @return a byte array + * @throws IOException + */ + private byte[] getPhotoBytes(String filename) { + ByteArrayOutputStream buffer = new ByteArrayOutputStream(); + try { + int bytesRead = 0; + long totalBytesRead = 0; + byte[] data = new byte[8192]; + InputStream in = getPathFromUri(filename); + + while ((bytesRead = in.read(data, 0, data.length)) != -1 && totalBytesRead <= MAX_PHOTO_SIZE) { + buffer.write(data, 0, bytesRead); + totalBytesRead += bytesRead; + } + + in.close(); + buffer.flush(); + } catch (FileNotFoundException e) { + Log.e(LOG_TAG, e.getMessage(), e); + } catch (IOException e) { + Log.e(LOG_TAG, e.getMessage(), e); + } + return buffer.toByteArray(); + } + + /** + * Get an input stream based on file path or uri content://, http://, file:// + * + * @param path + * @return an input stream + * @throws IOException + */ + private InputStream getPathFromUri(String path) throws IOException { + if (path.startsWith("content:")) { + Uri uri = Uri.parse(path); + return mApp.getActivity().getContentResolver().openInputStream(uri); + } + if (path.startsWith("http:") || path.startsWith("https:") || path.startsWith("file:")) { + URL url = new URL(path); + return url.openStream(); + } + else { + return new FileInputStream(path); + } + } + + /** + * Creates a new contact and stores it in the database + * + * @param contact the contact to be saved + * @param account the account to be saved under + */ + private String createNewContact(JSONObject contact, String accountType, String accountName) { + // Create a list of attributes to add to the contact database + ArrayList ops = new ArrayList(); + + //Add contact type + ops.add(ContentProviderOperation.newInsert(ContactsContract.RawContacts.CONTENT_URI) + .withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, accountType) + .withValue(ContactsContract.RawContacts.ACCOUNT_NAME, accountName) + .build()); + + // Add name + try { + JSONObject name = contact.optJSONObject("name"); + String displayName = contact.getString("displayName"); + if (displayName != null || name != null) { + ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI) + .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0) + .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE) + .withValue(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME, displayName) + .withValue(ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME, getJsonString(name, "familyName")) + .withValue(ContactsContract.CommonDataKinds.StructuredName.MIDDLE_NAME, getJsonString(name, "middleName")) + .withValue(ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME, getJsonString(name, "givenName")) + .withValue(ContactsContract.CommonDataKinds.StructuredName.PREFIX, getJsonString(name, "honorificPrefix")) + .withValue(ContactsContract.CommonDataKinds.StructuredName.SUFFIX, getJsonString(name, "honorificSuffix")) + .build()); + } + } catch (JSONException e) { + Log.d(LOG_TAG, "Could not get name object"); + } + + //Add phone numbers + JSONArray phones = null; + try { + phones = contact.getJSONArray("phoneNumbers"); + if (phones != null) { + for (int i = 0; i < phones.length(); i++) { + JSONObject phone = (JSONObject) phones.get(i); + insertPhone(ops, phone); + } + } + } catch (JSONException e) { + Log.d(LOG_TAG, "Could not get phone numbers"); + } + + // Add emails + JSONArray emails = null; + try { + emails = contact.getJSONArray("emails"); + if (emails != null) { + for (int i = 0; i < emails.length(); i++) { + JSONObject email = (JSONObject) emails.get(i); + insertEmail(ops, email); + } + } + } catch (JSONException e) { + Log.d(LOG_TAG, "Could not get emails"); + } + + // Add addresses + JSONArray addresses = null; + try { + addresses = contact.getJSONArray("addresses"); + if (addresses != null) { + for (int i = 0; i < addresses.length(); i++) { + JSONObject address = (JSONObject) addresses.get(i); + insertAddress(ops, address); + } + } + } catch (JSONException e) { + Log.d(LOG_TAG, "Could not get addresses"); + } + + // Add organizations + JSONArray organizations = null; + try { + organizations = contact.getJSONArray("organizations"); + if (organizations != null) { + for (int i = 0; i < organizations.length(); i++) { + JSONObject org = (JSONObject) organizations.get(i); + insertOrganization(ops, org); + } + } + } catch (JSONException e) { + Log.d(LOG_TAG, "Could not get organizations"); + } + + // Add IMs + JSONArray ims = null; + try { + ims = contact.getJSONArray("ims"); + if (ims != null) { + for (int i = 0; i < ims.length(); i++) { + JSONObject im = (JSONObject) ims.get(i); + insertIm(ops, im); + } + } + } catch (JSONException e) { + Log.d(LOG_TAG, "Could not get emails"); + } + + // Add note + String note = getJsonString(contact, "note"); + if (note != null) { + ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI) + .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0) + .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Note.CONTENT_ITEM_TYPE) + .withValue(ContactsContract.CommonDataKinds.Note.NOTE, note) + .build()); + } + + // Add nickname + String nickname = getJsonString(contact, "nickname"); + if (nickname != null) { + ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI) + .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0) + .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Nickname.CONTENT_ITEM_TYPE) + .withValue(ContactsContract.CommonDataKinds.Nickname.NAME, nickname) + .build()); + } + + // Add urls + JSONArray websites = null; + try { + websites = contact.getJSONArray("urls"); + if (websites != null) { + for (int i = 0; i < websites.length(); i++) { + JSONObject website = (JSONObject) websites.get(i); + insertWebsite(ops, website); + } + } + } catch (JSONException e) { + Log.d(LOG_TAG, "Could not get websites"); + } + + // Add birthday + String birthday = getJsonString(contact, "birthday"); + if (birthday != null) { + ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI) + .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0) + .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Event.CONTENT_ITEM_TYPE) + .withValue(ContactsContract.CommonDataKinds.Event.TYPE, ContactsContract.CommonDataKinds.Event.TYPE_BIRTHDAY) + .withValue(ContactsContract.CommonDataKinds.Event.START_DATE, birthday) + .build()); + } + + // Add photos + JSONArray photos = null; + try { + photos = contact.getJSONArray("photos"); + if (photos != null) { + for (int i = 0; i < photos.length(); i++) { + JSONObject photo = (JSONObject) photos.get(i); + insertPhoto(ops, photo); + } + } + } catch (JSONException e) { + Log.d(LOG_TAG, "Could not get photos"); + } + + String newId = null; + //Add contact + try { + ContentProviderResult[] cpResults = mApp.getActivity().getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops); + if (cpResults.length >= 0) { + newId = cpResults[0].uri.getLastPathSegment(); + } + } catch (RemoteException e) { + Log.e(LOG_TAG, e.getMessage(), e); + } catch (OperationApplicationException e) { + Log.e(LOG_TAG, e.getMessage(), e); + } + return newId; + } + + @Override + /** + * This method will remove a Contact from the database based on ID. + * @param id the unique ID of the contact to remove + */ + public boolean remove(String id) { + int result = 0; + Cursor cursor = mApp.getActivity().getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, + null, + ContactsContract.Contacts._ID + " = ?", + new String[] { id }, null); + if (cursor.getCount() == 1) { + cursor.moveToFirst(); + String lookupKey = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.LOOKUP_KEY)); + Uri uri = Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_LOOKUP_URI, lookupKey); + result = mApp.getActivity().getContentResolver().delete(uri, null, null); + } else { + Log.d(LOG_TAG, "Could not find contact with ID"); + } + + return (result > 0) ? true : false; + } + + /************************************************************************** + * + * All methods below this comment are used to convert from JavaScript + * text types to Android integer types and vice versa. + * + *************************************************************************/ + + /** + * Converts a string from the W3C Contact API to it's Android int value. + * @param string + * @return Android int value + */ + private int getPhoneType(String string) { + int type = ContactsContract.CommonDataKinds.Phone.TYPE_OTHER; + if (string != null) { + if ("home".equals(string.toLowerCase())) { + return ContactsContract.CommonDataKinds.Phone.TYPE_HOME; + } + else if ("mobile".equals(string.toLowerCase())) { + return ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE; + } + else if ("work".equals(string.toLowerCase())) { + return ContactsContract.CommonDataKinds.Phone.TYPE_WORK; + } + else if ("work fax".equals(string.toLowerCase())) { + return ContactsContract.CommonDataKinds.Phone.TYPE_FAX_WORK; + } + else if ("home fax".equals(string.toLowerCase())) { + return ContactsContract.CommonDataKinds.Phone.TYPE_FAX_HOME; + } + else if ("fax".equals(string.toLowerCase())) { + return ContactsContract.CommonDataKinds.Phone.TYPE_FAX_WORK; + } + else if ("pager".equals(string.toLowerCase())) { + return ContactsContract.CommonDataKinds.Phone.TYPE_PAGER; + } + else if ("other".equals(string.toLowerCase())) { + return ContactsContract.CommonDataKinds.Phone.TYPE_OTHER; + } + else if ("car".equals(string.toLowerCase())) { + return ContactsContract.CommonDataKinds.Phone.TYPE_CAR; + } + else if ("company main".equals(string.toLowerCase())) { + return ContactsContract.CommonDataKinds.Phone.TYPE_COMPANY_MAIN; + } + else if ("isdn".equals(string.toLowerCase())) { + return ContactsContract.CommonDataKinds.Phone.TYPE_ISDN; + } + else if ("main".equals(string.toLowerCase())) { + return ContactsContract.CommonDataKinds.Phone.TYPE_MAIN; + } + else if ("other fax".equals(string.toLowerCase())) { + return ContactsContract.CommonDataKinds.Phone.TYPE_OTHER_FAX; + } + else if ("radio".equals(string.toLowerCase())) { + return ContactsContract.CommonDataKinds.Phone.TYPE_RADIO; + } + else if ("telex".equals(string.toLowerCase())) { + return ContactsContract.CommonDataKinds.Phone.TYPE_TELEX; + } + else if ("work mobile".equals(string.toLowerCase())) { + return ContactsContract.CommonDataKinds.Phone.TYPE_WORK_MOBILE; + } + else if ("work pager".equals(string.toLowerCase())) { + return ContactsContract.CommonDataKinds.Phone.TYPE_WORK_PAGER; + } + else if ("assistant".equals(string.toLowerCase())) { + return ContactsContract.CommonDataKinds.Phone.TYPE_ASSISTANT; + } + else if ("mms".equals(string.toLowerCase())) { + return ContactsContract.CommonDataKinds.Phone.TYPE_MMS; + } + else if ("callback".equals(string.toLowerCase())) { + return ContactsContract.CommonDataKinds.Phone.TYPE_CALLBACK; + } + else if ("tty ttd".equals(string.toLowerCase())) { + return ContactsContract.CommonDataKinds.Phone.TYPE_TTY_TDD; + } + else if ("custom".equals(string.toLowerCase())) { + return ContactsContract.CommonDataKinds.Phone.TYPE_CUSTOM; + } + } + return type; + } + + /** + * getPhoneType converts an Android phone type into a string + * @param type + * @return phone type as string. + */ + private String getPhoneType(int type) { + String stringType; + switch (type) { + case ContactsContract.CommonDataKinds.Phone.TYPE_CUSTOM: + stringType = "custom"; + break; + case ContactsContract.CommonDataKinds.Phone.TYPE_FAX_HOME: + stringType = "home fax"; + break; + case ContactsContract.CommonDataKinds.Phone.TYPE_FAX_WORK: + stringType = "work fax"; + break; + case ContactsContract.CommonDataKinds.Phone.TYPE_HOME: + stringType = "home"; + break; + case ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE: + stringType = "mobile"; + break; + case ContactsContract.CommonDataKinds.Phone.TYPE_PAGER: + stringType = "pager"; + break; + case ContactsContract.CommonDataKinds.Phone.TYPE_WORK: + stringType = "work"; + break; + case ContactsContract.CommonDataKinds.Phone.TYPE_CALLBACK: + stringType = "callback"; + break; + case ContactsContract.CommonDataKinds.Phone.TYPE_CAR: + stringType = "car"; + break; + case ContactsContract.CommonDataKinds.Phone.TYPE_COMPANY_MAIN: + stringType = "company main"; + break; + case ContactsContract.CommonDataKinds.Phone.TYPE_OTHER_FAX: + stringType = "other fax"; + break; + case ContactsContract.CommonDataKinds.Phone.TYPE_RADIO: + stringType = "radio"; + break; + case ContactsContract.CommonDataKinds.Phone.TYPE_TELEX: + stringType = "telex"; + break; + case ContactsContract.CommonDataKinds.Phone.TYPE_TTY_TDD: + stringType = "tty tdd"; + break; + case ContactsContract.CommonDataKinds.Phone.TYPE_WORK_MOBILE: + stringType = "work mobile"; + break; + case ContactsContract.CommonDataKinds.Phone.TYPE_WORK_PAGER: + stringType = "work pager"; + break; + case ContactsContract.CommonDataKinds.Phone.TYPE_ASSISTANT: + stringType = "assistant"; + break; + case ContactsContract.CommonDataKinds.Phone.TYPE_MMS: + stringType = "mms"; + break; + case ContactsContract.CommonDataKinds.Phone.TYPE_ISDN: + stringType = "isdn"; + break; + case ContactsContract.CommonDataKinds.Phone.TYPE_OTHER: + default: + stringType = "other"; + break; + } + return stringType; + } + + /** + * Converts a string from the W3C Contact API to it's Android int value. + * @param string + * @return Android int value + */ + private int getContactType(String string) { + int type = ContactsContract.CommonDataKinds.Email.TYPE_OTHER; + if (string != null) { + if ("home".equals(string.toLowerCase())) { + return ContactsContract.CommonDataKinds.Email.TYPE_HOME; + } + else if ("work".equals(string.toLowerCase())) { + return ContactsContract.CommonDataKinds.Email.TYPE_WORK; + } + else if ("other".equals(string.toLowerCase())) { + return ContactsContract.CommonDataKinds.Email.TYPE_OTHER; + } + else if ("mobile".equals(string.toLowerCase())) { + return ContactsContract.CommonDataKinds.Email.TYPE_MOBILE; + } + else if ("custom".equals(string.toLowerCase())) { + return ContactsContract.CommonDataKinds.Email.TYPE_CUSTOM; + } + } + return type; + } + + /** + * getPhoneType converts an Android phone type into a string + * @param type + * @return phone type as string. + */ + private String getContactType(int type) { + String stringType; + switch (type) { + case ContactsContract.CommonDataKinds.Email.TYPE_CUSTOM: + stringType = "custom"; + break; + case ContactsContract.CommonDataKinds.Email.TYPE_HOME: + stringType = "home"; + break; + case ContactsContract.CommonDataKinds.Email.TYPE_WORK: + stringType = "work"; + break; + case ContactsContract.CommonDataKinds.Email.TYPE_MOBILE: + stringType = "mobile"; + break; + case ContactsContract.CommonDataKinds.Email.TYPE_OTHER: + default: + stringType = "other"; + break; + } + return stringType; + } + + /** + * Converts a string from the W3C Contact API to it's Android int value. + * @param string + * @return Android int value + */ + private int getOrgType(String string) { + int type = ContactsContract.CommonDataKinds.Organization.TYPE_OTHER; + if (string != null) { + if ("work".equals(string.toLowerCase())) { + return ContactsContract.CommonDataKinds.Organization.TYPE_WORK; + } + else if ("other".equals(string.toLowerCase())) { + return ContactsContract.CommonDataKinds.Organization.TYPE_OTHER; + } + else if ("custom".equals(string.toLowerCase())) { + return ContactsContract.CommonDataKinds.Organization.TYPE_CUSTOM; + } + } + return type; + } + + /** + * getPhoneType converts an Android phone type into a string + * @param type + * @return phone type as string. + */ + private String getOrgType(int type) { + String stringType; + switch (type) { + case ContactsContract.CommonDataKinds.Organization.TYPE_CUSTOM: + stringType = "custom"; + break; + case ContactsContract.CommonDataKinds.Organization.TYPE_WORK: + stringType = "work"; + break; + case ContactsContract.CommonDataKinds.Organization.TYPE_OTHER: + default: + stringType = "other"; + break; + } + return stringType; + } + + /** + * Converts a string from the W3C Contact API to it's Android int value. + * @param string + * @return Android int value + */ + private int getAddressType(String string) { + int type = ContactsContract.CommonDataKinds.StructuredPostal.TYPE_OTHER; + if (string != null) { + if ("work".equals(string.toLowerCase())) { + return ContactsContract.CommonDataKinds.StructuredPostal.TYPE_WORK; + } + else if ("other".equals(string.toLowerCase())) { + return ContactsContract.CommonDataKinds.StructuredPostal.TYPE_OTHER; + } + else if ("home".equals(string.toLowerCase())) { + return ContactsContract.CommonDataKinds.StructuredPostal.TYPE_HOME; + } + } + return type; + } + + /** + * getPhoneType converts an Android phone type into a string + * @param type + * @return phone type as string. + */ + private String getAddressType(int type) { + String stringType; + switch (type) { + case ContactsContract.CommonDataKinds.StructuredPostal.TYPE_HOME: + stringType = "home"; + break; + case ContactsContract.CommonDataKinds.StructuredPostal.TYPE_WORK: + stringType = "work"; + break; + case ContactsContract.CommonDataKinds.StructuredPostal.TYPE_OTHER: + default: + stringType = "other"; + break; + } + return stringType; + } + + /** + * Converts a string from the W3C Contact API to it's Android int value. + * @param string + * @return Android int value + */ + private int getImType(String string) { + int type = ContactsContract.CommonDataKinds.Im.PROTOCOL_CUSTOM; + if (string != null) { + if ("aim".equals(string.toLowerCase())) { + return ContactsContract.CommonDataKinds.Im.PROTOCOL_AIM; + } + else if ("google talk".equals(string.toLowerCase())) { + return ContactsContract.CommonDataKinds.Im.PROTOCOL_GOOGLE_TALK; + } + else if ("icq".equals(string.toLowerCase())) { + return ContactsContract.CommonDataKinds.Im.PROTOCOL_ICQ; + } + else if ("jabber".equals(string.toLowerCase())) { + return ContactsContract.CommonDataKinds.Im.PROTOCOL_JABBER; + } + else if ("msn".equals(string.toLowerCase())) { + return ContactsContract.CommonDataKinds.Im.PROTOCOL_MSN; + } + else if ("netmeeting".equals(string.toLowerCase())) { + return ContactsContract.CommonDataKinds.Im.PROTOCOL_NETMEETING; + } + else if ("qq".equals(string.toLowerCase())) { + return ContactsContract.CommonDataKinds.Im.PROTOCOL_QQ; + } + else if ("skype".equals(string.toLowerCase())) { + return ContactsContract.CommonDataKinds.Im.PROTOCOL_SKYPE; + } + else if ("yahoo".equals(string.toLowerCase())) { + return ContactsContract.CommonDataKinds.Im.PROTOCOL_YAHOO; + } + } + return type; + } + + /** + * getPhoneType converts an Android phone type into a string + * @param type + * @return phone type as string. + */ + @SuppressWarnings("unused") + private String getImType(int type) { + String stringType; + switch (type) { + case ContactsContract.CommonDataKinds.Im.PROTOCOL_AIM: + stringType = "AIM"; + break; + case ContactsContract.CommonDataKinds.Im.PROTOCOL_GOOGLE_TALK: + stringType = "Google Talk"; + break; + case ContactsContract.CommonDataKinds.Im.PROTOCOL_ICQ: + stringType = "ICQ"; + break; + case ContactsContract.CommonDataKinds.Im.PROTOCOL_JABBER: + stringType = "Jabber"; + break; + case ContactsContract.CommonDataKinds.Im.PROTOCOL_MSN: + stringType = "MSN"; + break; + case ContactsContract.CommonDataKinds.Im.PROTOCOL_NETMEETING: + stringType = "NetMeeting"; + break; + case ContactsContract.CommonDataKinds.Im.PROTOCOL_QQ: + stringType = "QQ"; + break; + case ContactsContract.CommonDataKinds.Im.PROTOCOL_SKYPE: + stringType = "Skype"; + break; + case ContactsContract.CommonDataKinds.Im.PROTOCOL_YAHOO: + stringType = "Yahoo"; + break; + default: + stringType = "custom"; + break; + } + return stringType; + } +} + diff --git a/cordova-lib/spec-plugman-install/plugins/Contacts/src/android/ContactManager.java b/cordova-lib/spec-plugman-install/plugins/Contacts/src/android/ContactManager.java new file mode 100755 index 000000000..1c086e1f3 --- /dev/null +++ b/cordova-lib/spec-plugman-install/plugins/Contacts/src/android/ContactManager.java @@ -0,0 +1,122 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ +package org.apache.cordova.core; + +import org.apache.cordova.CallbackContext; +import org.apache.cordova.CordovaPlugin; +import org.apache.cordova.PluginResult; +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; +import android.util.Log; + +public class ContactManager extends CordovaPlugin { + + private ContactAccessor contactAccessor; + private static final String LOG_TAG = "Contact Query"; + + public static final int UNKNOWN_ERROR = 0; + public static final int INVALID_ARGUMENT_ERROR = 1; + public static final int TIMEOUT_ERROR = 2; + public static final int PENDING_OPERATION_ERROR = 3; + public static final int IO_ERROR = 4; + public static final int NOT_SUPPORTED_ERROR = 5; + public static final int PERMISSION_DENIED_ERROR = 20; + + /** + * Constructor. + */ + public ContactManager() { + } + + /** + * Executes the request and returns PluginResult. + * + * @param action The action to execute. + * @param args JSONArray of arguments for the plugin. + * @param callbackContext The callback context used when calling back into JavaScript. + * @return True if the action was valid, false otherwise. + */ + public boolean execute(String action, JSONArray args, final CallbackContext callbackContext) throws JSONException { + /** + * Check to see if we are on an Android 1.X device. If we are return an error as we + * do not support this as of Cordova 1.0. + */ + if (android.os.Build.VERSION.RELEASE.startsWith("1.")) { + callbackContext.sendPluginResult(new PluginResult(PluginResult.Status.ERROR, ContactManager.NOT_SUPPORTED_ERROR)); + return true; + } + + /** + * Only create the contactAccessor after we check the Android version or the program will crash + * older phones. + */ + if (this.contactAccessor == null) { + this.contactAccessor = new ContactAccessorSdk5(this.webView, this.cordova); + } + + if (action.equals("search")) { + final JSONArray filter = args.getJSONArray(0); + final JSONObject options = args.getJSONObject(1); + this.cordova.getThreadPool().execute(new Runnable() { + public void run() { + JSONArray res = contactAccessor.search(filter, options); + callbackContext.success(res); + } + }); + } + else if (action.equals("save")) { + final JSONObject contact = args.getJSONObject(0); + this.cordova.getThreadPool().execute(new Runnable() { + public void run() { + JSONObject res = null; + String id = contactAccessor.save(contact); + if (id != null) { + try { + res = contactAccessor.getContactById(id); + } catch (JSONException e) { + Log.e(LOG_TAG, "JSON fail.", e); + } + } + if (res != null) { + callbackContext.success(res); + } else { + callbackContext.sendPluginResult(new PluginResult(PluginResult.Status.ERROR, UNKNOWN_ERROR)); + } + } + }); + } + else if (action.equals("remove")) { + final String contactId = args.getString(0); + this.cordova.getThreadPool().execute(new Runnable() { + public void run() { + if (contactAccessor.remove(contactId)) { + callbackContext.success(); + } else { + callbackContext.sendPluginResult(new PluginResult(PluginResult.Status.ERROR, UNKNOWN_ERROR)); + } + } + }); + } + else { + return false; + } + return true; + } +} diff --git a/cordova-lib/spec-plugman-install/plugins/Contacts/src/blackberry10/ContactActivity.js b/cordova-lib/spec-plugman-install/plugins/Contacts/src/blackberry10/ContactActivity.js new file mode 100644 index 000000000..f0f82b362 --- /dev/null +++ b/cordova-lib/spec-plugman-install/plugins/Contacts/src/blackberry10/ContactActivity.js @@ -0,0 +1,26 @@ +/* + * Copyright 2012 Research In Motion Limited. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +var ContactActivity = function (args) { + this.direction = args.direction || null; + this.description = args.description || ""; + this.mimeType = args.mimeType || ""; + this.timestamp = new Date(parseInt(args.timestamp, 10)) || null; +}; + +Object.defineProperty(ContactActivity, "INCOMING", {"value": true}); +Object.defineProperty(ContactActivity, "OUTGOING", {"value": false}); + +module.exports = ContactActivity; diff --git a/cordova-lib/spec-plugman-install/plugins/Contacts/src/blackberry10/ContactAddress.js b/cordova-lib/spec-plugman-install/plugins/Contacts/src/blackberry10/ContactAddress.js new file mode 100644 index 000000000..1ba9fe40a --- /dev/null +++ b/cordova-lib/spec-plugman-install/plugins/Contacts/src/blackberry10/ContactAddress.js @@ -0,0 +1,30 @@ +/* + * Copyright 2012 Research In Motion Limited. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +var ContactAddress = function (properties) { + this.type = properties && properties.type ? properties.type : ""; + this.streetAddress = properties && properties.streetAddress ? properties.streetAddress : ""; + this.streetOther = properties && properties.streetOther ? properties.streetOther : ""; + this.locality = properties && properties.locality ? properties.locality : ""; + this.region = properties && properties.region ? properties.region : ""; + this.postalCode = properties && properties.postalCode ? properties.postalCode : ""; + this.country = properties && properties.country ? properties.country : ""; +}; + +Object.defineProperty(ContactAddress, "HOME", {"value": "home"}); +Object.defineProperty(ContactAddress, "WORK", {"value": "work"}); +Object.defineProperty(ContactAddress, "OTHER", {"value": "other"}); + +module.exports = ContactAddress; diff --git a/cordova-lib/spec-plugman-install/plugins/Contacts/src/blackberry10/ContactError.js b/cordova-lib/spec-plugman-install/plugins/Contacts/src/blackberry10/ContactError.js new file mode 100644 index 000000000..f20f85e45 --- /dev/null +++ b/cordova-lib/spec-plugman-install/plugins/Contacts/src/blackberry10/ContactError.js @@ -0,0 +1,30 @@ +/* + * Copyright 2012 Research In Motion Limited. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +var ContactError = function (code, msg) { + this.code = code; + this.message = msg; +}; + +Object.defineProperty(ContactError, "UNKNOWN_ERROR", { "value": 0 }); +Object.defineProperty(ContactError, "INVALID_ARGUMENT_ERROR", { "value": 1 }); +Object.defineProperty(ContactError, "TIMEOUT_ERROR", { "value": 2 }); +Object.defineProperty(ContactError, "PENDING_OPERATION_ERROR", { "value": 3 }); +Object.defineProperty(ContactError, "IO_ERROR", { "value": 4 }); +Object.defineProperty(ContactError, "NOT_SUPPORTED_ERROR", { "value": 5 }); +Object.defineProperty(ContactError, "PERMISSION_DENIED_ERROR", { "value": 20 }); + +module.exports = ContactError; + diff --git a/cordova-lib/spec-plugman-install/plugins/Contacts/src/blackberry10/ContactField.js b/cordova-lib/spec-plugman-install/plugins/Contacts/src/blackberry10/ContactField.js new file mode 100644 index 000000000..aad735c14 --- /dev/null +++ b/cordova-lib/spec-plugman-install/plugins/Contacts/src/blackberry10/ContactField.js @@ -0,0 +1,27 @@ +/* + * Copyright 2012 Research In Motion Limited. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +var ContactField = function (type, value) { + this.type = type || ""; + this.value = value || ""; +}; + +Object.defineProperty(ContactField, "HOME", {"value": "home"}); +Object.defineProperty(ContactField, "WORK", {"value": "work"}); +Object.defineProperty(ContactField, "OTHER", {"value": "other"}); +Object.defineProperty(ContactField, "MOBILE", {"value": "mobile"}); +Object.defineProperty(ContactField, "DIRECT", {"value": "direct"}); + +module.exports = ContactField; diff --git a/cordova-lib/spec-plugman-install/plugins/Contacts/src/blackberry10/ContactFindOptions.js b/cordova-lib/spec-plugman-install/plugins/Contacts/src/blackberry10/ContactFindOptions.js new file mode 100644 index 000000000..8be830ddf --- /dev/null +++ b/cordova-lib/spec-plugman-install/plugins/Contacts/src/blackberry10/ContactFindOptions.js @@ -0,0 +1,50 @@ +/* + * Copyright 2012 Research In Motion Limited. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * ContactFindOptions. + * @constructor + * @param filter search fields + * @param sort sort fields and order + * @param limit max number of contacts to return + * @param favorite if set, only favorite contacts will be returned + */ + +var ContactFindOptions = function (filter, sort, limit, favorite) { + this.filter = filter || null; + this.sort = sort || null; + this.limit = limit || -1; // -1 for returning all results + this.favorite = favorite || false; + this.includeAccounts = []; + this.excludeAccounts = []; +}; + +Object.defineProperty(ContactFindOptions, "SEARCH_FIELD_GIVEN_NAME", { "value": 0 }); +Object.defineProperty(ContactFindOptions, "SEARCH_FIELD_FAMILY_NAME", { "value": 1 }); +Object.defineProperty(ContactFindOptions, "SEARCH_FIELD_ORGANIZATION_NAME", { "value": 2 }); +Object.defineProperty(ContactFindOptions, "SEARCH_FIELD_PHONE", { "value": 3 }); +Object.defineProperty(ContactFindOptions, "SEARCH_FIELD_EMAIL", { "value": 4 }); +Object.defineProperty(ContactFindOptions, "SEARCH_FIELD_BBMPIN", { "value": 5 }); +Object.defineProperty(ContactFindOptions, "SEARCH_FIELD_LINKEDIN", { "value": 6 }); +Object.defineProperty(ContactFindOptions, "SEARCH_FIELD_TWITTER", { "value": 7 }); +Object.defineProperty(ContactFindOptions, "SEARCH_FIELD_VIDEO_CHAT", { "value": 8 }); + +Object.defineProperty(ContactFindOptions, "SORT_FIELD_GIVEN_NAME", { "value": 0 }); +Object.defineProperty(ContactFindOptions, "SORT_FIELD_FAMILY_NAME", { "value": 1 }); +Object.defineProperty(ContactFindOptions, "SORT_FIELD_ORGANIZATION_NAME", { "value": 2 }); + +module.exports = ContactFindOptions; + diff --git a/cordova-lib/spec-plugman-install/plugins/Contacts/src/blackberry10/ContactName.js b/cordova-lib/spec-plugman-install/plugins/Contacts/src/blackberry10/ContactName.js new file mode 100644 index 000000000..9b7475347 --- /dev/null +++ b/cordova-lib/spec-plugman-install/plugins/Contacts/src/blackberry10/ContactName.js @@ -0,0 +1,39 @@ +/* + * Copyright 2012 Research In Motion Limited. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +function toFormattedName(properties) { + var formatted = ""; + if (properties && properties.givenName) { + formatted = properties.givenName; + if (properties && properties.familyName) { + formatted += " " + properties.familyName; + } + } + return formatted; +} + +var ContactName = function (properties) { + this.familyName = properties && properties.familyName ? properties.familyName : ""; + this.givenName = properties && properties.givenName ? properties.givenName : ""; + this.formatted = toFormattedName(properties); + this.middleName = properties && properties.middleName ? properties.middleName : ""; + this.honorificPrefix = properties && properties.honorificPrefix ? properties.honorificPrefix : ""; + this.honorificSuffix = properties && properties.honorificSuffix ? properties.honorificSuffix : ""; + this.phoneticFamilyName = properties && properties.phoneticFamilyName ? properties.phoneticFamilyName : ""; + this.phoneticGivenName = properties && properties.phoneticGivenName ? properties.phoneticGivenName : ""; +}; + +module.exports = ContactName; diff --git a/cordova-lib/spec-plugman-install/plugins/Contacts/src/blackberry10/ContactNews.js b/cordova-lib/spec-plugman-install/plugins/Contacts/src/blackberry10/ContactNews.js new file mode 100644 index 000000000..9fb86dcda --- /dev/null +++ b/cordova-lib/spec-plugman-install/plugins/Contacts/src/blackberry10/ContactNews.js @@ -0,0 +1,26 @@ +/* + * Copyright 2012 Research In Motion Limited. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +var ContactNews = function (args) { + this.title = args.title || ""; + this.body = args.body || ""; + this.articleSource = args.articleSource || ""; + this.companies = args.companies || []; + this.publishedAt = new Date(parseInt(args.publishedAt, 10)) || null; + this.uri = args.uri || ""; + this.type = args.type || ""; +}; + +module.exports = ContactNews; diff --git a/cordova-lib/spec-plugman-install/plugins/Contacts/src/blackberry10/ContactOrganization.js b/cordova-lib/spec-plugman-install/plugins/Contacts/src/blackberry10/ContactOrganization.js new file mode 100644 index 000000000..987310f7c --- /dev/null +++ b/cordova-lib/spec-plugman-install/plugins/Contacts/src/blackberry10/ContactOrganization.js @@ -0,0 +1,22 @@ +/* + * Copyright 2012 Research In Motion Limited. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +var ContactOrganization = function (properties) { + this.name = properties && properties.name ? properties.name : ""; + this.department = properties && properties.department ? properties.department : ""; + this.title = properties && properties.title ? properties.title : ""; +}; + +module.exports = ContactOrganization; diff --git a/cordova-lib/spec-plugman-install/plugins/Contacts/src/blackberry10/ContactPhoto.js b/cordova-lib/spec-plugman-install/plugins/Contacts/src/blackberry10/ContactPhoto.js new file mode 100644 index 000000000..eeaa2632e --- /dev/null +++ b/cordova-lib/spec-plugman-install/plugins/Contacts/src/blackberry10/ContactPhoto.js @@ -0,0 +1,23 @@ +/* + * Copyright 2012 Research In Motion Limited. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +var ContactPhoto = function (originalFilePath, pref) { + this.originalFilePath = originalFilePath || ""; + this.pref = pref || false; + this.largeFilePath = ""; + this.smallFilePath = ""; +}; + +module.exports = ContactPhoto; diff --git a/cordova-lib/spec-plugman-install/plugins/Contacts/src/blackberry10/contactConsts.js b/cordova-lib/spec-plugman-install/plugins/Contacts/src/blackberry10/contactConsts.js new file mode 100644 index 000000000..ef2520620 --- /dev/null +++ b/cordova-lib/spec-plugman-install/plugins/Contacts/src/blackberry10/contactConsts.js @@ -0,0 +1,225 @@ +/* +* Copyright 2012 Research In Motion Limited. +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + +var ATTRIBUTE_KIND, + ATTRIBUTE_SUBKIND, + kindAttributeMap = {}, + subKindAttributeMap = {}, + _TITLE = 26, + _START_DATE = 43, + _END_DATE = 44; + +function populateKindAttributeMap() { + ATTRIBUTE_KIND = { + Invalid: 0, + Phone: 1, + Fax: 2, + Pager: 3, + Email: 4, + Website: 5, + Feed: 6, + Profile: 7, + Family: 8, + Person: 9, + Date: 10, + Group: 11, + Name: 12, + StockSymbol: 13, + Ranking: 14, + OrganizationAffiliation: 15, + Education: 16, + Note: 17, + InstantMessaging: 18, + VideoChat: 19, + ConnectionCount: 20, + Hidden: 21, + Biography: 22, + Sound: 23, + Notification: 24, + MessageSound: 25, + MessageNotification: 26 + }; + + kindAttributeMap[ATTRIBUTE_KIND.Phone] = "phoneNumbers"; + kindAttributeMap[ATTRIBUTE_KIND.Fax] = "faxNumbers"; + kindAttributeMap[ATTRIBUTE_KIND.Pager] = "pagerNumber"; + kindAttributeMap[ATTRIBUTE_KIND.Email] = "emails"; + kindAttributeMap[ATTRIBUTE_KIND.Website] = "urls"; + kindAttributeMap[ATTRIBUTE_KIND.Profile] = "socialNetworks"; + kindAttributeMap[ATTRIBUTE_KIND.OrganizationAffiliation] = "organizations"; + kindAttributeMap[ATTRIBUTE_KIND.Education] = "education"; + kindAttributeMap[ATTRIBUTE_KIND.Note] = "note"; + kindAttributeMap[ATTRIBUTE_KIND.InstantMessaging] = "ims"; + kindAttributeMap[ATTRIBUTE_KIND.VideoChat] = "videoChat"; + kindAttributeMap[ATTRIBUTE_KIND.Sound] = "ringtone"; +} + +function populateSubKindAttributeMap() { + ATTRIBUTE_SUBKIND = { + Invalid: 0, + Other: 1, + Home: 2, + Work: 3, + PhoneMobile: 4, + FaxDirect: 5, + Blog: 6, + WebsiteResume: 7, + WebsitePortfolio: 8, + WebsitePersonal: 9, + WebsiteCompany: 10, + ProfileFacebook: 11, + ProfileTwitter: 12, + ProfileLinkedIn: 13, + ProfileGist: 14, + ProfileTungle: 15, + FamilySpouse: 16, + FamilyChild: 17, + FamilyParent: 18, + PersonManager: 19, + PersonAssistant: 20, + DateBirthday: 21, + DateAnniversary: 22, + GroupDepartment: 23, + NameGiven: 24, + NameSurname: 25, + Title: _TITLE, + NameSuffix: 27, + NameMiddle: 28, + NameNickname: 29, + NameAlias: 30, + NameDisplayName: 31, + NamePhoneticGiven: 32, + NamePhoneticSurname: 33, + StockSymbolNyse: 34, + StockSymbolNasdaq: 35, + StockSymbolTse: 36, + StockSymbolLse: 37, + StockSymbolTsx: 38, + RankingKlout: 39, + RankingTrstRank: 40, + OrganizationAffiliationName: 41, + OrganizationAffiliationPhoneticName: 42, + OrganizationAffiliationTitle: _TITLE, + StartDate: _START_DATE, + EndDate: _END_DATE, + OrganizationAffiliationDetails: 45, + EducationInstitutionName: 46, + EducationStartDate: _START_DATE, + EducationEndDate: _END_DATE, + EducationDegree: 47, + EducationConcentration: 48, + EducationActivities: 49, + EducationNotes: 50, + InstantMessagingBbmPin: 51, + InstantMessagingAim: 52, + InstantMessagingAliwangwang: 53, + InstantMessagingGoogleTalk: 54, + InstantMessagingSametime: 55, + InstantMessagingIcq: 56, + InstantMessagingIrc: 57, + InstantMessagingJabber: 58, + InstantMessagingMsLcs: 59, + InstantMessagingMsn: 60, + InstantMessagingQq: 61, + InstantMessagingSkype: 62, + InstantMessagingYahooMessenger: 63, + InstantMessagingYahooMessengerJapan: 64, + VideoChatBbPlaybook: 65, + HiddenLinkedIn: 66, + HiddenFacebook: 67, + HiddenTwitter: 68, + ConnectionCountLinkedIn: 69, + ConnectionCountFacebook: 70, + ConnectionCountTwitter: 71, + HiddenChecksum: 72, + HiddenSpeedDial: 73, + BiographyFacebook: 74, + BiographyTwitter: 75, + BiographyLinkedIn: 76, + SoundRingtone: 77, + SimContactType: 78, + EcoID: 79, + Personal: 80, + StockSymbolAll: 81, + NotificationVibration: 82, + NotificationLED: 83, + MessageNotificationVibration: 84, + MessageNotificationLED: 85, + MessageNotificationDuringCall: 86, + VideoChatPin: 87 + }; + + subKindAttributeMap[ATTRIBUTE_SUBKIND.Other] = "other"; + subKindAttributeMap[ATTRIBUTE_SUBKIND.Home] = "home"; + subKindAttributeMap[ATTRIBUTE_SUBKIND.Work] = "work"; + subKindAttributeMap[ATTRIBUTE_SUBKIND.PhoneMobile] = "mobile"; + subKindAttributeMap[ATTRIBUTE_SUBKIND.FaxDirect] = "direct"; + subKindAttributeMap[ATTRIBUTE_SUBKIND.Blog] = "blog"; + subKindAttributeMap[ATTRIBUTE_SUBKIND.WebsiteResume] = "resume"; + subKindAttributeMap[ATTRIBUTE_SUBKIND.WebsitePortfolio] = "portfolio"; + subKindAttributeMap[ATTRIBUTE_SUBKIND.WebsitePersonal] = "personal"; + subKindAttributeMap[ATTRIBUTE_SUBKIND.WebsiteCompany] = "company"; + subKindAttributeMap[ATTRIBUTE_SUBKIND.ProfileFacebook] = "facebook"; + subKindAttributeMap[ATTRIBUTE_SUBKIND.ProfileTwitter] = "twitter"; + subKindAttributeMap[ATTRIBUTE_SUBKIND.ProfileLinkedIn] = "linkedin"; + subKindAttributeMap[ATTRIBUTE_SUBKIND.ProfileGist] = "gist"; + subKindAttributeMap[ATTRIBUTE_SUBKIND.ProfileTungle] = "tungle"; + subKindAttributeMap[ATTRIBUTE_SUBKIND.DateBirthday] = "birthday"; + subKindAttributeMap[ATTRIBUTE_SUBKIND.DateAnniversary] = "anniversary"; + subKindAttributeMap[ATTRIBUTE_SUBKIND.NameGiven] = "givenName"; + subKindAttributeMap[ATTRIBUTE_SUBKIND.NameSurname] = "familyName"; + subKindAttributeMap[ATTRIBUTE_SUBKIND.Title] = "honorificPrefix"; + subKindAttributeMap[ATTRIBUTE_SUBKIND.NameSuffix] = "honorificSuffix"; + subKindAttributeMap[ATTRIBUTE_SUBKIND.NameMiddle] = "middleName"; + subKindAttributeMap[ATTRIBUTE_SUBKIND.NamePhoneticGiven] = "phoneticGivenName"; + subKindAttributeMap[ATTRIBUTE_SUBKIND.NamePhoneticSurname] = "phoneticFamilyName"; + subKindAttributeMap[ATTRIBUTE_SUBKIND.NameNickname] = "nickname"; + subKindAttributeMap[ATTRIBUTE_SUBKIND.NameDisplayName] = "displayName"; + subKindAttributeMap[ATTRIBUTE_SUBKIND.OrganizationAffiliationName] = "name"; + subKindAttributeMap[ATTRIBUTE_SUBKIND.OrganizationAffiliationDetails] = "department"; + subKindAttributeMap[ATTRIBUTE_SUBKIND.Title] = "title"; + subKindAttributeMap[ATTRIBUTE_SUBKIND.InstantMessagingBbmPin] = "BbmPin"; + subKindAttributeMap[ATTRIBUTE_SUBKIND.InstantMessagingAim] = "Aim"; + subKindAttributeMap[ATTRIBUTE_SUBKIND.InstantMessagingAliwangwang] = "Aliwangwang"; + subKindAttributeMap[ATTRIBUTE_SUBKIND.InstantMessagingGoogleTalk] = "GoogleTalk"; + subKindAttributeMap[ATTRIBUTE_SUBKIND.InstantMessagingSametime] = "Sametime"; + subKindAttributeMap[ATTRIBUTE_SUBKIND.InstantMessagingIcq] = "Icq"; + subKindAttributeMap[ATTRIBUTE_SUBKIND.InstantMessagingJabber] = "Jabber"; + subKindAttributeMap[ATTRIBUTE_SUBKIND.InstantMessagingMsLcs] = "MsLcs"; + subKindAttributeMap[ATTRIBUTE_SUBKIND.InstantMessagingSkype] = "Skype"; + subKindAttributeMap[ATTRIBUTE_SUBKIND.InstantMessagingYahooMessenger] = "YahooMessenger"; + subKindAttributeMap[ATTRIBUTE_SUBKIND.InstantMessagingYahooMessengerJapan] = "YahooMessegerJapan"; + subKindAttributeMap[ATTRIBUTE_SUBKIND.VideoChatBbPlaybook] = "BbPlaybook"; + subKindAttributeMap[ATTRIBUTE_SUBKIND.SoundRingtone] = "ringtone"; + subKindAttributeMap[ATTRIBUTE_SUBKIND.Personal] = "personal"; +} + +module.exports = { + getKindAttributeMap: function () { + if (!ATTRIBUTE_KIND) { + populateKindAttributeMap(); + } + + return kindAttributeMap; + }, + getSubKindAttributeMap: function () { + if (!ATTRIBUTE_SUBKIND) { + populateSubKindAttributeMap(); + } + + return subKindAttributeMap; + } +}; diff --git a/cordova-lib/spec-plugman-install/plugins/Contacts/src/blackberry10/contactUtils.js b/cordova-lib/spec-plugman-install/plugins/Contacts/src/blackberry10/contactUtils.js new file mode 100644 index 000000000..cd022c4fa --- /dev/null +++ b/cordova-lib/spec-plugman-install/plugins/Contacts/src/blackberry10/contactUtils.js @@ -0,0 +1,223 @@ +/* + * Copyright 2012 Research In Motion Limited. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +var self, + ContactFindOptions = require("./ContactFindOptions"), + ContactError = require("./ContactError"), + ContactName = require("./ContactName"), + ContactOrganization = require("./ContactOrganization"), + ContactAddress = require("./ContactAddress"), + ContactField = require("./ContactField"), + contactConsts = require("./contactConsts"), + ContactPhoto = require("./ContactPhoto"), + ContactNews = require("./ContactNews"), + ContactActivity = require("./ContactActivity"); + +function populateFieldArray(contactProps, field, ClassName) { + if (contactProps[field]) { + var list = [], + obj; + + contactProps[field].forEach(function (args) { + if (ClassName === ContactField) { + list.push(new ClassName(args.type, args.value)); + } else if (ClassName === ContactPhoto) { + obj = new ContactPhoto(args.originalFilePath, args.pref); + obj.largeFilePath = args.largeFilePath; + obj.smallFilePath = args.smallFilePath; + list.push(obj); + } else if (ClassName === ContactNews) { + obj = new ContactNews(args); + list.push(obj); + } else if (ClassName === ContactActivity) { + obj = new ContactActivity(args); + list.push(obj); + } else { + list.push(new ClassName(args)); + } + }); + contactProps[field] = list; + } +} + +function populateDate(contactProps, field) { + if (contactProps[field]) { + contactProps[field] = new Date(contactProps[field]); + } +} + +function validateFindArguments(findOptions) { + var error = false; + + // findOptions is mandatory + if (!findOptions) { + error = true; + } else { + // findOptions.filter is optional + if (findOptions.filter) { + findOptions.filter.forEach(function (f) { + switch (f.fieldName) { + case ContactFindOptions.SEARCH_FIELD_GIVEN_NAME: + case ContactFindOptions.SEARCH_FIELD_FAMILY_NAME: + case ContactFindOptions.SEARCH_FIELD_ORGANIZATION_NAME: + case ContactFindOptions.SEARCH_FIELD_PHONE: + case ContactFindOptions.SEARCH_FIELD_EMAIL: + case ContactFindOptions.SEARCH_FIELD_BBMPIN: + case ContactFindOptions.SEARCH_FIELD_LINKEDIN: + case ContactFindOptions.SEARCH_FIELD_TWITTER: + case ContactFindOptions.SEARCH_FIELD_VIDEO_CHAT: + break; + default: + error = true; + } + + if (!f.fieldValue) { + error = true; + } + }); + } + + //findOptions.limit is optional + if (findOptions.limit) { + if (typeof findOptions.limit !== "number") { + error = true; + } + } + + //findOptions.favorite is optional + if (findOptions.favorite) { + if (typeof findOptions.favorite !== "boolean") { + error = true; + } + } + + // findOptions.sort is optional + if (!error && findOptions.sort && Array.isArray(findOptions.sort)) { + findOptions.sort.forEach(function (s) { + switch (s.fieldName) { + case ContactFindOptions.SORT_FIELD_GIVEN_NAME: + case ContactFindOptions.SORT_FIELD_FAMILY_NAME: + case ContactFindOptions.SORT_FIELD_ORGANIZATION_NAME: + break; + default: + error = true; + } + + if (s.desc === undefined || typeof s.desc !== "boolean") { + error = true; + } + }); + } + + if (!error && findOptions.includeAccounts) { + if (!Array.isArray(findOptions.includeAccounts)) { + error = true; + } else { + findOptions.includeAccounts.forEach(function (acct) { + if (!error && (!acct.id || window.isNaN(window.parseInt(acct.id, 10)))) { + error = true; + } + }); + } + } + + if (!error && findOptions.excludeAccounts) { + if (!Array.isArray(findOptions.excludeAccounts)) { + error = true; + } else { + findOptions.excludeAccounts.forEach(function (acct) { + if (!error && (!acct.id || window.isNaN(window.parseInt(acct.id, 10)))) { + error = true; + } + }); + } + } + } + return !error; +} + +function validateContactsPickerFilter(filter) { + var isValid = true, + availableFields = {}; + + if (typeof(filter) === "undefined") { + isValid = false; + } else { + if (filter && Array.isArray(filter)) { + availableFields = contactConsts.getKindAttributeMap(); + filter.forEach(function (e) { + isValid = isValid && Object.getOwnPropertyNames(availableFields).reduce( + function (found, key) { + return found || availableFields[key] === e; + }, false); + }); + } + } + + return isValid; +} + +function validateContactsPickerOptions(options) { + var isValid = false, + mode = options.mode; + + if (typeof(options) === "undefined") { + isValid = false; + } else { + isValid = mode === ContactPickerOptions.MODE_SINGLE || mode === ContactPickerOptions.MODE_MULTIPLE || mode === ContactPickerOptions.MODE_ATTRIBUTE; + + // if mode is attribute, fields must be defined + if (mode === ContactPickerOptions.MODE_ATTRIBUTE && !validateContactsPickerFilter(options.fields)) { + isValid = false; + } + } + + return isValid; +} + +self = module.exports = { + populateContact: function (contact) { + if (contact.name) { + contact.name = new ContactName(contact.name); + } + + populateFieldArray(contact, "addresses", ContactAddress); + populateFieldArray(contact, "organizations", ContactOrganization); + populateFieldArray(contact, "emails", ContactField); + populateFieldArray(contact, "phoneNumbers", ContactField); + populateFieldArray(contact, "faxNumbers", ContactField); + populateFieldArray(contact, "pagerNumbers", ContactField); + populateFieldArray(contact, "ims", ContactField); + populateFieldArray(contact, "socialNetworks", ContactField); + populateFieldArray(contact, "urls", ContactField); + populateFieldArray(contact, "photos", ContactPhoto); + populateFieldArray(contact, "news", ContactNews); + populateFieldArray(contact, "activities", ContactActivity); + // TODO categories + + populateDate(contact, "birthday"); + populateDate(contact, "anniversary"); + }, + invokeErrorCallback: function (errorCallback, code) { + if (errorCallback) { + errorCallback(new ContactError(code)); + } + }, + validateFindArguments: validateFindArguments, + validateContactsPickerFilter: validateContactsPickerFilter, + validateContactsPickerOptions: validateContactsPickerOptions +}; + diff --git a/cordova-lib/spec-plugman-install/plugins/Contacts/src/blackberry10/index.js b/cordova-lib/spec-plugman-install/plugins/Contacts/src/blackberry10/index.js new file mode 100644 index 000000000..09a4bd2a5 --- /dev/null +++ b/cordova-lib/spec-plugman-install/plugins/Contacts/src/blackberry10/index.js @@ -0,0 +1,374 @@ +/* + * Copyright 2013 Research In Motion Limited. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +var pimContacts, + contactUtils = require("./contactUtils"), + contactConsts = require("./contactConsts"), + ContactError = require("./ContactError"), + ContactName = require("./ContactName"), + ContactFindOptions = require("./ContactFindOptions"), + noop = function () {}; + +function getAccountFilters(options) { + if (options.includeAccounts) { + options.includeAccounts = options.includeAccounts.map(function (acct) { + return acct.id.toString(); + }); + } + + if (options.excludeAccounts) { + options.excludeAccounts = options.excludeAccounts.map(function (acct) { + return acct.id.toString(); + }); + } +} + +function populateSearchFields(fields) { + var i, + l, + key, + searchFieldsObject = {}, + searchFields = []; + + for (i = 0, l = fields.length; i < l; i++) { + if (fields[i] === "*") { + searchFieldsObject[ContactFindOptions.SEARCH_FIELD_GIVEN_NAME] = true; + searchFieldsObject[ContactFindOptions.SEARCH_FIELD_FAMILY_NAME] = true; + searchFieldsObject[ContactFindOptions.SEARCH_FIELD_PHONE] = true; + searchFieldsObject[ContactFindOptions.SEARCH_FIELD_EMAIL] = true; + searchFieldsObject[ContactFindOptions.SEARCH_FIELD_ORGANIZATION_NAME] = true; + } else if (fields[i] === "displayName" || fields[i] === "name") { + searchFieldsObject[ContactFindOptions.SEARCH_FIELD_GIVEN_NAME] = true; + searchFieldsObject[ContactFindOptions.SEARCH_FIELD_FAMILY_NAME] = true; + } else if (fields[i] === "nickname") { + // not supported by Cascades + } else if (fields[i] === "phoneNumbers") { + searchFieldsObject[ContactFindOptions.SEARCH_FIELD_PHONE] = true; + } else if (fields[i] === "emails") { + searchFieldsObject[ContactFindOptions.SEARCH_FIELD_EMAIL] = true; + } else if (field === "addresses") { + // not supported by Cascades + } else if (field === "ims") { + // not supported by Cascades + } else if (field === "organizations") { + searchFieldsObject[ContactFindOptions.SEARCH_FIELD_ORGANIZATION_NAME] = true; + } else if (field === "birthday") { + // not supported by Cascades + } else if (field === "note") { + // not supported by Cascades + } else if (field === "photos") { + // not supported by Cascades + } else if (field === "categories") { + // not supported by Cascades + } else if (field === "urls") { + // not supported by Cascades + } + } + + for (key in searchFieldsObject) { + if (searchFieldsObject.hasOwnProperty(key)) { + searchFields.push(window.parseInt(key)); + } + } + + return searchFields; +} + +function convertBirthday(birthday) { + //Convert date string from native to milliseconds since epoch for cordova-js + var birthdayInfo; + if (birthday) { + birthdayInfo = birthday.split("-"); + return new Date(birthdayInfo[0], birthdayInfo[1] - 1, birthdayInfo[2]).getTime(); + } else { + return null; + } +} + +function processJnextSaveData(result, JnextData) { + var data = JnextData, + birthdayInfo; + + if (data._success === true) { + data.birthday = convertBirthday(data.birthday); + result.callbackOk(data, false); + } else { + result.callbackError(data.code, false); + } +} + +function processJnextRemoveData(result, JnextData) { + var data = JnextData; + + if (data._success === true) { + result.callbackOk(data); + } else { + result.callbackError(ContactError.UNKNOWN_ERROR, false); + } +} + +function processJnextFindData(eventId, eventHandler, JnextData) { + var data = JnextData, + i, + l, + more = false, + resultsObject = {}, + birthdayInfo; + + if (data.contacts) { + for (i = 0, l = data.contacts.length; i < l; i++) { + data.contacts[i].birthday = convertBirthday(data.contacts[i].birthday); + data.contacts[i].name = new ContactName(data.contacts[i].name); + } + } else { + data.contacts = []; // if JnextData.contacts return null, return an empty array + } + + if (data._success === true) { + eventHandler.error = false; + } + + if (eventHandler.multiple) { + // Concatenate results; do not add the same contacts + for (i = 0, l = eventHandler.searchResult.length; i < l; i++) { + resultsObject[eventHandler.searchResult[i].id] = true; + } + + for (i = 0, l = data.contacts.length; i < l; i++) { + if (resultsObject[data.contacts[i].id]) { + // Already existing + } else { + eventHandler.searchResult.push(data.contacts[i]); + } + } + + // check if more search is required + eventHandler.searchFieldIndex++; + if (eventHandler.searchFieldIndex < eventHandler.searchFields.length) { + more = true; + } + } else { + eventHandler.searchResult = data.contacts; + } + + if (more) { + pimContacts.getInstance().invokeJnextSearch(eventId); + } else { + if (eventHandler.error) { + eventHandler.result.callbackError(data.code, false); + } else { + eventHandler.result.callbackOk(eventHandler.searchResult, false); + } + } +} + +module.exports = { + search: function (successCb, failCb, args, env) { + var cordovaFindOptions = {}, + result = new PluginResult(args, env), + key; + + for (key in args) { + if (args.hasOwnProperty(key)) { + cordovaFindOptions[key] = JSON.parse(decodeURIComponent(args[key])); + } + } + + pimContacts.getInstance().find(cordovaFindOptions, result, processJnextFindData); + result.noResult(true); + }, + save: function (successCb, failCb, args, env) { + var attributes = {}, + result = new PluginResult(args, env), + key, + nativeEmails = []; + + attributes = JSON.parse(decodeURIComponent(args[0])); + + //convert birthday format for our native .so file + if (attributes.birthday) { + attributes.birthday = new Date(attributes.birthday).toDateString(); + } + + if (attributes.emails) { + attributes.emails.forEach(function (email) { + if (email.value) { + if (email.type) { + nativeEmails.push({ "type" : email.type, "value" : email.value }); + } else { + nativeEmails.push({ "type" : "home", "value" : email.value }); + } + } + }); + attributes.emails = nativeEmails; + } + + if (attributes.id !== null) { + attributes.id = window.parseInt(attributes.id); + } + + attributes._eventId = result.callbackId; + pimContacts.getInstance().save(attributes, result, processJnextSaveData); + result.noResult(true); + }, + remove: function (successCb, failCb, args, env) { + var result = new PluginResult(args, env), + attributes = { + "contactId": window.parseInt(JSON.parse(decodeURIComponent(args[0]))), + "_eventId": result.callbackId + }; + + if (!window.isNaN(attributes.contactId)) { + pimContacts.getInstance().remove(attributes, result, processJnextRemoveData); + result.noResult(true); + } else { + result.error(ContactError.UNKNOWN_ERROR); + result.noResult(false); + } + } +}; + +/////////////////////////////////////////////////////////////////// +// JavaScript wrapper for JNEXT plugin +/////////////////////////////////////////////////////////////////// + +JNEXT.PimContacts = function () +{ + var self = this, + hasInstance = false; + + self.find = function (cordovaFindOptions, pluginResult, handler) { + //register find eventHandler for when JNEXT onEvent fires + self.eventHandlers[cordovaFindOptions.callbackId] = { + "result" : pluginResult, + "action" : "find", + "multiple" : cordovaFindOptions[1].filter ? true : false, + "fields" : cordovaFindOptions[0], + "searchFilter" : cordovaFindOptions[1].filter, + "searchFields" : cordovaFindOptions[1].filter ? populateSearchFields(cordovaFindOptions[0]) : null, + "searchFieldIndex" : 0, + "searchResult" : [], + "handler" : handler, + "error" : true + }; + + self.invokeJnextSearch(cordovaFindOptions.callbackId); + return ""; + }; + + self.invokeJnextSearch = function(eventId) { + var jnextArgs = {}, + findHandler = self.eventHandlers[eventId]; + + jnextArgs._eventId = eventId; + jnextArgs.fields = findHandler.fields; + jnextArgs.options = {}; + jnextArgs.options.filter = []; + + if (findHandler.multiple) { + jnextArgs.options.filter.push({ + "fieldName" : findHandler.searchFields[findHandler.searchFieldIndex], + "fieldValue" : findHandler.searchFilter + }); + //findHandler.searchFieldIndex++; + } + + JNEXT.invoke(self.m_id, "find " + JSON.stringify(jnextArgs)); + } + + self.getContact = function (args) { + return JSON.parse(JNEXT.invoke(self.m_id, "getContact " + JSON.stringify(args))); + }; + + self.save = function (args, pluginResult, handler) { + //register save eventHandler for when JNEXT onEvent fires + self.eventHandlers[args._eventId] = { + "result" : pluginResult, + "action" : "save", + "handler" : handler + }; + JNEXT.invoke(self.m_id, "save " + JSON.stringify(args)); + return ""; + }; + + self.remove = function (args, pluginResult, handler) { + //register remove eventHandler for when JNEXT onEvent fires + self.eventHandlers[args._eventId] = { + "result" : pluginResult, + "action" : "remove", + "handler" : handler + }; + JNEXT.invoke(self.m_id, "remove " + JSON.stringify(args)); + return ""; + }; + + self.getId = function () { + return self.m_id; + }; + + self.getContactAccounts = function () { + var value = JNEXT.invoke(self.m_id, "getContactAccounts"); + return JSON.parse(value); + }; + + self.init = function () { + if (!JNEXT.require("libpimcontacts")) { + return false; + } + + self.m_id = JNEXT.createObject("libpimcontacts.PimContacts"); + + if (self.m_id === "") { + return false; + } + + JNEXT.registerEvents(self); + }; + + // Handle data coming back from JNEXT native layer. Each async function registers a handler and a PluginResult object. + // When JNEXT fires onEvent we parse the result string back into JSON and trigger the appropriate handler (eventHandlers map + // uses callbackId as key), along with the actual data coming back from the native layer. Each function may have its own way of + // processing native data so we do not do any processing here. + + self.onEvent = function (strData) { + var arData = strData.split(" "), + strEventDesc = arData[0], + eventHandler, + args = {}; + + if (strEventDesc === "result") { + args.result = escape(strData.split(" ").slice(2).join(" ")); + eventHandler = self.eventHandlers[arData[1]]; + if (eventHandler.action === "save" || eventHandler.action === "remove") { + eventHandler.handler(eventHandler.result, JSON.parse(decodeURIComponent(args.result))); + } else if (eventHandler.action === "find") { + eventHandler.handler(arData[1], eventHandler, JSON.parse(decodeURIComponent(args.result))); + } + } + }; + + self.m_id = ""; + self.eventHandlers = {}; + + self.getInstance = function () { + if (!hasInstance) { + self.init(); + hasInstance = true; + } + return self; + }; +}; + +pimContacts = new JNEXT.PimContacts(); diff --git a/cordova-lib/spec-plugman-install/plugins/Contacts/src/blackberry10/plugin.xml b/cordova-lib/spec-plugman-install/plugins/Contacts/src/blackberry10/plugin.xml new file mode 100644 index 000000000..d163585f2 --- /dev/null +++ b/cordova-lib/spec-plugman-install/plugins/Contacts/src/blackberry10/plugin.xml @@ -0,0 +1,41 @@ + + + + + + Contacts + + + + + + + + + + + + + + + + + + + diff --git a/cordova-lib/spec-plugman-install/plugins/Contacts/src/ios/CDVContact.h b/cordova-lib/spec-plugman-install/plugins/Contacts/src/ios/CDVContact.h new file mode 100644 index 000000000..5187efcdf --- /dev/null +++ b/cordova-lib/spec-plugman-install/plugins/Contacts/src/ios/CDVContact.h @@ -0,0 +1,136 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. + */ + +#import +#import +#import + +enum CDVContactError { + UNKNOWN_ERROR = 0, + INVALID_ARGUMENT_ERROR = 1, + TIMEOUT_ERROR = 2, + PENDING_OPERATION_ERROR = 3, + IO_ERROR = 4, + NOT_SUPPORTED_ERROR = 5, + PERMISSION_DENIED_ERROR = 20 +}; +typedef NSUInteger CDVContactError; + +@interface CDVContact : NSObject { + ABRecordRef record; // the ABRecord associated with this contact + NSDictionary* returnFields; // dictionary of fields to return when performing search +} + +@property (nonatomic, assign) ABRecordRef record; +@property (nonatomic, strong) NSDictionary* returnFields; + ++ (NSDictionary*)defaultABtoW3C; ++ (NSDictionary*)defaultW3CtoAB; ++ (NSSet*)defaultW3CtoNull; ++ (NSDictionary*)defaultObjectAndProperties; ++ (NSDictionary*)defaultFields; + ++ (NSDictionary*)calcReturnFields:(NSArray*)fields; +- (id)init; +- (id)initFromABRecord:(ABRecordRef)aRecord; +- (bool)setFromContactDict:(NSDictionary*)aContact asUpdate:(BOOL)bUpdate; + ++ (BOOL)needsConversion:(NSString*)W3Label; ++ (CFStringRef)convertContactTypeToPropertyLabel:(NSString*)label; ++ (NSString*)convertPropertyLabelToContactType:(NSString*)label; ++ (BOOL)isValidW3ContactType:(NSString*)label; +- (bool)setValue:(id)aValue forProperty:(ABPropertyID)aProperty inRecord:(ABRecordRef)aRecord asUpdate:(BOOL)bUpdate; + +- (NSDictionary*)toDictionary:(NSDictionary*)withFields; +- (NSNumber*)getDateAsNumber:(ABPropertyID)datePropId; +- (NSObject*)extractName; +- (NSObject*)extractMultiValue:(NSString*)propertyId; +- (NSObject*)extractAddresses; +- (NSObject*)extractIms; +- (NSObject*)extractOrganizations; +- (NSObject*)extractPhotos; + +- (NSMutableDictionary*)translateW3Dict:(NSDictionary*)dict forProperty:(ABPropertyID)prop; +- (bool)setMultiValueStrings:(NSArray*)fieldArray forProperty:(ABPropertyID)prop inRecord:(ABRecordRef)person asUpdate:(BOOL)bUpdate; +- (bool)setMultiValueDictionary:(NSArray*)array forProperty:(ABPropertyID)prop inRecord:(ABRecordRef)person asUpdate:(BOOL)bUpdate; +- (ABMultiValueRef)allocStringMultiValueFromArray:array; +- (ABMultiValueRef)allocDictMultiValueFromArray:array forProperty:(ABPropertyID)prop; +- (BOOL)foundValue:(NSString*)testValue inFields:(NSDictionary*)searchFields; +- (BOOL)testStringValue:(NSString*)testValue forW3CProperty:(NSString*)property; +- (BOOL)testDateValue:(NSString*)testValue forW3CProperty:(NSString*)property; +- (BOOL)searchContactFields:(NSArray*)fields forMVStringProperty:(ABPropertyID)propId withValue:testValue; +- (BOOL)testMultiValueStrings:(NSString*)testValue forProperty:(ABPropertyID)propId ofType:(NSString*)type; +- (NSArray*)valuesForProperty:(ABPropertyID)propId inRecord:(ABRecordRef)aRecord; +- (NSArray*)labelsForProperty:(ABPropertyID)propId inRecord:(ABRecordRef)aRecord; +- (BOOL)searchContactFields:(NSArray*)fields forMVDictionaryProperty:(ABPropertyID)propId withValue:(NSString*)testValue; + +@end + +// generic ContactField types +#define kW3ContactFieldType @"type" +#define kW3ContactFieldValue @"value" +#define kW3ContactFieldPrimary @"pref" +// Various labels for ContactField types +#define kW3ContactWorkLabel @"work" +#define kW3ContactHomeLabel @"home" +#define kW3ContactOtherLabel @"other" +#define kW3ContactPhoneFaxLabel @"fax" +#define kW3ContactPhoneMobileLabel @"mobile" +#define kW3ContactPhonePagerLabel @"pager" +#define kW3ContactUrlBlog @"blog" +#define kW3ContactUrlProfile @"profile" +#define kW3ContactImAIMLabel @"aim" +#define kW3ContactImICQLabel @"icq" +#define kW3ContactImMSNLabel @"msn" +#define kW3ContactImYahooLabel @"yahoo" +#define kW3ContactFieldId @"id" +// special translation for IM field value and type +#define kW3ContactImType @"type" +#define kW3ContactImValue @"value" + +// Contact object +#define kW3ContactId @"id" +#define kW3ContactName @"name" +#define kW3ContactFormattedName @"formatted" +#define kW3ContactGivenName @"givenName" +#define kW3ContactFamilyName @"familyName" +#define kW3ContactMiddleName @"middleName" +#define kW3ContactHonorificPrefix @"honorificPrefix" +#define kW3ContactHonorificSuffix @"honorificSuffix" +#define kW3ContactDisplayName @"displayName" +#define kW3ContactNickname @"nickname" +#define kW3ContactPhoneNumbers @"phoneNumbers" +#define kW3ContactAddresses @"addresses" +#define kW3ContactAddressFormatted @"formatted" +#define kW3ContactStreetAddress @"streetAddress" +#define kW3ContactLocality @"locality" +#define kW3ContactRegion @"region" +#define kW3ContactPostalCode @"postalCode" +#define kW3ContactCountry @"country" +#define kW3ContactEmails @"emails" +#define kW3ContactIms @"ims" +#define kW3ContactOrganizations @"organizations" +#define kW3ContactOrganizationName @"name" +#define kW3ContactTitle @"title" +#define kW3ContactDepartment @"department" +#define kW3ContactBirthday @"birthday" +#define kW3ContactNote @"note" +#define kW3ContactPhotos @"photos" +#define kW3ContactCategories @"categories" +#define kW3ContactUrls @"urls" diff --git a/cordova-lib/spec-plugman-install/plugins/Contacts/src/ios/CDVContact.m b/cordova-lib/spec-plugman-install/plugins/Contacts/src/ios/CDVContact.m new file mode 100644 index 000000000..82704ea05 --- /dev/null +++ b/cordova-lib/spec-plugman-install/plugins/Contacts/src/ios/CDVContact.m @@ -0,0 +1,1752 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. + */ + +#import "CDVContact.h" +#import + +#define DATE_OR_NULL(dateObj) ((aDate != nil) ? (id)([aDate descriptionWithLocale:[NSLocale currentLocale]]) : (id)([NSNull null])) +#define IS_VALID_VALUE(value) ((value != nil) && (![value isKindOfClass:[NSNull class]])) + +static NSDictionary* org_apache_cordova_contacts_W3CtoAB = nil; +static NSDictionary* org_apache_cordova_contacts_ABtoW3C = nil; +static NSSet* org_apache_cordova_contacts_W3CtoNull = nil; +static NSDictionary* org_apache_cordova_contacts_objectAndProperties = nil; +static NSDictionary* org_apache_cordova_contacts_defaultFields = nil; + +@implementation CDVContact : NSObject + + @synthesize returnFields; + +- (id)init +{ + if ((self = [super init]) != nil) { + ABRecordRef rec = ABPersonCreate(); + self.record = rec; + if (rec) { + CFRelease(rec); + } + } + return self; +} + +- (id)initFromABRecord:(ABRecordRef)aRecord +{ + if ((self = [super init]) != nil) { + self.record = aRecord; + } + return self; +} + +/* synthesize 'record' ourselves to have retain properties for CF types */ + +- (void)setRecord:(ABRecordRef)aRecord +{ + if (record != NULL) { + CFRelease(record); + } + if (aRecord != NULL) { + record = CFRetain(aRecord); + } +} + +- (ABRecordRef)record +{ + return record; +} + +/* Rather than creating getters and setters for each AddressBook (AB) Property, generic methods are used to deal with + * simple properties, MultiValue properties( phone numbers and emails) and MultiValueDictionary properties (Ims and addresses). + * The dictionaries below are used to translate between the W3C identifiers and the AB properties. Using the dictionaries, + * allows looping through sets of properties to extract from or set into the W3C dictionary to/from the ABRecord. + */ + +/* The two following dictionaries translate between W3C properties and AB properties. It currently mixes both + * Properties (kABPersonAddressProperty for example) and Strings (kABPersonAddressStreetKey) so users should be aware of + * what types of values are expected. + * a bit. +*/ ++ (NSDictionary*)defaultABtoW3C +{ + if (org_apache_cordova_contacts_ABtoW3C == nil) { + org_apache_cordova_contacts_ABtoW3C = [NSDictionary dictionaryWithObjectsAndKeys: + kW3ContactNickname, [NSNumber numberWithInt:kABPersonNicknameProperty], + kW3ContactGivenName, [NSNumber numberWithInt:kABPersonFirstNameProperty], + kW3ContactFamilyName, [NSNumber numberWithInt:kABPersonLastNameProperty], + kW3ContactMiddleName, [NSNumber numberWithInt:kABPersonMiddleNameProperty], + kW3ContactHonorificPrefix, [NSNumber numberWithInt:kABPersonPrefixProperty], + kW3ContactHonorificSuffix, [NSNumber numberWithInt:kABPersonSuffixProperty], + kW3ContactPhoneNumbers, [NSNumber numberWithInt:kABPersonPhoneProperty], + kW3ContactAddresses, [NSNumber numberWithInt:kABPersonAddressProperty], + kW3ContactStreetAddress, kABPersonAddressStreetKey, + kW3ContactLocality, kABPersonAddressCityKey, + kW3ContactRegion, kABPersonAddressStateKey, + kW3ContactPostalCode, kABPersonAddressZIPKey, + kW3ContactCountry, kABPersonAddressCountryKey, + kW3ContactEmails, [NSNumber numberWithInt:kABPersonEmailProperty], + kW3ContactIms, [NSNumber numberWithInt:kABPersonInstantMessageProperty], + kW3ContactOrganizations, [NSNumber numberWithInt:kABPersonOrganizationProperty], + kW3ContactOrganizationName, [NSNumber numberWithInt:kABPersonOrganizationProperty], + kW3ContactTitle, [NSNumber numberWithInt:kABPersonJobTitleProperty], + kW3ContactDepartment, [NSNumber numberWithInt:kABPersonDepartmentProperty], + kW3ContactBirthday, [NSNumber numberWithInt:kABPersonBirthdayProperty], + kW3ContactUrls, [NSNumber numberWithInt:kABPersonURLProperty], + kW3ContactNote, [NSNumber numberWithInt:kABPersonNoteProperty], + nil]; + } + + return org_apache_cordova_contacts_ABtoW3C; +} + ++ (NSDictionary*)defaultW3CtoAB +{ + if (org_apache_cordova_contacts_W3CtoAB == nil) { + org_apache_cordova_contacts_W3CtoAB = [NSDictionary dictionaryWithObjectsAndKeys: + [NSNumber numberWithInt:kABPersonNicknameProperty], kW3ContactNickname, + [NSNumber numberWithInt:kABPersonFirstNameProperty], kW3ContactGivenName, + [NSNumber numberWithInt:kABPersonLastNameProperty], kW3ContactFamilyName, + [NSNumber numberWithInt:kABPersonMiddleNameProperty], kW3ContactMiddleName, + [NSNumber numberWithInt:kABPersonPrefixProperty], kW3ContactHonorificPrefix, + [NSNumber numberWithInt:kABPersonSuffixProperty], kW3ContactHonorificSuffix, + [NSNumber numberWithInt:kABPersonPhoneProperty], kW3ContactPhoneNumbers, + [NSNumber numberWithInt:kABPersonAddressProperty], kW3ContactAddresses, + kABPersonAddressStreetKey, kW3ContactStreetAddress, + kABPersonAddressCityKey, kW3ContactLocality, + kABPersonAddressStateKey, kW3ContactRegion, + kABPersonAddressZIPKey, kW3ContactPostalCode, + kABPersonAddressCountryKey, kW3ContactCountry, + [NSNumber numberWithInt:kABPersonEmailProperty], kW3ContactEmails, + [NSNumber numberWithInt:kABPersonInstantMessageProperty], kW3ContactIms, + [NSNumber numberWithInt:kABPersonOrganizationProperty], kW3ContactOrganizations, + [NSNumber numberWithInt:kABPersonJobTitleProperty], kW3ContactTitle, + [NSNumber numberWithInt:kABPersonDepartmentProperty], kW3ContactDepartment, + [NSNumber numberWithInt:kABPersonBirthdayProperty], kW3ContactBirthday, + [NSNumber numberWithInt:kABPersonNoteProperty], kW3ContactNote, + [NSNumber numberWithInt:kABPersonURLProperty], kW3ContactUrls, + kABPersonInstantMessageUsernameKey, kW3ContactImValue, + kABPersonInstantMessageServiceKey, kW3ContactImType, + [NSNull null], kW3ContactFieldType, /* include entries in dictionary to indicate ContactField properties */ + [NSNull null], kW3ContactFieldValue, + [NSNull null], kW3ContactFieldPrimary, + [NSNull null], kW3ContactFieldId, + [NSNumber numberWithInt:kABPersonOrganizationProperty], kW3ContactOrganizationName, /* careful, name is used multiple times*/ + nil]; + } + return org_apache_cordova_contacts_W3CtoAB; +} + ++ (NSSet*)defaultW3CtoNull +{ + // these are values that have no AddressBook Equivalent OR have not been implemented yet + if (org_apache_cordova_contacts_W3CtoNull == nil) { + org_apache_cordova_contacts_W3CtoNull = [NSSet setWithObjects:kW3ContactDisplayName, + kW3ContactCategories, kW3ContactFormattedName, nil]; + } + return org_apache_cordova_contacts_W3CtoNull; +} + +/* + * The objectAndProperties dictionary contains the all of the properties of the W3C Contact Objects specified by the key + * Used in calcReturnFields, and various extract methods + */ ++ (NSDictionary*)defaultObjectAndProperties +{ + if (org_apache_cordova_contacts_objectAndProperties == nil) { + org_apache_cordova_contacts_objectAndProperties = [NSDictionary dictionaryWithObjectsAndKeys: + [NSArray arrayWithObjects:kW3ContactGivenName, kW3ContactFamilyName, + kW3ContactMiddleName, kW3ContactHonorificPrefix, kW3ContactHonorificSuffix, kW3ContactFormattedName, nil], kW3ContactName, + [NSArray arrayWithObjects:kW3ContactStreetAddress, kW3ContactLocality, kW3ContactRegion, + kW3ContactPostalCode, kW3ContactCountry, /*kW3ContactAddressFormatted,*/ nil], kW3ContactAddresses, + [NSArray arrayWithObjects:kW3ContactOrganizationName, kW3ContactTitle, kW3ContactDepartment, nil], kW3ContactOrganizations, + [NSArray arrayWithObjects:kW3ContactFieldType, kW3ContactFieldValue, kW3ContactFieldPrimary, nil], kW3ContactPhoneNumbers, + [NSArray arrayWithObjects:kW3ContactFieldType, kW3ContactFieldValue, kW3ContactFieldPrimary, nil], kW3ContactEmails, + [NSArray arrayWithObjects:kW3ContactFieldType, kW3ContactFieldValue, kW3ContactFieldPrimary, nil], kW3ContactPhotos, + [NSArray arrayWithObjects:kW3ContactFieldType, kW3ContactFieldValue, kW3ContactFieldPrimary, nil], kW3ContactUrls, + [NSArray arrayWithObjects:kW3ContactImValue, kW3ContactImType, nil], kW3ContactIms, + nil]; + } + return org_apache_cordova_contacts_objectAndProperties; +} + ++ (NSDictionary*)defaultFields +{ + if (org_apache_cordova_contacts_defaultFields == nil) { + org_apache_cordova_contacts_defaultFields = [NSDictionary dictionaryWithObjectsAndKeys: + [[CDVContact defaultObjectAndProperties] objectForKey:kW3ContactName], kW3ContactName, + [NSNull null], kW3ContactNickname, + [[CDVContact defaultObjectAndProperties] objectForKey:kW3ContactAddresses], kW3ContactAddresses, + [[CDVContact defaultObjectAndProperties] objectForKey:kW3ContactOrganizations], kW3ContactOrganizations, + [[CDVContact defaultObjectAndProperties] objectForKey:kW3ContactPhoneNumbers], kW3ContactPhoneNumbers, + [[CDVContact defaultObjectAndProperties] objectForKey:kW3ContactEmails], kW3ContactEmails, + [[CDVContact defaultObjectAndProperties] objectForKey:kW3ContactIms], kW3ContactIms, + [[CDVContact defaultObjectAndProperties] objectForKey:kW3ContactPhotos], kW3ContactPhotos, + [[CDVContact defaultObjectAndProperties] objectForKey:kW3ContactUrls], kW3ContactUrls, + [NSNull null], kW3ContactBirthday, + [NSNull null], kW3ContactNote, + nil]; + } + return org_apache_cordova_contacts_defaultFields; +} + +/* Translate W3C Contact data into ABRecordRef + * + * New contact information comes in as a NSMutableDictionary. All Null entries in Contact object are set + * as [NSNull null] in the dictionary when translating from the JSON input string of Contact data. However, if + * user did not set a value within a Contact object or sub-object (by not using the object constructor) some data + * may not exist. + * bUpdate = YES indicates this is a save of an existing record + */ +- (bool)setFromContactDict:(NSDictionary*)aContact asUpdate:(BOOL)bUpdate +{ + if (![aContact isKindOfClass:[NSDictionary class]]) { + return FALSE; // can't do anything if no dictionary! + } + + ABRecordRef person = self.record; + bool bSuccess = TRUE; + CFErrorRef error; + + // set name info + // iOS doesn't have displayName - might have to pull parts from it to create name + bool bName = false; + NSDictionary* dict = [aContact valueForKey:kW3ContactName]; + if ([dict isKindOfClass:[NSDictionary class]]) { + bName = true; + NSArray* propArray = [[CDVContact defaultObjectAndProperties] objectForKey:kW3ContactName]; + + for (id i in propArray) { + if (![(NSString*)i isEqualToString : kW3ContactFormattedName]) { // kW3ContactFormattedName is generated from ABRecordCopyCompositeName() and can't be set + [self setValue:[dict valueForKey:i] forProperty:(ABPropertyID)[(NSNumber*)[[CDVContact defaultW3CtoAB] objectForKey:i] intValue] + inRecord:person asUpdate:bUpdate]; + } + } + } + + id nn = [aContact valueForKey:kW3ContactNickname]; + if (![nn isKindOfClass:[NSNull class]]) { + bName = true; + [self setValue:nn forProperty:kABPersonNicknameProperty inRecord:person asUpdate:bUpdate]; + } + if (!bName) { + // if no name or nickname - try and use displayName as W3Contact must have displayName or ContactName + [self setValue:[aContact valueForKey:kW3ContactDisplayName] forProperty:kABPersonNicknameProperty + inRecord:person asUpdate:bUpdate]; + } + + // set phoneNumbers + // NSLog(@"setting phoneNumbers"); + NSArray* array = [aContact valueForKey:kW3ContactPhoneNumbers]; + if ([array isKindOfClass:[NSArray class]]) { + [self setMultiValueStrings:array forProperty:kABPersonPhoneProperty inRecord:person asUpdate:bUpdate]; + } + // set Emails + // NSLog(@"setting emails"); + array = [aContact valueForKey:kW3ContactEmails]; + if ([array isKindOfClass:[NSArray class]]) { + [self setMultiValueStrings:array forProperty:kABPersonEmailProperty inRecord:person asUpdate:bUpdate]; + } + // set Urls + // NSLog(@"setting urls"); + array = [aContact valueForKey:kW3ContactUrls]; + if ([array isKindOfClass:[NSArray class]]) { + [self setMultiValueStrings:array forProperty:kABPersonURLProperty inRecord:person asUpdate:bUpdate]; + } + + // set multivalue dictionary properties + // set addresses: streetAddress, locality, region, postalCode, country + // set ims: value = username, type = servicetype + // iOS addresses and im are a MultiValue Properties with label, value=dictionary of info, and id + // NSLog(@"setting addresses"); + error = nil; + array = [aContact valueForKey:kW3ContactAddresses]; + if ([array isKindOfClass:[NSArray class]]) { + [self setMultiValueDictionary:array forProperty:kABPersonAddressProperty inRecord:person asUpdate:bUpdate]; + } + // ims + // NSLog(@"setting ims"); + array = [aContact valueForKey:kW3ContactIms]; + if ([array isKindOfClass:[NSArray class]]) { + [self setMultiValueDictionary:array forProperty:kABPersonInstantMessageProperty inRecord:person asUpdate:bUpdate]; + } + + // organizations + // W3C ContactOrganization has pref, type, name, title, department + // iOS only supports name, title, department + // NSLog(@"setting organizations"); + // TODO this may need work - should Organization information be removed when array is empty?? + array = [aContact valueForKey:kW3ContactOrganizations]; // iOS only supports one organization - use first one + if ([array isKindOfClass:[NSArray class]]) { + BOOL bRemove = NO; + NSDictionary* dict = nil; + if ([array count] > 0) { + dict = [array objectAtIndex:0]; + } else { + // remove the organization info entirely + bRemove = YES; + } + if ([dict isKindOfClass:[NSDictionary class]] || (bRemove == YES)) { + [self setValue:(bRemove ? @"" : [dict valueForKey:@"name"]) forProperty:kABPersonOrganizationProperty inRecord:person asUpdate:bUpdate]; + [self setValue:(bRemove ? @"" : [dict valueForKey:kW3ContactTitle]) forProperty:kABPersonJobTitleProperty inRecord:person asUpdate:bUpdate]; + [self setValue:(bRemove ? @"" : [dict valueForKey:kW3ContactDepartment]) forProperty:kABPersonDepartmentProperty inRecord:person asUpdate:bUpdate]; + } + } + // add dates + // Dates come in as milliseconds in NSNumber Object + id ms = [aContact valueForKey:kW3ContactBirthday]; + NSDate* aDate = nil; + if (ms && [ms isKindOfClass:[NSNumber class]]) { + double msValue = [ms doubleValue]; + msValue = msValue / 1000; + aDate = [NSDate dateWithTimeIntervalSince1970:msValue]; + } + if ((aDate != nil) || [ms isKindOfClass:[NSString class]]) { + [self setValue:aDate != nil ? aDate:ms forProperty:kABPersonBirthdayProperty inRecord:person asUpdate:bUpdate]; + } + // don't update creation date + // modification date will get updated when save + // anniversary is removed from W3C Contact api Dec 9, 2010 spec - don't waste time on it yet + + // kABPersonDateProperty + + // kABPersonAnniversaryLabel + + // iOS doesn't have gender - ignore + // note + [self setValue:[aContact valueForKey:kW3ContactNote] forProperty:kABPersonNoteProperty inRecord:person asUpdate:bUpdate]; + + // iOS doesn't have preferredName- ignore + + // photo + array = [aContact valueForKey:kW3ContactPhotos]; + if ([array isKindOfClass:[NSArray class]]) { + if (bUpdate && ([array count] == 0)) { + // remove photo + bSuccess = ABPersonRemoveImageData(person, &error); + } else if ([array count] > 0) { + NSDictionary* dict = [array objectAtIndex:0]; // currently only support one photo + if ([dict isKindOfClass:[NSDictionary class]]) { + id value = [dict objectForKey:kW3ContactFieldValue]; + if ([value isKindOfClass:[NSString class]]) { + if (bUpdate && ([value length] == 0)) { + // remove the current image + bSuccess = ABPersonRemoveImageData(person, &error); + } else { + // use this image + // don't know if string is encoded or not so first unencode it then encode it again + NSString* cleanPath = [value stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; + NSURL* photoUrl = [NSURL URLWithString:[cleanPath stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]; + // caller is responsible for checking for a connection, if no connection this will fail + NSError* err = nil; + NSData* data = nil; + if (photoUrl) { + data = [NSData dataWithContentsOfURL:photoUrl options:NSDataReadingUncached error:&err]; + } + if (data && ([data length] > 0)) { + bSuccess = ABPersonSetImageData(person, (__bridge CFDataRef)data, &error); + } + if (!data || !bSuccess) { + NSLog(@"error setting contact image: %@", (err != nil ? [err localizedDescription] : @"")); + } + } + } + } + } + } + + // TODO WebURLs + + // TODO timezone + + return bSuccess; +} + +/* Set item into an AddressBook Record for the specified property. + * aValue - the value to set into the address book (code checks for null or [NSNull null] + * aProperty - AddressBook property ID + * aRecord - the record to update + * bUpdate - whether this is a possible update vs a new entry + * RETURN + * true - property was set (or input value as null) + * false - property was not set + */ +- (bool)setValue:(id)aValue forProperty:(ABPropertyID)aProperty inRecord:(ABRecordRef)aRecord asUpdate:(BOOL)bUpdate +{ + bool bSuccess = true; // if property was null, just ignore and return success + CFErrorRef error; + + if (aValue && ![aValue isKindOfClass:[NSNull class]]) { + if (bUpdate && ([aValue isKindOfClass:[NSString class]] && ([aValue length] == 0))) { // if updating, empty string means to delete + aValue = NULL; + } // really only need to set if different - more efficient to just update value or compare and only set if necessary??? + bSuccess = ABRecordSetValue(aRecord, aProperty, (__bridge CFTypeRef)aValue, &error); + if (!bSuccess) { + NSLog(@"error setting %d property", aProperty); + } + } + + return bSuccess; +} + +- (bool)removeProperty:(ABPropertyID)aProperty inRecord:(ABRecordRef)aRecord +{ + CFErrorRef err; + bool bSuccess = ABRecordRemoveValue(aRecord, aProperty, &err); + + if (!bSuccess) { + CFStringRef errDescription = CFErrorCopyDescription(err); + NSLog(@"Unable to remove property %d: %@", aProperty, errDescription); + CFRelease(errDescription); + } + return bSuccess; +} + +- (bool)addToMultiValue:(ABMultiValueRef)multi fromDictionary:dict +{ + bool bSuccess = FALSE; + id value = [dict valueForKey:kW3ContactFieldValue]; + + if (IS_VALID_VALUE(value)) { + CFStringRef label = [CDVContact convertContactTypeToPropertyLabel:[dict valueForKey:kW3ContactFieldType]]; + bSuccess = ABMultiValueAddValueAndLabel(multi, (__bridge CFTypeRef)value, label, NULL); + if (!bSuccess) { + NSLog(@"Error setting Value: %@ and label: %@", value, label); + } + } + return bSuccess; +} + +- (ABMultiValueRef)allocStringMultiValueFromArray:array +{ + ABMutableMultiValueRef multi = ABMultiValueCreateMutable(kABMultiStringPropertyType); + + for (NSDictionary* dict in array) { + [self addToMultiValue:multi fromDictionary:dict]; + } + + return multi; // caller is responsible for releasing multi +} + +- (bool)setValue:(CFTypeRef)value forProperty:(ABPropertyID)prop inRecord:(ABRecordRef)person +{ + CFErrorRef error; + bool bSuccess = ABRecordSetValue(person, prop, value, &error); + + if (!bSuccess) { + NSLog(@"Error setting value for property: %d", prop); + } + return bSuccess; +} + +/* Set MultiValue string properties into Address Book Record. + * NSArray* fieldArray - array of dictionaries containing W3C properties to be set into record + * ABPropertyID prop - the property to be set (generally used for phones and emails) + * ABRecordRef person - the record to set values into + * BOOL bUpdate - whether or not to update date or set as new. + * When updating: + * empty array indicates to remove entire property + * empty string indicates to remove + * [NSNull null] do not modify (keep existing record value) + * RETURNS + * bool false indicates error + * + * used for phones and emails + */ +- (bool)setMultiValueStrings:(NSArray*)fieldArray forProperty:(ABPropertyID)prop inRecord:(ABRecordRef)person asUpdate:(BOOL)bUpdate +{ + bool bSuccess = TRUE; + ABMutableMultiValueRef multi = nil; + + if (!bUpdate) { + multi = [self allocStringMultiValueFromArray:fieldArray]; + bSuccess = [self setValue:multi forProperty:prop inRecord:person]; + } else if (bUpdate && ([fieldArray count] == 0)) { + // remove entire property + bSuccess = [self removeProperty:prop inRecord:person]; + } else { // check for and apply changes + ABMultiValueRef copy = ABRecordCopyValue(person, prop); + if (copy != nil) { + multi = ABMultiValueCreateMutableCopy(copy); + CFRelease(copy); + + for (NSDictionary* dict in fieldArray) { + id val; + NSString* label = nil; + val = [dict valueForKey:kW3ContactFieldValue]; + label = (__bridge NSString*)[CDVContact convertContactTypeToPropertyLabel:[dict valueForKey:kW3ContactFieldType]]; + if (IS_VALID_VALUE(val)) { + // is an update, find index of entry with matching id, if values are different, update. + id idValue = [dict valueForKey:kW3ContactFieldId]; + int identifier = [idValue isKindOfClass:[NSNumber class]] ? [idValue intValue] : -1; + CFIndex i = identifier >= 0 ? ABMultiValueGetIndexForIdentifier(multi, identifier) : kCFNotFound; + if (i != kCFNotFound) { + if ([val length] == 0) { + // remove both value and label + ABMultiValueRemoveValueAndLabelAtIndex(multi, i); + } else { + NSString* valueAB = (__bridge_transfer NSString*)ABMultiValueCopyValueAtIndex(multi, i); + NSString* labelAB = (__bridge_transfer NSString*)ABMultiValueCopyLabelAtIndex(multi, i); + if ((valueAB == nil) || ![val isEqualToString:valueAB]) { + ABMultiValueReplaceValueAtIndex(multi, (__bridge CFTypeRef)val, i); + } + if ((labelAB == nil) || ![label isEqualToString:labelAB]) { + ABMultiValueReplaceLabelAtIndex(multi, (__bridge CFStringRef)label, i); + } + } + } else { + // is a new value - insert + [self addToMultiValue:multi fromDictionary:dict]; + } + } // end of if value + } // end of for + } else { // adding all new value(s) + multi = [self allocStringMultiValueFromArray:fieldArray]; + } + // set the (updated) copy as the new value + bSuccess = [self setValue:multi forProperty:prop inRecord:person]; + } + + if (multi) { + CFRelease(multi); + } + + return bSuccess; +} + +// used for ims and addresses +- (ABMultiValueRef)allocDictMultiValueFromArray:array forProperty:(ABPropertyID)prop +{ + ABMutableMultiValueRef multi = ABMultiValueCreateMutable(kABMultiDictionaryPropertyType); + NSMutableDictionary* newDict; + NSMutableDictionary* addDict; + + for (NSDictionary* dict in array) { + newDict = [self translateW3Dict:dict forProperty:prop]; + addDict = [NSMutableDictionary dictionaryWithCapacity:2]; + if (newDict) { // create a new dictionary with a Label and Value, value is the dictionary previously created + // June, 2011 W3C Contact spec adds type into ContactAddress book + // get the type out of the original dictionary for address + NSString* addrType = (NSString*)[dict valueForKey:kW3ContactFieldType]; + if (!addrType) { + addrType = (NSString*)kABOtherLabel; + } + NSObject* typeValue = ((prop == kABPersonInstantMessageProperty) ? (NSObject*)kABOtherLabel : addrType); + // NSLog(@"typeValue: %@", typeValue); + [addDict setObject:typeValue forKey:kW3ContactFieldType]; // im labels will be set as Other and address labels as type from dictionary + [addDict setObject:newDict forKey:kW3ContactFieldValue]; + [self addToMultiValue:multi fromDictionary:addDict]; + } + } + + return multi; // caller is responsible for releasing +} + +// used for ims and addresses to convert W3 dictionary of values to AB Dictionary +// got messier when June, 2011 W3C Contact spec added type field into ContactAddress +- (NSMutableDictionary*)translateW3Dict:(NSDictionary*)dict forProperty:(ABPropertyID)prop +{ + NSArray* propArray = [[CDVContact defaultObjectAndProperties] valueForKey:[[CDVContact defaultABtoW3C] objectForKey:[NSNumber numberWithInt:prop]]]; + + NSMutableDictionary* newDict = [NSMutableDictionary dictionaryWithCapacity:1]; + id value; + + for (NSString* key in propArray) { // for each W3 Contact key get the value + if (((value = [dict valueForKey:key]) != nil) && ![value isKindOfClass:[NSNull class]]) { + // if necessary convert the W3 value to AB Property label + NSString* setValue = value; + if ([CDVContact needsConversion:key]) { // IM types must be converted + setValue = (NSString*)[CDVContact convertContactTypeToPropertyLabel:value]; + // IMs must have a valid AB value! + if ((prop == kABPersonInstantMessageProperty) && [setValue isEqualToString:(NSString*)kABOtherLabel]) { + setValue = @""; // try empty string + } + } + // set the AB value into the dictionary + [newDict setObject:setValue forKey:(NSString*)[[CDVContact defaultW3CtoAB] valueForKey:(NSString*)key]]; + } + } + + if ([newDict count] == 0) { + newDict = nil; // no items added + } + return newDict; +} + +/* set multivalue dictionary properties into an AddressBook Record + * NSArray* array - array of dictionaries containing the W3C properties to set into the record + * ABPropertyID prop - the property id for the multivalue dictionary (addresses and ims) + * ABRecordRef person - the record to set the values into + * BOOL bUpdate - YES if this is an update to an existing record + * When updating: + * empty array indicates to remove entire property + * value/label == "" indicates to remove + * value/label == [NSNull null] do not modify (keep existing record value) + * RETURN + * bool false indicates fatal error + * + * iOS addresses and im are a MultiValue Properties with label, value=dictionary of info, and id + * set addresses: streetAddress, locality, region, postalCode, country + * set ims: value = username, type = servicetype + * there are some special cases in here for ims - needs cleanup / simplification + * + */ +- (bool)setMultiValueDictionary:(NSArray*)array forProperty:(ABPropertyID)prop inRecord:(ABRecordRef)person asUpdate:(BOOL)bUpdate +{ + bool bSuccess = FALSE; + ABMutableMultiValueRef multi = nil; + + if (!bUpdate) { + multi = [self allocDictMultiValueFromArray:array forProperty:prop]; + bSuccess = [self setValue:multi forProperty:prop inRecord:person]; + } else if (bUpdate && ([array count] == 0)) { + // remove property + bSuccess = [self removeProperty:prop inRecord:person]; + } else { // check for and apply changes + ABMultiValueRef copy = ABRecordCopyValue(person, prop); + if (copy) { + multi = ABMultiValueCreateMutableCopy(copy); + CFRelease(copy); + // get the W3C values for this property + NSArray* propArray = [[CDVContact defaultObjectAndProperties] valueForKey:[[CDVContact defaultABtoW3C] objectForKey:[NSNumber numberWithInt:prop]]]; + id value; + id valueAB; + + for (NSDictionary* field in array) { + NSMutableDictionary* dict; + // find the index for the current property + id idValue = [field valueForKey:kW3ContactFieldId]; + int identifier = [idValue isKindOfClass:[NSNumber class]] ? [idValue intValue] : -1; + CFIndex idx = identifier >= 0 ? ABMultiValueGetIndexForIdentifier(multi, identifier) : kCFNotFound; + BOOL bUpdateLabel = NO; + if (idx != kCFNotFound) { + dict = [NSMutableDictionary dictionaryWithCapacity:1]; + // NSDictionary* existingDictionary = (NSDictionary*)ABMultiValueCopyValueAtIndex(multi, idx); + CFTypeRef existingDictionary = ABMultiValueCopyValueAtIndex(multi, idx); + NSString* existingABLabel = (__bridge_transfer NSString*)ABMultiValueCopyLabelAtIndex(multi, idx); + NSString* testLabel = [field valueForKey:kW3ContactFieldType]; + // fixes cb-143 where setting empty label could cause address to not be removed + // (because empty label would become 'other' in convertContactTypeToPropertyLabel + // which may not have matched existing label thus resulting in an incorrect updating of the label + // and the address not getting removed at the end of the for loop) + if (testLabel && [testLabel isKindOfClass:[NSString class]] && ([testLabel length] > 0)) { + CFStringRef w3cLabel = [CDVContact convertContactTypeToPropertyLabel:testLabel]; + if (w3cLabel && ![existingABLabel isEqualToString:(__bridge NSString*)w3cLabel]) { + // replace the label + ABMultiValueReplaceLabelAtIndex(multi, w3cLabel, idx); + bUpdateLabel = YES; + } + } // else was invalid or empty label string so do not update + + for (id k in propArray) { + value = [field valueForKey:k]; + bool bSet = (value != nil && ![value isKindOfClass:[NSNull class]] && ([value isKindOfClass:[NSString class]] && [value length] > 0)); + // if there is a contact value, put it into dictionary + if (bSet) { + NSString* setValue = [CDVContact needsConversion:(NSString*)k] ? (NSString*)[CDVContact convertContactTypeToPropertyLabel:value] : value; + [dict setObject:setValue forKey:(NSString*)[[CDVContact defaultW3CtoAB] valueForKey:(NSString*)k]]; + } else if ((value == nil) || ([value isKindOfClass:[NSString class]] && ([value length] != 0))) { + // value not provided in contact dictionary - if prop exists in AB dictionary, preserve it + valueAB = [(__bridge NSDictionary*)existingDictionary valueForKey : [[CDVContact defaultW3CtoAB] valueForKey:k]]; + if (valueAB != nil) { + [dict setValue:valueAB forKey:[[CDVContact defaultW3CtoAB] valueForKey:k]]; + } + } // else if value == "" it will not be added into updated dict and thus removed + } // end of for loop (moving here fixes cb-143, need to end for loop before replacing or removing multivalue) + + if ([dict count] > 0) { + // something was added into new dict, + ABMultiValueReplaceValueAtIndex(multi, (__bridge CFTypeRef)dict, idx); + } else if (!bUpdateLabel) { + // nothing added into new dict and no label change so remove this property entry + ABMultiValueRemoveValueAndLabelAtIndex(multi, idx); + } + + CFRelease(existingDictionary); + } else { + // not found in multivalue so add it + dict = [self translateW3Dict:field forProperty:prop]; + if (dict) { + NSMutableDictionary* addDict = [NSMutableDictionary dictionaryWithCapacity:2]; + // get the type out of the original dictionary for address + NSObject* typeValue = ((prop == kABPersonInstantMessageProperty) ? (NSObject*)kABOtherLabel : (NSString*)[field valueForKey:kW3ContactFieldType]); + // NSLog(@"typeValue: %@", typeValue); + [addDict setObject:typeValue forKey:kW3ContactFieldType]; // im labels will be set as Other and address labels as type from dictionary + [addDict setObject:dict forKey:kW3ContactFieldValue]; + [self addToMultiValue:multi fromDictionary:addDict]; + } + } + } // end of looping through dictionaries + + // set the (updated) copy as the new value + bSuccess = [self setValue:multi forProperty:prop inRecord:person]; + } + } // end of copy and apply changes + if (multi) { + CFRelease(multi); + } + + return bSuccess; +} + +/* Determine which W3C labels need to be converted + */ ++ (BOOL)needsConversion:(NSString*)W3Label +{ + BOOL bConvert = NO; + + if ([W3Label isEqualToString:kW3ContactFieldType] || [W3Label isEqualToString:kW3ContactImType]) { + bConvert = YES; + } + return bConvert; +} + +/* Translation of property type labels contact API ---> iPhone + * + * phone: work, home, other, mobile, fax, pager --> + * kABWorkLabel, kABHomeLabel, kABOtherLabel, kABPersonPhoneMobileLabel, kABPersonHomeFAXLabel || kABPersonHomeFAXLabel, kABPersonPhonePagerLabel + * emails: work, home, other ---> kABWorkLabel, kABHomeLabel, kABOtherLabel + * ims: aim, gtalk, icq, xmpp, msn, skype, qq, yahoo --> kABPersonInstantMessageService + (AIM, ICG, MSN, Yahoo). No support for gtalk, xmpp, skype, qq + * addresses: work, home, other --> kABWorkLabel, kABHomeLabel, kABOtherLabel + * + * + */ ++ (CFStringRef)convertContactTypeToPropertyLabel:(NSString*)label +{ + CFStringRef type; + + if ([label isKindOfClass:[NSNull class]] || ![label isKindOfClass:[NSString class]]) { + type = NULL; // no label + } else if ([label caseInsensitiveCompare:kW3ContactWorkLabel] == NSOrderedSame) { + type = kABWorkLabel; + } else if ([label caseInsensitiveCompare:kW3ContactHomeLabel] == NSOrderedSame) { + type = kABHomeLabel; + } else if ([label caseInsensitiveCompare:kW3ContactOtherLabel] == NSOrderedSame) { + type = kABOtherLabel; + } else if ([label caseInsensitiveCompare:kW3ContactPhoneMobileLabel] == NSOrderedSame) { + type = kABPersonPhoneMobileLabel; + } else if ([label caseInsensitiveCompare:kW3ContactPhonePagerLabel] == NSOrderedSame) { + type = kABPersonPhonePagerLabel; + } else if ([label caseInsensitiveCompare:kW3ContactImAIMLabel] == NSOrderedSame) { + type = kABPersonInstantMessageServiceAIM; + } else if ([label caseInsensitiveCompare:kW3ContactImICQLabel] == NSOrderedSame) { + type = kABPersonInstantMessageServiceICQ; + } else if ([label caseInsensitiveCompare:kW3ContactImMSNLabel] == NSOrderedSame) { + type = kABPersonInstantMessageServiceMSN; + } else if ([label caseInsensitiveCompare:kW3ContactImYahooLabel] == NSOrderedSame) { + type = kABPersonInstantMessageServiceYahoo; + } else if ([label caseInsensitiveCompare:kW3ContactUrlProfile] == NSOrderedSame) { + type = kABPersonHomePageLabel; + } else { + type = kABOtherLabel; + } + + return type; +} + ++ (NSString*)convertPropertyLabelToContactType:(NSString*)label +{ + NSString* type = nil; + + if (label != nil) { // improve efficiency...... + if ([label isEqualToString:(NSString*)kABPersonPhoneMobileLabel]) { + type = kW3ContactPhoneMobileLabel; + } else if ([label isEqualToString:(NSString*)kABPersonPhoneHomeFAXLabel] || + [label isEqualToString:(NSString*)kABPersonPhoneWorkFAXLabel]) { + type = kW3ContactPhoneFaxLabel; + } else if ([label isEqualToString:(NSString*)kABPersonPhonePagerLabel]) { + type = kW3ContactPhonePagerLabel; + } else if ([label isEqualToString:(NSString*)kABHomeLabel]) { + type = kW3ContactHomeLabel; + } else if ([label isEqualToString:(NSString*)kABWorkLabel]) { + type = kW3ContactWorkLabel; + } else if ([label isEqualToString:(NSString*)kABOtherLabel]) { + type = kW3ContactOtherLabel; + } else if ([label isEqualToString:(NSString*)kABPersonInstantMessageServiceAIM]) { + type = kW3ContactImAIMLabel; + } else if ([label isEqualToString:(NSString*)kABPersonInstantMessageServiceICQ]) { + type = kW3ContactImICQLabel; + } else if ([label isEqualToString:(NSString*)kABPersonInstantMessageServiceJabber]) { + type = kW3ContactOtherLabel; + } else if ([label isEqualToString:(NSString*)kABPersonInstantMessageServiceMSN]) { + type = kW3ContactImMSNLabel; + } else if ([label isEqualToString:(NSString*)kABPersonInstantMessageServiceYahoo]) { + type = kW3ContactImYahooLabel; + } else if ([label isEqualToString:(NSString*)kABPersonHomePageLabel]) { + type = kW3ContactUrlProfile; + } else { + type = kW3ContactOtherLabel; + } + } + return type; +} + +/* Check if the input label is a valid W3C ContactField.type. This is used when searching, + * only search field types if the search string is a valid type. If we converted any search + * string to a ABPropertyLabel it could convert to kABOtherLabel which is probably not want + * the user wanted to search for and could skew the results. + */ ++ (BOOL)isValidW3ContactType:(NSString*)label +{ + BOOL isValid = NO; + + if ([label isKindOfClass:[NSNull class]] || ![label isKindOfClass:[NSString class]]) { + isValid = NO; // no label + } else if ([label caseInsensitiveCompare:kW3ContactWorkLabel] == NSOrderedSame) { + isValid = YES; + } else if ([label caseInsensitiveCompare:kW3ContactHomeLabel] == NSOrderedSame) { + isValid = YES; + } else if ([label caseInsensitiveCompare:kW3ContactOtherLabel] == NSOrderedSame) { + isValid = YES; + } else if ([label caseInsensitiveCompare:kW3ContactPhoneMobileLabel] == NSOrderedSame) { + isValid = YES; + } else if ([label caseInsensitiveCompare:kW3ContactPhonePagerLabel] == NSOrderedSame) { + isValid = YES; + } else if ([label caseInsensitiveCompare:kW3ContactImAIMLabel] == NSOrderedSame) { + isValid = YES; + } else if ([label caseInsensitiveCompare:kW3ContactImICQLabel] == NSOrderedSame) { + isValid = YES; + } else if ([label caseInsensitiveCompare:kW3ContactImMSNLabel] == NSOrderedSame) { + isValid = YES; + } else if ([label caseInsensitiveCompare:kW3ContactImYahooLabel] == NSOrderedSame) { + isValid = YES; + } else { + isValid = NO; + } + + return isValid; +} + +/* Create a new Contact Dictionary object from an ABRecordRef that contains information in a format such that + * it can be returned to JavaScript callback as JSON object string. + * Uses: + * ABRecordRef set into Contact Object + * NSDictionary withFields indicates which fields to return from the AddressBook Record + * + * JavaScript Contact: + * @param {DOMString} id unique identifier + * @param {DOMString} displayName + * @param {ContactName} name + * @param {DOMString} nickname + * @param {ContactField[]} phoneNumbers array of phone numbers + * @param {ContactField[]} emails array of email addresses + * @param {ContactAddress[]} addresses array of addresses + * @param {ContactField[]} ims instant messaging user ids + * @param {ContactOrganization[]} organizations + * @param {DOMString} published date contact was first created + * @param {DOMString} updated date contact was last updated + * @param {DOMString} birthday contact's birthday + * @param (DOMString} anniversary contact's anniversary + * @param {DOMString} gender contact's gender + * @param {DOMString} note user notes about contact + * @param {DOMString} preferredUsername + * @param {ContactField[]} photos + * @param {ContactField[]} tags + * @param {ContactField[]} relationships + * @param {ContactField[]} urls contact's web sites + * @param {ContactAccounts[]} accounts contact's online accounts + * @param {DOMString} timezone UTC time zone offset + * @param {DOMString} connected + */ + +- (NSDictionary*)toDictionary:(NSDictionary*)withFields +{ + // if not a person type record bail out for now + if (ABRecordGetRecordType(self.record) != kABPersonType) { + return NULL; + } + id value = nil; + self.returnFields = withFields; + + NSMutableDictionary* nc = [NSMutableDictionary dictionaryWithCapacity:1]; // new contact dictionary to fill in from ABRecordRef + // id + [nc setObject:[NSNumber numberWithInt:ABRecordGetRecordID(self.record)] forKey:kW3ContactId]; + if (self.returnFields == nil) { + // if no returnFields specified, W3C says to return empty contact (but Cordova will at least return id) + return nc; + } + if ([self.returnFields objectForKey:kW3ContactDisplayName]) { + // displayname requested - iOS doesn't have so return null + [nc setObject:[NSNull null] forKey:kW3ContactDisplayName]; + // may overwrite below if requested ContactName and there are no values + } + // nickname + if ([self.returnFields valueForKey:kW3ContactNickname]) { + value = (__bridge_transfer NSString*)ABRecordCopyValue(self.record, kABPersonNicknameProperty); + [nc setObject:(value != nil) ? value:[NSNull null] forKey:kW3ContactNickname]; + } + + // name dictionary + // NSLog(@"getting name info"); + NSObject* data = [self extractName]; + if (data != nil) { + [nc setObject:data forKey:kW3ContactName]; + } + if ([self.returnFields objectForKey:kW3ContactDisplayName] && ((data == nil) || ([(NSDictionary*)data objectForKey : kW3ContactFormattedName] == [NSNull null]))) { + // user asked for displayName which iOS doesn't support but there is no other name data being returned + // try and use Composite Name so some name is returned + id tryName = (__bridge_transfer NSString*)ABRecordCopyCompositeName(self.record); + if (tryName != nil) { + [nc setObject:tryName forKey:kW3ContactDisplayName]; + } else { + // use nickname or empty string + value = (__bridge_transfer NSString*)ABRecordCopyValue(self.record, kABPersonNicknameProperty); + [nc setObject:(value != nil) ? value:@"" forKey:kW3ContactDisplayName]; + } + } + // phoneNumbers array + // NSLog(@"getting phoneNumbers"); + value = [self extractMultiValue:kW3ContactPhoneNumbers]; + if (value != nil) { + [nc setObject:value forKey:kW3ContactPhoneNumbers]; + } + // emails array + // NSLog(@"getting emails"); + value = [self extractMultiValue:kW3ContactEmails]; + if (value != nil) { + [nc setObject:value forKey:kW3ContactEmails]; + } + // urls array + value = [self extractMultiValue:kW3ContactUrls]; + if (value != nil) { + [nc setObject:value forKey:kW3ContactUrls]; + } + // addresses array + // NSLog(@"getting addresses"); + value = [self extractAddresses]; + if (value != nil) { + [nc setObject:value forKey:kW3ContactAddresses]; + } + // im array + // NSLog(@"getting ims"); + value = [self extractIms]; + if (value != nil) { + [nc setObject:value forKey:kW3ContactIms]; + } + // organization array (only info for one organization in iOS) + // NSLog(@"getting organizations"); + value = [self extractOrganizations]; + if (value != nil) { + [nc setObject:value forKey:kW3ContactOrganizations]; + } + + // for simple properties, could make this a bit more efficient by storing all simple properties in a single + // array in the returnFields dictionary and setting them via a for loop through the array + + // add dates + // NSLog(@"getting dates"); + NSNumber* ms; + + /** Contact Revision field removed from June 16, 2011 version of specification + + if ([self.returnFields valueForKey:kW3ContactUpdated]){ + ms = [self getDateAsNumber: kABPersonModificationDateProperty]; + if (!ms){ + // try and get published date + ms = [self getDateAsNumber: kABPersonCreationDateProperty]; + } + if (ms){ + [nc setObject: ms forKey:kW3ContactUpdated]; + } + + } + */ + + if ([self.returnFields valueForKey:kW3ContactBirthday]) { + ms = [self getDateAsNumber:kABPersonBirthdayProperty]; + if (ms) { + [nc setObject:ms forKey:kW3ContactBirthday]; + } + } + + /* Anniversary removed from 12-09-2010 W3C Contacts api spec + if ([self.returnFields valueForKey:kW3ContactAnniversary]){ + // Anniversary date is stored in a multivalue property + ABMultiValueRef multi = ABRecordCopyValue(self.record, kABPersonDateProperty); + if (multi){ + CFStringRef label = nil; + CFIndex count = ABMultiValueGetCount(multi); + // see if contains an Anniversary date + for(CFIndex i=0; i 0) { // ?? this will always be true since we set id,label,primary field?? + [(NSMutableArray*)addresses addObject : newAddress]; + } + CFRelease(dict); + } // end of loop through addresses + } else { + addresses = [NSNull null]; + } + if (multi) { + CFRelease(multi); + } + + return addresses; +} + +/* Create array of Dictionaries to match JavaScript ContactField object for ims + * type one of [aim, gtalk, icq, xmpp, msn, skype, qq, yahoo] needs other as well + * value + * (bool) primary + * id + * + * iOS IMs are a MultiValue Properties with label, value=dictionary of IM details (service, username), and id + */ +- (NSObject*)extractIms +{ + NSArray* fields = [self.returnFields objectForKey:kW3ContactIms]; + + if (fields == nil) { // no name fields requested + return nil; + } + NSObject* imArray; + ABMultiValueRef multi = ABRecordCopyValue(self.record, kABPersonInstantMessageProperty); + CFIndex count = multi ? ABMultiValueGetCount(multi) : 0; + if (count) { + imArray = [NSMutableArray arrayWithCapacity:count]; + + for (CFIndex i = 0; i < ABMultiValueGetCount(multi); i++) { + NSMutableDictionary* newDict = [NSMutableDictionary dictionaryWithCapacity:3]; + // iOS has label property (work, home, other) for each IM but W3C contact API doesn't use + CFDictionaryRef dict = (CFDictionaryRef)ABMultiValueCopyValueAtIndex(multi, i); + CFStringRef value; // all values should be CFStringRefs / NSString* + bool bFound; + if ([fields containsObject:kW3ContactFieldValue]) { + // value = user name + bFound = CFDictionaryGetValueIfPresent(dict, kABPersonInstantMessageUsernameKey, (void*)&value); + if (bFound && (value != NULL)) { + CFRetain(value); + [newDict setObject:(__bridge id)value forKey:kW3ContactFieldValue]; + CFRelease(value); + } else { + [newDict setObject:[NSNull null] forKey:kW3ContactFieldValue]; + } + } + if ([fields containsObject:kW3ContactFieldType]) { + bFound = CFDictionaryGetValueIfPresent(dict, kABPersonInstantMessageServiceKey, (void*)&value); + if (bFound && (value != NULL)) { + CFRetain(value); + [newDict setObject:(id)[[CDVContact class] convertPropertyLabelToContactType : (__bridge NSString*)value] forKey:kW3ContactFieldType]; + CFRelease(value); + } else { + [newDict setObject:[NSNull null] forKey:kW3ContactFieldType]; + } + } + // always set ID + id identifier = [NSNumber numberWithUnsignedInt:ABMultiValueGetIdentifierAtIndex(multi, i)]; + [newDict setObject:(identifier != nil) ? identifier:[NSNull null] forKey:kW3ContactFieldId]; + + [(NSMutableArray*)imArray addObject : newDict]; + CFRelease(dict); + } + } else { + imArray = [NSNull null]; + } + + if (multi) { + CFRelease(multi); + } + return imArray; +} + +/* Create array of Dictionaries to match JavaScript ContactOrganization object + * pref - not supported in iOS + * type - not supported in iOS + * name + * department + * title + */ + +- (NSObject*)extractOrganizations +{ + NSArray* fields = [self.returnFields objectForKey:kW3ContactOrganizations]; + + if (fields == nil) { // no name fields requested + return nil; + } + NSObject* array = nil; + NSMutableDictionary* newDict = [NSMutableDictionary dictionaryWithCapacity:5]; + id value; + int validValueCount = 0; + + for (id i in fields) { + id key = [[CDVContact defaultW3CtoAB] valueForKey:i]; + if (key && [key isKindOfClass:[NSNumber class]]) { + value = (__bridge_transfer NSString*)ABRecordCopyValue(self.record, (ABPropertyID)[[[CDVContact defaultW3CtoAB] valueForKey:i] intValue]); + if (value != nil) { + // if there are no organization values we should return null for organization + // this counter keeps indicates if any organization values have been set + validValueCount++; + } + [newDict setObject:(value != nil) ? value:[NSNull null] forKey:i]; + } else { // not a key iOS supports, set to null + [newDict setObject:[NSNull null] forKey:i]; + } + } + + if (([newDict count] > 0) && (validValueCount > 0)) { + // add pref and type + // they are not supported by iOS and thus these values never change + [newDict setObject:@"false" forKey:kW3ContactFieldPrimary]; + [newDict setObject:[NSNull null] forKey:kW3ContactFieldType]; + array = [NSMutableArray arrayWithCapacity:1]; + [(NSMutableArray*)array addObject : newDict]; + } else { + array = [NSNull null]; + } + return array; +} + +// W3C Contacts expects an array of photos. Can return photos in more than one format, currently +// just returning the default format +// Save the photo data into tmp directory and return FileURI - temp directory is deleted upon application exit +- (NSObject*)extractPhotos +{ + NSMutableArray* photos = nil; + + if (ABPersonHasImageData(self.record)) { + CFDataRef photoData = ABPersonCopyImageData(self.record); + NSData* data = (__bridge NSData*)photoData; + // write to temp directory and store URI in photos array + // get the temp directory path + NSString* docsPath = [NSTemporaryDirectory()stringByStandardizingPath]; + NSError* err = nil; + NSString* filePath = [NSString stringWithFormat:@"%@/photo_XXXXX", docsPath]; + char template[filePath.length + 1]; + strcpy(template, [filePath cStringUsingEncoding:NSASCIIStringEncoding]); + mkstemp(template); + filePath = [[NSFileManager defaultManager] + stringWithFileSystemRepresentation:template + length:strlen(template)]; + + // save file + if ([data writeToFile:filePath options:NSAtomicWrite error:&err]) { + photos = [NSMutableArray arrayWithCapacity:1]; + NSMutableDictionary* newDict = [NSMutableDictionary dictionaryWithCapacity:2]; + [newDict setObject:filePath forKey:kW3ContactFieldValue]; + [newDict setObject:@"url" forKey:kW3ContactFieldType]; + [newDict setObject:@"false" forKey:kW3ContactFieldPrimary]; + [photos addObject:newDict]; + } + + CFRelease(photoData); + } + return photos; +} + +/** + * given an array of W3C Contact field names, create a dictionary of field names to extract + * if field name represents an object, return all properties for that object: "name" - returns all properties in ContactName + * if field name is an explicit property, return only those properties: "name.givenName - returns a ContactName with only ContactName.givenName + * if field contains ONLY ["*"] return all fields + * dictionary format: + * key is W3Contact #define + * value is NSMutableArray* for complex keys: name,addresses,organizations, phone, emails, ims + * value is [NSNull null] for simple keys +*/ ++ (NSDictionary*)calcReturnFields:(NSArray*)fieldsArray // NSLog(@"getting self.returnFields"); +{ + NSMutableDictionary* d = [NSMutableDictionary dictionaryWithCapacity:1]; + + if ((fieldsArray != nil) && [fieldsArray isKindOfClass:[NSArray class]]) { + if (([fieldsArray count] == 1) && [[fieldsArray objectAtIndex:0] isEqualToString:@"*"]) { + return [CDVContact defaultFields]; // return all fields + } + + for (id i in fieldsArray) { + NSMutableArray* keys = nil; + NSString* fieldStr = nil; + if ([i isKindOfClass:[NSNumber class]]) { + fieldStr = [i stringValue]; + } else { + fieldStr = i; + } + + // see if this is specific property request in object - object.property + NSArray* parts = [fieldStr componentsSeparatedByString:@"."]; // returns original string if no separator found + NSString* name = [parts objectAtIndex:0]; + NSString* property = nil; + if ([parts count] > 1) { + property = [parts objectAtIndex:1]; + } + // see if this is a complex field by looking for its array of properties in objectAndProperties dictionary + id fields = [[CDVContact defaultObjectAndProperties] objectForKey:name]; + + // if find complex name (name,addresses,organizations, phone, emails, ims) in fields, add name as key + // with array of associated properties as the value + if ((fields != nil) && (property == nil)) { // request was for full object + keys = [NSMutableArray arrayWithArray:fields]; + if (keys != nil) { + [d setObject:keys forKey:name]; // will replace if prop array already exists + } + } else if ((fields != nil) && (property != nil)) { + // found an individual property request in form of name.property + // verify is real property name by using it as key in W3CtoAB + id abEquiv = [[CDVContact defaultW3CtoAB] objectForKey:property]; + if (abEquiv || [[CDVContact defaultW3CtoNull] containsObject:property]) { + // if existing array add to it + if ((keys = [d objectForKey:name]) != nil) { + [keys addObject:property]; + } else { + keys = [NSMutableArray arrayWithObject:property]; + [d setObject:keys forKey:name]; + } + } else { + NSLog(@"Contacts.find -- request for invalid property ignored: %@.%@", name, property); + } + } else { // is an individual property, verify is real property name by using it as key in W3CtoAB + id valid = [[CDVContact defaultW3CtoAB] objectForKey:name]; + if (valid || [[CDVContact defaultW3CtoNull] containsObject:name]) { + [d setObject:[NSNull null] forKey:name]; + } + } + } + } + if ([d count] == 0) { + // no array or nothing in the array. W3C spec says to return nothing + return nil; // [Contact defaultFields]; + } + return d; +} + +/* + * Search for the specified value in each of the fields specified in the searchFields dictionary. + * NSString* value - the string value to search for (need clarification from W3C on how to search for dates) + * NSDictionary* searchFields - a dictionary created via calcReturnFields where the key is the top level W3C + * object and the object is the array of specific fields within that object or null if it is a single property + * RETURNS + * YES as soon as a match is found in any of the fields + * NO - the specified value does not exist in any of the fields in this contact + * + * Note: I'm not a fan of returning in the middle of methods but have done it some in this method in order to + * keep the code simpler. bgibson + */ +- (BOOL)foundValue:(NSString*)testValue inFields:(NSDictionary*)searchFields +{ + BOOL bFound = NO; + + if ((testValue == nil) || ![testValue isKindOfClass:[NSString class]] || ([testValue length] == 0)) { + // nothing to find so return NO + return NO; + } + NSInteger valueAsInt = [testValue integerValue]; + + // per W3C spec, always include id in search + int recordId = ABRecordGetRecordID(self.record); + if (valueAsInt && (recordId == valueAsInt)) { + return YES; + } + + if (searchFields == nil) { + // no fields to search + return NO; + } + + if ([searchFields valueForKey:kW3ContactNickname]) { + bFound = [self testStringValue:testValue forW3CProperty:kW3ContactNickname]; + if (bFound == YES) { + return bFound; + } + } + + if ([searchFields valueForKeyIsArray:kW3ContactName]) { + // test name fields. All are string properties obtained via ABRecordCopyValue except kW3ContactFormattedName + NSArray* fields = [searchFields valueForKey:kW3ContactName]; + + for (NSString* testItem in fields) { + if ([testItem isEqualToString:kW3ContactFormattedName]) { + NSString* propValue = (__bridge_transfer NSString*)ABRecordCopyCompositeName(self.record); + if ((propValue != nil) && ([propValue length] > 0)) { + NSRange range = [propValue rangeOfString:testValue options:NSCaseInsensitiveSearch]; + bFound = (range.location != NSNotFound); + propValue = nil; + } + } else { + bFound = [self testStringValue:testValue forW3CProperty:testItem]; + } + + if (bFound) { + break; + } + } + } + if (!bFound && [searchFields valueForKeyIsArray:kW3ContactPhoneNumbers]) { + bFound = [self searchContactFields:(NSArray*)[searchFields valueForKey:kW3ContactPhoneNumbers] + forMVStringProperty:kABPersonPhoneProperty withValue:testValue]; + } + if (!bFound && [searchFields valueForKeyIsArray:kW3ContactEmails]) { + bFound = [self searchContactFields:(NSArray*)[searchFields valueForKey:kW3ContactEmails] + forMVStringProperty:kABPersonEmailProperty withValue:testValue]; + } + + if (!bFound && [searchFields valueForKeyIsArray:kW3ContactAddresses]) { + bFound = [self searchContactFields:[searchFields valueForKey:kW3ContactAddresses] + forMVDictionaryProperty:kABPersonAddressProperty withValue:testValue]; + } + + if (!bFound && [searchFields valueForKeyIsArray:kW3ContactIms]) { + bFound = [self searchContactFields:[searchFields valueForKey:kW3ContactIms] + forMVDictionaryProperty:kABPersonInstantMessageProperty withValue:testValue]; + } + + if (!bFound && [searchFields valueForKeyIsArray:kW3ContactOrganizations]) { + NSArray* fields = [searchFields valueForKey:kW3ContactOrganizations]; + + for (NSString* testItem in fields) { + bFound = [self testStringValue:testValue forW3CProperty:testItem]; + if (bFound == YES) { + break; + } + } + } + if (!bFound && [searchFields valueForKey:kW3ContactNote]) { + bFound = [self testStringValue:testValue forW3CProperty:kW3ContactNote]; + } + + // if searching for a date field is requested, get the date field as a localized string then look for match against testValue in date string + // searching for photos is not supported + if (!bFound && [searchFields valueForKey:kW3ContactBirthday]) { + bFound = [self testDateValue:testValue forW3CProperty:kW3ContactBirthday]; + } + if (!bFound && [searchFields valueForKeyIsArray:kW3ContactUrls]) { + bFound = [self searchContactFields:(NSArray*)[searchFields valueForKey:kW3ContactUrls] + forMVStringProperty:kABPersonURLProperty withValue:testValue]; + } + + return bFound; +} + +/* + * Test for the existence of a given string within the value of a ABPersonRecord string property based on the W3c property name. + * + * IN: + * NSString* testValue - the value to find - search is case insensitive + * NSString* property - the W3c property string + * OUT: + * BOOL YES if the given string was found within the property value + * NO if the testValue was not found, W3C property string was invalid or the AddressBook property was not a string + */ +- (BOOL)testStringValue:(NSString*)testValue forW3CProperty:(NSString*)property +{ + BOOL bFound = NO; + + if ([[CDVContact defaultW3CtoAB] valueForKeyIsNumber:property]) { + ABPropertyID propId = [[[CDVContact defaultW3CtoAB] objectForKey:property] intValue]; + if (ABPersonGetTypeOfProperty(propId) == kABStringPropertyType) { + NSString* propValue = (__bridge_transfer NSString*)ABRecordCopyValue(self.record, propId); + if ((propValue != nil) && ([propValue length] > 0)) { + NSPredicate* containPred = [NSPredicate predicateWithFormat:@"SELF contains[cd] %@", testValue]; + bFound = [containPred evaluateWithObject:propValue]; + // NSRange range = [propValue rangeOfString:testValue options: NSCaseInsensitiveSearch]; + // bFound = (range.location != NSNotFound); + } + } + } + return bFound; +} + +/* + * Test for the existence of a given Date string within the value of a ABPersonRecord datetime property based on the W3c property name. + * + * IN: + * NSString* testValue - the value to find - search is case insensitive + * NSString* property - the W3c property string + * OUT: + * BOOL YES if the given string was found within the localized date string value + * NO if the testValue was not found, W3C property string was invalid or the AddressBook property was not a DateTime + */ +- (BOOL)testDateValue:(NSString*)testValue forW3CProperty:(NSString*)property +{ + BOOL bFound = NO; + + if ([[CDVContact defaultW3CtoAB] valueForKeyIsNumber:property]) { + ABPropertyID propId = [[[CDVContact defaultW3CtoAB] objectForKey:property] intValue]; + if (ABPersonGetTypeOfProperty(propId) == kABDateTimePropertyType) { + NSDate* date = (__bridge_transfer NSDate*)ABRecordCopyValue(self.record, propId); + if (date != nil) { + NSString* dateString = [date descriptionWithLocale:[NSLocale currentLocale]]; + NSPredicate* containPred = [NSPredicate predicateWithFormat:@"SELF contains[cd] %@", testValue]; + bFound = [containPred evaluateWithObject:dateString]; + } + } + } + return bFound; +} + +/* + * Search the specified fields within an AddressBook multivalue string property for the specified test value. + * Used for phoneNumbers, emails and urls. + * IN: + * NSArray* fields - the fields to search for within the multistring property (value and/or type) + * ABPropertyID - the property to search + * NSString* testValue - the value to search for. Will convert between W3C types and AB types. Will only + * search for types if the testValue is a valid ContactField type. + * OUT: + * YES if the test value was found in one of the specified fields + * NO if the test value was not found + */ +- (BOOL)searchContactFields:(NSArray*)fields forMVStringProperty:(ABPropertyID)propId withValue:testValue +{ + BOOL bFound = NO; + + for (NSString* type in fields) { + NSString* testString = nil; + if ([type isEqualToString:kW3ContactFieldType]) { + if ([CDVContact isValidW3ContactType:testValue]) { + // only search types if the filter string is a valid ContactField.type + testString = (NSString*)[CDVContact convertContactTypeToPropertyLabel:testValue]; + } + } else { + testString = testValue; + } + + if (testString != nil) { + bFound = [self testMultiValueStrings:testString forProperty:propId ofType:type]; + } + if (bFound == YES) { + break; + } + } + + return bFound; +} + +/* + * Searches a multiString value of the specified type for the specified test value. + * + * IN: + * NSString* testValue - the value to test for + * ABPropertyID propId - the property id of the multivalue property to search + * NSString* type - the W3C contact type to search for (value or type) + * OUT: + * YES is the test value was found + * NO if the test value was not found + */ +- (BOOL)testMultiValueStrings:(NSString*)testValue forProperty:(ABPropertyID)propId ofType:(NSString*)type +{ + BOOL bFound = NO; + + if (ABPersonGetTypeOfProperty(propId) == kABMultiStringPropertyType) { + NSArray* valueArray = nil; + if ([type isEqualToString:kW3ContactFieldType]) { + valueArray = [self labelsForProperty:propId inRecord:self.record]; + } else if ([type isEqualToString:kW3ContactFieldValue]) { + valueArray = [self valuesForProperty:propId inRecord:self.record]; + } + if (valueArray) { + NSString* valuesAsString = [valueArray componentsJoinedByString:@" "]; + NSPredicate* containPred = [NSPredicate predicateWithFormat:@"SELF contains[cd] %@", testValue]; + bFound = [containPred evaluateWithObject:valuesAsString]; + } + } + return bFound; +} + +/* + * Returns the array of values for a multivalue string property of the specified property id + */ +- (__autoreleasing NSArray*)valuesForProperty:(ABPropertyID)propId inRecord:(ABRecordRef)aRecord +{ + ABMultiValueRef multi = ABRecordCopyValue(aRecord, propId); + NSArray* values = (__bridge_transfer NSArray*)ABMultiValueCopyArrayOfAllValues(multi); + + CFRelease(multi); + return values; +} + +/* + * Returns the array of labels for a multivalue string property of the specified property id + */ +- (NSArray*)labelsForProperty:(ABPropertyID)propId inRecord:(ABRecordRef)aRecord +{ + ABMultiValueRef multi = ABRecordCopyValue(aRecord, propId); + CFIndex count = ABMultiValueGetCount(multi); + NSMutableArray* labels = [NSMutableArray arrayWithCapacity:count]; + + for (int i = 0; i < count; i++) { + NSString* label = (__bridge_transfer NSString*)ABMultiValueCopyLabelAtIndex(multi, i); + if (label) { + [labels addObject:label]; + } + } + + CFRelease(multi); + return labels; +} + +/* search for values within MultiValue Dictionary properties Address or IM property + * IN: + * (NSArray*) fields - the array of W3C field names to search within + * (ABPropertyID) propId - the AddressBook property that returns a multivalue dictionary + * (NSString*) testValue - the string to search for within the specified fields + * + */ +- (BOOL)searchContactFields:(NSArray*)fields forMVDictionaryProperty:(ABPropertyID)propId withValue:(NSString*)testValue +{ + BOOL bFound = NO; + + NSArray* values = [self valuesForProperty:propId inRecord:self.record]; // array of dictionaries (as CFDictionaryRef) + int dictCount = [values count]; + + // for ims dictionary contains with service (w3C type) and username (W3c value) + // for addresses dictionary contains street, city, state, zip, country + for (int i = 0; i < dictCount; i++) { + CFDictionaryRef dict = (__bridge CFDictionaryRef)[values objectAtIndex:i]; + + for (NSString* member in fields) { + NSString* abKey = [[CDVContact defaultW3CtoAB] valueForKey:member]; // im and address fields are all strings + CFStringRef abValue = nil; + if (abKey) { + NSString* testString = nil; + if ([member isEqualToString:kW3ContactImType]) { + if ([CDVContact isValidW3ContactType:testValue]) { + // only search service/types if the filter string is a valid ContactField.type + testString = (NSString*)[CDVContact convertContactTypeToPropertyLabel:testValue]; + } + } else { + testString = testValue; + } + if (testString != nil) { + BOOL bExists = CFDictionaryGetValueIfPresent(dict, (__bridge const void*)abKey, (void*)&abValue); + if (bExists) { + CFRetain(abValue); + NSPredicate* containPred = [NSPredicate predicateWithFormat:@"SELF contains[cd] %@", testString]; + bFound = [containPred evaluateWithObject:(__bridge id)abValue]; + CFRelease(abValue); + } + } + } + if (bFound == YES) { + break; + } + } // end of for each member in fields + + if (bFound == YES) { + break; + } + } // end of for each dictionary + + return bFound; +} + +@end diff --git a/cordova-lib/spec-plugman-install/plugins/Contacts/src/ios/CDVContacts.h b/cordova-lib/spec-plugman-install/plugins/Contacts/src/ios/CDVContacts.h new file mode 100644 index 000000000..e3deb21b4 --- /dev/null +++ b/cordova-lib/spec-plugman-install/plugins/Contacts/src/ios/CDVContacts.h @@ -0,0 +1,151 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. + */ + +#import +#import +#import +#import +#import "CDVContact.h" + +@interface CDVContacts : CDVPlugin +{ + ABAddressBookRef addressBook; +} + +/* + * newContact - create a new contact via the GUI + * + * arguments: + * 1: successCallback: this is the javascript function that will be called with the newly created contactId + */ +- (void)newContact:(CDVInvokedUrlCommand*)command; + +/* + * displayContact - IN PROGRESS + * + * arguments: + * 1: recordID of the contact to display in the iPhone contact display + * 2: successCallback - currently not used + * 3: error callback + * options: + * allowsEditing: set to true to allow the user to edit the contact - currently not supported + */ +- (void)displayContact:(CDVInvokedUrlCommand*)command; + +/* + * chooseContact + * + * arguments: + * 1: this is the javascript function that will be called with the contact data as a JSON object (as the first param) + * options: + * allowsEditing: set to true to not choose the contact, but to edit it in the iPhone contact editor + */ +- (void)chooseContact:(CDVInvokedUrlCommand*)command; + +- (void)newPersonViewController:(ABNewPersonViewController*)newPersonViewController didCompleteWithNewPerson:(ABRecordRef)person; +- (BOOL)personViewController:(ABPersonViewController*)personViewController shouldPerformDefaultActionForPerson:(ABRecordRef)person + property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifierForValue; + +/* + * search - searches for contacts. Only person records are currently supported. + * + * arguments: + * 1: successcallback - this is the javascript function that will be called with the array of found contacts + * 2: errorCallback - optional javascript function to be called in the event of an error with an error code. + * options: dictionary containing ContactFields and ContactFindOptions + * fields - ContactFields array + * findOptions - ContactFindOptions object as dictionary + * + */ +- (void)search:(CDVInvokedUrlCommand*)command; + +/* + * save - saves a new contact or updates and existing contact + * + * arguments: + * 1: success callback - this is the javascript function that will be called with the JSON representation of the saved contact + * search calls a fixed navigator.service.contacts._findCallback which then calls the success callback stored before making the call into obj-c + */ +- (void)save:(CDVInvokedUrlCommand*)command; + +/* + * remove - removes a contact from the address book + * + * arguments: + * 1: 1: successcallback - this is the javascript function that will be called with a (now) empty contact object + * + * options: dictionary containing Contact object to remove + * contact - Contact object as dictionary + */ +- (void)remove:(CDVInvokedUrlCommand*)command; + +// - (void) dealloc; + +@end + +@interface CDVContactsPicker : ABPeoplePickerNavigationController +{ + BOOL allowsEditing; + NSString* callbackId; + NSDictionary* options; + NSDictionary* pickedContactDictionary; +} + +@property BOOL allowsEditing; +@property (copy) NSString* callbackId; +@property (nonatomic, strong) NSDictionary* options; +@property (nonatomic, strong) NSDictionary* pickedContactDictionary; + +@end + +@interface CDVNewContactsController : ABNewPersonViewController +{ + NSString* callbackId; +} +@property (copy) NSString* callbackId; +@end + +/* ABPersonViewController does not have any UI to dismiss. Adding navigationItems to it does not work properly, the navigationItems are lost when the app goes into the background. + The solution was to create an empty NavController in front of the ABPersonViewController. This + causes the ABPersonViewController to have a back button. By subclassing the ABPersonViewController, + we can override viewWillDisappear and take down the entire NavigationController at that time. + */ +@interface CDVDisplayContactViewController : ABPersonViewController +{} +@property (nonatomic, strong) CDVPlugin* contactsPlugin; + +@end +@interface CDVAddressBookAccessError : NSObject +{} +@property (assign) CDVContactError errorCode; +- (CDVAddressBookAccessError*)initWithCode:(CDVContactError)code; +@end + +typedef void (^ CDVAddressBookWorkerBlock)( + ABAddressBookRef addressBook, + CDVAddressBookAccessError* error + ); +@interface CDVAddressBookHelper : NSObject +{} + +- (void)createAddressBook:(CDVAddressBookWorkerBlock)workerBlock; +@end diff --git a/cordova-lib/spec-plugman-install/plugins/Contacts/src/ios/CDVContacts.m b/cordova-lib/spec-plugman-install/plugins/Contacts/src/ios/CDVContacts.m new file mode 100644 index 000000000..3ca3e814d --- /dev/null +++ b/cordova-lib/spec-plugman-install/plugins/Contacts/src/ios/CDVContacts.m @@ -0,0 +1,593 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. + */ + +#import "CDVContacts.h" +#import +#import +#import +//#import "CDVNotification.h" + +@implementation CDVContactsPicker + +@synthesize allowsEditing; +@synthesize callbackId; +@synthesize options; +@synthesize pickedContactDictionary; + +@end +@implementation CDVNewContactsController + +@synthesize callbackId; + +@end + +@implementation CDVContacts + +// no longer used since code gets AddressBook for each operation. +// If address book changes during save or remove operation, may get error but not much we can do about it +// If address book changes during UI creation, display or edit, we don't control any saves so no need for callback + +/*void addressBookChanged(ABAddressBookRef addressBook, CFDictionaryRef info, void* context) +{ + // note that this function is only called when another AddressBook instance modifies + // the address book, not the current one. For example, through an OTA MobileMe sync + Contacts* contacts = (Contacts*)context; + [contacts addressBookDirty]; + }*/ + +- (CDVPlugin*)initWithWebView:(UIWebView*)theWebView +{ + self = (CDVContacts*)[super initWithWebView:(UIWebView*)theWebView]; + + /*if (self) { + addressBook = ABAddressBookCreate(); + ABAddressBookRegisterExternalChangeCallback(addressBook, addressBookChanged, self); + }*/ + + return self; +} + +// overridden to clean up Contact statics +- (void)onAppTerminate +{ + // NSLog(@"Contacts::onAppTerminate"); +} + +// iPhone only method to create a new contact through the GUI +- (void)newContact:(CDVInvokedUrlCommand*)command +{ + NSString* callbackId = command.callbackId; + + CDVAddressBookHelper* abHelper = [[CDVAddressBookHelper alloc] init]; + CDVContacts* __weak weakSelf = self; // play it safe to avoid retain cycles + + [abHelper createAddressBook: ^(ABAddressBookRef addrBook, CDVAddressBookAccessError* errCode) { + if (addrBook == NULL) { + // permission was denied or other error just return (no error callback) + return; + } + CDVNewContactsController* npController = [[CDVNewContactsController alloc] init]; + npController.addressBook = addrBook; // a CF retaining assign + CFRelease(addrBook); + + npController.newPersonViewDelegate = self; + npController.callbackId = callbackId; + + UINavigationController* navController = [[UINavigationController alloc] initWithRootViewController:npController]; + + if ([weakSelf.viewController respondsToSelector:@selector(presentViewController:::)]) { + [weakSelf.viewController presentViewController:navController animated:YES completion:nil]; + } else { + [weakSelf.viewController presentModalViewController:navController animated:YES]; + } + }]; +} + +- (void)newPersonViewController:(ABNewPersonViewController*)newPersonViewController didCompleteWithNewPerson:(ABRecordRef)person +{ + ABRecordID recordId = kABRecordInvalidID; + CDVNewContactsController* newCP = (CDVNewContactsController*)newPersonViewController; + NSString* callbackId = newCP.callbackId; + + if (person != NULL) { + // return the contact id + recordId = ABRecordGetRecordID(person); + } + + if ([newPersonViewController respondsToSelector:@selector(presentingViewController)]) { + [[newPersonViewController presentingViewController] dismissViewControllerAnimated:YES completion:nil]; + } else { + [[newPersonViewController parentViewController] dismissModalViewControllerAnimated:YES]; + } + + CDVPluginResult* result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsInt:recordId]; + [self.commandDelegate sendPluginResult:result callbackId:callbackId]; +} + +- (void)displayContact:(CDVInvokedUrlCommand*)command +{ + NSString* callbackId = command.callbackId; + ABRecordID recordID = [[command.arguments objectAtIndex:0] intValue]; + NSDictionary* options = [command.arguments objectAtIndex:1 withDefault:[NSNull null]]; + bool bEdit = [options isKindOfClass:[NSNull class]] ? false : [options existsValue:@"true" forKey:@"allowsEditing"]; + + CDVAddressBookHelper* abHelper = [[CDVAddressBookHelper alloc] init]; + CDVContacts* __weak weakSelf = self; // play it safe to avoid retain cycles + + [abHelper createAddressBook: ^(ABAddressBookRef addrBook, CDVAddressBookAccessError* errCode) { + if (addrBook == NULL) { + // permission was denied or other error - return error + CDVPluginResult* result = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageToErrorObject:errCode ? errCode.errorCode:UNKNOWN_ERROR]; + [weakSelf.commandDelegate sendPluginResult:result callbackId:callbackId]; + return; + } + ABRecordRef rec = ABAddressBookGetPersonWithRecordID(addrBook, recordID); + + if (rec) { + CDVDisplayContactViewController* personController = [[CDVDisplayContactViewController alloc] init]; + personController.displayedPerson = rec; + personController.personViewDelegate = self; + personController.allowsEditing = NO; + + // create this so DisplayContactViewController will have a "back" button. + UIViewController* parentController = [[UIViewController alloc] init]; + UINavigationController* navController = [[UINavigationController alloc] initWithRootViewController:parentController]; + + [navController pushViewController:personController animated:YES]; + + if ([self.viewController respondsToSelector:@selector(presentViewController:::)]) { + [self.viewController presentViewController:navController animated:YES completion:nil]; + } else { + [self.viewController presentModalViewController:navController animated:YES]; + } + + if (bEdit) { + // create the editing controller and push it onto the stack + ABPersonViewController* editPersonController = [[ABPersonViewController alloc] init]; + editPersonController.displayedPerson = rec; + editPersonController.personViewDelegate = self; + editPersonController.allowsEditing = YES; + [navController pushViewController:editPersonController animated:YES]; + } + } else { + // no record, return error + CDVPluginResult* result = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsInt:UNKNOWN_ERROR]; + [weakSelf.commandDelegate sendPluginResult:result callbackId:callbackId]; + } + CFRelease(addrBook); + }]; +} + +- (BOOL)personViewController:(ABPersonViewController*)personViewController shouldPerformDefaultActionForPerson:(ABRecordRef)person + property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifierForValue +{ + return YES; +} + +- (void)chooseContact:(CDVInvokedUrlCommand*)command +{ + NSString* callbackId = command.callbackId; + NSDictionary* options = [command.arguments objectAtIndex:0 withDefault:[NSNull null]]; + + CDVContactsPicker* pickerController = [[CDVContactsPicker alloc] init]; + + pickerController.peoplePickerDelegate = self; + pickerController.callbackId = callbackId; + pickerController.options = options; + pickerController.pickedContactDictionary = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithInt:kABRecordInvalidID], kW3ContactId, nil]; + pickerController.allowsEditing = (BOOL)[options existsValue : @"true" forKey : @"allowsEditing"]; + + if ([self.viewController respondsToSelector:@selector(presentViewController:::)]) { + [self.viewController presentViewController:pickerController animated:YES completion:nil]; + } else { + [self.viewController presentModalViewController:pickerController animated:YES]; + } +} + +- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController*)peoplePicker + shouldContinueAfterSelectingPerson:(ABRecordRef)person +{ + CDVContactsPicker* picker = (CDVContactsPicker*)peoplePicker; + NSNumber* pickedId = [NSNumber numberWithInt:ABRecordGetRecordID(person)]; + + if (picker.allowsEditing) { + ABPersonViewController* personController = [[ABPersonViewController alloc] init]; + personController.displayedPerson = person; + personController.personViewDelegate = self; + personController.allowsEditing = picker.allowsEditing; + // store id so can get info in peoplePickerNavigationControllerDidCancel + picker.pickedContactDictionary = [NSDictionary dictionaryWithObjectsAndKeys:pickedId, kW3ContactId, nil]; + + [peoplePicker pushViewController:personController animated:YES]; + } else { + // Retrieve and return pickedContact information + CDVContact* pickedContact = [[CDVContact alloc] initFromABRecord:(ABRecordRef)person]; + NSArray* fields = [picker.options objectForKey:@"fields"]; + NSDictionary* returnFields = [[CDVContact class] calcReturnFields:fields]; + picker.pickedContactDictionary = [pickedContact toDictionary:returnFields]; + + CDVPluginResult* result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDictionary:picker.pickedContactDictionary]; + [self.commandDelegate sendPluginResult:result callbackId:picker.callbackId]; + + if ([picker respondsToSelector:@selector(presentingViewController)]) { + [[picker presentingViewController] dismissViewControllerAnimated:YES completion:nil]; + } else { + [[picker parentViewController] dismissModalViewControllerAnimated:YES]; + } + } + return NO; +} + +- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController*)peoplePicker + shouldContinueAfterSelectingPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier +{ + return YES; +} + +- (void)peoplePickerNavigationControllerDidCancel:(ABPeoplePickerNavigationController*)peoplePicker +{ + // return contactId or invalid if none picked + CDVContactsPicker* picker = (CDVContactsPicker*)peoplePicker; + + if (picker.allowsEditing) { + // get the info after possible edit + // if we got this far, user has already approved/ disapproved addressBook access + ABAddressBookRef addrBook = nil; +#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 60000 + if (&ABAddressBookCreateWithOptions != NULL) { + addrBook = ABAddressBookCreateWithOptions(NULL, NULL); + } else +#endif + { + // iOS 4 & 5 + addrBook = ABAddressBookCreate(); + } + ABRecordRef person = ABAddressBookGetPersonWithRecordID(addrBook, [[picker.pickedContactDictionary objectForKey:kW3ContactId] integerValue]); + if (person) { + CDVContact* pickedContact = [[CDVContact alloc] initFromABRecord:(ABRecordRef)person]; + NSArray* fields = [picker.options objectForKey:@"fields"]; + NSDictionary* returnFields = [[CDVContact class] calcReturnFields:fields]; + picker.pickedContactDictionary = [pickedContact toDictionary:returnFields]; + } + CFRelease(addrBook); + } + CDVPluginResult* result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDictionary:picker.pickedContactDictionary]; + [self.commandDelegate sendPluginResult:result callbackId:picker.callbackId]; + + if ([peoplePicker respondsToSelector:@selector(presentingViewController)]) { + [[peoplePicker presentingViewController] dismissViewControllerAnimated:YES completion:nil]; + } else { + [[peoplePicker parentViewController] dismissModalViewControllerAnimated:YES]; + } +} + +- (void)search:(CDVInvokedUrlCommand*)command +{ + NSString* callbackId = command.callbackId; + NSArray* fields = [command.arguments objectAtIndex:0]; + NSDictionary* findOptions = [command.arguments objectAtIndex:1 withDefault:[NSNull null]]; + + [self.commandDelegate runInBackground:^{ + // from Apple: Important You must ensure that an instance of ABAddressBookRef is used by only one thread. + // which is why address book is created within the dispatch queue. + // more details here: http: //blog.byadrian.net/2012/05/05/ios-addressbook-framework-and-gcd/ + CDVAddressBookHelper* abHelper = [[CDVAddressBookHelper alloc] init]; + CDVContacts* __weak weakSelf = self; // play it safe to avoid retain cycles + // it gets uglier, block within block..... + [abHelper createAddressBook: ^(ABAddressBookRef addrBook, CDVAddressBookAccessError* errCode) { + if (addrBook == NULL) { + // permission was denied or other error - return error + CDVPluginResult* result = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageToErrorObject:errCode ? errCode.errorCode:UNKNOWN_ERROR]; + [weakSelf.commandDelegate sendPluginResult:result callbackId:callbackId]; + return; + } + + NSArray* foundRecords = nil; + // get the findOptions values + BOOL multiple = NO; // default is false + NSString* filter = nil; + if (![findOptions isKindOfClass:[NSNull class]]) { + id value = nil; + filter = (NSString*)[findOptions objectForKey:@"filter"]; + value = [findOptions objectForKey:@"multiple"]; + if ([value isKindOfClass:[NSNumber class]]) { + // multiple is a boolean that will come through as an NSNumber + multiple = [(NSNumber*)value boolValue]; + // NSLog(@"multiple is: %d", multiple); + } + } + + NSDictionary* returnFields = [[CDVContact class] calcReturnFields:fields]; + + NSMutableArray* matches = nil; + if (!filter || [filter isEqualToString:@""]) { + // get all records + foundRecords = (__bridge_transfer NSArray*)ABAddressBookCopyArrayOfAllPeople(addrBook); + if (foundRecords && ([foundRecords count] > 0)) { + // create Contacts and put into matches array + // doesn't make sense to ask for all records when multiple == NO but better check + int xferCount = multiple == YES ? [foundRecords count] : 1; + matches = [NSMutableArray arrayWithCapacity:xferCount]; + + for (int k = 0; k < xferCount; k++) { + CDVContact* xferContact = [[CDVContact alloc] initFromABRecord:(__bridge ABRecordRef)[foundRecords objectAtIndex:k]]; + [matches addObject:xferContact]; + xferContact = nil; + } + } + } else { + foundRecords = (__bridge_transfer NSArray*)ABAddressBookCopyArrayOfAllPeople(addrBook); + matches = [NSMutableArray arrayWithCapacity:1]; + BOOL bFound = NO; + int testCount = [foundRecords count]; + + for (int j = 0; j < testCount; j++) { + CDVContact* testContact = [[CDVContact alloc] initFromABRecord:(__bridge ABRecordRef)[foundRecords objectAtIndex:j]]; + if (testContact) { + bFound = [testContact foundValue:filter inFields:returnFields]; + if (bFound) { + [matches addObject:testContact]; + } + testContact = nil; + } + } + } + NSMutableArray* returnContacts = [NSMutableArray arrayWithCapacity:1]; + + if ((matches != nil) && ([matches count] > 0)) { + // convert to JS Contacts format and return in callback + // - returnFields determines what properties to return + @autoreleasepool { + int count = multiple == YES ? [matches count] : 1; + + for (int i = 0; i < count; i++) { + CDVContact* newContact = [matches objectAtIndex:i]; + NSDictionary* aContact = [newContact toDictionary:returnFields]; + [returnContacts addObject:aContact]; + } + } + } + // return found contacts (array is empty if no contacts found) + CDVPluginResult* result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsArray:returnContacts]; + [weakSelf.commandDelegate sendPluginResult:result callbackId:callbackId]; + // NSLog(@"findCallback string: %@", jsString); + + if (addrBook) { + CFRelease(addrBook); + } + }]; + }]; // end of workQueue block + + return; +} + +- (void)save:(CDVInvokedUrlCommand*)command +{ + NSString* callbackId = command.callbackId; + NSDictionary* contactDict = [command.arguments objectAtIndex:0]; + + [self.commandDelegate runInBackground:^{ + CDVAddressBookHelper* abHelper = [[CDVAddressBookHelper alloc] init]; + CDVContacts* __weak weakSelf = self; // play it safe to avoid retain cycles + + [abHelper createAddressBook: ^(ABAddressBookRef addrBook, CDVAddressBookAccessError* errorCode) { + CDVPluginResult* result = nil; + if (addrBook == NULL) { + // permission was denied or other error - return error + result = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsInt:errorCode ? errorCode.errorCode:UNKNOWN_ERROR]; + [weakSelf.commandDelegate sendPluginResult:result callbackId:callbackId]; + return; + } + + bool bIsError = FALSE, bSuccess = FALSE; + BOOL bUpdate = NO; + CDVContactError errCode = UNKNOWN_ERROR; + CFErrorRef error; + NSNumber* cId = [contactDict valueForKey:kW3ContactId]; + CDVContact* aContact = nil; + ABRecordRef rec = nil; + if (cId && ![cId isKindOfClass:[NSNull class]]) { + rec = ABAddressBookGetPersonWithRecordID(addrBook, [cId intValue]); + if (rec) { + aContact = [[CDVContact alloc] initFromABRecord:rec]; + bUpdate = YES; + } + } + if (!aContact) { + aContact = [[CDVContact alloc] init]; + } + + bSuccess = [aContact setFromContactDict:contactDict asUpdate:bUpdate]; + if (bSuccess) { + if (!bUpdate) { + bSuccess = ABAddressBookAddRecord(addrBook, [aContact record], &error); + } + if (bSuccess) { + bSuccess = ABAddressBookSave(addrBook, &error); + } + if (!bSuccess) { // need to provide error codes + bIsError = TRUE; + errCode = IO_ERROR; + } else { + // give original dictionary back? If generate dictionary from saved contact, have no returnFields specified + // so would give back all fields (which W3C spec. indicates is not desired) + // for now (while testing) give back saved, full contact + NSDictionary* newContact = [aContact toDictionary:[CDVContact defaultFields]]; + // NSString* contactStr = [newContact JSONRepresentation]; + result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDictionary:newContact]; + } + } else { + bIsError = TRUE; + errCode = IO_ERROR; + } + CFRelease(addrBook); + + if (bIsError) { + result = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsInt:errCode]; + } + + if (result) { + [weakSelf.commandDelegate sendPluginResult:result callbackId:callbackId]; + } + }]; + }]; // end of queue +} + +- (void)remove:(CDVInvokedUrlCommand*)command +{ + NSString* callbackId = command.callbackId; + NSNumber* cId = [command.arguments objectAtIndex:0]; + + CDVAddressBookHelper* abHelper = [[CDVAddressBookHelper alloc] init]; + CDVContacts* __weak weakSelf = self; // play it safe to avoid retain cycles + + [abHelper createAddressBook: ^(ABAddressBookRef addrBook, CDVAddressBookAccessError* errorCode) { + CDVPluginResult* result = nil; + if (addrBook == NULL) { + // permission was denied or other error - return error + result = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsInt:errorCode ? errorCode.errorCode:UNKNOWN_ERROR]; + [weakSelf.commandDelegate sendPluginResult:result callbackId:callbackId]; + return; + } + + bool bIsError = FALSE, bSuccess = FALSE; + CDVContactError errCode = UNKNOWN_ERROR; + CFErrorRef error; + ABRecordRef rec = nil; + if (cId && ![cId isKindOfClass:[NSNull class]] && ([cId intValue] != kABRecordInvalidID)) { + rec = ABAddressBookGetPersonWithRecordID(addrBook, [cId intValue]); + if (rec) { + bSuccess = ABAddressBookRemoveRecord(addrBook, rec, &error); + if (!bSuccess) { + bIsError = TRUE; + errCode = IO_ERROR; + } else { + bSuccess = ABAddressBookSave(addrBook, &error); + if (!bSuccess) { + bIsError = TRUE; + errCode = IO_ERROR; + } else { + // set id to null + // [contactDict setObject:[NSNull null] forKey:kW3ContactId]; + // result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDictionary: contactDict]; + result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK]; + // NSString* contactStr = [contactDict JSONRepresentation]; + } + } + } else { + // no record found return error + bIsError = TRUE; + errCode = UNKNOWN_ERROR; + } + } else { + // invalid contact id provided + bIsError = TRUE; + errCode = INVALID_ARGUMENT_ERROR; + } + + if (addrBook) { + CFRelease(addrBook); + } + if (bIsError) { + result = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsInt:errCode]; + } + if (result) { + [weakSelf.commandDelegate sendPluginResult:result callbackId:callbackId]; + } + }]; + return; +} + +@end + +/* ABPersonViewController does not have any UI to dismiss. Adding navigationItems to it does not work properly + * The navigationItems are lost when the app goes into the background. The solution was to create an empty + * NavController in front of the ABPersonViewController. This will cause the ABPersonViewController to have a back button. By subclassing the ABPersonViewController, we can override viewDidDisappear and take down the entire NavigationController. + */ +@implementation CDVDisplayContactViewController +@synthesize contactsPlugin; + +- (void)viewWillDisappear:(BOOL)animated +{ + [super viewWillDisappear:animated]; + + if ([self respondsToSelector:@selector(presentingViewController)]) { + [[self presentingViewController] dismissViewControllerAnimated:YES completion:nil]; + } else { + [[self parentViewController] dismissModalViewControllerAnimated:YES]; + } +} + +@end +@implementation CDVAddressBookAccessError + +@synthesize errorCode; + +- (CDVAddressBookAccessError*)initWithCode:(CDVContactError)code +{ + self = [super init]; + if (self) { + self.errorCode = code; + } + return self; +} + +@end + +@implementation CDVAddressBookHelper + +/** + * NOTE: workerBlock is responsible for releasing the addressBook that is passed to it + */ +- (void)createAddressBook:(CDVAddressBookWorkerBlock)workerBlock +{ + // TODO: this probably should be reworked - seems like the workerBlock can just create and release its own AddressBook, + // and also this important warning from (http://developer.apple.com/library/ios/#documentation/ContactData/Conceptual/AddressBookProgrammingGuideforiPhone/Chapters/BasicObjects.html): + // "Important: Instances of ABAddressBookRef cannot be used by multiple threads. Each thread must make its own instance." + ABAddressBookRef addressBook; + +#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 60000 + if (&ABAddressBookCreateWithOptions != NULL) { + CFErrorRef error = nil; + // CFIndex status = ABAddressBookGetAuthorizationStatus(); + addressBook = ABAddressBookCreateWithOptions(NULL, &error); + // NSLog(@"addressBook access: %lu", status); + ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error) { + // callback can occur in background, address book must be accessed on thread it was created on + dispatch_sync(dispatch_get_main_queue(), ^{ + if (error) { + workerBlock(NULL, [[CDVAddressBookAccessError alloc] initWithCode:UNKNOWN_ERROR]); + } else if (!granted) { + workerBlock(NULL, [[CDVAddressBookAccessError alloc] initWithCode:PERMISSION_DENIED_ERROR]); + } else { + // access granted + workerBlock(addressBook, [[CDVAddressBookAccessError alloc] initWithCode:UNKNOWN_ERROR]); + } + }); + }); + } else +#endif + { + // iOS 4 or 5 no checks needed + addressBook = ABAddressBookCreate(); + workerBlock(addressBook, NULL); + } +} + +@end diff --git a/cordova-lib/spec-plugman-install/plugins/Contacts/src/wp/Contacts.cs b/cordova-lib/spec-plugman-install/plugins/Contacts/src/wp/Contacts.cs new file mode 100644 index 000000000..6789bb8a0 --- /dev/null +++ b/cordova-lib/spec-plugman-install/plugins/Contacts/src/wp/Contacts.cs @@ -0,0 +1,664 @@ +/* + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +using Microsoft.Phone.Tasks; +using Microsoft.Phone.UserData; +using System; +using System.Collections; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Runtime.Serialization; +using System.Windows; +using DeviceContacts = Microsoft.Phone.UserData.Contacts; + + +namespace WPCordovaClassLib.Cordova.Commands +{ + [DataContract] + public class SearchOptions + { + [DataMember] + public string filter { get; set; } + [DataMember] + public bool multiple { get; set; } + } + + [DataContract] + public class ContactSearchParams + { + [DataMember] + public string[] fields { get; set; } + [DataMember] + public SearchOptions options { get; set; } + } + + [DataContract] + public class JSONContactAddress + { + [DataMember] + public string formatted { get; set; } + [DataMember] + public string type { get; set; } + [DataMember] + public string streetAddress { get; set; } + [DataMember] + public string locality { get; set; } + [DataMember] + public string region { get; set; } + [DataMember] + public string postalCode { get; set; } + [DataMember] + public string country { get; set; } + [DataMember] + public bool pref { get; set; } + } + + [DataContract] + public class JSONContactName + { + [DataMember] + public string formatted { get; set; } + [DataMember] + public string familyName { get; set; } + [DataMember] + public string givenName { get; set; } + [DataMember] + public string middleName { get; set; } + [DataMember] + public string honorificPrefix { get; set; } + [DataMember] + public string honorificSuffix { get; set; } + } + + [DataContract] + public class JSONContactField + { + [DataMember] + public string type { get; set; } + [DataMember] + public string value { get; set; } + [DataMember] + public bool pref { get; set; } + } + + [DataContract] + public class JSONContactOrganization + { + [DataMember] + public string type { get; set; } + [DataMember] + public string name { get; set; } + [DataMember] + public bool pref { get; set; } + [DataMember] + public string department { get; set; } + [DataMember] + public string title { get; set; } + } + + [DataContract] + public class JSONContact + { + [DataMember] + public string id { get; set; } + [DataMember] + public string rawId { get; set; } + [DataMember] + public string displayName { get; set; } + [DataMember] + public string nickname { get; set; } + [DataMember] + public string note { get; set; } + + [DataMember] + public JSONContactName name { get; set; } + + [DataMember] + public JSONContactField[] emails { get; set; } + + [DataMember] + public JSONContactField[] phoneNumbers { get; set; } + + [DataMember] + public JSONContactField[] ims { get; set; } + + [DataMember] + public JSONContactField[] photos { get; set; } + + [DataMember] + public JSONContactField[] categories { get; set; } + + [DataMember] + public JSONContactField[] urls { get; set; } + + [DataMember] + public JSONContactOrganization[] organizations { get; set; } + + [DataMember] + public JSONContactAddress[] addresses { get; set; } + } + + + public class Contacts : BaseCommand + { + + public const int UNKNOWN_ERROR = 0; + public const int INVALID_ARGUMENT_ERROR = 1; + public const int TIMEOUT_ERROR = 2; + public const int PENDING_OPERATION_ERROR = 3; + public const int IO_ERROR = 4; + public const int NOT_SUPPORTED_ERROR = 5; + public const int PERMISSION_DENIED_ERROR = 20; + public const int SYNTAX_ERR = 8; + + public Contacts() + { + + } + + // refer here for contact properties we can access: http://msdn.microsoft.com/en-us/library/microsoft.phone.tasks.savecontacttask_members%28v=VS.92%29.aspx + public void save(string jsonContact) + { + + // jsonContact is actually an array of 1 {contact} + string[] args = JSON.JsonHelper.Deserialize(jsonContact); + + + JSONContact contact = JSON.JsonHelper.Deserialize(args[0]); + + SaveContactTask contactTask = new SaveContactTask(); + + if (contact.nickname != null) + { + contactTask.Nickname = contact.nickname; + } + if (contact.urls != null && contact.urls.Length > 0) + { + contactTask.Website = contact.urls[0].value; + } + if (contact.note != null) + { + contactTask.Notes = contact.note; + } + + #region contact.name + if (contact.name != null) + { + if (contact.name.givenName != null) + contactTask.FirstName = contact.name.givenName; + if (contact.name.familyName != null) + contactTask.LastName = contact.name.familyName; + if (contact.name.middleName != null) + contactTask.MiddleName = contact.name.middleName; + if (contact.name.honorificSuffix != null) + contactTask.Suffix = contact.name.honorificSuffix; + if (contact.name.honorificPrefix != null) + contactTask.Title = contact.name.honorificPrefix; + } + #endregion + + #region contact.org + if (contact.organizations != null && contact.organizations.Count() > 0) + { + contactTask.Company = contact.organizations[0].name; + contactTask.JobTitle = contact.organizations[0].title; + } + #endregion + + #region contact.phoneNumbers + if (contact.phoneNumbers != null && contact.phoneNumbers.Length > 0) + { + foreach (JSONContactField field in contact.phoneNumbers) + { + string fieldType = field.type.ToLower(); + if (fieldType == "work") + { + contactTask.WorkPhone = field.value; + } + else if (fieldType == "home") + { + contactTask.HomePhone = field.value; + } + else if (fieldType == "mobile") + { + contactTask.MobilePhone = field.value; + } + } + } + #endregion + + #region contact.emails + + if (contact.emails != null && contact.emails.Length > 0) + { + + // set up different email types if they are not explicitly defined + foreach (string type in new string[] { "personal", "work", "other" }) + { + foreach (JSONContactField field in contact.emails) + { + if (field != null && String.IsNullOrEmpty(field.type)) + { + field.type = type; + break; + } + } + } + + foreach (JSONContactField field in contact.emails) + { + if (field != null) + { + if (field.type != null && field.type != "other") + { + string fieldType = field.type.ToLower(); + if (fieldType == "work") + { + contactTask.WorkEmail = field.value; + } + else if (fieldType == "home" || fieldType == "personal") + { + contactTask.PersonalEmail = field.value; + } + } + else + { + contactTask.OtherEmail = field.value; + } + } + + } + } + #endregion + + if (contact.note != null && contact.note.Length > 0) + { + contactTask.Notes = contact.note; + } + + #region contact.addresses + if (contact.addresses != null && contact.addresses.Length > 0) + { + foreach (JSONContactAddress address in contact.addresses) + { + if (address.type == null) + { + address.type = "home"; // set a default + } + string fieldType = address.type.ToLower(); + if (fieldType == "work") + { + contactTask.WorkAddressCity = address.locality; + contactTask.WorkAddressCountry = address.country; + contactTask.WorkAddressState = address.region; + contactTask.WorkAddressStreet = address.streetAddress; + contactTask.WorkAddressZipCode = address.postalCode; + } + else if (fieldType == "home" || fieldType == "personal") + { + contactTask.HomeAddressCity = address.locality; + contactTask.HomeAddressCountry = address.country; + contactTask.HomeAddressState = address.region; + contactTask.HomeAddressStreet = address.streetAddress; + contactTask.HomeAddressZipCode = address.postalCode; + } + else + { + // no other address fields available ... + Debug.WriteLine("Creating contact with unsupported address type :: " + address.type); + } + } + } + #endregion + + + contactTask.Completed += new EventHandler(ContactSaveTaskCompleted); + contactTask.Show(); + } + + void ContactSaveTaskCompleted(object sender, SaveContactResult e) + { + SaveContactTask task = sender as SaveContactTask; + + if (e.TaskResult == TaskResult.OK) + { + + Deployment.Current.Dispatcher.BeginInvoke(() => + { + DeviceContacts deviceContacts = new DeviceContacts(); + deviceContacts.SearchCompleted += new EventHandler(postAdd_SearchCompleted); + + string displayName = String.Format("{0}{2}{1}", task.FirstName, task.LastName, String.IsNullOrEmpty(task.FirstName) ? "" : " "); + + deviceContacts.SearchAsync(displayName, FilterKind.DisplayName, task); + }); + + + } + else if (e.TaskResult == TaskResult.Cancel) + { + DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, "Operation cancelled.")); + } + } + + void postAdd_SearchCompleted(object sender, ContactsSearchEventArgs e) + { + if (e.Results.Count() > 0) + { + List foundContacts = new List(); + + int n = (from Contact contact in e.Results select contact.GetHashCode()).Max(); + Contact newContact = (from Contact contact in e.Results + where contact.GetHashCode() == n + select contact).First(); + + DispatchCommandResult(new PluginResult(PluginResult.Status.OK, FormatJSONContact(newContact, null))); + } + else + { + DispatchCommandResult(new PluginResult(PluginResult.Status.NO_RESULT)); + } + } + + + + public void remove(string id) + { + // note id is wrapped in [] and always has exactly one string ... + DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, "{\"code\":" + NOT_SUPPORTED_ERROR + "}")); + } + + public void search(string searchCriteria) + { + string[] args = JSON.JsonHelper.Deserialize(searchCriteria); + + ContactSearchParams searchParams = new ContactSearchParams(); + try + { + searchParams.fields = JSON.JsonHelper.Deserialize(args[0]); + searchParams.options = JSON.JsonHelper.Deserialize(args[1]); + } + catch (Exception) + { + DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, INVALID_ARGUMENT_ERROR)); + return; + } + + if (searchParams.options == null) + { + searchParams.options = new SearchOptions(); + searchParams.options.filter = ""; + searchParams.options.multiple = true; + } + + DeviceContacts deviceContacts = new DeviceContacts(); + deviceContacts.SearchCompleted += new EventHandler(contacts_SearchCompleted); + + // default is to search all fields + FilterKind filterKind = FilterKind.None; + // if only one field is specified, we will try the 3 available DeviceContact search filters + if (searchParams.fields.Count() == 1) + { + if (searchParams.fields.Contains("name")) + { + filterKind = FilterKind.DisplayName; + } + else if (searchParams.fields.Contains("emails")) + { + filterKind = FilterKind.EmailAddress; + } + else if (searchParams.fields.Contains("phoneNumbers")) + { + filterKind = FilterKind.PhoneNumber; + } + } + + try + { + + deviceContacts.SearchAsync(searchParams.options.filter, filterKind, searchParams); + } + catch (Exception ex) + { + Debug.WriteLine("search contacts exception :: " + ex.Message); + } + } + + private void contacts_SearchCompleted(object sender, ContactsSearchEventArgs e) + { + ContactSearchParams searchParams = (ContactSearchParams)e.State; + + List foundContacts = null; + + // if we have multiple search fields + if (searchParams.options.filter.Length > 0 && searchParams.fields.Count() > 1) + { + foundContacts = new List(); + if (searchParams.fields.Contains("emails")) + { + foundContacts.AddRange(from Contact con in e.Results + from ContactEmailAddress a in con.EmailAddresses + where a.EmailAddress.Contains(searchParams.options.filter) + select con); + } + if (searchParams.fields.Contains("displayName")) + { + foundContacts.AddRange(from Contact con in e.Results + where con.DisplayName.Contains(searchParams.options.filter) + select con); + } + if (searchParams.fields.Contains("name")) + { + foundContacts.AddRange(from Contact con in e.Results + where con.CompleteName != null && con.CompleteName.ToString().Contains(searchParams.options.filter) + select con); + } + if (searchParams.fields.Contains("phoneNumbers")) + { + foundContacts.AddRange(from Contact con in e.Results + from ContactPhoneNumber a in con.PhoneNumbers + where a.PhoneNumber.Contains(searchParams.options.filter) + select con); + } + if (searchParams.fields.Contains("urls")) + { + foundContacts.AddRange(from Contact con in e.Results + from string a in con.Websites + where a.Contains(searchParams.options.filter) + select con); + } + } + else + { + foundContacts = new List(e.Results); + } + + //List contactList = new List(); + + string strResult = ""; + + IEnumerable distinctContacts = foundContacts.Distinct(); + + foreach (Contact contact in distinctContacts) + { + strResult += FormatJSONContact(contact, null) + ","; + //contactList.Add(FormatJSONContact(contact, null)); + if (!searchParams.options.multiple) + { + break; // just return the first item + } + } + PluginResult result = new PluginResult(PluginResult.Status.OK); + result.Message = "[" + strResult.TrimEnd(',') + "]"; + DispatchCommandResult(result); + + } + + private string FormatJSONPhoneNumbers(Contact con) + { + string retVal = ""; + string contactFieldFormat = "\"type\":\"{0}\",\"value\":\"{1}\",\"pref\":\"false\""; + foreach (ContactPhoneNumber number in con.PhoneNumbers) + { + + string contactField = string.Format(contactFieldFormat, + number.Kind.ToString(), + number.PhoneNumber); + + retVal += "{" + contactField + "},"; + } + return retVal.TrimEnd(','); + } + + private string FormatJSONEmails(Contact con) + { + string retVal = ""; + string contactFieldFormat = "\"type\":\"{0}\",\"value\":\"{1}\",\"pref\":\"false\""; + foreach (ContactEmailAddress address in con.EmailAddresses) + { + string contactField = string.Format(contactFieldFormat, + address.Kind.ToString(), + address.EmailAddress); + + retVal += "{" + contactField + "},"; + } + return retVal.TrimEnd(','); + } + + private string getFormattedJSONAddress(ContactAddress address, bool isPreferred) + { + + string addressFormatString = "\"pref\":{0}," + // bool + "\"type\":\"{1}\"," + + "\"formatted\":\"{2}\"," + + "\"streetAddress\":\"{3}\"," + + "\"locality\":\"{4}\"," + + "\"region\":\"{5}\"," + + "\"postalCode\":\"{6}\"," + + "\"country\":\"{7}\""; + + string formattedAddress = address.PhysicalAddress.AddressLine1 + " " + + address.PhysicalAddress.AddressLine2 + " " + + address.PhysicalAddress.City + " " + + address.PhysicalAddress.StateProvince + " " + + address.PhysicalAddress.CountryRegion + " " + + address.PhysicalAddress.PostalCode; + + string jsonAddress = string.Format(addressFormatString, + isPreferred ? "\"true\"" : "\"false\"", + address.Kind.ToString(), + formattedAddress, + address.PhysicalAddress.AddressLine1 + " " + address.PhysicalAddress.AddressLine2, + address.PhysicalAddress.City, + address.PhysicalAddress.StateProvince, + address.PhysicalAddress.PostalCode, + address.PhysicalAddress.CountryRegion); + + //Debug.WriteLine("getFormattedJSONAddress returning :: " + jsonAddress); + + return "{" + jsonAddress + "}"; + } + + private string FormatJSONAddresses(Contact con) + { + string retVal = ""; + foreach (ContactAddress address in con.Addresses) + { + retVal += this.getFormattedJSONAddress(address, false) + ","; + } + + //Debug.WriteLine("FormatJSONAddresses returning :: " + retVal); + return retVal.TrimEnd(','); + } + + private string FormatJSONWebsites(Contact con) + { + string retVal = ""; + foreach (string website in con.Websites) + { + retVal += "\"" + website + "\","; + } + return retVal.TrimEnd(','); + } + + /* + * formatted: The complete name of the contact. (DOMString) + familyName: The contacts family name. (DOMString) + givenName: The contacts given name. (DOMString) + middleName: The contacts middle name. (DOMString) + honorificPrefix: The contacts prefix (example Mr. or Dr.) (DOMString) + honorificSuffix: The contacts suffix (example Esq.). (DOMString) + */ + private string FormatJSONName(Contact con) + { + string retVal = ""; + string formatStr = "\"formatted\":\"{0}\"," + + "\"familyName\":\"{1}\"," + + "\"givenName\":\"{2}\"," + + "\"middleName\":\"{3}\"," + + "\"honorificPrefix\":\"{4}\"," + + "\"honorificSuffix\":\"{5}\""; + + if (con.CompleteName != null) + { + retVal = string.Format(formatStr, + con.CompleteName.FirstName + " " + con.CompleteName.LastName, // TODO: does this need suffix? middlename? + con.CompleteName.LastName, + con.CompleteName.FirstName, + con.CompleteName.MiddleName, + con.CompleteName.Title, + con.CompleteName.Suffix); + } + else + { + retVal = string.Format(formatStr,"","","","","",""); + } + + return "{" + retVal + "}"; + } + + private string FormatJSONContact(Contact con, string[] fields) + { + + string contactFormatStr = "\"id\":\"{0}\"," + + "\"displayName\":\"{1}\"," + + "\"nickname\":\"{2}\"," + + "\"phoneNumbers\":[{3}]," + + "\"emails\":[{4}]," + + "\"addresses\":[{5}]," + + "\"urls\":[{6}]," + + "\"name\":{7}," + + "\"note\":\"{8}\"," + + "\"birthday\":\"{9}\""; + + + string jsonContact = String.Format(contactFormatStr, + con.GetHashCode(), + con.DisplayName, + con.CompleteName != null ? con.CompleteName.Nickname : "", + FormatJSONPhoneNumbers(con), + FormatJSONEmails(con), + FormatJSONAddresses(con), + FormatJSONWebsites(con), + FormatJSONName(con), + con.Notes.FirstOrDefault(), + con.Birthdays.FirstOrDefault()); + + //Debug.WriteLine("jsonContact = " + jsonContact); + // JSON requires new line characters be escaped + return "{" + jsonContact.Replace("\n", "\\n") + "}"; + } + } +} diff --git a/cordova-lib/spec-plugman-install/plugins/Contacts/www/Contact.js b/cordova-lib/spec-plugman-install/plugins/Contacts/www/Contact.js new file mode 100644 index 000000000..9c46a0cc7 --- /dev/null +++ b/cordova-lib/spec-plugman-install/plugins/Contacts/www/Contact.js @@ -0,0 +1,177 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +var argscheck = require('cordova/argscheck'), + exec = require('cordova/exec'), + ContactError = require('./ContactError'), + utils = require('cordova/utils'); + +/** +* Converts primitives into Complex Object +* Currently only used for Date fields +*/ +function convertIn(contact) { + var value = contact.birthday; + try { + contact.birthday = new Date(parseFloat(value)); + } catch (exception){ + console.log("Cordova Contact convertIn error: exception creating date."); + } + return contact; +} + +/** +* Converts Complex objects into primitives +* Only conversion at present is for Dates. +**/ + +function convertOut(contact) { + var value = contact.birthday; + if (value !== null) { + // try to make it a Date object if it is not already + if (!utils.isDate(value)){ + try { + value = new Date(value); + } catch(exception){ + value = null; + } + } + if (utils.isDate(value)){ + value = value.valueOf(); // convert to milliseconds + } + contact.birthday = value; + } + return contact; +} + +/** +* Contains information about a single contact. +* @constructor +* @param {DOMString} id unique identifier +* @param {DOMString} displayName +* @param {ContactName} name +* @param {DOMString} nickname +* @param {Array.} phoneNumbers array of phone numbers +* @param {Array.} emails array of email addresses +* @param {Array.} addresses array of addresses +* @param {Array.} ims instant messaging user ids +* @param {Array.} organizations +* @param {DOMString} birthday contact's birthday +* @param {DOMString} note user notes about contact +* @param {Array.} photos +* @param {Array.} categories +* @param {Array.} urls contact's web sites +*/ +var Contact = function (id, displayName, name, nickname, phoneNumbers, emails, addresses, + ims, organizations, birthday, note, photos, categories, urls) { + this.id = id || null; + this.rawId = null; + this.displayName = displayName || null; + this.name = name || null; // ContactName + this.nickname = nickname || null; + this.phoneNumbers = phoneNumbers || null; // ContactField[] + this.emails = emails || null; // ContactField[] + this.addresses = addresses || null; // ContactAddress[] + this.ims = ims || null; // ContactField[] + this.organizations = organizations || null; // ContactOrganization[] + this.birthday = birthday || null; + this.note = note || null; + this.photos = photos || null; // ContactField[] + this.categories = categories || null; // ContactField[] + this.urls = urls || null; // ContactField[] +}; + +/** +* Removes contact from device storage. +* @param successCB success callback +* @param errorCB error callback +*/ +Contact.prototype.remove = function(successCB, errorCB) { + argscheck.checkArgs('FF', 'Contact.remove', arguments); + var fail = errorCB && function(code) { + errorCB(new ContactError(code)); + }; + if (this.id === null) { + fail(ContactError.UNKNOWN_ERROR); + } + else { + exec(successCB, fail, "Contacts", "remove", [this.id]); + } +}; + +/** +* Creates a deep copy of this Contact. +* With the contact ID set to null. +* @return copy of this Contact +*/ +Contact.prototype.clone = function() { + var clonedContact = utils.clone(this); + clonedContact.id = null; + clonedContact.rawId = null; + + function nullIds(arr) { + if (arr) { + for (var i = 0; i < arr.length; ++i) { + arr[i].id = null; + } + } + } + + // Loop through and clear out any id's in phones, emails, etc. + nullIds(clonedContact.phoneNumbers); + nullIds(clonedContact.emails); + nullIds(clonedContact.addresses); + nullIds(clonedContact.ims); + nullIds(clonedContact.organizations); + nullIds(clonedContact.categories); + nullIds(clonedContact.photos); + nullIds(clonedContact.urls); + return clonedContact; +}; + +/** +* Persists contact to device storage. +* @param successCB success callback +* @param errorCB error callback +*/ +Contact.prototype.save = function(successCB, errorCB) { + argscheck.checkArgs('FFO', 'Contact.save', arguments); + var fail = errorCB && function(code) { + errorCB(new ContactError(code)); + }; + var success = function(result) { + if (result) { + if (successCB) { + var fullContact = require('./contacts').create(result); + successCB(convertIn(fullContact)); + } + } + else { + // no Entry object returned + fail(ContactError.UNKNOWN_ERROR); + } + }; + var dupContact = convertOut(utils.clone(this)); + exec(success, fail, "Contacts", "save", [dupContact]); +}; + + +module.exports = Contact; diff --git a/cordova-lib/spec-plugman-install/plugins/Contacts/www/ContactAddress.js b/cordova-lib/spec-plugman-install/plugins/Contacts/www/ContactAddress.js new file mode 100644 index 000000000..3d39086dc --- /dev/null +++ b/cordova-lib/spec-plugman-install/plugins/Contacts/www/ContactAddress.js @@ -0,0 +1,46 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +/** +* Contact address. +* @constructor +* @param {DOMString} id unique identifier, should only be set by native code +* @param formatted // NOTE: not a W3C standard +* @param streetAddress +* @param locality +* @param region +* @param postalCode +* @param country +*/ + +var ContactAddress = function(pref, type, formatted, streetAddress, locality, region, postalCode, country) { + this.id = null; + this.pref = (typeof pref != 'undefined' ? pref : false); + this.type = type || null; + this.formatted = formatted || null; + this.streetAddress = streetAddress || null; + this.locality = locality || null; + this.region = region || null; + this.postalCode = postalCode || null; + this.country = country || null; +}; + +module.exports = ContactAddress; diff --git a/cordova-lib/spec-plugman-install/plugins/Contacts/www/ContactError.js b/cordova-lib/spec-plugman-install/plugins/Contacts/www/ContactError.js new file mode 100644 index 000000000..01b229ad5 --- /dev/null +++ b/cordova-lib/spec-plugman-install/plugins/Contacts/www/ContactError.js @@ -0,0 +1,42 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +/** + * ContactError. + * An error code assigned by an implementation when an error has occurred + * @constructor + */ +var ContactError = function(err) { + this.code = (typeof err != 'undefined' ? err : null); +}; + +/** + * Error codes + */ +ContactError.UNKNOWN_ERROR = 0; +ContactError.INVALID_ARGUMENT_ERROR = 1; +ContactError.TIMEOUT_ERROR = 2; +ContactError.PENDING_OPERATION_ERROR = 3; +ContactError.IO_ERROR = 4; +ContactError.NOT_SUPPORTED_ERROR = 5; +ContactError.PERMISSION_DENIED_ERROR = 20; + +module.exports = ContactError; diff --git a/cordova-lib/spec-plugman-install/plugins/Contacts/www/ContactField.js b/cordova-lib/spec-plugman-install/plugins/Contacts/www/ContactField.js new file mode 100644 index 000000000..e84107a43 --- /dev/null +++ b/cordova-lib/spec-plugman-install/plugins/Contacts/www/ContactField.js @@ -0,0 +1,37 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +/** +* Generic contact field. +* @constructor +* @param {DOMString} id unique identifier, should only be set by native code // NOTE: not a W3C standard +* @param type +* @param value +* @param pref +*/ +var ContactField = function(type, value, pref) { + this.id = null; + this.type = (type && type.toString()) || null; + this.value = (value && value.toString()) || null; + this.pref = (typeof pref != 'undefined' ? pref : false); +}; + +module.exports = ContactField; diff --git a/cordova-lib/spec-plugman-install/plugins/Contacts/www/ContactFindOptions.js b/cordova-lib/spec-plugman-install/plugins/Contacts/www/ContactFindOptions.js new file mode 100644 index 000000000..bd8bf3562 --- /dev/null +++ b/cordova-lib/spec-plugman-install/plugins/Contacts/www/ContactFindOptions.js @@ -0,0 +1,34 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +/** + * ContactFindOptions. + * @constructor + * @param filter used to match contacts against + * @param multiple boolean used to determine if more than one contact should be returned + */ + +var ContactFindOptions = function(filter, multiple) { + this.filter = filter || ''; + this.multiple = (typeof multiple != 'undefined' ? multiple : false); +}; + +module.exports = ContactFindOptions; diff --git a/cordova-lib/spec-plugman-install/plugins/Contacts/www/ContactName.js b/cordova-lib/spec-plugman-install/plugins/Contacts/www/ContactName.js new file mode 100644 index 000000000..15cf60b5f --- /dev/null +++ b/cordova-lib/spec-plugman-install/plugins/Contacts/www/ContactName.js @@ -0,0 +1,41 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +/** +* Contact name. +* @constructor +* @param formatted // NOTE: not part of W3C standard +* @param familyName +* @param givenName +* @param middle +* @param prefix +* @param suffix +*/ +var ContactName = function(formatted, familyName, givenName, middle, prefix, suffix) { + this.formatted = formatted || null; + this.familyName = familyName || null; + this.givenName = givenName || null; + this.middleName = middle || null; + this.honorificPrefix = prefix || null; + this.honorificSuffix = suffix || null; +}; + +module.exports = ContactName; diff --git a/cordova-lib/spec-plugman-install/plugins/Contacts/www/ContactOrganization.js b/cordova-lib/spec-plugman-install/plugins/Contacts/www/ContactOrganization.js new file mode 100644 index 000000000..5dd242bdd --- /dev/null +++ b/cordova-lib/spec-plugman-install/plugins/Contacts/www/ContactOrganization.js @@ -0,0 +1,44 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +/** +* Contact organization. +* @constructor +* @param {DOMString} id unique identifier, should only be set by native code // NOTE: not a W3C standard +* @param name +* @param dept +* @param title +* @param startDate +* @param endDate +* @param location +* @param desc +*/ + +var ContactOrganization = function(pref, type, name, dept, title) { + this.id = null; + this.pref = (typeof pref != 'undefined' ? pref : false); + this.type = type || null; + this.name = name || null; + this.department = dept || null; + this.title = title || null; +}; + +module.exports = ContactOrganization; diff --git a/cordova-lib/spec-plugman-install/plugins/Contacts/www/contacts.js b/cordova-lib/spec-plugman-install/plugins/Contacts/www/contacts.js new file mode 100644 index 000000000..5e6b4dbe6 --- /dev/null +++ b/cordova-lib/spec-plugman-install/plugins/Contacts/www/contacts.js @@ -0,0 +1,76 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +var argscheck = require('cordova/argscheck'), + exec = require('cordova/exec'), + ContactError = require('./ContactError'), + utils = require('cordova/utils'), + Contact = require('./Contact'); + +/** +* Represents a group of Contacts. +* @constructor +*/ +var contacts = { + /** + * Returns an array of Contacts matching the search criteria. + * @param fields that should be searched + * @param successCB success callback + * @param errorCB error callback + * @param {ContactFindOptions} options that can be applied to contact searching + * @return array of Contacts matching search criteria + */ + find:function(fields, successCB, errorCB, options) { + argscheck.checkArgs('afFO', 'contacts.find', arguments); + if (!fields.length) { + errorCB && errorCB(new ContactError(ContactError.INVALID_ARGUMENT_ERROR)); + } else { + var win = function(result) { + var cs = []; + for (var i = 0, l = result.length; i < l; i++) { + cs.push(contacts.create(result[i])); + } + successCB(cs); + }; + exec(win, errorCB, "Contacts", "search", [fields, options]); + } + }, + + /** + * This function creates a new contact, but it does not persist the contact + * to device storage. To persist the contact to device storage, invoke + * contact.save(). + * @param properties an object whose properties will be examined to create a new Contact + * @returns new Contact object + */ + create:function(properties) { + argscheck.checkArgs('O', 'contacts.create', arguments); + var contact = new Contact(); + for (var i in properties) { + if (typeof contact[i] !== 'undefined' && properties.hasOwnProperty(i)) { + contact[i] = properties[i]; + } + } + return contact; + } +}; + +module.exports = contacts; diff --git a/cordova-lib/spec-plugman-install/plugins/Contacts/www/ios/Contact.js b/cordova-lib/spec-plugman-install/plugins/Contacts/www/ios/Contact.js new file mode 100644 index 000000000..b40c41acc --- /dev/null +++ b/cordova-lib/spec-plugman-install/plugins/Contacts/www/ios/Contact.js @@ -0,0 +1,51 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +var exec = require('cordova/exec'), + ContactError = require('./ContactError'); + +/** + * Provides iOS Contact.display API. + */ +module.exports = { + display : function(errorCB, options) { + /* + * Display a contact using the iOS Contact Picker UI + * NOT part of W3C spec so no official documentation + * + * @param errorCB error callback + * @param options object + * allowsEditing: boolean AS STRING + * "true" to allow editing the contact + * "false" (default) display contact + */ + + if (this.id === null) { + if (typeof errorCB === "function") { + var errorObj = new ContactError(ContactError.UNKNOWN_ERROR); + errorCB(errorObj); + } + } + else { + exec(null, errorCB, "Contacts","displayContact", [this.id, options]); + } + } +}; diff --git a/cordova-lib/spec-plugman-install/plugins/Contacts/www/ios/contacts.js b/cordova-lib/spec-plugman-install/plugins/Contacts/www/ios/contacts.js new file mode 100644 index 000000000..67cf421fd --- /dev/null +++ b/cordova-lib/spec-plugman-install/plugins/Contacts/www/ios/contacts.js @@ -0,0 +1,62 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +var exec = require('cordova/exec'); + +/** + * Provides iOS enhanced contacts API. + */ +module.exports = { + newContactUI : function(successCallback) { + /* + * Create a contact using the iOS Contact Picker UI + * NOT part of W3C spec so no official documentation + * + * returns: the id of the created contact as param to successCallback + */ + exec(successCallback, null, "Contacts","newContact", []); + }, + chooseContact : function(successCallback, options) { + /* + * Select a contact using the iOS Contact Picker UI + * NOT part of W3C spec so no official documentation + * + * @param errorCB error callback + * @param options object + * allowsEditing: boolean AS STRING + * "true" to allow editing the contact + * "false" (default) display contact + * fields: array of fields to return in contact object (see ContactOptions.fields) + * + * @returns + * id of contact selected + * ContactObject + * if no fields provided contact contains just id information + * if fields provided contact object contains information for the specified fields + * + */ + var win = function(result) { + var fullContact = require('./contacts').create(result); + successCallback(fullContact.id, fullContact); + }; + exec(win, null, "Contacts","chooseContact", [options]); + } +}; diff --git a/cordova-lib/spec-plugman-install/plugins/DummyPlugin/android-resource.xml b/cordova-lib/spec-plugman-install/plugins/DummyPlugin/android-resource.xml new file mode 100644 index 000000000..421376db9 --- /dev/null +++ b/cordova-lib/spec-plugman-install/plugins/DummyPlugin/android-resource.xml @@ -0,0 +1 @@ +dummy diff --git a/cordova-lib/spec-plugman-install/plugins/DummyPlugin/plugin.xml b/cordova-lib/spec-plugman-install/plugins/DummyPlugin/plugin.xml new file mode 100644 index 000000000..0e884433c --- /dev/null +++ b/cordova-lib/spec-plugman-install/plugins/DummyPlugin/plugin.xml @@ -0,0 +1,187 @@ + + + + + + + dummyplugin + + my description + Jackson Badman + dummy,plugin + BSD + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + .dummy1 + + + + + .dummy2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cordova-lib/spec-plugman-install/plugins/DummyPlugin/src/android/DummyPlugin.java b/cordova-lib/spec-plugman-install/plugins/DummyPlugin/src/android/DummyPlugin.java new file mode 100644 index 000000000..5263b0c5d --- /dev/null +++ b/cordova-lib/spec-plugman-install/plugins/DummyPlugin/src/android/DummyPlugin.java @@ -0,0 +1,19 @@ +/* + * + * Copyright 2013 Anis Kadri + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + diff --git a/cordova-lib/spec-plugman-install/plugins/DummyPlugin/src/blackberry10/index.js b/cordova-lib/spec-plugman-install/plugins/DummyPlugin/src/blackberry10/index.js new file mode 100644 index 000000000..5263b0c5d --- /dev/null +++ b/cordova-lib/spec-plugman-install/plugins/DummyPlugin/src/blackberry10/index.js @@ -0,0 +1,19 @@ +/* + * + * Copyright 2013 Anis Kadri + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + diff --git a/cordova-lib/spec-plugman-install/plugins/DummyPlugin/src/ios/Custom.framework/someFheader.h b/cordova-lib/spec-plugman-install/plugins/DummyPlugin/src/ios/Custom.framework/someFheader.h new file mode 100644 index 000000000..e69de29bb diff --git a/cordova-lib/spec-plugman-install/plugins/DummyPlugin/src/ios/Custom.framework/somebinlib b/cordova-lib/spec-plugman-install/plugins/DummyPlugin/src/ios/Custom.framework/somebinlib new file mode 100644 index 000000000..e69de29bb diff --git a/cordova-lib/spec-plugman-install/plugins/DummyPlugin/src/ios/DummyPlugin.bundle b/cordova-lib/spec-plugman-install/plugins/DummyPlugin/src/ios/DummyPlugin.bundle new file mode 100644 index 000000000..e69de29bb diff --git a/cordova-lib/spec-plugman-install/plugins/DummyPlugin/src/ios/DummyPluginCommand.h b/cordova-lib/spec-plugman-install/plugins/DummyPlugin/src/ios/DummyPluginCommand.h new file mode 100644 index 000000000..e69de29bb diff --git a/cordova-lib/spec-plugman-install/plugins/DummyPlugin/src/ios/DummyPluginCommand.m b/cordova-lib/spec-plugman-install/plugins/DummyPlugin/src/ios/DummyPluginCommand.m new file mode 100644 index 000000000..e69de29bb diff --git a/cordova-lib/spec-plugman-install/plugins/DummyPlugin/src/ios/SourceWithFramework.m b/cordova-lib/spec-plugman-install/plugins/DummyPlugin/src/ios/SourceWithFramework.m new file mode 100644 index 000000000..e69de29bb diff --git a/cordova-lib/spec-plugman-install/plugins/DummyPlugin/src/ios/TargetDirTest.h b/cordova-lib/spec-plugman-install/plugins/DummyPlugin/src/ios/TargetDirTest.h new file mode 100644 index 000000000..e69de29bb diff --git a/cordova-lib/spec-plugman-install/plugins/DummyPlugin/src/ios/TargetDirTest.m b/cordova-lib/spec-plugman-install/plugins/DummyPlugin/src/ios/TargetDirTest.m new file mode 100644 index 000000000..e69de29bb diff --git a/cordova-lib/spec-plugman-install/plugins/DummyPlugin/src/ios/libsqlite3.dylib b/cordova-lib/spec-plugman-install/plugins/DummyPlugin/src/ios/libsqlite3.dylib new file mode 100644 index 000000000..e69de29bb diff --git a/cordova-lib/spec-plugman-install/plugins/DummyPlugin/src/tizen/dummer.js b/cordova-lib/spec-plugman-install/plugins/DummyPlugin/src/tizen/dummer.js new file mode 100644 index 000000000..e69de29bb diff --git a/cordova-lib/spec-plugman-install/plugins/DummyPlugin/src/windows8/dummer.js b/cordova-lib/spec-plugman-install/plugins/DummyPlugin/src/windows8/dummer.js new file mode 100644 index 000000000..e69de29bb diff --git a/cordova-lib/spec-plugman-install/plugins/DummyPlugin/src/wp7/DummyPlugin.cs b/cordova-lib/spec-plugman-install/plugins/DummyPlugin/src/wp7/DummyPlugin.cs new file mode 100644 index 000000000..273dc3b3f --- /dev/null +++ b/cordova-lib/spec-plugman-install/plugins/DummyPlugin/src/wp7/DummyPlugin.cs @@ -0,0 +1,19 @@ +/* + * + * Copyright 2013 Benn Mapes + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + diff --git a/cordova-lib/spec-plugman-install/plugins/DummyPlugin/src/wp8/DummyPlugin.cs b/cordova-lib/spec-plugman-install/plugins/DummyPlugin/src/wp8/DummyPlugin.cs new file mode 100644 index 000000000..273dc3b3f --- /dev/null +++ b/cordova-lib/spec-plugman-install/plugins/DummyPlugin/src/wp8/DummyPlugin.cs @@ -0,0 +1,19 @@ +/* + * + * Copyright 2013 Benn Mapes + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + diff --git a/cordova-lib/spec-plugman-install/plugins/DummyPlugin/www/dummyplugin.js b/cordova-lib/spec-plugman-install/plugins/DummyPlugin/www/dummyplugin.js new file mode 100644 index 000000000..5263b0c5d --- /dev/null +++ b/cordova-lib/spec-plugman-install/plugins/DummyPlugin/www/dummyplugin.js @@ -0,0 +1,19 @@ +/* + * + * Copyright 2013 Anis Kadri + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + diff --git a/cordova-lib/spec-plugman-install/plugins/DummyPlugin/www/dummyplugin/image.jpg b/cordova-lib/spec-plugman-install/plugins/DummyPlugin/www/dummyplugin/image.jpg new file mode 100644 index 000000000..257cc5642 --- /dev/null +++ b/cordova-lib/spec-plugman-install/plugins/DummyPlugin/www/dummyplugin/image.jpg @@ -0,0 +1 @@ +foo diff --git a/cordova-lib/spec-plugman-install/plugins/EnginePlugin/megaBoringVersion b/cordova-lib/spec-plugman-install/plugins/EnginePlugin/megaBoringVersion new file mode 100755 index 000000000..cbf791148 --- /dev/null +++ b/cordova-lib/spec-plugman-install/plugins/EnginePlugin/megaBoringVersion @@ -0,0 +1,23 @@ +#! /bin/sh + +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# + +echo 4.0.0 +exit 0 \ No newline at end of file diff --git a/cordova-lib/spec-plugman-install/plugins/EnginePlugin/megaFunVersion b/cordova-lib/spec-plugman-install/plugins/EnginePlugin/megaFunVersion new file mode 100755 index 000000000..1e4c706fa --- /dev/null +++ b/cordova-lib/spec-plugman-install/plugins/EnginePlugin/megaFunVersion @@ -0,0 +1,23 @@ +#! /bin/sh + +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# + +echo 1.0.0 +exit 0 \ No newline at end of file diff --git a/cordova-lib/spec-plugman-install/plugins/EnginePlugin/plugin.xml b/cordova-lib/spec-plugman-install/plugins/EnginePlugin/plugin.xml new file mode 100644 index 000000000..a58f19efe --- /dev/null +++ b/cordova-lib/spec-plugman-install/plugins/EnginePlugin/plugin.xml @@ -0,0 +1,33 @@ + + + + + + Engine Choo Choo + + + + + + + + + diff --git a/cordova-lib/spec-plugman-install/plugins/EnginePluginAndroid/plugin.xml b/cordova-lib/spec-plugman-install/plugins/EnginePluginAndroid/plugin.xml new file mode 100644 index 000000000..fe2bce242 --- /dev/null +++ b/cordova-lib/spec-plugman-install/plugins/EnginePluginAndroid/plugin.xml @@ -0,0 +1,32 @@ + + + + + + Engine Choo Choo + + + + + + + + diff --git a/cordova-lib/spec-plugman-install/plugins/EnginePluginiOS/plugin.xml b/cordova-lib/spec-plugman-install/plugins/EnginePluginiOS/plugin.xml new file mode 100644 index 000000000..d7a9a8e7b --- /dev/null +++ b/cordova-lib/spec-plugman-install/plugins/EnginePluginiOS/plugin.xml @@ -0,0 +1,34 @@ + + + + + + Engine Choo Choo + + + + + + + + + + diff --git a/cordova-lib/spec-plugman-install/plugins/FaultyPlugin/plugin.xml b/cordova-lib/spec-plugman-install/plugins/FaultyPlugin/plugin.xml new file mode 100644 index 000000000..706db4521 --- /dev/null +++ b/cordova-lib/spec-plugman-install/plugins/FaultyPlugin/plugin.xml @@ -0,0 +1,147 @@ + + + + + + Faulty Plugin + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cordova-lib/spec-plugman-install/plugins/FaultyPlugin/src/android/FaultyPlugin.java b/cordova-lib/spec-plugman-install/plugins/FaultyPlugin/src/android/FaultyPlugin.java new file mode 100644 index 000000000..5263b0c5d --- /dev/null +++ b/cordova-lib/spec-plugman-install/plugins/FaultyPlugin/src/android/FaultyPlugin.java @@ -0,0 +1,19 @@ +/* + * + * Copyright 2013 Anis Kadri + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + diff --git a/cordova-lib/spec-plugman-install/plugins/FaultyPlugin/src/blackberry10/client.js b/cordova-lib/spec-plugman-install/plugins/FaultyPlugin/src/blackberry10/client.js new file mode 100644 index 000000000..e69de29bb diff --git a/cordova-lib/spec-plugman-install/plugins/FaultyPlugin/src/ios/FaultyPlugin.h b/cordova-lib/spec-plugman-install/plugins/FaultyPlugin/src/ios/FaultyPlugin.h new file mode 100644 index 000000000..6a23ab6f0 --- /dev/null +++ b/cordova-lib/spec-plugman-install/plugins/FaultyPlugin/src/ios/FaultyPlugin.h @@ -0,0 +1,49 @@ +/* + * + * Copyright 2013 Anis Kadri + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +// +// PhoneGap ! ChildBrowserCommand +// +// +// Created by Jesse MacFadyen on 10-05-29. +// Copyright 2010 Nitobi. All rights reserved. +// + +#import +#ifdef PHONEGAP_FRAMEWORK + #import +#else + #import "PGPlugin.h" +#endif +#import "ChildBrowserViewController.h" + + + +@interface ChildBrowserCommand : PGPlugin { + + ChildBrowserViewController* childBrowser; +} + +@property (nonatomic, retain) ChildBrowserViewController *childBrowser; + + +- (void) showWebPage:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options; +-(void) onChildLocationChange:(NSString*)newLoc; + +@end diff --git a/cordova-lib/spec-plugman-install/plugins/FaultyPlugin/src/ios/FaultyPlugin.m b/cordova-lib/spec-plugman-install/plugins/FaultyPlugin/src/ios/FaultyPlugin.m new file mode 100644 index 000000000..38aaf6497 --- /dev/null +++ b/cordova-lib/spec-plugman-install/plugins/FaultyPlugin/src/ios/FaultyPlugin.m @@ -0,0 +1,86 @@ +// + +// +// +// Created by Jesse MacFadyen on 10-05-29. +// Copyright 2010 Nitobi. All rights reserved. +// Copyright (c) 2011, IBM Corporation +// Copyright 2011, Randy McMillan +// + +#import "ChildBrowserCommand.h" + +#ifdef PHONEGAP_FRAMEWORK + #import +#else + #import "PhoneGapViewController.h" +#endif + + +@implementation ChildBrowserCommand + +@synthesize childBrowser; + +- (void) showWebPage:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options // args: url +{ + + if(childBrowser == NULL) + { + childBrowser = [[ ChildBrowserViewController alloc ] initWithScale:FALSE ]; + childBrowser.delegate = self; + } + +/* // TODO: Work in progress + NSString* strOrientations = [ options objectForKey:@"supportedOrientations"]; + NSArray* supportedOrientations = [strOrientations componentsSeparatedByString:@","]; +*/ + PhoneGapViewController* cont = (PhoneGapViewController*)[ super appViewController ]; + childBrowser.supportedOrientations = cont.supportedOrientations; + + if ([cont respondsToSelector:@selector(presentViewController)]) { + //Reference UIViewController.h Line:179 for update to iOS 5 difference - @RandyMcMillan + [cont presentViewController:childBrowser animated:YES completion:nil]; + } else { + [ cont presentModalViewController:childBrowser animated:YES ]; + } + + NSString *url = (NSString*) [arguments objectAtIndex:0]; + + [childBrowser loadURL:url ]; + +} + +-(void) close:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options // args: url +{ + [ childBrowser closeBrowser]; + +} + +-(void) onClose +{ + NSString* jsCallback = [NSString stringWithFormat:@"ChildBrowser._onClose();",@""]; + [self.webView stringByEvaluatingJavaScriptFromString:jsCallback]; +} + +-(void) onOpenInSafari +{ + NSString* jsCallback = [NSString stringWithFormat:@"ChildBrowser._onOpenExternal();",@""]; + [self.webView stringByEvaluatingJavaScriptFromString:jsCallback]; +} + + +-(void) onChildLocationChange:(NSString*)newLoc +{ + + NSString* tempLoc = [NSString stringWithFormat:@"%@",newLoc]; + NSString* encUrl = [tempLoc stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; + + NSString* jsCallback = [NSString stringWithFormat:@"ChildBrowser._onLocationChange('%@');",encUrl]; + [self.webView stringByEvaluatingJavaScriptFromString:jsCallback]; + +} + + + + +@end diff --git a/cordova-lib/spec-plugman-install/plugins/FaultyPlugin/src/windows8/faultyPlugin.js b/cordova-lib/spec-plugman-install/plugins/FaultyPlugin/src/windows8/faultyPlugin.js new file mode 100644 index 000000000..e69de29bb diff --git a/cordova-lib/spec-plugman-install/plugins/FaultyPlugin/src/wp7/FaultyPlugin.cs b/cordova-lib/spec-plugman-install/plugins/FaultyPlugin/src/wp7/FaultyPlugin.cs new file mode 100644 index 000000000..5263b0c5d --- /dev/null +++ b/cordova-lib/spec-plugman-install/plugins/FaultyPlugin/src/wp7/FaultyPlugin.cs @@ -0,0 +1,19 @@ +/* + * + * Copyright 2013 Anis Kadri + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + diff --git a/cordova-lib/spec-plugman-install/plugins/FaultyPlugin/src/wp8/FaultyPlugin.cs b/cordova-lib/spec-plugman-install/plugins/FaultyPlugin/src/wp8/FaultyPlugin.cs new file mode 100644 index 000000000..5263b0c5d --- /dev/null +++ b/cordova-lib/spec-plugman-install/plugins/FaultyPlugin/src/wp8/FaultyPlugin.cs @@ -0,0 +1,19 @@ +/* + * + * Copyright 2013 Anis Kadri + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + diff --git a/cordova-lib/spec-plugman-install/plugins/VariablePlugin/plugin.xml b/cordova-lib/spec-plugman-install/plugins/VariablePlugin/plugin.xml new file mode 100644 index 000000000..9eff72975 --- /dev/null +++ b/cordova-lib/spec-plugman-install/plugins/VariablePlugin/plugin.xml @@ -0,0 +1,59 @@ + + + + + + Use Variables + + + + Remember that your api key is $API_KEY! + + + + + $PACKAGE_NAME + + + + + + + + + $PACKAGE_NAME + + + + + + + + + $PACKAGE_NAME + + + + + + diff --git a/cordova-lib/spec-plugman-install/plugins/WebNotifications/plugin.xml b/cordova-lib/spec-plugman-install/plugins/WebNotifications/plugin.xml new file mode 100644 index 000000000..b9026f18e --- /dev/null +++ b/cordova-lib/spec-plugman-install/plugins/WebNotifications/plugin.xml @@ -0,0 +1,47 @@ + + + + + + Web Notifications + + + + + + + + + + + + + + + + + + + + diff --git a/cordova-lib/spec-plugman-install/plugins/WebNotifications/src/ios/AppDelegate.m.diff b/cordova-lib/spec-plugman-install/plugins/WebNotifications/src/ios/AppDelegate.m.diff new file mode 100644 index 000000000..754d079fc --- /dev/null +++ b/cordova-lib/spec-plugman-install/plugins/WebNotifications/src/ios/AppDelegate.m.diff @@ -0,0 +1,18 @@ +- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification +{ + // Note: if app wasn't running, you can still get a LN and then it doesn't call this function, + // I think it calls app start but notifies you that LN caused the app start or something like that. + + //UIApplicationState state = [application applicationState]; + //BOOL wasForeground = (state == UIApplicationStateActive); + + //NSString *title = [notification.userInfo objectForKey:@"title"]; + //NSString *body = [notification.userInfo objectForKey:@"body"]; + NSString *tag = [notification.userInfo objectForKey:@"tag"]; + + [(WebNotifications*)[self.viewController getCommandInstance:@"WebNotifications"] clickNotification:tag]; + + application.applicationIconBadgeNumber = 0; + application.scheduledLocalNotifications = [NSArray arrayWithArray:application.scheduledLocalNotifications]; // "hack" to clear seen notifications +} + diff --git a/cordova-lib/spec-plugman-install/plugins/WebNotifications/src/ios/WebNotifications.h b/cordova-lib/spec-plugman-install/plugins/WebNotifications/src/ios/WebNotifications.h new file mode 100644 index 000000000..1702f4071 --- /dev/null +++ b/cordova-lib/spec-plugman-install/plugins/WebNotifications/src/ios/WebNotifications.h @@ -0,0 +1,35 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. + */ + +#import +#import + +@interface WebNotifications : CDVPlugin { +} + +@property (nonatomic, strong) NSMutableArray* activeNotifications; + +- (CDVPlugin*)initWithWebView:(UIWebView*)theWebView; + +- (void)createNotification:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options; +- (void)closeNotification:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options; + +- (void)clickNotification:(NSString*)tag; + +@end diff --git a/cordova-lib/spec-plugman-install/plugins/WebNotifications/src/ios/WebNotifications.m b/cordova-lib/spec-plugman-install/plugins/WebNotifications/src/ios/WebNotifications.m new file mode 100644 index 000000000..6f0c11ff6 --- /dev/null +++ b/cordova-lib/spec-plugman-install/plugins/WebNotifications/src/ios/WebNotifications.m @@ -0,0 +1,124 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. + */ + +#define Log(fmt, ...) NSLog((@"%d: %s " fmt), __LINE__, __PRETTY_FUNCTION__, ##__VA_ARGS__); + +#import "WebNotifications.h" +#import "MainViewController.h" + +@implementation WebNotifications + +@synthesize activeNotifications; + +- (CDVPlugin*)initWithWebView:(UIWebView*)theWebView +{ + self = [super init]; + if (self) { + self.activeNotifications = [NSMutableArray array]; + } + return self; +} + +- (void)createNotification:(CDVInvokedUrlCommand*)command +{ + NSDictionary* options = [command.arguments objectAtIndex:0]; + + // w3c options: + NSString *title = [options objectForKey:@"title"]; + NSString *body = [options objectForKey:@"body"]; + NSString *tag = [options objectForKey:@"tag"]; + //NSString *iconUrl = [options objectForKey:@"iconUrl"]; // Not supported + + // cordova option extensions: + NSUInteger delay = [[options objectForKey:@"delay"] unsignedIntegerValue]; + NSString *soundUrl = [options objectForKey:@"soundUrl"]; + NSInteger badgeNumber = [[options objectForKey:@"badgeNumber"] intValue]; + + Log(@"addNotification title: %@ body: %@ tag: %@ delay: %u badge: %u", title, body, tag, delay, badgeNumber); + + //NSString *action = [options objectForKey:@"action"]; + //bool hasAction = ([[options objectForKey:@"hasAction"] intValue] == 1) ? YES : NO; + //alertAction + + UILocalNotification *notif = [[UILocalNotification alloc] init]; + notif.alertBody = [NSString stringWithFormat:@"[%@] %@: %@", tag, title, body]; + notif.timeZone = [NSTimeZone defaultTimeZone]; + + notif.soundName = soundUrl; + notif.applicationIconBadgeNumber = badgeNumber; + + NSDictionary *userDict = [NSDictionary dictionaryWithObjectsAndKeys:title,@"title",body,@"body",tag,@"tag",nil]; + notif.userInfo = userDict; + + if (delay != 0) { + notif.fireDate = [[NSDate date] addTimeInterval:delay]; + //notif.repeatInterval = [[repeatDict objectForKey: repeat] intValue]; + + [[UIApplication sharedApplication] scheduleLocalNotification:notif]; + } else { + [[UIApplication sharedApplication] presentLocalNotificationNow:notif]; + } + + [self.activeNotifications addObject:notif]; +} + +- (void)closeNotification:(CDVInvokedUrlCommand*)command +{ +// command.callbackId; + NSDictionary* options = [command.arguments objectAtIndex:0]; + NSString *tag = [options objectForKey:@"tag"]; + + NSArray *notifications = [[UIApplication sharedApplication] scheduledLocalNotifications]; + for (UILocalNotification *notification in notifications) { + if ([[notification.userInfo objectForKey:@"tag"] isEqualToString:tag]) { + Log(@"Cancelling notification with tag: %@", tag); + [[UIApplication sharedApplication] cancelLocalNotification:notification]; + [self.activeNotifications removeObject:notification]; + [self.commandDelegate sendPluginResult:[CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsInt:0] callbackId:command.callbackId]; + } + } + [self.commandDelegate sendPluginResult:[CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsInt:0] callbackId:command.callbackId]; +} + +- (void)clickNotification:(NSString*)tag { + NSString *jsCallBack; + + jsCallBack = [NSString stringWithFormat:@"window.Notification.callOnclickByTag('%@')", tag]; + [((CDVViewController*)self.viewController).webView stringByEvaluatingJavaScriptFromString:jsCallBack]; + + NSArray *scheduledNotifications = [[UIApplication sharedApplication] scheduledLocalNotifications]; + NSMutableArray *toDiscard = [NSMutableArray array]; + for (UILocalNotification *notification in self.activeNotifications) { + if (![scheduledNotifications containsObject:notification]) { + // This notification is active, but no longer scheduled, so it must be displayed + jsCallBack = [NSString stringWithFormat:@"window.Notification.callOncloseByTag('%@')", [notification.userInfo objectForKey:@"tag"]]; + [((CDVViewController*)self.viewController).webView stringByEvaluatingJavaScriptFromString:jsCallBack]; + [toDiscard addObject:notification]; + } + } + [self.activeNotifications removeObjectsInArray:toDiscard]; +} + +/* +- (void)cancelAllNotifications:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options { + [[UIApplication sharedApplication] cancelAllLocalNotifications]; +} +*/ + +@end diff --git a/cordova-lib/spec-plugman-install/plugins/WebNotifications/www/webnotifications.js b/cordova-lib/spec-plugman-install/plugins/WebNotifications/www/webnotifications.js new file mode 100644 index 000000000..6597337a2 --- /dev/null +++ b/cordova-lib/spec-plugman-install/plugins/WebNotifications/www/webnotifications.js @@ -0,0 +1,123 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. + */ + +/* + * The W3C window.Notification API: http://www.w3.org/TR/notifications/ + */ +if (typeof window.Notification == 'undefined') { + + /** + * Creates and shows a new notification. + * @param title + * @param options + */ + window.Notification = function(title, options) { + options = options || {}; + + this.title = title || 'defaultTitle'; + + // w3c options: + this.body = options.body || ''; + this.tag = options.tag || 'defaultTag'; + this.iconUrl = options.iconUrl || ''; + // titleDir, bodyDir are not supported + + // cordova option extensions: + this.delay = options.delay || 0; + this.soundUrl = options.soundUrl || ''; + this.badgeNumber = options.badgeNumber || 0; + + // there must be one unique notification per tag, so close any existing outstanding notifications + if (window.Notification.active[this.tag]) + window.Notification.active[this.tag].close(); + window.Notification.active[this.tag] = this; + + // Spec claims these must be defined + this.onclick = options.onclick; + this.onerror = options.onerror; + this.onclose = options.onclose; + this.onshow = options.onshow; + if (this.onshow) { + console.log("Warning, WebNotifications plugin will never call onshow"); // this may change on other platforms + } + + var self = this; + cordova.exec(null, function(error) { + if (self.onerror) { + self.onerror(error); + } + }, 'WebNotifications', 'createNotification', [{ + tag: this.tag, + title: this.title, + body: this.body, + delay: this.delay, + }]); + }; + + // TODO: change name to something internal looking? + window.Notification.permission = 'granted'; + + window.Notification.requestPermission = function(callback) { + setTimeout(function() { + callback(window.Notification.permission); + }, 0); + }; + + // Not part of the W3C API. Used by the native side to call onclick handlers. + // TODO: change name to something internal looking? + window.Notification.callOnclickByTag = function(tag) { + var notification = window.Notification.active[tag]; + if (notification && notification.onclick && typeof notification.onclick == 'function') { + notification.onclick(tag); + } + delete window.Notification.active[tag]; + }; + + window.Notification.callOncloseByTag = function(tag) { + var notification = window.Notification.active[tag]; + if (notification && notification.onclose && typeof notification.onclose == 'function') { + notification.onclose(tag); + } + delete window.Notification.active[tag]; + }; + + // A global map of notifications by tag, so their onclick callbacks can be called. + // TODO: change name to something internal looking? + window.Notification.active = {}; + + /** + * Dismiss a notification. + */ + window.Notification.prototype.close = function() { + var self = this; + cordova.exec(function() { + if (self.onclose) { + self.onclose(); + } + delete window.Notification[self.tag]; + }, function(error) { + if (self.onerror) { + self.onerror(error); + } + delete window.Notification[self.tag]; + }, 'WebNotifications', 'closeNotification', [{ + tag: this.tag, + }]); + }; +} diff --git a/cordova-lib/spec-plugman-install/plugins/WeblessPlugin/plugin.xml b/cordova-lib/spec-plugman-install/plugins/WeblessPlugin/plugin.xml new file mode 100644 index 000000000..f91909618 --- /dev/null +++ b/cordova-lib/spec-plugman-install/plugins/WeblessPlugin/plugin.xml @@ -0,0 +1,80 @@ + + + + + + Webless Plugin + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cordova-lib/spec-plugman-install/plugins/WeblessPlugin/src/android/WeblessPlugin.java b/cordova-lib/spec-plugman-install/plugins/WeblessPlugin/src/android/WeblessPlugin.java new file mode 100644 index 000000000..5263b0c5d --- /dev/null +++ b/cordova-lib/spec-plugman-install/plugins/WeblessPlugin/src/android/WeblessPlugin.java @@ -0,0 +1,19 @@ +/* + * + * Copyright 2013 Anis Kadri + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + diff --git a/cordova-lib/spec-plugman-install/plugins/WeblessPlugin/src/ios/WeblessPlugin.bundle/arrow_left.png b/cordova-lib/spec-plugman-install/plugins/WeblessPlugin/src/ios/WeblessPlugin.bundle/arrow_left.png new file mode 100644 index 0000000000000000000000000000000000000000..530e12babde279931dc58cb36e2af4d9b7d52acc GIT binary patch literal 2946 zcmV-|3w`v7P)KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z00023NklJtSbB+AdXk9fc_N}0iY0oLh#n)l{dG~XWw)(q<|6v| zU!5@@Gjq=L5OUHFnfVDp8A8~$RuP*5E1X?vTo=3f3`dV75sXl2<|{#gB~IFj7EE!_ z&BuZfHs0rLL4ifbaYPFy*o&i4@Z4yFThbBvVv=2Ql~eGlYqK<3eeNU|+*4wkQ*h5b s*RZQ+h;^=UUC$W1wtDaX>34A%0J_xqo=TAm_W%F@07*qoM6N<$f*=%oe*gdg literal 0 HcmV?d00001 diff --git a/cordova-lib/spec-plugman-install/plugins/WeblessPlugin/src/ios/WeblessPlugin.bundle/arrow_left@2x.png b/cordova-lib/spec-plugman-install/plugins/WeblessPlugin/src/ios/WeblessPlugin.bundle/arrow_left@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..530e12babde279931dc58cb36e2af4d9b7d52acc GIT binary patch literal 2946 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 literal 0 HcmV?d00001 diff --git a/cordova-lib/spec-plugman-install/plugins/WeblessPlugin/src/ios/WeblessPlugin.bundle/arrow_right.png b/cordova-lib/spec-plugman-install/plugins/WeblessPlugin/src/ios/WeblessPlugin.bundle/arrow_right.png new file mode 100644 index 0000000000000000000000000000000000000000..8b3d855e884f8aa8b5d2c78139fa63ff4b5826d9 GIT binary patch literal 2946 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 literal 0 HcmV?d00001 diff --git a/cordova-lib/spec-plugman-install/plugins/WeblessPlugin/src/ios/WeblessPlugin.bundle/arrow_right@2x.png b/cordova-lib/spec-plugman-install/plugins/WeblessPlugin/src/ios/WeblessPlugin.bundle/arrow_right@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..8b3d855e884f8aa8b5d2c78139fa63ff4b5826d9 GIT binary patch literal 2946 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 literal 0 HcmV?d00001 diff --git a/cordova-lib/spec-plugman-install/plugins/WeblessPlugin/src/ios/WeblessPlugin.bundle/but_refresh.png b/cordova-lib/spec-plugman-install/plugins/WeblessPlugin/src/ios/WeblessPlugin.bundle/but_refresh.png new file mode 100644 index 0000000000000000000000000000000000000000..309b6bdb255b8784cf884e6fa2bde3febe36da5f GIT binary patch literal 3369 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 literal 0 HcmV?d00001 diff --git a/cordova-lib/spec-plugman-install/plugins/WeblessPlugin/src/ios/WeblessPlugin.bundle/compass@2x.png b/cordova-lib/spec-plugman-install/plugins/WeblessPlugin/src/ios/WeblessPlugin.bundle/compass@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..46a890174edb858abbef991828153aea289a3a49 GIT binary patch literal 3035 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 literal 0 HcmV?d00001 diff --git a/cordova-lib/spec-plugman-install/plugins/WeblessPlugin/src/ios/WeblessPluginCommand.h b/cordova-lib/spec-plugman-install/plugins/WeblessPlugin/src/ios/WeblessPluginCommand.h new file mode 100644 index 000000000..6a23ab6f0 --- /dev/null +++ b/cordova-lib/spec-plugman-install/plugins/WeblessPlugin/src/ios/WeblessPluginCommand.h @@ -0,0 +1,49 @@ +/* + * + * Copyright 2013 Anis Kadri + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +// +// PhoneGap ! ChildBrowserCommand +// +// +// Created by Jesse MacFadyen on 10-05-29. +// Copyright 2010 Nitobi. All rights reserved. +// + +#import +#ifdef PHONEGAP_FRAMEWORK + #import +#else + #import "PGPlugin.h" +#endif +#import "ChildBrowserViewController.h" + + + +@interface ChildBrowserCommand : PGPlugin { + + ChildBrowserViewController* childBrowser; +} + +@property (nonatomic, retain) ChildBrowserViewController *childBrowser; + + +- (void) showWebPage:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options; +-(void) onChildLocationChange:(NSString*)newLoc; + +@end diff --git a/cordova-lib/spec-plugman-install/plugins/WeblessPlugin/src/ios/WeblessPluginCommand.m b/cordova-lib/spec-plugman-install/plugins/WeblessPlugin/src/ios/WeblessPluginCommand.m new file mode 100644 index 000000000..38aaf6497 --- /dev/null +++ b/cordova-lib/spec-plugman-install/plugins/WeblessPlugin/src/ios/WeblessPluginCommand.m @@ -0,0 +1,86 @@ +// + +// +// +// Created by Jesse MacFadyen on 10-05-29. +// Copyright 2010 Nitobi. All rights reserved. +// Copyright (c) 2011, IBM Corporation +// Copyright 2011, Randy McMillan +// + +#import "ChildBrowserCommand.h" + +#ifdef PHONEGAP_FRAMEWORK + #import +#else + #import "PhoneGapViewController.h" +#endif + + +@implementation ChildBrowserCommand + +@synthesize childBrowser; + +- (void) showWebPage:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options // args: url +{ + + if(childBrowser == NULL) + { + childBrowser = [[ ChildBrowserViewController alloc ] initWithScale:FALSE ]; + childBrowser.delegate = self; + } + +/* // TODO: Work in progress + NSString* strOrientations = [ options objectForKey:@"supportedOrientations"]; + NSArray* supportedOrientations = [strOrientations componentsSeparatedByString:@","]; +*/ + PhoneGapViewController* cont = (PhoneGapViewController*)[ super appViewController ]; + childBrowser.supportedOrientations = cont.supportedOrientations; + + if ([cont respondsToSelector:@selector(presentViewController)]) { + //Reference UIViewController.h Line:179 for update to iOS 5 difference - @RandyMcMillan + [cont presentViewController:childBrowser animated:YES completion:nil]; + } else { + [ cont presentModalViewController:childBrowser animated:YES ]; + } + + NSString *url = (NSString*) [arguments objectAtIndex:0]; + + [childBrowser loadURL:url ]; + +} + +-(void) close:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options // args: url +{ + [ childBrowser closeBrowser]; + +} + +-(void) onClose +{ + NSString* jsCallback = [NSString stringWithFormat:@"ChildBrowser._onClose();",@""]; + [self.webView stringByEvaluatingJavaScriptFromString:jsCallback]; +} + +-(void) onOpenInSafari +{ + NSString* jsCallback = [NSString stringWithFormat:@"ChildBrowser._onOpenExternal();",@""]; + [self.webView stringByEvaluatingJavaScriptFromString:jsCallback]; +} + + +-(void) onChildLocationChange:(NSString*)newLoc +{ + + NSString* tempLoc = [NSString stringWithFormat:@"%@",newLoc]; + NSString* encUrl = [tempLoc stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; + + NSString* jsCallback = [NSString stringWithFormat:@"ChildBrowser._onLocationChange('%@');",encUrl]; + [self.webView stringByEvaluatingJavaScriptFromString:jsCallback]; + +} + + + + +@end diff --git a/cordova-lib/spec-plugman-install/plugins/WeblessPlugin/src/ios/WeblessPluginViewController.h b/cordova-lib/spec-plugman-install/plugins/WeblessPlugin/src/ios/WeblessPluginViewController.h new file mode 100644 index 000000000..d6fc139d5 --- /dev/null +++ b/cordova-lib/spec-plugman-install/plugins/WeblessPlugin/src/ios/WeblessPluginViewController.h @@ -0,0 +1,73 @@ +/* + * + * Copyright 2013 Anis Kadri + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +// +// ChildBrowserViewController.h +// +// Created by Jesse MacFadyen on 21/07/09. +// Copyright 2009 Nitobi. All rights reserved. +// + +#import + +@protocol ChildBrowserDelegate + + + +/* + * onChildLocationChanging:newLoc + * + * Discussion: + * Invoked when a new page has loaded + */ +-(void) onChildLocationChange:(NSString*)newLoc; +-(void) onOpenInSafari; +-(void) onClose; +@end + + +@interface ChildBrowserViewController : UIViewController < UIWebViewDelegate > { + IBOutlet UIWebView* webView; + IBOutlet UIBarButtonItem* closeBtn; + IBOutlet UIBarButtonItem* refreshBtn; + IBOutlet UILabel* addressLabel; + IBOutlet UIBarButtonItem* backBtn; + IBOutlet UIBarButtonItem* fwdBtn; + IBOutlet UIBarButtonItem* safariBtn; + IBOutlet UIActivityIndicatorView* spinner; + BOOL scaleEnabled; + BOOL isImage; + NSString* imageURL; + NSArray* supportedOrientations; + id delegate; +} + +@property (nonatomic, retain)id delegate; +@property (nonatomic, retain) NSArray* supportedOrientations; +@property(retain) NSString* imageURL; +@property(assign) BOOL isImage; + +- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation) interfaceOrientation; +- (ChildBrowserViewController*)initWithScale:(BOOL)enabled; +- (IBAction)onDoneButtonPress:(id)sender; +- (IBAction)onSafariButtonPress:(id)sender; +- (void)loadURL:(NSString*)url; +-(void)closeBrowser; + +@end diff --git a/cordova-lib/spec-plugman-install/plugins/WeblessPlugin/src/ios/WeblessPluginViewController.m b/cordova-lib/spec-plugman-install/plugins/WeblessPlugin/src/ios/WeblessPluginViewController.m new file mode 100644 index 000000000..167ef9801 --- /dev/null +++ b/cordova-lib/spec-plugman-install/plugins/WeblessPlugin/src/ios/WeblessPluginViewController.m @@ -0,0 +1,239 @@ +// +// ChildBrowserViewController.m +// +// Created by Jesse MacFadyen on 21/07/09. +// Copyright 2009 Nitobi. All rights reserved. +// Copyright (c) 2011, IBM Corporation +// Copyright 2011, Randy McMillan +// + +#import "ChildBrowserViewController.h" + + +@implementation ChildBrowserViewController + +@synthesize imageURL; +@synthesize supportedOrientations; +@synthesize isImage; +@synthesize delegate; + +/* + // The designated initializer. Override if you create the controller programmatically and want to perform customization that is not appropriate for viewDidLoad. +- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { + if (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) { + // Custom initialization + } + return self; +} +*/ + ++ (NSString*) resolveImageResource:(NSString*)resource +{ + NSString* systemVersion = [[UIDevice currentDevice] systemVersion]; + BOOL isLessThaniOS4 = ([systemVersion compare:@"4.0" options:NSNumericSearch] == NSOrderedAscending); + + // the iPad image (nor retina) differentiation code was not in 3.x, and we have to explicitly set the path + if (isLessThaniOS4) + { + return [NSString stringWithFormat:@"%@.png", resource]; + } + + return resource; +} + + +- (ChildBrowserViewController*)initWithScale:(BOOL)enabled +{ + self = [super init]; + + + scaleEnabled = enabled; + + return self; +} + +// Implement viewDidLoad to do additional setup after loading the view, typically from a nib. +- (void)viewDidLoad { + [super viewDidLoad]; + + refreshBtn.image = [UIImage imageNamed:[[self class] resolveImageResource:@"ChildBrowser.bundle/but_refresh"]]; + backBtn.image = [UIImage imageNamed:[[self class] resolveImageResource:@"ChildBrowser.bundle/arrow_left"]]; + fwdBtn.image = [UIImage imageNamed:[[self class] resolveImageResource:@"ChildBrowser.bundle/arrow_right"]]; + safariBtn.image = [UIImage imageNamed:[[self class] resolveImageResource:@"ChildBrowser.bundle/compass"]]; + + webView.delegate = self; + webView.scalesPageToFit = TRUE; + webView.backgroundColor = [UIColor whiteColor]; + NSLog(@"View did load"); +} + + + + + +- (void)didReceiveMemoryWarning { + // Releases the view if it doesn't have a superview. + [super didReceiveMemoryWarning]; + + // Release any cached data, images, etc that aren't in use. +} + +- (void)viewDidUnload { + // Release any retained subviews of the main view. + // e.g. self.myOutlet = nil; + NSLog(@"View did UN-load"); +} + + +- (void)dealloc { + + webView.delegate = nil; + + [webView release]; + [closeBtn release]; + [refreshBtn release]; + [addressLabel release]; + [backBtn release]; + [fwdBtn release]; + [safariBtn release]; + [spinner release]; + [ supportedOrientations release]; + [super dealloc]; +} + +-(void)closeBrowser +{ + + if(delegate != NULL) + { + [delegate onClose]; + } + if ([self respondsToSelector:@selector(presentingViewController)]) { + //Reference UIViewController.h Line:179 for update to iOS 5 difference - @RandyMcMillan + [[self presentingViewController] dismissViewControllerAnimated:YES completion:nil]; + } else { + [[self parentViewController] dismissModalViewControllerAnimated:YES]; + } +} + +-(IBAction) onDoneButtonPress:(id)sender +{ + [ self closeBrowser]; + + NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"about:blank"]]; + [webView loadRequest:request]; +} + + +-(IBAction) onSafariButtonPress:(id)sender +{ + + if(delegate != NULL) + { + [delegate onOpenInSafari]; + } + + if(isImage) + { + NSURL* pURL = [[ [NSURL alloc] initWithString:imageURL ] autorelease]; + [ [ UIApplication sharedApplication ] openURL:pURL ]; + } + else + { + NSURLRequest *request = webView.request; + [[UIApplication sharedApplication] openURL:request.URL]; + } + + +} + +- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation) interfaceOrientation +{ + BOOL autoRotate = [self.supportedOrientations count] > 1; // autorotate if only more than 1 orientation supported + if (autoRotate) + { + if ([self.supportedOrientations containsObject: + [NSNumber numberWithInt:interfaceOrientation]]) { + return YES; + } + } + + return NO; +} + + + + +- (void)loadURL:(NSString*)url +{ + NSLog(@"Opening Url : %@",url); + + if( [url hasSuffix:@".png" ] || + [url hasSuffix:@".jpg" ] || + [url hasSuffix:@".jpeg" ] || + [url hasSuffix:@".bmp" ] || + [url hasSuffix:@".gif" ] ) + { + [ imageURL release ]; + imageURL = [url copy]; + isImage = YES; + NSString* htmlText = @""; + htmlText = [ htmlText stringByReplacingOccurrencesOfString:@"IMGSRC" withString:url ]; + + [webView loadHTMLString:htmlText baseURL:[NSURL URLWithString:@""]]; + + } + else + { + imageURL = @""; + isImage = NO; + NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:url]]; + [webView loadRequest:request]; + } + webView.hidden = NO; +} + + +- (void)webViewDidStartLoad:(UIWebView *)sender { + addressLabel.text = @"Loading..."; + backBtn.enabled = webView.canGoBack; + fwdBtn.enabled = webView.canGoForward; + + [ spinner startAnimating ]; + +} + +- (void)webViewDidFinishLoad:(UIWebView *)sender +{ + NSURLRequest *request = webView.request; + NSLog(@"New Address is : %@",request.URL.absoluteString); + addressLabel.text = request.URL.absoluteString; + backBtn.enabled = webView.canGoBack; + fwdBtn.enabled = webView.canGoForward; + [ spinner stopAnimating ]; + + if(delegate != NULL) + { + [delegate onChildLocationChange:request.URL.absoluteString]; + } + +} + +- (void)webView:(UIWebView *)wv didFailLoadWithError:(NSError *)error { + NSLog (@"webView:didFailLoadWithError"); + [spinner stopAnimating]; + addressLabel.text = @"Failed"; + if (error != NULL) { + UIAlertView *errorAlert = [[UIAlertView alloc] + initWithTitle: [error localizedDescription] + message: [error localizedFailureReason] + delegate:nil + cancelButtonTitle:@"OK" + otherButtonTitles:nil]; + [errorAlert show]; + [errorAlert release]; + } +} + + +@end diff --git a/cordova-lib/spec-plugman-install/plugins/WeblessPlugin/src/ios/WeblessPluginViewController.xib b/cordova-lib/spec-plugman-install/plugins/WeblessPlugin/src/ios/WeblessPluginViewController.xib new file mode 100644 index 000000000..cc8dd6592 --- /dev/null +++ b/cordova-lib/spec-plugman-install/plugins/WeblessPlugin/src/ios/WeblessPluginViewController.xib @@ -0,0 +1,875 @@ + + + + 768 + 10K540 + 851 + 1038.36 + 461.00 + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + 141 + + + YES + + + YES + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + YES + + YES + + + YES + + + + YES + + IBFilesOwner + IBCocoaTouchFramework + + + IBFirstResponder + IBCocoaTouchFramework + + + + 292 + + YES + + + -2147483374 + {480, 229} + + + + 1 + MCAwIDAAA + + YES + YES + IBCocoaTouchFramework + 1 + YES + + + + 266 + {{0, 256}, {480, 44}} + + + NO + NO + IBCocoaTouchFramework + 1 + + YES + + IBCocoaTouchFramework + 1 + + 0 + + + IBCocoaTouchFramework + + 5 + + + IBCocoaTouchFramework + + + + IBCocoaTouchFramework + + 5 + + + IBCocoaTouchFramework + 32 + + + + IBCocoaTouchFramework + + 5 + + + IBCocoaTouchFramework + 32 + + + + IBCocoaTouchFramework + + 5 + + + IBCocoaTouchFramework + 32 + + + + IBCocoaTouchFramework + + 5 + + + + + + 270 + {{5, 230}, {418, 21}} + + + + 4 + MC42NjY2NjY2OSAwAA + + NO + YES + NO + IBCocoaTouchFramework + Loading... + + Helvetica + 13 + 16 + + + 3 + MQA + + + 1 + NO + 10 + + + + -2147483383 + {{454, 231}, {20, 20}} + + NO + NO + NO + IBCocoaTouchFramework + + + {{0, 20}, {480, 300}} + + + 3 + MC41AA + + 2 + + + + + 3 + + IBCocoaTouchFramework + + + + + YES + + + webView + + + + 17 + + + + addressLabel + + + + 18 + + + + backBtn + + + + 19 + + + + fwdBtn + + + + 22 + + + + refreshBtn + + + + 23 + + + + onDoneButtonPress: + + + + 26 + + + + reload + + + + 27 + + + + goBack + + + + 28 + + + + goForward + + + + 29 + + + + onSafariButtonPress: + + + + 31 + + + + view + + + + 35 + + + + spinner + + + + 36 + + + + safariBtn + + + + 40 + + + + + YES + + 0 + + + + + + 1 + + + YES + + + + + + + + + -1 + + + File's Owner + + + -2 + + + + + 4 + + + + + 6 + + + YES + + + + + + + + + + + + + + + 7 + + + + + 8 + + + Bar Button Item (Reload) + + + 9 + + + Bar Button Item (Go Back) + + + 10 + + + Bar Button Item (Go Forward) + + + 11 + + + Bar Button Item (Safari) + + + 13 + + + + + 14 + + + + + 15 + + + + + 32 + + + + + 37 + + + + + 38 + + + + + 39 + + + + + + + YES + + YES + -1.CustomClassName + -2.CustomClassName + 1.IBEditorWindowLastContentRect + 1.IBPluginDependency + 10.IBPluginDependency + 11.IBPluginDependency + 13.IBPluginDependency + 13.IBViewBoundsToFrameTransform + 14.IBPluginDependency + 15.IBPluginDependency + 32.IBPluginDependency + 32.IBViewBoundsToFrameTransform + 37.IBPluginDependency + 38.IBPluginDependency + 39.IBPluginDependency + 4.IBPluginDependency + 4.IBViewBoundsToFrameTransform + 6.IBPluginDependency + 6.IBViewBoundsToFrameTransform + 7.IBPluginDependency + 8.IBPluginDependency + 9.IBPluginDependency + + + YES + ChildBrowserViewController + UIResponder + {{250, 643}, {480, 320}} + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABCoAAAwygAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABD5gAAw3kAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABB8AAAwwUAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAAAAAAAAw10AAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + + YES + + + YES + + + + + YES + + + YES + + + + 40 + + + + YES + + ChildBrowserViewController + UIViewController + + YES + + YES + onDoneButtonPress: + onSafariButtonPress: + + + YES + id + id + + + + YES + + YES + onDoneButtonPress: + onSafariButtonPress: + + + YES + + onDoneButtonPress: + id + + + onSafariButtonPress: + id + + + + + YES + + YES + addressLabel + backBtn + closeBtn + delegate + fwdBtn + refreshBtn + safariBtn + spinner + webView + + + YES + UILabel + UIBarButtonItem + UIBarButtonItem + id + UIBarButtonItem + UIBarButtonItem + UIBarButtonItem + UIActivityIndicatorView + UIWebView + + + + YES + + YES + addressLabel + backBtn + closeBtn + delegate + fwdBtn + refreshBtn + safariBtn + spinner + webView + + + YES + + addressLabel + UILabel + + + backBtn + UIBarButtonItem + + + closeBtn + UIBarButtonItem + + + delegate + id + + + fwdBtn + UIBarButtonItem + + + refreshBtn + UIBarButtonItem + + + safariBtn + UIBarButtonItem + + + spinner + UIActivityIndicatorView + + + webView + UIWebView + + + + + IBProjectSource + Plugins/ChildBrowser/ChildBrowserViewController.h + + + + + YES + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSError.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSFileManager.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyValueCoding.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyValueObserving.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyedArchiver.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSObject.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSRunLoop.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSThread.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSURL.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSURLConnection.h + + + + NSObject + + IBFrameworkSource + QuartzCore.framework/Headers/CAAnimation.h + + + + NSObject + + IBFrameworkSource + QuartzCore.framework/Headers/CALayer.h + + + + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UIAccessibility.h + + + + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UINibLoading.h + + + + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UIResponder.h + + + + UIActivityIndicatorView + UIView + + IBFrameworkSource + UIKit.framework/Headers/UIActivityIndicatorView.h + + + + UIBarButtonItem + UIBarItem + + IBFrameworkSource + UIKit.framework/Headers/UIBarButtonItem.h + + + + UIBarItem + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UIBarItem.h + + + + UILabel + UIView + + IBFrameworkSource + UIKit.framework/Headers/UILabel.h + + + + UIResponder + NSObject + + + + UISearchBar + UIView + + IBFrameworkSource + UIKit.framework/Headers/UISearchBar.h + + + + UISearchDisplayController + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UISearchDisplayController.h + + + + UIToolbar + UIView + + IBFrameworkSource + UIKit.framework/Headers/UIToolbar.h + + + + UIView + + IBFrameworkSource + UIKit.framework/Headers/UIPrintFormatter.h + + + + UIView + + IBFrameworkSource + UIKit.framework/Headers/UITextField.h + + + + UIView + UIResponder + + IBFrameworkSource + UIKit.framework/Headers/UIView.h + + + + UIViewController + + IBFrameworkSource + MediaPlayer.framework/Headers/MPMoviePlayerViewController.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UINavigationController.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UIPopoverController.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UISplitViewController.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UITabBarController.h + + + + UIViewController + UIResponder + + IBFrameworkSource + UIKit.framework/Headers/UIViewController.h + + + + UIWebView + UIView + + IBFrameworkSource + UIKit.framework/Headers/UIWebView.h + + + + + 0 + IBCocoaTouchFramework + + com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS + + + + com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS + + + + com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 + + + YES + + 3 + 141 + + diff --git a/cordova-lib/spec-plugman-install/plugins/cordova.echo/.gitignore b/cordova-lib/spec-plugman-install/plugins/cordova.echo/.gitignore new file mode 100644 index 000000000..e43b0f988 --- /dev/null +++ b/cordova-lib/spec-plugman-install/plugins/cordova.echo/.gitignore @@ -0,0 +1 @@ +.DS_Store diff --git a/cordova-lib/spec-plugman-install/plugins/cordova.echo/plugin.xml b/cordova-lib/spec-plugman-install/plugins/cordova.echo/plugin.xml new file mode 100644 index 000000000..a9145e778 --- /dev/null +++ b/cordova-lib/spec-plugman-install/plugins/cordova.echo/plugin.xml @@ -0,0 +1,24 @@ + + + + + + + + cordova echo + + + + + + + + + + + + + + diff --git a/cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/index.js b/cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/index.js new file mode 100644 index 000000000..0759a20eb --- /dev/null +++ b/cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/index.js @@ -0,0 +1,85 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +var echoJNext, + _event = require("../../lib/event"), + winCallback = null, + failCallback = null; + +module.exports = { + doEcho: function (success, fail, args) { + var invokeData = { "message" : JSON.parse(decodeURIComponent(args.message)) }; + try { + success(echoJNext.getEchoJNext(invokeData)); + } catch (e) { + fail(-1, e); + } + } +}; + +/////////////////////////////////////////////////////////////////// +// JavaScript wrapper for JNEXT plugin +/////////////////////////////////////////////////////////////////// + +JNEXT.EchoJNext = function () +{ + var _self = this; + + _self.getEchoJNext = function (args) { + return JNEXT.invoke(_self._id, "doEcho " + JSON.stringify(args)); + }; + + _self.getId = function () { + return _self._id; + }; + + _self.init = function () { + if (!JNEXT.require("echoJnext")) { + return false; + } + + _self._id = JNEXT.createObject("echoJnext.Echo"); + + if (!_self._id || _self._id === "") { + return false; + } + + JNEXT.registerEvents(_self); + }; + + _self.onEvent = function (strData) { + var arData = strData.split(" "), + strEventId = arData[0], + args = arData[1], + info = {}; + + if (strEventId === "cordova.echo.callback") { + _event.trigger("echoCallback", args); + } + + }; + + _self._id = ""; + + _self.init(); +}; + +echoJNext = new JNEXT.EchoJNext(); diff --git a/cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/device/echoJnext.so b/cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/device/echoJnext.so new file mode 100755 index 0000000000000000000000000000000000000000..169714a07120b9679dfa9339e5ceb24eec47010e GIT binary patch literal 1291818 zcmZr(30O@}A3k>}w-mRO%6i+Vgi=u{-B#IBmj1FtjB$-(5e!No+BCj)CoVuc7Q zG0~kzNu`ub;@(B#Bn_uzYGO)C@#TF&5g}FWLP;FmsR$=>Tf);<+ez^w#4?J%SR@un zBcfC(S)3vjC-#b>geqo2AtiJc3#F7~2VWSmb4-Pqljc&2FLaWo@RWJ(QjtvNB+;c@ zvR!z}GCpV`dQK^4x=8ihBl%L9EAD_)l9s;(glh5LN^z7KkEbjQrxbf>MhW@;ml7o^ ze3@9nLpcw3k+sqZQ8Xpe*li_RE0y-srKBce(JU%ZMoGm=lnB!z6ffGBoKI0wKBX?v z=Bqe)Bn=fxlqi{^2;-nAiZAAQQX)OdNIgoO&-bknDN=lGzEs^T6J3xd`5Jr5G$uVInQyVT)PD>6KXHFIH^PLo=;5iwYG$n~>8l~RW zNRJvz3F9akB~=@$;O5A~pu{SC@I@w{iV~PnBEFGCVkj%1q!cBS3Mr8Y&27leP(`GH;Va7U1Yab zq^PyZ60uY&-pZHhqW?Uewt)nXPtlq8&o3Z;~ZSSF1@ zl|rc$vmnqGYx43VTzY{=wL3aeJEPD?p-fESnMhwwVe(&1y)qeLpc z`~{*BCY0oQB+o@G7WasLF2sxpeWlU9QBG*a04z))@P^=zNN6VZ9OJ7I$kUVGYb%k2 z`$|Xm;DabKDY-@QUBzNbJu!u9SLM5pDi)fqrNn9!Xl|g?QLIRbByIUJUy(!^jZjjB zwxy%R!+3lX%2TR{4yifuQ3WQCiV7Dx8EpwyQ{0in(^jDZnJBy}g({>( zQgW+H5~a)&s!(FSIYqfjjri!jP@kgo6{C1OnNR}CN}Zr-B&4v|5#nUD+Du680Cz|! z<$fTM3zZlr;_I&FOC*Y7h!#)6GmxMUd?NQ0FHuiL!Hh@smGP+vzKgDm&y!H@Qbn;c zI<=5LCYjVL&>qf{8B&>|D9`y_$RvU4l(tmnfq4d-NGQIel#~N?&_5|fCGtgLkZdia zOWjx0fsm(zw%DDogy)pqhT?BM#WyI48jAjjsQF4lB5&$=9#bgctE?4CBoY~q^5SVH z^2B0)k+O_}tm>&bMJZ^IQq+9PNM?&G%8}BQQMuY~7(BR`r$2;J=Eq58l*CLdl%WeE zs+*ItOnWjKN^u#QFH}+aWCVG#R(EW$q1p;lal0V>KdS8 zN{l8kIeu==N+3%j1tN&3ekznm*DW&9QP)7v>9Sb7OGTtEc2|fqR#2B+a*@g?-9#fu z5#J)hQ!P_W$&L#7s0h=>i;yOI@}!iJ&{!<)t)Zg^OLa#?sYqO;q^k%*Un)wr$dp{> zXHsG@A9NC_Xj5?*jv5v2Nevf?pqog(SgKou`?{$Sw-v|)n3?7GBKJj7JS2oVS5wsE z8A~W9m^Yca+%5|F;!HwMA?i)!cjNOmP+I%cL}CMqA1>^|$3%nmhk>RNG^-;)wK9;* zO^B&RkfM`fM;9eD%@dW)7xFc<3q;y3PWQ}DZUT+PLQRPaJTcXfCyEccQj|^GOo$;RdnBB_ z!##!e9Ib1qvl&OW_W%sXiNv<6HEf8FgFmRU1~Zo3z!WA0Zf>S zi+R9&U?Fppj)M^|2A0t2P&!_YcqM%ufjAO~24aCYU^TD?AYm=A9)QqL8-R@f37dg* zU>mRl*a_?g_5k|;60%z&>JZ|iz%e>~0`Y13I**ReAU+G611`|_nCK!d3V=&MA#fQe z0*V0=N`Y(gD~h^__!dwG+yU+aB;0F>s0WB20u{g`;0f>?s0LmFB)n;fsJDpU(bu(f zT#vW`fFMxc>3fZcn}AVu1Avh!0U!hv0VSXM0B8c*KqsIJ&=u$g zNB~_xA0WX1u_1lk6R|O10`vi3J17gl3Lv3B9g}MtT-yVVfD_;XxB;*{@-PJPFkl4W zMc*5Rcnt6#ogRnS2bc&<0(^m~014CRH~{esU?wmN2m*+M9D+$*dfQ>*hkOFK5(ts^M2CyB-0`>rVfoxzuK*9mU zIlxii1aJz-1I_{$fdYUDmvDWVPG3P>3S0wj05<^=$`IcM?gICL2LK5bh#vt@fM-B8 z@EYKT8czBxu50P^N5u6&1MnI63Va7h_<^_)_z5)8_sIQbT*HFH+=2gqHh>6F0@?y_ zN+?x;3GL}?b;KF~^fA>DfYy=+_;6HbpbO9q=nhB#JwP8I!H|x7A~pef0j5A7fP}t? z`vDe!B`^T60Z6b#Y)@Z1(6J+8XTSv@s}VO~C@>8007w`~$6km>0i%Jjz<&S<;}DMr zCIXY_do4Na-^rZ&ez=}Wr>7wf0Hy;ofLXw7U=A=3SO5eAA;1!VgcXRxffyi`z88-; zfxd1jMN#YM^m@dJKnk7Sgg6b@0&E4g0o#F{00~)$cL95VeZWD02|2hv3>*Va0=d8$ z;2c20dBg?uHA!E>bsikw-41bkKpp4+XaF4nZ9oU; z1dz}bad-Nfq$Rl41@r&|pa)0#*PC{pr}6j%^SR1P0M*C&Yt+ zA;2)e0~iU61;zp60TL!6o(xO@{D5fy2?2;_0CVW{Jj4rtg+MT{1Xv0z1C|3T0Vc@k z>u|(TKnxHEtOiI}hd2>P1~vhk0Vbs4It|zgWB{2!7O)o}VISiCzyTl!I0768P5>u? zT;LRN8XzGL@p<3^aFM>3kGKFR1d8Z;#fYx}C3N~K;_JXopbWSTkZ^~N$@P6)mjjQ0 zO5iE*40sMy1FwMBKn?H~cn8!19{?tN#C1LJnRD+eefhC46c2E@xVl2GQb2sTu%i8 z=zG%<2h!Jb5YGn|0ZZt6OA#*zRsbu3RX{ip4a5L(015Gk*8pqj^g6_ezy>-^$|U1D zg-)l@@m9ncz&2nzuoEC53-K=cnxyyPIvdyz90HC3$AOc;Dc}rn0U#kC@g?9gPy`eM zSAY`WDsUaR3ET!qxP$mEa36R8JOZ8oBvjJzQ#yW*xC(dyyrS>DLHrh|1?qqgKt1po z_zHXjegHp#UjPZsB*ub;2PgoFKpTJr5n?6!nxs{6Ee1LO8h{p{19Sqq09}D@014d@ z>jC;ZVu=~0Ns0N!+ZJmQJKWWX2j2c`ovfIxtR*@))=^MM6GFt8X{0;~YSfN&rRhz4SS zSRf9F2i5=y014|5Cjv>pCi>nM#2LVLAQRXL>;m=z`+#iV0B{f>AqVkc;0SOGI02ji z{tf4F?*ee~|Kt_m-X)+2D5mqTAifG*2W|qlfV%(*_Ygk>9?|JaIwpC~aa~QPUm$)7 zyaHYWHNaco9q=Cb0DJ_P@QHK%1J{kfPv95O3{Y6Q@&FQqh}!^4bXo;*J3tN40JH#Y zKnLgqbOyQuOwh%(9$*Oc0D1x>7$Y_X`T}M^Kfn?o!3yyJz!n$?*a7x{6mSHb0TNsh z4+e$-!|8h?5PJY40Z+gS7zK<0d;k*0Bc1?E0(|LvsOl0IHCWi!ObS`%9DP-&P{&z`-R*0tc*ROS-Fz}4eqW?yOG-T+xMB#yAh!q zElk=J7nWSP-e1*r_{pC$>;#itf;Z&njSnrHWh|>xqKd`!AxRGti!#5N#(TF7=089D z_9lO#R$|eMjb9&`M^64av;5fH`UK@y2VWMiSnyxJuH74#&baPgYL%_HwztAqj{(QB zzUq}VUmY&qGUJJjP42i~%gS!}ezgw1_~^gRzuT#XNCa!7T|T-b=yrM0tJ7_bmA?;! z7(agF^Sg4)Ma>gBT5o=y7Z_htR9LQCY~~^>8@2uYyuIITCPkUg-}^^U($Mc?exS91 z`pcouD!+#Y{vNHCYWI@AbXD=FTzkZWfb&#_?hnz8?O)QKb=+tEr?XAgngv;|&oU3Z z8Qk1?$v~CT`LXBYqMd#?k4kXx@!jjvCt_C7sh#^W-~1FDPAk&rb>n?}*kO~%+^~Q_ zPXjw7B{`ixbf?#&@u3&YL#-TZ+`dzW_TJTJCI!BFJ+F^VuM^W1Ox!lD?o@EhF#S@x zMQ6wEIeXuH_t3cWBG3JV)t1%RgjXi)+a1b!!mY&?1fX|(X~_KU3@$Sn73OpwQAVn<(ZAv z!JAcl=H49j#IVzV>;2OegdJ{Fe}37x!nN{F&&>4_!}FoeuJ>!7%YHN!PaClA&*n|Z zv(8t{&NETnc5c?di(_ksK09ywt;S)TTB^;2MO&JM8M^wzGJKYrc$=I~XlSRqM#W@XW}pFSE=M=XUF>Hfg0w$c!o5A3GY`dmGt`+f{D9@>;oV@U@SHgB)*f6gQts zeR%TQ_>DUhyGR0c->sNak{k13LZ=12e#Wn!X^T3#CvMiXLtMuneuh^a>AdVfQQ4T# zlmhb+X|<2yb_AVJ>?IzqwCYpR_a08;ckN#^zPKddQPGPxNu8aInmXP#@3yG@k?`JT zyQUAhIex(O_p0;NmrR{xcC+Vz%L_wRZWcd$(QF+&bhFqpyyv%z=XyI$UhHU_ey>bF zd&0o${hMaj_E@(+&cQF&deObA&pxu7=JBI%CEe-0yJywFkipwm8_kI5Hhl1LN0Ui` znt69>^S6c$xV(9lG-G4(chQY*Pj-4YymU~?&~+VU)oK0kSDB-x>!y#$o$lto_I{7F zuGHqoQ-*t`(CW-aZocsL2jwT28o;2`l3y3!cT(s! zZpMV>mGtHVo(Sz=zBM)v-C`W%diaX?iSI_-wuo~$l2!B*tBLq{ThvfgN(Xfeeq`6 z;_t7LLgsdRQ`;8@2cQ-@E#w;+4gGrNO%M+=x0+{@Q+ABVF{n&_VHfc9%bByCWepj3mM-iN zqrXpQ_m`u)+RfYlrSpVA6+T%COVgiEy!q~pSApBu@$)w&hJAW+HKNa?z`!NpTZgXH z$k}o&e3JM1JGB8Gg<8D@x0fDL@3sHGBfDP(KHT_1<&soSCpK${)4?8^8$Uc)S3BBg zlV9rS+LZ^NZn2tU9lSer&Ei8^<@a9vy45_v9+4e$A8!valj)v!*Bg7*T_Rl zed+nT=FNU@+WmOCuLyqt~Rmz zGTuy`IpW!Mt8}Gsi+LSgGuw4vw7@zz?Wg|!%ABQ1{on2K?)$rU$KZ2{w$c9$SZh76 zhm)Frih9vuk7V)CYE)+UF7VI67ioWP+RU0z9k8v?Jv7JRow!#~x0kwGzFwp}#x@1# zKV5gLWOe%<38`P_yQB@D!!P>U?6@kuDn`fWN$|qMX2)(m%bsG>W`knp+2F%PX_sUH>Y*AaZZ|Y@thoP<~e6AT>7{4{}{Q#Z7hJ|Aew{O2Bc)d@@e%YG6P0f!) zD{J-3p4xaIY)V}9k~!}R40lV_R{PJ5*SE?M>?})s9NGT*PQ#?oFR#{?SPie3w7yDv z*^%}269=f(+DX$h_Rm)Pe(Y0Sz<*n=eHrj8dx_q&EAF9gd%w*5Gw_Y)Z`*w?f8wu9 z-_~XR>0Rq}Mi?o?q;#tNX4g1Uxm3lpw4nTAr+$kYRloVF`?z)(d35abq|~pYEN!B9 zZvJ&ooEVvXrM_{Qz1ynv=@HGR_45uIrUn|@k2ZB#CGXU+RgkB^&mk15@`xOZe@{-kH& zn!ZtM9A2y+Hf3IDgY)?C^|{ZzJEglex_A0>)2gE9Rx^GuLg_-MzIVX6pPL^(N+Rr;Kh! ze|{9~DBue!%7S{U_1mu%G|uLLso+J~txb((0Rw}aCd?2ho|0TXzd7#y`T9jUQyYu2 zW@w##v0=pw&+ZPV4}8>rH9dU$B=?}UE_=!n1uynHY{;1X=z2d(`vCpBRxgZ`LN5k) zf2A>`P0FW@^%IBx_i4`cLkrTgSNmPJ_Borax@yB$&z+~XCXX?BGwq<};=64&&3%!% zv-;iLkL_kqOZquKiOCvaR$5TwzUg7j=4HFGQ&PW%y|Oqu_ezaRSDn;7D~EjhHmB<` zQ~T|O`W+7@`@ZOyKR?%|p$#-C1lUV(jlPlBvMSM{y zd2k{2@+8mgO8H^^tG&h!duTIiO&s#No;K@lligq#a`8}oN9T$AUY)zPe&SWNXO2Gp z)$5VJ4oKbhxcAFK$@|m}+LZLJRYh~r=Pg_I`h~3BB3jYIcjzRmYuiWuSY7=}{nfeh zkkyKr`J-GMIyd-3p4ePLS4f*>Qci-qC=>LrKTYx!^8UKVTM z{XqT8_diqTRD6jw3CT=webVo_v7JSt_cVj|J!V~9FfGshnB;huLDPl|==H0-(?stN z=9hTA7S|cetOg`ml+EvQa^0LiB^@jd&lF6_G*a~U++NK8oKcduGF|!ch1f+gUsM)E zT!=02TJpibd+e~?ZEi>p<^<+kL%wXG!TVmRvKcks4_Rgnb&x1M(f_7xqZ5A%d1b)2 z^@Woi(-K3+dd_XUzFo8;K(o3zcb#IU`rJ2`ig&B6B8pWbl1C?mR_-ZSFld{rQ`#P_ zpz-GJo!c);U3@^NdD9E!dBZ-ulJ@q0Xnm|^c6dRgaaeX6h19R#s+RmTww&U5*L_`3 z$BiAo{7QDV`}lCn#ixhA&%ZWpxAABfBef0gMY@-E1r85!mSj$z9d+;4leDrAsP9Ev z^N7F`+P~lb$g9e=84!3m@8d#a7wsvkVvbGzfpvv(Jd z3i&gA(Z!R}mlI3%JKf4JxTlt`_SN?Fvo3ePMP?+1dPGc{+y3kI##HI2%K&F{p)=CeO)2&3;Zw_VR|V=dhpxRB z(0{t{RZcn>1#NIQQlkca`}W^_Z{hr=#kZWN?J2U;I6mX$C{tU7Rl&Z&0WJ%g zO?^h{Tk2>%TAZ2c6_z)1otpjmSy_E+GCnwue{sMwRvc<@s_Jau@v-~2t*(6Sd~NCT zXX_h04hVeD9Zy}ZxNU2!^#xm-b8WY}PdMHyW|FH-?5BORf7flcol@*_V)mo8JIycl z+@w_cJ-^$6r8i@gm#BC4i?0ZLZmjOSxvFT$&ii`lS|{yydfK(iZg!Mv z<=q;E>fg56CgLdrZ<_^o2x(ZqvB#a7J>fMIOEs>9As#jZ5%gr&+bni_GU{{?~mMG5Ha!kk@1&u z2P_;vyV6l(qMJg%S-pbjwZZLbQ{S1ztx}(Ib@-aCrB#0#gZ*!{aoFVlJz;mM*1+~j z;dwK2_V%qwKD2GM)}!Z7yT5n7_D?DPr6GjXS)%wx9O@o<2S7&9NGgBrk zzrA^RcAsRW@8|Xgbr7w1=d=E9-S24!uP)UYqT|r@nL$c%yM@uiJDYn92s-d|?N0If zXB(RCAAj;Da>Mhirx6j_%^zbsKRkE)Qa#VgC!|Z>XU-ReCXM&MwCYE_ zW1p#u1k)N)&h!rmlBw?SJYh0OaOAhl;```h`y8KoiXsmi^W0u6xIHi}d~WNg->*e<%Q{+2YuStX}_AsrJ0pEZ;t#*8{X_?`sQj^-Sc_2Z_E{H`_G)= z(RP{exZ_C4_RIa2){XRzSpTT=!1jF)887wr-utxfK;N4F2b4-WAFY~PYLnM7Uny?3 zsk)cJ9i^TV{@bx4JJ)-p*1j1Fm*|*PTJ*f_-|3Q6 zX{I&DLw$$Mg=bqlV$_D#Hq9UJeC_CL&F~*nsso1w@E!RdG^}ox-Fz9)W?=TskGDp5 ztZ#dwljZfA(3M7ae$_Nst9AC6GpkBh)HFu1ZjoF2zIU(sn@lyzRw?N9+(|V)TcvPd z-M|&7vm$8Ppl_=SvzpG9?fBBZa(IJyT|$IrUZ>}8`;N?ZP)o5->wN3>@A{8JV-Fi2 zsBaVccxKa(6B{QSUG{F1dbzAA;J;T()sh?k6u%kbXxH{*yS1HX@O^{Qy?Ms{6>2+# zp8lmh{MgPB^M^dE`7$CyVZhS5O_5{svl4>L+$E0p-~88mcdm20ik)jT{1no66$E#L zUOE2wrShP>jy|=)!|rwDWm`{8J+*oFitOn!x2d|3UiL?4rLFH%yeuba_%-KG8+3xk zPTpR#uD|WA_nV^!2nt_>~4DZ_8JGc6U46eM_k4u+DvJ zI%_F8>z&DYu&!tEU?rb9!_K3w{yN=qo~=?itCnt+qyM4rNTF?spudai!@-UB&+x*0 zO_v4QHyY;8T=VWro6xU$>kd8I_QTeEOS}bjTDo1g(&lFFV%zL3N!>EDr}z8xtnXsu z)Zx1hOq|X4Jz00va@aG;(*A`F)26D7-~8$8jLBD5sPtkN8jjg-QF5cp@?L5kmP~Cpao~a2)yQFI z#Ang>?>@FZ-zIGK`gm+p@x)=u9b&&2UCca)rigEp%63^A< z^}L!V`mFutqEmIuy05RtecT*6zhKKY%MoseyE?0Oo2~NLLGh`M;t4O$6f?aI775+^ z*6hoA_+njXWnSfMEurI|sS33%e)i|yHlE0kSq)e8p1bdB@KfKw*G(z=>vn(nUUhlU+VGJ-mf2?a zS8vLg5`T7YH_OGw%@f-DZ=J{YU9+*MTZ(I#>i$6rwUJZG_b$HDFfChi`oSYj8~41N zs~){^WM-tX&7%IUp%V(DdYoH#-n29@W5<54EI$pa@*~4F53d_BC$z`=n$s^L0&=u_ z8SOeB^geiyzsWY=r4EeH7;C z$3ERVs&Sp)e7-bm>Xc752B*f#X5DZxay+M!cJ}e~lS>A!TY1EBd+cJB%9WZ!A`-S< zn)vv=@3^jqY;3MHo2%(vycH7Nt$pK_dmVnQJ$>=$&KqM-96XTMZs4|`KWa2AbAr-T z*Uw#KH7KXkM5ElclkJ6TPj=X}81?Vnyzys{QD8NE`P|ofv2ls>0fVunHa^QmTYjH; zz3_Lp9&Qm8E1$1FlV`hk#p3>1^?x?*Q5@Q@{NCuy$Y-Vr2O4ab#!cvdUvoV0B0$3` zcINv5$5t90soyYSj;oS})zOV64~OPWdE%AXW;)k(G{-LNTR`~*cHe#H#E*?t z&eQEbgc)=>a(kebR#U~6*H_AEGZ9ZAOFfLGP^qF zl}UBu@z_-kXV$$5x__o%iNwoh1&AD zq-ejXKc>x6a(=MSaoEKt9~zbJAMdjJ%|(N(%{Od(rkJ=zDE(RM+EqNbo94L8$Th}~ z4DuDW+!&nF%lhg44OXMxtaA%AsM}s+`MKt>&%R!Bmd*OrpcAF4Ve;aX?$m3=9d%c| z)3$Hm#}{7jpXC3$Y17)G%*PL|c{b-Iri^ujTdHVRscFF(>7KOxU*?-!@y+_N+7r<_w(4e9l4N<`e2S0~0S zdNcXL-Vo!YyM;T2UFPK8dz$09P*dwopZ-Z-BIhqME%rST-)7poBSY@lgq*tL4;sb-tq!dfFqe|D)L+MKVtlK+1)zbw5oM_FPo&) zaot~jLc8TANss)ezJ=sN3_6hdo5`U#I*{^*$zek}kaV9;ObYKyaoMqL>vR`3Nl9@1 zESkMR%DY`<)1EM6*yY4BQ zPug=Nhf3){(%aiGsTO+I=(JA9(`PTpT~hurOAh(`^rGK|lYBD1)Le4a5=eiG{^19m zf6CwfXMRHdDbE=`rHA?~>AFcI0TTWxKYJy~X$hpiD$D^`T$BD-a2SZ>JO7j3`cHko z|KYzq+wc$_NPRaVm{d#s$sBng`5pgB5Bf(Q+NHF9zUCkL<^0p1(0}N^@Splk{z>=v zr~lsnu@w+{Uj2vP@?+Wl5c;hAr@zPk;pfx;%wP3C>2LqYQ_4T|ii~XCUI9nJ5c(B! z7=WbPE3@TE+WMdI>9fO=^XtQZ`nxT@_47TmTBn=;89zC@$pq5g4<><_&}a2O{6@|@ zGlArbIQ&l1)BoW&{y+1T^$6!*aoB4S%BoW$N+TTSZL|f{G^F*APE+Sm4UGb7IGr99 zgZJq;P)DjI`Jch>ex49o^qZu0ba5sEhZsxf{FzpGzMt@K`F4|WMgWHeC3OBJ8RQu4 zMbYW;P;iwvgxHa;Pk@8gNmT;**>qCBF%Bxf#epWmOC;TG0FOFvfzN*E^yy9LkF`Ml zeI3cagpP&dP#9C*=N)ts4wo_Gd+Wrb6zqf)F$1LhZ^jZb|D}z1MK)x<09&rw51Dpkv zKV3c*2kx``u>HLTek+*Ewl^veX&kaNqRW>j;vAS*KwUE|TAQX7H%`%2P(uYNqr4+rcpjq>s3LqBG_2q-tYe)1u~QXHfbA+3v1 zdZ*z$haEc~lLzytFdTrB(B=Oio`l1}3_Y`Ja8?V45WCU&cNKBA5eI>peBEsDmlr#p z1Z5tTfy0I5tSjl?1r5yqPXPrsl&AU7CpLcIXF6>J{nil8|4Yw>dOS+=56d6>AkYD; z1@g1=Wd6=#{EZkt!#^L#;fzZaTi^0<^iN0dcRb1yc+?SckPJagHT=mbfz1dL$n6-Z zuMz2rqXP1IpuB%+sQ5k(9-Gl=eD_0HWwwlul<(D*M@>Ti`q263k$?0%K0ZR4@!#%~2in1n;kUyx7ebrbVh*Fh-PFQmMEA$+#b7JWd{ zN35V)&f)w3UH&@c?FL8QX72*MhO+#&#R6w*POU+ry-9xggcAQZv*;-CG#nFI<2OK^H07l{6+dFx(IsUU@XJ`CZNL?I-iVh zF6>_|C%t|(&fa})k!SM!2y=`NhqW30{|Nu`m4uz|2FRx$4%-^h?N>v-Pt0i1cjS51 z-Z;CooBvl|@rrRCF1$rvNPZOPzW@i=ed*`lhT(kwdzOC=D1n|h*v{y?;EdM#vyCgh z|ML+3o&VqWpg+#H$R`=!7)>6fg9Ee7_?zQVpDDh~rQ5q11^wNfmEXtdI2-LCpj_zu zVfcV%#7hA+hEC4`f5wAf2|Y;vi;JLNakzO9ot^=G<~2Yl|GtN`ud2$UZs1VwIhY`l ze!l_y-52fC=`hSUSHB+h$Nb~qx`b{o=O6vL<~e+F=zpgF+UVa7PXAQ#0ZugdlgtO{ zUq>$5qkS-<#Oi4M>MVKT7HTPXVE;qWF|GohD~fZ{s77MRZyjAB}Zg z#p=KB5jaDM!@Wd5lKN&nfWC!(bVr)>M*_m~R^Ut${k+`-@N+dgKPvrE9{LNzmecR; zczkHd(a&C*@JGVf{;OXG{cynEh%SHlHSFsx)}JxQcpBj^$>{v14v=RKe^@`n8N;0| z^F#W#yb1Ml^xIp|&weIf{{0@A?}y+Au6~Pzel-LAz;^QSWDz@yA? z&{>7f*YidF`0#@n9}oAL^}jmS|9ses`UoQWozfX@)lnnhN{7B}b>=@b)63D-ABKhXfFO}feD0GCR+o7Rm zjCU)_lk}ZI@E>qcUP7n$E@-U}+a7}dI}Y^bx0Ii881$Y9dr7Bj20*?G+4=p7fqSiP zsh{-!0?H4W!j?Y+{l6Cango)sFX2(HkcNJA`|7ZlLQcLh^pyha(=0lFGUEH_3`5^s zTOJiZQ21Bh?jHjG!%K*dSX=sAlm+@h{}6s9<5d8C6ara(NyEp81?l6;Pw-^s(LGKQ{rji%!ov1N!2l6i+(s4|+9>XY-XD;ZF}0{`J3iUdNsX z^f{4tGXC@{py!GfeMQpa{9Ehe0_ek{#jO3VO~pJ9gfge+bG9Ss4|~kW@9rt659 z2PZ_{2|X>KZ(N~oEa|l72+YqdR$t=y3zafKK!Hu=<=ep_(1AW@=qm<)xPqUU{Q5S$ zR{DO{Y48vH560hFxgGU$^!pDb9%c2B?a#71kmo$sep=h2d=}du6-;DTe8|O&PZ5I9 zIDoYe0kEI(`1pmH&+YIpo(HtZ2brHwda$4A?0T;16y{rt;~!swJ%GMq_)`IfYua3) zd~b&M_eQlC&zY9>1)<+vtS@w7kC^gD2ExC;%-XjHe9Q+v-1~)?w0{}&J_>p>^yg1Q zKJ*PU-}AxWDKiD~Z{bM&w?^@(5PZzS)bA1ATK}Kr@u;eIto@2iBxllF)?cK(Z;G%_ z)Ap##R{)IOE{303p4|+-Hv^)6E z4*aKrG~qu>*vHCaEIkVwFrLS({kMRBT&mHs{v_>-pr5lfS^Mx{KSlY{{7lw6ir^Pj zSJr>Aip6>e_KWCqqHnV-c~k{HFk<@i5c1*(f1IJ$wgAY_OSb>Z!MHkDuQ2lVW(@q( zvut?>e9){0|BI<_5Y~&8zu5kri)n2??tq?F*rX`owa~MAF60`{x8{5r!M_NtOk?ZWe<{C4aw>^2h0zbPm5iN^ER_-!8MdFOAS=W~I4{z&=c z5m=v%ZLuFD-3I#3rwhyflcFI{64u{2nE<-+1Qf(dKL2sq(1%$65q==glkYBcrt;ZTL zG1|{&{m;k$=wo~kK+UgU{ht#T!LL}46a7p2mr&ALABTZ|)A-lf5?u0Zx7ImZR+v1J&A><8gBCmh^L-@<^KkVrG&X~hKskGQ9GC!X|uN=^8 zK3(1h@*55N1UFUwe4+^Y1pYE3KcD);{^#?lNBoxjxv*CiuvfnH^Q*xB0i#)cSZxaV z#z%V$Ka*eS@q<0`rRzTf`5xiR+V8`Q;s0TNptj`g*A9jMg%4nv{f(~hkLEwxx%&MH^p)m3zWiH5GG1Nq?`8NaMBa(NGBX|Pt3d*4Dc#=14dA!-E%us} zPs08d5A>W!=i5Jn{FJi%I12VYVU&=P(fNmP!PUnxQQ)ucZ25X0$X6BXZ(HP{KG+xX zoeSXy`*rY-z~75dA8G#@{KL>d);|oe<5Bk5ADc$E*CiG7fIR|R%b!oic)9vn;0*na z@(leQVNc9pPr&B#`aKMIRM}!7)g5VK9}YsFh6MBf+Mf}yFSXbof*T;ue~s~EV?1C3 zd3&~gkbjQ9Irj+kABVp6Sg(b=68!atMq@l&eO=HO{CkK`EyaB@erw26CHxW6Uo!r} zPq0T%*!`{Ck(f`cx0vykJ%@fhjQOJFV}LW(FOUa@A3}FP{s*(`zqf0UzfmCn{V-C$ zI~)r&tk)TN?3asg+%Vog^msqRUs;Ov8N@)&FN!)Ce+(;c2J6wk-7Whuq`q`5e0K}| z%+Nd39s1W(_}5<+L;v!0S$!P+kNzL2&%f@n zSzsc#_M%LON2Njk_oK@{xet17W7i*QQs{eUw*J9}n4h(L$`14=^%)$5e>E2JOUq|y z1@yxncKzjw`LF86+Lzi1(6=wy^?{)p{KsYdzx%_!=s$PAI`{}L3>5YT%NomT1&dHcieFNH!M?1nzjqx0v1zt3^}rPv3c_YQV` zj$!_dHwY-W`SS7h*$n=}dRsz2uK@k3ix1Y^?S>wYLQRIKkzo_4gZ&s zzn%DDlOfpO#Wc$EuR}h#`a8?MwZ7kQ2J~IZ`b%e$7smR{`Fa8PU&^?`gYE z<5T%`dI}om`ctEVAkXhufBYNh6^Qi%X^+TzDg67c&Fp@{At)Ym=tpL}qZN46j#_rT zYqJ{j-Gkk4*Ln(lgYo#%?aScb^gbk@o+C}>|1{|BiXS+T()o_CKQ4i+|8Vpb`1L01 z?^S@luFz-bwtPO1WwzFL2is!4uz$<&`?rm)*LypPTkE5-a6C?8KbEm)<>=oH><2Ua z+!yT)>CfuV6c8o>{yxm2y!|2d@XsHy`sk|w^~VVCLwhabdmV}X!k&$y%YTD@4F8WE z?I}%k zOV)pxGP?D8R%ZeFhxvvW%KLu`^TpL~@0BnfydRiL=Qmij)^C?*L*L_hX8x6+-^?){ zCOyHUwLUw9dNe1o`tHMatXDYeSGS(vGw3Hqf7%#h{;sq86~QqWAN(0+J}vQnA{_50 zOzHk@REECAeh)KW&nH74Vt?8naQ0e>-*-QP)g1b*7b`o~UXkoRQB zBjlLys|DsWrE|;sS0dk=T%gacvh6G8KtKJ*@=Jay^5H)-{q+Fj+&{ z_hY2~HLxphK`#kCz8h=s{F)Yjh2#&$`ptC}n|Am|UQPys-|+)O^HC4!U&=%9Ycadt zbekq=Z{q08QhX#T_;a?1=)1!Z4K3=o! z-v)my*vbF#!f*75f=xC{OZJL!pm2?|ZDX@H-*!zub{e^l>))k2(|9-fJy{KE-|tBhRtDU{BG1 z3`^erm;=yfST8gBqHYuP3j9$cI^Uof%$3r4O5|3IHG_IloQ$RGRxru>;5SWmmN z`feQbBM;*x{UiM5ybb*A%<|K@U*KQ#XE@D|W}REV|Bi?JbN!XIH(Kk@X6PfIApT$d z`C|;$TO50T@Cn{uAHe#Smd`(UJ}(OPl&1Fur`Gz?2kX0{GIsrGjQQ2Yei*|KHzYV; zg56?k1| zKN5K&{H2NakvzPQWX9JI{>W|kBVu}d#@OFTs$=z6AMmH6L`W@yT_ew%K;K9>_Sx+O z)^FIqf?FY{Pw-jjU-)}W+6M1mc001|o!p1@8TgsdkMMKaO2{|bXY}K0_@g7>k23UL zYm4(Nuy@nw`qMD4+0c(tIz99UtcRHXS3~f>Vt;E8UEhyv=)X|{`EPfU_Pe;ie+2y) zelNkmxb|Qf{7(h=pUimLf&Rbn{*34+GX7G?6Zd_PFZN4x6$F$AoxdOYmTNzZ@I04) z(>;0AZExXUeXTmMwY_-Pg!K*l5k_7n!Tu|BW$B{@!P&8dFaNDkGM+Qgm+{b-j6F$$ zf6IOUpMmyMIr}S*F~9bhU&eo$kM)U-27c?F?*DS^msw%IjNzZ4-k=}$lbHU%yi)s6 z9|`J|67@U+`U?GH=p6|A7~Wk-<;(L$)Dr0b-aS}-VSf$lNvyy8>3o+RkT2|KbwZkq zryBN*tKWT3;XDlXuhfxG_VW&0!t&wd<_+By;Ic{+Uy{&vG+ zcE9D(a_A4p7sHQnm%+cw*!{WnUijTQ*h6N#X&|g4)|)Hn{^{X-mmk(=Oupt3l=oxT zA0}ncZ}6WOewhII8-x8DBHyIH)gNG=%GvSO^H831KEN95(RkPs(mzuE7T)ivVtv8T z$2AS>^G@t}$+}j-`*NJNlQ(j%OLzZCL#_2L4GN$3M9a{l~Qjvt4n%0{fjR z=nv8VckSVy6tVis;R2qAy_F!JjDJWR-cK8_`{xs3kD_}D|DG4L6}3KZ={f`c2js7o z9`6?D_xQ~$y=P;7x%NXDg2lBLzaXF7^BT)B-wm)Y%zP&vMSrHV<9)dr>w(WL^^^W) zAIE+k*5@L6eD|R5?BRd)p!;(d@2@7|$Nz%p@dZLZaP37$$ZNE=ka~`OlKQgBvEJIn z+V3dX|7ffSnfkJ!FS+_&0RK-3{ua~U16co_R~N{CtC`gI3i1)e**{qGkG{XG0s2L- z^YI)0PzCsn(Lb?Pt@V5PF1(L%#d!?$m+)WLo{;}jZ2J#8wSGS%1!JGb`y8f!=1?Sg zSX_D1^r_tseZuiqS7ZF4obf-{i}ml8yMJXh zoA~!EKg@?d&+fwVzxhA=;d!OdzgVvj`$Xt>RHya+cL3Hq3YJ1@9NqsUtUqpJ{lVBP z%b}1Lj(i5Tg}h+B%H;cjaCPvv82wfM1oCi&rQb`eryH?9$mILMUfzej>_fNbjP>5D zWOn^J0P{Tu^Uc`5FeUhhSkE)_XEy}&yw1K~@OS|J&t&!6;{@o#UwB^vx{~om>Z5(g zJJa9p=nq%lroewa$KiKN>}RHM{8N(}=s%pVW#&8ZJN&Kc7JEbZCBYW_i}_*d-x&sb z&e@;vg+G}F|B1=}ErmQ_{l?U14}0_+_NYalC{rD8g1)ir`LXTJ;6KQVgr=8c2J9tg zJvHqI+M1K-}G%N?d3CEF-U_*0Q_f&om_sBdbPF>3kqS6PO|H3=u)^#$RAzx%mD_}`iw|9I6%_#^O-82Ud%dtCeQ z4r#7^c!%{xf`d^0Th(NKhr!;Ag}w2m$7eVe;F=${~7)>!2ELUgEj=S68@PxU4NZ2nO}DO?1lB!QO^3R z8U9E)$Dg&0fWM0UB?D|S5<(TM)R|L9NWuU3Qo!FrSFj~@o!0QqpE^EIFd z8aV!vGv-qh^QlMYXMp}?;CBhqg#RC5yqY*a2eQlQld0O;p2SSWdZvn%*ZI(IT>qo@ zTJU2Q5d(SBfjlw&`;!HE9m4LXsGuVY@I48m?^M7)I^ZA1zuAiU zj>di+nvwUf*A3`9j=h-=f01inDj=WS_X#y9zks73vJ9Y4@jijkk1pV^My!{Qp?=c; zR|2e$u)l?F$=mA}kM`i-45!nDHm&WAJ)ii0E&NWNpO5~l!rwKe%MXogZEqHqVgBHM zG2?rngZYkS&(|K*2ft#y7ezn6LKpgo<3A>VpKgPnnE9UydmD=Noi$y45csbW`zP4e zllR~L1^mBj?Ecm=5ITDkyZ-pN9`XeJM#e|_ZzV>5U<_n*eGgP15Acu8==1>SbFRHg zjKltoA>NPC`Ia9b@8vB0DzP5;#n~?#o`~`EW&OMPkRQW6?ECs@x%jH?}CRYplZ_%v%+r0w&FC6>QW;)XF7s+~t=z}?smuTz{ zG4+qe1^2wdX!wVwSZ_&DUe4dx&*$2^4u z9{gwnel(%SJE0cxeh>Cc*fRcf_#;ZtZ!$Xnm$>!&EmiOXSD*I@!1;C1kLgd%X4Gff z@;;BybN2(}@4)^rtq+Xxd?@${ZmXQ$ivQ?;m+_E?Dx4Rf^Uq>ElZN#S+(vo%-!70R zj{PLR+spIkQ)lS>W*eM8ux07f{|@@g@gF@SaQ+4Mfzi*x4Up&d?E26=rM14D1V-NN z-SR$wj7J0Z^CJ1CU=Ptvt20 zK8=NZ2>o#0N6=FLA*}DX?^krp;E!?Up9jIv+{NzyXurh!HtbjU)AWc#M^!;jh95`U z;(H3v=Lns@67=A{&sYKZ*@yi|;*XI1NK5!9L*Sn<^5B^ddFJTL@32q0cpu8-&jBOk z#PQ|-lZDV@crx}!^jZ0zj`jjz-^}RtzhOOSjQLzdr*-(P_2=}7;MbRYDu&J?zZ~ zJ)@w{aGn-oCC@(vd&m7A(I3xwwQ1R}BjdHk#NOV*zW=|6^9)r(SbKXO{ov})IUrn7 zI6FUak(fX1-#`t@+cU$&W%l48Lo^UOU2GGvohu6ZRecf|Tx0-b(lb*nb9@x|cc8yCA)icIvlQotah^#9&lCU5^$Pr(6)oineTCrn0>}qbpYJW`w|G{c zZ3TbMguM==+ixF+H0&QkpY!jbU+=Q#4Z3-PUf6FV@=xZ=0P@P!mxG>wURT)l@;e8t zhv08A^fA(fKaBl?LG<&-upXF+^?)9ozUU2l6tec>@B#4u820^d$KhR(J+f4sI?g0Hb@4qUsUwm?)@UOpBS`T@{d2Tnl{Y=r2i6!Fv8E*7G2noFB$Q ze{%P?8?gSV_{92~k=QTgzRxZ*;86=;FU;uYi{MWr{1C{0*MhYFQW5?+{F8ljK85|< z3UmCgRXXj3@irf0{d2bl*i#ODMN!~i%oiiS*KiRQ&zJuXFw%b`_XzU+au>nw@p9DcjeG|WcKc2GlRVjjfoz1RCYN7vZB3sUT zkn&HlAI5{f&B*7t@vsk7?Edv>XY>!}NugHc^zHf!^<8JjGlKX7GvOc7?cc@wAFlqT zps(v9SpR(3EAZ1zRvzM^Z+l~M8U8Ydf4akt-9L;)$11~F{gHnG_6PP4o(shAkgoIr`fS`@+nZD)_Df@AnPp zd>s&?sEPI8ov|Nb2z}dw&i4@FJPX!iF?8AmiqU1Rkb;?#uMaF&U_4mAGx}|9H0+0j z9Z#PzDEE;4o?uEa{JZyTe{?2*pE&Ou&cQz3-@|?n-~h$qTE^BlyBz#m#IASNVV=19 zwhSFj)cCg1qtiJWa zd7vBEe`LlRGrzTdU;M4LzHWE0wZ4714)Vlnp(o*2y+o8(VE2pHX}})?e=+kT3B`H~ z?KA!FI|uy5p`Rhv+uZYfJx0R+gFR-Rf1eKeI>S*_WlOseFTJu=tENfZtR~WVE>Gv zR}%bzD)<8o{ZqEJ*4K^5h{t-0(Wm*)M_q!M@5z)Yo8;E|dj{4&mDVlvBlCGt6YFsf zKU>0I?uzvX)Be(xt@X7Mzaiu6zYBgl_QxUC za(*(fzEPvNP9u#1YBy{~ZN?@v2Lf=9Ek^cL`o^thZj2rwNj{kM9 z9Q?PdW&ewm_j!)>)Kyl$*+L&!Lmw!je)7J1U=!-+=wFx5nD0t@4Jpr zlnndZWd4Z1=mh)6)$b0@t=}JAgnX6aJcvKt-!S;&E8ve4dXWCUynyu|#_LY!SBPPs zaQ+@_FCTvy9Hk8G?~S3;>+^^|%-VakjMnyG4){s)P|J8p{pshx-<;p4&_{dq^nN5+ zf6fN~j0OKN;~xh9A`SF3p!=5&{lnGwUYL(&{65Njnx7K(f@T4g(MK}SWgOie;SYs&&_9b<{qPL-;r4$lzf+)xFYK2H&y(_*QP`h` z{$T3cDMWub{OJSxT?c)~=(k6z_{}b~r$Ilj3;&+0f0rR+66^~@PYXEqs=rzNric0F zo=-Redo|}zi~T12Qxk;w;q2$_at1%bpCbHE#v5M%c?)gPH>7-T_$#Ip+4Bg;Ji%YE z_bzn#{P5QLxxf^aJ+i8G0S~3Vw!t>Or@6Z!7r1Q9xa%)4I?nW3m2X_;J7n$QNh-Y9j2} zOq@3$`J}y@+b}<_?Eaa>8_XZae`)&z`m~x|@6^DMW{0u-fTb4x$C6Nfev{PK41HV) zeay7KV-e_`#ir*y!TvJ(=S%mu$_48Sj=z(Y26?e#&!_NWK~KmJQ@$MZa{R%54^mzR zf9N!;f5QI9+_%8lb1BC405h^t7e{R_7!ig2s`-|yOM?fu*P?0p`SndJ5p zzP~wp@Adkv-*c_K_G1x$L;qc6%D)=}BlY*{hr@r^?6;=~`?M7D3pQ*1J@p5Wk9WH9 zEBo`4?a&t|`{VtWcG#cCA^tG@y5?s={rybDN7s!ss~b@spMMGz<0)8Awd1kuIq+BR z^2=+4A(Hz08HhK&hJ5YQO?$TW1oiJ1+Rz57 z_#5(VHANo4dOcTX*S<{E#~`&G2iX@ zy%P3H>e~-ve9rFj_aD4)G1~k2MsGjh521h7BELcX$@Xr{WBwiS_20i?KSknEIBy8^ znEl`KO^hG%Cp~67E`ffM`uKF@*FSI$@-5KIEbrW}V!p%vS$;fi2mHN1H0tkfvb=k@ zLbQ?JvGV$42=cq&KP)uux#GjnKd?W$%-^3u|634$*!IrH^*7);`NR4yf;@ad_(%KS zjrn?xpMO3L`uZEN9~;d5r*FsjKf(7$w*Ca|{h&Ml*uF<%{O(13V8^$y3-j$vj0gJ1 z>!(0oezVD+Z>J+(`#`@Rf1m#*@DK8M7RH(Pzvp83lZSl%eG2nGf%y-$pxe*)OrE;(e>%=6?Y3!393Qoh_JOnBTU2uelWC@k@XHeGd961ATR$DgR?x@LTBn+gq@I z3i+aQ&Gq;0$9M>TuICom|0VwUZ?_>oD$fg;4}0>X27kPMjB*k$_1Ehh-2d}I-+o^E zPn3TI=jWLEPX2399}hx)e-8OwV6HDX0Dtlo{(Spg0p-8b&(~ay`~G;jKmNalJ^vW& zxgC#>J{kHN`#U&aIX@mmeq=59W9?-(@~=`q{|q-ueLRSX_payr?{}r4|B}1h{o&;2 zhh7)dzX!mmt6$rw-+yO)>!AqVI^?fU{RaAC{C+q7;rRn2d!S$Yef#&i&*MA@as3Ne zFPHlXE*}Z5uU~}roQd|ZziiKIAdhP?zZaSQKH<|C-{B?&7V7?YHo`wZ{C~2!{_6)I zAHQhw-cS1r{ENq8J#@Rd{^C~#_4{po$PWsA{o&UJ_X{`!!TiP+^k;t2=3gJ7u6`rp z)i?S3&C|b!{rRcSuaCbP{?t=^|9tFmh!0>-J^n#IFGBp`xNkHCIO z5P!)1y?Mk-&lK_fAowfo#rw~Pep}|x z&)>cW{(ZL}zjk83=&jurY{%t@1x9KC0 z&(#<&GvB|r2>J@~t8L#iAaBy1{1SpA&x3jh{_5A@uX4P}?@h2L&wRT7e*Agckq?8t zuJn|(kJ*inO!Sm$TDbI!efPS|3{|e*VgLr`Rk@3K(@Q1E}KQzzW|7|!< z(%vk<{Qf!ohiBnB+wz|10uZKN0_dgEud>7&q46Ckh@VuaX`Aj$Z2YU!NL0^C4k1*b^a_?t<&)N@v z3i%K#FE4rw^y^W-JtFES z&naNO+$iGB#huWX?ak^=)4ms>e}6>&>4oO+KR-9P-nS6;;-7>5`?7!92EM?4j+y(% zFrM;!sT;8#(|KOA>VW+xKkf%(q&?#IYrj0~>)-QHv0N|tHsb439tr;$&$EAt$HPB> zew#M)^-G7KUy+}Ay6OMRn;KLG`g)aVPv&Kicf_YKJG%aFp#7gj`xlzOM?kb-z1-fv z@{zbMb@i8}gUq_bRS`!e6xW>33Kkmg^;J9|8T0 z_S^YefIr!Q`DOLv_lwXUh@W6~b$PFS8}e~TitlQ0$M+RS5g-4`m*2bK2z?p-xAzZz z2lM|L|GdP+^MmUrOTUi!DEy%**q48{Hz}lKb$v$=Ps#IC5mp-i!V9 zpEB+HI`oq~@8a{|$JJ;L`OWe87WBhYg#LXDCi36E>8}^=hJN|ov;6(rug83Qd#cgP zmwo@Im`@+|*MA@PV~pQ!-#`1U%2m@l&9WZGTTiLp}_D&hoQi8Rp*_ z|NWhZZHGKU-!3uF{|Wj+>c7`cqrbQM{@+88*E7+-4d(vuyc_f7eE;#q5Jb?u6Ld7uP1-|3(&V){dftYuRit?|9sl>px@;B)->u*qJGX7j?dl~!hV0l zAMe+;Vm^&D>iXE9pL|)Vh4A+{qHNEt*v}*Phd%bz@CTu<=i@r<-x1{NCeYs{_?yo^ z)B%5DAL19I4@Z%|lIJ)5@(0joyAY2U`F}|!xBtH2!`HyxBcEjX0oO*o7V~|Pc^;yoK8sBOPdDW^JPZ7O zpYQ)X5Aorn;3V-n`}14K(+40=_U}9P!5(aBQV*Hy2jHLobQJy)+Qa*|PC_4HJ;?e` zAA~)W@#{|1FVABdc{KbHg-?`m|>^C-?`peVgvaeiY$fosIHtfq!!n+QWS8U9SW`u%2$m^Woh= zef`espg+#`$LBogCwacs86U*>BVT*2>EDkoZBTb$e)B)}=ML2WBh=6N&+%)#IC%cj zP2Yz;g}=c0%j@l51phJrG0pVf+rEqPk?*tf;d%J`4WIY@t2ZN`b=Ul6g>LBjK7ASN zH}ajf|JR~@UqkyaEV{fkABX-yJh#C7ed_xlA3gqh)=OY-r9Qt4{Q5GkFEsamcqis# ztH1yLXWxeYfWK$w-%}C4;M98jkMB<|RIkMPxIBM-HT0D{pZ!k60}A|e?>|KyoQL@0 z_kMlf!DV^A#>bJrxvS0hf8YFO*i+1(JPP1=f9KkuzQ6h|jIYq=kKY7)Ch`mKdL!~9 zZ-M@9bf3RHq@Pb;9z6f*pU_XQ75eGNpTYcwzO(b^*Z+y~uk_c`u7JHsz<;&+{0jIZ zw@kV1r~Wy;7wa|1e_@(w{`?01&>CZ(I6uD$`NvLPv(5!{hi+gzu_Nq{_^i@pqZn$NJy89qSuU z@aNB>JD{(==*#E$6XEat)Av`G;&m;WQ zztF$m`uic)KtG?J^YhR5K#|Gw*jFtAWLPk#LEboj&YcUGCd|L|n^gUC-UG=HD(puh0%pJV>+MSek^_oSTcWVWQ7QGjxs z^mK}3YCL;o27iuZ3Ym@BVkuK_MhmHl3~nCH;rGa2FWlk`n7fycr;5c)Q8|~b8!ROf z>9JJ7DHT%LQn4?c?83F|#>wPBdSG=r`j+l=ZX%y5WRm@>(}V5KCN+_nNKfRWZ|)k; zOl~ZV@m^Id74TQ|eI4msep|9Xjr-gJ^V?!>#0ZSAxJ?6t2}jpGRzR;)nbdIBnVQ^+ z%T79sT}LuKmct(ds|PXo&c^9!C!Z-4b7W{~o3o{jl?)b_C+r>McZR(g z&!i@&IKV@f=t6j-CQM`T)C$uO_h-{a_Ye0u&PU~6EcI$fG(t1+G!BQbRxzW_lNzpZuBX~m~ZgP%LMpQ0wYDcp#UDYpu1 zOr;)sqd91ruV=h>YgLYg%dYl7pq3(r&q#_LZ?}4H@a$E|TyK0`c9Xky91@+*((&ZRCW>ul6QNzmJ*Nvm)U{eSwy03B$IM0p^Y%D z>2Q*{Vp9Ks_H-0sfL-xj4J8>UtkYRvNMY8wQ?4^pK*dH`aSmNj$Zbt-8g{S7PLfTV zXy4qM&}umbMuwxA+>_7c(be>3uW=P`@61f(OWRCaQz3N`8VT51w?VisSb4I0Bm=3- z!Fofd=th^{6C76UHE6Lj?W;DgVmnst!B7|DZm-bU*heC}9ea1o0GL@@E*FOT-A>tee1n0r{4VxPq^2EzdUDDwr(xpn5I7U65Ok!ZPBdi^xR4F}X{vL*RJLy0-c)t|jS3umty>eS&jAGJM zE&E-qnS-TXtB0t8Fe;nqiGn-Qz3>g7H48CUT?;qVr+p%nGSp{XPTkM^R3YPR$rege zDcF5@fa?-%9D!-LyIT_Npo>{}h%iS^32u)L0_gh;4SEF*+5*E*C%REm`J*t0J=t7Q zE6t8RL?EuKWL#|ci_;8BXf?Z>OBtb9S1SCRZ}H8I_6N5?{$r7v-J1Rqu7)(Ze<`4R zMS%&c;iWlGc;>v+o0(2$@}(?XVAp~ST>`#(Kcai^XLSgmorCBg3HBk)2&9-X>= z=Qd{34m`13!Dw!Gr2L}IbYOjf+ui#DKiQcRx^snb@54WvQK62I?daG#mMT$0==qd} zBq2=7Oy}Y9XW%$$@2B1MlEV$xjSO6ix?eOiaIa`*@OQVNJta8*lQ5;UZv&W2ThJo- zjEF+ub{3OlmiLeKqGM(E1QdM4WyVegW8xTEX-$jz+A$sIab~|*+taJZJ zb`)G{_w-mgH;JIv>vn7uZW~{;qqYgU$Q6=$Se_qGBDDm&-=1(To}@C*>iiO;Zzzh% zJ~Gsk$SpeRA6SjJe_+Tsd+d7zvs@8oUzzRD#v(k*l7&=S70Q{&lJy)WQ&nh~+}ROR zPcNM)NP{!!%0onJ+nl5~ZL2iJ8?i)(b(I{r{2LKiTg64E0<&fS84|Zi^>73tZl=c! zW(6O1lN0V}nJ_0bTCtPL9cG=*LCD+dEFUvru9;l*$ya`jnOi+hf2ly zS%;YpYlQ40B4uyJJEhddfgw9~sIbG#%UUL6m2y31M9cs)Uon1mzE+xS;k&EMP4{+p zbX`{w50q=2pz|Je3&Km!-FK~Iz%z~%GpJ@JS2^~usf!)V%?`&^AA==Wk@0cOmSPgp z4M!HzZIXbA#e7a%ysgMFS>`eC$LVdH-pYdO&4HSvr7HiT(!6foloO@TSUByuT2o1< z)LK52-vwD6$xS$^bUFi{*X0t?omdMj$^&K z=;ZRAG7ij`N5k4)ajU~^hvN7+`T7TAiwx8qag@?%UxaQHR+WP8^fNqufLyRAn z8wP1C^yo_Ooxcr6jJWNc5z(ryjaUcFP7JsPkdaWgScjR+1=eDa(=KH4$o1V{6Omyi-kW_%X z6?h`ihT=uU2kDOr`qW?s!77sWE2k#m&}to|mpGuYub9dfunHr7D`2%PRSf=?8qO6; zYNL}cUOA8{VL=Eqv^3HdrS`Qcc642$=YsLvaB6%IYoD2swYib0aho2VOlg-s>JG!C zk(A8~Al(h^sP&;UG?B{NWz_yH{ez{&_yH=U-_3Qv(vHL4P^VDml{)gNY@rWh3|owK zn88k`kIJ6ckn>v&dT==|tQl^@Rd1I2lk<309rDqSSG8V`^Ez`u)f88C4MWVOuDVCE zu5xP}rn<_U^D)ThZ8$$GW9!HE@LXr5!~}K)$Y^*{FU>A9LDj5OVG;-H2A4YCcqa#| zRWWA*UY#YgU3E=do9#-Y8GB(B#?E#tJl^+7-lG*TjlwX%U?ke{Q>oCtQCkgd+3{yu z?@>wgY(zfQZo2WeQXFq1;pPJe29s4ru`V5C3+>W{&XrteuAsM6P3Y=sxZ&-OKF;1$FVI$PORenfxv|3vgrtKPRFUP`uG%w!-oV8g z^4YFBY!Z%t3%Z;&6S-nle{;4w?vFX5Ne1jXs6g;E(l@xuNp>PnI%0RToiJ{=8v1w} z=x){~f>>6dHt}-hLKyN?*<|wSF zVOq_sL$f?*MUJDo4y(Uz?8Aj6t*X0cn-?9<>I^nSRx{^rPOyJVGCfX59+81r zdz~d?5MsyNMsc-{bzQnNdLV;l0rSgCuDS#1?b(>Eam2>?)VQ14$F$btNKb7AUZqG) zrZauVrZ*Rt=O>e!^l~hs0CzPO71R~ed3HaLY&Oa0TB4e|xP;m;eLEPk^q7#vB)F>! zmW;L#^m5G;#Z*fMR4=!_pv&%}SvM%PCmOOcHbA$I8%DS&QUr;F-J`;-hY0!fbuJr2 zzGH&@4rkdEHtEJ(wTnZT=au%z_*%|eT(JDMC5Uwgdr1#DmSR@hZBDZzGX8i<4*<1v z2j_=3&5|~&5Lj5k0~NOad)=u%8`|7y*2%;RroZ5wohQ}HkTZ2wiqMPhE6jkHxKB?S zzEm)m3reoMu5gZff&mFI?53y|NmXZsWm;_+6@U64uN)5Q;oCwcV)UFsEc~^14QEHN zjHz>xuqko_N*(h#;ZDXbJ)gN*B#G73m11`acCIW#McCqC$Ey0M284u#!u+6Mf3C;s zhU#V8R@BC^PG?PK6kBR4I#BU3&}=uyV;}_Q|4N&}uI~TgreRabWZD&m6BrBl_R(W! zt@7wwDN02rqymEH8If{P3*HaE2+xT7Z;2du!u=E zCl%H(xsOY|wawhR#xmSBe_GDcv>3?cs#@5(T8z1_Utq->tW?#7t)k<(LgmV!tczQ**9#VIK<}WQ#TnD%tSRJ5c;&8g6EGID(%&9u zptkB#%y`I^s&K?omt2@NF8L<0iT~%Op3qA?%k-nhjme2>P_(@{fvt%!Nhhi`aaQX@wI|+) zowydo*||`Qs@k8~Rzwk|(CoT6VND5H%M0CuK#pS|-|egkE+`&PbF_9FGO}gfS7@4q zy`Q>f1y_HPSUmA|33f5Jhqb_Ec3B9EV52yajY&TGBo&6fF1JgJtGhB7KdyC^%X4j_ z1}z-sgp%Af)WO}DdjE_!B4#OW9B=6Hy{6zf4On_9Kd;PNp_&zsIgyycK}G(Gw;f1# z31$XJmBGs0wkQ8qVJE6V&b*fkRF*(e3?+ zmwGcBbA@f*?8GB&-nwY}950MkPN%#6d->TSUPj!TanUP6bzIh|f{q$ia=bEYN%0}u z2BF8xx^_`@R;Fxl4Q6KRv}l-Ir>&ro>QaR@ybBdLEhBC`X1h{-3=_}O7!Ic$d_w?E z*|p;1)hsV9J27FGnvPf1c70d$IzrH}E-qGDBmTnUuF%*;bo&ElRQ2~S{nTmMiZ?|E zHWbCV$5d39p>>I5P1CQg665EVZ!ggeyKWxG;JWIpW8&0Ru9y|3y<+=Gb)gI|u%p|d z)p5MiiZz>%<50a|Vd!d5F|OJ@0juLZ+y)}HtMRzD%4xRQ?s`P{v6=!JI3KNYlWLeS zzO!NL^WL-f-@c#Cp6hKNShLfoo^nG@52qTAuvlRoO1sbAzVTnl$)5c|_cMR9rKe;z z5sMh!`J)giy`nK&^>jNI+t_TbU0>}CS=X0GxW@Q#=wiqdi_{u5%u|1{b#6Sdki1vm z$!t%#z&Rn6c74x!#h!`_t2W=08eHq(AK19kanH$$UEG-M)`iz*eZQ(|JXgIbu5~L@ zMMe`vyzQSHHu2tt7z}-8Y=s$8*L1F#{q>a^%Uj=*LEwsi;B9v`-quz1F)%K!9+zFd zsq%a#k1fkATPhpG>NDfm+>;aMB`i<$anBip)D#Yc=dq*I%d=^@YjD@B4-q~I>%@&q z;83X5ob6>!R9O2RlTTZwQ>wc+m8Wc+Oo)l<+eUZ%{XLemye#bP3$D1{JljH6Pp9Un zZtozXSsT!>7gJqAW-t->asdyqsaGw`sH*y9en!;<1bR6I+Pt?vMu8)(6g-8v&%p`v)&{plK+fGx8yI;3RxV!D4T+)X6^YxmwcL?j+N^LHM?u|G=BMbpY!d z__*#=^Z`vgYFzVU%SurqE3W}Ucl%1`1bJAI{vMBKUmE-@M>Q2yeVz;9ufw^)7`bm; zR9DM&HKAtx!*!%Gmzavs43K_Nu#!2it66o7Og}$Tu-47w1rESGL97~F;{=Y~#Doqd zb>l=*%nWZen6hDBoUIyt)KG5NwTvt)3}cL!IS) z((_U8X3*=!{(-F3=HpCiW0qH*@p?kEC%72xnnW&LnQy99X=x3E5oWh;MwAsUZ-!pe zw(p~tEBPvIn=4Hwq+vE&aBM0bEvb8eYG7Wu+|=It8j26k4cB^wRDpZ=aQU|A**vDp z&mGKWsc<;8HxPA{tG#C4s^?^#g%jOusv@dJdo60F*wA2gb)gBoqAA`wpLs|j3~CKR zfPsVWenJi>^GDE2#n$@%UiEQ}eV^9L!p!FTv|gddi*4cjxIh2v9!pQLB;~u1UXRL# zDR{qq7t*^wZUnr?YKbu8yH~E3Jz?`|pnq3w|BQEYEzNO-Byb!?L_2CZG(vu{$~_nE z_?!=5r2M#_4-mn~ut(^x6T18R=4t|k>-E>L+N49>U<4D>1Qs`vl)k2HB?lIXW0IqOK-;48{2vGAL-(@B0jIX z+0}3Mvg@2*JjpA88^XKo+w~!#{3N_vK=^v1y_CZztogNhexG|_wK;IG?7jr<%TAW; zZDtQh`E8ji|TD#Bdx~< z_ZXUwnmX-$-TK-V^Nv4TW3T8E##x8k-Lh+=sd0RcSPzA~*25C&@bxyd#J#BdR(=tZ*yZ-KJv)NovjV{Ei$Sa|5Gf13d&mRmf-hZ zb4P!zI_vL-w&R4`5Kb9^G3ENvaH3652m3iI4yXQ{jQH6d4|!ws<9_P{_ZkHbE_dpx z@V-pvR(x-GGHG{S*`LwU{?$eE`E!5DfqmYg<9-qDDNpE`f1}$_Z>svkCZ6)nOkyv+ z-`yv@Ki%n%&v*9sua4oHcdu@p*J$r&e~A2_yl<-dKXGvQ`71U+ju2jm%i&WtT0-1$ zioM#O_CAf{cgQ@ig(&uU_iE(xJ*ZwVNmlM(LcLIk?w17R9ldyXGKKHcZcU~&k7F*n z&!@ctye|TG7e;XCAxs#76)knu8H7jg>Wr(tw|}ijqZj z;WJB6YxaI4x|naiIC~v{=!AP|e$uwZ_8grX#A%W-UB~M-`i9)VfV=}ceR3{4>1|<3SJ6S)#Fw*h%aiT zCIS_jJ}pKpIF%X7;g0O&M$Q=rpU=c=L!7p5b3?ai0~vW`L>2QWr8FA*to94sXM0V> zFPh5Xlg_4kDjs~KBtKlBLpNB;kH^0vIXH~%d;E?b98*l-E(dnsxTXBe7y7UTpZQ`_ zkiP7NF~c{mG40q*{6B^xzG#R<%yiSO8pkKG%HG?=t2?E{V!s+)!4STVh41B>FTdr+ z@sYumxX+uVc-x08hG#(y!mnDU@tx5gXC=to@Fwn0v=V?yBiitpBz_a#tjw=+0_PfX_fIQV*q**B|j>KyIGV24#Ubw27@WPV75 zmchzumpj*e`7u8P1jqg+CC2<_)t@_8g`SAL(2kE1rH02dFJ8KK&GOttK2^#NXUDzI zPnQ+cxs`ecGk4vf(|HMn&~L2NG>JBSqkBjA?$x?j_wf$vg~RZRpF2~$z@6=jH6JlG zCUC&jvdn0%kcnn$L<=fTf{6PUx68_wj>5p{x-Oa=#JH}>>d}gtc!4JCFT>k5y073w z)Rl0@U}>R{+GcOATC{oS(rjt0ZxXJ1$>UN)4R}LO-{Q`>T4sa$=?`}{L=@OFg|CMD zMMm6_=*Sk=PK}o^Qo3U?avB(}L_!a`=}(z}bZ3ihQDs+pvPJh3TviK~eZ44X&!XDf zgRfqjxwSIqGP|tJ_++T}6(*QC_uK3EtSgLV_DW+b1LD}`7Yc*uB)Uuu{rrR`r?FO9 z!ABs$=B^5lMD?J3GFO<;-*Hb~){$rUCDbx|A)hOCgPnHRIoCk#+ z$vDJgAl8fOrf)Xf$72$(6l8p;*q$Y75N_R)y1Y^yNXOS1DUPmO!POh6Lpq>ps)(HD z#`#G~8;`*owz*B~yUCwi*A4l;sba>_nKiiPUN!_8a7cT>Ce)>7fHz_O(wRs7j13dK zs?cPurM-LI1X-^$klBdOCuBT-6>&b(dG4~8UoV1@VhZ7hc8&e^Aj8O?cxs%sAtWkfs=TAQ|uGNOhJTx@(TD|ODoqhG>AlFrd4K8d0*C3Ca zNUI0!Z|N<=#(#%!xRWJra&;C)Fez%i8(-HPH(q{VY9Zc@nOe!tVt%TWw%J)R#?_v| z;jF9EI;yPNi5>*CZca%??tZ4pl?6LGKF9r7JIx&xCWBmM#N099y&=uhJvlYuptD*W zdzo!;yXc*mA1SAN>!?gmd8)^6Yog{7(UTZ0VQdYw;0)Wk7~SLgAB>xq#z>F5lMhl` zYoEKAV9ofMS1~K9N#0^VUr_8y;Up`3w#oRir83XC%egq6%Wq@Crptcg#2y6251k+Z zlf+mRaR_b~jWIhiScI1Kykn%pvKuG;zpb~drwT$#<5N>wXH;-?6u#n)^(uUt!^v(z{87Td<0r=Fyhs>V|cxRhIw;B^O0Opgjm!!wih zRIS~Ba@A3(3DtUIPOF0Q+GMm>ZSA*KllITI@YQN78=-0s_!F;=THvROuY=U_pf?|^ z@&%WSxf;yDUJq&;X4eZnLsm_g7MHRnLp7MgvdmP`u7iZi^g3&+H$PyA5iz7wQ#jn* z$xNp+d46cw_4;z1&PB!1Y0o5z-d31>Jx>2*YKymS6yRZn$KWd>8{w_WRFPcsg+M7R zVIwE<$FOPb)~3x+-`B8o8E}GUSWPnMGS9FS<6vWSuqYrs|h30>s*X^pDkr|&IdasDw%1#{#n#^8p|O`F8a_`BYYk}@a*b8&l!PK^FXpVBDrKfIyurB8|DiSx%f@-78uO~d9$)QOP#I+!zrwwq z`mJ#edbYmC`?;F5G1;GnOK6wh>Uc8mK3Ug%?acUMQmbTj=ck5?+k7os8@GCLTQY@F z?3u9JeQJBGYnlO%3|?w`4x&6Y;eFHApU~;?OsWv@kIGd34D}_ZuhkVZETIcqGb%*{ zGb|QzGCBbdm0MAytqbj|n0Xk33Zk0b@9It+0T@LJt>E;R-1BNN-6Eq1Pd#Dvw!Ir) zKc6gOw;Xm2LbC>}4nDSFK8}f^+KmRBx$3J@TRnOLpJu{lNl(4G`Y!lmZL=7stLc50 zp`yY+&v0VE*qSx{85UqPu)8*nE^`+n#)-;zh9%Ij^w`ysvL4?D3jAtP93kmVu-_xt zqld*yC!fRqCr=vW(}{N6ruQ;WVhKL_7LGBuG<$cjsWTK|w^uWK*dKtI7T}N73`>Y} zEOa7w=9(t1*a?o;>=!#dH^pw7n_@@irr6Bf6x+X=+Ejl6%LI8js05f%H|-vkYIj$; z_!Rar)w%3~k6UO*q0fR0bE>7>I0C5AkM62HP$~4N_G~Xw0_n|q2XkHN$KK*tZY%cn zZS#^*bu_ql3Oj1tV96Rezqb|Q)6OX!VAb^u0xWDZL4ai!hw5l2c3NgO=SD}9<1()3 zK^ii%8Q(ZYnAPbVOYT>fpU)K$33QAC`+A+V!#cfO3WRW#>ZmYWSn?}zwJxgb6&~x% zVs(zY4ZUS0D>^kXsciaIsA|TuZ-x`7Izu}uGPFWhX2we_dK*PiE%~H*VD>7t%N>XA zE&+2z>^_yhi!H9yf!^i=%h=!xH$yz()NFk4-xuOR8PZANv-oL-Cfht+r(U&B`4h34 zek*^X0uSAr-4Jgbd`BleJ)IiPZb`H!9B0c!)=7_Jg-^e?hd1*^b9#s|237KgESB3i z#ETF^gR!i%SHi3`ze`r4>HsV8w|x6acPEyWcB>5Tx_~c;&5)5MxY0$(>EQ=GW+veW z8!rSWlDFzI(Fw;A3r1;jPc$8e5r-#eC#$ z1jd5Pmae#H@^~ghf|~4-;@)%faho_|-Z@LXG?PB3^diGxKlsG?D#DZ|$?MGnn$+?S4WF1#S-Q zdiUB;MHSjIs130-E>+6u@14Xix_Je6nMF76huS8AS7B(W7r)0WEc@|nVsT+=vXq_3 zI2pW8SOD|j6Y=X3di5oE(PdZY39FbeV}o~#g_h6-(>+e|;1&BOHl~Hk88`uWZv^l8 zFpNRlklA1(+#S|rkAF421s6>kA>!fAw1cVbUN@KfQ>C$`g^g3(xNUo(FPZm8Ca18m zi`9uAyC$-ed`qP4=hSq>&)qmpSHD!^-Ja;suLO8!ZJK)RYdYb}em&tUc68mogiAFe ztS`1FR%Av~*t=h`=9s(u2E^PDXh+;VH8dyDF_GGw@!xf^tgh6B1YQHcQcyAQn4Tb& zo@#F!naYo6`O!OfUb!!6=)^8kR>%%|+=}T>qQ}%5c;0_3%qvV>t-UI>s-}D7I4*8m zF*PyazG31`r#^4}n3C*Qn&{S@>@(_U8OF?B=S#XnctM&w!rGmoiBujbw^X)N?344p zXE`hgg)oU%a=qh|@CKbcYZ_J(SIyTQlb-Uk>PdG$x+Q$GAif>;g)q?w)Kuyi&lK_I zAr3qXGyT#rcJq(tLJq!;^N3hoOf#_Y{`i_DTm zY>Qy~k8g|YXIo-9f?rc?5Y zDSUwzruBF?(0%jEZD1U8JGj+EG%oJG#hWwRjD?+h8L^8)x-qUr_T-m;T4 z$?KMN+hS*$EHn0|MB9Y-N~!F3kG2u|7+-5BtdY=-NkrdpoOE|=6R;wvUrdXzEIvmP zivtEQ*sro{$F)n5wL4LRU8y^sYH`OYSg0N%qk6==N+isiiG9fP1ct<&z=7)#9&+G% zq7C7)ebdp1Oqql43a$<>=x+qQf6wg-$tqeFD-pPcy4FD#B)V4^w+`D@`*U#cw)x{# zUZSTz#CZ5}CVi*SvmM2)sXXE;bCievvkz@ZZoys_H%|c9gf}5>)xU|?ZbN0cd~vTw z>WFdu9x!e|?2?|ybA%%AD|^4!tq7w7E!C^1{t(aWVgcs3+!*gJ;X77vxUT+leL&F?t5fs^t3BitO(e7ougZ-hP)WLK#r-~}C`EoB)VP`As;f%o z+Wqtox4;XyrCEdojm55_Ha8G&nH)>59@q5huu13}O50)}loPeIV zp+$L%6P;O{Y%qzPxHwT|97h#J=y-pWW;?3y%uM72Jkh@V75y*)J#qOpo|)oU=;8#>Af1g*`3U#jIBxiwxfIl9=mrmIs-zDbWX%!M}(+ z2n`QJpOBVl(@$hJ7LemCGf^1&*z?n9)+TU7abV%j1j$U$=@o~v2qctgpqNCT#3bjm ze28-({wXKhmKdq>4h54*$Gb0O zwTI_Js27QLxv+~!+P}Z-lAoa{yCgMr*+r{F^ssfXJ~v{AI@L;Bwty#IdjDJp#LB4a zfdos}ITz+xFwVN=zDVP&WS6~x9_k0U;#Kzp`h+XIXpYyM&>{D%P`^j`6zt{C42}W3&^*lI`o*|fyIqX^* z%_q^rSRtcS${AIuX%!2x4XZFh6`!}(zSc(9#*~Uxy4eUz2k>_^sKe5^i8N37Sy^W#*U&H!#Nv5^ZKB1ALfWp zoz8NzZNOcpn8V)qC+*DLYzQg#IT|!i6GQbc9?wi?(>X*<`7vxq8`qOQRnXs;uCw}D zw?l>XRg$089mcw4k|)Qz>2&Zh!`&);LE?lo!*wC+th!ba^lbyOKIozRe%Deb>3-(k zc(HTTgfJ5VpSho-I&oghHu!=ks>?7Oxt!VbR`;x`m9+>zbfWhJv9-%tGm$IKeJ2Nw zLoJDfRsl{SHM!BtoKslrUb{I|4xWT2@trBHn#>6y_3NWrXHH}W(tNFM?kof|B!}b03C^Hh4XADFaP`e4YlhpB$qr}r=p@5(cUffaI1tvv-O!Tw zw54|}#T+SP^bZ>;hXUp2Eu9iE#$I z5Jin6_&h>kNrvtO;AKSaT&|tq=&eii3aW#6Df(`*L1*3Y?G*c=+?txv;Vhfl zR#)=h--%LF1u#zHP-6Q?m2A5hoR~Ys(o%4EV(#Yv=@lsqkh@LMpJ-Jci5#LT&y){R zl?UW7!O^O5ocz6w^v-I0s3)Dur_$bM&uV@SVyHhX(2s%SZWHq*zgnw}67ed7Vt4#t zGhf7+j>s_KMLW@uSnW`y8mxY?PsYc!qZlcbR?eaazTzXX!(QoNT2zTPlr*$q#1 z)3j6?N?e01pSN;}3n&FPLXV@*JF(u*9LvYBCmjQ; zxsM-8+F9Y|X=a!fDi=@dw*_U?n$s=)L$sop@G;-%i1nqtv*E-6*)JQj8 z`lU0!!4E1bq(i)$M64TGrH#@;)3nydI-T|78M|FRu01_oUM!RotK1?xM-Xu$oHCh+ zxH>}Vw>F!8D`!nige#eIY`0+SO?U-&F?!Rl5s0!tI_7pVi5Z!ACRKSb#HN_Lld+77 zdBAIzU=>8O%YDfxzV{(!wQFX<93(;?(P0k7ne6M2seTg%#Wn$J%@9p|c@RgZ581R{ zL@FevC|iukZ`7RZ2_IjcXBYHls>M;D6}FFJ}@*_eM0yl<6m@ z(13{Bs??Gnw{QP>u82+~VCTU|Zo)~W(>UZQkVuFrkikE`_kgI{mqR2E22wZ@D^7^` z48Ponq45(2v5GvVVvq4~qEVVQ60!3zQeSPNc7lL1HBjp;j4a3&BCpZ`Sc zyo)TtV>M@;%~Q_d@)+8Qp~jmm=H!dxmd9A0=!3JFWbG+L$F2^84L>f6fnjrY+1fl+H3fSbPSmq=^2xku>;%F|_%u((F zUvP@vzcnX)^~|H&NiB{xS%6N~mPHP^f5$lK7C0v-?k~n_p8*ZxJPum^g<5&<#4-V9%9QF zzUh|1wQyS|`5qG`V#twljQ;jsKf9?TE!`0J>!Xg1n4$~hi0W2&p%R-0|G82{uG<&k zomJ^Ad=9Zx96Rf(l;ZlPcIB+b;K%NQVg1P@67v`;d=o`)NQFt`AjJlidWdj8-5^@|t~N%%zVtam=f2iOew)=^-d+}5 z1ug50Jj8nYtu3Ozo}^EpW$1I9#vLoI+N4=w!o)uAF-y>$w+*NeZ@K!&ZmyeiPZQN~ zM{1lKU#X#5Gunp6>SoV5^*`1b_KhkkCE>GGH!;WLcvbOqp#80FjB!j{AIi@*L*=1C zk;_VPd21+2>k_)^yqliffcx=x6xO5P&Gp<3CzppX#WaWBn{YX*bZ;H%jbubJkg{MR z-ELKjdqC{8)`l~75F+cN?Jx$(Z9Q^R^x0iEAi_k8BRS(nD6S%DGpo-o8pbjcf*)rf zr1ff2VL@hA;j9=CxCJJdpwk^{dOnz1mB`~^enBFEm7Cjm1RZt^X zl`ivUkxbTiyMh>MeB|x%ldt;pz?bLr?2P%i2os$4mhgu}^fmL1v`UZL&#Q$#3*$bH z@ryZkyXq%J^iL!Pc@1-<6ftn-ENhgMdfKZecjz= zhMxN8N_jt(oqVlN9mGVU#~XYag@(@qM4A5ig=NR|h=C8B%7mxnF;?zDRoWiccu>_G zWlqs9^l^@ljj#tILH6wiCcUyaYg?54^SNfWMcI3Pjz&409mlAf4MgSUshY=$z)ida zGDi(|rv=j{c9qH6OumW(y;W1VS*r=NwRv@wk4mKO7vm6o87A^>>!YAHBkNJ#L5yn_ zTUE^ctc>|8R%Si!;N(B1Wp!`<*u~A5X2@lA@0nWL5jl!-iPbC7wj%ZkyTs}}VLY%o z**33Ln!i43XD)WQpNN?|!~8+r{-!sywaI3!sUR_bBc$^9xYDL;Tt7^g@bQekbQ0(L zCX4=e-g;JMQl%-JC}-VnZN|M{7h}_!@QJ+NA)UU#_I}0pQ*hjAy0q3ie?XVkHIPZ+ z%zs-08iS8rr8grrB76pddDKI9{9YCSezZf5e;buLN%#7|e$5!na9r64!Wk5@QVQm`IPM3U&i> znypJ?`JZkpz6P32JNVpJ0UuJeTjjeEI1DpzUN@gMMST>f@E9#CF&rb8q{gSr!4;B!iSFX&Y~FmAXDGKhGg;(0d~Hsr{-cbW zJvbUu&kTBKMR}+6Bu&MM_ViSN=LW=8-o}<)G`tCKgjKAym-j6#6jIn)UZHV`c6^2o z@_|Exhw&YZT5cV5&k(M3tFGJ~jY_xSOq}UFI^y2RR`zOAe^^I87&TCB#kvHRG=4lwDR6a9E?XSOqD8whW2w(SGyCPMFxayhr8g*&#tXfx7(SW+f zsha%}@A=mJOyG+X_2|>ZB~N|J&bN0!7V+U}d{{U)xdtW)69Xr7Oikc;5}c)e{u~SA=Cfe z+z3|`eN-RA6KIp3%6;5nM7sv}*SlVfAx>)q?~2eBQEODu^A3@u9kB}2 zzQ%hngUv*&RF+Pr*a_=tLx^8hTZU$YwIP18N^UTu5Zz09T4r%*a(;B$ekHOtE!OK? zFqto8@VRcQF)MPhT#E$RRQCE5_nT{`xXTF1SdCG;&k))IT>FFJH^AZ~Ez}99ftaQ3 zxB?i;n?z>R;x>fVU0uxL+Xh!=M!X%1W~j;)M&-A>(7^CcgV>U6yTbc0%QmByHv(&& z*pI4(9W|D(V3t2Y>n;~D>B!XPNc+xJ&5s1%x9K$ghre(FKLVL$zHVd1vc|TAd{o#3 z*R}DAj-3X^zwzJFskKJ;dvDtQgz7@$*$w-CA$4Hrj%ux;#^8%)HP}+03$85;)fAL$ ztD&(C(Y{Vz-ni&Tj@^Anrz#n2G{o$+_BX@@v=W|oU4}A!Rq={HnaZDww*b+DfQqc% z_X;Z)DOgMQH9J)8y-nn+!04i5HD>hfVLchVt7h#Od~C)#F<4CfnlSi$4f-$mK)luq z-dCpU{1*WtxESO}V8@~AJj* zneNU%MiYog0VX^8B?IcoXt$EFrww?bbal*QUe*H7Yo!yZT&q27Us#RFm>4?|Q1aD^ zOtdjW?~E1@@~~&Fot#nY@byRYNz`&1P^}s6uo^$ZeNmy_(d7~{rz`iEW0BR{W8R^+ zbIqtUyp=6{Igaa$2F6%NG$Hgp#Vj?dc6SMjKZeyNSe_B5s#x8S$54&+Vq<=pUlUTd zHg{AxQZMgQOfdncC@!k5<=L8R)XKxUVYNOr(dRi=^)=FSvEW+-yAkP8=-C+UGLarP1_eNc{VLxu;d6=r_x|RrOBP& zaiZ$BH?a2`VO{zBjeFjP37%g)quvzwzuRt1 z+WJgpxlEfSlS;+J$-|5at2NslEWBclyZqL&<44M;MDQW2M*=QG*kT1A3D~K!OJ&wc zYQx~&v!w$kCfoo(Y7g!GVsAlkyHa=yaQrUFIF%>);Vm}>Hz1Z9ZMo*)Jrp;&;%c^> z5`MjFF+$vmdp>S~AntxqpG~NQlIH%#YRs}wD}tPkt2=mCM2-4bNxcGEQ_dgT1?>uG zaKV#vDnbdIBnR2hB^LZyfdgZx{!)^sj2ok>rXGWan)opQKE)zRCz%n$mz^iFy_lbW2$2TJPC z;cwaR!PJ(F6VWsMds(-*%1sR<57ke~R?LDqU8QyRkpzE>|cqvgjl96U3^D>D2urq*THaa$^2^B#)F zc3(Y5(wr!T%tpMayQQigxvw_zOEXNAk79jut>D-c0V8^n$2%?kgWbf{T90XW~_$p#k~Jk8)j zgJ&4L;ScU}>V6kbGT4FZjq6)g5AkhH>RjTPO=<}-*`QVszu%-*5#QRP@&?xso0QsX z@D_uI?ce|HUO!-P)z93&hYW5oIBsy4!5aoUzi(Ej0C({3l?`eq#{CrFb^QB?Qag#yYfyU(9x`|X@%JripTQ#rcN2SB z)Q!ZSH>;b8OB>XF;*T2Ct;Ca*x}EI;u3)?PH-B$#Qb$=o@F4&Glu`@%H}DSreRZq4 zhxm&Y^#E}}qdH2ws7XCY{8OV+Kjrmi)l9skMa?6AqeY!W9B5SYiQ8J#X~cC+Y9a9@ z&FTzdbF*4Rd{l!vi}=(A)ka*{pgM?&2Gv7c+@Q`SKDt3IAwCxKj`-U~)lb~hphgT1 z5ue_u))Rl&pvH)IHmY&rRgEf7{AGi>%HZwf2mUVc?=Lp1X@fh64{K027+gX=RZ{U9Zy|G2zN*rxf2Z-~V)O=nC-p;>IZ&e40PijyL z_&e|p{(Vh@I*oq=59#~B7yf;Ele&|CuWC?-iSruNJ;Yx&sk3+;c!YnyuvNA3Z{U6W z`{E|m!M}kI@bAYpsS?Krc$9w+H>(GUk8W1;c;5$`)k(y`R&_G5xmBG({6M2xM4W0+ z8;HAG)QG`@T5ej@IR8GgRqbT?z&!uHx>1#g&udgy5zlE=+llXKQP&W=TGS3=Ym2&G z|J|r|5nEc+4a6Ip)o$X!CUq0>?TzYIg9i=nB|ZfH5I>{Te&UxJ)$PQVR&|KDw?*AU z{A`OlLOi=k-A6pwsO~5J72`vEN`pE|JO|@KTnss4fBGOt#9t~kkNC|7brSI`j1%#@ z&FUtD3y8NjsndvCn$#J@rA?~e;N=GQ8C*pCtx{(ZcPZ6Dd|QLsL3s!E@b6B@BmV}T z%fEjGJx|OlwTAd4%wyu)z!zc(`kr_*Sp4Hp{Iz48`S|~u0`EJ{FhRPh+oCLXM2Em^6!^He-ig9br11*7-!-gE$Tkvl@00v zViWp9JqJ9>zcbKR#MUNtGJn6MRh>qBLbKY(@_`Ha_g^tT_&4wj{{4{_wTSp2^bzqx z&_BfgYEcI`A2*=A#3I^D{1Mto{6&+xhd7M(5pQf%_Yohh)cwTvM)d&kF-jdJu0i{V z8(WoP{h0>UOuVd7%_E)+yH12*pHFpr{t};})Dq&SVHb%1q0}nkQybM9;=e1^PaJ7gL&UXBYCZ93N?lI;r&1e; z7r>qp2cd6?&xSoEo~cxxcpLO9@j0-Q#EE8g74dAPwiD06d?DVg)OEycgW5%WWsBNP z#F*bmd_tqzL%h6E-9-F;v)W7C3A;ypZmZf){ARPdmG}as4iMh}dq+G^se{C2uy4dy zG^sPd2F@;$vIYxx{^tC*u1s-o$4&t5w8*VZ4c$r~Slhn$!^SA=okEs%CXL@xL0? z1|rPD2(bhH3-J`#H{wTN--wsDs1i{%sA*yg{176h*LLEc;g1l9;D-?3*Ql-|ei`w;I$DVlVhZ zd`649pO}Pv5wC>((bu78iBlK=_$sH~1HX>=+a@)SI1l~`@!^m!;uj!aMAf7g5EnpS z5Fcn%3yEtR)EUH!Th$`stD#qk|7cNd#K$zM4q_30Gx0f)H{!1v)e_g>hxj7M8}Sj4H{t;FG4cOF-iZIvsHTbE zg@&`ph4YC{Bx7qM|>>wIPn1d7UIqDTZlJ7?-Sn-{u2*2sDs1-_$kDD zz<=T`E$U9#Mi;@nhgW@j9hS#63-Fnz#k>Pb`4{#EvF)4RO9wJBV*=R@V{lMm$1< zKXpCvui!uN4~^;u;z{sli7#zXHxj?rr1lUIE8axxgda;BXjL~8PXhmmuW3-X5FZP_ ziTK}2-AY^wzm+)As%|Gf2mB{~3j8Pj4gM+dzZ%q?#Fs-q6G!2f5+@qf5#o2@XAvLS zpzbH$3_pwbjAnI|_&B8=BrbyDJPdp#p@j0-w#8*T9iO+<+CEf`B6JG`X6aU$)dWa_@ZYJ)7y(O+|RV#?+BW@;6H>)+o zRjsO@_(te|;__Ctp7<)nuf&fus13xc;eQby4*4g(qCt%lAK#$z#1)W#Vq2@4CVsd@ zU8S!pwVn9q26YYbU5#o7vAb1WM|?}O+DU}pd_D0Cu*1avfc__b5Bi^Y3gQ^z6A`Bp ze+Bs`Hngg}`a1MKG1sW}5sT3O#02D@_!h*a#8Y9PiLZlwCa#A5Cmw?SC$@qA#4f}o z#5Xsp!^AX~bsup7{3~J}@=yE;=C&Aw${Sncs`0p)h1@Y63Y8COxt!fQ%Bk~!<&w~HN^AK+l z&xQUczP(9pAif&@Hu3LGYK*uW`k(kz_}j#XnpKJTQ}Cbo5$J#7vs=`5;$_hP#BTV1 z#OF7u>xc!!)x`PD>U!eYt!fwX5s-i4`@w(WNwELKHL(B0osfUxryJB>;y)1I5x>}= z_7R^5`6oWVS?wqO684|?WALAtZc(=rN5OyMs}WZbHz2Mez7FzF{1D$;H_$Bb4I0pSsd|InIiTEz?pZGY$+eF0I z3y4>M|HMtLY9aAH_MXe$J0RA8GNr<+2-K8iSv_?mbc{6FH;!GB^q^gnT7t9p?5xkdyI!0*8R6aNbS6aS8U z6!AmgKk?t-{}cZc{3oWtf8r*{zrGIs6Q7NI6|u8Loke_QlWHSwh5jeL1O6ZJ>&Rac zp8@_8pAG#_L{4HA@oDh?h!-}ie&RnM|HPj(sP)8;!Tu9J1^=IjeD4VHO-hXspWdp* ziBE<9M|=(PVZ=AIsA=LN*ngtaq_z{U2LFjKfcz6v$YT;O1^JH+Mo7ExWGZCK?(}@3wzkvJ`J7NEc-$ndKd=~US@ek1d#G4`i#NR;v ziKjFug_!izH-i7fPk{f#?=`BEh$Z;{#BS(+;yd8~6IHW1jkpE=Kk@a@|HL-ff8zHc z|HN;A|HQYz|0CXsJQNYW$GOC-TGSHa-w^*3o8kWx{|EM;_&wNv;+x?A5n;2|6JG-R zPkbcoKk?F5HA1|gMU4@E+@!{dM-l%Mr{Vt-zlnSc@gc}R@#Ww@@dogpcq8PW_*~>& zi02~yBVGai6aS>tE@Hk_-9UU9^gr74K|Y4~X2k!*w;>-xEW!R08)5&6 zN8$eyUj_LmW+DH?&msOJ{tfa^d^`MqBJ$~nh|h=rPh122Ph1B66OlhULc9j@Pkd&R zx}SIp;(ua4{D1vB_)naI|M&lZiB{E2Tm}12JO}wT;)Yf=pV$Nb6VHeLPy878Pkblj zpZH9yUl9Kn@=v@1{3pH%_MiA&$UpJ1kbmMM!GGed$R83HL;n+p!GB^q>_72&(Er5G zL;i^?A^*hRG^xvp-+=#5+z0(nd@=lgqC#Grcy_bO6E`FOPDCDan%D;WPrSWZZ703~ z@jvkyt!f8xKlo2{;QtdZYgN}1Ujz9kJ`47rxCio2ycqhQi2V5;;(x&Y6NeH15i^MY zh~2RN#1$>-7UGS__YzM=evWu%vpPV06ZlWu3Hwj{e~s!6;;HceiJxgycM@-h{wKZz z{vUA)@gMPjVE>7)fcz7`4*nBIApgWB_??C)VJQM38#Lt5N#Mi_BCr%*$LwqFsf8y7m|A|j&RlA9wYEm~6 zAAtTRz7YDKcxj{BOMDjcKg2&l{)s<@{1aCp|3`cc_)k0&{vUA?`k(kD$UpHm`2WPW z!v80}4EmqwU|os`Ufx5z3I0EECDx&cH^BcRUI_jZM`8bo&xHT4|3?1j2=8lD&BPUm z|A-%k{wIC`@jvll;6L$i@c)VDA^%5wD*Qj<^~nDamp7Pny&Q;>pPW5f`_r zG2(|H|HRvxRG#=bb7!GGc#kpCmT8U7#f4^8S;;&$+# z_!Rj6#BYHA#1A9>C%zy2C;kQeCq97uA8{P|pLi4ef8yg{|B0uA|HMPc&lCR>{3pH$ z{vYuU*#F-Ee}()X@gmrNVh{X(;)9TX;%gh!$;6+5|HP+4{}aCj{jU-BpV$cdPfR2K zN4yOBpLhuRpZJqT)kFLw@_)n+G^-`VHzEH=%)tLA-jDS);&UMX#2aA$iA%tL;y(C) z#Qo6!#CIe9Cq4`EPkb`upZIIYKk>cD{}6kj|A}qL{}Qi&{1bOT{)yj$|3|zB`9I5&scKp#O;%L;n+h4gM3~jr>3HZQws~6!K3z0Qo0=1pFtS5C4z&bLfBK z@4Yc z@%zyK#3b}T@r79bA-)y*pZFrI{}BHj`k#0$_)k0x`%ip1_)ok*shfx;@SnJ(Mcqu? z3;q)if&au`BL72t4Dvt3Y54!ddy)Sku7dq1{s8h)bdWiBD`%>VJSQf&WK*dV`ur97Fz>_*%$6@vn&gi2sED zuYYe;rx8C0|DTAtbOvz{`5)rd(Er5$f&C}`5b{qv2mB}g6Z|KxZB$E$XTkp?zN|&9 zBEA9fAMsM;|A`Lbf8r})|B25-{)ae*^;Y7)HK`He*CGGJA4C5W_rw1u{xAH0;wH#H z@j}>tViNv8u?hO0_)+Blh|fd*m-s{QpO^*zi5DRLCl;aqiL0UiiHpF0;EJ){_mF?$MezUb1AZI&pLi7VPy8GFKVm=R zpO|S@Clkk^|B3g3|HNgm|HKbM{)z8_{1dNgRc8^ujr=b$*Q`2-ufh5saRB)r;(Ek? z#4BO{iLgnli0hF5Az}|eKk@DG|A>Rg{}BHO|DX8x7PW!cjQF4U9`K*|C&)kXXW&2a zS;+qqKLq_Gfa90LD|_}?|eHpoBm5y<}#{|x>UOUVBaF9-jLw}Agd?BUr>ya@S! z;^tLlXJA^*f%!GGfW5dRT};Qtff1oG@<{Wt7C@hyn|iMPW36Bi@? zBVGai6Q2+NpE#w|jl@sF|06yP{3jlS{1f}Yf8tA#{~=z8^*>@O_Gb_;h5Qqr2>Va` zBm6(&$?*S(>mmQd3&DTlqhSAu?}q&+-U|6A7Qlbvx!^xB*{tp-Uel}|AWpWbqs0G0 z{6{>aRVm2Wsb7Qq6FXYfJmPy1{}W#f`6qq{@jvk)r4|rjJ5D2B2K!I^H1t35;n4rY zlMw$CuY~*)KZpH7#CxItiGM--Py8hOKjN#f{zrTS*8hl2SpO$}1@@n~1MxrcMX>+G zcfkG=KMwm(oQM1m@e|npLA)3FAL2OTf8zfl{v$SE{h#;}=)9oE1ieAf z>jm8}=v9JVBIq7Lw+VWYpce{yfuQFLdY+(_ppPCE<1gqVf<7$hLxMgi=mUb@FX(-O z-Ye)mg5E9YU4q^z=pBOIF6e1N=LJ0`=naBiFX(G;`Rf1k3=pI4033`#B7YcfTpyvyEo}iVWkN#DRzo3r@`mmr63HqR*4+wg{ zp!W%Sub}q`dbgl=33{iXcL;jBpr-|$7xb8*Hwb#Yp!)^AO3+IL-6QBWK`#>YLP0MO z^n5|j6SNZa(Z7iC7xWQ99~Sf>K_3+K0YUE<^gcoF74#lK?-ukfLGKjw4nc1h^t7P! zf*up}20^bEbibfi33`d3dj#Dk=tY8FDCh-(o-gQmf>we)`hXaJK_3zHVL=}f^g%%% z5cGaQ?-TT1LGKatZb9!7^iDzV5cGCIPYXIP=rKWW5cGOM_X~QJpqB``N6>A8UL@#+ zf?go#`GTG&XeH>Qe-`5}=p%wYEa*dmJ}Bq|g5EFaeS+RA=skkoE$Cf>-YMuEg5ECZ zX+h@&JtpW4f?hA^enGDi^b$e$2)a$siv+z;&y+_cy1-(nqI|aQ%(Axz)E$FkD%KGy-3gt1-(Gf^94Om&`Qup z9}?p)=p%wYEa*dmJ}Bq|g5EFaeS+RA=skkoE$Cf>-YMuEg5ECZX+h@&JtpW4f?hA^ zenGDi^b$e$2)a$siv+z;& zy+_cy1-(nqI|aQ%(Axz)E$Fzgg=K1$QgBOTnEA?ojYC1s_##n}S;v zd_ckb6}(r$EehVF;ARCU72KfUgo5J=u2b-41=lLLTEUeHu2689f=d-#sNezx=PNj( z;FOC+3;h+`t>7*NcPh9;!N(MQRKaZuZdLFB1@BkzUIn)(c#ndc6`WLXgMt$Zjw`rM z!J8FatKez{S1Pzd!DR|ARdAt#3lyBM;D~}#E*35HS8%t2yA<51;0^^JQ}9s*w<)+) z!3Pw)U%`77+@jz;3T{?#Qo#)hPAE98;5r3wR&cF?s})?S;0gtoDY#U@g$gcEaK3^g z3QoCLw9sF{-3snfaHoPh6nspK0R`_@@LmPCD0q*8n-!c?aD##q3XUtd zPQjZMT&v(}1y?G#LcwJUE>&=$f(sO!ui%J+Q!W-Q^jC1Vg1Z#lso)L;A5-vA1-B`< zRlx@oykEh472KlWJqm7Ca8khy3Qj0EuHZTaZ&q-vf~yr=so)9)mnpbZ!G#JgP;kD2 zBMMHrShUbz!QBe(QgEk&I~06O!ABL`rr=fuA5idq1@BdGi-PwkxLLtT1ve--q2RcJ z>lD0M!LL&;8Fz_D!4$w`3jCGIHh9Ig9`3eaF>ER72KiVV+ua1;5G%f zD)@kc_bYg>f?E{4N5RbsPAa%T!3hP&6 z#KE6e@qfaDE-p>DTftol?o@Dxf{!WqsDj%R+^XOM3f`~ay$Wto@E!#>D>$j(1_dV+ z99M9if;TI;R>9Q@u2gV^g3AHFxJAKx6x^)fq=Fk1oKSFF!F3AWtl(M&S1Y(u!4(QFQ*fz*3l&_T z;Cux~6r6IgXraG?yA|A};7$d1DEOFyk1DuL!L15Dpy2%q-mBmi1@BRCvx1WfZcuPS z!EpuGDR{GjYZY9r;7SEoD7Z|)r3x-oaDjsJ6&z7;%Eh9E{tE6^aF>ER72KiVV+ua1 z;5G%fD)@kc_bYg>f?E{4N5RbsPAa%T!3hP&6M8PQ+ix&DTxLd(p3hq>Jhk}nO_^5*06x^!d0}9@+;JpfNQScrGH!C=);06UJ z6dYG@oq{(jxK_c{3a(Ueg@VfzT&mzg1s5ndU%?Rtr(7&r=&#^z1$Qa9Q^6eyKBnNK z3T{(ytAYm!+f(sQ~ zpx}H3M--fLv1p;cg1Z&mrQl8lcPRLnf{!Y=O~I`SKA_9At>8)pS17nl!KDf=RB(ZU^A#LXaLUD^h5iceR&bYsI~Cla;A09t zs^B&Sw<`F6g7+(UuYy|?yhp*!3Qj7xLBRa=8QQu(3DuT;i{>wEj zFB6_JqupmsQGYASZ$o*_hwhW|mj2$|C~fJ62Xji9GDrJtzRvDVgOONlFfaDr!ANd<&ppD7I zdH8k_uuk^HY9i$eJ2nljh)kJVdtx;uHKl0dS+k(~(we+3;uf~F6jWJ%`mA}T@1_f) zk>(dH%{BpdpN4g{9(ogP2X$hF@%fRuq38lzpE4oA~F{$}9P6qV#K)I9XdC@_CEhKH;TK(!AYXv15*LGtKTWOt4Ey>E9hU=3_S9K(N$=TzM?VQB1-<7x z?5E5EdC%5QnK`|49bQxBOb^rB8gCsSOsY`8^( zIEg*FlQ=J<7Vseczlqm><5k?_N35j z%R~xAUb*!<(MZqv(MS!>X*z-b?`O%iPl;U1D_?PZO=8pd*>CP!_vz!TmF>Of^!cdm z{0)ukSp#b>0-rQ=Q%aCy@_Ww3yK~+5eD^&LjEAJ!rA7RBd>V*u{vIrC`vXZIDS|jWk~a(2Ld{#5-%khA$2+0 zC}#>pDk8s=u}RPSQeJJVn?_!dnGiChz zbGScA4FDNRO>w3tnOH3vVbkE*FHM^JghumFN;*NAkkHBPYr%ri#zqTuz-mBx4Xi+yT4brU$a{3@NkfxWWD|^`X>OfYi zkk4&PJr%+}W51j+C!B3&B|%6#O}Q`+`}xjUc!1?inzh}mk5=D1StYZK-6EqF)-=X5 zcVrs9&M!WmNjzSEUiqhfmPu?)G;ME6M9SxPWH1(BZPeUd-v}&^45SlGMLVPb?dAno&x`KcP8~31+Q9#XPS&*?`feZ(tKx0=niOlP3EaLi(B#n$YKC1s{GM>%-!5v} zz9!LBk5O@=3fNE@?pt@>@kYFRyO5F&)V^xcJPlpK5k^V-WY5LWF?ZLqFV2|dke1+c zDf?=`B{k&gqv##V)VB*uF+v;b&zKtqm}kmt>&}QoC;{#*O3pV4RiZxwA19(+lntau z$j{WBQL(|B65Hy@GjGwZ`JUy#a{O*T&Zz5>@n}~P_+A4^2@3{v^87e*9F&K2T?v}s1g@j4nu&wg zdhU7f=a>g{H$8{-h9KRc> zZo=#V6xtzPwpF5U=wDeGc*c|hCfC@MnvdE4Q-;znQhsj75!irJrV*q0mqn?> z1mtH^B4gsPJHFIKuKs#Y4865)U9>aB@c}&$DKBtiz;e7F$JdCy%Jzo}WK?euSz*UW zVGXUVGiC=g(A^jpcMj;$tns8Anl!7>Q^ZM+2`h&xyZL>E`%XF3SYL&7c_*6ctH6I2 zcfPT>-_y(SYjLlFT;XW7xKEibw3ps7GL-ho`76dox;Z#E@afUq-uM4*P8kbk1%!o`Cc@ zV>+Y+|K;tXCvsXqt9)O5@V&4K*0HtoI2tnM3Q*VD@A*Q}7wN;)!`emJCt;^~Kk|%u z5p->=zX|PJQ*Z6}Nz(}r)Y^m@^Fdz*w(A+QK(s#eIpREF?(g@WG1Z_GV=+4+?{e|z zK|eHY&zQq~ZU0XG*EYp1h>y8(<;G5EQD>*km@VNLoGI-Kj9n$;lu_(4N;32tqmt5F z8ijP8Hk6L^C)=GFIeW0tC5Ydjx`iv>)6^*@}f4`erQDOgo*8RWC z{r_CW{GpY=lu=2WqO2kbduS(kqUz?mf03-8z!T+9aWcD_!^n*>3ZsrMJH@sqbSAKW$TEcZ`cOb#y6K& zP)Bsba`d&G)A1PI`loFB>1x3w8DN5QiE}XdEOLJ?$i1k;*7CWE$3V63raYxSUvYld zV-uH^vR(VuErdTroId9$5T;52w|xq?f-KyKX;@b_rk4t))>kFXj$%Ay(`*T1*tWM4 zs)m@uxXj_=d!@Xh4Y+JkDL*+b<$_CFK()qcxD*ArELSy5$Hh{Se8;{k2UR~`!AJpG z5+yCIHF?SD$5Lf@e{N7}DvP6;n`0E0HI^@yG?kE0u>LUCNs)}XvCsBM8EPm;NuNTh zTH)+th}qPluFtxW*^@-tP&>^$xHam|hlr17Icyy4!_UC(>EKc}#otMDiZ z@Tfh#n4awI#n2?@bu2=3-j=`iG$Zd8*Q-w>vT+(w9C*1qUHoA1&$4aikBf6I#`)4E zjQ2Si$M~|gAVRyJHtk~*^DD?%haq2*F5>6)Qtq5!#ym2RJ158(#_B}cq)%IUM!U_= z2`=uRG6kofzJtE4nh*;bxZ*h;`4leIA?ecso^MpFs^<{b&zMq-7g#s2-NPP$z69}Fm_DJr zy>nq_Kb}a61k8(8q0|y-OH*QBJYQl^mC#iDz6QAmL2)}KeEGzq;`AJ(m@-eGmSo~H zz-7u@AEeBp1MHB+QX``bTj9%W>iPR<&G`TG2R|8p?`yG4bi_(O&x3ZZ!?&9`BITDL zzl}!Oc4shy?;}+2fv1`3$1FDzmKzzdvqe*|V6E446Z#Qc5Ja%(1% zejjf`Zby9`ldyTyW)u|tWl>32y1u>s?IJ{nVvQ2{v@*PXdt3e8^^|p2qt7ziGvKn& z^5_U+nJb*^^>L5_jDF4wa+ZcXah1b~QB_dE%`vA2+Cfb{F97=s^51$J`);x0qV>=o zM=Q$TB9vTYOWyvn#JZNF1y$Rt>N)c>X>LMI?c1%CehCq2M)96NqM z>Yv2C5_w@-;ycNccs$eI#!LwqItmtn{EUnqp z^W)g#;HCRx@VjMfdwVr_lX>9;YU-}PU!^lLd3^4h0S)~6ly zQs|dE;h}K6kUl*ag;m>GI;4TbrZVOTG@KnT?clAKC^HZ}oHF_FN2bJI%BJW|RwJT@ zbU@KLz{vAQG{DLF4vT>gwY=w(OVCHYeXva7+vM`c`;fDiKkmSJ=9HTue>BERP+o~^ zpXH7vu(v|)U~Hy+dn2M9w3a4CqoG}xPf44#;1YOUNMBTgu>d}`d@^O8?r%cWEt^mF z0uRe4%N-t}oq+ir>19ex_J^0PAs@6sKeYv4wBOPsIumlx*$3G=iMk9voXX`lpYr$3GuR>nNgpFtc=$AJ;cgv|1>)TXRh>LgapkVkSYY?fsG ze;YAm3^C&(0E~Uv_@R#-!WTP5JwhI81n=L4IgGpETYa@RgZ6sAm-920FYLOi^BiX& z#*%2K^c34EV;+PoDrP?N8NP7_7u*QX*2gL8;+{8lV~)tio2ufI7(0u=-HRM|KiB_P zsmSJ1iC}XU^|fG5((41#+uAUDdI$jr$cE;ZJ)YTPbE_Jg&-An-eYR}7C&2LFA6xu# z>&algTiaNzhgy`L=md9nTAF+f+$YpXn|Co2M`=PnXD>zuH+_eFaTmto#h6LXm}YQD zkHmpj2DW$%V;&Y;U*#|OzX2(zFHaOQeiB;jk-_gb^E>CZVSPx%uEJo@^@-9Z-R?y)R&T6QXu%UV;@XUAbp>C#{O^ZX1 z^sTASlFo?SXA&plIWk+`?n8}-5zTp|i+BO|8LSSrdf&R56EC6mzlC(jF6YM>J(oiU zy?!c__<`U&b1998JX?B9nnsMBALNwt25{ULXB~TUzWjJ75_=Ugt<#EjoX_8<&23f3zIx1Lqb4w`@7|5K8lMsAH=g=YwjU z*Hq$&lSBDV4kdcaYCZ$r{Sw+uKbpA*Uk>dK${iiw_x?%RJbAi_^#^vPmnTV#hZiB! zXZpt2ZN@Bs@3;ml_ZV$#Ul?si>;pRZ}! zzNo7bGoO?fZKv8LhTM)38XGE!W#a9S450&agIKDkTKAB;qQMNtEhTmcQxI-X|OahX_j@*As=B}+O>s5s>dwqQ8E*#1d#qq9qzU-rC4 z`b|g_!P$pyZ2aEv?_GLye8tiXX!r5)_-ske-n|DBE$ofRD}z`^6xvTyiCl^;It2?V zZmCv<7GC1G%}OwB*K!?0#;nci?d-NzH7x9EO8h-X97ZYsw?k6Bgi@dC$?ee|tWnYY z;A1oFpG6%1si}2o3 zmG8A|X~KFa%9gtmX|&}*$X<~Tfo#de@|45U%83axe0tK9!cL={Y3a6dCT$K6gmR`S zhi~CO^m^PVx5HJ8X^9BwzG^x20~y=O$NQ6H;u5z~xNIO}KBN^#o)>=KG`Km6nI^o` z5^)}O6fALh_Vq19)OAsev6)GOJFdXTkN|yHkBr!w*tUO0-JRDlX$qiKZ-Gp1dHIq* zwBtVcYuwX{pT{53kkQ6FqM6tT+t2it%69!zGQJYl?Mkt3o3@t&1Fn=`6nmr_w~EIZ zfxM_WHWbC|^ZDy!<*#7H_{xM?K%XBx!x;a3;7`eNI8lr;CQT9iG}{8MTT7b{AW3}M z0?ZB~ZZenpaIaW6wA_-3&qJ=AE4e3oh0lOhqw{AGO>mN*d~@p-+ty#>PQEAci{saF z=x>8DquO*Uz3Rf6%N=cfy!~_Txele);`<8syqVmIb?hsnkw@?)n)gTwe0Lc1Uk+vWqV4eD(V0}7%hw*DA3|;aR z{y)fPk(bH%=fFSY&pD7WnRq%;J$!cQzI7%4wp@5BQa-n%R3NcD`zVR?V*faFW>ch- z{tMSxWK0EGQB=eAcSZ4~UCV-;T<=~i`n0ld(`ck2V~Qjt_aha>7vS&3h;U-H54ekQ zsI=L3YL3febx-Tdm!Tag;N5cQzsopX9j^e!6_Sct7^{M|SJiw0adI1*7zRgX;-ANN zVipCDGde^6)kkL@#=A)Qazq0bq3<(h8FFk*FiKZ-bJY&49R)@kfl2+q z4P_LH3`m<7q~Bu4=gOSWIr4WNR;w^~+I)z}J7;q_)*E;DvCc8IQh4P~+_}XV%zBB# zypMLt9+`Mm%|-E_r@C+a_Imuins&xNr*>iwPi2fFwg}&Uo_go9XI)Eo$=E{_06Tep zo;rf`Y|Vp0VcP24$58^DOP!uxBJEy?c9%%I_X>}(^c%oag=oW~NZJ(QEq5nPn5Qv1 zDq|&5>o!*_y++2GD&0PjwHRw2-h#TsCII~&LS9SVao9NxsPE^glB>BJY7*LV{?L{@ zyhZv&&aX-v?rveawD~pkHuF**WlSepIe+LOi9Jr3G%TtEQrbJeWlO6=X%ESp*W^uF z*38nM|EFeOP9Dm6LCSf}mGdsjv2{f8?HT#j<-Q%mx3w`!{4Sx~Bz!6IH{x+Z)3q`3 zbQ(KN?AtPVy8^8#bCljDv7bUv`T*YAQYK_=ip9NDFh$HCxbw}V;e2XI%{IuL*Mc1A z%f2XTt(NkuQEQ~U6nm0%nbn}0Ewf`4=>h+RWulDN1eXa@;ZjVRtEG<1yQ)N+u{^F0 zU2E$TU3Dw^9`(7twdL-Tav|x^E4t=6LAeX0T(*-`$w#`^1d5*eyI=UesgzREW*9ZF zZ|?byr$77V*HZ7Kqkn!@-*ocZ*h6=4bff=Ky6u}u*EdOgpWZhmu5VTbeX~;1r%fkD zvz?t~YiubK<_Xsm{|8c(R9q7D%o8ZTq^1ZhS%Fqfm@UZ9`qsxz)N_Q9>uo6(QF$r2I*<4r5eP6>c(sv zz!%UrZLR>H0CwE90NQ-LYfC<{96Qi}H+f8P4%#HRj2-x<<;7v_TRVVKCd|XcQm}eJ zu(G93z>c>4IAL}n1@WA~y!(Z~nW;DV-ghJGAva=g4BGfrTbiVvz#NSoO%vuuK$Ko- z^A6H(k#aYlz7!VnN>~U#P3`;)btMHMur3C%Oyr<+oiLTBzli!dRwppOMC*p5 zb;7JX{V8yrZO>(VFBF;1Crpu~x9wOaFxxR<77I)%JYn($w%F~Koqra;Nm$a? zz>?qFJ%6lCcKbzMd31BA2kU;37g>zo9Q`uIvk({^r~myzA7@aA@dNP9e_6M{eP>jP-=792GKSIu zdo_-`Myado@Z+Al3jBU0e!1Rn*CzYzLY%_6e8!n)o6CQ*7WaaqJa6yMG?$+;2dB;D zBRX`-dUMtv_^_8N4y*B>I! zA0i#&A6w)CY98Vwn>rArVJy4?@R)TC@iTUrt|V#{p?gKJ&a_eb=AD_N>7>i*1<6TnWdp13z58PoF=E#ntOo%mQ(@vNd9UeZO*aZSQLThjb4r5*!v(nB6fnMG(M4uoPJ$?FxAO5bTgKs~%aRMve zHJ|$!GfxokGhOsw2GDM5A3IB)HXHid8S6k@ey%HnRe<0UH>PiQb@}pUo0G!Wm6G(F zR0jJod`Xw&;B5OWg&4D69~kzWZdV59Fz9yqZydLS$Q$Mg<19>%naHes9{+55WX$d8 z)sP+;^DJVzx%4;zedp=%)%BM4zP#D!f%>JSYhp~bTX42A_{kG#iADm~swF!wza%V&ev@L*t)CB1>2j7=Djr$hp zojX^%RA$~6N6+Hss)Xpp00gtjk72(}p@bQr>->)D{}mTmKKf zFKA?E^l!b^(>h#ZklhYM0Km_bUtv2^*d@fW*$%rhCA%FdbBlb>o^xh9Xy`LVOGE*@N`6Y&Hrcn9GS5NlBmN6oeb`^ceNS2P zwiC9!-$U74olU2iL41Z0Vf)U0x!L%E**MM1e-gGBtV1YcY!e38LyyIsq< z20g&Jcd^4kZ?>!;7?mkANs5*)5#FFinJ^cM9Dt-ik9ppB6{X~k-3vOt&1hzN;jkq^%1>H>Qd^yo@;E`UM40JDa7Q2&Oux~e z7{bj}97Wh?05QLs>2hkD5CxWzIi&|0*?+9lx} z+JuQ_*`2M29(KG?393~J)tbI$c>ytg;MXqJ=Y+Wi5+D;tso(`0bDzlK1#&-Vn>QcXND}{3q=(A#+%6{h*R%A8; zZgW($`ctn#;#{6x-N;?mDRUV4xt@UQ0l8`szKy)GD?|J)Ym6MwCVSN)cUh-kar|bx ztf^;1+c5=s4&PHoWkJVUtR#VymJ%c1Yu}OQEXoYHkFKAD|CdF}Fvkl^RLW|?>LagXxbu^ty5j zAzofTS?NP>(61TrYba7?bB=7%`|(4$81BZu8<<=HtC`*aM;zx?h#mVmS4Zu}=<~Yd z#OhqRI5F+44J|WUXI)DGO)p;9ba|Bo9v4DBlOMbfJYA-36-^bNMdtZ6Zz-()v~;s2 zcv|{38nfy8unq7Yvn=6I?y_7^UL>DyMVK#Tu9~&&Y4d27G!Dy5f@2T#e6qGbCtAeU z9F`HbeRmcHA#M}cQ>m#E=H*)>_H?Le!hC7-Ftl>9tb@n;r2$%i58zE>f^!xY>wRKf zj)TkXTej#aNNxM%vGsn<>Ug$i!!?rZ|9b}79UprAoHpy=p?m*m)t9~Q_j>H-sk-ZS zVWwuwm&M-wS`~DqF>R=sw#rHH2~RoFvwN3fcCR#oC^jMm^iE_}iSdoXNW_n|J#QlY+-xdij!Rog4E>a0^JMjRLm z$i-nEcIQoC2QI1F9$(SLr+M{nu2Bxk6EsW`8m#_3Ek>>MhJUj%uE zwJ#`ndOCjLybIIKMY;*h*V-qRz!`?zJWHhPllXG6=wz;vEKX83wk3=y1+UYdF9&W| zGlHkw{E@-en)!`;6>SM!q=YLWg%RgV_+eKP{jx|XLMk_+rZt#7U~fh7_G0XJg(boI zSs$pk79|y7m#miA(T=M6OnjB}Se>M`)O}iNC8vdSv(&9YDpHrUc?&RU!ya3V9IO+) z#JsM~sKCVUa-=1Gq#RF&$!)pqm81B=RAp!#{A$67w){-}xUhq1&bS)VX1A+hf#e+y zYCa0xX(?m*%3{eC7{rpezX`sxZ(j#wXN{ZtS^AIgOm5FpbchT-{hj-N!S-K|8jBL` z%G2UJR9iDSWjAUq#(rRy|AZ?=Q}a_YW;k!mmHb5w%(F+Hpf4K019*NwbbnlxMDHSZ z^hIHXw8vNdf<4a}_hQJL33GFR`FY2Q16T0cFI-<|+Z4sFk#G;bLa%71CHLg;-j8zZ>LceI4@T>76zwPq9~TRwYTx zb0n^%_bwSTj|6x<>*~xaC%x0AI-m!4O3hC1hXWi)@BfNYv92V@dry!zYzgTNi!i8} zvLd9^twDLDH~0YiL((RtcxVe!SbA@k(k;C=s8Z5mgIjuE6TBzA8GE_7s|~bUCnYl4 z!P#{`4i<<6ULoaj)MRtmy`#50&%DcmGMi-W2hY~RDk@liTnWM_w#Q&Tg}ZDxAHe_i zY>R#ID)2XV;WUchbZ*B2_)S)`jpF3GGVuNetV_PC2QnVsnD?K0uC}^1eJn2$K|H)u z#l+bL&gFZXAl=J1&*Dw4O#q)Gc*`{FG2VU?n_vRFAls+e1eNp}VG(m)sPv1U#3q2> z20W;vpO!H*vrRDAGu#=sg1E|Z|1X#g=wYYYa&0)=G zODd2x+Ag6@kT!Qf6H<@UCPm7vscv`}lM%&SO6t;Ih35z3ia`y9j<>NDB|6XsFmnVybc_TUTC(I!Znh|874 zmv?3;n>N9OIfgIP=qd9CF?Jdqx&gY{+XR?l!pP69)7k`Sr(s!wl{MC?fYiiDv?b6c zz-%nbmwu@QX+h zk2#%9KzW->O{=5U;)|8%r03Q0k(A(Vuw_Acmfr7llR7JcHlhEK!qWSUw9e8y1vsR)_3y|neZhN6?}h=| z1Sw~)((nwLn{EY|A<;-+XQ&JJMjAwun;hnXXfKj?FQi7eC;GWHJjxwBe$RGmA zv=@R(j7HuKF4~EFoN=-1WbHmf1Dhaa*Sy!09(f%T=KH|k&L5^fYw_1{a>o3L|AiRK z+@p3W;QL_vc$+Jvzovc|Pf7x-GvGws_D>RN!aYh86n1p>lc<8S&4`TV`UojK%uWly9T6gGi_>n1`&<8s~ z`LPS&H*Q759U~kk_%$Iu(Fi`-3C|W54(Wa~dB(3m9e1l*V)T^Fdi- z?!f3Jg|7gI*flQ(XS%b#$l%)V_*9H@>iXzItdjb;8ZqPQv#Tn{4Rv&+{IjT!7_~TQ zZ!kL|ni=nC3;5c)X$7ISx!+;xq@-qD5!bdw_NaM^QAFnfR(YR zyFEevqkn;zmW*Fu;Qli%2O9zP?NyjOC3&-FjD8Di6pE9| z^E@D%{&m!)+i?J?_rc?_bbrx(^*zYF6aO8p^xvOxm@*n*FOv8(|IM z9W_A;D-aQl!|vt^i6El?g?~PE-1Wbsp~dnJSI-s5<7s%wEOfA#+w%$Fp9XZeW)?cw z^y_lyumY*M>e1GJRSq4v{(e5b$}B8KJmz`Bd28_-DK&OM2CT)n8^pMKc7>CBfh?X) z7Qj}`ipGa>f^(Sg5VO8|`Ok0TSg%1TvKrJKM|@n%lQ5l)K;INZqV4lZ_`RHW0!PQn zyOJ2K8^E_kHC0L@L~za{zwE*N54Ij-el4k*AT{uV2HA)Ie>B6sxs!3o0dOcdhdL$L z-^OwRC%H`l_vY2qzz~|j9d1sbQadtHg6lE8N-)*3$;c{0$|leQc|+NR{zutZ zfiJQN{f}}e-zgi=|E``FP@*qADy2`S17*#)iMSjRTM;^NrP)k$u<5CLG#zL!dD%2B zD?&79U5&3=HjSJ0GsvbZ5U267X>qByX+pcn&f~XZ^v{305)`=}{S9ew8_yQuNVX?I za1NUEy1rLts%JPYmwCCagLye8-dNv+GI-K6R#MzHeHJ}sb`P*DoKPXN=2bdurg_uEyIS*VbL$$@H%V>G@<=H=t!M{WwlAQh2U>n zh?86b%<5*WVU^Ti&-k$CMq~a=Qm($O>9&8tiiDpOg{>|bxE3C<33mT;g@eKRk}PV1 zzWGurqu$xA$I{W2`tS>2?XXL*;EMM}XER8!%i2pbu zYPmLs^*I@T{y1NVcFY)7*w1uEg7-n`r;64BhPhJnI;@=GS7=yZY16F>(uEO?^AYp6 z={CD`c4Z3tqzLikCagv*Lf_aDPC#Na3QT@1lG1QD8fxM_Oz?lD1e_t9HQ)7b_|7tv zAL#bh+EO7aL=S|0_ep4Du$%Fd&_-foIZ-=L8)I%|8-#{kA3+-<+`)8Xvf6EC+R%sg zv}wzs4J3lp^qbPg7{;hVYmwvEu3uaYJ2ew86=`E%_$SWvrFB_^1vo;T7N| z8{^@g`n>2E);nYpyi>>EEJvizi8&v~&NqLKmtPyWRcOU{RW?r9-;d1NpRu7Yi0$hm zFM1r<+XKU>O!haP$C>rb@z7k@=qaHR)-7Yqqzv`G?bC5`Yfh{F9o#q*?kvaPbS~y) zIT-f>b9@Qce_T0%KNFLaTC;Es&T#?9Co|uya<_R^CDKjY+3zC^eq67PSE7E}Q|v>+ zO8}R^_DPvz!bg{)*Wl3#ObnZuHV4B6umTWk57LwXT7z+zLU|VgE~$}{<@=>VIeNL6 zrGOR=BKt-&VMef`j3p<$R*Fl=wk%oB}NZym~y}`;Q`<_^C zLmJ}7oSfli`cPhIx*$p>7?Un3Qw^AOfk%MSiW8)Z!TmlKKg5Cv%|I7pxC6*?Nek*@ z-OTwQU`v2ke$4{hbj zBtEnUh+8G#weEdLm(Z7`&Bn8dy-ykXjcv#|iQNl+-_LaU0iQ-_VdY1K$Pex-%9S6h z;8Sb)F>dba^YVjnfLuDyEte=`vc9XabwREiP~Ye!WRE**0}$_zmLE4r zd#(Ji^Pe15&+=^!_k5K6NSWtJ2PcQImrJuwr_FUi!`49$8kri&6|?jH~F4e?#5f<#+;A3^dbLix*+N=C0Kd6 z1F)5sTs>y#l9F?JS@*a(!n8R(YvtuzlAdX{Ar0$Jq3#={JYvE9)1EHk3(hDntF!1* zDS0R_6EE)Cg>$LKWyK#Y;We;Ke}!7Pld}!{u}Wx$75H84NKJ_& zGv~<9T=Uq199qANvwz9sc4lB!dryrC&MeG4Cdi?8%!qFT@Ur+CSz%`JMLdNV0XvUx z%9ObL#8*bfe>%QlpI~kfwY&%!x2fmtZ@zbs?Xq$^?1S7nu`#n47$Tj_i5auMza8|` zb7HUzus_DqbK@c(WBrR@z9NH@bhzUmw{YP9^tlax)|~GZ&UWejq*VlhFm?BIR## z9Sh=7ZjR@sg}MIbxOp9P*ZwAC9(+pgZyK`-yb=1Fw0puQMh9o}H$xtNTsYfXxUGjC zk$o7v=?-U%-|_R*dfe=dzpJ?NIP#uD`*S6%Te&3)@03QjEjjI22}pfT4Mm4enwk2}AT@1LoBCbx7Ocg;ig3=z|6&Joa_5Xq zzZ_{oZVBiAnTo5_m}=Zy6Qo}t>AB8yDeWvn!2xO;UJF2Hbn-e}TA@)R=1qz9;y6 z5PS{ob*>rqz7co0&P=IST}~q_ze7r~e?t7856XWwNYCD}t5w*7CxaA>4zS%dg4rWM z`Xr#4DJ9-eK&f~7S>9biKKcwHCOh1F#1exP6`F_H_A#6;%~cf!>(SxW^dmA4 zU2e~9ZCGGs+fz?WKWnlHb&cWVLH_r;Mb8g?4Y9qip+5BH*Ql*!r47!7Xor+&$GKd* zZRJZ9mv%MnXutVKn1wdxeT-Dh9qbsFQ-ExAe@sr-W6Hw#S^|6AR{ zJz=(D3H}HADptfr8D^Yj)Sm=OzNi=9ye_$ zYi3Fv335IYV8k5zgD2w6xRR~?=>U2-3%|X=d(Jb3y5%AF-k4>;XJ*~PwL75}zVj4o z7#Ya0^AUmty>U>Ko4i@ z7RKwm2gU3qt6R6H-}BxTFHAcoYt(GojQF8G?XGEQX{Y&et6)j6b@YqK^{jP`lCfhrsmqVec35Pe z2KH%b>y;f>bd6${3+B1ebCi6S!)D7XU+`~iS#(ZY{TO=R#u`Qq?#;kn@bKHX-0;je z#3;0qr-i+#XUx2FYTUeo5!eI2)t*!ldF4Sz%P?k82@X1g@#*8ce!j)t6*-Q(j`Vo+ z`N((Ap^t1XJ)fej3(hI|z2We!c*=&XObXxIxGZo5hlUpA^zV#2>hCYP$npA+-^Y8k75CbEQRgJnECogEy$S1pGr-LVm2^X zKiOCrliNS0kCoR0p4MY!)U52CK30|oY4unc#p>VbX}iz^c3kPPGKzIN94me3J8uPy z8SZ(pdTge#G7he$b;7aoD8@tfSm7+b9S?6#8!L6vryMIk${8!8CXQ0CffvL*)_$yf z)zQ-PFz3!jAiF#l`}Z7oj2n#^dZ;0n4rZN`!CvI*JS(ZF51O`r8>?#yake_fDQ*nl z+3HodMZWjg#HxzC@A;c_#!No;Yq3_+OaS-f^?*KhRzqGxfA7 z#H}LGwK5u|cF3Fu?P&bCShJIXHct5zcrT=x=OOYIcs>uZSa>_+F+JaQH)Ko-{O9J* zT?{+)=6tMO;|wn}Lc4pW9RJ@5f2^czbWrpJzzd=uP#^lTz?k)6dUl7@o5~i>3VCvm7)Ex!hde$bSZ}Ow*8}xZ&qDs~pjhO5E zs}d*co3JKWa{y&Q$d@zsg|#1Eg8lN~0DI#8)XGxZ7x$;W0EoR|`8c;PYC-MU`eMwk z2TWx5#SZbE*%y}wd1vYiA8Q@O*-W$b1y?E{dMemE@M_ZiP!YeM_j z7jq&Pfo9)_F5)WFH8P9idqveNxIUR(?YiucTPMUZze{>+1jX;h-{oS8_pgUOo@fP8^dF9P4qm$ zV!XfIVNnY#=x?TXSbvjyA8;Bv>?^LHeDt)%V=ZvlfZyo-#N%&dzVn|?MJ}xd^{TD^ z3F`3-xND@nKgBn!RDhSmcd+Ro4@f6Qjd?m(Q$4w*LQXv|LG+gKm^r;)>7upFGq;$p z5wkP%f96wWuXe;eJ(#CL>|DyZ0_9v$e!+Wx4}LhO{QOQ|%F?cOl!v=rcxn|^fccu< z>fw5J|8%V9Jb7Y$tAbfUuB-7WUc@OMLL(Pd=KLm3J$E!(;Ak}Yo$yW?-gBIR=8AUA z2R-t-=HYKrTG`SAdI!E=Yja-YDg0Uwy#|_wcU=4gbp46Y^`BFVuEe_6O z@bz)NJ8Qmp#-AC>y23FWDKG1oKlB7>e?;<)WA)Mep|(7{!~LH5^v+?kU4b1#b7Don zr%kx}Akr2=0xie;Hj$eLyKO0>=DF@=zhIr?a+dO@o@>E%vDiPS9z_iP9i$z@9xx02 zH1%i!oNB4~-(5e&U-ti^^2<9GmCt+sobuo4SWy0jj(p5= z{%+TDoMXDJd|}7AcykSUhNb+KE2XpNS@-5a_vWphzjJSPyEm`*>~(MMcW;jL{Iz>? zuY2=C&u;f-mwWSU&$r#1qwDDVClbma=DO@qBy?fTpSq_3JY9@@6_F7+q3pYPFL{_=jn$K}xR-CeFDVK-M3G6fWme9ky@*+w6S`W23 zUGzR$^S+Z*?^jf!)jTm^etBg0Z@&}$yZ@THwDkP-`PY3W5{dj4et(MJ5Agd5epC2; z5nI*&Z~T1Q?R_6u_tgFEU&y<;j5FKyK^S zr0ctAQ%3G{YQOoSE}q+&FOgBMxxB}vtnF^!K^tJ$JO%8iaYnEuVv%L9-W6%NNIAeGoM>cPk>ydT7J-SYl1?ELT?RfH$r{ zr>EuHJUrFn$+qZBA7!8|e^>VyRx;4q_-X3>QfrfqnTMeZx*!9%r#>I!o_AxVn_!PM z=0)DZ?-Bg&!mkLw_wUY&oW$=z{JhNJ-F=iEz-gr4 zG`Jyp@)rJ&MT`CGePlRu1&tjQie>QC2Bmx!u)wk{8|s4$g;Q2fIerO6k9L$)|hz|9xvtChdFZW_aV3L#qS^R`z3xCKz?0^-~WZ5 zy*IDlwP+uDm>Lpi0AM7JVJE8n4hhlsqF7TSa&{c=<00o_jTurfN3F}jQIs+QHRP}w`>Ea=T#m~`;MlIB;mPvM?RaX%lkMk3&-o~y z{X7E7;wDi?%WXY#0b6`-lzWvdmEM7@eWb@q)b(P2=5@frK--=c>v0|Kp`<)r1-UTi zF371r&x@?U?}-;sO#9xb)X!=vmv+=A)`m&MorSKL@fsxnPPlBsT z^_b0tyV zO|UzyJ|30xuepvZ^DWw^T#rA2(Zp35?KtoLrTP)hC8PXBfxewU2|S&H8gUdimd^t& z!{8yN9>t9+8I+Ck;^~|dW-r9b)0gUp;dw@0Ar=SF6LrAK-p&Q728`<*#^c@Rb`eMF z5zk>~5Mf~cYkHppXEEo9*?nqmx14G4_ueVw@bP# zpWXV+yhuKNU%ewQvIf60{Puk#FR}{nRshb&?^QfEAM$rYkk`0^miyTm1G_f14?CjY z+qrMu3xap%TfUXUI7OaxX^(#vy96rH)5CJQIrg=K7tTN4hJIKBs|f1|0guXwhNK?h zXHY|S6e07icHxQk_+jCR{F9k`{o29oXv4AN;g{Pj$3>g!sXaz8n@`Jup2?O{MrQJG z*Y368GuwY(LjPGjHw3)-ENl*1cvVuusJT@lq9bM)7^ZQ$J0iAd&3QQO*XCU5a$-TmSce;4`E|+qa%^@YojU(nxw4Tv1&go*71~lO= z$Hyklt0=`vP5xitYG?XQg9{Kt=n)Hk8Ej?RQ|ymn$kj+!OFgZ_6Q^lS^$f{Mv2GFt$cQLm=u_FnCEPqVayu){GKH7&)zEqsFG@IPXc0A+SaU*)`M(Hia>ev#l4w7>^%dfIL zhBmMt?0)4D?B9YFgErW>(ir0`xbc*hO+n524UOx$vS$?c*Ws;e*~3gB81I9wg9U^( zJ_^Y8Zp#2`jiT1LNSHsgwIbD3PQvy0fqTiz;sxog1M4Ualc zY!vzuF*~7n;%AoLAAsKZr1@=O49U-7kIIQfkX6S$Q5%@ zS{r?@jlJh!1iKQfEG^pZ`(y;?L-5^(Xc6wTiHZNbIx&Peh4m+`RP?EbA?>UOiJ8G} zc&Gh-&d$&0W5ye;wDNj$X@>j*F0k_);7<5`jBVv3a?k%aBZkHQuVTi(SZ;ixw>V^O zz-$c5D8h_`-@ALTJ}>exez`v46h_jN8%fqj1m~dl=p%Oh#y(=7Pt5y>h|Rbh-bZ`@IcS3q zV{iL?k^}RT1EG&NVxDtYc^`2no|`4dfxdc|;{~?e`G~L|VFj`s-bcIvIi8RlEq$9^ z4zBlwO)q)^JmTu`KH?fYw@Hq>`o5gyBM$a{G0R6>21#IT`*kvUypOoo(ewl7(|8|o z5lVhXO5V_S*!d0*yR^q#TJIws#xs43VY7fH4Wpo+xwhteA1*^1=#LGXhtWDxa2P&Q=pPQ7`+DKY;G5;&Mm!zCljY4j@x;5jE#K|L)AM+; zJasFcxRToP%UAKVA5XTA>w3L^IBag{_5R^7PU!Of;jpRc4K?d))BwF!&U^oG)Vzbc zi>-fn$-7q07eFR-{b^q0Y5b!2?YcEDatnT;f4Bz{Vvn_q;2$C$FwH;wj^nzAK~?V` z{zzcbCf)NP1AVOj$0 zykA(*w+MDH`D(r6;76TTnCkzb^9qNtZue%SVtW|-ft4p7VI^`D*6{B|HPyrWmR}8M z1onk3&(1~-;q*4^PZWtiNGqJReZkfCRak@<*R$-^XcKRbu(s(nz1iMD=m)+B`;H}8 zFK`IwLU=E5*j&~#Dzk5Eg`-RH#0U@DK5Po{bW@M)L2_Q80SO|^wE1^T^{|zBF!-q9nDzaJ%@Oz?*7w^ygYS2x^Zka*M#q293cXly ziFseXt{(-&b_oZ{qiDmVJ4`T^I-5 z19Kg((}P+Rcu;;VjpZv^TqCk8l->-j7weskLRVW`$fu|6M+?U0W0@aLOCu$Sm$ypF z84{^#%V~A%qHHas=aZmTiPXAEc=r2vegbPn7;P`Cv7Siv@c44B9f3apTMqaIo+x68 zNPn@)&+{>Q#jhH{iTM`))|cmO&x>3V#~cLyhkjK#WMsLOkY zR$ExFY8a7O?Ntq9Cs62BZ38XJq!pYYvO4BQ_!Atvwk1P|%7i{uEoLTsx^=KDAHaML zWq+gdsjy}kC3>H#^G!Qm5BxFP;C-qsXoJ1oJM^g#osjW!B_t2=r*~mJDny%rZ|G4C zn*uz0kLp_IQNcDvz22i5MqB8&3?VLOJ*pwo2Z*H(VYh|#s77QLSET#~C+)6u((c!2 zKXKURaEL}>O``PBn;JH6@!5G(hf!NnNj_fdi^>rwe)OM4h!I!;?18~Rd=Yg=DxnWOVVpmW<-p;z$>`Jb(gV6;>V zg}pB|B6mX|;^KU%5$r+Dl>)Q*QX}T!QQ-tw^ z^}UoXiFsX|JLdSZ<@i!su!qR*r_L8{AP=sC9Xe0VF^6f-yq*_XOZqzeV!{n!d++%p zjC=PjAH0$OmAC7P60ji%-`^MaJR8tujOM7!~d@xUtZ>om=;JP(#_cdv(W3Nx{zMEw5;K`U`;gU3qU){ zy{vMledq4q>GhHhmgjw6X5Z6LjK1d>=4x?rOQif_%!pB2al{VdPCEPc+~Z5_$i+Hh zj@6?0dGbsfh#sodZgZL8zVdPOaK9z@V1;!*jJmfb z{&DE+Z}aA@t@LJKDcuy**4>v~PbVxGU(Y?S*?!?3JNBz?r>$|Z1Xeb*9Qq&NO~ys5;!ClzzYMJ^ zlTnqqB?F4kW9aG0Bvu3x8Qg`D`5E*nEg#My6v!HESZ@NeSDxx^2gja=^BYER5;J!g zos4Jhwm#O`FIg^5Czc`xYwxd1@1%}d+<|zDl+M`B*?;HP5!eE-{$NvF4voA8eBJW$ zUH@dq)oY;ZC0jz9f@}7dN$*C=3$TA+S!Bq>5eq57PCrT#N@3D@*enLult8v}=d{=J zrNFzge*~+8JPnsfUo8pxik{R5@JWf)_2Mbh(s&OygGMpSJ?w5Yz{m!c&9dHd#H<1K zcYp_X9EF{r_<&`tm9cat%L1_Si2X5{;Ei)Hp`Vxa&w+2Ursfgs#o~S}FJU~M=x5Ag z&&7Ja_ki0l*2LL(34HUDe23XcP{n>*fk>CdFB}(ky}9)y?cCF#*#`?Yn^Tyca?Hli zmvptm_IU3g?@Q+nCE96&a=-1#gYAi;hIUFy%o`l$xL30Pzr?%&Y3_BGZ^LvPxa#CL z$AK1AtmZew!RbefLyn!K+FXVGHoPsp5;x}*fd{&T7gSqZIZGjh(hcoc!#{gj8SFY? zS#9;Uti!XE)s%Q#=;f_5PcQOY94+-074@_4S)GRGvcv}G!5;QAF)E$Im;B?$ft)F) z&%(u>xcpvJQw2LJcI~E~rPnUKRy3}RUdxMCpEtko-GDzb$kT)r%-NK{+4-@eYMkVr zSXiw~$zUF)N$TdFTwAw4UuSC$PX7JlIq&~MbSrI)#|2mHV9deH(}R15w(g+EHi-N9 zLd$D5-Q#6FZBxqIIHbnRmTBabn~&s0-VwXd;>o>PRf(n5*>v^aKv8fIzFSHH_nFgu zR2lN^+N^xe9^;H$HKbib6dq!hehkMv(u_vFF=$d*(kJ}BRAk@MK=w6ZJYzlslzSc4 z3bp5p{nK^U-mKbex~KXv3vv4PcDLRDLJzhiRjFdBk*}Lg@ZOp18%pXUTAuQnotoyP!*8=D7pB^~u*PZ&c`Ge+p(YY(K z%JVq0B*w%BaV}6;#}$rV&u8Tczh5FakfKlaU>+JX9G)NN3k~Kg8tC4RywdYh_TGV+ zY>Q!Y#SHX#?f+-*-Q%RH&V29c3zr}wBGI-RNk@%AnwSm}16{@;#A!JmBgQx$2Qp5B zNU9q&Xgr>#%OoTkbsUc`UZM_~jFUJyzP^4OhNBKp-X`%R9^?2n=%_(sI?$K8bX6C` zaW`E?-|ug&z4oQLQD@G-FMO(N*WPQd%d?*Qde*aiZeu0EF6uFMRWLVYPEyp|Y>SoK z=EoF$0ebj?)e%_v40Ywv-0Aji$3ng}qDQcI(nOSP>MWB>ix}_Kinm%wW>LvZG83;} zfW)_cw>j7j(zBhVi412?Qhfr8o!pA^kZWgWW#7+hpMx%VC1)_O9&B9+94`_>r+rX&PbtNSSzwgJdUS{R9t&%~)_D@K8+OL(ubs zd{5<*;$!#FS^3uh3~U@rWsTKYcBV$WmDC~aXcMs0D$FRnX2iR|zgyP1)B z3zaW(E(0-ge0ETFk%=_5RY5gnUppDI#ShK9ff3H1>e)kk1WcA#F$Ge z==7sQDd-!!$H`jf%eDI!g@NapwwLEOr9MfoY+StP-0bm^&V;V?bWye$G9J695uNG0 zx*nngjy3vVv)g&XP76h8l)a72vQ|gR_$e({6OL_rswed^+k)?Nn(9-Ydce$r`EM1s z{1f{Xf%7BcqdqQ*Q~neTX(A`;%MA_fiSp#psEz4(^r_6psT1_m>a9UPO>5_|N}$X! z8maZ0KU6IZ!~A`N430DvUXh7JJgdpGFH?5#DGj(*Ph%#a+y8-1b!sO zr*VGNF}iZy%;zuRKdjRjp5o;Fw#RSvW#HpL;c@zdC2jV4aNZ~H$ZF55sfOeMKYs57 z^u{=h4|r?Ap~m(M`#ok%@bqH;>C25)lTSkd;sTrKnLNX~E_)lGXXlrn!aAhz9C`*v zmKFE(RkvyBMI~m`9PqA0YpD%1mPE_4-X(olMBG)5p?GgcOr{5|D8%m{aD$G<^CT>i$67Su?VfG`l=Y^f5YtrnKc_oPMd}_D2*Ku0gi{a#m$yF^|X;+sd zgo9l)E=PHdqcC`u7*fWyTjNsR&B_Ghx`W&6clSM`XXd_1Ku7Nhq$na8ZG@eD3=&9HpKnrXOvPTci4@XqqJPxj938(}ZS>^@QI z0dF1H8i$zhz;de#hDXTh^a3jawyqnYlD!4uC-7pl8qSe;X2;`>4~BlVus-@lj)i+; zmb=T}0bH+|0ZqtnE$OO0otKP(Gt)tKDOrO)2i3@9f9fi%o%C;2t zq~Y{e7>hULky5%jl+UE#|x*_C); zh>Qd0IfJw8?E@;(<*feY_`7^uOW@ZJF|U?$M#_Y?8tu(7vN)7O&i)GRi^fzE$W83G zcRo+GSN0w;(Gp3@hVcv19`IHVf2*$>t!A0=TE|PQ1M9@`%3d2|$xsvfsdDwKhn3BF zQ1%R`48PjZ^2=oS0jJPkR-yUL<=vIog7=X{!0K^7Mgy_;-k?^M`bFc4{7)0@@BGu( zetqzb%jznLKUkfFHLBsZl;YTbQFk9@uCLq0nPJ3Qv-4p5U3naL;enh927G52-N^W_ z4|sFnZ1SzNA+fd%OP(Gsrn&6RWqh*Lgeh*u63>MB$K*9T4tf>;BdU4zAK{CVbwno` zy-!@46;NUd#Z@itCJN$0qsEVLz`ea*FT;E z4$m1lR1Dur8~x)(=^x{GN!euD#@9bi!zi2cxY0j|Pnq$XYHBT;lX3La=^r}%P&ULS z@a#6^hOS4v1xU%L{vnIe>L0ba@;Lni>)z0$)jxE0?|A)VJ9je^$myq{po!%4+2FjB z(<9zY_*(`2qX9WR$M=^hYps>jVehtQkLXLTm;RBwj4WmmE$AuoRwP=Mn#?Ha%T7mg zNYSI@IL&UvyTshav2)V=0O+T#eGEXp>pa+W%1Cw3!CWOh2%u$8jDC(UUR@0kzfLe8L=6w)MA`-%K zbLlQuB9B8^1c!*|F2`owx^|gewSn$pB!|^qQh6sWrWT_0M5V<6@8HM?nK7ih2;;Es ziU){|JLtWNgkI{??&5$(ZZk9@S@0-S@~Gt&K9z*{tG&h+e_sS2byDi+=IS1l$=6rc zUej{q1eBwl)WRLBnU9y?M1oMl>e*#)7x0hbd3*2Tz5}c|PmJfv?K%;j_ksiAoN9MK zHJ(rBO)J|So{!Lq!*XHuq}{^x+TS7}gY!Cf8a(^d?gN}`IWeBw(-kFKg*zkOrLFV9z-!34ZIX$bbmn@eXOKO1fvr#=gtb&3ir5sfMQ%y@?!KTu@OE_Cqty*&+;?wQCC>1VeN8;R_DP7aVoJ=D>Xkrl{L z>y}P0?}%3MLN9_mrU%H7V(*7ugae*tGaOlHFGS~9b5rf_aQ!%z^|xb*5vV;dy{0F1 zG%eTHZc5$KaP)s#g7PLHSg-Tf((H4Mzw#}WyMDB_xstZ9kiS9j`(Xci3ETU0t6Tg2 z^|JRaqqqL`5pO9n_VE67Y;~miME>=#zNaE#wleH*45S+P{~bp2!&7m<~o&Qf*y{JMKAja&yfcySj{* zf))7bzkcAHQLxSVgd(`#?eI-=SAP6&d>iQN@VKwrdAb}L-C%j}$95+TM(NbXYC8WM zbS~Oc?xVR_n!jCd%RWZgA1#}_$NrLE|AhA1zGUi+^(RnDZzvyqp%DuZf6V8=)Dbf2 z@XPF{FL6SGu2pV0cPa0wFZFo1U0;-EqPj09o4%C2n~nZ%TT$em`X!3Ej{AS0MfsRc zH7%Y`izoXn?lsqH@v+>e@W3pkb?}9LEcHvgKndL);ru%7iLm{}?wnZO??ZS9Y@YP9{P2^>qqY%0z{ZhsAVL(pu_Ax9>`oytUd9*g3+Eg9^~F7P|Iv zhj9_fj!J3=UcNTkyBPR>5T6k>)^ds$6vz(4od#=(b~D!45$ws9hd>fgEzhH6tuW2> zTMqb7(6$}3Mz(d?%M<|V!@zkUZ-LG?TM z1bxHjm)OidCQ)xxiG3kmbh@; z(n*?H&Na1snYBi=>a}qi&|YIfM^W(db&i-b7oxS*QQMc{LbgOLC6ozme2H4W#8gV0 zY)ZKJ6|HTmj;WNeROoP~?8g$P4GgTdeM+y_UXwOPwLSx z^kgd(FxQkqpXL4^8t0L-Tz0`6gIA(S;j2bk!o#h%+`SUJa?%Ey_sZk7;UwUcHgFPd zl;IWO8itLDZA?*)|JIg}&R;V2ebn7Q+G2B0d>fzeZ zsW)mvs~6P~l2KjojhN2oe9VgSpYLlef>#E4?8a(WbVt~I7iyw5elN7E1dSPnkCwe2 z%2}Qn^%BUwmJ|_xLFS>AhxPAi$QZx8W~=NqT8*9Fxb+_5WAN2D*?!93I5}eHC|Z-| z1#gk*36V2j9bv^@cpJh`F@QuQNd8KnLoS7Ljc!G0$%5cnphK_fYQzh!+{lfbJ{i?1 zLS183R}=g|d1_XzZ^A<5n>)_`8GXm**|0GRX9D{(4eZl)HF(W`=^KSR&Vj-!t1Eb2 z!nMs$vhS|Kj>#G#1}n%#e2DOv#`X$+GexMCwU-ka@^V9_qphpbNuGc;dgJBBG#S1R zAro)N&g*0RjMKz@!L4T2aY`33kuD)m^F!#}@fFw+F9Cf){XsT?q{%iYpQc%X1zV!M z{M+5iK9U5}%pOT#AZ-A;#6K|)sBe4f;d|U1I+-kabqMWFa!6SV#C;Ndnbg>(srZbF zk(0NbJW!i6fwf>h9dGMQq>N7Xc5$R7?`hVM6hA7wb2h2uL_-!VEpB=I@1$d{-ifz& zW{tGW*G4zDRyyt(y`i;o^=qRyx28MhFgJ57U96J^a3XNfp8Fl0N4FoxzJijs)!eab zdE)YCqU&is4y6*e-*f1QnKiegFV)oEUZ?f6PFi9;t>nEjGTLe4!LM|%QTD%UfX$Yt zX54LI^WLe^cxz#j8%2B_2`uZZeip8K^cZX2?xhJ=J<3?>>Wf{QUYfHSjHSODiGHyX zt3FquO*4nIVCPUf`0a|vxj*#hFrbm959njlxITt-(*(7|$EN<*`Z27@j_c6uwG+z5 zft1Ky{NG0t7pRvfwkM&1g}_|zOTy^98^t%WKLcAYjOABEf@-neYwbXn|F&pOrAmSU z)|-28QC`Z$o$|LUGrs(#4eg2rvTHszBFUEhezELbGF&Ea1uF$+=7YcOOw>*BQZ_g?FrJ{vc z+e0gpZ>Qu97T^wn_sYtj20U__-BBcpv%r)y&{{awpQ2cyo(;ly8|!YLO*h#uHO4k( zePyBSJ%+7(o|*Zzci4G<9({HCrxfe{w~7&1vxHTX2E$u2-%PK*XY{(($~BhDyat!a zbnK+pJ8iGm*_nG2BttefcGSPT;73#a>lymn|{yl8a znBRXzP(l_|^0EwPpe|rdOl|hC>X*LEu1t-kb~lWr((Cs$?BMS&8r3hmN{qdf)svSS zR+Jau3CNf}XFBA2w|z$z{MP=`Dw}Hlu5yBzEBT*vwQ~EW^~nvtZp41v6V*6&?(Rkp z-UDyIm-ky;zi4=KhIyUx8~uLH|Lr7n=CW=iq;{Cvl^0@`;O^klhT4|K-t>m4oMM`6 zzvs{~&51j9t*?QjFX>`_;pih?pZH=V`d?IM z>8^>#bq#F^H%ja%@9t8BPLGjUc4w)@%Xjl-Zx3{D%iWU0I_4t@v%%+!kKXS1V$_z( z;I&H9gHJK{ZYMt$$=jP(<0ms3N2s?=Arst+a!b5qc{6s0GQ&kRJX`XlNJ+Q=m~)=d z%-D_D8Mby5*$GyZH$=)-|E51g+u-#9vdECmW^f?gxzy~{uvmIzpZc7*YQ&thXgxKT z82aiqCs&BZzFF7Sc}y@ywIR<}#&A&Iw*BVGsGj+hfp#c)rRpC>#~zUarB^${7T7Hqpk@0W10w;7!{4B18)%_eB$R!*fd zwULi74aI~rQQAF1hL}(;2-Bld!Rcp9klTw>MRR8JN#C+OTRz_p_MaBX`4ab^mWb97 z?7Qh#k-g|2r5-`oaQ;*Hg^6F9 z$bVY$opvUxS zr%};64Q|^AXK3(OQ-3^CVWv2rWVN1;c;{mQMCoBavLM`*BrmD8#KS#Iw*Hg-`o;6+ zv?se7yTy;E*Ih{LoVbK=Y&OuBPNe*LVBARBkHEAo&m0cy0<`!LWA=>efwSc{lW&l7 z4OcHg1Dk5(zt z(PZVD8sWdYjP;XQGp6sx%9;v2`Xt`ER`PhvHe9?FE{?pYjn*^by$jch)|2t`s#nZN zD{CGdN<5QRtF>;QS2w>j<561@j$>fw^ct&2@|IuD(MYuoGbd5>_F~b6Hp~O~Eymk0 zBdofB>myE&5-z=g4kgXzLUcvfQmA7`DKw;A%L$w|rFhIxcRm5##O~CW?z{>stD$$q zoPk$CBU`E6iUtFV-nDQcqeG*k&ouEN=w5~^$75^ju+{`|yZREhD`udNSuJ|jU-`1a z@WZP1PiH>2_b@A0IjpOioArQtcoLDc!2XE$IkSwu^CR{MS4dauTNG~jr zQ^D>>86kHg)W_QVL)f`iFFfyNJC;Sz|J#kqFJkj+F6sCR(EWvlGj+v&C+DiI~R^8U&G!G)w39?IRTkaWXBF=|0|LNE6 zUarBOSZ_-z|I$t5?pImGJG-)q4p-Tg*BEGGF>YOURPXe@B70OvylvDZ9@flC!Z7>r ziE|*LoFUZ}DMABFi`hOmHZ$;vDNnPbUK&A<@_)#*ekLs(C zjUj{lmu!2VGl(*Lv;UD1>KpjSIOovrirK|xsoT+78cGZIYL=LBsDt;kI;-7q_Wvxkh|-Q4~4iO=G7++!=PGLRPbSc6=0zYVy5!vS_PVjufv3p3w(dGgtpL6!q7JqJD*KC9F8tXf^0& zUn+SG;9b;zeN1l#kA&pg38`H@QGbnDQ-r6>Q}fU{Z=!2yz3UM5X)Q+AMX#UQ6i1|A zCGR>#!JDg#OPL-rg<~0=r+2!By+LNa6~1_$&lg`u1J|>n_fA2%_)?}^(HmABluP;L zbh3}06}^3hQ7G?9ByXbS_}}U}#kH~vsLi7HFn#&avgyCk6KP7}llys6@OOV?SogsT z&U0(ql)Np_cQmT(SR)mWkZsc?ndrP#BkVvCG(sIhxS3(}YJY^Y#G-Akq0PqjWP9R= z@jAW_FOAkQD$a&py`fm?#7{OstBYyXjEAidtC7dIn=b;iaTa8Gfu|9(GU$(sutqkh0)_95zy^8><% z4fl-V6;G@DfM}k@xF3*S(?jbAoXlBl>R;Qj@+W+duQEx?HwXGiD7P#4EK6jz4Ex%E z&vMvX8tJP}aT_t`fqt0RvgmcwTeH4J6_4iFM$3i#p%)^^)e+OrCs0aVHJ^sYDsa5{q=M9f}5gsEL_XaS&5ngkn z&uboo*ObVpEc!g+ObAY$?OzKcD1%V^i1nXl{NV3 z(QS2JeWK2;09aZbHnMQV+s{&q;&K1yzis}@aM$H`d+#YG(vO#(O&=)D9J|Que!6M& z^wxX$BwA*fr~gBOQ7g93$EFv6hej*0#AQ zX!F)co4Y1#bI)!&s!6d?eX&b0y#y#tIq-<_$OFOJqFI?go_mWD!j*sFBWq$K5Uj?S zMbP7>uDaWIcGcfL>4%deJZ~7!+i0h}9j}c(7I2Rz;mJD;_xOiDBsPOG&42ko?XvHG z@W@SX%L?3@aZvwXTql723g__Q1d{(JE0=KOeklCS*3@#$yZw)nK= z@t=;TZ8=F$o*nhL{TffRpJ!wf7*YFoz>+Gr>tZ?W|CY@2g zv~Jj2Y(~Antd6`!nG&a}k00NHaq?>;qcV2fH=RV7&zP=*Mz%b4DQ8!S4sJQBCh?hE z`AhDkix=RXFBslg!M;%(#8e_3jzN2tHZvXGiSNMwB_Dw7l{eVg5clpL)BDF`Ykpxmuo>NyY-GP9b!vQy>-G z*Ep8Cv#PgQvom&jFMeiLhGlKqSd~Lq4kaKWdx*F*GbS{3`q2%Z?7|zk6}v^nqf2z%x;3R|K`rU1dQr&IeK z^{fvZzt_wq+BVOAQJBj4vwIqBzgmftD|x*i(5s&m8v9&3vv}XN^UJDs6tSzGw-Svr zpOM~3oofF??h_Gca75OK#S#26(88F%zFOk^4C_sLDqH?u;+b8X^=4&>e87s^X@`2+ z4fV(?qk3O76!S$N6QARk>sdEF`_Z!2->@#g-8cmt3pQWx&*zDT4u*~7d}Dj%8e8uJ zydx`l%7J4HUnqKKaL2u)Ci{^wXb7=aSOc00%*OBbtONx^!e*J+exr;_O2)->h*GY73}D29??*r z5`Er957VaCMH3-mV~~nwZ`S>homG}XioTvlgdJG-m%Qijd5-b0BcJKNPB-)6$uC!< zPPri)FZm(fG(3y7Aaf_KYpGA?a{qJG?aC>#Gujtr!4?*5xh|FJ6b8Mp2Jzpp<6$n!I@l|!!3{hb>QDQ3yeR@V!R(8vx@i_M$Gu+*NH}+ zRL92@gLsS`W)Ex0TU4lgKzxj%w-@wb8`E=ng*4J;MmlO%r_=tvK%2*Tm^ej^R9O(U zb7+_y2l8!YB6+ov#(SJxBTkFI3D`w@d*6g{G9~Y3d;trL487$V3y<>SKM3HF?D%^i zk}

EiH=gXOMmNj`BHFOQ|V57mi%Yv&Qxe@rUxV*VN!UH1B`RfBrK@T^(thDBry~ znZi#%Opds(t?4{40p6UvDN%F%^+pRilsk7PC89&SWD8GekX~ESYIqB+{OdZ0R zZ`ye_aGLQ(w8dGJ&Nrs9<7?lD+9O};eKKYHR7(k0_cGd1>6aU{Qc+^Znd@CId`~jY zzVoX273W`x@|Mj{n>vS$x7*bzo;}AO{}Z$&iE$!zKau@!eP8nXeRZE}=l)nbKbfGN zONimFhU){g;b3ySf$LGgU30gY8eC6qjg)eb`{ZFECzwwJxnlyzt)+yk`#jnSAvcVF zW@?{SyqZ$!j=Da{DqW4T=2&7)RI5o^%PGS%x;fh{i!bl{+bp(9TH&`ft2#YkEZ2!) zZwGv;(vdV{k_-~|x>$NRDtE?XuPv<@G(1aSZ_4yy3|vT*Gn;p8u(;e0kI~H9(o1Ql z8kbiQ2f?n9H0Uj zL}NTA7~|T=7|)|tm9}F91BR#eDFRBFIqLd8=3gmqQPCSUc@%^J=qpQWw{1Kp@ystb zT0GbsiA$<5zSx?!A2TKlajQ?EFB(0Jxpwj>x~_%?Gxj80BUNnn6uetg$n-0It(d`w zh}XyKNbgif2WNj-{0v*-sliW|Q&=)hZ{8Z@hj=Qx*&o*_{`=wENh2Q`>JGPl>tcv) zx!H#;7hmUXFzc`da#9*@-Kp3GMXh1SWTPv+MSLH@`UO%jTyK4A+ z-5X4aC-aK%nO?V|+?qgVW1SgY9m#sr=r>v`X7nxEgexE2j-7rTkK~W{>yY)}>gn<8xg;O2f0uv%ykMQ+E=HtSG4)GugjN{0PBMDH ztSJ;s zC3-BUViLi{Z)H`|Zx_L(H;QC^757k%h+$%m(djQwUtuD+u5b}tC$ZkpW23RwLkT8= zK)K}SRjqPxE?{4pw?4nSvLVsZgq<|j8HpP3-z}K)^P=yHPFYVh>xx8Xm`JXP+WaN{ z=;(WbNqTJ@W4@2Bk-0nr)~)N^WpK>YeR<^ybjpRqdUYmluVF{rx@HsW<@agW(>V{( zx)n|K4Xv}-$cbRwH&pdu2b8)U2r7>3!tLWnTlBiB-f%VdRMmWORk^Xw$`$w>R*$9l zZme{Klr=LLW5~riBBM>NOJ4cGqg{5G(Y96fX?j(kEEWoD7J*ChvL>!V?}JJuzuWPV z)%59aTYKV8qj%m(q|SPaGX-xdTrUdavCia`c7%L0LW?hBsfp$%kKGe}*Fmwm$I3Ai zE!T~noj~L09Z9dh=g>r0wUswSRRtm(Ex#*}AFzAs!;>Rj9jrp!3&*nvd|$+jH4#56YpXyWAg%P+6OHjlqo)dT!|cC|^QcduGwMm+ zn`>}nmj8R$UwgD!_KM~-u9;^4G<0XgI zi*A#5*7`TY?6*Zu$HsqLK$}EIalW#%*I0Pjy*}L?pJar-7r=Oi3*Hm7;pPC#8(F2O z;bHGx?nh%`lvz_x^4^6!Il-(^zyEoAuSiU}GSy792d3yX(yv$ZMX!~9IX~%Y|aP1Tkyuro>6AUSdgJTJI2nVWP9EJZs^d?mg6@b({5v9-0zBMQC4w$ zzsPL?I+|zfjUvn|c= zkY>C=qxngqL2yrJO3Cs*i0)!f6&L2&X9d=kw6|wo`&=ZGauMdeck=Ih#|Ax_S^IIu zq1?*vFVy};$-u^rFv9T2-f2GNVOQtgADRbdZ9%W;&K12q(yt`j;NLSjn@qTye>;&F z=5zHZJe%)pxOXp~C|`CE53^T9;qGku9_FM5@9F#AGw(Xc+kL=0Q(Ne%+2fcx1}R)2 z3x>rUOABu9Ol%&|JzCJ?`$%T-Z(?;V@n=!d04mc%eYUK;VXJs2>fuzGRh0Rfk1ZCv zt8v9-tfuEj(DOAxYc@CPc$^9Q>Tosh-2rt$AGJySH5TYFD=CheTy92r38Q%#E!SC+ zV$P9D(+xk(dtDhg z+R|NzK@QKGAtI_)0n_9bZ`X#>7?ey(x=DO#be@N7Q?P{w<>;*ffw4CvJ?caTM z^rYsa&z^eDcL`?sr2lE*dkLRae7@{|eC?xSe&424(@$R}rskjdoCKUK70g8&n4ZX^ zA<3KB41Hc~;?`%m5*v@~v-*_&>WtUqtRoF?_(?%~g)LXp7`8ms3~esY4|@-@$Hb4b zp%;n7j05E3E+-P_LyrzVnggRf1tYUMZCGD?udFR!Tif`d>QjCe! zIK(jnR?i!w@#QhxrXlvbp$ZwuPjaRe(z zl9)?oiU+Bf(H;Rmb9d#3 zv;48ZIhq+Tp@#P|tXsVpMD4xl?>AnB!Ky97s|F?$6mrd&Z z`vdip=C$Y8iRKM8qZMu|4RbUxtD4o)romMqxr~7kuoIhvEQoO21 z)|^gwI)#}!BABVDhI2eKGAET-a2)w!hS|TSzq7M5`%W6@LPz(?1bizWlTSBNorBXvI`eDFYheKRB6SNgXhTSnRqT8FR4S{~Ou zOk6LYhei}9=pv&+IatwtDBhDCEXis!a&VY^dXj^BlINTar%maVsCTUL$c(q!aNS4`LG|?xH?@2e%TaBWdo|oAXn*sjytle5U zeIIiw97!DftIeS-lN|drpCq3Ze6Htn1)u-re}wzr;Y};ELkWLPlau){J>x$aU-8s_&myI2Ono=UdnYdpG%?3 z1mD{pzt{LuZU(Y98^~5JXD$qdJQJZ1M<1WzwIA>~y(W?P1Rs6tBiet=;Nd?STwd|c zdnQ_R>$2wGScsh#KZ;?89C^*<`L6CXV+-mBcsp2R@M0O-mrgn z8Fv*&t^VY_eg56W+-=Uu%gc%0zP}>0kNW;Ok$Cp~_uv2Bm%g*Y;@86iAwHeO^}GFv z#2I`>_a_pkL9-60t_P>CrqssCi@Ko&vgMjr!i|ysT)mw*IQf)cDWoLkG}e$c%a}R$l9LuWCHXkw?nn(fnc7A$(fMdC&WI z=W=&4cWs+b`*&v#7rb{z6sJ**M}6SW$d~4S#p2J4;ECf$*K)mxPwDsI4WGBbBggOm zGx+nL=^dW+HI^s+d4$`CGW+x3&X@U!_ec5t-xj}+KHtpuWT z)Lr;}UGHa%2cov`RP+7i;p19P^Z9)*XV6*Pa{T@U!?7&<6Tn}1mtzH~n%}>ajr02x z7FvFPVc~C!N2R|;8h$q62|G|eee~DFmIDR@&;3KYG_xmJ$tuwlkcDX6?lzc$g zqwe0+z4#lovm;e+w1!Esh@t)H4At+uH;>@WT5`mE(EGnI?@zJv3%+C_y4>{Rgg~mT z3b>KuSk_BuW!}ZXQz!EhEuY3lsBLKq>b1N2CVG4M1aD8}?Zc0`)AV_=VAky<@C@F- zw`(Bx!6QDGx1|vZZbzsNzHJ_IqkBd4+s{*Sa?3PRa+)bAyg3uEDmq%E+$SkFWn8&= zf&FfM>v~&ak{nE0^d` z%g52zC#kLaBYNA!M=gKRr-_`m0B@&*sJsG}Qk26$`*F-(2g7ZyM1#`$TF#Gu&zijq z@}(RH-%8ZY4yf#B*h$snzRe%^41e6wycq@WYIvGm5j?Bi@|FHK5{aMjdFZW>=DM-v zw6j8U*qzFmeKI=DLu=)0Eab7foTZ{DTD@@_mPzPkRy;(4Q8?Omd`cy?GbDTx`u+rC zySJ;UXR_HFw>Ob^`nQrn?o7q=nc4Hr%vRReR<(kmR*&fYPo}ly{1qPk^TKmXYwJvF(nhUR zU|()cfz?|5l8uq$G${Kd>)l2?Xu+EdJThx62kA~_@rZq`uPv3~{KYB1fdYx}x9|0h zoCA)h*I3J(-8fy$k%oiUN;bj2fm?K10~F;eiRX{FfIy*x*J+OX`AG2b33 zz|GlP@9U6j&$f8e3S2J+uFHYzZQ#$%zaegcdphsV?mg-N#vPV=)>gxKmFd+={tCvw zS@`FsSC0{aAq)_Vo9T^(@m=(-*@y8odZH&;@6D1T1{V2nGW)}@hq+_cj`GA=D87;U zj68Z5N>TLUndD4Z>c=;}Xe?%}&!0(+IdpJ&)x#Q|q=vXft*9ASx|z~MPfR*VaHLk- z?mWiZNbfGuNKAjG(%PZ*<{ntDh)dgA!hhf4%wlGDk(q%Tji=7&4jW_%*w`yO>W)%@ zJt^*;xtvSt-rA65bsLRBnG=@#bCvkAubVMX2VYMlUT2h2; ziEHIs+^NIB=`Z;!T>jXyOAVaPFWGX!<#~){MR^MR;xy)NUfrnS7Y~|i;qtXbTVt!R_aP zxp3RnaK7Qy(RE&n+qSggIR$lP``0Ylw`79|kMl*>A7yV^vccSA{zPB){X6XYb(ytK zZE!RBJhP(s!91tiX%2(zBs@9V%l45aV17m!WDU>8rnr!!j;c06Lsai#dyvwO=%Cu z3GH9-d9xxE618AJf#(4?5mjktT%4+Im9(j%sz(h68&6g9;Y3lYI=^)IwSlF;{atv= z#aQHSZD1=xN>=K z7qzH9G!N)?=3#UQ(RAKh4tKR}FEn*7L5mp%LSgNP!;!tTayT4O=3|E=7oF*FB#hli znzjd_y)nG9qTVFq8#Mc#Y?Ow4+5eZ%S9&@kp3loNK3CDVFlCv+6#W&Ze0Q1F{POGy zw&is8!WY36VeZ@6zW`t46WZkC%d$MB48GXY0CV11jJ>i(cSV8Mihm%97C_srKF7G% zaD>TZiukl&@AKKY)Vsj&4{3v741CGPuQ3~0Tic;7q#d$rrr~ON@6oKI-f2*(^;FF* zP8TOJ6rM17ckKOH#k}_tyKan*x?Zxbrni9C3K6v~eD_;@w!A^k-Dxno;SI4eg2!*Ni^1>`%>%wiRr-I-_Zi7CU{~&k* ztdNl`zI79|tPkH;v^!INO3V_Emv`|KR?4!ji={swyL~p%3))HaQR5Ht-u)jKe^4R* zfKMvz#~mn6CFgAgTSeg}@4;c>28Qt4DQ+OgISqMoQpnB>`Nj??TDyctq39lJEQyCv zqs^`BVxqJruQ=02Zy9SdL4>5uT0b=Et8ZJ6z$^mIeNZD7n=_^tc~S+AWHCF#gE_i~tp zKI<)p8fU|GuVl0v4E;U!c}ssbc1UaJ4YVaaT#?%1P1eFb`gQRb*$0l-NT!%95ymzf z@*WwPm! z1Zl=?Z$&XZ@ljtDiFgo$r zYA{3IW2Izg+P`P5@geVFtgwuK&ss4<-UFpfs^Z@}(@@V489~!2*)OWk`Ui%fMoGTW z&Yhi&w0#4T&f4I$IrYXw3mbW6v;Ny>Z?pQQr&&&3(%8|H;8a%9C7yY9p`9D$r*!94 z+y=GXW~l8~qqnw-EBzAfB(r)4xOD@Vx67Q$B8pmOG}G7mGG=e zMX>L9SEo+L*|j>(OA{^M=zXeFP|!Ksg+`4+Ht_xVRsOg?)iT2$Wo=}XZ0q9=ZoA+uc_m&iAY;*`!vJvQ>(v2Cp&@nInmN@M!AtuZtB{_I2TEC0ZTUenA5NM z^~Zg+xfZ6jQcCZjt>t}q`Zi;t<-2ds{Ri!)6XbH2y6>PLHf*xcRd_?}_Z? zxBS<})#{u^>l-{BtUuk#7<5-GS;M6sg1c8bWc^zI_n4ssu&=A8<#^6#81nkj!JQ9% z3iJC$XE!^gk={mga=(X6Zk6=vBZUiHwTz;>Gsmvmj46$$hL(V&4N+C#GIXMBxvH9{?qKZqj_kO9e>Ig|I~~TjhyqBGG>hO zGNxDmIb&27m>g$2(ki(QHO5nRk21!qBV%N(rt6K)Q8PxX9Y!?|t*wk=(O@g&{x^ms)e)jqnl&IrrAy1%KB*>J}dxM3k<9( z5qwa7lS;>_0X`g*#sQxatXP=rz>?o46;R7U!p^~TxNk*wDR_pvf{ zCVkuRCpC#j&;u^zTYCvF;QKtjm+>vw_a2S^hU?AjbA+oW=~TK?eWSblTV1bc(;$P7Ot!4tdXK1y9$$u5-*y&U$oO*^Z7oCI z4b-mpo*kD5TK+Cuzg;J`d7f@>lWi~ODJxs3 z3)QtxYu`@%b4@SYZbYNKuH@`2twC$=tL=ke9N#C9Hg>uly`H%D#@!G4p!%nq@mBY5 zqTJYM^aXGrc0Of}Q&XZad4co49*e+P5a?!yAR20{oP&c|S2wZx+F@(=LXA69DWV@X zQC2xgRQBF;T(4zQh3Ac=Q#wnd-bj>wc_Ivs)PN&HMBs_<+0!jq3mxg{WdAQG`Is|( z#a;aqM#BCjjh(fa5o`pr?JS0I{!>go^eI6;^y<0!$vnHy*Ws}{(|(Y6qQjkOe>Lw! zVfe21?x84*!@l*TY}E6R*J?OPq<@h)My|%5y7xsn@{SC#qfGVZyjx@C?7i<7@Y|Kb zcU1nA7#+B0-B6%1aE90%T~k&4{pjA|Q}>?k4S8o6`R7L9p4qh#^jPY(awGD7WDjk1 z?5s*T3UPJWc9b(RTE`E3T|iVKOS2Ihzme}T{)SqE-AC!ic7H%Qx3BeRxRurxu#{IT z`dwbfA+KJxv61WZ*oV=`on00plImPmKSMQRJxzs#2sChAbW+w7L z^~-iq?v<_u+ zRN*D|=U+9HpK|#Xg=bmzx5#58nCeW%`!?>LfKl`SV6Os7_XF?NqP8bdL|h@*CPjva#*Gq*go@?;-A zKE10gCj|pu74U*4Y8v#uj%Me2Y5YvVyF=c5AZ7DOA<41tt$xlqc1G@qPi_TLL&&x| z{8hTE7N12UvcDYty4aN^v6CEm3ZCi&>zwzXi4m06GZRbT5cZWgY&VwHSZa{`T}fZp z4e3Jb|85`o=98S>^@lReVml ziC>$Cb)Q}v4AphcD`(L*3+2d~%D>Q?f3Z}GjW0j8Mm);BPVo7-p<%2;FjV+14)dfb zpD3UCJy&WSccSerrM*S82loI=D}H+mj82{PUNU;&8qbi);%9SfxmZKRzq#@+Qa(D4 zpYh&SECLJnC;g{x2JhzSUo%Sg{1MYy)=LFFeTX}5l*3#nT0Vzo){QaiUCF%@XfbO} zIgpR3)sMfKY)T)u+n;|^&h@gJUxJ8E%yG4=Z*dNlXb~K2&pXT;gPuH^77n*)&P&G<&=-Y;Y8j$7C2a_F7}@~ILNc@q9_irdpql$G7`}BdTY7oIHTFFv}yn4EhkpX zyJ&_8OV=rSSTTIZoa_T$gtju&%GkAk$?d(y55yfoHIH>ENiC->=Bqxq#bq-9O~#)SqyGVJ}d zZJ$lsw!JZ~R972W(6%mHTK=oe-T0^8GUY2BJK*JOf?8(>-ls{uJAnKPl#-q$i84$* z=w8$jmYU4`40(M#*+r@2`$nm4I`51xrzeVKQaP<<3>rU^eyIj|@v7gMW$IqclM~w2 z%NeGZ-~@KVpvhb+oMdk&MBD-9$uZE@H;A-f7ezO+h`~Zdz4Nzz}X0 zx^pNc=n5KFQ@fy{HczB>+vXguT${=gD!j=WII4ddoyt~^+|G(L8kL&I=(1$2w{K(D za8>=r5xpw&N>FA#S9*7vdH4C?{wvIeg-q5H-%>BL-VXD;g}x85dSmYnd8ctDddYd0 z=H!Dp#fL+is@1Pk+2CrfWr9^qhW-GH4U1~;nlQMi>%LdEc(4>;UOR1Lxu`elBn?A zdUBzuMchQP+dhe|m@3j$JyITQYq_e{kC|GP56<%O9|!M-Bc5ZZe?!pnt)>QzN%cu~ z+xp z3vXE+7D{0+ExgYP-d1~y&94yNd3<|=-sGUBK}!==a?8T|I%oz;3;HFg6ot3)FIN*Y8T9TAd>!F<6#?Md{mIA2 zkN3iu$4GH&&d)8)Z7MQ*4l_L9J;vNbPZ-dC_4}Av8>g3KzOE7GYh8)FZ<@beA2-^# zz7g$9{(vn{eYib7nW(n7J)Y&{LpN(L%yu{s_H)pC0SZ(!dSI4uiK z@Up+UiFJ~#`1t5_VD@}~K~4vr8;s4`+;N}9eF0`?f%SM8bqBWg&)A3=_36k5+z2I$ z+8pl`jyoUE;r!SiHdjO5>xJ?CSQPYQuHTP|>j}rhn*Id!%na&zbygg2tbO zQ+J@w#QY3;&%tBhI8a8^pQU+#wqw1H_IWmRGrNjz)MxoTU7uyGRZL6rTMc?!O5^*k z6L($T2WQ4{K|Qzw-Xw}%3Cve9@2p2@wsx878t`Uq_+I4 z16~SwS9hSc-a>A`oL-|io&n}1`eev^5WZ=jycl~jV9pw~Po6eUYM{DRCSQf-z(ny# zLe*-1^eq@$E*s|jh|6;9B3X+8#~UCgV8+MkP_`xTA2?aQYlg*(iFwVcNKJbtkS}}T z<+i4-SUqlUfs0iTg-Oy(F)N}2#*=7Aelm0Cyg(P@uhEJr(Dh3z0%5?csN2%Av2AJX z%mo@oqD*F;LGNK9awVUOb`{BE(M3J%v&E}K=Dc=$ufyDn```W_VrHW62`{VPJA2%F zqJIZR8@pl09j>ud@Bt}0;1D^)(oldrH;M~z{nPm}zRd2Fl##~M3QX-P`YA`oX;$(` zt0{x*5z>{TI5&5eFAtbV4NEhjr%b0TSt_^^%oi0lc3jlw?ma4P+tA4CjIx^EY*rS{ z#MYpkqu0g`ou?#g-quBIiJ?aFku%yCVZ(ndw4vKzEM-t}a--|_)$Uuq9$CX`c-Pi!+Y?q+WM^E|T?eLsp<#~>FJ`#|rB ze-qc2uOV%&2h6G6^3&S5lTmX*(*WKF8*4Ha;FoB`;@3;lqO@;u*V5D=5l=Qk?j)pw z@=Q*I=h3K?QF`-B`mP>mRlr8R46!#xlr)Pt9P|!&Q<~@XJh!Jl;axM&GJYQTemfiGM@w9BWOBm%jUzx3jpjBEm?EMPc#NAOLUJL^I5Sm3s<_q ziDkwT&VUoEz>KE8>ry*t`z`t_z9S8H9VL{tc?YFm@=H(Y%TQW(X3$Id8g;D*rfLd$ zl`}*%s}_pd1FHDOo{nS(`S`B>-RRk8%VT@?A~Uy_Y4lnRl(kyHTG+bm*1$jcN#m9$FlME)k!V{IMu(#vv-|xWk zKM1@|Na;$aT8NhonSCsltDR-;{V34l<$?R*W|e+5DBbH{4R~)!=ipqXZpN#1h3eV- zY_Hzj;g^RSQzq1!P78ji)X#$YB~#R!L6hxK^1N}QO57Ec*kZ0StKaC;eMP?6-rr4s z@QuX0t{*dfkVXUEt%g=R2RMIB?@6ZEcEn3;zjR*_Y`Q;$PsEjY-IQ=WxgaQUuDP;Q zwmEyJ>Ce*O>6!l30Oz@=CJQO;ikuiyC;R2`B?mncY_|r#)W4ZQ{nLZ;($YdmC4v%T zmI7C|o1VRGehJslj))fD6)ZJ=p0}r3em?*25{ZrYrk*8+&B>?kRKNEK(n9$6g!zuh zpuombkB|VeS7LEm(YsF0T6tmR(7B93Wqg?!)K_=lR7Mom$h(ne;_1<6(RJ#}kad?? z8|bnf@CCd6pI(!JYh^gOu!b{8&KIIvx19Pn=8Zg`US zq~7i>Gyp^2^?lu4{hm%k2ZPt>{z~DO@zgqNKhg4%iKb?~oqA^#b#k_g5^XW-F*@HX zl)BO|2Z_U%tT+}~K|gDDb*1T@GT7?&8m(K` z1K@$3v3ubuT1m!2i;Qg!btYPl>s7CIAQ5d#vNv@8xmx-hEh%RIb3sdY4No`m?l+At zd388A2@c=y=^Rzd zGy1)&&9z3V6aK1UKSbUW)#U8Tcs*LNclDUn5z1m&e3W{EG1QqT^Jrh4F1-Y+wBJA* zZOdHm0rGQLW9Y}{sFqJc2KJjMNm0#!@nBbvU>ee@-%I$T#DeFl4Q+OmnY@>4*~REu zetnXEPtZzZDjAcLTGtxz6#XqtcwV30>GA9AH~zxvH;%xcJm{r@GCGe#?@lxCem%IK z^6OMD#U0c)y?HJrR2~dr_LbK%4wt(P>@8fjaBbnTjM^Mr&NSD8%cG*UDyp(@(a95* z2P)Q7ZI9CSbgnI2^$Y={IY3x-YoAN*VP{aB*-9;o@*o_`=#BdZxwJXuQr2-nx|dytdjEJ$ZG8;=bVL?>N7ez-+#`` zX&2Kk%r2(u>s}z2vNBZ5(sj7$d|R@15-szvu=Tc9CFGSuKVU^Bo%%YTH}H+5G}kJK;fR_X7;J>2=)4mTHAv{{YR z^*RbiafBOVPvdj3E^lF^y&i|F<8XZp=i<{wUP(uuXf6hbE>x~5I~PxYgU*-g=3*s$ zT>Ht)sp?g8;QDLlpkdq`++5fM{8iH%w4hSI&>YlFHSxJdL#*-*I$VmtE0A-VXPq$~ zn@@8#SE5>0k9+67C=N{gPGsM3$Ug?iB1)ea|1KigHILPN2EAKS2&f@nVou(Tt3Y-~~}q z^vLal+UoZyiWfH*tL8OWBhzZ|#Lt8m`@OAT&EfIl!`3T5e2rt$uvHRH zjXud=NIC3xo#^VG^?UE31>0xOGy4`6I;*y(7HuzwPpB|xG61+7LUVmsI=qntP^;ge zjVRwJvuD)pm99`Gxq1hj=j{nB+5be0*I(fE`#SpFexe_A_Q(!q)p)?V6L%Bmb>}D% zCq1c?;CE{b2V4w9UJB|8wY(b6cucZe2|miW=1>nDQhGi|#9T#6YTmnv%s7>$M@opW?0MV!n#v_XrV{6)c z(9(K%j$03w!!C2WVugt6S;6^RD)06K+V~93kGmVQJvL55pK20yAd6*v+Vww0Mue+# z#K1ECL`yDMgK>7yl8(4WA&-Hm+Xd)f{`SidE|gU79S5ppLGW6&&Q}O zN^8<{q8#l(up_l1h0b7)a(&7IA}8VJ7z@KwvZXZMVh zpPI~Ep31DAQ99k={qmBld6VG}17ubbKI|t>i8YqIbZ5cQ;*x_o@anFl8n3Eoqycn8 zompejdf9$+l9dGe6*HuBQTo>23qYk`dr-8W!j0xci3@XV&sH_=;6mbXWY0OBIABlYg`5w zZ^%`TdrmO!YyEM*2!=eCn>J#{eeF$$A9ufrhKS-pnENLjcW>aes2=y+;EDVhH$`xT zJ?`kYr7Re-)UF{WB^@Gbh#^lFq{Mk%iD^WRp5xRU`bYZNvzy_~IB&Wuh(&mdvyYK|GGU7e*%G6G>K8=oxQF@6d|TdEe8WUbv)UjR!q>?(>c5Dl2`I z(QeOw{`V?TZ*0eO3JZ|co4W#AK2g4Tv+8=7y098MSLDA|x2I8MCcSKa)uzd7Vx>r$ zehhkj@E6&a)iq5q>tR~E(o;@(UtIw*n~=L3z(1S)Oe=U9t755_ zG^Xq8#>`3dd$DT5Us_)r>s;CKqdwKx*si!g*|{3c)@7&f*-5Qi(OB#|zi1HDwq+}+ zzu|tgJUclX?TGe!FAnP+`-aZk+S*}j@#{E{z#>;!YfJZgTXUD1){|?(5^Y_2(~hyN zYrn|}2=u6Hm+K4lEb01ngQTTOEF0cwqCBj{AFaPDC*5&J-maL6Ctge>!lBMxXg7Bi zG+&20d$>MW9Pk=T`@IJ#xyRTQtV|bNd+N{M_-+3hIA}HpylV=q=a!64-qqyGHtoBe zXE<@n8dWmz7zxEvG-+%-J-et+;%6*Ow1A+m@^d z$pY=~N^55cW)GY$|uN;}<#jMb7dIWk!NWFF_uhi=9Z+3Gy)MbB&E~ z4ZAWat^xJ&Y$C3K-)#8L;TrpyPe<#?Dz5PWTw}mH8T!Q|<#P>{ne?*xRhtaBhUH#+ zp=--E;x&nDKqvmwmm89XYb@#9N9F->f=s9QNXRwB4eq5^X}AVCpHiFP8vWi(AexSG zjWp$MK;PU?d~Td;%p1owzK^HHS|o2k_u?8K)yt^;qx-!%BW)&Mlk;@$^0`ZukHOp( zm)QlE`M={_<|BAFEFZei@Sz{UhvK!1AI+yP)6m&|6z51Ep>E5w1kY2cBQ+xWj@SP} zz`gFRdh!dn&(Gmv%>ftNQ*1M%tFWs*>Sa+$%Xuv~8)J^Po0+$qaiY>MH%x`Ajlq+S z&F>sH>Ug_%qoD}<`|*2!O1^;&;zM8TZG-2Xm2K^_*4$gj5@ZcE-UxSQJ+-rqezcVa zhzZ#5&Cky9%e|15mK^Q>{{{x*Mi1P@{W^w;EJO>k?N5dmo&gWtg08sS=YLCme&G1Z z2lKz>6YxJp&_wtjXa9)5*!r9f-hk(Ozt_#ktWB^9>Nqy9ak@7@%-?POJNZJC~doXDO6?>z0(z>c#%i~VL#T%x7VUuRdW_~xhf zakd41aD!?6>Vm z{$Lm4hm5Z1u*S`U?eCO6^cW{WtwY)oSOKmGG(K9`@?bh6|7f9p(P&a#v`BX$#5w>kNczKixpq^vRTKjJEno2 zzU^b5^HEt|EB=^9l8A@aC$v^~o{?#_y*gJ~UPKE;(S;qGs0>b4J04Tjw+M}GoYJQq z!f*tvv=5u5INc>ThE!$o-_qj|0X;_XTXY%6?}Fmae92wyUlCQF74xs`_hb9)J7#@7 zDkC=Tf&*BNf-l3^;?fGyKk-Y5YB_@izO&Dp>_gb6j|eP;(?mOIb;wAGa1IwU@AKuQ zGWW|dU(g>@)tJ|j$1?1&*p~#dm-xI(V=XH#Akt=XqoDOuQ8LicxBR&~d29Y~HMQh@ z85YcSbo|)t)#KN^YQ(n{*=uWHVArVa$YtvZ4;*g&5!^Z%ziz)bH*fvA(p6YZ%uni* z_m*)K`Z;~YLT8&9hsE)3db=xtj>Z?|d6M1Yd7Iedun&(-+F)5a;Ca=f%vDM1+w%S1 zlLmr{KXLqzy|@AYtCrNnJmC?D=8)GKRO3dZpLQDY9j8?*4?JA(@wJ|!*O+_pJ#psPh?-D%{o;yHfX@a z4#oN#a8^{V%G|L`ZA~$KR8Lip;$ruCcNK{>BnyAI zV>FD@GOK=uJ18!=-`iuXl6i&>e?B6txWrsPIdUER<~HPC)Aq*p8%D2b{>2}roOHwJ ze{BuvddpL;{623b*$(teHSO~*@_(s~{X{(InXcy0vs=vh08Vb}K5M^`9^De@QBR~t z*Nn)&R(s$Y@@(nkCg*c~GA8xIKFo^s;qIUhdx!fuwMP8&=3uR%va#a#eJAj{2z%R( zq~EMQ%co_3!>iE5+VG9x)#^^L%Dn_nM4ET@__~kf`u6-g-=^O<2mhY3(h~o>2EJ}! zVsa|fDb{*L`Td2m@p)2P>6SNE9CTlK(w%$xE$-fUx&267UdcH;SI9@c)#wnnGk3R}xzp(si_PBf{hm&DRgC^Q&}IN9 zFxFD?KD;jzkL+0DK!0!ec4NEf<`Odxn&17L=4tOVv|sCw^gD&jdf8D^IU)9@$T`%X zLI;?{Ij~Fo@6~*Nh0lNG^Y?r}#f0nYKCjix?m7P-bMFHmRdwxspEGmvhY)ats4-9+ zFrK}~J0 za=o-SV5-zYm`oBILd57pO)4>YziaPvGG_uo+TQ1VU-(RZd+)RVtiATyYp?z1>=Ouv zov>EkHj)bw^GwEI-C9YF>=YC;hbWMG$tieg zkDCjg>itHJ^n1CRdS!`7&4k8rl$EH;^&M^NX+vvhsuS@Yz^7^Q;Clz3E^8gO-5>Z( zg04cPA*rGfE&Tw${7=B!X@xE!t{fg}t|L6T)vD5s2S=UiE4dAD-M@P)*?oZoy%`fVaX~iqP_vJ zbGdwNmM^Q?VfP;Xy7DI|zx_S=Zm%c8tWI(WsHbw@J2yipO~NV!Pq(V4@^$9xyGN*} zOHNU%Z=A|u5v~KFJBj8T;r+k7n=r8l{@p^ z9k=nFW`5QDoOL((?)aaJ$5kFzy~fYCmZbNL;7eVCqxhPYU=rVzm3aE}6*hy?Za*n@ zub;iQ*HB*%c2*{2&EuiLwORJd`PwC?0E#)wfZp@GC;H(cN?(jE@Qq9k7XB*Q4-rGMU9;^7!MXHpNyVY ze3(glI<|_O{B*dN$Ud(QpQv)D?87RAZ`6w2r1SNYQ$Xe0!uqm)($bTnzPhZf(9s{Z zs&mwmriD3RD|bw(J%43~nT@PrGLGe_ak2g_J$77FU>MW+y^QP!z|s6R;69KqW2Iit z8OkJ+*#yNUy>3!^ls$PG>X%fw`FHh+?1^D_MoPDlieS- zBm1e?nG0+?GptTeIwd4v!7+wW6FGZ2er_0Q12(m?SL?*{?45bX$e8c!8B@}*(#oJJ zXqR*hOSz1aB)zt1J>E#q9O^7Qlb9{60Q{1+gcFn|UqD`-5pIrqs(1e2Y&1%Lp`u@A46|(dSGwp=+F!SzmO?ho6-4MXHt;JoY#35tjRW2v!SXMszjcmRLSTgR7uPh?*7;9 z-@-lX7ceh42f2Q?w?Tce>iotDlqS;K!i^qh;?}M5NY_Z*x>nU)akzC}Yt z0kf6&|6A4j|GSkQYIQte(P5^xDx zJldDyk-$PE)#*#k%AGnl%r|AEr>{He=%VjVNo21g-EQM*nblg4D%)k%60sH}Z-cy< z9o=!y9p*=-dCw9#Ge>*L$h%}^;m$ksJ>oj_9d5CVsQXqP>b=62v63TC;dW$S%a{d) zmnoWWhCfdEa)LwBNiTQ8{d&M%vKQ(3 zI;o|nWzh2YJ|h>_PP53g;g}I+%+46o${!BI2UTlw` z5A|LLhp!_xwyoHn-kJH@Kf3WpswT2il{Rj*Ay#PEv_8p zdbacK@XF$y*wpcFYu?CdmM_dLCRBDiqu(ABD)pBKSLF+bXObp*ez*n>3(w@9op8^M zYRzL+v2Y3rQtxksx%o<@N!C4DSf_F%tMP;B;jbya(jUq59Owx51neASWRhMO?vb0_ z^eRgW_neDcACT}c-;_nl)jEKzqrTg_Md`fB zjiO;SkJ38jdw!ZrDax(+G`bV(Pth;=-1UL1HaRqu;G3<=lV^qaW)b^IXsosS#@5$$ z->6}&B%fdXBE#6q@7S5rSL$qCxSYPSTyf&f-d%xZKY#nMalxC1<1gTC1n;WFA{l9O zMPlDh+qrn>?fxkf4v56;yglKg&9=O->jxd1Jv(oAzSJZ>q0=|_ySDU%)f%&WZ#pV( z8FqR`ek_y>c-7jo$R2+s?e&9cw=}P{8L6`d zB{u+9f`sNP$(?CS?jGbh7$dn8u?a+SgV55#``eO2T-V^rR<5~+<$k8Hx@++ZbKiwe zNED@ql~!`(>@E0_NPKF>S5$P{r>VBzrP}_2Mn7#YHE!t{f4G$!(w#ETW~JXL)u-IL z+$3VnBbLs!jPY&`A4yRDdk`AHQnZ$ZswbA{Nnk2{2gg;=er0~XzwYiy;s>^ zK8dJ16=dv|b7x_7ACNP~s99j#xvI|3+T4-%v-G`Y%#6?!POYPo>Q}YalG?)8J!K6{ zebeX;(eUz3Bc~?GY9!aIfEznnd8ezjXF9dYv}Kq*e6`kB_hM*pzvGXL-hWi1_o~}= zD*4>0 zSNvp#FcIr#!{Jio^ZM>faX)gnNVyl`u0Fg(xf5}(J^WqePR70Z@VAva3HM!xZ&2=0 zxXTXzFXbMA`*yyRDeJq;`|at}z@^sHDSXF2|URiWG`)oVu6VIRu;k9Zf zJ?rBKg39;Fz?V18zIXr2g~wT!e>*L1O6mdGeM+4>&*sX64tYYDM|PxU6oq>h+I*2% zVcwz1W5s10Z~5K0ZP8@r&J)dv`?k@e&EtjV<{FdFWZgwSU2&49v2*|Pv0hWX?pnxQ zEpkiaD)PVznSXufo2?TU{6@FaOA8ER20wdV z<9yS%bXD#xw9_rBosJhcy!I+yr$dF_?To0C_QLD*L0X@+X_Z)E-fmn@8&XTwS;ewD zp6BrXq23Gp@Z57;opBUidB+G(p8DGb*p{QPEib^f9C3iKLUAh#&Lc5qA=MWIa_u-v zhs61|ii3qtoGd%e+#zwks^X-=_bjNqz~;Nh=6lv)U1r&Jkyv4FvKSRU&b}&^dLB4s z&)_>~PjF`B5R z-ul&edz|ss2Q{25<}`rPF7{fE&+Ap^mVZM}s_2}_x5#C!P;MpD_jE+~UIHz^+M%Qm zv#%v1s(jn^Q#GPSchtk|YehH<%&ZFvvy{a6`A&mAZzT6Y$l03cH=B<0c8=chMpIzT z?#vUdBB!WD^I+95);aw;fqo%W?JUwW)K5P6l$nFfh~z9eYg(_xK7U_*q1ApzsYrB_ z*~q#Jbm?0m*1f3d(raq^yn);`D{G@7Z-;tr{;*f=)xAMmM%TxjGk0?O;!uyg+cQp` z*3v6QW7KyFG4EszeQYIP6z4mKd-HGECV9Hf6>pE;moYQZ>LEl6P3g zn=|Gz-&7W-j6s>uIv)GH!nWF5dTtU52+dShdnr9#tkZ7fN7f9_rS0YG6tW5w?pcY2 zuQg@`F0Dz+j_jnRlA)yxT5<>Tl~bCshE}HXy~WPAfxOn)`O13MI+gEr)N|T zZsyu@v;TVbA2?J|1k;zu_1o`k*s%u$)430;w%x$q#!?>%WVrEB}@bYH1pzP*v3b9U|W z+;ga-eD^zj@VnpV?UgtDh1U~4Jd;w-L~=y43I(#V;_Em=J!kFouzc@kl>I!>er_Oj zqP>_Sy_QP3>wbsbMw$15@-6Q&P`>587>xaX_x8c>cRRXrEZ?=A11S&YVM? zIMX%wZ5$Z~Mf&x+&BVi62j85lag&Yj*_eh-jeQq3!YqweQf<=zf-}zOb9;K+XlCU$ zN@w&8$k@5Z@BBU#eP2_=tqkm*a$~8iAx^Pn^KT-Lo)+58k=3|(j|5&m)p zftE1IC++Z|p4CTo**zD&(`&b2DfOcp0!m7Z*NTV8iDW@5mJM}mg$xh^b6Z0*J zvx;>MZVpS6u$u{!Ra5#bme?8Wv#f$S=kY}5M;{r9%&l};+7kZ|qo3># z^0pm%SZ)UvJ>2*F$#jj}B6Xsy$oCok%x#l$v%bu18B0%)waUUnyzk@Ynwk8{cOxIsDQybNmw*LP%r`sUQ*$UD*(?Q!HWI4Ke(v;Jiy+@8CAII;}z4Uo3NI7%k+@7RQU`X6UJ=w^5^3iBLkSXM8 z9RKxrrbn~O)F|j!3VJ2wWbq~vFOAdi$(}LfUh|D1yc*>1xO?0jcH~g>vh1btZuCKM z-=#EhOV5qWRpmX;aqwrnSH5<#@f+@b=X~>g0;Br`HM+0jloaX7%T#$C;*A1H(ZX9q z%qqhz>K^LjsxQ?OOYY5+_lEVXoKaZW++KM8EIr)I>LK%Qc008#veKUOw)DJ3`{^&E zKk}T@9!?()tDE6;T@LZ>LS4Rmy}_xA|D<)%eM$80d(sm0U2nJ7%gHRX|0Wfp^k?Ve zyz$|TDAe^xG`@@|tZ?x*nWWhH4~{ApXOXL+_GF{Vx%63~O2#Jph8VO`cc;*6&tnHi z7gz45T~#~MJFJd@jlWX7H_#k2qV z?nK-()c1-PT0Da%d(+TKsx{D9o=o!S{7^zfLyFw>7X60x(C~*-!cJ~8Pbl@~52X|xu4#)c z@l$fhRwYW#GqIbIX37#>vR$Rs@lRf_G&F(np>reePgETw?2->wsoRT0j%Lc+l)T|D zI%%b{(?lm-!<>7PZD)0DiR}Z<9c0bwJg93-alHd6YZ!;r4HQ}{)x7wqj3sK#)AhyC zC98_kie|EoGG?D%1-OSb`^$KLVjORUyv@x>dRO1TPQXRH!+OuDA8D=$JI9mV6VHZ8?(> zoV6-hIX%fu$WA(4yOWKNoO$Vpt-GV!wcXMd^Yrt_$JNwSkMUu4!QJCyndWiK_$Y5e z=n>s`ttsU2MeAcJzq#ivl}gTRRL4*f9sjhwo2EE}HsgPE9Bfwi%0y?(!;OQ@>UJO* z2NO>^4m$F{w~@-CYi-BX`k^jO?jw`dU&II~v(Hz8LQCwkBy^se7Wwk(&^Wzn)Cu>z z`oZx^XO4E(3Gu?}rX*(ux`{MHPy7`RNh4ZIWSvu0*w!M+&3x}s)&R9HtiFXAOHDKP zREjJgQs0!AnTM=UlH9lyT@OFR4V+T?=pp54+QhPJVfXDqX05VL)7YWoC&x1DMN0_m*h5i5Lo{TO|A=>RA@;5X$J(F$WUc=^|v%CKNFTAJ4Ow#G! z@BP%4p>*Iv+w)!6$Z!>Ap(;08&D@-RJZx8kKsT~XVczcN3=uS1>_8QIlYN)12W zw(x~Ftts8>czW(}h___jX&spwdY>t0st(8AXNql2uKGM>b5Eze#@)>Q<+1mAHj`4~ z>HaJCnPU4K33Dg@w4dnuOvoJmUe817%jwa&op^UdbI+^~-FI`cw};G13cccSvim%n z*)eygL03UzG``s6dLKr1v6^|OPw!@3fX2zDx7uqd_B>I>5N5O<4>MY+Wnv6RPj>f0 z26r!ndvf8Z+^H*fFUWYO?_N06v#Aq1#WnYb#AI&43vmTrLfzXH@NUHIJsm>AZ@fY+D0GkB9+7C#v{_}5kE@g!b{(6bZO>pG*V=V#iq`S3TL$Iu5MNwM_~@9c&Ntb0J`hvq zTyoLU+D7;RJNM?EE?Po3)D;su`>06gF~Zu&xeMv!KH0ynrBsKr^5rR=Utdhh42gGV z!bg2b;+8>4+w>vf_+ZcU55ql+Z7Xx%hZfvtCRccn zyT!z%^=c~GGkV(jgS}zC03bQ(d|$V7@{!XOc1|x0<`h=nWf?xF!cLi?zuQ}(TF7h+ z_f&q6@Yh$>&aLsGYnlLZsz--(G~0H{4Khs-ORdwG=_|)(eo9qn{@J2&DDBj zxr~vF_%h#JO^tfd*X%!W^O~Ap+cVp6&qQY9+VV|$T+>gxOIMY+ z$F=UglaYgYcKR-~?Hrq;Cfo~fOBvzAlJ7k7okPA0$hYaR(kUe}%Nt_fM(6kkd-mIN{AO-tj-~JO)-UuL z!8Db4Ixc4>IK4xuO*~Ieh-a)m(qix{CA@}_sB&FzbspqGh6!*iS zoTKcfc8;mhyy(vu-abCaev_NNnwa~_KtDbI(fp#&Gs= zm~Re5?c+*na}xWQRaMcU@|{Pw3_0&%iVdySvDKY-tlvYU%*ju@^G>gqf8*otURD3` z-uaT|^Y1^!KDW!CF|_>Cx|8(f!js>(hQ)C7@3_t{WT)`Bl9rVH!ouD)^qJm zHzNmbiFRaDcqMmN98`D5M!ETU`_PAacCa%1XZR&wq5pHC8J6{dow+-el`SYU=9{Uj zaLc_1twUn>py}Q84EJtj3WVi9lraA zPTlo8;gv{61UYxs#WGcEOWQi91!7w&%zI+80wFR%40BcCpNRWs#*lS``!inhkX10J zEeGW6w5(uq%YpOev%K@>#B#Xu`D4T)WhV(on$^8ldW^V{Ti0W4g=A{1$B5>Kb$w5V z-hFv} zB9Av0>OB=%?~xeJiu%d(N$!ZrXK+vYAYaJU>78-d(F?NTou)>^=osxh(_`I(M`xbq zIRbh2u9DIEAn)Y5HMVmHhwS}3dyedeX^rvsodHlfM))A3g`9tNcooYX_gcM3c6RJ| zZR_v9|6XJ)_n4Z=K8dpz>!wP|ci(Y2{8-R<nUVq}>9hGtG1 z)Yix8tEawa)oFX#S?#2UOaDzn_5>Xn9F!r~9+AkYyeAkdquS<@wmH~yoozwr)X{dk z#nv!R?v8{H&s#laIcLVlaCa!XDXg=~H`rK9#3l9C0hK%wlV@W?S?VG)d)O( zj@JmaOc=PdMZ!#TY^!JL{bM~-f5!oZU|5A4H?;O%fAL`>E7al%g<8zqka@OYB$;(r zMvSsh>&Ti=%ZQwZ!vAvX1L6P33AH?sR~3#Y&(48?BXPzpEk=+u#siU{Srs;nFkfXi zl3ICY8d;GfV_{32VQfk;zSUyZTpj5e7)Ud6L#>j&_eZaEBpEp^X4wOg_Xh@MIALX3 znwG2^e%hYccx`0X)StF{a<7cU<@_k@4LtD|sn?a1A@MEW`bht(fg^^ILtR5HKBFpb zL?GlnkLObFc)!GXy8S<($H>iz_;U60b9nwTVOHSDc2oG|4|(HAmu*zF`}|dLXYgFg zv5W^J^Ngw&%|PhaIf1Gdy}Sx?F6AdSu8))jU+I`X zt5wlWrb$v>GU(Cej)mT_lzG-d|4-w{*X!{=ksvf29T@1$_EUHN6MwS0zYl{5@(Vi{PFmggkL|Odi&S6zryp}D$aLv_Bfqi20uT)Vt!%XJr>%1@Y^)T zwo3b3hLPsMooxhZJ0q#ILh8Dq-6Bl}5M>AJ zkHjNG$)OGH@j-dMwIeAfG*;q`$O(BV$6qu$w+l|a6d=CL!@M^ccTdeZvf zZ5;VoJbUcY^^q@AUU1se?TV&gsAWIANg#jPC254+Z>o_g^Uv!e-4DG&-5!eEkNjua zea6g@HVn07`JQOckh(%U?Ut5R|AeZalqY4y`9m!!^;PXsULtX5o1_HkLzMH*o%9R( z^D@=1ZcypZFmB}8{Kq}#2a%bOm;Nx;V}!;cbkK0zDOc62v6FL(2v^< z(FF>Qoo{)0t+?f3aT4pFhSo)`iPRrek|Z=qytT;PXxxS${fmDS{^Dsr zZMTRoeu?MxZ~n^$!V?1MGWwzideE&&=t3~ml7T#QGd>uBCn)3Ft)54JCpw=#sQO}( z&o0|AzB6{53ja>)Qqo(Y2O)L-a_2`rLJx~lN}46JtZp1KZ4+A4Enx z`armbekyccYSRdRk}RP;^aSNEZ{1BkCYX#Kpv-n;JW2XkicQ1wmnu0`>#<`70 zCK-p|$zAZ#k)Z@X{nRewPSTpj4Blxn zor%8>jPuQpn7+_hu{+|7`D6DGSKJd9hFZ#V2i}kKKN$9t#)l5@pf4J*#Z2QWY`-#o z{~A8S_*SbC3_WfJL-!{bsV%!m&n-@^@xjoU^sO}E1%+<%1!vP|7PivRe3 zcI$1Rk^W~H_qBZr zP4T~77nby+DZ@v8asJTxK7Z)TX`|Ois!5ydLyw&wRO!#XWHxy`>dIrSE01rt25g$( zJ@qplPBhj>&S!j){1X|kkjKJY+T+7G+rVUZ)Tldw(F z&V-H|%8(!G_CQWu3$oWDd^>Z(`UrMv%Y%9Mg)N`dYktJ?J=k`fI>nj6a3=jo(jLBB zmvtj$`2xRd4NMERiCl)Uy+j@t5S~bQ-PB;)S1Big->P315!$65DU8b^hqDP6+I_hN zkzcMDIP!BzhkrTsdq&bgmqk8}fneLe^85+=`3SoWNjK(6!aRZd8Owrg1*Cfj{~V*H zU2KC{jE~*eE@Jy-1@3D%;k}U+YI*d~wb*j6b}(i}MtpauT^DQL8G&$X*0c+;QN`|g zy8URM(5~$s$KDy`54AY9j_8#CLz|2u{uSt%co|>d?Fj1o=pp(yc8KH^j||lE+{(JR zeOA`v?a97iyO*$3e-Ql{YR$^JpML*J$Mv5LbSC?2+LaAPUr3=Hr4D8e^iU_s+a&(g z^e_#70 z(9n73K&S9DQEWltCkh?NR$}m#M9~GR{?u(&;IVd@V_D&~@O*8%0i7oFKIh_jtQ~zK zzYWGP;q{17>m!fB?-3WTkI-kZBXXD@gj&WT!<&V7&>{Y>K-Y*btdB@LNF4fwvh#AV zb%ieM6m&?=SR*&o(t#{Xns>=pbp3O*iOiu!B6=`g}i zcbq@6rc3I6{>Y$0zwP%A`Wx-=dW9adyUTMXzw`M`<##2&8~Ek%yOZC2{2t}^Gk(9~ z_gj8@`L*!-sN2pXOdkBs=Qow#mHcktm&fl;e)sWvl;6+z{fggj`R(P`!tbN7%EP>` zuFrgw-_Q8{s;*D!VBQxZjNi}r{VJrwj4*XQk9K7oNv7U1?=7K^Wrd$^&&F1gbSI1R zE9B?%;`|a>J7pa7X@qgCjHb1g<1#hr9UEXjo1`*$fNY(AJET&K40Wqkk6<` zg7l}Gao2#8!4P;ESO;DS)`N^yNxj5v#4UAA$TDR7Z8iN>%weJHi)&la;jMFRn}#u7 z=^mMnbU%R2d!LMpw!K7MWUf>h{P2CL%MYb4*pODRI+A6i$XMIz4Ho(mgZCTBLFP5& zPajkDPY$n-7~%Ep|5Y+@1pBk|48IW>1^<~_jWvSU1Hq6NyDllwC%QtH=giCQq#OyC zH3!2VZb|TaBHx}!Jj2&IaEV9H=8P zIEk@ncBrM>wx9nu={+M-TFp>sY&H430S(v>NpFJ1ptO;+*9zRb3Hv_ypWshOCvqV3 z_-<%CgLqLclrvuKN~_3h)} ztN7*l8TNAtUrZY%5&nJh@lvLTGEDzkRi6P<>W8px6pVYG#dV#ND2Jt_Kk_a zucSMK7ScO%pvp&vM1GFbk0sqXr1NBjT7$GFGMXeZwI*yt{;f3FjLuG(xu!#YV5QFB<*UP67Q*fjQG?+ed_kHSykr3XF=T_*gg zvg`FV%9voM`H(b>wJ~W}qfmA3;F;8Us?<3!CUPn1BrnFA);sOICKEQ2_#*R?kHgEP zNm|Bkv*R&mNi*$y_mQvD-adGLAK~*DLm4|;EcA=$3(NmFbNKrs-Z1?#{QLHVz}x7f z^$`!c3p_lEdH*tOFK2B*#^MP1W~1jAhdadIj9>Ci@W0*8T5LGcxIf}NyL%b^jyNko z1C%w9tCtj(G8ZxY{0hp;OUwObdF9KCN^VOsjH~iWN=hqKK!N|7`PX0PFI{|l!IBDz zpI@p|E-P5RJnyywq}G zU>K5>;%(`Qid##U-ddhlLc{WJabCWEN#1hR?o0EEp~5gK%2%joSK(f=qP)DIq{4s2 z*ZhlDEL~bqPS_=vTw1nbadFX-OK)FZT5{{%81-rx=zSxDA9FPW-EYkB^8?Yd#wz~! z3AlxaOA3pM^KZ&4UQw|8)=QQbtt^=ICI8pH<`F%N(zwqZr=IBcFMoq?1NjQKG5CX(+~DSzexZk7B|ppCLsn3Ko=V29S2B ze||+~$%{#(md;HCdvUb?)3{;>=hxYdzA^OVPNS1h(CNq5gqr78e(YuGWksF7jV+TS2*>zV9zxO8>a61g-6a zYE^J!0ov(Q5y1kC|gkyO9Oek%OCpKZ)>Yl zl)pj0iBCDR#x>yuscS6RgKZhxw6$fFnA$ykL20@m&Qs7BCbPlq`|z#5^AoS5Htz+-twykJx+OF`&yKaS;V>5ZY-zG9Apf&yPczl zr%jzxurzN)am7&9hz|I2`HGT?qGbhx#)x~ol<`siUFp9|jnT@C$}e5ALVC6C)JT2- zJ(|u(S5U&`$1K3D8(9*rC=eTA{yilXd6n8En4yC+oJf*F%zTp|(Iu6AsOL-YHt%1>9>o!uA7 zkVjhC<@p((5Kwq=VewMq>SbjWFlhObJoMr6f;(4;a0*$r7MzWpGyGFzDnGwSXhsVz zFRJv*;E)Ha%a;!_T@;tt&jqNjq9vvI6oYM4ipnb>ya+;c^9Tp?P{-2fi&l{8j)D?N zySU&s$RQZ=(A4?s!Obr^ao!3Y)zHtDYLGwZp6TVnV4bCGUix@(IDZb3Qv@9zctTT zKsZ5zX+yDTlgEs~?z3ha*~F{j+1E!(`jJ(nzxgsYO$)7;5mXhQMvW)T8b;cxXkr5znK0nQykyVnfJMD08H!t1p zQ^!Ab{&6lI$1C>;MGwsc@3q?z$YUKf%~}rurZmZEwTYXS;oNOIDgPvL zzemDJ1YIKc$s+fYD1E5xZ*j*nMwy8|%WqDm2eOAL|J-dg91XdWN7|s=`qSrPpESnp zNiZ7Yef0^(`|-1JzmP!j@5rCw^3nW0QKp7#2RChQw>$qtmn^v3EkT8!C~NLGe{WiM zxo-DxvN>FR-88uK>HQ6SK11<&9lWmFuy=h{W9o?vuI3w)x z2Tb2&Yq4>eb(3);(F!G3#Z#@1-EDR{Zg<+@-0pn3c0daO(92SrnV4=(Hl_`sVYkGI ztuEVJX2Mp#w>z!deL88~ zI>YUD)9iM;b%Q(nME!K4UUa8D9olxhh&+uNl&6&Om3$l1v>Hugt2vsp3nF#y`nvNU z&h4i8bZGd$5ywq))ApD;o;!i{+ncOCqm9K@{b*yYiKrU;Mk^7F(O2#~YW|Kq-09qP z8!p@}({A~2$3GpO4wuhxY2E$JUDn@Avpc@q?atHfcE@qk><)Lk-D%zKeuf{pqHFk#cG)z^F1OF+cGDex0lNpr+jh@4C$V@}VfDuu>rCt8IO9ns>1-{V z7a2yQ*=cTxH{S3D&5iNKKFeB%g=|^4-?wskut%)rYO#=CkUvA{uB03ne-kG`v(W37 z%>@$YtEvseF1<4?-!L9Dtzf)SWBLtahiN?$Z@ex}W`~>Ojbq~6?6IDYH=gt0{Da5Z z5pV4G(6GiQ-tv9%Mz>|X5pR5IRpRay`W_b2Hp-vppfeD$`mSF7mTH6zhecrQiAM;vF2K&9`xce-NDdB^0 z+e|zS@z(wXrY9Ee{ZfZc`O_{Hc>aN99k~R_geLK|X&um6s!~u&OL0 zn+2Lm>oE((6oQA(d#sR!h1-Dp5sQSI<2h-{&S-e z^F?In9%JW8T*Xs0KN&wB>ATK)jHBLyt$6N9F`7g|-j_eeiyHa! zjQrUue>&w){qxlC1Xp3Yd!Q*T=z;?wV7!c zdrWJ)N4jaPhi)qFE|c80h(s{UqpjUE*8XquKZRUW%k%RF* z75zHqY~oIrVXzn_r+QOt9UCNmbW9vO&0<`dV{I@E>9Jc?2XNEtc2`SUwf0L{#^vTE z4@>k7rqvK<^qXrvo8rumE#(mrc{$G75NEs^Cjm^HAw&9>{B!3yoNjT)@kzPPJdJV# z>Ew2a^{^Kq`Gd!J)?5(wm~?dlc1WWJz1Djkql(pLudzYo)-Ktd=Wy;V|4La9rFd_g zZ=Rbx2g5h5&opaH&X)H|jn{b+k2!{@J0C>nJ{fa|)-gx&JVkp3Aq; zc_+?%ft81NVJV|voYlxGx(ZN3-ymN*o^$i*D`v(;L=UL7bu;9tiZdD7S!nN&*4Yv# ztMj#S60pP7I_~+D@ zv~@7cZ*$SXGG@e*=UM=o}8F=nIUYsf}eYQa@#C!_XbJ- zIsMfw!}-MjMJn@x0dx9A`G)bBX}#p3Bj%zSJXV9pc*NtwhVWSXJVu=eYrXuz%E4Tb zKU#+Vu{FbvEwTI*y)h|u9=#;CuI_enm*)<5yWRD3hcomK%DbCqxkKm>yL*y#1!{(N zb=j=${-V?CzT=nlEU?)6kG-p0V=iWlyX@0(@BcaZj2X z!_nj}w@~srU-3xBqRdJUHl}H^7|$3wv!0ZkAp*TgInmpNXf>%gDS< zbdy^~hI3!+l0CP3!Z7mX=81caSo7Wdg|xA|JygBS6K!F4eckbke@5LW56ap_ST4zG z?Ru@5Qk%@Q=GchM$*crhczQ>sQ&X`zV`X}hIk{won-II zP5VFNcJtDmPob0_?YCpo*f*Y5Q7_A>)b%Z;kmpDo-H${@e5u32YYXQI9duNZ&%$WP@l={GhPOY zeV8rJqwRafO2V)g6@w@?W;}B110U(OdexY6UL|@Ec2;}gC;g?`V?E|InmyA|T4L$M zaePrxSmnlpp1FS`HI67G^Nh+0gmK#5$)k)Bv)L42gTr zpzgSGrPbt>g@WB)J(4rOW`gph$7=Q(+ayW1#|ok}Jk~L~ug(8dn>;!pb;=a!-1F~VXsm#cjJ8RcTmVc1k+T;(179dsfi`M6C z>cVV;x=^D%vIww2*Tu~zw|lsL6w(+<}U7D=Abare9#bnx#j+~8rYi}MhOO91y;$xe;6F?I2i*6#0PWQ@@x4old%>XGOdJ0)h6d|5RdRgj9o%nut!FIb9j`21g_XNg1V*h{)#?te zZ4zxWy7!LU#m$9qx9!^Kr*_^U)pdcDvKM^K{qqbmF+%wd@Ia;f$G|vu`X+yNU)7__Zm#6d9eXE+hT=vgtpLfdn2h+Lh=cdVU z=f`^4)P>ay7@u(D%QD~aRB)<}@gmNAkg2}x7O`#}m(pb!n`9>cdR!u>PxYkMoxi)D z?y}tO>c^?SV_P}r&AwM{vfIOXvzOvIZ`LRtmf4!)&CPMEaX%v~@eT1Qb!>PgB<_#b z`!*+*@216Frn_C;;qLg|k3km?-Fo>V>oT>*uG{U7<1Wh`K3x1gk5YFcQg@kmp7eZNt;C7pk9ETNICr^jcd?|U zaJvo8klFqCPdqPpjqS?LohQ#xP&}8t=rnnrDq9@sRt1K`QjD~PY-JJ3m>Qc`itIn7 zS$DB+S;&6F&FpVD624%Yc9u~`FWKNk=4K8Z6Hern=mUbr^i_}H^mJav}r zSifrBh5L;-Yg4?@6ldXX7VT0ez1_%_Jfm~j3)11zZ0mWiF>fObh4DMQvOB?6wfup9 zq{)ypUmB$2d(W6J&`8Z5>#aEBn8$iG&UnykZHtrr4BXFnCA^l4(TtE~?T=#vmzO)6 zEm^?qu$YOii<1S+Cxs@+GkBMrKi%@jUeDb12<2TmSl+ekgkzixSnFkmG7H92>H+IEwgghK)y%ld9jbk#qLwNm$ z{89U!@UUY&`J6Rarwb>~Q|l{CMjtb`z|97a#XNMM5UggPaFkTEnxu2Jm#o)hTg;hn zsv{M(XSPi3RR>Ue`lMMcX`=SenX=YCEA1||e9XSI%6B-M!mXp|miIYl|0j{>*A1b6 zguGj^On4TU^q|Go=Br-W?cT<^glRp;I*4*}+aKZ2o8yVX9_Kq=qs_G5@=6!L-D~;@ zXTSebugvm~dW}6EE8;cYQEvJ&;hmmo#93$e)7o{^DJp{($a+!0Vq$i)waqk^%4uAT za{Mgn!cA36cU|0W-QP~M$>&HJj;=DkVosS(R#(W1%Ytgpt6uX-uehI;mTC4%M~SF_ zk0pS{Q2*TJoQ~VAr`_>){195A^Zv6`wb(P=VQRT#s{Rj^=dQckoh{`NV2=^WDP%v< znt^T@e%|Pwi@9lc*NG)5Wava*>$0`}be|PEQ7%tRyZK>gC88RyjH%{DbJ+bv&9Y+F zZ&sVfyyhETj&P{;whflm#Uh+Yk<&!R>CluZWe|}v)LQVV&dy4JxYX(Y62IK#xaGzj?smJ| zU^p3d=R=ntlu>uMyRO5Aia(z-P4jpzXQm|H zey|vv^KZlhbHNI*0;~i#fUChBU=VBqC7(7syw?s-mh*KyF9xf@b>KR1D=6`&bGA^z zH-ZvAuTF;-gDM=9@bq7Owx$ML2W|l8a29tX*au2JzF+I`04U*&;AU{ccKy5-lyHMH z^(sCn`D_FwJmV!DJ`a@euyrQ90c)sS>sK%r;5?e7AG&NANpkmpsP)OUmJuLXra zzTfEQ>pRM>B|HF1_(CunOx%qegE?Rh7z7u98^ML(esB@k4d#Nmd*CBj3;x1-D%b=H zUB`Y89|Pvo(qMH-Zwr3-p0) zU<#Png8YCB!SP@*=m)oh>EJPN66lK{4`4bN05ieq;5;xB+yKr3o4_ov8=M1Lt+X$g z3eE%fgE`>FHrf}Q)K2??J3wi_{h)+rzOTcp!A1BN{)Ki2w}Sa#Jy-~)cA)RT09XcQ zgB9Q+uu}Yo(Fg4tD+Zvo-s{%ukRTuo4V|9iM%+#`-<= z>!%&Td7zY24N7>U9o}V!_u1ho13G>gm`uD4pros}!&8lZ<(~!qVl;B%)&6eqn3Qkz zujvKXfqh^dDDjRZ=UKSXnzhU`4@u{zTFP*vco5(>Ugt2p?@F(7z@V+y%<>g%|d(nT~%4DB*n<^{-h3CV#PiO)i)Y z=7ZBgp?k9(-e`x&{cCE#UQpG0a{roj_-nwe5)YK{4zLz~;gtS0 zyTR3-4YcO;ukr6?e7Kr+1)IQ0 z;DWjRYcjwJFaU0h%S+y!=n>HmxV1i)I{QfmzZ~@o`t_C~gIoJhm2fM+*0@8zBVCvh%zX^E(H-m-XtZ(

o#K0MD@q{FL0iEn&YKi>{YKHXptoc=u> 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 z

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

^SxS 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�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 G`2PU_Q{dSE literal 0 HcmV?d00001 diff --git a/cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/public/json/autolink.h b/cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/public/json/autolink.h new file mode 100644 index 000000000..37c9258ed --- /dev/null +++ b/cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/public/json/autolink.h @@ -0,0 +1,19 @@ +#ifndef JSON_AUTOLINK_H_INCLUDED +# define JSON_AUTOLINK_H_INCLUDED + +# include "config.h" + +# ifdef JSON_IN_CPPTL +# include +# endif + +# if !defined(JSON_NO_AUTOLINK) && !defined(JSON_DLL_BUILD) && !defined(JSON_IN_CPPTL) +# define CPPTL_AUTOLINK_NAME "json" +# undef CPPTL_AUTOLINK_DLL +# ifdef JSON_DLL +# define CPPTL_AUTOLINK_DLL +# endif +# include "autolink.h" +# endif + +#endif // JSON_AUTOLINK_H_INCLUDED diff --git a/cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/public/json/config.h b/cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/public/json/config.h new file mode 100644 index 000000000..5d334cbc5 --- /dev/null +++ b/cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/public/json/config.h @@ -0,0 +1,43 @@ +#ifndef JSON_CONFIG_H_INCLUDED +# define JSON_CONFIG_H_INCLUDED + +/// If defined, indicates that json library is embedded in CppTL library. +//# define JSON_IN_CPPTL 1 + +/// If defined, indicates that json may leverage CppTL library +//# define JSON_USE_CPPTL 1 +/// If defined, indicates that cpptl vector based map should be used instead of std::map +/// as Value container. +//# define JSON_USE_CPPTL_SMALLMAP 1 +/// If defined, indicates that Json specific container should be used +/// (hash table & simple deque container with customizable allocator). +/// THIS FEATURE IS STILL EXPERIMENTAL! +//# define JSON_VALUE_USE_INTERNAL_MAP 1 +/// Force usage of standard new/malloc based allocator instead of memory pool based allocator. +/// The memory pools allocator used optimization (initializing Value and ValueInternalLink +/// as if it was a POD) that may cause some validation tool to report errors. +/// Only has effects if JSON_VALUE_USE_INTERNAL_MAP is defined. +//# define JSON_USE_SIMPLE_INTERNAL_ALLOCATOR 1 + +/// If defined, indicates that Json use exception to report invalid type manipulation +/// instead of C assert macro. +# define JSON_USE_EXCEPTION 1 + +# ifdef JSON_IN_CPPTL +# include +# ifndef JSON_USE_CPPTL +# define JSON_USE_CPPTL 1 +# endif +# endif + +# ifdef JSON_IN_CPPTL +# define JSON_API CPPTL_API +# elif defined(JSON_DLL_BUILD) +# define JSON_API __declspec(dllexport) +# elif defined(JSON_DLL) +# define JSON_API __declspec(dllimport) +# else +# define JSON_API +# endif + +#endif // JSON_CONFIG_H_INCLUDED diff --git a/cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/public/json/features.h b/cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/public/json/features.h new file mode 100644 index 000000000..5a9adec11 --- /dev/null +++ b/cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/public/json/features.h @@ -0,0 +1,42 @@ +#ifndef CPPTL_JSON_FEATURES_H_INCLUDED +# define CPPTL_JSON_FEATURES_H_INCLUDED + +# include "forwards.h" + +namespace Json { + + /** \brief Configuration passed to reader and writer. + * This configuration object can be used to force the Reader or Writer + * to behave in a standard conforming way. + */ + class JSON_API Features + { + public: + /** \brief A configuration that allows all features and assumes all strings are UTF-8. + * - C & C++ comments are allowed + * - Root object can be any JSON value + * - Assumes Value strings are encoded in UTF-8 + */ + static Features all(); + + /** \brief A configuration that is strictly compatible with the JSON specification. + * - Comments are forbidden. + * - Root object must be either an array or an object value. + * - Assumes Value strings are encoded in UTF-8 + */ + static Features strictMode(); + + /** \brief Initialize the configuration like JsonConfig::allFeatures; + */ + Features(); + + /// \c true if comments are allowed. Default: \c true. + bool allowComments_; + + /// \c true if root must be either an array or an object value. Default: \c false. + bool strictRoot_; + }; + +} // namespace Json + +#endif // CPPTL_JSON_FEATURES_H_INCLUDED diff --git a/cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/public/json/forwards.h b/cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/public/json/forwards.h new file mode 100644 index 000000000..d0ce8300c --- /dev/null +++ b/cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/public/json/forwards.h @@ -0,0 +1,39 @@ +#ifndef JSON_FORWARDS_H_INCLUDED +# define JSON_FORWARDS_H_INCLUDED + +# include "config.h" + +namespace Json { + + // writer.h + class FastWriter; + class StyledWriter; + + // reader.h + class Reader; + + // features.h + class Features; + + // value.h + typedef int Int; + typedef unsigned int UInt; + class StaticString; + class Path; + class PathArgument; + class Value; + class ValueIteratorBase; + class ValueIterator; + class ValueConstIterator; +#ifdef JSON_VALUE_USE_INTERNAL_MAP + class ValueAllocator; + class ValueMapAllocator; + class ValueInternalLink; + class ValueInternalArray; + class ValueInternalMap; +#endif // #ifdef JSON_VALUE_USE_INTERNAL_MAP + +} // namespace Json + + +#endif // JSON_FORWARDS_H_INCLUDED diff --git a/cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/public/json/json.h b/cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/public/json/json.h new file mode 100644 index 000000000..c71ed65ab --- /dev/null +++ b/cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/public/json/json.h @@ -0,0 +1,10 @@ +#ifndef JSON_JSON_H_INCLUDED +# define JSON_JSON_H_INCLUDED + +# include "autolink.h" +# include "value.h" +# include "reader.h" +# include "writer.h" +# include "features.h" + +#endif // JSON_JSON_H_INCLUDED diff --git a/cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/public/json/reader.h b/cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/public/json/reader.h new file mode 100644 index 000000000..ee1d6a244 --- /dev/null +++ b/cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/public/json/reader.h @@ -0,0 +1,196 @@ +#ifndef CPPTL_JSON_READER_H_INCLUDED +# define CPPTL_JSON_READER_H_INCLUDED + +# include "features.h" +# include "value.h" +# include +# include +# include +# include + +namespace Json { + + /** \brief Unserialize a JSON document into a Value. + * + */ + class JSON_API Reader + { + public: + typedef char Char; + typedef const Char *Location; + + /** \brief Constructs a Reader allowing all features + * for parsing. + */ + Reader(); + + /** \brief Constructs a Reader allowing the specified feature set + * for parsing. + */ + Reader( const Features &features ); + + /** \brief Read a Value from a JSON document. + * \param document UTF-8 encoded string containing the document to read. + * \param root [out] Contains the root value of the document if it was + * successfully parsed. + * \param collectComments \c true to collect comment and allow writing them back during + * serialization, \c false to discard comments. + * This parameter is ignored if Features::allowComments_ + * is \c false. + * \return \c true if the document was successfully parsed, \c false if an error occurred. + */ + bool parse( const std::string &document, + Value &root, + bool collectComments = true ); + + /** \brief Read a Value from a JSON document. + * \param document UTF-8 encoded string containing the document to read. + * \param root [out] Contains the root value of the document if it was + * successfully parsed. + * \param collectComments \c true to collect comment and allow writing them back during + * serialization, \c false to discard comments. + * This parameter is ignored if Features::allowComments_ + * is \c false. + * \return \c true if the document was successfully parsed, \c false if an error occurred. + */ + bool parse( const char *beginDoc, const char *endDoc, + Value &root, + bool collectComments = true ); + + /// \brief Parse from input stream. + /// \see Json::operator>>(std::istream&, Json::Value&). + bool parse( std::istream &is, + Value &root, + bool collectComments = true ); + + /** \brief Returns a user friendly string that list errors in the parsed document. + * \return Formatted error message with the list of errors with their location in + * the parsed document. An empty string is returned if no error occurred + * during parsing. + */ + std::string getFormatedErrorMessages() const; + + private: + enum TokenType + { + tokenEndOfStream = 0, + tokenObjectBegin, + tokenObjectEnd, + tokenArrayBegin, + tokenArrayEnd, + tokenString, + tokenNumber, + tokenTrue, + tokenFalse, + tokenNull, + tokenArraySeparator, + tokenMemberSeparator, + tokenComment, + tokenError + }; + + class Token + { + public: + TokenType type_; + Location start_; + Location end_; + }; + + class ErrorInfo + { + public: + Token token_; + std::string message_; + Location extra_; + }; + + typedef std::deque Errors; + + bool expectToken( TokenType type, Token &token, const char *message ); + bool readToken( Token &token ); + void skipSpaces(); + bool match( Location pattern, + int patternLength ); + bool readComment(); + bool readCStyleComment(); + bool readCppStyleComment(); + bool readString(); + void readNumber(); + bool readValue(); + bool readObject( Token &token ); + bool readArray( Token &token ); + bool decodeNumber( Token &token ); + bool decodeString( Token &token ); + bool decodeString( Token &token, std::string &decoded ); + bool decodeDouble( Token &token ); + bool decodeUnicodeCodePoint( Token &token, + Location ¤t, + Location end, + unsigned int &unicode ); + bool decodeUnicodeEscapeSequence( Token &token, + Location ¤t, + Location end, + unsigned int &unicode ); + bool addError( const std::string &message, + Token &token, + Location extra = 0 ); + bool recoverFromError( TokenType skipUntilToken ); + bool addErrorAndRecover( const std::string &message, + Token &token, + TokenType skipUntilToken ); + void skipUntilSpace(); + Value ¤tValue(); + Char getNextChar(); + void getLocationLineAndColumn( Location location, + int &line, + int &column ) const; + std::string getLocationLineAndColumn( Location location ) const; + void addComment( Location begin, + Location end, + CommentPlacement placement ); + void skipCommentTokens( Token &token ); + + typedef std::stack Nodes; + Nodes nodes_; + Errors errors_; + std::string document_; + Location begin_; + Location end_; + Location current_; + Location lastValueEnd_; + Value *lastValue_; + std::string commentsBefore_; + Features features_; + bool collectComments_; + }; + + /** \brief Read from 'sin' into 'root'. + + Always keep comments from the input JSON. + + This can be used to read a file into a particular sub-object. + For example: + \code + Json::Value root; + cin >> root["dir"]["file"]; + cout << root; + \endcode + Result: + \verbatim + { + "dir": { + "file": { + // The input stream JSON would be nested here. + } + } + } + \endverbatim + \throw std::exception on parse error. + \see Json::operator<<() + */ + std::istream& operator>>( std::istream&, Value& ); + +} // namespace Json + +#endif // CPPTL_JSON_READER_H_INCLUDED diff --git a/cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/public/json/value.h b/cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/public/json/value.h new file mode 100644 index 000000000..912b8304f --- /dev/null +++ b/cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/public/json/value.h @@ -0,0 +1,1069 @@ +#ifndef CPPTL_JSON_H_INCLUDED +# define CPPTL_JSON_H_INCLUDED + +# include "forwards.h" +# include +# include + +# ifndef JSON_USE_CPPTL_SMALLMAP +# include +# else +# include +# endif +# ifdef JSON_USE_CPPTL +# include +# endif + +/** \brief JSON (JavaScript Object Notation). + */ +namespace Json { + + /** \brief Type of the value held by a Value object. + */ + enum ValueType + { + nullValue = 0, ///< 'null' value + intValue, ///< signed integer value + uintValue, ///< unsigned integer value + realValue, ///< double value + stringValue, ///< UTF-8 string value + booleanValue, ///< bool value + arrayValue, ///< array value (ordered list) + objectValue ///< object value (collection of name/value pairs). + }; + + enum CommentPlacement + { + commentBefore = 0, ///< a comment placed on the line before a value + commentAfterOnSameLine, ///< a comment just after a value on the same line + commentAfter, ///< a comment on the line after a value (only make sense for root value) + numberOfCommentPlacement + }; + +//# ifdef JSON_USE_CPPTL +// typedef CppTL::AnyEnumerator EnumMemberNames; +// typedef CppTL::AnyEnumerator EnumValues; +//# endif + + /** \brief Lightweight wrapper to tag static string. + * + * Value constructor and objectValue member assignment takes advantage of the + * StaticString and avoid the cost of string duplication when storing the + * string or the member name. + * + * Example of usage: + * \code + * Json::Value aValue( StaticString("some text") ); + * Json::Value object; + * static const StaticString code("code"); + * object[code] = 1234; + * \endcode + */ + class JSON_API StaticString + { + public: + explicit StaticString( const char *czstring ) + : str_( czstring ) + { + } + + operator const char *() const + { + return str_; + } + + const char *c_str() const + { + return str_; + } + + private: + const char *str_; + }; + + /** \brief Represents a JSON value. + * + * This class is a discriminated union wrapper that can represents a: + * - signed integer [range: Value::minInt - Value::maxInt] + * - unsigned integer (range: 0 - Value::maxUInt) + * - double + * - UTF-8 string + * - boolean + * - 'null' + * - an ordered list of Value + * - collection of name/value pairs (javascript object) + * + * The type of the held value is represented by a #ValueType and + * can be obtained using type(). + * + * values of an #objectValue or #arrayValue can be accessed using operator[]() methods. + * Non const methods will automatically create the a #nullValue element + * if it does not exist. + * The sequence of an #arrayValue will be automatically resize and initialized + * with #nullValue. resize() can be used to enlarge or truncate an #arrayValue. + * + * The get() methods can be used to obtains default value in the case the required element + * does not exist. + * + * It is possible to iterate over the list of a #objectValue values using + * the getMemberNames() method. + */ + class JSON_API Value + { + friend class ValueIteratorBase; +# ifdef JSON_VALUE_USE_INTERNAL_MAP + friend class ValueInternalLink; + friend class ValueInternalMap; +# endif + public: + typedef std::vector Members; + typedef ValueIterator iterator; + typedef ValueConstIterator const_iterator; + typedef Json::UInt UInt; + typedef Json::Int Int; + typedef UInt ArrayIndex; + + static const Value null; + static const Int minInt; + static const Int maxInt; + static const UInt maxUInt; + + private: +#ifndef JSONCPP_DOC_EXCLUDE_IMPLEMENTATION +# ifndef JSON_VALUE_USE_INTERNAL_MAP + class CZString + { + public: + enum DuplicationPolicy + { + noDuplication = 0, + duplicate, + duplicateOnCopy + }; + CZString( int index ); + CZString( const char *cstr, DuplicationPolicy allocate ); + CZString( const CZString &other ); + ~CZString(); + CZString &operator =( const CZString &other ); + bool operator<( const CZString &other ) const; + bool operator==( const CZString &other ) const; + int index() const; + const char *c_str() const; + bool isStaticString() const; + private: + void swap( CZString &other ); + const char *cstr_; + int index_; + }; + + public: +# ifndef JSON_USE_CPPTL_SMALLMAP + typedef std::map ObjectValues; +# else + typedef CppTL::SmallMap ObjectValues; +# endif // ifndef JSON_USE_CPPTL_SMALLMAP +# endif // ifndef JSON_VALUE_USE_INTERNAL_MAP +#endif // ifndef JSONCPP_DOC_EXCLUDE_IMPLEMENTATION + + public: + /** \brief Create a default Value of the given type. + + This is a very useful constructor. + To create an empty array, pass arrayValue. + To create an empty object, pass objectValue. + Another Value can then be set to this one by assignment. + This is useful since clear() and resize() will not alter types. + + Examples: + \code + Json::Value null_value; // null + Json::Value arr_value(Json::arrayValue); // [] + Json::Value obj_value(Json::objectValue); // {} + \endcode + */ + Value( ValueType type = nullValue ); + Value( Int value ); + Value( UInt value ); + Value( double value ); + Value( const char *value ); + Value( const char *beginValue, const char *endValue ); + /** \brief Constructs a value from a static string. + + * Like other value string constructor but do not duplicate the string for + * internal storage. The given string must remain alive after the call to this + * constructor. + * Example of usage: + * \code + * Json::Value aValue( StaticString("some text") ); + * \endcode + */ + Value( const StaticString &value ); + Value( const std::string &value ); +# ifdef JSON_USE_CPPTL + Value( const CppTL::ConstString &value ); +# endif + Value( bool value ); + Value( const Value &other ); + ~Value(); + + Value &operator=( const Value &other ); + /// Swap values. + /// \note Currently, comments are intentionally not swapped, for + /// both logic and efficiency. + void swap( Value &other ); + + ValueType type() const; + + bool operator <( const Value &other ) const; + bool operator <=( const Value &other ) const; + bool operator >=( const Value &other ) const; + bool operator >( const Value &other ) const; + + bool operator ==( const Value &other ) const; + bool operator !=( const Value &other ) const; + + int compare( const Value &other ); + + const char *asCString() const; + std::string asString() const; +# ifdef JSON_USE_CPPTL + CppTL::ConstString asConstString() const; +# endif + Int asInt() const; + UInt asUInt() const; + double asDouble() const; + bool asBool() const; + + bool isNull() const; + bool isBool() const; + bool isInt() const; + bool isUInt() const; + bool isIntegral() const; + bool isDouble() const; + bool isNumeric() const; + bool isString() const; + bool isArray() const; + bool isObject() const; + + bool isConvertibleTo( ValueType other ) const; + + /// Number of values in array or object + UInt size() const; + + /// \brief Return true if empty array, empty object, or null; + /// otherwise, false. + bool empty() const; + + /// Return isNull() + bool operator!() const; + + /// Remove all object members and array elements. + /// \pre type() is arrayValue, objectValue, or nullValue + /// \post type() is unchanged + void clear(); + + /// Resize the array to size elements. + /// New elements are initialized to null. + /// May only be called on nullValue or arrayValue. + /// \pre type() is arrayValue or nullValue + /// \post type() is arrayValue + void resize( UInt size ); + + /// Access an array element (zero based index ). + /// If the array contains less than index element, then null value are inserted + /// in the array so that its size is index+1. + /// (You may need to say 'value[0u]' to get your compiler to distinguish + /// this from the operator[] which takes a string.) + Value &operator[]( UInt index ); + /// Access an array element (zero based index ) + /// (You may need to say 'value[0u]' to get your compiler to distinguish + /// this from the operator[] which takes a string.) + const Value &operator[]( UInt index ) const; + /// If the array contains at least index+1 elements, returns the element value, + /// otherwise returns defaultValue. + Value get( UInt index, + const Value &defaultValue ) const; + /// Return true if index < size(). + bool isValidIndex( UInt index ) const; + /// \brief Append value to array at the end. + /// + /// Equivalent to jsonvalue[jsonvalue.size()] = value; + Value &append( const Value &value ); + + /// Access an object value by name, create a null member if it does not exist. + Value &operator[]( const char *key ); + /// Access an object value by name, returns null if there is no member with that name. + const Value &operator[]( const char *key ) const; + /// Access an object value by name, create a null member if it does not exist. + Value &operator[]( const std::string &key ); + /// Access an object value by name, returns null if there is no member with that name. + const Value &operator[]( const std::string &key ) const; + /** \brief Access an object value by name, create a null member if it does not exist. + + * If the object as no entry for that name, then the member name used to store + * the new entry is not duplicated. + * Example of use: + * \code + * Json::Value object; + * static const StaticString code("code"); + * object[code] = 1234; + * \endcode + */ + Value &operator[]( const StaticString &key ); +# ifdef JSON_USE_CPPTL + /// Access an object value by name, create a null member if it does not exist. + Value &operator[]( const CppTL::ConstString &key ); + /// Access an object value by name, returns null if there is no member with that name. + const Value &operator[]( const CppTL::ConstString &key ) const; +# endif + /// Return the member named key if it exist, defaultValue otherwise. + Value get( const char *key, + const Value &defaultValue ) const; + /// Return the member named key if it exist, defaultValue otherwise. + Value get( const std::string &key, + const Value &defaultValue ) const; +# ifdef JSON_USE_CPPTL + /// Return the member named key if it exist, defaultValue otherwise. + Value get( const CppTL::ConstString &key, + const Value &defaultValue ) const; +# endif + /// \brief Remove and return the named member. + /// + /// Do nothing if it did not exist. + /// \return the removed Value, or null. + /// \pre type() is objectValue or nullValue + /// \post type() is unchanged + Value removeMember( const char* key ); + /// Same as removeMember(const char*) + Value removeMember( const std::string &key ); + + /// Return true if the object has a member named key. + bool isMember( const char *key ) const; + /// Return true if the object has a member named key. + bool isMember( const std::string &key ) const; +# ifdef JSON_USE_CPPTL + /// Return true if the object has a member named key. + bool isMember( const CppTL::ConstString &key ) const; +# endif + + /// \brief Return a list of the member names. + /// + /// If null, return an empty list. + /// \pre type() is objectValue or nullValue + /// \post if type() was nullValue, it remains nullValue + Members getMemberNames() const; + +//# ifdef JSON_USE_CPPTL +// EnumMemberNames enumMemberNames() const; +// EnumValues enumValues() const; +//# endif + + /// Comments must be //... or /* ... */ + void setComment( const char *comment, + CommentPlacement placement ); + /// Comments must be //... or /* ... */ + void setComment( const std::string &comment, + CommentPlacement placement ); + bool hasComment( CommentPlacement placement ) const; + /// Include delimiters and embedded newlines. + std::string getComment( CommentPlacement placement ) const; + + std::string toStyledString() const; + + const_iterator begin() const; + const_iterator end() const; + + iterator begin(); + iterator end(); + + private: + Value &resolveReference( const char *key, + bool isStatic ); + +# ifdef JSON_VALUE_USE_INTERNAL_MAP + inline bool isItemAvailable() const + { + return itemIsUsed_ == 0; + } + + inline void setItemUsed( bool isUsed = true ) + { + itemIsUsed_ = isUsed ? 1 : 0; + } + + inline bool isMemberNameStatic() const + { + return memberNameIsStatic_ == 0; + } + + inline void setMemberNameIsStatic( bool isStatic ) + { + memberNameIsStatic_ = isStatic ? 1 : 0; + } +# endif // # ifdef JSON_VALUE_USE_INTERNAL_MAP + + private: + struct CommentInfo + { + CommentInfo(); + ~CommentInfo(); + + void setComment( const char *text ); + + char *comment_; + }; + + //struct MemberNamesTransform + //{ + // typedef const char *result_type; + // const char *operator()( const CZString &name ) const + // { + // return name.c_str(); + // } + //}; + + union ValueHolder + { + Int int_; + UInt uint_; + double real_; + bool bool_; + char *string_; +# ifdef JSON_VALUE_USE_INTERNAL_MAP + ValueInternalArray *array_; + ValueInternalMap *map_; +#else + ObjectValues *map_; +# endif + } value_; + ValueType type_ : 8; + int allocated_ : 1; // Notes: if declared as bool, bitfield is useless. +# ifdef JSON_VALUE_USE_INTERNAL_MAP + unsigned int itemIsUsed_ : 1; // used by the ValueInternalMap container. + int memberNameIsStatic_ : 1; // used by the ValueInternalMap container. +# endif + CommentInfo *comments_; + }; + + + /** \brief Experimental and untested: represents an element of the "path" to access a node. + */ + class PathArgument + { + public: + friend class Path; + + PathArgument(); + PathArgument( UInt index ); + PathArgument( const char *key ); + PathArgument( const std::string &key ); + + private: + enum Kind + { + kindNone = 0, + kindIndex, + kindKey + }; + std::string key_; + UInt index_; + Kind kind_; + }; + + /** \brief Experimental and untested: represents a "path" to access a node. + * + * Syntax: + * - "." => root node + * - ".[n]" => elements at index 'n' of root node (an array value) + * - ".name" => member named 'name' of root node (an object value) + * - ".name1.name2.name3" + * - ".[0][1][2].name1[3]" + * - ".%" => member name is provided as parameter + * - ".[%]" => index is provided as parameter + */ + class Path + { + public: + Path( const std::string &path, + const PathArgument &a1 = PathArgument(), + const PathArgument &a2 = PathArgument(), + const PathArgument &a3 = PathArgument(), + const PathArgument &a4 = PathArgument(), + const PathArgument &a5 = PathArgument() ); + + const Value &resolve( const Value &root ) const; + Value resolve( const Value &root, + const Value &defaultValue ) const; + /// Creates the "path" to access the specified node and returns a reference on the node. + Value &make( Value &root ) const; + + private: + typedef std::vector InArgs; + typedef std::vector Args; + + void makePath( const std::string &path, + const InArgs &in ); + void addPathInArg( const std::string &path, + const InArgs &in, + InArgs::const_iterator &itInArg, + PathArgument::Kind kind ); + void invalidPath( const std::string &path, + int location ); + + Args args_; + }; + + /** \brief Experimental do not use: Allocator to customize member name and string value memory management done by Value. + * + * - makeMemberName() and releaseMemberName() are called to respectively duplicate and + * free an Json::objectValue member name. + * - duplicateStringValue() and releaseStringValue() are called similarly to + * duplicate and free a Json::stringValue value. + */ + class ValueAllocator + { + public: + enum { unknown = (unsigned)-1 }; + + virtual ~ValueAllocator(); + + virtual char *makeMemberName( const char *memberName ) = 0; + virtual void releaseMemberName( char *memberName ) = 0; + virtual char *duplicateStringValue( const char *value, + unsigned int length = unknown ) = 0; + virtual void releaseStringValue( char *value ) = 0; + }; + +#ifdef JSON_VALUE_USE_INTERNAL_MAP + /** \brief Allocator to customize Value internal map. + * Below is an example of a simple implementation (default implementation actually + * use memory pool for speed). + * \code + class DefaultValueMapAllocator : public ValueMapAllocator + { + public: // overridden from ValueMapAllocator + virtual ValueInternalMap *newMap() + { + return new ValueInternalMap(); + } + + virtual ValueInternalMap *newMapCopy( const ValueInternalMap &other ) + { + return new ValueInternalMap( other ); + } + + virtual void destructMap( ValueInternalMap *map ) + { + delete map; + } + + virtual ValueInternalLink *allocateMapBuckets( unsigned int size ) + { + return new ValueInternalLink[size]; + } + + virtual void releaseMapBuckets( ValueInternalLink *links ) + { + delete [] links; + } + + virtual ValueInternalLink *allocateMapLink() + { + return new ValueInternalLink(); + } + + virtual void releaseMapLink( ValueInternalLink *link ) + { + delete link; + } + }; + * \endcode + */ + class JSON_API ValueMapAllocator + { + public: + virtual ~ValueMapAllocator(); + virtual ValueInternalMap *newMap() = 0; + virtual ValueInternalMap *newMapCopy( const ValueInternalMap &other ) = 0; + virtual void destructMap( ValueInternalMap *map ) = 0; + virtual ValueInternalLink *allocateMapBuckets( unsigned int size ) = 0; + virtual void releaseMapBuckets( ValueInternalLink *links ) = 0; + virtual ValueInternalLink *allocateMapLink() = 0; + virtual void releaseMapLink( ValueInternalLink *link ) = 0; + }; + + /** \brief ValueInternalMap hash-map bucket chain link (for internal use only). + * \internal previous_ & next_ allows for bidirectional traversal. + */ + class JSON_API ValueInternalLink + { + public: + enum { itemPerLink = 6 }; // sizeof(ValueInternalLink) = 128 on 32 bits architecture. + enum InternalFlags { + flagAvailable = 0, + flagUsed = 1 + }; + + ValueInternalLink(); + + ~ValueInternalLink(); + + Value items_[itemPerLink]; + char *keys_[itemPerLink]; + ValueInternalLink *previous_; + ValueInternalLink *next_; + }; + + + /** \brief A linked page based hash-table implementation used internally by Value. + * \internal ValueInternalMap is a traditional bucket based hash-table, with a linked + * list in each bucket to handle collision. There is an addional twist in that + * each node of the collision linked list is a page containing a fixed amount of + * value. This provides a better compromise between memory usage and speed. + * + * Each bucket is made up of a chained list of ValueInternalLink. The last + * link of a given bucket can be found in the 'previous_' field of the following bucket. + * The last link of the last bucket is stored in tailLink_ as it has no following bucket. + * Only the last link of a bucket may contains 'available' item. The last link always + * contains at least one element unless is it the bucket one very first link. + */ + class JSON_API ValueInternalMap + { + friend class ValueIteratorBase; + friend class Value; + public: + typedef unsigned int HashKey; + typedef unsigned int BucketIndex; + +# ifndef JSONCPP_DOC_EXCLUDE_IMPLEMENTATION + struct IteratorState + { + IteratorState() + : map_(0) + , link_(0) + , itemIndex_(0) + , bucketIndex_(0) + { + } + ValueInternalMap *map_; + ValueInternalLink *link_; + BucketIndex itemIndex_; + BucketIndex bucketIndex_; + }; +# endif // ifndef JSONCPP_DOC_EXCLUDE_IMPLEMENTATION + + ValueInternalMap(); + ValueInternalMap( const ValueInternalMap &other ); + ValueInternalMap &operator =( const ValueInternalMap &other ); + ~ValueInternalMap(); + + void swap( ValueInternalMap &other ); + + BucketIndex size() const; + + void clear(); + + bool reserveDelta( BucketIndex growth ); + + bool reserve( BucketIndex newItemCount ); + + const Value *find( const char *key ) const; + + Value *find( const char *key ); + + Value &resolveReference( const char *key, + bool isStatic ); + + void remove( const char *key ); + + void doActualRemove( ValueInternalLink *link, + BucketIndex index, + BucketIndex bucketIndex ); + + ValueInternalLink *&getLastLinkInBucket( BucketIndex bucketIndex ); + + Value &setNewItem( const char *key, + bool isStatic, + ValueInternalLink *link, + BucketIndex index ); + + Value &unsafeAdd( const char *key, + bool isStatic, + HashKey hashedKey ); + + HashKey hash( const char *key ) const; + + int compare( const ValueInternalMap &other ) const; + + private: + void makeBeginIterator( IteratorState &it ) const; + void makeEndIterator( IteratorState &it ) const; + static bool equals( const IteratorState &x, const IteratorState &other ); + static void increment( IteratorState &iterator ); + static void incrementBucket( IteratorState &iterator ); + static void decrement( IteratorState &iterator ); + static const char *key( const IteratorState &iterator ); + static const char *key( const IteratorState &iterator, bool &isStatic ); + static Value &value( const IteratorState &iterator ); + static int distance( const IteratorState &x, const IteratorState &y ); + + private: + ValueInternalLink *buckets_; + ValueInternalLink *tailLink_; + BucketIndex bucketsSize_; + BucketIndex itemCount_; + }; + + /** \brief A simplified deque implementation used internally by Value. + * \internal + * It is based on a list of fixed "page", each page contains a fixed number of items. + * Instead of using a linked-list, a array of pointer is used for fast item look-up. + * Look-up for an element is as follow: + * - compute page index: pageIndex = itemIndex / itemsPerPage + * - look-up item in page: pages_[pageIndex][itemIndex % itemsPerPage] + * + * Insertion is amortized constant time (only the array containing the index of pointers + * need to be reallocated when items are appended). + */ + class JSON_API ValueInternalArray + { + friend class Value; + friend class ValueIteratorBase; + public: + enum { itemsPerPage = 8 }; // should be a power of 2 for fast divide and modulo. + typedef Value::ArrayIndex ArrayIndex; + typedef unsigned int PageIndex; + +# ifndef JSONCPP_DOC_EXCLUDE_IMPLEMENTATION + struct IteratorState // Must be a POD + { + IteratorState() + : array_(0) + , currentPageIndex_(0) + , currentItemIndex_(0) + { + } + ValueInternalArray *array_; + Value **currentPageIndex_; + unsigned int currentItemIndex_; + }; +# endif // ifndef JSONCPP_DOC_EXCLUDE_IMPLEMENTATION + + ValueInternalArray(); + ValueInternalArray( const ValueInternalArray &other ); + ValueInternalArray &operator =( const ValueInternalArray &other ); + ~ValueInternalArray(); + void swap( ValueInternalArray &other ); + + void clear(); + void resize( ArrayIndex newSize ); + + Value &resolveReference( ArrayIndex index ); + + Value *find( ArrayIndex index ) const; + + ArrayIndex size() const; + + int compare( const ValueInternalArray &other ) const; + + private: + static bool equals( const IteratorState &x, const IteratorState &other ); + static void increment( IteratorState &iterator ); + static void decrement( IteratorState &iterator ); + static Value &dereference( const IteratorState &iterator ); + static Value &unsafeDereference( const IteratorState &iterator ); + static int distance( const IteratorState &x, const IteratorState &y ); + static ArrayIndex indexOf( const IteratorState &iterator ); + void makeBeginIterator( IteratorState &it ) const; + void makeEndIterator( IteratorState &it ) const; + void makeIterator( IteratorState &it, ArrayIndex index ) const; + + void makeIndexValid( ArrayIndex index ); + + Value **pages_; + ArrayIndex size_; + PageIndex pageCount_; + }; + + /** \brief Experimental: do not use. Allocator to customize Value internal array. + * Below is an example of a simple implementation (actual implementation use + * memory pool). + \code +class DefaultValueArrayAllocator : public ValueArrayAllocator +{ +public: // overridden from ValueArrayAllocator + virtual ~DefaultValueArrayAllocator() + { + } + + virtual ValueInternalArray *newArray() + { + return new ValueInternalArray(); + } + + virtual ValueInternalArray *newArrayCopy( const ValueInternalArray &other ) + { + return new ValueInternalArray( other ); + } + + virtual void destruct( ValueInternalArray *array ) + { + delete array; + } + + virtual void reallocateArrayPageIndex( Value **&indexes, + ValueInternalArray::PageIndex &indexCount, + ValueInternalArray::PageIndex minNewIndexCount ) + { + ValueInternalArray::PageIndex newIndexCount = (indexCount*3)/2 + 1; + if ( minNewIndexCount > newIndexCount ) + newIndexCount = minNewIndexCount; + void *newIndexes = realloc( indexes, sizeof(Value*) * newIndexCount ); + if ( !newIndexes ) + throw std::bad_alloc(); + indexCount = newIndexCount; + indexes = static_cast( newIndexes ); + } + virtual void releaseArrayPageIndex( Value **indexes, + ValueInternalArray::PageIndex indexCount ) + { + if ( indexes ) + free( indexes ); + } + + virtual Value *allocateArrayPage() + { + return static_cast( malloc( sizeof(Value) * ValueInternalArray::itemsPerPage ) ); + } + + virtual void releaseArrayPage( Value *value ) + { + if ( value ) + free( value ); + } +}; + \endcode + */ + class JSON_API ValueArrayAllocator + { + public: + virtual ~ValueArrayAllocator(); + virtual ValueInternalArray *newArray() = 0; + virtual ValueInternalArray *newArrayCopy( const ValueInternalArray &other ) = 0; + virtual void destructArray( ValueInternalArray *array ) = 0; + /** \brief Reallocate array page index. + * Reallocates an array of pointer on each page. + * \param indexes [input] pointer on the current index. May be \c NULL. + * [output] pointer on the new index of at least + * \a minNewIndexCount pages. + * \param indexCount [input] current number of pages in the index. + * [output] number of page the reallocated index can handle. + * \b MUST be >= \a minNewIndexCount. + * \param minNewIndexCount Minimum number of page the new index must be able to + * handle. + */ + virtual void reallocateArrayPageIndex( Value **&indexes, + ValueInternalArray::PageIndex &indexCount, + ValueInternalArray::PageIndex minNewIndexCount ) = 0; + virtual void releaseArrayPageIndex( Value **indexes, + ValueInternalArray::PageIndex indexCount ) = 0; + virtual Value *allocateArrayPage() = 0; + virtual void releaseArrayPage( Value *value ) = 0; + }; +#endif // #ifdef JSON_VALUE_USE_INTERNAL_MAP + + + /** \brief base class for Value iterators. + * + */ + class ValueIteratorBase + { + public: + typedef unsigned int size_t; + typedef int difference_type; + typedef ValueIteratorBase SelfType; + + ValueIteratorBase(); +#ifndef JSON_VALUE_USE_INTERNAL_MAP + explicit ValueIteratorBase( const Value::ObjectValues::iterator ¤t ); +#else + ValueIteratorBase( const ValueInternalArray::IteratorState &state ); + ValueIteratorBase( const ValueInternalMap::IteratorState &state ); +#endif + + bool operator ==( const SelfType &other ) const + { + return isEqual( other ); + } + + bool operator !=( const SelfType &other ) const + { + return !isEqual( other ); + } + + difference_type operator -( const SelfType &other ) const + { + return computeDistance( other ); + } + + /// Return either the index or the member name of the referenced value as a Value. + Value key() const; + + /// Return the index of the referenced Value. -1 if it is not an arrayValue. + UInt index() const; + + /// Return the member name of the referenced Value. "" if it is not an objectValue. + const char *memberName() const; + + protected: + Value &deref() const; + + void increment(); + + void decrement(); + + difference_type computeDistance( const SelfType &other ) const; + + bool isEqual( const SelfType &other ) const; + + void copy( const SelfType &other ); + + private: +#ifndef JSON_VALUE_USE_INTERNAL_MAP + Value::ObjectValues::iterator current_; + // Indicates that iterator is for a null value. + bool isNull_; +#else + union + { + ValueInternalArray::IteratorState array_; + ValueInternalMap::IteratorState map_; + } iterator_; + bool isArray_; +#endif + }; + + /** \brief const iterator for object and array value. + * + */ + class ValueConstIterator : public ValueIteratorBase + { + friend class Value; + public: + typedef unsigned int size_t; + typedef int difference_type; + typedef const Value &reference; + typedef const Value *pointer; + typedef ValueConstIterator SelfType; + + ValueConstIterator(); + private: + /*! \internal Use by Value to create an iterator. + */ +#ifndef JSON_VALUE_USE_INTERNAL_MAP + explicit ValueConstIterator( const Value::ObjectValues::iterator ¤t ); +#else + ValueConstIterator( const ValueInternalArray::IteratorState &state ); + ValueConstIterator( const ValueInternalMap::IteratorState &state ); +#endif + public: + SelfType &operator =( const ValueIteratorBase &other ); + + SelfType operator++( int ) + { + SelfType temp( *this ); + ++*this; + return temp; + } + + SelfType operator--( int ) + { + SelfType temp( *this ); + --*this; + return temp; + } + + SelfType &operator--() + { + decrement(); + return *this; + } + + SelfType &operator++() + { + increment(); + return *this; + } + + reference operator *() const + { + return deref(); + } + }; + + + /** \brief Iterator for object and array value. + */ + class ValueIterator : public ValueIteratorBase + { + friend class Value; + public: + typedef unsigned int size_t; + typedef int difference_type; + typedef Value &reference; + typedef Value *pointer; + typedef ValueIterator SelfType; + + ValueIterator(); + ValueIterator( const ValueConstIterator &other ); + ValueIterator( const ValueIterator &other ); + private: + /*! \internal Use by Value to create an iterator. + */ +#ifndef JSON_VALUE_USE_INTERNAL_MAP + explicit ValueIterator( const Value::ObjectValues::iterator ¤t ); +#else + ValueIterator( const ValueInternalArray::IteratorState &state ); + ValueIterator( const ValueInternalMap::IteratorState &state ); +#endif + public: + + SelfType &operator =( const SelfType &other ); + + SelfType operator++( int ) + { + SelfType temp( *this ); + ++*this; + return temp; + } + + SelfType operator--( int ) + { + SelfType temp( *this ); + --*this; + return temp; + } + + SelfType &operator--() + { + decrement(); + return *this; + } + + SelfType &operator++() + { + increment(); + return *this; + } + + reference operator *() const + { + return deref(); + } + }; + + +} // namespace Json + + +#endif // CPPTL_JSON_H_INCLUDED diff --git a/cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/public/json/writer.h b/cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/public/json/writer.h new file mode 100644 index 000000000..16cf022b2 --- /dev/null +++ b/cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/public/json/writer.h @@ -0,0 +1,174 @@ +#ifndef JSON_WRITER_H_INCLUDED +# define JSON_WRITER_H_INCLUDED + +# include "value.h" +# include +# include +# include + +namespace Json { + + class Value; + + /** \brief Abstract class for writers. + */ + class JSON_API Writer + { + public: + virtual ~Writer(); + + virtual std::string write( const Value &root ) = 0; + }; + + /** \brief Outputs a Value in JSON format without formatting (not human friendly). + * + * The JSON document is written in a single line. It is not intended for 'human' consumption, + * but may be useful to support feature such as RPC where bandwidth is limited. + * \sa Reader, Value + */ + class JSON_API FastWriter : public Writer + { + public: + FastWriter(); + virtual ~FastWriter(){} + + void enableYAMLCompatibility(); + + public: // overridden from Writer + virtual std::string write( const Value &root ); + + private: + void writeValue( const Value &value ); + + std::string document_; + bool yamlCompatibilityEnabled_; + }; + + /** \brief Writes a Value in JSON format in a human friendly way. + * + * The rules for line break and indent are as follow: + * - Object value: + * - if empty then print {} without indent and line break + * - if not empty the print '{', line break & indent, print one value per line + * and then unindent and line break and print '}'. + * - Array value: + * - if empty then print [] without indent and line break + * - if the array contains no object value, empty array or some other value types, + * and all the values fit on one lines, then print the array on a single line. + * - otherwise, it the values do not fit on one line, or the array contains + * object or non empty array, then print one value per line. + * + * If the Value have comments then they are outputed according to their #CommentPlacement. + * + * \sa Reader, Value, Value::setComment() + */ + class JSON_API StyledWriter: public Writer + { + public: + StyledWriter(); + virtual ~StyledWriter(){} + + public: // overridden from Writer + /** \brief Serialize a Value in JSON format. + * \param root Value to serialize. + * \return String containing the JSON document that represents the root value. + */ + virtual std::string write( const Value &root ); + + private: + void writeValue( const Value &value ); + void writeArrayValue( const Value &value ); + bool isMultineArray( const Value &value ); + void pushValue( const std::string &value ); + void writeIndent(); + void writeWithIndent( const std::string &value ); + void indent(); + void unindent(); + void writeCommentBeforeValue( const Value &root ); + void writeCommentAfterValueOnSameLine( const Value &root ); + bool hasCommentForValue( const Value &value ); + static std::string normalizeEOL( const std::string &text ); + + typedef std::vector ChildValues; + + ChildValues childValues_; + std::string document_; + std::string indentString_; + int rightMargin_; + int indentSize_; + bool addChildValues_; + }; + + /** \brief Writes a Value in JSON format in a human friendly way, + to a stream rather than to a string. + * + * The rules for line break and indent are as follow: + * - Object value: + * - if empty then print {} without indent and line break + * - if not empty the print '{', line break & indent, print one value per line + * and then unindent and line break and print '}'. + * - Array value: + * - if empty then print [] without indent and line break + * - if the array contains no object value, empty array or some other value types, + * and all the values fit on one lines, then print the array on a single line. + * - otherwise, it the values do not fit on one line, or the array contains + * object or non empty array, then print one value per line. + * + * If the Value have comments then they are outputed according to their #CommentPlacement. + * + * \param indentation Each level will be indented by this amount extra. + * \sa Reader, Value, Value::setComment() + */ + class JSON_API StyledStreamWriter + { + public: + StyledStreamWriter( std::string indentation="\t" ); + ~StyledStreamWriter(){} + + public: + /** \brief Serialize a Value in JSON format. + * \param out Stream to write to. (Can be ostringstream, e.g.) + * \param root Value to serialize. + * \note There is no point in deriving from Writer, since write() should not return a value. + */ + void write( std::ostream &out, const Value &root ); + + private: + void writeValue( const Value &value ); + void writeArrayValue( const Value &value ); + bool isMultineArray( const Value &value ); + void pushValue( const std::string &value ); + void writeIndent(); + void writeWithIndent( const std::string &value ); + void indent(); + void unindent(); + void writeCommentBeforeValue( const Value &root ); + void writeCommentAfterValueOnSameLine( const Value &root ); + bool hasCommentForValue( const Value &value ); + static std::string normalizeEOL( const std::string &text ); + + typedef std::vector ChildValues; + + ChildValues childValues_; + std::ostream* document_; + std::string indentString_; + int rightMargin_; + std::string indentation_; + bool addChildValues_; + }; + + std::string JSON_API valueToString( Int value ); + std::string JSON_API valueToString( UInt value ); + std::string JSON_API valueToString( double value ); + std::string JSON_API valueToString( bool value ); + std::string JSON_API valueToQuotedString( const char *value ); + + /// \brief Output using the StyledStreamWriter. + /// \see Json::operator>>() + std::ostream& operator<<( std::ostream&, const Value &root ); + +} // namespace Json + + + +#endif // JSON_WRITER_H_INCLUDED diff --git a/cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/public/json_batchallocator.h b/cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/public/json_batchallocator.h new file mode 100644 index 000000000..141ca77a2 --- /dev/null +++ b/cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/public/json_batchallocator.h @@ -0,0 +1,125 @@ +#ifndef JSONCPP_BATCHALLOCATOR_H_INCLUDED +# define JSONCPP_BATCHALLOCATOR_H_INCLUDED + +# include +# include + +# ifndef JSONCPP_DOC_EXCLUDE_IMPLEMENTATION + +namespace Json { + +/* Fast memory allocator. + * + * This memory allocator allocates memory for a batch of object (specified by + * the page size, the number of object in each page). + * + * It does not allow the destruction of a single object. All the allocated objects + * can be destroyed at once. The memory can be either released or reused for future + * allocation. + * + * The in-place new operator must be used to construct the object using the pointer + * returned by allocate. + */ +template +class BatchAllocator +{ +public: + typedef AllocatedType Type; + + BatchAllocator( unsigned int objectsPerPage = 255 ) + : freeHead_( 0 ) + , objectsPerPage_( objectsPerPage ) + { +// printf( "Size: %d => %s\n", sizeof(AllocatedType), typeid(AllocatedType).name() ); + assert( sizeof(AllocatedType) * objectPerAllocation >= sizeof(AllocatedType *) ); // We must be able to store a slist in the object free space. + assert( objectsPerPage >= 16 ); + batches_ = allocateBatch( 0 ); // allocated a dummy page + currentBatch_ = batches_; + } + + ~BatchAllocator() + { + for ( BatchInfo *batch = batches_; batch; ) + { + BatchInfo *nextBatch = batch->next_; + free( batch ); + batch = nextBatch; + } + } + + /// allocate space for an array of objectPerAllocation object. + /// @warning it is the responsibility of the caller to call objects constructors. + AllocatedType *allocate() + { + if ( freeHead_ ) // returns node from free list. + { + AllocatedType *object = freeHead_; + freeHead_ = *(AllocatedType **)object; + return object; + } + if ( currentBatch_->used_ == currentBatch_->end_ ) + { + currentBatch_ = currentBatch_->next_; + while ( currentBatch_ && currentBatch_->used_ == currentBatch_->end_ ) + currentBatch_ = currentBatch_->next_; + + if ( !currentBatch_ ) // no free batch found, allocate a new one + { + currentBatch_ = allocateBatch( objectsPerPage_ ); + currentBatch_->next_ = batches_; // insert at the head of the list + batches_ = currentBatch_; + } + } + AllocatedType *allocated = currentBatch_->used_; + currentBatch_->used_ += objectPerAllocation; + return allocated; + } + + /// Release the object. + /// @warning it is the responsibility of the caller to actually destruct the object. + void release( AllocatedType *object ) + { + assert( object != 0 ); + *(AllocatedType **)object = freeHead_; + freeHead_ = object; + } + +private: + struct BatchInfo + { + BatchInfo *next_; + AllocatedType *used_; + AllocatedType *end_; + AllocatedType buffer_[objectPerAllocation]; + }; + + // disabled copy constructor and assignment operator. + BatchAllocator( const BatchAllocator & ); + void operator =( const BatchAllocator &); + + static BatchInfo *allocateBatch( unsigned int objectsPerPage ) + { + const unsigned int mallocSize = sizeof(BatchInfo) - sizeof(AllocatedType)* objectPerAllocation + + sizeof(AllocatedType) * objectPerAllocation * objectsPerPage; + BatchInfo *batch = static_cast( malloc( mallocSize ) ); + batch->next_ = 0; + batch->used_ = batch->buffer_; + batch->end_ = batch->buffer_ + objectsPerPage; + return batch; + } + + BatchInfo *batches_; + BatchInfo *currentBatch_; + /// Head of a single linked list within the allocated space of freed object + AllocatedType *freeHead_; + unsigned int objectsPerPage_; +}; + + +} // namespace Json + +# endif // ifndef JSONCPP_DOC_INCLUDE_IMPLEMENTATION + +#endif // JSONCPP_BATCHALLOCATOR_H_INCLUDED + diff --git a/cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/public/json_internalarray.inl b/cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/public/json_internalarray.inl new file mode 100644 index 000000000..9b985d258 --- /dev/null +++ b/cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/public/json_internalarray.inl @@ -0,0 +1,448 @@ +// included by json_value.cpp +// everything is within Json namespace + +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// class ValueInternalArray +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// + +ValueArrayAllocator::~ValueArrayAllocator() +{ +} + +// ////////////////////////////////////////////////////////////////// +// class DefaultValueArrayAllocator +// ////////////////////////////////////////////////////////////////// +#ifdef JSON_USE_SIMPLE_INTERNAL_ALLOCATOR +class DefaultValueArrayAllocator : public ValueArrayAllocator +{ +public: // overridden from ValueArrayAllocator + virtual ~DefaultValueArrayAllocator() + { + } + + virtual ValueInternalArray *newArray() + { + return new ValueInternalArray(); + } + + virtual ValueInternalArray *newArrayCopy( const ValueInternalArray &other ) + { + return new ValueInternalArray( other ); + } + + virtual void destructArray( ValueInternalArray *array ) + { + delete array; + } + + virtual void reallocateArrayPageIndex( Value **&indexes, + ValueInternalArray::PageIndex &indexCount, + ValueInternalArray::PageIndex minNewIndexCount ) + { + ValueInternalArray::PageIndex newIndexCount = (indexCount*3)/2 + 1; + if ( minNewIndexCount > newIndexCount ) + newIndexCount = minNewIndexCount; + void *newIndexes = realloc( indexes, sizeof(Value*) * newIndexCount ); + if ( !newIndexes ) + throw std::bad_alloc(); + indexCount = newIndexCount; + indexes = static_cast( newIndexes ); + } + virtual void releaseArrayPageIndex( Value **indexes, + ValueInternalArray::PageIndex indexCount ) + { + if ( indexes ) + free( indexes ); + } + + virtual Value *allocateArrayPage() + { + return static_cast( malloc( sizeof(Value) * ValueInternalArray::itemsPerPage ) ); + } + + virtual void releaseArrayPage( Value *value ) + { + if ( value ) + free( value ); + } +}; + +#else // #ifdef JSON_USE_SIMPLE_INTERNAL_ALLOCATOR +/// @todo make this thread-safe (lock when accessign batch allocator) +class DefaultValueArrayAllocator : public ValueArrayAllocator +{ +public: // overridden from ValueArrayAllocator + virtual ~DefaultValueArrayAllocator() + { + } + + virtual ValueInternalArray *newArray() + { + ValueInternalArray *array = arraysAllocator_.allocate(); + new (array) ValueInternalArray(); // placement new + return array; + } + + virtual ValueInternalArray *newArrayCopy( const ValueInternalArray &other ) + { + ValueInternalArray *array = arraysAllocator_.allocate(); + new (array) ValueInternalArray( other ); // placement new + return array; + } + + virtual void destructArray( ValueInternalArray *array ) + { + if ( array ) + { + array->~ValueInternalArray(); + arraysAllocator_.release( array ); + } + } + + virtual void reallocateArrayPageIndex( Value **&indexes, + ValueInternalArray::PageIndex &indexCount, + ValueInternalArray::PageIndex minNewIndexCount ) + { + ValueInternalArray::PageIndex newIndexCount = (indexCount*3)/2 + 1; + if ( minNewIndexCount > newIndexCount ) + newIndexCount = minNewIndexCount; + void *newIndexes = realloc( indexes, sizeof(Value*) * newIndexCount ); + if ( !newIndexes ) + throw std::bad_alloc(); + indexCount = newIndexCount; + indexes = static_cast( newIndexes ); + } + virtual void releaseArrayPageIndex( Value **indexes, + ValueInternalArray::PageIndex indexCount ) + { + if ( indexes ) + free( indexes ); + } + + virtual Value *allocateArrayPage() + { + return static_cast( pagesAllocator_.allocate() ); + } + + virtual void releaseArrayPage( Value *value ) + { + if ( value ) + pagesAllocator_.release( value ); + } +private: + BatchAllocator arraysAllocator_; + BatchAllocator pagesAllocator_; +}; +#endif // #ifdef JSON_USE_SIMPLE_INTERNAL_ALLOCATOR + +static ValueArrayAllocator *&arrayAllocator() +{ + static DefaultValueArrayAllocator defaultAllocator; + static ValueArrayAllocator *arrayAllocator = &defaultAllocator; + return arrayAllocator; +} + +static struct DummyArrayAllocatorInitializer { + DummyArrayAllocatorInitializer() + { + arrayAllocator(); // ensure arrayAllocator() statics are initialized before main(). + } +} dummyArrayAllocatorInitializer; + +// ////////////////////////////////////////////////////////////////// +// class ValueInternalArray +// ////////////////////////////////////////////////////////////////// +bool +ValueInternalArray::equals( const IteratorState &x, + const IteratorState &other ) +{ + return x.array_ == other.array_ + && x.currentItemIndex_ == other.currentItemIndex_ + && x.currentPageIndex_ == other.currentPageIndex_; +} + + +void +ValueInternalArray::increment( IteratorState &it ) +{ + JSON_ASSERT_MESSAGE( it.array_ && + (it.currentPageIndex_ - it.array_->pages_)*itemsPerPage + it.currentItemIndex_ + != it.array_->size_, + "ValueInternalArray::increment(): moving iterator beyond end" ); + ++(it.currentItemIndex_); + if ( it.currentItemIndex_ == itemsPerPage ) + { + it.currentItemIndex_ = 0; + ++(it.currentPageIndex_); + } +} + + +void +ValueInternalArray::decrement( IteratorState &it ) +{ + JSON_ASSERT_MESSAGE( it.array_ && it.currentPageIndex_ == it.array_->pages_ + && it.currentItemIndex_ == 0, + "ValueInternalArray::decrement(): moving iterator beyond end" ); + if ( it.currentItemIndex_ == 0 ) + { + it.currentItemIndex_ = itemsPerPage-1; + --(it.currentPageIndex_); + } + else + { + --(it.currentItemIndex_); + } +} + + +Value & +ValueInternalArray::unsafeDereference( const IteratorState &it ) +{ + return (*(it.currentPageIndex_))[it.currentItemIndex_]; +} + + +Value & +ValueInternalArray::dereference( const IteratorState &it ) +{ + JSON_ASSERT_MESSAGE( it.array_ && + (it.currentPageIndex_ - it.array_->pages_)*itemsPerPage + it.currentItemIndex_ + < it.array_->size_, + "ValueInternalArray::dereference(): dereferencing invalid iterator" ); + return unsafeDereference( it ); +} + +void +ValueInternalArray::makeBeginIterator( IteratorState &it ) const +{ + it.array_ = const_cast( this ); + it.currentItemIndex_ = 0; + it.currentPageIndex_ = pages_; +} + + +void +ValueInternalArray::makeIterator( IteratorState &it, ArrayIndex index ) const +{ + it.array_ = const_cast( this ); + it.currentItemIndex_ = index % itemsPerPage; + it.currentPageIndex_ = pages_ + index / itemsPerPage; +} + + +void +ValueInternalArray::makeEndIterator( IteratorState &it ) const +{ + makeIterator( it, size_ ); +} + + +ValueInternalArray::ValueInternalArray() + : pages_( 0 ) + , size_( 0 ) + , pageCount_( 0 ) +{ +} + + +ValueInternalArray::ValueInternalArray( const ValueInternalArray &other ) + : pages_( 0 ) + , pageCount_( 0 ) + , size_( other.size_ ) +{ + PageIndex minNewPages = other.size_ / itemsPerPage; + arrayAllocator()->reallocateArrayPageIndex( pages_, pageCount_, minNewPages ); + JSON_ASSERT_MESSAGE( pageCount_ >= minNewPages, + "ValueInternalArray::reserve(): bad reallocation" ); + IteratorState itOther; + other.makeBeginIterator( itOther ); + Value *value; + for ( ArrayIndex index = 0; index < size_; ++index, increment(itOther) ) + { + if ( index % itemsPerPage == 0 ) + { + PageIndex pageIndex = index / itemsPerPage; + value = arrayAllocator()->allocateArrayPage(); + pages_[pageIndex] = value; + } + new (value) Value( dereference( itOther ) ); + } +} + + +ValueInternalArray & +ValueInternalArray::operator =( const ValueInternalArray &other ) +{ + ValueInternalArray temp( other ); + swap( temp ); + return *this; +} + + +ValueInternalArray::~ValueInternalArray() +{ + // destroy all constructed items + IteratorState it; + IteratorState itEnd; + makeBeginIterator( it); + makeEndIterator( itEnd ); + for ( ; !equals(it,itEnd); increment(it) ) + { + Value *value = &dereference(it); + value->~Value(); + } + // release all pages + PageIndex lastPageIndex = size_ / itemsPerPage; + for ( PageIndex pageIndex = 0; pageIndex < lastPageIndex; ++pageIndex ) + arrayAllocator()->releaseArrayPage( pages_[pageIndex] ); + // release pages index + arrayAllocator()->releaseArrayPageIndex( pages_, pageCount_ ); +} + + +void +ValueInternalArray::swap( ValueInternalArray &other ) +{ + Value **tempPages = pages_; + pages_ = other.pages_; + other.pages_ = tempPages; + ArrayIndex tempSize = size_; + size_ = other.size_; + other.size_ = tempSize; + PageIndex tempPageCount = pageCount_; + pageCount_ = other.pageCount_; + other.pageCount_ = tempPageCount; +} + +void +ValueInternalArray::clear() +{ + ValueInternalArray dummy; + swap( dummy ); +} + + +void +ValueInternalArray::resize( ArrayIndex newSize ) +{ + if ( newSize == 0 ) + clear(); + else if ( newSize < size_ ) + { + IteratorState it; + IteratorState itEnd; + makeIterator( it, newSize ); + makeIterator( itEnd, size_ ); + for ( ; !equals(it,itEnd); increment(it) ) + { + Value *value = &dereference(it); + value->~Value(); + } + PageIndex pageIndex = (newSize + itemsPerPage - 1) / itemsPerPage; + PageIndex lastPageIndex = size_ / itemsPerPage; + for ( ; pageIndex < lastPageIndex; ++pageIndex ) + arrayAllocator()->releaseArrayPage( pages_[pageIndex] ); + size_ = newSize; + } + else if ( newSize > size_ ) + resolveReference( newSize ); +} + + +void +ValueInternalArray::makeIndexValid( ArrayIndex index ) +{ + // Need to enlarge page index ? + if ( index >= pageCount_ * itemsPerPage ) + { + PageIndex minNewPages = (index + 1) / itemsPerPage; + arrayAllocator()->reallocateArrayPageIndex( pages_, pageCount_, minNewPages ); + JSON_ASSERT_MESSAGE( pageCount_ >= minNewPages, "ValueInternalArray::reserve(): bad reallocation" ); + } + + // Need to allocate new pages ? + ArrayIndex nextPageIndex = + (size_ % itemsPerPage) != 0 ? size_ - (size_%itemsPerPage) + itemsPerPage + : size_; + if ( nextPageIndex <= index ) + { + PageIndex pageIndex = nextPageIndex / itemsPerPage; + PageIndex pageToAllocate = (index - nextPageIndex) / itemsPerPage + 1; + for ( ; pageToAllocate-- > 0; ++pageIndex ) + pages_[pageIndex] = arrayAllocator()->allocateArrayPage(); + } + + // Initialize all new entries + IteratorState it; + IteratorState itEnd; + makeIterator( it, size_ ); + size_ = index + 1; + makeIterator( itEnd, size_ ); + for ( ; !equals(it,itEnd); increment(it) ) + { + Value *value = &dereference(it); + new (value) Value(); // Construct a default value using placement new + } +} + +Value & +ValueInternalArray::resolveReference( ArrayIndex index ) +{ + if ( index >= size_ ) + makeIndexValid( index ); + return pages_[index/itemsPerPage][index%itemsPerPage]; +} + +Value * +ValueInternalArray::find( ArrayIndex index ) const +{ + if ( index >= size_ ) + return 0; + return &(pages_[index/itemsPerPage][index%itemsPerPage]); +} + +ValueInternalArray::ArrayIndex +ValueInternalArray::size() const +{ + return size_; +} + +int +ValueInternalArray::distance( const IteratorState &x, const IteratorState &y ) +{ + return indexOf(y) - indexOf(x); +} + + +ValueInternalArray::ArrayIndex +ValueInternalArray::indexOf( const IteratorState &iterator ) +{ + if ( !iterator.array_ ) + return ArrayIndex(-1); + return ArrayIndex( + (iterator.currentPageIndex_ - iterator.array_->pages_) * itemsPerPage + + iterator.currentItemIndex_ ); +} + + +int +ValueInternalArray::compare( const ValueInternalArray &other ) const +{ + int sizeDiff( size_ - other.size_ ); + if ( sizeDiff != 0 ) + return sizeDiff; + + for ( ArrayIndex index =0; index < size_; ++index ) + { + int diff = pages_[index/itemsPerPage][index%itemsPerPage].compare( + other.pages_[index/itemsPerPage][index%itemsPerPage] ); + if ( diff != 0 ) + return diff; + } + return 0; +} diff --git a/cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/public/json_internalmap.inl b/cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/public/json_internalmap.inl new file mode 100644 index 000000000..ef37991c8 --- /dev/null +++ b/cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/public/json_internalmap.inl @@ -0,0 +1,607 @@ +// included by json_value.cpp +// everything is within Json namespace + +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// class ValueInternalMap +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// + +/** \internal MUST be safely initialized using memset( this, 0, sizeof(ValueInternalLink) ); + * This optimization is used by the fast allocator. + */ +ValueInternalLink::ValueInternalLink() + : previous_( 0 ) + , next_( 0 ) +{ +} + +ValueInternalLink::~ValueInternalLink() +{ + for ( int index =0; index < itemPerLink; ++index ) + { + if ( !items_[index].isItemAvailable() ) + { + if ( !items_[index].isMemberNameStatic() ) + free( keys_[index] ); + } + else + break; + } +} + + + +ValueMapAllocator::~ValueMapAllocator() +{ +} + +#ifdef JSON_USE_SIMPLE_INTERNAL_ALLOCATOR +class DefaultValueMapAllocator : public ValueMapAllocator +{ +public: // overridden from ValueMapAllocator + virtual ValueInternalMap *newMap() + { + return new ValueInternalMap(); + } + + virtual ValueInternalMap *newMapCopy( const ValueInternalMap &other ) + { + return new ValueInternalMap( other ); + } + + virtual void destructMap( ValueInternalMap *map ) + { + delete map; + } + + virtual ValueInternalLink *allocateMapBuckets( unsigned int size ) + { + return new ValueInternalLink[size]; + } + + virtual void releaseMapBuckets( ValueInternalLink *links ) + { + delete [] links; + } + + virtual ValueInternalLink *allocateMapLink() + { + return new ValueInternalLink(); + } + + virtual void releaseMapLink( ValueInternalLink *link ) + { + delete link; + } +}; +#else +/// @todo make this thread-safe (lock when accessign batch allocator) +class DefaultValueMapAllocator : public ValueMapAllocator +{ +public: // overridden from ValueMapAllocator + virtual ValueInternalMap *newMap() + { + ValueInternalMap *map = mapsAllocator_.allocate(); + new (map) ValueInternalMap(); // placement new + return map; + } + + virtual ValueInternalMap *newMapCopy( const ValueInternalMap &other ) + { + ValueInternalMap *map = mapsAllocator_.allocate(); + new (map) ValueInternalMap( other ); // placement new + return map; + } + + virtual void destructMap( ValueInternalMap *map ) + { + if ( map ) + { + map->~ValueInternalMap(); + mapsAllocator_.release( map ); + } + } + + virtual ValueInternalLink *allocateMapBuckets( unsigned int size ) + { + return new ValueInternalLink[size]; + } + + virtual void releaseMapBuckets( ValueInternalLink *links ) + { + delete [] links; + } + + virtual ValueInternalLink *allocateMapLink() + { + ValueInternalLink *link = linksAllocator_.allocate(); + memset( link, 0, sizeof(ValueInternalLink) ); + return link; + } + + virtual void releaseMapLink( ValueInternalLink *link ) + { + link->~ValueInternalLink(); + linksAllocator_.release( link ); + } +private: + BatchAllocator mapsAllocator_; + BatchAllocator linksAllocator_; +}; +#endif + +static ValueMapAllocator *&mapAllocator() +{ + static DefaultValueMapAllocator defaultAllocator; + static ValueMapAllocator *mapAllocator = &defaultAllocator; + return mapAllocator; +} + +static struct DummyMapAllocatorInitializer { + DummyMapAllocatorInitializer() + { + mapAllocator(); // ensure mapAllocator() statics are initialized before main(). + } +} dummyMapAllocatorInitializer; + + + +// h(K) = value * K >> w ; with w = 32 & K prime w.r.t. 2^32. + +/* +use linked list hash map. +buckets array is a container. +linked list element contains 6 key/values. (memory = (16+4) * 6 + 4 = 124) +value have extra state: valid, available, deleted +*/ + + +ValueInternalMap::ValueInternalMap() + : buckets_( 0 ) + , tailLink_( 0 ) + , bucketsSize_( 0 ) + , itemCount_( 0 ) +{ +} + + +ValueInternalMap::ValueInternalMap( const ValueInternalMap &other ) + : buckets_( 0 ) + , tailLink_( 0 ) + , bucketsSize_( 0 ) + , itemCount_( 0 ) +{ + reserve( other.itemCount_ ); + IteratorState it; + IteratorState itEnd; + other.makeBeginIterator( it ); + other.makeEndIterator( itEnd ); + for ( ; !equals(it,itEnd); increment(it) ) + { + bool isStatic; + const char *memberName = key( it, isStatic ); + const Value &aValue = value( it ); + resolveReference(memberName, isStatic) = aValue; + } +} + + +ValueInternalMap & +ValueInternalMap::operator =( const ValueInternalMap &other ) +{ + ValueInternalMap dummy( other ); + swap( dummy ); + return *this; +} + + +ValueInternalMap::~ValueInternalMap() +{ + if ( buckets_ ) + { + for ( BucketIndex bucketIndex =0; bucketIndex < bucketsSize_; ++bucketIndex ) + { + ValueInternalLink *link = buckets_[bucketIndex].next_; + while ( link ) + { + ValueInternalLink *linkToRelease = link; + link = link->next_; + mapAllocator()->releaseMapLink( linkToRelease ); + } + } + mapAllocator()->releaseMapBuckets( buckets_ ); + } +} + + +void +ValueInternalMap::swap( ValueInternalMap &other ) +{ + ValueInternalLink *tempBuckets = buckets_; + buckets_ = other.buckets_; + other.buckets_ = tempBuckets; + ValueInternalLink *tempTailLink = tailLink_; + tailLink_ = other.tailLink_; + other.tailLink_ = tempTailLink; + BucketIndex tempBucketsSize = bucketsSize_; + bucketsSize_ = other.bucketsSize_; + other.bucketsSize_ = tempBucketsSize; + BucketIndex tempItemCount = itemCount_; + itemCount_ = other.itemCount_; + other.itemCount_ = tempItemCount; +} + + +void +ValueInternalMap::clear() +{ + ValueInternalMap dummy; + swap( dummy ); +} + + +ValueInternalMap::BucketIndex +ValueInternalMap::size() const +{ + return itemCount_; +} + +bool +ValueInternalMap::reserveDelta( BucketIndex growth ) +{ + return reserve( itemCount_ + growth ); +} + +bool +ValueInternalMap::reserve( BucketIndex newItemCount ) +{ + if ( !buckets_ && newItemCount > 0 ) + { + buckets_ = mapAllocator()->allocateMapBuckets( 1 ); + bucketsSize_ = 1; + tailLink_ = &buckets_[0]; + } +// BucketIndex idealBucketCount = (newItemCount + ValueInternalLink::itemPerLink) / ValueInternalLink::itemPerLink; + return true; +} + + +const Value * +ValueInternalMap::find( const char *key ) const +{ + if ( !bucketsSize_ ) + return 0; + HashKey hashedKey = hash( key ); + BucketIndex bucketIndex = hashedKey % bucketsSize_; + for ( const ValueInternalLink *current = &buckets_[bucketIndex]; + current != 0; + current = current->next_ ) + { + for ( BucketIndex index=0; index < ValueInternalLink::itemPerLink; ++index ) + { + if ( current->items_[index].isItemAvailable() ) + return 0; + if ( strcmp( key, current->keys_[index] ) == 0 ) + return ¤t->items_[index]; + } + } + return 0; +} + + +Value * +ValueInternalMap::find( const char *key ) +{ + const ValueInternalMap *constThis = this; + return const_cast( constThis->find( key ) ); +} + + +Value & +ValueInternalMap::resolveReference( const char *key, + bool isStatic ) +{ + HashKey hashedKey = hash( key ); + if ( bucketsSize_ ) + { + BucketIndex bucketIndex = hashedKey % bucketsSize_; + ValueInternalLink **previous = 0; + BucketIndex index; + for ( ValueInternalLink *current = &buckets_[bucketIndex]; + current != 0; + previous = ¤t->next_, current = current->next_ ) + { + for ( index=0; index < ValueInternalLink::itemPerLink; ++index ) + { + if ( current->items_[index].isItemAvailable() ) + return setNewItem( key, isStatic, current, index ); + if ( strcmp( key, current->keys_[index] ) == 0 ) + return current->items_[index]; + } + } + } + + reserveDelta( 1 ); + return unsafeAdd( key, isStatic, hashedKey ); +} + + +void +ValueInternalMap::remove( const char *key ) +{ + HashKey hashedKey = hash( key ); + if ( !bucketsSize_ ) + return; + BucketIndex bucketIndex = hashedKey % bucketsSize_; + for ( ValueInternalLink *link = &buckets_[bucketIndex]; + link != 0; + link = link->next_ ) + { + BucketIndex index; + for ( index =0; index < ValueInternalLink::itemPerLink; ++index ) + { + if ( link->items_[index].isItemAvailable() ) + return; + if ( strcmp( key, link->keys_[index] ) == 0 ) + { + doActualRemove( link, index, bucketIndex ); + return; + } + } + } +} + +void +ValueInternalMap::doActualRemove( ValueInternalLink *link, + BucketIndex index, + BucketIndex bucketIndex ) +{ + // find last item of the bucket and swap it with the 'removed' one. + // set removed items flags to 'available'. + // if last page only contains 'available' items, then deallocate it (it's empty) + ValueInternalLink *&lastLink = getLastLinkInBucket( index ); + BucketIndex lastItemIndex = 1; // a link can never be empty, so start at 1 + for ( ; + lastItemIndex < ValueInternalLink::itemPerLink; + ++lastItemIndex ) // may be optimized with dicotomic search + { + if ( lastLink->items_[lastItemIndex].isItemAvailable() ) + break; + } + + BucketIndex lastUsedIndex = lastItemIndex - 1; + Value *valueToDelete = &link->items_[index]; + Value *valueToPreserve = &lastLink->items_[lastUsedIndex]; + if ( valueToDelete != valueToPreserve ) + valueToDelete->swap( *valueToPreserve ); + if ( lastUsedIndex == 0 ) // page is now empty + { // remove it from bucket linked list and delete it. + ValueInternalLink *linkPreviousToLast = lastLink->previous_; + if ( linkPreviousToLast != 0 ) // can not deleted bucket link. + { + mapAllocator()->releaseMapLink( lastLink ); + linkPreviousToLast->next_ = 0; + lastLink = linkPreviousToLast; + } + } + else + { + Value dummy; + valueToPreserve->swap( dummy ); // restore deleted to default Value. + valueToPreserve->setItemUsed( false ); + } + --itemCount_; +} + + +ValueInternalLink *& +ValueInternalMap::getLastLinkInBucket( BucketIndex bucketIndex ) +{ + if ( bucketIndex == bucketsSize_ - 1 ) + return tailLink_; + ValueInternalLink *&previous = buckets_[bucketIndex+1].previous_; + if ( !previous ) + previous = &buckets_[bucketIndex]; + return previous; +} + + +Value & +ValueInternalMap::setNewItem( const char *key, + bool isStatic, + ValueInternalLink *link, + BucketIndex index ) +{ + char *duplicatedKey = valueAllocator()->makeMemberName( key ); + ++itemCount_; + link->keys_[index] = duplicatedKey; + link->items_[index].setItemUsed(); + link->items_[index].setMemberNameIsStatic( isStatic ); + return link->items_[index]; // items already default constructed. +} + + +Value & +ValueInternalMap::unsafeAdd( const char *key, + bool isStatic, + HashKey hashedKey ) +{ + JSON_ASSERT_MESSAGE( bucketsSize_ > 0, "ValueInternalMap::unsafeAdd(): internal logic error." ); + BucketIndex bucketIndex = hashedKey % bucketsSize_; + ValueInternalLink *&previousLink = getLastLinkInBucket( bucketIndex ); + ValueInternalLink *link = previousLink; + BucketIndex index; + for ( index =0; index < ValueInternalLink::itemPerLink; ++index ) + { + if ( link->items_[index].isItemAvailable() ) + break; + } + if ( index == ValueInternalLink::itemPerLink ) // need to add a new page + { + ValueInternalLink *newLink = mapAllocator()->allocateMapLink(); + index = 0; + link->next_ = newLink; + previousLink = newLink; + link = newLink; + } + return setNewItem( key, isStatic, link, index ); +} + + +ValueInternalMap::HashKey +ValueInternalMap::hash( const char *key ) const +{ + HashKey hash = 0; + while ( *key ) + hash += *key++ * 37; + return hash; +} + + +int +ValueInternalMap::compare( const ValueInternalMap &other ) const +{ + int sizeDiff( itemCount_ - other.itemCount_ ); + if ( sizeDiff != 0 ) + return sizeDiff; + // Strict order guaranty is required. Compare all keys FIRST, then compare values. + IteratorState it; + IteratorState itEnd; + makeBeginIterator( it ); + makeEndIterator( itEnd ); + for ( ; !equals(it,itEnd); increment(it) ) + { + if ( !other.find( key( it ) ) ) + return 1; + } + + // All keys are equals, let's compare values + makeBeginIterator( it ); + for ( ; !equals(it,itEnd); increment(it) ) + { + const Value *otherValue = other.find( key( it ) ); + int valueDiff = value(it).compare( *otherValue ); + if ( valueDiff != 0 ) + return valueDiff; + } + return 0; +} + + +void +ValueInternalMap::makeBeginIterator( IteratorState &it ) const +{ + it.map_ = const_cast( this ); + it.bucketIndex_ = 0; + it.itemIndex_ = 0; + it.link_ = buckets_; +} + + +void +ValueInternalMap::makeEndIterator( IteratorState &it ) const +{ + it.map_ = const_cast( this ); + it.bucketIndex_ = bucketsSize_; + it.itemIndex_ = 0; + it.link_ = 0; +} + + +bool +ValueInternalMap::equals( const IteratorState &x, const IteratorState &other ) +{ + return x.map_ == other.map_ + && x.bucketIndex_ == other.bucketIndex_ + && x.link_ == other.link_ + && x.itemIndex_ == other.itemIndex_; +} + + +void +ValueInternalMap::incrementBucket( IteratorState &iterator ) +{ + ++iterator.bucketIndex_; + JSON_ASSERT_MESSAGE( iterator.bucketIndex_ <= iterator.map_->bucketsSize_, + "ValueInternalMap::increment(): attempting to iterate beyond end." ); + if ( iterator.bucketIndex_ == iterator.map_->bucketsSize_ ) + iterator.link_ = 0; + else + iterator.link_ = &(iterator.map_->buckets_[iterator.bucketIndex_]); + iterator.itemIndex_ = 0; +} + + +void +ValueInternalMap::increment( IteratorState &iterator ) +{ + JSON_ASSERT_MESSAGE( iterator.map_, "Attempting to iterator using invalid iterator." ); + ++iterator.itemIndex_; + if ( iterator.itemIndex_ == ValueInternalLink::itemPerLink ) + { + JSON_ASSERT_MESSAGE( iterator.link_ != 0, + "ValueInternalMap::increment(): attempting to iterate beyond end." ); + iterator.link_ = iterator.link_->next_; + if ( iterator.link_ == 0 ) + incrementBucket( iterator ); + } + else if ( iterator.link_->items_[iterator.itemIndex_].isItemAvailable() ) + { + incrementBucket( iterator ); + } +} + + +void +ValueInternalMap::decrement( IteratorState &iterator ) +{ + if ( iterator.itemIndex_ == 0 ) + { + JSON_ASSERT_MESSAGE( iterator.map_, "Attempting to iterate using invalid iterator." ); + if ( iterator.link_ == &iterator.map_->buckets_[iterator.bucketIndex_] ) + { + JSON_ASSERT_MESSAGE( iterator.bucketIndex_ > 0, "Attempting to iterate beyond beginning." ); + --(iterator.bucketIndex_); + } + iterator.link_ = iterator.link_->previous_; + iterator.itemIndex_ = ValueInternalLink::itemPerLink - 1; + } +} + + +const char * +ValueInternalMap::key( const IteratorState &iterator ) +{ + JSON_ASSERT_MESSAGE( iterator.link_, "Attempting to iterate using invalid iterator." ); + return iterator.link_->keys_[iterator.itemIndex_]; +} + +const char * +ValueInternalMap::key( const IteratorState &iterator, bool &isStatic ) +{ + JSON_ASSERT_MESSAGE( iterator.link_, "Attempting to iterate using invalid iterator." ); + isStatic = iterator.link_->items_[iterator.itemIndex_].isMemberNameStatic(); + return iterator.link_->keys_[iterator.itemIndex_]; +} + + +Value & +ValueInternalMap::value( const IteratorState &iterator ) +{ + JSON_ASSERT_MESSAGE( iterator.link_, "Attempting to iterate using invalid iterator." ); + return iterator.link_->items_[iterator.itemIndex_]; +} + + +int +ValueInternalMap::distance( const IteratorState &x, const IteratorState &y ) +{ + int offset = 0; + IteratorState it = x; + while ( !equals( it, y ) ) + increment( it ); + return offset; +} diff --git a/cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/public/json_reader.cpp b/cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/public/json_reader.cpp new file mode 100644 index 000000000..750088c65 --- /dev/null +++ b/cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/public/json_reader.cpp @@ -0,0 +1,894 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +#if _MSC_VER >= 1400 // VC++ 8.0 +#pragma warning( disable : 4996 ) // disable warning about strdup being deprecated. +#endif + +namespace Json { + +// QNX is strict about declaring C symbols in the std namespace. +#ifdef __QNXNTO__ +using std::memcpy; +using std::sprintf; +using std::sscanf; +#endif + +// Implementation of class Features +// //////////////////////////////// + +Features::Features() + : allowComments_( true ) + , strictRoot_( false ) +{ +} + + +Features +Features::all() +{ + return Features(); +} + + +Features +Features::strictMode() +{ + Features features; + features.allowComments_ = false; + features.strictRoot_ = true; + return features; +} + +// Implementation of class Reader +// //////////////////////////////// + + +static inline bool +in( Reader::Char c, Reader::Char c1, Reader::Char c2, Reader::Char c3, Reader::Char c4 ) +{ + return c == c1 || c == c2 || c == c3 || c == c4; +} + +static inline bool +in( Reader::Char c, Reader::Char c1, Reader::Char c2, Reader::Char c3, Reader::Char c4, Reader::Char c5 ) +{ + return c == c1 || c == c2 || c == c3 || c == c4 || c == c5; +} + + +static bool +containsNewLine( Reader::Location begin, + Reader::Location end ) +{ + for ( ;begin < end; ++begin ) + if ( *begin == '\n' || *begin == '\r' ) + return true; + return false; +} + +static std::string codePointToUTF8(unsigned int cp) +{ + std::string result; + + // based on description from http://en.wikipedia.org/wiki/UTF-8 + + if (cp <= 0x7f) + { + result.resize(1); + result[0] = static_cast(cp); + } + else if (cp <= 0x7FF) + { + result.resize(2); + result[1] = static_cast(0x80 | (0x3f & cp)); + result[0] = static_cast(0xC0 | (0x1f & (cp >> 6))); + } + else if (cp <= 0xFFFF) + { + result.resize(3); + result[2] = static_cast(0x80 | (0x3f & cp)); + result[1] = 0x80 | static_cast((0x3f & (cp >> 6))); + result[0] = 0xE0 | static_cast((0xf & (cp >> 12))); + } + else if (cp <= 0x10FFFF) + { + result.resize(4); + result[3] = static_cast(0x80 | (0x3f & cp)); + result[2] = static_cast(0x80 | (0x3f & (cp >> 6))); + result[1] = static_cast(0x80 | (0x3f & (cp >> 12))); + result[0] = static_cast(0xF0 | (0x7 & (cp >> 18))); + } + + return result; +} + + +// Class Reader +// ////////////////////////////////////////////////////////////////// + +Reader::Reader() + : features_( Features::all() ) +{ +} + + +Reader::Reader( const Features &features ) + : features_( features ) +{ +} + + +bool +Reader::parse( const std::string &document, + Value &root, + bool collectComments ) +{ + document_ = document; + const char *begin = document_.c_str(); + const char *end = begin + document_.length(); + return parse( begin, end, root, collectComments ); +} + + +bool +Reader::parse( std::istream& sin, + Value &root, + bool collectComments ) +{ + //std::istream_iterator begin(sin); + //std::istream_iterator end; + // Those would allow streamed input from a file, if parse() were a + // template function. + + // Since std::string is reference-counted, this at least does not + // create an extra copy. + std::string doc; + std::getline(sin, doc, (char)EOF); + return parse( doc, root, collectComments ); +} + +bool +Reader::parse( const char *beginDoc, const char *endDoc, + Value &root, + bool collectComments ) +{ + if ( !features_.allowComments_ ) + { + collectComments = false; + } + + begin_ = beginDoc; + end_ = endDoc; + collectComments_ = collectComments; + current_ = begin_; + lastValueEnd_ = 0; + lastValue_ = 0; + commentsBefore_ = ""; + errors_.clear(); + while ( !nodes_.empty() ) + nodes_.pop(); + nodes_.push( &root ); + + bool successful = readValue(); + Token token; + skipCommentTokens( token ); + if ( collectComments_ && !commentsBefore_.empty() ) + root.setComment( commentsBefore_, commentAfter ); + if ( features_.strictRoot_ ) + { + if ( !root.isArray() && !root.isObject() ) + { + // Set error location to start of doc, ideally should be first token found in doc + token.type_ = tokenError; + token.start_ = beginDoc; + token.end_ = endDoc; + addError( "A valid JSON document must be either an array or an object value.", + token ); + return false; + } + } + return successful; +} + + +bool +Reader::readValue() +{ + Token token; + skipCommentTokens( token ); + bool successful = true; + + if ( collectComments_ && !commentsBefore_.empty() ) + { + currentValue().setComment( commentsBefore_, commentBefore ); + commentsBefore_ = ""; + } + + + switch ( token.type_ ) + { + case tokenObjectBegin: + successful = readObject( token ); + break; + case tokenArrayBegin: + successful = readArray( token ); + break; + case tokenNumber: + successful = decodeNumber( token ); + break; + case tokenString: + successful = decodeString( token ); + break; + case tokenTrue: + currentValue() = true; + break; + case tokenFalse: + currentValue() = false; + break; + case tokenNull: + currentValue() = Value(); + break; + default: + return addError( "Syntax error: value, object or array expected.", token ); + } + + if ( collectComments_ ) + { + lastValueEnd_ = current_; + lastValue_ = ¤tValue(); + } + + return successful; +} + + +void +Reader::skipCommentTokens( Token &token ) +{ + if ( features_.allowComments_ ) + { + do + { + readToken( token ); + } + while ( token.type_ == tokenComment ); + } + else + { + readToken( token ); + } +} + + +bool +Reader::expectToken( TokenType type, Token &token, const char *message ) +{ + readToken( token ); + if ( token.type_ != type ) + return addError( message, token ); + return true; +} + + +bool +Reader::readToken( Token &token ) +{ + skipSpaces(); + token.start_ = current_; + Char c = getNextChar(); + bool ok = true; + switch ( c ) + { + case '{': + token.type_ = tokenObjectBegin; + break; + case '}': + token.type_ = tokenObjectEnd; + break; + case '[': + token.type_ = tokenArrayBegin; + break; + case ']': + token.type_ = tokenArrayEnd; + break; + case '"': + token.type_ = tokenString; + ok = readString(); + break; + case '/': + token.type_ = tokenComment; + ok = readComment(); + break; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case '-': + token.type_ = tokenNumber; + readNumber(); + break; + case 't': + token.type_ = tokenTrue; + ok = match( "rue", 3 ); + break; + case 'f': + token.type_ = tokenFalse; + ok = match( "alse", 4 ); + break; + case 'n': + token.type_ = tokenNull; + ok = match( "ull", 3 ); + break; + case ',': + token.type_ = tokenArraySeparator; + break; + case ':': + token.type_ = tokenMemberSeparator; + break; + case 0: + token.type_ = tokenEndOfStream; + break; + default: + ok = false; + break; + } + if ( !ok ) + token.type_ = tokenError; + token.end_ = current_; + return true; +} + + +void +Reader::skipSpaces() +{ + while ( current_ != end_ ) + { + Char c = *current_; + if ( c == ' ' || c == '\t' || c == '\r' || c == '\n' ) + ++current_; + else + break; + } +} + + +bool +Reader::match( Location pattern, + int patternLength ) +{ + if ( end_ - current_ < patternLength ) + return false; + int index = patternLength; + while ( index-- ) + if ( current_[index] != pattern[index] ) + return false; + current_ += patternLength; + return true; +} + + +bool +Reader::readComment() +{ + Location commentBegin = current_ - 1; + Char c = getNextChar(); + bool successful = false; + if ( c == '*' ) + successful = readCStyleComment(); + else if ( c == '/' ) + successful = readCppStyleComment(); + if ( !successful ) + return false; + + if ( collectComments_ ) + { + CommentPlacement placement = commentBefore; + if ( lastValueEnd_ && !containsNewLine( lastValueEnd_, commentBegin ) ) + { + if ( c != '*' || !containsNewLine( commentBegin, current_ ) ) + placement = commentAfterOnSameLine; + } + + addComment( commentBegin, current_, placement ); + } + return true; +} + + +void +Reader::addComment( Location begin, + Location end, + CommentPlacement placement ) +{ + assert( collectComments_ ); + if ( placement == commentAfterOnSameLine ) + { + assert( lastValue_ != 0 ); + lastValue_->setComment( std::string( begin, end ), placement ); + } + else + { + if ( !commentsBefore_.empty() ) + commentsBefore_ += "\n"; + commentsBefore_ += std::string( begin, end ); + } +} + + +bool +Reader::readCStyleComment() +{ + while ( current_ != end_ ) + { + Char c = getNextChar(); + if ( c == '*' && *current_ == '/' ) + break; + } + return getNextChar() == '/'; +} + + +bool +Reader::readCppStyleComment() +{ + while ( current_ != end_ ) + { + Char c = getNextChar(); + if ( c == '\r' || c == '\n' ) + break; + } + return true; +} + + +void +Reader::readNumber() +{ + while ( current_ != end_ ) + { + if ( !(*current_ >= '0' && *current_ <= '9') && + !in( *current_, '.', 'e', 'E', '+', '-' ) ) + break; + ++current_; + } +} + +bool +Reader::readString() +{ + Char c = 0; + while ( current_ != end_ ) + { + c = getNextChar(); + if ( c == '\\' ) + getNextChar(); + else if ( c == '"' ) + break; + } + return c == '"'; +} + + +bool +Reader::readObject( Token &tokenStart ) +{ + Token tokenName; + Token something = tokenStart; + std::string name; + currentValue() = Value( objectValue ); + while ( readToken( tokenName ) ) + { + bool initialTokenOk = true; + while ( tokenName.type_ == tokenComment && initialTokenOk ) + initialTokenOk = readToken( tokenName ); + if ( !initialTokenOk ) + break; + if ( tokenName.type_ == tokenObjectEnd && name.empty() ) // empty object + return true; + if ( tokenName.type_ != tokenString ) + break; + + name = ""; + if ( !decodeString( tokenName, name ) ) + return recoverFromError( tokenObjectEnd ); + + Token colon; + if ( !readToken( colon ) || colon.type_ != tokenMemberSeparator ) + { + return addErrorAndRecover( "Missing ':' after object member name", + colon, + tokenObjectEnd ); + } + Value &value = currentValue()[ name ]; + nodes_.push( &value ); + bool ok = readValue(); + nodes_.pop(); + if ( !ok ) // error already set + return recoverFromError( tokenObjectEnd ); + + Token comma; + if ( !readToken( comma ) + || ( comma.type_ != tokenObjectEnd && + comma.type_ != tokenArraySeparator && + comma.type_ != tokenComment ) ) + { + return addErrorAndRecover( "Missing ',' or '}' in object declaration", + comma, + tokenObjectEnd ); + } + bool finalizeTokenOk = true; + while ( comma.type_ == tokenComment && + finalizeTokenOk ) + finalizeTokenOk = readToken( comma ); + if ( comma.type_ == tokenObjectEnd ) + return true; + } + return addErrorAndRecover( "Missing '}' or object member name", + tokenName, + tokenObjectEnd ); +} + + +bool +Reader::readArray( Token &tokenStart ) +{ + Token something = tokenStart; + currentValue() = Value( arrayValue ); + skipSpaces(); + if ( *current_ == ']' ) // empty array + { + Token endArray; + readToken( endArray ); + return true; + } + int index = 0; + while ( true ) + { + Value &value = currentValue()[ index++ ]; + nodes_.push( &value ); + bool ok = readValue(); + nodes_.pop(); + if ( !ok ) // error already set + return recoverFromError( tokenArrayEnd ); + + Token token; + // Accept Comment after last item in the array. + ok = readToken( token ); + while ( token.type_ == tokenComment && ok ) + { + ok = readToken( token ); + } + bool badTokenType = ( token.type_ == tokenArraySeparator && + token.type_ == tokenArrayEnd ); + if ( !ok || badTokenType ) + { + return addErrorAndRecover( "Missing ',' or ']' in array declaration", + token, + tokenArrayEnd ); + } + if ( token.type_ == tokenArrayEnd ) + break; + } + return true; +} + + +bool +Reader::decodeNumber( Token &token ) +{ + bool isDouble = false; + for ( Location inspect = token.start_; inspect != token.end_; ++inspect ) + { + isDouble = isDouble + || in( *inspect, '.', 'e', 'E', '+' ) + || ( *inspect == '-' && inspect != token.start_ ); + } + if ( isDouble ) + return decodeDouble( token ); + Location current = token.start_; + bool isNegative = *current == '-'; + if ( isNegative ) + ++current; + Value::UInt threshold = (isNegative ? Value::UInt(-Value::minInt) + : Value::maxUInt) / 10; + Value::UInt value = 0; + while ( current < token.end_ ) + { + Char c = *current++; + if ( c < '0' || c > '9' ) + return addError( "'" + std::string( token.start_, token.end_ ) + "' is not a number.", token ); + if ( value >= threshold ) + return decodeDouble( token ); + value = value * 10 + Value::UInt(c - '0'); + } + if ( isNegative ) + currentValue() = -Value::Int( value ); + else if ( value <= Value::UInt(Value::maxInt) ) + currentValue() = Value::Int( value ); + else + currentValue() = value; + return true; +} + + +bool +Reader::decodeDouble( Token &token ) +{ + double value = 0; + const int bufferSize = 32; + int count; + int length = int(token.end_ - token.start_); + if ( length <= bufferSize ) + { + Char buffer[bufferSize]; + memcpy( buffer, token.start_, length ); + buffer[length] = 0; + count = sscanf( buffer, "%lf", &value ); + } + else + { + std::string buffer( token.start_, token.end_ ); + count = sscanf( buffer.c_str(), "%lf", &value ); + } + + if ( count != 1 ) + return addError( "'" + std::string( token.start_, token.end_ ) + "' is not a number.", token ); + currentValue() = value; + return true; +} + + +bool +Reader::decodeString( Token &token ) +{ + std::string decoded; + if ( !decodeString( token, decoded ) ) + return false; + currentValue() = decoded; + return true; +} + + +bool +Reader::decodeString( Token &token, std::string &decoded ) +{ + decoded.reserve( token.end_ - token.start_ - 2 ); + Location current = token.start_ + 1; // skip '"' + Location end = token.end_ - 1; // do not include '"' + while ( current != end ) + { + Char c = *current++; + if ( c == '"' ) + break; + else if ( c == '\\' ) + { + if ( current == end ) + return addError( "Empty escape sequence in string", token, current ); + Char escape = *current++; + switch ( escape ) + { + case '"': decoded += '"'; break; + case '/': decoded += '/'; break; + case '\\': decoded += '\\'; break; + case 'b': decoded += '\b'; break; + case 'f': decoded += '\f'; break; + case 'n': decoded += '\n'; break; + case 'r': decoded += '\r'; break; + case 't': decoded += '\t'; break; + case 'u': + { + unsigned int unicode; + if ( !decodeUnicodeCodePoint( token, current, end, unicode ) ) + return false; + decoded += codePointToUTF8(unicode); + } + break; + default: + return addError( "Bad escape sequence in string", token, current ); + } + } + else + { + decoded += c; + } + } + return true; +} + +bool +Reader::decodeUnicodeCodePoint( Token &token, + Location ¤t, + Location end, + unsigned int &unicode ) +{ + + if ( !decodeUnicodeEscapeSequence( token, current, end, unicode ) ) + return false; + if (unicode >= 0xD800 && unicode <= 0xDBFF) + { + // surrogate pairs + if (end - current < 6) + return addError( "additional six characters expected to parse unicode surrogate pair.", token, current ); + unsigned int surrogatePair; + if (*(current++) == '\\' && *(current++)== 'u') + { + if (decodeUnicodeEscapeSequence( token, current, end, surrogatePair )) + { + unicode = 0x10000 + ((unicode & 0x3FF) << 10) + (surrogatePair & 0x3FF); + } + else + return false; + } + else + return addError( "expecting another \\u token to begin the second half of a unicode surrogate pair", token, current ); + } + return true; +} + +bool +Reader::decodeUnicodeEscapeSequence( Token &token, + Location ¤t, + Location end, + unsigned int &unicode ) +{ + if ( end - current < 4 ) + return addError( "Bad unicode escape sequence in string: four digits expected.", token, current ); + unicode = 0; + for ( int index =0; index < 4; ++index ) + { + Char c = *current++; + unicode *= 16; + if ( c >= '0' && c <= '9' ) + unicode += c - '0'; + else if ( c >= 'a' && c <= 'f' ) + unicode += c - 'a' + 10; + else if ( c >= 'A' && c <= 'F' ) + unicode += c - 'A' + 10; + else + return addError( "Bad unicode escape sequence in string: hexadecimal digit expected.", token, current ); + } + return true; +} + + +bool +Reader::addError( const std::string &message, + Token &token, + Location extra ) +{ + ErrorInfo info; + info.token_ = token; + info.message_ = message; + info.extra_ = extra; + errors_.push_back( info ); + return false; +} + + +bool +Reader::recoverFromError( TokenType skipUntilToken ) +{ + int errorCount = int(errors_.size()); + Token skip; + while ( true ) + { + if ( !readToken(skip) ) + errors_.resize( errorCount ); // discard errors caused by recovery + if ( skip.type_ == skipUntilToken || skip.type_ == tokenEndOfStream ) + break; + } + errors_.resize( errorCount ); + return false; +} + + +bool +Reader::addErrorAndRecover( const std::string &message, + Token &token, + TokenType skipUntilToken ) +{ + addError( message, token ); + return recoverFromError( skipUntilToken ); +} + + +Value & +Reader::currentValue() +{ + return *(nodes_.top()); +} + + +Reader::Char +Reader::getNextChar() +{ + if ( current_ == end_ ) + return 0; + return *current_++; +} + + +void +Reader::getLocationLineAndColumn( Location location, + int &line, + int &column ) const +{ + Location current = begin_; + Location lastLineStart = current; + line = 0; + while ( current < location && current != end_ ) + { + Char c = *current++; + if ( c == '\r' ) + { + if ( *current == '\n' ) + ++current; + lastLineStart = current; + ++line; + } + else if ( c == '\n' ) + { + lastLineStart = current; + ++line; + } + } + // column & line start at 1 + column = int(location - lastLineStart) + 1; + ++line; +} + + +std::string +Reader::getLocationLineAndColumn( Location location ) const +{ + int line, column; + getLocationLineAndColumn( location, line, column ); + char buffer[18+16+16+1]; + sprintf( buffer, "Line %d, Column %d", line, column ); + return buffer; +} + + +std::string +Reader::getFormatedErrorMessages() const +{ + std::string formattedMessage; + for ( Errors::const_iterator itError = errors_.begin(); + itError != errors_.end(); + ++itError ) + { + const ErrorInfo &error = *itError; + formattedMessage += "* " + getLocationLineAndColumn( error.token_.start_ ) + "\n"; + formattedMessage += " " + error.message_ + "\n"; + if ( error.extra_ ) + formattedMessage += "See " + getLocationLineAndColumn( error.extra_ ) + " for detail.\n"; + } + return formattedMessage; +} + + +std::istream& operator>>( std::istream &sin, Value &root ) +{ + Json::Reader reader; + bool ok = reader.parse(sin, root, true); + //JSON_ASSERT( ok ); + if (!ok) throw std::runtime_error(reader.getFormatedErrorMessages()); + return sin; +} + + +} // namespace Json diff --git a/cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/public/json_value.cpp b/cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/public/json_value.cpp new file mode 100644 index 000000000..67638ca15 --- /dev/null +++ b/cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/public/json_value.cpp @@ -0,0 +1,1726 @@ +#include +#include +#include +#include +#include +#include +#include +#ifdef JSON_USE_CPPTL +# include +#endif +#include // size_t +#ifndef JSON_USE_SIMPLE_INTERNAL_ALLOCATOR +# include "json_batchallocator.h" +#endif // #ifndef JSON_USE_SIMPLE_INTERNAL_ALLOCATOR + +#define JSON_ASSERT_UNREACHABLE assert( false ) +#define JSON_ASSERT( condition ) assert( condition ); // @todo <= change this into an exception throw +#define JSON_ASSERT_MESSAGE( condition, message ) if (!( condition )) throw std::runtime_error( message ); + +namespace Json { + +// QNX is strict about declaring C symbols in the std namespace. +#ifdef __QNXNTO__ +using std::memcpy; +using std::strchr; +using std::strcmp; +using std::strlen; +#endif + +const Value Value::null; +const Int Value::minInt = Int( ~(UInt(-1)/2) ); +const Int Value::maxInt = Int( UInt(-1)/2 ); +const UInt Value::maxUInt = UInt(-1); + +// A "safe" implementation of strdup. Allow null pointer to be passed. +// Also avoid warning on msvc80. +// +//inline char *safeStringDup( const char *czstring ) +//{ +// if ( czstring ) +// { +// const size_t length = (unsigned int)( strlen(czstring) + 1 ); +// char *newString = static_cast( malloc( length ) ); +// memcpy( newString, czstring, length ); +// return newString; +// } +// return 0; +//} +// +//inline char *safeStringDup( const std::string &str ) +//{ +// if ( !str.empty() ) +// { +// const size_t length = str.length(); +// char *newString = static_cast( malloc( length + 1 ) ); +// memcpy( newString, str.c_str(), length ); +// newString[length] = 0; +// return newString; +// } +// return 0; +//} + +ValueAllocator::~ValueAllocator() +{ +} + +class DefaultValueAllocator : public ValueAllocator +{ +public: + virtual ~DefaultValueAllocator() + { + } + + virtual char *makeMemberName( const char *memberName ) + { + return duplicateStringValue( memberName ); + } + + virtual void releaseMemberName( char *memberName ) + { + releaseStringValue( memberName ); + } + + virtual char *duplicateStringValue( const char *value, + unsigned int length = unknown ) + { + //@todo investigate this old optimization + //if ( !value || value[0] == 0 ) + // return 0; + + if ( length == unknown ) + length = (unsigned int)strlen(value); + char *newString = static_cast( malloc( length + 1 ) ); + memcpy( newString, value, length ); + newString[length] = 0; + return newString; + } + + virtual void releaseStringValue( char *value ) + { + if ( value ) + free( value ); + } +}; + +static ValueAllocator *&valueAllocator() +{ + static DefaultValueAllocator defaultAllocator; + static ValueAllocator *valueAllocator = &defaultAllocator; + return valueAllocator; +} + +static struct DummyValueAllocatorInitializer { + DummyValueAllocatorInitializer() + { + valueAllocator(); // ensure valueAllocator() statics are initialized before main(). + } +} dummyValueAllocatorInitializer; + + + +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// ValueInternals... +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +#ifdef JSON_VALUE_USE_INTERNAL_MAP +# include "json_internalarray.inl" +# include "json_internalmap.inl" +#endif // JSON_VALUE_USE_INTERNAL_MAP + +# include "json_valueiterator.inl" + + +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// class Value::CommentInfo +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// + + +Value::CommentInfo::CommentInfo() + : comment_( 0 ) +{ +} + +Value::CommentInfo::~CommentInfo() +{ + if ( comment_ ) + valueAllocator()->releaseStringValue( comment_ ); +} + + +void +Value::CommentInfo::setComment( const char *text ) +{ + if ( comment_ ) + valueAllocator()->releaseStringValue( comment_ ); + JSON_ASSERT( text ); + JSON_ASSERT_MESSAGE( text[0]=='\0' || text[0]=='/', "Comments must start with /"); + // It seems that /**/ style comments are acceptable as well. + comment_ = valueAllocator()->duplicateStringValue( text ); +} + + +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// class Value::CZString +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +# ifndef JSON_VALUE_USE_INTERNAL_MAP + +// Notes: index_ indicates if the string was allocated when +// a string is stored. + +Value::CZString::CZString( int index ) + : cstr_( 0 ) + , index_( index ) +{ +} + +Value::CZString::CZString( const char *cstr, DuplicationPolicy allocate ) + : cstr_( allocate == duplicate ? valueAllocator()->makeMemberName(cstr) + : cstr ) + , index_( allocate ) +{ +} + +Value::CZString::CZString( const CZString &other ) +: cstr_( other.index_ != noDuplication && other.cstr_ != 0 + ? valueAllocator()->makeMemberName( other.cstr_ ) + : other.cstr_ ) + , index_( other.cstr_ ? (other.index_ == noDuplication ? noDuplication : duplicate) + : other.index_ ) +{ +} + +Value::CZString::~CZString() +{ + if ( cstr_ && index_ == duplicate ) + valueAllocator()->releaseMemberName( const_cast( cstr_ ) ); +} + +void +Value::CZString::swap( CZString &other ) +{ + std::swap( cstr_, other.cstr_ ); + std::swap( index_, other.index_ ); +} + +Value::CZString & +Value::CZString::operator =( const CZString &other ) +{ + CZString temp( other ); + swap( temp ); + return *this; +} + +bool +Value::CZString::operator<( const CZString &other ) const +{ + if ( cstr_ ) + return strcmp( cstr_, other.cstr_ ) < 0; + return index_ < other.index_; +} + +bool +Value::CZString::operator==( const CZString &other ) const +{ + if ( cstr_ ) + return strcmp( cstr_, other.cstr_ ) == 0; + return index_ == other.index_; +} + + +int +Value::CZString::index() const +{ + return index_; +} + + +const char * +Value::CZString::c_str() const +{ + return cstr_; +} + +bool +Value::CZString::isStaticString() const +{ + return index_ == noDuplication; +} + +#endif // ifndef JSON_VALUE_USE_INTERNAL_MAP + + +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// class Value::Value +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// + +/*! \internal Default constructor initialization must be equivalent to: + * memset( this, 0, sizeof(Value) ) + * This optimization is used in ValueInternalMap fast allocator. + */ +Value::Value( ValueType type ) + : type_( type ) + , allocated_( 0 ) + , comments_( 0 ) +# ifdef JSON_VALUE_USE_INTERNAL_MAP + , itemIsUsed_( 0 ) +#endif +{ + switch ( type ) + { + case nullValue: + break; + case intValue: + case uintValue: + value_.int_ = 0; + break; + case realValue: + value_.real_ = 0.0; + break; + case stringValue: + value_.string_ = 0; + break; +#ifndef JSON_VALUE_USE_INTERNAL_MAP + case arrayValue: + case objectValue: + value_.map_ = new ObjectValues(); + break; +#else + case arrayValue: + value_.array_ = arrayAllocator()->newArray(); + break; + case objectValue: + value_.map_ = mapAllocator()->newMap(); + break; +#endif + case booleanValue: + value_.bool_ = false; + break; + default: + JSON_ASSERT_UNREACHABLE; + } +} + + +Value::Value( Int value ) + : type_( intValue ) + , comments_( 0 ) +# ifdef JSON_VALUE_USE_INTERNAL_MAP + , itemIsUsed_( 0 ) +#endif +{ + value_.int_ = value; +} + + +Value::Value( UInt value ) + : type_( uintValue ) + , comments_( 0 ) +# ifdef JSON_VALUE_USE_INTERNAL_MAP + , itemIsUsed_( 0 ) +#endif +{ + value_.uint_ = value; +} + +Value::Value( double value ) + : type_( realValue ) + , comments_( 0 ) +# ifdef JSON_VALUE_USE_INTERNAL_MAP + , itemIsUsed_( 0 ) +#endif +{ + value_.real_ = value; +} + +Value::Value( const char *value ) + : type_( stringValue ) + , allocated_( true ) + , comments_( 0 ) +# ifdef JSON_VALUE_USE_INTERNAL_MAP + , itemIsUsed_( 0 ) +#endif +{ + value_.string_ = valueAllocator()->duplicateStringValue( value ); +} + + +Value::Value( const char *beginValue, + const char *endValue ) + : type_( stringValue ) + , allocated_( true ) + , comments_( 0 ) +# ifdef JSON_VALUE_USE_INTERNAL_MAP + , itemIsUsed_( 0 ) +#endif +{ + value_.string_ = valueAllocator()->duplicateStringValue( beginValue, + UInt(endValue - beginValue) ); +} + + +Value::Value( const std::string &value ) + : type_( stringValue ) + , allocated_( true ) + , comments_( 0 ) +# ifdef JSON_VALUE_USE_INTERNAL_MAP + , itemIsUsed_( 0 ) +#endif +{ + value_.string_ = valueAllocator()->duplicateStringValue( value.c_str(), + (unsigned int)value.length() ); + +} + +Value::Value( const StaticString &value ) + : type_( stringValue ) + , allocated_( false ) + , comments_( 0 ) +# ifdef JSON_VALUE_USE_INTERNAL_MAP + , itemIsUsed_( 0 ) +#endif +{ + value_.string_ = const_cast( value.c_str() ); +} + + +# ifdef JSON_USE_CPPTL +Value::Value( const CppTL::ConstString &value ) + : type_( stringValue ) + , allocated_( true ) + , comments_( 0 ) +# ifdef JSON_VALUE_USE_INTERNAL_MAP + , itemIsUsed_( 0 ) +#endif +{ + value_.string_ = valueAllocator()->duplicateStringValue( value, value.length() ); +} +# endif + +Value::Value( bool value ) + : type_( booleanValue ) + , comments_( 0 ) +# ifdef JSON_VALUE_USE_INTERNAL_MAP + , itemIsUsed_( 0 ) +#endif +{ + value_.bool_ = value; +} + + +Value::Value( const Value &other ) + : type_( other.type_ ) + , comments_( 0 ) +# ifdef JSON_VALUE_USE_INTERNAL_MAP + , itemIsUsed_( 0 ) +#endif +{ + switch ( type_ ) + { + case nullValue: + case intValue: + case uintValue: + case realValue: + case booleanValue: + value_ = other.value_; + break; + case stringValue: + if ( other.value_.string_ ) + { + value_.string_ = valueAllocator()->duplicateStringValue( other.value_.string_ ); + allocated_ = true; + } + else + value_.string_ = 0; + break; +#ifndef JSON_VALUE_USE_INTERNAL_MAP + case arrayValue: + case objectValue: + value_.map_ = new ObjectValues( *other.value_.map_ ); + break; +#else + case arrayValue: + value_.array_ = arrayAllocator()->newArrayCopy( *other.value_.array_ ); + break; + case objectValue: + value_.map_ = mapAllocator()->newMapCopy( *other.value_.map_ ); + break; +#endif + default: + JSON_ASSERT_UNREACHABLE; + } + if ( other.comments_ ) + { + comments_ = new CommentInfo[numberOfCommentPlacement]; + for ( int comment =0; comment < numberOfCommentPlacement; ++comment ) + { + const CommentInfo &otherComment = other.comments_[comment]; + if ( otherComment.comment_ ) + comments_[comment].setComment( otherComment.comment_ ); + } + } +} + + +Value::~Value() +{ + switch ( type_ ) + { + case nullValue: + case intValue: + case uintValue: + case realValue: + case booleanValue: + break; + case stringValue: + if ( allocated_ ) + valueAllocator()->releaseStringValue( value_.string_ ); + break; +#ifndef JSON_VALUE_USE_INTERNAL_MAP + case arrayValue: + case objectValue: + delete value_.map_; + break; +#else + case arrayValue: + arrayAllocator()->destructArray( value_.array_ ); + break; + case objectValue: + mapAllocator()->destructMap( value_.map_ ); + break; +#endif + default: + JSON_ASSERT_UNREACHABLE; + } + + if ( comments_ ) + delete[] comments_; +} + +Value & +Value::operator=( const Value &other ) +{ + Value temp( other ); + swap( temp ); + return *this; +} + +void +Value::swap( Value &other ) +{ + ValueType temp = type_; + type_ = other.type_; + other.type_ = temp; + std::swap( value_, other.value_ ); + int temp2 = allocated_; + allocated_ = other.allocated_; + other.allocated_ = temp2; +} + +ValueType +Value::type() const +{ + return type_; +} + + +int +Value::compare( const Value &other ) +{ + /* + int typeDelta = other.type_ - type_; + switch ( type_ ) + { + case nullValue: + + return other.type_ == type_; + case intValue: + if ( other.type_.isNumeric() + case uintValue: + case realValue: + case booleanValue: + break; + case stringValue, + break; + case arrayValue: + delete value_.array_; + break; + case objectValue: + delete value_.map_; + default: + JSON_ASSERT_UNREACHABLE; + } + */ + return 0; // unreachable +} + +bool +Value::operator <( const Value &other ) const +{ + int typeDelta = type_ - other.type_; + if ( typeDelta ) + return typeDelta < 0 ? true : false; + switch ( type_ ) + { + case nullValue: + return false; + case intValue: + return value_.int_ < other.value_.int_; + case uintValue: + return value_.uint_ < other.value_.uint_; + case realValue: + return value_.real_ < other.value_.real_; + case booleanValue: + return value_.bool_ < other.value_.bool_; + case stringValue: + return ( value_.string_ == 0 && other.value_.string_ ) + || ( other.value_.string_ + && value_.string_ + && strcmp( value_.string_, other.value_.string_ ) < 0 ); +#ifndef JSON_VALUE_USE_INTERNAL_MAP + case arrayValue: + case objectValue: + { + int delta = int( value_.map_->size() - other.value_.map_->size() ); + if ( delta ) + return delta < 0; + return (*value_.map_) < (*other.value_.map_); + } +#else + case arrayValue: + return value_.array_->compare( *(other.value_.array_) ) < 0; + case objectValue: + return value_.map_->compare( *(other.value_.map_) ) < 0; +#endif + default: + JSON_ASSERT_UNREACHABLE; + } + return 0; // unreachable +} + +bool +Value::operator <=( const Value &other ) const +{ + return !(other > *this); +} + +bool +Value::operator >=( const Value &other ) const +{ + return !(*this < other); +} + +bool +Value::operator >( const Value &other ) const +{ + return other < *this; +} + +bool +Value::operator ==( const Value &other ) const +{ + //if ( type_ != other.type_ ) + // GCC 2.95.3 says: + // attempt to take address of bit-field structure member `Json::Value::type_' + // Beats me, but a temp solves the problem. + int temp = other.type_; + if ( type_ != temp ) + return false; + switch ( type_ ) + { + case nullValue: + return true; + case intValue: + return value_.int_ == other.value_.int_; + case uintValue: + return value_.uint_ == other.value_.uint_; + case realValue: + return value_.real_ == other.value_.real_; + case booleanValue: + return value_.bool_ == other.value_.bool_; + case stringValue: + return ( value_.string_ == other.value_.string_ ) + || ( other.value_.string_ + && value_.string_ + && strcmp( value_.string_, other.value_.string_ ) == 0 ); +#ifndef JSON_VALUE_USE_INTERNAL_MAP + case arrayValue: + case objectValue: + return value_.map_->size() == other.value_.map_->size() + && (*value_.map_) == (*other.value_.map_); +#else + case arrayValue: + return value_.array_->compare( *(other.value_.array_) ) == 0; + case objectValue: + return value_.map_->compare( *(other.value_.map_) ) == 0; +#endif + default: + JSON_ASSERT_UNREACHABLE; + } + return 0; // unreachable +} + +bool +Value::operator !=( const Value &other ) const +{ + return !( *this == other ); +} + +const char * +Value::asCString() const +{ + JSON_ASSERT( type_ == stringValue ); + return value_.string_; +} + + +std::string +Value::asString() const +{ + switch ( type_ ) + { + case nullValue: + return ""; + case stringValue: + return value_.string_ ? value_.string_ : ""; + case booleanValue: + return value_.bool_ ? "true" : "false"; + case intValue: + case uintValue: + case realValue: + case arrayValue: + case objectValue: + JSON_ASSERT_MESSAGE( false, "Type is not convertible to string" ); + default: + JSON_ASSERT_UNREACHABLE; + } + return ""; // unreachable +} + +# ifdef JSON_USE_CPPTL +CppTL::ConstString +Value::asConstString() const +{ + return CppTL::ConstString( asString().c_str() ); +} +# endif + +Value::Int +Value::asInt() const +{ + switch ( type_ ) + { + case nullValue: + return 0; + case intValue: + return value_.int_; + case uintValue: + JSON_ASSERT_MESSAGE( value_.uint_ < (unsigned)maxInt, "integer out of signed integer range" ); + return value_.uint_; + case realValue: + JSON_ASSERT_MESSAGE( value_.real_ >= minInt && value_.real_ <= maxInt, "Real out of signed integer range" ); + return Int( value_.real_ ); + case booleanValue: + return value_.bool_ ? 1 : 0; + case stringValue: + case arrayValue: + case objectValue: + JSON_ASSERT_MESSAGE( false, "Type is not convertible to int" ); + default: + JSON_ASSERT_UNREACHABLE; + } + return 0; // unreachable; +} + +Value::UInt +Value::asUInt() const +{ + switch ( type_ ) + { + case nullValue: + return 0; + case intValue: + JSON_ASSERT_MESSAGE( value_.int_ >= 0, "Negative integer can not be converted to unsigned integer" ); + return value_.int_; + case uintValue: + return value_.uint_; + case realValue: + JSON_ASSERT_MESSAGE( value_.real_ >= 0 && value_.real_ <= maxUInt, "Real out of unsigned integer range" ); + return UInt( value_.real_ ); + case booleanValue: + return value_.bool_ ? 1 : 0; + case stringValue: + case arrayValue: + case objectValue: + JSON_ASSERT_MESSAGE( false, "Type is not convertible to uint" ); + default: + JSON_ASSERT_UNREACHABLE; + } + return 0; // unreachable; +} + +double +Value::asDouble() const +{ + switch ( type_ ) + { + case nullValue: + return 0.0; + case intValue: + return value_.int_; + case uintValue: + return value_.uint_; + case realValue: + return value_.real_; + case booleanValue: + return value_.bool_ ? 1.0 : 0.0; + case stringValue: + case arrayValue: + case objectValue: + JSON_ASSERT_MESSAGE( false, "Type is not convertible to double" ); + default: + JSON_ASSERT_UNREACHABLE; + } + return 0; // unreachable; +} + +bool +Value::asBool() const +{ + switch ( type_ ) + { + case nullValue: + return false; + case intValue: + case uintValue: + return value_.int_ != 0; + case realValue: + return value_.real_ != 0.0; + case booleanValue: + return value_.bool_; + case stringValue: + return value_.string_ && value_.string_[0] != 0; + case arrayValue: + case objectValue: + return value_.map_->size() != 0; + default: + JSON_ASSERT_UNREACHABLE; + } + return false; // unreachable; +} + + +bool +Value::isConvertibleTo( ValueType other ) const +{ + switch ( type_ ) + { + case nullValue: + return true; + case intValue: + return ( other == nullValue && value_.int_ == 0 ) + || other == intValue + || ( other == uintValue && value_.int_ >= 0 ) + || other == realValue + || other == stringValue + || other == booleanValue; + case uintValue: + return ( other == nullValue && value_.uint_ == 0 ) + || ( other == intValue && value_.uint_ <= (unsigned)maxInt ) + || other == uintValue + || other == realValue + || other == stringValue + || other == booleanValue; + case realValue: + return ( other == nullValue && value_.real_ == 0.0 ) + || ( other == intValue && value_.real_ >= minInt && value_.real_ <= maxInt ) + || ( other == uintValue && value_.real_ >= 0 && value_.real_ <= maxUInt ) + || other == realValue + || other == stringValue + || other == booleanValue; + case booleanValue: + return ( other == nullValue && value_.bool_ == false ) + || other == intValue + || other == uintValue + || other == realValue + || other == stringValue + || other == booleanValue; + case stringValue: + return other == stringValue + || ( other == nullValue && (!value_.string_ || value_.string_[0] == 0) ); + case arrayValue: + return other == arrayValue + || ( other == nullValue && value_.map_->size() == 0 ); + case objectValue: + return other == objectValue + || ( other == nullValue && value_.map_->size() == 0 ); + default: + JSON_ASSERT_UNREACHABLE; + } + return false; // unreachable; +} + + +/// Number of values in array or object +Value::UInt +Value::size() const +{ + switch ( type_ ) + { + case nullValue: + case intValue: + case uintValue: + case realValue: + case booleanValue: + case stringValue: + return 0; +#ifndef JSON_VALUE_USE_INTERNAL_MAP + case arrayValue: // size of the array is highest index + 1 + if ( !value_.map_->empty() ) + { + ObjectValues::const_iterator itLast = value_.map_->end(); + --itLast; + return (*itLast).first.index()+1; + } + return 0; + case objectValue: + return Int( value_.map_->size() ); +#else + case arrayValue: + return Int( value_.array_->size() ); + case objectValue: + return Int( value_.map_->size() ); +#endif + default: + JSON_ASSERT_UNREACHABLE; + } + return 0; // unreachable; +} + + +bool +Value::empty() const +{ + if ( isNull() || isArray() || isObject() ) + return size() == 0u; + else + return false; +} + + +bool +Value::operator!() const +{ + return isNull(); +} + + +void +Value::clear() +{ + JSON_ASSERT( type_ == nullValue || type_ == arrayValue || type_ == objectValue ); + + switch ( type_ ) + { +#ifndef JSON_VALUE_USE_INTERNAL_MAP + case arrayValue: + case objectValue: + value_.map_->clear(); + break; +#else + case arrayValue: + value_.array_->clear(); + break; + case objectValue: + value_.map_->clear(); + break; +#endif + default: + break; + } +} + +void +Value::resize( UInt newSize ) +{ + JSON_ASSERT( type_ == nullValue || type_ == arrayValue ); + if ( type_ == nullValue ) + *this = Value( arrayValue ); +#ifndef JSON_VALUE_USE_INTERNAL_MAP + UInt oldSize = size(); + if ( newSize == 0 ) + clear(); + else if ( newSize > oldSize ) + (*this)[ newSize - 1 ]; + else + { + for ( UInt index = newSize; index < oldSize; ++index ) + value_.map_->erase( index ); + assert( size() == newSize ); + } +#else + value_.array_->resize( newSize ); +#endif +} + + +Value & +Value::operator[]( UInt index ) +{ + JSON_ASSERT( type_ == nullValue || type_ == arrayValue ); + if ( type_ == nullValue ) + *this = Value( arrayValue ); +#ifndef JSON_VALUE_USE_INTERNAL_MAP + CZString key( index ); + ObjectValues::iterator it = value_.map_->lower_bound( key ); + if ( it != value_.map_->end() && (*it).first == key ) + return (*it).second; + + ObjectValues::value_type defaultValue( key, null ); + it = value_.map_->insert( it, defaultValue ); + return (*it).second; +#else + return value_.array_->resolveReference( index ); +#endif +} + + +const Value & +Value::operator[]( UInt index ) const +{ + JSON_ASSERT( type_ == nullValue || type_ == arrayValue ); + if ( type_ == nullValue ) + return null; +#ifndef JSON_VALUE_USE_INTERNAL_MAP + CZString key( index ); + ObjectValues::const_iterator it = value_.map_->find( key ); + if ( it == value_.map_->end() ) + return null; + return (*it).second; +#else + Value *value = value_.array_->find( index ); + return value ? *value : null; +#endif +} + + +Value & +Value::operator[]( const char *key ) +{ + return resolveReference( key, false ); +} + + +Value & +Value::resolveReference( const char *key, + bool isStatic ) +{ + JSON_ASSERT( type_ == nullValue || type_ == objectValue ); + if ( type_ == nullValue ) + *this = Value( objectValue ); +#ifndef JSON_VALUE_USE_INTERNAL_MAP + CZString actualKey( key, isStatic ? CZString::noDuplication + : CZString::duplicateOnCopy ); + ObjectValues::iterator it = value_.map_->lower_bound( actualKey ); + if ( it != value_.map_->end() && (*it).first == actualKey ) + return (*it).second; + + ObjectValues::value_type defaultValue( actualKey, null ); + it = value_.map_->insert( it, defaultValue ); + Value &value = (*it).second; + return value; +#else + return value_.map_->resolveReference( key, isStatic ); +#endif +} + + +Value +Value::get( UInt index, + const Value &defaultValue ) const +{ + const Value *value = &((*this)[index]); + return value == &null ? defaultValue : *value; +} + + +bool +Value::isValidIndex( UInt index ) const +{ + return index < size(); +} + + + +const Value & +Value::operator[]( const char *key ) const +{ + JSON_ASSERT( type_ == nullValue || type_ == objectValue ); + if ( type_ == nullValue ) + return null; +#ifndef JSON_VALUE_USE_INTERNAL_MAP + CZString actualKey( key, CZString::noDuplication ); + ObjectValues::const_iterator it = value_.map_->find( actualKey ); + if ( it == value_.map_->end() ) + return null; + return (*it).second; +#else + const Value *value = value_.map_->find( key ); + return value ? *value : null; +#endif +} + + +Value & +Value::operator[]( const std::string &key ) +{ + return (*this)[ key.c_str() ]; +} + + +const Value & +Value::operator[]( const std::string &key ) const +{ + return (*this)[ key.c_str() ]; +} + +Value & +Value::operator[]( const StaticString &key ) +{ + return resolveReference( key, true ); +} + + +# ifdef JSON_USE_CPPTL +Value & +Value::operator[]( const CppTL::ConstString &key ) +{ + return (*this)[ key.c_str() ]; +} + + +const Value & +Value::operator[]( const CppTL::ConstString &key ) const +{ + return (*this)[ key.c_str() ]; +} +# endif + + +Value & +Value::append( const Value &value ) +{ + return (*this)[size()] = value; +} + + +Value +Value::get( const char *key, + const Value &defaultValue ) const +{ + const Value *value = &((*this)[key]); + return value == &null ? defaultValue : *value; +} + + +Value +Value::get( const std::string &key, + const Value &defaultValue ) const +{ + return get( key.c_str(), defaultValue ); +} + +Value +Value::removeMember( const char* key ) +{ + JSON_ASSERT( type_ == nullValue || type_ == objectValue ); + if ( type_ == nullValue ) + return null; +#ifndef JSON_VALUE_USE_INTERNAL_MAP + CZString actualKey( key, CZString::noDuplication ); + ObjectValues::iterator it = value_.map_->find( actualKey ); + if ( it == value_.map_->end() ) + return null; + Value old(it->second); + value_.map_->erase(it); + return old; +#else + Value *value = value_.map_->find( key ); + if (value){ + Value old(*value); + value_.map_.remove( key ); + return old; + } else { + return null; + } +#endif +} + +Value +Value::removeMember( const std::string &key ) +{ + return removeMember( key.c_str() ); +} + +# ifdef JSON_USE_CPPTL +Value +Value::get( const CppTL::ConstString &key, + const Value &defaultValue ) const +{ + return get( key.c_str(), defaultValue ); +} +# endif + +bool +Value::isMember( const char *key ) const +{ + const Value *value = &((*this)[key]); + return value != &null; +} + + +bool +Value::isMember( const std::string &key ) const +{ + return isMember( key.c_str() ); +} + + +# ifdef JSON_USE_CPPTL +bool +Value::isMember( const CppTL::ConstString &key ) const +{ + return isMember( key.c_str() ); +} +#endif + +Value::Members +Value::getMemberNames() const +{ + JSON_ASSERT( type_ == nullValue || type_ == objectValue ); + if ( type_ == nullValue ) + return Value::Members(); + Members members; + members.reserve( value_.map_->size() ); +#ifndef JSON_VALUE_USE_INTERNAL_MAP + ObjectValues::const_iterator it = value_.map_->begin(); + ObjectValues::const_iterator itEnd = value_.map_->end(); + for ( ; it != itEnd; ++it ) + members.push_back( std::string( (*it).first.c_str() ) ); +#else + ValueInternalMap::IteratorState it; + ValueInternalMap::IteratorState itEnd; + value_.map_->makeBeginIterator( it ); + value_.map_->makeEndIterator( itEnd ); + for ( ; !ValueInternalMap::equals( it, itEnd ); ValueInternalMap::increment(it) ) + members.push_back( std::string( ValueInternalMap::key( it ) ) ); +#endif + return members; +} +// +//# ifdef JSON_USE_CPPTL +//EnumMemberNames +//Value::enumMemberNames() const +//{ +// if ( type_ == objectValue ) +// { +// return CppTL::Enum::any( CppTL::Enum::transform( +// CppTL::Enum::keys( *(value_.map_), CppTL::Type() ), +// MemberNamesTransform() ) ); +// } +// return EnumMemberNames(); +//} +// +// +//EnumValues +//Value::enumValues() const +//{ +// if ( type_ == objectValue || type_ == arrayValue ) +// return CppTL::Enum::anyValues( *(value_.map_), +// CppTL::Type() ); +// return EnumValues(); +//} +// +//# endif + + +bool +Value::isNull() const +{ + return type_ == nullValue; +} + + +bool +Value::isBool() const +{ + return type_ == booleanValue; +} + + +bool +Value::isInt() const +{ + return type_ == intValue; +} + + +bool +Value::isUInt() const +{ + return type_ == uintValue; +} + + +bool +Value::isIntegral() const +{ + return type_ == intValue + || type_ == uintValue + || type_ == booleanValue; +} + + +bool +Value::isDouble() const +{ + return type_ == realValue; +} + + +bool +Value::isNumeric() const +{ + return isIntegral() || isDouble(); +} + + +bool +Value::isString() const +{ + return type_ == stringValue; +} + + +bool +Value::isArray() const +{ + return type_ == nullValue || type_ == arrayValue; +} + + +bool +Value::isObject() const +{ + return type_ == nullValue || type_ == objectValue; +} + + +void +Value::setComment( const char *comment, + CommentPlacement placement ) +{ + if ( !comments_ ) + comments_ = new CommentInfo[numberOfCommentPlacement]; + comments_[placement].setComment( comment ); +} + + +void +Value::setComment( const std::string &comment, + CommentPlacement placement ) +{ + setComment( comment.c_str(), placement ); +} + + +bool +Value::hasComment( CommentPlacement placement ) const +{ + return comments_ != 0 && comments_[placement].comment_ != 0; +} + +std::string +Value::getComment( CommentPlacement placement ) const +{ + if ( hasComment(placement) ) + return comments_[placement].comment_; + return ""; +} + + +std::string +Value::toStyledString() const +{ + StyledWriter writer; + return writer.write( *this ); +} + + +Value::const_iterator +Value::begin() const +{ + switch ( type_ ) + { +#ifdef JSON_VALUE_USE_INTERNAL_MAP + case arrayValue: + if ( value_.array_ ) + { + ValueInternalArray::IteratorState it; + value_.array_->makeBeginIterator( it ); + return const_iterator( it ); + } + break; + case objectValue: + if ( value_.map_ ) + { + ValueInternalMap::IteratorState it; + value_.map_->makeBeginIterator( it ); + return const_iterator( it ); + } + break; +#else + case arrayValue: + case objectValue: + if ( value_.map_ ) + return const_iterator( value_.map_->begin() ); + break; +#endif + default: + break; + } + return const_iterator(); +} + +Value::const_iterator +Value::end() const +{ + switch ( type_ ) + { +#ifdef JSON_VALUE_USE_INTERNAL_MAP + case arrayValue: + if ( value_.array_ ) + { + ValueInternalArray::IteratorState it; + value_.array_->makeEndIterator( it ); + return const_iterator( it ); + } + break; + case objectValue: + if ( value_.map_ ) + { + ValueInternalMap::IteratorState it; + value_.map_->makeEndIterator( it ); + return const_iterator( it ); + } + break; +#else + case arrayValue: + case objectValue: + if ( value_.map_ ) + return const_iterator( value_.map_->end() ); + break; +#endif + default: + break; + } + return const_iterator(); +} + + +Value::iterator +Value::begin() +{ + switch ( type_ ) + { +#ifdef JSON_VALUE_USE_INTERNAL_MAP + case arrayValue: + if ( value_.array_ ) + { + ValueInternalArray::IteratorState it; + value_.array_->makeBeginIterator( it ); + return iterator( it ); + } + break; + case objectValue: + if ( value_.map_ ) + { + ValueInternalMap::IteratorState it; + value_.map_->makeBeginIterator( it ); + return iterator( it ); + } + break; +#else + case arrayValue: + case objectValue: + if ( value_.map_ ) + return iterator( value_.map_->begin() ); + break; +#endif + default: + break; + } + return iterator(); +} + +Value::iterator +Value::end() +{ + switch ( type_ ) + { +#ifdef JSON_VALUE_USE_INTERNAL_MAP + case arrayValue: + if ( value_.array_ ) + { + ValueInternalArray::IteratorState it; + value_.array_->makeEndIterator( it ); + return iterator( it ); + } + break; + case objectValue: + if ( value_.map_ ) + { + ValueInternalMap::IteratorState it; + value_.map_->makeEndIterator( it ); + return iterator( it ); + } + break; +#else + case arrayValue: + case objectValue: + if ( value_.map_ ) + return iterator( value_.map_->end() ); + break; +#endif + default: + break; + } + return iterator(); +} + + +// class PathArgument +// ////////////////////////////////////////////////////////////////// + +PathArgument::PathArgument() + : kind_( kindNone ) +{ +} + + +PathArgument::PathArgument( Value::UInt index ) + : index_( index ) + , kind_( kindIndex ) +{ +} + + +PathArgument::PathArgument( const char *key ) + : key_( key ) + , kind_( kindKey ) +{ +} + + +PathArgument::PathArgument( const std::string &key ) + : key_( key.c_str() ) + , kind_( kindKey ) +{ +} + +// class Path +// ////////////////////////////////////////////////////////////////// + +Path::Path( const std::string &path, + const PathArgument &a1, + const PathArgument &a2, + const PathArgument &a3, + const PathArgument &a4, + const PathArgument &a5 ) +{ + InArgs in; + in.push_back( &a1 ); + in.push_back( &a2 ); + in.push_back( &a3 ); + in.push_back( &a4 ); + in.push_back( &a5 ); + makePath( path, in ); +} + + +void +Path::makePath( const std::string &path, + const InArgs &in ) +{ + const char *current = path.c_str(); + const char *end = current + path.length(); + InArgs::const_iterator itInArg = in.begin(); + while ( current != end ) + { + if ( *current == '[' ) + { + ++current; + if ( *current == '%' ) + addPathInArg( path, in, itInArg, PathArgument::kindIndex ); + else + { + Value::UInt index = 0; + for ( ; current != end && *current >= '0' && *current <= '9'; ++current ) + index = index * 10 + Value::UInt(*current - '0'); + args_.push_back( index ); + } + if ( current == end || *current++ != ']' ) + invalidPath( path, int(current - path.c_str()) ); + } + else if ( *current == '%' ) + { + addPathInArg( path, in, itInArg, PathArgument::kindKey ); + ++current; + } + else if ( *current == '.' ) + { + ++current; + } + else + { + const char *beginName = current; + while ( current != end && !strchr( "[.", *current ) ) + ++current; + args_.push_back( std::string( beginName, current ) ); + } + } +} + + +void +Path::addPathInArg( const std::string &path, + const InArgs &in, + InArgs::const_iterator &itInArg, + PathArgument::Kind kind ) +{ + if ( itInArg == in.end() ) + { + // Error: missing argument %d + } + else if ( (*itInArg)->kind_ != kind ) + { + // Error: bad argument type + } + else + { + args_.push_back( **itInArg ); + } +} + + +void +Path::invalidPath( const std::string &path, + int location ) +{ + // Error: invalid path. +} + + +const Value & +Path::resolve( const Value &root ) const +{ + const Value *node = &root; + for ( Args::const_iterator it = args_.begin(); it != args_.end(); ++it ) + { + const PathArgument &arg = *it; + if ( arg.kind_ == PathArgument::kindIndex ) + { + if ( !node->isArray() || node->isValidIndex( arg.index_ ) ) + { + // Error: unable to resolve path (array value expected at position... + } + node = &((*node)[arg.index_]); + } + else if ( arg.kind_ == PathArgument::kindKey ) + { + if ( !node->isObject() ) + { + // Error: unable to resolve path (object value expected at position...) + } + node = &((*node)[arg.key_]); + if ( node == &Value::null ) + { + // Error: unable to resolve path (object has no member named '' at position...) + } + } + } + return *node; +} + + +Value +Path::resolve( const Value &root, + const Value &defaultValue ) const +{ + const Value *node = &root; + for ( Args::const_iterator it = args_.begin(); it != args_.end(); ++it ) + { + const PathArgument &arg = *it; + if ( arg.kind_ == PathArgument::kindIndex ) + { + if ( !node->isArray() || node->isValidIndex( arg.index_ ) ) + return defaultValue; + node = &((*node)[arg.index_]); + } + else if ( arg.kind_ == PathArgument::kindKey ) + { + if ( !node->isObject() ) + return defaultValue; + node = &((*node)[arg.key_]); + if ( node == &Value::null ) + return defaultValue; + } + } + return *node; +} + + +Value & +Path::make( Value &root ) const +{ + Value *node = &root; + for ( Args::const_iterator it = args_.begin(); it != args_.end(); ++it ) + { + const PathArgument &arg = *it; + if ( arg.kind_ == PathArgument::kindIndex ) + { + if ( !node->isArray() ) + { + // Error: node is not an array at position ... + } + node = &((*node)[arg.index_]); + } + else if ( arg.kind_ == PathArgument::kindKey ) + { + if ( !node->isObject() ) + { + // Error: node is not an object at position... + } + node = &((*node)[arg.key_]); + } + } + return *node; +} + + +} // namespace Json diff --git a/cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/public/json_valueiterator.inl b/cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/public/json_valueiterator.inl new file mode 100644 index 000000000..736e260ea --- /dev/null +++ b/cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/public/json_valueiterator.inl @@ -0,0 +1,292 @@ +// included by json_value.cpp +// everything is within Json namespace + + +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// class ValueIteratorBase +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// + +ValueIteratorBase::ValueIteratorBase() +#ifndef JSON_VALUE_USE_INTERNAL_MAP + : current_() + , isNull_( true ) +{ +} +#else + : isArray_( true ) + , isNull_( true ) +{ + iterator_.array_ = ValueInternalArray::IteratorState(); +} +#endif + + +#ifndef JSON_VALUE_USE_INTERNAL_MAP +ValueIteratorBase::ValueIteratorBase( const Value::ObjectValues::iterator ¤t ) + : current_( current ) + , isNull_( false ) +{ +} +#else +ValueIteratorBase::ValueIteratorBase( const ValueInternalArray::IteratorState &state ) + : isArray_( true ) +{ + iterator_.array_ = state; +} + + +ValueIteratorBase::ValueIteratorBase( const ValueInternalMap::IteratorState &state ) + : isArray_( false ) +{ + iterator_.map_ = state; +} +#endif + +Value & +ValueIteratorBase::deref() const +{ +#ifndef JSON_VALUE_USE_INTERNAL_MAP + return current_->second; +#else + if ( isArray_ ) + return ValueInternalArray::dereference( iterator_.array_ ); + return ValueInternalMap::value( iterator_.map_ ); +#endif +} + + +void +ValueIteratorBase::increment() +{ +#ifndef JSON_VALUE_USE_INTERNAL_MAP + ++current_; +#else + if ( isArray_ ) + ValueInternalArray::increment( iterator_.array_ ); + ValueInternalMap::increment( iterator_.map_ ); +#endif +} + + +void +ValueIteratorBase::decrement() +{ +#ifndef JSON_VALUE_USE_INTERNAL_MAP + --current_; +#else + if ( isArray_ ) + ValueInternalArray::decrement( iterator_.array_ ); + ValueInternalMap::decrement( iterator_.map_ ); +#endif +} + + +ValueIteratorBase::difference_type +ValueIteratorBase::computeDistance( const SelfType &other ) const +{ +#ifndef JSON_VALUE_USE_INTERNAL_MAP +# ifdef JSON_USE_CPPTL_SMALLMAP + return current_ - other.current_; +# else + // Iterator for null value are initialized using the default + // constructor, which initialize current_ to the default + // std::map::iterator. As begin() and end() are two instance + // of the default std::map::iterator, they can not be compared. + // To allow this, we handle this comparison specifically. + if ( isNull_ && other.isNull_ ) + { + return 0; + } + + + // Usage of std::distance is not portable (does not compile with Sun Studio 12 RogueWave STL, + // which is the one used by default). + // Using a portable hand-made version for non random iterator instead: + // return difference_type( std::distance( current_, other.current_ ) ); + difference_type myDistance = 0; + for ( Value::ObjectValues::iterator it = current_; it != other.current_; ++it ) + { + ++myDistance; + } + return myDistance; +# endif +#else + if ( isArray_ ) + return ValueInternalArray::distance( iterator_.array_, other.iterator_.array_ ); + return ValueInternalMap::distance( iterator_.map_, other.iterator_.map_ ); +#endif +} + + +bool +ValueIteratorBase::isEqual( const SelfType &other ) const +{ +#ifndef JSON_VALUE_USE_INTERNAL_MAP + if ( isNull_ ) + { + return other.isNull_; + } + return current_ == other.current_; +#else + if ( isArray_ ) + return ValueInternalArray::equals( iterator_.array_, other.iterator_.array_ ); + return ValueInternalMap::equals( iterator_.map_, other.iterator_.map_ ); +#endif +} + + +void +ValueIteratorBase::copy( const SelfType &other ) +{ +#ifndef JSON_VALUE_USE_INTERNAL_MAP + current_ = other.current_; +#else + if ( isArray_ ) + iterator_.array_ = other.iterator_.array_; + iterator_.map_ = other.iterator_.map_; +#endif +} + + +Value +ValueIteratorBase::key() const +{ +#ifndef JSON_VALUE_USE_INTERNAL_MAP + const Value::CZString czstring = (*current_).first; + if ( czstring.c_str() ) + { + if ( czstring.isStaticString() ) + return Value( StaticString( czstring.c_str() ) ); + return Value( czstring.c_str() ); + } + return Value( czstring.index() ); +#else + if ( isArray_ ) + return Value( ValueInternalArray::indexOf( iterator_.array_ ) ); + bool isStatic; + const char *memberName = ValueInternalMap::key( iterator_.map_, isStatic ); + if ( isStatic ) + return Value( StaticString( memberName ) ); + return Value( memberName ); +#endif +} + + +UInt +ValueIteratorBase::index() const +{ +#ifndef JSON_VALUE_USE_INTERNAL_MAP + const Value::CZString czstring = (*current_).first; + if ( !czstring.c_str() ) + return czstring.index(); + return Value::UInt( -1 ); +#else + if ( isArray_ ) + return Value::UInt( ValueInternalArray::indexOf( iterator_.array_ ) ); + return Value::UInt( -1 ); +#endif +} + + +const char * +ValueIteratorBase::memberName() const +{ +#ifndef JSON_VALUE_USE_INTERNAL_MAP + const char *name = (*current_).first.c_str(); + return name ? name : ""; +#else + if ( !isArray_ ) + return ValueInternalMap::key( iterator_.map_ ); + return ""; +#endif +} + + +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// class ValueConstIterator +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// + +ValueConstIterator::ValueConstIterator() +{ +} + + +#ifndef JSON_VALUE_USE_INTERNAL_MAP +ValueConstIterator::ValueConstIterator( const Value::ObjectValues::iterator ¤t ) + : ValueIteratorBase( current ) +{ +} +#else +ValueConstIterator::ValueConstIterator( const ValueInternalArray::IteratorState &state ) + : ValueIteratorBase( state ) +{ +} + +ValueConstIterator::ValueConstIterator( const ValueInternalMap::IteratorState &state ) + : ValueIteratorBase( state ) +{ +} +#endif + +ValueConstIterator & +ValueConstIterator::operator =( const ValueIteratorBase &other ) +{ + copy( other ); + return *this; +} + + +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// class ValueIterator +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// + +ValueIterator::ValueIterator() +{ +} + + +#ifndef JSON_VALUE_USE_INTERNAL_MAP +ValueIterator::ValueIterator( const Value::ObjectValues::iterator ¤t ) + : ValueIteratorBase( current ) +{ +} +#else +ValueIterator::ValueIterator( const ValueInternalArray::IteratorState &state ) + : ValueIteratorBase( state ) +{ +} + +ValueIterator::ValueIterator( const ValueInternalMap::IteratorState &state ) + : ValueIteratorBase( state ) +{ +} +#endif + +ValueIterator::ValueIterator( const ValueConstIterator &other ) + : ValueIteratorBase( other ) +{ +} + +ValueIterator::ValueIterator( const ValueIterator &other ) + : ValueIteratorBase( other ) +{ +} + +ValueIterator & +ValueIterator::operator =( const SelfType &other ) +{ + copy( other ); + return *this; +} diff --git a/cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/public/json_writer.cpp b/cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/public/json_writer.cpp new file mode 100644 index 000000000..a522ef6b0 --- /dev/null +++ b/cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/public/json_writer.cpp @@ -0,0 +1,829 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +#if _MSC_VER >= 1400 // VC++ 8.0 +#pragma warning( disable : 4996 ) // disable warning about strdup being deprecated. +#endif + +namespace Json { + +static bool isControlCharacter(char ch) +{ + return ch > 0 && ch <= 0x1F; +} + +static bool containsControlCharacter( const char* str ) +{ + while ( *str ) + { + if ( isControlCharacter( *(str++) ) ) + return true; + } + return false; +} +static void uintToString( unsigned int value, + char *¤t ) +{ + *--current = 0; + do + { + *--current = (value % 10) + '0'; + value /= 10; + } + while ( value != 0 ); +} + +std::string valueToString( Int value ) +{ + char buffer[32]; + char *current = buffer + sizeof(buffer); + bool isNegative = value < 0; + if ( isNegative ) + value = -value; + uintToString( UInt(value), current ); + if ( isNegative ) + *--current = '-'; + assert( current >= buffer ); + return current; +} + + +std::string valueToString( UInt value ) +{ + char buffer[32]; + char *current = buffer + sizeof(buffer); + uintToString( value, current ); + assert( current >= buffer ); + return current; +} + +std::string valueToString( double value ) +{ + char buffer[32]; +#if defined(_MSC_VER) && defined(__STDC_SECURE_LIB__) // Use secure version with visual studio 2005 to avoid warning. + sprintf_s(buffer, sizeof(buffer), "%#.16g", value); +#else + sprintf(buffer, "%#.16g", value); +#endif + char* ch = buffer + strlen(buffer) - 1; + if (*ch != '0') return buffer; // nothing to truncate, so save time + while(ch > buffer && *ch == '0'){ + --ch; + } + char* last_nonzero = ch; + while(ch >= buffer){ + switch(*ch){ + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + --ch; + continue; + case '.': + // Truncate zeroes to save bytes in output, but keep one. + *(last_nonzero+2) = '\0'; + return buffer; + default: + return buffer; + } + } + return buffer; +} + + +std::string valueToString( bool value ) +{ + return value ? "true" : "false"; +} + +std::string valueToQuotedString( const char *value ) +{ + // Not sure how to handle unicode... + if (strpbrk(value, "\"\\\b\f\n\r\t") == NULL && !containsControlCharacter( value )) + return std::string("\"") + value + "\""; + // We have to walk value and escape any special characters. + // Appending to std::string is not efficient, but this should be rare. + // (Note: forward slashes are *not* rare, but I am not escaping them.) + unsigned maxsize = strlen(value)*2 + 3; // allescaped+quotes+NULL + std::string result; + result.reserve(maxsize); // to avoid lots of mallocs + result += "\""; + for (const char* c=value; *c != 0; ++c) + { + switch(*c) + { + case '\"': + result += "\\\""; + break; + case '\\': + result += "\\\\"; + break; + case '\b': + result += "\\b"; + break; + case '\f': + result += "\\f"; + break; + case '\n': + result += "\\n"; + break; + case '\r': + result += "\\r"; + break; + case '\t': + result += "\\t"; + break; + //case '/': + // Even though \/ is considered a legal escape in JSON, a bare + // slash is also legal, so I see no reason to escape it. + // (I hope I am not misunderstanding something. + // blep notes: actually escaping \/ may be useful in javascript to avoid (*c); + result += oss.str(); + } + else + { + result += *c; + } + break; + } + } + result += "\""; + return result; +} + +// Class Writer +// ////////////////////////////////////////////////////////////////// +Writer::~Writer() +{ +} + + +// Class FastWriter +// ////////////////////////////////////////////////////////////////// + +FastWriter::FastWriter() + : yamlCompatibilityEnabled_( false ) +{ +} + + +void +FastWriter::enableYAMLCompatibility() +{ + yamlCompatibilityEnabled_ = true; +} + + +std::string +FastWriter::write( const Value &root ) +{ + document_ = ""; + writeValue( root ); + document_ += "\n"; + return document_; +} + + +void +FastWriter::writeValue( const Value &value ) +{ + switch ( value.type() ) + { + case nullValue: + document_ += "null"; + break; + case intValue: + document_ += valueToString( value.asInt() ); + break; + case uintValue: + document_ += valueToString( value.asUInt() ); + break; + case realValue: + document_ += valueToString( value.asDouble() ); + break; + case stringValue: + document_ += valueToQuotedString( value.asCString() ); + break; + case booleanValue: + document_ += valueToString( value.asBool() ); + break; + case arrayValue: + { + document_ += "["; + int size = value.size(); + for ( int index =0; index < size; ++index ) + { + if ( index > 0 ) + document_ += ","; + writeValue( value[index] ); + } + document_ += "]"; + } + break; + case objectValue: + { + Value::Members members( value.getMemberNames() ); + document_ += "{"; + for ( Value::Members::iterator it = members.begin(); + it != members.end(); + ++it ) + { + const std::string &name = *it; + if ( it != members.begin() ) + document_ += ","; + document_ += valueToQuotedString( name.c_str() ); + document_ += yamlCompatibilityEnabled_ ? ": " + : ":"; + writeValue( value[name] ); + } + document_ += "}"; + } + break; + } +} + + +// Class StyledWriter +// ////////////////////////////////////////////////////////////////// + +StyledWriter::StyledWriter() + : rightMargin_( 74 ) + , indentSize_( 3 ) +{ +} + + +std::string +StyledWriter::write( const Value &root ) +{ + document_ = ""; + addChildValues_ = false; + indentString_ = ""; + writeCommentBeforeValue( root ); + writeValue( root ); + writeCommentAfterValueOnSameLine( root ); + document_ += "\n"; + return document_; +} + + +void +StyledWriter::writeValue( const Value &value ) +{ + switch ( value.type() ) + { + case nullValue: + pushValue( "null" ); + break; + case intValue: + pushValue( valueToString( value.asInt() ) ); + break; + case uintValue: + pushValue( valueToString( value.asUInt() ) ); + break; + case realValue: + pushValue( valueToString( value.asDouble() ) ); + break; + case stringValue: + pushValue( valueToQuotedString( value.asCString() ) ); + break; + case booleanValue: + pushValue( valueToString( value.asBool() ) ); + break; + case arrayValue: + writeArrayValue( value); + break; + case objectValue: + { + Value::Members members( value.getMemberNames() ); + if ( members.empty() ) + pushValue( "{}" ); + else + { + writeWithIndent( "{" ); + indent(); + Value::Members::iterator it = members.begin(); + while ( true ) + { + const std::string &name = *it; + const Value &childValue = value[name]; + writeCommentBeforeValue( childValue ); + writeWithIndent( valueToQuotedString( name.c_str() ) ); + document_ += " : "; + writeValue( childValue ); + if ( ++it == members.end() ) + { + writeCommentAfterValueOnSameLine( childValue ); + break; + } + document_ += ","; + writeCommentAfterValueOnSameLine( childValue ); + } + unindent(); + writeWithIndent( "}" ); + } + } + break; + } +} + + +void +StyledWriter::writeArrayValue( const Value &value ) +{ + unsigned size = value.size(); + if ( size == 0 ) + pushValue( "[]" ); + else + { + bool isArrayMultiLine = isMultineArray( value ); + if ( isArrayMultiLine ) + { + writeWithIndent( "[" ); + indent(); + bool hasChildValue = !childValues_.empty(); + unsigned index =0; + while ( true ) + { + const Value &childValue = value[index]; + writeCommentBeforeValue( childValue ); + if ( hasChildValue ) + writeWithIndent( childValues_[index] ); + else + { + writeIndent(); + writeValue( childValue ); + } + if ( ++index == size ) + { + writeCommentAfterValueOnSameLine( childValue ); + break; + } + document_ += ","; + writeCommentAfterValueOnSameLine( childValue ); + } + unindent(); + writeWithIndent( "]" ); + } + else // output on a single line + { + assert( childValues_.size() == size ); + document_ += "[ "; + for ( unsigned index =0; index < size; ++index ) + { + if ( index > 0 ) + document_ += ", "; + document_ += childValues_[index]; + } + document_ += " ]"; + } + } +} + + +bool +StyledWriter::isMultineArray( const Value &value ) +{ + int size = value.size(); + bool isMultiLine = size*3 >= rightMargin_ ; + childValues_.clear(); + for ( int index =0; index < size && !isMultiLine; ++index ) + { + const Value &childValue = value[index]; + isMultiLine = isMultiLine || + ( (childValue.isArray() || childValue.isObject()) && + childValue.size() > 0 ); + } + if ( !isMultiLine ) // check if line length > max line length + { + childValues_.reserve( size ); + addChildValues_ = true; + int lineLength = 4 + (size-1)*2; // '[ ' + ', '*n + ' ]' + for ( int index =0; index < size && !isMultiLine; ++index ) + { + writeValue( value[index] ); + lineLength += int( childValues_[index].length() ); + isMultiLine = isMultiLine && hasCommentForValue( value[index] ); + } + addChildValues_ = false; + isMultiLine = isMultiLine || lineLength >= rightMargin_; + } + return isMultiLine; +} + + +void +StyledWriter::pushValue( const std::string &value ) +{ + if ( addChildValues_ ) + childValues_.push_back( value ); + else + document_ += value; +} + + +void +StyledWriter::writeIndent() +{ + if ( !document_.empty() ) + { + char last = document_[document_.length()-1]; + if ( last == ' ' ) // already indented + return; + if ( last != '\n' ) // Comments may add new-line + document_ += '\n'; + } + document_ += indentString_; +} + + +void +StyledWriter::writeWithIndent( const std::string &value ) +{ + writeIndent(); + document_ += value; +} + + +void +StyledWriter::indent() +{ + indentString_ += std::string( indentSize_, ' ' ); +} + + +void +StyledWriter::unindent() +{ + assert( int(indentString_.size()) >= indentSize_ ); + indentString_.resize( indentString_.size() - indentSize_ ); +} + + +void +StyledWriter::writeCommentBeforeValue( const Value &root ) +{ + if ( !root.hasComment( commentBefore ) ) + return; + document_ += normalizeEOL( root.getComment( commentBefore ) ); + document_ += "\n"; +} + + +void +StyledWriter::writeCommentAfterValueOnSameLine( const Value &root ) +{ + if ( root.hasComment( commentAfterOnSameLine ) ) + document_ += " " + normalizeEOL( root.getComment( commentAfterOnSameLine ) ); + + if ( root.hasComment( commentAfter ) ) + { + document_ += "\n"; + document_ += normalizeEOL( root.getComment( commentAfter ) ); + document_ += "\n"; + } +} + + +bool +StyledWriter::hasCommentForValue( const Value &value ) +{ + return value.hasComment( commentBefore ) + || value.hasComment( commentAfterOnSameLine ) + || value.hasComment( commentAfter ); +} + + +std::string +StyledWriter::normalizeEOL( const std::string &text ) +{ + std::string normalized; + normalized.reserve( text.length() ); + const char *begin = text.c_str(); + const char *end = begin + text.length(); + const char *current = begin; + while ( current != end ) + { + char c = *current++; + if ( c == '\r' ) // mac or dos EOL + { + if ( *current == '\n' ) // convert dos EOL + ++current; + normalized += '\n'; + } + else // handle unix EOL & other char + normalized += c; + } + return normalized; +} + + +// Class StyledStreamWriter +// ////////////////////////////////////////////////////////////////// + +StyledStreamWriter::StyledStreamWriter( std::string indentation ) + : document_(NULL) + , rightMargin_( 74 ) + , indentation_( indentation ) +{ +} + + +void +StyledStreamWriter::write( std::ostream &out, const Value &root ) +{ + document_ = &out; + addChildValues_ = false; + indentString_ = ""; + writeCommentBeforeValue( root ); + writeValue( root ); + writeCommentAfterValueOnSameLine( root ); + *document_ << "\n"; + document_ = NULL; // Forget the stream, for safety. +} + + +void +StyledStreamWriter::writeValue( const Value &value ) +{ + switch ( value.type() ) + { + case nullValue: + pushValue( "null" ); + break; + case intValue: + pushValue( valueToString( value.asInt() ) ); + break; + case uintValue: + pushValue( valueToString( value.asUInt() ) ); + break; + case realValue: + pushValue( valueToString( value.asDouble() ) ); + break; + case stringValue: + pushValue( valueToQuotedString( value.asCString() ) ); + break; + case booleanValue: + pushValue( valueToString( value.asBool() ) ); + break; + case arrayValue: + writeArrayValue( value); + break; + case objectValue: + { + Value::Members members( value.getMemberNames() ); + if ( members.empty() ) + pushValue( "{}" ); + else + { + writeWithIndent( "{" ); + indent(); + Value::Members::iterator it = members.begin(); + while ( true ) + { + const std::string &name = *it; + const Value &childValue = value[name]; + writeCommentBeforeValue( childValue ); + writeWithIndent( valueToQuotedString( name.c_str() ) ); + *document_ << " : "; + writeValue( childValue ); + if ( ++it == members.end() ) + { + writeCommentAfterValueOnSameLine( childValue ); + break; + } + *document_ << ","; + writeCommentAfterValueOnSameLine( childValue ); + } + unindent(); + writeWithIndent( "}" ); + } + } + break; + } +} + + +void +StyledStreamWriter::writeArrayValue( const Value &value ) +{ + unsigned size = value.size(); + if ( size == 0 ) + pushValue( "[]" ); + else + { + bool isArrayMultiLine = isMultineArray( value ); + if ( isArrayMultiLine ) + { + writeWithIndent( "[" ); + indent(); + bool hasChildValue = !childValues_.empty(); + unsigned index =0; + while ( true ) + { + const Value &childValue = value[index]; + writeCommentBeforeValue( childValue ); + if ( hasChildValue ) + writeWithIndent( childValues_[index] ); + else + { + writeIndent(); + writeValue( childValue ); + } + if ( ++index == size ) + { + writeCommentAfterValueOnSameLine( childValue ); + break; + } + *document_ << ","; + writeCommentAfterValueOnSameLine( childValue ); + } + unindent(); + writeWithIndent( "]" ); + } + else // output on a single line + { + assert( childValues_.size() == size ); + *document_ << "[ "; + for ( unsigned index =0; index < size; ++index ) + { + if ( index > 0 ) + *document_ << ", "; + *document_ << childValues_[index]; + } + *document_ << " ]"; + } + } +} + + +bool +StyledStreamWriter::isMultineArray( const Value &value ) +{ + int size = value.size(); + bool isMultiLine = size*3 >= rightMargin_ ; + childValues_.clear(); + for ( int index =0; index < size && !isMultiLine; ++index ) + { + const Value &childValue = value[index]; + isMultiLine = isMultiLine || + ( (childValue.isArray() || childValue.isObject()) && + childValue.size() > 0 ); + } + if ( !isMultiLine ) // check if line length > max line length + { + childValues_.reserve( size ); + addChildValues_ = true; + int lineLength = 4 + (size-1)*2; // '[ ' + ', '*n + ' ]' + for ( int index =0; index < size && !isMultiLine; ++index ) + { + writeValue( value[index] ); + lineLength += int( childValues_[index].length() ); + isMultiLine = isMultiLine && hasCommentForValue( value[index] ); + } + addChildValues_ = false; + isMultiLine = isMultiLine || lineLength >= rightMargin_; + } + return isMultiLine; +} + + +void +StyledStreamWriter::pushValue( const std::string &value ) +{ + if ( addChildValues_ ) + childValues_.push_back( value ); + else + *document_ << value; +} + + +void +StyledStreamWriter::writeIndent() +{ + /* + Some comments in this method would have been nice. ;-) + + if ( !document_.empty() ) + { + char last = document_[document_.length()-1]; + if ( last == ' ' ) // already indented + return; + if ( last != '\n' ) // Comments may add new-line + *document_ << '\n'; + } + */ + *document_ << '\n' << indentString_; +} + + +void +StyledStreamWriter::writeWithIndent( const std::string &value ) +{ + writeIndent(); + *document_ << value; +} + + +void +StyledStreamWriter::indent() +{ + indentString_ += indentation_; +} + + +void +StyledStreamWriter::unindent() +{ + assert( indentString_.size() >= indentation_.size() ); + indentString_.resize( indentString_.size() - indentation_.size() ); +} + + +void +StyledStreamWriter::writeCommentBeforeValue( const Value &root ) +{ + if ( !root.hasComment( commentBefore ) ) + return; + *document_ << normalizeEOL( root.getComment( commentBefore ) ); + *document_ << "\n"; +} + + +void +StyledStreamWriter::writeCommentAfterValueOnSameLine( const Value &root ) +{ + if ( root.hasComment( commentAfterOnSameLine ) ) + *document_ << " " + normalizeEOL( root.getComment( commentAfterOnSameLine ) ); + + if ( root.hasComment( commentAfter ) ) + { + *document_ << "\n"; + *document_ << normalizeEOL( root.getComment( commentAfter ) ); + *document_ << "\n"; + } +} + + +bool +StyledStreamWriter::hasCommentForValue( const Value &value ) +{ + return value.hasComment( commentBefore ) + || value.hasComment( commentAfterOnSameLine ) + || value.hasComment( commentAfter ); +} + + +std::string +StyledStreamWriter::normalizeEOL( const std::string &text ) +{ + std::string normalized; + normalized.reserve( text.length() ); + const char *begin = text.c_str(); + const char *end = begin + text.length(); + const char *current = begin; + while ( current != end ) + { + char c = *current++; + if ( c == '\r' ) // mac or dos EOL + { + if ( *current == '\n' ) // convert dos EOL + ++current; + normalized += '\n'; + } + else // handle unix EOL & other char + normalized += c; + } + return normalized; +} + + +std::ostream& operator<<( std::ostream &sout, const Value &root ) +{ + Json::StyledStreamWriter writer; + writer.write(sout, root); + return sout; +} + + +} // namespace Json diff --git a/cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/public/plugin.cpp b/cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/public/plugin.cpp new file mode 100644 index 000000000..387fceaf1 --- /dev/null +++ b/cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/public/plugin.cpp @@ -0,0 +1,320 @@ +#include "plugin.h" +#include "tokenizer.h" + +#ifdef _WINDOWS +#include +BOOL APIENTRY DllMain( HANDLE hModule, + DWORD ul_reason_for_call, + LPVOID lpReserved ) +{ + return TRUE; +} +#else +#include +#include + +extern int errno; +#endif + +SendPluginEv SendPluginEvent; + +string g_GetSysErrMsg( void ) +{ + string strError = "Unknown"; + // Problem loading +#ifdef _WINDOWS + int nErrorCode = GetLastError(); + LPTSTR s; + if ( ::FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, + NULL, nErrorCode, 0, ( LPTSTR ) &s, 0, NULL ) ) + { + strError = s; + } + else + { + char szBuf[ 20 ]; + _snprintf_s( szBuf, _countof(szBuf), 19, "%d", nErrorCode ); + strError = szBuf; + } +#else + char szError[80]; + if ( strerror_r( errno, szError, sizeof(szError) ) ) + { + strError = "no description found"; + } + else + { + strError = szError; + } +#endif + return strError; +} + +void g_sleep( unsigned int mseconds ) +{ +#ifdef _WINDOWS + Sleep( mseconds ); +#else + usleep( mseconds * 1000 ); +#endif +} + +string& g_trim( string& str ) +{ + // Whitespace characters + char whspc[] = " \t\r\n\v\f"; + + // Whack off first part + size_t pos = str.find_first_not_of( whspc ); + + if ( pos != string::npos ) + str.replace( 0, pos, "" ); + + // Whack off trailing stuff + pos = str.find_last_not_of( whspc ); + + if ( pos != string::npos ) + str.replace( pos + 1, str.length() - pos, "" ); + + return str; +} + +void g_tokenize( const string& str, const string& delimiters, vector& tokens ) +{ + tokenize( str, tokens, delimiters ); +} + +char* SetEventFunc( SendPluginEv funcPtr ) +{ + static char * szObjList = onGetObjList(); + SendPluginEvent = funcPtr; + return szObjList; +} + + +const int nMAXSIZE = 512; +char* g_pszRetVal = NULL; + +//----------------------------------------------------------- +// Map from an object Id to an object instance +//----------------------------------------------------------- +typedef std::map StringToJExt_T; + +//----------------------------------------------------------- +// Map from a browser context to an id mapping +//----------------------------------------------------------- +typedef std::map VoidToMap_T; + +VoidToMap_T g_context2Map; + +class GlobalSharedModule +{ + +public: + GlobalSharedModule( void ) + { + g_pszRetVal = new char[ nMAXSIZE ]; + } + + ~GlobalSharedModule() + { + delete [] g_pszRetVal; + + VoidToMap_T::iterator posMaps; + + for ( posMaps = g_context2Map.begin(); posMaps != g_context2Map.end(); ++posMaps ) + { + StringToJExt_T& id2Obj = *posMaps->second; + StringToJExt_T::iterator posMap; + + for ( posMap = id2Obj.begin(); posMap != id2Obj.end(); ++posMap ) + { + JSExt* pJSExt = posMap->second; + + if ( pJSExt->CanDelete() ) + { + delete pJSExt; + } + } + + id2Obj.erase( id2Obj.begin(), id2Obj.end() ); + } + + g_context2Map.erase( g_context2Map.begin(), g_context2Map.end() ); + } +}; + +GlobalSharedModule g_sharedModule; + +char* g_str2global( const string& strRetVal ) +{ + int nLen = strRetVal.size(); + + if ( nLen >= nMAXSIZE ) + { + delete [] g_pszRetVal; + g_pszRetVal = new char[ nLen + 1 ]; + } + + else + { + // To minimize the number of memory reallocations, the assumption + // is that in most times this will be the case + delete [] g_pszRetVal; + g_pszRetVal = new char[ nMAXSIZE ]; + } + + strcpy( g_pszRetVal, strRetVal.c_str() ); + return g_pszRetVal; +} + +bool g_unregisterObject( const string& strObjId, void* pContext ) +{ + // Called by the plugin extension implementation + // if the extension handles the deletion of its object + + StringToJExt_T * pID2Obj = NULL; + + VoidToMap_T::iterator iter = g_context2Map.find( pContext ); + + if ( iter != g_context2Map.end() ) + { + pID2Obj = iter->second; + } + else + { + return false; + } + + StringToJExt_T& mapID2Obj = *pID2Obj; + + StringToJExt_T::iterator r = mapID2Obj.find( strObjId ); + + if ( r == mapID2Obj.end() ) + { + return false; + } + + mapID2Obj.erase( strObjId ); + return true; +} + +char* InvokeFunction( const char* szCommand, void* pContext ) +{ + StringToJExt_T * pID2Obj = NULL; + + VoidToMap_T::iterator iter = g_context2Map.find( pContext ); + + if ( iter != g_context2Map.end() ) + { + pID2Obj = iter->second; + } + else + { + pID2Obj = new StringToJExt_T; + g_context2Map[ pContext ] = pID2Obj; + } + + StringToJExt_T& mapID2Obj = *pID2Obj; + + string strFullCommand = szCommand; + vector arParams; + g_tokenize( strFullCommand, " ", arParams ); + string strCommand = arParams[ 0 ]; + string strRetVal = szERROR; + + if ( strCommand == szCREATE ) + { + string strClassName = arParams[ 1 ]; + string strObjId = arParams[ 2 ]; + + StringToJExt_T::iterator r = mapID2Obj.find( strObjId ); + + if ( r != mapID2Obj.end() ) + { + strRetVal += strObjId; + strRetVal += " :Object already exists."; + return g_str2global( strRetVal ); + } + + JSExt* pJSExt = onCreateObject( strClassName, strObjId ); + + if ( pJSExt == NULL ) + { + strRetVal += strObjId; + strRetVal += " :Unknown object type "; + strRetVal += strClassName; + return g_str2global( strRetVal ); + } + + pJSExt->m_pContext = pContext; + mapID2Obj[ strObjId ] = pJSExt; + + strRetVal = szOK; + strRetVal += strObjId; + return g_str2global( strRetVal ); + } + else + if ( strCommand == szINVOKE ) + { + string strObjId = arParams[ 1 ]; + string strMethod = arParams[ 2 ]; + + StringToJExt_T::iterator r = mapID2Obj.find( strObjId ); + + if ( r == mapID2Obj.end() ) + { + strRetVal += strObjId; + strRetVal += " :No object found for id."; + return g_str2global( strRetVal ); + } + + JSExt* pJSExt = r->second; + + size_t nLoc = strFullCommand.find( strObjId ); + + if ( nLoc == string::npos ) + { + strRetVal += strObjId; + strRetVal += " :Internal InvokeMethod error."; + return g_str2global( strRetVal ); + } + + if ( strMethod == szDISPOSE ) + { + StringToJExt_T::iterator r = mapID2Obj.find( strObjId ); + + if ( r == mapID2Obj.end() ) + { + strRetVal = szERROR; + strRetVal += strObjId; + return g_str2global( strRetVal ); + } + + JSExt * pJSExt = mapID2Obj[ strObjId ]; + + if ( pJSExt->CanDelete() ) + { + delete pJSExt; + } + + mapID2Obj.erase( strObjId ); + strRetVal = szOK; + strRetVal += strObjId; + return g_str2global( strRetVal ); + } + + size_t nSuffixLoc = nLoc + strObjId.size(); + string strInvoke = strFullCommand.substr( nSuffixLoc ); + strInvoke = g_trim( strInvoke ); + strRetVal = pJSExt->InvokeMethod( strInvoke ); + return g_str2global( strRetVal ); + } + + strRetVal += " :Unknown command "; + strRetVal += strCommand; + return g_str2global( strRetVal ); +} + +//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + diff --git a/cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/public/plugin.h b/cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/public/plugin.h new file mode 100644 index 000000000..4ef711691 --- /dev/null +++ b/cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/public/plugin.h @@ -0,0 +1,70 @@ +#ifndef _PLUGIN_H +#define _PLUGIN_H + +#include +#include +#include +#include +//#include "tokenizer.h" + +using namespace std; + +//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +//%% Functions exported by this DLL +//%% Should always be only SetEventFunc and InvokeFunction +//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +// g++ requires extern "C" otherwise the names of SetEventFunc and InvokeFunction +// are mangled C++ style. MS Visual Studio doesn't seem to care though. +extern "C" +{ + typedef void (*SendPluginEv)( const char* szEvent, void* pContext ); + char* SetEventFunc(SendPluginEv funcPtr); + char* InvokeFunction( const char* szCommand, void* pContext ); +} + +// JNEXT Framework function of the form: +// typedef void (*SendPluginEv)( const char* szEvent ); +// used to notify JavaScript of an asynchronous event +extern SendPluginEv SendPluginEvent; + +///////////////////////////////////////////////////////////////////////// +// Constants and methods common to all JNEXT extensions types +///////////////////////////////////////////////////////////////////////// +#define szERROR "Error " +#define szOK "Ok " + +#define szDISPOSE "Dispose" +#define szINVOKE "InvokeMethod" +#define szCREATE "CreateObj" + +///////////////////////////////////////////////////////////////////////// +// Utility functions +///////////////////////////////////////////////////////////////////////// +string& g_trim( string& str ); +void g_tokenize(const string& str,const string& delimiters, vector& tokens); +char* g_str2static( const string& strRetVal ); +void g_sleep( unsigned int mseconds ); +bool g_unregisterObject( const string& strObjId, void* pContext ); + + +///////////////////////////////////////////////////////////////////////// +// Abstract extension object +///////////////////////////////////////////////////////////////////////// +class JSExt +{ +public: + virtual ~JSExt() {}; + virtual string InvokeMethod( const string& strCommand ) = 0; + virtual bool CanDelete( void ) = 0; + virtual void TryDelete( void ) {} +public: + void* m_pContext; +}; + +///////////////////////////////////////////////////////////////////////// +// Callback functions to be implemented by the plugin implementation +///////////////////////////////////////////////////////////////////////// +extern char* onGetObjList( void ); +extern JSExt* onCreateObject( const string& strClassName, const string& strObjId ); + +#endif diff --git a/cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/public/tokenizer.cpp b/cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/public/tokenizer.cpp new file mode 100644 index 000000000..4a39573b9 --- /dev/null +++ b/cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/public/tokenizer.cpp @@ -0,0 +1,222 @@ +/************************************************************************ +The zlib/libpng License + +Copyright (c) 2006 Joerg Wiedenmann + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from +the use of this software. + +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; +you must not claim that you wrote the original software. +If you use this software in a product, an acknowledgment +in the product documentation would be appreciated but is +not required. + +2. Altered source versions must be plainly marked as such, +and must not be misrepresented as being the original software. + +3. This notice may not be removed or altered from any source distribution. + +***********************************************************************/ + +/******************************************************************** + created: 2006-01-28 + filename: tokenizer.cpp + author: Jörg Wiedenmann + + purpose: A tokenizer function which provides a very + customizable way of breaking up strings. + + history: 2006-01-28, Original version + 2006-03-04, Fixed a small parsing bug, thanks Elias. +*********************************************************************/ + +#include "tokenizer.h" + +using namespace std; + +void tokenize ( const string& str, vector& result, + const string& delimiters, const string& delimiters_preserve, + const string& quote, const string& esc ) +{ + // clear the vector + if ( false == result.empty() ) + { + result.clear(); + } + + string::size_type pos = 0; // the current position (char) in the string + char ch = 0; // buffer for the current character + char delimiter = 0; // the buffer for the delimiter char which + // will be added to the tokens if the delimiter + // is preserved + char current_quote = 0; // the char of the current open quote + bool quoted = false; // indicator if there is an open quote + string token; // string buffer for the token + bool token_complete = false; // indicates if the current token is + // read to be added to the result vector + string::size_type len = str.length(); // length of the input-string + + // for every char in the input-string + while ( len > pos ) + { + // get the character of the string and reset the delimiter buffer + ch = str.at(pos); + delimiter = 0; + + // assume ch isn't a delimiter + bool add_char = true; + + // check ... + + // ... if the delimiter is an escaped character + bool escaped = false; // indicates if the next char is protected + if ( false == esc.empty() ) // check if esc-chars are provided + { + if ( string::npos != esc.find_first_of(ch) ) + { + // get the escaped char + ++pos; + if ( pos < len ) // if there are more chars left + { + // get the next one + ch = str.at(pos); + + // add the escaped character to the token + add_char = true; + } + else // cannot get any more characters + { + // don't add the esc-char + add_char = false; + } + + // ignore the remaining delimiter checks + escaped = true; + } + } + + // ... if the delimiter is a quote + if ( false == quote.empty() && false == escaped ) + { + // if quote chars are provided and the char isn't protected + if ( string::npos != quote.find_first_of(ch) ) + { + // if not quoted, set state to open quote and set + // the quote character + if ( false == quoted ) + { + quoted = true; + current_quote = ch; + + // don't add the quote-char to the token + add_char = false; + } + else // if quote is open already + { + // check if it is the matching character to close it + if ( current_quote == ch ) + { + // close quote and reset the quote character + quoted = false; + current_quote = 0; + + // don't add the quote-char to the token + add_char = false; + } + } // else + } + } + + // ... if the delimiter isn't preserved + if ( false == delimiters.empty() && false == escaped && + false == quoted ) + { + // if a delimiter is provided and the char isn't protected by + // quote or escape char + if ( string::npos != delimiters.find_first_of(ch) ) + { + // if ch is a delimiter and the token string isn't empty + // the token is complete + if ( false == token.empty() ) // BUGFIX: 2006-03-04 + { + token_complete = true; + } + + // don't add the delimiter to the token + add_char = false; + } + } + + // ... if the delimiter is preserved - add it as a token + bool add_delimiter = false; + if ( false == delimiters_preserve.empty() && false == escaped && + false == quoted ) + { + // if a delimiter which will be preserved is provided and the + // char isn't protected by quote or escape char + if ( string::npos != delimiters_preserve.find_first_of(ch) ) + { + // if ch is a delimiter and the token string isn't empty + // the token is complete + if ( false == token.empty() ) // BUGFIX: 2006-03-04 + { + token_complete = true; + } + + // don't add the delimiter to the token + add_char = false; + + // add the delimiter + delimiter = ch; + add_delimiter = true; + } + } + + + // add the character to the token + if ( true == add_char ) + { + // add the current char + token.push_back( ch ); + } + + // add the token if it is complete + if ( true == token_complete && false == token.empty() ) + { + // add the token string + result.push_back( token ); + + // clear the contents + token.clear(); + + // build the next token + token_complete = false; + } + + // add the delimiter + if ( true == add_delimiter ) + { + // the next token is the delimiter + string delim_token; + delim_token.push_back( delimiter ); + result.push_back( delim_token ); + + // REMOVED: 2006-03-04, Bugfix + } + + // repeat for the next character + ++pos; + } // while + + // add the final token + if ( false == token.empty() ) + { + result.push_back( token ); + } +} diff --git a/cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/public/tokenizer.h b/cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/public/tokenizer.h new file mode 100644 index 000000000..75f567ceb --- /dev/null +++ b/cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/public/tokenizer.h @@ -0,0 +1,55 @@ +/************************************************************************ +The zlib/libpng License + +Copyright (c) 2006 Joerg Wiedenmann + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from +the use of this software. + +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; + you must not claim that you wrote the original software. + If you use this software in a product, an acknowledgment + in the product documentation would be appreciated but is + not required. + +2. Altered source versions must be plainly marked as such, + and must not be misrepresented as being the original software. + +3. This notice may not be removed or altered from any source distribution. + +***********************************************************************/ + +/******************************************************************** + created: 2006-01-28 + filename: tokenizer.cpp + author: Jörg Wiedenmann + + purpose: A tokenizer function which provides a very + customizable way of breaking up strings. +*********************************************************************/ + +#include +#include +using namespace std; + +// Function to break up a string into tokens +// +// Parameters: +//----------- +// str = the input string that will be tokenized +// result = the tokens for str +// delimiters = the delimiter characters +// delimiters preserve = same as above, but the delimiter characters +// will be put into the result as a token +// quote = characters to protect the enclosed characters +// esc = characters to protect a single character +// + +void tokenize ( const string& str, vector& result, + const string& delimiters, const string& delimiters_preserve = "", + const string& quote = "\"", const string& esc = "\\" ); diff --git a/cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/simulator/echoJnext.so b/cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/simulator/echoJnext.so new file mode 100644 index 0000000000000000000000000000000000000000..2b3c5f5486d29871ad41fce91cbdcdf5c9347bec GIT binary patch literal 231778 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 z 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 KM{=zB2>c(tnf}B8 literal 0 HcmV?d00001 diff --git a/cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/src/echo.cpp b/cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/src/echo.cpp new file mode 100644 index 000000000..0d5cc2f85 --- /dev/null +++ b/cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/src/echo.cpp @@ -0,0 +1,121 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + + +#include <../public/json/reader.h> +#include +#include +#include +#include +#include +#include +#include "echo.hpp" + +using namespace std; + +/** + * Default constructor. + */ +Echo::Echo(const std::string& id) : m_id(id) { +} + +/** + * Memory destructor. + */ +Echo::~Echo() { +} + +/** + * This method returns the list of objects implemented by this native + * extension. + */ +char* onGetObjList() { + static char name[] = "Echo"; + return name; +} + +/** + * This method is used by JNext to instantiate the Memory object when + * an object is created on the JavaScript server side. + */ +JSExt* onCreateObject(const string& className, const string& id) { + if (className == "Echo") { + return new Echo(id); + } + + return NULL; +} + +/** + * Method used by JNext to determine if the object can be deleted. + */ +bool Echo::CanDelete() { + return true; +} + +/** + * It will be called from JNext JavaScript side with passed string. + * This method implements the interface for the JavaScript to native binding + * for invoking native code. This method is triggered when JNext.invoke is + * called on the JavaScript side with this native objects id. + */ +string Echo::InvokeMethod(const string& command) { + int index = command.find_first_of(" "); + std::string method = command.substr(0, index); + + // read in arguments + Json::Value obj; + if (static_cast(command.length()) > index && index != -1) { + std::string jsonObject = command.substr(index + 1, command.length()); + Json::Reader reader; + + bool parse = reader.parse(jsonObject, obj); + if (!parse) { + fprintf(stderr, "%s", "error parsing\n"); + return "Cannot parse JSON object"; + } + } + + // Determine which function should be executed + if (method == "doEcho") { + std::string message = obj["message"].asString(); + if(message.length() > 0) { + return doEcho(message); + }else{ + return doEcho("Nothing to echo."); + } + }else{ + return doEcho("Unsupported Method"); + } +} + +/** + * Method that sends off Event message + */ +string Echo::doEcho(const std::string& message) { + std::string eventString = m_id; + eventString.append(" "); + eventString.append("cordova.echo.callback"); + eventString.append(" "); + eventString.append(message); + SendPluginEvent(eventString.c_str(), m_pContext); + return eventString; +} diff --git a/cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/src/echo.hpp b/cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/src/echo.hpp new file mode 100644 index 000000000..408be6964 --- /dev/null +++ b/cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/src/echo.hpp @@ -0,0 +1,45 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +#ifndef ECHO_HPP_ +#define ECHO_HPP_ + +#include +#include +#include "../public/plugin.h" + +class Echo: public JSExt { + +public: + explicit Echo(const std::string& id); + virtual ~Echo(); + +// Interfaces of JSExt + virtual bool CanDelete(); + virtual std::string InvokeMethod(const std::string& command); + +private: + std::string doEcho(const std::string& message); + + std::string m_id; +}; + +#endif /* ECHO_HPP_ */ diff --git a/cordova-lib/spec-plugman-install/plugins/cordova.echo/www/client.js b/cordova-lib/spec-plugman-install/plugins/cordova.echo/www/client.js new file mode 100644 index 000000000..4e7a1b3ce --- /dev/null +++ b/cordova-lib/spec-plugman-install/plugins/cordova.echo/www/client.js @@ -0,0 +1,53 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +var _self = {}, + _ID = require("./manifest.json").namespace, + win = null, + fail = null; + +function handleCallback(result) { + if (result) { + if(win){ + win(result); + } + } else { + if(fail){ + fail(result); + } + } + win = null; + fail = null; +} + +_self.doEcho = function (args, theWin, theFail) { + var data = { "message" : args.message || "" }; + + win = theWin; + fail = theFail; + + window.webworks.event.add(_ID, "echoCallback", handleCallback); + + return window.webworks.execSync(_ID, "doEcho", data); +}; + + +module.exports = _self; diff --git a/cordova-lib/spec-plugman-install/plugins/dependencies/A/plugin.xml b/cordova-lib/spec-plugman-install/plugins/dependencies/A/plugin.xml new file mode 100644 index 000000000..ec83e8c2f --- /dev/null +++ b/cordova-lib/spec-plugman-install/plugins/dependencies/A/plugin.xml @@ -0,0 +1,60 @@ + + + + + + Plugin A + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cordova-lib/spec-plugman-install/plugins/dependencies/A/src/android/A.java b/cordova-lib/spec-plugman-install/plugins/dependencies/A/src/android/A.java new file mode 100644 index 000000000..e69de29bb diff --git a/cordova-lib/spec-plugman-install/plugins/dependencies/A/src/ios/APluginCommand.h b/cordova-lib/spec-plugman-install/plugins/dependencies/A/src/ios/APluginCommand.h new file mode 100644 index 000000000..e69de29bb diff --git a/cordova-lib/spec-plugman-install/plugins/dependencies/A/src/ios/APluginCommand.m b/cordova-lib/spec-plugman-install/plugins/dependencies/A/src/ios/APluginCommand.m new file mode 100644 index 000000000..e69de29bb diff --git a/cordova-lib/spec-plugman-install/plugins/dependencies/A/www/plugin-a.js b/cordova-lib/spec-plugman-install/plugins/dependencies/A/www/plugin-a.js new file mode 100644 index 000000000..e69de29bb diff --git a/cordova-lib/spec-plugman-install/plugins/dependencies/B/plugin.xml b/cordova-lib/spec-plugman-install/plugins/dependencies/B/plugin.xml new file mode 100644 index 000000000..ee32e2d46 --- /dev/null +++ b/cordova-lib/spec-plugman-install/plugins/dependencies/B/plugin.xml @@ -0,0 +1,60 @@ + + + + + + Plugin B + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cordova-lib/spec-plugman-install/plugins/dependencies/B/src/android/B.java b/cordova-lib/spec-plugman-install/plugins/dependencies/B/src/android/B.java new file mode 100644 index 000000000..e69de29bb diff --git a/cordova-lib/spec-plugman-install/plugins/dependencies/B/src/ios/BPluginCommand.h b/cordova-lib/spec-plugman-install/plugins/dependencies/B/src/ios/BPluginCommand.h new file mode 100644 index 000000000..e69de29bb diff --git a/cordova-lib/spec-plugman-install/plugins/dependencies/B/src/ios/BPluginCommand.m b/cordova-lib/spec-plugman-install/plugins/dependencies/B/src/ios/BPluginCommand.m new file mode 100644 index 000000000..e69de29bb diff --git a/cordova-lib/spec-plugman-install/plugins/dependencies/B/www/plugin-b.js b/cordova-lib/spec-plugman-install/plugins/dependencies/B/www/plugin-b.js new file mode 100644 index 000000000..e69de29bb diff --git a/cordova-lib/spec-plugman-install/plugins/dependencies/C/plugin.xml b/cordova-lib/spec-plugman-install/plugins/dependencies/C/plugin.xml new file mode 100644 index 000000000..88c2d2cdb --- /dev/null +++ b/cordova-lib/spec-plugman-install/plugins/dependencies/C/plugin.xml @@ -0,0 +1,57 @@ + + + + + + Plugin C + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cordova-lib/spec-plugman-install/plugins/dependencies/C/src/android/C.java b/cordova-lib/spec-plugman-install/plugins/dependencies/C/src/android/C.java new file mode 100644 index 000000000..e69de29bb diff --git a/cordova-lib/spec-plugman-install/plugins/dependencies/C/src/ios/CPluginCommand.h b/cordova-lib/spec-plugman-install/plugins/dependencies/C/src/ios/CPluginCommand.h new file mode 100644 index 000000000..e69de29bb diff --git a/cordova-lib/spec-plugman-install/plugins/dependencies/C/src/ios/CPluginCommand.m b/cordova-lib/spec-plugman-install/plugins/dependencies/C/src/ios/CPluginCommand.m new file mode 100644 index 000000000..e69de29bb diff --git a/cordova-lib/spec-plugman-install/plugins/dependencies/C/www/plugin-c.js b/cordova-lib/spec-plugman-install/plugins/dependencies/C/www/plugin-c.js new file mode 100644 index 000000000..e69de29bb diff --git a/cordova-lib/spec-plugman-install/plugins/dependencies/D/plugin.xml b/cordova-lib/spec-plugman-install/plugins/dependencies/D/plugin.xml new file mode 100644 index 000000000..f07b06377 --- /dev/null +++ b/cordova-lib/spec-plugman-install/plugins/dependencies/D/plugin.xml @@ -0,0 +1,57 @@ + + + + + + Plugin D + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cordova-lib/spec-plugman-install/plugins/dependencies/D/src/android/D.java b/cordova-lib/spec-plugman-install/plugins/dependencies/D/src/android/D.java new file mode 100644 index 000000000..e69de29bb diff --git a/cordova-lib/spec-plugman-install/plugins/dependencies/D/src/ios/DPluginCommand.h b/cordova-lib/spec-plugman-install/plugins/dependencies/D/src/ios/DPluginCommand.h new file mode 100644 index 000000000..e69de29bb diff --git a/cordova-lib/spec-plugman-install/plugins/dependencies/D/src/ios/DPluginCommand.m b/cordova-lib/spec-plugman-install/plugins/dependencies/D/src/ios/DPluginCommand.m new file mode 100644 index 000000000..e69de29bb diff --git a/cordova-lib/spec-plugman-install/plugins/dependencies/D/www/plugin-d.js b/cordova-lib/spec-plugman-install/plugins/dependencies/D/www/plugin-d.js new file mode 100644 index 000000000..e69de29bb diff --git a/cordova-lib/spec-plugman-install/plugins/dependencies/E/plugin.xml b/cordova-lib/spec-plugman-install/plugins/dependencies/E/plugin.xml new file mode 100644 index 000000000..bb28fa12d --- /dev/null +++ b/cordova-lib/spec-plugman-install/plugins/dependencies/E/plugin.xml @@ -0,0 +1,59 @@ + + + + + + Plugin E + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cordova-lib/spec-plugman-install/plugins/dependencies/E/src/android/E.java b/cordova-lib/spec-plugman-install/plugins/dependencies/E/src/android/E.java new file mode 100644 index 000000000..e69de29bb diff --git a/cordova-lib/spec-plugman-install/plugins/dependencies/E/src/ios/EPluginCommand.h b/cordova-lib/spec-plugman-install/plugins/dependencies/E/src/ios/EPluginCommand.h new file mode 100644 index 000000000..e69de29bb diff --git a/cordova-lib/spec-plugman-install/plugins/dependencies/E/src/ios/EPluginCommand.m b/cordova-lib/spec-plugman-install/plugins/dependencies/E/src/ios/EPluginCommand.m new file mode 100644 index 000000000..e69de29bb diff --git a/cordova-lib/spec-plugman-install/plugins/dependencies/E/www/plugin-d.js b/cordova-lib/spec-plugman-install/plugins/dependencies/E/www/plugin-d.js new file mode 100644 index 000000000..e69de29bb diff --git a/cordova-lib/spec-plugman-install/plugins/dependencies/F/plugin.xml b/cordova-lib/spec-plugman-install/plugins/dependencies/F/plugin.xml new file mode 100644 index 000000000..86869bab4 --- /dev/null +++ b/cordova-lib/spec-plugman-install/plugins/dependencies/F/plugin.xml @@ -0,0 +1,60 @@ + + + + + + Plugin F + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cordova-lib/spec-plugman-install/plugins/dependencies/F/src/android/F.java b/cordova-lib/spec-plugman-install/plugins/dependencies/F/src/android/F.java new file mode 100644 index 000000000..e69de29bb diff --git a/cordova-lib/spec-plugman-install/plugins/dependencies/F/src/ios/FPluginCommand.h b/cordova-lib/spec-plugman-install/plugins/dependencies/F/src/ios/FPluginCommand.h new file mode 100644 index 000000000..e69de29bb diff --git a/cordova-lib/spec-plugman-install/plugins/dependencies/F/src/ios/FPluginCommand.m b/cordova-lib/spec-plugman-install/plugins/dependencies/F/src/ios/FPluginCommand.m new file mode 100644 index 000000000..e69de29bb diff --git a/cordova-lib/spec-plugman-install/plugins/dependencies/F/www/plugin-f.js b/cordova-lib/spec-plugman-install/plugins/dependencies/F/www/plugin-f.js new file mode 100644 index 000000000..e69de29bb diff --git a/cordova-lib/spec-plugman-install/plugins/dependencies/G/plugin.xml b/cordova-lib/spec-plugman-install/plugins/dependencies/G/plugin.xml new file mode 100644 index 000000000..0e365daf6 --- /dev/null +++ b/cordova-lib/spec-plugman-install/plugins/dependencies/G/plugin.xml @@ -0,0 +1,59 @@ + + + + + + Plugin G + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cordova-lib/spec-plugman-install/plugins/dependencies/G/src/android/G.java b/cordova-lib/spec-plugman-install/plugins/dependencies/G/src/android/G.java new file mode 100644 index 000000000..e69de29bb diff --git a/cordova-lib/spec-plugman-install/plugins/dependencies/G/src/ios/EPluginCommand.m b/cordova-lib/spec-plugman-install/plugins/dependencies/G/src/ios/EPluginCommand.m new file mode 100644 index 000000000..e69de29bb diff --git a/cordova-lib/spec-plugman-install/plugins/dependencies/G/src/ios/GPluginCommand.h b/cordova-lib/spec-plugman-install/plugins/dependencies/G/src/ios/GPluginCommand.h new file mode 100644 index 000000000..e69de29bb diff --git a/cordova-lib/spec-plugman-install/plugins/dependencies/G/www/plugin-g.js b/cordova-lib/spec-plugman-install/plugins/dependencies/G/www/plugin-g.js new file mode 100644 index 000000000..e69de29bb diff --git a/cordova-lib/spec-plugman-install/plugins/dependencies/H/plugin.xml b/cordova-lib/spec-plugman-install/plugins/dependencies/H/plugin.xml new file mode 100644 index 000000000..e72a19a06 --- /dev/null +++ b/cordova-lib/spec-plugman-install/plugins/dependencies/H/plugin.xml @@ -0,0 +1,59 @@ + + + + + + Plugin H + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cordova-lib/spec-plugman-install/plugins/dependencies/H/src/android/H.java b/cordova-lib/spec-plugman-install/plugins/dependencies/H/src/android/H.java new file mode 100644 index 000000000..e69de29bb diff --git a/cordova-lib/spec-plugman-install/plugins/dependencies/H/src/ios/HPluginCommand.h b/cordova-lib/spec-plugman-install/plugins/dependencies/H/src/ios/HPluginCommand.h new file mode 100644 index 000000000..e69de29bb diff --git a/cordova-lib/spec-plugman-install/plugins/dependencies/H/src/ios/HPluginCommand.m b/cordova-lib/spec-plugman-install/plugins/dependencies/H/src/ios/HPluginCommand.m new file mode 100644 index 000000000..e69de29bb diff --git a/cordova-lib/spec-plugman-install/plugins/dependencies/H/www/plugin-h.js b/cordova-lib/spec-plugman-install/plugins/dependencies/H/www/plugin-h.js new file mode 100644 index 000000000..e69de29bb diff --git a/cordova-lib/spec-plugman-install/plugins/dependencies/README.md b/cordova-lib/spec-plugman-install/plugins/dependencies/README.md new file mode 100644 index 000000000..0955be526 --- /dev/null +++ b/cordova-lib/spec-plugman-install/plugins/dependencies/README.md @@ -0,0 +1,10 @@ +Here's a general overview of how the plugins in this directory are dependent on each other: + + F + / \ + A \ B + / \ \ / \ + C '---D--' E + + + G <-> H diff --git a/cordova-lib/spec-plugman-install/plugins/dependencies/meta/D/plugin.xml b/cordova-lib/spec-plugman-install/plugins/dependencies/meta/D/plugin.xml new file mode 100644 index 000000000..941bd5755 --- /dev/null +++ b/cordova-lib/spec-plugman-install/plugins/dependencies/meta/D/plugin.xml @@ -0,0 +1,61 @@ + + + + + + Plugin D + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cordova-lib/spec-plugman-install/plugins/dependencies/meta/D/src/android/D.java b/cordova-lib/spec-plugman-install/plugins/dependencies/meta/D/src/android/D.java new file mode 100644 index 000000000..e69de29bb diff --git a/cordova-lib/spec-plugman-install/plugins/dependencies/meta/D/src/ios/DPluginCommand.h b/cordova-lib/spec-plugman-install/plugins/dependencies/meta/D/src/ios/DPluginCommand.h new file mode 100644 index 000000000..e69de29bb diff --git a/cordova-lib/spec-plugman-install/plugins/dependencies/meta/D/src/ios/DPluginCommand.m b/cordova-lib/spec-plugman-install/plugins/dependencies/meta/D/src/ios/DPluginCommand.m new file mode 100644 index 000000000..e69de29bb diff --git a/cordova-lib/spec-plugman-install/plugins/dependencies/meta/D/www/plugin-d.js b/cordova-lib/spec-plugman-install/plugins/dependencies/meta/D/www/plugin-d.js new file mode 100644 index 000000000..e69de29bb diff --git a/cordova-lib/spec-plugman-install/plugins/dependencies/meta/subdir/E/plugin.xml b/cordova-lib/spec-plugman-install/plugins/dependencies/meta/subdir/E/plugin.xml new file mode 100644 index 000000000..57d96d9ed --- /dev/null +++ b/cordova-lib/spec-plugman-install/plugins/dependencies/meta/subdir/E/plugin.xml @@ -0,0 +1,57 @@ + + + + + + Plugin E + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cordova-lib/spec-plugman-install/plugins/dependencies/meta/subdir/E/src/android/E.java b/cordova-lib/spec-plugman-install/plugins/dependencies/meta/subdir/E/src/android/E.java new file mode 100644 index 000000000..e69de29bb diff --git a/cordova-lib/spec-plugman-install/plugins/dependencies/meta/subdir/E/src/ios/EPluginCommand.h b/cordova-lib/spec-plugman-install/plugins/dependencies/meta/subdir/E/src/ios/EPluginCommand.h new file mode 100644 index 000000000..e69de29bb diff --git a/cordova-lib/spec-plugman-install/plugins/dependencies/meta/subdir/E/src/ios/EPluginCommand.m b/cordova-lib/spec-plugman-install/plugins/dependencies/meta/subdir/E/src/ios/EPluginCommand.m new file mode 100644 index 000000000..e69de29bb diff --git a/cordova-lib/spec-plugman-install/plugins/dependencies/meta/subdir/E/www/plugin-e.js b/cordova-lib/spec-plugman-install/plugins/dependencies/meta/subdir/E/www/plugin-e.js new file mode 100644 index 000000000..e69de29bb diff --git a/cordova-lib/spec-plugman-install/plugins/dependencies/subdir/E/plugin.xml b/cordova-lib/spec-plugman-install/plugins/dependencies/subdir/E/plugin.xml new file mode 100644 index 000000000..57d96d9ed --- /dev/null +++ b/cordova-lib/spec-plugman-install/plugins/dependencies/subdir/E/plugin.xml @@ -0,0 +1,57 @@ + + + + + + Plugin E + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cordova-lib/spec-plugman-install/plugins/dependencies/subdir/E/src/android/E.java b/cordova-lib/spec-plugman-install/plugins/dependencies/subdir/E/src/android/E.java new file mode 100644 index 000000000..e69de29bb diff --git a/cordova-lib/spec-plugman-install/plugins/dependencies/subdir/E/src/ios/EPluginCommand.h b/cordova-lib/spec-plugman-install/plugins/dependencies/subdir/E/src/ios/EPluginCommand.h new file mode 100644 index 000000000..e69de29bb diff --git a/cordova-lib/spec-plugman-install/plugins/dependencies/subdir/E/src/ios/EPluginCommand.m b/cordova-lib/spec-plugman-install/plugins/dependencies/subdir/E/src/ios/EPluginCommand.m new file mode 100644 index 000000000..e69de29bb diff --git a/cordova-lib/spec-plugman-install/plugins/dependencies/subdir/E/www/plugin-e.js b/cordova-lib/spec-plugman-install/plugins/dependencies/subdir/E/www/plugin-e.js new file mode 100644 index 000000000..e69de29bb diff --git a/cordova-lib/spec-plugman-install/plugins/multiple-children/plugin.xml b/cordova-lib/spec-plugman-install/plugins/multiple-children/plugin.xml new file mode 100644 index 000000000..fd10a04d5 --- /dev/null +++ b/cordova-lib/spec-plugman-install/plugins/multiple-children/plugin.xml @@ -0,0 +1,108 @@ + + + + + + Pushwoosh + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cordova-lib/spec-plugman-install/plugins/shared-deps-multi-child/plugin.xml b/cordova-lib/spec-plugman-install/plugins/shared-deps-multi-child/plugin.xml new file mode 100644 index 000000000..6c1747693 --- /dev/null +++ b/cordova-lib/spec-plugman-install/plugins/shared-deps-multi-child/plugin.xml @@ -0,0 +1,34 @@ + + + + + + Sharing Dependencies with the Multi-Child Plugin, woo + + + + + + + + diff --git a/cordova-lib/spec-plugman-install/projects/.gitkeep b/cordova-lib/spec-plugman-install/projects/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/cordova-lib/spec-plugman-install/projects/android_install/AndroidManifest.xml b/cordova-lib/spec-plugman-install/projects/android_install/AndroidManifest.xml new file mode 100644 index 000000000..b5fea9d1b --- /dev/null +++ b/cordova-lib/spec-plugman-install/projects/android_install/AndroidManifest.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/cordova-lib/spec-plugman-install/projects/android_install/cordova/android_sdk_version b/cordova-lib/spec-plugman-install/projects/android_install/cordova/android_sdk_version new file mode 100644 index 000000000..0ab155ceb --- /dev/null +++ b/cordova-lib/spec-plugman-install/projects/android_install/cordova/android_sdk_version @@ -0,0 +1 @@ +echo 18.0.9 \ No newline at end of file diff --git a/cordova-lib/spec-plugman-install/projects/android_install/cordova/version b/cordova-lib/spec-plugman-install/projects/android_install/cordova/version new file mode 100644 index 000000000..01f68fd29 --- /dev/null +++ b/cordova-lib/spec-plugman-install/projects/android_install/cordova/version @@ -0,0 +1 @@ +echo 9.0.0 \ No newline at end of file diff --git a/cordova-lib/spec-plugman-install/projects/android_install/cordova/version.bat b/cordova-lib/spec-plugman-install/projects/android_install/cordova/version.bat new file mode 100644 index 000000000..c637d7ca5 --- /dev/null +++ b/cordova-lib/spec-plugman-install/projects/android_install/cordova/version.bat @@ -0,0 +1,2 @@ +@ECHO OFF +echo 9.0.0 \ No newline at end of file diff --git a/cordova-lib/spec-plugman-install/projects/android_one/AndroidManifest.xml b/cordova-lib/spec-plugman-install/projects/android_one/AndroidManifest.xml new file mode 100644 index 000000000..0979b026d --- /dev/null +++ b/cordova-lib/spec-plugman-install/projects/android_one/AndroidManifest.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cordova-lib/spec-plugman-install/projects/android_one/assets/www/.gitkeep b/cordova-lib/spec-plugman-install/projects/android_one/assets/www/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/cordova-lib/spec-plugman-install/projects/android_one/assets/www/cordova.js b/cordova-lib/spec-plugman-install/projects/android_one/assets/www/cordova.js new file mode 100644 index 000000000..000791b61 --- /dev/null +++ b/cordova-lib/spec-plugman-install/projects/android_one/assets/www/cordova.js @@ -0,0 +1,6848 @@ +// Platform: android +// 2.7.0rc1-12-ga86559a +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ +;(function() { +var CORDOVA_JS_BUILD_LABEL = '2.7.0rc1-12-ga86559a'; +// file: lib/scripts/require.js + +var require, + define; + +(function () { + var modules = {}; + // Stack of moduleIds currently being built. + var requireStack = []; + // Map of module ID -> index into requireStack of modules currently being built. + var inProgressModules = {}; + + function build(module) { + var factory = module.factory; + module.exports = {}; + delete module.factory; + factory(require, module.exports, module); + return module.exports; + } + + require = function (id) { + if (!modules[id]) { + throw "module " + id + " not found"; + } else if (id in inProgressModules) { + var cycle = requireStack.slice(inProgressModules[id]).join('->') + '->' + id; + throw "Cycle in require graph: " + cycle; + } + if (modules[id].factory) { + try { + inProgressModules[id] = requireStack.length; + requireStack.push(id); + return build(modules[id]); + } finally { + delete inProgressModules[id]; + requireStack.pop(); + } + } + return modules[id].exports; + }; + + define = function (id, factory) { + if (modules[id]) { + throw "module " + id + " already defined"; + } + + modules[id] = { + id: id, + factory: factory + }; + }; + + define.remove = function (id) { + delete modules[id]; + }; + + define.moduleMap = modules; +})(); + +//Export for use in node +if (typeof module === "object" && typeof require === "function") { + module.exports.require = require; + module.exports.define = define; +} + +// file: lib/cordova.js +define("cordova", function(require, exports, module) { + + +var channel = require('cordova/channel'); + +/** + * Listen for DOMContentLoaded and notify our channel subscribers. + */ +document.addEventListener('DOMContentLoaded', function() { + channel.onDOMContentLoaded.fire(); +}, false); +if (document.readyState == 'complete' || document.readyState == 'interactive') { + channel.onDOMContentLoaded.fire(); +} + +/** + * Intercept calls to addEventListener + removeEventListener and handle deviceready, + * resume, and pause events. + */ +var m_document_addEventListener = document.addEventListener; +var m_document_removeEventListener = document.removeEventListener; +var m_window_addEventListener = window.addEventListener; +var m_window_removeEventListener = window.removeEventListener; + +/** + * Houses custom event handlers to intercept on document + window event listeners. + */ +var documentEventHandlers = {}, + windowEventHandlers = {}; + +document.addEventListener = function(evt, handler, capture) { + var e = evt.toLowerCase(); + if (typeof documentEventHandlers[e] != 'undefined') { + documentEventHandlers[e].subscribe(handler); + } else { + m_document_addEventListener.call(document, evt, handler, capture); + } +}; + +window.addEventListener = function(evt, handler, capture) { + var e = evt.toLowerCase(); + if (typeof windowEventHandlers[e] != 'undefined') { + windowEventHandlers[e].subscribe(handler); + } else { + m_window_addEventListener.call(window, evt, handler, capture); + } +}; + +document.removeEventListener = function(evt, handler, capture) { + var e = evt.toLowerCase(); + // If unsubscribing from an event that is handled by a plugin + if (typeof documentEventHandlers[e] != "undefined") { + documentEventHandlers[e].unsubscribe(handler); + } else { + m_document_removeEventListener.call(document, evt, handler, capture); + } +}; + +window.removeEventListener = function(evt, handler, capture) { + var e = evt.toLowerCase(); + // If unsubscribing from an event that is handled by a plugin + if (typeof windowEventHandlers[e] != "undefined") { + windowEventHandlers[e].unsubscribe(handler); + } else { + m_window_removeEventListener.call(window, evt, handler, capture); + } +}; + +function createEvent(type, data) { + var event = document.createEvent('Events'); + event.initEvent(type, false, false); + if (data) { + for (var i in data) { + if (data.hasOwnProperty(i)) { + event[i] = data[i]; + } + } + } + return event; +} + +if(typeof window.console === "undefined") { + window.console = { + log:function(){} + }; +} + +var cordova = { + define:define, + require:require, + /** + * Methods to add/remove your own addEventListener hijacking on document + window. + */ + addWindowEventHandler:function(event) { + return (windowEventHandlers[event] = channel.create(event)); + }, + addStickyDocumentEventHandler:function(event) { + return (documentEventHandlers[event] = channel.createSticky(event)); + }, + addDocumentEventHandler:function(event) { + return (documentEventHandlers[event] = channel.create(event)); + }, + removeWindowEventHandler:function(event) { + delete windowEventHandlers[event]; + }, + removeDocumentEventHandler:function(event) { + delete documentEventHandlers[event]; + }, + /** + * Retrieve original event handlers that were replaced by Cordova + * + * @return object + */ + getOriginalHandlers: function() { + return {'document': {'addEventListener': m_document_addEventListener, 'removeEventListener': m_document_removeEventListener}, + 'window': {'addEventListener': m_window_addEventListener, 'removeEventListener': m_window_removeEventListener}}; + }, + /** + * Method to fire event from native code + * bNoDetach is required for events which cause an exception which needs to be caught in native code + */ + fireDocumentEvent: function(type, data, bNoDetach) { + var evt = createEvent(type, data); + if (typeof documentEventHandlers[type] != 'undefined') { + if( bNoDetach ) { + documentEventHandlers[type].fire(evt); + } + else { + setTimeout(function() { + // Fire deviceready on listeners that were registered before cordova.js was loaded. + if (type == 'deviceready') { + document.dispatchEvent(evt); + } + documentEventHandlers[type].fire(evt); + }, 0); + } + } else { + document.dispatchEvent(evt); + } + }, + fireWindowEvent: function(type, data) { + var evt = createEvent(type,data); + if (typeof windowEventHandlers[type] != 'undefined') { + setTimeout(function() { + windowEventHandlers[type].fire(evt); + }, 0); + } else { + window.dispatchEvent(evt); + } + }, + + /** + * Plugin callback mechanism. + */ + // Randomize the starting callbackId to avoid collisions after refreshing or navigating. + // This way, it's very unlikely that any new callback would get the same callbackId as an old callback. + callbackId: Math.floor(Math.random() * 2000000000), + callbacks: {}, + callbackStatus: { + NO_RESULT: 0, + OK: 1, + CLASS_NOT_FOUND_EXCEPTION: 2, + ILLEGAL_ACCESS_EXCEPTION: 3, + INSTANTIATION_EXCEPTION: 4, + MALFORMED_URL_EXCEPTION: 5, + IO_EXCEPTION: 6, + INVALID_ACTION: 7, + JSON_EXCEPTION: 8, + ERROR: 9 + }, + + /** + * Called by native code when returning successful result from an action. + */ + callbackSuccess: function(callbackId, args) { + try { + cordova.callbackFromNative(callbackId, true, args.status, [args.message], args.keepCallback); + } catch (e) { + console.log("Error in error callback: " + callbackId + " = "+e); + } + }, + + /** + * Called by native code when returning error result from an action. + */ + callbackError: function(callbackId, args) { + // TODO: Deprecate callbackSuccess and callbackError in favour of callbackFromNative. + // Derive success from status. + try { + cordova.callbackFromNative(callbackId, false, args.status, [args.message], args.keepCallback); + } catch (e) { + console.log("Error in error callback: " + callbackId + " = "+e); + } + }, + + /** + * Called by native code when returning the result from an action. + */ + callbackFromNative: function(callbackId, success, status, args, keepCallback) { + var callback = cordova.callbacks[callbackId]; + if (callback) { + if (success && status == cordova.callbackStatus.OK) { + callback.success && callback.success.apply(null, args); + } else if (!success) { + callback.fail && callback.fail.apply(null, args); + } + + // Clear callback if not expecting any more results + if (!keepCallback) { + delete cordova.callbacks[callbackId]; + } + } + }, + addConstructor: function(func) { + channel.onCordovaReady.subscribe(function() { + try { + func(); + } catch(e) { + console.log("Failed to run constructor: " + e); + } + }); + } +}; + +// Register pause, resume and deviceready channels as events on document. +channel.onPause = cordova.addDocumentEventHandler('pause'); +channel.onResume = cordova.addDocumentEventHandler('resume'); +channel.onDeviceReady = cordova.addStickyDocumentEventHandler('deviceready'); + +module.exports = cordova; + +}); + +// file: lib/common/argscheck.js +define("cordova/argscheck", function(require, exports, module) { + +var exec = require('cordova/exec'); +var utils = require('cordova/utils'); + +var moduleExports = module.exports; + +var typeMap = { + 'A': 'Array', + 'D': 'Date', + 'N': 'Number', + 'S': 'String', + 'F': 'Function', + 'O': 'Object' +}; + +function extractParamName(callee, argIndex) { + return (/.*?\((.*?)\)/).exec(callee)[1].split(', ')[argIndex]; +} + +function checkArgs(spec, functionName, args, opt_callee) { + if (!moduleExports.enableChecks) { + return; + } + var errMsg = null; + var typeName; + for (var i = 0; i < spec.length; ++i) { + var c = spec.charAt(i), + cUpper = c.toUpperCase(), + arg = args[i]; + // Asterix means allow anything. + if (c == '*') { + continue; + } + typeName = utils.typeName(arg); + if ((arg === null || arg === undefined) && c == cUpper) { + continue; + } + if (typeName != typeMap[cUpper]) { + errMsg = 'Expected ' + typeMap[cUpper]; + break; + } + } + if (errMsg) { + errMsg += ', but got ' + typeName + '.'; + errMsg = 'Wrong type for parameter "' + extractParamName(opt_callee || args.callee, i) + '" of ' + functionName + ': ' + errMsg; + // Don't log when running jake test. + if (typeof jasmine == 'undefined') { + console.error(errMsg); + } + throw TypeError(errMsg); + } +} + +function getValue(value, defaultValue) { + return value === undefined ? defaultValue : value; +} + +moduleExports.checkArgs = checkArgs; +moduleExports.getValue = getValue; +moduleExports.enableChecks = true; + + +}); + +// file: lib/common/builder.js +define("cordova/builder", function(require, exports, module) { + +var utils = require('cordova/utils'); + +function each(objects, func, context) { + for (var prop in objects) { + if (objects.hasOwnProperty(prop)) { + func.apply(context, [objects[prop], prop]); + } + } +} + +function clobber(obj, key, value) { + exports.replaceHookForTesting(obj, key); + obj[key] = value; + // Getters can only be overridden by getters. + if (obj[key] !== value) { + utils.defineGetter(obj, key, function() { + return value; + }); + } +} + +function assignOrWrapInDeprecateGetter(obj, key, value, message) { + if (message) { + utils.defineGetter(obj, key, function() { + console.log(message); + delete obj[key]; + clobber(obj, key, value); + return value; + }); + } else { + clobber(obj, key, value); + } +} + +function include(parent, objects, clobber, merge) { + each(objects, function (obj, key) { + try { + var result = obj.path ? require(obj.path) : {}; + + if (clobber) { + // Clobber if it doesn't exist. + if (typeof parent[key] === 'undefined') { + assignOrWrapInDeprecateGetter(parent, key, result, obj.deprecated); + } else if (typeof obj.path !== 'undefined') { + // If merging, merge properties onto parent, otherwise, clobber. + if (merge) { + recursiveMerge(parent[key], result); + } else { + assignOrWrapInDeprecateGetter(parent, key, result, obj.deprecated); + } + } + result = parent[key]; + } else { + // Overwrite if not currently defined. + if (typeof parent[key] == 'undefined') { + assignOrWrapInDeprecateGetter(parent, key, result, obj.deprecated); + } else { + // Set result to what already exists, so we can build children into it if they exist. + result = parent[key]; + } + } + + if (obj.children) { + include(result, obj.children, clobber, merge); + } + } catch(e) { + utils.alert('Exception building cordova JS globals: ' + e + ' for key "' + key + '"'); + } + }); +} + +/** + * Merge properties from one object onto another recursively. Properties from + * the src object will overwrite existing target property. + * + * @param target Object to merge properties into. + * @param src Object to merge properties from. + */ +function recursiveMerge(target, src) { + for (var prop in src) { + if (src.hasOwnProperty(prop)) { + if (target.prototype && target.prototype.constructor === target) { + // If the target object is a constructor override off prototype. + clobber(target.prototype, prop, src[prop]); + } else { + if (typeof src[prop] === 'object' && typeof target[prop] === 'object') { + recursiveMerge(target[prop], src[prop]); + } else { + clobber(target, prop, src[prop]); + } + } + } + } +} + +exports.buildIntoButDoNotClobber = function(objects, target) { + include(target, objects, false, false); +}; +exports.buildIntoAndClobber = function(objects, target) { + include(target, objects, true, false); +}; +exports.buildIntoAndMerge = function(objects, target) { + include(target, objects, true, true); +}; +exports.recursiveMerge = recursiveMerge; +exports.assignOrWrapInDeprecateGetter = assignOrWrapInDeprecateGetter; +exports.replaceHookForTesting = function() {}; + +}); + +// file: lib/common/channel.js +define("cordova/channel", function(require, exports, module) { + +var utils = require('cordova/utils'), + nextGuid = 1; + +/** + * Custom pub-sub "channel" that can have functions subscribed to it + * This object is used to define and control firing of events for + * cordova initialization, as well as for custom events thereafter. + * + * The order of events during page load and Cordova startup is as follows: + * + * onDOMContentLoaded* Internal event that is received when the web page is loaded and parsed. + * onNativeReady* Internal event that indicates the Cordova native side is ready. + * onCordovaReady* Internal event fired when all Cordova JavaScript objects have been created. + * onCordovaInfoReady* Internal event fired when device properties are available. + * onCordovaConnectionReady* Internal event fired when the connection property has been set. + * onDeviceReady* User event fired to indicate that Cordova is ready + * onResume User event fired to indicate a start/resume lifecycle event + * onPause User event fired to indicate a pause lifecycle event + * onDestroy* Internal event fired when app is being destroyed (User should use window.onunload event, not this one). + * + * The events marked with an * are sticky. Once they have fired, they will stay in the fired state. + * All listeners that subscribe after the event is fired will be executed right away. + * + * The only Cordova events that user code should register for are: + * deviceready Cordova native code is initialized and Cordova APIs can be called from JavaScript + * pause App has moved to background + * resume App has returned to foreground + * + * Listeners can be registered as: + * document.addEventListener("deviceready", myDeviceReadyListener, false); + * document.addEventListener("resume", myResumeListener, false); + * document.addEventListener("pause", myPauseListener, false); + * + * The DOM lifecycle events should be used for saving and restoring state + * window.onload + * window.onunload + * + */ + +/** + * Channel + * @constructor + * @param type String the channel name + */ +var Channel = function(type, sticky) { + this.type = type; + // Map of guid -> function. + this.handlers = {}; + // 0 = Non-sticky, 1 = Sticky non-fired, 2 = Sticky fired. + this.state = sticky ? 1 : 0; + // Used in sticky mode to remember args passed to fire(). + this.fireArgs = null; + // Used by onHasSubscribersChange to know if there are any listeners. + this.numHandlers = 0; + // Function that is called when the first listener is subscribed, or when + // the last listener is unsubscribed. + this.onHasSubscribersChange = null; +}, + channel = { + /** + * Calls the provided function only after all of the channels specified + * have been fired. All channels must be sticky channels. + */ + join: function(h, c) { + var len = c.length, + i = len, + f = function() { + if (!(--i)) h(); + }; + for (var j=0; jNative bridge. + POLLING: 0, + // For LOAD_URL to be viable, it would need to have a work-around for + // the bug where the soft-keyboard gets dismissed when a message is sent. + LOAD_URL: 1, + // For the ONLINE_EVENT to be viable, it would need to intercept all event + // listeners (both through addEventListener and window.ononline) as well + // as set the navigator property itself. + ONLINE_EVENT: 2, + // Uses reflection to access private APIs of the WebView that can send JS + // to be executed. + // Requires Android 3.2.4 or above. + PRIVATE_API: 3 + }, + jsToNativeBridgeMode, // Set lazily. + nativeToJsBridgeMode = nativeToJsModes.ONLINE_EVENT, + pollEnabled = false, + messagesFromNative = []; + +function androidExec(success, fail, service, action, args) { + // Set default bridge modes if they have not already been set. + // By default, we use the failsafe, since addJavascriptInterface breaks too often + if (jsToNativeBridgeMode === undefined) { + androidExec.setJsToNativeBridgeMode(jsToNativeModes.JS_OBJECT); + } + + // Process any ArrayBuffers in the args into a string. + for (var i = 0; i < args.length; i++) { + if (utils.typeName(args[i]) == 'ArrayBuffer') { + args[i] = window.btoa(String.fromCharCode.apply(null, new Uint8Array(args[i]))); + } + } + + var callbackId = service + cordova.callbackId++, + argsJson = JSON.stringify(args); + + if (success || fail) { + cordova.callbacks[callbackId] = {success:success, fail:fail}; + } + + if (jsToNativeBridgeMode == jsToNativeModes.LOCATION_CHANGE) { + window.location = 'http://cdv_exec/' + service + '#' + action + '#' + callbackId + '#' + argsJson; + } else { + var messages = nativeApiProvider.get().exec(service, action, callbackId, argsJson); + // If argsJson was received by Java as null, try again with the PROMPT bridge mode. + // This happens in rare circumstances, such as when certain Unicode characters are passed over the bridge on a Galaxy S2. See CB-2666. + if (jsToNativeBridgeMode == jsToNativeModes.JS_OBJECT && messages === "@Null arguments.") { + androidExec.setJsToNativeBridgeMode(jsToNativeModes.PROMPT); + androidExec(success, fail, service, action, args); + androidExec.setJsToNativeBridgeMode(jsToNativeModes.JS_OBJECT); + return; + } else { + androidExec.processMessages(messages); + } + } +} + +function pollOnce() { + var msg = nativeApiProvider.get().retrieveJsMessages(); + androidExec.processMessages(msg); +} + +function pollingTimerFunc() { + if (pollEnabled) { + pollOnce(); + setTimeout(pollingTimerFunc, 50); + } +} + +function hookOnlineApis() { + function proxyEvent(e) { + cordova.fireWindowEvent(e.type); + } + // The network module takes care of firing online and offline events. + // It currently fires them only on document though, so we bridge them + // to window here (while first listening for exec()-related online/offline + // events). + window.addEventListener('online', pollOnce, false); + window.addEventListener('offline', pollOnce, false); + cordova.addWindowEventHandler('online'); + cordova.addWindowEventHandler('offline'); + document.addEventListener('online', proxyEvent, false); + document.addEventListener('offline', proxyEvent, false); +} + +hookOnlineApis(); + +androidExec.jsToNativeModes = jsToNativeModes; +androidExec.nativeToJsModes = nativeToJsModes; + +androidExec.setJsToNativeBridgeMode = function(mode) { + if (mode == jsToNativeModes.JS_OBJECT && !window._cordovaNative) { + console.log('Falling back on PROMPT mode since _cordovaNative is missing. Expected for Android 3.2 and lower only.'); + mode = jsToNativeModes.PROMPT; + } + nativeApiProvider.setPreferPrompt(mode == jsToNativeModes.PROMPT); + jsToNativeBridgeMode = mode; +}; + +androidExec.setNativeToJsBridgeMode = function(mode) { + if (mode == nativeToJsBridgeMode) { + return; + } + if (nativeToJsBridgeMode == nativeToJsModes.POLLING) { + pollEnabled = false; + } + + nativeToJsBridgeMode = mode; + // Tell the native side to switch modes. + nativeApiProvider.get().setNativeToJsBridgeMode(mode); + + if (mode == nativeToJsModes.POLLING) { + pollEnabled = true; + setTimeout(pollingTimerFunc, 1); + } +}; + +// Processes a single message, as encoded by NativeToJsMessageQueue.java. +function processMessage(message) { + try { + var firstChar = message.charAt(0); + if (firstChar == 'J') { + eval(message.slice(1)); + } else if (firstChar == 'S' || firstChar == 'F') { + var success = firstChar == 'S'; + var keepCallback = message.charAt(1) == '1'; + var spaceIdx = message.indexOf(' ', 2); + var status = +message.slice(2, spaceIdx); + var nextSpaceIdx = message.indexOf(' ', spaceIdx + 1); + var callbackId = message.slice(spaceIdx + 1, nextSpaceIdx); + var payloadKind = message.charAt(nextSpaceIdx + 1); + var payload; + if (payloadKind == 's') { + payload = message.slice(nextSpaceIdx + 2); + } else if (payloadKind == 't') { + payload = true; + } else if (payloadKind == 'f') { + payload = false; + } else if (payloadKind == 'N') { + payload = null; + } else if (payloadKind == 'n') { + payload = +message.slice(nextSpaceIdx + 2); + } else if (payloadKind == 'A') { + var data = message.slice(nextSpaceIdx + 2); + var bytes = window.atob(data); + var arraybuffer = new Uint8Array(bytes.length); + for (var i = 0; i < bytes.length; i++) { + arraybuffer[i] = bytes.charCodeAt(i); + } + payload = arraybuffer.buffer; + } else if (payloadKind == 'S') { + payload = window.atob(message.slice(nextSpaceIdx + 2)); + } else { + payload = JSON.parse(message.slice(nextSpaceIdx + 1)); + } + cordova.callbackFromNative(callbackId, success, status, [payload], keepCallback); + } else { + console.log("processMessage failed: invalid message:" + message); + } + } catch (e) { + console.log("processMessage failed: Message: " + message); + console.log("processMessage failed: Error: " + e); + console.log("processMessage failed: Stack: " + e.stack); + } +} + +// This is called from the NativeToJsMessageQueue.java. +androidExec.processMessages = function(messages) { + if (messages) { + messagesFromNative.push(messages); + // Check for the reentrant case, and enqueue the message if that's the case. + if (messagesFromNative.length > 1) { + return; + } + while (messagesFromNative.length) { + // Don't unshift until the end so that reentrancy can be detected. + messages = messagesFromNative[0]; + // The Java side can send a * message to indicate that it + // still has messages waiting to be retrieved. + if (messages == '*') { + messagesFromNative.shift(); + window.setTimeout(pollOnce, 0); + return; + } + + var spaceIdx = messages.indexOf(' '); + var msgLen = +messages.slice(0, spaceIdx); + var message = messages.substr(spaceIdx + 1, msgLen); + messages = messages.slice(spaceIdx + msgLen + 1); + processMessage(message); + if (messages) { + messagesFromNative[0] = messages; + } else { + messagesFromNative.shift(); + } + } + } +}; + +module.exports = androidExec; + +}); + +// file: lib/common/modulemapper.js +define("cordova/modulemapper", function(require, exports, module) { + +var builder = require('cordova/builder'), + moduleMap = define.moduleMap, + symbolList, + deprecationMap; + +exports.reset = function() { + symbolList = []; + deprecationMap = {}; +}; + +function addEntry(strategy, moduleName, symbolPath, opt_deprecationMessage) { + if (!(moduleName in moduleMap)) { + throw new Error('Module ' + moduleName + ' does not exist.'); + } + symbolList.push(strategy, moduleName, symbolPath); + if (opt_deprecationMessage) { + deprecationMap[symbolPath] = opt_deprecationMessage; + } +} + +// Note: Android 2.3 does have Function.bind(). +exports.clobbers = function(moduleName, symbolPath, opt_deprecationMessage) { + addEntry('c', moduleName, symbolPath, opt_deprecationMessage); +}; + +exports.merges = function(moduleName, symbolPath, opt_deprecationMessage) { + addEntry('m', moduleName, symbolPath, opt_deprecationMessage); +}; + +exports.defaults = function(moduleName, symbolPath, opt_deprecationMessage) { + addEntry('d', moduleName, symbolPath, opt_deprecationMessage); +}; + +function prepareNamespace(symbolPath, context) { + if (!symbolPath) { + return context; + } + var parts = symbolPath.split('.'); + var cur = context; + for (var i = 0, part; part = parts[i]; ++i) { + cur = cur[part] = cur[part] || {}; + } + return cur; +} + +exports.mapModules = function(context) { + var origSymbols = {}; + context.CDV_origSymbols = origSymbols; + for (var i = 0, len = symbolList.length; i < len; i += 3) { + var strategy = symbolList[i]; + var moduleName = symbolList[i + 1]; + var symbolPath = symbolList[i + 2]; + var lastDot = symbolPath.lastIndexOf('.'); + var namespace = symbolPath.substr(0, lastDot); + var lastName = symbolPath.substr(lastDot + 1); + + var module = require(moduleName); + var deprecationMsg = symbolPath in deprecationMap ? 'Access made to deprecated symbol: ' + symbolPath + '. ' + deprecationMsg : null; + var parentObj = prepareNamespace(namespace, context); + var target = parentObj[lastName]; + + if (strategy == 'm' && target) { + builder.recursiveMerge(target, module); + } else if ((strategy == 'd' && !target) || (strategy != 'd')) { + if (!(symbolPath in origSymbols)) { + origSymbols[symbolPath] = target; + } + builder.assignOrWrapInDeprecateGetter(parentObj, lastName, module, deprecationMsg); + } + } +}; + +exports.getOriginalSymbol = function(context, symbolPath) { + var origSymbols = context.CDV_origSymbols; + if (origSymbols && (symbolPath in origSymbols)) { + return origSymbols[symbolPath]; + } + var parts = symbolPath.split('.'); + var obj = context; + for (var i = 0; i < parts.length; ++i) { + obj = obj && obj[parts[i]]; + } + return obj; +}; + +exports.loadMatchingModules = function(matchingRegExp) { + for (var k in moduleMap) { + if (matchingRegExp.exec(k)) { + require(k); + } + } +}; + +exports.reset(); + + +}); + +// file: lib/android/platform.js +define("cordova/platform", function(require, exports, module) { + +module.exports = { + id: "android", + initialize:function() { + var channel = require("cordova/channel"), + cordova = require('cordova'), + exec = require('cordova/exec'), + modulemapper = require('cordova/modulemapper'); + + modulemapper.loadMatchingModules(/cordova.*\/symbols$/); + modulemapper.clobbers('cordova/plugin/android/app', 'navigator.app'); + + modulemapper.mapModules(window); + + // Inject a listener for the backbutton on the document. + var backButtonChannel = cordova.addDocumentEventHandler('backbutton'); + backButtonChannel.onHasSubscribersChange = function() { + // If we just attached the first handler or detached the last handler, + // let native know we need to override the back button. + exec(null, null, "App", "overrideBackbutton", [this.numHandlers == 1]); + }; + + // Add hardware MENU and SEARCH button handlers + cordova.addDocumentEventHandler('menubutton'); + cordova.addDocumentEventHandler('searchbutton'); + + // Let native code know we are all done on the JS side. + // Native code will then un-hide the WebView. + channel.join(function() { + exec(null, null, "App", "show", []); + }, [channel.onCordovaReady]); + } +}; + +}); + +// file: lib/common/plugin/Acceleration.js +define("cordova/plugin/Acceleration", function(require, exports, module) { + +var Acceleration = function(x, y, z, timestamp) { + this.x = x; + this.y = y; + this.z = z; + this.timestamp = timestamp || (new Date()).getTime(); +}; + +module.exports = Acceleration; + +}); + +// file: lib/common/plugin/Camera.js +define("cordova/plugin/Camera", function(require, exports, module) { + +var argscheck = require('cordova/argscheck'), + exec = require('cordova/exec'), + Camera = require('cordova/plugin/CameraConstants'), + CameraPopoverHandle = require('cordova/plugin/CameraPopoverHandle'); + +var cameraExport = {}; + +// Tack on the Camera Constants to the base camera plugin. +for (var key in Camera) { + cameraExport[key] = Camera[key]; +} + +/** + * Gets a picture from source defined by "options.sourceType", and returns the + * image as defined by the "options.destinationType" option. + + * The defaults are sourceType=CAMERA and destinationType=FILE_URI. + * + * @param {Function} successCallback + * @param {Function} errorCallback + * @param {Object} options + */ +cameraExport.getPicture = function(successCallback, errorCallback, options) { + argscheck.checkArgs('fFO', 'Camera.getPicture', arguments); + options = options || {}; + var getValue = argscheck.getValue; + + var quality = getValue(options.quality, 50); + var destinationType = getValue(options.destinationType, Camera.DestinationType.FILE_URI); + var sourceType = getValue(options.sourceType, Camera.PictureSourceType.CAMERA); + var targetWidth = getValue(options.targetWidth, -1); + var targetHeight = getValue(options.targetHeight, -1); + var encodingType = getValue(options.encodingType, Camera.EncodingType.JPEG); + var mediaType = getValue(options.mediaType, Camera.MediaType.PICTURE); + var allowEdit = !!options.allowEdit; + var correctOrientation = !!options.correctOrientation; + var saveToPhotoAlbum = !!options.saveToPhotoAlbum; + var popoverOptions = getValue(options.popoverOptions, null); + var cameraDirection = getValue(options.cameraDirection, Camera.Direction.BACK); + + var args = [quality, destinationType, sourceType, targetWidth, targetHeight, encodingType, + mediaType, allowEdit, correctOrientation, saveToPhotoAlbum, popoverOptions, cameraDirection]; + + exec(successCallback, errorCallback, "Camera", "takePicture", args); + return new CameraPopoverHandle(); +}; + +cameraExport.cleanup = function(successCallback, errorCallback) { + exec(successCallback, errorCallback, "Camera", "cleanup", []); +}; + +module.exports = cameraExport; + +}); + +// file: lib/common/plugin/CameraConstants.js +define("cordova/plugin/CameraConstants", function(require, exports, module) { + +module.exports = { + DestinationType:{ + DATA_URL: 0, // Return base64 encoded string + FILE_URI: 1, // Return file uri (content://media/external/images/media/2 for Android) + NATIVE_URI: 2 // Return native uri (eg. asset-library://... for iOS) + }, + EncodingType:{ + JPEG: 0, // Return JPEG encoded image + PNG: 1 // Return PNG encoded image + }, + MediaType:{ + PICTURE: 0, // allow selection of still pictures only. DEFAULT. Will return format specified via DestinationType + VIDEO: 1, // allow selection of video only, ONLY RETURNS URL + ALLMEDIA : 2 // allow selection from all media types + }, + PictureSourceType:{ + PHOTOLIBRARY : 0, // Choose image from picture library (same as SAVEDPHOTOALBUM for Android) + CAMERA : 1, // Take picture from camera + SAVEDPHOTOALBUM : 2 // Choose image from picture library (same as PHOTOLIBRARY for Android) + }, + PopoverArrowDirection:{ + ARROW_UP : 1, // matches iOS UIPopoverArrowDirection constants to specify arrow location on popover + ARROW_DOWN : 2, + ARROW_LEFT : 4, + ARROW_RIGHT : 8, + ARROW_ANY : 15 + }, + Direction:{ + BACK: 0, + FRONT: 1 + } +}; + +}); + +// file: lib/common/plugin/CameraPopoverHandle.js +define("cordova/plugin/CameraPopoverHandle", function(require, exports, module) { + +var exec = require('cordova/exec'); + +/** + * A handle to an image picker popover. + */ +var CameraPopoverHandle = function() { + this.setPosition = function(popoverOptions) { + console.log('CameraPopoverHandle.setPosition is only supported on iOS.'); + }; +}; + +module.exports = CameraPopoverHandle; + +}); + +// file: lib/common/plugin/CameraPopoverOptions.js +define("cordova/plugin/CameraPopoverOptions", function(require, exports, module) { + +var Camera = require('cordova/plugin/CameraConstants'); + +/** + * Encapsulates options for iOS Popover image picker + */ +var CameraPopoverOptions = function(x,y,width,height,arrowDir){ + // information of rectangle that popover should be anchored to + this.x = x || 0; + this.y = y || 32; + this.width = width || 320; + this.height = height || 480; + // The direction of the popover arrow + this.arrowDir = arrowDir || Camera.PopoverArrowDirection.ARROW_ANY; +}; + +module.exports = CameraPopoverOptions; + +}); + +// file: lib/common/plugin/CaptureAudioOptions.js +define("cordova/plugin/CaptureAudioOptions", function(require, exports, module) { + +/** + * Encapsulates all audio capture operation configuration options. + */ +var CaptureAudioOptions = function(){ + // Upper limit of sound clips user can record. Value must be equal or greater than 1. + this.limit = 1; + // Maximum duration of a single sound clip in seconds. + this.duration = 0; +}; + +module.exports = CaptureAudioOptions; + +}); + +// file: lib/common/plugin/CaptureError.js +define("cordova/plugin/CaptureError", function(require, exports, module) { + +/** + * The CaptureError interface encapsulates all errors in the Capture API. + */ +var CaptureError = function(c) { + this.code = c || null; +}; + +// Camera or microphone failed to capture image or sound. +CaptureError.CAPTURE_INTERNAL_ERR = 0; +// Camera application or audio capture application is currently serving other capture request. +CaptureError.CAPTURE_APPLICATION_BUSY = 1; +// Invalid use of the API (e.g. limit parameter has value less than one). +CaptureError.CAPTURE_INVALID_ARGUMENT = 2; +// User exited camera application or audio capture application before capturing anything. +CaptureError.CAPTURE_NO_MEDIA_FILES = 3; +// The requested capture operation is not supported. +CaptureError.CAPTURE_NOT_SUPPORTED = 20; + +module.exports = CaptureError; + +}); + +// file: lib/common/plugin/CaptureImageOptions.js +define("cordova/plugin/CaptureImageOptions", function(require, exports, module) { + +/** + * Encapsulates all image capture operation configuration options. + */ +var CaptureImageOptions = function(){ + // Upper limit of images user can take. Value must be equal or greater than 1. + this.limit = 1; +}; + +module.exports = CaptureImageOptions; + +}); + +// file: lib/common/plugin/CaptureVideoOptions.js +define("cordova/plugin/CaptureVideoOptions", function(require, exports, module) { + +/** + * Encapsulates all video capture operation configuration options. + */ +var CaptureVideoOptions = function(){ + // Upper limit of videos user can record. Value must be equal or greater than 1. + this.limit = 1; + // Maximum duration of a single video clip in seconds. + this.duration = 0; +}; + +module.exports = CaptureVideoOptions; + +}); + +// file: lib/common/plugin/CompassError.js +define("cordova/plugin/CompassError", function(require, exports, module) { + +/** + * CompassError. + * An error code assigned by an implementation when an error has occurred + * @constructor + */ +var CompassError = function(err) { + this.code = (err !== undefined ? err : null); +}; + +CompassError.COMPASS_INTERNAL_ERR = 0; +CompassError.COMPASS_NOT_SUPPORTED = 20; + +module.exports = CompassError; + +}); + +// file: lib/common/plugin/CompassHeading.js +define("cordova/plugin/CompassHeading", function(require, exports, module) { + +var CompassHeading = function(magneticHeading, trueHeading, headingAccuracy, timestamp) { + this.magneticHeading = magneticHeading; + this.trueHeading = trueHeading; + this.headingAccuracy = headingAccuracy; + this.timestamp = timestamp || new Date().getTime(); +}; + +module.exports = CompassHeading; + +}); + +// file: lib/common/plugin/ConfigurationData.js +define("cordova/plugin/ConfigurationData", function(require, exports, module) { + +/** + * Encapsulates a set of parameters that the capture device supports. + */ +function ConfigurationData() { + // The ASCII-encoded string in lower case representing the media type. + this.type = null; + // The height attribute represents height of the image or video in pixels. + // In the case of a sound clip this attribute has value 0. + this.height = 0; + // The width attribute represents width of the image or video in pixels. + // In the case of a sound clip this attribute has value 0 + this.width = 0; +} + +module.exports = ConfigurationData; + +}); + +// file: lib/common/plugin/Connection.js +define("cordova/plugin/Connection", function(require, exports, module) { + +/** + * Network status + */ +module.exports = { + UNKNOWN: "unknown", + ETHERNET: "ethernet", + WIFI: "wifi", + CELL_2G: "2g", + CELL_3G: "3g", + CELL_4G: "4g", + CELL:"cellular", + NONE: "none" +}; + +}); + +// file: lib/common/plugin/Contact.js +define("cordova/plugin/Contact", function(require, exports, module) { + +var argscheck = require('cordova/argscheck'), + exec = require('cordova/exec'), + ContactError = require('cordova/plugin/ContactError'), + utils = require('cordova/utils'); + +/** +* Converts primitives into Complex Object +* Currently only used for Date fields +*/ +function convertIn(contact) { + var value = contact.birthday; + try { + contact.birthday = new Date(parseFloat(value)); + } catch (exception){ + console.log("Cordova Contact convertIn error: exception creating date."); + } + return contact; +} + +/** +* Converts Complex objects into primitives +* Only conversion at present is for Dates. +**/ + +function convertOut(contact) { + var value = contact.birthday; + if (value !== null) { + // try to make it a Date object if it is not already + if (!utils.isDate(value)){ + try { + value = new Date(value); + } catch(exception){ + value = null; + } + } + if (utils.isDate(value)){ + value = value.valueOf(); // convert to milliseconds + } + contact.birthday = value; + } + return contact; +} + +/** +* Contains information about a single contact. +* @constructor +* @param {DOMString} id unique identifier +* @param {DOMString} displayName +* @param {ContactName} name +* @param {DOMString} nickname +* @param {Array.} phoneNumbers array of phone numbers +* @param {Array.} emails array of email addresses +* @param {Array.} addresses array of addresses +* @param {Array.} ims instant messaging user ids +* @param {Array.} organizations +* @param {DOMString} birthday contact's birthday +* @param {DOMString} note user notes about contact +* @param {Array.} photos +* @param {Array.} categories +* @param {Array.} urls contact's web sites +*/ +var Contact = function (id, displayName, name, nickname, phoneNumbers, emails, addresses, + ims, organizations, birthday, note, photos, categories, urls) { + this.id = id || null; + this.rawId = null; + this.displayName = displayName || null; + this.name = name || null; // ContactName + this.nickname = nickname || null; + this.phoneNumbers = phoneNumbers || null; // ContactField[] + this.emails = emails || null; // ContactField[] + this.addresses = addresses || null; // ContactAddress[] + this.ims = ims || null; // ContactField[] + this.organizations = organizations || null; // ContactOrganization[] + this.birthday = birthday || null; + this.note = note || null; + this.photos = photos || null; // ContactField[] + this.categories = categories || null; // ContactField[] + this.urls = urls || null; // ContactField[] +}; + +/** +* Removes contact from device storage. +* @param successCB success callback +* @param errorCB error callback +*/ +Contact.prototype.remove = function(successCB, errorCB) { + argscheck.checkArgs('FF', 'Contact.remove', arguments); + var fail = errorCB && function(code) { + errorCB(new ContactError(code)); + }; + if (this.id === null) { + fail(ContactError.UNKNOWN_ERROR); + } + else { + exec(successCB, fail, "Contacts", "remove", [this.id]); + } +}; + +/** +* Creates a deep copy of this Contact. +* With the contact ID set to null. +* @return copy of this Contact +*/ +Contact.prototype.clone = function() { + var clonedContact = utils.clone(this); + clonedContact.id = null; + clonedContact.rawId = null; + + function nullIds(arr) { + if (arr) { + for (var i = 0; i < arr.length; ++i) { + arr[i].id = null; + } + } + } + + // Loop through and clear out any id's in phones, emails, etc. + nullIds(clonedContact.phoneNumbers); + nullIds(clonedContact.emails); + nullIds(clonedContact.addresses); + nullIds(clonedContact.ims); + nullIds(clonedContact.organizations); + nullIds(clonedContact.categories); + nullIds(clonedContact.photos); + nullIds(clonedContact.urls); + return clonedContact; +}; + +/** +* Persists contact to device storage. +* @param successCB success callback +* @param errorCB error callback +*/ +Contact.prototype.save = function(successCB, errorCB) { + argscheck.checkArgs('FFO', 'Contact.save', arguments); + var fail = errorCB && function(code) { + errorCB(new ContactError(code)); + }; + var success = function(result) { + if (result) { + if (successCB) { + var fullContact = require('cordova/plugin/contacts').create(result); + successCB(convertIn(fullContact)); + } + } + else { + // no Entry object returned + fail(ContactError.UNKNOWN_ERROR); + } + }; + var dupContact = convertOut(utils.clone(this)); + exec(success, fail, "Contacts", "save", [dupContact]); +}; + + +module.exports = Contact; + +}); + +// file: lib/common/plugin/ContactAddress.js +define("cordova/plugin/ContactAddress", function(require, exports, module) { + +/** +* Contact address. +* @constructor +* @param {DOMString} id unique identifier, should only be set by native code +* @param formatted // NOTE: not a W3C standard +* @param streetAddress +* @param locality +* @param region +* @param postalCode +* @param country +*/ + +var ContactAddress = function(pref, type, formatted, streetAddress, locality, region, postalCode, country) { + this.id = null; + this.pref = (typeof pref != 'undefined' ? pref : false); + this.type = type || null; + this.formatted = formatted || null; + this.streetAddress = streetAddress || null; + this.locality = locality || null; + this.region = region || null; + this.postalCode = postalCode || null; + this.country = country || null; +}; + +module.exports = ContactAddress; + +}); + +// file: lib/common/plugin/ContactError.js +define("cordova/plugin/ContactError", function(require, exports, module) { + +/** + * ContactError. + * An error code assigned by an implementation when an error has occurred + * @constructor + */ +var ContactError = function(err) { + this.code = (typeof err != 'undefined' ? err : null); +}; + +/** + * Error codes + */ +ContactError.UNKNOWN_ERROR = 0; +ContactError.INVALID_ARGUMENT_ERROR = 1; +ContactError.TIMEOUT_ERROR = 2; +ContactError.PENDING_OPERATION_ERROR = 3; +ContactError.IO_ERROR = 4; +ContactError.NOT_SUPPORTED_ERROR = 5; +ContactError.PERMISSION_DENIED_ERROR = 20; + +module.exports = ContactError; + +}); + +// file: lib/common/plugin/ContactField.js +define("cordova/plugin/ContactField", function(require, exports, module) { + +/** +* Generic contact field. +* @constructor +* @param {DOMString} id unique identifier, should only be set by native code // NOTE: not a W3C standard +* @param type +* @param value +* @param pref +*/ +var ContactField = function(type, value, pref) { + this.id = null; + this.type = (type && type.toString()) || null; + this.value = (value && value.toString()) || null; + this.pref = (typeof pref != 'undefined' ? pref : false); +}; + +module.exports = ContactField; + +}); + +// file: lib/common/plugin/ContactFindOptions.js +define("cordova/plugin/ContactFindOptions", function(require, exports, module) { + +/** + * ContactFindOptions. + * @constructor + * @param filter used to match contacts against + * @param multiple boolean used to determine if more than one contact should be returned + */ + +var ContactFindOptions = function(filter, multiple) { + this.filter = filter || ''; + this.multiple = (typeof multiple != 'undefined' ? multiple : false); +}; + +module.exports = ContactFindOptions; + +}); + +// file: lib/common/plugin/ContactName.js +define("cordova/plugin/ContactName", function(require, exports, module) { + +/** +* Contact name. +* @constructor +* @param formatted // NOTE: not part of W3C standard +* @param familyName +* @param givenName +* @param middle +* @param prefix +* @param suffix +*/ +var ContactName = function(formatted, familyName, givenName, middle, prefix, suffix) { + this.formatted = formatted || null; + this.familyName = familyName || null; + this.givenName = givenName || null; + this.middleName = middle || null; + this.honorificPrefix = prefix || null; + this.honorificSuffix = suffix || null; +}; + +module.exports = ContactName; + +}); + +// file: lib/common/plugin/ContactOrganization.js +define("cordova/plugin/ContactOrganization", function(require, exports, module) { + +/** +* Contact organization. +* @constructor +* @param {DOMString} id unique identifier, should only be set by native code // NOTE: not a W3C standard +* @param name +* @param dept +* @param title +* @param startDate +* @param endDate +* @param location +* @param desc +*/ + +var ContactOrganization = function(pref, type, name, dept, title) { + this.id = null; + this.pref = (typeof pref != 'undefined' ? pref : false); + this.type = type || null; + this.name = name || null; + this.department = dept || null; + this.title = title || null; +}; + +module.exports = ContactOrganization; + +}); + +// file: lib/common/plugin/Coordinates.js +define("cordova/plugin/Coordinates", function(require, exports, module) { + +/** + * This class contains position information. + * @param {Object} lat + * @param {Object} lng + * @param {Object} alt + * @param {Object} acc + * @param {Object} head + * @param {Object} vel + * @param {Object} altacc + * @constructor + */ +var Coordinates = function(lat, lng, alt, acc, head, vel, altacc) { + /** + * The latitude of the position. + */ + this.latitude = lat; + /** + * The longitude of the position, + */ + this.longitude = lng; + /** + * The accuracy of the position. + */ + this.accuracy = acc; + /** + * The altitude of the position. + */ + this.altitude = (alt !== undefined ? alt : null); + /** + * The direction the device is moving at the position. + */ + this.heading = (head !== undefined ? head : null); + /** + * The velocity with which the device is moving at the position. + */ + this.speed = (vel !== undefined ? vel : null); + + if (this.speed === 0 || this.speed === null) { + this.heading = NaN; + } + + /** + * The altitude accuracy of the position. + */ + this.altitudeAccuracy = (altacc !== undefined) ? altacc : null; +}; + +module.exports = Coordinates; + +}); + +// file: lib/common/plugin/DirectoryEntry.js +define("cordova/plugin/DirectoryEntry", function(require, exports, module) { + +var argscheck = require('cordova/argscheck'), + utils = require('cordova/utils'), + exec = require('cordova/exec'), + Entry = require('cordova/plugin/Entry'), + FileError = require('cordova/plugin/FileError'), + DirectoryReader = require('cordova/plugin/DirectoryReader'); + +/** + * An interface representing a directory on the file system. + * + * {boolean} isFile always false (readonly) + * {boolean} isDirectory always true (readonly) + * {DOMString} name of the directory, excluding the path leading to it (readonly) + * {DOMString} fullPath the absolute full path to the directory (readonly) + * TODO: implement this!!! {FileSystem} filesystem on which the directory resides (readonly) + */ +var DirectoryEntry = function(name, fullPath) { + DirectoryEntry.__super__.constructor.call(this, false, true, name, fullPath); +}; + +utils.extend(DirectoryEntry, Entry); + +/** + * Creates a new DirectoryReader to read entries from this directory + */ +DirectoryEntry.prototype.createReader = function() { + return new DirectoryReader(this.fullPath); +}; + +/** + * Creates or looks up a directory + * + * @param {DOMString} path either a relative or absolute path from this directory in which to look up or create a directory + * @param {Flags} options to create or exclusively create the directory + * @param {Function} successCallback is called with the new entry + * @param {Function} errorCallback is called with a FileError + */ +DirectoryEntry.prototype.getDirectory = function(path, options, successCallback, errorCallback) { + argscheck.checkArgs('sOFF', 'DirectoryEntry.getDirectory', arguments); + var win = successCallback && function(result) { + var entry = new DirectoryEntry(result.name, result.fullPath); + successCallback(entry); + }; + var fail = errorCallback && function(code) { + errorCallback(new FileError(code)); + }; + exec(win, fail, "File", "getDirectory", [this.fullPath, path, options]); +}; + +/** + * Deletes a directory and all of it's contents + * + * @param {Function} successCallback is called with no parameters + * @param {Function} errorCallback is called with a FileError + */ +DirectoryEntry.prototype.removeRecursively = function(successCallback, errorCallback) { + argscheck.checkArgs('FF', 'DirectoryEntry.removeRecursively', arguments); + var fail = errorCallback && function(code) { + errorCallback(new FileError(code)); + }; + exec(successCallback, fail, "File", "removeRecursively", [this.fullPath]); +}; + +/** + * Creates or looks up a file + * + * @param {DOMString} path either a relative or absolute path from this directory in which to look up or create a file + * @param {Flags} options to create or exclusively create the file + * @param {Function} successCallback is called with the new entry + * @param {Function} errorCallback is called with a FileError + */ +DirectoryEntry.prototype.getFile = function(path, options, successCallback, errorCallback) { + argscheck.checkArgs('sOFF', 'DirectoryEntry.getFile', arguments); + var win = successCallback && function(result) { + var FileEntry = require('cordova/plugin/FileEntry'); + var entry = new FileEntry(result.name, result.fullPath); + successCallback(entry); + }; + var fail = errorCallback && function(code) { + errorCallback(new FileError(code)); + }; + exec(win, fail, "File", "getFile", [this.fullPath, path, options]); +}; + +module.exports = DirectoryEntry; + +}); + +// file: lib/common/plugin/DirectoryReader.js +define("cordova/plugin/DirectoryReader", function(require, exports, module) { + +var exec = require('cordova/exec'), + FileError = require('cordova/plugin/FileError') ; + +/** + * An interface that lists the files and directories in a directory. + */ +function DirectoryReader(path) { + this.path = path || null; +} + +/** + * Returns a list of entries from a directory. + * + * @param {Function} successCallback is called with a list of entries + * @param {Function} errorCallback is called with a FileError + */ +DirectoryReader.prototype.readEntries = function(successCallback, errorCallback) { + var win = typeof successCallback !== 'function' ? null : function(result) { + var retVal = []; + for (var i=0; i= 2) { + if (end < 0) { + newEnd = Math.max(size + end, 0); + } else { + newEnd = Math.min(end, size); + } + } + + var newFile = new File(this.name, this.fullPath, this.type, this.lastModifiedData, this.size); + newFile.start = this.start + newStart; + newFile.end = this.start + newEnd; + return newFile; +}; + + +module.exports = File; + +}); + +// file: lib/common/plugin/FileEntry.js +define("cordova/plugin/FileEntry", function(require, exports, module) { + +var utils = require('cordova/utils'), + exec = require('cordova/exec'), + Entry = require('cordova/plugin/Entry'), + FileWriter = require('cordova/plugin/FileWriter'), + File = require('cordova/plugin/File'), + FileError = require('cordova/plugin/FileError'); + +/** + * An interface representing a file on the file system. + * + * {boolean} isFile always true (readonly) + * {boolean} isDirectory always false (readonly) + * {DOMString} name of the file, excluding the path leading to it (readonly) + * {DOMString} fullPath the absolute full path to the file (readonly) + * {FileSystem} filesystem on which the file resides (readonly) + */ +var FileEntry = function(name, fullPath) { + FileEntry.__super__.constructor.apply(this, [true, false, name, fullPath]); +}; + +utils.extend(FileEntry, Entry); + +/** + * Creates a new FileWriter associated with the file that this FileEntry represents. + * + * @param {Function} successCallback is called with the new FileWriter + * @param {Function} errorCallback is called with a FileError + */ +FileEntry.prototype.createWriter = function(successCallback, errorCallback) { + this.file(function(filePointer) { + var writer = new FileWriter(filePointer); + + if (writer.fileName === null || writer.fileName === "") { + errorCallback && errorCallback(new FileError(FileError.INVALID_STATE_ERR)); + } else { + successCallback && successCallback(writer); + } + }, errorCallback); +}; + +/** + * Returns a File that represents the current state of the file that this FileEntry represents. + * + * @param {Function} successCallback is called with the new File object + * @param {Function} errorCallback is called with a FileError + */ +FileEntry.prototype.file = function(successCallback, errorCallback) { + var win = successCallback && function(f) { + var file = new File(f.name, f.fullPath, f.type, f.lastModifiedDate, f.size); + successCallback(file); + }; + var fail = errorCallback && function(code) { + errorCallback(new FileError(code)); + }; + exec(win, fail, "File", "getFileMetadata", [this.fullPath]); +}; + + +module.exports = FileEntry; + +}); + +// file: lib/common/plugin/FileError.js +define("cordova/plugin/FileError", function(require, exports, module) { + +/** + * FileError + */ +function FileError(error) { + this.code = error || null; +} + +// File error codes +// Found in DOMException +FileError.NOT_FOUND_ERR = 1; +FileError.SECURITY_ERR = 2; +FileError.ABORT_ERR = 3; + +// Added by File API specification +FileError.NOT_READABLE_ERR = 4; +FileError.ENCODING_ERR = 5; +FileError.NO_MODIFICATION_ALLOWED_ERR = 6; +FileError.INVALID_STATE_ERR = 7; +FileError.SYNTAX_ERR = 8; +FileError.INVALID_MODIFICATION_ERR = 9; +FileError.QUOTA_EXCEEDED_ERR = 10; +FileError.TYPE_MISMATCH_ERR = 11; +FileError.PATH_EXISTS_ERR = 12; + +module.exports = FileError; + +}); + +// file: lib/common/plugin/FileReader.js +define("cordova/plugin/FileReader", function(require, exports, module) { + +var exec = require('cordova/exec'), + modulemapper = require('cordova/modulemapper'), + utils = require('cordova/utils'), + File = require('cordova/plugin/File'), + FileError = require('cordova/plugin/FileError'), + ProgressEvent = require('cordova/plugin/ProgressEvent'), + origFileReader = modulemapper.getOriginalSymbol(this, 'FileReader'); + +/** + * This class reads the mobile device file system. + * + * For Android: + * The root directory is the root of the file system. + * To read from the SD card, the file name is "sdcard/my_file.txt" + * @constructor + */ +var FileReader = function() { + this._readyState = 0; + this._error = null; + this._result = null; + this._fileName = ''; + this._realReader = origFileReader ? new origFileReader() : {}; +}; + +// States +FileReader.EMPTY = 0; +FileReader.LOADING = 1; +FileReader.DONE = 2; + +utils.defineGetter(FileReader.prototype, 'readyState', function() { + return this._fileName ? this._readyState : this._realReader.readyState; +}); + +utils.defineGetter(FileReader.prototype, 'error', function() { + return this._fileName ? this._error: this._realReader.error; +}); + +utils.defineGetter(FileReader.prototype, 'result', function() { + return this._fileName ? this._result: this._realReader.result; +}); + +function defineEvent(eventName) { + utils.defineGetterSetter(FileReader.prototype, eventName, function() { + return this._realReader[eventName] || null; + }, function(value) { + this._realReader[eventName] = value; + }); +} +defineEvent('onloadstart'); // When the read starts. +defineEvent('onprogress'); // While reading (and decoding) file or fileBlob data, and reporting partial file data (progress.loaded/progress.total) +defineEvent('onload'); // When the read has successfully completed. +defineEvent('onerror'); // When the read has failed (see errors). +defineEvent('onloadend'); // When the request has completed (either in success or failure). +defineEvent('onabort'); // When the read has been aborted. For instance, by invoking the abort() method. + +function initRead(reader, file) { + // Already loading something + if (reader.readyState == FileReader.LOADING) { + throw new FileError(FileError.INVALID_STATE_ERR); + } + + reader._result = null; + reader._error = null; + reader._readyState = FileReader.LOADING; + + if (typeof file == 'string') { + // Deprecated in Cordova 2.4. + console.warn('Using a string argument with FileReader.readAs functions is deprecated.'); + reader._fileName = file; + } else if (typeof file.fullPath == 'string') { + reader._fileName = file.fullPath; + } else { + reader._fileName = ''; + return true; + } + + reader.onloadstart && reader.onloadstart(new ProgressEvent("loadstart", {target:reader})); +} + +/** + * Abort reading file. + */ +FileReader.prototype.abort = function() { + if (origFileReader && !this._fileName) { + return this._realReader.abort(); + } + this._result = null; + + if (this._readyState == FileReader.DONE || this._readyState == FileReader.EMPTY) { + return; + } + + this._readyState = FileReader.DONE; + + // If abort callback + if (typeof this.onabort === 'function') { + this.onabort(new ProgressEvent('abort', {target:this})); + } + // If load end callback + if (typeof this.onloadend === 'function') { + this.onloadend(new ProgressEvent('loadend', {target:this})); + } +}; + +/** + * Read text file. + * + * @param file {File} File object containing file properties + * @param encoding [Optional] (see http://www.iana.org/assignments/character-sets) + */ +FileReader.prototype.readAsText = function(file, encoding) { + if (initRead(this, file)) { + return this._realReader.readAsText(file, encoding); + } + + // Default encoding is UTF-8 + var enc = encoding ? encoding : "UTF-8"; + var me = this; + var execArgs = [this._fileName, enc, file.start, file.end]; + + // Read file + exec( + // Success callback + function(r) { + // If DONE (cancelled), then don't do anything + if (me._readyState === FileReader.DONE) { + return; + } + + // Save result + me._result = r; + + // If onload callback + if (typeof me.onload === "function") { + me.onload(new ProgressEvent("load", {target:me})); + } + + // DONE state + me._readyState = FileReader.DONE; + + // If onloadend callback + if (typeof me.onloadend === "function") { + me.onloadend(new ProgressEvent("loadend", {target:me})); + } + }, + // Error callback + function(e) { + // If DONE (cancelled), then don't do anything + if (me._readyState === FileReader.DONE) { + return; + } + + // DONE state + me._readyState = FileReader.DONE; + + // null result + me._result = null; + + // Save error + me._error = new FileError(e); + + // If onerror callback + if (typeof me.onerror === "function") { + me.onerror(new ProgressEvent("error", {target:me})); + } + + // If onloadend callback + if (typeof me.onloadend === "function") { + me.onloadend(new ProgressEvent("loadend", {target:me})); + } + }, "File", "readAsText", execArgs); +}; + + +/** + * Read file and return data as a base64 encoded data url. + * A data url is of the form: + * data:[][;base64], + * + * @param file {File} File object containing file properties + */ +FileReader.prototype.readAsDataURL = function(file) { + if (initRead(this, file)) { + return this._realReader.readAsDataURL(file); + } + + var me = this; + var execArgs = [this._fileName, file.start, file.end]; + + // Read file + exec( + // Success callback + function(r) { + // If DONE (cancelled), then don't do anything + if (me._readyState === FileReader.DONE) { + return; + } + + // DONE state + me._readyState = FileReader.DONE; + + // Save result + me._result = r; + + // If onload callback + if (typeof me.onload === "function") { + me.onload(new ProgressEvent("load", {target:me})); + } + + // If onloadend callback + if (typeof me.onloadend === "function") { + me.onloadend(new ProgressEvent("loadend", {target:me})); + } + }, + // Error callback + function(e) { + // If DONE (cancelled), then don't do anything + if (me._readyState === FileReader.DONE) { + return; + } + + // DONE state + me._readyState = FileReader.DONE; + + me._result = null; + + // Save error + me._error = new FileError(e); + + // If onerror callback + if (typeof me.onerror === "function") { + me.onerror(new ProgressEvent("error", {target:me})); + } + + // If onloadend callback + if (typeof me.onloadend === "function") { + me.onloadend(new ProgressEvent("loadend", {target:me})); + } + }, "File", "readAsDataURL", execArgs); +}; + +/** + * Read file and return data as a binary data. + * + * @param file {File} File object containing file properties + */ +FileReader.prototype.readAsBinaryString = function(file) { + if (initRead(this, file)) { + return this._realReader.readAsBinaryString(file); + } + + var me = this; + var execArgs = [this._fileName, file.start, file.end]; + + // Read file + exec( + // Success callback + function(r) { + // If DONE (cancelled), then don't do anything + if (me._readyState === FileReader.DONE) { + return; + } + + // DONE state + me._readyState = FileReader.DONE; + + me._result = r; + + // If onload callback + if (typeof me.onload === "function") { + me.onload(new ProgressEvent("load", {target:me})); + } + + // If onloadend callback + if (typeof me.onloadend === "function") { + me.onloadend(new ProgressEvent("loadend", {target:me})); + } + }, + // Error callback + function(e) { + // If DONE (cancelled), then don't do anything + if (me._readyState === FileReader.DONE) { + return; + } + + // DONE state + me._readyState = FileReader.DONE; + + me._result = null; + + // Save error + me._error = new FileError(e); + + // If onerror callback + if (typeof me.onerror === "function") { + me.onerror(new ProgressEvent("error", {target:me})); + } + + // If onloadend callback + if (typeof me.onloadend === "function") { + me.onloadend(new ProgressEvent("loadend", {target:me})); + } + }, "File", "readAsBinaryString", execArgs); +}; + +/** + * Read file and return data as a binary data. + * + * @param file {File} File object containing file properties + */ +FileReader.prototype.readAsArrayBuffer = function(file) { + if (initRead(this, file)) { + return this._realReader.readAsArrayBuffer(file); + } + + var me = this; + var execArgs = [this._fileName, file.start, file.end]; + + // Read file + exec( + // Success callback + function(r) { + // If DONE (cancelled), then don't do anything + if (me._readyState === FileReader.DONE) { + return; + } + + // DONE state + me._readyState = FileReader.DONE; + + me._result = r; + + // If onload callback + if (typeof me.onload === "function") { + me.onload(new ProgressEvent("load", {target:me})); + } + + // If onloadend callback + if (typeof me.onloadend === "function") { + me.onloadend(new ProgressEvent("loadend", {target:me})); + } + }, + // Error callback + function(e) { + // If DONE (cancelled), then don't do anything + if (me._readyState === FileReader.DONE) { + return; + } + + // DONE state + me._readyState = FileReader.DONE; + + me._result = null; + + // Save error + me._error = new FileError(e); + + // If onerror callback + if (typeof me.onerror === "function") { + me.onerror(new ProgressEvent("error", {target:me})); + } + + // If onloadend callback + if (typeof me.onloadend === "function") { + me.onloadend(new ProgressEvent("loadend", {target:me})); + } + }, "File", "readAsArrayBuffer", execArgs); +}; + +module.exports = FileReader; + +}); + +// file: lib/common/plugin/FileSystem.js +define("cordova/plugin/FileSystem", function(require, exports, module) { + +var DirectoryEntry = require('cordova/plugin/DirectoryEntry'); + +/** + * An interface representing a file system + * + * @constructor + * {DOMString} name the unique name of the file system (readonly) + * {DirectoryEntry} root directory of the file system (readonly) + */ +var FileSystem = function(name, root) { + this.name = name || null; + if (root) { + this.root = new DirectoryEntry(root.name, root.fullPath); + } +}; + +module.exports = FileSystem; + +}); + +// file: lib/common/plugin/FileTransfer.js +define("cordova/plugin/FileTransfer", function(require, exports, module) { + +var argscheck = require('cordova/argscheck'), + exec = require('cordova/exec'), + FileTransferError = require('cordova/plugin/FileTransferError'), + ProgressEvent = require('cordova/plugin/ProgressEvent'); + +function newProgressEvent(result) { + var pe = new ProgressEvent(); + pe.lengthComputable = result.lengthComputable; + pe.loaded = result.loaded; + pe.total = result.total; + return pe; +} + +function getBasicAuthHeader(urlString) { + var header = null; + + if (window.btoa) { + // parse the url using the Location object + var url = document.createElement('a'); + url.href = urlString; + + var credentials = null; + var protocol = url.protocol + "//"; + var origin = protocol + url.host; + + // check whether there are the username:password credentials in the url + if (url.href.indexOf(origin) !== 0) { // credentials found + var atIndex = url.href.indexOf("@"); + credentials = url.href.substring(protocol.length, atIndex); + } + + if (credentials) { + var authHeader = "Authorization"; + var authHeaderValue = "Basic " + window.btoa(credentials); + + header = { + name : authHeader, + value : authHeaderValue + }; + } + } + + return header; +} + +var idCounter = 0; + +/** + * FileTransfer uploads a file to a remote server. + * @constructor + */ +var FileTransfer = function() { + this._id = ++idCounter; + this.onprogress = null; // optional callback +}; + +/** +* Given an absolute file path, uploads a file on the device to a remote server +* using a multipart HTTP request. +* @param filePath {String} Full path of the file on the device +* @param server {String} URL of the server to receive the file +* @param successCallback (Function} Callback to be invoked when upload has completed +* @param errorCallback {Function} Callback to be invoked upon error +* @param options {FileUploadOptions} Optional parameters such as file name and mimetype +* @param trustAllHosts {Boolean} Optional trust all hosts (e.g. for self-signed certs), defaults to false +*/ +FileTransfer.prototype.upload = function(filePath, server, successCallback, errorCallback, options, trustAllHosts) { + argscheck.checkArgs('ssFFO*', 'FileTransfer.upload', arguments); + // check for options + var fileKey = null; + var fileName = null; + var mimeType = null; + var params = null; + var chunkedMode = true; + var headers = null; + var httpMethod = null; + var basicAuthHeader = getBasicAuthHeader(server); + if (basicAuthHeader) { + options = options || {}; + options.headers = options.headers || {}; + options.headers[basicAuthHeader.name] = basicAuthHeader.value; + } + + if (options) { + fileKey = options.fileKey; + fileName = options.fileName; + mimeType = options.mimeType; + headers = options.headers; + httpMethod = options.httpMethod || "POST"; + if (httpMethod.toUpperCase() == "PUT"){ + httpMethod = "PUT"; + } else { + httpMethod = "POST"; + } + if (options.chunkedMode !== null || typeof options.chunkedMode != "undefined") { + chunkedMode = options.chunkedMode; + } + if (options.params) { + params = options.params; + } + else { + params = {}; + } + } + + var fail = errorCallback && function(e) { + var error = new FileTransferError(e.code, e.source, e.target, e.http_status, e.body); + errorCallback(error); + }; + + var self = this; + var win = function(result) { + if (typeof result.lengthComputable != "undefined") { + if (self.onprogress) { + self.onprogress(newProgressEvent(result)); + } + } else { + successCallback && successCallback(result); + } + }; + exec(win, fail, 'FileTransfer', 'upload', [filePath, server, fileKey, fileName, mimeType, params, trustAllHosts, chunkedMode, headers, this._id, httpMethod]); +}; + +/** + * Downloads a file form a given URL and saves it to the specified directory. + * @param source {String} URL of the server to receive the file + * @param target {String} Full path of the file on the device + * @param successCallback (Function} Callback to be invoked when upload has completed + * @param errorCallback {Function} Callback to be invoked upon error + * @param trustAllHosts {Boolean} Optional trust all hosts (e.g. for self-signed certs), defaults to false + * @param options {FileDownloadOptions} Optional parameters such as headers + */ +FileTransfer.prototype.download = function(source, target, successCallback, errorCallback, trustAllHosts, options) { + argscheck.checkArgs('ssFF*', 'FileTransfer.download', arguments); + var self = this; + + var basicAuthHeader = getBasicAuthHeader(source); + if (basicAuthHeader) { + options = options || {}; + options.headers = options.headers || {}; + options.headers[basicAuthHeader.name] = basicAuthHeader.value; + } + + var headers = null; + if (options) { + headers = options.headers || null; + } + + var win = function(result) { + if (typeof result.lengthComputable != "undefined") { + if (self.onprogress) { + return self.onprogress(newProgressEvent(result)); + } + } else if (successCallback) { + var entry = null; + if (result.isDirectory) { + entry = new (require('cordova/plugin/DirectoryEntry'))(); + } + else if (result.isFile) { + entry = new (require('cordova/plugin/FileEntry'))(); + } + entry.isDirectory = result.isDirectory; + entry.isFile = result.isFile; + entry.name = result.name; + entry.fullPath = result.fullPath; + successCallback(entry); + } + }; + + var fail = errorCallback && function(e) { + var error = new FileTransferError(e.code, e.source, e.target, e.http_status, e.body); + errorCallback(error); + }; + + exec(win, fail, 'FileTransfer', 'download', [source, target, trustAllHosts, this._id, headers]); +}; + +/** + * Aborts the ongoing file transfer on this object. The original error + * callback for the file transfer will be called if necessary. + */ +FileTransfer.prototype.abort = function() { + exec(null, null, 'FileTransfer', 'abort', [this._id]); +}; + +module.exports = FileTransfer; + +}); + +// file: lib/common/plugin/FileTransferError.js +define("cordova/plugin/FileTransferError", function(require, exports, module) { + +/** + * FileTransferError + * @constructor + */ +var FileTransferError = function(code, source, target, status, body) { + this.code = code || null; + this.source = source || null; + this.target = target || null; + this.http_status = status || null; + this.body = body || null; +}; + +FileTransferError.FILE_NOT_FOUND_ERR = 1; +FileTransferError.INVALID_URL_ERR = 2; +FileTransferError.CONNECTION_ERR = 3; +FileTransferError.ABORT_ERR = 4; + +module.exports = FileTransferError; + +}); + +// file: lib/common/plugin/FileUploadOptions.js +define("cordova/plugin/FileUploadOptions", function(require, exports, module) { + +/** + * Options to customize the HTTP request used to upload files. + * @constructor + * @param fileKey {String} Name of file request parameter. + * @param fileName {String} Filename to be used by the server. Defaults to image.jpg. + * @param mimeType {String} Mimetype of the uploaded file. Defaults to image/jpeg. + * @param params {Object} Object with key: value params to send to the server. + * @param headers {Object} Keys are header names, values are header values. Multiple + * headers of the same name are not supported. + */ +var FileUploadOptions = function(fileKey, fileName, mimeType, params, headers, httpMethod) { + this.fileKey = fileKey || null; + this.fileName = fileName || null; + this.mimeType = mimeType || null; + this.params = params || null; + this.headers = headers || null; + this.httpMethod = httpMethod || null; +}; + +module.exports = FileUploadOptions; + +}); + +// file: lib/common/plugin/FileUploadResult.js +define("cordova/plugin/FileUploadResult", function(require, exports, module) { + +/** + * FileUploadResult + * @constructor + */ +var FileUploadResult = function() { + this.bytesSent = 0; + this.responseCode = null; + this.response = null; +}; + +module.exports = FileUploadResult; + +}); + +// file: lib/common/plugin/FileWriter.js +define("cordova/plugin/FileWriter", function(require, exports, module) { + +var exec = require('cordova/exec'), + FileError = require('cordova/plugin/FileError'), + ProgressEvent = require('cordova/plugin/ProgressEvent'); + +/** + * This class writes to the mobile device file system. + * + * For Android: + * The root directory is the root of the file system. + * To write to the SD card, the file name is "sdcard/my_file.txt" + * + * @constructor + * @param file {File} File object containing file properties + * @param append if true write to the end of the file, otherwise overwrite the file + */ +var FileWriter = function(file) { + this.fileName = ""; + this.length = 0; + if (file) { + this.fileName = file.fullPath || file; + this.length = file.size || 0; + } + // default is to write at the beginning of the file + this.position = 0; + + this.readyState = 0; // EMPTY + + this.result = null; + + // Error + this.error = null; + + // Event handlers + this.onwritestart = null; // When writing starts + this.onprogress = null; // While writing the file, and reporting partial file data + this.onwrite = null; // When the write has successfully completed. + this.onwriteend = null; // When the request has completed (either in success or failure). + this.onabort = null; // When the write has been aborted. For instance, by invoking the abort() method. + this.onerror = null; // When the write has failed (see errors). +}; + +// States +FileWriter.INIT = 0; +FileWriter.WRITING = 1; +FileWriter.DONE = 2; + +/** + * Abort writing file. + */ +FileWriter.prototype.abort = function() { + // check for invalid state + if (this.readyState === FileWriter.DONE || this.readyState === FileWriter.INIT) { + throw new FileError(FileError.INVALID_STATE_ERR); + } + + // set error + this.error = new FileError(FileError.ABORT_ERR); + + this.readyState = FileWriter.DONE; + + // If abort callback + if (typeof this.onabort === "function") { + this.onabort(new ProgressEvent("abort", {"target":this})); + } + + // If write end callback + if (typeof this.onwriteend === "function") { + this.onwriteend(new ProgressEvent("writeend", {"target":this})); + } +}; + +/** + * Writes data to the file + * + * @param text to be written + */ +FileWriter.prototype.write = function(text) { + // Throw an exception if we are already writing a file + if (this.readyState === FileWriter.WRITING) { + throw new FileError(FileError.INVALID_STATE_ERR); + } + + // WRITING state + this.readyState = FileWriter.WRITING; + + var me = this; + + // If onwritestart callback + if (typeof me.onwritestart === "function") { + me.onwritestart(new ProgressEvent("writestart", {"target":me})); + } + + // Write file + exec( + // Success callback + function(r) { + // If DONE (cancelled), then don't do anything + if (me.readyState === FileWriter.DONE) { + return; + } + + // position always increases by bytes written because file would be extended + me.position += r; + // The length of the file is now where we are done writing. + + me.length = me.position; + + // DONE state + me.readyState = FileWriter.DONE; + + // If onwrite callback + if (typeof me.onwrite === "function") { + me.onwrite(new ProgressEvent("write", {"target":me})); + } + + // If onwriteend callback + if (typeof me.onwriteend === "function") { + me.onwriteend(new ProgressEvent("writeend", {"target":me})); + } + }, + // Error callback + function(e) { + // If DONE (cancelled), then don't do anything + if (me.readyState === FileWriter.DONE) { + return; + } + + // DONE state + me.readyState = FileWriter.DONE; + + // Save error + me.error = new FileError(e); + + // If onerror callback + if (typeof me.onerror === "function") { + me.onerror(new ProgressEvent("error", {"target":me})); + } + + // If onwriteend callback + if (typeof me.onwriteend === "function") { + me.onwriteend(new ProgressEvent("writeend", {"target":me})); + } + }, "File", "write", [this.fileName, text, this.position]); +}; + +/** + * Moves the file pointer to the location specified. + * + * If the offset is a negative number the position of the file + * pointer is rewound. If the offset is greater than the file + * size the position is set to the end of the file. + * + * @param offset is the location to move the file pointer to. + */ +FileWriter.prototype.seek = function(offset) { + // Throw an exception if we are already writing a file + if (this.readyState === FileWriter.WRITING) { + throw new FileError(FileError.INVALID_STATE_ERR); + } + + if (!offset && offset !== 0) { + return; + } + + // See back from end of file. + if (offset < 0) { + this.position = Math.max(offset + this.length, 0); + } + // Offset is bigger than file size so set position + // to the end of the file. + else if (offset > this.length) { + this.position = this.length; + } + // Offset is between 0 and file size so set the position + // to start writing. + else { + this.position = offset; + } +}; + +/** + * Truncates the file to the size specified. + * + * @param size to chop the file at. + */ +FileWriter.prototype.truncate = function(size) { + // Throw an exception if we are already writing a file + if (this.readyState === FileWriter.WRITING) { + throw new FileError(FileError.INVALID_STATE_ERR); + } + + // WRITING state + this.readyState = FileWriter.WRITING; + + var me = this; + + // If onwritestart callback + if (typeof me.onwritestart === "function") { + me.onwritestart(new ProgressEvent("writestart", {"target":this})); + } + + // Write file + exec( + // Success callback + function(r) { + // If DONE (cancelled), then don't do anything + if (me.readyState === FileWriter.DONE) { + return; + } + + // DONE state + me.readyState = FileWriter.DONE; + + // Update the length of the file + me.length = r; + me.position = Math.min(me.position, r); + + // If onwrite callback + if (typeof me.onwrite === "function") { + me.onwrite(new ProgressEvent("write", {"target":me})); + } + + // If onwriteend callback + if (typeof me.onwriteend === "function") { + me.onwriteend(new ProgressEvent("writeend", {"target":me})); + } + }, + // Error callback + function(e) { + // If DONE (cancelled), then don't do anything + if (me.readyState === FileWriter.DONE) { + return; + } + + // DONE state + me.readyState = FileWriter.DONE; + + // Save error + me.error = new FileError(e); + + // If onerror callback + if (typeof me.onerror === "function") { + me.onerror(new ProgressEvent("error", {"target":me})); + } + + // If onwriteend callback + if (typeof me.onwriteend === "function") { + me.onwriteend(new ProgressEvent("writeend", {"target":me})); + } + }, "File", "truncate", [this.fileName, size]); +}; + +module.exports = FileWriter; + +}); + +// file: lib/common/plugin/Flags.js +define("cordova/plugin/Flags", function(require, exports, module) { + +/** + * Supplies arguments to methods that lookup or create files and directories. + * + * @param create + * {boolean} file or directory if it doesn't exist + * @param exclusive + * {boolean} used with create; if true the command will fail if + * target path exists + */ +function Flags(create, exclusive) { + this.create = create || false; + this.exclusive = exclusive || false; +} + +module.exports = Flags; + +}); + +// file: lib/common/plugin/GlobalizationError.js +define("cordova/plugin/GlobalizationError", function(require, exports, module) { + + +/** + * Globalization error object + * + * @constructor + * @param code + * @param message + */ +var GlobalizationError = function(code, message) { + this.code = code || null; + this.message = message || ''; +}; + +// Globalization error codes +GlobalizationError.UNKNOWN_ERROR = 0; +GlobalizationError.FORMATTING_ERROR = 1; +GlobalizationError.PARSING_ERROR = 2; +GlobalizationError.PATTERN_ERROR = 3; + +module.exports = GlobalizationError; + +}); + +// file: lib/common/plugin/InAppBrowser.js +define("cordova/plugin/InAppBrowser", function(require, exports, module) { + +var exec = require('cordova/exec'); +var channel = require('cordova/channel'); +var modulemapper = require('cordova/modulemapper'); + +function InAppBrowser() { + this.channels = { + 'loadstart': channel.create('loadstart'), + 'loadstop' : channel.create('loadstop'), + 'loaderror' : channel.create('loaderror'), + 'exit' : channel.create('exit') + }; +} + +InAppBrowser.prototype = { + _eventHandler: function (event) { + if (event.type in this.channels) { + this.channels[event.type].fire(event); + } + }, + close: function (eventname) { + exec(null, null, "InAppBrowser", "close", []); + }, + addEventListener: function (eventname,f) { + if (eventname in this.channels) { + this.channels[eventname].subscribe(f); + } + }, + removeEventListener: function(eventname, f) { + if (eventname in this.channels) { + this.channels[eventname].unsubscribe(f); + } + }, + + executeScript: function(injectDetails, cb) { + if (injectDetails.code) { + exec(cb, null, "InAppBrowser", "injectScriptCode", [injectDetails.code, !!cb]); + } else if (injectDetails.file) { + exec(cb, null, "InAppBrowser", "injectScriptFile", [injectDetails.file, !!cb]); + } else { + throw new Error('executeScript requires exactly one of code or file to be specified'); + } + }, + + insertCSS: function(injectDetails, cb) { + if (injectDetails.code) { + exec(cb, null, "InAppBrowser", "injectStyleCode", [injectDetails.code, !!cb]); + } else if (injectDetails.file) { + exec(cb, null, "InAppBrowser", "injectStyleFile", [injectDetails.file, !!cb]); + } else { + throw new Error('insertCSS requires exactly one of code or file to be specified'); + } + } +}; + +module.exports = function(strUrl, strWindowName, strWindowFeatures) { + var iab = new InAppBrowser(); + var cb = function(eventname) { + iab._eventHandler(eventname); + }; + + // Don't catch calls that write to existing frames (e.g. named iframes). + if (window.frames && window.frames[strWindowName]) { + var origOpenFunc = modulemapper.getOriginalSymbol(window, 'open'); + return origOpenFunc.apply(window, arguments); + } + + exec(cb, cb, "InAppBrowser", "open", [strUrl, strWindowName, strWindowFeatures]); + return iab; +}; + + +}); + +// file: lib/common/plugin/LocalFileSystem.js +define("cordova/plugin/LocalFileSystem", function(require, exports, module) { + +var exec = require('cordova/exec'); + +/** + * Represents a local file system. + */ +var LocalFileSystem = function() { + +}; + +LocalFileSystem.TEMPORARY = 0; //temporary, with no guarantee of persistence +LocalFileSystem.PERSISTENT = 1; //persistent + +module.exports = LocalFileSystem; + +}); + +// file: lib/common/plugin/Media.js +define("cordova/plugin/Media", function(require, exports, module) { + +var argscheck = require('cordova/argscheck'), + utils = require('cordova/utils'), + exec = require('cordova/exec'); + +var mediaObjects = {}; + +/** + * This class provides access to the device media, interfaces to both sound and video + * + * @constructor + * @param src The file name or url to play + * @param successCallback The callback to be called when the file is done playing or recording. + * successCallback() + * @param errorCallback The callback to be called if there is an error. + * errorCallback(int errorCode) - OPTIONAL + * @param statusCallback The callback to be called when media status has changed. + * statusCallback(int statusCode) - OPTIONAL + */ +var Media = function(src, successCallback, errorCallback, statusCallback) { + argscheck.checkArgs('SFFF', 'Media', arguments); + this.id = utils.createUUID(); + mediaObjects[this.id] = this; + this.src = src; + this.successCallback = successCallback; + this.errorCallback = errorCallback; + this.statusCallback = statusCallback; + this._duration = -1; + this._position = -1; + exec(null, this.errorCallback, "Media", "create", [this.id, this.src]); +}; + +// Media messages +Media.MEDIA_STATE = 1; +Media.MEDIA_DURATION = 2; +Media.MEDIA_POSITION = 3; +Media.MEDIA_ERROR = 9; + +// Media states +Media.MEDIA_NONE = 0; +Media.MEDIA_STARTING = 1; +Media.MEDIA_RUNNING = 2; +Media.MEDIA_PAUSED = 3; +Media.MEDIA_STOPPED = 4; +Media.MEDIA_MSG = ["None", "Starting", "Running", "Paused", "Stopped"]; + +// "static" function to return existing objs. +Media.get = function(id) { + return mediaObjects[id]; +}; + +/** + * Start or resume playing audio file. + */ +Media.prototype.play = function(options) { + exec(null, null, "Media", "startPlayingAudio", [this.id, this.src, options]); +}; + +/** + * Stop playing audio file. + */ +Media.prototype.stop = function() { + var me = this; + exec(function() { + me._position = 0; + }, this.errorCallback, "Media", "stopPlayingAudio", [this.id]); +}; + +/** + * Seek or jump to a new time in the track.. + */ +Media.prototype.seekTo = function(milliseconds) { + var me = this; + exec(function(p) { + me._position = p; + }, this.errorCallback, "Media", "seekToAudio", [this.id, milliseconds]); +}; + +/** + * Pause playing audio file. + */ +Media.prototype.pause = function() { + exec(null, this.errorCallback, "Media", "pausePlayingAudio", [this.id]); +}; + +/** + * Get duration of an audio file. + * The duration is only set for audio that is playing, paused or stopped. + * + * @return duration or -1 if not known. + */ +Media.prototype.getDuration = function() { + return this._duration; +}; + +/** + * Get position of audio. + */ +Media.prototype.getCurrentPosition = function(success, fail) { + var me = this; + exec(function(p) { + me._position = p; + success(p); + }, fail, "Media", "getCurrentPositionAudio", [this.id]); +}; + +/** + * Start recording audio file. + */ +Media.prototype.startRecord = function() { + exec(null, this.errorCallback, "Media", "startRecordingAudio", [this.id, this.src]); +}; + +/** + * Stop recording audio file. + */ +Media.prototype.stopRecord = function() { + exec(null, this.errorCallback, "Media", "stopRecordingAudio", [this.id]); +}; + +/** + * Release the resources. + */ +Media.prototype.release = function() { + exec(null, this.errorCallback, "Media", "release", [this.id]); +}; + +/** + * Adjust the volume. + */ +Media.prototype.setVolume = function(volume) { + exec(null, null, "Media", "setVolume", [this.id, volume]); +}; + +/** + * Audio has status update. + * PRIVATE + * + * @param id The media object id (string) + * @param msgType The 'type' of update this is + * @param value Use of value is determined by the msgType + */ +Media.onStatus = function(id, msgType, value) { + + var media = mediaObjects[id]; + + if(media) { + switch(msgType) { + case Media.MEDIA_STATE : + media.statusCallback && media.statusCallback(value); + if(value == Media.MEDIA_STOPPED) { + media.successCallback && media.successCallback(); + } + break; + case Media.MEDIA_DURATION : + media._duration = value; + break; + case Media.MEDIA_ERROR : + media.errorCallback && media.errorCallback(value); + break; + case Media.MEDIA_POSITION : + media._position = Number(value); + break; + default : + console.error && console.error("Unhandled Media.onStatus :: " + msgType); + break; + } + } + else { + console.error && console.error("Received Media.onStatus callback for unknown media :: " + id); + } + +}; + +module.exports = Media; + +}); + +// file: lib/common/plugin/MediaError.js +define("cordova/plugin/MediaError", function(require, exports, module) { + +/** + * This class contains information about any Media errors. +*/ +/* + According to :: http://dev.w3.org/html5/spec-author-view/video.html#mediaerror + We should never be creating these objects, we should just implement the interface + which has 1 property for an instance, 'code' + + instead of doing : + errorCallbackFunction( new MediaError(3,'msg') ); +we should simply use a literal : + errorCallbackFunction( {'code':3} ); + */ + + var _MediaError = window.MediaError; + + +if(!_MediaError) { + window.MediaError = _MediaError = function(code, msg) { + this.code = (typeof code != 'undefined') ? code : null; + this.message = msg || ""; // message is NON-standard! do not use! + }; +} + +_MediaError.MEDIA_ERR_NONE_ACTIVE = _MediaError.MEDIA_ERR_NONE_ACTIVE || 0; +_MediaError.MEDIA_ERR_ABORTED = _MediaError.MEDIA_ERR_ABORTED || 1; +_MediaError.MEDIA_ERR_NETWORK = _MediaError.MEDIA_ERR_NETWORK || 2; +_MediaError.MEDIA_ERR_DECODE = _MediaError.MEDIA_ERR_DECODE || 3; +_MediaError.MEDIA_ERR_NONE_SUPPORTED = _MediaError.MEDIA_ERR_NONE_SUPPORTED || 4; +// TODO: MediaError.MEDIA_ERR_NONE_SUPPORTED is legacy, the W3 spec now defines it as below. +// as defined by http://dev.w3.org/html5/spec-author-view/video.html#error-codes +_MediaError.MEDIA_ERR_SRC_NOT_SUPPORTED = _MediaError.MEDIA_ERR_SRC_NOT_SUPPORTED || 4; + +module.exports = _MediaError; + +}); + +// file: lib/common/plugin/MediaFile.js +define("cordova/plugin/MediaFile", function(require, exports, module) { + +var utils = require('cordova/utils'), + exec = require('cordova/exec'), + File = require('cordova/plugin/File'), + CaptureError = require('cordova/plugin/CaptureError'); +/** + * Represents a single file. + * + * name {DOMString} name of the file, without path information + * fullPath {DOMString} the full path of the file, including the name + * type {DOMString} mime type + * lastModifiedDate {Date} last modified date + * size {Number} size of the file in bytes + */ +var MediaFile = function(name, fullPath, type, lastModifiedDate, size){ + MediaFile.__super__.constructor.apply(this, arguments); +}; + +utils.extend(MediaFile, File); + +/** + * Request capture format data for a specific file and type + * + * @param {Function} successCB + * @param {Function} errorCB + */ +MediaFile.prototype.getFormatData = function(successCallback, errorCallback) { + if (typeof this.fullPath === "undefined" || this.fullPath === null) { + errorCallback(new CaptureError(CaptureError.CAPTURE_INVALID_ARGUMENT)); + } else { + exec(successCallback, errorCallback, "Capture", "getFormatData", [this.fullPath, this.type]); + } +}; + +module.exports = MediaFile; + +}); + +// file: lib/common/plugin/MediaFileData.js +define("cordova/plugin/MediaFileData", function(require, exports, module) { + +/** + * MediaFileData encapsulates format information of a media file. + * + * @param {DOMString} codecs + * @param {long} bitrate + * @param {long} height + * @param {long} width + * @param {float} duration + */ +var MediaFileData = function(codecs, bitrate, height, width, duration){ + this.codecs = codecs || null; + this.bitrate = bitrate || 0; + this.height = height || 0; + this.width = width || 0; + this.duration = duration || 0; +}; + +module.exports = MediaFileData; + +}); + +// file: lib/common/plugin/Metadata.js +define("cordova/plugin/Metadata", function(require, exports, module) { + +/** + * Information about the state of the file or directory + * + * {Date} modificationTime (readonly) + */ +var Metadata = function(time) { + this.modificationTime = (typeof time != 'undefined'?new Date(time):null); +}; + +module.exports = Metadata; + +}); + +// file: lib/common/plugin/Position.js +define("cordova/plugin/Position", function(require, exports, module) { + +var Coordinates = require('cordova/plugin/Coordinates'); + +var Position = function(coords, timestamp) { + if (coords) { + this.coords = new Coordinates(coords.latitude, coords.longitude, coords.altitude, coords.accuracy, coords.heading, coords.velocity, coords.altitudeAccuracy); + } else { + this.coords = new Coordinates(); + } + this.timestamp = (timestamp !== undefined) ? timestamp : new Date(); +}; + +module.exports = Position; + +}); + +// file: lib/common/plugin/PositionError.js +define("cordova/plugin/PositionError", function(require, exports, module) { + +/** + * Position error object + * + * @constructor + * @param code + * @param message + */ +var PositionError = function(code, message) { + this.code = code || null; + this.message = message || ''; +}; + +PositionError.PERMISSION_DENIED = 1; +PositionError.POSITION_UNAVAILABLE = 2; +PositionError.TIMEOUT = 3; + +module.exports = PositionError; + +}); + +// file: lib/common/plugin/ProgressEvent.js +define("cordova/plugin/ProgressEvent", function(require, exports, module) { + +// If ProgressEvent exists in global context, use it already, otherwise use our own polyfill +// Feature test: See if we can instantiate a native ProgressEvent; +// if so, use that approach, +// otherwise fill-in with our own implementation. +// +// NOTE: right now we always fill in with our own. Down the road would be nice if we can use whatever is native in the webview. +var ProgressEvent = (function() { + /* + var createEvent = function(data) { + var event = document.createEvent('Events'); + event.initEvent('ProgressEvent', false, false); + if (data) { + for (var i in data) { + if (data.hasOwnProperty(i)) { + event[i] = data[i]; + } + } + if (data.target) { + // TODO: cannot call .dispatchEvent + // need to first figure out how to implement EventTarget + } + } + return event; + }; + try { + var ev = createEvent({type:"abort",target:document}); + return function ProgressEvent(type, data) { + data.type = type; + return createEvent(data); + }; + } catch(e){ + */ + return function ProgressEvent(type, dict) { + this.type = type; + this.bubbles = false; + this.cancelBubble = false; + this.cancelable = false; + this.lengthComputable = false; + this.loaded = dict && dict.loaded ? dict.loaded : 0; + this.total = dict && dict.total ? dict.total : 0; + this.target = dict && dict.target ? dict.target : null; + }; + //} +})(); + +module.exports = ProgressEvent; + +}); + +// file: lib/common/plugin/accelerometer.js +define("cordova/plugin/accelerometer", function(require, exports, module) { + +/** + * This class provides access to device accelerometer data. + * @constructor + */ +var argscheck = require('cordova/argscheck'), + utils = require("cordova/utils"), + exec = require("cordova/exec"), + Acceleration = require('cordova/plugin/Acceleration'); + +// Is the accel sensor running? +var running = false; + +// Keeps reference to watchAcceleration calls. +var timers = {}; + +// Array of listeners; used to keep track of when we should call start and stop. +var listeners = []; + +// Last returned acceleration object from native +var accel = null; + +// Tells native to start. +function start() { + exec(function(a) { + var tempListeners = listeners.slice(0); + accel = new Acceleration(a.x, a.y, a.z, a.timestamp); + for (var i = 0, l = tempListeners.length; i < l; i++) { + tempListeners[i].win(accel); + } + }, function(e) { + var tempListeners = listeners.slice(0); + for (var i = 0, l = tempListeners.length; i < l; i++) { + tempListeners[i].fail(e); + } + }, "Accelerometer", "start", []); + running = true; +} + +// Tells native to stop. +function stop() { + exec(null, null, "Accelerometer", "stop", []); + running = false; +} + +// Adds a callback pair to the listeners array +function createCallbackPair(win, fail) { + return {win:win, fail:fail}; +} + +// Removes a win/fail listener pair from the listeners array +function removeListeners(l) { + var idx = listeners.indexOf(l); + if (idx > -1) { + listeners.splice(idx, 1); + if (listeners.length === 0) { + stop(); + } + } +} + +var accelerometer = { + /** + * Asynchronously acquires the current acceleration. + * + * @param {Function} successCallback The function to call when the acceleration data is available + * @param {Function} errorCallback The function to call when there is an error getting the acceleration data. (OPTIONAL) + * @param {AccelerationOptions} options The options for getting the accelerometer data such as timeout. (OPTIONAL) + */ + getCurrentAcceleration: function(successCallback, errorCallback, options) { + argscheck.checkArgs('fFO', 'accelerometer.getCurrentAcceleration', arguments); + + var p; + var win = function(a) { + removeListeners(p); + successCallback(a); + }; + var fail = function(e) { + removeListeners(p); + errorCallback && errorCallback(e); + }; + + p = createCallbackPair(win, fail); + listeners.push(p); + + if (!running) { + start(); + } + }, + + /** + * Asynchronously acquires the acceleration repeatedly at a given interval. + * + * @param {Function} successCallback The function to call each time the acceleration data is available + * @param {Function} errorCallback The function to call when there is an error getting the acceleration data. (OPTIONAL) + * @param {AccelerationOptions} options The options for getting the accelerometer data such as timeout. (OPTIONAL) + * @return String The watch id that must be passed to #clearWatch to stop watching. + */ + watchAcceleration: function(successCallback, errorCallback, options) { + argscheck.checkArgs('fFO', 'accelerometer.watchAcceleration', arguments); + // Default interval (10 sec) + var frequency = (options && options.frequency && typeof options.frequency == 'number') ? options.frequency : 10000; + + // Keep reference to watch id, and report accel readings as often as defined in frequency + var id = utils.createUUID(); + + var p = createCallbackPair(function(){}, function(e) { + removeListeners(p); + errorCallback && errorCallback(e); + }); + listeners.push(p); + + timers[id] = { + timer:window.setInterval(function() { + if (accel) { + successCallback(accel); + } + }, frequency), + listeners:p + }; + + if (running) { + // If we're already running then immediately invoke the success callback + // but only if we have retrieved a value, sample code does not check for null ... + if (accel) { + successCallback(accel); + } + } else { + start(); + } + + return id; + }, + + /** + * Clears the specified accelerometer watch. + * + * @param {String} id The id of the watch returned from #watchAcceleration. + */ + clearWatch: function(id) { + // Stop javascript timer & remove from timer list + if (id && timers[id]) { + window.clearInterval(timers[id].timer); + removeListeners(timers[id].listeners); + delete timers[id]; + } + } +}; + +module.exports = accelerometer; + +}); + +// file: lib/common/plugin/accelerometer/symbols.js +define("cordova/plugin/accelerometer/symbols", function(require, exports, module) { + + +var modulemapper = require('cordova/modulemapper'); + +modulemapper.defaults('cordova/plugin/Acceleration', 'Acceleration'); +modulemapper.defaults('cordova/plugin/accelerometer', 'navigator.accelerometer'); + +}); + +// file: lib/android/plugin/android/app.js +define("cordova/plugin/android/app", function(require, exports, module) { + +var exec = require('cordova/exec'); + +module.exports = { + /** + * Clear the resource cache. + */ + clearCache:function() { + exec(null, null, "App", "clearCache", []); + }, + + /** + * Load the url into the webview or into new browser instance. + * + * @param url The URL to load + * @param props Properties that can be passed in to the activity: + * wait: int => wait msec before loading URL + * loadingDialog: "Title,Message" => display a native loading dialog + * loadUrlTimeoutValue: int => time in msec to wait before triggering a timeout error + * clearHistory: boolean => clear webview history (default=false) + * openExternal: boolean => open in a new browser (default=false) + * + * Example: + * navigator.app.loadUrl("http://server/myapp/index.html", {wait:2000, loadingDialog:"Wait,Loading App", loadUrlTimeoutValue: 60000}); + */ + loadUrl:function(url, props) { + exec(null, null, "App", "loadUrl", [url, props]); + }, + + /** + * Cancel loadUrl that is waiting to be loaded. + */ + cancelLoadUrl:function() { + exec(null, null, "App", "cancelLoadUrl", []); + }, + + /** + * Clear web history in this web view. + * Instead of BACK button loading the previous web page, it will exit the app. + */ + clearHistory:function() { + exec(null, null, "App", "clearHistory", []); + }, + + /** + * Go to previous page displayed. + * This is the same as pressing the backbutton on Android device. + */ + backHistory:function() { + exec(null, null, "App", "backHistory", []); + }, + + /** + * Override the default behavior of the Android back button. + * If overridden, when the back button is pressed, the "backKeyDown" JavaScript event will be fired. + * + * Note: The user should not have to call this method. Instead, when the user + * registers for the "backbutton" event, this is automatically done. + * + * @param override T=override, F=cancel override + */ + overrideBackbutton:function(override) { + exec(null, null, "App", "overrideBackbutton", [override]); + }, + + /** + * Exit and terminate the application. + */ + exitApp:function() { + return exec(null, null, "App", "exitApp", []); + } +}; + +}); + +// file: lib/android/plugin/android/device.js +define("cordova/plugin/android/device", function(require, exports, module) { + +var channel = require('cordova/channel'), + utils = require('cordova/utils'), + exec = require('cordova/exec'), + app = require('cordova/plugin/android/app'); + +module.exports = { + /* + * DEPRECATED + * This is only for Android. + * + * You must explicitly override the back button. + */ + overrideBackButton:function() { + console.log("Device.overrideBackButton() is deprecated. Use App.overrideBackbutton(true)."); + app.overrideBackbutton(true); + }, + + /* + * DEPRECATED + * This is only for Android. + * + * This resets the back button to the default behavior + */ + resetBackButton:function() { + console.log("Device.resetBackButton() is deprecated. Use App.overrideBackbutton(false)."); + app.overrideBackbutton(false); + }, + + /* + * DEPRECATED + * This is only for Android. + * + * This terminates the activity! + */ + exitApp:function() { + console.log("Device.exitApp() is deprecated. Use App.exitApp()."); + app.exitApp(); + } +}; + +}); + +// file: lib/android/plugin/android/nativeapiprovider.js +define("cordova/plugin/android/nativeapiprovider", function(require, exports, module) { + +var nativeApi = this._cordovaNative || require('cordova/plugin/android/promptbasednativeapi'); +var currentApi = nativeApi; + +module.exports = { + get: function() { return currentApi; }, + setPreferPrompt: function(value) { + currentApi = value ? require('cordova/plugin/android/promptbasednativeapi') : nativeApi; + }, + // Used only by tests. + set: function(value) { + currentApi = value; + } +}; + +}); + +// file: lib/android/plugin/android/notification.js +define("cordova/plugin/android/notification", function(require, exports, module) { + +var exec = require('cordova/exec'); + +/** + * Provides Android enhanced notification API. + */ +module.exports = { + activityStart : function(title, message) { + // If title and message not specified then mimic Android behavior of + // using default strings. + if (typeof title === "undefined" && typeof message == "undefined") { + title = "Busy"; + message = 'Please wait...'; + } + + exec(null, null, 'Notification', 'activityStart', [ title, message ]); + }, + + /** + * Close an activity dialog + */ + activityStop : function() { + exec(null, null, 'Notification', 'activityStop', []); + }, + + /** + * Display a progress dialog with progress bar that goes from 0 to 100. + * + * @param {String} + * title Title of the progress dialog. + * @param {String} + * message Message to display in the dialog. + */ + progressStart : function(title, message) { + exec(null, null, 'Notification', 'progressStart', [ title, message ]); + }, + + /** + * Close the progress dialog. + */ + progressStop : function() { + exec(null, null, 'Notification', 'progressStop', []); + }, + + /** + * Set the progress dialog value. + * + * @param {Number} + * value 0-100 + */ + progressValue : function(value) { + exec(null, null, 'Notification', 'progressValue', [ value ]); + } +}; + +}); + +// file: lib/android/plugin/android/promptbasednativeapi.js +define("cordova/plugin/android/promptbasednativeapi", function(require, exports, module) { + +module.exports = { + exec: function(service, action, callbackId, argsJson) { + return prompt(argsJson, 'gap:'+JSON.stringify([service, action, callbackId])); + }, + setNativeToJsBridgeMode: function(value) { + prompt(value, 'gap_bridge_mode:'); + }, + retrieveJsMessages: function() { + return prompt('', 'gap_poll:'); + } +}; + +}); + +// file: lib/android/plugin/android/storage.js +define("cordova/plugin/android/storage", function(require, exports, module) { + +var utils = require('cordova/utils'), + exec = require('cordova/exec'), + channel = require('cordova/channel'); + +var queryQueue = {}; + +/** + * SQL result set object + * PRIVATE METHOD + * @constructor + */ +var DroidDB_Rows = function() { + this.resultSet = []; // results array + this.length = 0; // number of rows +}; + +/** + * Get item from SQL result set + * + * @param row The row number to return + * @return The row object + */ +DroidDB_Rows.prototype.item = function(row) { + return this.resultSet[row]; +}; + +/** + * SQL result set that is returned to user. + * PRIVATE METHOD + * @constructor + */ +var DroidDB_Result = function() { + this.rows = new DroidDB_Rows(); +}; + +/** + * Callback from native code when query is complete. + * PRIVATE METHOD + * + * @param id Query id + */ +function completeQuery(id, data) { + var query = queryQueue[id]; + if (query) { + try { + delete queryQueue[id]; + + // Get transaction + var tx = query.tx; + + // If transaction hasn't failed + // Note: We ignore all query results if previous query + // in the same transaction failed. + if (tx && tx.queryList[id]) { + + // Save query results + var r = new DroidDB_Result(); + r.rows.resultSet = data; + r.rows.length = data.length; + try { + if (typeof query.successCallback === 'function') { + query.successCallback(query.tx, r); + } + } catch (ex) { + console.log("executeSql error calling user success callback: "+ex); + } + + tx.queryComplete(id); + } + } catch (e) { + console.log("executeSql error: "+e); + } + } +} + +/** + * Callback from native code when query fails + * PRIVATE METHOD + * + * @param reason Error message + * @param id Query id + */ +function failQuery(reason, id) { + var query = queryQueue[id]; + if (query) { + try { + delete queryQueue[id]; + + // Get transaction + var tx = query.tx; + + // If transaction hasn't failed + // Note: We ignore all query results if previous query + // in the same transaction failed. + if (tx && tx.queryList[id]) { + tx.queryList = {}; + + try { + if (typeof query.errorCallback === 'function') { + query.errorCallback(query.tx, reason); + } + } catch (ex) { + console.log("executeSql error calling user error callback: "+ex); + } + + tx.queryFailed(id, reason); + } + + } catch (e) { + console.log("executeSql error: "+e); + } + } +} + +/** + * SQL query object + * PRIVATE METHOD + * + * @constructor + * @param tx The transaction object that this query belongs to + */ +var DroidDB_Query = function(tx) { + + // Set the id of the query + this.id = utils.createUUID(); + + // Add this query to the queue + queryQueue[this.id] = this; + + // Init result + this.resultSet = []; + + // Set transaction that this query belongs to + this.tx = tx; + + // Add this query to transaction list + this.tx.queryList[this.id] = this; + + // Callbacks + this.successCallback = null; + this.errorCallback = null; + +}; + +/** + * Transaction object + * PRIVATE METHOD + * @constructor + */ +var DroidDB_Tx = function() { + + // Set the id of the transaction + this.id = utils.createUUID(); + + // Callbacks + this.successCallback = null; + this.errorCallback = null; + + // Query list + this.queryList = {}; +}; + +/** + * Mark query in transaction as complete. + * If all queries are complete, call the user's transaction success callback. + * + * @param id Query id + */ +DroidDB_Tx.prototype.queryComplete = function(id) { + delete this.queryList[id]; + + // If no more outstanding queries, then fire transaction success + if (this.successCallback) { + var count = 0; + var i; + for (i in this.queryList) { + if (this.queryList.hasOwnProperty(i)) { + count++; + } + } + if (count === 0) { + try { + this.successCallback(); + } catch(e) { + console.log("Transaction error calling user success callback: " + e); + } + } + } +}; + +/** + * Mark query in transaction as failed. + * + * @param id Query id + * @param reason Error message + */ +DroidDB_Tx.prototype.queryFailed = function(id, reason) { + + // The sql queries in this transaction have already been run, since + // we really don't have a real transaction implemented in native code. + // However, the user callbacks for the remaining sql queries in transaction + // will not be called. + this.queryList = {}; + + if (this.errorCallback) { + try { + this.errorCallback(reason); + } catch(e) { + console.log("Transaction error calling user error callback: " + e); + } + } +}; + +/** + * Execute SQL statement + * + * @param sql SQL statement to execute + * @param params Statement parameters + * @param successCallback Success callback + * @param errorCallback Error callback + */ +DroidDB_Tx.prototype.executeSql = function(sql, params, successCallback, errorCallback) { + + // Init params array + if (typeof params === 'undefined') { + params = []; + } + + // Create query and add to queue + var query = new DroidDB_Query(this); + queryQueue[query.id] = query; + + // Save callbacks + query.successCallback = successCallback; + query.errorCallback = errorCallback; + + // Call native code + exec(null, null, "Storage", "executeSql", [sql, params, query.id]); +}; + +var DatabaseShell = function() { +}; + +/** + * Start a transaction. + * Does not support rollback in event of failure. + * + * @param process {Function} The transaction function + * @param successCallback {Function} + * @param errorCallback {Function} + */ +DatabaseShell.prototype.transaction = function(process, errorCallback, successCallback) { + var tx = new DroidDB_Tx(); + tx.successCallback = successCallback; + tx.errorCallback = errorCallback; + try { + process(tx); + } catch (e) { + console.log("Transaction error: "+e); + if (tx.errorCallback) { + try { + tx.errorCallback(e); + } catch (ex) { + console.log("Transaction error calling user error callback: "+e); + } + } + } +}; + +/** + * Open database + * + * @param name Database name + * @param version Database version + * @param display_name Database display name + * @param size Database size in bytes + * @return Database object + */ +var DroidDB_openDatabase = function(name, version, display_name, size) { + exec(null, null, "Storage", "openDatabase", [name, version, display_name, size]); + var db = new DatabaseShell(); + return db; +}; + + +module.exports = { + openDatabase:DroidDB_openDatabase, + failQuery:failQuery, + completeQuery:completeQuery +}; + +}); + +// file: lib/android/plugin/android/storage/openDatabase.js +define("cordova/plugin/android/storage/openDatabase", function(require, exports, module) { + + +var modulemapper = require('cordova/modulemapper'), + storage = require('cordova/plugin/android/storage'); + +var originalOpenDatabase = modulemapper.getOriginalSymbol(window, 'openDatabase'); + +module.exports = function(name, version, desc, size) { + // First patch WebSQL if necessary + if (!originalOpenDatabase) { + // Not defined, create an openDatabase function for all to use! + return storage.openDatabase.apply(this, arguments); + } + + // Defined, but some Android devices will throw a SECURITY_ERR - + // so we wrap the whole thing in a try-catch and shim in our own + // if the device has Android bug 16175. + try { + return originalOpenDatabase(name, version, desc, size); + } catch (ex) { + if (ex.code !== 18) { + throw ex; + } + } + return storage.openDatabase(name, version, desc, size); +}; + + + +}); + +// file: lib/android/plugin/android/storage/symbols.js +define("cordova/plugin/android/storage/symbols", function(require, exports, module) { + + +var modulemapper = require('cordova/modulemapper'); + +modulemapper.clobbers('cordova/plugin/android/storage/openDatabase', 'openDatabase'); + + +}); + +// file: lib/common/plugin/battery.js +define("cordova/plugin/battery", function(require, exports, module) { + +/** + * This class contains information about the current battery status. + * @constructor + */ +var cordova = require('cordova'), + exec = require('cordova/exec'); + +function handlers() { + return battery.channels.batterystatus.numHandlers + + battery.channels.batterylow.numHandlers + + battery.channels.batterycritical.numHandlers; +} + +var Battery = function() { + this._level = null; + this._isPlugged = null; + // Create new event handlers on the window (returns a channel instance) + this.channels = { + batterystatus:cordova.addWindowEventHandler("batterystatus"), + batterylow:cordova.addWindowEventHandler("batterylow"), + batterycritical:cordova.addWindowEventHandler("batterycritical") + }; + for (var key in this.channels) { + this.channels[key].onHasSubscribersChange = Battery.onHasSubscribersChange; + } +}; +/** + * Event handlers for when callbacks get registered for the battery. + * Keep track of how many handlers we have so we can start and stop the native battery listener + * appropriately (and hopefully save on battery life!). + */ +Battery.onHasSubscribersChange = function() { + // If we just registered the first handler, make sure native listener is started. + if (this.numHandlers === 1 && handlers() === 1) { + exec(battery._status, battery._error, "Battery", "start", []); + } else if (handlers() === 0) { + exec(null, null, "Battery", "stop", []); + } +}; + +/** + * Callback for battery status + * + * @param {Object} info keys: level, isPlugged + */ +Battery.prototype._status = function(info) { + if (info) { + var me = battery; + var level = info.level; + if (me._level !== level || me._isPlugged !== info.isPlugged) { + // Fire batterystatus event + cordova.fireWindowEvent("batterystatus", info); + + // Fire low battery event + if (level === 20 || level === 5) { + if (level === 20) { + cordova.fireWindowEvent("batterylow", info); + } + else { + cordova.fireWindowEvent("batterycritical", info); + } + } + } + me._level = level; + me._isPlugged = info.isPlugged; + } +}; + +/** + * Error callback for battery start + */ +Battery.prototype._error = function(e) { + console.log("Error initializing Battery: " + e); +}; + +var battery = new Battery(); + +module.exports = battery; + +}); + +// file: lib/common/plugin/battery/symbols.js +define("cordova/plugin/battery/symbols", function(require, exports, module) { + + +var modulemapper = require('cordova/modulemapper'); + +modulemapper.defaults('cordova/plugin/battery', 'navigator.battery'); + +}); + +// file: lib/common/plugin/camera/symbols.js +define("cordova/plugin/camera/symbols", function(require, exports, module) { + + +var modulemapper = require('cordova/modulemapper'); + +modulemapper.defaults('cordova/plugin/Camera', 'navigator.camera'); +modulemapper.defaults('cordova/plugin/CameraConstants', 'Camera'); +modulemapper.defaults('cordova/plugin/CameraPopoverOptions', 'CameraPopoverOptions'); + +}); + +// file: lib/common/plugin/capture.js +define("cordova/plugin/capture", function(require, exports, module) { + +var exec = require('cordova/exec'), + MediaFile = require('cordova/plugin/MediaFile'); + +/** + * Launches a capture of different types. + * + * @param (DOMString} type + * @param {Function} successCB + * @param {Function} errorCB + * @param {CaptureVideoOptions} options + */ +function _capture(type, successCallback, errorCallback, options) { + var win = function(pluginResult) { + var mediaFiles = []; + var i; + for (i = 0; i < pluginResult.length; i++) { + var mediaFile = new MediaFile(); + mediaFile.name = pluginResult[i].name; + mediaFile.fullPath = pluginResult[i].fullPath; + mediaFile.type = pluginResult[i].type; + mediaFile.lastModifiedDate = pluginResult[i].lastModifiedDate; + mediaFile.size = pluginResult[i].size; + mediaFiles.push(mediaFile); + } + successCallback(mediaFiles); + }; + exec(win, errorCallback, "Capture", type, [options]); +} +/** + * The Capture interface exposes an interface to the camera and microphone of the hosting device. + */ +function Capture() { + this.supportedAudioModes = []; + this.supportedImageModes = []; + this.supportedVideoModes = []; +} + +/** + * Launch audio recorder application for recording audio clip(s). + * + * @param {Function} successCB + * @param {Function} errorCB + * @param {CaptureAudioOptions} options + */ +Capture.prototype.captureAudio = function(successCallback, errorCallback, options){ + _capture("captureAudio", successCallback, errorCallback, options); +}; + +/** + * Launch camera application for taking image(s). + * + * @param {Function} successCB + * @param {Function} errorCB + * @param {CaptureImageOptions} options + */ +Capture.prototype.captureImage = function(successCallback, errorCallback, options){ + _capture("captureImage", successCallback, errorCallback, options); +}; + +/** + * Launch device camera application for recording video(s). + * + * @param {Function} successCB + * @param {Function} errorCB + * @param {CaptureVideoOptions} options + */ +Capture.prototype.captureVideo = function(successCallback, errorCallback, options){ + _capture("captureVideo", successCallback, errorCallback, options); +}; + + +module.exports = new Capture(); + +}); + +// file: lib/common/plugin/capture/symbols.js +define("cordova/plugin/capture/symbols", function(require, exports, module) { + +var modulemapper = require('cordova/modulemapper'); + +modulemapper.clobbers('cordova/plugin/CaptureError', 'CaptureError'); +modulemapper.clobbers('cordova/plugin/CaptureAudioOptions', 'CaptureAudioOptions'); +modulemapper.clobbers('cordova/plugin/CaptureImageOptions', 'CaptureImageOptions'); +modulemapper.clobbers('cordova/plugin/CaptureVideoOptions', 'CaptureVideoOptions'); +modulemapper.clobbers('cordova/plugin/ConfigurationData', 'ConfigurationData'); +modulemapper.clobbers('cordova/plugin/MediaFile', 'MediaFile'); +modulemapper.clobbers('cordova/plugin/MediaFileData', 'MediaFileData'); +modulemapper.clobbers('cordova/plugin/capture', 'navigator.device.capture'); + +}); + +// file: lib/common/plugin/compass.js +define("cordova/plugin/compass", function(require, exports, module) { + +var argscheck = require('cordova/argscheck'), + exec = require('cordova/exec'), + utils = require('cordova/utils'), + CompassHeading = require('cordova/plugin/CompassHeading'), + CompassError = require('cordova/plugin/CompassError'), + timers = {}, + compass = { + /** + * Asynchronously acquires the current heading. + * @param {Function} successCallback The function to call when the heading + * data is available + * @param {Function} errorCallback The function to call when there is an error + * getting the heading data. + * @param {CompassOptions} options The options for getting the heading data (not used). + */ + getCurrentHeading:function(successCallback, errorCallback, options) { + argscheck.checkArgs('fFO', 'compass.getCurrentHeading', arguments); + + var win = function(result) { + var ch = new CompassHeading(result.magneticHeading, result.trueHeading, result.headingAccuracy, result.timestamp); + successCallback(ch); + }; + var fail = errorCallback && function(code) { + var ce = new CompassError(code); + errorCallback(ce); + }; + + // Get heading + exec(win, fail, "Compass", "getHeading", [options]); + }, + + /** + * Asynchronously acquires the heading repeatedly at a given interval. + * @param {Function} successCallback The function to call each time the heading + * data is available + * @param {Function} errorCallback The function to call when there is an error + * getting the heading data. + * @param {HeadingOptions} options The options for getting the heading data + * such as timeout and the frequency of the watch. For iOS, filter parameter + * specifies to watch via a distance filter rather than time. + */ + watchHeading:function(successCallback, errorCallback, options) { + argscheck.checkArgs('fFO', 'compass.watchHeading', arguments); + // Default interval (100 msec) + var frequency = (options !== undefined && options.frequency !== undefined) ? options.frequency : 100; + var filter = (options !== undefined && options.filter !== undefined) ? options.filter : 0; + + var id = utils.createUUID(); + if (filter > 0) { + // is an iOS request for watch by filter, no timer needed + timers[id] = "iOS"; + compass.getCurrentHeading(successCallback, errorCallback, options); + } else { + // Start watch timer to get headings + timers[id] = window.setInterval(function() { + compass.getCurrentHeading(successCallback, errorCallback); + }, frequency); + } + + return id; + }, + + /** + * Clears the specified heading watch. + * @param {String} watchId The ID of the watch returned from #watchHeading. + */ + clearWatch:function(id) { + // Stop javascript timer & remove from timer list + if (id && timers[id]) { + if (timers[id] != "iOS") { + clearInterval(timers[id]); + } else { + // is iOS watch by filter so call into device to stop + exec(null, null, "Compass", "stopHeading", []); + } + delete timers[id]; + } + } + }; + +module.exports = compass; + +}); + +// file: lib/common/plugin/compass/symbols.js +define("cordova/plugin/compass/symbols", function(require, exports, module) { + + +var modulemapper = require('cordova/modulemapper'); + +modulemapper.clobbers('cordova/plugin/CompassHeading', 'CompassHeading'); +modulemapper.clobbers('cordova/plugin/CompassError', 'CompassError'); +modulemapper.clobbers('cordova/plugin/compass', 'navigator.compass'); + +}); + +// file: lib/common/plugin/console-via-logger.js +define("cordova/plugin/console-via-logger", function(require, exports, module) { + +//------------------------------------------------------------------------------ + +var logger = require("cordova/plugin/logger"); +var utils = require("cordova/utils"); + +//------------------------------------------------------------------------------ +// object that we're exporting +//------------------------------------------------------------------------------ +var console = module.exports; + +//------------------------------------------------------------------------------ +// copy of the original console object +//------------------------------------------------------------------------------ +var WinConsole = window.console; + +//------------------------------------------------------------------------------ +// whether to use the logger +//------------------------------------------------------------------------------ +var UseLogger = false; + +//------------------------------------------------------------------------------ +// Timers +//------------------------------------------------------------------------------ +var Timers = {}; + +//------------------------------------------------------------------------------ +// used for unimplemented methods +//------------------------------------------------------------------------------ +function noop() {} + +//------------------------------------------------------------------------------ +// used for unimplemented methods +//------------------------------------------------------------------------------ +console.useLogger = function (value) { + if (arguments.length) UseLogger = !!value; + + if (UseLogger) { + if (logger.useConsole()) { + throw new Error("console and logger are too intertwingly"); + } + } + + return UseLogger; +}; + +//------------------------------------------------------------------------------ +console.log = function() { + if (logger.useConsole()) return; + logger.log.apply(logger, [].slice.call(arguments)); +}; + +//------------------------------------------------------------------------------ +console.error = function() { + if (logger.useConsole()) return; + logger.error.apply(logger, [].slice.call(arguments)); +}; + +//------------------------------------------------------------------------------ +console.warn = function() { + if (logger.useConsole()) return; + logger.warn.apply(logger, [].slice.call(arguments)); +}; + +//------------------------------------------------------------------------------ +console.info = function() { + if (logger.useConsole()) return; + logger.info.apply(logger, [].slice.call(arguments)); +}; + +//------------------------------------------------------------------------------ +console.debug = function() { + if (logger.useConsole()) return; + logger.debug.apply(logger, [].slice.call(arguments)); +}; + +//------------------------------------------------------------------------------ +console.assert = function(expression) { + if (expression) return; + + var message = logger.format.apply(logger.format, [].slice.call(arguments, 1)); + console.log("ASSERT: " + message); +}; + +//------------------------------------------------------------------------------ +console.clear = function() {}; + +//------------------------------------------------------------------------------ +console.dir = function(object) { + console.log("%o", object); +}; + +//------------------------------------------------------------------------------ +console.dirxml = function(node) { + console.log(node.innerHTML); +}; + +//------------------------------------------------------------------------------ +console.trace = noop; + +//------------------------------------------------------------------------------ +console.group = console.log; + +//------------------------------------------------------------------------------ +console.groupCollapsed = console.log; + +//------------------------------------------------------------------------------ +console.groupEnd = noop; + +//------------------------------------------------------------------------------ +console.time = function(name) { + Timers[name] = new Date().valueOf(); +}; + +//------------------------------------------------------------------------------ +console.timeEnd = function(name) { + var timeStart = Timers[name]; + if (!timeStart) { + console.warn("unknown timer: " + name); + return; + } + + var timeElapsed = new Date().valueOf() - timeStart; + console.log(name + ": " + timeElapsed + "ms"); +}; + +//------------------------------------------------------------------------------ +console.timeStamp = noop; + +//------------------------------------------------------------------------------ +console.profile = noop; + +//------------------------------------------------------------------------------ +console.profileEnd = noop; + +//------------------------------------------------------------------------------ +console.count = noop; + +//------------------------------------------------------------------------------ +console.exception = console.log; + +//------------------------------------------------------------------------------ +console.table = function(data, columns) { + console.log("%o", data); +}; + +//------------------------------------------------------------------------------ +// return a new function that calls both functions passed as args +//------------------------------------------------------------------------------ +function wrappedOrigCall(orgFunc, newFunc) { + return function() { + var args = [].slice.call(arguments); + try { orgFunc.apply(WinConsole, args); } catch (e) {} + try { newFunc.apply(console, args); } catch (e) {} + }; +} + +//------------------------------------------------------------------------------ +// For every function that exists in the original console object, that +// also exists in the new console object, wrap the new console method +// with one that calls both +//------------------------------------------------------------------------------ +for (var key in console) { + if (typeof WinConsole[key] == "function") { + console[key] = wrappedOrigCall(WinConsole[key], console[key]); + } +} + +}); + +// file: lib/common/plugin/contacts.js +define("cordova/plugin/contacts", function(require, exports, module) { + +var argscheck = require('cordova/argscheck'), + exec = require('cordova/exec'), + ContactError = require('cordova/plugin/ContactError'), + utils = require('cordova/utils'), + Contact = require('cordova/plugin/Contact'); + +/** +* Represents a group of Contacts. +* @constructor +*/ +var contacts = { + /** + * Returns an array of Contacts matching the search criteria. + * @param fields that should be searched + * @param successCB success callback + * @param errorCB error callback + * @param {ContactFindOptions} options that can be applied to contact searching + * @return array of Contacts matching search criteria + */ + find:function(fields, successCB, errorCB, options) { + argscheck.checkArgs('afFO', 'contacts.find', arguments); + if (!fields.length) { + errorCB && errorCB(new ContactError(ContactError.INVALID_ARGUMENT_ERROR)); + } else { + var win = function(result) { + var cs = []; + for (var i = 0, l = result.length; i < l; i++) { + cs.push(contacts.create(result[i])); + } + successCB(cs); + }; + exec(win, errorCB, "Contacts", "search", [fields, options]); + } + }, + + /** + * This function creates a new contact, but it does not persist the contact + * to device storage. To persist the contact to device storage, invoke + * contact.save(). + * @param properties an object whose properties will be examined to create a new Contact + * @returns new Contact object + */ + create:function(properties) { + argscheck.checkArgs('O', 'contacts.create', arguments); + var contact = new Contact(); + for (var i in properties) { + if (typeof contact[i] !== 'undefined' && properties.hasOwnProperty(i)) { + contact[i] = properties[i]; + } + } + return contact; + } +}; + +module.exports = contacts; + +}); + +// file: lib/common/plugin/contacts/symbols.js +define("cordova/plugin/contacts/symbols", function(require, exports, module) { + + +var modulemapper = require('cordova/modulemapper'); + +modulemapper.clobbers('cordova/plugin/contacts', 'navigator.contacts'); +modulemapper.clobbers('cordova/plugin/Contact', 'Contact'); +modulemapper.clobbers('cordova/plugin/ContactAddress', 'ContactAddress'); +modulemapper.clobbers('cordova/plugin/ContactError', 'ContactError'); +modulemapper.clobbers('cordova/plugin/ContactField', 'ContactField'); +modulemapper.clobbers('cordova/plugin/ContactFindOptions', 'ContactFindOptions'); +modulemapper.clobbers('cordova/plugin/ContactName', 'ContactName'); +modulemapper.clobbers('cordova/plugin/ContactOrganization', 'ContactOrganization'); + +}); + +// file: lib/common/plugin/device.js +define("cordova/plugin/device", function(require, exports, module) { + +var argscheck = require('cordova/argscheck'), + channel = require('cordova/channel'), + utils = require('cordova/utils'), + exec = require('cordova/exec'); + +// Tell cordova channel to wait on the CordovaInfoReady event +channel.waitForInitialization('onCordovaInfoReady'); + +/** + * This represents the mobile device, and provides properties for inspecting the model, version, UUID of the + * phone, etc. + * @constructor + */ +function Device() { + this.available = false; + this.platform = null; + this.version = null; + this.name = null; + this.uuid = null; + this.cordova = null; + this.model = null; + + var me = this; + + channel.onCordovaReady.subscribe(function() { + me.getInfo(function(info) { + var buildLabel = info.cordova; + if (buildLabel != CORDOVA_JS_BUILD_LABEL) { + buildLabel += ' JS=' + CORDOVA_JS_BUILD_LABEL; + } + me.available = true; + me.platform = info.platform; + me.version = info.version; + me.name = info.name; + me.uuid = info.uuid; + me.cordova = buildLabel; + me.model = info.model; + channel.onCordovaInfoReady.fire(); + },function(e) { + me.available = false; + utils.alert("[ERROR] Error initializing Cordova: " + e); + }); + }); +} + +/** + * Get device info + * + * @param {Function} successCallback The function to call when the heading data is available + * @param {Function} errorCallback The function to call when there is an error getting the heading data. (OPTIONAL) + */ +Device.prototype.getInfo = function(successCallback, errorCallback) { + argscheck.checkArgs('fF', 'Device.getInfo', arguments); + exec(successCallback, errorCallback, "Device", "getDeviceInfo", []); +}; + +module.exports = new Device(); + +}); + +// file: lib/android/plugin/device/symbols.js +define("cordova/plugin/device/symbols", function(require, exports, module) { + + +var modulemapper = require('cordova/modulemapper'); + +modulemapper.clobbers('cordova/plugin/device', 'device'); +modulemapper.merges('cordova/plugin/android/device', 'device'); + +}); + +// file: lib/common/plugin/echo.js +define("cordova/plugin/echo", function(require, exports, module) { + +var exec = require('cordova/exec'), + utils = require('cordova/utils'); + +/** + * Sends the given message through exec() to the Echo plugin, which sends it back to the successCallback. + * @param successCallback invoked with a FileSystem object + * @param errorCallback invoked if error occurs retrieving file system + * @param message The string to be echoed. + * @param forceAsync Whether to force an async return value (for testing native->js bridge). + */ +module.exports = function(successCallback, errorCallback, message, forceAsync) { + var action = 'echo'; + var messageIsMultipart = (utils.typeName(message) == "Array"); + var args = messageIsMultipart ? message : [message]; + + if (utils.typeName(message) == 'ArrayBuffer') { + if (forceAsync) { + console.warn('Cannot echo ArrayBuffer with forced async, falling back to sync.'); + } + action += 'ArrayBuffer'; + } else if (messageIsMultipart) { + if (forceAsync) { + console.warn('Cannot echo MultiPart Array with forced async, falling back to sync.'); + } + action += 'MultiPart'; + } else if (forceAsync) { + action += 'Async'; + } + + exec(successCallback, errorCallback, "Echo", action, args); +}; + + +}); + +// file: lib/android/plugin/file/symbols.js +define("cordova/plugin/file/symbols", function(require, exports, module) { + + +var modulemapper = require('cordova/modulemapper'), + symbolshelper = require('cordova/plugin/file/symbolshelper'); + +symbolshelper(modulemapper.clobbers); + +}); + +// file: lib/common/plugin/file/symbolshelper.js +define("cordova/plugin/file/symbolshelper", function(require, exports, module) { + +module.exports = function(exportFunc) { + exportFunc('cordova/plugin/DirectoryEntry', 'DirectoryEntry'); + exportFunc('cordova/plugin/DirectoryReader', 'DirectoryReader'); + exportFunc('cordova/plugin/Entry', 'Entry'); + exportFunc('cordova/plugin/File', 'File'); + exportFunc('cordova/plugin/FileEntry', 'FileEntry'); + exportFunc('cordova/plugin/FileError', 'FileError'); + exportFunc('cordova/plugin/FileReader', 'FileReader'); + exportFunc('cordova/plugin/FileSystem', 'FileSystem'); + exportFunc('cordova/plugin/FileUploadOptions', 'FileUploadOptions'); + exportFunc('cordova/plugin/FileUploadResult', 'FileUploadResult'); + exportFunc('cordova/plugin/FileWriter', 'FileWriter'); + exportFunc('cordova/plugin/Flags', 'Flags'); + exportFunc('cordova/plugin/LocalFileSystem', 'LocalFileSystem'); + exportFunc('cordova/plugin/Metadata', 'Metadata'); + exportFunc('cordova/plugin/ProgressEvent', 'ProgressEvent'); + exportFunc('cordova/plugin/requestFileSystem', 'requestFileSystem'); + exportFunc('cordova/plugin/resolveLocalFileSystemURI', 'resolveLocalFileSystemURI'); +}; + +}); + +// file: lib/common/plugin/filetransfer/symbols.js +define("cordova/plugin/filetransfer/symbols", function(require, exports, module) { + + +var modulemapper = require('cordova/modulemapper'); + +modulemapper.clobbers('cordova/plugin/FileTransfer', 'FileTransfer'); +modulemapper.clobbers('cordova/plugin/FileTransferError', 'FileTransferError'); + +}); + +// file: lib/common/plugin/geolocation.js +define("cordova/plugin/geolocation", function(require, exports, module) { + +var argscheck = require('cordova/argscheck'), + utils = require('cordova/utils'), + exec = require('cordova/exec'), + PositionError = require('cordova/plugin/PositionError'), + Position = require('cordova/plugin/Position'); + +var timers = {}; // list of timers in use + +// Returns default params, overrides if provided with values +function parseParameters(options) { + var opt = { + maximumAge: 0, + enableHighAccuracy: false, + timeout: Infinity + }; + + if (options) { + if (options.maximumAge !== undefined && !isNaN(options.maximumAge) && options.maximumAge > 0) { + opt.maximumAge = options.maximumAge; + } + if (options.enableHighAccuracy !== undefined) { + opt.enableHighAccuracy = options.enableHighAccuracy; + } + if (options.timeout !== undefined && !isNaN(options.timeout)) { + if (options.timeout < 0) { + opt.timeout = 0; + } else { + opt.timeout = options.timeout; + } + } + } + + return opt; +} + +// Returns a timeout failure, closed over a specified timeout value and error callback. +function createTimeout(errorCallback, timeout) { + var t = setTimeout(function() { + clearTimeout(t); + t = null; + errorCallback({ + code:PositionError.TIMEOUT, + message:"Position retrieval timed out." + }); + }, timeout); + return t; +} + +var geolocation = { + lastPosition:null, // reference to last known (cached) position returned + /** + * Asynchronously acquires the current position. + * + * @param {Function} successCallback The function to call when the position data is available + * @param {Function} errorCallback The function to call when there is an error getting the heading position. (OPTIONAL) + * @param {PositionOptions} options The options for getting the position data. (OPTIONAL) + */ + getCurrentPosition:function(successCallback, errorCallback, options) { + argscheck.checkArgs('fFO', 'geolocation.getCurrentPosition', arguments); + options = parseParameters(options); + + // Timer var that will fire an error callback if no position is retrieved from native + // before the "timeout" param provided expires + var timeoutTimer = {timer:null}; + + var win = function(p) { + clearTimeout(timeoutTimer.timer); + if (!(timeoutTimer.timer)) { + // Timeout already happened, or native fired error callback for + // this geo request. + // Don't continue with success callback. + return; + } + var pos = new Position( + { + latitude:p.latitude, + longitude:p.longitude, + altitude:p.altitude, + accuracy:p.accuracy, + heading:p.heading, + velocity:p.velocity, + altitudeAccuracy:p.altitudeAccuracy + }, + (p.timestamp === undefined ? new Date() : ((p.timestamp instanceof Date) ? p.timestamp : new Date(p.timestamp))) + ); + geolocation.lastPosition = pos; + successCallback(pos); + }; + var fail = function(e) { + clearTimeout(timeoutTimer.timer); + timeoutTimer.timer = null; + var err = new PositionError(e.code, e.message); + if (errorCallback) { + errorCallback(err); + } + }; + + // Check our cached position, if its timestamp difference with current time is less than the maximumAge, then just + // fire the success callback with the cached position. + if (geolocation.lastPosition && options.maximumAge && (((new Date()).getTime() - geolocation.lastPosition.timestamp.getTime()) <= options.maximumAge)) { + successCallback(geolocation.lastPosition); + // If the cached position check failed and the timeout was set to 0, error out with a TIMEOUT error object. + } else if (options.timeout === 0) { + fail({ + code:PositionError.TIMEOUT, + message:"timeout value in PositionOptions set to 0 and no cached Position object available, or cached Position object's age exceeds provided PositionOptions' maximumAge parameter." + }); + // Otherwise we have to call into native to retrieve a position. + } else { + if (options.timeout !== Infinity) { + // If the timeout value was not set to Infinity (default), then + // set up a timeout function that will fire the error callback + // if no successful position was retrieved before timeout expired. + timeoutTimer.timer = createTimeout(fail, options.timeout); + } else { + // This is here so the check in the win function doesn't mess stuff up + // may seem weird but this guarantees timeoutTimer is + // always truthy before we call into native + timeoutTimer.timer = true; + } + exec(win, fail, "Geolocation", "getLocation", [options.enableHighAccuracy, options.maximumAge]); + } + return timeoutTimer; + }, + /** + * Asynchronously watches the geolocation for changes to geolocation. When a change occurs, + * the successCallback is called with the new location. + * + * @param {Function} successCallback The function to call each time the location data is available + * @param {Function} errorCallback The function to call when there is an error getting the location data. (OPTIONAL) + * @param {PositionOptions} options The options for getting the location data such as frequency. (OPTIONAL) + * @return String The watch id that must be passed to #clearWatch to stop watching. + */ + watchPosition:function(successCallback, errorCallback, options) { + argscheck.checkArgs('fFO', 'geolocation.getCurrentPosition', arguments); + options = parseParameters(options); + + var id = utils.createUUID(); + + // Tell device to get a position ASAP, and also retrieve a reference to the timeout timer generated in getCurrentPosition + timers[id] = geolocation.getCurrentPosition(successCallback, errorCallback, options); + + var fail = function(e) { + clearTimeout(timers[id].timer); + var err = new PositionError(e.code, e.message); + if (errorCallback) { + errorCallback(err); + } + }; + + var win = function(p) { + clearTimeout(timers[id].timer); + if (options.timeout !== Infinity) { + timers[id].timer = createTimeout(fail, options.timeout); + } + var pos = new Position( + { + latitude:p.latitude, + longitude:p.longitude, + altitude:p.altitude, + accuracy:p.accuracy, + heading:p.heading, + velocity:p.velocity, + altitudeAccuracy:p.altitudeAccuracy + }, + (p.timestamp === undefined ? new Date() : ((p.timestamp instanceof Date) ? p.timestamp : new Date(p.timestamp))) + ); + geolocation.lastPosition = pos; + successCallback(pos); + }; + + exec(win, fail, "Geolocation", "addWatch", [id, options.enableHighAccuracy]); + + return id; + }, + /** + * Clears the specified heading watch. + * + * @param {String} id The ID of the watch returned from #watchPosition + */ + clearWatch:function(id) { + if (id && timers[id] !== undefined) { + clearTimeout(timers[id].timer); + timers[id].timer = false; + exec(null, null, "Geolocation", "clearWatch", [id]); + } + } +}; + +module.exports = geolocation; + +}); + +// file: lib/common/plugin/geolocation/symbols.js +define("cordova/plugin/geolocation/symbols", function(require, exports, module) { + + +var modulemapper = require('cordova/modulemapper'); + +modulemapper.defaults('cordova/plugin/geolocation', 'navigator.geolocation'); +modulemapper.clobbers('cordova/plugin/PositionError', 'PositionError'); +modulemapper.clobbers('cordova/plugin/Position', 'Position'); +modulemapper.clobbers('cordova/plugin/Coordinates', 'Coordinates'); + +}); + +// file: lib/common/plugin/globalization.js +define("cordova/plugin/globalization", function(require, exports, module) { + +var argscheck = require('cordova/argscheck'), + exec = require('cordova/exec'), + GlobalizationError = require('cordova/plugin/GlobalizationError'); + +var globalization = { + +/** +* Returns the string identifier for the client's current language. +* It returns the language identifier string to the successCB callback with a +* properties object as a parameter. If there is an error getting the language, +* then the errorCB callback is invoked. +* +* @param {Function} successCB +* @param {Function} errorCB +* +* @return Object.value {String}: The language identifier +* +* @error GlobalizationError.UNKNOWN_ERROR +* +* Example +* globalization.getPreferredLanguage(function (language) {alert('language:' + language.value + '\n');}, +* function () {}); +*/ +getPreferredLanguage:function(successCB, failureCB) { + argscheck.checkArgs('fF', 'Globalization.getPreferredLanguage', arguments); + exec(successCB, failureCB, "Globalization","getPreferredLanguage", []); +}, + +/** +* Returns the string identifier for the client's current locale setting. +* It returns the locale identifier string to the successCB callback with a +* properties object as a parameter. If there is an error getting the locale, +* then the errorCB callback is invoked. +* +* @param {Function} successCB +* @param {Function} errorCB +* +* @return Object.value {String}: The locale identifier +* +* @error GlobalizationError.UNKNOWN_ERROR +* +* Example +* globalization.getLocaleName(function (locale) {alert('locale:' + locale.value + '\n');}, +* function () {}); +*/ +getLocaleName:function(successCB, failureCB) { + argscheck.checkArgs('fF', 'Globalization.getLocaleName', arguments); + exec(successCB, failureCB, "Globalization","getLocaleName", []); +}, + + +/** +* Returns a date formatted as a string according to the client's user preferences and +* calendar using the time zone of the client. It returns the formatted date string to the +* successCB callback with a properties object as a parameter. If there is an error +* formatting the date, then the errorCB callback is invoked. +* +* The defaults are: formatLength="short" and selector="date and time" +* +* @param {Date} date +* @param {Function} successCB +* @param {Function} errorCB +* @param {Object} options {optional} +* formatLength {String}: 'short', 'medium', 'long', or 'full' +* selector {String}: 'date', 'time', or 'date and time' +* +* @return Object.value {String}: The localized date string +* +* @error GlobalizationError.FORMATTING_ERROR +* +* Example +* globalization.dateToString(new Date(), +* function (date) {alert('date:' + date.value + '\n');}, +* function (errorCode) {alert(errorCode);}, +* {formatLength:'short'}); +*/ +dateToString:function(date, successCB, failureCB, options) { + argscheck.checkArgs('dfFO', 'Globalization.dateToString', arguments); + var dateValue = date.valueOf(); + exec(successCB, failureCB, "Globalization", "dateToString", [{"date": dateValue, "options": options}]); +}, + + +/** +* Parses a date formatted as a string according to the client's user +* preferences and calendar using the time zone of the client and returns +* the corresponding date object. It returns the date to the successCB +* callback with a properties object as a parameter. If there is an error +* parsing the date string, then the errorCB callback is invoked. +* +* The defaults are: formatLength="short" and selector="date and time" +* +* @param {String} dateString +* @param {Function} successCB +* @param {Function} errorCB +* @param {Object} options {optional} +* formatLength {String}: 'short', 'medium', 'long', or 'full' +* selector {String}: 'date', 'time', or 'date and time' +* +* @return Object.year {Number}: The four digit year +* Object.month {Number}: The month from (0 - 11) +* Object.day {Number}: The day from (1 - 31) +* Object.hour {Number}: The hour from (0 - 23) +* Object.minute {Number}: The minute from (0 - 59) +* Object.second {Number}: The second from (0 - 59) +* Object.millisecond {Number}: The milliseconds (from 0 - 999), +* not available on all platforms +* +* @error GlobalizationError.PARSING_ERROR +* +* Example +* globalization.stringToDate('4/11/2011', +* function (date) { alert('Month:' + date.month + '\n' + +* 'Day:' + date.day + '\n' + +* 'Year:' + date.year + '\n');}, +* function (errorCode) {alert(errorCode);}, +* {selector:'date'}); +*/ +stringToDate:function(dateString, successCB, failureCB, options) { + argscheck.checkArgs('sfFO', 'Globalization.stringToDate', arguments); + exec(successCB, failureCB, "Globalization", "stringToDate", [{"dateString": dateString, "options": options}]); +}, + + +/** +* Returns a pattern string for formatting and parsing dates according to the client's +* user preferences. It returns the pattern to the successCB callback with a +* properties object as a parameter. If there is an error obtaining the pattern, +* then the errorCB callback is invoked. +* +* The defaults are: formatLength="short" and selector="date and time" +* +* @param {Function} successCB +* @param {Function} errorCB +* @param {Object} options {optional} +* formatLength {String}: 'short', 'medium', 'long', or 'full' +* selector {String}: 'date', 'time', or 'date and time' +* +* @return Object.pattern {String}: The date and time pattern for formatting and parsing dates. +* The patterns follow Unicode Technical Standard #35 +* http://unicode.org/reports/tr35/tr35-4.html +* Object.timezone {String}: The abbreviated name of the time zone on the client +* Object.utc_offset {Number}: The current difference in seconds between the client's +* time zone and coordinated universal time. +* Object.dst_offset {Number}: The current daylight saving time offset in seconds +* between the client's non-daylight saving's time zone +* and the client's daylight saving's time zone. +* +* @error GlobalizationError.PATTERN_ERROR +* +* Example +* globalization.getDatePattern( +* function (date) {alert('pattern:' + date.pattern + '\n');}, +* function () {}, +* {formatLength:'short'}); +*/ +getDatePattern:function(successCB, failureCB, options) { + argscheck.checkArgs('fFO', 'Globalization.getDatePattern', arguments); + exec(successCB, failureCB, "Globalization", "getDatePattern", [{"options": options}]); +}, + + +/** +* Returns an array of either the names of the months or days of the week +* according to the client's user preferences and calendar. It returns the array of names to the +* successCB callback with a properties object as a parameter. If there is an error obtaining the +* names, then the errorCB callback is invoked. +* +* The defaults are: type="wide" and item="months" +* +* @param {Function} successCB +* @param {Function} errorCB +* @param {Object} options {optional} +* type {String}: 'narrow' or 'wide' +* item {String}: 'months', or 'days' +* +* @return Object.value {Array{String}}: The array of names starting from either +* the first month in the year or the +* first day of the week. +* @error GlobalizationError.UNKNOWN_ERROR +* +* Example +* globalization.getDateNames(function (names) { +* for(var i = 0; i < names.value.length; i++) { +* alert('Month:' + names.value[i] + '\n');}}, +* function () {}); +*/ +getDateNames:function(successCB, failureCB, options) { + argscheck.checkArgs('fFO', 'Globalization.getDateNames', arguments); + exec(successCB, failureCB, "Globalization", "getDateNames", [{"options": options}]); +}, + +/** +* Returns whether daylight savings time is in effect for a given date using the client's +* time zone and calendar. It returns whether or not daylight savings time is in effect +* to the successCB callback with a properties object as a parameter. If there is an error +* reading the date, then the errorCB callback is invoked. +* +* @param {Date} date +* @param {Function} successCB +* @param {Function} errorCB +* +* @return Object.dst {Boolean}: The value "true" indicates that daylight savings time is +* in effect for the given date and "false" indicate that it is not. +* +* @error GlobalizationError.UNKNOWN_ERROR +* +* Example +* globalization.isDayLightSavingsTime(new Date(), +* function (date) {alert('dst:' + date.dst + '\n');} +* function () {}); +*/ +isDayLightSavingsTime:function(date, successCB, failureCB) { + argscheck.checkArgs('dfF', 'Globalization.isDayLightSavingsTime', arguments); + var dateValue = date.valueOf(); + exec(successCB, failureCB, "Globalization", "isDayLightSavingsTime", [{"date": dateValue}]); +}, + +/** +* Returns the first day of the week according to the client's user preferences and calendar. +* The days of the week are numbered starting from 1 where 1 is considered to be Sunday. +* It returns the day to the successCB callback with a properties object as a parameter. +* If there is an error obtaining the pattern, then the errorCB callback is invoked. +* +* @param {Function} successCB +* @param {Function} errorCB +* +* @return Object.value {Number}: The number of the first day of the week. +* +* @error GlobalizationError.UNKNOWN_ERROR +* +* Example +* globalization.getFirstDayOfWeek(function (day) +* { alert('Day:' + day.value + '\n');}, +* function () {}); +*/ +getFirstDayOfWeek:function(successCB, failureCB) { + argscheck.checkArgs('fF', 'Globalization.getFirstDayOfWeek', arguments); + exec(successCB, failureCB, "Globalization", "getFirstDayOfWeek", []); +}, + + +/** +* Returns a number formatted as a string according to the client's user preferences. +* It returns the formatted number string to the successCB callback with a properties object as a +* parameter. If there is an error formatting the number, then the errorCB callback is invoked. +* +* The defaults are: type="decimal" +* +* @param {Number} number +* @param {Function} successCB +* @param {Function} errorCB +* @param {Object} options {optional} +* type {String}: 'decimal', "percent", or 'currency' +* +* @return Object.value {String}: The formatted number string. +* +* @error GlobalizationError.FORMATTING_ERROR +* +* Example +* globalization.numberToString(3.25, +* function (number) {alert('number:' + number.value + '\n');}, +* function () {}, +* {type:'decimal'}); +*/ +numberToString:function(number, successCB, failureCB, options) { + argscheck.checkArgs('nfFO', 'Globalization.numberToString', arguments); + exec(successCB, failureCB, "Globalization", "numberToString", [{"number": number, "options": options}]); +}, + +/** +* Parses a number formatted as a string according to the client's user preferences and +* returns the corresponding number. It returns the number to the successCB callback with a +* properties object as a parameter. If there is an error parsing the number string, then +* the errorCB callback is invoked. +* +* The defaults are: type="decimal" +* +* @param {String} numberString +* @param {Function} successCB +* @param {Function} errorCB +* @param {Object} options {optional} +* type {String}: 'decimal', "percent", or 'currency' +* +* @return Object.value {Number}: The parsed number. +* +* @error GlobalizationError.PARSING_ERROR +* +* Example +* globalization.stringToNumber('1234.56', +* function (number) {alert('Number:' + number.value + '\n');}, +* function () { alert('Error parsing number');}); +*/ +stringToNumber:function(numberString, successCB, failureCB, options) { + argscheck.checkArgs('sfFO', 'Globalization.stringToNumber', arguments); + exec(successCB, failureCB, "Globalization", "stringToNumber", [{"numberString": numberString, "options": options}]); +}, + +/** +* Returns a pattern string for formatting and parsing numbers according to the client's user +* preferences. It returns the pattern to the successCB callback with a properties object as a +* parameter. If there is an error obtaining the pattern, then the errorCB callback is invoked. +* +* The defaults are: type="decimal" +* +* @param {Function} successCB +* @param {Function} errorCB +* @param {Object} options {optional} +* type {String}: 'decimal', "percent", or 'currency' +* +* @return Object.pattern {String}: The number pattern for formatting and parsing numbers. +* The patterns follow Unicode Technical Standard #35. +* http://unicode.org/reports/tr35/tr35-4.html +* Object.symbol {String}: The symbol to be used when formatting and parsing +* e.g., percent or currency symbol. +* Object.fraction {Number}: The number of fractional digits to use when parsing and +* formatting numbers. +* Object.rounding {Number}: The rounding increment to use when parsing and formatting. +* Object.positive {String}: The symbol to use for positive numbers when parsing and formatting. +* Object.negative: {String}: The symbol to use for negative numbers when parsing and formatting. +* Object.decimal: {String}: The decimal symbol to use for parsing and formatting. +* Object.grouping: {String}: The grouping symbol to use for parsing and formatting. +* +* @error GlobalizationError.PATTERN_ERROR +* +* Example +* globalization.getNumberPattern( +* function (pattern) {alert('Pattern:' + pattern.pattern + '\n');}, +* function () {}); +*/ +getNumberPattern:function(successCB, failureCB, options) { + argscheck.checkArgs('fFO', 'Globalization.getNumberPattern', arguments); + exec(successCB, failureCB, "Globalization", "getNumberPattern", [{"options": options}]); +}, + +/** +* Returns a pattern string for formatting and parsing currency values according to the client's +* user preferences and ISO 4217 currency code. It returns the pattern to the successCB callback with a +* properties object as a parameter. If there is an error obtaining the pattern, then the errorCB +* callback is invoked. +* +* @param {String} currencyCode +* @param {Function} successCB +* @param {Function} errorCB +* +* @return Object.pattern {String}: The currency pattern for formatting and parsing currency values. +* The patterns follow Unicode Technical Standard #35 +* http://unicode.org/reports/tr35/tr35-4.html +* Object.code {String}: The ISO 4217 currency code for the pattern. +* Object.fraction {Number}: The number of fractional digits to use when parsing and +* formatting currency. +* Object.rounding {Number}: The rounding increment to use when parsing and formatting. +* Object.decimal: {String}: The decimal symbol to use for parsing and formatting. +* Object.grouping: {String}: The grouping symbol to use for parsing and formatting. +* +* @error GlobalizationError.FORMATTING_ERROR +* +* Example +* globalization.getCurrencyPattern('EUR', +* function (currency) {alert('Pattern:' + currency.pattern + '\n');} +* function () {}); +*/ +getCurrencyPattern:function(currencyCode, successCB, failureCB) { + argscheck.checkArgs('sfF', 'Globalization.getCurrencyPattern', arguments); + exec(successCB, failureCB, "Globalization", "getCurrencyPattern", [{"currencyCode": currencyCode}]); +} + +}; + +module.exports = globalization; + +}); + +// file: lib/common/plugin/globalization/symbols.js +define("cordova/plugin/globalization/symbols", function(require, exports, module) { + + +var modulemapper = require('cordova/modulemapper'); + +modulemapper.clobbers('cordova/plugin/globalization', 'navigator.globalization'); +modulemapper.clobbers('cordova/plugin/GlobalizationError', 'GlobalizationError'); + +}); + +// file: lib/android/plugin/inappbrowser/symbols.js +define("cordova/plugin/inappbrowser/symbols", function(require, exports, module) { + + +var modulemapper = require('cordova/modulemapper'); + +modulemapper.clobbers('cordova/plugin/InAppBrowser', 'open'); + +}); + +// file: lib/common/plugin/logger.js +define("cordova/plugin/logger", function(require, exports, module) { + +//------------------------------------------------------------------------------ +// The logger module exports the following properties/functions: +// +// LOG - constant for the level LOG +// ERROR - constant for the level ERROR +// WARN - constant for the level WARN +// INFO - constant for the level INFO +// DEBUG - constant for the level DEBUG +// logLevel() - returns current log level +// logLevel(value) - sets and returns a new log level +// useConsole() - returns whether logger is using console +// useConsole(value) - sets and returns whether logger is using console +// log(message,...) - logs a message at level LOG +// error(message,...) - logs a message at level ERROR +// warn(message,...) - logs a message at level WARN +// info(message,...) - logs a message at level INFO +// debug(message,...) - logs a message at level DEBUG +// logLevel(level,message,...) - logs a message specified level +// +//------------------------------------------------------------------------------ + +var logger = exports; + +var exec = require('cordova/exec'); +var utils = require('cordova/utils'); + +var UseConsole = true; +var UseLogger = true; +var Queued = []; +var DeviceReady = false; +var CurrentLevel; + +var originalConsole = console; + +/** + * Logging levels + */ + +var Levels = [ + "LOG", + "ERROR", + "WARN", + "INFO", + "DEBUG" +]; + +/* + * add the logging levels to the logger object and + * to a separate levelsMap object for testing + */ + +var LevelsMap = {}; +for (var i=0; i CurrentLevel) return; + + // queue the message if not yet at deviceready + if (!DeviceReady && !UseConsole) { + Queued.push([level, message]); + return; + } + + // Log using the native logger if that is enabled + if (UseLogger) { + exec(null, null, "Logger", "logLevel", [level, message]); + } + + // Log using the console if that is enabled + if (UseConsole) { + // make sure console is not using logger + if (console.__usingCordovaLogger) { + throw new Error("console and logger are too intertwingly"); + } + + // log to the console + switch (level) { + case logger.LOG: originalConsole.log(message); break; + case logger.ERROR: originalConsole.log("ERROR: " + message); break; + case logger.WARN: originalConsole.log("WARN: " + message); break; + case logger.INFO: originalConsole.log("INFO: " + message); break; + case logger.DEBUG: originalConsole.log("DEBUG: " + message); break; + } + } +}; + + +/** + * Formats a string and arguments following it ala console.log() + * + * Any remaining arguments will be appended to the formatted string. + * + * for rationale, see FireBug's Console API: + * http://getfirebug.com/wiki/index.php/Console_API + */ +logger.format = function(formatString, args) { + return __format(arguments[0], [].slice.call(arguments,1)).join(' '); +}; + + +//------------------------------------------------------------------------------ +/** + * Formats a string and arguments following it ala vsprintf() + * + * format chars: + * %j - format arg as JSON + * %o - format arg as JSON + * %c - format arg as '' + * %% - replace with '%' + * any other char following % will format it's + * arg via toString(). + * + * Returns an array containing the formatted string and any remaining + * arguments. + */ +function __format(formatString, args) { + if (formatString === null || formatString === undefined) return [""]; + if (arguments.length == 1) return [formatString.toString()]; + + if (typeof formatString != "string") + formatString = formatString.toString(); + + var pattern = /(.*?)%(.)(.*)/; + var rest = formatString; + var result = []; + + while (args.length) { + var match = pattern.exec(rest); + if (!match) break; + + var arg = args.shift(); + rest = match[3]; + result.push(match[1]); + + if (match[2] == '%') { + result.push('%'); + args.unshift(arg); + continue; + } + + result.push(__formatted(arg, match[2])); + } + + result.push(rest); + + var remainingArgs = [].slice.call(args); + remainingArgs.unshift(result.join('')); + return remainingArgs; +} + +function __formatted(object, formatChar) { + + try { + switch(formatChar) { + case 'j': + case 'o': return JSON.stringify(object); + case 'c': return ''; + } + } + catch (e) { + return "error JSON.stringify()ing argument: " + e; + } + + if ((object === null) || (object === undefined)) { + return Object.prototype.toString.call(object); + } + + return object.toString(); +} + + +//------------------------------------------------------------------------------ +// when deviceready fires, log queued messages +logger.__onDeviceReady = function() { + if (DeviceReady) return; + + DeviceReady = true; + + for (var i=0; i 3) { + fail(FileError.SYNTAX_ERR); + } else { + // if successful, return a FileSystem object + var success = function(file_system) { + if (file_system) { + if (successCallback) { + // grab the name and root from the file system object + var result = new FileSystem(file_system.name, file_system.root); + successCallback(result); + } + } + else { + // no FileSystem object returned + fail(FileError.NOT_FOUND_ERR); + } + }; + exec(success, fail, "File", "requestFileSystem", [type, size]); + } +}; + +module.exports = requestFileSystem; + +}); + +// file: lib/common/plugin/resolveLocalFileSystemURI.js +define("cordova/plugin/resolveLocalFileSystemURI", function(require, exports, module) { + +var argscheck = require('cordova/argscheck'), + DirectoryEntry = require('cordova/plugin/DirectoryEntry'), + FileEntry = require('cordova/plugin/FileEntry'), + FileError = require('cordova/plugin/FileError'), + exec = require('cordova/exec'); + +/** + * Look up file system Entry referred to by local URI. + * @param {DOMString} uri URI referring to a local file or directory + * @param successCallback invoked with Entry object corresponding to URI + * @param errorCallback invoked if error occurs retrieving file system entry + */ +module.exports = function(uri, successCallback, errorCallback) { + argscheck.checkArgs('sFF', 'resolveLocalFileSystemURI', arguments); + // error callback + var fail = function(error) { + errorCallback && errorCallback(new FileError(error)); + }; + // sanity check for 'not:valid:filename' + if(!uri || uri.split(":").length > 2) { + setTimeout( function() { + fail(FileError.ENCODING_ERR); + },0); + return; + } + // if successful, return either a file or directory entry + var success = function(entry) { + var result; + if (entry) { + if (successCallback) { + // create appropriate Entry object + result = (entry.isDirectory) ? new DirectoryEntry(entry.name, entry.fullPath) : new FileEntry(entry.name, entry.fullPath); + successCallback(result); + } + } + else { + // no Entry object returned + fail(FileError.NOT_FOUND_ERR); + } + }; + + exec(success, fail, "File", "resolveLocalFileSystemURI", [uri]); +}; + +}); + +// file: lib/common/plugin/splashscreen.js +define("cordova/plugin/splashscreen", function(require, exports, module) { + +var exec = require('cordova/exec'); + +var splashscreen = { + show:function() { + exec(null, null, "SplashScreen", "show", []); + }, + hide:function() { + exec(null, null, "SplashScreen", "hide", []); + } +}; + +module.exports = splashscreen; + +}); + +// file: lib/common/plugin/splashscreen/symbols.js +define("cordova/plugin/splashscreen/symbols", function(require, exports, module) { + + +var modulemapper = require('cordova/modulemapper'); + +modulemapper.clobbers('cordova/plugin/splashscreen', 'navigator.splashscreen'); + +}); + +// file: lib/common/symbols.js +define("cordova/symbols", function(require, exports, module) { + +var modulemapper = require('cordova/modulemapper'); + +// Use merges here in case others symbols files depend on this running first, +// but fail to declare the dependency with a require(). +modulemapper.merges('cordova', 'cordova'); +modulemapper.clobbers('cordova/exec', 'cordova.exec'); +modulemapper.clobbers('cordova/exec', 'Cordova.exec'); + +}); + +// file: lib/common/utils.js +define("cordova/utils", function(require, exports, module) { + +var utils = exports; + +/** + * Defines a property getter / setter for obj[key]. + */ +utils.defineGetterSetter = function(obj, key, getFunc, opt_setFunc) { + if (Object.defineProperty) { + var desc = { + get: getFunc, + configurable: true + }; + if (opt_setFunc) { + desc.set = opt_setFunc; + } + Object.defineProperty(obj, key, desc); + } else { + obj.__defineGetter__(key, getFunc); + if (opt_setFunc) { + obj.__defineSetter__(key, opt_setFunc); + } + } +}; + +/** + * Defines a property getter for obj[key]. + */ +utils.defineGetter = utils.defineGetterSetter; + +utils.arrayIndexOf = function(a, item) { + if (a.indexOf) { + return a.indexOf(item); + } + var len = a.length; + for (var i = 0; i < len; ++i) { + if (a[i] == item) { + return i; + } + } + return -1; +}; + +/** + * Returns whether the item was found in the array. + */ +utils.arrayRemove = function(a, item) { + var index = utils.arrayIndexOf(a, item); + if (index != -1) { + a.splice(index, 1); + } + return index != -1; +}; + +utils.typeName = function(val) { + return Object.prototype.toString.call(val).slice(8, -1); +}; + +/** + * Returns an indication of whether the argument is an array or not + */ +utils.isArray = function(a) { + return utils.typeName(a) == 'Array'; +}; + +/** + * Returns an indication of whether the argument is a Date or not + */ +utils.isDate = function(d) { + return utils.typeName(d) == 'Date'; +}; + +/** + * Does a deep clone of the object. + */ +utils.clone = function(obj) { + if(!obj || typeof obj == 'function' || utils.isDate(obj) || typeof obj != 'object') { + return obj; + } + + var retVal, i; + + if(utils.isArray(obj)){ + retVal = []; + for(i = 0; i < obj.length; ++i){ + retVal.push(utils.clone(obj[i])); + } + return retVal; + } + + retVal = {}; + for(i in obj){ + if(!(i in retVal) || retVal[i] != obj[i]) { + retVal[i] = utils.clone(obj[i]); + } + } + return retVal; +}; + +/** + * Returns a wrapped version of the function + */ +utils.close = function(context, func, params) { + if (typeof params == 'undefined') { + return function() { + return func.apply(context, arguments); + }; + } else { + return function() { + return func.apply(context, params); + }; + } +}; + +/** + * Create a UUID + */ +utils.createUUID = function() { + return UUIDcreatePart(4) + '-' + + UUIDcreatePart(2) + '-' + + UUIDcreatePart(2) + '-' + + UUIDcreatePart(2) + '-' + + UUIDcreatePart(6); +}; + +/** + * Extends a child object from a parent object using classical inheritance + * pattern. + */ +utils.extend = (function() { + // proxy used to establish prototype chain + var F = function() {}; + // extend Child from Parent + return function(Child, Parent) { + F.prototype = Parent.prototype; + Child.prototype = new F(); + Child.__super__ = Parent.prototype; + Child.prototype.constructor = Child; + }; +}()); + +/** + * Alerts a message in any available way: alert or console.log. + */ +utils.alert = function(msg) { + if (window.alert) { + window.alert(msg); + } else if (console && console.log) { + console.log(msg); + } +}; + + +//------------------------------------------------------------------------------ +function UUIDcreatePart(length) { + var uuidpart = ""; + for (var i=0; i tag. + function injectScript(path) { + scriptCounter++; + var script = document.createElement("script"); + script.onload = scriptLoadedCallback; + script.src = path; + document.head.appendChild(script); + } + + // Called when: + // * There are plugins defined and all plugins are finished loading. + // * There are no plugins to load. + function finishPluginLoading() { + context.cordova.require('cordova/channel').onPluginsReady.fire(); + } + + // Handler for the cordova_plugins.json content. + // See plugman's plugin_loader.js for the details of this object. + // This function is only called if the really is a plugins array that isn't empty. + // Otherwise the XHR response handler will just call finishPluginLoading(). + function handlePluginsObject(modules) { + // First create the callback for when all plugins are loaded. + var mapper = context.cordova.require('cordova/modulemapper'); + onScriptLoadingComplete = function() { + // Loop through all the plugins and then through their clobbers and merges. + for (var i = 0; i < modules.length; i++) { + var module = modules[i]; + if (!module) continue; + + if (module.clobbers && module.clobbers.length) { + for (var j = 0; j < module.clobbers.length; j++) { + mapper.clobbers(module.id, module.clobbers[j]); + } + } + + if (module.merges && module.merges.length) { + for (var k = 0; k < module.merges.length; k++) { + mapper.merges(module.id, module.merges[k]); + } + } + + // Finally, if runs is truthy we want to simply require() the module. + // This can be skipped if it had any merges or clobbers, though, + // since the mapper will already have required the module. + if (module.runs && !(module.clobbers && module.clobbers.length) && !(module.merges && module.merges.length)) { + context.cordova.require(module.id); + } + } + + finishPluginLoading(); + }; + + // Now inject the scripts. + for (var i = 0; i < modules.length; i++) { + injectScript(modules[i].file); + } + } + + + // Try to XHR the cordova_plugins.json file asynchronously. + var xhr = new XMLHttpRequest(); + xhr.onload = function() { + // If the response is a JSON string which composes an array, call handlePluginsObject. + // If the request fails, or the response is not a JSON array, just call finishPluginLoading. + var obj; + try { + obj = this.status == 200 && this.responseText && JSON.parse(this.responseText); + } catch (err) { + // obj will be undefined. + } + if (Array.isArray(obj) && obj.length > 0) { + handlePluginsObject(obj); + } else { + finishPluginLoading(); + } + }; + xhr.onerror = function() { + finishPluginLoading(); + }; + try { // we commented we were going to try, so let us actually try and catch + xhr.open('GET', 'cordova_plugins.json', true); // Async + xhr.send(); + } catch(err){ + finishPluginLoading(); + } +}(window)); + + +})(); \ No newline at end of file diff --git a/cordova-lib/spec-plugman-install/projects/android_one/cordova/build b/cordova-lib/spec-plugman-install/projects/android_one/cordova/build new file mode 100755 index 000000000..3cbd9c185 --- /dev/null +++ b/cordova-lib/spec-plugman-install/projects/android_one/cordova/build @@ -0,0 +1,23 @@ +#!/bin/bash +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +set -e + +CORDOVA_PATH=$( cd "$( dirname "$0" )" && pwd ) + +bash "$CORDOVA_PATH"/lib/cordova build "$@" diff --git a/cordova-lib/spec-plugman-install/projects/android_one/cordova/clean b/cordova-lib/spec-plugman-install/projects/android_one/cordova/clean new file mode 100755 index 000000000..f52966a5a --- /dev/null +++ b/cordova-lib/spec-plugman-install/projects/android_one/cordova/clean @@ -0,0 +1,23 @@ +#!/bin/bash +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +set -e + +CORDOVA_PATH=$( cd "$( dirname "$0" )" && pwd ) + +bash "$CORDOVA_PATH"/lib/cordova clean "$@" diff --git a/cordova-lib/spec-plugman-install/projects/android_one/cordova/lib/cordova b/cordova-lib/spec-plugman-install/projects/android_one/cordova/lib/cordova new file mode 100755 index 000000000..be343e906 --- /dev/null +++ b/cordova-lib/spec-plugman-install/projects/android_one/cordova/lib/cordova @@ -0,0 +1,386 @@ +#!/bin/bash +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +PROJECT_PATH=$( cd "$( dirname "$0" )/../.." && pwd ) + +function list_devices { + IFS=$'\n' + devices=`adb devices | awk '/List of devices attached/ { while(getline > 0) { print }}' | grep 'device' | grep -v 'emulator'` + device_list=($devices) + if [[ ${#device_list[@]} > 0 ]] ; then + for i in ${devices[@]} + do + # remove space and 'device' + echo ${i/[^a-zA-Z0-9._]device/} + done + else + echo "No devices found." + exit 2 + fi +} + +function list_started_emulators { + IFS=$'\n' + devices=`adb devices | awk '/List of devices attached/ { while(getline > 0) { print }}' | grep 'device' | grep 'emulator'` + emulator_list=($devices) + if [[ ${#emulator_list[@]} > 0 ]] ; then + for i in ${emulator_list[@]} + do + # remove space and 'device' + echo ${i/[^a-zA-Z0-9._]device/} + done + else + echo "No started emulators found, you can start an emulator by using the command" + echo " 'cordova/lib/start-emulator'" + exit 2 + fi +} + +function list_emulator_images { + emulator_images=`android list avds | grep "Name:" | cut -f 2 -d ":"` + emulator_list=($emulator_images) + if [[ ${#emulator_list[@]} > 0 ]] ; then + for i in ${emulator_list[@]} + do + echo ${i/[^a-zA-Z0-9._]/} + done + else + echo "No emulators found, if you would like to create an emulator follow the instructions" + echo " provided here : http://developer.android.com/tools/devices/index.html" + echo " Or run 'android create avd --name --target ' in on the command line." + exit 2 + fi +} + +function start_emulator { + emulator_images=`android list avds | grep "Name:" | cut -f 2 -d ":"` + # if target emulator is provided + if [[ "$#" -eq 1 ]] ; then + # check that it exists + if [[ $emulator_images =~ $1 ]] ; then + #xterm -e emulator -avd $1 & + emulator -avd $1 1> /dev/null 2>&1 & + else + echo "Could not find the provided emulator, make sure the emulator exists" + echo " by checking 'cordova/lib/list-emulator-images'" + exit 2 + fi + else + # start first emulator + emulator_list=($emulator_images) + if [[ ${#emulator_list[@]} > 0 ]] ; then + #xterm -e emulator -avd ${emulator_list[0]} & + emulator -avd ${emulator_list[0]/[^a-zA-Z0-9._]/} 1> /dev/null 2>&1 & + else + echo "No emulators found, if you would like to create an emulator follow the instructions" + echo " provided here : http://developer.android.com/tools/devices/index.html" + echo " Or run 'android create avd --name --target ' in on the command line." + exit 2 + fi + fi +} + +function install_device { + IFS=$'\n' + devices=`adb devices | awk '/List of devices attached/ { while(getline > 0) { print }}' | grep 'device' | grep -v 'emulator'` + device_list=($devices) + if [[ ${#device_list[@]} > 0 ]] ; then + apks=`find $PROJECT_PATH/bin -type f -maxdepth 1 | egrep '\.apk$'` + apk_list=($apks) + if [[ ${#apk_list[@]} > 0 ]] ; then + local target + # handle target emulator + if [[ "$#" -eq 1 ]] ; then + # deploy to given target + target=${1/--target=/} + else + # delete trailing space and 'device' after device ID + target=${device_list[0]/[^a-zA-Z0-9._]device/} + fi + echo "Installing ${apk_list[0]} onto device $target..." + adb -s $target install -r ${apk_list[0]}; + echo "Launching application..." + local launch_str=$(java -jar "$PROJECT_PATH"/cordova/appinfo.jar "$PROJECT_PATH"/AndroidManifest.xml) + adb -s $target shell am start -W -a android.intent.action.MAIN -n $launch_str + else + echo "Application package not found, could not install to device" + echo " make sure your application is built before deploying." + exit 2 + fi + else + echo "No devices found to deploy to. Please make sure your device is connected" + echo " and you can view it using the 'cordova/lib/list-devices' command." + exit 2 + fi +} + +function install_emulator { + IFS=$'\n' + # check that there is an emulator to deploy to + emulator_string=`adb devices | awk '/List of devices attached/ { while(getline > 0) { print }}' | grep 'emulator'` + emulator_list=($emulator_string) + if [[ ${#emulator_list[@]} > 0 ]] ; then + apks=`find $PROJECT_PATH/bin -type f -maxdepth 1 | egrep '\.apk$'` + apk_list=($apks) + if [[ ${#apk_list[@]} > 0 ]] ; then + local target + # handle target emulator + if [[ "$#" -eq 1 ]] ; then + # deploy to given target + target=${1/--target=/} + else + # delete trailing space and 'device' after emulator ID + target=${emulator_list[0]/[^a-zA-Z0-9._]device/} + fi + echo "Installing ${apk_list[0]} onto $target..." + adb -s $target install -r ${apk_list[0]}; + echo "Launching application..." + local launch_str=$(java -jar "$PROJECT_PATH"/cordova/appinfo.jar "$PROJECT_PATH"/AndroidManifest.xml) + adb -s $target shell am start -W -a android.intent.action.MAIN -n $launch_str + + else + echo "Application package not found, could not install to device" + echo " make sure your application is built before deploying." + exit 2 + fi + else + echo "No emulators found to deploy to. Please make sure your emulator is started" + echo " and you can view it using the 'cordova/lib/list-started-emulators' command." + exit 2 + fi +} + +# cleans the project +function clean { + echo "Cleaning project..." + ant clean +} + +# has to be used independently and not in conjunction with other commands +function log { + # filter out nativeGetEnabledTags spam from latest sdk bug. + adb logcat | grep -v nativeGetEnabledTags +} + + +function build { + if [[ "$#" -eq 1 ]] ; then + if [[ $1 == "--debug" ]] ; then + clean + ant debug -f "$PROJECT_PATH"/build.xml + elif [[ $1 == "--release" ]] ; then + clean + ant release -f "$PROJECT_PATH"/build.xml + elif [[ $1 == "--nobuild" ]] ; then + echo "Skipping build..." + else + echo "Error : Build command '$1' not recognized." + exit 2 + fi + else + echo "Warning : [ --debug | --release | --nobuild ] not specified, defaulting to --debug" + clean + ant debug -f "$PROJECT_PATH"/build.xml + fi +} + + +function wait_for_emulator { + emulator_string=`adb devices | awk '/List of devices attached/ { while(getline > 0) { print }}' | grep 'device' | grep 'emulator'` + old_started=($emulator_string) + local new_started + local new_emulator_name + local i="0" + echo -n "Waiting for emulator..." + while [ $i -lt 300 ] + do + emulator_string=`adb devices | awk '/List of devices attached/ { while(getline > 0) { print }}' | grep 'device' | grep 'emulator'` + new_started=($emulator_string) + if [[ ${#new_started[@]} > ${#old_started[@]} && -z "$new_emulator_name" ]] ; then + # get the name of the started emulator + local count="0" + if [[ ${#old_started[@]} == 0 ]] ; then + new_emulator_name=${new_started[$count]/[^a-zA-Z0-9._]device/} + else + for count in {0...${#old_started[@]}} + do + if [[ ! ${new_started[$count]} == ${old_started[$count]} ]] ; then + new_emulator_name=${new_started[$count]/[^a-zA-Z0-9._]device/} + fi + done + if [[ -z "$new_emulator_name" ]] ; then + count=$[count+1] + new_emulator_name=${new_started[$count]/[^a-zA-Z0-9._]device/} + fi + fi + elif [[ "$new_emulator_name" ]] ; then + boot_anim=`adb -s $new_emulator_name shell getprop init.svc.bootanim` + if [[ $boot_anim =~ "stopped" ]] ; then + break + else + sleep 1 + i=$[i+1] + echo -n "." + fi + else + sleep 1 + i=$[i+1] + echo -n "." + fi + done + # Device timeout: emulator has not started in time + if [ $i -eq 300 ] + then + echo "emulator timeout!" + exit 69 + else + echo "connected!" + fi +} + +function run { + IFS=$'\n' + if [[ "$#" -eq 2 ]] ; then + build $2 + if [[ $1 == "--device" ]] ; then + install_device + elif [[ $1 == "--emulator" ]] ; then + install_emulator + elif [[ $1 =~ "--target=" ]]; then + install_device $1 + else + echo "Error : '$1' is not recognized as an install option" + fi + elif [[ "$#" -eq 1 ]] ; then + if [[ $1 == "--debug" || $1 == "--release" || $1 == "--nobuild" ]] ; then + build $1 + elif [[ $1 == "--device" ]] ; then + install_device + elif [[ $1 == "--emulator" ]] ; then + install_emulator + elif [[ $1 =~ "--target=" ]]; then + install_device $1 + else + echo "Error : '$1' is not recognized as an install option" + fi + else + echo "Warning : [ --device | --emulate | --target= ] not specified, using defaults." + build + devices=`adb devices | awk '/List of devices attached/ { while(getline > 0) { print }}' | grep 'device' | grep -v 'emulator'` + device_list=($devices) + emulator_string=`adb devices | awk '/List of devices attached/ { while(getline > 0) { print }}' | grep 'device' | grep 'emulator'` + emulator_list=($emulator_string) + if [[ ${#device_list[@]} > 0 ]] ; then + install_device + elif [[ ${#emulator_list[@]} > 0 ]] ; then + install_emulator + else + emulator_images=`android list avds | grep "Name:" | cut -f 2 -d ":"` + echo $emulator_images + emulator_image_list=($emulator_images) + if [[ ${#emulator_image_list[@]} > 0 ]] ; then + echo "Starting emulator : ${emulator_image_list[0]}" + emulator -avd ${emulator_image_list[0]/[^.\w]/} 1> /dev/null 2>&1 & + wait_for_emulator + install_emulator + else + # TODO : look for emulator images and start one if it's available + echo "Error : there are no available devices or emulators to deploy to." + echo " create an emulator or connect your device to run this command." + echo "If you would like to create an emulator follow the instructions" + echo " provided here : http://developer.android.com/tools/devices/index.html" + echo " Or run 'android create avd --name --target ' in on the command line." + exit 2 + fi + fi + fi +} + +# parse command line arguments + +if [[ $# > 3 ]] ; then + echo "Error : too many arguments." + exit 2 +elif [[ $# == 3 ]] ; then + if [[ $1 == "run" ]] ; then + run $2 $3 + else + echo "Error : too many arguments for '$1'" + exit 2 + fi +elif [[ $# == 2 ]] ; then + if [[ $1 == "run" ]] ; then + if [[ $2 == "--emulator" || $2 == "--device" || $2 =~ "--target=" ]] ; then + run $2 '' + elif [[ $2 == "--debug" || $2 == "--release" || $2 == "--nobuild" ]] ; then + run '' $2 + else + echo "Error : '$2' is not recognized as a run option." + exit 2 + fi + elif [[ $1 == "build" ]] ; then + build $2 + elif [[ $1 == "start-emulator" ]] ; then + start_emulator $2 + elif [[ $1 == "install-device" ]] ; then + if [[ $2 =~ "--target=" ]] ; then + install_device $2 + else + echo "Error : '$2' is not recognized as an install option" + exit 2 + fi + elif [[ $1 == "install-emulator" ]] ; then + if [[ $2 =~ "--target=" ]] ; then + install_emulator $2 + else + echo "Error : '$2' is not recognized as an install option" + exit 2 + fi + else + echo "Error : '$1' is not recognized as an option that takes arguments" + exit 2 + fi +elif [[ $# == 1 ]] ; then + if [[ $1 == "run" ]] ; then + run + elif [[ $1 == "build" ]]; then + build + elif [[ $1 == "clean" ]]; then + clean + elif [[ $1 == "log" ]]; then + log + elif [[ $1 == "list-devices" ]]; then + list_devices + elif [[ $1 == "list-emulator-images" ]]; then + list_emulator_images + elif [[ $1 == "list-started-emulators" ]]; then + list_started_emulators + elif [[ $1 == "install-device" ]]; then + install_device + elif [[ $1 == "install-emulator" ]]; then + install_emulator + elif [[ $1 == "start-emulator" ]]; then + start_emulator + else + echo "Error : '$1' is not recognized as a tooling command." + exit 2 + fi +else + echo "Error : No command received, exiting..." + exit 2 +fi \ No newline at end of file diff --git a/cordova-lib/spec-plugman-install/projects/android_one/cordova/lib/install-device b/cordova-lib/spec-plugman-install/projects/android_one/cordova/lib/install-device new file mode 100755 index 000000000..604b5ae0c --- /dev/null +++ b/cordova-lib/spec-plugman-install/projects/android_one/cordova/lib/install-device @@ -0,0 +1,23 @@ +#!/bin/bash +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +set -e + +CORDOVA_LIB_PATH=$( cd "$( dirname "$0" )" && pwd ) + +bash "$CORDOVA_LIB_PATH"/cordova install-device "$@" \ No newline at end of file diff --git a/cordova-lib/spec-plugman-install/projects/android_one/cordova/lib/install-emulator b/cordova-lib/spec-plugman-install/projects/android_one/cordova/lib/install-emulator new file mode 100755 index 000000000..105e2ee30 --- /dev/null +++ b/cordova-lib/spec-plugman-install/projects/android_one/cordova/lib/install-emulator @@ -0,0 +1,23 @@ +#!/bin/bash +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +set -e + +CORDOVA_LIB_PATH=$( cd "$( dirname "$0" )" && pwd ) + +bash "$CORDOVA_LIB_PATH"/cordova install-emulator "$@" \ No newline at end of file diff --git a/cordova-lib/spec-plugman-install/projects/android_one/cordova/lib/list-devices b/cordova-lib/spec-plugman-install/projects/android_one/cordova/lib/list-devices new file mode 100755 index 000000000..7a5b2f5c4 --- /dev/null +++ b/cordova-lib/spec-plugman-install/projects/android_one/cordova/lib/list-devices @@ -0,0 +1,23 @@ +#!/bin/bash +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +set -e + +CORDOVA_LIB_PATH=$( cd "$( dirname "$0" )" && pwd ) + +bash "$CORDOVA_LIB_PATH"/cordova list-devices \ No newline at end of file diff --git a/cordova-lib/spec-plugman-install/projects/android_one/cordova/lib/list-emulator-images b/cordova-lib/spec-plugman-install/projects/android_one/cordova/lib/list-emulator-images new file mode 100755 index 000000000..db8e5630d --- /dev/null +++ b/cordova-lib/spec-plugman-install/projects/android_one/cordova/lib/list-emulator-images @@ -0,0 +1,23 @@ +#!/bin/bash +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +set -e + +CORDOVA_LIB_PATH=$( cd "$( dirname "$0" )" && pwd ) + +bash "$CORDOVA_LIB_PATH"/cordova list-emulator-images \ No newline at end of file diff --git a/cordova-lib/spec-plugman-install/projects/android_one/cordova/lib/list-started-emulators b/cordova-lib/spec-plugman-install/projects/android_one/cordova/lib/list-started-emulators new file mode 100755 index 000000000..79117638c --- /dev/null +++ b/cordova-lib/spec-plugman-install/projects/android_one/cordova/lib/list-started-emulators @@ -0,0 +1,23 @@ +#!/bin/bash +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +set -e + +CORDOVA_LIB_PATH=$( cd "$( dirname "$0" )" && pwd ) + +bash "$CORDOVA_LIB_PATH"/cordova list-started-emulators \ No newline at end of file diff --git a/cordova-lib/spec-plugman-install/projects/android_one/cordova/lib/start-emulator b/cordova-lib/spec-plugman-install/projects/android_one/cordova/lib/start-emulator new file mode 100755 index 000000000..8e8964da6 --- /dev/null +++ b/cordova-lib/spec-plugman-install/projects/android_one/cordova/lib/start-emulator @@ -0,0 +1,23 @@ +#!/bin/bash +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +set -e + +CORDOVA_LIB_PATH=$( cd "$( dirname "$0" )" && pwd ) + +bash "$CORDOVA_LIB_PATH"/cordova start-emulator "$@" \ No newline at end of file diff --git a/cordova-lib/spec-plugman-install/projects/android_one/cordova/log b/cordova-lib/spec-plugman-install/projects/android_one/cordova/log new file mode 100755 index 000000000..01fe10759 --- /dev/null +++ b/cordova-lib/spec-plugman-install/projects/android_one/cordova/log @@ -0,0 +1,23 @@ +#!/bin/bash +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +set -e + +CORDOVA_PATH=$( cd "$( dirname "$0" )/.." && pwd ) + +bash "$CORDOVA_PATH"/cordova/lib/cordova log "$@" diff --git a/cordova-lib/spec-plugman-install/projects/android_one/cordova/run b/cordova-lib/spec-plugman-install/projects/android_one/cordova/run new file mode 100755 index 000000000..ec352b0ee --- /dev/null +++ b/cordova-lib/spec-plugman-install/projects/android_one/cordova/run @@ -0,0 +1,23 @@ +#!/bin/bash +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +set -e + +CORDOVA_PATH=$( cd "$( dirname "$0" )" && pwd ) + +bash "$CORDOVA_PATH"/lib/cordova run "$@" diff --git a/cordova-lib/spec-plugman-install/projects/android_one/cordova/version b/cordova-lib/spec-plugman-install/projects/android_one/cordova/version new file mode 100755 index 000000000..5760e95a0 --- /dev/null +++ b/cordova-lib/spec-plugman-install/projects/android_one/cordova/version @@ -0,0 +1,32 @@ +#!/bin/bash +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +set -e + +CORDOVA_PATH=$( cd "$( dirname "$0" )" && pwd -P) +PROJECT_PATH="$(dirname "$CORDOVA_PATH")" + +VERSION_FILE_PATH="$PROJECT_PATH/assets/www/cordova.js" + +if [ -f "$VERSION_FILE_PATH" ]; then + JSVersion=$(sed -n '2,2p' $VERSION_FILE_PATH) + echo $JSVersion | sed -e 's/\/\/ //'| cut -f 1 -d '-' +else + echo "The file \"$VERSION_FILE_PATH\" does not exist." + exit 1 +fi diff --git a/cordova-lib/spec-plugman-install/projects/android_one/res/xml/plugins.xml b/cordova-lib/spec-plugman-install/projects/android_one/res/xml/plugins.xml new file mode 100644 index 000000000..9cee85e44 --- /dev/null +++ b/cordova-lib/spec-plugman-install/projects/android_one/res/xml/plugins.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/cordova-lib/spec-plugman-install/projects/android_one/src/.gitkeep b/cordova-lib/spec-plugman-install/projects/android_one/src/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/cordova-lib/spec-plugman-install/projects/android_two/AndroidManifest.xml b/cordova-lib/spec-plugman-install/projects/android_two/AndroidManifest.xml new file mode 100644 index 000000000..0c528031c --- /dev/null +++ b/cordova-lib/spec-plugman-install/projects/android_two/AndroidManifest.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cordova-lib/spec-plugman-install/projects/android_two/assets/www/.gitkeep b/cordova-lib/spec-plugman-install/projects/android_two/assets/www/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/cordova-lib/spec-plugman-install/projects/android_two/res/xml/config.xml b/cordova-lib/spec-plugman-install/projects/android_two/res/xml/config.xml new file mode 100644 index 000000000..d37aba5cd --- /dev/null +++ b/cordova-lib/spec-plugman-install/projects/android_two/res/xml/config.xml @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cordova-lib/spec-plugman-install/projects/android_two/src/.gitkeep b/cordova-lib/spec-plugman-install/projects/android_two/src/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/cordova-lib/spec-plugman-install/projects/android_two_no_perms/AndroidManifest.xml b/cordova-lib/spec-plugman-install/projects/android_two_no_perms/AndroidManifest.xml new file mode 100644 index 000000000..6e4b480ea --- /dev/null +++ b/cordova-lib/spec-plugman-install/projects/android_two_no_perms/AndroidManifest.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/cordova-lib/spec-plugman-install/projects/android_two_no_perms/assets/www/.gitkeep b/cordova-lib/spec-plugman-install/projects/android_two_no_perms/assets/www/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/cordova-lib/spec-plugman-install/projects/android_two_no_perms/res/xml/config.xml b/cordova-lib/spec-plugman-install/projects/android_two_no_perms/res/xml/config.xml new file mode 100644 index 000000000..d37aba5cd --- /dev/null +++ b/cordova-lib/spec-plugman-install/projects/android_two_no_perms/res/xml/config.xml @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cordova-lib/spec-plugman-install/projects/android_two_no_perms/src/.gitkeep b/cordova-lib/spec-plugman-install/projects/android_two_no_perms/src/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/cordova-lib/spec-plugman-install/projects/android_uninstall/AndroidManifest.xml b/cordova-lib/spec-plugman-install/projects/android_uninstall/AndroidManifest.xml new file mode 100644 index 000000000..b5fea9d1b --- /dev/null +++ b/cordova-lib/spec-plugman-install/projects/android_uninstall/AndroidManifest.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/cordova-lib/spec-plugman-install/projects/android_uninstall/cordova/version b/cordova-lib/spec-plugman-install/projects/android_uninstall/cordova/version new file mode 100644 index 000000000..01f68fd29 --- /dev/null +++ b/cordova-lib/spec-plugman-install/projects/android_uninstall/cordova/version @@ -0,0 +1 @@ +echo 9.0.0 \ No newline at end of file diff --git a/cordova-lib/spec-plugman-install/projects/android_uninstall/cordova/version.bat b/cordova-lib/spec-plugman-install/projects/android_uninstall/cordova/version.bat new file mode 100644 index 000000000..c637d7ca5 --- /dev/null +++ b/cordova-lib/spec-plugman-install/projects/android_uninstall/cordova/version.bat @@ -0,0 +1,2 @@ +@ECHO OFF +echo 9.0.0 \ No newline at end of file diff --git a/cordova-lib/spec-plugman-install/projects/blackberry10/native/device/chrome/.gitkeep b/cordova-lib/spec-plugman-install/projects/blackberry10/native/device/chrome/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/cordova-lib/spec-plugman-install/projects/blackberry10/native/device/plugins/jnext/auth.txt b/cordova-lib/spec-plugman-install/projects/blackberry10/native/device/plugins/jnext/auth.txt new file mode 100644 index 000000000..0983f4fcf --- /dev/null +++ b/cordova-lib/spec-plugman-install/projects/blackberry10/native/device/plugins/jnext/auth.txt @@ -0,0 +1,3 @@ +local:/// * +file:// * +http:// * \ No newline at end of file diff --git a/cordova-lib/spec-plugman-install/projects/blackberry10/native/simulator/chrome/.gitkeep b/cordova-lib/spec-plugman-install/projects/blackberry10/native/simulator/chrome/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/cordova-lib/spec-plugman-install/projects/blackberry10/native/simulator/plugins/jnext/auth.txt b/cordova-lib/spec-plugman-install/projects/blackberry10/native/simulator/plugins/jnext/auth.txt new file mode 100644 index 000000000..0983f4fcf --- /dev/null +++ b/cordova-lib/spec-plugman-install/projects/blackberry10/native/simulator/plugins/jnext/auth.txt @@ -0,0 +1,3 @@ +local:/// * +file:// * +http:// * \ No newline at end of file diff --git a/cordova-lib/spec-plugman-install/projects/blackberry10/www/config.xml b/cordova-lib/spec-plugman-install/projects/blackberry10/www/config.xml new file mode 100644 index 000000000..1dc8fe885 --- /dev/null +++ b/cordova-lib/spec-plugman-install/projects/blackberry10/www/config.xml @@ -0,0 +1,97 @@ + + + + + + + cordovaExample + + Your Name Here + + + A sample Apache Cordova application that responds to the deviceready event. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + use_camera + read_device_identifying_information + access_shared + read_geolocation + record_audio + access_pimdomain_contacts + + + diff --git a/cordova-lib/spec-plugman-install/projects/ios-config-xml/CordovaLib/CordovaLib.xcodeproj/project.pbxproj b/cordova-lib/spec-plugman-install/projects/ios-config-xml/CordovaLib/CordovaLib.xcodeproj/project.pbxproj new file mode 100644 index 000000000..5d0d46199 --- /dev/null +++ b/cordova-lib/spec-plugman-install/projects/ios-config-xml/CordovaLib/CordovaLib.xcodeproj/project.pbxproj @@ -0,0 +1,636 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 1F2BECC013F9785B00A93BF6 /* CDVBattery.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F2BECBE13F9785B00A93BF6 /* CDVBattery.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1F2BECC113F9785B00A93BF6 /* CDVBattery.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F2BECBF13F9785B00A93BF6 /* CDVBattery.m */; }; + 1F3C04CE12BC247D004F9E10 /* CDVContact.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F3C04CC12BC247D004F9E10 /* CDVContact.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1F3C04CF12BC247D004F9E10 /* CDVContact.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F3C04CD12BC247D004F9E10 /* CDVContact.m */; }; + 1F584B9B1385A28A00ED25E8 /* CDVCapture.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F584B991385A28900ED25E8 /* CDVCapture.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1F584B9C1385A28A00ED25E8 /* CDVCapture.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F584B9A1385A28900ED25E8 /* CDVCapture.m */; }; + 1F92F4A01314023E0046367C /* CDVPluginResult.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F92F49E1314023E0046367C /* CDVPluginResult.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1F92F4A11314023E0046367C /* CDVPluginResult.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F92F49F1314023E0046367C /* CDVPluginResult.m */; }; + 301F2F2A14F3C9CA003FE9FC /* CDV.h in Headers */ = {isa = PBXBuildFile; fileRef = 301F2F2914F3C9CA003FE9FC /* CDV.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 302965BC13A94E9D007046C5 /* CDVDebug.h in Headers */ = {isa = PBXBuildFile; fileRef = 302965BB13A94E9D007046C5 /* CDVDebug.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 3034979C1513D56A0090E688 /* CDVLocalStorage.h in Headers */ = {isa = PBXBuildFile; fileRef = 3034979A1513D56A0090E688 /* CDVLocalStorage.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 3034979E1513D56A0090E688 /* CDVLocalStorage.m in Sources */ = {isa = PBXBuildFile; fileRef = 3034979B1513D56A0090E688 /* CDVLocalStorage.m */; }; + 30392E4E14F4FCAB00B9E0B8 /* CDVAvailability.h in Headers */ = {isa = PBXBuildFile; fileRef = 30392E4D14F4FCAB00B9E0B8 /* CDVAvailability.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 3062D120151D0EDB000D9128 /* UIDevice+Extensions.h in Headers */ = {isa = PBXBuildFile; fileRef = 3062D11E151D0EDB000D9128 /* UIDevice+Extensions.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 3062D122151D0EDB000D9128 /* UIDevice+Extensions.m in Sources */ = {isa = PBXBuildFile; fileRef = 3062D11F151D0EDB000D9128 /* UIDevice+Extensions.m */; }; + 307A8F9E1385A2EC00E43782 /* CDVConnection.h in Headers */ = {isa = PBXBuildFile; fileRef = 307A8F9C1385A2EC00E43782 /* CDVConnection.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 307A8F9F1385A2EC00E43782 /* CDVConnection.m in Sources */ = {isa = PBXBuildFile; fileRef = 307A8F9D1385A2EC00E43782 /* CDVConnection.m */; }; + 30A90B9114588697006178D3 /* JSONKit.h in Headers */ = {isa = PBXBuildFile; fileRef = 30A90B8F14588697006178D3 /* JSONKit.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 30A90B9314588697006178D3 /* JSONKit.m in Sources */ = {isa = PBXBuildFile; fileRef = 30A90B9014588697006178D3 /* JSONKit.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; + 30B39EBE13D0268B0009682A /* CDVSplashScreen.h in Headers */ = {isa = PBXBuildFile; fileRef = 30B39EBC13D0268B0009682A /* CDVSplashScreen.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 30B39EBF13D0268B0009682A /* CDVSplashScreen.m in Sources */ = {isa = PBXBuildFile; fileRef = 30B39EBD13D0268B0009682A /* CDVSplashScreen.m */; }; + 30C5F1DF15AF9E950052A00D /* CDVDevice.h in Headers */ = {isa = PBXBuildFile; fileRef = 30C5F1DD15AF9E950052A00D /* CDVDevice.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 30C5F1E015AF9E950052A00D /* CDVDevice.m in Sources */ = {isa = PBXBuildFile; fileRef = 30C5F1DE15AF9E950052A00D /* CDVDevice.m */; }; + 30C684801406CB38004C1A8E /* CDVWhitelist.h in Headers */ = {isa = PBXBuildFile; fileRef = 30C6847E1406CB38004C1A8E /* CDVWhitelist.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 30C684821406CB38004C1A8E /* CDVWhitelist.m in Sources */ = {isa = PBXBuildFile; fileRef = 30C6847F1406CB38004C1A8E /* CDVWhitelist.m */; }; + 30C684941407044B004C1A8E /* CDVURLProtocol.h in Headers */ = {isa = PBXBuildFile; fileRef = 30C684921407044A004C1A8E /* CDVURLProtocol.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 30C684961407044B004C1A8E /* CDVURLProtocol.m in Sources */ = {isa = PBXBuildFile; fileRef = 30C684931407044A004C1A8E /* CDVURLProtocol.m */; }; + 30E33AF213A7E24B00594D64 /* CDVPlugin.h in Headers */ = {isa = PBXBuildFile; fileRef = 30E33AF013A7E24B00594D64 /* CDVPlugin.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 30E33AF313A7E24B00594D64 /* CDVPlugin.m in Sources */ = {isa = PBXBuildFile; fileRef = 30E33AF113A7E24B00594D64 /* CDVPlugin.m */; }; + 30E563CF13E217EC00C949AA /* NSMutableArray+QueueAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = 30E563CD13E217EC00C949AA /* NSMutableArray+QueueAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 30E563D013E217EC00C949AA /* NSMutableArray+QueueAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 30E563CE13E217EC00C949AA /* NSMutableArray+QueueAdditions.m */; }; + 30F5EBAB14CA26E700987760 /* CDVCommandDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = 30F5EBA914CA26E700987760 /* CDVCommandDelegate.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 3E76876D156A90EE00EB6FA3 /* CDVLogger.m in Sources */ = {isa = PBXBuildFile; fileRef = 3E76876B156A90EE00EB6FA3 /* CDVLogger.m */; }; + 3E76876F156A90EE00EB6FA3 /* CDVLogger.h in Headers */ = {isa = PBXBuildFile; fileRef = 3E76876C156A90EE00EB6FA3 /* CDVLogger.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 8852C43A14B65FD800F0E735 /* CDVViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 8852C43614B65FD800F0E735 /* CDVViewController.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 8852C43C14B65FD800F0E735 /* CDVViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 8852C43714B65FD800F0E735 /* CDVViewController.m */; }; + 8852C43F14B65FD800F0E735 /* CDVCordovaView.h in Headers */ = {isa = PBXBuildFile; fileRef = 8852C43814B65FD800F0E735 /* CDVCordovaView.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 8852C44114B65FD800F0E735 /* CDVCordovaView.m in Sources */ = {isa = PBXBuildFile; fileRef = 8852C43914B65FD800F0E735 /* CDVCordovaView.m */; }; + 8887FD661090FBE7009987E8 /* CDVCamera.h in Headers */ = {isa = PBXBuildFile; fileRef = 8887FD261090FBE7009987E8 /* CDVCamera.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 8887FD671090FBE7009987E8 /* CDVCamera.m in Sources */ = {isa = PBXBuildFile; fileRef = 8887FD271090FBE7009987E8 /* CDVCamera.m */; }; + 8887FD681090FBE7009987E8 /* NSDictionary+Extensions.h in Headers */ = {isa = PBXBuildFile; fileRef = 8887FD281090FBE7009987E8 /* NSDictionary+Extensions.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 8887FD691090FBE7009987E8 /* NSDictionary+Extensions.m in Sources */ = {isa = PBXBuildFile; fileRef = 8887FD291090FBE7009987E8 /* NSDictionary+Extensions.m */; }; + 8887FD6A1090FBE7009987E8 /* CDVContacts.h in Headers */ = {isa = PBXBuildFile; fileRef = 8887FD2A1090FBE7009987E8 /* CDVContacts.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 8887FD6B1090FBE7009987E8 /* CDVContacts.m in Sources */ = {isa = PBXBuildFile; fileRef = 8887FD2B1090FBE7009987E8 /* CDVContacts.m */; }; + 8887FD6C1090FBE7009987E8 /* CDVDebugConsole.h in Headers */ = {isa = PBXBuildFile; fileRef = 8887FD2C1090FBE7009987E8 /* CDVDebugConsole.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 8887FD6D1090FBE7009987E8 /* CDVDebugConsole.m in Sources */ = {isa = PBXBuildFile; fileRef = 8887FD2D1090FBE7009987E8 /* CDVDebugConsole.m */; }; + 8887FD701090FBE7009987E8 /* CDVFile.h in Headers */ = {isa = PBXBuildFile; fileRef = 8887FD301090FBE7009987E8 /* CDVFile.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 8887FD711090FBE7009987E8 /* CDVFile.m in Sources */ = {isa = PBXBuildFile; fileRef = 8887FD311090FBE7009987E8 /* CDVFile.m */; }; + 8887FD741090FBE7009987E8 /* CDVInvokedUrlCommand.h in Headers */ = {isa = PBXBuildFile; fileRef = 8887FD341090FBE7009987E8 /* CDVInvokedUrlCommand.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 8887FD751090FBE7009987E8 /* CDVInvokedUrlCommand.m in Sources */ = {isa = PBXBuildFile; fileRef = 8887FD351090FBE7009987E8 /* CDVInvokedUrlCommand.m */; }; + 8887FD851090FBE7009987E8 /* CDVLocation.h in Headers */ = {isa = PBXBuildFile; fileRef = 8887FD461090FBE7009987E8 /* CDVLocation.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 8887FD861090FBE7009987E8 /* CDVLocation.m in Sources */ = {isa = PBXBuildFile; fileRef = 8887FD471090FBE7009987E8 /* CDVLocation.m */; }; + 8887FD8D1090FBE7009987E8 /* CDVNotification.h in Headers */ = {isa = PBXBuildFile; fileRef = 8887FD4E1090FBE7009987E8 /* CDVNotification.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 8887FD8E1090FBE7009987E8 /* CDVNotification.m in Sources */ = {isa = PBXBuildFile; fileRef = 8887FD4F1090FBE7009987E8 /* CDVNotification.m */; }; + 8887FD8F1090FBE7009987E8 /* NSData+Base64.h in Headers */ = {isa = PBXBuildFile; fileRef = 8887FD501090FBE7009987E8 /* NSData+Base64.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 8887FD901090FBE7009987E8 /* NSData+Base64.m in Sources */ = {isa = PBXBuildFile; fileRef = 8887FD511090FBE7009987E8 /* NSData+Base64.m */; }; + 8887FD9D1090FBE7009987E8 /* CDVReachability.h in Headers */ = {isa = PBXBuildFile; fileRef = 8887FD5E1090FBE7009987E8 /* CDVReachability.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 8887FD9E1090FBE7009987E8 /* CDVReachability.m in Sources */ = {isa = PBXBuildFile; fileRef = 8887FD5F1090FBE7009987E8 /* CDVReachability.m */; }; + 8887FD9F1090FBE7009987E8 /* CDVSound.h in Headers */ = {isa = PBXBuildFile; fileRef = 8887FD601090FBE7009987E8 /* CDVSound.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 8887FDA01090FBE7009987E8 /* CDVSound.m in Sources */ = {isa = PBXBuildFile; fileRef = 8887FD611090FBE7009987E8 /* CDVSound.m */; }; + 88BA573D109BB46F00FB5E78 /* CDVAccelerometer.h in Headers */ = {isa = PBXBuildFile; fileRef = 88BA573B109BB46F00FB5E78 /* CDVAccelerometer.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 88BA573E109BB46F00FB5E78 /* CDVAccelerometer.m in Sources */ = {isa = PBXBuildFile; fileRef = 88BA573C109BB46F00FB5E78 /* CDVAccelerometer.m */; }; + 9D76CF3C1625A4C50008A0F6 /* CDVGlobalization.h in Headers */ = {isa = PBXBuildFile; fileRef = 9D76CF3A1625A4C50008A0F6 /* CDVGlobalization.h */; }; + 9D76CF3D1625A4C50008A0F6 /* CDVGlobalization.m in Sources */ = {isa = PBXBuildFile; fileRef = 9D76CF3B1625A4C50008A0F6 /* CDVGlobalization.m */; }; + C937A4561337599E002C4C79 /* CDVFileTransfer.h in Headers */ = {isa = PBXBuildFile; fileRef = C937A4541337599E002C4C79 /* CDVFileTransfer.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C937A4571337599E002C4C79 /* CDVFileTransfer.m in Sources */ = {isa = PBXBuildFile; fileRef = C937A4551337599E002C4C79 /* CDVFileTransfer.m */; }; + EB3B3547161CB44D003DBE7D /* CDVCommandQueue.h in Headers */ = {isa = PBXBuildFile; fileRef = EB3B3545161CB44D003DBE7D /* CDVCommandQueue.h */; }; + EB3B3548161CB44D003DBE7D /* CDVCommandQueue.m in Sources */ = {isa = PBXBuildFile; fileRef = EB3B3546161CB44D003DBE7D /* CDVCommandQueue.m */; }; + EB3B357C161F2A45003DBE7D /* CDVCommandDelegateImpl.h in Headers */ = {isa = PBXBuildFile; fileRef = EB3B357A161F2A44003DBE7D /* CDVCommandDelegateImpl.h */; }; + EB3B357D161F2A45003DBE7D /* CDVCommandDelegateImpl.m in Sources */ = {isa = PBXBuildFile; fileRef = EB3B357B161F2A45003DBE7D /* CDVCommandDelegateImpl.m */; }; + EB80C2AC15DEA63D004D9E7B /* CDVEcho.h in Headers */ = {isa = PBXBuildFile; fileRef = EB80C2AA15DEA63D004D9E7B /* CDVEcho.h */; }; + EB80C2AD15DEA63D004D9E7B /* CDVEcho.m in Sources */ = {isa = PBXBuildFile; fileRef = EB80C2AB15DEA63D004D9E7B /* CDVEcho.m */; }; + EBA3557315ABD38C00F4DE24 /* NSArray+Comparisons.h in Headers */ = {isa = PBXBuildFile; fileRef = EBA3557115ABD38C00F4DE24 /* NSArray+Comparisons.h */; settings = {ATTRIBUTES = (Public, ); }; }; + EBA3557515ABD38C00F4DE24 /* NSArray+Comparisons.m in Sources */ = {isa = PBXBuildFile; fileRef = EBA3557215ABD38C00F4DE24 /* NSArray+Comparisons.m */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 1F2BECBE13F9785B00A93BF6 /* CDVBattery.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDVBattery.h; path = Classes/CDVBattery.h; sourceTree = ""; }; + 1F2BECBF13F9785B00A93BF6 /* CDVBattery.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CDVBattery.m; path = Classes/CDVBattery.m; sourceTree = ""; }; + 1F3C04CC12BC247D004F9E10 /* CDVContact.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDVContact.h; path = Classes/CDVContact.h; sourceTree = ""; }; + 1F3C04CD12BC247D004F9E10 /* CDVContact.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CDVContact.m; path = Classes/CDVContact.m; sourceTree = ""; }; + 1F584B991385A28900ED25E8 /* CDVCapture.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDVCapture.h; path = Classes/CDVCapture.h; sourceTree = ""; }; + 1F584B9A1385A28900ED25E8 /* CDVCapture.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CDVCapture.m; path = Classes/CDVCapture.m; sourceTree = ""; }; + 1F92F49E1314023E0046367C /* CDVPluginResult.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDVPluginResult.h; path = Classes/CDVPluginResult.h; sourceTree = ""; }; + 1F92F49F1314023E0046367C /* CDVPluginResult.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CDVPluginResult.m; path = Classes/CDVPluginResult.m; sourceTree = ""; }; + 301F2F2914F3C9CA003FE9FC /* CDV.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDV.h; path = Classes/CDV.h; sourceTree = ""; }; + 302965BB13A94E9D007046C5 /* CDVDebug.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDVDebug.h; path = Classes/CDVDebug.h; sourceTree = ""; }; + 30325A0B136B343700982B63 /* VERSION */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = VERSION; sourceTree = ""; }; + 3034979A1513D56A0090E688 /* CDVLocalStorage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDVLocalStorage.h; path = Classes/CDVLocalStorage.h; sourceTree = ""; }; + 3034979B1513D56A0090E688 /* CDVLocalStorage.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CDVLocalStorage.m; path = Classes/CDVLocalStorage.m; sourceTree = ""; }; + 30392E4D14F4FCAB00B9E0B8 /* CDVAvailability.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDVAvailability.h; path = Classes/CDVAvailability.h; sourceTree = ""; }; + 3062D11E151D0EDB000D9128 /* UIDevice+Extensions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "UIDevice+Extensions.h"; path = "Classes/UIDevice+Extensions.h"; sourceTree = ""; }; + 3062D11F151D0EDB000D9128 /* UIDevice+Extensions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "UIDevice+Extensions.m"; path = "Classes/UIDevice+Extensions.m"; sourceTree = ""; }; + 307A8F9C1385A2EC00E43782 /* CDVConnection.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDVConnection.h; path = Classes/CDVConnection.h; sourceTree = ""; }; + 307A8F9D1385A2EC00E43782 /* CDVConnection.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CDVConnection.m; path = Classes/CDVConnection.m; sourceTree = ""; }; + 30A90B8F14588697006178D3 /* JSONKit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSONKit.h; sourceTree = ""; }; + 30A90B9014588697006178D3 /* JSONKit.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSONKit.m; sourceTree = ""; }; + 30B39EBC13D0268B0009682A /* CDVSplashScreen.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDVSplashScreen.h; path = Classes/CDVSplashScreen.h; sourceTree = ""; }; + 30B39EBD13D0268B0009682A /* CDVSplashScreen.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CDVSplashScreen.m; path = Classes/CDVSplashScreen.m; sourceTree = ""; }; + 30C5F1DD15AF9E950052A00D /* CDVDevice.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDVDevice.h; path = Classes/CDVDevice.h; sourceTree = ""; }; + 30C5F1DE15AF9E950052A00D /* CDVDevice.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CDVDevice.m; path = Classes/CDVDevice.m; sourceTree = ""; }; + 30C6847E1406CB38004C1A8E /* CDVWhitelist.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDVWhitelist.h; path = Classes/CDVWhitelist.h; sourceTree = ""; }; + 30C6847F1406CB38004C1A8E /* CDVWhitelist.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CDVWhitelist.m; path = Classes/CDVWhitelist.m; sourceTree = ""; }; + 30C684921407044A004C1A8E /* CDVURLProtocol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDVURLProtocol.h; path = Classes/CDVURLProtocol.h; sourceTree = ""; }; + 30C684931407044A004C1A8E /* CDVURLProtocol.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CDVURLProtocol.m; path = Classes/CDVURLProtocol.m; sourceTree = ""; }; + 30E33AF013A7E24B00594D64 /* CDVPlugin.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDVPlugin.h; path = Classes/CDVPlugin.h; sourceTree = ""; }; + 30E33AF113A7E24B00594D64 /* CDVPlugin.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CDVPlugin.m; path = Classes/CDVPlugin.m; sourceTree = ""; }; + 30E563CD13E217EC00C949AA /* NSMutableArray+QueueAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "NSMutableArray+QueueAdditions.h"; path = "Classes/NSMutableArray+QueueAdditions.h"; sourceTree = ""; }; + 30E563CE13E217EC00C949AA /* NSMutableArray+QueueAdditions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "NSMutableArray+QueueAdditions.m"; path = "Classes/NSMutableArray+QueueAdditions.m"; sourceTree = ""; }; + 30F5EBA914CA26E700987760 /* CDVCommandDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDVCommandDelegate.h; path = Classes/CDVCommandDelegate.h; sourceTree = ""; }; + 3E76876B156A90EE00EB6FA3 /* CDVLogger.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CDVLogger.m; path = Classes/CDVLogger.m; sourceTree = ""; }; + 3E76876C156A90EE00EB6FA3 /* CDVLogger.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDVLogger.h; path = Classes/CDVLogger.h; sourceTree = ""; }; + 686357AA141002F100DF4CF2 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; + 686357AC141002F100DF4CF2 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; + 686357AE141002F100DF4CF2 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; + 686357CC14100AAD00DF4CF2 /* AddressBookUI.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AddressBookUI.framework; path = System/Library/Frameworks/AddressBookUI.framework; sourceTree = SDKROOT; }; + 686357CE14100ADA00DF4CF2 /* AudioToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = System/Library/Frameworks/AudioToolbox.framework; sourceTree = SDKROOT; }; + 686357CF14100ADB00DF4CF2 /* AVFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVFoundation.framework; path = System/Library/Frameworks/AVFoundation.framework; sourceTree = SDKROOT; }; + 686357D014100ADE00DF4CF2 /* CoreLocation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreLocation.framework; path = System/Library/Frameworks/CoreLocation.framework; sourceTree = SDKROOT; }; + 686357D214100AE700DF4CF2 /* MobileCoreServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MobileCoreServices.framework; path = System/Library/Frameworks/MobileCoreServices.framework; sourceTree = SDKROOT; }; + 686357D414100AF200DF4CF2 /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = System/Library/Frameworks/SystemConfiguration.framework; sourceTree = SDKROOT; }; + 686357DC14100B1600DF4CF2 /* CoreMedia.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMedia.framework; path = System/Library/Frameworks/CoreMedia.framework; sourceTree = SDKROOT; }; + 68A32D7114102E1C006B237C /* libCordova.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libCordova.a; sourceTree = BUILT_PRODUCTS_DIR; }; + 68A32D7414103017006B237C /* AddressBook.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AddressBook.framework; path = System/Library/Frameworks/AddressBook.framework; sourceTree = SDKROOT; }; + 8852C43614B65FD800F0E735 /* CDVViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDVViewController.h; path = Classes/CDVViewController.h; sourceTree = ""; }; + 8852C43714B65FD800F0E735 /* CDVViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CDVViewController.m; path = Classes/CDVViewController.m; sourceTree = ""; }; + 8852C43814B65FD800F0E735 /* CDVCordovaView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDVCordovaView.h; path = Classes/CDVCordovaView.h; sourceTree = ""; }; + 8852C43914B65FD800F0E735 /* CDVCordovaView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CDVCordovaView.m; path = Classes/CDVCordovaView.m; sourceTree = ""; }; + 8887FD261090FBE7009987E8 /* CDVCamera.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDVCamera.h; path = Classes/CDVCamera.h; sourceTree = ""; }; + 8887FD271090FBE7009987E8 /* CDVCamera.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CDVCamera.m; path = Classes/CDVCamera.m; sourceTree = ""; }; + 8887FD281090FBE7009987E8 /* NSDictionary+Extensions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "NSDictionary+Extensions.h"; path = "Classes/NSDictionary+Extensions.h"; sourceTree = ""; }; + 8887FD291090FBE7009987E8 /* NSDictionary+Extensions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "NSDictionary+Extensions.m"; path = "Classes/NSDictionary+Extensions.m"; sourceTree = ""; }; + 8887FD2A1090FBE7009987E8 /* CDVContacts.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDVContacts.h; path = Classes/CDVContacts.h; sourceTree = ""; }; + 8887FD2B1090FBE7009987E8 /* CDVContacts.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CDVContacts.m; path = Classes/CDVContacts.m; sourceTree = ""; }; + 8887FD2C1090FBE7009987E8 /* CDVDebugConsole.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDVDebugConsole.h; path = Classes/CDVDebugConsole.h; sourceTree = ""; }; + 8887FD2D1090FBE7009987E8 /* CDVDebugConsole.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CDVDebugConsole.m; path = Classes/CDVDebugConsole.m; sourceTree = ""; }; + 8887FD301090FBE7009987E8 /* CDVFile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDVFile.h; path = Classes/CDVFile.h; sourceTree = ""; }; + 8887FD311090FBE7009987E8 /* CDVFile.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CDVFile.m; path = Classes/CDVFile.m; sourceTree = ""; }; + 8887FD341090FBE7009987E8 /* CDVInvokedUrlCommand.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDVInvokedUrlCommand.h; path = Classes/CDVInvokedUrlCommand.h; sourceTree = ""; }; + 8887FD351090FBE7009987E8 /* CDVInvokedUrlCommand.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CDVInvokedUrlCommand.m; path = Classes/CDVInvokedUrlCommand.m; sourceTree = ""; }; + 8887FD461090FBE7009987E8 /* CDVLocation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDVLocation.h; path = Classes/CDVLocation.h; sourceTree = ""; }; + 8887FD471090FBE7009987E8 /* CDVLocation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CDVLocation.m; path = Classes/CDVLocation.m; sourceTree = ""; }; + 8887FD4E1090FBE7009987E8 /* CDVNotification.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDVNotification.h; path = Classes/CDVNotification.h; sourceTree = ""; }; + 8887FD4F1090FBE7009987E8 /* CDVNotification.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CDVNotification.m; path = Classes/CDVNotification.m; sourceTree = ""; }; + 8887FD501090FBE7009987E8 /* NSData+Base64.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "NSData+Base64.h"; path = "Classes/NSData+Base64.h"; sourceTree = ""; }; + 8887FD511090FBE7009987E8 /* NSData+Base64.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "NSData+Base64.m"; path = "Classes/NSData+Base64.m"; sourceTree = ""; }; + 8887FD5E1090FBE7009987E8 /* CDVReachability.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDVReachability.h; path = Classes/CDVReachability.h; sourceTree = ""; }; + 8887FD5F1090FBE7009987E8 /* CDVReachability.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CDVReachability.m; path = Classes/CDVReachability.m; sourceTree = ""; }; + 8887FD601090FBE7009987E8 /* CDVSound.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDVSound.h; path = Classes/CDVSound.h; sourceTree = ""; }; + 8887FD611090FBE7009987E8 /* CDVSound.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CDVSound.m; path = Classes/CDVSound.m; sourceTree = ""; }; + 88BA573B109BB46F00FB5E78 /* CDVAccelerometer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDVAccelerometer.h; path = Classes/CDVAccelerometer.h; sourceTree = ""; }; + 88BA573C109BB46F00FB5E78 /* CDVAccelerometer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CDVAccelerometer.m; path = Classes/CDVAccelerometer.m; sourceTree = ""; }; + 9D76CF3A1625A4C50008A0F6 /* CDVGlobalization.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDVGlobalization.h; path = Classes/CDVGlobalization.h; sourceTree = ""; }; + 9D76CF3B1625A4C50008A0F6 /* CDVGlobalization.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CDVGlobalization.m; path = Classes/CDVGlobalization.m; sourceTree = ""; }; + AA747D9E0F9514B9006C5449 /* CordovaLib_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CordovaLib_Prefix.pch; sourceTree = SOURCE_ROOT; }; + C937A4541337599E002C4C79 /* CDVFileTransfer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDVFileTransfer.h; path = Classes/CDVFileTransfer.h; sourceTree = ""; }; + C937A4551337599E002C4C79 /* CDVFileTransfer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CDVFileTransfer.m; path = Classes/CDVFileTransfer.m; sourceTree = ""; }; + EB3B3545161CB44D003DBE7D /* CDVCommandQueue.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDVCommandQueue.h; path = Classes/CDVCommandQueue.h; sourceTree = ""; }; + EB3B3546161CB44D003DBE7D /* CDVCommandQueue.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CDVCommandQueue.m; path = Classes/CDVCommandQueue.m; sourceTree = ""; }; + EB3B357A161F2A44003DBE7D /* CDVCommandDelegateImpl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDVCommandDelegateImpl.h; path = Classes/CDVCommandDelegateImpl.h; sourceTree = ""; }; + EB3B357B161F2A45003DBE7D /* CDVCommandDelegateImpl.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CDVCommandDelegateImpl.m; path = Classes/CDVCommandDelegateImpl.m; sourceTree = ""; }; + EB80C2AA15DEA63D004D9E7B /* CDVEcho.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDVEcho.h; path = Classes/CDVEcho.h; sourceTree = ""; }; + EB80C2AB15DEA63D004D9E7B /* CDVEcho.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CDVEcho.m; path = Classes/CDVEcho.m; sourceTree = ""; }; + EBA3557115ABD38C00F4DE24 /* NSArray+Comparisons.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "NSArray+Comparisons.h"; path = "Classes/NSArray+Comparisons.h"; sourceTree = ""; }; + EBA3557215ABD38C00F4DE24 /* NSArray+Comparisons.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "NSArray+Comparisons.m"; path = "Classes/NSArray+Comparisons.m"; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + D2AAC07C0554694100DB518D /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 034768DFFF38A50411DB9C8B /* Products */ = { + isa = PBXGroup; + children = ( + 68A32D7114102E1C006B237C /* libCordova.a */, + ); + name = Products; + sourceTree = CORDOVALIB; + }; + 0867D691FE84028FC02AAC07 /* CordovaLib */ = { + isa = PBXGroup; + children = ( + 8887FD101090FB43009987E8 /* Classes */, + 32C88DFF0371C24200C91783 /* Other Sources */, + 0867D69AFE84028FC02AAC07 /* Frameworks */, + 034768DFFF38A50411DB9C8B /* Products */, + 30325A0B136B343700982B63 /* VERSION */, + ); + name = CordovaLib; + sourceTree = ""; + }; + 0867D69AFE84028FC02AAC07 /* Frameworks */ = { + isa = PBXGroup; + children = ( + 68A32D7414103017006B237C /* AddressBook.framework */, + 686357DC14100B1600DF4CF2 /* CoreMedia.framework */, + 686357CE14100ADA00DF4CF2 /* AudioToolbox.framework */, + 686357CF14100ADB00DF4CF2 /* AVFoundation.framework */, + 686357D014100ADE00DF4CF2 /* CoreLocation.framework */, + 686357D214100AE700DF4CF2 /* MobileCoreServices.framework */, + 686357D414100AF200DF4CF2 /* SystemConfiguration.framework */, + 686357CC14100AAD00DF4CF2 /* AddressBookUI.framework */, + 686357AA141002F100DF4CF2 /* UIKit.framework */, + 686357AC141002F100DF4CF2 /* Foundation.framework */, + 686357AE141002F100DF4CF2 /* CoreGraphics.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; + 3054098714B77FF3009841CA /* Cleaver */ = { + isa = PBXGroup; + children = ( + 8852C43614B65FD800F0E735 /* CDVViewController.h */, + 8852C43714B65FD800F0E735 /* CDVViewController.m */, + 8852C43814B65FD800F0E735 /* CDVCordovaView.h */, + 8852C43914B65FD800F0E735 /* CDVCordovaView.m */, + EB3B3545161CB44D003DBE7D /* CDVCommandQueue.h */, + EB3B3546161CB44D003DBE7D /* CDVCommandQueue.m */, + ); + name = Cleaver; + sourceTree = ""; + }; + 32C88DFF0371C24200C91783 /* Other Sources */ = { + isa = PBXGroup; + children = ( + AA747D9E0F9514B9006C5449 /* CordovaLib_Prefix.pch */, + ); + name = "Other Sources"; + sourceTree = ""; + }; + 888700D710922F56009987E8 /* Commands */ = { + isa = PBXGroup; + children = ( + 30C5F1DD15AF9E950052A00D /* CDVDevice.h */, + 30C5F1DE15AF9E950052A00D /* CDVDevice.m */, + 301F2F2914F3C9CA003FE9FC /* CDV.h */, + 3034979A1513D56A0090E688 /* CDVLocalStorage.h */, + 3034979B1513D56A0090E688 /* CDVLocalStorage.m */, + 30392E4D14F4FCAB00B9E0B8 /* CDVAvailability.h */, + 30F5EBA914CA26E700987760 /* CDVCommandDelegate.h */, + EB3B357A161F2A44003DBE7D /* CDVCommandDelegateImpl.h */, + EB3B357B161F2A45003DBE7D /* CDVCommandDelegateImpl.m */, + 30C684921407044A004C1A8E /* CDVURLProtocol.h */, + 30C684931407044A004C1A8E /* CDVURLProtocol.m */, + 30C6847E1406CB38004C1A8E /* CDVWhitelist.h */, + 30C6847F1406CB38004C1A8E /* CDVWhitelist.m */, + 1F2BECBE13F9785B00A93BF6 /* CDVBattery.h */, + 1F2BECBF13F9785B00A93BF6 /* CDVBattery.m */, + 30B39EBC13D0268B0009682A /* CDVSplashScreen.h */, + 30B39EBD13D0268B0009682A /* CDVSplashScreen.m */, + 30E33AF013A7E24B00594D64 /* CDVPlugin.h */, + 30E33AF113A7E24B00594D64 /* CDVPlugin.m */, + 307A8F9C1385A2EC00E43782 /* CDVConnection.h */, + 307A8F9D1385A2EC00E43782 /* CDVConnection.m */, + 1F92F49E1314023E0046367C /* CDVPluginResult.h */, + 1F92F49F1314023E0046367C /* CDVPluginResult.m */, + 88BA573B109BB46F00FB5E78 /* CDVAccelerometer.h */, + 88BA573C109BB46F00FB5E78 /* CDVAccelerometer.m */, + 8887FD261090FBE7009987E8 /* CDVCamera.h */, + 8887FD271090FBE7009987E8 /* CDVCamera.m */, + 1F584B991385A28900ED25E8 /* CDVCapture.h */, + 1F584B9A1385A28900ED25E8 /* CDVCapture.m */, + 1F3C04CC12BC247D004F9E10 /* CDVContact.h */, + 1F3C04CD12BC247D004F9E10 /* CDVContact.m */, + 8887FD2A1090FBE7009987E8 /* CDVContacts.h */, + 8887FD2B1090FBE7009987E8 /* CDVContacts.m */, + 8887FD2C1090FBE7009987E8 /* CDVDebugConsole.h */, + 8887FD2D1090FBE7009987E8 /* CDVDebugConsole.m */, + EB80C2AA15DEA63D004D9E7B /* CDVEcho.h */, + EB80C2AB15DEA63D004D9E7B /* CDVEcho.m */, + 8887FD301090FBE7009987E8 /* CDVFile.h */, + 8887FD311090FBE7009987E8 /* CDVFile.m */, + 8887FD341090FBE7009987E8 /* CDVInvokedUrlCommand.h */, + 8887FD351090FBE7009987E8 /* CDVInvokedUrlCommand.m */, + C937A4541337599E002C4C79 /* CDVFileTransfer.h */, + C937A4551337599E002C4C79 /* CDVFileTransfer.m */, + 8887FD461090FBE7009987E8 /* CDVLocation.h */, + 8887FD471090FBE7009987E8 /* CDVLocation.m */, + 8887FD4E1090FBE7009987E8 /* CDVNotification.h */, + 8887FD4F1090FBE7009987E8 /* CDVNotification.m */, + 8887FD5E1090FBE7009987E8 /* CDVReachability.h */, + 8887FD5F1090FBE7009987E8 /* CDVReachability.m */, + 8887FD601090FBE7009987E8 /* CDVSound.h */, + 8887FD611090FBE7009987E8 /* CDVSound.m */, + 3E76876B156A90EE00EB6FA3 /* CDVLogger.m */, + 3E76876C156A90EE00EB6FA3 /* CDVLogger.h */, + 9D76CF3A1625A4C50008A0F6 /* CDVGlobalization.h */, + 9D76CF3B1625A4C50008A0F6 /* CDVGlobalization.m */, + ); + name = Commands; + sourceTree = ""; + }; + 888700D910923009009987E8 /* Util */ = { + isa = PBXGroup; + children = ( + 3062D11E151D0EDB000D9128 /* UIDevice+Extensions.h */, + 3062D11F151D0EDB000D9128 /* UIDevice+Extensions.m */, + EBA3557115ABD38C00F4DE24 /* NSArray+Comparisons.h */, + EBA3557215ABD38C00F4DE24 /* NSArray+Comparisons.m */, + 8887FD281090FBE7009987E8 /* NSDictionary+Extensions.h */, + 8887FD291090FBE7009987E8 /* NSDictionary+Extensions.m */, + 302965BB13A94E9D007046C5 /* CDVDebug.h */, + 30E563CD13E217EC00C949AA /* NSMutableArray+QueueAdditions.h */, + 30E563CE13E217EC00C949AA /* NSMutableArray+QueueAdditions.m */, + 8887FD501090FBE7009987E8 /* NSData+Base64.h */, + 8887FD511090FBE7009987E8 /* NSData+Base64.m */, + ); + name = Util; + sourceTree = ""; + }; + 8887FD101090FB43009987E8 /* Classes */ = { + isa = PBXGroup; + children = ( + 3054098714B77FF3009841CA /* Cleaver */, + 888700D710922F56009987E8 /* Commands */, + 8887FD361090FBE7009987E8 /* JSON */, + 888700D910923009009987E8 /* Util */, + ); + name = Classes; + sourceTree = ""; + }; + 8887FD361090FBE7009987E8 /* JSON */ = { + isa = PBXGroup; + children = ( + 30A90B8F14588697006178D3 /* JSONKit.h */, + 30A90B9014588697006178D3 /* JSONKit.m */, + ); + name = JSON; + path = Classes/JSON; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + D2AAC07A0554694100DB518D /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 8887FD661090FBE7009987E8 /* CDVCamera.h in Headers */, + 8887FD681090FBE7009987E8 /* NSDictionary+Extensions.h in Headers */, + 8887FD6A1090FBE7009987E8 /* CDVContacts.h in Headers */, + 8887FD6C1090FBE7009987E8 /* CDVDebugConsole.h in Headers */, + 8887FD701090FBE7009987E8 /* CDVFile.h in Headers */, + 8887FD741090FBE7009987E8 /* CDVInvokedUrlCommand.h in Headers */, + 8887FD851090FBE7009987E8 /* CDVLocation.h in Headers */, + 8887FD8D1090FBE7009987E8 /* CDVNotification.h in Headers */, + 8887FD8F1090FBE7009987E8 /* NSData+Base64.h in Headers */, + 8887FD9D1090FBE7009987E8 /* CDVReachability.h in Headers */, + 8887FD9F1090FBE7009987E8 /* CDVSound.h in Headers */, + 88BA573D109BB46F00FB5E78 /* CDVAccelerometer.h in Headers */, + 1F3C04CE12BC247D004F9E10 /* CDVContact.h in Headers */, + 1F92F4A01314023E0046367C /* CDVPluginResult.h in Headers */, + C937A4561337599E002C4C79 /* CDVFileTransfer.h in Headers */, + 307A8F9E1385A2EC00E43782 /* CDVConnection.h in Headers */, + 1F584B9B1385A28A00ED25E8 /* CDVCapture.h in Headers */, + 30E33AF213A7E24B00594D64 /* CDVPlugin.h in Headers */, + 302965BC13A94E9D007046C5 /* CDVDebug.h in Headers */, + 30B39EBE13D0268B0009682A /* CDVSplashScreen.h in Headers */, + 30E563CF13E217EC00C949AA /* NSMutableArray+QueueAdditions.h in Headers */, + 1F2BECC013F9785B00A93BF6 /* CDVBattery.h in Headers */, + 30C684801406CB38004C1A8E /* CDVWhitelist.h in Headers */, + 30C684941407044B004C1A8E /* CDVURLProtocol.h in Headers */, + 30A90B9114588697006178D3 /* JSONKit.h in Headers */, + 8852C43A14B65FD800F0E735 /* CDVViewController.h in Headers */, + 8852C43F14B65FD800F0E735 /* CDVCordovaView.h in Headers */, + 30F5EBAB14CA26E700987760 /* CDVCommandDelegate.h in Headers */, + 301F2F2A14F3C9CA003FE9FC /* CDV.h in Headers */, + 30392E4E14F4FCAB00B9E0B8 /* CDVAvailability.h in Headers */, + 3034979C1513D56A0090E688 /* CDVLocalStorage.h in Headers */, + 3062D120151D0EDB000D9128 /* UIDevice+Extensions.h in Headers */, + 3E76876F156A90EE00EB6FA3 /* CDVLogger.h in Headers */, + EBA3557315ABD38C00F4DE24 /* NSArray+Comparisons.h in Headers */, + 30C5F1DF15AF9E950052A00D /* CDVDevice.h in Headers */, + EB80C2AC15DEA63D004D9E7B /* CDVEcho.h in Headers */, + EB3B3547161CB44D003DBE7D /* CDVCommandQueue.h in Headers */, + EB3B357C161F2A45003DBE7D /* CDVCommandDelegateImpl.h in Headers */, + 9D76CF3C1625A4C50008A0F6 /* CDVGlobalization.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + D2AAC07D0554694100DB518D /* CordovaLib */ = { + isa = PBXNativeTarget; + buildConfigurationList = 1DEB921E08733DC00010E9CD /* Build configuration list for PBXNativeTarget "CordovaLib" */; + buildPhases = ( + D2AAC07A0554694100DB518D /* Headers */, + D2AAC07B0554694100DB518D /* Sources */, + D2AAC07C0554694100DB518D /* Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = CordovaLib; + productName = CordovaLib; + productReference = 68A32D7114102E1C006B237C /* libCordova.a */; + productType = "com.apple.product-type.library.static"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 0867D690FE84028FC02AAC07 /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 0430; + }; + buildConfigurationList = 1DEB922208733DC00010E9CD /* Build configuration list for PBXProject "CordovaLib" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 1; + knownRegions = ( + English, + Japanese, + French, + German, + en, + ); + mainGroup = 0867D691FE84028FC02AAC07 /* CordovaLib */; + productRefGroup = 034768DFFF38A50411DB9C8B /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + D2AAC07D0554694100DB518D /* CordovaLib */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXSourcesBuildPhase section */ + D2AAC07B0554694100DB518D /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 8887FD671090FBE7009987E8 /* CDVCamera.m in Sources */, + 8887FD691090FBE7009987E8 /* NSDictionary+Extensions.m in Sources */, + 8887FD6B1090FBE7009987E8 /* CDVContacts.m in Sources */, + 8887FD6D1090FBE7009987E8 /* CDVDebugConsole.m in Sources */, + 8887FD711090FBE7009987E8 /* CDVFile.m in Sources */, + 8887FD751090FBE7009987E8 /* CDVInvokedUrlCommand.m in Sources */, + 8887FD861090FBE7009987E8 /* CDVLocation.m in Sources */, + 8887FD8E1090FBE7009987E8 /* CDVNotification.m in Sources */, + 8887FD901090FBE7009987E8 /* NSData+Base64.m in Sources */, + 8887FD9E1090FBE7009987E8 /* CDVReachability.m in Sources */, + 8887FDA01090FBE7009987E8 /* CDVSound.m in Sources */, + 88BA573E109BB46F00FB5E78 /* CDVAccelerometer.m in Sources */, + 1F3C04CF12BC247D004F9E10 /* CDVContact.m in Sources */, + 1F92F4A11314023E0046367C /* CDVPluginResult.m in Sources */, + C937A4571337599E002C4C79 /* CDVFileTransfer.m in Sources */, + 307A8F9F1385A2EC00E43782 /* CDVConnection.m in Sources */, + 1F584B9C1385A28A00ED25E8 /* CDVCapture.m in Sources */, + 30E33AF313A7E24B00594D64 /* CDVPlugin.m in Sources */, + 30B39EBF13D0268B0009682A /* CDVSplashScreen.m in Sources */, + 30E563D013E217EC00C949AA /* NSMutableArray+QueueAdditions.m in Sources */, + 1F2BECC113F9785B00A93BF6 /* CDVBattery.m in Sources */, + 30C684821406CB38004C1A8E /* CDVWhitelist.m in Sources */, + 30C684961407044B004C1A8E /* CDVURLProtocol.m in Sources */, + 30A90B9314588697006178D3 /* JSONKit.m in Sources */, + 8852C43C14B65FD800F0E735 /* CDVViewController.m in Sources */, + 8852C44114B65FD800F0E735 /* CDVCordovaView.m in Sources */, + 3034979E1513D56A0090E688 /* CDVLocalStorage.m in Sources */, + 3062D122151D0EDB000D9128 /* UIDevice+Extensions.m in Sources */, + 3E76876D156A90EE00EB6FA3 /* CDVLogger.m in Sources */, + EBA3557515ABD38C00F4DE24 /* NSArray+Comparisons.m in Sources */, + 30C5F1E015AF9E950052A00D /* CDVDevice.m in Sources */, + EB80C2AD15DEA63D004D9E7B /* CDVEcho.m in Sources */, + EB3B3548161CB44D003DBE7D /* CDVCommandQueue.m in Sources */, + EB3B357D161F2A45003DBE7D /* CDVCommandDelegateImpl.m in Sources */, + 9D76CF3D1625A4C50008A0F6 /* CDVGlobalization.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + 1DEB921F08733DC00010E9CD /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + "ARCHS[sdk=iphoneos*]" = ( + armv6, + armv7, + ); + "ARCHS[sdk=iphoneos6.*]" = ( + armv7, + armv7s, + ); + "ARCHS[sdk=iphonesimulator*]" = i386; + CLANG_ENABLE_OBJC_ARC = YES; + COPY_PHASE_STRIP = NO; + DSTROOT = "/tmp/$(PROJECT_NAME).dst"; + GCC_DYNAMIC_NO_PIC = NO; + GCC_MODEL_TUNING = G5; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = CordovaLib_Prefix.pch; + GCC_PREPROCESSOR_DEFINITIONS = ""; + GCC_THUMB_SUPPORT = NO; + GCC_VERSION = com.apple.compilers.llvm.clang.1_0; + INSTALL_PATH = /usr/local/lib; + IPHONEOS_DEPLOYMENT_TARGET = 4.2; + PRODUCT_NAME = Cordova; + PUBLIC_HEADERS_FOLDER_PATH = include/Cordova; + SKIP_INSTALL = YES; + }; + name = Debug; + }; + 1DEB922008733DC00010E9CD /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + "ARCHS[sdk=iphoneos*]" = ( + armv6, + armv7, + ); + "ARCHS[sdk=iphoneos6.*]" = ( + armv7, + armv7s, + ); + "ARCHS[sdk=iphonesimulator*]" = i386; + CLANG_ENABLE_OBJC_ARC = YES; + DSTROOT = "/tmp/$(PROJECT_NAME).dst"; + GCC_MODEL_TUNING = G5; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = CordovaLib_Prefix.pch; + GCC_PREPROCESSOR_DEFINITIONS = ""; + GCC_THUMB_SUPPORT = NO; + GCC_VERSION = com.apple.compilers.llvm.clang.1_0; + INSTALL_PATH = /usr/local/lib; + IPHONEOS_DEPLOYMENT_TARGET = 4.2; + PRODUCT_NAME = Cordova; + PUBLIC_HEADERS_FOLDER_PATH = include/Cordova; + SKIP_INSTALL = YES; + }; + name = Release; + }; + 1DEB922308733DC00010E9CD /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + "ARCHS[sdk=iphoneos*]" = ( + armv6, + armv7, + ); + "ARCHS[sdk=iphoneos6.*]" = ( + armv7, + armv7s, + ); + "ARCHS[sdk=iphonesimulator*]" = i386; + GCC_C_LANGUAGE_STANDARD = c99; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ""; + GCC_THUMB_SUPPORT = NO; + GCC_VERSION = com.apple.compilers.llvm.clang.1_0; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 4.2; + ONLY_ACTIVE_ARCH = NO; + OTHER_CFLAGS = "-DDEBUG"; + PUBLIC_HEADERS_FOLDER_PATH = include/Cordova; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + USER_HEADER_SEARCH_PATHS = ""; + VALID_ARCHS = "i386 armv6 armv7 armv7s"; + }; + name = Debug; + }; + 1DEB922408733DC00010E9CD /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + "ARCHS[sdk=iphoneos*]" = ( + armv6, + armv7, + ); + "ARCHS[sdk=iphoneos6.*]" = ( + armv7, + armv7s, + ); + "ARCHS[sdk=iphonesimulator*]" = i386; + GCC_C_LANGUAGE_STANDARD = c99; + GCC_PREPROCESSOR_DEFINITIONS = ""; + GCC_THUMB_SUPPORT = NO; + GCC_VERSION = com.apple.compilers.llvm.clang.1_0; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 4.2; + ONLY_ACTIVE_ARCH = NO; + PUBLIC_HEADERS_FOLDER_PATH = include/Cordova; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VALID_ARCHS = "i386 armv6 armv7 armv7s"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 1DEB921E08733DC00010E9CD /* Build configuration list for PBXNativeTarget "CordovaLib" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 1DEB921F08733DC00010E9CD /* Debug */, + 1DEB922008733DC00010E9CD /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 1DEB922208733DC00010E9CD /* Build configuration list for PBXProject "CordovaLib" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 1DEB922308733DC00010E9CD /* Debug */, + 1DEB922408733DC00010E9CD /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 0867D690FE84028FC02AAC07 /* Project object */; +} diff --git a/cordova-lib/spec-plugman-install/projects/ios-config-xml/SampleApp.xcodeproj/project.orig.pbxproj b/cordova-lib/spec-plugman-install/projects/ios-config-xml/SampleApp.xcodeproj/project.orig.pbxproj new file mode 100644 index 000000000..a4d87f9b4 --- /dev/null +++ b/cordova-lib/spec-plugman-install/projects/ios-config-xml/SampleApp.xcodeproj/project.orig.pbxproj @@ -0,0 +1,498 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 571A464014DB0A1B007FEAC7 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 571A463F14DB0A1B007FEAC7 /* Foundation.framework */; }; + 571A464214DB0A1B007FEAC7 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 571A464114DB0A1B007FEAC7 /* UIKit.framework */; }; + 571A464414DB0A1B007FEAC7 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 571A464314DB0A1B007FEAC7 /* CoreGraphics.framework */; }; + 571A464614DB0A1B007FEAC7 /* AddressBook.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 571A464514DB0A1B007FEAC7 /* AddressBook.framework */; }; + 571A464814DB0A1B007FEAC7 /* AddressBookUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 571A464714DB0A1B007FEAC7 /* AddressBookUI.framework */; }; + 571A464A14DB0A1B007FEAC7 /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 571A464914DB0A1B007FEAC7 /* AudioToolbox.framework */; }; + 571A464C14DB0A1B007FEAC7 /* AVFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 571A464B14DB0A1B007FEAC7 /* AVFoundation.framework */; }; + 571A464E14DB0A1B007FEAC7 /* CoreLocation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 571A464D14DB0A1B007FEAC7 /* CoreLocation.framework */; }; + 571A465014DB0A1B007FEAC7 /* MediaPlayer.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 571A464F14DB0A1B007FEAC7 /* MediaPlayer.framework */; }; + 571A465214DB0A1B007FEAC7 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 571A465114DB0A1B007FEAC7 /* QuartzCore.framework */; }; + 571A465414DB0A1B007FEAC7 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 571A465314DB0A1B007FEAC7 /* SystemConfiguration.framework */; }; + 571A465614DB0A1B007FEAC7 /* MobileCoreServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 571A465514DB0A1B007FEAC7 /* MobileCoreServices.framework */; }; + 571A465814DB0A1B007FEAC7 /* CoreMedia.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 571A465714DB0A1B007FEAC7 /* CoreMedia.framework */; }; + 571A465E14DB0A1B007FEAC7 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 571A465C14DB0A1B007FEAC7 /* InfoPlist.strings */; }; + 571A466014DB0A1B007FEAC7 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 571A465F14DB0A1B007FEAC7 /* main.m */; }; + 571A466314DB0A1B007FEAC7 /* PhoneGap.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 571A466214DB0A1B007FEAC7 /* PhoneGap.framework */; }; + 571A466814DB0A1B007FEAC7 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 571A466614DB0A1B007FEAC7 /* Localizable.strings */; }; + 571A466C14DB0A1B007FEAC7 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 571A466A14DB0A1B007FEAC7 /* Localizable.strings */; }; + 571A466F14DB0A1B007FEAC7 /* icon.png in Resources */ = {isa = PBXBuildFile; fileRef = 571A466E14DB0A1B007FEAC7 /* icon.png */; }; + 571A467114DB0A1B007FEAC7 /* icon@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 571A467014DB0A1B007FEAC7 /* icon@2x.png */; }; + 571A467314DB0A1B007FEAC7 /* icon-72.png in Resources */ = {isa = PBXBuildFile; fileRef = 571A467214DB0A1B007FEAC7 /* icon-72.png */; }; + 571A467614DB0A1B007FEAC7 /* Default.png in Resources */ = {isa = PBXBuildFile; fileRef = 571A467514DB0A1B007FEAC7 /* Default.png */; }; + 571A467814DB0A1B007FEAC7 /* Default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 571A467714DB0A1B007FEAC7 /* Default@2x.png */; }; + 571A467A14DB0A1B007FEAC7 /* Capture.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 571A467914DB0A1B007FEAC7 /* Capture.bundle */; }; + 571A467C14DB0A1B007FEAC7 /* PhoneGap.plist in Resources */ = {isa = PBXBuildFile; fileRef = 571A467B14DB0A1B007FEAC7 /* PhoneGap.plist */; }; + 571A468014DB0A1B007FEAC7 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 571A467F14DB0A1B007FEAC7 /* AppDelegate.m */; }; + 571A468314DB0A1B007FEAC7 /* MainViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 571A468214DB0A1B007FEAC7 /* MainViewController.m */; }; + 571A468514DB0A1B007FEAC7 /* MainViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 571A468414DB0A1B007FEAC7 /* MainViewController.xib */; }; + 577FC36614DB0B620082BA7B /* www in Resources */ = {isa = PBXBuildFile; fileRef = 577FC36514DB0B620082BA7B /* www */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 571A463B14DB0A1B007FEAC7 /* ChildApp.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = ChildApp.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 571A463F14DB0A1B007FEAC7 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; + 571A464114DB0A1B007FEAC7 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; + 571A464314DB0A1B007FEAC7 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; + 571A464514DB0A1B007FEAC7 /* AddressBook.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AddressBook.framework; path = System/Library/Frameworks/AddressBook.framework; sourceTree = SDKROOT; }; + 571A464714DB0A1B007FEAC7 /* AddressBookUI.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AddressBookUI.framework; path = System/Library/Frameworks/AddressBookUI.framework; sourceTree = SDKROOT; }; + 571A464914DB0A1B007FEAC7 /* AudioToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = System/Library/Frameworks/AudioToolbox.framework; sourceTree = SDKROOT; }; + 571A464B14DB0A1B007FEAC7 /* AVFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVFoundation.framework; path = System/Library/Frameworks/AVFoundation.framework; sourceTree = SDKROOT; }; + 571A464D14DB0A1B007FEAC7 /* CoreLocation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreLocation.framework; path = System/Library/Frameworks/CoreLocation.framework; sourceTree = SDKROOT; }; + 571A464F14DB0A1B007FEAC7 /* MediaPlayer.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MediaPlayer.framework; path = System/Library/Frameworks/MediaPlayer.framework; sourceTree = SDKROOT; }; + 571A465114DB0A1B007FEAC7 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; + 571A465314DB0A1B007FEAC7 /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = System/Library/Frameworks/SystemConfiguration.framework; sourceTree = SDKROOT; }; + 571A465514DB0A1B007FEAC7 /* MobileCoreServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MobileCoreServices.framework; path = System/Library/Frameworks/MobileCoreServices.framework; sourceTree = SDKROOT; }; + 571A465714DB0A1B007FEAC7 /* CoreMedia.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMedia.framework; path = System/Library/Frameworks/CoreMedia.framework; sourceTree = SDKROOT; }; + 571A465B14DB0A1B007FEAC7 /* ChildApp-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "ChildApp-Info.plist"; sourceTree = ""; }; + 571A465D14DB0A1B007FEAC7 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; + 571A465F14DB0A1B007FEAC7 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; + 571A466114DB0A1B007FEAC7 /* ChildApp-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "ChildApp-Prefix.pch"; sourceTree = ""; }; + 571A466214DB0A1B007FEAC7 /* PhoneGap.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = PhoneGap.framework; path = /Users/Shared/PhoneGap/Frameworks/PhoneGap.framework; sourceTree = ""; }; + 571A466714DB0A1B007FEAC7 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = Resources/en.lproj/Localizable.strings; sourceTree = ""; }; + 571A466B14DB0A1B007FEAC7 /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = Resources/es.lproj/Localizable.strings; sourceTree = ""; }; + 571A466E14DB0A1B007FEAC7 /* icon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = icon.png; path = Resources/icons/icon.png; sourceTree = ""; }; + 571A467014DB0A1B007FEAC7 /* icon@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "icon@2x.png"; path = "Resources/icons/icon@2x.png"; sourceTree = ""; }; + 571A467214DB0A1B007FEAC7 /* icon-72.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "icon-72.png"; path = "Resources/icons/icon-72.png"; sourceTree = ""; }; + 571A467514DB0A1B007FEAC7 /* Default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Default.png; path = Resources/splash/Default.png; sourceTree = ""; }; + 571A467714DB0A1B007FEAC7 /* Default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Default@2x.png"; path = "Resources/splash/Default@2x.png"; sourceTree = ""; }; + 571A467914DB0A1B007FEAC7 /* Capture.bundle */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.plug-in"; name = Capture.bundle; path = Resources/Capture.bundle; sourceTree = ""; }; + 571A467B14DB0A1B007FEAC7 /* PhoneGap.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = PhoneGap.plist; sourceTree = ""; }; + 571A467E14DB0A1B007FEAC7 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = AppDelegate.h; path = Classes/AppDelegate.h; sourceTree = ""; }; + 571A467F14DB0A1B007FEAC7 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = AppDelegate.m; path = Classes/AppDelegate.m; sourceTree = ""; }; + 571A468114DB0A1B007FEAC7 /* MainViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = MainViewController.h; path = Classes/MainViewController.h; sourceTree = ""; }; + 571A468214DB0A1B007FEAC7 /* MainViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = MainViewController.m; path = Classes/MainViewController.m; sourceTree = ""; }; + 571A468414DB0A1B007FEAC7 /* MainViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = MainViewController.xib; path = Classes/MainViewController.xib; sourceTree = ""; }; + 571A468714DB0A1B007FEAC7 /* README */ = {isa = PBXFileReference; lastKnownFileType = text; name = README; path = Plugins/README; sourceTree = ""; }; + 577FC36514DB0B620082BA7B /* www */ = {isa = PBXFileReference; lastKnownFileType = folder; path = www; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 571A463514DB0A1B007FEAC7 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 571A464014DB0A1B007FEAC7 /* Foundation.framework in Frameworks */, + 571A464214DB0A1B007FEAC7 /* UIKit.framework in Frameworks */, + 571A464414DB0A1B007FEAC7 /* CoreGraphics.framework in Frameworks */, + 571A464614DB0A1B007FEAC7 /* AddressBook.framework in Frameworks */, + 571A464814DB0A1B007FEAC7 /* AddressBookUI.framework in Frameworks */, + 571A464A14DB0A1B007FEAC7 /* AudioToolbox.framework in Frameworks */, + 571A464C14DB0A1B007FEAC7 /* AVFoundation.framework in Frameworks */, + 571A464E14DB0A1B007FEAC7 /* CoreLocation.framework in Frameworks */, + 571A465014DB0A1B007FEAC7 /* MediaPlayer.framework in Frameworks */, + 571A465214DB0A1B007FEAC7 /* QuartzCore.framework in Frameworks */, + 571A465414DB0A1B007FEAC7 /* SystemConfiguration.framework in Frameworks */, + 571A465614DB0A1B007FEAC7 /* MobileCoreServices.framework in Frameworks */, + 571A465814DB0A1B007FEAC7 /* CoreMedia.framework in Frameworks */, + 571A466314DB0A1B007FEAC7 /* PhoneGap.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 571A463814DB0A1B007FEAC7 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 571A462D14DB0A1A007FEAC7 = { + isa = PBXGroup; + children = ( + 577FC36514DB0B620082BA7B /* www */, + 571A465914DB0A1B007FEAC7 /* ChildApp */, + 571A463E14DB0A1B007FEAC7 /* Frameworks */, + 571A463C14DB0A1B007FEAC7 /* Products */, + ); + sourceTree = ""; + }; + 571A463C14DB0A1B007FEAC7 /* Products */ = { + isa = PBXGroup; + children = ( + 571A463B14DB0A1B007FEAC7 /* ChildApp.app */, + ); + name = Products; + sourceTree = ""; + }; + 571A463E14DB0A1B007FEAC7 /* Frameworks */ = { + isa = PBXGroup; + children = ( + 571A463F14DB0A1B007FEAC7 /* Foundation.framework */, + 571A464114DB0A1B007FEAC7 /* UIKit.framework */, + 571A464314DB0A1B007FEAC7 /* CoreGraphics.framework */, + 571A464514DB0A1B007FEAC7 /* AddressBook.framework */, + 571A464714DB0A1B007FEAC7 /* AddressBookUI.framework */, + 571A464914DB0A1B007FEAC7 /* AudioToolbox.framework */, + 571A464B14DB0A1B007FEAC7 /* AVFoundation.framework */, + 571A464D14DB0A1B007FEAC7 /* CoreLocation.framework */, + 571A464F14DB0A1B007FEAC7 /* MediaPlayer.framework */, + 571A465114DB0A1B007FEAC7 /* QuartzCore.framework */, + 571A465314DB0A1B007FEAC7 /* SystemConfiguration.framework */, + 571A465514DB0A1B007FEAC7 /* MobileCoreServices.framework */, + 571A465714DB0A1B007FEAC7 /* CoreMedia.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; + 571A465914DB0A1B007FEAC7 /* ChildApp */ = { + isa = PBXGroup; + children = ( + 571A466214DB0A1B007FEAC7 /* PhoneGap.framework */, + 571A466414DB0A1B007FEAC7 /* Resources */, + 571A467D14DB0A1B007FEAC7 /* Classes */, + 571A468614DB0A1B007FEAC7 /* Plugins */, + 571A465A14DB0A1B007FEAC7 /* Supporting Files */, + ); + path = ChildApp; + sourceTree = ""; + }; + 571A465A14DB0A1B007FEAC7 /* Supporting Files */ = { + isa = PBXGroup; + children = ( + 571A465B14DB0A1B007FEAC7 /* ChildApp-Info.plist */, + 571A465C14DB0A1B007FEAC7 /* InfoPlist.strings */, + 571A465F14DB0A1B007FEAC7 /* main.m */, + 571A466114DB0A1B007FEAC7 /* ChildApp-Prefix.pch */, + 571A467B14DB0A1B007FEAC7 /* PhoneGap.plist */, + 571A468414DB0A1B007FEAC7 /* MainViewController.xib */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; + 571A466414DB0A1B007FEAC7 /* Resources */ = { + isa = PBXGroup; + children = ( + 571A467914DB0A1B007FEAC7 /* Capture.bundle */, + 571A466514DB0A1B007FEAC7 /* en.lproj */, + 571A466914DB0A1B007FEAC7 /* es.lproj */, + 571A466D14DB0A1B007FEAC7 /* icons */, + 571A467414DB0A1B007FEAC7 /* splash */, + ); + name = Resources; + sourceTree = ""; + }; + 571A466514DB0A1B007FEAC7 /* en.lproj */ = { + isa = PBXGroup; + children = ( + 571A466614DB0A1B007FEAC7 /* Localizable.strings */, + ); + name = en.lproj; + sourceTree = ""; + }; + 571A466914DB0A1B007FEAC7 /* es.lproj */ = { + isa = PBXGroup; + children = ( + 571A466A14DB0A1B007FEAC7 /* Localizable.strings */, + ); + name = es.lproj; + sourceTree = ""; + }; + 571A466D14DB0A1B007FEAC7 /* icons */ = { + isa = PBXGroup; + children = ( + 571A466E14DB0A1B007FEAC7 /* icon.png */, + 571A467014DB0A1B007FEAC7 /* icon@2x.png */, + 571A467214DB0A1B007FEAC7 /* icon-72.png */, + ); + name = icons; + sourceTree = ""; + }; + 571A467414DB0A1B007FEAC7 /* splash */ = { + isa = PBXGroup; + children = ( + 571A467514DB0A1B007FEAC7 /* Default.png */, + 571A467714DB0A1B007FEAC7 /* Default@2x.png */, + ); + name = splash; + sourceTree = ""; + }; + 571A467D14DB0A1B007FEAC7 /* Classes */ = { + isa = PBXGroup; + children = ( + 571A467E14DB0A1B007FEAC7 /* AppDelegate.h */, + 571A467F14DB0A1B007FEAC7 /* AppDelegate.m */, + 571A468114DB0A1B007FEAC7 /* MainViewController.h */, + 571A468214DB0A1B007FEAC7 /* MainViewController.m */, + ); + name = Classes; + sourceTree = ""; + }; + 571A468614DB0A1B007FEAC7 /* Plugins */ = { + isa = PBXGroup; + children = ( + 571A468714DB0A1B007FEAC7 /* README */, + ); + name = Plugins; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 571A463A14DB0A1B007FEAC7 /* ChildApp */ = { + isa = PBXNativeTarget; + buildConfigurationList = 571A468A14DB0A1B007FEAC7 /* Build configuration list for PBXNativeTarget "ChildApp" */; + buildPhases = ( + 571A463414DB0A1B007FEAC7 /* Sources */, + 571A463514DB0A1B007FEAC7 /* Frameworks */, + 571A463614DB0A1B007FEAC7 /* Resources */, + 571A463714DB0A1B007FEAC7 /* Sources */, + 571A463814DB0A1B007FEAC7 /* Frameworks */, + 571A463914DB0A1B007FEAC7 /* ShellScript */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = ChildApp; + productName = ChildApp; + productReference = 571A463B14DB0A1B007FEAC7 /* ChildApp.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 571A462F14DB0A1A007FEAC7 /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 0420; + }; + buildConfigurationList = 571A463214DB0A1A007FEAC7 /* Build configuration list for PBXProject "ChildApp" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + es, + ); + mainGroup = 571A462D14DB0A1A007FEAC7; + productRefGroup = 571A463C14DB0A1B007FEAC7 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 571A463A14DB0A1B007FEAC7 /* ChildApp */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 571A463614DB0A1B007FEAC7 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 571A465E14DB0A1B007FEAC7 /* InfoPlist.strings in Resources */, + 571A466814DB0A1B007FEAC7 /* Localizable.strings in Resources */, + 571A466C14DB0A1B007FEAC7 /* Localizable.strings in Resources */, + 571A466F14DB0A1B007FEAC7 /* icon.png in Resources */, + 571A467114DB0A1B007FEAC7 /* icon@2x.png in Resources */, + 571A467314DB0A1B007FEAC7 /* icon-72.png in Resources */, + 571A467614DB0A1B007FEAC7 /* Default.png in Resources */, + 571A467814DB0A1B007FEAC7 /* Default@2x.png in Resources */, + 571A467A14DB0A1B007FEAC7 /* Capture.bundle in Resources */, + 571A467C14DB0A1B007FEAC7 /* PhoneGap.plist in Resources */, + 571A468514DB0A1B007FEAC7 /* MainViewController.xib in Resources */, + 577FC36614DB0B620082BA7B /* www in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 571A463914DB0A1B007FEAC7 /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/bash; + shellScript = "\n\t\t\t\t\t\t\t\tif [ ! -d \"$PROJECT_DIR/www\" ] ; then\n\t\t\t\t\t\t\t\t\tcp -R /Users/Shared/PhoneGap/Frameworks/PhoneGap.framework/www \"$PROJECT_DIR\"\n\t\t\t\t\t\t\t\tfi\n\t\t\t\t\t\t\t\t# detect www folder reference in project, if missing, print warning\n\t\t\t\t\t\t\t\tgrep \"{isa = PBXFileReference; lastKnownFileType = folder; path = www; sourceTree = \\\"\\\"; };\" \"$PROJECT_DIR/$PROJECT_NAME.xcodeproj/project.pbxproj\"\n\t\t\t\t\t\t\t\trc=$? \n\t\t\t\t\t\t\t\tif [ $rc != 0 ] ; then\n\t\t\t\t\t\t\t\techo -e \"warning: Missing - Add $PROJECT_DIR/www as a folder reference in your project. Just drag and drop the folder into your project, into the Project Navigator of Xcode 4. Make sure you select the second radio-button: 'Create folder references for any added folders' (which will create a blue folder)\" 1>&2\n\t\t\t\t\t\t\t\tfi\t\t\t\t\t\t\t"; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 571A463414DB0A1B007FEAC7 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 571A466014DB0A1B007FEAC7 /* main.m in Sources */, + 571A468014DB0A1B007FEAC7 /* AppDelegate.m in Sources */, + 571A468314DB0A1B007FEAC7 /* MainViewController.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 571A463714DB0A1B007FEAC7 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + 571A465C14DB0A1B007FEAC7 /* InfoPlist.strings */ = { + isa = PBXVariantGroup; + children = ( + 571A465D14DB0A1B007FEAC7 /* en */, + ); + name = InfoPlist.strings; + sourceTree = ""; + }; + 571A466614DB0A1B007FEAC7 /* Localizable.strings */ = { + isa = PBXVariantGroup; + children = ( + 571A466714DB0A1B007FEAC7 /* en */, + ); + name = Localizable.strings; + sourceTree = ""; + }; + 571A466A14DB0A1B007FEAC7 /* Localizable.strings */ = { + isa = PBXVariantGroup; + children = ( + 571A466B14DB0A1B007FEAC7 /* es */, + ); + name = Localizable.strings; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 571A468814DB0A1B007FEAC7 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ARCHS = "$(ARCHS_STANDARD_32_BIT)"; + CLANG_ENABLE_OBJC_ARC = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + GCC_VERSION = com.apple.compilers.llvmgcc42; + GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 3.0; + SDKROOT = iphoneos; + }; + name = Debug; + }; + 571A468914DB0A1B007FEAC7 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ARCHS = "$(ARCHS_STANDARD_32_BIT)"; + CLANG_ENABLE_OBJC_ARC = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_VERSION = com.apple.compilers.llvmgcc42; + GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 3.0; + SDKROOT = iphoneos; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 571A468B14DB0A1B007FEAC7 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = YES; + COPY_PHASE_STRIP = NO; + FRAMEWORK_SEARCH_PATHS = /Users/Shared/PhoneGap/Frameworks; + GCC_DYNAMIC_NO_PIC = NO; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "ChildApp/ChildApp-Prefix.pch"; + GCC_PREPROCESSOR_DEFINITIONS = "PHONEGAP_FRAMEWORK=YES"; + INFOPLIST_FILE = "ChildApp/ChildApp-Info.plist"; + OTHER_LDFLAGS = ( + "-weak_framework", + UIKit, + "-weak_framework", + AVFoundation, + "-weak_framework", + CoreMedia, + "-weak_library", + /usr/lib/libSystem.B.dylib, + ); + PRODUCT_NAME = "$(TARGET_NAME)"; + TARGETED_DEVICE_FAMILY = "1,2"; + WRAPPER_EXTENSION = app; + }; + name = Debug; + }; + 571A468C14DB0A1B007FEAC7 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = YES; + COPY_PHASE_STRIP = YES; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + FRAMEWORK_SEARCH_PATHS = /Users/Shared/PhoneGap/Frameworks; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "ChildApp/ChildApp-Prefix.pch"; + GCC_PREPROCESSOR_DEFINITIONS = "PHONEGAP_FRAMEWORK=YES"; + INFOPLIST_FILE = "ChildApp/ChildApp-Info.plist"; + OTHER_LDFLAGS = ( + "-weak_framework", + UIKit, + "-weak_framework", + AVFoundation, + "-weak_framework", + CoreMedia, + "-weak_library", + /usr/lib/libSystem.B.dylib, + ); + PRODUCT_NAME = "$(TARGET_NAME)"; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + WRAPPER_EXTENSION = app; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 571A463214DB0A1A007FEAC7 /* Build configuration list for PBXProject "ChildApp" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 571A468814DB0A1B007FEAC7 /* Debug */, + 571A468914DB0A1B007FEAC7 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 571A468A14DB0A1B007FEAC7 /* Build configuration list for PBXNativeTarget "ChildApp" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 571A468B14DB0A1B007FEAC7 /* Debug */, + 571A468C14DB0A1B007FEAC7 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 571A462F14DB0A1A007FEAC7 /* Project object */; +} diff --git a/cordova-lib/spec-plugman-install/projects/ios-config-xml/SampleApp.xcodeproj/project.pbxproj b/cordova-lib/spec-plugman-install/projects/ios-config-xml/SampleApp.xcodeproj/project.pbxproj new file mode 100644 index 000000000..60f478f92 --- /dev/null +++ b/cordova-lib/spec-plugman-install/projects/ios-config-xml/SampleApp.xcodeproj/project.pbxproj @@ -0,0 +1,496 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 571A464014DB0A1B007FEAC7 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 571A463F14DB0A1B007FEAC7 /* Foundation.framework */; }; + 571A464214DB0A1B007FEAC7 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 571A464114DB0A1B007FEAC7 /* UIKit.framework */; }; + 571A464414DB0A1B007FEAC7 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 571A464314DB0A1B007FEAC7 /* CoreGraphics.framework */; }; + 571A464614DB0A1B007FEAC7 /* AddressBook.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 571A464514DB0A1B007FEAC7 /* AddressBook.framework */; }; + 571A464814DB0A1B007FEAC7 /* AddressBookUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 571A464714DB0A1B007FEAC7 /* AddressBookUI.framework */; }; + 571A464A14DB0A1B007FEAC7 /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 571A464914DB0A1B007FEAC7 /* AudioToolbox.framework */; }; + 571A464C14DB0A1B007FEAC7 /* AVFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 571A464B14DB0A1B007FEAC7 /* AVFoundation.framework */; }; + 571A464E14DB0A1B007FEAC7 /* CoreLocation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 571A464D14DB0A1B007FEAC7 /* CoreLocation.framework */; }; + 571A465014DB0A1B007FEAC7 /* MediaPlayer.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 571A464F14DB0A1B007FEAC7 /* MediaPlayer.framework */; }; + 571A465214DB0A1B007FEAC7 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 571A465114DB0A1B007FEAC7 /* QuartzCore.framework */; }; + 571A465414DB0A1B007FEAC7 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 571A465314DB0A1B007FEAC7 /* SystemConfiguration.framework */; }; + 571A465614DB0A1B007FEAC7 /* MobileCoreServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 571A465514DB0A1B007FEAC7 /* MobileCoreServices.framework */; }; + 571A465814DB0A1B007FEAC7 /* CoreMedia.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 571A465714DB0A1B007FEAC7 /* CoreMedia.framework */; }; + 571A465E14DB0A1B007FEAC7 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 571A465C14DB0A1B007FEAC7 /* InfoPlist.strings */; }; + 571A466014DB0A1B007FEAC7 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 571A465F14DB0A1B007FEAC7 /* main.m */; }; + 571A466314DB0A1B007FEAC7 /* PhoneGap.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 571A466214DB0A1B007FEAC7 /* PhoneGap.framework */; }; + 571A466814DB0A1B007FEAC7 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 571A466614DB0A1B007FEAC7 /* Localizable.strings */; }; + 571A466C14DB0A1B007FEAC7 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 571A466A14DB0A1B007FEAC7 /* Localizable.strings */; }; + 571A466F14DB0A1B007FEAC7 /* icon.png in Resources */ = {isa = PBXBuildFile; fileRef = 571A466E14DB0A1B007FEAC7 /* icon.png */; }; + 571A467114DB0A1B007FEAC7 /* icon@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 571A467014DB0A1B007FEAC7 /* icon@2x.png */; }; + 571A467314DB0A1B007FEAC7 /* icon-72.png in Resources */ = {isa = PBXBuildFile; fileRef = 571A467214DB0A1B007FEAC7 /* icon-72.png */; }; + 571A467614DB0A1B007FEAC7 /* Default.png in Resources */ = {isa = PBXBuildFile; fileRef = 571A467514DB0A1B007FEAC7 /* Default.png */; }; + 571A467814DB0A1B007FEAC7 /* Default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 571A467714DB0A1B007FEAC7 /* Default@2x.png */; }; + 571A467A14DB0A1B007FEAC7 /* Capture.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 571A467914DB0A1B007FEAC7 /* Capture.bundle */; }; + 571A467C14DB0A1B007FEAC7 /* PhoneGap.plist in Resources */ = {isa = PBXBuildFile; fileRef = 571A467B14DB0A1B007FEAC7 /* PhoneGap.plist */; }; + 571A468014DB0A1B007FEAC7 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 571A467F14DB0A1B007FEAC7 /* AppDelegate.m */; }; + 571A468314DB0A1B007FEAC7 /* MainViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 571A468214DB0A1B007FEAC7 /* MainViewController.m */; }; + 571A468514DB0A1B007FEAC7 /* MainViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 571A468414DB0A1B007FEAC7 /* MainViewController.xib */; }; + 577FC36614DB0B620082BA7B /* www in Resources */ = {isa = PBXBuildFile; fileRef = 577FC36514DB0B620082BA7B /* www */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 571A463B14DB0A1B007FEAC7 /* ChildApp.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = ChildApp.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 571A463F14DB0A1B007FEAC7 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; + 571A464114DB0A1B007FEAC7 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; + 571A464314DB0A1B007FEAC7 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; + 571A464514DB0A1B007FEAC7 /* AddressBook.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AddressBook.framework; path = System/Library/Frameworks/AddressBook.framework; sourceTree = SDKROOT; }; + 571A464714DB0A1B007FEAC7 /* AddressBookUI.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AddressBookUI.framework; path = System/Library/Frameworks/AddressBookUI.framework; sourceTree = SDKROOT; }; + 571A464914DB0A1B007FEAC7 /* AudioToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = System/Library/Frameworks/AudioToolbox.framework; sourceTree = SDKROOT; }; + 571A464B14DB0A1B007FEAC7 /* AVFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVFoundation.framework; path = System/Library/Frameworks/AVFoundation.framework; sourceTree = SDKROOT; }; + 571A464D14DB0A1B007FEAC7 /* CoreLocation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreLocation.framework; path = System/Library/Frameworks/CoreLocation.framework; sourceTree = SDKROOT; }; + 571A464F14DB0A1B007FEAC7 /* MediaPlayer.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MediaPlayer.framework; path = System/Library/Frameworks/MediaPlayer.framework; sourceTree = SDKROOT; }; + 571A465114DB0A1B007FEAC7 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; + 571A465314DB0A1B007FEAC7 /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = System/Library/Frameworks/SystemConfiguration.framework; sourceTree = SDKROOT; }; + 571A465514DB0A1B007FEAC7 /* MobileCoreServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MobileCoreServices.framework; path = System/Library/Frameworks/MobileCoreServices.framework; sourceTree = SDKROOT; }; + 571A465714DB0A1B007FEAC7 /* CoreMedia.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMedia.framework; path = System/Library/Frameworks/CoreMedia.framework; sourceTree = SDKROOT; }; + 571A465B14DB0A1B007FEAC7 /* ChildApp-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "ChildApp-Info.plist"; sourceTree = ""; }; + 571A465D14DB0A1B007FEAC7 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; + 571A465F14DB0A1B007FEAC7 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; + 571A466114DB0A1B007FEAC7 /* ChildApp-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "ChildApp-Prefix.pch"; sourceTree = ""; }; + 571A466214DB0A1B007FEAC7 /* PhoneGap.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = PhoneGap.framework; path = /Users/Shared/PhoneGap/Frameworks/PhoneGap.framework; sourceTree = ""; }; + 571A466714DB0A1B007FEAC7 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = Resources/en.lproj/Localizable.strings; sourceTree = ""; }; + 571A466B14DB0A1B007FEAC7 /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = Resources/es.lproj/Localizable.strings; sourceTree = ""; }; + 571A466E14DB0A1B007FEAC7 /* icon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = icon.png; path = Resources/icons/icon.png; sourceTree = ""; }; + 571A467014DB0A1B007FEAC7 /* icon@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "icon@2x.png"; path = "Resources/icons/icon@2x.png"; sourceTree = ""; }; + 571A467214DB0A1B007FEAC7 /* icon-72.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "icon-72.png"; path = "Resources/icons/icon-72.png"; sourceTree = ""; }; + 571A467514DB0A1B007FEAC7 /* Default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Default.png; path = Resources/splash/Default.png; sourceTree = ""; }; + 571A467714DB0A1B007FEAC7 /* Default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Default@2x.png"; path = "Resources/splash/Default@2x.png"; sourceTree = ""; }; + 571A467914DB0A1B007FEAC7 /* Capture.bundle */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.plug-in"; name = Capture.bundle; path = Resources/Capture.bundle; sourceTree = ""; }; + 571A467B14DB0A1B007FEAC7 /* PhoneGap.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = PhoneGap.plist; sourceTree = ""; }; + 571A467E14DB0A1B007FEAC7 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = AppDelegate.h; path = Classes/AppDelegate.h; sourceTree = ""; }; + 571A467F14DB0A1B007FEAC7 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = AppDelegate.m; path = Classes/AppDelegate.m; sourceTree = ""; }; + 571A468114DB0A1B007FEAC7 /* MainViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = MainViewController.h; path = Classes/MainViewController.h; sourceTree = ""; }; + 571A468214DB0A1B007FEAC7 /* MainViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = MainViewController.m; path = Classes/MainViewController.m; sourceTree = ""; }; + 571A468414DB0A1B007FEAC7 /* MainViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = MainViewController.xib; path = Classes/MainViewController.xib; sourceTree = ""; }; + 571A468714DB0A1B007FEAC7 /* README */ = {isa = PBXFileReference; lastKnownFileType = text; name = README; path = Plugins/README; sourceTree = ""; }; + 577FC36514DB0B620082BA7B /* www */ = {isa = PBXFileReference; lastKnownFileType = folder; path = www; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 571A463514DB0A1B007FEAC7 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 571A464014DB0A1B007FEAC7 /* Foundation.framework in Frameworks */, + 571A464214DB0A1B007FEAC7 /* UIKit.framework in Frameworks */, + 571A464414DB0A1B007FEAC7 /* CoreGraphics.framework in Frameworks */, + 571A464614DB0A1B007FEAC7 /* AddressBook.framework in Frameworks */, + 571A464814DB0A1B007FEAC7 /* AddressBookUI.framework in Frameworks */, + 571A464A14DB0A1B007FEAC7 /* AudioToolbox.framework in Frameworks */, + 571A464C14DB0A1B007FEAC7 /* AVFoundation.framework in Frameworks */, + 571A464E14DB0A1B007FEAC7 /* CoreLocation.framework in Frameworks */, + 571A465014DB0A1B007FEAC7 /* MediaPlayer.framework in Frameworks */, + 571A465214DB0A1B007FEAC7 /* QuartzCore.framework in Frameworks */, + 571A465414DB0A1B007FEAC7 /* SystemConfiguration.framework in Frameworks */, + 571A465614DB0A1B007FEAC7 /* MobileCoreServices.framework in Frameworks */, + 571A465814DB0A1B007FEAC7 /* CoreMedia.framework in Frameworks */, + 571A466314DB0A1B007FEAC7 /* PhoneGap.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 571A463814DB0A1B007FEAC7 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 571A462D14DB0A1A007FEAC7 = { + isa = PBXGroup; + children = ( + 577FC36514DB0B620082BA7B /* www */, + 571A465914DB0A1B007FEAC7 /* ChildApp */, + 571A463E14DB0A1B007FEAC7 /* Frameworks */, + 571A463C14DB0A1B007FEAC7 /* Products */, + ); + sourceTree = ""; + }; + 571A463C14DB0A1B007FEAC7 /* Products */ = { + isa = PBXGroup; + children = ( + 571A463B14DB0A1B007FEAC7 /* ChildApp.app */, + ); + name = Products; + sourceTree = ""; + }; + 571A463E14DB0A1B007FEAC7 /* Frameworks */ = { + isa = PBXGroup; + children = ( + 571A463F14DB0A1B007FEAC7 /* Foundation.framework */, + 571A464114DB0A1B007FEAC7 /* UIKit.framework */, + 571A464314DB0A1B007FEAC7 /* CoreGraphics.framework */, + 571A464514DB0A1B007FEAC7 /* AddressBook.framework */, + 571A464714DB0A1B007FEAC7 /* AddressBookUI.framework */, + 571A464914DB0A1B007FEAC7 /* AudioToolbox.framework */, + 571A464B14DB0A1B007FEAC7 /* AVFoundation.framework */, + 571A464D14DB0A1B007FEAC7 /* CoreLocation.framework */, + 571A464F14DB0A1B007FEAC7 /* MediaPlayer.framework */, + 571A465114DB0A1B007FEAC7 /* QuartzCore.framework */, + 571A465314DB0A1B007FEAC7 /* SystemConfiguration.framework */, + 571A465514DB0A1B007FEAC7 /* MobileCoreServices.framework */, + 571A465714DB0A1B007FEAC7 /* CoreMedia.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; + 571A465914DB0A1B007FEAC7 /* ChildApp */ = { + isa = PBXGroup; + children = ( + 571A466214DB0A1B007FEAC7 /* PhoneGap.framework */, + 571A466414DB0A1B007FEAC7 /* Resources */, + 571A467D14DB0A1B007FEAC7 /* Classes */, + 571A468614DB0A1B007FEAC7 /* Plugins */, + 571A465A14DB0A1B007FEAC7 /* Supporting Files */, + ); + path = ChildApp; + sourceTree = ""; + }; + 571A465A14DB0A1B007FEAC7 /* Supporting Files */ = { + isa = PBXGroup; + children = ( + 571A465B14DB0A1B007FEAC7 /* ChildApp-Info.plist */, + 571A465C14DB0A1B007FEAC7 /* InfoPlist.strings */, + 571A465F14DB0A1B007FEAC7 /* main.m */, + 571A466114DB0A1B007FEAC7 /* ChildApp-Prefix.pch */, + 571A467B14DB0A1B007FEAC7 /* PhoneGap.plist */, + 571A468414DB0A1B007FEAC7 /* MainViewController.xib */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; + 571A466414DB0A1B007FEAC7 /* Resources */ = { + isa = PBXGroup; + children = ( + 571A467914DB0A1B007FEAC7 /* Capture.bundle */, + 571A466514DB0A1B007FEAC7 /* en.lproj */, + 571A466914DB0A1B007FEAC7 /* es.lproj */, + 571A466D14DB0A1B007FEAC7 /* icons */, + 571A467414DB0A1B007FEAC7 /* splash */, + ); + name = Resources; + sourceTree = ""; + }; + 571A466514DB0A1B007FEAC7 /* en.lproj */ = { + isa = PBXGroup; + children = ( + 571A466614DB0A1B007FEAC7 /* Localizable.strings */, + ); + name = en.lproj; + sourceTree = ""; + }; + 571A466914DB0A1B007FEAC7 /* es.lproj */ = { + isa = PBXGroup; + children = ( + 571A466A14DB0A1B007FEAC7 /* Localizable.strings */, + ); + name = es.lproj; + sourceTree = ""; + }; + 571A466D14DB0A1B007FEAC7 /* icons */ = { + isa = PBXGroup; + children = ( + 571A466E14DB0A1B007FEAC7 /* icon.png */, + 571A467014DB0A1B007FEAC7 /* icon@2x.png */, + 571A467214DB0A1B007FEAC7 /* icon-72.png */, + ); + name = icons; + sourceTree = ""; + }; + 571A467414DB0A1B007FEAC7 /* splash */ = { + isa = PBXGroup; + children = ( + 571A467514DB0A1B007FEAC7 /* Default.png */, + 571A467714DB0A1B007FEAC7 /* Default@2x.png */, + ); + name = splash; + sourceTree = ""; + }; + 571A467D14DB0A1B007FEAC7 /* Classes */ = { + isa = PBXGroup; + children = ( + 571A467E14DB0A1B007FEAC7 /* AppDelegate.h */, + 571A467F14DB0A1B007FEAC7 /* AppDelegate.m */, + 571A468114DB0A1B007FEAC7 /* MainViewController.h */, + 571A468214DB0A1B007FEAC7 /* MainViewController.m */, + ); + name = Classes; + sourceTree = ""; + }; + 571A468614DB0A1B007FEAC7 /* Plugins */ = { + isa = PBXGroup; + children = ( + 571A468714DB0A1B007FEAC7 /* README */, + ); + name = Plugins; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 571A463A14DB0A1B007FEAC7 /* ChildApp */ = { + isa = PBXNativeTarget; + buildConfigurationList = 571A468A14DB0A1B007FEAC7 /* Build configuration list for PBXNativeTarget "ChildApp" */; + buildPhases = ( + 571A463414DB0A1B007FEAC7 /* Sources */, + 571A463514DB0A1B007FEAC7 /* Frameworks */, + 571A463614DB0A1B007FEAC7 /* Resources */, + 571A463714DB0A1B007FEAC7 /* Sources */, + 571A463814DB0A1B007FEAC7 /* Frameworks */, + 571A463914DB0A1B007FEAC7 /* ShellScript */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = ChildApp; + productName = ChildApp; + productReference = 571A463B14DB0A1B007FEAC7 /* ChildApp.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 571A462F14DB0A1A007FEAC7 /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 0420; + }; + buildConfigurationList = 571A463214DB0A1A007FEAC7 /* Build configuration list for PBXProject "ChildApp" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + es, + ); + mainGroup = 571A462D14DB0A1A007FEAC7; + productRefGroup = 571A463C14DB0A1B007FEAC7 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 571A463A14DB0A1B007FEAC7 /* ChildApp */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 571A463614DB0A1B007FEAC7 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 571A465E14DB0A1B007FEAC7 /* InfoPlist.strings in Resources */, + 571A466814DB0A1B007FEAC7 /* Localizable.strings in Resources */, + 571A466C14DB0A1B007FEAC7 /* Localizable.strings in Resources */, + 571A466F14DB0A1B007FEAC7 /* icon.png in Resources */, + 571A467114DB0A1B007FEAC7 /* icon@2x.png in Resources */, + 571A467314DB0A1B007FEAC7 /* icon-72.png in Resources */, + 571A467614DB0A1B007FEAC7 /* Default.png in Resources */, + 571A467814DB0A1B007FEAC7 /* Default@2x.png in Resources */, + 571A467A14DB0A1B007FEAC7 /* Capture.bundle in Resources */, + 571A467C14DB0A1B007FEAC7 /* PhoneGap.plist in Resources */, + 571A468514DB0A1B007FEAC7 /* MainViewController.xib in Resources */, + 577FC36614DB0B620082BA7B /* www in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 571A463914DB0A1B007FEAC7 /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/bash; + shellScript = "\n\t\t\t\t\t\t\t\tif [ ! -d \"$PROJECT_DIR/www\" ] ; then\n\t\t\t\t\t\t\t\t\tcp -R /Users/Shared/PhoneGap/Frameworks/PhoneGap.framework/www \"$PROJECT_DIR\"\n\t\t\t\t\t\t\t\tfi\n\t\t\t\t\t\t\t\t# detect www folder reference in project, if missing, print warning\n\t\t\t\t\t\t\t\tgrep \"{isa = PBXFileReference; lastKnownFileType = folder; path = www; sourceTree = \\\"\\\"; };\" \"$PROJECT_DIR/$PROJECT_NAME.xcodeproj/project.pbxproj\"\n\t\t\t\t\t\t\t\trc=$? \n\t\t\t\t\t\t\t\tif [ $rc != 0 ] ; then\n\t\t\t\t\t\t\t\techo -e \"warning: Missing - Add $PROJECT_DIR/www as a folder reference in your project. Just drag and drop the folder into your project, into the Project Navigator of Xcode 4. Make sure you select the second radio-button: 'Create folder references for any added folders' (which will create a blue folder)\" 1>&2\n\t\t\t\t\t\t\t\tfi\t\t\t\t\t\t\t"; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 571A463414DB0A1B007FEAC7 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 571A466014DB0A1B007FEAC7 /* main.m in Sources */, + 571A468014DB0A1B007FEAC7 /* AppDelegate.m in Sources */, + 571A468314DB0A1B007FEAC7 /* MainViewController.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 571A463714DB0A1B007FEAC7 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + 571A465C14DB0A1B007FEAC7 /* InfoPlist.strings */ = { + isa = PBXVariantGroup; + children = ( + 571A465D14DB0A1B007FEAC7 /* en */, + ); + name = InfoPlist.strings; + sourceTree = ""; + }; + 571A466614DB0A1B007FEAC7 /* Localizable.strings */ = { + isa = PBXVariantGroup; + children = ( + 571A466714DB0A1B007FEAC7 /* en */, + ); + name = Localizable.strings; + sourceTree = ""; + }; + 571A466A14DB0A1B007FEAC7 /* Localizable.strings */ = { + isa = PBXVariantGroup; + children = ( + 571A466B14DB0A1B007FEAC7 /* es */, + ); + name = Localizable.strings; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 571A468814DB0A1B007FEAC7 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ARCHS = "$(ARCHS_STANDARD_32_BIT)"; + CLANG_ENABLE_OBJC_ARC = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + GCC_VERSION = com.apple.compilers.llvmgcc42; + GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 3.0; + SDKROOT = iphoneos; + }; + name = Debug; + }; + 571A468914DB0A1B007FEAC7 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ARCHS = "$(ARCHS_STANDARD_32_BIT)"; + CLANG_ENABLE_OBJC_ARC = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_VERSION = com.apple.compilers.llvmgcc42; + GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 3.0; + SDKROOT = iphoneos; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 571A468B14DB0A1B007FEAC7 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = YES; + COPY_PHASE_STRIP = NO; + GCC_DYNAMIC_NO_PIC = NO; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "ChildApp/ChildApp-Prefix.pch"; + GCC_PREPROCESSOR_DEFINITIONS = "PHONEGAP_FRAMEWORK=YES"; + INFOPLIST_FILE = "ChildApp/ChildApp-Info.plist"; + OTHER_LDFLAGS = ( + "-weak_framework", + UIKit, + "-weak_framework", + AVFoundation, + "-weak_framework", + CoreMedia, + "-weak_library", + /usr/lib/libSystem.B.dylib, + ); + PRODUCT_NAME = "$(TARGET_NAME)"; + TARGETED_DEVICE_FAMILY = "1,2"; + WRAPPER_EXTENSION = app; + }; + name = Debug; + }; + 571A468C14DB0A1B007FEAC7 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = YES; + COPY_PHASE_STRIP = YES; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "ChildApp/ChildApp-Prefix.pch"; + GCC_PREPROCESSOR_DEFINITIONS = "PHONEGAP_FRAMEWORK=YES"; + INFOPLIST_FILE = "ChildApp/ChildApp-Info.plist"; + OTHER_LDFLAGS = ( + "-weak_framework", + UIKit, + "-weak_framework", + AVFoundation, + "-weak_framework", + CoreMedia, + "-weak_library", + /usr/lib/libSystem.B.dylib, + ); + PRODUCT_NAME = "$(TARGET_NAME)"; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + WRAPPER_EXTENSION = app; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 571A463214DB0A1A007FEAC7 /* Build configuration list for PBXProject "ChildApp" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 571A468814DB0A1B007FEAC7 /* Debug */, + 571A468914DB0A1B007FEAC7 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 571A468A14DB0A1B007FEAC7 /* Build configuration list for PBXNativeTarget "ChildApp" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 571A468B14DB0A1B007FEAC7 /* Debug */, + 571A468C14DB0A1B007FEAC7 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 571A462F14DB0A1A007FEAC7 /* Project object */; +} diff --git a/cordova-lib/spec-plugman-install/projects/ios-config-xml/SampleApp/SampleApp-Info.plist b/cordova-lib/spec-plugman-install/projects/ios-config-xml/SampleApp/SampleApp-Info.plist new file mode 100644 index 000000000..6010b6150 --- /dev/null +++ b/cordova-lib/spec-plugman-install/projects/ios-config-xml/SampleApp/SampleApp-Info.plist @@ -0,0 +1,78 @@ + + + + + + CFBundleIcons + + CFBundlePrimaryIcon + + CFBundleIconFiles + + icon.png + icon@2x.png + icon-72.png + icon-72@2x.png + + UIPrerenderedIcon + + + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + + CFBundleDevelopmentRegion + English + CFBundleDisplayName + ${PRODUCT_NAME} + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIconFile + icon.png + CFBundleIdentifier + com.example.friendstring + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + APPL + CFBundleSignature + ???? + CFBundleVersion + 1.0 + LSRequiresIPhoneOS + + NSMainNibFile + + NSMainNibFile~ipad + + + diff --git a/cordova-lib/spec-plugman-install/projects/ios-config-xml/SampleApp/config.xml b/cordova-lib/spec-plugman-install/projects/ios-config-xml/SampleApp/config.xml new file mode 100644 index 000000000..2858c2803 --- /dev/null +++ b/cordova-lib/spec-plugman-install/projects/ios-config-xml/SampleApp/config.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cordova-lib/spec-plugman-install/projects/ios-config-xml/www/.gitkeep b/cordova-lib/spec-plugman-install/projects/ios-config-xml/www/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/cordova-lib/spec-plugman-install/projects/ios-plist/CordovaLib/CordovaLib.xcodeproj/project.pbxproj b/cordova-lib/spec-plugman-install/projects/ios-plist/CordovaLib/CordovaLib.xcodeproj/project.pbxproj new file mode 100644 index 000000000..5d0d46199 --- /dev/null +++ b/cordova-lib/spec-plugman-install/projects/ios-plist/CordovaLib/CordovaLib.xcodeproj/project.pbxproj @@ -0,0 +1,636 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 1F2BECC013F9785B00A93BF6 /* CDVBattery.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F2BECBE13F9785B00A93BF6 /* CDVBattery.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1F2BECC113F9785B00A93BF6 /* CDVBattery.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F2BECBF13F9785B00A93BF6 /* CDVBattery.m */; }; + 1F3C04CE12BC247D004F9E10 /* CDVContact.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F3C04CC12BC247D004F9E10 /* CDVContact.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1F3C04CF12BC247D004F9E10 /* CDVContact.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F3C04CD12BC247D004F9E10 /* CDVContact.m */; }; + 1F584B9B1385A28A00ED25E8 /* CDVCapture.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F584B991385A28900ED25E8 /* CDVCapture.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1F584B9C1385A28A00ED25E8 /* CDVCapture.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F584B9A1385A28900ED25E8 /* CDVCapture.m */; }; + 1F92F4A01314023E0046367C /* CDVPluginResult.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F92F49E1314023E0046367C /* CDVPluginResult.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1F92F4A11314023E0046367C /* CDVPluginResult.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F92F49F1314023E0046367C /* CDVPluginResult.m */; }; + 301F2F2A14F3C9CA003FE9FC /* CDV.h in Headers */ = {isa = PBXBuildFile; fileRef = 301F2F2914F3C9CA003FE9FC /* CDV.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 302965BC13A94E9D007046C5 /* CDVDebug.h in Headers */ = {isa = PBXBuildFile; fileRef = 302965BB13A94E9D007046C5 /* CDVDebug.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 3034979C1513D56A0090E688 /* CDVLocalStorage.h in Headers */ = {isa = PBXBuildFile; fileRef = 3034979A1513D56A0090E688 /* CDVLocalStorage.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 3034979E1513D56A0090E688 /* CDVLocalStorage.m in Sources */ = {isa = PBXBuildFile; fileRef = 3034979B1513D56A0090E688 /* CDVLocalStorage.m */; }; + 30392E4E14F4FCAB00B9E0B8 /* CDVAvailability.h in Headers */ = {isa = PBXBuildFile; fileRef = 30392E4D14F4FCAB00B9E0B8 /* CDVAvailability.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 3062D120151D0EDB000D9128 /* UIDevice+Extensions.h in Headers */ = {isa = PBXBuildFile; fileRef = 3062D11E151D0EDB000D9128 /* UIDevice+Extensions.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 3062D122151D0EDB000D9128 /* UIDevice+Extensions.m in Sources */ = {isa = PBXBuildFile; fileRef = 3062D11F151D0EDB000D9128 /* UIDevice+Extensions.m */; }; + 307A8F9E1385A2EC00E43782 /* CDVConnection.h in Headers */ = {isa = PBXBuildFile; fileRef = 307A8F9C1385A2EC00E43782 /* CDVConnection.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 307A8F9F1385A2EC00E43782 /* CDVConnection.m in Sources */ = {isa = PBXBuildFile; fileRef = 307A8F9D1385A2EC00E43782 /* CDVConnection.m */; }; + 30A90B9114588697006178D3 /* JSONKit.h in Headers */ = {isa = PBXBuildFile; fileRef = 30A90B8F14588697006178D3 /* JSONKit.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 30A90B9314588697006178D3 /* JSONKit.m in Sources */ = {isa = PBXBuildFile; fileRef = 30A90B9014588697006178D3 /* JSONKit.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; + 30B39EBE13D0268B0009682A /* CDVSplashScreen.h in Headers */ = {isa = PBXBuildFile; fileRef = 30B39EBC13D0268B0009682A /* CDVSplashScreen.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 30B39EBF13D0268B0009682A /* CDVSplashScreen.m in Sources */ = {isa = PBXBuildFile; fileRef = 30B39EBD13D0268B0009682A /* CDVSplashScreen.m */; }; + 30C5F1DF15AF9E950052A00D /* CDVDevice.h in Headers */ = {isa = PBXBuildFile; fileRef = 30C5F1DD15AF9E950052A00D /* CDVDevice.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 30C5F1E015AF9E950052A00D /* CDVDevice.m in Sources */ = {isa = PBXBuildFile; fileRef = 30C5F1DE15AF9E950052A00D /* CDVDevice.m */; }; + 30C684801406CB38004C1A8E /* CDVWhitelist.h in Headers */ = {isa = PBXBuildFile; fileRef = 30C6847E1406CB38004C1A8E /* CDVWhitelist.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 30C684821406CB38004C1A8E /* CDVWhitelist.m in Sources */ = {isa = PBXBuildFile; fileRef = 30C6847F1406CB38004C1A8E /* CDVWhitelist.m */; }; + 30C684941407044B004C1A8E /* CDVURLProtocol.h in Headers */ = {isa = PBXBuildFile; fileRef = 30C684921407044A004C1A8E /* CDVURLProtocol.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 30C684961407044B004C1A8E /* CDVURLProtocol.m in Sources */ = {isa = PBXBuildFile; fileRef = 30C684931407044A004C1A8E /* CDVURLProtocol.m */; }; + 30E33AF213A7E24B00594D64 /* CDVPlugin.h in Headers */ = {isa = PBXBuildFile; fileRef = 30E33AF013A7E24B00594D64 /* CDVPlugin.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 30E33AF313A7E24B00594D64 /* CDVPlugin.m in Sources */ = {isa = PBXBuildFile; fileRef = 30E33AF113A7E24B00594D64 /* CDVPlugin.m */; }; + 30E563CF13E217EC00C949AA /* NSMutableArray+QueueAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = 30E563CD13E217EC00C949AA /* NSMutableArray+QueueAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 30E563D013E217EC00C949AA /* NSMutableArray+QueueAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 30E563CE13E217EC00C949AA /* NSMutableArray+QueueAdditions.m */; }; + 30F5EBAB14CA26E700987760 /* CDVCommandDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = 30F5EBA914CA26E700987760 /* CDVCommandDelegate.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 3E76876D156A90EE00EB6FA3 /* CDVLogger.m in Sources */ = {isa = PBXBuildFile; fileRef = 3E76876B156A90EE00EB6FA3 /* CDVLogger.m */; }; + 3E76876F156A90EE00EB6FA3 /* CDVLogger.h in Headers */ = {isa = PBXBuildFile; fileRef = 3E76876C156A90EE00EB6FA3 /* CDVLogger.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 8852C43A14B65FD800F0E735 /* CDVViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 8852C43614B65FD800F0E735 /* CDVViewController.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 8852C43C14B65FD800F0E735 /* CDVViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 8852C43714B65FD800F0E735 /* CDVViewController.m */; }; + 8852C43F14B65FD800F0E735 /* CDVCordovaView.h in Headers */ = {isa = PBXBuildFile; fileRef = 8852C43814B65FD800F0E735 /* CDVCordovaView.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 8852C44114B65FD800F0E735 /* CDVCordovaView.m in Sources */ = {isa = PBXBuildFile; fileRef = 8852C43914B65FD800F0E735 /* CDVCordovaView.m */; }; + 8887FD661090FBE7009987E8 /* CDVCamera.h in Headers */ = {isa = PBXBuildFile; fileRef = 8887FD261090FBE7009987E8 /* CDVCamera.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 8887FD671090FBE7009987E8 /* CDVCamera.m in Sources */ = {isa = PBXBuildFile; fileRef = 8887FD271090FBE7009987E8 /* CDVCamera.m */; }; + 8887FD681090FBE7009987E8 /* NSDictionary+Extensions.h in Headers */ = {isa = PBXBuildFile; fileRef = 8887FD281090FBE7009987E8 /* NSDictionary+Extensions.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 8887FD691090FBE7009987E8 /* NSDictionary+Extensions.m in Sources */ = {isa = PBXBuildFile; fileRef = 8887FD291090FBE7009987E8 /* NSDictionary+Extensions.m */; }; + 8887FD6A1090FBE7009987E8 /* CDVContacts.h in Headers */ = {isa = PBXBuildFile; fileRef = 8887FD2A1090FBE7009987E8 /* CDVContacts.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 8887FD6B1090FBE7009987E8 /* CDVContacts.m in Sources */ = {isa = PBXBuildFile; fileRef = 8887FD2B1090FBE7009987E8 /* CDVContacts.m */; }; + 8887FD6C1090FBE7009987E8 /* CDVDebugConsole.h in Headers */ = {isa = PBXBuildFile; fileRef = 8887FD2C1090FBE7009987E8 /* CDVDebugConsole.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 8887FD6D1090FBE7009987E8 /* CDVDebugConsole.m in Sources */ = {isa = PBXBuildFile; fileRef = 8887FD2D1090FBE7009987E8 /* CDVDebugConsole.m */; }; + 8887FD701090FBE7009987E8 /* CDVFile.h in Headers */ = {isa = PBXBuildFile; fileRef = 8887FD301090FBE7009987E8 /* CDVFile.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 8887FD711090FBE7009987E8 /* CDVFile.m in Sources */ = {isa = PBXBuildFile; fileRef = 8887FD311090FBE7009987E8 /* CDVFile.m */; }; + 8887FD741090FBE7009987E8 /* CDVInvokedUrlCommand.h in Headers */ = {isa = PBXBuildFile; fileRef = 8887FD341090FBE7009987E8 /* CDVInvokedUrlCommand.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 8887FD751090FBE7009987E8 /* CDVInvokedUrlCommand.m in Sources */ = {isa = PBXBuildFile; fileRef = 8887FD351090FBE7009987E8 /* CDVInvokedUrlCommand.m */; }; + 8887FD851090FBE7009987E8 /* CDVLocation.h in Headers */ = {isa = PBXBuildFile; fileRef = 8887FD461090FBE7009987E8 /* CDVLocation.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 8887FD861090FBE7009987E8 /* CDVLocation.m in Sources */ = {isa = PBXBuildFile; fileRef = 8887FD471090FBE7009987E8 /* CDVLocation.m */; }; + 8887FD8D1090FBE7009987E8 /* CDVNotification.h in Headers */ = {isa = PBXBuildFile; fileRef = 8887FD4E1090FBE7009987E8 /* CDVNotification.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 8887FD8E1090FBE7009987E8 /* CDVNotification.m in Sources */ = {isa = PBXBuildFile; fileRef = 8887FD4F1090FBE7009987E8 /* CDVNotification.m */; }; + 8887FD8F1090FBE7009987E8 /* NSData+Base64.h in Headers */ = {isa = PBXBuildFile; fileRef = 8887FD501090FBE7009987E8 /* NSData+Base64.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 8887FD901090FBE7009987E8 /* NSData+Base64.m in Sources */ = {isa = PBXBuildFile; fileRef = 8887FD511090FBE7009987E8 /* NSData+Base64.m */; }; + 8887FD9D1090FBE7009987E8 /* CDVReachability.h in Headers */ = {isa = PBXBuildFile; fileRef = 8887FD5E1090FBE7009987E8 /* CDVReachability.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 8887FD9E1090FBE7009987E8 /* CDVReachability.m in Sources */ = {isa = PBXBuildFile; fileRef = 8887FD5F1090FBE7009987E8 /* CDVReachability.m */; }; + 8887FD9F1090FBE7009987E8 /* CDVSound.h in Headers */ = {isa = PBXBuildFile; fileRef = 8887FD601090FBE7009987E8 /* CDVSound.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 8887FDA01090FBE7009987E8 /* CDVSound.m in Sources */ = {isa = PBXBuildFile; fileRef = 8887FD611090FBE7009987E8 /* CDVSound.m */; }; + 88BA573D109BB46F00FB5E78 /* CDVAccelerometer.h in Headers */ = {isa = PBXBuildFile; fileRef = 88BA573B109BB46F00FB5E78 /* CDVAccelerometer.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 88BA573E109BB46F00FB5E78 /* CDVAccelerometer.m in Sources */ = {isa = PBXBuildFile; fileRef = 88BA573C109BB46F00FB5E78 /* CDVAccelerometer.m */; }; + 9D76CF3C1625A4C50008A0F6 /* CDVGlobalization.h in Headers */ = {isa = PBXBuildFile; fileRef = 9D76CF3A1625A4C50008A0F6 /* CDVGlobalization.h */; }; + 9D76CF3D1625A4C50008A0F6 /* CDVGlobalization.m in Sources */ = {isa = PBXBuildFile; fileRef = 9D76CF3B1625A4C50008A0F6 /* CDVGlobalization.m */; }; + C937A4561337599E002C4C79 /* CDVFileTransfer.h in Headers */ = {isa = PBXBuildFile; fileRef = C937A4541337599E002C4C79 /* CDVFileTransfer.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C937A4571337599E002C4C79 /* CDVFileTransfer.m in Sources */ = {isa = PBXBuildFile; fileRef = C937A4551337599E002C4C79 /* CDVFileTransfer.m */; }; + EB3B3547161CB44D003DBE7D /* CDVCommandQueue.h in Headers */ = {isa = PBXBuildFile; fileRef = EB3B3545161CB44D003DBE7D /* CDVCommandQueue.h */; }; + EB3B3548161CB44D003DBE7D /* CDVCommandQueue.m in Sources */ = {isa = PBXBuildFile; fileRef = EB3B3546161CB44D003DBE7D /* CDVCommandQueue.m */; }; + EB3B357C161F2A45003DBE7D /* CDVCommandDelegateImpl.h in Headers */ = {isa = PBXBuildFile; fileRef = EB3B357A161F2A44003DBE7D /* CDVCommandDelegateImpl.h */; }; + EB3B357D161F2A45003DBE7D /* CDVCommandDelegateImpl.m in Sources */ = {isa = PBXBuildFile; fileRef = EB3B357B161F2A45003DBE7D /* CDVCommandDelegateImpl.m */; }; + EB80C2AC15DEA63D004D9E7B /* CDVEcho.h in Headers */ = {isa = PBXBuildFile; fileRef = EB80C2AA15DEA63D004D9E7B /* CDVEcho.h */; }; + EB80C2AD15DEA63D004D9E7B /* CDVEcho.m in Sources */ = {isa = PBXBuildFile; fileRef = EB80C2AB15DEA63D004D9E7B /* CDVEcho.m */; }; + EBA3557315ABD38C00F4DE24 /* NSArray+Comparisons.h in Headers */ = {isa = PBXBuildFile; fileRef = EBA3557115ABD38C00F4DE24 /* NSArray+Comparisons.h */; settings = {ATTRIBUTES = (Public, ); }; }; + EBA3557515ABD38C00F4DE24 /* NSArray+Comparisons.m in Sources */ = {isa = PBXBuildFile; fileRef = EBA3557215ABD38C00F4DE24 /* NSArray+Comparisons.m */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 1F2BECBE13F9785B00A93BF6 /* CDVBattery.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDVBattery.h; path = Classes/CDVBattery.h; sourceTree = ""; }; + 1F2BECBF13F9785B00A93BF6 /* CDVBattery.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CDVBattery.m; path = Classes/CDVBattery.m; sourceTree = ""; }; + 1F3C04CC12BC247D004F9E10 /* CDVContact.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDVContact.h; path = Classes/CDVContact.h; sourceTree = ""; }; + 1F3C04CD12BC247D004F9E10 /* CDVContact.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CDVContact.m; path = Classes/CDVContact.m; sourceTree = ""; }; + 1F584B991385A28900ED25E8 /* CDVCapture.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDVCapture.h; path = Classes/CDVCapture.h; sourceTree = ""; }; + 1F584B9A1385A28900ED25E8 /* CDVCapture.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CDVCapture.m; path = Classes/CDVCapture.m; sourceTree = ""; }; + 1F92F49E1314023E0046367C /* CDVPluginResult.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDVPluginResult.h; path = Classes/CDVPluginResult.h; sourceTree = ""; }; + 1F92F49F1314023E0046367C /* CDVPluginResult.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CDVPluginResult.m; path = Classes/CDVPluginResult.m; sourceTree = ""; }; + 301F2F2914F3C9CA003FE9FC /* CDV.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDV.h; path = Classes/CDV.h; sourceTree = ""; }; + 302965BB13A94E9D007046C5 /* CDVDebug.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDVDebug.h; path = Classes/CDVDebug.h; sourceTree = ""; }; + 30325A0B136B343700982B63 /* VERSION */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = VERSION; sourceTree = ""; }; + 3034979A1513D56A0090E688 /* CDVLocalStorage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDVLocalStorage.h; path = Classes/CDVLocalStorage.h; sourceTree = ""; }; + 3034979B1513D56A0090E688 /* CDVLocalStorage.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CDVLocalStorage.m; path = Classes/CDVLocalStorage.m; sourceTree = ""; }; + 30392E4D14F4FCAB00B9E0B8 /* CDVAvailability.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDVAvailability.h; path = Classes/CDVAvailability.h; sourceTree = ""; }; + 3062D11E151D0EDB000D9128 /* UIDevice+Extensions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "UIDevice+Extensions.h"; path = "Classes/UIDevice+Extensions.h"; sourceTree = ""; }; + 3062D11F151D0EDB000D9128 /* UIDevice+Extensions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "UIDevice+Extensions.m"; path = "Classes/UIDevice+Extensions.m"; sourceTree = ""; }; + 307A8F9C1385A2EC00E43782 /* CDVConnection.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDVConnection.h; path = Classes/CDVConnection.h; sourceTree = ""; }; + 307A8F9D1385A2EC00E43782 /* CDVConnection.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CDVConnection.m; path = Classes/CDVConnection.m; sourceTree = ""; }; + 30A90B8F14588697006178D3 /* JSONKit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSONKit.h; sourceTree = ""; }; + 30A90B9014588697006178D3 /* JSONKit.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSONKit.m; sourceTree = ""; }; + 30B39EBC13D0268B0009682A /* CDVSplashScreen.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDVSplashScreen.h; path = Classes/CDVSplashScreen.h; sourceTree = ""; }; + 30B39EBD13D0268B0009682A /* CDVSplashScreen.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CDVSplashScreen.m; path = Classes/CDVSplashScreen.m; sourceTree = ""; }; + 30C5F1DD15AF9E950052A00D /* CDVDevice.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDVDevice.h; path = Classes/CDVDevice.h; sourceTree = ""; }; + 30C5F1DE15AF9E950052A00D /* CDVDevice.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CDVDevice.m; path = Classes/CDVDevice.m; sourceTree = ""; }; + 30C6847E1406CB38004C1A8E /* CDVWhitelist.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDVWhitelist.h; path = Classes/CDVWhitelist.h; sourceTree = ""; }; + 30C6847F1406CB38004C1A8E /* CDVWhitelist.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CDVWhitelist.m; path = Classes/CDVWhitelist.m; sourceTree = ""; }; + 30C684921407044A004C1A8E /* CDVURLProtocol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDVURLProtocol.h; path = Classes/CDVURLProtocol.h; sourceTree = ""; }; + 30C684931407044A004C1A8E /* CDVURLProtocol.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CDVURLProtocol.m; path = Classes/CDVURLProtocol.m; sourceTree = ""; }; + 30E33AF013A7E24B00594D64 /* CDVPlugin.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDVPlugin.h; path = Classes/CDVPlugin.h; sourceTree = ""; }; + 30E33AF113A7E24B00594D64 /* CDVPlugin.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CDVPlugin.m; path = Classes/CDVPlugin.m; sourceTree = ""; }; + 30E563CD13E217EC00C949AA /* NSMutableArray+QueueAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "NSMutableArray+QueueAdditions.h"; path = "Classes/NSMutableArray+QueueAdditions.h"; sourceTree = ""; }; + 30E563CE13E217EC00C949AA /* NSMutableArray+QueueAdditions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "NSMutableArray+QueueAdditions.m"; path = "Classes/NSMutableArray+QueueAdditions.m"; sourceTree = ""; }; + 30F5EBA914CA26E700987760 /* CDVCommandDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDVCommandDelegate.h; path = Classes/CDVCommandDelegate.h; sourceTree = ""; }; + 3E76876B156A90EE00EB6FA3 /* CDVLogger.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CDVLogger.m; path = Classes/CDVLogger.m; sourceTree = ""; }; + 3E76876C156A90EE00EB6FA3 /* CDVLogger.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDVLogger.h; path = Classes/CDVLogger.h; sourceTree = ""; }; + 686357AA141002F100DF4CF2 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; + 686357AC141002F100DF4CF2 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; + 686357AE141002F100DF4CF2 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; + 686357CC14100AAD00DF4CF2 /* AddressBookUI.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AddressBookUI.framework; path = System/Library/Frameworks/AddressBookUI.framework; sourceTree = SDKROOT; }; + 686357CE14100ADA00DF4CF2 /* AudioToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = System/Library/Frameworks/AudioToolbox.framework; sourceTree = SDKROOT; }; + 686357CF14100ADB00DF4CF2 /* AVFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVFoundation.framework; path = System/Library/Frameworks/AVFoundation.framework; sourceTree = SDKROOT; }; + 686357D014100ADE00DF4CF2 /* CoreLocation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreLocation.framework; path = System/Library/Frameworks/CoreLocation.framework; sourceTree = SDKROOT; }; + 686357D214100AE700DF4CF2 /* MobileCoreServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MobileCoreServices.framework; path = System/Library/Frameworks/MobileCoreServices.framework; sourceTree = SDKROOT; }; + 686357D414100AF200DF4CF2 /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = System/Library/Frameworks/SystemConfiguration.framework; sourceTree = SDKROOT; }; + 686357DC14100B1600DF4CF2 /* CoreMedia.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMedia.framework; path = System/Library/Frameworks/CoreMedia.framework; sourceTree = SDKROOT; }; + 68A32D7114102E1C006B237C /* libCordova.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libCordova.a; sourceTree = BUILT_PRODUCTS_DIR; }; + 68A32D7414103017006B237C /* AddressBook.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AddressBook.framework; path = System/Library/Frameworks/AddressBook.framework; sourceTree = SDKROOT; }; + 8852C43614B65FD800F0E735 /* CDVViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDVViewController.h; path = Classes/CDVViewController.h; sourceTree = ""; }; + 8852C43714B65FD800F0E735 /* CDVViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CDVViewController.m; path = Classes/CDVViewController.m; sourceTree = ""; }; + 8852C43814B65FD800F0E735 /* CDVCordovaView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDVCordovaView.h; path = Classes/CDVCordovaView.h; sourceTree = ""; }; + 8852C43914B65FD800F0E735 /* CDVCordovaView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CDVCordovaView.m; path = Classes/CDVCordovaView.m; sourceTree = ""; }; + 8887FD261090FBE7009987E8 /* CDVCamera.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDVCamera.h; path = Classes/CDVCamera.h; sourceTree = ""; }; + 8887FD271090FBE7009987E8 /* CDVCamera.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CDVCamera.m; path = Classes/CDVCamera.m; sourceTree = ""; }; + 8887FD281090FBE7009987E8 /* NSDictionary+Extensions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "NSDictionary+Extensions.h"; path = "Classes/NSDictionary+Extensions.h"; sourceTree = ""; }; + 8887FD291090FBE7009987E8 /* NSDictionary+Extensions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "NSDictionary+Extensions.m"; path = "Classes/NSDictionary+Extensions.m"; sourceTree = ""; }; + 8887FD2A1090FBE7009987E8 /* CDVContacts.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDVContacts.h; path = Classes/CDVContacts.h; sourceTree = ""; }; + 8887FD2B1090FBE7009987E8 /* CDVContacts.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CDVContacts.m; path = Classes/CDVContacts.m; sourceTree = ""; }; + 8887FD2C1090FBE7009987E8 /* CDVDebugConsole.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDVDebugConsole.h; path = Classes/CDVDebugConsole.h; sourceTree = ""; }; + 8887FD2D1090FBE7009987E8 /* CDVDebugConsole.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CDVDebugConsole.m; path = Classes/CDVDebugConsole.m; sourceTree = ""; }; + 8887FD301090FBE7009987E8 /* CDVFile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDVFile.h; path = Classes/CDVFile.h; sourceTree = ""; }; + 8887FD311090FBE7009987E8 /* CDVFile.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CDVFile.m; path = Classes/CDVFile.m; sourceTree = ""; }; + 8887FD341090FBE7009987E8 /* CDVInvokedUrlCommand.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDVInvokedUrlCommand.h; path = Classes/CDVInvokedUrlCommand.h; sourceTree = ""; }; + 8887FD351090FBE7009987E8 /* CDVInvokedUrlCommand.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CDVInvokedUrlCommand.m; path = Classes/CDVInvokedUrlCommand.m; sourceTree = ""; }; + 8887FD461090FBE7009987E8 /* CDVLocation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDVLocation.h; path = Classes/CDVLocation.h; sourceTree = ""; }; + 8887FD471090FBE7009987E8 /* CDVLocation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CDVLocation.m; path = Classes/CDVLocation.m; sourceTree = ""; }; + 8887FD4E1090FBE7009987E8 /* CDVNotification.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDVNotification.h; path = Classes/CDVNotification.h; sourceTree = ""; }; + 8887FD4F1090FBE7009987E8 /* CDVNotification.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CDVNotification.m; path = Classes/CDVNotification.m; sourceTree = ""; }; + 8887FD501090FBE7009987E8 /* NSData+Base64.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "NSData+Base64.h"; path = "Classes/NSData+Base64.h"; sourceTree = ""; }; + 8887FD511090FBE7009987E8 /* NSData+Base64.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "NSData+Base64.m"; path = "Classes/NSData+Base64.m"; sourceTree = ""; }; + 8887FD5E1090FBE7009987E8 /* CDVReachability.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDVReachability.h; path = Classes/CDVReachability.h; sourceTree = ""; }; + 8887FD5F1090FBE7009987E8 /* CDVReachability.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CDVReachability.m; path = Classes/CDVReachability.m; sourceTree = ""; }; + 8887FD601090FBE7009987E8 /* CDVSound.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDVSound.h; path = Classes/CDVSound.h; sourceTree = ""; }; + 8887FD611090FBE7009987E8 /* CDVSound.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CDVSound.m; path = Classes/CDVSound.m; sourceTree = ""; }; + 88BA573B109BB46F00FB5E78 /* CDVAccelerometer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDVAccelerometer.h; path = Classes/CDVAccelerometer.h; sourceTree = ""; }; + 88BA573C109BB46F00FB5E78 /* CDVAccelerometer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CDVAccelerometer.m; path = Classes/CDVAccelerometer.m; sourceTree = ""; }; + 9D76CF3A1625A4C50008A0F6 /* CDVGlobalization.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDVGlobalization.h; path = Classes/CDVGlobalization.h; sourceTree = ""; }; + 9D76CF3B1625A4C50008A0F6 /* CDVGlobalization.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CDVGlobalization.m; path = Classes/CDVGlobalization.m; sourceTree = ""; }; + AA747D9E0F9514B9006C5449 /* CordovaLib_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CordovaLib_Prefix.pch; sourceTree = SOURCE_ROOT; }; + C937A4541337599E002C4C79 /* CDVFileTransfer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDVFileTransfer.h; path = Classes/CDVFileTransfer.h; sourceTree = ""; }; + C937A4551337599E002C4C79 /* CDVFileTransfer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CDVFileTransfer.m; path = Classes/CDVFileTransfer.m; sourceTree = ""; }; + EB3B3545161CB44D003DBE7D /* CDVCommandQueue.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDVCommandQueue.h; path = Classes/CDVCommandQueue.h; sourceTree = ""; }; + EB3B3546161CB44D003DBE7D /* CDVCommandQueue.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CDVCommandQueue.m; path = Classes/CDVCommandQueue.m; sourceTree = ""; }; + EB3B357A161F2A44003DBE7D /* CDVCommandDelegateImpl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDVCommandDelegateImpl.h; path = Classes/CDVCommandDelegateImpl.h; sourceTree = ""; }; + EB3B357B161F2A45003DBE7D /* CDVCommandDelegateImpl.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CDVCommandDelegateImpl.m; path = Classes/CDVCommandDelegateImpl.m; sourceTree = ""; }; + EB80C2AA15DEA63D004D9E7B /* CDVEcho.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDVEcho.h; path = Classes/CDVEcho.h; sourceTree = ""; }; + EB80C2AB15DEA63D004D9E7B /* CDVEcho.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CDVEcho.m; path = Classes/CDVEcho.m; sourceTree = ""; }; + EBA3557115ABD38C00F4DE24 /* NSArray+Comparisons.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "NSArray+Comparisons.h"; path = "Classes/NSArray+Comparisons.h"; sourceTree = ""; }; + EBA3557215ABD38C00F4DE24 /* NSArray+Comparisons.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "NSArray+Comparisons.m"; path = "Classes/NSArray+Comparisons.m"; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + D2AAC07C0554694100DB518D /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 034768DFFF38A50411DB9C8B /* Products */ = { + isa = PBXGroup; + children = ( + 68A32D7114102E1C006B237C /* libCordova.a */, + ); + name = Products; + sourceTree = CORDOVALIB; + }; + 0867D691FE84028FC02AAC07 /* CordovaLib */ = { + isa = PBXGroup; + children = ( + 8887FD101090FB43009987E8 /* Classes */, + 32C88DFF0371C24200C91783 /* Other Sources */, + 0867D69AFE84028FC02AAC07 /* Frameworks */, + 034768DFFF38A50411DB9C8B /* Products */, + 30325A0B136B343700982B63 /* VERSION */, + ); + name = CordovaLib; + sourceTree = ""; + }; + 0867D69AFE84028FC02AAC07 /* Frameworks */ = { + isa = PBXGroup; + children = ( + 68A32D7414103017006B237C /* AddressBook.framework */, + 686357DC14100B1600DF4CF2 /* CoreMedia.framework */, + 686357CE14100ADA00DF4CF2 /* AudioToolbox.framework */, + 686357CF14100ADB00DF4CF2 /* AVFoundation.framework */, + 686357D014100ADE00DF4CF2 /* CoreLocation.framework */, + 686357D214100AE700DF4CF2 /* MobileCoreServices.framework */, + 686357D414100AF200DF4CF2 /* SystemConfiguration.framework */, + 686357CC14100AAD00DF4CF2 /* AddressBookUI.framework */, + 686357AA141002F100DF4CF2 /* UIKit.framework */, + 686357AC141002F100DF4CF2 /* Foundation.framework */, + 686357AE141002F100DF4CF2 /* CoreGraphics.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; + 3054098714B77FF3009841CA /* Cleaver */ = { + isa = PBXGroup; + children = ( + 8852C43614B65FD800F0E735 /* CDVViewController.h */, + 8852C43714B65FD800F0E735 /* CDVViewController.m */, + 8852C43814B65FD800F0E735 /* CDVCordovaView.h */, + 8852C43914B65FD800F0E735 /* CDVCordovaView.m */, + EB3B3545161CB44D003DBE7D /* CDVCommandQueue.h */, + EB3B3546161CB44D003DBE7D /* CDVCommandQueue.m */, + ); + name = Cleaver; + sourceTree = ""; + }; + 32C88DFF0371C24200C91783 /* Other Sources */ = { + isa = PBXGroup; + children = ( + AA747D9E0F9514B9006C5449 /* CordovaLib_Prefix.pch */, + ); + name = "Other Sources"; + sourceTree = ""; + }; + 888700D710922F56009987E8 /* Commands */ = { + isa = PBXGroup; + children = ( + 30C5F1DD15AF9E950052A00D /* CDVDevice.h */, + 30C5F1DE15AF9E950052A00D /* CDVDevice.m */, + 301F2F2914F3C9CA003FE9FC /* CDV.h */, + 3034979A1513D56A0090E688 /* CDVLocalStorage.h */, + 3034979B1513D56A0090E688 /* CDVLocalStorage.m */, + 30392E4D14F4FCAB00B9E0B8 /* CDVAvailability.h */, + 30F5EBA914CA26E700987760 /* CDVCommandDelegate.h */, + EB3B357A161F2A44003DBE7D /* CDVCommandDelegateImpl.h */, + EB3B357B161F2A45003DBE7D /* CDVCommandDelegateImpl.m */, + 30C684921407044A004C1A8E /* CDVURLProtocol.h */, + 30C684931407044A004C1A8E /* CDVURLProtocol.m */, + 30C6847E1406CB38004C1A8E /* CDVWhitelist.h */, + 30C6847F1406CB38004C1A8E /* CDVWhitelist.m */, + 1F2BECBE13F9785B00A93BF6 /* CDVBattery.h */, + 1F2BECBF13F9785B00A93BF6 /* CDVBattery.m */, + 30B39EBC13D0268B0009682A /* CDVSplashScreen.h */, + 30B39EBD13D0268B0009682A /* CDVSplashScreen.m */, + 30E33AF013A7E24B00594D64 /* CDVPlugin.h */, + 30E33AF113A7E24B00594D64 /* CDVPlugin.m */, + 307A8F9C1385A2EC00E43782 /* CDVConnection.h */, + 307A8F9D1385A2EC00E43782 /* CDVConnection.m */, + 1F92F49E1314023E0046367C /* CDVPluginResult.h */, + 1F92F49F1314023E0046367C /* CDVPluginResult.m */, + 88BA573B109BB46F00FB5E78 /* CDVAccelerometer.h */, + 88BA573C109BB46F00FB5E78 /* CDVAccelerometer.m */, + 8887FD261090FBE7009987E8 /* CDVCamera.h */, + 8887FD271090FBE7009987E8 /* CDVCamera.m */, + 1F584B991385A28900ED25E8 /* CDVCapture.h */, + 1F584B9A1385A28900ED25E8 /* CDVCapture.m */, + 1F3C04CC12BC247D004F9E10 /* CDVContact.h */, + 1F3C04CD12BC247D004F9E10 /* CDVContact.m */, + 8887FD2A1090FBE7009987E8 /* CDVContacts.h */, + 8887FD2B1090FBE7009987E8 /* CDVContacts.m */, + 8887FD2C1090FBE7009987E8 /* CDVDebugConsole.h */, + 8887FD2D1090FBE7009987E8 /* CDVDebugConsole.m */, + EB80C2AA15DEA63D004D9E7B /* CDVEcho.h */, + EB80C2AB15DEA63D004D9E7B /* CDVEcho.m */, + 8887FD301090FBE7009987E8 /* CDVFile.h */, + 8887FD311090FBE7009987E8 /* CDVFile.m */, + 8887FD341090FBE7009987E8 /* CDVInvokedUrlCommand.h */, + 8887FD351090FBE7009987E8 /* CDVInvokedUrlCommand.m */, + C937A4541337599E002C4C79 /* CDVFileTransfer.h */, + C937A4551337599E002C4C79 /* CDVFileTransfer.m */, + 8887FD461090FBE7009987E8 /* CDVLocation.h */, + 8887FD471090FBE7009987E8 /* CDVLocation.m */, + 8887FD4E1090FBE7009987E8 /* CDVNotification.h */, + 8887FD4F1090FBE7009987E8 /* CDVNotification.m */, + 8887FD5E1090FBE7009987E8 /* CDVReachability.h */, + 8887FD5F1090FBE7009987E8 /* CDVReachability.m */, + 8887FD601090FBE7009987E8 /* CDVSound.h */, + 8887FD611090FBE7009987E8 /* CDVSound.m */, + 3E76876B156A90EE00EB6FA3 /* CDVLogger.m */, + 3E76876C156A90EE00EB6FA3 /* CDVLogger.h */, + 9D76CF3A1625A4C50008A0F6 /* CDVGlobalization.h */, + 9D76CF3B1625A4C50008A0F6 /* CDVGlobalization.m */, + ); + name = Commands; + sourceTree = ""; + }; + 888700D910923009009987E8 /* Util */ = { + isa = PBXGroup; + children = ( + 3062D11E151D0EDB000D9128 /* UIDevice+Extensions.h */, + 3062D11F151D0EDB000D9128 /* UIDevice+Extensions.m */, + EBA3557115ABD38C00F4DE24 /* NSArray+Comparisons.h */, + EBA3557215ABD38C00F4DE24 /* NSArray+Comparisons.m */, + 8887FD281090FBE7009987E8 /* NSDictionary+Extensions.h */, + 8887FD291090FBE7009987E8 /* NSDictionary+Extensions.m */, + 302965BB13A94E9D007046C5 /* CDVDebug.h */, + 30E563CD13E217EC00C949AA /* NSMutableArray+QueueAdditions.h */, + 30E563CE13E217EC00C949AA /* NSMutableArray+QueueAdditions.m */, + 8887FD501090FBE7009987E8 /* NSData+Base64.h */, + 8887FD511090FBE7009987E8 /* NSData+Base64.m */, + ); + name = Util; + sourceTree = ""; + }; + 8887FD101090FB43009987E8 /* Classes */ = { + isa = PBXGroup; + children = ( + 3054098714B77FF3009841CA /* Cleaver */, + 888700D710922F56009987E8 /* Commands */, + 8887FD361090FBE7009987E8 /* JSON */, + 888700D910923009009987E8 /* Util */, + ); + name = Classes; + sourceTree = ""; + }; + 8887FD361090FBE7009987E8 /* JSON */ = { + isa = PBXGroup; + children = ( + 30A90B8F14588697006178D3 /* JSONKit.h */, + 30A90B9014588697006178D3 /* JSONKit.m */, + ); + name = JSON; + path = Classes/JSON; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + D2AAC07A0554694100DB518D /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 8887FD661090FBE7009987E8 /* CDVCamera.h in Headers */, + 8887FD681090FBE7009987E8 /* NSDictionary+Extensions.h in Headers */, + 8887FD6A1090FBE7009987E8 /* CDVContacts.h in Headers */, + 8887FD6C1090FBE7009987E8 /* CDVDebugConsole.h in Headers */, + 8887FD701090FBE7009987E8 /* CDVFile.h in Headers */, + 8887FD741090FBE7009987E8 /* CDVInvokedUrlCommand.h in Headers */, + 8887FD851090FBE7009987E8 /* CDVLocation.h in Headers */, + 8887FD8D1090FBE7009987E8 /* CDVNotification.h in Headers */, + 8887FD8F1090FBE7009987E8 /* NSData+Base64.h in Headers */, + 8887FD9D1090FBE7009987E8 /* CDVReachability.h in Headers */, + 8887FD9F1090FBE7009987E8 /* CDVSound.h in Headers */, + 88BA573D109BB46F00FB5E78 /* CDVAccelerometer.h in Headers */, + 1F3C04CE12BC247D004F9E10 /* CDVContact.h in Headers */, + 1F92F4A01314023E0046367C /* CDVPluginResult.h in Headers */, + C937A4561337599E002C4C79 /* CDVFileTransfer.h in Headers */, + 307A8F9E1385A2EC00E43782 /* CDVConnection.h in Headers */, + 1F584B9B1385A28A00ED25E8 /* CDVCapture.h in Headers */, + 30E33AF213A7E24B00594D64 /* CDVPlugin.h in Headers */, + 302965BC13A94E9D007046C5 /* CDVDebug.h in Headers */, + 30B39EBE13D0268B0009682A /* CDVSplashScreen.h in Headers */, + 30E563CF13E217EC00C949AA /* NSMutableArray+QueueAdditions.h in Headers */, + 1F2BECC013F9785B00A93BF6 /* CDVBattery.h in Headers */, + 30C684801406CB38004C1A8E /* CDVWhitelist.h in Headers */, + 30C684941407044B004C1A8E /* CDVURLProtocol.h in Headers */, + 30A90B9114588697006178D3 /* JSONKit.h in Headers */, + 8852C43A14B65FD800F0E735 /* CDVViewController.h in Headers */, + 8852C43F14B65FD800F0E735 /* CDVCordovaView.h in Headers */, + 30F5EBAB14CA26E700987760 /* CDVCommandDelegate.h in Headers */, + 301F2F2A14F3C9CA003FE9FC /* CDV.h in Headers */, + 30392E4E14F4FCAB00B9E0B8 /* CDVAvailability.h in Headers */, + 3034979C1513D56A0090E688 /* CDVLocalStorage.h in Headers */, + 3062D120151D0EDB000D9128 /* UIDevice+Extensions.h in Headers */, + 3E76876F156A90EE00EB6FA3 /* CDVLogger.h in Headers */, + EBA3557315ABD38C00F4DE24 /* NSArray+Comparisons.h in Headers */, + 30C5F1DF15AF9E950052A00D /* CDVDevice.h in Headers */, + EB80C2AC15DEA63D004D9E7B /* CDVEcho.h in Headers */, + EB3B3547161CB44D003DBE7D /* CDVCommandQueue.h in Headers */, + EB3B357C161F2A45003DBE7D /* CDVCommandDelegateImpl.h in Headers */, + 9D76CF3C1625A4C50008A0F6 /* CDVGlobalization.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + D2AAC07D0554694100DB518D /* CordovaLib */ = { + isa = PBXNativeTarget; + buildConfigurationList = 1DEB921E08733DC00010E9CD /* Build configuration list for PBXNativeTarget "CordovaLib" */; + buildPhases = ( + D2AAC07A0554694100DB518D /* Headers */, + D2AAC07B0554694100DB518D /* Sources */, + D2AAC07C0554694100DB518D /* Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = CordovaLib; + productName = CordovaLib; + productReference = 68A32D7114102E1C006B237C /* libCordova.a */; + productType = "com.apple.product-type.library.static"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 0867D690FE84028FC02AAC07 /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 0430; + }; + buildConfigurationList = 1DEB922208733DC00010E9CD /* Build configuration list for PBXProject "CordovaLib" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 1; + knownRegions = ( + English, + Japanese, + French, + German, + en, + ); + mainGroup = 0867D691FE84028FC02AAC07 /* CordovaLib */; + productRefGroup = 034768DFFF38A50411DB9C8B /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + D2AAC07D0554694100DB518D /* CordovaLib */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXSourcesBuildPhase section */ + D2AAC07B0554694100DB518D /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 8887FD671090FBE7009987E8 /* CDVCamera.m in Sources */, + 8887FD691090FBE7009987E8 /* NSDictionary+Extensions.m in Sources */, + 8887FD6B1090FBE7009987E8 /* CDVContacts.m in Sources */, + 8887FD6D1090FBE7009987E8 /* CDVDebugConsole.m in Sources */, + 8887FD711090FBE7009987E8 /* CDVFile.m in Sources */, + 8887FD751090FBE7009987E8 /* CDVInvokedUrlCommand.m in Sources */, + 8887FD861090FBE7009987E8 /* CDVLocation.m in Sources */, + 8887FD8E1090FBE7009987E8 /* CDVNotification.m in Sources */, + 8887FD901090FBE7009987E8 /* NSData+Base64.m in Sources */, + 8887FD9E1090FBE7009987E8 /* CDVReachability.m in Sources */, + 8887FDA01090FBE7009987E8 /* CDVSound.m in Sources */, + 88BA573E109BB46F00FB5E78 /* CDVAccelerometer.m in Sources */, + 1F3C04CF12BC247D004F9E10 /* CDVContact.m in Sources */, + 1F92F4A11314023E0046367C /* CDVPluginResult.m in Sources */, + C937A4571337599E002C4C79 /* CDVFileTransfer.m in Sources */, + 307A8F9F1385A2EC00E43782 /* CDVConnection.m in Sources */, + 1F584B9C1385A28A00ED25E8 /* CDVCapture.m in Sources */, + 30E33AF313A7E24B00594D64 /* CDVPlugin.m in Sources */, + 30B39EBF13D0268B0009682A /* CDVSplashScreen.m in Sources */, + 30E563D013E217EC00C949AA /* NSMutableArray+QueueAdditions.m in Sources */, + 1F2BECC113F9785B00A93BF6 /* CDVBattery.m in Sources */, + 30C684821406CB38004C1A8E /* CDVWhitelist.m in Sources */, + 30C684961407044B004C1A8E /* CDVURLProtocol.m in Sources */, + 30A90B9314588697006178D3 /* JSONKit.m in Sources */, + 8852C43C14B65FD800F0E735 /* CDVViewController.m in Sources */, + 8852C44114B65FD800F0E735 /* CDVCordovaView.m in Sources */, + 3034979E1513D56A0090E688 /* CDVLocalStorage.m in Sources */, + 3062D122151D0EDB000D9128 /* UIDevice+Extensions.m in Sources */, + 3E76876D156A90EE00EB6FA3 /* CDVLogger.m in Sources */, + EBA3557515ABD38C00F4DE24 /* NSArray+Comparisons.m in Sources */, + 30C5F1E015AF9E950052A00D /* CDVDevice.m in Sources */, + EB80C2AD15DEA63D004D9E7B /* CDVEcho.m in Sources */, + EB3B3548161CB44D003DBE7D /* CDVCommandQueue.m in Sources */, + EB3B357D161F2A45003DBE7D /* CDVCommandDelegateImpl.m in Sources */, + 9D76CF3D1625A4C50008A0F6 /* CDVGlobalization.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + 1DEB921F08733DC00010E9CD /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + "ARCHS[sdk=iphoneos*]" = ( + armv6, + armv7, + ); + "ARCHS[sdk=iphoneos6.*]" = ( + armv7, + armv7s, + ); + "ARCHS[sdk=iphonesimulator*]" = i386; + CLANG_ENABLE_OBJC_ARC = YES; + COPY_PHASE_STRIP = NO; + DSTROOT = "/tmp/$(PROJECT_NAME).dst"; + GCC_DYNAMIC_NO_PIC = NO; + GCC_MODEL_TUNING = G5; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = CordovaLib_Prefix.pch; + GCC_PREPROCESSOR_DEFINITIONS = ""; + GCC_THUMB_SUPPORT = NO; + GCC_VERSION = com.apple.compilers.llvm.clang.1_0; + INSTALL_PATH = /usr/local/lib; + IPHONEOS_DEPLOYMENT_TARGET = 4.2; + PRODUCT_NAME = Cordova; + PUBLIC_HEADERS_FOLDER_PATH = include/Cordova; + SKIP_INSTALL = YES; + }; + name = Debug; + }; + 1DEB922008733DC00010E9CD /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + "ARCHS[sdk=iphoneos*]" = ( + armv6, + armv7, + ); + "ARCHS[sdk=iphoneos6.*]" = ( + armv7, + armv7s, + ); + "ARCHS[sdk=iphonesimulator*]" = i386; + CLANG_ENABLE_OBJC_ARC = YES; + DSTROOT = "/tmp/$(PROJECT_NAME).dst"; + GCC_MODEL_TUNING = G5; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = CordovaLib_Prefix.pch; + GCC_PREPROCESSOR_DEFINITIONS = ""; + GCC_THUMB_SUPPORT = NO; + GCC_VERSION = com.apple.compilers.llvm.clang.1_0; + INSTALL_PATH = /usr/local/lib; + IPHONEOS_DEPLOYMENT_TARGET = 4.2; + PRODUCT_NAME = Cordova; + PUBLIC_HEADERS_FOLDER_PATH = include/Cordova; + SKIP_INSTALL = YES; + }; + name = Release; + }; + 1DEB922308733DC00010E9CD /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + "ARCHS[sdk=iphoneos*]" = ( + armv6, + armv7, + ); + "ARCHS[sdk=iphoneos6.*]" = ( + armv7, + armv7s, + ); + "ARCHS[sdk=iphonesimulator*]" = i386; + GCC_C_LANGUAGE_STANDARD = c99; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ""; + GCC_THUMB_SUPPORT = NO; + GCC_VERSION = com.apple.compilers.llvm.clang.1_0; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 4.2; + ONLY_ACTIVE_ARCH = NO; + OTHER_CFLAGS = "-DDEBUG"; + PUBLIC_HEADERS_FOLDER_PATH = include/Cordova; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + USER_HEADER_SEARCH_PATHS = ""; + VALID_ARCHS = "i386 armv6 armv7 armv7s"; + }; + name = Debug; + }; + 1DEB922408733DC00010E9CD /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + "ARCHS[sdk=iphoneos*]" = ( + armv6, + armv7, + ); + "ARCHS[sdk=iphoneos6.*]" = ( + armv7, + armv7s, + ); + "ARCHS[sdk=iphonesimulator*]" = i386; + GCC_C_LANGUAGE_STANDARD = c99; + GCC_PREPROCESSOR_DEFINITIONS = ""; + GCC_THUMB_SUPPORT = NO; + GCC_VERSION = com.apple.compilers.llvm.clang.1_0; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 4.2; + ONLY_ACTIVE_ARCH = NO; + PUBLIC_HEADERS_FOLDER_PATH = include/Cordova; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VALID_ARCHS = "i386 armv6 armv7 armv7s"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 1DEB921E08733DC00010E9CD /* Build configuration list for PBXNativeTarget "CordovaLib" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 1DEB921F08733DC00010E9CD /* Debug */, + 1DEB922008733DC00010E9CD /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 1DEB922208733DC00010E9CD /* Build configuration list for PBXProject "CordovaLib" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 1DEB922308733DC00010E9CD /* Debug */, + 1DEB922408733DC00010E9CD /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 0867D690FE84028FC02AAC07 /* Project object */; +} diff --git a/cordova-lib/spec-plugman-install/projects/ios-plist/SampleApp.xcodeproj/project.orig.pbxproj b/cordova-lib/spec-plugman-install/projects/ios-plist/SampleApp.xcodeproj/project.orig.pbxproj new file mode 100644 index 000000000..a4d87f9b4 --- /dev/null +++ b/cordova-lib/spec-plugman-install/projects/ios-plist/SampleApp.xcodeproj/project.orig.pbxproj @@ -0,0 +1,498 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 571A464014DB0A1B007FEAC7 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 571A463F14DB0A1B007FEAC7 /* Foundation.framework */; }; + 571A464214DB0A1B007FEAC7 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 571A464114DB0A1B007FEAC7 /* UIKit.framework */; }; + 571A464414DB0A1B007FEAC7 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 571A464314DB0A1B007FEAC7 /* CoreGraphics.framework */; }; + 571A464614DB0A1B007FEAC7 /* AddressBook.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 571A464514DB0A1B007FEAC7 /* AddressBook.framework */; }; + 571A464814DB0A1B007FEAC7 /* AddressBookUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 571A464714DB0A1B007FEAC7 /* AddressBookUI.framework */; }; + 571A464A14DB0A1B007FEAC7 /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 571A464914DB0A1B007FEAC7 /* AudioToolbox.framework */; }; + 571A464C14DB0A1B007FEAC7 /* AVFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 571A464B14DB0A1B007FEAC7 /* AVFoundation.framework */; }; + 571A464E14DB0A1B007FEAC7 /* CoreLocation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 571A464D14DB0A1B007FEAC7 /* CoreLocation.framework */; }; + 571A465014DB0A1B007FEAC7 /* MediaPlayer.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 571A464F14DB0A1B007FEAC7 /* MediaPlayer.framework */; }; + 571A465214DB0A1B007FEAC7 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 571A465114DB0A1B007FEAC7 /* QuartzCore.framework */; }; + 571A465414DB0A1B007FEAC7 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 571A465314DB0A1B007FEAC7 /* SystemConfiguration.framework */; }; + 571A465614DB0A1B007FEAC7 /* MobileCoreServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 571A465514DB0A1B007FEAC7 /* MobileCoreServices.framework */; }; + 571A465814DB0A1B007FEAC7 /* CoreMedia.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 571A465714DB0A1B007FEAC7 /* CoreMedia.framework */; }; + 571A465E14DB0A1B007FEAC7 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 571A465C14DB0A1B007FEAC7 /* InfoPlist.strings */; }; + 571A466014DB0A1B007FEAC7 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 571A465F14DB0A1B007FEAC7 /* main.m */; }; + 571A466314DB0A1B007FEAC7 /* PhoneGap.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 571A466214DB0A1B007FEAC7 /* PhoneGap.framework */; }; + 571A466814DB0A1B007FEAC7 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 571A466614DB0A1B007FEAC7 /* Localizable.strings */; }; + 571A466C14DB0A1B007FEAC7 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 571A466A14DB0A1B007FEAC7 /* Localizable.strings */; }; + 571A466F14DB0A1B007FEAC7 /* icon.png in Resources */ = {isa = PBXBuildFile; fileRef = 571A466E14DB0A1B007FEAC7 /* icon.png */; }; + 571A467114DB0A1B007FEAC7 /* icon@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 571A467014DB0A1B007FEAC7 /* icon@2x.png */; }; + 571A467314DB0A1B007FEAC7 /* icon-72.png in Resources */ = {isa = PBXBuildFile; fileRef = 571A467214DB0A1B007FEAC7 /* icon-72.png */; }; + 571A467614DB0A1B007FEAC7 /* Default.png in Resources */ = {isa = PBXBuildFile; fileRef = 571A467514DB0A1B007FEAC7 /* Default.png */; }; + 571A467814DB0A1B007FEAC7 /* Default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 571A467714DB0A1B007FEAC7 /* Default@2x.png */; }; + 571A467A14DB0A1B007FEAC7 /* Capture.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 571A467914DB0A1B007FEAC7 /* Capture.bundle */; }; + 571A467C14DB0A1B007FEAC7 /* PhoneGap.plist in Resources */ = {isa = PBXBuildFile; fileRef = 571A467B14DB0A1B007FEAC7 /* PhoneGap.plist */; }; + 571A468014DB0A1B007FEAC7 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 571A467F14DB0A1B007FEAC7 /* AppDelegate.m */; }; + 571A468314DB0A1B007FEAC7 /* MainViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 571A468214DB0A1B007FEAC7 /* MainViewController.m */; }; + 571A468514DB0A1B007FEAC7 /* MainViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 571A468414DB0A1B007FEAC7 /* MainViewController.xib */; }; + 577FC36614DB0B620082BA7B /* www in Resources */ = {isa = PBXBuildFile; fileRef = 577FC36514DB0B620082BA7B /* www */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 571A463B14DB0A1B007FEAC7 /* ChildApp.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = ChildApp.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 571A463F14DB0A1B007FEAC7 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; + 571A464114DB0A1B007FEAC7 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; + 571A464314DB0A1B007FEAC7 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; + 571A464514DB0A1B007FEAC7 /* AddressBook.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AddressBook.framework; path = System/Library/Frameworks/AddressBook.framework; sourceTree = SDKROOT; }; + 571A464714DB0A1B007FEAC7 /* AddressBookUI.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AddressBookUI.framework; path = System/Library/Frameworks/AddressBookUI.framework; sourceTree = SDKROOT; }; + 571A464914DB0A1B007FEAC7 /* AudioToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = System/Library/Frameworks/AudioToolbox.framework; sourceTree = SDKROOT; }; + 571A464B14DB0A1B007FEAC7 /* AVFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVFoundation.framework; path = System/Library/Frameworks/AVFoundation.framework; sourceTree = SDKROOT; }; + 571A464D14DB0A1B007FEAC7 /* CoreLocation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreLocation.framework; path = System/Library/Frameworks/CoreLocation.framework; sourceTree = SDKROOT; }; + 571A464F14DB0A1B007FEAC7 /* MediaPlayer.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MediaPlayer.framework; path = System/Library/Frameworks/MediaPlayer.framework; sourceTree = SDKROOT; }; + 571A465114DB0A1B007FEAC7 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; + 571A465314DB0A1B007FEAC7 /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = System/Library/Frameworks/SystemConfiguration.framework; sourceTree = SDKROOT; }; + 571A465514DB0A1B007FEAC7 /* MobileCoreServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MobileCoreServices.framework; path = System/Library/Frameworks/MobileCoreServices.framework; sourceTree = SDKROOT; }; + 571A465714DB0A1B007FEAC7 /* CoreMedia.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMedia.framework; path = System/Library/Frameworks/CoreMedia.framework; sourceTree = SDKROOT; }; + 571A465B14DB0A1B007FEAC7 /* ChildApp-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "ChildApp-Info.plist"; sourceTree = ""; }; + 571A465D14DB0A1B007FEAC7 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; + 571A465F14DB0A1B007FEAC7 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; + 571A466114DB0A1B007FEAC7 /* ChildApp-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "ChildApp-Prefix.pch"; sourceTree = ""; }; + 571A466214DB0A1B007FEAC7 /* PhoneGap.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = PhoneGap.framework; path = /Users/Shared/PhoneGap/Frameworks/PhoneGap.framework; sourceTree = ""; }; + 571A466714DB0A1B007FEAC7 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = Resources/en.lproj/Localizable.strings; sourceTree = ""; }; + 571A466B14DB0A1B007FEAC7 /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = Resources/es.lproj/Localizable.strings; sourceTree = ""; }; + 571A466E14DB0A1B007FEAC7 /* icon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = icon.png; path = Resources/icons/icon.png; sourceTree = ""; }; + 571A467014DB0A1B007FEAC7 /* icon@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "icon@2x.png"; path = "Resources/icons/icon@2x.png"; sourceTree = ""; }; + 571A467214DB0A1B007FEAC7 /* icon-72.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "icon-72.png"; path = "Resources/icons/icon-72.png"; sourceTree = ""; }; + 571A467514DB0A1B007FEAC7 /* Default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Default.png; path = Resources/splash/Default.png; sourceTree = ""; }; + 571A467714DB0A1B007FEAC7 /* Default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Default@2x.png"; path = "Resources/splash/Default@2x.png"; sourceTree = ""; }; + 571A467914DB0A1B007FEAC7 /* Capture.bundle */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.plug-in"; name = Capture.bundle; path = Resources/Capture.bundle; sourceTree = ""; }; + 571A467B14DB0A1B007FEAC7 /* PhoneGap.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = PhoneGap.plist; sourceTree = ""; }; + 571A467E14DB0A1B007FEAC7 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = AppDelegate.h; path = Classes/AppDelegate.h; sourceTree = ""; }; + 571A467F14DB0A1B007FEAC7 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = AppDelegate.m; path = Classes/AppDelegate.m; sourceTree = ""; }; + 571A468114DB0A1B007FEAC7 /* MainViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = MainViewController.h; path = Classes/MainViewController.h; sourceTree = ""; }; + 571A468214DB0A1B007FEAC7 /* MainViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = MainViewController.m; path = Classes/MainViewController.m; sourceTree = ""; }; + 571A468414DB0A1B007FEAC7 /* MainViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = MainViewController.xib; path = Classes/MainViewController.xib; sourceTree = ""; }; + 571A468714DB0A1B007FEAC7 /* README */ = {isa = PBXFileReference; lastKnownFileType = text; name = README; path = Plugins/README; sourceTree = ""; }; + 577FC36514DB0B620082BA7B /* www */ = {isa = PBXFileReference; lastKnownFileType = folder; path = www; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 571A463514DB0A1B007FEAC7 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 571A464014DB0A1B007FEAC7 /* Foundation.framework in Frameworks */, + 571A464214DB0A1B007FEAC7 /* UIKit.framework in Frameworks */, + 571A464414DB0A1B007FEAC7 /* CoreGraphics.framework in Frameworks */, + 571A464614DB0A1B007FEAC7 /* AddressBook.framework in Frameworks */, + 571A464814DB0A1B007FEAC7 /* AddressBookUI.framework in Frameworks */, + 571A464A14DB0A1B007FEAC7 /* AudioToolbox.framework in Frameworks */, + 571A464C14DB0A1B007FEAC7 /* AVFoundation.framework in Frameworks */, + 571A464E14DB0A1B007FEAC7 /* CoreLocation.framework in Frameworks */, + 571A465014DB0A1B007FEAC7 /* MediaPlayer.framework in Frameworks */, + 571A465214DB0A1B007FEAC7 /* QuartzCore.framework in Frameworks */, + 571A465414DB0A1B007FEAC7 /* SystemConfiguration.framework in Frameworks */, + 571A465614DB0A1B007FEAC7 /* MobileCoreServices.framework in Frameworks */, + 571A465814DB0A1B007FEAC7 /* CoreMedia.framework in Frameworks */, + 571A466314DB0A1B007FEAC7 /* PhoneGap.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 571A463814DB0A1B007FEAC7 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 571A462D14DB0A1A007FEAC7 = { + isa = PBXGroup; + children = ( + 577FC36514DB0B620082BA7B /* www */, + 571A465914DB0A1B007FEAC7 /* ChildApp */, + 571A463E14DB0A1B007FEAC7 /* Frameworks */, + 571A463C14DB0A1B007FEAC7 /* Products */, + ); + sourceTree = ""; + }; + 571A463C14DB0A1B007FEAC7 /* Products */ = { + isa = PBXGroup; + children = ( + 571A463B14DB0A1B007FEAC7 /* ChildApp.app */, + ); + name = Products; + sourceTree = ""; + }; + 571A463E14DB0A1B007FEAC7 /* Frameworks */ = { + isa = PBXGroup; + children = ( + 571A463F14DB0A1B007FEAC7 /* Foundation.framework */, + 571A464114DB0A1B007FEAC7 /* UIKit.framework */, + 571A464314DB0A1B007FEAC7 /* CoreGraphics.framework */, + 571A464514DB0A1B007FEAC7 /* AddressBook.framework */, + 571A464714DB0A1B007FEAC7 /* AddressBookUI.framework */, + 571A464914DB0A1B007FEAC7 /* AudioToolbox.framework */, + 571A464B14DB0A1B007FEAC7 /* AVFoundation.framework */, + 571A464D14DB0A1B007FEAC7 /* CoreLocation.framework */, + 571A464F14DB0A1B007FEAC7 /* MediaPlayer.framework */, + 571A465114DB0A1B007FEAC7 /* QuartzCore.framework */, + 571A465314DB0A1B007FEAC7 /* SystemConfiguration.framework */, + 571A465514DB0A1B007FEAC7 /* MobileCoreServices.framework */, + 571A465714DB0A1B007FEAC7 /* CoreMedia.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; + 571A465914DB0A1B007FEAC7 /* ChildApp */ = { + isa = PBXGroup; + children = ( + 571A466214DB0A1B007FEAC7 /* PhoneGap.framework */, + 571A466414DB0A1B007FEAC7 /* Resources */, + 571A467D14DB0A1B007FEAC7 /* Classes */, + 571A468614DB0A1B007FEAC7 /* Plugins */, + 571A465A14DB0A1B007FEAC7 /* Supporting Files */, + ); + path = ChildApp; + sourceTree = ""; + }; + 571A465A14DB0A1B007FEAC7 /* Supporting Files */ = { + isa = PBXGroup; + children = ( + 571A465B14DB0A1B007FEAC7 /* ChildApp-Info.plist */, + 571A465C14DB0A1B007FEAC7 /* InfoPlist.strings */, + 571A465F14DB0A1B007FEAC7 /* main.m */, + 571A466114DB0A1B007FEAC7 /* ChildApp-Prefix.pch */, + 571A467B14DB0A1B007FEAC7 /* PhoneGap.plist */, + 571A468414DB0A1B007FEAC7 /* MainViewController.xib */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; + 571A466414DB0A1B007FEAC7 /* Resources */ = { + isa = PBXGroup; + children = ( + 571A467914DB0A1B007FEAC7 /* Capture.bundle */, + 571A466514DB0A1B007FEAC7 /* en.lproj */, + 571A466914DB0A1B007FEAC7 /* es.lproj */, + 571A466D14DB0A1B007FEAC7 /* icons */, + 571A467414DB0A1B007FEAC7 /* splash */, + ); + name = Resources; + sourceTree = ""; + }; + 571A466514DB0A1B007FEAC7 /* en.lproj */ = { + isa = PBXGroup; + children = ( + 571A466614DB0A1B007FEAC7 /* Localizable.strings */, + ); + name = en.lproj; + sourceTree = ""; + }; + 571A466914DB0A1B007FEAC7 /* es.lproj */ = { + isa = PBXGroup; + children = ( + 571A466A14DB0A1B007FEAC7 /* Localizable.strings */, + ); + name = es.lproj; + sourceTree = ""; + }; + 571A466D14DB0A1B007FEAC7 /* icons */ = { + isa = PBXGroup; + children = ( + 571A466E14DB0A1B007FEAC7 /* icon.png */, + 571A467014DB0A1B007FEAC7 /* icon@2x.png */, + 571A467214DB0A1B007FEAC7 /* icon-72.png */, + ); + name = icons; + sourceTree = ""; + }; + 571A467414DB0A1B007FEAC7 /* splash */ = { + isa = PBXGroup; + children = ( + 571A467514DB0A1B007FEAC7 /* Default.png */, + 571A467714DB0A1B007FEAC7 /* Default@2x.png */, + ); + name = splash; + sourceTree = ""; + }; + 571A467D14DB0A1B007FEAC7 /* Classes */ = { + isa = PBXGroup; + children = ( + 571A467E14DB0A1B007FEAC7 /* AppDelegate.h */, + 571A467F14DB0A1B007FEAC7 /* AppDelegate.m */, + 571A468114DB0A1B007FEAC7 /* MainViewController.h */, + 571A468214DB0A1B007FEAC7 /* MainViewController.m */, + ); + name = Classes; + sourceTree = ""; + }; + 571A468614DB0A1B007FEAC7 /* Plugins */ = { + isa = PBXGroup; + children = ( + 571A468714DB0A1B007FEAC7 /* README */, + ); + name = Plugins; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 571A463A14DB0A1B007FEAC7 /* ChildApp */ = { + isa = PBXNativeTarget; + buildConfigurationList = 571A468A14DB0A1B007FEAC7 /* Build configuration list for PBXNativeTarget "ChildApp" */; + buildPhases = ( + 571A463414DB0A1B007FEAC7 /* Sources */, + 571A463514DB0A1B007FEAC7 /* Frameworks */, + 571A463614DB0A1B007FEAC7 /* Resources */, + 571A463714DB0A1B007FEAC7 /* Sources */, + 571A463814DB0A1B007FEAC7 /* Frameworks */, + 571A463914DB0A1B007FEAC7 /* ShellScript */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = ChildApp; + productName = ChildApp; + productReference = 571A463B14DB0A1B007FEAC7 /* ChildApp.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 571A462F14DB0A1A007FEAC7 /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 0420; + }; + buildConfigurationList = 571A463214DB0A1A007FEAC7 /* Build configuration list for PBXProject "ChildApp" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + es, + ); + mainGroup = 571A462D14DB0A1A007FEAC7; + productRefGroup = 571A463C14DB0A1B007FEAC7 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 571A463A14DB0A1B007FEAC7 /* ChildApp */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 571A463614DB0A1B007FEAC7 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 571A465E14DB0A1B007FEAC7 /* InfoPlist.strings in Resources */, + 571A466814DB0A1B007FEAC7 /* Localizable.strings in Resources */, + 571A466C14DB0A1B007FEAC7 /* Localizable.strings in Resources */, + 571A466F14DB0A1B007FEAC7 /* icon.png in Resources */, + 571A467114DB0A1B007FEAC7 /* icon@2x.png in Resources */, + 571A467314DB0A1B007FEAC7 /* icon-72.png in Resources */, + 571A467614DB0A1B007FEAC7 /* Default.png in Resources */, + 571A467814DB0A1B007FEAC7 /* Default@2x.png in Resources */, + 571A467A14DB0A1B007FEAC7 /* Capture.bundle in Resources */, + 571A467C14DB0A1B007FEAC7 /* PhoneGap.plist in Resources */, + 571A468514DB0A1B007FEAC7 /* MainViewController.xib in Resources */, + 577FC36614DB0B620082BA7B /* www in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 571A463914DB0A1B007FEAC7 /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/bash; + shellScript = "\n\t\t\t\t\t\t\t\tif [ ! -d \"$PROJECT_DIR/www\" ] ; then\n\t\t\t\t\t\t\t\t\tcp -R /Users/Shared/PhoneGap/Frameworks/PhoneGap.framework/www \"$PROJECT_DIR\"\n\t\t\t\t\t\t\t\tfi\n\t\t\t\t\t\t\t\t# detect www folder reference in project, if missing, print warning\n\t\t\t\t\t\t\t\tgrep \"{isa = PBXFileReference; lastKnownFileType = folder; path = www; sourceTree = \\\"\\\"; };\" \"$PROJECT_DIR/$PROJECT_NAME.xcodeproj/project.pbxproj\"\n\t\t\t\t\t\t\t\trc=$? \n\t\t\t\t\t\t\t\tif [ $rc != 0 ] ; then\n\t\t\t\t\t\t\t\techo -e \"warning: Missing - Add $PROJECT_DIR/www as a folder reference in your project. Just drag and drop the folder into your project, into the Project Navigator of Xcode 4. Make sure you select the second radio-button: 'Create folder references for any added folders' (which will create a blue folder)\" 1>&2\n\t\t\t\t\t\t\t\tfi\t\t\t\t\t\t\t"; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 571A463414DB0A1B007FEAC7 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 571A466014DB0A1B007FEAC7 /* main.m in Sources */, + 571A468014DB0A1B007FEAC7 /* AppDelegate.m in Sources */, + 571A468314DB0A1B007FEAC7 /* MainViewController.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 571A463714DB0A1B007FEAC7 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + 571A465C14DB0A1B007FEAC7 /* InfoPlist.strings */ = { + isa = PBXVariantGroup; + children = ( + 571A465D14DB0A1B007FEAC7 /* en */, + ); + name = InfoPlist.strings; + sourceTree = ""; + }; + 571A466614DB0A1B007FEAC7 /* Localizable.strings */ = { + isa = PBXVariantGroup; + children = ( + 571A466714DB0A1B007FEAC7 /* en */, + ); + name = Localizable.strings; + sourceTree = ""; + }; + 571A466A14DB0A1B007FEAC7 /* Localizable.strings */ = { + isa = PBXVariantGroup; + children = ( + 571A466B14DB0A1B007FEAC7 /* es */, + ); + name = Localizable.strings; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 571A468814DB0A1B007FEAC7 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ARCHS = "$(ARCHS_STANDARD_32_BIT)"; + CLANG_ENABLE_OBJC_ARC = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + GCC_VERSION = com.apple.compilers.llvmgcc42; + GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 3.0; + SDKROOT = iphoneos; + }; + name = Debug; + }; + 571A468914DB0A1B007FEAC7 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ARCHS = "$(ARCHS_STANDARD_32_BIT)"; + CLANG_ENABLE_OBJC_ARC = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_VERSION = com.apple.compilers.llvmgcc42; + GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 3.0; + SDKROOT = iphoneos; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 571A468B14DB0A1B007FEAC7 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = YES; + COPY_PHASE_STRIP = NO; + FRAMEWORK_SEARCH_PATHS = /Users/Shared/PhoneGap/Frameworks; + GCC_DYNAMIC_NO_PIC = NO; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "ChildApp/ChildApp-Prefix.pch"; + GCC_PREPROCESSOR_DEFINITIONS = "PHONEGAP_FRAMEWORK=YES"; + INFOPLIST_FILE = "ChildApp/ChildApp-Info.plist"; + OTHER_LDFLAGS = ( + "-weak_framework", + UIKit, + "-weak_framework", + AVFoundation, + "-weak_framework", + CoreMedia, + "-weak_library", + /usr/lib/libSystem.B.dylib, + ); + PRODUCT_NAME = "$(TARGET_NAME)"; + TARGETED_DEVICE_FAMILY = "1,2"; + WRAPPER_EXTENSION = app; + }; + name = Debug; + }; + 571A468C14DB0A1B007FEAC7 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = YES; + COPY_PHASE_STRIP = YES; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + FRAMEWORK_SEARCH_PATHS = /Users/Shared/PhoneGap/Frameworks; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "ChildApp/ChildApp-Prefix.pch"; + GCC_PREPROCESSOR_DEFINITIONS = "PHONEGAP_FRAMEWORK=YES"; + INFOPLIST_FILE = "ChildApp/ChildApp-Info.plist"; + OTHER_LDFLAGS = ( + "-weak_framework", + UIKit, + "-weak_framework", + AVFoundation, + "-weak_framework", + CoreMedia, + "-weak_library", + /usr/lib/libSystem.B.dylib, + ); + PRODUCT_NAME = "$(TARGET_NAME)"; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + WRAPPER_EXTENSION = app; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 571A463214DB0A1A007FEAC7 /* Build configuration list for PBXProject "ChildApp" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 571A468814DB0A1B007FEAC7 /* Debug */, + 571A468914DB0A1B007FEAC7 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 571A468A14DB0A1B007FEAC7 /* Build configuration list for PBXNativeTarget "ChildApp" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 571A468B14DB0A1B007FEAC7 /* Debug */, + 571A468C14DB0A1B007FEAC7 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 571A462F14DB0A1A007FEAC7 /* Project object */; +} diff --git a/cordova-lib/spec-plugman-install/projects/ios-plist/SampleApp.xcodeproj/project.pbxproj b/cordova-lib/spec-plugman-install/projects/ios-plist/SampleApp.xcodeproj/project.pbxproj new file mode 100644 index 000000000..a4d87f9b4 --- /dev/null +++ b/cordova-lib/spec-plugman-install/projects/ios-plist/SampleApp.xcodeproj/project.pbxproj @@ -0,0 +1,498 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 571A464014DB0A1B007FEAC7 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 571A463F14DB0A1B007FEAC7 /* Foundation.framework */; }; + 571A464214DB0A1B007FEAC7 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 571A464114DB0A1B007FEAC7 /* UIKit.framework */; }; + 571A464414DB0A1B007FEAC7 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 571A464314DB0A1B007FEAC7 /* CoreGraphics.framework */; }; + 571A464614DB0A1B007FEAC7 /* AddressBook.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 571A464514DB0A1B007FEAC7 /* AddressBook.framework */; }; + 571A464814DB0A1B007FEAC7 /* AddressBookUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 571A464714DB0A1B007FEAC7 /* AddressBookUI.framework */; }; + 571A464A14DB0A1B007FEAC7 /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 571A464914DB0A1B007FEAC7 /* AudioToolbox.framework */; }; + 571A464C14DB0A1B007FEAC7 /* AVFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 571A464B14DB0A1B007FEAC7 /* AVFoundation.framework */; }; + 571A464E14DB0A1B007FEAC7 /* CoreLocation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 571A464D14DB0A1B007FEAC7 /* CoreLocation.framework */; }; + 571A465014DB0A1B007FEAC7 /* MediaPlayer.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 571A464F14DB0A1B007FEAC7 /* MediaPlayer.framework */; }; + 571A465214DB0A1B007FEAC7 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 571A465114DB0A1B007FEAC7 /* QuartzCore.framework */; }; + 571A465414DB0A1B007FEAC7 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 571A465314DB0A1B007FEAC7 /* SystemConfiguration.framework */; }; + 571A465614DB0A1B007FEAC7 /* MobileCoreServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 571A465514DB0A1B007FEAC7 /* MobileCoreServices.framework */; }; + 571A465814DB0A1B007FEAC7 /* CoreMedia.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 571A465714DB0A1B007FEAC7 /* CoreMedia.framework */; }; + 571A465E14DB0A1B007FEAC7 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 571A465C14DB0A1B007FEAC7 /* InfoPlist.strings */; }; + 571A466014DB0A1B007FEAC7 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 571A465F14DB0A1B007FEAC7 /* main.m */; }; + 571A466314DB0A1B007FEAC7 /* PhoneGap.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 571A466214DB0A1B007FEAC7 /* PhoneGap.framework */; }; + 571A466814DB0A1B007FEAC7 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 571A466614DB0A1B007FEAC7 /* Localizable.strings */; }; + 571A466C14DB0A1B007FEAC7 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 571A466A14DB0A1B007FEAC7 /* Localizable.strings */; }; + 571A466F14DB0A1B007FEAC7 /* icon.png in Resources */ = {isa = PBXBuildFile; fileRef = 571A466E14DB0A1B007FEAC7 /* icon.png */; }; + 571A467114DB0A1B007FEAC7 /* icon@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 571A467014DB0A1B007FEAC7 /* icon@2x.png */; }; + 571A467314DB0A1B007FEAC7 /* icon-72.png in Resources */ = {isa = PBXBuildFile; fileRef = 571A467214DB0A1B007FEAC7 /* icon-72.png */; }; + 571A467614DB0A1B007FEAC7 /* Default.png in Resources */ = {isa = PBXBuildFile; fileRef = 571A467514DB0A1B007FEAC7 /* Default.png */; }; + 571A467814DB0A1B007FEAC7 /* Default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 571A467714DB0A1B007FEAC7 /* Default@2x.png */; }; + 571A467A14DB0A1B007FEAC7 /* Capture.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 571A467914DB0A1B007FEAC7 /* Capture.bundle */; }; + 571A467C14DB0A1B007FEAC7 /* PhoneGap.plist in Resources */ = {isa = PBXBuildFile; fileRef = 571A467B14DB0A1B007FEAC7 /* PhoneGap.plist */; }; + 571A468014DB0A1B007FEAC7 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 571A467F14DB0A1B007FEAC7 /* AppDelegate.m */; }; + 571A468314DB0A1B007FEAC7 /* MainViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 571A468214DB0A1B007FEAC7 /* MainViewController.m */; }; + 571A468514DB0A1B007FEAC7 /* MainViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 571A468414DB0A1B007FEAC7 /* MainViewController.xib */; }; + 577FC36614DB0B620082BA7B /* www in Resources */ = {isa = PBXBuildFile; fileRef = 577FC36514DB0B620082BA7B /* www */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 571A463B14DB0A1B007FEAC7 /* ChildApp.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = ChildApp.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 571A463F14DB0A1B007FEAC7 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; + 571A464114DB0A1B007FEAC7 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; + 571A464314DB0A1B007FEAC7 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; + 571A464514DB0A1B007FEAC7 /* AddressBook.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AddressBook.framework; path = System/Library/Frameworks/AddressBook.framework; sourceTree = SDKROOT; }; + 571A464714DB0A1B007FEAC7 /* AddressBookUI.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AddressBookUI.framework; path = System/Library/Frameworks/AddressBookUI.framework; sourceTree = SDKROOT; }; + 571A464914DB0A1B007FEAC7 /* AudioToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = System/Library/Frameworks/AudioToolbox.framework; sourceTree = SDKROOT; }; + 571A464B14DB0A1B007FEAC7 /* AVFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVFoundation.framework; path = System/Library/Frameworks/AVFoundation.framework; sourceTree = SDKROOT; }; + 571A464D14DB0A1B007FEAC7 /* CoreLocation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreLocation.framework; path = System/Library/Frameworks/CoreLocation.framework; sourceTree = SDKROOT; }; + 571A464F14DB0A1B007FEAC7 /* MediaPlayer.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MediaPlayer.framework; path = System/Library/Frameworks/MediaPlayer.framework; sourceTree = SDKROOT; }; + 571A465114DB0A1B007FEAC7 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; + 571A465314DB0A1B007FEAC7 /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = System/Library/Frameworks/SystemConfiguration.framework; sourceTree = SDKROOT; }; + 571A465514DB0A1B007FEAC7 /* MobileCoreServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MobileCoreServices.framework; path = System/Library/Frameworks/MobileCoreServices.framework; sourceTree = SDKROOT; }; + 571A465714DB0A1B007FEAC7 /* CoreMedia.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMedia.framework; path = System/Library/Frameworks/CoreMedia.framework; sourceTree = SDKROOT; }; + 571A465B14DB0A1B007FEAC7 /* ChildApp-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "ChildApp-Info.plist"; sourceTree = ""; }; + 571A465D14DB0A1B007FEAC7 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; + 571A465F14DB0A1B007FEAC7 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; + 571A466114DB0A1B007FEAC7 /* ChildApp-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "ChildApp-Prefix.pch"; sourceTree = ""; }; + 571A466214DB0A1B007FEAC7 /* PhoneGap.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = PhoneGap.framework; path = /Users/Shared/PhoneGap/Frameworks/PhoneGap.framework; sourceTree = ""; }; + 571A466714DB0A1B007FEAC7 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = Resources/en.lproj/Localizable.strings; sourceTree = ""; }; + 571A466B14DB0A1B007FEAC7 /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = Resources/es.lproj/Localizable.strings; sourceTree = ""; }; + 571A466E14DB0A1B007FEAC7 /* icon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = icon.png; path = Resources/icons/icon.png; sourceTree = ""; }; + 571A467014DB0A1B007FEAC7 /* icon@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "icon@2x.png"; path = "Resources/icons/icon@2x.png"; sourceTree = ""; }; + 571A467214DB0A1B007FEAC7 /* icon-72.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "icon-72.png"; path = "Resources/icons/icon-72.png"; sourceTree = ""; }; + 571A467514DB0A1B007FEAC7 /* Default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Default.png; path = Resources/splash/Default.png; sourceTree = ""; }; + 571A467714DB0A1B007FEAC7 /* Default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Default@2x.png"; path = "Resources/splash/Default@2x.png"; sourceTree = ""; }; + 571A467914DB0A1B007FEAC7 /* Capture.bundle */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.plug-in"; name = Capture.bundle; path = Resources/Capture.bundle; sourceTree = ""; }; + 571A467B14DB0A1B007FEAC7 /* PhoneGap.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = PhoneGap.plist; sourceTree = ""; }; + 571A467E14DB0A1B007FEAC7 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = AppDelegate.h; path = Classes/AppDelegate.h; sourceTree = ""; }; + 571A467F14DB0A1B007FEAC7 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = AppDelegate.m; path = Classes/AppDelegate.m; sourceTree = ""; }; + 571A468114DB0A1B007FEAC7 /* MainViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = MainViewController.h; path = Classes/MainViewController.h; sourceTree = ""; }; + 571A468214DB0A1B007FEAC7 /* MainViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = MainViewController.m; path = Classes/MainViewController.m; sourceTree = ""; }; + 571A468414DB0A1B007FEAC7 /* MainViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = MainViewController.xib; path = Classes/MainViewController.xib; sourceTree = ""; }; + 571A468714DB0A1B007FEAC7 /* README */ = {isa = PBXFileReference; lastKnownFileType = text; name = README; path = Plugins/README; sourceTree = ""; }; + 577FC36514DB0B620082BA7B /* www */ = {isa = PBXFileReference; lastKnownFileType = folder; path = www; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 571A463514DB0A1B007FEAC7 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 571A464014DB0A1B007FEAC7 /* Foundation.framework in Frameworks */, + 571A464214DB0A1B007FEAC7 /* UIKit.framework in Frameworks */, + 571A464414DB0A1B007FEAC7 /* CoreGraphics.framework in Frameworks */, + 571A464614DB0A1B007FEAC7 /* AddressBook.framework in Frameworks */, + 571A464814DB0A1B007FEAC7 /* AddressBookUI.framework in Frameworks */, + 571A464A14DB0A1B007FEAC7 /* AudioToolbox.framework in Frameworks */, + 571A464C14DB0A1B007FEAC7 /* AVFoundation.framework in Frameworks */, + 571A464E14DB0A1B007FEAC7 /* CoreLocation.framework in Frameworks */, + 571A465014DB0A1B007FEAC7 /* MediaPlayer.framework in Frameworks */, + 571A465214DB0A1B007FEAC7 /* QuartzCore.framework in Frameworks */, + 571A465414DB0A1B007FEAC7 /* SystemConfiguration.framework in Frameworks */, + 571A465614DB0A1B007FEAC7 /* MobileCoreServices.framework in Frameworks */, + 571A465814DB0A1B007FEAC7 /* CoreMedia.framework in Frameworks */, + 571A466314DB0A1B007FEAC7 /* PhoneGap.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 571A463814DB0A1B007FEAC7 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 571A462D14DB0A1A007FEAC7 = { + isa = PBXGroup; + children = ( + 577FC36514DB0B620082BA7B /* www */, + 571A465914DB0A1B007FEAC7 /* ChildApp */, + 571A463E14DB0A1B007FEAC7 /* Frameworks */, + 571A463C14DB0A1B007FEAC7 /* Products */, + ); + sourceTree = ""; + }; + 571A463C14DB0A1B007FEAC7 /* Products */ = { + isa = PBXGroup; + children = ( + 571A463B14DB0A1B007FEAC7 /* ChildApp.app */, + ); + name = Products; + sourceTree = ""; + }; + 571A463E14DB0A1B007FEAC7 /* Frameworks */ = { + isa = PBXGroup; + children = ( + 571A463F14DB0A1B007FEAC7 /* Foundation.framework */, + 571A464114DB0A1B007FEAC7 /* UIKit.framework */, + 571A464314DB0A1B007FEAC7 /* CoreGraphics.framework */, + 571A464514DB0A1B007FEAC7 /* AddressBook.framework */, + 571A464714DB0A1B007FEAC7 /* AddressBookUI.framework */, + 571A464914DB0A1B007FEAC7 /* AudioToolbox.framework */, + 571A464B14DB0A1B007FEAC7 /* AVFoundation.framework */, + 571A464D14DB0A1B007FEAC7 /* CoreLocation.framework */, + 571A464F14DB0A1B007FEAC7 /* MediaPlayer.framework */, + 571A465114DB0A1B007FEAC7 /* QuartzCore.framework */, + 571A465314DB0A1B007FEAC7 /* SystemConfiguration.framework */, + 571A465514DB0A1B007FEAC7 /* MobileCoreServices.framework */, + 571A465714DB0A1B007FEAC7 /* CoreMedia.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; + 571A465914DB0A1B007FEAC7 /* ChildApp */ = { + isa = PBXGroup; + children = ( + 571A466214DB0A1B007FEAC7 /* PhoneGap.framework */, + 571A466414DB0A1B007FEAC7 /* Resources */, + 571A467D14DB0A1B007FEAC7 /* Classes */, + 571A468614DB0A1B007FEAC7 /* Plugins */, + 571A465A14DB0A1B007FEAC7 /* Supporting Files */, + ); + path = ChildApp; + sourceTree = ""; + }; + 571A465A14DB0A1B007FEAC7 /* Supporting Files */ = { + isa = PBXGroup; + children = ( + 571A465B14DB0A1B007FEAC7 /* ChildApp-Info.plist */, + 571A465C14DB0A1B007FEAC7 /* InfoPlist.strings */, + 571A465F14DB0A1B007FEAC7 /* main.m */, + 571A466114DB0A1B007FEAC7 /* ChildApp-Prefix.pch */, + 571A467B14DB0A1B007FEAC7 /* PhoneGap.plist */, + 571A468414DB0A1B007FEAC7 /* MainViewController.xib */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; + 571A466414DB0A1B007FEAC7 /* Resources */ = { + isa = PBXGroup; + children = ( + 571A467914DB0A1B007FEAC7 /* Capture.bundle */, + 571A466514DB0A1B007FEAC7 /* en.lproj */, + 571A466914DB0A1B007FEAC7 /* es.lproj */, + 571A466D14DB0A1B007FEAC7 /* icons */, + 571A467414DB0A1B007FEAC7 /* splash */, + ); + name = Resources; + sourceTree = ""; + }; + 571A466514DB0A1B007FEAC7 /* en.lproj */ = { + isa = PBXGroup; + children = ( + 571A466614DB0A1B007FEAC7 /* Localizable.strings */, + ); + name = en.lproj; + sourceTree = ""; + }; + 571A466914DB0A1B007FEAC7 /* es.lproj */ = { + isa = PBXGroup; + children = ( + 571A466A14DB0A1B007FEAC7 /* Localizable.strings */, + ); + name = es.lproj; + sourceTree = ""; + }; + 571A466D14DB0A1B007FEAC7 /* icons */ = { + isa = PBXGroup; + children = ( + 571A466E14DB0A1B007FEAC7 /* icon.png */, + 571A467014DB0A1B007FEAC7 /* icon@2x.png */, + 571A467214DB0A1B007FEAC7 /* icon-72.png */, + ); + name = icons; + sourceTree = ""; + }; + 571A467414DB0A1B007FEAC7 /* splash */ = { + isa = PBXGroup; + children = ( + 571A467514DB0A1B007FEAC7 /* Default.png */, + 571A467714DB0A1B007FEAC7 /* Default@2x.png */, + ); + name = splash; + sourceTree = ""; + }; + 571A467D14DB0A1B007FEAC7 /* Classes */ = { + isa = PBXGroup; + children = ( + 571A467E14DB0A1B007FEAC7 /* AppDelegate.h */, + 571A467F14DB0A1B007FEAC7 /* AppDelegate.m */, + 571A468114DB0A1B007FEAC7 /* MainViewController.h */, + 571A468214DB0A1B007FEAC7 /* MainViewController.m */, + ); + name = Classes; + sourceTree = ""; + }; + 571A468614DB0A1B007FEAC7 /* Plugins */ = { + isa = PBXGroup; + children = ( + 571A468714DB0A1B007FEAC7 /* README */, + ); + name = Plugins; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 571A463A14DB0A1B007FEAC7 /* ChildApp */ = { + isa = PBXNativeTarget; + buildConfigurationList = 571A468A14DB0A1B007FEAC7 /* Build configuration list for PBXNativeTarget "ChildApp" */; + buildPhases = ( + 571A463414DB0A1B007FEAC7 /* Sources */, + 571A463514DB0A1B007FEAC7 /* Frameworks */, + 571A463614DB0A1B007FEAC7 /* Resources */, + 571A463714DB0A1B007FEAC7 /* Sources */, + 571A463814DB0A1B007FEAC7 /* Frameworks */, + 571A463914DB0A1B007FEAC7 /* ShellScript */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = ChildApp; + productName = ChildApp; + productReference = 571A463B14DB0A1B007FEAC7 /* ChildApp.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 571A462F14DB0A1A007FEAC7 /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 0420; + }; + buildConfigurationList = 571A463214DB0A1A007FEAC7 /* Build configuration list for PBXProject "ChildApp" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + es, + ); + mainGroup = 571A462D14DB0A1A007FEAC7; + productRefGroup = 571A463C14DB0A1B007FEAC7 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 571A463A14DB0A1B007FEAC7 /* ChildApp */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 571A463614DB0A1B007FEAC7 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 571A465E14DB0A1B007FEAC7 /* InfoPlist.strings in Resources */, + 571A466814DB0A1B007FEAC7 /* Localizable.strings in Resources */, + 571A466C14DB0A1B007FEAC7 /* Localizable.strings in Resources */, + 571A466F14DB0A1B007FEAC7 /* icon.png in Resources */, + 571A467114DB0A1B007FEAC7 /* icon@2x.png in Resources */, + 571A467314DB0A1B007FEAC7 /* icon-72.png in Resources */, + 571A467614DB0A1B007FEAC7 /* Default.png in Resources */, + 571A467814DB0A1B007FEAC7 /* Default@2x.png in Resources */, + 571A467A14DB0A1B007FEAC7 /* Capture.bundle in Resources */, + 571A467C14DB0A1B007FEAC7 /* PhoneGap.plist in Resources */, + 571A468514DB0A1B007FEAC7 /* MainViewController.xib in Resources */, + 577FC36614DB0B620082BA7B /* www in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 571A463914DB0A1B007FEAC7 /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/bash; + shellScript = "\n\t\t\t\t\t\t\t\tif [ ! -d \"$PROJECT_DIR/www\" ] ; then\n\t\t\t\t\t\t\t\t\tcp -R /Users/Shared/PhoneGap/Frameworks/PhoneGap.framework/www \"$PROJECT_DIR\"\n\t\t\t\t\t\t\t\tfi\n\t\t\t\t\t\t\t\t# detect www folder reference in project, if missing, print warning\n\t\t\t\t\t\t\t\tgrep \"{isa = PBXFileReference; lastKnownFileType = folder; path = www; sourceTree = \\\"\\\"; };\" \"$PROJECT_DIR/$PROJECT_NAME.xcodeproj/project.pbxproj\"\n\t\t\t\t\t\t\t\trc=$? \n\t\t\t\t\t\t\t\tif [ $rc != 0 ] ; then\n\t\t\t\t\t\t\t\techo -e \"warning: Missing - Add $PROJECT_DIR/www as a folder reference in your project. Just drag and drop the folder into your project, into the Project Navigator of Xcode 4. Make sure you select the second radio-button: 'Create folder references for any added folders' (which will create a blue folder)\" 1>&2\n\t\t\t\t\t\t\t\tfi\t\t\t\t\t\t\t"; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 571A463414DB0A1B007FEAC7 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 571A466014DB0A1B007FEAC7 /* main.m in Sources */, + 571A468014DB0A1B007FEAC7 /* AppDelegate.m in Sources */, + 571A468314DB0A1B007FEAC7 /* MainViewController.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 571A463714DB0A1B007FEAC7 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + 571A465C14DB0A1B007FEAC7 /* InfoPlist.strings */ = { + isa = PBXVariantGroup; + children = ( + 571A465D14DB0A1B007FEAC7 /* en */, + ); + name = InfoPlist.strings; + sourceTree = ""; + }; + 571A466614DB0A1B007FEAC7 /* Localizable.strings */ = { + isa = PBXVariantGroup; + children = ( + 571A466714DB0A1B007FEAC7 /* en */, + ); + name = Localizable.strings; + sourceTree = ""; + }; + 571A466A14DB0A1B007FEAC7 /* Localizable.strings */ = { + isa = PBXVariantGroup; + children = ( + 571A466B14DB0A1B007FEAC7 /* es */, + ); + name = Localizable.strings; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 571A468814DB0A1B007FEAC7 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ARCHS = "$(ARCHS_STANDARD_32_BIT)"; + CLANG_ENABLE_OBJC_ARC = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + GCC_VERSION = com.apple.compilers.llvmgcc42; + GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 3.0; + SDKROOT = iphoneos; + }; + name = Debug; + }; + 571A468914DB0A1B007FEAC7 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ARCHS = "$(ARCHS_STANDARD_32_BIT)"; + CLANG_ENABLE_OBJC_ARC = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_VERSION = com.apple.compilers.llvmgcc42; + GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 3.0; + SDKROOT = iphoneos; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 571A468B14DB0A1B007FEAC7 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = YES; + COPY_PHASE_STRIP = NO; + FRAMEWORK_SEARCH_PATHS = /Users/Shared/PhoneGap/Frameworks; + GCC_DYNAMIC_NO_PIC = NO; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "ChildApp/ChildApp-Prefix.pch"; + GCC_PREPROCESSOR_DEFINITIONS = "PHONEGAP_FRAMEWORK=YES"; + INFOPLIST_FILE = "ChildApp/ChildApp-Info.plist"; + OTHER_LDFLAGS = ( + "-weak_framework", + UIKit, + "-weak_framework", + AVFoundation, + "-weak_framework", + CoreMedia, + "-weak_library", + /usr/lib/libSystem.B.dylib, + ); + PRODUCT_NAME = "$(TARGET_NAME)"; + TARGETED_DEVICE_FAMILY = "1,2"; + WRAPPER_EXTENSION = app; + }; + name = Debug; + }; + 571A468C14DB0A1B007FEAC7 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = YES; + COPY_PHASE_STRIP = YES; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + FRAMEWORK_SEARCH_PATHS = /Users/Shared/PhoneGap/Frameworks; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "ChildApp/ChildApp-Prefix.pch"; + GCC_PREPROCESSOR_DEFINITIONS = "PHONEGAP_FRAMEWORK=YES"; + INFOPLIST_FILE = "ChildApp/ChildApp-Info.plist"; + OTHER_LDFLAGS = ( + "-weak_framework", + UIKit, + "-weak_framework", + AVFoundation, + "-weak_framework", + CoreMedia, + "-weak_library", + /usr/lib/libSystem.B.dylib, + ); + PRODUCT_NAME = "$(TARGET_NAME)"; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + WRAPPER_EXTENSION = app; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 571A463214DB0A1A007FEAC7 /* Build configuration list for PBXProject "ChildApp" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 571A468814DB0A1B007FEAC7 /* Debug */, + 571A468914DB0A1B007FEAC7 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 571A468A14DB0A1B007FEAC7 /* Build configuration list for PBXNativeTarget "ChildApp" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 571A468B14DB0A1B007FEAC7 /* Debug */, + 571A468C14DB0A1B007FEAC7 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 571A462F14DB0A1A007FEAC7 /* Project object */; +} diff --git a/cordova-lib/spec-plugman-install/projects/ios-plist/SampleApp/PhoneGap.plist b/cordova-lib/spec-plugman-install/projects/ios-plist/SampleApp/PhoneGap.plist new file mode 100644 index 000000000..5ffe25ee2 --- /dev/null +++ b/cordova-lib/spec-plugman-install/projects/ios-plist/SampleApp/PhoneGap.plist @@ -0,0 +1,53 @@ + + + + + TopActivityIndicator + gray + EnableLocation + + EnableViewportScale + + AutoHideSplashScreen + + ShowSplashScreenSpinner + + MediaPlaybackRequiresUserAction + + AllowInlineMediaPlayback + + OpenAllWhitelistURLsInWebView + + ExternalHosts + + Plugins + + com.phonegap.accelerometer + PGAccelerometer + com.phonegap.camera + PGCamera + com.phonegap.connection + PGConnection + com.phonegap.contacts + PGContacts + com.phonegap.debugconsole + PGDebugConsole + com.phonegap.file + PGFile + com.phonegap.filetransfer + PGFileTransfer + com.phonegap.geolocation + PGLocation + com.phonegap.notification + PGNotification + com.phonegap.media + PGSound + com.phonegap.mediacapture + PGCapture + com.phonegap.splashscreen + PGSplashScreen + com.phonegap.battery + PGBattery + + + diff --git a/cordova-lib/spec-plugman-install/projects/ios-plist/SampleApp/SampleApp-Info.plist b/cordova-lib/spec-plugman-install/projects/ios-plist/SampleApp/SampleApp-Info.plist new file mode 100644 index 000000000..08b9ee3be --- /dev/null +++ b/cordova-lib/spec-plugman-install/projects/ios-plist/SampleApp/SampleApp-Info.plist @@ -0,0 +1,80 @@ + + + + + + CFBundleIcons + + CFBundlePrimaryIcon + + CFBundleIconFiles + + icon.png + icon@2x.png + icon-72.png + icon-72@2x.png + + UIPrerenderedIcon + + + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + + CFBundleDevelopmentRegion + English + CFBundleDisplayName + ${PRODUCT_NAME} + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIconFile + icon.png + CFBundleIdentifier + com.example.friendstring + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + APPL + CFBundleSignature + ???? + CFBundleVersion + 1.0 + LSRequiresIPhoneOS + + NSMainNibFile + + NSMainNibFile~ipad + + AppId + $APP_ID + + diff --git a/cordova-lib/spec-plugman-install/projects/ios-plist/www/.gitkeep b/cordova-lib/spec-plugman-install/projects/ios-plist/www/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/cordova-lib/spec-plugman-install/projects/multiple-children/AndroidManifest.xml b/cordova-lib/spec-plugman-install/projects/multiple-children/AndroidManifest.xml new file mode 100644 index 000000000..0c528031c --- /dev/null +++ b/cordova-lib/spec-plugman-install/projects/multiple-children/AndroidManifest.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cordova-lib/spec-plugman-install/projects/multiple-children/res/xml/plugins.xml b/cordova-lib/spec-plugman-install/projects/multiple-children/res/xml/plugins.xml new file mode 100644 index 000000000..9cee85e44 --- /dev/null +++ b/cordova-lib/spec-plugman-install/projects/multiple-children/res/xml/plugins.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/cordova-lib/spec-plugman-install/projects/tizen/www/config.xml b/cordova-lib/spec-plugman-install/projects/tizen/www/config.xml new file mode 100644 index 000000000..788f6d404 --- /dev/null +++ b/cordova-lib/spec-plugman-install/projects/tizen/www/config.xml @@ -0,0 +1,2 @@ + + diff --git a/cordova-lib/spec-plugman-install/projects/windows8/CordovaApp_TemporaryKey.pfx b/cordova-lib/spec-plugman-install/projects/windows8/CordovaApp_TemporaryKey.pfx new file mode 100644 index 0000000000000000000000000000000000000000..4df1e37a739be1e6b179a8c0b1bca386ac7196b0 GIT binary patch literal 2504 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 UETW_c$X6Qy%&v;x{{6xJ15?FqLjV8( literal 0 HcmV?d00001 diff --git a/cordova-lib/spec-plugman-install/projects/windows8/TestApp.jsproj b/cordova-lib/spec-plugman-install/projects/windows8/TestApp.jsproj new file mode 100644 index 000000000..d508c3fb9 --- /dev/null +++ b/cordova-lib/spec-plugman-install/projects/windows8/TestApp.jsproj @@ -0,0 +1,81 @@ + + + + + Debug + AnyCPU + + + Debug + ARM + + + Debug + x64 + + + Debug + x86 + + + Release + AnyCPU + + + Release + ARM + + + Release + x64 + + + Release + x86 + + + + efffab2f-bfc5-4eda-b545-45ef4995f55a + + + 11.0 + + + + + + Windows + 8.0 + en-US + CordovaApp_TemporaryKey.pfx + + + + Designer + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/cordova-lib/spec-plugman-install/projects/windows8/TestApp.sln b/cordova-lib/spec-plugman-install/projects/windows8/TestApp.sln new file mode 100644 index 000000000..6c1ea33b9 --- /dev/null +++ b/cordova-lib/spec-plugman-install/projects/windows8/TestApp.sln @@ -0,0 +1,46 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2012 +Project("{262852C6-CD72-467D-83FE-5EEB1973A190}") = "TestApp", "TestApp.jsproj", "{EFFFAB2F-BFC5-4EDA-B545-45EF4995F55A}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Debug|ARM = Debug|ARM + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 + Release|Any CPU = Release|Any CPU + Release|ARM = Release|ARM + Release|x64 = Release|x64 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {EFFFAB2F-BFC5-4EDA-B545-45EF4995F55A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {EFFFAB2F-BFC5-4EDA-B545-45EF4995F55A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {EFFFAB2F-BFC5-4EDA-B545-45EF4995F55A}.Debug|Any CPU.Deploy.0 = Debug|Any CPU + {EFFFAB2F-BFC5-4EDA-B545-45EF4995F55A}.Debug|ARM.ActiveCfg = Debug|ARM + {EFFFAB2F-BFC5-4EDA-B545-45EF4995F55A}.Debug|ARM.Build.0 = Debug|ARM + {EFFFAB2F-BFC5-4EDA-B545-45EF4995F55A}.Debug|ARM.Deploy.0 = Debug|ARM + {EFFFAB2F-BFC5-4EDA-B545-45EF4995F55A}.Debug|x64.ActiveCfg = Debug|x64 + {EFFFAB2F-BFC5-4EDA-B545-45EF4995F55A}.Debug|x64.Build.0 = Debug|x64 + {EFFFAB2F-BFC5-4EDA-B545-45EF4995F55A}.Debug|x64.Deploy.0 = Debug|x64 + {EFFFAB2F-BFC5-4EDA-B545-45EF4995F55A}.Debug|x86.ActiveCfg = Debug|x86 + {EFFFAB2F-BFC5-4EDA-B545-45EF4995F55A}.Debug|x86.Build.0 = Debug|x86 + {EFFFAB2F-BFC5-4EDA-B545-45EF4995F55A}.Debug|x86.Deploy.0 = Debug|x86 + {EFFFAB2F-BFC5-4EDA-B545-45EF4995F55A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {EFFFAB2F-BFC5-4EDA-B545-45EF4995F55A}.Release|Any CPU.Build.0 = Release|Any CPU + {EFFFAB2F-BFC5-4EDA-B545-45EF4995F55A}.Release|Any CPU.Deploy.0 = Release|Any CPU + {EFFFAB2F-BFC5-4EDA-B545-45EF4995F55A}.Release|ARM.ActiveCfg = Release|ARM + {EFFFAB2F-BFC5-4EDA-B545-45EF4995F55A}.Release|ARM.Build.0 = Release|ARM + {EFFFAB2F-BFC5-4EDA-B545-45EF4995F55A}.Release|ARM.Deploy.0 = Release|ARM + {EFFFAB2F-BFC5-4EDA-B545-45EF4995F55A}.Release|x64.ActiveCfg = Release|x64 + {EFFFAB2F-BFC5-4EDA-B545-45EF4995F55A}.Release|x64.Build.0 = Release|x64 + {EFFFAB2F-BFC5-4EDA-B545-45EF4995F55A}.Release|x64.Deploy.0 = Release|x64 + {EFFFAB2F-BFC5-4EDA-B545-45EF4995F55A}.Release|x86.ActiveCfg = Release|x86 + {EFFFAB2F-BFC5-4EDA-B545-45EF4995F55A}.Release|x86.Build.0 = Release|x86 + {EFFFAB2F-BFC5-4EDA-B545-45EF4995F55A}.Release|x86.Deploy.0 = Release|x86 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/cordova-lib/spec-plugman-install/projects/windows8/package.appxmanifest b/cordova-lib/spec-plugman-install/projects/windows8/package.appxmanifest new file mode 100644 index 000000000..62c8f28c5 --- /dev/null +++ b/cordova-lib/spec-plugman-install/projects/windows8/package.appxmanifest @@ -0,0 +1,27 @@ + + + + + CordovaApp + Jesse + images\storelogo.png + + + 6.2.1 + 6.2.1 + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/cordova-lib/spec-plugman-install/projects/windows8/www/cordova-2.6.0.js b/cordova-lib/spec-plugman-install/projects/windows8/www/cordova-2.6.0.js new file mode 100644 index 000000000..2fedaa6db --- /dev/null +++ b/cordova-lib/spec-plugman-install/projects/windows8/www/cordova-2.6.0.js @@ -0,0 +1,8075 @@ +// Platform: windows8 + +// commit 125dca530923a44a8f44f68f5e1970cbdd4e7faf + +// File generated at :: Wed Apr 03 2013 13:20:16 GMT-0700 (Pacific Daylight Time) + +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ + +;(function() { + +// file: lib\scripts\require.js + +var require, + define; + +(function () { + var modules = {}; + // Stack of moduleIds currently being built. + var requireStack = []; + // Map of module ID -> index into requireStack of modules currently being built. + var inProgressModules = {}; + + function build(module) { + var factory = module.factory; + module.exports = {}; + delete module.factory; + factory(require, module.exports, module); + return module.exports; + } + + require = function (id) { + if (!modules[id]) { + throw "module " + id + " not found"; + } else if (id in inProgressModules) { + var cycle = requireStack.slice(inProgressModules[id]).join('->') + '->' + id; + throw "Cycle in require graph: " + cycle; + } + if (modules[id].factory) { + try { + inProgressModules[id] = requireStack.length; + requireStack.push(id); + return build(modules[id]); + } finally { + delete inProgressModules[id]; + requireStack.pop(); + } + } + return modules[id].exports; + }; + + define = function (id, factory) { + if (modules[id]) { + throw "module " + id + " already defined"; + } + + modules[id] = { + id: id, + factory: factory + }; + }; + + define.remove = function (id) { + delete modules[id]; + }; + + define.moduleMap = modules; +})(); + +//Export for use in node +if (typeof module === "object" && typeof require === "function") { + module.exports.require = require; + module.exports.define = define; +} + +// file: lib/cordova.js +define("cordova", function(require, exports, module) { + + +var channel = require('cordova/channel'); + +/** + * Listen for DOMContentLoaded and notify our channel subscribers. + */ +document.addEventListener('DOMContentLoaded', function() { + channel.onDOMContentLoaded.fire(); +}, false); +if (document.readyState == 'complete' || document.readyState == 'interactive') { + channel.onDOMContentLoaded.fire(); +} + +/** + * Intercept calls to addEventListener + removeEventListener and handle deviceready, + * resume, and pause events. + */ +var m_document_addEventListener = document.addEventListener; +var m_document_removeEventListener = document.removeEventListener; +var m_window_addEventListener = window.addEventListener; +var m_window_removeEventListener = window.removeEventListener; + +/** + * Houses custom event handlers to intercept on document + window event listeners. + */ +var documentEventHandlers = {}, + windowEventHandlers = {}; + +document.addEventListener = function(evt, handler, capture) { + var e = evt.toLowerCase(); + if (typeof documentEventHandlers[e] != 'undefined') { + documentEventHandlers[e].subscribe(handler); + } else { + m_document_addEventListener.call(document, evt, handler, capture); + } +}; + +window.addEventListener = function(evt, handler, capture) { + var e = evt.toLowerCase(); + if (typeof windowEventHandlers[e] != 'undefined') { + windowEventHandlers[e].subscribe(handler); + } else { + m_window_addEventListener.call(window, evt, handler, capture); + } +}; + +document.removeEventListener = function(evt, handler, capture) { + var e = evt.toLowerCase(); + // If unsubscribing from an event that is handled by a plugin + if (typeof documentEventHandlers[e] != "undefined") { + documentEventHandlers[e].unsubscribe(handler); + } else { + m_document_removeEventListener.call(document, evt, handler, capture); + } +}; + +window.removeEventListener = function(evt, handler, capture) { + var e = evt.toLowerCase(); + // If unsubscribing from an event that is handled by a plugin + if (typeof windowEventHandlers[e] != "undefined") { + windowEventHandlers[e].unsubscribe(handler); + } else { + m_window_removeEventListener.call(window, evt, handler, capture); + } +}; + +function createEvent(type, data) { + var event = document.createEvent('Events'); + event.initEvent(type, false, false); + if (data) { + for (var i in data) { + if (data.hasOwnProperty(i)) { + event[i] = data[i]; + } + } + } + return event; +} + +if(typeof window.console === "undefined") { + window.console = { + log:function(){} + }; +} + +var cordova = { + define:define, + require:require, + /** + * Methods to add/remove your own addEventListener hijacking on document + window. + */ + addWindowEventHandler:function(event) { + return (windowEventHandlers[event] = channel.create(event)); + }, + addStickyDocumentEventHandler:function(event) { + return (documentEventHandlers[event] = channel.createSticky(event)); + }, + addDocumentEventHandler:function(event) { + return (documentEventHandlers[event] = channel.create(event)); + }, + removeWindowEventHandler:function(event) { + delete windowEventHandlers[event]; + }, + removeDocumentEventHandler:function(event) { + delete documentEventHandlers[event]; + }, + /** + * Retrieve original event handlers that were replaced by Cordova + * + * @return object + */ + getOriginalHandlers: function() { + return {'document': {'addEventListener': m_document_addEventListener, 'removeEventListener': m_document_removeEventListener}, + 'window': {'addEventListener': m_window_addEventListener, 'removeEventListener': m_window_removeEventListener}}; + }, + /** + * Method to fire event from native code + * bNoDetach is required for events which cause an exception which needs to be caught in native code + */ + fireDocumentEvent: function(type, data, bNoDetach) { + var evt = createEvent(type, data); + if (typeof documentEventHandlers[type] != 'undefined') { + if( bNoDetach ) { + documentEventHandlers[type].fire(evt); + } + else { + setTimeout(function() { + documentEventHandlers[type].fire(evt); + }, 0); + } + } else { + document.dispatchEvent(evt); + } + }, + fireWindowEvent: function(type, data) { + var evt = createEvent(type,data); + if (typeof windowEventHandlers[type] != 'undefined') { + setTimeout(function() { + windowEventHandlers[type].fire(evt); + }, 0); + } else { + window.dispatchEvent(evt); + } + }, + + /** + * Plugin callback mechanism. + */ + // Randomize the starting callbackId to avoid collisions after refreshing or navigating. + // This way, it's very unlikely that any new callback would get the same callbackId as an old callback. + callbackId: Math.floor(Math.random() * 2000000000), + callbacks: {}, + callbackStatus: { + NO_RESULT: 0, + OK: 1, + CLASS_NOT_FOUND_EXCEPTION: 2, + ILLEGAL_ACCESS_EXCEPTION: 3, + INSTANTIATION_EXCEPTION: 4, + MALFORMED_URL_EXCEPTION: 5, + IO_EXCEPTION: 6, + INVALID_ACTION: 7, + JSON_EXCEPTION: 8, + ERROR: 9 + }, + + /** + * Called by native code when returning successful result from an action. + */ + callbackSuccess: function(callbackId, args) { + try { + cordova.callbackFromNative(callbackId, true, args.status, [args.message], args.keepCallback); + } catch (e) { + console.log("Error in error callback: " + callbackId + " = "+e); + } + }, + + /** + * Called by native code when returning error result from an action. + */ + callbackError: function(callbackId, args) { + // TODO: Deprecate callbackSuccess and callbackError in favour of callbackFromNative. + // Derive success from status. + try { + cordova.callbackFromNative(callbackId, false, args.status, [args.message], args.keepCallback); + } catch (e) { + console.log("Error in error callback: " + callbackId + " = "+e); + } + }, + + /** + * Called by native code when returning the result from an action. + */ + callbackFromNative: function(callbackId, success, status, args, keepCallback) { + var callback = cordova.callbacks[callbackId]; + if (callback) { + if (success && status == cordova.callbackStatus.OK) { + callback.success && callback.success.apply(null, args); + } else if (!success) { + callback.fail && callback.fail.apply(null, args); + } + + // Clear callback if not expecting any more results + if (!keepCallback) { + delete cordova.callbacks[callbackId]; + } + } + }, + addConstructor: function(func) { + channel.onCordovaReady.subscribe(function() { + try { + func(); + } catch(e) { + console.log("Failed to run constructor: " + e); + } + }); + } +}; + +// Register pause, resume and deviceready channels as events on document. +channel.onPause = cordova.addDocumentEventHandler('pause'); +channel.onResume = cordova.addDocumentEventHandler('resume'); +channel.onDeviceReady = cordova.addStickyDocumentEventHandler('deviceready'); + +module.exports = cordova; + +}); + +// file: lib\common\argscheck.js +define("cordova/argscheck", function(require, exports, module) { + +var exec = require('cordova/exec'); +var utils = require('cordova/utils'); + +var moduleExports = module.exports; + +var typeMap = { + 'A': 'Array', + 'D': 'Date', + 'N': 'Number', + 'S': 'String', + 'F': 'Function', + 'O': 'Object' +}; + +function extractParamName(callee, argIndex) { + return (/.*?\((.*?)\)/).exec(callee)[1].split(', ')[argIndex]; +} + +function checkArgs(spec, functionName, args, opt_callee) { + if (!moduleExports.enableChecks) { + return; + } + var errMsg = null; + var typeName; + for (var i = 0; i < spec.length; ++i) { + var c = spec.charAt(i), + cUpper = c.toUpperCase(), + arg = args[i]; + // Asterix means allow anything. + if (c == '*') { + continue; + } + typeName = utils.typeName(arg); + if ((arg === null || arg === undefined) && c == cUpper) { + continue; + } + if (typeName != typeMap[cUpper]) { + errMsg = 'Expected ' + typeMap[cUpper]; + break; + } + } + if (errMsg) { + errMsg += ', but got ' + typeName + '.'; + errMsg = 'Wrong type for parameter "' + extractParamName(opt_callee || args.callee, i) + '" of ' + functionName + ': ' + errMsg; + // Don't log when running jake test. + if (typeof jasmine == 'undefined') { + console.error(errMsg); + } + throw TypeError(errMsg); + } +} + +function getValue(value, defaultValue) { + return value === undefined ? defaultValue : value; +} + +moduleExports.checkArgs = checkArgs; +moduleExports.getValue = getValue; +moduleExports.enableChecks = true; + + +}); + +// file: lib\common\builder.js +define("cordova/builder", function(require, exports, module) { + +var utils = require('cordova/utils'); + +function each(objects, func, context) { + for (var prop in objects) { + if (objects.hasOwnProperty(prop)) { + func.apply(context, [objects[prop], prop]); + } + } +} + +function clobber(obj, key, value) { + exports.replaceHookForTesting(obj, key); + obj[key] = value; + // Getters can only be overridden by getters. + if (obj[key] !== value) { + utils.defineGetter(obj, key, function() { + return value; + }); + } +} + +function assignOrWrapInDeprecateGetter(obj, key, value, message) { + if (message) { + utils.defineGetter(obj, key, function() { + console.log(message); + delete obj[key]; + clobber(obj, key, value); + return value; + }); + } else { + clobber(obj, key, value); + } +} + +function include(parent, objects, clobber, merge) { + each(objects, function (obj, key) { + try { + var result = obj.path ? require(obj.path) : {}; + + if (clobber) { + // Clobber if it doesn't exist. + if (typeof parent[key] === 'undefined') { + assignOrWrapInDeprecateGetter(parent, key, result, obj.deprecated); + } else if (typeof obj.path !== 'undefined') { + // If merging, merge properties onto parent, otherwise, clobber. + if (merge) { + recursiveMerge(parent[key], result); + } else { + assignOrWrapInDeprecateGetter(parent, key, result, obj.deprecated); + } + } + result = parent[key]; + } else { + // Overwrite if not currently defined. + if (typeof parent[key] == 'undefined') { + assignOrWrapInDeprecateGetter(parent, key, result, obj.deprecated); + } else { + // Set result to what already exists, so we can build children into it if they exist. + result = parent[key]; + } + } + + if (obj.children) { + include(result, obj.children, clobber, merge); + } + } catch(e) { + utils.alert('Exception building cordova JS globals: ' + e + ' for key "' + key + '"'); + } + }); +} + +/** + * Merge properties from one object onto another recursively. Properties from + * the src object will overwrite existing target property. + * + * @param target Object to merge properties into. + * @param src Object to merge properties from. + */ +function recursiveMerge(target, src) { + for (var prop in src) { + if (src.hasOwnProperty(prop)) { + if (target.prototype && target.prototype.constructor === target) { + // If the target object is a constructor override off prototype. + clobber(target.prototype, prop, src[prop]); + } else { + if (typeof src[prop] === 'object' && typeof target[prop] === 'object') { + recursiveMerge(target[prop], src[prop]); + } else { + clobber(target, prop, src[prop]); + } + } + } + } +} + +exports.buildIntoButDoNotClobber = function(objects, target) { + include(target, objects, false, false); +}; +exports.buildIntoAndClobber = function(objects, target) { + include(target, objects, true, false); +}; +exports.buildIntoAndMerge = function(objects, target) { + include(target, objects, true, true); +}; +exports.recursiveMerge = recursiveMerge; +exports.assignOrWrapInDeprecateGetter = assignOrWrapInDeprecateGetter; +exports.replaceHookForTesting = function() {}; + +}); + +// file: lib\common\channel.js +define("cordova/channel", function(require, exports, module) { + +var utils = require('cordova/utils'), + nextGuid = 1; + +/** + * Custom pub-sub "channel" that can have functions subscribed to it + * This object is used to define and control firing of events for + * cordova initialization, as well as for custom events thereafter. + * + * The order of events during page load and Cordova startup is as follows: + * + * onDOMContentLoaded* Internal event that is received when the web page is loaded and parsed. + * onNativeReady* Internal event that indicates the Cordova native side is ready. + * onCordovaReady* Internal event fired when all Cordova JavaScript objects have been created. + * onCordovaInfoReady* Internal event fired when device properties are available. + * onCordovaConnectionReady* Internal event fired when the connection property has been set. + * onDeviceReady* User event fired to indicate that Cordova is ready + * onResume User event fired to indicate a start/resume lifecycle event + * onPause User event fired to indicate a pause lifecycle event + * onDestroy* Internal event fired when app is being destroyed (User should use window.onunload event, not this one). + * + * The events marked with an * are sticky. Once they have fired, they will stay in the fired state. + * All listeners that subscribe after the event is fired will be executed right away. + * + * The only Cordova events that user code should register for are: + * deviceready Cordova native code is initialized and Cordova APIs can be called from JavaScript + * pause App has moved to background + * resume App has returned to foreground + * + * Listeners can be registered as: + * document.addEventListener("deviceready", myDeviceReadyListener, false); + * document.addEventListener("resume", myResumeListener, false); + * document.addEventListener("pause", myPauseListener, false); + * + * The DOM lifecycle events should be used for saving and restoring state + * window.onload + * window.onunload + * + */ + +/** + * Channel + * @constructor + * @param type String the channel name + */ +var Channel = function(type, sticky) { + this.type = type; + // Map of guid -> function. + this.handlers = {}; + // 0 = Non-sticky, 1 = Sticky non-fired, 2 = Sticky fired. + this.state = sticky ? 1 : 0; + // Used in sticky mode to remember args passed to fire(). + this.fireArgs = null; + // Used by onHasSubscribersChange to know if there are any listeners. + this.numHandlers = 0; + // Function that is called when the first listener is subscribed, or when + // the last listener is unsubscribed. + this.onHasSubscribersChange = null; +}, + channel = { + /** + * Calls the provided function only after all of the channels specified + * have been fired. All channels must be sticky channels. + */ + join: function(h, c) { + var len = c.length, + i = len, + f = function() { + if (!(--i)) h(); + }; + for (var j=0; j + var scriptElem = document.createElement("script"); + scriptElem.src = "//Microsoft.WinJS.1.0/js/base.js"; + scriptElem.addEventListener("load", onWinJSReady); + document.head.appendChild(scriptElem); + + console.log("added WinJS ... "); + } + else { + onWinJSReady(); + } + }, + clobbers: { + cordova: { + path: 'cordova', + children: { + commandProxy: { + path: 'cordova/commandProxy' + } + } + }, + navigator: { + children: { + console: { + path: "cordova/plugin/windows8/console" + } + } + } + } +}; + +}); + +// file: lib\common\plugin\Acceleration.js +define("cordova/plugin/Acceleration", function(require, exports, module) { + +var Acceleration = function(x, y, z, timestamp) { + this.x = x; + this.y = y; + this.z = z; + this.timestamp = timestamp || (new Date()).getTime(); +}; + +module.exports = Acceleration; + +}); + +// file: lib\common\plugin\Camera.js +define("cordova/plugin/Camera", function(require, exports, module) { + +var argscheck = require('cordova/argscheck'), + exec = require('cordova/exec'), + Camera = require('cordova/plugin/CameraConstants'), + CameraPopoverHandle = require('cordova/plugin/CameraPopoverHandle'); + +var cameraExport = {}; + +// Tack on the Camera Constants to the base camera plugin. +for (var key in Camera) { + cameraExport[key] = Camera[key]; +} + +/** + * Gets a picture from source defined by "options.sourceType", and returns the + * image as defined by the "options.destinationType" option. + + * The defaults are sourceType=CAMERA and destinationType=FILE_URI. + * + * @param {Function} successCallback + * @param {Function} errorCallback + * @param {Object} options + */ +cameraExport.getPicture = function(successCallback, errorCallback, options) { + argscheck.checkArgs('fFO', 'Camera.getPicture', arguments); + options = options || {}; + var getValue = argscheck.getValue; + + var quality = getValue(options.quality, 50); + var destinationType = getValue(options.destinationType, Camera.DestinationType.FILE_URI); + var sourceType = getValue(options.sourceType, Camera.PictureSourceType.CAMERA); + var targetWidth = getValue(options.targetWidth, -1); + var targetHeight = getValue(options.targetHeight, -1); + var encodingType = getValue(options.encodingType, Camera.EncodingType.JPEG); + var mediaType = getValue(options.mediaType, Camera.MediaType.PICTURE); + var allowEdit = !!options.allowEdit; + var correctOrientation = !!options.correctOrientation; + var saveToPhotoAlbum = !!options.saveToPhotoAlbum; + var popoverOptions = getValue(options.popoverOptions, null); + var cameraDirection = getValue(options.cameraDirection, Camera.Direction.BACK); + + var args = [quality, destinationType, sourceType, targetWidth, targetHeight, encodingType, + mediaType, allowEdit, correctOrientation, saveToPhotoAlbum, popoverOptions, cameraDirection]; + + exec(successCallback, errorCallback, "Camera", "takePicture", args); + return new CameraPopoverHandle(); +}; + +cameraExport.cleanup = function(successCallback, errorCallback) { + exec(successCallback, errorCallback, "Camera", "cleanup", []); +}; + +module.exports = cameraExport; + +}); + +// file: lib\common\plugin\CameraConstants.js +define("cordova/plugin/CameraConstants", function(require, exports, module) { + +module.exports = { + DestinationType:{ + DATA_URL: 0, // Return base64 encoded string + FILE_URI: 1, // Return file uri (content://media/external/images/media/2 for Android) + NATIVE_URI: 2 // Return native uri (eg. asset-library://... for iOS) + }, + EncodingType:{ + JPEG: 0, // Return JPEG encoded image + PNG: 1 // Return PNG encoded image + }, + MediaType:{ + PICTURE: 0, // allow selection of still pictures only. DEFAULT. Will return format specified via DestinationType + VIDEO: 1, // allow selection of video only, ONLY RETURNS URL + ALLMEDIA : 2 // allow selection from all media types + }, + PictureSourceType:{ + PHOTOLIBRARY : 0, // Choose image from picture library (same as SAVEDPHOTOALBUM for Android) + CAMERA : 1, // Take picture from camera + SAVEDPHOTOALBUM : 2 // Choose image from picture library (same as PHOTOLIBRARY for Android) + }, + PopoverArrowDirection:{ + ARROW_UP : 1, // matches iOS UIPopoverArrowDirection constants to specify arrow location on popover + ARROW_DOWN : 2, + ARROW_LEFT : 4, + ARROW_RIGHT : 8, + ARROW_ANY : 15 + }, + Direction:{ + BACK: 0, + FRONT: 1 + } +}; + +}); + +// file: lib\common\plugin\CameraPopoverHandle.js +define("cordova/plugin/CameraPopoverHandle", function(require, exports, module) { + +var exec = require('cordova/exec'); + +/** + * A handle to an image picker popover. + */ +var CameraPopoverHandle = function() { + this.setPosition = function(popoverOptions) { + console.log('CameraPopoverHandle.setPosition is only supported on iOS.'); + }; +}; + +module.exports = CameraPopoverHandle; + +}); + +// file: lib\common\plugin\CameraPopoverOptions.js +define("cordova/plugin/CameraPopoverOptions", function(require, exports, module) { + +var Camera = require('cordova/plugin/CameraConstants'); + +/** + * Encapsulates options for iOS Popover image picker + */ +var CameraPopoverOptions = function(x,y,width,height,arrowDir){ + // information of rectangle that popover should be anchored to + this.x = x || 0; + this.y = y || 32; + this.width = width || 320; + this.height = height || 480; + // The direction of the popover arrow + this.arrowDir = arrowDir || Camera.PopoverArrowDirection.ARROW_ANY; +}; + +module.exports = CameraPopoverOptions; + +}); + +// file: lib\common\plugin\CaptureAudioOptions.js +define("cordova/plugin/CaptureAudioOptions", function(require, exports, module) { + +/** + * Encapsulates all audio capture operation configuration options. + */ +var CaptureAudioOptions = function(){ + // Upper limit of sound clips user can record. Value must be equal or greater than 1. + this.limit = 1; + // Maximum duration of a single sound clip in seconds. + this.duration = 0; + // The selected audio mode. Must match with one of the elements in supportedAudioModes array. + this.mode = null; +}; + +module.exports = CaptureAudioOptions; + +}); + +// file: lib\common\plugin\CaptureError.js +define("cordova/plugin/CaptureError", function(require, exports, module) { + +/** + * The CaptureError interface encapsulates all errors in the Capture API. + */ +var CaptureError = function(c) { + this.code = c || null; +}; + +// Camera or microphone failed to capture image or sound. +CaptureError.CAPTURE_INTERNAL_ERR = 0; +// Camera application or audio capture application is currently serving other capture request. +CaptureError.CAPTURE_APPLICATION_BUSY = 1; +// Invalid use of the API (e.g. limit parameter has value less than one). +CaptureError.CAPTURE_INVALID_ARGUMENT = 2; +// User exited camera application or audio capture application before capturing anything. +CaptureError.CAPTURE_NO_MEDIA_FILES = 3; +// The requested capture operation is not supported. +CaptureError.CAPTURE_NOT_SUPPORTED = 20; + +module.exports = CaptureError; + +}); + +// file: lib\common\plugin\CaptureImageOptions.js +define("cordova/plugin/CaptureImageOptions", function(require, exports, module) { + +/** + * Encapsulates all image capture operation configuration options. + */ +var CaptureImageOptions = function(){ + // Upper limit of images user can take. Value must be equal or greater than 1. + this.limit = 1; + // The selected image mode. Must match with one of the elements in supportedImageModes array. + this.mode = null; +}; + +module.exports = CaptureImageOptions; + +}); + +// file: lib\common\plugin\CaptureVideoOptions.js +define("cordova/plugin/CaptureVideoOptions", function(require, exports, module) { + +/** + * Encapsulates all video capture operation configuration options. + */ +var CaptureVideoOptions = function(){ + // Upper limit of videos user can record. Value must be equal or greater than 1. + this.limit = 1; + // Maximum duration of a single video clip in seconds. + this.duration = 0; + // The selected video mode. Must match with one of the elements in supportedVideoModes array. + this.mode = null; +}; + +module.exports = CaptureVideoOptions; + +}); + +// file: lib\common\plugin\CompassError.js +define("cordova/plugin/CompassError", function(require, exports, module) { + +/** + * CompassError. + * An error code assigned by an implementation when an error has occurred + * @constructor + */ +var CompassError = function(err) { + this.code = (err !== undefined ? err : null); +}; + +CompassError.COMPASS_INTERNAL_ERR = 0; +CompassError.COMPASS_NOT_SUPPORTED = 20; + +module.exports = CompassError; + +}); + +// file: lib\common\plugin\CompassHeading.js +define("cordova/plugin/CompassHeading", function(require, exports, module) { + +var CompassHeading = function(magneticHeading, trueHeading, headingAccuracy, timestamp) { + this.magneticHeading = magneticHeading; + this.trueHeading = trueHeading; + this.headingAccuracy = headingAccuracy; + this.timestamp = timestamp || new Date().getTime(); +}; + +module.exports = CompassHeading; + +}); + +// file: lib\common\plugin\ConfigurationData.js +define("cordova/plugin/ConfigurationData", function(require, exports, module) { + +/** + * Encapsulates a set of parameters that the capture device supports. + */ +function ConfigurationData() { + // The ASCII-encoded string in lower case representing the media type. + this.type = null; + // The height attribute represents height of the image or video in pixels. + // In the case of a sound clip this attribute has value 0. + this.height = 0; + // The width attribute represents width of the image or video in pixels. + // In the case of a sound clip this attribute has value 0 + this.width = 0; +} + +module.exports = ConfigurationData; + +}); + +// file: lib\common\plugin\Connection.js +define("cordova/plugin/Connection", function(require, exports, module) { + +/** + * Network status + */ +module.exports = { + UNKNOWN: "unknown", + ETHERNET: "ethernet", + WIFI: "wifi", + CELL_2G: "2g", + CELL_3G: "3g", + CELL_4G: "4g", + CELL:"cellular", + NONE: "none" +}; + +}); + +// file: lib\common\plugin\Contact.js +define("cordova/plugin/Contact", function(require, exports, module) { + +var argscheck = require('cordova/argscheck'), + exec = require('cordova/exec'), + ContactError = require('cordova/plugin/ContactError'), + utils = require('cordova/utils'); + +/** +* Converts primitives into Complex Object +* Currently only used for Date fields +*/ +function convertIn(contact) { + var value = contact.birthday; + try { + contact.birthday = new Date(parseFloat(value)); + } catch (exception){ + console.log("Cordova Contact convertIn error: exception creating date."); + } + return contact; +} + +/** +* Converts Complex objects into primitives +* Only conversion at present is for Dates. +**/ + +function convertOut(contact) { + var value = contact.birthday; + if (value !== null) { + // try to make it a Date object if it is not already + if (!utils.isDate(value)){ + try { + value = new Date(value); + } catch(exception){ + value = null; + } + } + if (utils.isDate(value)){ + value = value.valueOf(); // convert to milliseconds + } + contact.birthday = value; + } + return contact; +} + +/** +* Contains information about a single contact. +* @constructor +* @param {DOMString} id unique identifier +* @param {DOMString} displayName +* @param {ContactName} name +* @param {DOMString} nickname +* @param {Array.} phoneNumbers array of phone numbers +* @param {Array.} emails array of email addresses +* @param {Array.} addresses array of addresses +* @param {Array.} ims instant messaging user ids +* @param {Array.} organizations +* @param {DOMString} birthday contact's birthday +* @param {DOMString} note user notes about contact +* @param {Array.} photos +* @param {Array.} categories +* @param {Array.} urls contact's web sites +*/ +var Contact = function (id, displayName, name, nickname, phoneNumbers, emails, addresses, + ims, organizations, birthday, note, photos, categories, urls) { + this.id = id || null; + this.rawId = null; + this.displayName = displayName || null; + this.name = name || null; // ContactName + this.nickname = nickname || null; + this.phoneNumbers = phoneNumbers || null; // ContactField[] + this.emails = emails || null; // ContactField[] + this.addresses = addresses || null; // ContactAddress[] + this.ims = ims || null; // ContactField[] + this.organizations = organizations || null; // ContactOrganization[] + this.birthday = birthday || null; + this.note = note || null; + this.photos = photos || null; // ContactField[] + this.categories = categories || null; // ContactField[] + this.urls = urls || null; // ContactField[] +}; + +/** +* Removes contact from device storage. +* @param successCB success callback +* @param errorCB error callback +*/ +Contact.prototype.remove = function(successCB, errorCB) { + argscheck.checkArgs('FF', 'Contact.remove', arguments); + var fail = errorCB && function(code) { + errorCB(new ContactError(code)); + }; + if (this.id === null) { + fail(ContactError.UNKNOWN_ERROR); + } + else { + exec(successCB, fail, "Contacts", "remove", [this.id]); + } +}; + +/** +* Creates a deep copy of this Contact. +* With the contact ID set to null. +* @return copy of this Contact +*/ +Contact.prototype.clone = function() { + var clonedContact = utils.clone(this); + clonedContact.id = null; + clonedContact.rawId = null; + + function nullIds(arr) { + if (arr) { + for (var i = 0; i < arr.length; ++i) { + arr[i].id = null; + } + } + } + + // Loop through and clear out any id's in phones, emails, etc. + nullIds(clonedContact.phoneNumbers); + nullIds(clonedContact.emails); + nullIds(clonedContact.addresses); + nullIds(clonedContact.ims); + nullIds(clonedContact.organizations); + nullIds(clonedContact.categories); + nullIds(clonedContact.photos); + nullIds(clonedContact.urls); + return clonedContact; +}; + +/** +* Persists contact to device storage. +* @param successCB success callback +* @param errorCB error callback +*/ +Contact.prototype.save = function(successCB, errorCB) { + argscheck.checkArgs('FFO', 'Contact.save', arguments); + var fail = errorCB && function(code) { + errorCB(new ContactError(code)); + }; + var success = function(result) { + if (result) { + if (successCB) { + var fullContact = require('cordova/plugin/contacts').create(result); + successCB(convertIn(fullContact)); + } + } + else { + // no Entry object returned + fail(ContactError.UNKNOWN_ERROR); + } + }; + var dupContact = convertOut(utils.clone(this)); + exec(success, fail, "Contacts", "save", [dupContact]); +}; + + +module.exports = Contact; + +}); + +// file: lib\common\plugin\ContactAddress.js +define("cordova/plugin/ContactAddress", function(require, exports, module) { + +/** +* Contact address. +* @constructor +* @param {DOMString} id unique identifier, should only be set by native code +* @param formatted // NOTE: not a W3C standard +* @param streetAddress +* @param locality +* @param region +* @param postalCode +* @param country +*/ + +var ContactAddress = function(pref, type, formatted, streetAddress, locality, region, postalCode, country) { + this.id = null; + this.pref = (typeof pref != 'undefined' ? pref : false); + this.type = type || null; + this.formatted = formatted || null; + this.streetAddress = streetAddress || null; + this.locality = locality || null; + this.region = region || null; + this.postalCode = postalCode || null; + this.country = country || null; +}; + +module.exports = ContactAddress; + +}); + +// file: lib\common\plugin\ContactError.js +define("cordova/plugin/ContactError", function(require, exports, module) { + +/** + * ContactError. + * An error code assigned by an implementation when an error has occurred + * @constructor + */ +var ContactError = function(err) { + this.code = (typeof err != 'undefined' ? err : null); +}; + +/** + * Error codes + */ +ContactError.UNKNOWN_ERROR = 0; +ContactError.INVALID_ARGUMENT_ERROR = 1; +ContactError.TIMEOUT_ERROR = 2; +ContactError.PENDING_OPERATION_ERROR = 3; +ContactError.IO_ERROR = 4; +ContactError.NOT_SUPPORTED_ERROR = 5; +ContactError.PERMISSION_DENIED_ERROR = 20; + +module.exports = ContactError; + +}); + +// file: lib\common\plugin\ContactField.js +define("cordova/plugin/ContactField", function(require, exports, module) { + +/** +* Generic contact field. +* @constructor +* @param {DOMString} id unique identifier, should only be set by native code // NOTE: not a W3C standard +* @param type +* @param value +* @param pref +*/ +var ContactField = function(type, value, pref) { + this.id = null; + this.type = (type && type.toString()) || null; + this.value = (value && value.toString()) || null; + this.pref = (typeof pref != 'undefined' ? pref : false); +}; + +module.exports = ContactField; + +}); + +// file: lib\common\plugin\ContactFindOptions.js +define("cordova/plugin/ContactFindOptions", function(require, exports, module) { + +/** + * ContactFindOptions. + * @constructor + * @param filter used to match contacts against + * @param multiple boolean used to determine if more than one contact should be returned + */ + +var ContactFindOptions = function(filter, multiple) { + this.filter = filter || ''; + this.multiple = (typeof multiple != 'undefined' ? multiple : false); +}; + +module.exports = ContactFindOptions; + +}); + +// file: lib\common\plugin\ContactName.js +define("cordova/plugin/ContactName", function(require, exports, module) { + +/** +* Contact name. +* @constructor +* @param formatted // NOTE: not part of W3C standard +* @param familyName +* @param givenName +* @param middle +* @param prefix +* @param suffix +*/ +var ContactName = function(formatted, familyName, givenName, middle, prefix, suffix) { + this.formatted = formatted || null; + this.familyName = familyName || null; + this.givenName = givenName || null; + this.middleName = middle || null; + this.honorificPrefix = prefix || null; + this.honorificSuffix = suffix || null; +}; + +module.exports = ContactName; + +}); + +// file: lib\common\plugin\ContactOrganization.js +define("cordova/plugin/ContactOrganization", function(require, exports, module) { + +/** +* Contact organization. +* @constructor +* @param {DOMString} id unique identifier, should only be set by native code // NOTE: not a W3C standard +* @param name +* @param dept +* @param title +* @param startDate +* @param endDate +* @param location +* @param desc +*/ + +var ContactOrganization = function(pref, type, name, dept, title) { + this.id = null; + this.pref = (typeof pref != 'undefined' ? pref : false); + this.type = type || null; + this.name = name || null; + this.department = dept || null; + this.title = title || null; +}; + +module.exports = ContactOrganization; + +}); + +// file: lib\common\plugin\Coordinates.js +define("cordova/plugin/Coordinates", function(require, exports, module) { + +/** + * This class contains position information. + * @param {Object} lat + * @param {Object} lng + * @param {Object} alt + * @param {Object} acc + * @param {Object} head + * @param {Object} vel + * @param {Object} altacc + * @constructor + */ +var Coordinates = function(lat, lng, alt, acc, head, vel, altacc) { + /** + * The latitude of the position. + */ + this.latitude = lat; + /** + * The longitude of the position, + */ + this.longitude = lng; + /** + * The accuracy of the position. + */ + this.accuracy = acc; + /** + * The altitude of the position. + */ + this.altitude = (alt !== undefined ? alt : null); + /** + * The direction the device is moving at the position. + */ + this.heading = (head !== undefined ? head : null); + /** + * The velocity with which the device is moving at the position. + */ + this.speed = (vel !== undefined ? vel : null); + + if (this.speed === 0 || this.speed === null) { + this.heading = NaN; + } + + /** + * The altitude accuracy of the position. + */ + this.altitudeAccuracy = (altacc !== undefined) ? altacc : null; +}; + +module.exports = Coordinates; + +}); + +// file: lib\common\plugin\DirectoryEntry.js +define("cordova/plugin/DirectoryEntry", function(require, exports, module) { + +var argscheck = require('cordova/argscheck'), + utils = require('cordova/utils'), + exec = require('cordova/exec'), + Entry = require('cordova/plugin/Entry'), + FileError = require('cordova/plugin/FileError'), + DirectoryReader = require('cordova/plugin/DirectoryReader'); + +/** + * An interface representing a directory on the file system. + * + * {boolean} isFile always false (readonly) + * {boolean} isDirectory always true (readonly) + * {DOMString} name of the directory, excluding the path leading to it (readonly) + * {DOMString} fullPath the absolute full path to the directory (readonly) + * TODO: implement this!!! {FileSystem} filesystem on which the directory resides (readonly) + */ +var DirectoryEntry = function(name, fullPath) { + DirectoryEntry.__super__.constructor.call(this, false, true, name, fullPath); +}; + +utils.extend(DirectoryEntry, Entry); + +/** + * Creates a new DirectoryReader to read entries from this directory + */ +DirectoryEntry.prototype.createReader = function() { + return new DirectoryReader(this.fullPath); +}; + +/** + * Creates or looks up a directory + * + * @param {DOMString} path either a relative or absolute path from this directory in which to look up or create a directory + * @param {Flags} options to create or exclusively create the directory + * @param {Function} successCallback is called with the new entry + * @param {Function} errorCallback is called with a FileError + */ +DirectoryEntry.prototype.getDirectory = function(path, options, successCallback, errorCallback) { + argscheck.checkArgs('sOFF', 'DirectoryEntry.getDirectory', arguments); + var win = successCallback && function(result) { + var entry = new DirectoryEntry(result.name, result.fullPath); + successCallback(entry); + }; + var fail = errorCallback && function(code) { + errorCallback(new FileError(code)); + }; + exec(win, fail, "File", "getDirectory", [this.fullPath, path, options]); +}; + +/** + * Deletes a directory and all of it's contents + * + * @param {Function} successCallback is called with no parameters + * @param {Function} errorCallback is called with a FileError + */ +DirectoryEntry.prototype.removeRecursively = function(successCallback, errorCallback) { + argscheck.checkArgs('FF', 'DirectoryEntry.removeRecursively', arguments); + var fail = errorCallback && function(code) { + errorCallback(new FileError(code)); + }; + exec(successCallback, fail, "File", "removeRecursively", [this.fullPath]); +}; + +/** + * Creates or looks up a file + * + * @param {DOMString} path either a relative or absolute path from this directory in which to look up or create a file + * @param {Flags} options to create or exclusively create the file + * @param {Function} successCallback is called with the new entry + * @param {Function} errorCallback is called with a FileError + */ +DirectoryEntry.prototype.getFile = function(path, options, successCallback, errorCallback) { + argscheck.checkArgs('sOFF', 'DirectoryEntry.getFile', arguments); + var win = successCallback && function(result) { + var FileEntry = require('cordova/plugin/FileEntry'); + var entry = new FileEntry(result.name, result.fullPath); + successCallback(entry); + }; + var fail = errorCallback && function(code) { + errorCallback(new FileError(code)); + }; + exec(win, fail, "File", "getFile", [this.fullPath, path, options]); +}; + +module.exports = DirectoryEntry; + +}); + +// file: lib\common\plugin\DirectoryReader.js +define("cordova/plugin/DirectoryReader", function(require, exports, module) { + +var exec = require('cordova/exec'), + FileError = require('cordova/plugin/FileError') ; + +/** + * An interface that lists the files and directories in a directory. + */ +function DirectoryReader(path) { + this.path = path || null; +} + +/** + * Returns a list of entries from a directory. + * + * @param {Function} successCallback is called with a list of entries + * @param {Function} errorCallback is called with a FileError + */ +DirectoryReader.prototype.readEntries = function(successCallback, errorCallback) { + var win = typeof successCallback !== 'function' ? null : function(result) { + var retVal = []; + for (var i=0; i= 2) { + if (end < 0) { + newEnd = Math.max(size + end, 0); + } else { + newEnd = Math.min(end, size); + } + } + + var newFile = new File(this.name, this.fullPath, this.type, this.lastModifiedData, this.size); + newFile.start = this.start + newStart; + newFile.end = this.start + newEnd; + return newFile; +}; + + +module.exports = File; + +}); + +// file: lib\common\plugin\FileEntry.js +define("cordova/plugin/FileEntry", function(require, exports, module) { + +var utils = require('cordova/utils'), + exec = require('cordova/exec'), + Entry = require('cordova/plugin/Entry'), + FileWriter = require('cordova/plugin/FileWriter'), + File = require('cordova/plugin/File'), + FileError = require('cordova/plugin/FileError'); + +/** + * An interface representing a file on the file system. + * + * {boolean} isFile always true (readonly) + * {boolean} isDirectory always false (readonly) + * {DOMString} name of the file, excluding the path leading to it (readonly) + * {DOMString} fullPath the absolute full path to the file (readonly) + * {FileSystem} filesystem on which the file resides (readonly) + */ +var FileEntry = function(name, fullPath) { + FileEntry.__super__.constructor.apply(this, [true, false, name, fullPath]); +}; + +utils.extend(FileEntry, Entry); + +/** + * Creates a new FileWriter associated with the file that this FileEntry represents. + * + * @param {Function} successCallback is called with the new FileWriter + * @param {Function} errorCallback is called with a FileError + */ +FileEntry.prototype.createWriter = function(successCallback, errorCallback) { + this.file(function(filePointer) { + var writer = new FileWriter(filePointer); + + if (writer.fileName === null || writer.fileName === "") { + errorCallback && errorCallback(new FileError(FileError.INVALID_STATE_ERR)); + } else { + successCallback && successCallback(writer); + } + }, errorCallback); +}; + +/** + * Returns a File that represents the current state of the file that this FileEntry represents. + * + * @param {Function} successCallback is called with the new File object + * @param {Function} errorCallback is called with a FileError + */ +FileEntry.prototype.file = function(successCallback, errorCallback) { + var win = successCallback && function(f) { + var file = new File(f.name, f.fullPath, f.type, f.lastModifiedDate, f.size); + successCallback(file); + }; + var fail = errorCallback && function(code) { + errorCallback(new FileError(code)); + }; + exec(win, fail, "File", "getFileMetadata", [this.fullPath]); +}; + + +module.exports = FileEntry; + +}); + +// file: lib\common\plugin\FileError.js +define("cordova/plugin/FileError", function(require, exports, module) { + +/** + * FileError + */ +function FileError(error) { + this.code = error || null; +} + +// File error codes +// Found in DOMException +FileError.NOT_FOUND_ERR = 1; +FileError.SECURITY_ERR = 2; +FileError.ABORT_ERR = 3; + +// Added by File API specification +FileError.NOT_READABLE_ERR = 4; +FileError.ENCODING_ERR = 5; +FileError.NO_MODIFICATION_ALLOWED_ERR = 6; +FileError.INVALID_STATE_ERR = 7; +FileError.SYNTAX_ERR = 8; +FileError.INVALID_MODIFICATION_ERR = 9; +FileError.QUOTA_EXCEEDED_ERR = 10; +FileError.TYPE_MISMATCH_ERR = 11; +FileError.PATH_EXISTS_ERR = 12; + +module.exports = FileError; + +}); + +// file: lib\common\plugin\FileReader.js +define("cordova/plugin/FileReader", function(require, exports, module) { + +var exec = require('cordova/exec'), + modulemapper = require('cordova/modulemapper'), + utils = require('cordova/utils'), + File = require('cordova/plugin/File'), + FileError = require('cordova/plugin/FileError'), + ProgressEvent = require('cordova/plugin/ProgressEvent'), + origFileReader = modulemapper.getOriginalSymbol(this, 'FileReader'); + +/** + * This class reads the mobile device file system. + * + * For Android: + * The root directory is the root of the file system. + * To read from the SD card, the file name is "sdcard/my_file.txt" + * @constructor + */ +var FileReader = function() { + this._readyState = 0; + this._error = null; + this._result = null; + this._fileName = ''; + this._realReader = origFileReader ? new origFileReader() : {}; +}; + +// States +FileReader.EMPTY = 0; +FileReader.LOADING = 1; +FileReader.DONE = 2; + +utils.defineGetter(FileReader.prototype, 'readyState', function() { + return this._fileName ? this._readyState : this._realReader.readyState; +}); + +utils.defineGetter(FileReader.prototype, 'error', function() { + return this._fileName ? this._error: this._realReader.error; +}); + +utils.defineGetter(FileReader.prototype, 'result', function() { + return this._fileName ? this._result: this._realReader.result; +}); + +function defineEvent(eventName) { + utils.defineGetterSetter(FileReader.prototype, eventName, function() { + return this._realReader[eventName] || null; + }, function(value) { + this._realReader[eventName] = value; + }); +} +defineEvent('onloadstart'); // When the read starts. +defineEvent('onprogress'); // While reading (and decoding) file or fileBlob data, and reporting partial file data (progress.loaded/progress.total) +defineEvent('onload'); // When the read has successfully completed. +defineEvent('onerror'); // When the read has failed (see errors). +defineEvent('onloadend'); // When the request has completed (either in success or failure). +defineEvent('onabort'); // When the read has been aborted. For instance, by invoking the abort() method. + +function initRead(reader, file) { + // Already loading something + if (reader.readyState == FileReader.LOADING) { + throw new FileError(FileError.INVALID_STATE_ERR); + } + + reader._result = null; + reader._error = null; + reader._readyState = FileReader.LOADING; + + if (typeof file == 'string') { + // Deprecated in Cordova 2.4. + console.warning('Using a string argument with FileReader.readAs functions is deprecated.'); + reader._fileName = file; + } else if (typeof file.fullPath == 'string') { + reader._fileName = file.fullPath; + } else { + reader._fileName = ''; + return true; + } + + reader.onloadstart && reader.onloadstart(new ProgressEvent("loadstart", {target:reader})); +} + +/** + * Abort reading file. + */ +FileReader.prototype.abort = function() { + if (origFileReader && !this._fileName) { + return this._realReader.abort(); + } + this._result = null; + + if (this._readyState == FileReader.DONE || this._readyState == FileReader.EMPTY) { + return; + } + + this._readyState = FileReader.DONE; + + // If abort callback + if (typeof this.onabort === 'function') { + this.onabort(new ProgressEvent('abort', {target:this})); + } + // If load end callback + if (typeof this.onloadend === 'function') { + this.onloadend(new ProgressEvent('loadend', {target:this})); + } +}; + +/** + * Read text file. + * + * @param file {File} File object containing file properties + * @param encoding [Optional] (see http://www.iana.org/assignments/character-sets) + */ +FileReader.prototype.readAsText = function(file, encoding) { + if (initRead(this, file)) { + return this._realReader.readAsText(file, encoding); + } + + // Default encoding is UTF-8 + var enc = encoding ? encoding : "UTF-8"; + var me = this; + var execArgs = [this._fileName, enc, file.start, file.end]; + + // Read file + exec( + // Success callback + function(r) { + // If DONE (cancelled), then don't do anything + if (me._readyState === FileReader.DONE) { + return; + } + + // Save result + me._result = r; + + // If onload callback + if (typeof me.onload === "function") { + me.onload(new ProgressEvent("load", {target:me})); + } + + // DONE state + me._readyState = FileReader.DONE; + + // If onloadend callback + if (typeof me.onloadend === "function") { + me.onloadend(new ProgressEvent("loadend", {target:me})); + } + }, + // Error callback + function(e) { + // If DONE (cancelled), then don't do anything + if (me._readyState === FileReader.DONE) { + return; + } + + // DONE state + me._readyState = FileReader.DONE; + + // null result + me._result = null; + + // Save error + me._error = new FileError(e); + + // If onerror callback + if (typeof me.onerror === "function") { + me.onerror(new ProgressEvent("error", {target:me})); + } + + // If onloadend callback + if (typeof me.onloadend === "function") { + me.onloadend(new ProgressEvent("loadend", {target:me})); + } + }, "File", "readAsText", execArgs); +}; + + +/** + * Read file and return data as a base64 encoded data url. + * A data url is of the form: + * data:[][;base64], + * + * @param file {File} File object containing file properties + */ +FileReader.prototype.readAsDataURL = function(file) { + if (initRead(this, file)) { + return this._realReader.readAsDataURL(file); + } + + var me = this; + var execArgs = [this._fileName, file.start, file.end]; + + // Read file + exec( + // Success callback + function(r) { + // If DONE (cancelled), then don't do anything + if (me._readyState === FileReader.DONE) { + return; + } + + // DONE state + me._readyState = FileReader.DONE; + + // Save result + me._result = r; + + // If onload callback + if (typeof me.onload === "function") { + me.onload(new ProgressEvent("load", {target:me})); + } + + // If onloadend callback + if (typeof me.onloadend === "function") { + me.onloadend(new ProgressEvent("loadend", {target:me})); + } + }, + // Error callback + function(e) { + // If DONE (cancelled), then don't do anything + if (me._readyState === FileReader.DONE) { + return; + } + + // DONE state + me._readyState = FileReader.DONE; + + me._result = null; + + // Save error + me._error = new FileError(e); + + // If onerror callback + if (typeof me.onerror === "function") { + me.onerror(new ProgressEvent("error", {target:me})); + } + + // If onloadend callback + if (typeof me.onloadend === "function") { + me.onloadend(new ProgressEvent("loadend", {target:me})); + } + }, "File", "readAsDataURL", execArgs); +}; + +/** + * Read file and return data as a binary data. + * + * @param file {File} File object containing file properties + */ +FileReader.prototype.readAsBinaryString = function(file) { + if (initRead(this, file)) { + return this._realReader.readAsBinaryString(file); + } + + var me = this; + var execArgs = [this._fileName, file.start, file.end]; + + // Read file + exec( + // Success callback + function(r) { + // If DONE (cancelled), then don't do anything + if (me._readyState === FileReader.DONE) { + return; + } + + // DONE state + me._readyState = FileReader.DONE; + + me._result = r; + + // If onload callback + if (typeof me.onload === "function") { + me.onload(new ProgressEvent("load", {target:me})); + } + + // If onloadend callback + if (typeof me.onloadend === "function") { + me.onloadend(new ProgressEvent("loadend", {target:me})); + } + }, + // Error callback + function(e) { + // If DONE (cancelled), then don't do anything + if (me._readyState === FileReader.DONE) { + return; + } + + // DONE state + me._readyState = FileReader.DONE; + + me._result = null; + + // Save error + me._error = new FileError(e); + + // If onerror callback + if (typeof me.onerror === "function") { + me.onerror(new ProgressEvent("error", {target:me})); + } + + // If onloadend callback + if (typeof me.onloadend === "function") { + me.onloadend(new ProgressEvent("loadend", {target:me})); + } + }, "File", "readAsBinaryString", execArgs); +}; + +/** + * Read file and return data as a binary data. + * + * @param file {File} File object containing file properties + */ +FileReader.prototype.readAsArrayBuffer = function(file) { + if (initRead(this, file)) { + return this._realReader.readAsArrayBuffer(file); + } + + var me = this; + var execArgs = [this._fileName, file.start, file.end]; + + // Read file + exec( + // Success callback + function(r) { + // If DONE (cancelled), then don't do anything + if (me._readyState === FileReader.DONE) { + return; + } + + // DONE state + me._readyState = FileReader.DONE; + + me._result = r; + + // If onload callback + if (typeof me.onload === "function") { + me.onload(new ProgressEvent("load", {target:me})); + } + + // If onloadend callback + if (typeof me.onloadend === "function") { + me.onloadend(new ProgressEvent("loadend", {target:me})); + } + }, + // Error callback + function(e) { + // If DONE (cancelled), then don't do anything + if (me._readyState === FileReader.DONE) { + return; + } + + // DONE state + me._readyState = FileReader.DONE; + + me._result = null; + + // Save error + me._error = new FileError(e); + + // If onerror callback + if (typeof me.onerror === "function") { + me.onerror(new ProgressEvent("error", {target:me})); + } + + // If onloadend callback + if (typeof me.onloadend === "function") { + me.onloadend(new ProgressEvent("loadend", {target:me})); + } + }, "File", "readAsArrayBuffer", execArgs); +}; + +module.exports = FileReader; + +}); + +// file: lib\common\plugin\FileSystem.js +define("cordova/plugin/FileSystem", function(require, exports, module) { + +var DirectoryEntry = require('cordova/plugin/DirectoryEntry'); + +/** + * An interface representing a file system + * + * @constructor + * {DOMString} name the unique name of the file system (readonly) + * {DirectoryEntry} root directory of the file system (readonly) + */ +var FileSystem = function(name, root) { + this.name = name || null; + if (root) { + this.root = new DirectoryEntry(root.name, root.fullPath); + } +}; + +module.exports = FileSystem; + +}); + +// file: lib\common\plugin\FileTransfer.js +define("cordova/plugin/FileTransfer", function(require, exports, module) { + +var argscheck = require('cordova/argscheck'), + exec = require('cordova/exec'), + FileTransferError = require('cordova/plugin/FileTransferError'), + ProgressEvent = require('cordova/plugin/ProgressEvent'); + +function newProgressEvent(result) { + var pe = new ProgressEvent(); + pe.lengthComputable = result.lengthComputable; + pe.loaded = result.loaded; + pe.total = result.total; + return pe; +} + +function getBasicAuthHeader(urlString) { + var header = null; + + if (window.btoa) { + // parse the url using the Location object + var url = document.createElement('a'); + url.href = urlString; + + var credentials = null; + var protocol = url.protocol + "//"; + var origin = protocol + url.host; + + // check whether there are the username:password credentials in the url + if (url.href.indexOf(origin) != 0) { // credentials found + var atIndex = url.href.indexOf("@"); + credentials = url.href.substring(protocol.length, atIndex); + } + + if (credentials) { + var authHeader = "Authorization"; + var authHeaderValue = "Basic " + window.btoa(credentials); + + header = { + name : authHeader, + value : authHeaderValue + }; + } + } + + return header; +} + +var idCounter = 0; + +/** + * FileTransfer uploads a file to a remote server. + * @constructor + */ +var FileTransfer = function() { + this._id = ++idCounter; + this.onprogress = null; // optional callback +}; + +/** +* Given an absolute file path, uploads a file on the device to a remote server +* using a multipart HTTP request. +* @param filePath {String} Full path of the file on the device +* @param server {String} URL of the server to receive the file +* @param successCallback (Function} Callback to be invoked when upload has completed +* @param errorCallback {Function} Callback to be invoked upon error +* @param options {FileUploadOptions} Optional parameters such as file name and mimetype +* @param trustAllHosts {Boolean} Optional trust all hosts (e.g. for self-signed certs), defaults to false +*/ +FileTransfer.prototype.upload = function(filePath, server, successCallback, errorCallback, options, trustAllHosts) { + argscheck.checkArgs('ssFFO*', 'FileTransfer.upload', arguments); + // check for options + var fileKey = null; + var fileName = null; + var mimeType = null; + var params = null; + var chunkedMode = true; + var headers = null; + + var basicAuthHeader = getBasicAuthHeader(server); + if (basicAuthHeader) { + if (!options) { + options = new FileUploadOptions(); + } + if (!options.headers) { + options.headers = {}; + } + options.headers[basicAuthHeader.name] = basicAuthHeader.value; + } + + if (options) { + fileKey = options.fileKey; + fileName = options.fileName; + mimeType = options.mimeType; + headers = options.headers; + if (options.chunkedMode !== null || typeof options.chunkedMode != "undefined") { + chunkedMode = options.chunkedMode; + } + if (options.params) { + params = options.params; + } + else { + params = {}; + } + } + + var fail = errorCallback && function(e) { + var error = new FileTransferError(e.code, e.source, e.target, e.http_status, e.body); + errorCallback(error); + }; + + var self = this; + var win = function(result) { + if (typeof result.lengthComputable != "undefined") { + if (self.onprogress) { + self.onprogress(newProgressEvent(result)); + } + } else { + successCallback && successCallback(result); + } + }; + exec(win, fail, 'FileTransfer', 'upload', [filePath, server, fileKey, fileName, mimeType, params, trustAllHosts, chunkedMode, headers, this._id]); +}; + +/** + * Downloads a file form a given URL and saves it to the specified directory. + * @param source {String} URL of the server to receive the file + * @param target {String} Full path of the file on the device + * @param successCallback (Function} Callback to be invoked when upload has completed + * @param errorCallback {Function} Callback to be invoked upon error + * @param trustAllHosts {Boolean} Optional trust all hosts (e.g. for self-signed certs), defaults to false + * @param options {FileDownloadOptions} Optional parameters such as headers + */ +FileTransfer.prototype.download = function(source, target, successCallback, errorCallback, trustAllHosts, options) { + argscheck.checkArgs('ssFF*', 'FileTransfer.download', arguments); + var self = this; + + var basicAuthHeader = getBasicAuthHeader(source); + if (basicAuthHeader) { + if (!options) { + options = {}; + } + if (!options.headers) { + options.headers = {}; + } + options.headers[basicAuthHeader.name] = basicAuthHeader.value; + } + + var headers = null; + if (options) { + headers = options.headers || null; + } + + var win = function(result) { + if (typeof result.lengthComputable != "undefined") { + if (self.onprogress) { + return self.onprogress(newProgressEvent(result)); + } + } else if (successCallback) { + var entry = null; + if (result.isDirectory) { + entry = new (require('cordova/plugin/DirectoryEntry'))(); + } + else if (result.isFile) { + entry = new (require('cordova/plugin/FileEntry'))(); + } + entry.isDirectory = result.isDirectory; + entry.isFile = result.isFile; + entry.name = result.name; + entry.fullPath = result.fullPath; + successCallback(entry); + } + }; + + var fail = errorCallback && function(e) { + var error = new FileTransferError(e.code, e.source, e.target, e.http_status, e.body); + errorCallback(error); + }; + + exec(win, fail, 'FileTransfer', 'download', [source, target, trustAllHosts, this._id, headers]); +}; + +/** + * Aborts the ongoing file transfer on this object + * @param successCallback {Function} Callback to be invoked upon success + * @param errorCallback {Function} Callback to be invoked upon error + */ +FileTransfer.prototype.abort = function(successCallback, errorCallback) { + exec(successCallback, errorCallback, 'FileTransfer', 'abort', [this._id]); +}; + +module.exports = FileTransfer; + +}); + +// file: lib\common\plugin\FileTransferError.js +define("cordova/plugin/FileTransferError", function(require, exports, module) { + +/** + * FileTransferError + * @constructor + */ +var FileTransferError = function(code, source, target, status, body) { + this.code = code || null; + this.source = source || null; + this.target = target || null; + this.http_status = status || null; + this.body = body || null; +}; + +FileTransferError.FILE_NOT_FOUND_ERR = 1; +FileTransferError.INVALID_URL_ERR = 2; +FileTransferError.CONNECTION_ERR = 3; +FileTransferError.ABORT_ERR = 4; + +module.exports = FileTransferError; + +}); + +// file: lib\common\plugin\FileUploadOptions.js +define("cordova/plugin/FileUploadOptions", function(require, exports, module) { + +/** + * Options to customize the HTTP request used to upload files. + * @constructor + * @param fileKey {String} Name of file request parameter. + * @param fileName {String} Filename to be used by the server. Defaults to image.jpg. + * @param mimeType {String} Mimetype of the uploaded file. Defaults to image/jpeg. + * @param params {Object} Object with key: value params to send to the server. + * @param headers {Object} Keys are header names, values are header values. Multiple + * headers of the same name are not supported. + */ +var FileUploadOptions = function(fileKey, fileName, mimeType, params, headers) { + this.fileKey = fileKey || null; + this.fileName = fileName || null; + this.mimeType = mimeType || null; + this.params = params || null; + this.headers = headers || null; +}; + +module.exports = FileUploadOptions; + +}); + +// file: lib\common\plugin\FileUploadResult.js +define("cordova/plugin/FileUploadResult", function(require, exports, module) { + +/** + * FileUploadResult + * @constructor + */ +var FileUploadResult = function() { + this.bytesSent = 0; + this.responseCode = null; + this.response = null; +}; + +module.exports = FileUploadResult; + +}); + +// file: lib\common\plugin\FileWriter.js +define("cordova/plugin/FileWriter", function(require, exports, module) { + +var exec = require('cordova/exec'), + FileError = require('cordova/plugin/FileError'), + ProgressEvent = require('cordova/plugin/ProgressEvent'); + +/** + * This class writes to the mobile device file system. + * + * For Android: + * The root directory is the root of the file system. + * To write to the SD card, the file name is "sdcard/my_file.txt" + * + * @constructor + * @param file {File} File object containing file properties + * @param append if true write to the end of the file, otherwise overwrite the file + */ +var FileWriter = function(file) { + this.fileName = ""; + this.length = 0; + if (file) { + this.fileName = file.fullPath || file; + this.length = file.size || 0; + } + // default is to write at the beginning of the file + this.position = 0; + + this.readyState = 0; // EMPTY + + this.result = null; + + // Error + this.error = null; + + // Event handlers + this.onwritestart = null; // When writing starts + this.onprogress = null; // While writing the file, and reporting partial file data + this.onwrite = null; // When the write has successfully completed. + this.onwriteend = null; // When the request has completed (either in success or failure). + this.onabort = null; // When the write has been aborted. For instance, by invoking the abort() method. + this.onerror = null; // When the write has failed (see errors). +}; + +// States +FileWriter.INIT = 0; +FileWriter.WRITING = 1; +FileWriter.DONE = 2; + +/** + * Abort writing file. + */ +FileWriter.prototype.abort = function() { + // check for invalid state + if (this.readyState === FileWriter.DONE || this.readyState === FileWriter.INIT) { + throw new FileError(FileError.INVALID_STATE_ERR); + } + + // set error + this.error = new FileError(FileError.ABORT_ERR); + + this.readyState = FileWriter.DONE; + + // If abort callback + if (typeof this.onabort === "function") { + this.onabort(new ProgressEvent("abort", {"target":this})); + } + + // If write end callback + if (typeof this.onwriteend === "function") { + this.onwriteend(new ProgressEvent("writeend", {"target":this})); + } +}; + +/** + * Writes data to the file + * + * @param text to be written + */ +FileWriter.prototype.write = function(text) { + // Throw an exception if we are already writing a file + if (this.readyState === FileWriter.WRITING) { + throw new FileError(FileError.INVALID_STATE_ERR); + } + + // WRITING state + this.readyState = FileWriter.WRITING; + + var me = this; + + // If onwritestart callback + if (typeof me.onwritestart === "function") { + me.onwritestart(new ProgressEvent("writestart", {"target":me})); + } + + // Write file + exec( + // Success callback + function(r) { + // If DONE (cancelled), then don't do anything + if (me.readyState === FileWriter.DONE) { + return; + } + + // position always increases by bytes written because file would be extended + me.position += r; + // The length of the file is now where we are done writing. + + me.length = me.position; + + // DONE state + me.readyState = FileWriter.DONE; + + // If onwrite callback + if (typeof me.onwrite === "function") { + me.onwrite(new ProgressEvent("write", {"target":me})); + } + + // If onwriteend callback + if (typeof me.onwriteend === "function") { + me.onwriteend(new ProgressEvent("writeend", {"target":me})); + } + }, + // Error callback + function(e) { + // If DONE (cancelled), then don't do anything + if (me.readyState === FileWriter.DONE) { + return; + } + + // DONE state + me.readyState = FileWriter.DONE; + + // Save error + me.error = new FileError(e); + + // If onerror callback + if (typeof me.onerror === "function") { + me.onerror(new ProgressEvent("error", {"target":me})); + } + + // If onwriteend callback + if (typeof me.onwriteend === "function") { + me.onwriteend(new ProgressEvent("writeend", {"target":me})); + } + }, "File", "write", [this.fileName, text, this.position]); +}; + +/** + * Moves the file pointer to the location specified. + * + * If the offset is a negative number the position of the file + * pointer is rewound. If the offset is greater than the file + * size the position is set to the end of the file. + * + * @param offset is the location to move the file pointer to. + */ +FileWriter.prototype.seek = function(offset) { + // Throw an exception if we are already writing a file + if (this.readyState === FileWriter.WRITING) { + throw new FileError(FileError.INVALID_STATE_ERR); + } + + if (!offset && offset !== 0) { + return; + } + + // See back from end of file. + if (offset < 0) { + this.position = Math.max(offset + this.length, 0); + } + // Offset is bigger than file size so set position + // to the end of the file. + else if (offset > this.length) { + this.position = this.length; + } + // Offset is between 0 and file size so set the position + // to start writing. + else { + this.position = offset; + } +}; + +/** + * Truncates the file to the size specified. + * + * @param size to chop the file at. + */ +FileWriter.prototype.truncate = function(size) { + // Throw an exception if we are already writing a file + if (this.readyState === FileWriter.WRITING) { + throw new FileError(FileError.INVALID_STATE_ERR); + } + + // WRITING state + this.readyState = FileWriter.WRITING; + + var me = this; + + // If onwritestart callback + if (typeof me.onwritestart === "function") { + me.onwritestart(new ProgressEvent("writestart", {"target":this})); + } + + // Write file + exec( + // Success callback + function(r) { + // If DONE (cancelled), then don't do anything + if (me.readyState === FileWriter.DONE) { + return; + } + + // DONE state + me.readyState = FileWriter.DONE; + + // Update the length of the file + me.length = r; + me.position = Math.min(me.position, r); + + // If onwrite callback + if (typeof me.onwrite === "function") { + me.onwrite(new ProgressEvent("write", {"target":me})); + } + + // If onwriteend callback + if (typeof me.onwriteend === "function") { + me.onwriteend(new ProgressEvent("writeend", {"target":me})); + } + }, + // Error callback + function(e) { + // If DONE (cancelled), then don't do anything + if (me.readyState === FileWriter.DONE) { + return; + } + + // DONE state + me.readyState = FileWriter.DONE; + + // Save error + me.error = new FileError(e); + + // If onerror callback + if (typeof me.onerror === "function") { + me.onerror(new ProgressEvent("error", {"target":me})); + } + + // If onwriteend callback + if (typeof me.onwriteend === "function") { + me.onwriteend(new ProgressEvent("writeend", {"target":me})); + } + }, "File", "truncate", [this.fileName, size]); +}; + +module.exports = FileWriter; + +}); + +// file: lib\common\plugin\Flags.js +define("cordova/plugin/Flags", function(require, exports, module) { + +/** + * Supplies arguments to methods that lookup or create files and directories. + * + * @param create + * {boolean} file or directory if it doesn't exist + * @param exclusive + * {boolean} used with create; if true the command will fail if + * target path exists + */ +function Flags(create, exclusive) { + this.create = create || false; + this.exclusive = exclusive || false; +} + +module.exports = Flags; + +}); + +// file: lib\common\plugin\GlobalizationError.js +define("cordova/plugin/GlobalizationError", function(require, exports, module) { + + +/** + * Globalization error object + * + * @constructor + * @param code + * @param message + */ +var GlobalizationError = function(code, message) { + this.code = code || null; + this.message = message || ''; +}; + +// Globalization error codes +GlobalizationError.UNKNOWN_ERROR = 0; +GlobalizationError.FORMATTING_ERROR = 1; +GlobalizationError.PARSING_ERROR = 2; +GlobalizationError.PATTERN_ERROR = 3; + +module.exports = GlobalizationError; + +}); + +// file: lib\common\plugin\InAppBrowser.js +define("cordova/plugin/InAppBrowser", function(require, exports, module) { + +var exec = require('cordova/exec'); +var channel = require('cordova/channel'); + +function InAppBrowser() { + this.channels = { + 'loadstart': channel.create('loadstart'), + 'loadstop' : channel.create('loadstop'), + 'loaderror' : channel.create('loaderror'), + 'exit' : channel.create('exit') + }; +} + +InAppBrowser.prototype = { + _eventHandler: function (event) { + if (event.type in this.channels) { + this.channels[event.type].fire(event); + } + }, + close: function (eventname) { + exec(null, null, "InAppBrowser", "close", []); + }, + addEventListener: function (eventname,f) { + if (eventname in this.channels) { + this.channels[eventname].subscribe(f); + } + }, + removeEventListener: function(eventname, f) { + if (eventname in this.channels) { + this.channels[eventname].unsubscribe(f); + } + } +}; + +module.exports = function(strUrl, strWindowName, strWindowFeatures) { + var iab = new InAppBrowser(); + var cb = function(eventname) { + iab._eventHandler(eventname); + }; + exec(cb, cb, "InAppBrowser", "open", [strUrl, strWindowName, strWindowFeatures]); + return iab; +}; + + +}); + +// file: lib\common\plugin\LocalFileSystem.js +define("cordova/plugin/LocalFileSystem", function(require, exports, module) { + +var exec = require('cordova/exec'); + +/** + * Represents a local file system. + */ +var LocalFileSystem = function() { + +}; + +LocalFileSystem.TEMPORARY = 0; //temporary, with no guarantee of persistence +LocalFileSystem.PERSISTENT = 1; //persistent + +module.exports = LocalFileSystem; + +}); + +// file: lib\common\plugin\Media.js +define("cordova/plugin/Media", function(require, exports, module) { + +var argscheck = require('cordova/argscheck'), + utils = require('cordova/utils'), + exec = require('cordova/exec'); + +var mediaObjects = {}; + +/** + * This class provides access to the device media, interfaces to both sound and video + * + * @constructor + * @param src The file name or url to play + * @param successCallback The callback to be called when the file is done playing or recording. + * successCallback() + * @param errorCallback The callback to be called if there is an error. + * errorCallback(int errorCode) - OPTIONAL + * @param statusCallback The callback to be called when media status has changed. + * statusCallback(int statusCode) - OPTIONAL + */ +var Media = function(src, successCallback, errorCallback, statusCallback) { + argscheck.checkArgs('SFFF', 'Media', arguments); + this.id = utils.createUUID(); + mediaObjects[this.id] = this; + this.src = src; + this.successCallback = successCallback; + this.errorCallback = errorCallback; + this.statusCallback = statusCallback; + this._duration = -1; + this._position = -1; + exec(null, this.errorCallback, "Media", "create", [this.id, this.src]); +}; + +// Media messages +Media.MEDIA_STATE = 1; +Media.MEDIA_DURATION = 2; +Media.MEDIA_POSITION = 3; +Media.MEDIA_ERROR = 9; + +// Media states +Media.MEDIA_NONE = 0; +Media.MEDIA_STARTING = 1; +Media.MEDIA_RUNNING = 2; +Media.MEDIA_PAUSED = 3; +Media.MEDIA_STOPPED = 4; +Media.MEDIA_MSG = ["None", "Starting", "Running", "Paused", "Stopped"]; + +// "static" function to return existing objs. +Media.get = function(id) { + return mediaObjects[id]; +}; + +/** + * Start or resume playing audio file. + */ +Media.prototype.play = function(options) { + exec(null, null, "Media", "startPlayingAudio", [this.id, this.src, options]); +}; + +/** + * Stop playing audio file. + */ +Media.prototype.stop = function() { + var me = this; + exec(function() { + me._position = 0; + }, this.errorCallback, "Media", "stopPlayingAudio", [this.id]); +}; + +/** + * Seek or jump to a new time in the track.. + */ +Media.prototype.seekTo = function(milliseconds) { + var me = this; + exec(function(p) { + me._position = p; + }, this.errorCallback, "Media", "seekToAudio", [this.id, milliseconds]); +}; + +/** + * Pause playing audio file. + */ +Media.prototype.pause = function() { + exec(null, this.errorCallback, "Media", "pausePlayingAudio", [this.id]); +}; + +/** + * Get duration of an audio file. + * The duration is only set for audio that is playing, paused or stopped. + * + * @return duration or -1 if not known. + */ +Media.prototype.getDuration = function() { + return this._duration; +}; + +/** + * Get position of audio. + */ +Media.prototype.getCurrentPosition = function(success, fail) { + var me = this; + exec(function(p) { + me._position = p; + success(p); + }, fail, "Media", "getCurrentPositionAudio", [this.id]); +}; + +/** + * Start recording audio file. + */ +Media.prototype.startRecord = function() { + exec(null, this.errorCallback, "Media", "startRecordingAudio", [this.id, this.src]); +}; + +/** + * Stop recording audio file. + */ +Media.prototype.stopRecord = function() { + exec(null, this.errorCallback, "Media", "stopRecordingAudio", [this.id]); +}; + +/** + * Release the resources. + */ +Media.prototype.release = function() { + exec(null, this.errorCallback, "Media", "release", [this.id]); +}; + +/** + * Adjust the volume. + */ +Media.prototype.setVolume = function(volume) { + exec(null, null, "Media", "setVolume", [this.id, volume]); +}; + +/** + * Audio has status update. + * PRIVATE + * + * @param id The media object id (string) + * @param msgType The 'type' of update this is + * @param value Use of value is determined by the msgType + */ +Media.onStatus = function(id, msgType, value) { + + var media = mediaObjects[id]; + + if(media) { + switch(msgType) { + case Media.MEDIA_STATE : + media.statusCallback && media.statusCallback(value); + if(value == Media.MEDIA_STOPPED) { + media.successCallback && media.successCallback(); + } + break; + case Media.MEDIA_DURATION : + media._duration = value; + break; + case Media.MEDIA_ERROR : + media.errorCallback && media.errorCallback(value); + break; + case Media.MEDIA_POSITION : + media._position = Number(value); + break; + default : + console.error && console.error("Unhandled Media.onStatus :: " + msgType); + break; + } + } + else { + console.error && console.error("Received Media.onStatus callback for unknown media :: " + id); + } + +}; + +module.exports = Media; + +}); + +// file: lib\common\plugin\MediaError.js +define("cordova/plugin/MediaError", function(require, exports, module) { + +/** + * This class contains information about any Media errors. +*/ +/* + According to :: http://dev.w3.org/html5/spec-author-view/video.html#mediaerror + We should never be creating these objects, we should just implement the interface + which has 1 property for an instance, 'code' + + instead of doing : + errorCallbackFunction( new MediaError(3,'msg') ); +we should simply use a literal : + errorCallbackFunction( {'code':3} ); + */ + + var _MediaError = window.MediaError; + + +if(!_MediaError) { + window.MediaError = _MediaError = function(code, msg) { + this.code = (typeof code != 'undefined') ? code : null; + this.message = msg || ""; // message is NON-standard! do not use! + }; +} + +_MediaError.MEDIA_ERR_NONE_ACTIVE = _MediaError.MEDIA_ERR_NONE_ACTIVE || 0; +_MediaError.MEDIA_ERR_ABORTED = _MediaError.MEDIA_ERR_ABORTED || 1; +_MediaError.MEDIA_ERR_NETWORK = _MediaError.MEDIA_ERR_NETWORK || 2; +_MediaError.MEDIA_ERR_DECODE = _MediaError.MEDIA_ERR_DECODE || 3; +_MediaError.MEDIA_ERR_NONE_SUPPORTED = _MediaError.MEDIA_ERR_NONE_SUPPORTED || 4; +// TODO: MediaError.MEDIA_ERR_NONE_SUPPORTED is legacy, the W3 spec now defines it as below. +// as defined by http://dev.w3.org/html5/spec-author-view/video.html#error-codes +_MediaError.MEDIA_ERR_SRC_NOT_SUPPORTED = _MediaError.MEDIA_ERR_SRC_NOT_SUPPORTED || 4; + +module.exports = _MediaError; + +}); + +// file: lib\common\plugin\MediaFile.js +define("cordova/plugin/MediaFile", function(require, exports, module) { + +var utils = require('cordova/utils'), + exec = require('cordova/exec'), + File = require('cordova/plugin/File'), + CaptureError = require('cordova/plugin/CaptureError'); +/** + * Represents a single file. + * + * name {DOMString} name of the file, without path information + * fullPath {DOMString} the full path of the file, including the name + * type {DOMString} mime type + * lastModifiedDate {Date} last modified date + * size {Number} size of the file in bytes + */ +var MediaFile = function(name, fullPath, type, lastModifiedDate, size){ + MediaFile.__super__.constructor.apply(this, arguments); +}; + +utils.extend(MediaFile, File); + +/** + * Request capture format data for a specific file and type + * + * @param {Function} successCB + * @param {Function} errorCB + */ +MediaFile.prototype.getFormatData = function(successCallback, errorCallback) { + if (typeof this.fullPath === "undefined" || this.fullPath === null) { + errorCallback(new CaptureError(CaptureError.CAPTURE_INVALID_ARGUMENT)); + } else { + exec(successCallback, errorCallback, "Capture", "getFormatData", [this.fullPath, this.type]); + } +}; + +module.exports = MediaFile; + +}); + +// file: lib\common\plugin\MediaFileData.js +define("cordova/plugin/MediaFileData", function(require, exports, module) { + +/** + * MediaFileData encapsulates format information of a media file. + * + * @param {DOMString} codecs + * @param {long} bitrate + * @param {long} height + * @param {long} width + * @param {float} duration + */ +var MediaFileData = function(codecs, bitrate, height, width, duration){ + this.codecs = codecs || null; + this.bitrate = bitrate || 0; + this.height = height || 0; + this.width = width || 0; + this.duration = duration || 0; +}; + +module.exports = MediaFileData; + +}); + +// file: lib\common\plugin\Metadata.js +define("cordova/plugin/Metadata", function(require, exports, module) { + +/** + * Information about the state of the file or directory + * + * {Date} modificationTime (readonly) + */ +var Metadata = function(time) { + this.modificationTime = (typeof time != 'undefined'?new Date(time):null); +}; + +module.exports = Metadata; + +}); + +// file: lib\common\plugin\Position.js +define("cordova/plugin/Position", function(require, exports, module) { + +var Coordinates = require('cordova/plugin/Coordinates'); + +var Position = function(coords, timestamp) { + if (coords) { + this.coords = new Coordinates(coords.latitude, coords.longitude, coords.altitude, coords.accuracy, coords.heading, coords.velocity, coords.altitudeAccuracy); + } else { + this.coords = new Coordinates(); + } + this.timestamp = (timestamp !== undefined) ? timestamp : new Date(); +}; + +module.exports = Position; + +}); + +// file: lib\common\plugin\PositionError.js +define("cordova/plugin/PositionError", function(require, exports, module) { + +/** + * Position error object + * + * @constructor + * @param code + * @param message + */ +var PositionError = function(code, message) { + this.code = code || null; + this.message = message || ''; +}; + +PositionError.PERMISSION_DENIED = 1; +PositionError.POSITION_UNAVAILABLE = 2; +PositionError.TIMEOUT = 3; + +module.exports = PositionError; + +}); + +// file: lib\common\plugin\ProgressEvent.js +define("cordova/plugin/ProgressEvent", function(require, exports, module) { + +// If ProgressEvent exists in global context, use it already, otherwise use our own polyfill +// Feature test: See if we can instantiate a native ProgressEvent; +// if so, use that approach, +// otherwise fill-in with our own implementation. +// +// NOTE: right now we always fill in with our own. Down the road would be nice if we can use whatever is native in the webview. +var ProgressEvent = (function() { + /* + var createEvent = function(data) { + var event = document.createEvent('Events'); + event.initEvent('ProgressEvent', false, false); + if (data) { + for (var i in data) { + if (data.hasOwnProperty(i)) { + event[i] = data[i]; + } + } + if (data.target) { + // TODO: cannot call .dispatchEvent + // need to first figure out how to implement EventTarget + } + } + return event; + }; + try { + var ev = createEvent({type:"abort",target:document}); + return function ProgressEvent(type, data) { + data.type = type; + return createEvent(data); + }; + } catch(e){ + */ + return function ProgressEvent(type, dict) { + this.type = type; + this.bubbles = false; + this.cancelBubble = false; + this.cancelable = false; + this.lengthComputable = false; + this.loaded = dict && dict.loaded ? dict.loaded : 0; + this.total = dict && dict.total ? dict.total : 0; + this.target = dict && dict.target ? dict.target : null; + }; + //} +})(); + +module.exports = ProgressEvent; + +}); + +// file: lib\common\plugin\accelerometer.js +define("cordova/plugin/accelerometer", function(require, exports, module) { + +/** + * This class provides access to device accelerometer data. + * @constructor + */ +var argscheck = require('cordova/argscheck'), + utils = require("cordova/utils"), + exec = require("cordova/exec"), + Acceleration = require('cordova/plugin/Acceleration'); + +// Is the accel sensor running? +var running = false; + +// Keeps reference to watchAcceleration calls. +var timers = {}; + +// Array of listeners; used to keep track of when we should call start and stop. +var listeners = []; + +// Last returned acceleration object from native +var accel = null; + +// Tells native to start. +function start() { + exec(function(a) { + var tempListeners = listeners.slice(0); + accel = new Acceleration(a.x, a.y, a.z, a.timestamp); + for (var i = 0, l = tempListeners.length; i < l; i++) { + tempListeners[i].win(accel); + } + }, function(e) { + var tempListeners = listeners.slice(0); + for (var i = 0, l = tempListeners.length; i < l; i++) { + tempListeners[i].fail(e); + } + }, "Accelerometer", "start", []); + running = true; +} + +// Tells native to stop. +function stop() { + exec(null, null, "Accelerometer", "stop", []); + running = false; +} + +// Adds a callback pair to the listeners array +function createCallbackPair(win, fail) { + return {win:win, fail:fail}; +} + +// Removes a win/fail listener pair from the listeners array +function removeListeners(l) { + var idx = listeners.indexOf(l); + if (idx > -1) { + listeners.splice(idx, 1); + if (listeners.length === 0) { + stop(); + } + } +} + +var accelerometer = { + /** + * Asynchronously acquires the current acceleration. + * + * @param {Function} successCallback The function to call when the acceleration data is available + * @param {Function} errorCallback The function to call when there is an error getting the acceleration data. (OPTIONAL) + * @param {AccelerationOptions} options The options for getting the accelerometer data such as timeout. (OPTIONAL) + */ + getCurrentAcceleration: function(successCallback, errorCallback, options) { + argscheck.checkArgs('fFO', 'accelerometer.getCurrentAcceleration', arguments); + + var p; + var win = function(a) { + removeListeners(p); + successCallback(a); + }; + var fail = function(e) { + removeListeners(p); + errorCallback && errorCallback(e); + }; + + p = createCallbackPair(win, fail); + listeners.push(p); + + if (!running) { + start(); + } + }, + + /** + * Asynchronously acquires the acceleration repeatedly at a given interval. + * + * @param {Function} successCallback The function to call each time the acceleration data is available + * @param {Function} errorCallback The function to call when there is an error getting the acceleration data. (OPTIONAL) + * @param {AccelerationOptions} options The options for getting the accelerometer data such as timeout. (OPTIONAL) + * @return String The watch id that must be passed to #clearWatch to stop watching. + */ + watchAcceleration: function(successCallback, errorCallback, options) { + argscheck.checkArgs('fFO', 'accelerometer.watchAcceleration', arguments); + // Default interval (10 sec) + var frequency = (options && options.frequency && typeof options.frequency == 'number') ? options.frequency : 10000; + + // Keep reference to watch id, and report accel readings as often as defined in frequency + var id = utils.createUUID(); + + var p = createCallbackPair(function(){}, function(e) { + removeListeners(p); + errorCallback && errorCallback(e); + }); + listeners.push(p); + + timers[id] = { + timer:window.setInterval(function() { + if (accel) { + successCallback(accel); + } + }, frequency), + listeners:p + }; + + if (running) { + // If we're already running then immediately invoke the success callback + // but only if we have retrieved a value, sample code does not check for null ... + if (accel) { + successCallback(accel); + } + } else { + start(); + } + + return id; + }, + + /** + * Clears the specified accelerometer watch. + * + * @param {String} id The id of the watch returned from #watchAcceleration. + */ + clearWatch: function(id) { + // Stop javascript timer & remove from timer list + if (id && timers[id]) { + window.clearInterval(timers[id].timer); + removeListeners(timers[id].listeners); + delete timers[id]; + } + } +}; + +module.exports = accelerometer; + +}); + +// file: lib\common\plugin\accelerometer\symbols.js +define("cordova/plugin/accelerometer/symbols", function(require, exports, module) { + + +var modulemapper = require('cordova/modulemapper'); + +modulemapper.defaults('cordova/plugin/Acceleration', 'Acceleration'); +modulemapper.defaults('cordova/plugin/accelerometer', 'navigator.accelerometer'); + +}); + +// file: lib\common\plugin\battery.js +define("cordova/plugin/battery", function(require, exports, module) { + +/** + * This class contains information about the current battery status. + * @constructor + */ +var cordova = require('cordova'), + exec = require('cordova/exec'); + +function handlers() { + return battery.channels.batterystatus.numHandlers + + battery.channels.batterylow.numHandlers + + battery.channels.batterycritical.numHandlers; +} + +var Battery = function() { + this._level = null; + this._isPlugged = null; + // Create new event handlers on the window (returns a channel instance) + this.channels = { + batterystatus:cordova.addWindowEventHandler("batterystatus"), + batterylow:cordova.addWindowEventHandler("batterylow"), + batterycritical:cordova.addWindowEventHandler("batterycritical") + }; + for (var key in this.channels) { + this.channels[key].onHasSubscribersChange = Battery.onHasSubscribersChange; + } +}; +/** + * Event handlers for when callbacks get registered for the battery. + * Keep track of how many handlers we have so we can start and stop the native battery listener + * appropriately (and hopefully save on battery life!). + */ +Battery.onHasSubscribersChange = function() { + // If we just registered the first handler, make sure native listener is started. + if (this.numHandlers === 1 && handlers() === 1) { + exec(battery._status, battery._error, "Battery", "start", []); + } else if (handlers() === 0) { + exec(null, null, "Battery", "stop", []); + } +}; + +/** + * Callback for battery status + * + * @param {Object} info keys: level, isPlugged + */ +Battery.prototype._status = function(info) { + if (info) { + var me = battery; + var level = info.level; + if (me._level !== level || me._isPlugged !== info.isPlugged) { + // Fire batterystatus event + cordova.fireWindowEvent("batterystatus", info); + + // Fire low battery event + if (level === 20 || level === 5) { + if (level === 20) { + cordova.fireWindowEvent("batterylow", info); + } + else { + cordova.fireWindowEvent("batterycritical", info); + } + } + } + me._level = level; + me._isPlugged = info.isPlugged; + } +}; + +/** + * Error callback for battery start + */ +Battery.prototype._error = function(e) { + console.log("Error initializing Battery: " + e); +}; + +var battery = new Battery(); + +module.exports = battery; + +}); + +// file: lib\common\plugin\battery\symbols.js +define("cordova/plugin/battery/symbols", function(require, exports, module) { + + +var modulemapper = require('cordova/modulemapper'); + +modulemapper.defaults('cordova/plugin/battery', 'navigator.battery'); + +}); + +// file: lib\common\plugin\camera\symbols.js +define("cordova/plugin/camera/symbols", function(require, exports, module) { + + +var modulemapper = require('cordova/modulemapper'); + +modulemapper.defaults('cordova/plugin/Camera', 'navigator.camera'); +modulemapper.defaults('cordova/plugin/CameraConstants', 'Camera'); +modulemapper.defaults('cordova/plugin/CameraPopoverOptions', 'CameraPopoverOptions'); + +}); + +// file: lib\common\plugin\capture.js +define("cordova/plugin/capture", function(require, exports, module) { + +var exec = require('cordova/exec'), + MediaFile = require('cordova/plugin/MediaFile'); + +/** + * Launches a capture of different types. + * + * @param (DOMString} type + * @param {Function} successCB + * @param {Function} errorCB + * @param {CaptureVideoOptions} options + */ +function _capture(type, successCallback, errorCallback, options) { + var win = function(pluginResult) { + var mediaFiles = []; + var i; + for (i = 0; i < pluginResult.length; i++) { + var mediaFile = new MediaFile(); + mediaFile.name = pluginResult[i].name; + mediaFile.fullPath = pluginResult[i].fullPath; + mediaFile.type = pluginResult[i].type; + mediaFile.lastModifiedDate = pluginResult[i].lastModifiedDate; + mediaFile.size = pluginResult[i].size; + mediaFiles.push(mediaFile); + } + successCallback(mediaFiles); + }; + exec(win, errorCallback, "Capture", type, [options]); +} +/** + * The Capture interface exposes an interface to the camera and microphone of the hosting device. + */ +function Capture() { + this.supportedAudioModes = []; + this.supportedImageModes = []; + this.supportedVideoModes = []; +} + +/** + * Launch audio recorder application for recording audio clip(s). + * + * @param {Function} successCB + * @param {Function} errorCB + * @param {CaptureAudioOptions} options + */ +Capture.prototype.captureAudio = function(successCallback, errorCallback, options){ + _capture("captureAudio", successCallback, errorCallback, options); +}; + +/** + * Launch camera application for taking image(s). + * + * @param {Function} successCB + * @param {Function} errorCB + * @param {CaptureImageOptions} options + */ +Capture.prototype.captureImage = function(successCallback, errorCallback, options){ + _capture("captureImage", successCallback, errorCallback, options); +}; + +/** + * Launch device camera application for recording video(s). + * + * @param {Function} successCB + * @param {Function} errorCB + * @param {CaptureVideoOptions} options + */ +Capture.prototype.captureVideo = function(successCallback, errorCallback, options){ + _capture("captureVideo", successCallback, errorCallback, options); +}; + + +module.exports = new Capture(); + +}); + +// file: lib\windows8\plugin\capture\symbols.js +define("cordova/plugin/capture/symbols", function(require, exports, module) { + +var modulemapper = require('cordova/modulemapper'); + +modulemapper.clobbers('cordova/plugin/CaptureError', 'CaptureError'); +modulemapper.clobbers('cordova/plugin/CaptureAudioOptions', 'CaptureAudioOptions'); +modulemapper.clobbers('cordova/plugin/CaptureImageOptions', 'CaptureImageOptions'); +modulemapper.clobbers('cordova/plugin/CaptureVideoOptions', 'CaptureVideoOptions'); +modulemapper.clobbers('cordova/plugin/MediaFile', 'MediaFile'); +modulemapper.clobbers('cordova/plugin/MediaFileData', 'MediaFileData'); +modulemapper.clobbers('cordova/plugin/capture', 'navigator.device.capture'); + +modulemapper.merges('cordova/plugin/windows8/MediaFile', 'MediaFile'); + +}); + +// file: lib\common\plugin\compass.js +define("cordova/plugin/compass", function(require, exports, module) { + +var argscheck = require('cordova/argscheck'), + exec = require('cordova/exec'), + utils = require('cordova/utils'), + CompassHeading = require('cordova/plugin/CompassHeading'), + CompassError = require('cordova/plugin/CompassError'), + timers = {}, + compass = { + /** + * Asynchronously acquires the current heading. + * @param {Function} successCallback The function to call when the heading + * data is available + * @param {Function} errorCallback The function to call when there is an error + * getting the heading data. + * @param {CompassOptions} options The options for getting the heading data (not used). + */ + getCurrentHeading:function(successCallback, errorCallback, options) { + argscheck.checkArgs('fFO', 'compass.getCurrentHeading', arguments); + + var win = function(result) { + var ch = new CompassHeading(result.magneticHeading, result.trueHeading, result.headingAccuracy, result.timestamp); + successCallback(ch); + }; + var fail = errorCallback && function(code) { + var ce = new CompassError(code); + errorCallback(ce); + }; + + // Get heading + exec(win, fail, "Compass", "getHeading", [options]); + }, + + /** + * Asynchronously acquires the heading repeatedly at a given interval. + * @param {Function} successCallback The function to call each time the heading + * data is available + * @param {Function} errorCallback The function to call when there is an error + * getting the heading data. + * @param {HeadingOptions} options The options for getting the heading data + * such as timeout and the frequency of the watch. For iOS, filter parameter + * specifies to watch via a distance filter rather than time. + */ + watchHeading:function(successCallback, errorCallback, options) { + argscheck.checkArgs('fFO', 'compass.watchHeading', arguments); + // Default interval (100 msec) + var frequency = (options !== undefined && options.frequency !== undefined) ? options.frequency : 100; + var filter = (options !== undefined && options.filter !== undefined) ? options.filter : 0; + + var id = utils.createUUID(); + if (filter > 0) { + // is an iOS request for watch by filter, no timer needed + timers[id] = "iOS"; + compass.getCurrentHeading(successCallback, errorCallback, options); + } else { + // Start watch timer to get headings + timers[id] = window.setInterval(function() { + compass.getCurrentHeading(successCallback, errorCallback); + }, frequency); + } + + return id; + }, + + /** + * Clears the specified heading watch. + * @param {String} watchId The ID of the watch returned from #watchHeading. + */ + clearWatch:function(id) { + // Stop javascript timer & remove from timer list + if (id && timers[id]) { + if (timers[id] != "iOS") { + clearInterval(timers[id]); + } else { + // is iOS watch by filter so call into device to stop + exec(null, null, "Compass", "stopHeading", []); + } + delete timers[id]; + } + } + }; + +module.exports = compass; + +}); + +// file: lib\common\plugin\compass\symbols.js +define("cordova/plugin/compass/symbols", function(require, exports, module) { + + +var modulemapper = require('cordova/modulemapper'); + +modulemapper.clobbers('cordova/plugin/CompassHeading', 'CompassHeading'); +modulemapper.clobbers('cordova/plugin/CompassError', 'CompassError'); +modulemapper.clobbers('cordova/plugin/compass', 'navigator.compass'); + +}); + +// file: lib\common\plugin\console-via-logger.js +define("cordova/plugin/console-via-logger", function(require, exports, module) { + +//------------------------------------------------------------------------------ + +var logger = require("cordova/plugin/logger"); +var utils = require("cordova/utils"); + +//------------------------------------------------------------------------------ +// object that we're exporting +//------------------------------------------------------------------------------ +var console = module.exports; + +//------------------------------------------------------------------------------ +// copy of the original console object +//------------------------------------------------------------------------------ +var WinConsole = window.console; + +//------------------------------------------------------------------------------ +// whether to use the logger +//------------------------------------------------------------------------------ +var UseLogger = false; + +//------------------------------------------------------------------------------ +// Timers +//------------------------------------------------------------------------------ +var Timers = {}; + +//------------------------------------------------------------------------------ +// used for unimplemented methods +//------------------------------------------------------------------------------ +function noop() {} + +//------------------------------------------------------------------------------ +// used for unimplemented methods +//------------------------------------------------------------------------------ +console.useLogger = function (value) { + if (arguments.length) UseLogger = !!value; + + if (UseLogger) { + if (logger.useConsole()) { + throw new Error("console and logger are too intertwingly"); + } + } + + return UseLogger; +}; + +//------------------------------------------------------------------------------ +console.log = function() { + if (logger.useConsole()) return; + logger.log.apply(logger, [].slice.call(arguments)); +}; + +//------------------------------------------------------------------------------ +console.error = function() { + if (logger.useConsole()) return; + logger.error.apply(logger, [].slice.call(arguments)); +}; + +//------------------------------------------------------------------------------ +console.warn = function() { + if (logger.useConsole()) return; + logger.warn.apply(logger, [].slice.call(arguments)); +}; + +//------------------------------------------------------------------------------ +console.info = function() { + if (logger.useConsole()) return; + logger.info.apply(logger, [].slice.call(arguments)); +}; + +//------------------------------------------------------------------------------ +console.debug = function() { + if (logger.useConsole()) return; + logger.debug.apply(logger, [].slice.call(arguments)); +}; + +//------------------------------------------------------------------------------ +console.assert = function(expression) { + if (expression) return; + + var message = utils.vformat(arguments[1], [].slice.call(arguments, 2)); + console.log("ASSERT: " + message); +}; + +//------------------------------------------------------------------------------ +console.clear = function() {}; + +//------------------------------------------------------------------------------ +console.dir = function(object) { + console.log("%o", object); +}; + +//------------------------------------------------------------------------------ +console.dirxml = function(node) { + console.log(node.innerHTML); +}; + +//------------------------------------------------------------------------------ +console.trace = noop; + +//------------------------------------------------------------------------------ +console.group = console.log; + +//------------------------------------------------------------------------------ +console.groupCollapsed = console.log; + +//------------------------------------------------------------------------------ +console.groupEnd = noop; + +//------------------------------------------------------------------------------ +console.time = function(name) { + Timers[name] = new Date().valueOf(); +}; + +//------------------------------------------------------------------------------ +console.timeEnd = function(name) { + var timeStart = Timers[name]; + if (!timeStart) { + console.warn("unknown timer: " + name); + return; + } + + var timeElapsed = new Date().valueOf() - timeStart; + console.log(name + ": " + timeElapsed + "ms"); +}; + +//------------------------------------------------------------------------------ +console.timeStamp = noop; + +//------------------------------------------------------------------------------ +console.profile = noop; + +//------------------------------------------------------------------------------ +console.profileEnd = noop; + +//------------------------------------------------------------------------------ +console.count = noop; + +//------------------------------------------------------------------------------ +console.exception = console.log; + +//------------------------------------------------------------------------------ +console.table = function(data, columns) { + console.log("%o", data); +}; + +//------------------------------------------------------------------------------ +// return a new function that calls both functions passed as args +//------------------------------------------------------------------------------ +function wrappedOrigCall(orgFunc, newFunc) { + return function() { + var args = [].slice.call(arguments); + try { orgFunc.apply(WinConsole, args); } catch (e) {} + try { newFunc.apply(console, args); } catch (e) {} + }; +} + +//------------------------------------------------------------------------------ +// For every function that exists in the original console object, that +// also exists in the new console object, wrap the new console method +// with one that calls both +//------------------------------------------------------------------------------ +for (var key in console) { + if (typeof WinConsole[key] == "function") { + console[key] = wrappedOrigCall(WinConsole[key], console[key]); + } +} + +}); + +// file: lib\common\plugin\contacts.js +define("cordova/plugin/contacts", function(require, exports, module) { + +var argscheck = require('cordova/argscheck'), + exec = require('cordova/exec'), + ContactError = require('cordova/plugin/ContactError'), + utils = require('cordova/utils'), + Contact = require('cordova/plugin/Contact'); + +/** +* Represents a group of Contacts. +* @constructor +*/ +var contacts = { + /** + * Returns an array of Contacts matching the search criteria. + * @param fields that should be searched + * @param successCB success callback + * @param errorCB error callback + * @param {ContactFindOptions} options that can be applied to contact searching + * @return array of Contacts matching search criteria + */ + find:function(fields, successCB, errorCB, options) { + argscheck.checkArgs('afFO', 'contacts.find', arguments); + if (!fields.length) { + errorCB && errorCB(new ContactError(ContactError.INVALID_ARGUMENT_ERROR)); + } else { + var win = function(result) { + var cs = []; + for (var i = 0, l = result.length; i < l; i++) { + cs.push(contacts.create(result[i])); + } + successCB(cs); + }; + exec(win, errorCB, "Contacts", "search", [fields, options]); + } + }, + + /** + * This function creates a new contact, but it does not persist the contact + * to device storage. To persist the contact to device storage, invoke + * contact.save(). + * @param properties an object whose properties will be examined to create a new Contact + * @returns new Contact object + */ + create:function(properties) { + argscheck.checkArgs('O', 'contacts.create', arguments); + var contact = new Contact(); + for (var i in properties) { + if (typeof contact[i] !== 'undefined' && properties.hasOwnProperty(i)) { + contact[i] = properties[i]; + } + } + return contact; + } +}; + +module.exports = contacts; + +}); + +// file: lib\common\plugin\contacts\symbols.js +define("cordova/plugin/contacts/symbols", function(require, exports, module) { + + +var modulemapper = require('cordova/modulemapper'); + +modulemapper.clobbers('cordova/plugin/contacts', 'navigator.contacts'); +modulemapper.clobbers('cordova/plugin/Contact', 'Contact'); +modulemapper.clobbers('cordova/plugin/ContactAddress', 'ContactAddress'); +modulemapper.clobbers('cordova/plugin/ContactError', 'ContactError'); +modulemapper.clobbers('cordova/plugin/ContactField', 'ContactField'); +modulemapper.clobbers('cordova/plugin/ContactFindOptions', 'ContactFindOptions'); +modulemapper.clobbers('cordova/plugin/ContactName', 'ContactName'); +modulemapper.clobbers('cordova/plugin/ContactOrganization', 'ContactOrganization'); + +}); + +// file: lib\common\plugin\device.js +define("cordova/plugin/device", function(require, exports, module) { + +var argscheck = require('cordova/argscheck'), + channel = require('cordova/channel'), + utils = require('cordova/utils'), + exec = require('cordova/exec'); + +// Tell cordova channel to wait on the CordovaInfoReady event +channel.waitForInitialization('onCordovaInfoReady'); + +/** + * This represents the mobile device, and provides properties for inspecting the model, version, UUID of the + * phone, etc. + * @constructor + */ +function Device() { + this.available = false; + this.platform = null; + this.version = null; + this.name = null; + this.uuid = null; + this.cordova = null; + this.model = null; + + var me = this; + + channel.onCordovaReady.subscribe(function() { + me.getInfo(function(info) { + me.available = true; + me.platform = info.platform; + me.version = info.version; + me.name = info.name; + me.uuid = info.uuid; + me.cordova = info.cordova; + me.model = info.model; + channel.onCordovaInfoReady.fire(); + },function(e) { + me.available = false; + utils.alert("[ERROR] Error initializing Cordova: " + e); + }); + }); +} + +/** + * Get device info + * + * @param {Function} successCallback The function to call when the heading data is available + * @param {Function} errorCallback The function to call when there is an error getting the heading data. (OPTIONAL) + */ +Device.prototype.getInfo = function(successCallback, errorCallback) { + argscheck.checkArgs('fF', 'Device.getInfo', arguments); + exec(successCallback, errorCallback, "Device", "getDeviceInfo", []); +}; + +module.exports = new Device(); + +}); + +// file: lib\common\plugin\device\symbols.js +define("cordova/plugin/device/symbols", function(require, exports, module) { + + +var modulemapper = require('cordova/modulemapper'); + +modulemapper.clobbers('cordova/plugin/device', 'device'); + +}); + +// file: lib\common\plugin\echo.js +define("cordova/plugin/echo", function(require, exports, module) { + +var exec = require('cordova/exec'), + utils = require('cordova/utils'); + +/** + * Sends the given message through exec() to the Echo plugin, which sends it back to the successCallback. + * @param successCallback invoked with a FileSystem object + * @param errorCallback invoked if error occurs retrieving file system + * @param message The string to be echoed. + * @param forceAsync Whether to force an async return value (for testing native->js bridge). + */ +module.exports = function(successCallback, errorCallback, message, forceAsync) { + var action = 'echo'; + var messageIsMultipart = (utils.typeName(message) == "Array"); + var args = messageIsMultipart ? message : [message]; + + if (utils.typeName(message) == 'ArrayBuffer') { + if (forceAsync) { + console.warn('Cannot echo ArrayBuffer with forced async, falling back to sync.'); + } + action += 'ArrayBuffer'; + } else if (messageIsMultipart) { + if (forceAsync) { + console.warn('Cannot echo MultiPart Array with forced async, falling back to sync.'); + } + action += 'MultiPart'; + } else if (forceAsync) { + action += 'Async'; + } + + exec(successCallback, errorCallback, "Echo", action, args); +}; + + +}); + +// file: lib\windows8\plugin\file\symbols.js +define("cordova/plugin/file/symbols", function(require, exports, module) { + + +var modulemapper = require('cordova/modulemapper'), + symbolshelper = require('cordova/plugin/file/symbolshelper'); + +symbolshelper(modulemapper.defaults); +modulemapper.clobbers('cordova/plugin/File', 'File'); +modulemapper.clobbers('cordova/plugin/FileReader', 'FileReader'); + +}); + +// file: lib\common\plugin\file\symbolshelper.js +define("cordova/plugin/file/symbolshelper", function(require, exports, module) { + +module.exports = function(exportFunc) { + exportFunc('cordova/plugin/DirectoryEntry', 'DirectoryEntry'); + exportFunc('cordova/plugin/DirectoryReader', 'DirectoryReader'); + exportFunc('cordova/plugin/Entry', 'Entry'); + exportFunc('cordova/plugin/File', 'File'); + exportFunc('cordova/plugin/FileEntry', 'FileEntry'); + exportFunc('cordova/plugin/FileError', 'FileError'); + exportFunc('cordova/plugin/FileReader', 'FileReader'); + exportFunc('cordova/plugin/FileSystem', 'FileSystem'); + exportFunc('cordova/plugin/FileUploadOptions', 'FileUploadOptions'); + exportFunc('cordova/plugin/FileUploadResult', 'FileUploadResult'); + exportFunc('cordova/plugin/FileWriter', 'FileWriter'); + exportFunc('cordova/plugin/Flags', 'Flags'); + exportFunc('cordova/plugin/LocalFileSystem', 'LocalFileSystem'); + exportFunc('cordova/plugin/Metadata', 'Metadata'); + exportFunc('cordova/plugin/ProgressEvent', 'ProgressEvent'); + exportFunc('cordova/plugin/requestFileSystem', 'requestFileSystem'); + exportFunc('cordova/plugin/resolveLocalFileSystemURI', 'resolveLocalFileSystemURI'); +}; + +}); + +// file: lib\common\plugin\filetransfer\symbols.js +define("cordova/plugin/filetransfer/symbols", function(require, exports, module) { + + +var modulemapper = require('cordova/modulemapper'); + +modulemapper.clobbers('cordova/plugin/FileTransfer', 'FileTransfer'); +modulemapper.clobbers('cordova/plugin/FileTransferError', 'FileTransferError'); + +}); + +// file: lib\common\plugin\geolocation.js +define("cordova/plugin/geolocation", function(require, exports, module) { + +var argscheck = require('cordova/argscheck'), + utils = require('cordova/utils'), + exec = require('cordova/exec'), + PositionError = require('cordova/plugin/PositionError'), + Position = require('cordova/plugin/Position'); + +var timers = {}; // list of timers in use + +// Returns default params, overrides if provided with values +function parseParameters(options) { + var opt = { + maximumAge: 0, + enableHighAccuracy: false, + timeout: Infinity + }; + + if (options) { + if (options.maximumAge !== undefined && !isNaN(options.maximumAge) && options.maximumAge > 0) { + opt.maximumAge = options.maximumAge; + } + if (options.enableHighAccuracy !== undefined) { + opt.enableHighAccuracy = options.enableHighAccuracy; + } + if (options.timeout !== undefined && !isNaN(options.timeout)) { + if (options.timeout < 0) { + opt.timeout = 0; + } else { + opt.timeout = options.timeout; + } + } + } + + return opt; +} + +// Returns a timeout failure, closed over a specified timeout value and error callback. +function createTimeout(errorCallback, timeout) { + var t = setTimeout(function() { + clearTimeout(t); + t = null; + errorCallback({ + code:PositionError.TIMEOUT, + message:"Position retrieval timed out." + }); + }, timeout); + return t; +} + +var geolocation = { + lastPosition:null, // reference to last known (cached) position returned + /** + * Asynchronously acquires the current position. + * + * @param {Function} successCallback The function to call when the position data is available + * @param {Function} errorCallback The function to call when there is an error getting the heading position. (OPTIONAL) + * @param {PositionOptions} options The options for getting the position data. (OPTIONAL) + */ + getCurrentPosition:function(successCallback, errorCallback, options) { + argscheck.checkArgs('fFO', 'geolocation.getCurrentPosition', arguments); + options = parseParameters(options); + + // Timer var that will fire an error callback if no position is retrieved from native + // before the "timeout" param provided expires + var timeoutTimer = {timer:null}; + + var win = function(p) { + clearTimeout(timeoutTimer.timer); + if (!(timeoutTimer.timer)) { + // Timeout already happened, or native fired error callback for + // this geo request. + // Don't continue with success callback. + return; + } + var pos = new Position( + { + latitude:p.latitude, + longitude:p.longitude, + altitude:p.altitude, + accuracy:p.accuracy, + heading:p.heading, + velocity:p.velocity, + altitudeAccuracy:p.altitudeAccuracy + }, + (p.timestamp === undefined ? new Date() : ((p.timestamp instanceof Date) ? p.timestamp : new Date(p.timestamp))) + ); + geolocation.lastPosition = pos; + successCallback(pos); + }; + var fail = function(e) { + clearTimeout(timeoutTimer.timer); + timeoutTimer.timer = null; + var err = new PositionError(e.code, e.message); + if (errorCallback) { + errorCallback(err); + } + }; + + // Check our cached position, if its timestamp difference with current time is less than the maximumAge, then just + // fire the success callback with the cached position. + if (geolocation.lastPosition && options.maximumAge && (((new Date()).getTime() - geolocation.lastPosition.timestamp.getTime()) <= options.maximumAge)) { + successCallback(geolocation.lastPosition); + // If the cached position check failed and the timeout was set to 0, error out with a TIMEOUT error object. + } else if (options.timeout === 0) { + fail({ + code:PositionError.TIMEOUT, + message:"timeout value in PositionOptions set to 0 and no cached Position object available, or cached Position object's age exceeds provided PositionOptions' maximumAge parameter." + }); + // Otherwise we have to call into native to retrieve a position. + } else { + if (options.timeout !== Infinity) { + // If the timeout value was not set to Infinity (default), then + // set up a timeout function that will fire the error callback + // if no successful position was retrieved before timeout expired. + timeoutTimer.timer = createTimeout(fail, options.timeout); + } else { + // This is here so the check in the win function doesn't mess stuff up + // may seem weird but this guarantees timeoutTimer is + // always truthy before we call into native + timeoutTimer.timer = true; + } + exec(win, fail, "Geolocation", "getLocation", [options.enableHighAccuracy, options.maximumAge]); + } + return timeoutTimer; + }, + /** + * Asynchronously watches the geolocation for changes to geolocation. When a change occurs, + * the successCallback is called with the new location. + * + * @param {Function} successCallback The function to call each time the location data is available + * @param {Function} errorCallback The function to call when there is an error getting the location data. (OPTIONAL) + * @param {PositionOptions} options The options for getting the location data such as frequency. (OPTIONAL) + * @return String The watch id that must be passed to #clearWatch to stop watching. + */ + watchPosition:function(successCallback, errorCallback, options) { + argscheck.checkArgs('fFO', 'geolocation.getCurrentPosition', arguments); + options = parseParameters(options); + + var id = utils.createUUID(); + + // Tell device to get a position ASAP, and also retrieve a reference to the timeout timer generated in getCurrentPosition + timers[id] = geolocation.getCurrentPosition(successCallback, errorCallback, options); + + var fail = function(e) { + clearTimeout(timers[id].timer); + var err = new PositionError(e.code, e.message); + if (errorCallback) { + errorCallback(err); + } + }; + + var win = function(p) { + clearTimeout(timers[id].timer); + if (options.timeout !== Infinity) { + timers[id].timer = createTimeout(fail, options.timeout); + } + var pos = new Position( + { + latitude:p.latitude, + longitude:p.longitude, + altitude:p.altitude, + accuracy:p.accuracy, + heading:p.heading, + velocity:p.velocity, + altitudeAccuracy:p.altitudeAccuracy + }, + (p.timestamp === undefined ? new Date() : ((p.timestamp instanceof Date) ? p.timestamp : new Date(p.timestamp))) + ); + geolocation.lastPosition = pos; + successCallback(pos); + }; + + exec(win, fail, "Geolocation", "addWatch", [id, options.enableHighAccuracy]); + + return id; + }, + /** + * Clears the specified heading watch. + * + * @param {String} id The ID of the watch returned from #watchPosition + */ + clearWatch:function(id) { + if (id && timers[id] !== undefined) { + clearTimeout(timers[id].timer); + timers[id].timer = false; + exec(null, null, "Geolocation", "clearWatch", [id]); + } + } +}; + +module.exports = geolocation; + +}); + +// file: lib\common\plugin\geolocation\symbols.js +define("cordova/plugin/geolocation/symbols", function(require, exports, module) { + + +var modulemapper = require('cordova/modulemapper'); + +modulemapper.defaults('cordova/plugin/geolocation', 'navigator.geolocation'); +modulemapper.clobbers('cordova/plugin/PositionError', 'PositionError'); +modulemapper.clobbers('cordova/plugin/Position', 'Position'); +modulemapper.clobbers('cordova/plugin/Coordinates', 'Coordinates'); + +}); + +// file: lib\common\plugin\globalization.js +define("cordova/plugin/globalization", function(require, exports, module) { + +var argscheck = require('cordova/argscheck'), + exec = require('cordova/exec'), + GlobalizationError = require('cordova/plugin/GlobalizationError'); + +var globalization = { + +/** +* Returns the string identifier for the client's current language. +* It returns the language identifier string to the successCB callback with a +* properties object as a parameter. If there is an error getting the language, +* then the errorCB callback is invoked. +* +* @param {Function} successCB +* @param {Function} errorCB +* +* @return Object.value {String}: The language identifier +* +* @error GlobalizationError.UNKNOWN_ERROR +* +* Example +* globalization.getPreferredLanguage(function (language) {alert('language:' + language.value + '\n');}, +* function () {}); +*/ +getPreferredLanguage:function(successCB, failureCB) { + argscheck.checkArgs('fF', 'Globalization.getPreferredLanguage', arguments); + exec(successCB, failureCB, "Globalization","getPreferredLanguage", []); +}, + +/** +* Returns the string identifier for the client's current locale setting. +* It returns the locale identifier string to the successCB callback with a +* properties object as a parameter. If there is an error getting the locale, +* then the errorCB callback is invoked. +* +* @param {Function} successCB +* @param {Function} errorCB +* +* @return Object.value {String}: The locale identifier +* +* @error GlobalizationError.UNKNOWN_ERROR +* +* Example +* globalization.getLocaleName(function (locale) {alert('locale:' + locale.value + '\n');}, +* function () {}); +*/ +getLocaleName:function(successCB, failureCB) { + argscheck.checkArgs('fF', 'Globalization.getLocaleName', arguments); + exec(successCB, failureCB, "Globalization","getLocaleName", []); +}, + + +/** +* Returns a date formatted as a string according to the client's user preferences and +* calendar using the time zone of the client. It returns the formatted date string to the +* successCB callback with a properties object as a parameter. If there is an error +* formatting the date, then the errorCB callback is invoked. +* +* The defaults are: formatLength="short" and selector="date and time" +* +* @param {Date} date +* @param {Function} successCB +* @param {Function} errorCB +* @param {Object} options {optional} +* formatLength {String}: 'short', 'medium', 'long', or 'full' +* selector {String}: 'date', 'time', or 'date and time' +* +* @return Object.value {String}: The localized date string +* +* @error GlobalizationError.FORMATTING_ERROR +* +* Example +* globalization.dateToString(new Date(), +* function (date) {alert('date:' + date.value + '\n');}, +* function (errorCode) {alert(errorCode);}, +* {formatLength:'short'}); +*/ +dateToString:function(date, successCB, failureCB, options) { + argscheck.checkArgs('dfFO', 'Globalization.dateToString', arguments); + var dateValue = date.valueOf(); + exec(successCB, failureCB, "Globalization", "dateToString", [{"date": dateValue, "options": options}]); +}, + + +/** +* Parses a date formatted as a string according to the client's user +* preferences and calendar using the time zone of the client and returns +* the corresponding date object. It returns the date to the successCB +* callback with a properties object as a parameter. If there is an error +* parsing the date string, then the errorCB callback is invoked. +* +* The defaults are: formatLength="short" and selector="date and time" +* +* @param {String} dateString +* @param {Function} successCB +* @param {Function} errorCB +* @param {Object} options {optional} +* formatLength {String}: 'short', 'medium', 'long', or 'full' +* selector {String}: 'date', 'time', or 'date and time' +* +* @return Object.year {Number}: The four digit year +* Object.month {Number}: The month from (0 - 11) +* Object.day {Number}: The day from (1 - 31) +* Object.hour {Number}: The hour from (0 - 23) +* Object.minute {Number}: The minute from (0 - 59) +* Object.second {Number}: The second from (0 - 59) +* Object.millisecond {Number}: The milliseconds (from 0 - 999), +* not available on all platforms +* +* @error GlobalizationError.PARSING_ERROR +* +* Example +* globalization.stringToDate('4/11/2011', +* function (date) { alert('Month:' + date.month + '\n' + +* 'Day:' + date.day + '\n' + +* 'Year:' + date.year + '\n');}, +* function (errorCode) {alert(errorCode);}, +* {selector:'date'}); +*/ +stringToDate:function(dateString, successCB, failureCB, options) { + argscheck.checkArgs('sfFO', 'Globalization.stringToDate', arguments); + exec(successCB, failureCB, "Globalization", "stringToDate", [{"dateString": dateString, "options": options}]); +}, + + +/** +* Returns a pattern string for formatting and parsing dates according to the client's +* user preferences. It returns the pattern to the successCB callback with a +* properties object as a parameter. If there is an error obtaining the pattern, +* then the errorCB callback is invoked. +* +* The defaults are: formatLength="short" and selector="date and time" +* +* @param {Function} successCB +* @param {Function} errorCB +* @param {Object} options {optional} +* formatLength {String}: 'short', 'medium', 'long', or 'full' +* selector {String}: 'date', 'time', or 'date and time' +* +* @return Object.pattern {String}: The date and time pattern for formatting and parsing dates. +* The patterns follow Unicode Technical Standard #35 +* http://unicode.org/reports/tr35/tr35-4.html +* Object.timezone {String}: The abbreviated name of the time zone on the client +* Object.utc_offset {Number}: The current difference in seconds between the client's +* time zone and coordinated universal time. +* Object.dst_offset {Number}: The current daylight saving time offset in seconds +* between the client's non-daylight saving's time zone +* and the client's daylight saving's time zone. +* +* @error GlobalizationError.PATTERN_ERROR +* +* Example +* globalization.getDatePattern( +* function (date) {alert('pattern:' + date.pattern + '\n');}, +* function () {}, +* {formatLength:'short'}); +*/ +getDatePattern:function(successCB, failureCB, options) { + argscheck.checkArgs('fFO', 'Globalization.getDatePattern', arguments); + exec(successCB, failureCB, "Globalization", "getDatePattern", [{"options": options}]); +}, + + +/** +* Returns an array of either the names of the months or days of the week +* according to the client's user preferences and calendar. It returns the array of names to the +* successCB callback with a properties object as a parameter. If there is an error obtaining the +* names, then the errorCB callback is invoked. +* +* The defaults are: type="wide" and item="months" +* +* @param {Function} successCB +* @param {Function} errorCB +* @param {Object} options {optional} +* type {String}: 'narrow' or 'wide' +* item {String}: 'months', or 'days' +* +* @return Object.value {Array{String}}: The array of names starting from either +* the first month in the year or the +* first day of the week. +* @error GlobalizationError.UNKNOWN_ERROR +* +* Example +* globalization.getDateNames(function (names) { +* for(var i = 0; i < names.value.length; i++) { +* alert('Month:' + names.value[i] + '\n');}}, +* function () {}); +*/ +getDateNames:function(successCB, failureCB, options) { + argscheck.checkArgs('fFO', 'Globalization.getDateNames', arguments); + exec(successCB, failureCB, "Globalization", "getDateNames", [{"options": options}]); +}, + +/** +* Returns whether daylight savings time is in effect for a given date using the client's +* time zone and calendar. It returns whether or not daylight savings time is in effect +* to the successCB callback with a properties object as a parameter. If there is an error +* reading the date, then the errorCB callback is invoked. +* +* @param {Date} date +* @param {Function} successCB +* @param {Function} errorCB +* +* @return Object.dst {Boolean}: The value "true" indicates that daylight savings time is +* in effect for the given date and "false" indicate that it is not. +* +* @error GlobalizationError.UNKNOWN_ERROR +* +* Example +* globalization.isDayLightSavingsTime(new Date(), +* function (date) {alert('dst:' + date.dst + '\n');} +* function () {}); +*/ +isDayLightSavingsTime:function(date, successCB, failureCB) { + argscheck.checkArgs('dfF', 'Globalization.isDayLightSavingsTime', arguments); + var dateValue = date.valueOf(); + exec(successCB, failureCB, "Globalization", "isDayLightSavingsTime", [{"date": dateValue}]); +}, + +/** +* Returns the first day of the week according to the client's user preferences and calendar. +* The days of the week are numbered starting from 1 where 1 is considered to be Sunday. +* It returns the day to the successCB callback with a properties object as a parameter. +* If there is an error obtaining the pattern, then the errorCB callback is invoked. +* +* @param {Function} successCB +* @param {Function} errorCB +* +* @return Object.value {Number}: The number of the first day of the week. +* +* @error GlobalizationError.UNKNOWN_ERROR +* +* Example +* globalization.getFirstDayOfWeek(function (day) +* { alert('Day:' + day.value + '\n');}, +* function () {}); +*/ +getFirstDayOfWeek:function(successCB, failureCB) { + argscheck.checkArgs('fF', 'Globalization.getFirstDayOfWeek', arguments); + exec(successCB, failureCB, "Globalization", "getFirstDayOfWeek", []); +}, + + +/** +* Returns a number formatted as a string according to the client's user preferences. +* It returns the formatted number string to the successCB callback with a properties object as a +* parameter. If there is an error formatting the number, then the errorCB callback is invoked. +* +* The defaults are: type="decimal" +* +* @param {Number} number +* @param {Function} successCB +* @param {Function} errorCB +* @param {Object} options {optional} +* type {String}: 'decimal', "percent", or 'currency' +* +* @return Object.value {String}: The formatted number string. +* +* @error GlobalizationError.FORMATTING_ERROR +* +* Example +* globalization.numberToString(3.25, +* function (number) {alert('number:' + number.value + '\n');}, +* function () {}, +* {type:'decimal'}); +*/ +numberToString:function(number, successCB, failureCB, options) { + argscheck.checkArgs('nfFO', 'Globalization.numberToString', arguments); + exec(successCB, failureCB, "Globalization", "numberToString", [{"number": number, "options": options}]); +}, + +/** +* Parses a number formatted as a string according to the client's user preferences and +* returns the corresponding number. It returns the number to the successCB callback with a +* properties object as a parameter. If there is an error parsing the number string, then +* the errorCB callback is invoked. +* +* The defaults are: type="decimal" +* +* @param {String} numberString +* @param {Function} successCB +* @param {Function} errorCB +* @param {Object} options {optional} +* type {String}: 'decimal', "percent", or 'currency' +* +* @return Object.value {Number}: The parsed number. +* +* @error GlobalizationError.PARSING_ERROR +* +* Example +* globalization.stringToNumber('1234.56', +* function (number) {alert('Number:' + number.value + '\n');}, +* function () { alert('Error parsing number');}); +*/ +stringToNumber:function(numberString, successCB, failureCB, options) { + argscheck.checkArgs('sfFO', 'Globalization.stringToNumber', arguments); + exec(successCB, failureCB, "Globalization", "stringToNumber", [{"numberString": numberString, "options": options}]); +}, + +/** +* Returns a pattern string for formatting and parsing numbers according to the client's user +* preferences. It returns the pattern to the successCB callback with a properties object as a +* parameter. If there is an error obtaining the pattern, then the errorCB callback is invoked. +* +* The defaults are: type="decimal" +* +* @param {Function} successCB +* @param {Function} errorCB +* @param {Object} options {optional} +* type {String}: 'decimal', "percent", or 'currency' +* +* @return Object.pattern {String}: The number pattern for formatting and parsing numbers. +* The patterns follow Unicode Technical Standard #35. +* http://unicode.org/reports/tr35/tr35-4.html +* Object.symbol {String}: The symbol to be used when formatting and parsing +* e.g., percent or currency symbol. +* Object.fraction {Number}: The number of fractional digits to use when parsing and +* formatting numbers. +* Object.rounding {Number}: The rounding increment to use when parsing and formatting. +* Object.positive {String}: The symbol to use for positive numbers when parsing and formatting. +* Object.negative: {String}: The symbol to use for negative numbers when parsing and formatting. +* Object.decimal: {String}: The decimal symbol to use for parsing and formatting. +* Object.grouping: {String}: The grouping symbol to use for parsing and formatting. +* +* @error GlobalizationError.PATTERN_ERROR +* +* Example +* globalization.getNumberPattern( +* function (pattern) {alert('Pattern:' + pattern.pattern + '\n');}, +* function () {}); +*/ +getNumberPattern:function(successCB, failureCB, options) { + argscheck.checkArgs('fFO', 'Globalization.getNumberPattern', arguments); + exec(successCB, failureCB, "Globalization", "getNumberPattern", [{"options": options}]); +}, + +/** +* Returns a pattern string for formatting and parsing currency values according to the client's +* user preferences and ISO 4217 currency code. It returns the pattern to the successCB callback with a +* properties object as a parameter. If there is an error obtaining the pattern, then the errorCB +* callback is invoked. +* +* @param {String} currencyCode +* @param {Function} successCB +* @param {Function} errorCB +* +* @return Object.pattern {String}: The currency pattern for formatting and parsing currency values. +* The patterns follow Unicode Technical Standard #35 +* http://unicode.org/reports/tr35/tr35-4.html +* Object.code {String}: The ISO 4217 currency code for the pattern. +* Object.fraction {Number}: The number of fractional digits to use when parsing and +* formatting currency. +* Object.rounding {Number}: The rounding increment to use when parsing and formatting. +* Object.decimal: {String}: The decimal symbol to use for parsing and formatting. +* Object.grouping: {String}: The grouping symbol to use for parsing and formatting. +* +* @error GlobalizationError.FORMATTING_ERROR +* +* Example +* globalization.getCurrencyPattern('EUR', +* function (currency) {alert('Pattern:' + currency.pattern + '\n');} +* function () {}); +*/ +getCurrencyPattern:function(currencyCode, successCB, failureCB) { + argscheck.checkArgs('sfF', 'Globalization.getCurrencyPattern', arguments); + exec(successCB, failureCB, "Globalization", "getCurrencyPattern", [{"currencyCode": currencyCode}]); +} + +}; + +module.exports = globalization; + +}); + +// file: lib\common\plugin\globalization\symbols.js +define("cordova/plugin/globalization/symbols", function(require, exports, module) { + + +var modulemapper = require('cordova/modulemapper'); + +modulemapper.clobbers('cordova/plugin/globalization', 'navigator.globalization'); +modulemapper.clobbers('cordova/plugin/GlobalizationError', 'GlobalizationError'); + +}); + +// file: lib\common\plugin\logger.js +define("cordova/plugin/logger", function(require, exports, module) { + +//------------------------------------------------------------------------------ +// The logger module exports the following properties/functions: +// +// LOG - constant for the level LOG +// ERROR - constant for the level ERROR +// WARN - constant for the level WARN +// INFO - constant for the level INFO +// DEBUG - constant for the level DEBUG +// logLevel() - returns current log level +// logLevel(value) - sets and returns a new log level +// useConsole() - returns whether logger is using console +// useConsole(value) - sets and returns whether logger is using console +// log(message,...) - logs a message at level LOG +// error(message,...) - logs a message at level ERROR +// warn(message,...) - logs a message at level WARN +// info(message,...) - logs a message at level INFO +// debug(message,...) - logs a message at level DEBUG +// logLevel(level,message,...) - logs a message specified level +// +//------------------------------------------------------------------------------ + +var logger = exports; + +var exec = require('cordova/exec'); +var utils = require('cordova/utils'); + +var UseConsole = true; +var Queued = []; +var DeviceReady = false; +var CurrentLevel; + +/** + * Logging levels + */ + +var Levels = [ + "LOG", + "ERROR", + "WARN", + "INFO", + "DEBUG" +]; + +/* + * add the logging levels to the logger object and + * to a separate levelsMap object for testing + */ + +var LevelsMap = {}; +for (var i=0; i CurrentLevel) return; + + // queue the message if not yet at deviceready + if (!DeviceReady && !UseConsole) { + Queued.push([level, message]); + return; + } + + // if not using the console, use the native logger + if (!UseConsole) { + exec(null, null, "Logger", "logLevel", [level, message]); + return; + } + + // make sure console is not using logger + if (console.__usingCordovaLogger) { + throw new Error("console and logger are too intertwingly"); + } + + // log to the console + switch (level) { + case logger.LOG: console.log(message); break; + case logger.ERROR: console.log("ERROR: " + message); break; + case logger.WARN: console.log("WARN: " + message); break; + case logger.INFO: console.log("INFO: " + message); break; + case logger.DEBUG: console.log("DEBUG: " + message); break; + } +}; + +// when deviceready fires, log queued messages +logger.__onDeviceReady = function() { + if (DeviceReady) return; + + DeviceReady = true; + + for (var i=0; i 3) { + fail(FileError.SYNTAX_ERR); + } else { + // if successful, return a FileSystem object + var success = function(file_system) { + if (file_system) { + if (successCallback) { + // grab the name and root from the file system object + var result = new FileSystem(file_system.name, file_system.root); + successCallback(result); + } + } + else { + // no FileSystem object returned + fail(FileError.NOT_FOUND_ERR); + } + }; + exec(success, fail, "File", "requestFileSystem", [type, size]); + } +}; + +module.exports = requestFileSystem; + +}); + +// file: lib\common\plugin\resolveLocalFileSystemURI.js +define("cordova/plugin/resolveLocalFileSystemURI", function(require, exports, module) { + +var argscheck = require('cordova/argscheck'), + DirectoryEntry = require('cordova/plugin/DirectoryEntry'), + FileEntry = require('cordova/plugin/FileEntry'), + FileError = require('cordova/plugin/FileError'), + exec = require('cordova/exec'); + +/** + * Look up file system Entry referred to by local URI. + * @param {DOMString} uri URI referring to a local file or directory + * @param successCallback invoked with Entry object corresponding to URI + * @param errorCallback invoked if error occurs retrieving file system entry + */ +module.exports = function(uri, successCallback, errorCallback) { + argscheck.checkArgs('sFF', 'resolveLocalFileSystemURI', arguments); + // error callback + var fail = function(error) { + errorCallback && errorCallback(new FileError(error)); + }; + // sanity check for 'not:valid:filename' + if(!uri || uri.split(":").length > 2) { + setTimeout( function() { + fail(FileError.ENCODING_ERR); + },0); + return; + } + // if successful, return either a file or directory entry + var success = function(entry) { + var result; + if (entry) { + if (successCallback) { + // create appropriate Entry object + result = (entry.isDirectory) ? new DirectoryEntry(entry.name, entry.fullPath) : new FileEntry(entry.name, entry.fullPath); + successCallback(result); + } + } + else { + // no Entry object returned + fail(FileError.NOT_FOUND_ERR); + } + }; + + exec(success, fail, "File", "resolveLocalFileSystemURI", [uri]); +}; + +}); + +// file: lib\common\plugin\splashscreen.js +define("cordova/plugin/splashscreen", function(require, exports, module) { + +var exec = require('cordova/exec'); + +var splashscreen = { + show:function() { + exec(null, null, "SplashScreen", "show", []); + }, + hide:function() { + exec(null, null, "SplashScreen", "hide", []); + } +}; + +module.exports = splashscreen; + +}); + +// file: lib\common\plugin\splashscreen\symbols.js +define("cordova/plugin/splashscreen/symbols", function(require, exports, module) { + + +var modulemapper = require('cordova/modulemapper'); + +modulemapper.clobbers('cordova/plugin/splashscreen', 'navigator.splashscreen'); + +}); + +// file: lib\windows8\plugin\windows8\AccelerometerProxy.js +define("cordova/plugin/windows8/AccelerometerProxy", function(require, exports, module) { + +/*global Windows:true */ + +var cordova = require('cordova'), + Acceleration = require('cordova/plugin/Acceleration'); + +/* This is the actual implementation part that returns the result on Windows 8 +*/ + +module.exports = { + onDataChanged:null, + start:function(win,lose){ + + var accel = Windows.Devices.Sensors.Accelerometer.getDefault(); + if(!accel) { + lose && lose("No accelerometer found"); + } + else { + var self = this; + accel.reportInterval = Math.max(16,accel.minimumReportInterval); + + // store our bound function + this.onDataChanged = function(e) { + var a = e.reading; + win(new Acceleration(a.accelerationX,a.accelerationY,a.accelerationZ)); + }; + accel.addEventListener("readingchanged",this.onDataChanged); + + setTimeout(function(){ + var a = accel.getCurrentReading(); + win(new Acceleration(a.accelerationX,a.accelerationY,a.accelerationZ)); + },0); // async do later + } + }, + stop:function(win,lose){ + win = win || function(){}; + var accel = Windows.Devices.Sensors.Accelerometer.getDefault(); + if(!accel) { + lose && lose("No accelerometer found"); + } + else { + accel.removeEventListener("readingchanged",this.onDataChanged); + this.onDataChanged = null; + accel.reportInterval = 0; // back to the default + win(); + } + } +}; + +require("cordova/commandProxy").add("Accelerometer",module.exports); +}); + +// file: lib\windows8\plugin\windows8\CameraProxy.js +define("cordova/plugin/windows8/CameraProxy", function(require, exports, module) { + +/*global Windows:true, URL:true */ + + +var cordova = require('cordova'), + Camera = require('cordova/plugin/CameraConstants'), + FileEntry = require('cordova/plugin/FileEntry'), + FileError = require('cordova/plugin/FileError'), + FileReader = require('cordova/plugin/FileReader'); + +module.exports = { + + // args will contain : + // ... it is an array, so be careful + // 0 quality:50, + // 1 destinationType:Camera.DestinationType.FILE_URI, + // 2 sourceType:Camera.PictureSourceType.CAMERA, + // 3 targetWidth:-1, + // 4 targetHeight:-1, + // 5 encodingType:Camera.EncodingType.JPEG, + // 6 mediaType:Camera.MediaType.PICTURE, + // 7 allowEdit:false, + // 8 correctOrientation:false, + // 9 saveToPhotoAlbum:false, + // 10 popoverOptions:null + + takePicture: function (successCallback, errorCallback, args) { + var encodingType = args[5]; + var targetWidth = args[3]; + var targetHeight = args[4]; + var sourceType = args[2]; + var destinationType = args[1]; + var mediaType = args[6]; + var saveToPhotoAlbum = args[9]; + + var pkg = Windows.ApplicationModel.Package.current; + var packageId = pkg.installedLocation; + + var fail = function (fileError) { + errorCallback("FileError, code:" + fileError.code); + }; + + // resize method :) + var resizeImage = function (file) { + var tempPhotoFileName = ""; + if (encodingType == Camera.EncodingType.PNG) { + tempPhotoFileName = "camera_cordova_temp_return.png"; + } else { + tempPhotoFileName = "camera_cordova_temp_return.jpg"; + } + var imgObj = new Image(); + var success = function (fileEntry) { + var successCB = function (filePhoto) { + var fileType = file.contentType, + reader = new FileReader(); + reader.onloadend = function () { + var image = new Image(); + image.src = reader.result; + image.onload = function () { + var imageWidth = targetWidth, + imageHeight = targetHeight; + var canvas = document.createElement('canvas'); + + canvas.width = imageWidth; + canvas.height = imageHeight; + + var ctx = canvas.getContext("2d"); + ctx.drawImage(this, 0, 0, imageWidth, imageHeight); + + // The resized file ready for upload + var _blob = canvas.msToBlob(); + var _stream = _blob.msDetachStream(); + Windows.Storage.StorageFolder.getFolderFromPathAsync(packageId.path).done(function (storageFolder) { + storageFolder.createFileAsync(tempPhotoFileName, Windows.Storage.CreationCollisionOption.generateUniqueName).done(function (file) { + file.openAsync(Windows.Storage.FileAccessMode.readWrite).done(function (fileStream) { + Windows.Storage.Streams.RandomAccessStream.copyAndCloseAsync(_stream, fileStream).done(function () { + var _imageUrl = URL.createObjectURL(file); + successCallback(_imageUrl); + }, function () { errorCallback("Resize picture error."); }); + }, function () { errorCallback("Resize picture error."); }); + }, function () { errorCallback("Resize picture error."); }); + }); + }; + }; + + reader.readAsDataURL(filePhoto); + }; + + var failCB = function () { + errorCallback("File not found."); + }; + fileEntry.file(successCB, failCB); + }; + + Windows.Storage.StorageFolder.getFolderFromPathAsync(packageId.path).done(function (storageFolder) { + file.copyAsync(storageFolder, file.name, Windows.Storage.NameCollisionOption.replaceExisting).then(function (storageFile) { + success(new FileEntry(storageFile.name, storageFile.path)); + }, function () { + fail(FileError.INVALID_MODIFICATION_ERR); + }, function () { + errorCallback("Folder not access."); + }); + }); + + }; + + // because of asynchronous method, so let the successCallback be called in it. + var resizeImageBase64 = function (file) { + var imgObj = new Image(); + var success = function (fileEntry) { + var successCB = function (filePhoto) { + var fileType = file.contentType, + reader = new FileReader(); + reader.onloadend = function () { + var image = new Image(); + image.src = reader.result; + + image.onload = function () { + var imageWidth = targetWidth, + imageHeight = targetHeight; + var canvas = document.createElement('canvas'); + + canvas.width = imageWidth; + canvas.height = imageHeight; + + var ctx = canvas.getContext("2d"); + ctx.drawImage(this, 0, 0, imageWidth, imageHeight); + + // The resized file ready for upload + var finalFile = canvas.toDataURL(fileType); + + // Remove the prefix such as "data:" + contentType + ";base64," , in order to meet the Cordova API. + var arr = finalFile.split(","); + var newStr = finalFile.substr(arr[0].length + 1); + successCallback(newStr); + }; + }; + + reader.readAsDataURL(filePhoto); + + }; + var failCB = function () { + errorCallback("File not found."); + }; + fileEntry.file(successCB, failCB); + }; + + Windows.Storage.StorageFolder.getFolderFromPathAsync(packageId.path).done(function (storageFolder) { + file.copyAsync(storageFolder, file.name, Windows.Storage.NameCollisionOption.replaceExisting).then(function (storageFile) { + success(new FileEntry(storageFile.name, storageFile.path)); + }, function () { + fail(FileError.INVALID_MODIFICATION_ERR); + }, function () { + errorCallback("Folder not access."); + }); + }); + + }; + + if (sourceType != Camera.PictureSourceType.CAMERA) { + var fileOpenPicker = new Windows.Storage.Pickers.FileOpenPicker(); + fileOpenPicker.suggestedStartLocation = Windows.Storage.Pickers.PickerLocationId.picturesLibrary; + if (mediaType == Camera.MediaType.PICTURE) { + fileOpenPicker.fileTypeFilter.replaceAll([".png", ".jpg", ".jpeg"]); + } else if (mediaType == Camera.MediaType.VIDEO) { + fileOpenPicker.fileTypeFilter.replaceAll([".avi", ".flv", ".asx", ".asf", ".mov", ".mp4", ".mpg", ".rm", ".srt", ".swf", ".wmv", ".vob"]); + } else { + fileOpenPicker.fileTypeFilter.replaceAll(["*"]); + } + + fileOpenPicker.pickSingleFileAsync().then(function (file) { + if (file) { + if (destinationType == Camera.DestinationType.FILE_URI) { + if (targetHeight > 0 && targetWidth > 0) { + resizeImage(file); + } else { + Windows.Storage.StorageFolder.getFolderFromPathAsync(packageId.path).done(function (storageFolder) { + file.copyAsync(storageFolder, file.name, Windows.Storage.NameCollisionOption.replaceExisting).then(function (storageFile) { + var _imageUrl = URL.createObjectURL(storageFile); + successCallback(_imageUrl); + }, function () { + fail(FileError.INVALID_MODIFICATION_ERR); + }, function () { + errorCallback("Folder not access."); + }); + }); + + } + } + else { + if (targetHeight > 0 && targetWidth > 0) { + resizeImageBase64(file); + } else { + Windows.Storage.FileIO.readBufferAsync(file).done(function (buffer) { + var strBase64 = Windows.Security.Cryptography.CryptographicBuffer.encodeToBase64String(buffer); + successCallback(strBase64); + }); + } + + } + + } else { + errorCallback("User didn't choose a file."); + } + }, function () { + errorCallback("User didn't choose a file."); + }); + } + else { + + var cameraCaptureUI = new Windows.Media.Capture.CameraCaptureUI(); + cameraCaptureUI.photoSettings.allowCropping = true; + var allowCrop = !!args[7]; + if (!allowCrop) { + cameraCaptureUI.photoSettings.allowCropping = false; + } + + if (encodingType == Camera.EncodingType.PNG) { + cameraCaptureUI.photoSettings.format = Windows.Media.Capture.CameraCaptureUIPhotoFormat.png; + } else { + cameraCaptureUI.photoSettings.format = Windows.Media.Capture.CameraCaptureUIPhotoFormat.jpeg; + } + // decide which max pixels should be supported by targetWidth or targetHeight. + if (targetWidth >= 1280 || targetHeight >= 960) { + cameraCaptureUI.photoSettings.maxResolution = Windows.Media.Capture.CameraCaptureUIMaxPhotoResolution.large3M; + } else if (targetWidth >= 1024 || targetHeight >= 768) { + cameraCaptureUI.photoSettings.maxResolution = Windows.Media.Capture.CameraCaptureUIMaxPhotoResolution.mediumXga; + } else if (targetWidth >= 800 || targetHeight >= 600) { + cameraCaptureUI.photoSettings.maxResolution = Windows.Media.Capture.CameraCaptureUIMaxPhotoResolution.mediumXga; + } else if (targetWidth >= 640 || targetHeight >= 480) { + cameraCaptureUI.photoSettings.maxResolution = Windows.Media.Capture.CameraCaptureUIMaxPhotoResolution.smallVga; + } else if (targetWidth >= 320 || targetHeight >= 240) { + cameraCaptureUI.photoSettings.maxResolution = Windows.Media.Capture.CameraCaptureUIMaxPhotoResolution.verySmallQvga; + } else { + cameraCaptureUI.photoSettings.maxResolution = Windows.Media.Capture.CameraCaptureUIMaxPhotoResolution.highestAvailable; + } + + cameraCaptureUI.captureFileAsync(Windows.Media.Capture.CameraCaptureUIMode.photo).then(function (picture) { + if (picture) { + // save to photo album successCallback + var success = function (fileEntry) { + if (destinationType == Camera.DestinationType.FILE_URI) { + if (targetHeight > 0 && targetWidth > 0) { + resizeImage(picture); + } else { + Windows.Storage.StorageFolder.getFolderFromPathAsync(packageId.path).done(function (storageFolder) { + picture.copyAsync(storageFolder, picture.name, Windows.Storage.NameCollisionOption.replaceExisting).then(function (storageFile) { + var _imageUrl = URL.createObjectURL(storageFile); + successCallback(_imageUrl); + }, function () { + fail(FileError.INVALID_MODIFICATION_ERR); + }, function () { + errorCallback("Folder not access."); + }); + }); + } + } else { + if (targetHeight > 0 && targetWidth > 0) { + resizeImageBase64(picture); + } else { + Windows.Storage.FileIO.readBufferAsync(picture).done(function (buffer) { + var strBase64 = Windows.Security.Cryptography.CryptographicBuffer.encodeToBase64String(buffer); + successCallback(strBase64); + }); + } + } + }; + // save to photo album errorCallback + var fail = function () { + //errorCallback("FileError, code:" + fileError.code); + errorCallback("Save fail."); + }; + + if (saveToPhotoAlbum) { + Windows.Storage.StorageFile.getFileFromPathAsync(picture.path).then(function (storageFile) { + storageFile.copyAsync(Windows.Storage.KnownFolders.picturesLibrary, picture.name, Windows.Storage.NameCollisionOption.generateUniqueName).then(function (storageFile) { + success(storageFile); + }, function () { + fail(); + }); + }); + //var directory = new DirectoryEntry("Pictures", parentPath); + //new FileEntry(picture.name, picture.path).copyTo(directory, null, success, fail); + } else { + if (destinationType == Camera.DestinationType.FILE_URI) { + if (targetHeight > 0 && targetWidth > 0) { + resizeImage(picture); + } else { + Windows.Storage.StorageFolder.getFolderFromPathAsync(packageId.path).done(function (storageFolder) { + picture.copyAsync(storageFolder, picture.name, Windows.Storage.NameCollisionOption.replaceExisting).then(function (storageFile) { + var _imageUrl = URL.createObjectURL(storageFile); + successCallback(_imageUrl); + }, function () { + fail(FileError.INVALID_MODIFICATION_ERR); + }, function () { + errorCallback("Folder not access."); + }); + }); + } + } else { + if (targetHeight > 0 && targetWidth > 0) { + resizeImageBase64(picture); + } else { + Windows.Storage.FileIO.readBufferAsync(picture).done(function (buffer) { + var strBase64 = Windows.Security.Cryptography.CryptographicBuffer.encodeToBase64String(buffer); + successCallback(strBase64); + }); + } + } + } + } else { + errorCallback("User didn't capture a photo."); + } + }, function () { + errorCallback("Fail to capture a photo."); + }); + } + } +}; + +require("cordova/commandProxy").add("Camera",module.exports); + +}); + +// file: lib\windows8\plugin\windows8\CaptureProxy.js +define("cordova/plugin/windows8/CaptureProxy", function(require, exports, module) { + +/*global Windows:true */ + +var MediaFile = require('cordova/plugin/MediaFile'); +var CaptureError = require('cordova/plugin/CaptureError'); +var CaptureAudioOptions = require('cordova/plugin/CaptureAudioOptions'); +var CaptureImageOptions = require('cordova/plugin/CaptureImageOptions'); +var CaptureVideoOptions = require('cordova/plugin/CaptureVideoOptions'); +var MediaFileData = require('cordova/plugin/MediaFileData'); + +module.exports = { + + captureAudio:function(successCallback, errorCallback, args) { + var options = args[0]; + + var audioOptions = new CaptureAudioOptions(); + if (typeof(options.duration) == 'undefined') { + audioOptions.duration = 3600; // Arbitrary amount, need to change later + } else if (options.duration > 0) { + audioOptions.duration = options.duration; + } else { + errorCallback(new CaptureError(CaptureError.CAPTURE_INVALID_ARGUMENT)); + return; + } + + var cameraCaptureAudioDuration = audioOptions.duration; + var mediaCaptureSettings; + var initCaptureSettings = function () { + mediaCaptureSettings = null; + mediaCaptureSettings = new Windows.Media.Capture.MediaCaptureInitializationSettings(); + mediaCaptureSettings.streamingCaptureMode = Windows.Media.Capture.StreamingCaptureMode.audio; + }; + + initCaptureSettings(); + var mediaCapture = new Windows.Media.Capture.MediaCapture(); + mediaCapture.initializeAsync(mediaCaptureSettings).done(function () { + Windows.Storage.KnownFolders.musicLibrary.createFileAsync("captureAudio.mp3", Windows.Storage.NameCollisionOption.generateUniqueName).then(function (storageFile) { + var mediaEncodingProfile = new Windows.Media.MediaProperties.MediaEncodingProfile.createMp3(Windows.Media.MediaProperties.AudioEncodingQuality.auto); + var stopRecord = function () { + mediaCapture.stopRecordAsync().then(function (result) { + storageFile.getBasicPropertiesAsync().then(function (basicProperties) { + var results = []; + results.push(new MediaFile(storageFile.name, storageFile.path, storageFile.contentType, basicProperties.dateModified, basicProperties.size)); + successCallback(results); + }, function () { + errorCallback(new CaptureError(CaptureError.CAPTURE_NO_MEDIA_FILES)); + }); + }, function () { errorCallback(new CaptureError(CaptureError.CAPTURE_NO_MEDIA_FILES)); }); + }; + mediaCapture.startRecordToStorageFileAsync(mediaEncodingProfile, storageFile).then(function () { + setTimeout(stopRecord, cameraCaptureAudioDuration * 1000); + }, function () { errorCallback(new CaptureError(CaptureError.CAPTURE_NO_MEDIA_FILES)); }); + }, function () { errorCallback(new CaptureError(CaptureError.CAPTURE_NO_MEDIA_FILES)); }); + }); + }, + + captureImage:function (successCallback, errorCallback, args) { + var options = args[0]; + var imageOptions = new CaptureImageOptions(); + var cameraCaptureUI = new Windows.Media.Capture.CameraCaptureUI(); + cameraCaptureUI.photoSettings.allowCropping = true; + cameraCaptureUI.photoSettings.maxResolution = Windows.Media.Capture.CameraCaptureUIMaxPhotoResolution.highestAvailable; + cameraCaptureUI.photoSettings.format = Windows.Media.Capture.CameraCaptureUIPhotoFormat.jpeg; + cameraCaptureUI.captureFileAsync(Windows.Media.Capture.CameraCaptureUIMode.photo).then(function (file) { + file.moveAsync(Windows.Storage.KnownFolders.picturesLibrary, "cameraCaptureImage.jpg", Windows.Storage.NameCollisionOption.generateUniqueName).then(function () { + file.getBasicPropertiesAsync().then(function (basicProperties) { + var results = []; + results.push(new MediaFile(file.name, file.path, file.contentType, basicProperties.dateModified, basicProperties.size)); + successCallback(results); + }, function () { + errorCallback(new CaptureError(CaptureError.CAPTURE_NO_MEDIA_FILES)); + }); + }, function () { + errorCallback(new CaptureError(CaptureError.CAPTURE_NO_MEDIA_FILES)); + }); + }, function () { errorCallback(new CaptureError(CaptureError.CAPTURE_NO_MEDIA_FILES)); }); + }, + + captureVideo:function (successCallback, errorCallback, args) { + var options = args[0]; + var videoOptions = new CaptureVideoOptions(); + if (options.duration && options.duration > 0) { + videoOptions.duration = options.duration; + } + if (options.limit > 1) { + videoOptions.limit = options.limit; + } + var cameraCaptureUI = new Windows.Media.Capture.CameraCaptureUI(); + cameraCaptureUI.videoSettings.allowTrimming = true; + cameraCaptureUI.videoSettings.format = Windows.Media.Capture.CameraCaptureUIVideoFormat.mp4; + cameraCaptureUI.videoSettings.maxDurationInSeconds = videoOptions.duration; + cameraCaptureUI.captureFileAsync(Windows.Media.Capture.CameraCaptureUIMode.video).then(function (file) { + file.moveAsync(Windows.Storage.KnownFolders.videosLibrary, "cameraCaptureVideo.mp4", Windows.Storage.NameCollisionOption.generateUniqueName).then(function () { + file.getBasicPropertiesAsync().then(function (basicProperties) { + var results = []; + results.push(new MediaFile(file.name, file.path, file.contentType, basicProperties.dateModified, basicProperties.size)); + successCallback(results); + }, function () { + errorCallback(new CaptureError(CaptureError.CAPTURE_NO_MEDIA_FILES)); + }); + }, function () { + errorCallback(new CaptureError(CaptureError.CAPTURE_NO_MEDIA_FILES)); + }); + }, function () { errorCallback(new CaptureError(CaptureError.CAPTURE_NO_MEDIA_FILES)); }); + + }, + + getFormatData: function (successCallback, errorCallback, args) { + Windows.Storage.StorageFile.getFileFromPathAsync(args[0]).then( + function (storageFile) { + var mediaTypeFlag = String(storageFile.contentType).split("/")[0].toLowerCase(); + if (mediaTypeFlag === "audio") { + storageFile.properties.getMusicPropertiesAsync().then(function (audioProperties) { + successCallback(new MediaFileData(null, audioProperties.bitrate, 0, 0, audioProperties.duration / 1000)); + }, function () { + errorCallback(new CaptureError(CaptureError.CAPTURE_INVALID_ARGUMENT)); + }); + } + else if (mediaTypeFlag === "video") { + storageFile.properties.getVideoPropertiesAsync().then(function (videoProperties) { + successCallback(new MediaFileData(null, videoProperties.bitrate, videoProperties.height, videoProperties.width, videoProperties.duration / 1000)); + }, function () { + errorCallback(new CaptureError(CaptureError.CAPTURE_INVALID_ARGUMENT)); + }); + } + else if (mediaTypeFlag === "image") { + storageFile.properties.getImagePropertiesAsync().then(function (imageProperties) { + successCallback(new MediaFileData(null, 0, imageProperties.height, imageProperties.width, 0)); + }, function () { + errorCallback(new CaptureError(CaptureError.CAPTURE_INVALID_ARGUMENT)); + }); + } + else { errorCallback(new CaptureError(CaptureError.CAPTURE_INVALID_ARGUMENT)); } + }, function () { + errorCallback(new CaptureError(CaptureError.CAPTURE_INVALID_ARGUMENT)); + } + ); + } +}; + +require("cordova/commandProxy").add("Capture",module.exports); +}); + +// file: lib\windows8\plugin\windows8\CompassProxy.js +define("cordova/plugin/windows8/CompassProxy", function(require, exports, module) { + +/*global Windows:true */ + +var cordova = require('cordova'), + CompassHeading = require('cordova/plugin/CompassHeading'); + + +module.exports = { + + onReadingChanged:null, + getHeading:function(win,lose) { + var deviceCompass = Windows.Devices.Sensors.Compass.getDefault(); + if(!deviceCompass) { + setTimeout(function(){lose("Compass not available");},0); + } + else { + + deviceCompass.reportInterval = Math.max(16,deviceCompass.minimumReportInterval); + + this.onReadingChanged = function(e) { + var reading = e.reading; + var heading = new CompassHeading(reading.headingMagneticNorth, reading.headingTrueNorth); + win(heading); + }; + deviceCompass.addEventListener("readingchanged",this.onReadingChanged); + } + + }, + stopHeading:function(win,lose) { + var deviceCompass = Windows.Devices.Sensors.Compass.getDefault(); + if(!deviceCompass) { + setTimeout(function(){lose("Compass not available");},0); + } + else { + + deviceCompass.removeEventListener("readingchanged",this.onReadingChanged); + this.onReadingChanged = null; + deviceCompass.reportInterval = 0; + win(); + } + + } +}; + +require("cordova/commandProxy").add("Compass",module.exports); +}); + +// file: lib\windows8\plugin\windows8\ContactsProxy.js +define("cordova/plugin/windows8/ContactsProxy", function(require, exports, module) { + +var cordova = require('cordova'); + +module.exports = { + search: function (win, fail, args) { + var fields = args[0]; + var options = args[1]; + var picker = Windows.ApplicationModel.Contacts.ContactPicker(); + picker.commitButtonText = "Select"; + picker.selectionMode = Windows.ApplicationModel.Contacts.ContactSelectionMode.contacts; + + picker.desiredFields.push.apply(picker.desiredFields, fields); + + if (options.multiple) { + picker.pickMultipleContactsAsync().then(function (contacts) { + win(contacts); + }); + } + else { + picker.pickSingleContactAsync().then(function (contact) { + win([contact]); + }); + } + } + +}; + +require("cordova/commandProxy").add("Contacts",module.exports); +}); + +// file: lib\windows8\plugin\windows8\DeviceProxy.js +define("cordova/plugin/windows8/DeviceProxy", function(require, exports, module) { + +var cordova = require('cordova'); +var utils = require('cordova/utils'); +var FileError = require('cordova/plugin/FileError'); + + +module.exports = { + + getDeviceInfo:function(win,fail,args) { + //console.log("NativeProxy::getDeviceInfo"); + var hostNames = Windows.Networking.Connectivity.NetworkInformation.getHostNames(); + + var name = "unknown"; + hostNames.some(function (nm) { + if (nm.displayName.indexOf(".local") > -1) { + name = nm.displayName.split(".local")[0]; + return true; + } + }); + + // deviceId aka uuid, stored in Windows.Storage.ApplicationData.current.localSettings.values.deviceId + var deviceId; + var localSettings = Windows.Storage.ApplicationData.current.localSettings; + + if (localSettings.values.deviceId) { + deviceId = localSettings.values.deviceId; + } + else { + deviceId = localSettings.values.deviceId = utils.createUUID(); + } + + setTimeout(function () { + win({ platform: "windows8", version: "8", name: name, uuid: deviceId, cordova: "2.6.0" }); + }, 0); + } + +}; + +require("cordova/commandProxy").add("Device",module.exports); + +}); + +// file: lib\windows8\plugin\windows8\FileProxy.js +define("cordova/plugin/windows8/FileProxy", function(require, exports, module) { + +var cordova = require('cordova'); +var Entry = require('cordova/plugin/Entry'), + File = require('cordova/plugin/File'), + FileEntry = require('cordova/plugin/FileEntry'), + FileError = require('cordova/plugin/FileError'), + DirectoryEntry = require('cordova/plugin/DirectoryEntry'), + Flags = require('cordova/plugin/Flags'), + FileSystem = require('cordova/plugin/FileSystem'), + LocalFileSystem = require('cordova/plugin/LocalFileSystem'); + +module.exports = { + + getFileMetadata:function(win,fail,args) { + var fullPath = args[0]; + + Windows.Storage.StorageFile.getFileFromPathAsync(fullPath).done( + function (storageFile) { + storageFile.getBasicPropertiesAsync().then( + function (basicProperties) { + win(new File(storageFile.name, storageFile.path, storageFile.fileType, basicProperties.dateModified, basicProperties.size)); + }, function () { + fail && fail(FileError.NOT_READABLE_ERR); + } + ); + }, function () { + fail && fail(FileError.NOT_FOUND_ERR); + } + ); + }, + + getMetadata:function(success,fail,args) { + var fullPath = args[0]; + + var dealFile = function (sFile) { + Windows.Storage.StorageFile.getFileFromPathAsync(fullPath).then( + function (storageFile) { + return storageFile.getBasicPropertiesAsync(); + }, + function () { + fail && fail(FileError.NOT_READABLE_ERR); + } + // get the basic properties of the file. + ).then( + function (basicProperties) { + success(basicProperties.dateModified); + }, + function () { + fail && fail(FileError.NOT_READABLE_ERR); + } + ); + }; + + var dealFolder = function (sFolder) { + Windows.Storage.StorageFolder.getFolderFromPathAsync(fullPath).then( + function (storageFolder) { + return storageFolder.getBasicPropertiesAsync(); + }, + function () { + fail && fail(FileError.NOT_READABLE_ERR); + } + // get the basic properties of the folder. + ).then( + function (basicProperties) { + success(basicProperties.dateModified); + }, + function () { + fail && fail(FileError.NOT_FOUND_ERR); + } + ); + }; + + Windows.Storage.StorageFile.getFileFromPathAsync(fullPath).then( + // the path is file. + function (sFile) { + dealFile(sFile); + }, + // the path is folder + function () { + Windows.Storage.StorageFolder.getFolderFromPathAsync(fullPath).then( + function (sFolder) { + dealFolder(sFolder); + }, function () { + fail && fail(FileError.NOT_FOUND_ERR); + } + ); + } + ); + }, + + getParent:function(win,fail,args) { // ["fullPath"] + var fullPath = args[0]; + + var storageFolderPer = Windows.Storage.ApplicationData.current.localFolder; + var storageFolderTem = Windows.Storage.ApplicationData.current.temporaryFolder; + + if (fullPath == storageFolderPer.path) { + win(new DirectoryEntry(storageFolderPer.name, storageFolderPer.path)); + return; + } else if (fullPath == storageFolderTem.path) { + win(new DirectoryEntry(storageFolderTem.name, storageFolderTem.path)); + return; + } + var splitArr = fullPath.split(new RegExp(/\/|\\/g)); + + var popItem = splitArr.pop(); + + var result = new DirectoryEntry(popItem, fullPath.substr(0, fullPath.length - popItem.length - 1)); + Windows.Storage.StorageFolder.getFolderFromPathAsync(result.fullPath).done( + function () { win(result); }, + function () { fail && fail(FileError.INVALID_STATE_ERR); } + ); + }, + + readAsText:function(win,fail,args) { + var fileName = args[0]; + var enc = args[1]; + + Windows.Storage.StorageFile.getFileFromPathAsync(fileName).done( + function (storageFile) { + var value = Windows.Storage.Streams.UnicodeEncoding.utf8; + if (enc == 'Utf16LE' || enc == 'utf16LE') { + value = Windows.Storage.Streams.UnicodeEncoding.utf16LE; + }else if (enc == 'Utf16BE' || enc == 'utf16BE') { + value = Windows.Storage.Streams.UnicodeEncoding.utf16BE; + } + Windows.Storage.FileIO.readTextAsync(storageFile, value).done( + function (fileContent) { + win(fileContent); + }, + function () { + fail && fail(FileError.ENCODING_ERR); + } + ); + }, function () { + fail && fail(FileError.NOT_FOUND_ERR); + } + ); + }, + + readAsDataURL:function(win,fail,args) { + var fileName = args[0]; + + + Windows.Storage.StorageFile.getFileFromPathAsync(fileName).then( + function (storageFile) { + Windows.Storage.FileIO.readBufferAsync(storageFile).done( + function (buffer) { + var strBase64 = Windows.Security.Cryptography.CryptographicBuffer.encodeToBase64String(buffer); + //the method encodeToBase64String will add "77u/" as a prefix, so we should remove it + if(String(strBase64).substr(0,4) == "77u/") { + strBase64 = strBase64.substr(4); + } + var mediaType = storageFile.contentType; + var result = "data:" + mediaType + ";base64," + strBase64; + win(result); + } + ); + }, function () { + fail && fail(FileError.NOT_FOUND_ERR); + } + ); + }, + + getDirectory:function(win,fail,args) { + var fullPath = args[0]; + var path = args[1]; + var options = args[2]; + + var flag = ""; + if (options !== null) { + flag = new Flags(options.create, options.exclusive); + } else { + flag = new Flags(false, false); + } + + Windows.Storage.StorageFolder.getFolderFromPathAsync(fullPath).then( + function (storageFolder) { + if (flag.create === true && flag.exclusive === true) { + storageFolder.createFolderAsync(path, Windows.Storage.CreationCollisionOption.failIfExists).done( + function (storageFolder) { + win(new DirectoryEntry(storageFolder.name, storageFolder.path)); + }, function () { + fail && fail(FileError.PATH_EXISTS_ERR); + } + ); + } else if (flag.create === true && flag.exclusive === false) { + storageFolder.createFolderAsync(path, Windows.Storage.CreationCollisionOption.openIfExists).done( + function (storageFolder) { + win(new DirectoryEntry(storageFolder.name, storageFolder.path)); + }, function () { + fail && fail(FileError.INVALID_MODIFICATION_ERR); + } + ); + } else if (flag.create === false) { + if (/\?|\\|\*|\||\"|<|>|\:|\//g.test(path)) { + fail && fail(FileError.ENCODING_ERR); + return; + } + + storageFolder.getFolderAsync(path).done( + function (storageFolder) { + win(new DirectoryEntry(storageFolder.name, storageFolder.path)); + }, function () { + fail && fail(FileError.NOT_FOUND_ERR); + } + ); + } + }, function () { + fail && fail(FileError.NOT_FOUND_ERR); + } + ); + }, + + remove:function(win,fail,args) { + var fullPath = args[0]; + + Windows.Storage.StorageFile.getFileFromPathAsync(fullPath).then( + function (sFile) { + Windows.Storage.StorageFile.getFileFromPathAsync(fullPath).done(function (storageFile) { + storageFile.deleteAsync().done(win, function () { + fail && fail(FileError.INVALID_MODIFICATION_ERR); + + }); + }); + }, + function () { + Windows.Storage.StorageFolder.getFolderFromPathAsync(fullPath).then( + function (sFolder) { + var removeEntry = function () { + var storageFolderTop = null; + + Windows.Storage.StorageFolder.getFolderFromPathAsync(fullPath).then( + function (storageFolder) { + // FileSystem root can't be removed! + var storageFolderPer = Windows.Storage.ApplicationData.current.localFolder; + var storageFolderTem = Windows.Storage.ApplicationData.current.temporaryFolder; + if (fullPath == storageFolderPer.path || fullPath == storageFolderTem.path) { + fail && fail(FileError.NO_MODIFICATION_ALLOWED_ERR); + return; + } + storageFolderTop = storageFolder; + return storageFolder.createFileQuery().getFilesAsync(); + }, function () { + fail && fail(FileError.INVALID_MODIFICATION_ERR); + + } + // check sub-files. + ).then(function (fileList) { + if (fileList) { + if (fileList.length === 0) { + return storageFolderTop.createFolderQuery().getFoldersAsync(); + } else { + fail && fail(FileError.INVALID_MODIFICATION_ERR); + } + } + // check sub-folders. + }).then(function (folderList) { + if (folderList) { + if (folderList.length === 0) { + storageFolderTop.deleteAsync().done(win, function () { + fail && fail(FileError.INVALID_MODIFICATION_ERR); + + }); + } else { + fail && fail(FileError.INVALID_MODIFICATION_ERR); + } + } + + }); + }; + removeEntry(); + }, function () { + fail && fail(FileError.NOT_FOUND_ERR); + } + ); + } + ); + }, + + removeRecursively:function(successCallback,fail,args) { + var fullPath = args[0]; + + Windows.Storage.StorageFolder.getFolderFromPathAsync(fullPath).done(function (storageFolder) { + var storageFolderPer = Windows.Storage.ApplicationData.current.localFolder; + var storageFolderTem = Windows.Storage.ApplicationData.current.temporaryFolder; + + if (storageFolder.path == storageFolderPer.path || storageFolder.path == storageFolderTem.path) { + fail && fail(FileError.NO_MODIFICATION_ALLOWED_ERR); + return; + } + + var removeFolders = function (path) { + return new WinJS.Promise(function (complete) { + var filePromiseArr = []; + var storageFolderTop = null; + Windows.Storage.StorageFolder.getFolderFromPathAsync(path).then( + function (storageFolder) { + var fileListPromise = storageFolder.createFileQuery().getFilesAsync(); + + storageFolderTop = storageFolder; + return fileListPromise; + } + // remove all the files directly under the folder. + ).then(function (fileList) { + if (fileList !== null) { + for (var i = 0; i < fileList.length; i++) { + var filePromise = fileList[i].deleteAsync(); + filePromiseArr.push(filePromise); + } + } + WinJS.Promise.join(filePromiseArr).then(function () { + var folderListPromise = storageFolderTop.createFolderQuery().getFoldersAsync(); + return folderListPromise; + // remove empty folders. + }).then(function (folderList) { + var folderPromiseArr = []; + if (folderList.length !== 0) { + for (var j = 0; j < folderList.length; j++) { + + folderPromiseArr.push(removeFolders(folderList[j].path)); + } + WinJS.Promise.join(folderPromiseArr).then(function () { + storageFolderTop.deleteAsync().then(complete); + }); + } else { + storageFolderTop.deleteAsync().then(complete); + } + }, function () { }); + }, function () { }); + }); + }; + removeFolders(storageFolder.path).then(function () { + Windows.Storage.StorageFolder.getFolderFromPathAsync(storageFolder.path).then( + function () {}, + function () { + if (typeof successCallback !== 'undefined' && successCallback !== null) { successCallback(); } + }); + }); + }); + }, + + getFile:function(win,fail,args) { + var fullPath = args[0]; + var path = args[1]; + var options = args[2]; + + var flag = ""; + if (options !== null) { + flag = new Flags(options.create, options.exclusive); + } else { + flag = new Flags(false, false); + } + + Windows.Storage.StorageFolder.getFolderFromPathAsync(fullPath).then( + function (storageFolder) { + if (flag.create === true && flag.exclusive === true) { + storageFolder.createFileAsync(path, Windows.Storage.CreationCollisionOption.failIfExists).done( + function (storageFile) { + win(new FileEntry(storageFile.name, storageFile.path)); + }, function () { + fail && fail(FileError.PATH_EXISTS_ERR); + } + ); + } else if (flag.create === true && flag.exclusive === false) { + storageFolder.createFileAsync(path, Windows.Storage.CreationCollisionOption.openIfExists).done( + function (storageFile) { + win(new FileEntry(storageFile.name, storageFile.path)); + }, function () { + fail && fail(FileError.INVALID_MODIFICATION_ERR); + } + ); + } else if (flag.create === false) { + if (/\?|\\|\*|\||\"|<|>|\:|\//g.test(path)) { + fail && fail(FileError.ENCODING_ERR); + return; + } + storageFolder.getFileAsync(path).done( + function (storageFile) { + win(new FileEntry(storageFile.name, storageFile.path)); + }, function () { + fail && fail(FileError.NOT_FOUND_ERR); + } + ); + } + }, function () { + fail && fail(FileError.NOT_FOUND_ERR); + } + ); + }, + + readEntries:function(win,fail,args) { // ["fullPath"] + var path = args[0]; + + var result = []; + + Windows.Storage.StorageFolder.getFolderFromPathAsync(path).then(function (storageFolder) { + var promiseArr = []; + var index = 0; + promiseArr[index++] = storageFolder.createFileQuery().getFilesAsync().then(function (fileList) { + if (fileList !== null) { + for (var i = 0; i < fileList.length; i++) { + result.push(new FileEntry(fileList[i].name, fileList[i].path)); + } + } + }); + promiseArr[index++] = storageFolder.createFolderQuery().getFoldersAsync().then(function (folderList) { + if (folderList !== null) { + for (var j = 0; j < folderList.length; j++) { + result.push(new FileEntry(folderList[j].name, folderList[j].path)); + } + } + }); + WinJS.Promise.join(promiseArr).then(function () { + win(result); + }); + + }, function () { fail && fail(FileError.NOT_FOUND_ERR); }); + }, + + write:function(win,fail,args) { + var fileName = args[0]; + var text = args[1]; + var position = args[2]; + + Windows.Storage.StorageFile.getFileFromPathAsync(fileName).done( + function (storageFile) { + Windows.Storage.FileIO.writeTextAsync(storageFile,text,Windows.Storage.Streams.UnicodeEncoding.utf8).done( + function() { + win(String(text).length); + }, function () { + fail && fail(FileError.INVALID_MODIFICATION_ERR); + } + ); + }, function() { + fail && fail(FileError.NOT_FOUND_ERR); + } + ); + }, + + truncate:function(win,fail,args) { // ["fileName","size"] + var fileName = args[0]; + var size = args[1]; + + Windows.Storage.StorageFile.getFileFromPathAsync(fileName).done(function(storageFile){ + //the current length of the file. + var leng = 0; + + storageFile.getBasicPropertiesAsync().then(function (basicProperties) { + leng = basicProperties.size; + if (Number(size) >= leng) { + win(this.length); + return; + } + if (Number(size) >= 0) { + Windows.Storage.FileIO.readTextAsync(storageFile, Windows.Storage.Streams.UnicodeEncoding.utf8).then(function (fileContent) { + fileContent = fileContent.substr(0, size); + var fullPath = storageFile.path; + var name = storageFile.name; + var entry = new Entry(true, false, name, fullPath); + var parentPath = ""; + var successCallBack = function (entry) { + parentPath = entry.fullPath; + storageFile.deleteAsync().then(function () { + return Windows.Storage.StorageFolder.getFolderFromPathAsync(parentPath); + }).then(function (storageFolder) { + storageFolder.createFileAsync(name).then(function (newStorageFile) { + Windows.Storage.FileIO.writeTextAsync(newStorageFile, fileContent).done(function () { + win(String(fileContent).length); + }, function () { + fail && fail(FileError.NO_MODIFICATION_ALLOWED_ERR); + }); + }); + }); + }; + entry.getParent(successCallBack, null); + }, function () { fail && fail(FileError.NOT_FOUND_ERR); }); + } + }); + }, function () { fail && fail(FileError.NOT_FOUND_ERR); }); + }, + + copyTo:function(success,fail,args) { // ["fullPath","parent", "newName"] + var srcPath = args[0]; + var parentFullPath = args[1]; + var name = args[2]; + + //name can't be invalid + if (/\?|\\|\*|\||\"|<|>|\:|\//g.test(name)) { + fail && fail(FileError.ENCODING_ERR); + return; + } + // copy + var copyFiles = ""; + Windows.Storage.StorageFile.getFileFromPathAsync(srcPath).then( + function (sFile) { + copyFiles = function (srcPath, parentPath) { + var storageFileTop = null; + Windows.Storage.StorageFile.getFileFromPathAsync(srcPath).then(function (storageFile) { + storageFileTop = storageFile; + return Windows.Storage.StorageFolder.getFolderFromPathAsync(parentPath); + }, function () { + + fail && fail(FileError.NOT_FOUND_ERR); + }).then(function (storageFolder) { + storageFileTop.copyAsync(storageFolder, name, Windows.Storage.NameCollisionOption.failIfExists).then(function (storageFile) { + + success(new FileEntry(storageFile.name, storageFile.path)); + }, function () { + + fail && fail(FileError.INVALID_MODIFICATION_ERR); + }); + }, function () { + + fail && fail(FileError.NOT_FOUND_ERR); + }); + }; + var copyFinish = function (srcPath, parentPath) { + copyFiles(srcPath, parentPath); + }; + copyFinish(srcPath, parentFullPath); + }, + function () { + Windows.Storage.StorageFolder.getFolderFromPathAsync(srcPath).then( + function (sFolder) { + copyFiles = function (srcPath, parentPath) { + var coreCopy = function (storageFolderTop, complete) { + storageFolderTop.createFolderQuery().getFoldersAsync().then(function (folderList) { + var folderPromiseArr = []; + if (folderList.length === 0) { complete(); } + else { + Windows.Storage.StorageFolder.getFolderFromPathAsync(parentPath).then(function (storageFolderTarget) { + var tempPromiseArr = []; + var index = 0; + for (var j = 0; j < folderList.length; j++) { + tempPromiseArr[index++] = storageFolderTarget.createFolderAsync(folderList[j].name).then(function (targetFolder) { + folderPromiseArr.push(copyFiles(folderList[j].path, targetFolder.path)); + }); + } + WinJS.Promise.join(tempPromiseArr).then(function () { + WinJS.Promise.join(folderPromiseArr).then(complete); + }); + }); + } + }); + }; + + return new WinJS.Promise(function (complete) { + var storageFolderTop = null; + var filePromiseArr = []; + var fileListTop = null; + Windows.Storage.StorageFolder.getFolderFromPathAsync(srcPath).then(function (storageFolder) { + storageFolderTop = storageFolder; + return storageFolder.createFileQuery().getFilesAsync(); + }).then(function (fileList) { + fileListTop = fileList; + if (fileList) { + return Windows.Storage.StorageFolder.getFolderFromPathAsync(parentPath); + } + }).then(function (targetStorageFolder) { + for (var i = 0; i < fileListTop.length; i++) { + filePromiseArr.push(fileListTop[i].copyAsync(targetStorageFolder)); + } + WinJS.Promise.join(filePromiseArr).then(function () { + coreCopy(storageFolderTop, complete); + }); + }); + }); + }; + var copyFinish = function (srcPath, parentPath) { + Windows.Storage.StorageFolder.getFolderFromPathAsync(parentPath).then(function (storageFolder) { + storageFolder.createFolderAsync(name, Windows.Storage.CreationCollisionOption.openIfExists).then(function (newStorageFolder) { + //can't copy onto itself + if (srcPath == newStorageFolder.path) { + fail && fail(FileError.INVALID_MODIFICATION_ERR); + return; + } + //can't copy into itself + if (srcPath == parentPath) { + fail && fail(FileError.INVALID_MODIFICATION_ERR); + return; + } + copyFiles(srcPath, newStorageFolder.path).then(function () { + Windows.Storage.StorageFolder.getFolderFromPathAsync(newStorageFolder.path).done( + function (storageFolder) { + success(new DirectoryEntry(storageFolder.name, storageFolder.path)); + }, + function () { fail && fail(FileError.NOT_FOUND_ERR); } + ); + }); + }, function () { fail && fail(FileError.INVALID_MODIFICATION_ERR); }); + }, function () { fail && fail(FileError.INVALID_MODIFICATION_ERR); }); + }; + copyFinish(srcPath, parentFullPath); + }, function () { + fail && fail(FileError.NOT_FOUND_ERR); + } + ); + } + ); + }, + + moveTo:function(success,fail,args) { + var srcPath = args[0]; + var parentFullPath = args[1]; + var name = args[2]; + + + //name can't be invalid + if (/\?|\\|\*|\||\"|<|>|\:|\//g.test(name)) { + fail && fail(FileError.ENCODING_ERR); + return; + } + + var moveFiles = ""; + Windows.Storage.StorageFile.getFileFromPathAsync(srcPath).then( + function (sFile) { + moveFiles = function (srcPath, parentPath) { + var storageFileTop = null; + Windows.Storage.StorageFile.getFileFromPathAsync(srcPath).then(function (storageFile) { + storageFileTop = storageFile; + return Windows.Storage.StorageFolder.getFolderFromPathAsync(parentPath); + }, function () { + fail && fail(FileError.NOT_FOUND_ERR); + }).then(function (storageFolder) { + storageFileTop.moveAsync(storageFolder, name, Windows.Storage.NameCollisionOption.replaceExisting).then(function () { + success(new FileEntry(name, storageFileTop.path)); + }, function () { + fail && fail(FileError.INVALID_MODIFICATION_ERR); + }); + }, function () { + fail && fail(FileError.NOT_FOUND_ERR); + }); + }; + var moveFinish = function (srcPath, parentPath) { + //can't copy onto itself + if (srcPath == parentPath + "\\" + name) { + fail && fail(FileError.INVALID_MODIFICATION_ERR); + return; + } + moveFiles(srcPath, parentFullPath); + }; + moveFinish(srcPath, parentFullPath); + }, + function () { + Windows.Storage.StorageFolder.getFolderFromPathAsync(srcPath).then( + function (sFolder) { + moveFiles = function (srcPath, parentPath) { + var coreMove = function (storageFolderTop, complete) { + storageFolderTop.createFolderQuery().getFoldersAsync().then(function (folderList) { + var folderPromiseArr = []; + if (folderList.length === 0) { + // If failed, we must cancel the deletion of folders & files.So here wo can't delete the folder. + complete(); + } + else { + Windows.Storage.StorageFolder.getFolderFromPathAsync(parentPath).then(function (storageFolderTarget) { + var tempPromiseArr = []; + var index = 0; + for (var j = 0; j < folderList.length; j++) { + tempPromiseArr[index++] = storageFolderTarget.createFolderAsync(folderList[j].name).then(function (targetFolder) { + folderPromiseArr.push(moveFiles(folderList[j].path, targetFolder.path)); + }); + } + WinJS.Promise.join(tempPromiseArr).then(function () { + WinJS.Promise.join(folderPromiseArr).then(complete); + }); + }); + } + }); + }; + return new WinJS.Promise(function (complete) { + var storageFolderTop = null; + Windows.Storage.StorageFolder.getFolderFromPathAsync(srcPath).then(function (storageFolder) { + storageFolderTop = storageFolder; + return storageFolder.createFileQuery().getFilesAsync(); + }).then(function (fileList) { + var filePromiseArr = []; + Windows.Storage.StorageFolder.getFolderFromPathAsync(parentPath).then(function (dstStorageFolder) { + if (fileList) { + for (var i = 0; i < fileList.length; i++) { + filePromiseArr.push(fileList[i].moveAsync(dstStorageFolder)); + } + } + WinJS.Promise.join(filePromiseArr).then(function () { + coreMove(storageFolderTop, complete); + }, function () { }); + }); + }); + }); + }; + var moveFinish = function (srcPath, parentPath) { + var originFolderTop = null; + Windows.Storage.StorageFolder.getFolderFromPathAsync(srcPath).then(function (originFolder) { + originFolderTop = originFolder; + return Windows.Storage.StorageFolder.getFolderFromPathAsync(parentPath); + }, function () { + fail && fail(FileError.INVALID_MODIFICATION_ERR); + }).then(function (storageFolder) { + return storageFolder.createFolderAsync(name, Windows.Storage.CreationCollisionOption.openIfExists); + }, function () { + fail && fail(FileError.INVALID_MODIFICATION_ERR); + }).then(function (newStorageFolder) { + //can't move onto directory that is not empty + newStorageFolder.createFileQuery().getFilesAsync().then(function (fileList) { + newStorageFolder.createFolderQuery().getFoldersAsync().then(function (folderList) { + if (fileList.length !== 0 || folderList.length !== 0) { + fail && fail(FileError.INVALID_MODIFICATION_ERR); + return; + } + //can't copy onto itself + if (srcPath == newStorageFolder.path) { + fail && fail(FileError.INVALID_MODIFICATION_ERR); + return; + } + //can't copy into itself + if (srcPath == parentPath) { + fail && fail(FileError.INVALID_MODIFICATION_ERR); + return; + } + moveFiles(srcPath, newStorageFolder.path).then(function () { + var successCallback = function () { + success(new DirectoryEntry(name, newStorageFolder.path)); + }; + var temp = new DirectoryEntry(originFolderTop.name, originFolderTop.path).removeRecursively(successCallback, fail); + + }, function () { console.log("error!"); }); + }); + }); + }, function () { fail && fail(FileError.INVALID_MODIFICATION_ERR); }); + + }; + moveFinish(srcPath, parentFullPath); + }, function () { + fail && fail(FileError.NOT_FOUND_ERR); + } + ); + } + ); + }, + tempFileSystem:null, + + persistentFileSystem:null, + + requestFileSystem:function(win,fail,args) { + var type = args[0]; + var size = args[1]; + + var filePath = ""; + var result = null; + var fsTypeName = ""; + + switch (type) { + case LocalFileSystem.TEMPORARY: + filePath = Windows.Storage.ApplicationData.current.temporaryFolder.path; + fsTypeName = "temporary"; + break; + case LocalFileSystem.PERSISTENT: + filePath = Windows.Storage.ApplicationData.current.localFolder.path; + fsTypeName = "persistent"; + break; + } + + var MAX_SIZE = 10000000000; + if (size > MAX_SIZE) { + fail && fail(FileError.QUOTA_EXCEEDED_ERR); + return; + } + + var fileSystem = new FileSystem(fsTypeName, new DirectoryEntry(fsTypeName, filePath)); + result = fileSystem; + win(result); + }, + + resolveLocalFileSystemURI:function(success,fail,args) { + var uri = args[0]; + + var path = uri; + + // support for file name with parameters + if (/\?/g.test(path)) { + path = String(path).split("?")[0]; + } + + // support for encodeURI + if (/\%5/g.test(path)) { + path = decodeURI(path); + } + + // support for special path start with file:/// + if (path.substr(0, 8) == "file:///") { + path = Windows.Storage.ApplicationData.current.localFolder.path + "\\" + String(path).substr(8).split("/").join("\\"); + Windows.Storage.StorageFile.getFileFromPathAsync(path).then( + function (storageFile) { + success(new FileEntry(storageFile.name, storageFile.path)); + }, function () { + Windows.Storage.StorageFolder.getFolderFromPathAsync(path).then( + function (storageFolder) { + success(new DirectoryEntry(storageFolder.name, storageFolder.path)); + }, function () { + fail && fail(FileError.NOT_FOUND_ERR); + } + ); + } + ); + } else { + Windows.Storage.StorageFile.getFileFromPathAsync(path).then( + function (storageFile) { + success(new FileEntry(storageFile.name, storageFile.path)); + }, function () { + Windows.Storage.StorageFolder.getFolderFromPathAsync(path).then( + function (storageFolder) { + success(new DirectoryEntry(storageFolder.name, storageFolder.path)); + }, function () { + fail && fail(FileError.ENCODING_ERR); + } + ); + } + ); + } + } + +}; + +require("cordova/commandProxy").add("File",module.exports); + +}); + +// file: lib\windows8\plugin\windows8\FileTransferProxy.js +define("cordova/plugin/windows8/FileTransferProxy", function(require, exports, module) { + + +var FileTransferError = require('cordova/plugin/FileTransferError'), + FileUploadResult = require('cordova/plugin/FileUploadResult'), + FileEntry = require('cordova/plugin/FileEntry'); + +module.exports = { + + upload:function(successCallback, error, options) { + var filePath = options[0]; + var server = options[1]; + + + var win = function (fileUploadResult) { + successCallback(fileUploadResult); + }; + + if (filePath === null || typeof filePath === 'undefined') { + error(FileTransferError.FILE_NOT_FOUND_ERR); + return; + } + + if (String(filePath).substr(0, 8) == "file:///") { + filePath = Windows.Storage.ApplicationData.current.localFolder.path + String(filePath).substr(8).split("/").join("\\"); + } + + Windows.Storage.StorageFile.getFileFromPathAsync(filePath).then(function (storageFile) { + storageFile.openAsync(Windows.Storage.FileAccessMode.read).then(function (stream) { + var blob = MSApp.createBlobFromRandomAccessStream(storageFile.contentType, stream); + var formData = new FormData(); + formData.append("source\";filename=\"" + storageFile.name + "\"", blob); + WinJS.xhr({ type: "POST", url: server, data: formData }).then(function (response) { + var code = response.status; + storageFile.getBasicPropertiesAsync().done(function (basicProperties) { + + Windows.Storage.FileIO.readBufferAsync(storageFile).done(function (buffer) { + var dataReader = Windows.Storage.Streams.DataReader.fromBuffer(buffer); + var fileContent = dataReader.readString(buffer.length); + dataReader.close(); + win(new FileUploadResult(basicProperties.size, code, fileContent)); + + }); + + }); + }, function () { + error(FileTransferError.INVALID_URL_ERR); + }); + }); + + },function(){error(FileTransferError.FILE_NOT_FOUND_ERR);}); + }, + + download:function(win, error, options) { + var source = options[0]; + var target = options[1]; + + + if (target === null || typeof target === undefined) { + error(FileTransferError.FILE_NOT_FOUND_ERR); + return; + } + if (String(target).substr(0, 8) == "file:///") { + target = Windows.Storage.ApplicationData.current.localFolder.path + String(target).substr(8).split("/").join("\\"); + } + var path = target.substr(0, String(target).lastIndexOf("\\")); + var fileName = target.substr(String(target).lastIndexOf("\\") + 1); + if (path === null || fileName === null) { + error(FileTransferError.FILE_NOT_FOUND_ERR); + return; + } + + var download = null; + + + Windows.Storage.StorageFolder.getFolderFromPathAsync(path).then(function (storageFolder) { + storageFolder.createFileAsync(fileName, Windows.Storage.CreationCollisionOption.generateUniqueName).then(function (storageFile) { + var uri = Windows.Foundation.Uri(source); + var downloader = new Windows.Networking.BackgroundTransfer.BackgroundDownloader(); + download = downloader.createDownload(uri, storageFile); + download.startAsync().then(function () { + win(new FileEntry(storageFile.name, storageFile.path)); + }, function () { + error(FileTransferError.INVALID_URL_ERR); + }); + }); + }); + } +}; + +require("cordova/commandProxy").add("FileTransfer",module.exports); +}); + +// file: lib\windows8\plugin\windows8\MediaFile.js +define("cordova/plugin/windows8/MediaFile", function(require, exports, module) { + +/*global Windows:true */ + +var MediaFileData = require('cordova/plugin/MediaFileData'); +var CaptureError = require('cordova/plugin/CaptureError'); + +module.exports = { + + getFormatData: function (successCallback, errorCallback, args) { + Windows.Storage.StorageFile.getFileFromPathAsync(this.fullPath).then( + function (storageFile) { + var mediaTypeFlag = String(storageFile.contentType).split("/")[0].toLowerCase(); + if (mediaTypeFlag === "audio") { + storageFile.properties.getMusicPropertiesAsync().then( + function (audioProperties) { + successCallback(new MediaFileData(null, audioProperties.bitrate, 0, 0, audioProperties.duration / 1000)); + }, function () { + errorCallback(new CaptureError(CaptureError.CAPTURE_INVALID_ARGUMENT)); + } + ); + } else if (mediaTypeFlag === "video") { + storageFile.properties.getVideoPropertiesAsync().then( + function (videoProperties) { + successCallback(new MediaFileData(null, videoProperties.bitrate, videoProperties.height, videoProperties.width, videoProperties.duration / 1000)); + }, function () { + errorCallback(new CaptureError(CaptureError.CAPTURE_INVALID_ARGUMENT)); + } + ); + } else if (mediaTypeFlag === "image") { + storageFile.properties.getImagePropertiesAsync().then( + function (imageProperties) { + successCallback(new MediaFileData(null, 0, imageProperties.height, imageProperties.width, 0)); + }, function () { + errorCallback(new CaptureError(CaptureError.CAPTURE_INVALID_ARGUMENT)); + } + ); + } else { + errorCallback(new CaptureError(CaptureError.CAPTURE_INVALID_ARGUMENT)); + } + }, function () { + errorCallback(new CaptureError(CaptureError.CAPTURE_INVALID_ARGUMENT)); + } + ); + } +}; + +}); + +// file: lib\windows8\plugin\windows8\MediaProxy.js +define("cordova/plugin/windows8/MediaProxy", function(require, exports, module) { + +/*global Windows:true */ + +var cordova = require('cordova'), + Media = require('cordova/plugin/Media'); + +var MediaError = require('cordova/plugin/MediaError'); + +module.exports = { + mediaCaptureMrg:null, + + // Initiates the audio file + create:function(win, lose, args) { + var id = args[0]; + var src = args[1]; + var thisM = Media.get(id); + Media.onStatus(id, Media.MEDIA_STATE, Media.MEDIA_STARTING); + + Media.prototype.node = null; + + var fn = src.split('.').pop(); // gets the file extension + if (thisM.node === null) { + if (fn === 'mp3' || fn === 'wma' || fn === 'wma' || + fn === 'cda' || fn === 'adx' || fn === 'wm' || + fn === 'm3u' || fn === 'wmx') { + thisM.node = new Audio(src); + thisM.node.load(); + var dur = thisM.node.duration; + if (isNaN(dur)) { + dur = -1; + } + Media.onStatus(id, Media.MEDIA_DURATION, dur); + } + else { + lose && lose({code:MediaError.MEDIA_ERR_ABORTED}); + } + } + }, + + // Start playing the audio + startPlayingAudio:function(win, lose, args) { + var id = args[0]; + //var src = args[1]; + //var options = args[2]; + Media.onStatus(id, Media.MEDIA_STATE, Media.MEDIA_RUNNING); + + (Media.get(id)).node.play(); + }, + + // Stops the playing audio + stopPlayingAudio:function(win, lose, args) { + var id = args[0]; + try { + (Media.get(id)).node.pause(); + (Media.get(id)).node.currentTime = 0; + Media.onStatus(id, Media.MEDIA_STATE, Media.MEDIA_STOPPED); + win(); + } catch (err) { + lose("Failed to stop: "+err); + } + }, + + // Seeks to the position in the audio + seekToAudio:function(win, lose, args) { + var id = args[0]; + var milliseconds = args[1]; + try { + (Media.get(id)).node.currentTime = milliseconds / 1000; + win(); + } catch (err) { + lose("Failed to seek: "+err); + } + }, + + // Pauses the playing audio + pausePlayingAudio:function(win, lose, args) { + var id = args[0]; + var thisM = Media.get(id); + try { + thisM.node.pause(); + Media.onStatus(id, Media.MEDIA_STATE, Media.MEDIA_PAUSED); + } catch (err) { + lose("Failed to pause: "+err); + } + }, + + // Gets current position in the audio + getCurrentPositionAudio:function(win, lose, args) { + var id = args[0]; + try { + var p = (Media.get(id)).node.currentTime; + Media.onStatus(id, Media.MEDIA_POSITION, p); + win(p); + } catch (err) { + lose(err); + } + }, + + // Start recording audio + startRecordingAudio:function(win, lose, args) { + var id = args[0]; + var src = args[1]; + // Initialize device + Media.prototype.mediaCaptureMgr = null; + var thisM = (Media.get(id)); + var captureInitSettings = new Windows.Media.Capture.MediaCaptureInitializationSettings(); + captureInitSettings.streamingCaptureMode = Windows.Media.Capture.StreamingCaptureMode.audio; + thisM.mediaCaptureMgr = new Windows.Media.Capture.MediaCapture(); + thisM.mediaCaptureMgr.addEventListener("failed", lose); + + thisM.mediaCaptureMgr.initializeAsync(captureInitSettings).done(function (result) { + thisM.mediaCaptureMgr.addEventListener("recordlimitationexceeded", lose); + thisM.mediaCaptureMgr.addEventListener("failed", lose); + }, lose); + // Start recording + Windows.Storage.KnownFolders.musicLibrary.createFileAsync(src, Windows.Storage.CreationCollisionOption.replaceExisting).done(function (newFile) { + var storageFile = newFile; + var fileType = this.src.split('.').pop(); + var encodingProfile = null; + switch (fileType) { + case 'm4a': + encodingProfile = Windows.Media.MediaProperties.MediaEncodingProfile.createM4a(Windows.Media.MediaProperties.AudioEncodingQuality.auto); + break; + case 'mp3': + encodingProfile = Windows.Media.MediaProperties.MediaEncodingProfile.createMp3(Windows.Media.MediaProperties.AudioEncodingQuality.auto); + break; + case 'wma': + encodingProfile = Windows.Media.MediaProperties.MediaEncodingProfile.createWma(Windows.Media.MediaProperties.AudioEncodingQuality.auto); + break; + default: + lose("Invalid file type for record"); + break; + } + thisM.mediaCaptureMgr.startRecordToStorageFileAsync(encodingProfile, storageFile).done(win, lose); + }, lose); + }, + + // Stop recording audio + stopRecordingAudio:function(win, lose, args) { + var id = args[0]; + var thisM = Media.get(id); + thisM.mediaCaptureMgr.stopRecordAsync().done(win, lose); + }, + + // Release the media object + release:function(win, lose, args) { + var id = args[0]; + var thisM = Media.get(id); + try { + delete thisM.node; + } catch (err) { + lose("Failed to release: "+err); + } + }, + setVolume:function(win, lose, args) { + var id = args[0]; + var volume = args[1]; + var thisM = Media.get(id); + thisM.volume = volume; + } +}; + +require("cordova/commandProxy").add("Media",module.exports); +}); + +// file: lib\windows8\plugin\windows8\NetworkStatusProxy.js +define("cordova/plugin/windows8/NetworkStatusProxy", function(require, exports, module) { + +/*global Windows:true */ + +var cordova = require('cordova'); +var Connection = require('cordova/plugin/Connection'); + +module.exports = { + + getConnectionInfo:function(win,fail,args) + { + console.log("NetworkStatusProxy::getConnectionInfo"); + var winNetConn = Windows.Networking.Connectivity; + var networkInfo = winNetConn.NetworkInformation; + var networkCostInfo = winNetConn.NetworkCostType; + var networkConnectivityInfo = winNetConn.NetworkConnectivityLevel; + var networkAuthenticationInfo = winNetConn.NetworkAuthenticationType; + var networkEncryptionInfo = winNetConn.NetworkEncryptionType; + + var connectionType; + + var profile = Windows.Networking.Connectivity.NetworkInformation.getInternetConnectionProfile(); + if(profile) { + var conLevel = profile.getNetworkConnectivityLevel(); + var interfaceType = profile.networkAdapter.ianaInterfaceType; + + if (conLevel == Windows.Networking.Connectivity.NetworkConnectivityLevel.none) { + connectionType = Connection.NONE; + } + else { + switch (interfaceType) { + case 71: + connectionType = Connection.WIFI; + break; + case 6: + connectionType = Connection.ETHERNET; + break; + default: + connectionType = Connection.UNKNOWN; + break; + } + } + } + // FYI + //Connection.UNKNOWN 'Unknown connection'; + //Connection.ETHERNET 'Ethernet connection'; + //Connection.WIFI 'WiFi connection'; + //Connection.CELL_2G 'Cell 2G connection'; + //Connection.CELL_3G 'Cell 3G connection'; + //Connection.CELL_4G 'Cell 4G connection'; + //Connection.NONE 'No network connection'; + + setTimeout(function () { + if (connectionType) { + win(connectionType); + } else { + win(Connection.NONE); + } + },0); + } + +}; + +require("cordova/commandProxy").add("NetworkStatus",module.exports); +}); + +// file: lib\windows8\plugin\windows8\NotificationProxy.js +define("cordova/plugin/windows8/NotificationProxy", function(require, exports, module) { + +/*global Windows:true */ + +var cordova = require('cordova'); + +var isAlertShowing = false; +var alertStack = []; + +module.exports = { + alert:function(win, loseX, args) { + + if (isAlertShowing) { + var later = function () { + module.exports.alert(win, loseX, args); + }; + alertStack.push(later); + return; + } + isAlertShowing = true; + + var message = args[0]; + var _title = args[1]; + var _buttonLabel = args[2]; + + var md = new Windows.UI.Popups.MessageDialog(message, _title); + md.commands.append(new Windows.UI.Popups.UICommand(_buttonLabel)); + md.showAsync().then(function() { + isAlertShowing = false; + win && win(); + + if (alertStack.length) { + setTimeout(alertStack.shift(), 0); + } + + }); + }, + + confirm:function(win, loseX, args) { + + if (isAlertShowing) { + var later = function () { + module.exports.confirm(win, loseX, args); + }; + alertStack.push(later); + return; + } + + isAlertShowing = true; + + var message = args[0]; + var _title = args[1]; + var _buttonLabels = args[2]; + + var btnList = []; + function commandHandler (command) { + win && win(btnList[command.label]); + } + + var md = new Windows.UI.Popups.MessageDialog(message, _title); + var button = _buttonLabels.split(','); + + for (var i = 0; i tag. + function injectScript(path) { + scriptCounter++; + var script = document.createElement("script"); + script.onload = scriptLoadedCallback; + script.src = path; + document.head.appendChild(script); + } + + // Called when: + // * There are plugins defined and all plugins are finished loading. + // * There are no plugins to load. + function finishPluginLoading() { + context.cordova.require('cordova/channel').onPluginsReady.fire(); + } + + // Handler for the cordova_plugins.json content. + // See plugman's plugin_loader.js for the details of this object. + // This function is only called if the really is a plugins array that isn't empty. + // Otherwise the XHR response handler will just call finishPluginLoading(). + function handlePluginsObject(modules) { + // First create the callback for when all plugins are loaded. + var mapper = context.cordova.require('cordova/modulemapper'); + onScriptLoadingComplete = function() { + // Loop through all the plugins and then through their clobbers and merges. + for (var i = 0; i < modules.length; i++) { + var module = modules[i]; + if (!module) continue; + + if (module.clobbers && module.clobbers.length) { + for (var j = 0; j < module.clobbers.length; j++) { + mapper.clobbers(module.id, module.clobbers[j]); + } + } + + if (module.merges && module.merges.length) { + for (var k = 0; k < module.merges.length; k++) { + mapper.merges(module.id, module.merges[k]); + } + } + + // Finally, if runs is truthy we want to simply require() the module. + // This can be skipped if it had any merges or clobbers, though, + // since the mapper will already have required the module. + if (module.runs && !(module.clobbers && module.clobbers.length) && !(module.merges && module.merges.length)) { + context.cordova.require(module.id); + } + } + + finishPluginLoading(); + }; + + // Now inject the scripts. + for (var i = 0; i < modules.length; i++) { + injectScript(modules[i].file); + } + } + + // Try to XHR the cordova_plugins.json file asynchronously. + try { // we commented we were going to try, so let us actually try and catch + var xhr = new context.XMLHttpRequest(); + xhr.onreadystatechange = function() { + if (this.readyState != 4) { // not DONE + return; + } + + // If the response is a JSON string which composes an array, call handlePluginsObject. + // If the request fails, or the response is not a JSON array, just call finishPluginLoading. + if (this.status == 200) { + var obj = JSON.parse(this.responseText); + if (obj && obj instanceof Array && obj.length > 0) { + handlePluginsObject(obj); + } else { + finishPluginLoading(); + } + } else { + finishPluginLoading(); + } + }; + xhr.open('GET', 'cordova_plugins.json', true); // Async + xhr.send(); + } + catch(err) { + finishPluginLoading(); + } +}(window)); + + + +})(); \ No newline at end of file diff --git a/cordova-lib/spec-plugman-install/projects/windows8/www/css/index.css b/cordova-lib/spec-plugman-install/projects/windows8/www/css/index.css new file mode 100644 index 000000000..51daa797c --- /dev/null +++ b/cordova-lib/spec-plugman-install/projects/windows8/www/css/index.css @@ -0,0 +1,115 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +* { + -webkit-tap-highlight-color: rgba(0,0,0,0); /* make transparent link selection, adjust last value opacity 0 to 1.0 */ +} + +body { + -webkit-touch-callout: none; /* prevent callout to copy image, etc when tap to hold */ + -webkit-text-size-adjust: none; /* prevent webkit from resizing text to fit */ + -webkit-user-select: none; /* prevent copy paste, to allow, change 'none' to 'text' */ + background-color:#E4E4E4; + background-image:linear-gradient(top, #A7A7A7 0%, #E4E4E4 51%); + background-image:-webkit-linear-gradient(top, #A7A7A7 0%, #E4E4E4 51%); + background-image:-ms-linear-gradient(top, #A7A7A7 0%, #E4E4E4 51%); + background-image:-webkit-gradient( + linear, + left top, + left bottom, + color-stop(0, #A7A7A7), + color-stop(0.51, #E4E4E4) + ); + background-attachment:fixed; + font-family:'HelveticaNeue-Light', 'HelveticaNeue', Helvetica, Arial, sans-serif; + font-size:12px; + height:100%; + margin:0px; + padding:0px; + text-transform:uppercase; + width:100%; +} + +/* Portrait layout (default) */ +.app { + background:url(../img/logo.png) no-repeat center top; /* 170px x 200px */ + position:absolute; /* position in the center of the screen */ + left:50%; + top:50%; + height:50px; /* text area height */ + width:225px; /* text area width */ + text-align:center; + padding:180px 0px 0px 0px; /* image height is 200px (bottom 20px are overlapped with text) */ + margin:-115px 0px 0px -112px; /* offset vertical: half of image height and text area height */ + /* offset horizontal: half of text area width */ +} + +/* Landscape layout (with min-width) */ +@media screen and (min-aspect-ratio: 1/1) and (min-width:400px) { + .app { + background-position:left center; + padding:75px 0px 75px 170px; /* padding-top + padding-bottom + text area = image height */ + margin:-90px 0px 0px -198px; /* offset vertical: half of image height */ + /* offset horizontal: half of image width and text area width */ + } +} + +h1 { + font-size:24px; + font-weight:normal; + margin:0px; + overflow:visible; + padding:0px; + text-align:center; +} + +.event { + border-radius:4px; + -webkit-border-radius:4px; + color:#FFFFFF; + font-size:12px; + margin:0px 30px; + padding:2px 0px; +} + +.event.listening { + background-color:#333333; + display:block; +} + +.event.received { + background-color:#4B946A; + display:none; +} + +@keyframes fade { + from { opacity: 1.0; } + 50% { opacity: 0.4; } + to { opacity: 1.0; } +} + +@-webkit-keyframes fade { + from { opacity: 1.0; } + 50% { opacity: 0.4; } + to { opacity: 1.0; } +} + +.blink { + animation:fade 3000ms infinite; + -webkit-animation:fade 3000ms infinite; +} diff --git a/cordova-lib/spec-plugman-install/projects/windows8/www/img/logo.png b/cordova-lib/spec-plugman-install/projects/windows8/www/img/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..86a48a83d2ef518548b0f3c1e7745105315cc162 GIT binary patch literal 11600 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 literal 0 HcmV?d00001 diff --git a/cordova-lib/spec-plugman-install/projects/windows8/www/img/smalllogo.png b/cordova-lib/spec-plugman-install/projects/windows8/www/img/smalllogo.png new file mode 100644 index 0000000000000000000000000000000000000000..0e648ef38d5e98bd5033f1ddb7b2059e13e6f858 GIT binary patch literal 2831 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 Q@BO0MSvz9Nt$ZW@1Ft6QBme*a literal 0 HcmV?d00001 diff --git a/cordova-lib/spec-plugman-install/projects/windows8/www/img/splashscreen.png b/cordova-lib/spec-plugman-install/projects/windows8/www/img/splashscreen.png new file mode 100644 index 0000000000000000000000000000000000000000..d1e6c982818b3546fb5070c75623959ce479d271 GIT binary patch literal 24855 zcmb@tbx@p5*C$LMAxH>L1PyKj1Q{Gca2W{h5S#%9cLIa}!6CRyaM!^tL4rdVWN^0$ z7GQwjJK?^ccfZ}*cmMcmr>3f}zN-85>F#qK`St0rcgnJOI4^O~(9rPY<)qZm(9rGB z&>pa3VWQsnF&s{!iWjcZI)WQmEFG_pZ+DS_THW#JU<^yqo z93?HR!E)Zt7V6&08fMXBY1p2=>g+TtRwTr8o#sB2@|47(H!^_cvQ_aG~!OhtWwQ-hoe}{4u zl61B(admLkaB#5u&nmvNc5roYv378zkyHoLFoR6Y!1jM%u-x|mfrRAkU0hA<%`D`l zL}^hpIKW_Yq1Tdv+;6#G^S+kk=6n5Gnp;5TwSXXyPw=gvfHaRJztn&FN;#OhK`iWD z|I^p}fA;13Z~Oig28bhSWGM@0u)Br1jI#rT=6=#b;QyW%?*EqFzkSXBdtP|{+rFGA zW;p+D?f+-1|MLnZKYt(pOK?$@{}O!*dz8F8qXhdkhvEPlnqio{l!S)o++MrS7lv8G zwB^#TP;zx)Ee+YfDSZ?oG$JWmes`$8pAR zycf^ORz>A6MB0U)Oi4Pw!_tSv7Jl&?;q7a`w=B~4U+c=M^qZOcCmNI{`1|Yns|(Q3 zOfc>X0^oh|Z}nsKgZnBL`F#WQBV{{28ZFKJGJ)o+ctRG}J1s`A*wAo$9IqmFG1wdNOp-SS9SyaeAFl#>*{Pm}j3Ji8#V5PYij(kg(8(&5 zY)buPGbpA8H3xidHl>@(yhoN}5^B{tJTupJ-C#)&cyS)#_d=L<4Tz72hpwTq@ea}K zvVHsXYx9fyc`b|`1`=Zf?5J%U=a)NLTghXe8M1|I%wE%1U5rJ<))yX<``8`yuu9bo z)Mf~TZ~d^y^HacmpR-K9i)ht{qMfd#b?Tx~yC&y4Pt^ zb2c002fpWZV})zlS4(kQbDw+KjW{RKuZu1({U(T2M8=t<=Frgi-iL~z<@{<4pcAvI ze|McngQcU_M5&rTl0FI$@pY*p-R|p}^U8_BKYz+bl<)bIwT~4e$k+lV`AHe3Am&w4g3ZxlM( zwg2oY>eFgl{&Z-jOa3$@oOMuTUl_I}UH5P*lB!@lfjUIgdvfHN&z1N$Ir5>G+m^Wb zapJADwcKVFcqL+Je?PA`m%`ti9fhLTv!S)G;xjBtWAiDbPOQ%^|M&t^m#d)TwoH(W zbU;>W*2SC7`DL9;Qjc^n$2wkvupGn(52&| z!(dG8x#-97Jk36>;ico2290|?Y;%<8? z%4Gu~`^7-T3svZx!mjAbmTGG>PWP8>e{TzmO;tAAKkb-*2lWgzp#^rY{w@n9qOKX5 z6o?hr6N41w%53JzmQ9Q9jps@0iaY_YFK_vEj^)W@&n+(AJa$i|k9_%P1rIk(>VYSQ z-(jZz&f#6>H2Tr9qXKrRH4eaM3F@zVba9hdqwtbRwjp~ydYRsP;{?j`z1yu|qYpn* z*y8{n8TD zZQlJTEtPL*aWJS`f9bP;TseUvc86*UQNJZ|QPG=jGftF%{apydqx1TY9}>wv@owu? zG<_+i3eBNX$^zc`YWC@LbZ+@>rBO8U6h3|hIeS^g9RBA>_Hd!O+s%l$j5 zX4|8gS5@4^(i6;oh4tGmc66bORXxj1=3Rn2w2D&(Zln$_+rii7-+6Vh{NNm%{_bT& zAOT~u5wSx0tY+(C;rI6+7wpj5B>a0GpgDZ>&zS9_cC9URql1@EqZp{gRski9EJwtt z&O!A)_;0>$wjBR#QGN`{<=Y0r%JtmS2Ao>CwahrLzw^f6uq`n1&v$iotp}k<{@t7^ zHUs+4SK>D*?T85Ii`o*oNrp;1bevCIhFRstaU^i%09|pKWS*#HPN^^c{sSGQTV*}m zyDp4psYM{q=9RV%4+Z*>GCuCDq3s9q`dk!G*UkE(MGG2l;!_zh(3S}9e#xNpWYyte zlZX0UqxU5Tn}Z1>X&#=>Ncvu!pUEp+?Uh_}y2HW!T`8W3^J;!vX*O&`uXU&is@ebo}XT+?*iq3WW`?rW6mp}N$≶T$HebG{9eWP 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

K$uoL~Sr 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 Ap#T5? literal 0 HcmV?d00001 diff --git a/cordova-lib/spec-plugman-install/projects/windows8/www/img/storelogo.png b/cordova-lib/spec-plugman-install/projects/windows8/www/img/storelogo.png new file mode 100644 index 0000000000000000000000000000000000000000..dd004780cc33c1d7250b1b6059dca603da264b6b GIT binary patch literal 4052 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 + + + + + + + + Hello World + + +

+ + + + + diff --git a/cordova-lib/spec-plugman-install/projects/windows8/www/js/index.js b/cordova-lib/spec-plugman-install/projects/windows8/www/js/index.js new file mode 100644 index 000000000..87b56604d --- /dev/null +++ b/cordova-lib/spec-plugman-install/projects/windows8/www/js/index.js @@ -0,0 +1,49 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +var app = { + // Application Constructor + initialize: function() { + this.bindEvents(); + }, + // Bind Event Listeners + // + // Bind any events that are required on startup. Common events are: + // 'load', 'deviceready', 'offline', and 'online'. + bindEvents: function() { + document.addEventListener('deviceready', this.onDeviceReady, false); + }, + // deviceready Event Handler + // + // The scope of 'this' is the event. In order to call the 'receivedEvent' + // function, we must explicitly call 'app.receivedEvent(...);' + onDeviceReady: function() { + app.receivedEvent('deviceready'); + }, + // Update DOM on a Received Event + receivedEvent: function(id) { + var parentElement = document.getElementById(id); + var listeningElement = parentElement.querySelector('.listening'); + var receivedElement = parentElement.querySelector('.received'); + + listeningElement.setAttribute('style', 'display:none;'); + receivedElement.setAttribute('style', 'display:block;'); + + console.log('Received Event: ' + id); + } +}; diff --git a/cordova-lib/spec-plugman-install/projects/wp8/CordovaAppProj.csproj b/cordova-lib/spec-plugman-install/projects/wp8/CordovaAppProj.csproj new file mode 100644 index 000000000..bc229e59d --- /dev/null +++ b/cordova-lib/spec-plugman-install/projects/wp8/CordovaAppProj.csproj @@ -0,0 +1,136 @@ + + + + Debug + AnyCPU + 10.0.20506 + 2.0 + {3677C1B7-D68B-4CF9-BF8A-E869D437A6DF} + {C089C8C0-30E0-4E22-80C0-CE093F111A43};{fae04ec0-301f-11d3-bf4b-00c04f79efbc} + Library + Properties + my.test.project + my.test.project + v8.0 + + + + + WindowsPhone + true + en-US + true + true + CordovaAppProj_$(Configuration)_$(Platform).xap + Properties\AppManifest.xml + my.test.project.App + true + true + 11.0 + + + + true + full + false + Bin\Debug + TRACE;DEBUG;SILVERLIGHT;WINDOWS_PHONE;WP8 + true + true + prompt + 4 + false + + + pdbonly + true + Bin\Release + TRACE;SILVERLIGHT;WINDOWS_PHONE;WP8 + true + true + prompt + 4 + false + + + true + Bin\x86\Debug + DEBUG;TRACE;SILVERLIGHT;WINDOWS_PHONE + true + full + + + prompt + ManagedMinimumRules.ruleset + false + + + Bin\x86\Release + TRACE;SILVERLIGHT;WINDOWS_PHONE + true + true + pdbonly + + + prompt + ManagedMinimumRules.ruleset + false + + + true + Bin\ARM\Debug + DEBUG;TRACE;SILVERLIGHT;WINDOWS_PHONE + true + full + + + prompt + ManagedMinimumRules.ruleset + false + false + + + Bin\ARM\Release + TRACE;SILVERLIGHT;WINDOWS_PHONE + true + true + pdbonly + + + prompt + ManagedMinimumRules.ruleset + false + + + + App.xaml + + + MainPage.xaml + + + + Designer + MSBuild:Compile + + + + + + + + PageTest.xaml + + + + + lib\LibraryTest.dll + + + + + + + + + diff --git a/cordova-lib/spec-plugman-install/projects/wp8/Properties/WMAppManifest.xml b/cordova-lib/spec-plugman-install/projects/wp8/Properties/WMAppManifest.xml new file mode 100644 index 000000000..5b37a958b --- /dev/null +++ b/cordova-lib/spec-plugman-install/projects/wp8/Properties/WMAppManifest.xml @@ -0,0 +1,39 @@ + + + + + + + + ApplicationIcon.png + + + + + + + + + + Background.png + 0 + Background.png + An App + + + + + + + + false + + + + + + + + + + \ No newline at end of file diff --git a/cordova-lib/spec-plugman-install/projects/www-only/.gitkeep b/cordova-lib/spec-plugman-install/projects/www-only/.gitkeep new file mode 100644 index 000000000..e69de29bb From f78ed083e8d26612a229b21e8fc9c5cabdad67a9 Mon Sep 17 00:00:00 2001 From: Suraj Pindoria Date: Tue, 15 Jul 2014 10:57:26 -0700 Subject: [PATCH 11/16] Added another file to Cordova "project" submodule --- cordova-lib/spec-cordova-build/build.spec.js | 2 +- cordova-lib/spec-cordova-build/compile.spec.js | 2 +- cordova-lib/spec-cordova-build/prepare.spec.js | 2 +- cordova-lib/spec-cordova-project/create.spec.js | 2 +- cordova-lib/spec-cordova-project/emulate.spec.js | 2 +- cordova-lib/spec-cordova-project/restore.spec.js | 2 +- cordova-lib/spec-cordova-project/run.spec.js | 2 +- cordova-lib/spec-cordova-project/save.spec.js | 2 +- .../{spec-cordova => spec-cordova-project}/util.spec.js | 2 +- cordova-lib/spec-cordova/lazy_load.spec.js | 2 +- cordova-lib/spec-cordova/metadata/android_parser.spec.js | 2 +- cordova-lib/spec-cordova/metadata/blackberry_parser.spec.js | 2 +- cordova-lib/spec-cordova/metadata/firefoxos_parser.spec.js | 2 +- cordova-lib/spec-cordova/metadata/ios_parser.spec.js | 2 +- cordova-lib/spec-cordova/metadata/windows8_parser.spec.js | 2 +- cordova-lib/spec-cordova/metadata/wp8_parser.spec.js | 2 +- cordova-lib/spec-cordova/serve.spec.js | 2 +- cordova-lib/src/cordova/build/build.js | 2 +- cordova-lib/src/cordova/build/compile.js | 2 +- cordova-lib/src/cordova/build/prepare.js | 2 +- cordova-lib/src/cordova/cordova.js | 2 +- cordova-lib/src/cordova/hooker.js | 2 +- cordova-lib/src/cordova/info.js | 2 +- cordova-lib/src/cordova/lazy_load.js | 2 +- cordova-lib/src/cordova/metadata/amazon_fireos_parser.js | 2 +- cordova-lib/src/cordova/metadata/android_parser.js | 2 +- cordova-lib/src/cordova/metadata/blackberry10_parser.js | 2 +- cordova-lib/src/cordova/metadata/firefoxos_parser.js | 2 +- cordova-lib/src/cordova/metadata/ios_parser.js | 2 +- cordova-lib/src/cordova/metadata/ubuntu_parser.js | 2 +- cordova-lib/src/cordova/metadata/windows_parser.js | 2 +- cordova-lib/src/cordova/metadata/wp8_parser.js | 2 +- cordova-lib/src/cordova/platform.js | 2 +- cordova-lib/src/cordova/platforms.js | 2 +- cordova-lib/src/cordova/plugin.js | 2 +- cordova-lib/src/cordova/project/create.js | 2 +- cordova-lib/src/cordova/project/emulate.js | 2 +- cordova-lib/src/cordova/project/restore.js | 2 +- cordova-lib/src/cordova/project/run.js | 2 +- cordova-lib/src/cordova/project/save.js | 2 +- cordova-lib/src/cordova/{ => project}/util.js | 4 ++-- cordova-lib/src/cordova/serve.js | 2 +- 42 files changed, 43 insertions(+), 43 deletions(-) rename cordova-lib/{spec-cordova => spec-cordova-project}/util.spec.js (99%) rename cordova-lib/src/cordova/{ => project}/util.js (98%) diff --git a/cordova-lib/spec-cordova-build/build.spec.js b/cordova-lib/spec-cordova-build/build.spec.js index 28127de34..504bd58d6 100644 --- a/cordova-lib/spec-cordova-build/build.spec.js +++ b/cordova-lib/spec-cordova-build/build.spec.js @@ -23,7 +23,7 @@ var cordova = require('../src/cordova/cordova'), fs = require('fs'), hooker = require('../src/cordova/hooker'), Q = require('q'), - util = require('../src/cordova/util'); + util = require('../src/cordova/project/util'); var supported_platforms = Object.keys(platforms).filter(function(p) { return p != 'www'; }); diff --git a/cordova-lib/spec-cordova-build/compile.spec.js b/cordova-lib/spec-cordova-build/compile.spec.js index a1dadb395..da748d5ab 100644 --- a/cordova-lib/spec-cordova-build/compile.spec.js +++ b/cordova-lib/spec-cordova-build/compile.spec.js @@ -22,7 +22,7 @@ var cordova = require('../src/cordova/cordova'), fs = require('fs'), hooker = require('../src/cordova/hooker'), superspawn = require('../src/cordova/superspawn'), - util = require('../src/cordova/util'), + util = require('../src/cordova/project/util'), Q = require('q'), os = require('os'); diff --git a/cordova-lib/spec-cordova-build/prepare.spec.js b/cordova-lib/spec-cordova-build/prepare.spec.js index 8a888f4e8..b87b0123f 100644 --- a/cordova-lib/spec-cordova-build/prepare.spec.js +++ b/cordova-lib/spec-cordova-build/prepare.spec.js @@ -21,7 +21,7 @@ var cordova = require('../src/cordova/cordova'), plugman = require('../src/plugman/plugman'), path = require('path'), fs = require('fs'), - util = require('../src/cordova/util'), + util = require('../src/cordova/project/util'), prepare = require('../src/cordova/build/prepare'), lazy_load = require('../src/cordova/lazy_load'), ConfigParser = require('../src/configparser/ConfigParser'), diff --git a/cordova-lib/spec-cordova-project/create.spec.js b/cordova-lib/spec-cordova-project/create.spec.js index 29f104b7f..b28c0135f 100644 --- a/cordova-lib/spec-cordova-project/create.spec.js +++ b/cordova-lib/spec-cordova-project/create.spec.js @@ -24,7 +24,7 @@ var helpers = require('../spec-cordova/helpers'), Q = require('q'), config = require('../src/cordova/config'), events = require('../src/events'), - util = require('../src/cordova/util'), + util = require('../src/cordova/project/util'), ConfigParser = require('../src/configparser/ConfigParser'), cordova = require('../src/cordova/cordova'); diff --git a/cordova-lib/spec-cordova-project/emulate.spec.js b/cordova-lib/spec-cordova-project/emulate.spec.js index 10f0d869b..a95e4927c 100644 --- a/cordova-lib/spec-cordova-project/emulate.spec.js +++ b/cordova-lib/spec-cordova-project/emulate.spec.js @@ -23,7 +23,7 @@ var cordova = require('../src/cordova/cordova'), fs = require('fs'), hooker = require('../src/cordova/hooker'), Q = require('q'), - util = require('../src/cordova/util'), + util = require('../src/cordova/project/util'), os = require('os'); var supported_platforms = Object.keys(platforms).filter(function(p) { return p != 'www'; }); diff --git a/cordova-lib/spec-cordova-project/restore.spec.js b/cordova-lib/spec-cordova-project/restore.spec.js index e69fa2ab2..d8c7ee38d 100644 --- a/cordova-lib/spec-cordova-project/restore.spec.js +++ b/cordova-lib/spec-cordova-project/restore.spec.js @@ -20,7 +20,7 @@ var path = require('path'), Q = require('q'), cordova = require('../src/cordova/cordova'), - cordova_util = require('../src/cordova/util'), + cordova_util = require('../src/cordova/project/util'), ConfigParser = require('../src/configparser/ConfigParser'), project_dir = path.join(__dirname, 'fixtures', 'base'); diff --git a/cordova-lib/spec-cordova-project/run.spec.js b/cordova-lib/spec-cordova-project/run.spec.js index 82e6a6962..445699d3c 100644 --- a/cordova-lib/spec-cordova-project/run.spec.js +++ b/cordova-lib/spec-cordova-project/run.spec.js @@ -23,7 +23,7 @@ var cordova = require('../src/cordova/cordova'), fs = require('fs'), hooker = require('../src/cordova/hooker'), Q = require('q'), - util = require('../src/cordova/util'); + util = require('../src/cordova/project/util'); var supported_platforms = Object.keys(platforms).filter(function(p) { return p != 'www'; }); diff --git a/cordova-lib/spec-cordova-project/save.spec.js b/cordova-lib/spec-cordova-project/save.spec.js index c76458122..07a170139 100644 --- a/cordova-lib/spec-cordova-project/save.spec.js +++ b/cordova-lib/spec-cordova-project/save.spec.js @@ -20,7 +20,7 @@ var path = require('path'), Q = require('q'), cordova = require('../src/cordova/cordova'), - cordova_util = require('../src/cordova/util'), + cordova_util = require('../src/cordova/project/util'), ConfigParser = require('../src/configparser/ConfigParser'), project_dir = path.join(__dirname, 'fixtures', 'base'); diff --git a/cordova-lib/spec-cordova/util.spec.js b/cordova-lib/spec-cordova-project/util.spec.js similarity index 99% rename from cordova-lib/spec-cordova/util.spec.js rename to cordova-lib/spec-cordova-project/util.spec.js index 27c73858c..c4f2b2a68 100644 --- a/cordova-lib/spec-cordova/util.spec.js +++ b/cordova-lib/spec-cordova-project/util.spec.js @@ -20,7 +20,7 @@ var cordova = require('../src/cordova/cordova'), shell = require('shelljs'), path = require('path'), fs = require('fs'), - util = require('../src/cordova/util'), + util = require('../src/cordova/project/util'), temp = path.join(__dirname, '..', 'temp'), fixtures = path.join(__dirname, 'fixtures'); diff --git a/cordova-lib/spec-cordova/lazy_load.spec.js b/cordova-lib/spec-cordova/lazy_load.spec.js index e6ce1eb58..25895d55c 100644 --- a/cordova-lib/spec-cordova/lazy_load.spec.js +++ b/cordova-lib/spec-cordova/lazy_load.spec.js @@ -18,7 +18,7 @@ */ var lazy_load = require('../src/cordova/lazy_load'), config = require('../src/cordova/config'), - util = require('../src/cordova/util'), + util = require('../src/cordova/project/util'), shell = require('shelljs'), npmconf = require('npmconf'); path = require('path'), diff --git a/cordova-lib/spec-cordova/metadata/android_parser.spec.js b/cordova-lib/spec-cordova/metadata/android_parser.spec.js index 336d43156..b81b15127 100644 --- a/cordova-lib/spec-cordova/metadata/android_parser.spec.js +++ b/cordova-lib/spec-cordova/metadata/android_parser.spec.js @@ -17,7 +17,7 @@ under the License. */ var platforms = require('../../src/cordova/platforms'), - util = require('../../src/cordova/util'), + util = require('../../src/cordova/project/util'), path = require('path'), shell = require('shelljs'), fs = require('fs'), diff --git a/cordova-lib/spec-cordova/metadata/blackberry_parser.spec.js b/cordova-lib/spec-cordova/metadata/blackberry_parser.spec.js index 9c43e5989..5b5bba4fd 100644 --- a/cordova-lib/spec-cordova/metadata/blackberry_parser.spec.js +++ b/cordova-lib/spec-cordova/metadata/blackberry_parser.spec.js @@ -18,7 +18,7 @@ */ var platforms = require('../../src/cordova/platforms'), - util = require('../../src/cordova/util'), + util = require('../../src/cordova/project/util'), path = require('path'), shell = require('shelljs'), fs = require('fs'), diff --git a/cordova-lib/spec-cordova/metadata/firefoxos_parser.spec.js b/cordova-lib/spec-cordova/metadata/firefoxos_parser.spec.js index 3b1faa38a..b118e5ddb 100644 --- a/cordova-lib/spec-cordova/metadata/firefoxos_parser.spec.js +++ b/cordova-lib/spec-cordova/metadata/firefoxos_parser.spec.js @@ -17,7 +17,7 @@ under the License. */ var platforms = require('../../src/cordova/platforms'), - util = require('../../src/cordova/util'), + util = require('../../src/cordova/project/util'), path = require('path'), shell = require('shelljs'), fs = require('fs'), diff --git a/cordova-lib/spec-cordova/metadata/ios_parser.spec.js b/cordova-lib/spec-cordova/metadata/ios_parser.spec.js index 7cceb9848..bf8d7599d 100644 --- a/cordova-lib/spec-cordova/metadata/ios_parser.spec.js +++ b/cordova-lib/spec-cordova/metadata/ios_parser.spec.js @@ -17,7 +17,7 @@ under the License. */ var platforms = require('../../src/cordova/platforms'), - util = require('../../src/cordova/util'), + util = require('../../src/cordova/project/util'), path = require('path'), shell = require('shelljs'), plist = require('plist-with-patches'), diff --git a/cordova-lib/spec-cordova/metadata/windows8_parser.spec.js b/cordova-lib/spec-cordova/metadata/windows8_parser.spec.js index b4b804ffd..1827dff3b 100644 --- a/cordova-lib/spec-cordova/metadata/windows8_parser.spec.js +++ b/cordova-lib/spec-cordova/metadata/windows8_parser.spec.js @@ -18,7 +18,7 @@ */ var platforms = require('../../src/cordova/platforms'), - util = require('../../src/cordova/util'), + util = require('../../src/cordova/project/util'), path = require('path'), shell = require('shelljs'), child_process = require('child_process'), diff --git a/cordova-lib/spec-cordova/metadata/wp8_parser.spec.js b/cordova-lib/spec-cordova/metadata/wp8_parser.spec.js index bf05411f2..da332ed1a 100644 --- a/cordova-lib/spec-cordova/metadata/wp8_parser.spec.js +++ b/cordova-lib/spec-cordova/metadata/wp8_parser.spec.js @@ -18,7 +18,7 @@ */ var platforms = require('../../src/cordova/platforms'), - util = require('../../src/cordova/util'), + util = require('../../src/cordova/project/util'), path = require('path'), shell = require('shelljs'), fs = require('fs'), diff --git a/cordova-lib/spec-cordova/serve.spec.js b/cordova-lib/spec-cordova/serve.spec.js index 2ea37c237..b6501b6d2 100644 --- a/cordova-lib/spec-cordova/serve.spec.js +++ b/cordova-lib/spec-cordova/serve.spec.js @@ -22,7 +22,7 @@ var cordova = require('../src/cordova/cordova'), shell = require('shelljs'), fs = require('fs'), Q = require('q'), - util = require('../src/cordova/util'), + util = require('../src/cordova/project/util'), hooker = require('../src/cordova/hooker'), tempDir, http = require('http'), diff --git a/cordova-lib/src/cordova/build/build.js b/cordova-lib/src/cordova/build/build.js index 3843423db..d40f34bdb 100644 --- a/cordova-lib/src/cordova/build/build.js +++ b/cordova-lib/src/cordova/build/build.js @@ -21,7 +21,7 @@ indent:4, unused:vars, latedef:nofunc */ -var cordova_util = require('../util'), +var cordova_util = require('../project/util'), hooker = require('../hooker'); // Returns a promise. diff --git a/cordova-lib/src/cordova/build/compile.js b/cordova-lib/src/cordova/build/compile.js index 39fe270ce..97323bff4 100644 --- a/cordova-lib/src/cordova/build/compile.js +++ b/cordova-lib/src/cordova/build/compile.js @@ -22,7 +22,7 @@ */ var path = require('path'), - cordova_util = require('../util'), + cordova_util = require('../project/util'), hooker = require('../hooker'), superspawn = require('../superspawn'); diff --git a/cordova-lib/src/cordova/build/prepare.js b/cordova-lib/src/cordova/build/prepare.js index 868c0dec6..fea582b54 100644 --- a/cordova-lib/src/cordova/build/prepare.js +++ b/cordova-lib/src/cordova/build/prepare.js @@ -21,7 +21,7 @@ indent:4, unused:vars, latedef:nofunc */ -var cordova_util = require('../util'), +var cordova_util = require('../project/util'), ConfigParser = require('../../configparser/ConfigParser'), path = require('path'), platforms = require('../platforms'), diff --git a/cordova-lib/src/cordova/cordova.js b/cordova-lib/src/cordova/cordova.js index 57867a3ee..fbbb004f1 100644 --- a/cordova-lib/src/cordova/cordova.js +++ b/cordova-lib/src/cordova/cordova.js @@ -22,7 +22,7 @@ */ var cordova_events = require('../events'); -var cordova_util = require('./util'); +var cordova_util = require('./project/util'); var off = function() { cordova_events.removeListener.apply(cordova_events, arguments); diff --git a/cordova-lib/src/cordova/hooker.js b/cordova-lib/src/cordova/hooker.js index 1e6fbe4bf..df74cbbc9 100644 --- a/cordova-lib/src/cordova/hooker.js +++ b/cordova-lib/src/cordova/hooker.js @@ -21,7 +21,7 @@ indent:4, unused:vars, latedef:nofunc */ -var util = require('./util'), +var util = require('./project/util'), fs = require('fs'), os = require('os'), events= require('../events'), diff --git a/cordova-lib/src/cordova/info.js b/cordova-lib/src/cordova/info.js index 8736a1c75..dab834331 100644 --- a/cordova-lib/src/cordova/info.js +++ b/cordova-lib/src/cordova/info.js @@ -26,7 +26,7 @@ A utility funciton to help output the information needed when submitting a help request. Outputs to a file */ -var cordova_util = require('./util'), +var cordova_util = require('./project/util'), superspawn = require('./superspawn'), package = require('../../package'), path = require('path'), diff --git a/cordova-lib/src/cordova/lazy_load.js b/cordova-lib/src/cordova/lazy_load.js index 8f181b714..79f17a15d 100644 --- a/cordova-lib/src/cordova/lazy_load.js +++ b/cordova-lib/src/cordova/lazy_load.js @@ -39,7 +39,7 @@ var path = require('path'), URL = require('url'), Q = require('q'), npm = require('npm'), - util = require('./util'), + util = require('./project/util'), stubplatform = { url : undefined, version: undefined, diff --git a/cordova-lib/src/cordova/metadata/amazon_fireos_parser.js b/cordova-lib/src/cordova/metadata/amazon_fireos_parser.js index 3b3960547..1000a3de2 100644 --- a/cordova-lib/src/cordova/metadata/amazon_fireos_parser.js +++ b/cordova-lib/src/cordova/metadata/amazon_fireos_parser.js @@ -24,7 +24,7 @@ var fs = require('fs'), path = require('path'), xml = require('../../util/xml-helpers'), - util = require('../util'), + util = require('../project/util'), events = require('../../events'), shell = require('shelljs'), Q = require('q'), diff --git a/cordova-lib/src/cordova/metadata/android_parser.js b/cordova-lib/src/cordova/metadata/android_parser.js index 7ad2a3390..cdbc0603a 100644 --- a/cordova-lib/src/cordova/metadata/android_parser.js +++ b/cordova-lib/src/cordova/metadata/android_parser.js @@ -24,7 +24,7 @@ var fs = require('fs'), path = require('path'), xml = require('../../util/xml-helpers'), - util = require('../util'), + util = require('../project/util'), events = require('../../events'), shell = require('shelljs'), Q = require('q'), diff --git a/cordova-lib/src/cordova/metadata/blackberry10_parser.js b/cordova-lib/src/cordova/metadata/blackberry10_parser.js index 9535a4b45..9479ce28c 100644 --- a/cordova-lib/src/cordova/metadata/blackberry10_parser.js +++ b/cordova-lib/src/cordova/metadata/blackberry10_parser.js @@ -24,7 +24,7 @@ var fs = require('fs'), path = require('path'), shell = require('shelljs'), - util = require('../util'), + util = require('../project/util'), Q = require('q'), child_process = require('child_process'), ConfigParser = require('../../configparser/ConfigParser'), diff --git a/cordova-lib/src/cordova/metadata/firefoxos_parser.js b/cordova-lib/src/cordova/metadata/firefoxos_parser.js index 0ec5b6d5c..60b03ba75 100644 --- a/cordova-lib/src/cordova/metadata/firefoxos_parser.js +++ b/cordova-lib/src/cordova/metadata/firefoxos_parser.js @@ -26,7 +26,7 @@ var fs = require('fs'), path = require('path'), shell = require('shelljs'), events = require('../../events'), - util = require('../util'), + util = require('../project/util'), Q = require('q'), ConfigParser = require('../../configparser/ConfigParser'); diff --git a/cordova-lib/src/cordova/metadata/ios_parser.js b/cordova-lib/src/cordova/metadata/ios_parser.js index fa136dca6..d691b25fa 100644 --- a/cordova-lib/src/cordova/metadata/ios_parser.js +++ b/cordova-lib/src/cordova/metadata/ios_parser.js @@ -26,7 +26,7 @@ var fs = require('fs'), unorm = require('unorm'), path = require('path'), xcode = require('xcode'), - util = require('../util'), + util = require('../project/util'), events = require('../../events'), shell = require('shelljs'), plist = require('plist-with-patches'), diff --git a/cordova-lib/src/cordova/metadata/ubuntu_parser.js b/cordova-lib/src/cordova/metadata/ubuntu_parser.js index 634a575ab..a3c0179d9 100644 --- a/cordova-lib/src/cordova/metadata/ubuntu_parser.js +++ b/cordova-lib/src/cordova/metadata/ubuntu_parser.js @@ -24,7 +24,7 @@ var fs = require('fs'), path = require('path'), - util = require('../util'), + util = require('../project/util'), shell = require('shelljs'), Q = require('q'), os = require('os'), diff --git a/cordova-lib/src/cordova/metadata/windows_parser.js b/cordova-lib/src/cordova/metadata/windows_parser.js index eaeacbb86..f16136cf2 100644 --- a/cordova-lib/src/cordova/metadata/windows_parser.js +++ b/cordova-lib/src/cordova/metadata/windows_parser.js @@ -23,7 +23,7 @@ var fs = require('fs'), path = require('path'), - util = require('../util'), + util = require('../project/util'), events = require('../../events'), shell = require('shelljs'), Q = require('q'), diff --git a/cordova-lib/src/cordova/metadata/wp8_parser.js b/cordova-lib/src/cordova/metadata/wp8_parser.js index 0d458ee70..c5a1f697c 100644 --- a/cordova-lib/src/cordova/metadata/wp8_parser.js +++ b/cordova-lib/src/cordova/metadata/wp8_parser.js @@ -23,7 +23,7 @@ var fs = require('fs'), path = require('path'), - util = require('../util'), + util = require('../project/util'), events = require('../../events'), shell = require('shelljs'), Q = require('q'), diff --git a/cordova-lib/src/cordova/platform.js b/cordova-lib/src/cordova/platform.js index dca8ed405..f285feb13 100644 --- a/cordova-lib/src/cordova/platform.js +++ b/cordova-lib/src/cordova/platform.js @@ -25,7 +25,7 @@ var config = require('./config'), cordova = require('./cordova'), - cordova_util = require('./util'), + cordova_util = require('./project/util'), ConfigParser = require('../configparser/ConfigParser'), fs = require('fs'), os = require('os'), diff --git a/cordova-lib/src/cordova/platforms.js b/cordova-lib/src/cordova/platforms.js index 1400de258..10a7a4620 100644 --- a/cordova-lib/src/cordova/platforms.js +++ b/cordova-lib/src/cordova/platforms.js @@ -83,7 +83,7 @@ module.exports = { } }; -var addModuleProperty = require('./util').addModuleProperty; +var addModuleProperty = require('./project/util').addModuleProperty; Object.keys(module.exports).forEach(function(key) { var obj = module.exports[key]; if (obj.parser) { diff --git a/cordova-lib/src/cordova/plugin.js b/cordova-lib/src/cordova/plugin.js index 8a792b90d..2c53db974 100644 --- a/cordova-lib/src/cordova/plugin.js +++ b/cordova-lib/src/cordova/plugin.js @@ -21,7 +21,7 @@ indent:4, unused:vars, latedef:nofunc */ -var cordova_util = require('./util'), +var cordova_util = require('./project/util'), path = require('path'), semver = require('semver'), hooker = require('./hooker'), diff --git a/cordova-lib/src/cordova/project/create.js b/cordova-lib/src/cordova/project/create.js index 2d81c6bab..1e489c5bb 100644 --- a/cordova-lib/src/cordova/project/create.js +++ b/cordova-lib/src/cordova/project/create.js @@ -30,7 +30,7 @@ var path = require('path'), Q = require('q'), CordovaError = require('../../CordovaError'), ConfigParser = require('../../configparser/ConfigParser'), - cordova_util = require('../util'); + cordova_util = require('./util'); var DEFAULT_NAME = 'HelloCordova', DEFAULT_ID = 'io.cordova.hellocordova'; diff --git a/cordova-lib/src/cordova/project/emulate.js b/cordova-lib/src/cordova/project/emulate.js index 78983f172..608b7f269 100644 --- a/cordova-lib/src/cordova/project/emulate.js +++ b/cordova-lib/src/cordova/project/emulate.js @@ -21,7 +21,7 @@ indent:4, unused:vars, latedef:nofunc */ -var cordova_util = require('../util'), +var cordova_util = require('./util'), path = require('path'), hooker = require('../hooker'), superspawn = require('../superspawn'), diff --git a/cordova-lib/src/cordova/project/restore.js b/cordova-lib/src/cordova/project/restore.js index 7024ec2f5..0760b9bf8 100644 --- a/cordova-lib/src/cordova/project/restore.js +++ b/cordova-lib/src/cordova/project/restore.js @@ -21,7 +21,7 @@ indent:4, unused:vars, latedef:nofunc */ -var cordova_util = require('../util'), +var cordova_util = require('./util'), ConfigParser = require('../../configparser/ConfigParser'), path = require('path'), Q = require('q'), diff --git a/cordova-lib/src/cordova/project/run.js b/cordova-lib/src/cordova/project/run.js index e0741574c..990c7464b 100644 --- a/cordova-lib/src/cordova/project/run.js +++ b/cordova-lib/src/cordova/project/run.js @@ -21,7 +21,7 @@ indent:4, unused:vars, latedef:nofunc */ -var cordova_util = require('../util'), +var cordova_util = require('./util'), path = require('path'), hooker = require('../hooker'), superspawn = require('../superspawn'), diff --git a/cordova-lib/src/cordova/project/save.js b/cordova-lib/src/cordova/project/save.js index b99a61438..0c497e751 100644 --- a/cordova-lib/src/cordova/project/save.js +++ b/cordova-lib/src/cordova/project/save.js @@ -22,7 +22,7 @@ */ -var cordova_util = require('../util'), +var cordova_util = require('./util'), ConfigParser = require('../../configparser/ConfigParser'), path = require('path'), xml = require('../../util/xml-helpers'), diff --git a/cordova-lib/src/cordova/util.js b/cordova-lib/src/cordova/project/util.js similarity index 98% rename from cordova-lib/src/cordova/util.js rename to cordova-lib/src/cordova/project/util.js index 86dff6d88..5f7c30b2a 100644 --- a/cordova-lib/src/cordova/util.js +++ b/cordova-lib/src/cordova/project/util.js @@ -23,7 +23,7 @@ var fs = require('fs'), path = require('path'), - CordovaError = require('../CordovaError'), + CordovaError = require('../../CordovaError'), shell = require('shelljs'); // Global configuration paths @@ -123,7 +123,7 @@ function deleteSvnFolders(dir) { } function listPlatforms(project_dir) { - var core_platforms = require('./platforms'); + var core_platforms = require('../platforms'); var platforms_dir = path.join(project_dir, 'platforms'); if ( !fs.existsSync(platforms_dir)) { return []; diff --git a/cordova-lib/src/cordova/serve.js b/cordova-lib/src/cordova/serve.js index 4d65421b7..6b18b6040 100644 --- a/cordova-lib/src/cordova/serve.js +++ b/cordova-lib/src/cordova/serve.js @@ -21,7 +21,7 @@ indent:4, unused:vars, latedef:nofunc */ -var cordova_util = require('./util'), +var cordova_util = require('./project/util'), crypto = require('crypto'), path = require('path'), shell = require('shelljs'), From 94e0cf97ba5e2f59b1792e85467727388c0cd240 Mon Sep 17 00:00:00 2001 From: Suraj Pindoria Date: Tue, 15 Jul 2014 15:31:37 -0700 Subject: [PATCH 12/16] Created Cordova "server" submodule --- cordova-lib/package.json | 2 +- cordova-lib/spec-cordova-build/compile.spec.js | 2 +- cordova-lib/spec-cordova-project/emulate.spec.js | 2 +- cordova-lib/spec-cordova-project/run.spec.js | 2 +- .../serve.spec.js | 0 cordova-lib/spec-cordova/platform.spec.js | 2 +- cordova-lib/src/cordova/build/compile.js | 2 +- cordova-lib/src/cordova/cordova.js | 2 +- cordova-lib/src/cordova/hooker.js | 2 +- cordova-lib/src/cordova/info.js | 2 +- cordova-lib/src/cordova/platform.js | 2 +- cordova-lib/src/cordova/project/emulate.js | 2 +- cordova-lib/src/cordova/project/run.js | 2 +- cordova-lib/src/cordova/{ => server}/serve.js | 10 +++++----- cordova-lib/src/cordova/{ => server}/superspawn.js | 2 +- 15 files changed, 18 insertions(+), 18 deletions(-) rename cordova-lib/{spec-cordova => spec-cordova-server}/serve.spec.js (100%) rename cordova-lib/src/cordova/{ => server}/serve.js (97%) rename cordova-lib/src/cordova/{ => server}/superspawn.js (99%) diff --git a/cordova-lib/package.json b/cordova-lib/package.json index 9df6a842f..808ad397f 100644 --- a/cordova-lib/package.json +++ b/cordova-lib/package.json @@ -46,7 +46,7 @@ "scripts": { "test": "npm run jasmine && npm run jshint", "jshint": "node node_modules/jshint/bin/jshint src", - "jasmine": "jasmine-node --captureExceptions --color spec-plugman spec-cordova" + "jasmine": "jasmine-node --captureExceptions --color spec-plugman* spec-cordova*" }, "contributors": [ { diff --git a/cordova-lib/spec-cordova-build/compile.spec.js b/cordova-lib/spec-cordova-build/compile.spec.js index da748d5ab..5c37132e2 100644 --- a/cordova-lib/spec-cordova-build/compile.spec.js +++ b/cordova-lib/spec-cordova-build/compile.spec.js @@ -21,7 +21,7 @@ var cordova = require('../src/cordova/cordova'), path = require('path'), fs = require('fs'), hooker = require('../src/cordova/hooker'), - superspawn = require('../src/cordova/superspawn'), + superspawn = require('../src/cordova/server/superspawn'), util = require('../src/cordova/project/util'), Q = require('q'), os = require('os'); diff --git a/cordova-lib/spec-cordova-project/emulate.spec.js b/cordova-lib/spec-cordova-project/emulate.spec.js index a95e4927c..55824ba93 100644 --- a/cordova-lib/spec-cordova-project/emulate.spec.js +++ b/cordova-lib/spec-cordova-project/emulate.spec.js @@ -18,7 +18,7 @@ */ var cordova = require('../src/cordova/cordova'), platforms = require('../src/cordova/platforms'), - superspawn = require('../src/cordova/superspawn'), + superspawn = require('../src/cordova/server/superspawn'), path = require('path'), fs = require('fs'), hooker = require('../src/cordova/hooker'), diff --git a/cordova-lib/spec-cordova-project/run.spec.js b/cordova-lib/spec-cordova-project/run.spec.js index 445699d3c..991e3678a 100644 --- a/cordova-lib/spec-cordova-project/run.spec.js +++ b/cordova-lib/spec-cordova-project/run.spec.js @@ -18,7 +18,7 @@ */ var cordova = require('../src/cordova/cordova'), platforms = require('../src/cordova/platforms'), - superspawn = require('../src/cordova/superspawn'), + superspawn = require('../src/cordova/server/superspawn'), path = require('path'), fs = require('fs'), hooker = require('../src/cordova/hooker'), diff --git a/cordova-lib/spec-cordova/serve.spec.js b/cordova-lib/spec-cordova-server/serve.spec.js similarity index 100% rename from cordova-lib/spec-cordova/serve.spec.js rename to cordova-lib/spec-cordova-server/serve.spec.js diff --git a/cordova-lib/spec-cordova/platform.spec.js b/cordova-lib/spec-cordova/platform.spec.js index fb59ef20c..b01e1a4a8 100644 --- a/cordova-lib/spec-cordova/platform.spec.js +++ b/cordova-lib/spec-cordova/platform.spec.js @@ -22,7 +22,7 @@ var helpers = require('./helpers'), fs = require('fs'), shell = require('shelljs'), platforms = require('../src/cordova/platforms'), - superspawn = require('../src/cordova/superspawn'), + superspawn = require('../src/cordova/server/superspawn'), config = require('../src/cordova/config'), Q = require('q'), events = require('../src/events'), diff --git a/cordova-lib/src/cordova/build/compile.js b/cordova-lib/src/cordova/build/compile.js index 97323bff4..3b14e0635 100644 --- a/cordova-lib/src/cordova/build/compile.js +++ b/cordova-lib/src/cordova/build/compile.js @@ -24,7 +24,7 @@ var path = require('path'), cordova_util = require('../project/util'), hooker = require('../hooker'), - superspawn = require('../superspawn'); + superspawn = require('../server/superspawn'); // Returns a promise. module.exports = function compile(options) { diff --git a/cordova-lib/src/cordova/cordova.js b/cordova-lib/src/cordova/cordova.js index fbbb004f1..db689df79 100644 --- a/cordova-lib/src/cordova/cordova.js +++ b/cordova-lib/src/cordova/cordova.js @@ -65,7 +65,7 @@ addModuleProperty(module, 'create', './project/create', true); addModuleProperty(module, 'emulate', './project/emulate', true); addModuleProperty(module, 'plugin', './plugin', true); addModuleProperty(module, 'plugins', './plugin', true); -addModuleProperty(module, 'serve', './serve'); +addModuleProperty(module, 'serve', './server/serve'); addModuleProperty(module, 'platform', './platform', true); addModuleProperty(module, 'platforms', './platform', true); addModuleProperty(module, 'compile', './build/compile', true); diff --git a/cordova-lib/src/cordova/hooker.js b/cordova-lib/src/cordova/hooker.js index df74cbbc9..1f80e635c 100644 --- a/cordova-lib/src/cordova/hooker.js +++ b/cordova-lib/src/cordova/hooker.js @@ -25,7 +25,7 @@ var util = require('./project/util'), fs = require('fs'), os = require('os'), events= require('../events'), - superspawn = require('./superspawn'), + superspawn = require('./server/superspawn'), CordovaError = require('../CordovaError'), Q = require('q'), path = require('path'); diff --git a/cordova-lib/src/cordova/info.js b/cordova-lib/src/cordova/info.js index dab834331..13a8a2cae 100644 --- a/cordova-lib/src/cordova/info.js +++ b/cordova-lib/src/cordova/info.js @@ -27,7 +27,7 @@ when submitting a help request. Outputs to a file */ var cordova_util = require('./project/util'), - superspawn = require('./superspawn'), + superspawn = require('./server/superspawn'), package = require('../../package'), path = require('path'), fs = require('fs'), diff --git a/cordova-lib/src/cordova/platform.js b/cordova-lib/src/cordova/platform.js index f285feb13..2f5ddfd26 100644 --- a/cordova-lib/src/cordova/platform.js +++ b/cordova-lib/src/cordova/platform.js @@ -37,7 +37,7 @@ var config = require('./config'), Q = require('q'), platforms = require('./platforms'), promiseutil = require('../util/promise-util'), - superspawn = require('./superspawn'), + superspawn = require('./server/superspawn'), semver = require('semver'), shell = require('shelljs'); diff --git a/cordova-lib/src/cordova/project/emulate.js b/cordova-lib/src/cordova/project/emulate.js index 608b7f269..51fbbfe22 100644 --- a/cordova-lib/src/cordova/project/emulate.js +++ b/cordova-lib/src/cordova/project/emulate.js @@ -24,7 +24,7 @@ var cordova_util = require('./util'), path = require('path'), hooker = require('../hooker'), - superspawn = require('../superspawn'), + superspawn = require('../server/superspawn'), Q = require('q'); // Returns a promise. diff --git a/cordova-lib/src/cordova/project/run.js b/cordova-lib/src/cordova/project/run.js index 990c7464b..c04383caa 100644 --- a/cordova-lib/src/cordova/project/run.js +++ b/cordova-lib/src/cordova/project/run.js @@ -24,7 +24,7 @@ var cordova_util = require('./util'), path = require('path'), hooker = require('../hooker'), - superspawn = require('../superspawn'), + superspawn = require('../server/superspawn'), Q = require('q'); // Returns a promise. diff --git a/cordova-lib/src/cordova/serve.js b/cordova-lib/src/cordova/server/serve.js similarity index 97% rename from cordova-lib/src/cordova/serve.js rename to cordova-lib/src/cordova/server/serve.js index 6b18b6040..a6512001e 100644 --- a/cordova-lib/src/cordova/serve.js +++ b/cordova-lib/src/cordova/server/serve.js @@ -21,13 +21,13 @@ indent:4, unused:vars, latedef:nofunc */ -var cordova_util = require('./project/util'), +var cordova_util = require('../project/util'), crypto = require('crypto'), path = require('path'), shell = require('shelljs'), - platforms = require('./platforms'), - ConfigParser = require('../configparser/ConfigParser'), - hooker = require('./hooker'), + platforms = require('../platforms'), + ConfigParser = require('../../configparser/ConfigParser'), + hooker = require('../hooker'), Q = require('q'), fs = require('fs'), http = require('http'), @@ -231,7 +231,7 @@ module.exports = function server(port) { hooks.fire('before_serve') .then(function() { // Run a prepare first! - return require('./cordova').raw.prepare([]); + return require('../cordova').raw.prepare([]); }).then(function() { var server = launchServer(projectRoot, port); hooks.fire('after_serve').then(function () { diff --git a/cordova-lib/src/cordova/superspawn.js b/cordova-lib/src/cordova/server/superspawn.js similarity index 99% rename from cordova-lib/src/cordova/superspawn.js rename to cordova-lib/src/cordova/server/superspawn.js index b35e3119c..59966c806 100644 --- a/cordova-lib/src/cordova/superspawn.js +++ b/cordova-lib/src/cordova/server/superspawn.js @@ -27,7 +27,7 @@ var path = require('path'); var _ = require('underscore'); var Q = require('q'); var shell = require('shelljs'); -var events = require('../events'); +var events = require('../../events'); var iswin32 = process.platform == 'win32'; // On Windows, spawn() for batch files requires absolute path & having the extension. From 02b4f0ca316b9f1fce6f97e898d321273eb99113 Mon Sep 17 00:00:00 2001 From: Suraj Pindoria Date: Tue, 15 Jul 2014 15:56:27 -0700 Subject: [PATCH 13/16] Create Cordova "plugins" submodule --- .../fixtures/base/.cordova/config.json | 22 + .../fixtures/base/merges/.svn | 0 .../fixtures/base/plugins/.svn | 0 .../fixtures/base/www/config.xml | 14 + .../fixtures/base/www/css/index.css | 115 ++ .../fixtures/base/www/img/logo.png | Bin 0 -> 21814 bytes .../fixtures/base/www/index.html | 43 + .../fixtures/base/www/js/index.js | 49 + .../fixtures/base/www/spec.html | 68 + .../fixtures/hooks_bat/fail/fail.bat | 2 + .../fixtures/hooks_bat/test/.dotted.bat | 2 + .../fixtures/hooks_bat/test/07.bat | 3 + .../fixtures/hooks_bat/test/1.bat | 5 + .../fixtures/hooks_sh/fail/fail.sh | 1 + .../fixtures/hooks_sh/test/.dotted.sh | 1 + .../fixtures/hooks_sh/test/07.sh | 2 + .../fixtures/hooks_sh/test/1.sh | 4 + .../fixtures/platforms/android-lib/VERSION | 1 + .../framework/assets/www/cordova.js | 1 + .../platforms/android/AndroidManifest.xml | 14 + .../platforms/android/assets/www/config.xml | 14 + .../platforms/android/assets/www/cordova.js | 1712 +++++++++++++++++ .../android/assets/www/cordova_plugins.js | 3 + .../android/assets/www/css/index.css | 115 ++ .../platforms/android/assets/www/img/logo.png | Bin 0 -> 21814 bytes .../platforms/android/assets/www/index.html | 43 + .../platforms/android/assets/www/js/index.js | 49 + .../platforms/android/assets/www/spec.html | 68 + .../fixtures/platforms/android/build.xml | 92 + .../fixtures/platforms/android/cordova/build | 35 + .../platforms/android/cordova/check_reqs | 27 + .../fixtures/platforms/android/cordova/clean | 34 + .../platforms/android/cordova/defaults.xml | 50 + .../platforms/android/cordova/lib/appinfo.js | 41 + .../platforms/android/cordova/lib/build.js | 89 + .../android/cordova/lib/check_reqs.js | 78 + .../platforms/android/cordova/lib/clean.js | 43 + .../platforms/android/cordova/lib/device.js | 95 + .../platforms/android/cordova/lib/emulator.js | 337 ++++ .../android/cordova/lib/install-device | 38 + .../android/cordova/lib/install-emulator | 38 + .../android/cordova/lib/list-devices | 28 + .../android/cordova/lib/list-emulator-images | 29 + .../cordova/lib/list-started-emulators | 29 + .../platforms/android/cordova/lib/log.js | 43 + .../platforms/android/cordova/lib/run.js | 124 ++ .../android/cordova/lib/start-emulator | 38 + .../fixtures/platforms/android/cordova/log | 33 + .../fixtures/platforms/android/cordova/run | 35 + .../platforms/android/cordova/version | 25 + .../platforms/android/local.properties | 10 + .../platforms/android/proguard-project.txt | 20 + .../platforms/android/project.properties | 14 + .../android/res/drawable-hdpi/icon.png | Bin 0 -> 6080 bytes .../android/res/drawable-ldpi/icon.png | Bin 0 -> 3096 bytes .../android/res/drawable-mdpi/icon.png | Bin 0 -> 4090 bytes .../android/res/drawable-xhdpi/icon.png | Bin 0 -> 7685 bytes .../platforms/android/res/drawable/icon.png | Bin 0 -> 7685 bytes .../platforms/android/res/values/strings.xml | 4 + .../platforms/android/res/xml/config.xml | 18 + .../android/src/org/testing/TestBase.java | 37 + .../fixtures/plugins/ChildBrowser/plugin.xml | 126 ++ .../src/android/ChildBrowser.java | 19 + .../plugins/ChildBrowser/www/childbrowser.js | 19 + .../ChildBrowser/www/childbrowser/image.jpg | 1 + .../ChildBrowser/www/childbrowser_file.html | 1 + .../fixtures/plugins/android/plugin.xml | 14 + .../plugins/android/src/android/Android.java | 0 .../android/src/android/SomethingWithR.java | 6 + .../fixtures/plugins/android/www/android.js | 0 .../fixtures/plugins/fake1/plugin.xml | 10 + .../fixtures/plugins/test/plugin.xml | 14 + .../fixtures/plugins/test/www/test.js | 0 .../projects/android/AndroidManifest.xml | 69 + .../projects/android/assets/www/.gitkeep | 0 .../projects/android/res/xml/config.xml | 54 + .../fixtures/projects/android/src/.gitkeep | 0 .../fixtures/projects/windows/bom_test.xml | 24 + .../fixtures/templates/no_content_config.xml | 19 + cordova-lib/spec-cordova-plugins/helpers.js | 64 + .../plugin.spec.js | 0 .../plugin_parser.spec.js | 2 +- cordova-lib/src/cordova/cordova.js | 4 +- .../src/cordova/{ => plugins}/plugin.js | 20 +- .../cordova/{ => plugins}/plugin_parser.js | 2 +- cordova-lib/src/cordova/project/restore.js | 2 +- 86 files changed, 4290 insertions(+), 15 deletions(-) create mode 100644 cordova-lib/spec-cordova-plugins/fixtures/base/.cordova/config.json create mode 100644 cordova-lib/spec-cordova-plugins/fixtures/base/merges/.svn create mode 100644 cordova-lib/spec-cordova-plugins/fixtures/base/plugins/.svn create mode 100644 cordova-lib/spec-cordova-plugins/fixtures/base/www/config.xml create mode 100644 cordova-lib/spec-cordova-plugins/fixtures/base/www/css/index.css create mode 100644 cordova-lib/spec-cordova-plugins/fixtures/base/www/img/logo.png create mode 100644 cordova-lib/spec-cordova-plugins/fixtures/base/www/index.html create mode 100644 cordova-lib/spec-cordova-plugins/fixtures/base/www/js/index.js create mode 100644 cordova-lib/spec-cordova-plugins/fixtures/base/www/spec.html create mode 100644 cordova-lib/spec-cordova-plugins/fixtures/hooks_bat/fail/fail.bat create mode 100644 cordova-lib/spec-cordova-plugins/fixtures/hooks_bat/test/.dotted.bat create mode 100644 cordova-lib/spec-cordova-plugins/fixtures/hooks_bat/test/07.bat create mode 100644 cordova-lib/spec-cordova-plugins/fixtures/hooks_bat/test/1.bat create mode 100755 cordova-lib/spec-cordova-plugins/fixtures/hooks_sh/fail/fail.sh create mode 100755 cordova-lib/spec-cordova-plugins/fixtures/hooks_sh/test/.dotted.sh create mode 100755 cordova-lib/spec-cordova-plugins/fixtures/hooks_sh/test/07.sh create mode 100755 cordova-lib/spec-cordova-plugins/fixtures/hooks_sh/test/1.sh create mode 100644 cordova-lib/spec-cordova-plugins/fixtures/platforms/android-lib/VERSION create mode 100644 cordova-lib/spec-cordova-plugins/fixtures/platforms/android-lib/framework/assets/www/cordova.js create mode 100644 cordova-lib/spec-cordova-plugins/fixtures/platforms/android/AndroidManifest.xml create mode 100644 cordova-lib/spec-cordova-plugins/fixtures/platforms/android/assets/www/config.xml create mode 100644 cordova-lib/spec-cordova-plugins/fixtures/platforms/android/assets/www/cordova.js create mode 100644 cordova-lib/spec-cordova-plugins/fixtures/platforms/android/assets/www/cordova_plugins.js create mode 100644 cordova-lib/spec-cordova-plugins/fixtures/platforms/android/assets/www/css/index.css create mode 100644 cordova-lib/spec-cordova-plugins/fixtures/platforms/android/assets/www/img/logo.png create mode 100644 cordova-lib/spec-cordova-plugins/fixtures/platforms/android/assets/www/index.html create mode 100644 cordova-lib/spec-cordova-plugins/fixtures/platforms/android/assets/www/js/index.js create mode 100644 cordova-lib/spec-cordova-plugins/fixtures/platforms/android/assets/www/spec.html create mode 100644 cordova-lib/spec-cordova-plugins/fixtures/platforms/android/build.xml create mode 100755 cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/build create mode 100755 cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/check_reqs create mode 100755 cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/clean create mode 100644 cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/defaults.xml create mode 100755 cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/lib/appinfo.js create mode 100755 cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/lib/build.js create mode 100755 cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/lib/check_reqs.js create mode 100755 cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/lib/clean.js create mode 100755 cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/lib/device.js create mode 100755 cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/lib/emulator.js create mode 100755 cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/lib/install-device create mode 100755 cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/lib/install-emulator create mode 100755 cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/lib/list-devices create mode 100755 cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/lib/list-emulator-images create mode 100755 cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/lib/list-started-emulators create mode 100755 cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/lib/log.js create mode 100755 cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/lib/run.js create mode 100755 cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/lib/start-emulator create mode 100755 cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/log create mode 100755 cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/run create mode 100755 cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/version create mode 100644 cordova-lib/spec-cordova-plugins/fixtures/platforms/android/local.properties create mode 100644 cordova-lib/spec-cordova-plugins/fixtures/platforms/android/proguard-project.txt create mode 100644 cordova-lib/spec-cordova-plugins/fixtures/platforms/android/project.properties create mode 100644 cordova-lib/spec-cordova-plugins/fixtures/platforms/android/res/drawable-hdpi/icon.png create mode 100644 cordova-lib/spec-cordova-plugins/fixtures/platforms/android/res/drawable-ldpi/icon.png create mode 100644 cordova-lib/spec-cordova-plugins/fixtures/platforms/android/res/drawable-mdpi/icon.png create mode 100644 cordova-lib/spec-cordova-plugins/fixtures/platforms/android/res/drawable-xhdpi/icon.png create mode 100644 cordova-lib/spec-cordova-plugins/fixtures/platforms/android/res/drawable/icon.png create mode 100644 cordova-lib/spec-cordova-plugins/fixtures/platforms/android/res/values/strings.xml create mode 100644 cordova-lib/spec-cordova-plugins/fixtures/platforms/android/res/xml/config.xml create mode 100644 cordova-lib/spec-cordova-plugins/fixtures/platforms/android/src/org/testing/TestBase.java create mode 100644 cordova-lib/spec-cordova-plugins/fixtures/plugins/ChildBrowser/plugin.xml create mode 100644 cordova-lib/spec-cordova-plugins/fixtures/plugins/ChildBrowser/src/android/ChildBrowser.java create mode 100644 cordova-lib/spec-cordova-plugins/fixtures/plugins/ChildBrowser/www/childbrowser.js create mode 100644 cordova-lib/spec-cordova-plugins/fixtures/plugins/ChildBrowser/www/childbrowser/image.jpg create mode 100644 cordova-lib/spec-cordova-plugins/fixtures/plugins/ChildBrowser/www/childbrowser_file.html create mode 100644 cordova-lib/spec-cordova-plugins/fixtures/plugins/android/plugin.xml create mode 100644 cordova-lib/spec-cordova-plugins/fixtures/plugins/android/src/android/Android.java create mode 100644 cordova-lib/spec-cordova-plugins/fixtures/plugins/android/src/android/SomethingWithR.java create mode 100644 cordova-lib/spec-cordova-plugins/fixtures/plugins/android/www/android.js create mode 100644 cordova-lib/spec-cordova-plugins/fixtures/plugins/fake1/plugin.xml create mode 100644 cordova-lib/spec-cordova-plugins/fixtures/plugins/test/plugin.xml create mode 100644 cordova-lib/spec-cordova-plugins/fixtures/plugins/test/www/test.js create mode 100644 cordova-lib/spec-cordova-plugins/fixtures/projects/android/AndroidManifest.xml create mode 100644 cordova-lib/spec-cordova-plugins/fixtures/projects/android/assets/www/.gitkeep create mode 100644 cordova-lib/spec-cordova-plugins/fixtures/projects/android/res/xml/config.xml create mode 100644 cordova-lib/spec-cordova-plugins/fixtures/projects/android/src/.gitkeep create mode 100644 cordova-lib/spec-cordova-plugins/fixtures/projects/windows/bom_test.xml create mode 100644 cordova-lib/spec-cordova-plugins/fixtures/templates/no_content_config.xml create mode 100644 cordova-lib/spec-cordova-plugins/helpers.js rename cordova-lib/{spec-cordova => spec-cordova-plugins}/plugin.spec.js (100%) rename cordova-lib/{spec-cordova => spec-cordova-plugins}/plugin_parser.spec.js (96%) rename cordova-lib/src/cordova/{ => plugins}/plugin.js (95%) rename cordova-lib/src/cordova/{ => plugins}/plugin_parser.js (96%) diff --git a/cordova-lib/spec-cordova-plugins/fixtures/base/.cordova/config.json b/cordova-lib/spec-cordova-plugins/fixtures/base/.cordova/config.json new file mode 100644 index 000000000..4f52ca7f0 --- /dev/null +++ b/cordova-lib/spec-cordova-plugins/fixtures/base/.cordova/config.json @@ -0,0 +1,22 @@ +{ + "id": "org.testing", + "name":"TestBase", + "lib": { + "android": { + "url": "/some/junk/path", + "version": "dev", + "id": "cordova-android-dev" + }, + "ios": { + "url": "/some/junk/path", + "version": "dev", + "id": "cordova-ios-dev" + }, + "wp8": { + "url": "/some/junk/path", + "version": "dev", + "id": "cordova-wp8-dev" + } + } +} + diff --git a/cordova-lib/spec-cordova-plugins/fixtures/base/merges/.svn b/cordova-lib/spec-cordova-plugins/fixtures/base/merges/.svn new file mode 100644 index 000000000..e69de29bb diff --git a/cordova-lib/spec-cordova-plugins/fixtures/base/plugins/.svn b/cordova-lib/spec-cordova-plugins/fixtures/base/plugins/.svn new file mode 100644 index 000000000..e69de29bb diff --git a/cordova-lib/spec-cordova-plugins/fixtures/base/www/config.xml b/cordova-lib/spec-cordova-plugins/fixtures/base/www/config.xml new file mode 100644 index 000000000..9e7b9e046 --- /dev/null +++ b/cordova-lib/spec-cordova-plugins/fixtures/base/www/config.xml @@ -0,0 +1,14 @@ + + + TestBase + + A sample Apache Cordova application that responds to the deviceready event. + + + Apache Cordova Team + + + + + + diff --git a/cordova-lib/spec-cordova-plugins/fixtures/base/www/css/index.css b/cordova-lib/spec-cordova-plugins/fixtures/base/www/css/index.css new file mode 100644 index 000000000..51daa797c --- /dev/null +++ b/cordova-lib/spec-cordova-plugins/fixtures/base/www/css/index.css @@ -0,0 +1,115 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +* { + -webkit-tap-highlight-color: rgba(0,0,0,0); /* make transparent link selection, adjust last value opacity 0 to 1.0 */ +} + +body { + -webkit-touch-callout: none; /* prevent callout to copy image, etc when tap to hold */ + -webkit-text-size-adjust: none; /* prevent webkit from resizing text to fit */ + -webkit-user-select: none; /* prevent copy paste, to allow, change 'none' to 'text' */ + background-color:#E4E4E4; + background-image:linear-gradient(top, #A7A7A7 0%, #E4E4E4 51%); + background-image:-webkit-linear-gradient(top, #A7A7A7 0%, #E4E4E4 51%); + background-image:-ms-linear-gradient(top, #A7A7A7 0%, #E4E4E4 51%); + background-image:-webkit-gradient( + linear, + left top, + left bottom, + color-stop(0, #A7A7A7), + color-stop(0.51, #E4E4E4) + ); + background-attachment:fixed; + font-family:'HelveticaNeue-Light', 'HelveticaNeue', Helvetica, Arial, sans-serif; + font-size:12px; + height:100%; + margin:0px; + padding:0px; + text-transform:uppercase; + width:100%; +} + +/* Portrait layout (default) */ +.app { + background:url(../img/logo.png) no-repeat center top; /* 170px x 200px */ + position:absolute; /* position in the center of the screen */ + left:50%; + top:50%; + height:50px; /* text area height */ + width:225px; /* text area width */ + text-align:center; + padding:180px 0px 0px 0px; /* image height is 200px (bottom 20px are overlapped with text) */ + margin:-115px 0px 0px -112px; /* offset vertical: half of image height and text area height */ + /* offset horizontal: half of text area width */ +} + +/* Landscape layout (with min-width) */ +@media screen and (min-aspect-ratio: 1/1) and (min-width:400px) { + .app { + background-position:left center; + padding:75px 0px 75px 170px; /* padding-top + padding-bottom + text area = image height */ + margin:-90px 0px 0px -198px; /* offset vertical: half of image height */ + /* offset horizontal: half of image width and text area width */ + } +} + +h1 { + font-size:24px; + font-weight:normal; + margin:0px; + overflow:visible; + padding:0px; + text-align:center; +} + +.event { + border-radius:4px; + -webkit-border-radius:4px; + color:#FFFFFF; + font-size:12px; + margin:0px 30px; + padding:2px 0px; +} + +.event.listening { + background-color:#333333; + display:block; +} + +.event.received { + background-color:#4B946A; + display:none; +} + +@keyframes fade { + from { opacity: 1.0; } + 50% { opacity: 0.4; } + to { opacity: 1.0; } +} + +@-webkit-keyframes fade { + from { opacity: 1.0; } + 50% { opacity: 0.4; } + to { opacity: 1.0; } +} + +.blink { + animation:fade 3000ms infinite; + -webkit-animation:fade 3000ms infinite; +} diff --git a/cordova-lib/spec-cordova-plugins/fixtures/base/www/img/logo.png b/cordova-lib/spec-cordova-plugins/fixtures/base/www/img/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..9519e7dd78adb6e44548c08510a7bf02442a7697 GIT binary patch literal 21814 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 + + + + + + + + + Hello World + + +
+

Apache Cordova

+ +
+ + + + + diff --git a/cordova-lib/spec-cordova-plugins/fixtures/base/www/js/index.js b/cordova-lib/spec-cordova-plugins/fixtures/base/www/js/index.js new file mode 100644 index 000000000..31d9064eb --- /dev/null +++ b/cordova-lib/spec-cordova-plugins/fixtures/base/www/js/index.js @@ -0,0 +1,49 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +var app = { + // Application Constructor + initialize: function() { + this.bindEvents(); + }, + // Bind Event Listeners + // + // Bind any events that are required on startup. Common events are: + // 'load', 'deviceready', 'offline', and 'online'. + bindEvents: function() { + document.addEventListener('deviceready', this.onDeviceReady, false); + }, + // deviceready Event Handler + // + // The scope of 'this' is the event. In order to call the 'receivedEvent' + // function, we must explicity call 'app.receivedEvent(...);' + onDeviceReady: function() { + app.receivedEvent('deviceready'); + }, + // Update DOM on a Received Event + receivedEvent: function(id) { + var parentElement = document.getElementById(id); + var listeningElement = parentElement.querySelector('.listening'); + var receivedElement = parentElement.querySelector('.received'); + + listeningElement.setAttribute('style', 'display:none;'); + receivedElement.setAttribute('style', 'display:block;'); + + console.log('Received Event: ' + id); + } +}; diff --git a/cordova-lib/spec-cordova-plugins/fixtures/base/www/spec.html b/cordova-lib/spec-cordova-plugins/fixtures/base/www/spec.html new file mode 100644 index 000000000..71f00de05 --- /dev/null +++ b/cordova-lib/spec-cordova-plugins/fixtures/base/www/spec.html @@ -0,0 +1,68 @@ + + + + + Jasmine Spec Runner + + + + + + + + + + + + + + + + + + + + diff --git a/cordova-lib/spec-cordova-plugins/fixtures/hooks_bat/fail/fail.bat b/cordova-lib/spec-cordova-plugins/fixtures/hooks_bat/fail/fail.bat new file mode 100644 index 000000000..a89b4c89c --- /dev/null +++ b/cordova-lib/spec-cordova-plugins/fixtures/hooks_bat/fail/fail.bat @@ -0,0 +1,2 @@ +@ECHO OFF +EXIT /B 1 diff --git a/cordova-lib/spec-cordova-plugins/fixtures/hooks_bat/test/.dotted.bat b/cordova-lib/spec-cordova-plugins/fixtures/hooks_bat/test/.dotted.bat new file mode 100644 index 000000000..ada7136e5 --- /dev/null +++ b/cordova-lib/spec-cordova-plugins/fixtures/hooks_bat/test/.dotted.bat @@ -0,0 +1,2 @@ +@ECHO OFF +ECHO "Dotted files in hook dirs should not be called" > dotted_hook_should_not_fire.txt \ No newline at end of file diff --git a/cordova-lib/spec-cordova-plugins/fixtures/hooks_bat/test/07.bat b/cordova-lib/spec-cordova-plugins/fixtures/hooks_bat/test/07.bat new file mode 100644 index 000000000..a88c8c590 --- /dev/null +++ b/cordova-lib/spec-cordova-plugins/fixtures/hooks_bat/test/07.bat @@ -0,0 +1,3 @@ +@ECHO OFF +rem ECHO this is script 0 in %~dp0 +ECHO b >> hooks_order.txt diff --git a/cordova-lib/spec-cordova-plugins/fixtures/hooks_bat/test/1.bat b/cordova-lib/spec-cordova-plugins/fixtures/hooks_bat/test/1.bat new file mode 100644 index 000000000..be004c530 --- /dev/null +++ b/cordova-lib/spec-cordova-plugins/fixtures/hooks_bat/test/1.bat @@ -0,0 +1,5 @@ +@ECHO OFF +rem ECHO this is script 1 in %~dp0 +ECHO a >> hooks_order.txt +ECHO %1 > hooks_params.txt +node -e "console.log(JSON.stringify(process.env, null, 2))" > hooks_env.json diff --git a/cordova-lib/spec-cordova-plugins/fixtures/hooks_sh/fail/fail.sh b/cordova-lib/spec-cordova-plugins/fixtures/hooks_sh/fail/fail.sh new file mode 100755 index 000000000..379a4c986 --- /dev/null +++ b/cordova-lib/spec-cordova-plugins/fixtures/hooks_sh/fail/fail.sh @@ -0,0 +1 @@ +exit 1 diff --git a/cordova-lib/spec-cordova-plugins/fixtures/hooks_sh/test/.dotted.sh b/cordova-lib/spec-cordova-plugins/fixtures/hooks_sh/test/.dotted.sh new file mode 100755 index 000000000..e5fa07f91 --- /dev/null +++ b/cordova-lib/spec-cordova-plugins/fixtures/hooks_sh/test/.dotted.sh @@ -0,0 +1 @@ +echo "Dotted files in hook dirs should not be called" > dotted_hook_should_not_fire.txt diff --git a/cordova-lib/spec-cordova-plugins/fixtures/hooks_sh/test/07.sh b/cordova-lib/spec-cordova-plugins/fixtures/hooks_sh/test/07.sh new file mode 100755 index 000000000..f410ee21f --- /dev/null +++ b/cordova-lib/spec-cordova-plugins/fixtures/hooks_sh/test/07.sh @@ -0,0 +1,2 @@ +#echo "this is script 0 in `pwd`"; +echo b >> hooks_order.txt diff --git a/cordova-lib/spec-cordova-plugins/fixtures/hooks_sh/test/1.sh b/cordova-lib/spec-cordova-plugins/fixtures/hooks_sh/test/1.sh new file mode 100755 index 000000000..892869d7c --- /dev/null +++ b/cordova-lib/spec-cordova-plugins/fixtures/hooks_sh/test/1.sh @@ -0,0 +1,4 @@ +#echo "this is script 1 in `pwd`"; +echo a >> hooks_order.txt +echo $1 > hooks_params.txt +node -e "console.log(JSON.stringify(process.env, null, 2))" > hooks_env.json diff --git a/cordova-lib/spec-cordova-plugins/fixtures/platforms/android-lib/VERSION b/cordova-lib/spec-cordova-plugins/fixtures/platforms/android-lib/VERSION new file mode 100644 index 000000000..15a279981 --- /dev/null +++ b/cordova-lib/spec-cordova-plugins/fixtures/platforms/android-lib/VERSION @@ -0,0 +1 @@ +3.3.0 diff --git a/cordova-lib/spec-cordova-plugins/fixtures/platforms/android-lib/framework/assets/www/cordova.js b/cordova-lib/spec-cordova-plugins/fixtures/platforms/android-lib/framework/assets/www/cordova.js new file mode 100644 index 000000000..91c51fce2 --- /dev/null +++ b/cordova-lib/spec-cordova-plugins/fixtures/platforms/android-lib/framework/assets/www/cordova.js @@ -0,0 +1 @@ +This is a placeholder file. diff --git a/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/AndroidManifest.xml b/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/AndroidManifest.xml new file mode 100644 index 000000000..be3f245f7 --- /dev/null +++ b/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/AndroidManifest.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/assets/www/config.xml b/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/assets/www/config.xml new file mode 100644 index 000000000..9e7b9e046 --- /dev/null +++ b/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/assets/www/config.xml @@ -0,0 +1,14 @@ + + + TestBase + + A sample Apache Cordova application that responds to the deviceready event. + + + Apache Cordova Team + + + + + + diff --git a/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/assets/www/cordova.js b/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/assets/www/cordova.js new file mode 100644 index 000000000..07e3feb46 --- /dev/null +++ b/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/assets/www/cordova.js @@ -0,0 +1,1712 @@ +// Platform: android +// 3.1.0 +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ +;(function() { +var CORDOVA_JS_BUILD_LABEL = '3.1.0'; +// file: lib/scripts/require.js + +var require, + define; + +(function () { + var modules = {}, + // Stack of moduleIds currently being built. + requireStack = [], + // Map of module ID -> index into requireStack of modules currently being built. + inProgressModules = {}, + SEPERATOR = "."; + + + + function build(module) { + var factory = module.factory, + localRequire = function (id) { + var resultantId = id; + //Its a relative path, so lop off the last portion and add the id (minus "./") + if (id.charAt(0) === ".") { + resultantId = module.id.slice(0, module.id.lastIndexOf(SEPERATOR)) + SEPERATOR + id.slice(2); + } + return require(resultantId); + }; + module.exports = {}; + delete module.factory; + factory(localRequire, module.exports, module); + return module.exports; + } + + require = function (id) { + if (!modules[id]) { + throw "module " + id + " not found"; + } else if (id in inProgressModules) { + var cycle = requireStack.slice(inProgressModules[id]).join('->') + '->' + id; + throw "Cycle in require graph: " + cycle; + } + if (modules[id].factory) { + try { + inProgressModules[id] = requireStack.length; + requireStack.push(id); + return build(modules[id]); + } finally { + delete inProgressModules[id]; + requireStack.pop(); + } + } + return modules[id].exports; + }; + + define = function (id, factory) { + if (modules[id]) { + throw "module " + id + " already defined"; + } + + modules[id] = { + id: id, + factory: factory + }; + }; + + define.remove = function (id) { + delete modules[id]; + }; + + define.moduleMap = modules; +})(); + +//Export for use in node +if (typeof module === "object" && typeof require === "function") { + module.exports.require = require; + module.exports.define = define; +} + +// file: lib/cordova.js +define("cordova", function(require, exports, module) { + + +var channel = require('cordova/channel'); +var platform = require('cordova/platform'); + +/** + * Intercept calls to addEventListener + removeEventListener and handle deviceready, + * resume, and pause events. + */ +var m_document_addEventListener = document.addEventListener; +var m_document_removeEventListener = document.removeEventListener; +var m_window_addEventListener = window.addEventListener; +var m_window_removeEventListener = window.removeEventListener; + +/** + * Houses custom event handlers to intercept on document + window event listeners. + */ +var documentEventHandlers = {}, + windowEventHandlers = {}; + +document.addEventListener = function(evt, handler, capture) { + var e = evt.toLowerCase(); + if (typeof documentEventHandlers[e] != 'undefined') { + documentEventHandlers[e].subscribe(handler); + } else { + m_document_addEventListener.call(document, evt, handler, capture); + } +}; + +window.addEventListener = function(evt, handler, capture) { + var e = evt.toLowerCase(); + if (typeof windowEventHandlers[e] != 'undefined') { + windowEventHandlers[e].subscribe(handler); + } else { + m_window_addEventListener.call(window, evt, handler, capture); + } +}; + +document.removeEventListener = function(evt, handler, capture) { + var e = evt.toLowerCase(); + // If unsubscribing from an event that is handled by a plugin + if (typeof documentEventHandlers[e] != "undefined") { + documentEventHandlers[e].unsubscribe(handler); + } else { + m_document_removeEventListener.call(document, evt, handler, capture); + } +}; + +window.removeEventListener = function(evt, handler, capture) { + var e = evt.toLowerCase(); + // If unsubscribing from an event that is handled by a plugin + if (typeof windowEventHandlers[e] != "undefined") { + windowEventHandlers[e].unsubscribe(handler); + } else { + m_window_removeEventListener.call(window, evt, handler, capture); + } +}; + +function createEvent(type, data) { + var event = document.createEvent('Events'); + event.initEvent(type, false, false); + if (data) { + for (var i in data) { + if (data.hasOwnProperty(i)) { + event[i] = data[i]; + } + } + } + return event; +} + + +var cordova = { + define:define, + require:require, + version:CORDOVA_JS_BUILD_LABEL, + platformId:platform.id, + /** + * Methods to add/remove your own addEventListener hijacking on document + window. + */ + addWindowEventHandler:function(event) { + return (windowEventHandlers[event] = channel.create(event)); + }, + addStickyDocumentEventHandler:function(event) { + return (documentEventHandlers[event] = channel.createSticky(event)); + }, + addDocumentEventHandler:function(event) { + return (documentEventHandlers[event] = channel.create(event)); + }, + removeWindowEventHandler:function(event) { + delete windowEventHandlers[event]; + }, + removeDocumentEventHandler:function(event) { + delete documentEventHandlers[event]; + }, + /** + * Retrieve original event handlers that were replaced by Cordova + * + * @return object + */ + getOriginalHandlers: function() { + return {'document': {'addEventListener': m_document_addEventListener, 'removeEventListener': m_document_removeEventListener}, + 'window': {'addEventListener': m_window_addEventListener, 'removeEventListener': m_window_removeEventListener}}; + }, + /** + * Method to fire event from native code + * bNoDetach is required for events which cause an exception which needs to be caught in native code + */ + fireDocumentEvent: function(type, data, bNoDetach) { + var evt = createEvent(type, data); + if (typeof documentEventHandlers[type] != 'undefined') { + if( bNoDetach ) { + documentEventHandlers[type].fire(evt); + } + else { + setTimeout(function() { + // Fire deviceready on listeners that were registered before cordova.js was loaded. + if (type == 'deviceready') { + document.dispatchEvent(evt); + } + documentEventHandlers[type].fire(evt); + }, 0); + } + } else { + document.dispatchEvent(evt); + } + }, + fireWindowEvent: function(type, data) { + var evt = createEvent(type,data); + if (typeof windowEventHandlers[type] != 'undefined') { + setTimeout(function() { + windowEventHandlers[type].fire(evt); + }, 0); + } else { + window.dispatchEvent(evt); + } + }, + + /** + * Plugin callback mechanism. + */ + // Randomize the starting callbackId to avoid collisions after refreshing or navigating. + // This way, it's very unlikely that any new callback would get the same callbackId as an old callback. + callbackId: Math.floor(Math.random() * 2000000000), + callbacks: {}, + callbackStatus: { + NO_RESULT: 0, + OK: 1, + CLASS_NOT_FOUND_EXCEPTION: 2, + ILLEGAL_ACCESS_EXCEPTION: 3, + INSTANTIATION_EXCEPTION: 4, + MALFORMED_URL_EXCEPTION: 5, + IO_EXCEPTION: 6, + INVALID_ACTION: 7, + JSON_EXCEPTION: 8, + ERROR: 9 + }, + + /** + * Called by native code when returning successful result from an action. + */ + callbackSuccess: function(callbackId, args) { + try { + cordova.callbackFromNative(callbackId, true, args.status, [args.message], args.keepCallback); + } catch (e) { + console.log("Error in error callback: " + callbackId + " = "+e); + } + }, + + /** + * Called by native code when returning error result from an action. + */ + callbackError: function(callbackId, args) { + // TODO: Deprecate callbackSuccess and callbackError in favour of callbackFromNative. + // Derive success from status. + try { + cordova.callbackFromNative(callbackId, false, args.status, [args.message], args.keepCallback); + } catch (e) { + console.log("Error in error callback: " + callbackId + " = "+e); + } + }, + + /** + * Called by native code when returning the result from an action. + */ + callbackFromNative: function(callbackId, success, status, args, keepCallback) { + var callback = cordova.callbacks[callbackId]; + if (callback) { + if (success && status == cordova.callbackStatus.OK) { + callback.success && callback.success.apply(null, args); + } else if (!success) { + callback.fail && callback.fail.apply(null, args); + } + + // Clear callback if not expecting any more results + if (!keepCallback) { + delete cordova.callbacks[callbackId]; + } + } + }, + addConstructor: function(func) { + channel.onCordovaReady.subscribe(function() { + try { + func(); + } catch(e) { + console.log("Failed to run constructor: " + e); + } + }); + } +}; + + +module.exports = cordova; + +}); + +// file: lib/android/android/nativeapiprovider.js +define("cordova/android/nativeapiprovider", function(require, exports, module) { + +/** + * Exports the ExposedJsApi.java object if available, otherwise exports the PromptBasedNativeApi. + */ + +var nativeApi = this._cordovaNative || require('cordova/android/promptbasednativeapi'); +var currentApi = nativeApi; + +module.exports = { + get: function() { return currentApi; }, + setPreferPrompt: function(value) { + currentApi = value ? require('cordova/android/promptbasednativeapi') : nativeApi; + }, + // Used only by tests. + set: function(value) { + currentApi = value; + } +}; + +}); + +// file: lib/android/android/promptbasednativeapi.js +define("cordova/android/promptbasednativeapi", function(require, exports, module) { + +/** + * Implements the API of ExposedJsApi.java, but uses prompt() to communicate. + * This is used only on the 2.3 simulator, where addJavascriptInterface() is broken. + */ + +module.exports = { + exec: function(service, action, callbackId, argsJson) { + return prompt(argsJson, 'gap:'+JSON.stringify([service, action, callbackId])); + }, + setNativeToJsBridgeMode: function(value) { + prompt(value, 'gap_bridge_mode:'); + }, + retrieveJsMessages: function(fromOnlineEvent) { + return prompt(+fromOnlineEvent, 'gap_poll:'); + } +}; + +}); + +// file: lib/common/argscheck.js +define("cordova/argscheck", function(require, exports, module) { + +var exec = require('cordova/exec'); +var utils = require('cordova/utils'); + +var moduleExports = module.exports; + +var typeMap = { + 'A': 'Array', + 'D': 'Date', + 'N': 'Number', + 'S': 'String', + 'F': 'Function', + 'O': 'Object' +}; + +function extractParamName(callee, argIndex) { + return (/.*?\((.*?)\)/).exec(callee)[1].split(', ')[argIndex]; +} + +function checkArgs(spec, functionName, args, opt_callee) { + if (!moduleExports.enableChecks) { + return; + } + var errMsg = null; + var typeName; + for (var i = 0; i < spec.length; ++i) { + var c = spec.charAt(i), + cUpper = c.toUpperCase(), + arg = args[i]; + // Asterix means allow anything. + if (c == '*') { + continue; + } + typeName = utils.typeName(arg); + if ((arg === null || arg === undefined) && c == cUpper) { + continue; + } + if (typeName != typeMap[cUpper]) { + errMsg = 'Expected ' + typeMap[cUpper]; + break; + } + } + if (errMsg) { + errMsg += ', but got ' + typeName + '.'; + errMsg = 'Wrong type for parameter "' + extractParamName(opt_callee || args.callee, i) + '" of ' + functionName + ': ' + errMsg; + // Don't log when running unit tests. + if (typeof jasmine == 'undefined') { + console.error(errMsg); + } + throw TypeError(errMsg); + } +} + +function getValue(value, defaultValue) { + return value === undefined ? defaultValue : value; +} + +moduleExports.checkArgs = checkArgs; +moduleExports.getValue = getValue; +moduleExports.enableChecks = true; + + +}); + +// file: lib/common/base64.js +define("cordova/base64", function(require, exports, module) { + +var base64 = exports; + +base64.fromArrayBuffer = function(arrayBuffer) { + var array = new Uint8Array(arrayBuffer); + return uint8ToBase64(array); +}; + +//------------------------------------------------------------------------------ + +/* This code is based on the performance tests at http://jsperf.com/b64tests + * This 12-bit-at-a-time algorithm was the best performing version on all + * platforms tested. + */ + +var b64_6bit = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; +var b64_12bit; + +var b64_12bitTable = function() { + b64_12bit = []; + for (var i=0; i<64; i++) { + for (var j=0; j<64; j++) { + b64_12bit[i*64+j] = b64_6bit[i] + b64_6bit[j]; + } + } + b64_12bitTable = function() { return b64_12bit; }; + return b64_12bit; +}; + +function uint8ToBase64(rawData) { + var numBytes = rawData.byteLength; + var output=""; + var segment; + var table = b64_12bitTable(); + for (var i=0;i> 12]; + output += table[segment & 0xfff]; + } + if (numBytes - i == 2) { + segment = (rawData[i] << 16) + (rawData[i+1] << 8); + output += table[segment >> 12]; + output += b64_6bit[(segment & 0xfff) >> 6]; + output += '='; + } else if (numBytes - i == 1) { + segment = (rawData[i] << 16); + output += table[segment >> 12]; + output += '=='; + } + return output; +} + +}); + +// file: lib/common/builder.js +define("cordova/builder", function(require, exports, module) { + +var utils = require('cordova/utils'); + +function each(objects, func, context) { + for (var prop in objects) { + if (objects.hasOwnProperty(prop)) { + func.apply(context, [objects[prop], prop]); + } + } +} + +function clobber(obj, key, value) { + exports.replaceHookForTesting(obj, key); + obj[key] = value; + // Getters can only be overridden by getters. + if (obj[key] !== value) { + utils.defineGetter(obj, key, function() { + return value; + }); + } +} + +function assignOrWrapInDeprecateGetter(obj, key, value, message) { + if (message) { + utils.defineGetter(obj, key, function() { + console.log(message); + delete obj[key]; + clobber(obj, key, value); + return value; + }); + } else { + clobber(obj, key, value); + } +} + +function include(parent, objects, clobber, merge) { + each(objects, function (obj, key) { + try { + var result = obj.path ? require(obj.path) : {}; + + if (clobber) { + // Clobber if it doesn't exist. + if (typeof parent[key] === 'undefined') { + assignOrWrapInDeprecateGetter(parent, key, result, obj.deprecated); + } else if (typeof obj.path !== 'undefined') { + // If merging, merge properties onto parent, otherwise, clobber. + if (merge) { + recursiveMerge(parent[key], result); + } else { + assignOrWrapInDeprecateGetter(parent, key, result, obj.deprecated); + } + } + result = parent[key]; + } else { + // Overwrite if not currently defined. + if (typeof parent[key] == 'undefined') { + assignOrWrapInDeprecateGetter(parent, key, result, obj.deprecated); + } else { + // Set result to what already exists, so we can build children into it if they exist. + result = parent[key]; + } + } + + if (obj.children) { + include(result, obj.children, clobber, merge); + } + } catch(e) { + utils.alert('Exception building cordova JS globals: ' + e + ' for key "' + key + '"'); + } + }); +} + +/** + * Merge properties from one object onto another recursively. Properties from + * the src object will overwrite existing target property. + * + * @param target Object to merge properties into. + * @param src Object to merge properties from. + */ +function recursiveMerge(target, src) { + for (var prop in src) { + if (src.hasOwnProperty(prop)) { + if (target.prototype && target.prototype.constructor === target) { + // If the target object is a constructor override off prototype. + clobber(target.prototype, prop, src[prop]); + } else { + if (typeof src[prop] === 'object' && typeof target[prop] === 'object') { + recursiveMerge(target[prop], src[prop]); + } else { + clobber(target, prop, src[prop]); + } + } + } + } +} + +exports.buildIntoButDoNotClobber = function(objects, target) { + include(target, objects, false, false); +}; +exports.buildIntoAndClobber = function(objects, target) { + include(target, objects, true, false); +}; +exports.buildIntoAndMerge = function(objects, target) { + include(target, objects, true, true); +}; +exports.recursiveMerge = recursiveMerge; +exports.assignOrWrapInDeprecateGetter = assignOrWrapInDeprecateGetter; +exports.replaceHookForTesting = function() {}; + +}); + +// file: lib/common/channel.js +define("cordova/channel", function(require, exports, module) { + +var utils = require('cordova/utils'), + nextGuid = 1; + +/** + * Custom pub-sub "channel" that can have functions subscribed to it + * This object is used to define and control firing of events for + * cordova initialization, as well as for custom events thereafter. + * + * The order of events during page load and Cordova startup is as follows: + * + * onDOMContentLoaded* Internal event that is received when the web page is loaded and parsed. + * onNativeReady* Internal event that indicates the Cordova native side is ready. + * onCordovaReady* Internal event fired when all Cordova JavaScript objects have been created. + * onDeviceReady* User event fired to indicate that Cordova is ready + * onResume User event fired to indicate a start/resume lifecycle event + * onPause User event fired to indicate a pause lifecycle event + * onDestroy* Internal event fired when app is being destroyed (User should use window.onunload event, not this one). + * + * The events marked with an * are sticky. Once they have fired, they will stay in the fired state. + * All listeners that subscribe after the event is fired will be executed right away. + * + * The only Cordova events that user code should register for are: + * deviceready Cordova native code is initialized and Cordova APIs can be called from JavaScript + * pause App has moved to background + * resume App has returned to foreground + * + * Listeners can be registered as: + * document.addEventListener("deviceready", myDeviceReadyListener, false); + * document.addEventListener("resume", myResumeListener, false); + * document.addEventListener("pause", myPauseListener, false); + * + * The DOM lifecycle events should be used for saving and restoring state + * window.onload + * window.onunload + * + */ + +/** + * Channel + * @constructor + * @param type String the channel name + */ +var Channel = function(type, sticky) { + this.type = type; + // Map of guid -> function. + this.handlers = {}; + // 0 = Non-sticky, 1 = Sticky non-fired, 2 = Sticky fired. + this.state = sticky ? 1 : 0; + // Used in sticky mode to remember args passed to fire(). + this.fireArgs = null; + // Used by onHasSubscribersChange to know if there are any listeners. + this.numHandlers = 0; + // Function that is called when the first listener is subscribed, or when + // the last listener is unsubscribed. + this.onHasSubscribersChange = null; +}, + channel = { + /** + * Calls the provided function only after all of the channels specified + * have been fired. All channels must be sticky channels. + */ + join: function(h, c) { + var len = c.length, + i = len, + f = function() { + if (!(--i)) h(); + }; + for (var j=0; jNative bridge. + POLLING: 0, + // For LOAD_URL to be viable, it would need to have a work-around for + // the bug where the soft-keyboard gets dismissed when a message is sent. + LOAD_URL: 1, + // For the ONLINE_EVENT to be viable, it would need to intercept all event + // listeners (both through addEventListener and window.ononline) as well + // as set the navigator property itself. + ONLINE_EVENT: 2, + // Uses reflection to access private APIs of the WebView that can send JS + // to be executed. + // Requires Android 3.2.4 or above. + PRIVATE_API: 3 + }, + jsToNativeBridgeMode, // Set lazily. + nativeToJsBridgeMode = nativeToJsModes.ONLINE_EVENT, + pollEnabled = false, + messagesFromNative = []; + +function androidExec(success, fail, service, action, args) { + // Set default bridge modes if they have not already been set. + // By default, we use the failsafe, since addJavascriptInterface breaks too often + if (jsToNativeBridgeMode === undefined) { + androidExec.setJsToNativeBridgeMode(jsToNativeModes.JS_OBJECT); + } + + // Process any ArrayBuffers in the args into a string. + for (var i = 0; i < args.length; i++) { + if (utils.typeName(args[i]) == 'ArrayBuffer') { + args[i] = base64.fromArrayBuffer(args[i]); + } + } + + var callbackId = service + cordova.callbackId++, + argsJson = JSON.stringify(args); + + if (success || fail) { + cordova.callbacks[callbackId] = {success:success, fail:fail}; + } + + if (jsToNativeBridgeMode == jsToNativeModes.LOCATION_CHANGE) { + window.location = 'http://cdv_exec/' + service + '#' + action + '#' + callbackId + '#' + argsJson; + } else { + var messages = nativeApiProvider.get().exec(service, action, callbackId, argsJson); + // If argsJson was received by Java as null, try again with the PROMPT bridge mode. + // This happens in rare circumstances, such as when certain Unicode characters are passed over the bridge on a Galaxy S2. See CB-2666. + if (jsToNativeBridgeMode == jsToNativeModes.JS_OBJECT && messages === "@Null arguments.") { + androidExec.setJsToNativeBridgeMode(jsToNativeModes.PROMPT); + androidExec(success, fail, service, action, args); + androidExec.setJsToNativeBridgeMode(jsToNativeModes.JS_OBJECT); + return; + } else { + androidExec.processMessages(messages); + } + } +} + +function pollOnceFromOnlineEvent() { + pollOnce(true); +} + +function pollOnce(opt_fromOnlineEvent) { + var msg = nativeApiProvider.get().retrieveJsMessages(!!opt_fromOnlineEvent); + androidExec.processMessages(msg); +} + +function pollingTimerFunc() { + if (pollEnabled) { + pollOnce(); + setTimeout(pollingTimerFunc, 50); + } +} + +function hookOnlineApis() { + function proxyEvent(e) { + cordova.fireWindowEvent(e.type); + } + // The network module takes care of firing online and offline events. + // It currently fires them only on document though, so we bridge them + // to window here (while first listening for exec()-releated online/offline + // events). + window.addEventListener('online', pollOnceFromOnlineEvent, false); + window.addEventListener('offline', pollOnceFromOnlineEvent, false); + cordova.addWindowEventHandler('online'); + cordova.addWindowEventHandler('offline'); + document.addEventListener('online', proxyEvent, false); + document.addEventListener('offline', proxyEvent, false); +} + +hookOnlineApis(); + +androidExec.jsToNativeModes = jsToNativeModes; +androidExec.nativeToJsModes = nativeToJsModes; + +androidExec.setJsToNativeBridgeMode = function(mode) { + if (mode == jsToNativeModes.JS_OBJECT && !window._cordovaNative) { + console.log('Falling back on PROMPT mode since _cordovaNative is missing. Expected for Android 3.2 and lower only.'); + mode = jsToNativeModes.PROMPT; + } + nativeApiProvider.setPreferPrompt(mode == jsToNativeModes.PROMPT); + jsToNativeBridgeMode = mode; +}; + +androidExec.setNativeToJsBridgeMode = function(mode) { + if (mode == nativeToJsBridgeMode) { + return; + } + if (nativeToJsBridgeMode == nativeToJsModes.POLLING) { + pollEnabled = false; + } + + nativeToJsBridgeMode = mode; + // Tell the native side to switch modes. + nativeApiProvider.get().setNativeToJsBridgeMode(mode); + + if (mode == nativeToJsModes.POLLING) { + pollEnabled = true; + setTimeout(pollingTimerFunc, 1); + } +}; + +// Processes a single message, as encoded by NativeToJsMessageQueue.java. +function processMessage(message) { + try { + var firstChar = message.charAt(0); + if (firstChar == 'J') { + eval(message.slice(1)); + } else if (firstChar == 'S' || firstChar == 'F') { + var success = firstChar == 'S'; + var keepCallback = message.charAt(1) == '1'; + var spaceIdx = message.indexOf(' ', 2); + var status = +message.slice(2, spaceIdx); + var nextSpaceIdx = message.indexOf(' ', spaceIdx + 1); + var callbackId = message.slice(spaceIdx + 1, nextSpaceIdx); + var payloadKind = message.charAt(nextSpaceIdx + 1); + var payload; + if (payloadKind == 's') { + payload = message.slice(nextSpaceIdx + 2); + } else if (payloadKind == 't') { + payload = true; + } else if (payloadKind == 'f') { + payload = false; + } else if (payloadKind == 'N') { + payload = null; + } else if (payloadKind == 'n') { + payload = +message.slice(nextSpaceIdx + 2); + } else if (payloadKind == 'A') { + var data = message.slice(nextSpaceIdx + 2); + var bytes = window.atob(data); + var arraybuffer = new Uint8Array(bytes.length); + for (var i = 0; i < bytes.length; i++) { + arraybuffer[i] = bytes.charCodeAt(i); + } + payload = arraybuffer.buffer; + } else if (payloadKind == 'S') { + payload = window.atob(message.slice(nextSpaceIdx + 2)); + } else { + payload = JSON.parse(message.slice(nextSpaceIdx + 1)); + } + cordova.callbackFromNative(callbackId, success, status, [payload], keepCallback); + } else { + console.log("processMessage failed: invalid message:" + message); + } + } catch (e) { + console.log("processMessage failed: Message: " + message); + console.log("processMessage failed: Error: " + e); + console.log("processMessage failed: Stack: " + e.stack); + } +} + +// This is called from the NativeToJsMessageQueue.java. +androidExec.processMessages = function(messages) { + if (messages) { + messagesFromNative.push(messages); + // Check for the reentrant case, and enqueue the message if that's the case. + if (messagesFromNative.length > 1) { + return; + } + while (messagesFromNative.length) { + // Don't unshift until the end so that reentrancy can be detected. + messages = messagesFromNative[0]; + // The Java side can send a * message to indicate that it + // still has messages waiting to be retrieved. + if (messages == '*') { + messagesFromNative.shift(); + window.setTimeout(pollOnce, 0); + return; + } + + var spaceIdx = messages.indexOf(' '); + var msgLen = +messages.slice(0, spaceIdx); + var message = messages.substr(spaceIdx + 1, msgLen); + messages = messages.slice(spaceIdx + msgLen + 1); + processMessage(message); + if (messages) { + messagesFromNative[0] = messages; + } else { + messagesFromNative.shift(); + } + } + } +}; + +module.exports = androidExec; + +}); + +// file: lib/common/init.js +define("cordova/init", function(require, exports, module) { + +var channel = require('cordova/channel'); +var cordova = require('cordova'); +var modulemapper = require('cordova/modulemapper'); +var platform = require('cordova/platform'); +var pluginloader = require('cordova/pluginloader'); + +var platformInitChannelsArray = [channel.onNativeReady, channel.onPluginsReady]; + +function logUnfiredChannels(arr) { + for (var i = 0; i < arr.length; ++i) { + if (arr[i].state != 2) { + console.log('Channel not fired: ' + arr[i].type); + } + } +} + +window.setTimeout(function() { + if (channel.onDeviceReady.state != 2) { + console.log('deviceready has not fired after 5 seconds.'); + logUnfiredChannels(platformInitChannelsArray); + logUnfiredChannels(channel.deviceReadyChannelsArray); + } +}, 5000); + +// Replace navigator before any modules are required(), to ensure it happens as soon as possible. +// We replace it so that properties that can't be clobbered can instead be overridden. +function replaceNavigator(origNavigator) { + var CordovaNavigator = function() {}; + CordovaNavigator.prototype = origNavigator; + var newNavigator = new CordovaNavigator(); + // This work-around really only applies to new APIs that are newer than Function.bind. + // Without it, APIs such as getGamepads() break. + if (CordovaNavigator.bind) { + for (var key in origNavigator) { + if (typeof origNavigator[key] == 'function') { + newNavigator[key] = origNavigator[key].bind(origNavigator); + } + } + } + return newNavigator; +} +if (window.navigator) { + window.navigator = replaceNavigator(window.navigator); +} + +if (!window.console) { + window.console = { + log: function(){} + }; +} +if (!window.console.warn) { + window.console.warn = function(msg) { + this.log("warn: " + msg); + }; +} + +// Register pause, resume and deviceready channels as events on document. +channel.onPause = cordova.addDocumentEventHandler('pause'); +channel.onResume = cordova.addDocumentEventHandler('resume'); +channel.onDeviceReady = cordova.addStickyDocumentEventHandler('deviceready'); + +// Listen for DOMContentLoaded and notify our channel subscribers. +if (document.readyState == 'complete' || document.readyState == 'interactive') { + channel.onDOMContentLoaded.fire(); +} else { + document.addEventListener('DOMContentLoaded', function() { + channel.onDOMContentLoaded.fire(); + }, false); +} + +// _nativeReady is global variable that the native side can set +// to signify that the native code is ready. It is a global since +// it may be called before any cordova JS is ready. +if (window._nativeReady) { + channel.onNativeReady.fire(); +} + +modulemapper.clobbers('cordova', 'cordova'); +modulemapper.clobbers('cordova/exec', 'cordova.exec'); +modulemapper.clobbers('cordova/exec', 'Cordova.exec'); + +// Call the platform-specific initialization. +platform.bootstrap && platform.bootstrap(); + +pluginloader.load(function() { + channel.onPluginsReady.fire(); +}); + +/** + * Create all cordova objects once native side is ready. + */ +channel.join(function() { + modulemapper.mapModules(window); + + platform.initialize && platform.initialize(); + + // Fire event to notify that all objects are created + channel.onCordovaReady.fire(); + + // Fire onDeviceReady event once page has fully loaded, all + // constructors have run and cordova info has been received from native + // side. + channel.join(function() { + require('cordova').fireDocumentEvent('deviceready'); + }, channel.deviceReadyChannelsArray); + +}, platformInitChannelsArray); + + +}); + +// file: lib/common/modulemapper.js +define("cordova/modulemapper", function(require, exports, module) { + +var builder = require('cordova/builder'), + moduleMap = define.moduleMap, + symbolList, + deprecationMap; + +exports.reset = function() { + symbolList = []; + deprecationMap = {}; +}; + +function addEntry(strategy, moduleName, symbolPath, opt_deprecationMessage) { + if (!(moduleName in moduleMap)) { + throw new Error('Module ' + moduleName + ' does not exist.'); + } + symbolList.push(strategy, moduleName, symbolPath); + if (opt_deprecationMessage) { + deprecationMap[symbolPath] = opt_deprecationMessage; + } +} + +// Note: Android 2.3 does have Function.bind(). +exports.clobbers = function(moduleName, symbolPath, opt_deprecationMessage) { + addEntry('c', moduleName, symbolPath, opt_deprecationMessage); +}; + +exports.merges = function(moduleName, symbolPath, opt_deprecationMessage) { + addEntry('m', moduleName, symbolPath, opt_deprecationMessage); +}; + +exports.defaults = function(moduleName, symbolPath, opt_deprecationMessage) { + addEntry('d', moduleName, symbolPath, opt_deprecationMessage); +}; + +exports.runs = function(moduleName) { + addEntry('r', moduleName, null); +}; + +function prepareNamespace(symbolPath, context) { + if (!symbolPath) { + return context; + } + var parts = symbolPath.split('.'); + var cur = context; + for (var i = 0, part; part = parts[i]; ++i) { + cur = cur[part] = cur[part] || {}; + } + return cur; +} + +exports.mapModules = function(context) { + var origSymbols = {}; + context.CDV_origSymbols = origSymbols; + for (var i = 0, len = symbolList.length; i < len; i += 3) { + var strategy = symbolList[i]; + var moduleName = symbolList[i + 1]; + var module = require(moduleName); + // + if (strategy == 'r') { + continue; + } + var symbolPath = symbolList[i + 2]; + var lastDot = symbolPath.lastIndexOf('.'); + var namespace = symbolPath.substr(0, lastDot); + var lastName = symbolPath.substr(lastDot + 1); + + var deprecationMsg = symbolPath in deprecationMap ? 'Access made to deprecated symbol: ' + symbolPath + '. ' + deprecationMsg : null; + var parentObj = prepareNamespace(namespace, context); + var target = parentObj[lastName]; + + if (strategy == 'm' && target) { + builder.recursiveMerge(target, module); + } else if ((strategy == 'd' && !target) || (strategy != 'd')) { + if (!(symbolPath in origSymbols)) { + origSymbols[symbolPath] = target; + } + builder.assignOrWrapInDeprecateGetter(parentObj, lastName, module, deprecationMsg); + } + } +}; + +exports.getOriginalSymbol = function(context, symbolPath) { + var origSymbols = context.CDV_origSymbols; + if (origSymbols && (symbolPath in origSymbols)) { + return origSymbols[symbolPath]; + } + var parts = symbolPath.split('.'); + var obj = context; + for (var i = 0; i < parts.length; ++i) { + obj = obj && obj[parts[i]]; + } + return obj; +}; + +exports.reset(); + + +}); + +// file: lib/android/platform.js +define("cordova/platform", function(require, exports, module) { + +module.exports = { + id: 'android', + bootstrap: function() { + var channel = require('cordova/channel'), + cordova = require('cordova'), + exec = require('cordova/exec'), + modulemapper = require('cordova/modulemapper'); + + // Tell the native code that a page change has occurred. + exec(null, null, 'PluginManager', 'startup', []); + // Tell the JS that the native side is ready. + channel.onNativeReady.fire(); + + // TODO: Extract this as a proper plugin. + modulemapper.clobbers('cordova/plugin/android/app', 'navigator.app'); + + // Inject a listener for the backbutton on the document. + var backButtonChannel = cordova.addDocumentEventHandler('backbutton'); + backButtonChannel.onHasSubscribersChange = function() { + // If we just attached the first handler or detached the last handler, + // let native know we need to override the back button. + exec(null, null, "App", "overrideBackbutton", [this.numHandlers == 1]); + }; + + // Add hardware MENU and SEARCH button handlers + cordova.addDocumentEventHandler('menubutton'); + cordova.addDocumentEventHandler('searchbutton'); + + // Let native code know we are all done on the JS side. + // Native code will then un-hide the WebView. + channel.onCordovaReady.subscribe(function() { + exec(null, null, "App", "show", []); + }); + } +}; + +}); + +// file: lib/android/plugin/android/app.js +define("cordova/plugin/android/app", function(require, exports, module) { + +var exec = require('cordova/exec'); + +module.exports = { + /** + * Clear the resource cache. + */ + clearCache:function() { + exec(null, null, "App", "clearCache", []); + }, + + /** + * Load the url into the webview or into new browser instance. + * + * @param url The URL to load + * @param props Properties that can be passed in to the activity: + * wait: int => wait msec before loading URL + * loadingDialog: "Title,Message" => display a native loading dialog + * loadUrlTimeoutValue: int => time in msec to wait before triggering a timeout error + * clearHistory: boolean => clear webview history (default=false) + * openExternal: boolean => open in a new browser (default=false) + * + * Example: + * navigator.app.loadUrl("http://server/myapp/index.html", {wait:2000, loadingDialog:"Wait,Loading App", loadUrlTimeoutValue: 60000}); + */ + loadUrl:function(url, props) { + exec(null, null, "App", "loadUrl", [url, props]); + }, + + /** + * Cancel loadUrl that is waiting to be loaded. + */ + cancelLoadUrl:function() { + exec(null, null, "App", "cancelLoadUrl", []); + }, + + /** + * Clear web history in this web view. + * Instead of BACK button loading the previous web page, it will exit the app. + */ + clearHistory:function() { + exec(null, null, "App", "clearHistory", []); + }, + + /** + * Go to previous page displayed. + * This is the same as pressing the backbutton on Android device. + */ + backHistory:function() { + exec(null, null, "App", "backHistory", []); + }, + + /** + * Override the default behavior of the Android back button. + * If overridden, when the back button is pressed, the "backKeyDown" JavaScript event will be fired. + * + * Note: The user should not have to call this method. Instead, when the user + * registers for the "backbutton" event, this is automatically done. + * + * @param override T=override, F=cancel override + */ + overrideBackbutton:function(override) { + exec(null, null, "App", "overrideBackbutton", [override]); + }, + + /** + * Exit and terminate the application. + */ + exitApp:function() { + return exec(null, null, "App", "exitApp", []); + } +}; + +}); + +// file: lib/common/pluginloader.js +define("cordova/pluginloader", function(require, exports, module) { + +var modulemapper = require('cordova/modulemapper'); + +// Helper function to inject a + + + + diff --git a/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/assets/www/js/index.js b/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/assets/www/js/index.js new file mode 100644 index 000000000..31d9064eb --- /dev/null +++ b/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/assets/www/js/index.js @@ -0,0 +1,49 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +var app = { + // Application Constructor + initialize: function() { + this.bindEvents(); + }, + // Bind Event Listeners + // + // Bind any events that are required on startup. Common events are: + // 'load', 'deviceready', 'offline', and 'online'. + bindEvents: function() { + document.addEventListener('deviceready', this.onDeviceReady, false); + }, + // deviceready Event Handler + // + // The scope of 'this' is the event. In order to call the 'receivedEvent' + // function, we must explicity call 'app.receivedEvent(...);' + onDeviceReady: function() { + app.receivedEvent('deviceready'); + }, + // Update DOM on a Received Event + receivedEvent: function(id) { + var parentElement = document.getElementById(id); + var listeningElement = parentElement.querySelector('.listening'); + var receivedElement = parentElement.querySelector('.received'); + + listeningElement.setAttribute('style', 'display:none;'); + receivedElement.setAttribute('style', 'display:block;'); + + console.log('Received Event: ' + id); + } +}; diff --git a/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/assets/www/spec.html b/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/assets/www/spec.html new file mode 100644 index 000000000..71f00de05 --- /dev/null +++ b/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/assets/www/spec.html @@ -0,0 +1,68 @@ + + + + + Jasmine Spec Runner + + + + + + + + + + + + + + + + + + + + diff --git a/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/build.xml b/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/build.xml new file mode 100644 index 000000000..9674edf7d --- /dev/null +++ b/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/build.xml @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/build b/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/build new file mode 100755 index 000000000..7028eb812 --- /dev/null +++ b/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/build @@ -0,0 +1,35 @@ +#!/usr/bin/env node + +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ + +var build = require('./lib/build'), + reqs = require('./lib/check_reqs'), + args = process.argv; + +// Support basic help commands +if(args[2] == '--help' || args[2] == '/?' || args[2] == '-h' || + args[2] == 'help' || args[2] == '-help' || args[2] == '/help') { + build.help(); +} else if(reqs.run()) { + build.run(args[2]); + process.exit(0); +} else { + process.exit(2); +} diff --git a/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/check_reqs b/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/check_reqs new file mode 100755 index 000000000..4a8abee46 --- /dev/null +++ b/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/check_reqs @@ -0,0 +1,27 @@ +#!/usr/bin/env node + +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ + +var check_reqs = require('./lib/check_reqs'); + +if(!check_reqs.run()) { + process.exit(2); +} + diff --git a/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/clean b/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/clean new file mode 100755 index 000000000..70c4ca80e --- /dev/null +++ b/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/clean @@ -0,0 +1,34 @@ +#!/usr/bin/env node + +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ + +var clean = require('./lib/clean'), + reqs = require('./lib/check_reqs'), + args = process.argv; + +// Usage support for when args are given +if(args.length > 2) { + clean.help(); +} else if(reqs.run()) { + clean.run(); + process.exit(0); +} else { + process.exit(2); +} diff --git a/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/defaults.xml b/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/defaults.xml new file mode 100644 index 000000000..24e572540 --- /dev/null +++ b/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/defaults.xml @@ -0,0 +1,50 @@ + + + + Hello Cordova + + + A sample Apache Cordova application that responds to the deviceready event. + + + + Apache Cordova Team + + + + + + + + + + + + + + diff --git a/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/lib/appinfo.js b/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/lib/appinfo.js new file mode 100755 index 000000000..1f8ebe2cf --- /dev/null +++ b/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/lib/appinfo.js @@ -0,0 +1,41 @@ +#!/usr/bin/env node + +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ + +var path = require('path'); +var fs = require('fs'); +var cachedAppInfo = null; + +function readAppInfoFromManifest() { + var manifestPath = path.join(__dirname, '..', '..', 'AndroidManifest.xml'); + var manifestData = fs.readFileSync(manifestPath, {encoding:'utf8'}); + var packageName = /\bpackage\s*=\s*"(.+?)"/.exec(manifestData); + if (!packageName) throw new Error('Could not find package name within ' + manifestPath); + var activityTag = //.exec(manifestData); + if (!activityTag) throw new Error('Could not find within ' + manifestPath); + var activityName = /\bandroid:name\s*=\s*"(.+?)"/.exec(activityTag); + if (!activityName) throw new Error('Could not find android:name within ' + manifestPath); + + return packageName[1] + '/.' + activityName[1]; +} + +exports.getActivityName = function() { + return cachedAppInfo = cachedAppInfo || readAppInfoFromManifest(); +}; diff --git a/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/lib/build.js b/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/lib/build.js new file mode 100755 index 000000000..7bc33ca27 --- /dev/null +++ b/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/lib/build.js @@ -0,0 +1,89 @@ +#!/usr/bin/env node + +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ + +var shell = require('shelljs'), + clean = require('./clean'), + path = require('path'), + fs = require('fs'), + ROOT = path.join(__dirname, '..', '..'); + +/* + * Builds the project with ant. + */ +module.exports.run = function(build_type) { + //default build type + build_type = typeof build_type !== 'undefined' ? build_type : "--debug"; + var cmd; + switch(build_type) { + case '--debug' : + clean.run(); + cmd = 'ant debug -f ' + path.join(ROOT, 'build.xml'); + break; + case '--release' : + clean.run(); + cmd = 'ant release -f ' + path.join(ROOT, 'build.xml'); + break; + case '--nobuild' : + console.log('Skipping build...'); + break; + default : + console.error('Build option \'' + build_type + '\' not recognized.'); + process.exit(2); + break; + } + if(cmd) { + var result = shell.exec(cmd, {silent:false, async:false}); + if(result.code > 0) { + console.error('ERROR: Failed to build android project.'); + console.error(result.output); + process.exit(2); + } + } +} + +/* + * Gets the path to the apk file, if not such file exists then + * the script will error out. (should we error or just return undefined?) + */ +module.exports.get_apk = function() { + if(fs.existsSync(path.join(ROOT, 'bin'))) { + var bin_files = fs.readdirSync(path.join(ROOT, 'bin')); + for (file in bin_files) { + if(path.extname(bin_files[file]) == '.apk') { + return path.join(ROOT, 'bin', bin_files[file]); + } + } + console.error('ERROR : No .apk found in \'bin\' folder'); + process.exit(2); + } else { + console.error('ERROR : unable to find project bin folder, could not locate .apk'); + process.exit(2); + } +} + +module.exports.help = function() { + console.log('Usage: ' + path.relative(process.cwd(), path.join(ROOT, 'cordova', 'build')) + ' [build_type]'); + console.log('Build Types : '); + console.log(' \'--debug\': Default build, will build project in using ant debug'); + console.log(' \'--release\': will build project using ant release'); + console.log(' \'--nobuild\': will skip build process (can be used with run command)'); + process.exit(0); +} diff --git a/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/lib/check_reqs.js b/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/lib/check_reqs.js new file mode 100755 index 000000000..c064499f1 --- /dev/null +++ b/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/lib/check_reqs.js @@ -0,0 +1,78 @@ +#!/usr/bin/env node + +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ + +var shell = require('shelljs'), + path = require('path'), + fs = require('fs'), + ROOT = path.join(__dirname, '..', '..'); + +// Get valid target from framework/project.properties +module.exports.get_target = function() { + if(fs.existsSync(path.join(ROOT, 'framework', 'project.properties'))) { + var target = shell.grep(/target=android-[\d+]/, path.join(ROOT, 'framework', 'project.properties')); + return target.split('=')[1].replace('\n', '').replace('\r', '').replace(' ', ''); + } else if (fs.existsSync(path.join(ROOT, 'project.properties'))) { + // if no target found, we're probably in a project and project.properties is in ROOT. + var target = shell.grep(/target=android-[\d+]/, path.join(ROOT, 'project.properties')); + return target.split('=')[1].replace('\n', '').replace('\r', '').replace(' ', ''); + } +} + +module.exports.check_ant = function() { + var test = shell.exec('ant -version', {silent:true, async:false}); + if(test.code > 0) { + console.error('ERROR : executing command \'ant\', make sure you have ant installed and added to your path.'); + return false; + } + return true; +} + +module.exports.check_java = function() { + if(process.env.JAVA_HOME) { + var test = shell.exec('java', {silent:true, async:false}); + if(test.code > 0) { + console.error('ERROR : executing command \'java\', make sure you java environment is set up. Including your JDK and JRE.'); + return false; + } + return true; + } else { + console.error('ERROR : Make sure JAVA_HOME is set, as well as paths to your JDK and JRE for java.'); + return false; + } +} + +module.exports.check_android = function() { + var valid_target = this.get_target(); + var targets = shell.exec('android list targets', {silent:true, async:false}); + + if(targets.code > 0 && targets.output.match(/command\snot\sfound/)) { + console.error('The command \"android\" failed. Make sure you have the latest Android SDK installed, and the \"android\" command (inside the tools/ folder) is added to your path.'); + return false; + } else if(!targets.output.match(valid_target)) { + console.error('Please install Android target ' + valid_target.split('-')[1] + ' (the Android newest SDK). Make sure you have the latest Android tools installed as well. Run \"android\" from your command-line to install/update any missing SDKs or tools.'); + return false; + } + return true; +} + +module.exports.run = function() { + return this.check_ant() && this.check_java && this.check_android(); +} diff --git a/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/lib/clean.js b/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/lib/clean.js new file mode 100755 index 000000000..8f140153e --- /dev/null +++ b/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/lib/clean.js @@ -0,0 +1,43 @@ +#!/usr/bin/env node + +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ + +var shell = require('shelljs'), + path = require('path'), + ROOT = path.join(__dirname, '..', '..'); + +/* + * Cleans the project using ant + */ +module.exports.run = function() { + var cmd = 'ant clean -f ' + path.join(ROOT, 'build.xml'); + var result = shell.exec(cmd, {silent:false, async:false}); + if (result.code > 0) { + console.error('ERROR: Failed to clean android project.'); + console.error(result.output); + process.exit(2); + } +} + +module.exports.help = function() { + console.log('Usage: ' + path.relative(process.cwd(), path.join(ROOT, 'cordova', 'clean'))); + console.log('Cleans the project directory.'); + process.exit(0); +} diff --git a/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/lib/device.js b/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/lib/device.js new file mode 100755 index 000000000..363dc2bd0 --- /dev/null +++ b/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/lib/device.js @@ -0,0 +1,95 @@ +#!/usr/bin/env node + +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ + +var shell = require('shelljs'), + path = require('path'), + build = require('./build'), + appinfo = require('./appinfo'), + exec = require('child_process').exec, + ROOT = path.join(__dirname, '..', '..'); + +/** + * Returns a list of the device ID's found + */ +module.exports.list = function() { + var cmd = 'adb devices'; + var result = shell.exec(cmd, {silent:true, async:false}); + if (result.code > 0) { + console.error('Failed to execute android command \'' + cmd + '\'.'); + process.exit(2); + } else { + var response = result.output.split('\n'); + var device_list = []; + for (var i = 1; i < response.length; i++) { + if (response[i].match(/\w+\tdevice/) && !response[i].match(/emulator/)) { + device_list.push(response[i].replace(/\tdevice/, '').replace('\r', '')); + } + } + return device_list; + } +} + +/* + * Installs a previously built application on the device + * and launches it. + */ +module.exports.install = function(target) { + var device_list = this.list(); + if (device_list.length > 0) { + // default device + target = typeof target !== 'undefined' ? target : device_list[0]; + if (device_list.indexOf(target) > -1) { + var apk_path = build.get_apk(); + var launchName = appinfo.getActivityName(); + console.log('Installing app on device...'); + cmd = 'adb -s ' + target + ' install -r ' + apk_path; + var install = shell.exec(cmd, {silent:false, async:false}); + if (install.error || install.output.match(/Failure/)) { + console.error('ERROR : Failed to install apk to device : '); + console.error(install.output); + process.exit(2); + } + + //unlock screen + cmd = 'adb -s ' + target + ' shell input keyevent 82'; + shell.exec(cmd, {silent:true, async:false}); + + // launch the application + console.log('Launching application...'); + cmd = 'adb -s ' + target + ' shell am start -W -a android.intent.action.MAIN -n ' + launchName; + var launch = shell.exec(cmd, {silent:true, async:false}); + if(launch.code > 0) { + console.error('ERROR : Failed to launch application on emulator : ' + launch.error); + console.error(launch.output); + process.exit(2); + } else { + console.log('LAUNCH SUCCESS'); + } + } else { + console.error('ERROR : Unable to find target \'' + target + '\'.'); + console.error('Failed to deploy to device.'); + process.exit(2); + } + } else { + console.error('ERROR : Failed to deploy to device, no devices found.'); + process.exit(2); + } +} diff --git a/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/lib/emulator.js b/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/lib/emulator.js new file mode 100755 index 000000000..cc658a9b9 --- /dev/null +++ b/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/lib/emulator.js @@ -0,0 +1,337 @@ +#!/usr/bin/env node + +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ + +var shell = require('shelljs'), + path = require('path'), + appinfo = require('./appinfo'), + build = require('./build'), + ROOT = path.join(__dirname, '..', '..'), + new_emulator = 'cordova_emulator'; + +/** + * Returns a list of emulator images in the form of objects + * { + name : , + path : , + target : , + abi : , + skin : + } + */ +module.exports.list_images = function() { + var cmd = 'android list avds'; + var result = shell.exec(cmd, {silent:true, async:false}); + if (result.code > 0) { + console.error('Failed to execute android command \'' + cmd + '\'.'); + process.exit(2); + } else { + var response = result.output.split('\n'); + var emulator_list = []; + for (var i = 1; i < response.length; i++) { + // To return more detailed information use img_obj + var img_obj = {}; + if (response[i].match(/Name:\s/)) { + img_obj['name'] = response[i].split('Name: ')[1].replace('\r', ''); + if (response[i + 1].match(/Path:\s/)) { + i++; + img_obj['path'] = response[i].split('Path: ')[1].replace('\r', ''); + } + if (response[i + 1].match(/\(API\slevel\s/)) { + i++; + img_obj['target'] = response[i].replace('\r', ''); + } + if (response[i + 1].match(/ABI:\s/)) { + i++; + img_obj['abi'] = response[i].split('ABI: ')[1].replace('\r', ''); + } + if (response[i + 1].match(/Skin:\s/)) { + i++; + img_obj['skin'] = response[i].split('Skin: ')[1].replace('\r', ''); + } + + emulator_list.push(img_obj); + } + /* To just return a list of names use this + if (response[i].match(/Name:\s/)) { + emulator_list.push(response[i].split('Name: ')[1].replace('\r', ''); + }*/ + + } + return emulator_list; + } +} + +/** + * Will return the closest avd to the projects target + * or undefined if no avds exist. + */ +module.exports.best_image = function() { + var project_target = this.get_target().replace('android-', ''); + var images = this.list_images(); + var closest = 9999; + var best = images[0]; + for (i in images) { + var target = images[i].target; + if(target) { + var num = target.split('(API level ')[1].replace(')', ''); + if (num == project_target) { + return images[i]; + } else if (project_target - num < closest && project_target > num) { + var closest = project_target - num; + best = images[i]; + } + } + } + return best; +} + +module.exports.list_started = function() { + var cmd = 'adb devices'; + var result = shell.exec(cmd, {silent:true, async:false}); + if (result.code > 0) { + console.error('Failed to execute android command \'' + cmd + '\'.'); + process.exit(2); + } else { + var response = result.output.split('\n'); + var started_emulator_list = []; + for (var i = 1; i < response.length; i++) { + if (response[i].match(/device/) && response[i].match(/emulator/)) { + started_emulator_list.push(response[i].replace(/\tdevice/, '').replace('\r', '')); + } + } + return started_emulator_list; + } +} + +module.exports.get_target = function() { + var target = shell.grep(/target=android-[\d+]/, path.join(ROOT, 'project.properties')); + return target.split('=')[1].replace('\n', '').replace('\r', '').replace(' ', ''); +} + +module.exports.list_targets = function() { + var target_out = shell.exec('android list targets', {silent:true, async:false}).output.split('\n'); + var targets = []; + for (var i = target_out.length; i >= 0; i--) { + if(target_out[i].match(/id:/)) { + targets.push(targets[i].split(' ')[1]); + } + } + return targets; +} + +/* + * Starts an emulator with the given ID, + * and returns the started ID of that emulator. + * If no ID is given it will used the first image availible, + * if no image is availible it will error out (maybe create one?). + */ +module.exports.start = function(emulator_ID) { + var started_emulators = this.list_started(); + var num_started = started_emulators.length; + if (typeof emulator_ID === 'undefined') { + var emulator_list = this.list_images(); + if (emulator_list.length > 0) { + emulator_ID = this.best_image().name; + console.log('WARNING : no emulator specified, defaulting to ' + emulator_ID); + } else { + console.error('ERROR : No emulator images (avds) found, if you would like to create an'); + console.error(' avd follow the instructions provided here : '); + console.error(' http://developer.android.com/tools/devices/index.html') + console.error(' Or run \'android create avd --name --target \' '); + console.error(' in on the command line.'); + process.exit(2); + /*console.log('WARNING : no emulators availible, creating \'' + new_emulator + '\'.'); + this.create_image(new_emulator, this.get_target()); + emulator_ID = new_emulator;*/ + } + } + + var pipe_null = (process.platform == 'win32' || process.platform == 'win64'? '> NUL' : '> /dev/null'); + var cmd = 'emulator -avd ' + emulator_ID + ' ' + pipe_null + ' &'; + if(process.platform == 'win32' || process.platform == 'win64') { + cmd = '%comspec% /c start cmd /c ' + cmd; + } + var result = shell.exec(cmd, {silent:true, async:false}, function(code, output) { + if (code > 0) { + console.error('Failed to execute android command \'' + cmd + '\'.'); + console.error(output); + process.exit(2); + } + }); + + // wait for emulator to start + console.log('Waiting for emulator...'); + var new_started = this.wait_for_emulator(num_started); + var emulator_id; + if (new_started.length > 1) { + for (i in new_started) { + console.log(new_started[i]); + console.log(started_emulators.indexOf(new_started[i])); + if (started_emulators.indexOf(new_started[i]) < 0) { + emulator_id = new_started[i]; + } + } + } else { + emulator_id = new_started[0]; + } + if (!emulator_id) { + console.error('ERROR : Failed to start emulator, could not find new emulator'); + process.exit(2); + } + + //wait for emulator to boot up + process.stdout.write('Booting up emulator (this may take a while)...'); + this.wait_for_boot(emulator_id); + console.log('BOOT COMPLETE'); + + //unlock screen + cmd = 'adb -s ' + emulator_id + ' shell input keyevent 82'; + shell.exec(cmd, {silent:false, async:false}); + + //return the new emulator id for the started emulators + return emulator_id; +} + +/* + * Waits for the new emulator to apear on the started-emulator list. + */ +module.exports.wait_for_emulator = function(num_running) { + var new_started = this.list_started(); + if (new_started.length > num_running) { + return new_started; + } else { + this.sleep(1); + return this.wait_for_emulator(num_running); + } +} + +/* + * Waits for the boot animation property of the emulator to switch to 'stopped' + */ +module.exports.wait_for_boot = function(emulator_id) { + var cmd; + // ShellJS opens a lot of file handles, and the default on OS X is too small. + // TODO : This is not working, need to find a better way to increese the ulimit. + if(process.platform == 'win32' || process.platform == 'win64') { + cmd = 'adb -s ' + emulator_id + ' shell getprop init.svc.bootanim'; + } else { + cmd = 'ulimit -S -n 4096; adb -s ' + emulator_id + ' shell getprop init.svc.bootanim'; + } + var boot_anim = shell.exec(cmd, {silent:true, async:false}); + if (boot_anim.output.match(/stopped/)) { + return; + } else { + process.stdout.write('.'); + this.sleep(3); + return this.wait_for_boot(emulator_id); + } +} + +/* + * TODO : find a better way to wait for the emulator (maybe using async methods?) + */ +module.exports.sleep = function(time_sec) { + if (process.platform == 'win32' || process.platform == 'win64') { + shell.exec('ping 127.0.0.1 -n ' + time_sec, {silent:true, async:false}); + } else { + shell.exec('sleep ' + time_sec, {silent:true, async:false}); + } +} + +/* + * Create avd + * TODO : Enter the stdin input required to complete the creation of an avd. + */ +module.exports.create_image = function(name, target) { + console.log('Creating avd named ' + name); + if (target) { + var cmd = 'android create avd --name ' + name + ' --target ' + target; + var create = shell.exec(cmd, {sient:false, async:false}); + if (create.error) { + console.error('ERROR : Failed to create emulator image : '); + console.error(' Do you have the latest android targets including ' + target + '?'); + console.error(create.output); + process.exit(2); + } + } else { + console.log('WARNING : Project target not found, creating avd with a different target but the project may fail to install.'); + var cmd = 'android create avd --name ' + name + ' --target ' + this.list_targets()[0]; + var create = shell.exec(cmd, {sient:false, async:false}); + if (create.error) { + console.error('ERROR : Failed to create emulator image : '); + console.error(create.output); + process.exit(2); + } + console.error('ERROR : Unable to create an avd emulator, no targets found.'); + console.error('Please insure you have targets availible by runing the "android" command'). + process.exit(2); + } +} + +/* + * Installs a previously built application on the emulator and launches it. + * If no target is specified, then it picks one. + * If no started emulators are found, error out. + */ +module.exports.install = function(target) { + var emulator_list = this.list_started(); + if (emulator_list.length < 1) { + console.error('ERROR : No started emulators found, please start an emultor before deploying your project.'); + process.exit(2); + /*console.log('WARNING : No started emulators found, attemting to start an avd...'); + this.start(this.best_image().name);*/ + } + // default emulator + target = typeof target !== 'undefined' ? target : emulator_list[0]; + if (emulator_list.indexOf(target) > -1) { + console.log('Installing app on emulator...'); + var apk_path = build.get_apk(); + var cmd = 'adb -s ' + target + ' install -r ' + apk_path; + var install = shell.exec(cmd, {sient:false, async:false}); + if (install.error || install.output.match(/Failure/)) { + console.error('ERROR : Failed to install apk to emulator : '); + console.error(install.output); + process.exit(2); + } + + //unlock screen + cmd = 'adb -s ' + target + ' shell input keyevent 82'; + shell.exec(cmd, {silent:true, async:false}); + + // launch the application + console.log('Launching application...'); + var launchName = appinfo.getActivityName(); + cmd = 'adb -s ' + target + ' shell am start -W -a android.intent.action.MAIN -n ' + launchName; + console.log(cmd); + var launch = shell.exec(cmd, {silent:false, async:false}); + if(launch.code > 0) { + console.error('ERROR : Failed to launch application on emulator : ' + launch.error); + console.error(launch.output); + process.exit(2); + } else { + console.log('LAUNCH SUCCESS'); + } + } else { + console.error('ERROR : Unable to find target \'' + target + '\'.'); + console.error('Failed to deploy to emulator.'); + process.exit(2); + } +} diff --git a/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/lib/install-device b/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/lib/install-device new file mode 100755 index 000000000..679efbf97 --- /dev/null +++ b/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/lib/install-device @@ -0,0 +1,38 @@ +#!/usr/bin/env node + +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ + +var device = require('./device'), + args = process.argv; + +if(args.length > 2) { + var install_target; + if (args[2].substring(0, 9) == '--target=') { + install_target = args[2].substring(9, args[2].length); + device.install(install_target); + process.exit(0); + } else { + console.error('ERROR : argument \'' + args[2] + '\' not recognized.'); + process.exit(2); + } +} else { + device.install(); + process.exit(0); +} diff --git a/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/lib/install-emulator b/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/lib/install-emulator new file mode 100755 index 000000000..c006eb264 --- /dev/null +++ b/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/lib/install-emulator @@ -0,0 +1,38 @@ +#!/usr/bin/env node + +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ + +var emulator = require('./emulator'), + args = process.argv; + +if(args.length > 2) { + var install_target; + if (args[2].substring(0, 9) == '--target=') { + install_target = args[2].substring(9, args[2].length); + emulator.install(install_target); + process.exit(0); + } else { + console.error('ERROR : argument \'' + args[2] + '\' not recognized.'); + process.exit(2); + } +} else { + emulator.install(); + process.exit(0); +} diff --git a/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/lib/list-devices b/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/lib/list-devices new file mode 100755 index 000000000..3ef4efab2 --- /dev/null +++ b/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/lib/list-devices @@ -0,0 +1,28 @@ +#!/usr/bin/env node + +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ + +var devices = require('./device'); + +// Usage support for when args are given +var device_list = devices.list(); +for(device in device_list) { + console.log(device_list[device]); +} diff --git a/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/lib/list-emulator-images b/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/lib/list-emulator-images new file mode 100755 index 000000000..3230537a7 --- /dev/null +++ b/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/lib/list-emulator-images @@ -0,0 +1,29 @@ +#!/usr/bin/env node + +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ + +var emulators = require('./emulator'); + +// Usage support for when args are given +var emulator_list = emulators.list_images(); +for(emulator in emulator_list) { + console.log(emulator_list[emulator].name); + process.exit(0); +} diff --git a/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/lib/list-started-emulators b/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/lib/list-started-emulators new file mode 100755 index 000000000..525a64c17 --- /dev/null +++ b/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/lib/list-started-emulators @@ -0,0 +1,29 @@ +#!/usr/bin/env node + +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ + +var emulators = require('./emulator'); + +// Usage support for when args are given +var emulator_list = emulators.list_started(); +for(emulator in emulator_list) { + console.log(emulator_list[emulator]); + process.exit(0); +} diff --git a/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/lib/log.js b/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/lib/log.js new file mode 100755 index 000000000..b85cf6063 --- /dev/null +++ b/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/lib/log.js @@ -0,0 +1,43 @@ +#!/usr/bin/env node + +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ + +var shell = require('shelljs'), + path = require('path'), + ROOT = path.join(__dirname, '..', '..'); + +/* + * Starts running logcat in the shell. + */ +module.exports.run = function() { + var cmd = 'adb logcat | grep -v nativeGetEnabledTags'; + var result = shell.exec(cmd, {silent:false, async:false}); + if (result.code > 0) { + console.error('ERROR: Failed to run logcat command.'); + console.error(result.output); + process.exit(2); + } +} + +module.exports.help = function() { + console.log('Usage: ' + path.relative(process.cwd(), path.join(ROOT, 'cordova', 'log'))); + console.log('Gives the logcat output on the command line.'); + process.exit(0); +} diff --git a/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/lib/run.js b/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/lib/run.js new file mode 100755 index 000000000..787d12325 --- /dev/null +++ b/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/lib/run.js @@ -0,0 +1,124 @@ +#!/usr/bin/env node + +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ + +var path = require('path'), + build = require('./build'), + emulator = require('./emulator'), + device = require('./device'), + ROOT = path.join(__dirname, '..', '..'); + +/* + * Runs the application on a device if availible. + * If not device is found, it will use a started emulator. + * If no started emulators are found it will attempt to start an avd. + * If no avds are found it will error out. + */ + module.exports.run = function(args) { + var build_type; + var install_target; + + for (var i=2; i -1) { + device.install(install_target); + } else if (started_emulators.indexOf(install_target) > -1) { + emulator.install(install_target); + } else { + // if target emulator isn't started, then start it. + var emulator_ID; + for(avd in avds) { + if(avds[avd].name == install_target) { + emulator_ID = emulator.start(install_target); + emulator.install(emulator_ID); + break; + } + } + if(!emulator_ID) { + console.error('ERROR : Target \'' + install_target + '\' not found, unalbe to run project'); + process.exit(2); + } + } + } else { + // no target given, deploy to device if availible, otherwise use the emulator. + var device_list = device.list(); + if (device_list.length > 0) { + console.log('WARNING : No target specified, deploying to device \'' + device_list[0] + '\'.'); + device.install(device_list[0]) + } else { + var emulator_list = emulator.list_started(); + if (emulator_list.length > 0) { + console.log('WARNING : No target specified, deploying to emulator \'' + emulator_list[0] + '\'.'); + emulator.install(emulator_list[0]); + } else { + console.log('WARNING : No started emulators found, starting an emulator.'); + var best_avd = emulator.best_image(); + if(best_avd) { + var emulator_ID = emulator.start(best_avd.name); + console.log('WARNING : No target specified, deploying to emulator \'' + emulator_ID + '\'.'); + emulator.install(emulator_ID); + } else { + emulator.start(); + } + } + } + } +} + +module.exports.help = function() { + console.log('Usage: ' + path.relative(process.cwd(), path.join(ROOT, 'cordova', 'run')) + ' [options]'); + console.log('Build options :'); + console.log(' --debug : Builds project in debug mode'); + console.log(' --release : Builds project in release mode'); + console.log(' --nobuild : Runs the currently built project without recompiling'); + console.log('Deploy options :'); + console.log(' --device : Will deploy the built project to a device'); + console.log(' --emulator : Will deploy the built project to an emulator if one exists'); + console.log(' --target= : Installs to the target with the specified id.'); + process.exit(0); +} diff --git a/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/lib/start-emulator b/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/lib/start-emulator new file mode 100755 index 000000000..5d6c4dd9e --- /dev/null +++ b/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/lib/start-emulator @@ -0,0 +1,38 @@ +#!/usr/bin/env node + +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ + +var emulator = require('./emulator'), + args = process.argv; + +if(args.length > 2) { + var install_target; + if (args[2].substring(0, 9) == '--target=') { + install_target = args[2].substring(9, args[2].length); + emulator.start(install_target); + process.exit(0); + } else { + console.error('ERROR : argument \'' + args[2] + '\' not recognized.'); + process.exit(2); + } +} else { + emulator.start(); + process.exit(0); +} diff --git a/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/log b/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/log new file mode 100755 index 000000000..087325f8d --- /dev/null +++ b/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/log @@ -0,0 +1,33 @@ +#!/usr/bin/env node + +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ + +var log = require('./lib/log'), + reqs = require('./lib/check_reqs'), + args = process.argv; + +// Usage support for when args are given +if(args.length > 2) { + log.help(); +} else if(reqs.run()) { + log.run(); +} else { + process.exit(2); +} diff --git a/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/run b/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/run new file mode 100755 index 000000000..57d73459b --- /dev/null +++ b/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/run @@ -0,0 +1,35 @@ +#!/usr/bin/env node + +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ + +var run = require('./lib/run'), + reqs = require('./lib/check_reqs'), + args = process.argv; + +// Support basic help commands +if (args[2] == '--help' || args[2] == '/?' || args[2] == '-h' || + args[2] == 'help' || args[2] == '-help' || args[2] == '/help') { + run.help(); +} else if(reqs.run()) { + run.run(args); + process.exit(0); +} else { + process.exit(2); +} diff --git a/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/version b/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/version new file mode 100755 index 000000000..de1a76dd4 --- /dev/null +++ b/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/version @@ -0,0 +1,25 @@ +#!/usr/bin/env node + +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ + +// Coho updates this line: +var VERSION = "3.1.0"; + +console.log(VERSION); diff --git a/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/local.properties b/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/local.properties new file mode 100644 index 000000000..d3f507212 --- /dev/null +++ b/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/local.properties @@ -0,0 +1,10 @@ +# This file is automatically generated by Android Tools. +# Do not modify this file -- YOUR CHANGES WILL BE ERASED! +# +# This file must *NOT* be checked into Version Control Systems, +# as it contains information specific to your local configuration. + +# location of the SDK. This is only used by Ant +# For customization when using a Version Control System, please read the +# header note. +sdk.dir=/Users/braden/cordova/android/android-sdk-macosx diff --git a/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/proguard-project.txt b/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/proguard-project.txt new file mode 100644 index 000000000..f2fe1559a --- /dev/null +++ b/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/proguard-project.txt @@ -0,0 +1,20 @@ +# To enable ProGuard in your project, edit project.properties +# to define the proguard.config property as described in that file. +# +# Add project specific ProGuard rules here. +# By default, the flags in this file are appended to flags specified +# in ${sdk.dir}/tools/proguard/proguard-android.txt +# You can edit the include path and order by changing the ProGuard +# include property in project.properties. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# Add any project specific keep options here: + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} diff --git a/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/project.properties b/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/project.properties new file mode 100644 index 000000000..a3ee5ab64 --- /dev/null +++ b/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/project.properties @@ -0,0 +1,14 @@ +# This file is automatically generated by Android Tools. +# Do not modify this file -- YOUR CHANGES WILL BE ERASED! +# +# This file must be checked in Version Control Systems. +# +# To customize properties used by the Ant build system edit +# "ant.properties", and override values to adapt the script to your +# project structure. +# +# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home): +#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt + +# Project target. +target=android-17 diff --git a/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/res/drawable-hdpi/icon.png b/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/res/drawable-hdpi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..4d27634485b3a20d8a0188107e84812f4f71084b GIT binary patch literal 6080 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 literal 0 HcmV?d00001 diff --git a/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/res/drawable-ldpi/icon.png b/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/res/drawable-ldpi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..cd5032a4f2e0b734d4bdece13564c4b55de963a6 GIT binary patch literal 3096 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 literal 0 HcmV?d00001 diff --git a/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/res/drawable-mdpi/icon.png b/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/res/drawable-mdpi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..e79c6062c1dcd9e98f092dbd7e51b5b76dd897d2 GIT binary patch literal 4090 zcmbVPc{tST+aFu@;zT4g#*%EaV3;u+!`Mzn_UsvBVk|S5!B~_j7;l{r=;LH#ITf$8Q3N;YtM*yH*$u0z-kvGnbU{1if2KhcGpa1|CccP^Y z)dp*f#FM?1a7QvqG;bdU8UR53PV>RxJqc8x3&D*@(gdxyc7lLJS543*RV)PSqf2ln z8V36jEP_oe@xh*Wge&NGEg*`9WGL_^P;o$-w-lLIqM*kmM3`!H^PNn)F!QjBaK&3!sC9Yn3zz`T122*56C{lt*R2)r_M3MZZ z0YjkR{fItPBAEm{(ui{*`%^VR3{U?K!P^Im{f}Z2<)1_`QU<2se85m82-w^ED6YSx zDO7X9|GM$7(iF=e9|G8%Kq344;TiR~BKZr<$lZT8bR@{|26@qs$S4ZV3q!{HdlN`h zBa9}9aiio)bVXv&`cQ74g4#^NaDYE0K@3R z(7F(~vMLPr?~(tFb^ZTj4a{%`eAFKQr(J%r7(IA&{7>^Ui2sZafy9^@KgMuyk7$$v z06elr7_=pAa?CCyPRvd4cgoq2+`U1qTV4fl=zWQ?aaQ>PU{W%NqIA47f8pHO$bxTf zWheL=Y~(8S(F(swa7>DLX4WS;cY_S;i9Bzm)&geNC#I)cch{~C)6+Y@45_KrQI=<> zdk#lAWAC*y=;h5lI;DeLU~^Y*eM$2Dq3*=?XB35bu_NLO=*+r$SM$!^(E4PE?2T9P zLF}s7J*KKgOPAfX=^e`2^G7fsA4d=L3UlqKS&zyPa;Z_$sj!G&;o{uZegH2=P}|4` zQwKZYT8z+Iv_ylD#>B2i_(e?E@gPC-x5q`9outoj-n_V=H|qia;MCLWdywMRI1u4| z2Cy{THg%)*&aUvLSYPjYW)Jq}S)H4tSclzUNMcc8cCJ%6s_8YQAO32EKe2i3nfysL zVIHpi+w2o9`L`cf{|UPt;if~A5#{m*X?35A!Ns|Ss&88K?PjH_SMx6Kzd5tu48bt% zdu!W{fgfL$XY<0GGa?-ItNuO&p=%ZkKvJVC7o|5m&FGhzgvVn83+vZaaj z77vg|lBS~4jHP-K{Dp7X*%rqpqYN(}E*L$ql*>ZVjb%Qr|NM4N^XH$lW^M)=Yuz?a ziX8HRhhc~3W(!~J1Z*~Pn^epyr#yU@z_c2pOsYlXJK8whS9{oo&9pA2USa9aDu^*Q z9)4wztR?jfQ~0ulv$ZvFWaJI&Q;?aA#m^DQ;+=w8TPfTq}+m*gDcX#N7vMFzeG+JzHRc5J1#>;J&FS3FEPB3 zvG#LLtDp3~tXNtq2WOVIaoH&(Du=eO-q0XZW~z{?@kw1d|AbEel=P-#irN7QVjM+jvjzA;gZc61{?Ra`s-{j(aTRP9&Z- zGi}pLPWtvCz-WI!ANPH?fr(bivvA!jlB?n^hF6wJj%Badk8N4bD#cdL>dx4M7|*0X z1g#QrOCGG}?9D!OpFP|c5lmpiNX%b4*Yxv;<*1I#2^0Gh-_Cc|w&<(H>TlG-yB^EL z1L_2JtkebW3vZlF(wAkPkHbhR3MA+OvZ^gnbI+vr(totHuKdo@_;J6u(+u=hF40Aa zCbx5%Eb&!jL!xgqsqNa*C;xt-1j9n6u3o-o$09S6WWE?(!I3iS@<%{skJoqQK&JYx z-@=?NZZv#hqZGHdCxu-*1PP|ZPfpogXA%$M*m68~ay(VIziqBWU8u5nNg&C@c$Acq zc8)_gBQBDK@8ms0Jc?WPysF<+Wp;v!u{DYsl1NH;m_e7#Lk*As?L0G@ghu}Mr7+rd^sZns#=dnMlx z%6haFDn=yo_a_7IWPYH_DcrAFt3Nqf_r+4_gS)r)(8Jrj+P&=u2L~O*uVOr<<)NAP zxrb|9Rt0Yw4gsDir#TzmOSFZ@D94?*C{+oU7FYh*DY=-YcLTcs)jW01qN}$a7fl^d z4s~8vdZiuu!qwzYP;HK*@Y{E`mpQtBnDx1}^UuXE)|5i>Y#wmHX5s;J1rLgt)+J~* z!c6KJG4!8UqM^D#(bLsqLs+b2QDuFGdr8iq+&!-NXy^EPugGt>PoGx#9EjBcHr>Q3 zGY!qP3E!w895SAFGh*>-(V6%PzcjP30EBiTolDfL{gVk7KfKNqTyI@0+gGFXt)<7Jt4^wFE(ldH{;07@su72t|lPNM0 z^h{Tw4Z?d?6#YYE(1GX~8^OjECA3lYSu=($@v?E{D`fR$tQ3*mE=5;(wx%^1R{GfN z8GP>f&5x^ZqKf#1_^Fxb;g%4N3!|`ye$#qF0e4%0kF9vN}WKRpg_>yL^TfoX9zz7|&y=l)1&{IwyxR z5i@r)0(jokhdA3s_9b2=2`U`MQY1LUSMCFG{HEtWd=Z$}VfW{)+2AxiCgurGZ?sU% z%lFucEMaE1X@V!o3Y|&yZ*kV<1`Vn{&C(&jJ-ot2)wzP+v=%IIo~+5R=}7}fUXZh> zIwc$RDZ5y_9{>v0GLW(39GH2^cV3M?#3k!n$FJ~yB+`wTkapFAKuot>(MFpQLJ_@IVg6pa++M9$h>jpu~f&y9)96mKEWoQ z;o3li-I&z&X5gew0Xf)mUq$C+peE9P`2y<=O9ac}WWJM*2oA zm`CrrTO_VFCRR4+vs{^&Sorachh>ip;*}FT8V3tzyEVUFG^-yBu{L+badMt`^R8=e zVKc*hp! z2YZhn?~iRR=3d)L24A*o^7|Y!$FA|zyPo2xaO!P%-lgU63qg8^Ls5^bX_J-Vl%bqu zI4&$KjK!gBaB$G_o%psz%gc6$fT+Mp7hPT5FLEO2s;wQ7Ad18i-owLVoS=<$14j!W zWaF&HctWO3NC(`^^AE0%JC+MR`a=-vx1>;6dk zm2rLU@7bxt%jW2b-X}w?pvh>1VG(wnEq3s|I}s5Pn=>;r_NGeVoC-9FXiAeH`$mR+ zM(!})K{U0NG~IGXXWWDBrAj9_Wky;quR!Xz_>K2tmS&$uU~m*_Cq7vWTd|Y1MR`;+YshYoBbT7wbR=?)tQT6s-QkHI7FJ3yq$lHf5|(|RHjKi+DI7tGDfQ-OS)))F`yr7%IhyS$#slD7Nf eTI2Uz01KeUnH^M8$gFYn8aL82!BpuuNB$2fN-7Zm literal 0 HcmV?d00001 diff --git a/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/res/drawable-xhdpi/icon.png b/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/res/drawable-xhdpi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..ec7ffbfbdafc58df28e6e89041ee21acd0f6177e GIT binary patch literal 7685 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 literal 0 HcmV?d00001 diff --git a/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/res/drawable/icon.png b/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/res/drawable/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..ec7ffbfbdafc58df28e6e89041ee21acd0f6177e GIT binary patch literal 7685 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 literal 0 HcmV?d00001 diff --git a/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/res/values/strings.xml b/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/res/values/strings.xml new file mode 100644 index 000000000..1e706b395 --- /dev/null +++ b/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/res/values/strings.xml @@ -0,0 +1,4 @@ + + + TestBase + diff --git a/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/res/xml/config.xml b/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/res/xml/config.xml new file mode 100644 index 000000000..17ca23749 --- /dev/null +++ b/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/res/xml/config.xml @@ -0,0 +1,18 @@ + + + Hello Cordova + + A sample Apache Cordova application that responds to the deviceready event. + + + + + + + + Apache Cordova Team + + + + + diff --git a/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/src/org/testing/TestBase.java b/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/src/org/testing/TestBase.java new file mode 100644 index 000000000..928e074c2 --- /dev/null +++ b/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/src/org/testing/TestBase.java @@ -0,0 +1,37 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. + */ + +package org.testing; + +import android.os.Bundle; +import org.apache.cordova.*; + +public class TestBase extends CordovaActivity +{ + @Override + public void onCreate(Bundle savedInstanceState) + { + super.onCreate(savedInstanceState); + super.init(); + // Set by in config.xml + super.loadUrl(Config.getStartUrl()); + //super.loadUrl("file:///android_asset/www/index.html") + } +} + diff --git a/cordova-lib/spec-cordova-plugins/fixtures/plugins/ChildBrowser/plugin.xml b/cordova-lib/spec-cordova-plugins/fixtures/plugins/ChildBrowser/plugin.xml new file mode 100644 index 000000000..11ddd86d3 --- /dev/null +++ b/cordova-lib/spec-cordova-plugins/fixtures/plugins/ChildBrowser/plugin.xml @@ -0,0 +1,126 @@ + + + + + + Child Browser + + + + + + + + + + + + + + No matter what platform you are installing to, this notice is very important. + + + + + + + + + + + + + + + + + + + + + + Please make sure you read this because it is very important to complete the installation of your plugin. + + + + + + + + + + + + + + + $APP_ID + + + + + + PackageName + $PACKAGE_NAME + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cordova-lib/spec-cordova-plugins/fixtures/plugins/ChildBrowser/src/android/ChildBrowser.java b/cordova-lib/spec-cordova-plugins/fixtures/plugins/ChildBrowser/src/android/ChildBrowser.java new file mode 100644 index 000000000..5263b0c5d --- /dev/null +++ b/cordova-lib/spec-cordova-plugins/fixtures/plugins/ChildBrowser/src/android/ChildBrowser.java @@ -0,0 +1,19 @@ +/* + * + * Copyright 2013 Anis Kadri + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + diff --git a/cordova-lib/spec-cordova-plugins/fixtures/plugins/ChildBrowser/www/childbrowser.js b/cordova-lib/spec-cordova-plugins/fixtures/plugins/ChildBrowser/www/childbrowser.js new file mode 100644 index 000000000..5263b0c5d --- /dev/null +++ b/cordova-lib/spec-cordova-plugins/fixtures/plugins/ChildBrowser/www/childbrowser.js @@ -0,0 +1,19 @@ +/* + * + * Copyright 2013 Anis Kadri + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + diff --git a/cordova-lib/spec-cordova-plugins/fixtures/plugins/ChildBrowser/www/childbrowser/image.jpg b/cordova-lib/spec-cordova-plugins/fixtures/plugins/ChildBrowser/www/childbrowser/image.jpg new file mode 100644 index 000000000..257cc5642 --- /dev/null +++ b/cordova-lib/spec-cordova-plugins/fixtures/plugins/ChildBrowser/www/childbrowser/image.jpg @@ -0,0 +1 @@ +foo diff --git a/cordova-lib/spec-cordova-plugins/fixtures/plugins/ChildBrowser/www/childbrowser_file.html b/cordova-lib/spec-cordova-plugins/fixtures/plugins/ChildBrowser/www/childbrowser_file.html new file mode 100644 index 000000000..6de7b8c69 --- /dev/null +++ b/cordova-lib/spec-cordova-plugins/fixtures/plugins/ChildBrowser/www/childbrowser_file.html @@ -0,0 +1 @@ +This is a test file. diff --git a/cordova-lib/spec-cordova-plugins/fixtures/plugins/android/plugin.xml b/cordova-lib/spec-cordova-plugins/fixtures/plugins/android/plugin.xml new file mode 100644 index 000000000..d8f561906 --- /dev/null +++ b/cordova-lib/spec-cordova-plugins/fixtures/plugins/android/plugin.xml @@ -0,0 +1,14 @@ + + + + Android Plugin + + + + + + + diff --git a/cordova-lib/spec-cordova-plugins/fixtures/plugins/android/src/android/Android.java b/cordova-lib/spec-cordova-plugins/fixtures/plugins/android/src/android/Android.java new file mode 100644 index 000000000..e69de29bb diff --git a/cordova-lib/spec-cordova-plugins/fixtures/plugins/android/src/android/SomethingWithR.java b/cordova-lib/spec-cordova-plugins/fixtures/plugins/android/src/android/SomethingWithR.java new file mode 100644 index 000000000..c3af060d9 --- /dev/null +++ b/cordova-lib/spec-cordova-plugins/fixtures/plugins/android/src/android/SomethingWithR.java @@ -0,0 +1,6 @@ +import com.yourapp.R; + +import android.app.*; + +public class SomethingWithR { +} diff --git a/cordova-lib/spec-cordova-plugins/fixtures/plugins/android/www/android.js b/cordova-lib/spec-cordova-plugins/fixtures/plugins/android/www/android.js new file mode 100644 index 000000000..e69de29bb diff --git a/cordova-lib/spec-cordova-plugins/fixtures/plugins/fake1/plugin.xml b/cordova-lib/spec-cordova-plugins/fixtures/plugins/fake1/plugin.xml new file mode 100644 index 000000000..ffdc650ad --- /dev/null +++ b/cordova-lib/spec-cordova-plugins/fixtures/plugins/fake1/plugin.xml @@ -0,0 +1,10 @@ + + + + Fake1 + Cordova fake plugin for tests + Apache 2.0 + cordova,cli,test + diff --git a/cordova-lib/spec-cordova-plugins/fixtures/plugins/test/plugin.xml b/cordova-lib/spec-cordova-plugins/fixtures/plugins/test/plugin.xml new file mode 100644 index 000000000..774eda1de --- /dev/null +++ b/cordova-lib/spec-cordova-plugins/fixtures/plugins/test/plugin.xml @@ -0,0 +1,14 @@ + + + + Test Plugin + + + + + + + diff --git a/cordova-lib/spec-cordova-plugins/fixtures/plugins/test/www/test.js b/cordova-lib/spec-cordova-plugins/fixtures/plugins/test/www/test.js new file mode 100644 index 000000000..e69de29bb diff --git a/cordova-lib/spec-cordova-plugins/fixtures/projects/android/AndroidManifest.xml b/cordova-lib/spec-cordova-plugins/fixtures/projects/android/AndroidManifest.xml new file mode 100644 index 000000000..0c528031c --- /dev/null +++ b/cordova-lib/spec-cordova-plugins/fixtures/projects/android/AndroidManifest.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cordova-lib/spec-cordova-plugins/fixtures/projects/android/assets/www/.gitkeep b/cordova-lib/spec-cordova-plugins/fixtures/projects/android/assets/www/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/cordova-lib/spec-cordova-plugins/fixtures/projects/android/res/xml/config.xml b/cordova-lib/spec-cordova-plugins/fixtures/projects/android/res/xml/config.xml new file mode 100644 index 000000000..d37aba5cd --- /dev/null +++ b/cordova-lib/spec-cordova-plugins/fixtures/projects/android/res/xml/config.xml @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cordova-lib/spec-cordova-plugins/fixtures/projects/android/src/.gitkeep b/cordova-lib/spec-cordova-plugins/fixtures/projects/android/src/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/cordova-lib/spec-cordova-plugins/fixtures/projects/windows/bom_test.xml b/cordova-lib/spec-cordova-plugins/fixtures/projects/windows/bom_test.xml new file mode 100644 index 000000000..57cadf65d --- /dev/null +++ b/cordova-lib/spec-cordova-plugins/fixtures/projects/windows/bom_test.xml @@ -0,0 +1,24 @@ + + + + + diff --git a/cordova-lib/spec-cordova-plugins/fixtures/templates/no_content_config.xml b/cordova-lib/spec-cordova-plugins/fixtures/templates/no_content_config.xml new file mode 100644 index 000000000..7c4ef3d2c --- /dev/null +++ b/cordova-lib/spec-cordova-plugins/fixtures/templates/no_content_config.xml @@ -0,0 +1,19 @@ + + + Hello Cordova + + + A sample Apache Cordova application that responds to the deviceready event. + + + + Apache Cordova Team + + + + + + diff --git a/cordova-lib/spec-cordova-plugins/helpers.js b/cordova-lib/spec-cordova-plugins/helpers.js new file mode 100644 index 000000000..3db75d5c9 --- /dev/null +++ b/cordova-lib/spec-cordova-plugins/helpers.js @@ -0,0 +1,64 @@ +/** + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ + +var path = require('path'), + fs = require('fs'), + shell = require('shelljs'), + os = require('os'); + +module.exports.tmpDir = function(subdir) { + var dir = path.join(os.tmpdir(), 'e2e-test'); + if (subdir) { + dir = path.join(dir, subdir); + } + shell.mkdir('-p', dir); + return dir; +}; + +// Returns the platform that should be used for testing on this host platform. +/* +var host = os.platform(); +if (host.match(/win/)) { + module.exports.testPlatform = 'wp8'; +} else if (host.match(/darwin/)) { + module.exports.testPlatform = 'ios'; +} else { + module.exports.testPlatform = 'android'; +} +*/ + +// Just use Android everywhere; we're mocking out any calls to the `android` binary. +module.exports.testPlatform = 'android'; + +// Add the toExist matcher. +beforeEach(function() { + this.addMatchers({ + 'toExist': function() { + var notText = this.isNot ? ' not' : ''; + var self = this; + + this.message = function() { + return 'Expected file ' + self.actual + notText + ' to exist.'; + }; + + return fs.existsSync(this.actual); + } + }); +}); + diff --git a/cordova-lib/spec-cordova/plugin.spec.js b/cordova-lib/spec-cordova-plugins/plugin.spec.js similarity index 100% rename from cordova-lib/spec-cordova/plugin.spec.js rename to cordova-lib/spec-cordova-plugins/plugin.spec.js diff --git a/cordova-lib/spec-cordova/plugin_parser.spec.js b/cordova-lib/spec-cordova-plugins/plugin_parser.spec.js similarity index 96% rename from cordova-lib/spec-cordova/plugin_parser.spec.js rename to cordova-lib/spec-cordova-plugins/plugin_parser.spec.js index 241310653..8776536b8 100644 --- a/cordova-lib/spec-cordova/plugin_parser.spec.js +++ b/cordova-lib/spec-cordova-plugins/plugin_parser.spec.js @@ -19,7 +19,7 @@ var cordova = require('../src/cordova/cordova'), path = require('path'), fs = require('fs'), - plugin_parser = require('../src/cordova/plugin_parser'), + plugin_parser = require('../src/cordova/plugins/plugin_parser'), et = require('elementtree'), xml = path.join(__dirname, 'fixtures', 'plugins', 'test', 'plugin.xml'); diff --git a/cordova-lib/src/cordova/cordova.js b/cordova-lib/src/cordova/cordova.js index db689df79..5f3958f2d 100644 --- a/cordova-lib/src/cordova/cordova.js +++ b/cordova-lib/src/cordova/cordova.js @@ -63,8 +63,8 @@ addModuleProperty(module, 'help', './help'); addModuleProperty(module, 'config', './config'); addModuleProperty(module, 'create', './project/create', true); addModuleProperty(module, 'emulate', './project/emulate', true); -addModuleProperty(module, 'plugin', './plugin', true); -addModuleProperty(module, 'plugins', './plugin', true); +addModuleProperty(module, 'plugin', './plugins/plugin', true); +addModuleProperty(module, 'plugins', './plugins/plugin', true); addModuleProperty(module, 'serve', './server/serve'); addModuleProperty(module, 'platform', './platform', true); addModuleProperty(module, 'platforms', './platform', true); diff --git a/cordova-lib/src/cordova/plugin.js b/cordova-lib/src/cordova/plugins/plugin.js similarity index 95% rename from cordova-lib/src/cordova/plugin.js rename to cordova-lib/src/cordova/plugins/plugin.js index 2c53db974..283e0b89c 100644 --- a/cordova-lib/src/cordova/plugin.js +++ b/cordova-lib/src/cordova/plugins/plugin.js @@ -21,18 +21,18 @@ indent:4, unused:vars, latedef:nofunc */ -var cordova_util = require('./project/util'), +var cordova_util = require('../project/util'), path = require('path'), semver = require('semver'), - hooker = require('./hooker'), - config = require('./config'), + hooker = require('../hooker'), + config = require('../config'), Q = require('q'), - CordovaError = require('../CordovaError'), - ConfigParser = require('../configparser/ConfigParser'), + CordovaError = require('../../CordovaError'), + ConfigParser = require('../../configparser/ConfigParser'), fs = require('fs'), - PluginInfo = require('../PluginInfo'), - plugman = require('../plugman/plugman'), - events = require('../events'); + PluginInfo = require('../../PluginInfo'), + plugman = require('../../plugman/plugman'), + events = require('../../events'); // Returns a promise. module.exports = function plugin(command, targets, opts) { @@ -170,7 +170,7 @@ module.exports = function plugin(command, targets, opts) { // If this is a web-only or dependency-only plugin, then // there may be nothing to do here except remove the // reference from the platform's plugin config JSON. - var plugman = require('../plugman/plugman'); + var plugman = require('../../plugman/plugman'); return platformList.reduce(function(soFar, platform) { return soFar.then(function() { var platformRoot = path.join(projectRoot, 'platforms', platform); @@ -197,7 +197,7 @@ module.exports = function plugin(command, targets, opts) { case 'search': return hooks.fire('before_plugin_search') .then(function() { - var plugman = require('../plugman/plugman'); + var plugman = require('../../plugman/plugman'); return plugman.raw.search(opts.plugins); }).then(function(plugins) { for(var plugin in plugins) { diff --git a/cordova-lib/src/cordova/plugin_parser.js b/cordova-lib/src/cordova/plugins/plugin_parser.js similarity index 96% rename from cordova-lib/src/cordova/plugin_parser.js rename to cordova-lib/src/cordova/plugins/plugin_parser.js index 38eaebc6e..a38983e95 100644 --- a/cordova-lib/src/cordova/plugin_parser.js +++ b/cordova-lib/src/cordova/plugins/plugin_parser.js @@ -21,7 +21,7 @@ indent:4, unused:vars, latedef:nofunc */ -var xml = require('../util/xml-helpers'); +var xml = require('../../util/xml-helpers'); function plugin_parser(xmlPath) { this.path = xmlPath; diff --git a/cordova-lib/src/cordova/project/restore.js b/cordova-lib/src/cordova/project/restore.js index 0760b9bf8..1e3b0224e 100644 --- a/cordova-lib/src/cordova/project/restore.js +++ b/cordova-lib/src/cordova/project/restore.js @@ -26,7 +26,7 @@ var cordova_util = require('./util'), path = require('path'), Q = require('q'), fs = require('fs'), - plugin = require('../plugin'), + plugin = require('../plugins/plugin'), events = require('../../events'); module.exports = restore; From 25655feb10db9564e5b9baf1f3724b9f7152021c Mon Sep 17 00:00:00 2001 From: Suraj Pindoria Date: Tue, 15 Jul 2014 17:20:06 -0700 Subject: [PATCH 14/16] Created Cordova "misc" submodule --- cordova-lib/spec-cordova-build/build.spec.js | 2 +- .../spec-cordova-build/compile.spec.js | 2 +- .../spec-cordova-build/prepare.spec.js | 4 +- .../fixtures/base/.cordova/config.json | 22 + .../fixtures/base/merges/.svn | 0 .../fixtures/base/plugins/.svn | 0 .../fixtures/base/www/config.xml | 14 + .../fixtures/base/www/css/index.css | 115 ++ .../fixtures/base/www/img/logo.png | Bin 0 -> 21814 bytes .../fixtures/base/www/index.html | 43 + .../fixtures/base/www/js/index.js | 49 + .../fixtures/base/www/spec.html | 68 + .../fixtures/hooks_bat/fail/fail.bat | 2 + .../fixtures/hooks_bat/test/.dotted.bat | 2 + .../fixtures/hooks_bat/test/07.bat | 3 + .../fixtures/hooks_bat/test/1.bat | 5 + .../fixtures/hooks_sh/fail/fail.sh | 1 + .../fixtures/hooks_sh/test/.dotted.sh | 1 + .../fixtures/hooks_sh/test/07.sh | 2 + .../fixtures/hooks_sh/test/1.sh | 4 + .../fixtures/platforms/android-lib/VERSION | 1 + .../framework/assets/www/cordova.js | 1 + .../platforms/android/AndroidManifest.xml | 14 + .../platforms/android/assets/www/config.xml | 14 + .../platforms/android/assets/www/cordova.js | 1712 +++++++++++++++++ .../android/assets/www/cordova_plugins.js | 3 + .../android/assets/www/css/index.css | 115 ++ .../platforms/android/assets/www/img/logo.png | Bin 0 -> 21814 bytes .../platforms/android/assets/www/index.html | 43 + .../platforms/android/assets/www/js/index.js | 49 + .../platforms/android/assets/www/spec.html | 68 + .../fixtures/platforms/android/build.xml | 92 + .../fixtures/platforms/android/cordova/build | 35 + .../platforms/android/cordova/check_reqs | 27 + .../fixtures/platforms/android/cordova/clean | 34 + .../platforms/android/cordova/defaults.xml | 50 + .../platforms/android/cordova/lib/appinfo.js | 41 + .../platforms/android/cordova/lib/build.js | 89 + .../android/cordova/lib/check_reqs.js | 78 + .../platforms/android/cordova/lib/clean.js | 43 + .../platforms/android/cordova/lib/device.js | 95 + .../platforms/android/cordova/lib/emulator.js | 337 ++++ .../android/cordova/lib/install-device | 38 + .../android/cordova/lib/install-emulator | 38 + .../android/cordova/lib/list-devices | 28 + .../android/cordova/lib/list-emulator-images | 29 + .../cordova/lib/list-started-emulators | 29 + .../platforms/android/cordova/lib/log.js | 43 + .../platforms/android/cordova/lib/run.js | 124 ++ .../android/cordova/lib/start-emulator | 38 + .../fixtures/platforms/android/cordova/log | 33 + .../fixtures/platforms/android/cordova/run | 35 + .../platforms/android/cordova/version | 25 + .../platforms/android/local.properties | 10 + .../platforms/android/proguard-project.txt | 20 + .../platforms/android/project.properties | 14 + .../android/res/drawable-hdpi/icon.png | Bin 0 -> 6080 bytes .../android/res/drawable-ldpi/icon.png | Bin 0 -> 3096 bytes .../android/res/drawable-mdpi/icon.png | Bin 0 -> 4090 bytes .../android/res/drawable-xhdpi/icon.png | Bin 0 -> 7685 bytes .../platforms/android/res/drawable/icon.png | Bin 0 -> 7685 bytes .../platforms/android/res/values/strings.xml | 4 + .../platforms/android/res/xml/config.xml | 18 + .../android/src/org/testing/TestBase.java | 37 + .../fixtures/plugins/ChildBrowser/plugin.xml | 126 ++ .../src/android/ChildBrowser.java | 19 + .../plugins/ChildBrowser/www/childbrowser.js | 19 + .../ChildBrowser/www/childbrowser/image.jpg | 1 + .../ChildBrowser/www/childbrowser_file.html | 1 + .../fixtures/plugins/android/plugin.xml | 14 + .../plugins/android/src/android/Android.java | 0 .../android/src/android/SomethingWithR.java | 6 + .../fixtures/plugins/android/www/android.js | 0 .../fixtures/plugins/fake1/plugin.xml | 10 + .../fixtures/plugins/test/plugin.xml | 14 + .../fixtures/plugins/test/www/test.js | 0 .../projects/android/AndroidManifest.xml | 69 + .../projects/android/assets/www/.gitkeep | 0 .../projects/android/res/xml/config.xml | 54 + .../fixtures/projects/android/src/.gitkeep | 0 .../fixtures/projects/windows/bom_test.xml | 24 + .../fixtures/templates/no_content_config.xml | 19 + cordova-lib/spec-cordova-misc/helpers.js | 64 + .../hooker.spec.js | 2 +- .../lazy_load.spec.js | 4 +- .../spec-cordova-project/emulate.spec.js | 2 +- cordova-lib/spec-cordova-project/run.spec.js | 2 +- cordova-lib/spec-cordova-server/serve.spec.js | 2 +- cordova-lib/src/cordova/build/build.js | 2 +- cordova-lib/src/cordova/build/compile.js | 2 +- cordova-lib/src/cordova/build/prepare.js | 2 +- cordova-lib/src/cordova/cordova.js | 2 +- .../cordova/metadata/blackberry10_parser.js | 2 +- .../src/cordova/metadata/windows_parser.js | 2 +- .../src/cordova/metadata/wp8_parser.js | 2 +- cordova-lib/src/cordova/{ => misc}/hooker.js | 10 +- .../src/cordova/{ => misc}/lazy_load.js | 8 +- cordova-lib/src/cordova/platform.js | 4 +- cordova-lib/src/cordova/plugins/plugin.js | 2 +- cordova-lib/src/cordova/project/create.js | 2 +- cordova-lib/src/cordova/project/emulate.js | 2 +- cordova-lib/src/cordova/{ => project}/info.js | 6 +- cordova-lib/src/cordova/project/run.js | 2 +- cordova-lib/src/cordova/server/serve.js | 2 +- 104 files changed, 4311 insertions(+), 36 deletions(-) create mode 100644 cordova-lib/spec-cordova-misc/fixtures/base/.cordova/config.json create mode 100644 cordova-lib/spec-cordova-misc/fixtures/base/merges/.svn create mode 100644 cordova-lib/spec-cordova-misc/fixtures/base/plugins/.svn create mode 100644 cordova-lib/spec-cordova-misc/fixtures/base/www/config.xml create mode 100644 cordova-lib/spec-cordova-misc/fixtures/base/www/css/index.css create mode 100644 cordova-lib/spec-cordova-misc/fixtures/base/www/img/logo.png create mode 100644 cordova-lib/spec-cordova-misc/fixtures/base/www/index.html create mode 100644 cordova-lib/spec-cordova-misc/fixtures/base/www/js/index.js create mode 100644 cordova-lib/spec-cordova-misc/fixtures/base/www/spec.html create mode 100644 cordova-lib/spec-cordova-misc/fixtures/hooks_bat/fail/fail.bat create mode 100644 cordova-lib/spec-cordova-misc/fixtures/hooks_bat/test/.dotted.bat create mode 100644 cordova-lib/spec-cordova-misc/fixtures/hooks_bat/test/07.bat create mode 100644 cordova-lib/spec-cordova-misc/fixtures/hooks_bat/test/1.bat create mode 100755 cordova-lib/spec-cordova-misc/fixtures/hooks_sh/fail/fail.sh create mode 100755 cordova-lib/spec-cordova-misc/fixtures/hooks_sh/test/.dotted.sh create mode 100755 cordova-lib/spec-cordova-misc/fixtures/hooks_sh/test/07.sh create mode 100755 cordova-lib/spec-cordova-misc/fixtures/hooks_sh/test/1.sh create mode 100644 cordova-lib/spec-cordova-misc/fixtures/platforms/android-lib/VERSION create mode 100644 cordova-lib/spec-cordova-misc/fixtures/platforms/android-lib/framework/assets/www/cordova.js create mode 100644 cordova-lib/spec-cordova-misc/fixtures/platforms/android/AndroidManifest.xml create mode 100644 cordova-lib/spec-cordova-misc/fixtures/platforms/android/assets/www/config.xml create mode 100644 cordova-lib/spec-cordova-misc/fixtures/platforms/android/assets/www/cordova.js create mode 100644 cordova-lib/spec-cordova-misc/fixtures/platforms/android/assets/www/cordova_plugins.js create mode 100644 cordova-lib/spec-cordova-misc/fixtures/platforms/android/assets/www/css/index.css create mode 100644 cordova-lib/spec-cordova-misc/fixtures/platforms/android/assets/www/img/logo.png create mode 100644 cordova-lib/spec-cordova-misc/fixtures/platforms/android/assets/www/index.html create mode 100644 cordova-lib/spec-cordova-misc/fixtures/platforms/android/assets/www/js/index.js create mode 100644 cordova-lib/spec-cordova-misc/fixtures/platforms/android/assets/www/spec.html create mode 100644 cordova-lib/spec-cordova-misc/fixtures/platforms/android/build.xml create mode 100755 cordova-lib/spec-cordova-misc/fixtures/platforms/android/cordova/build create mode 100755 cordova-lib/spec-cordova-misc/fixtures/platforms/android/cordova/check_reqs create mode 100755 cordova-lib/spec-cordova-misc/fixtures/platforms/android/cordova/clean create mode 100644 cordova-lib/spec-cordova-misc/fixtures/platforms/android/cordova/defaults.xml create mode 100755 cordova-lib/spec-cordova-misc/fixtures/platforms/android/cordova/lib/appinfo.js create mode 100755 cordova-lib/spec-cordova-misc/fixtures/platforms/android/cordova/lib/build.js create mode 100755 cordova-lib/spec-cordova-misc/fixtures/platforms/android/cordova/lib/check_reqs.js create mode 100755 cordova-lib/spec-cordova-misc/fixtures/platforms/android/cordova/lib/clean.js create mode 100755 cordova-lib/spec-cordova-misc/fixtures/platforms/android/cordova/lib/device.js create mode 100755 cordova-lib/spec-cordova-misc/fixtures/platforms/android/cordova/lib/emulator.js create mode 100755 cordova-lib/spec-cordova-misc/fixtures/platforms/android/cordova/lib/install-device create mode 100755 cordova-lib/spec-cordova-misc/fixtures/platforms/android/cordova/lib/install-emulator create mode 100755 cordova-lib/spec-cordova-misc/fixtures/platforms/android/cordova/lib/list-devices create mode 100755 cordova-lib/spec-cordova-misc/fixtures/platforms/android/cordova/lib/list-emulator-images create mode 100755 cordova-lib/spec-cordova-misc/fixtures/platforms/android/cordova/lib/list-started-emulators create mode 100755 cordova-lib/spec-cordova-misc/fixtures/platforms/android/cordova/lib/log.js create mode 100755 cordova-lib/spec-cordova-misc/fixtures/platforms/android/cordova/lib/run.js create mode 100755 cordova-lib/spec-cordova-misc/fixtures/platforms/android/cordova/lib/start-emulator create mode 100755 cordova-lib/spec-cordova-misc/fixtures/platforms/android/cordova/log create mode 100755 cordova-lib/spec-cordova-misc/fixtures/platforms/android/cordova/run create mode 100755 cordova-lib/spec-cordova-misc/fixtures/platforms/android/cordova/version create mode 100644 cordova-lib/spec-cordova-misc/fixtures/platforms/android/local.properties create mode 100644 cordova-lib/spec-cordova-misc/fixtures/platforms/android/proguard-project.txt create mode 100644 cordova-lib/spec-cordova-misc/fixtures/platforms/android/project.properties create mode 100644 cordova-lib/spec-cordova-misc/fixtures/platforms/android/res/drawable-hdpi/icon.png create mode 100644 cordova-lib/spec-cordova-misc/fixtures/platforms/android/res/drawable-ldpi/icon.png create mode 100644 cordova-lib/spec-cordova-misc/fixtures/platforms/android/res/drawable-mdpi/icon.png create mode 100644 cordova-lib/spec-cordova-misc/fixtures/platforms/android/res/drawable-xhdpi/icon.png create mode 100644 cordova-lib/spec-cordova-misc/fixtures/platforms/android/res/drawable/icon.png create mode 100644 cordova-lib/spec-cordova-misc/fixtures/platforms/android/res/values/strings.xml create mode 100644 cordova-lib/spec-cordova-misc/fixtures/platforms/android/res/xml/config.xml create mode 100644 cordova-lib/spec-cordova-misc/fixtures/platforms/android/src/org/testing/TestBase.java create mode 100644 cordova-lib/spec-cordova-misc/fixtures/plugins/ChildBrowser/plugin.xml create mode 100644 cordova-lib/spec-cordova-misc/fixtures/plugins/ChildBrowser/src/android/ChildBrowser.java create mode 100644 cordova-lib/spec-cordova-misc/fixtures/plugins/ChildBrowser/www/childbrowser.js create mode 100644 cordova-lib/spec-cordova-misc/fixtures/plugins/ChildBrowser/www/childbrowser/image.jpg create mode 100644 cordova-lib/spec-cordova-misc/fixtures/plugins/ChildBrowser/www/childbrowser_file.html create mode 100644 cordova-lib/spec-cordova-misc/fixtures/plugins/android/plugin.xml create mode 100644 cordova-lib/spec-cordova-misc/fixtures/plugins/android/src/android/Android.java create mode 100644 cordova-lib/spec-cordova-misc/fixtures/plugins/android/src/android/SomethingWithR.java create mode 100644 cordova-lib/spec-cordova-misc/fixtures/plugins/android/www/android.js create mode 100644 cordova-lib/spec-cordova-misc/fixtures/plugins/fake1/plugin.xml create mode 100644 cordova-lib/spec-cordova-misc/fixtures/plugins/test/plugin.xml create mode 100644 cordova-lib/spec-cordova-misc/fixtures/plugins/test/www/test.js create mode 100644 cordova-lib/spec-cordova-misc/fixtures/projects/android/AndroidManifest.xml create mode 100644 cordova-lib/spec-cordova-misc/fixtures/projects/android/assets/www/.gitkeep create mode 100644 cordova-lib/spec-cordova-misc/fixtures/projects/android/res/xml/config.xml create mode 100644 cordova-lib/spec-cordova-misc/fixtures/projects/android/src/.gitkeep create mode 100644 cordova-lib/spec-cordova-misc/fixtures/projects/windows/bom_test.xml create mode 100644 cordova-lib/spec-cordova-misc/fixtures/templates/no_content_config.xml create mode 100644 cordova-lib/spec-cordova-misc/helpers.js rename cordova-lib/{spec-cordova => spec-cordova-misc}/hooker.spec.js (99%) rename cordova-lib/{spec-cordova => spec-cordova-misc}/lazy_load.spec.js (99%) rename cordova-lib/src/cordova/{ => misc}/hooker.js (96%) rename cordova-lib/src/cordova/{ => misc}/lazy_load.js (98%) rename cordova-lib/src/cordova/{ => project}/info.js (96%) diff --git a/cordova-lib/spec-cordova-build/build.spec.js b/cordova-lib/spec-cordova-build/build.spec.js index 504bd58d6..82c4d922b 100644 --- a/cordova-lib/spec-cordova-build/build.spec.js +++ b/cordova-lib/spec-cordova-build/build.spec.js @@ -21,7 +21,7 @@ var cordova = require('../src/cordova/cordova'), shell = require('shelljs'), path = require('path'), fs = require('fs'), - hooker = require('../src/cordova/hooker'), + hooker = require('../src/cordova/misc/hooker'), Q = require('q'), util = require('../src/cordova/project/util'); diff --git a/cordova-lib/spec-cordova-build/compile.spec.js b/cordova-lib/spec-cordova-build/compile.spec.js index 5c37132e2..a20341ba6 100644 --- a/cordova-lib/spec-cordova-build/compile.spec.js +++ b/cordova-lib/spec-cordova-build/compile.spec.js @@ -20,7 +20,7 @@ var cordova = require('../src/cordova/cordova'), platforms = require('../src/cordova/platforms'), path = require('path'), fs = require('fs'), - hooker = require('../src/cordova/hooker'), + hooker = require('../src/cordova/misc/hooker'), superspawn = require('../src/cordova/server/superspawn'), util = require('../src/cordova/project/util'), Q = require('q'), diff --git a/cordova-lib/spec-cordova-build/prepare.spec.js b/cordova-lib/spec-cordova-build/prepare.spec.js index b87b0123f..77814f163 100644 --- a/cordova-lib/spec-cordova-build/prepare.spec.js +++ b/cordova-lib/spec-cordova-build/prepare.spec.js @@ -23,10 +23,10 @@ var cordova = require('../src/cordova/cordova'), fs = require('fs'), util = require('../src/cordova/project/util'), prepare = require('../src/cordova/build/prepare'), - lazy_load = require('../src/cordova/lazy_load'), + lazy_load = require('../src/cordova/misc/lazy_load'), ConfigParser = require('../src/configparser/ConfigParser'), platforms = require('../src/cordova/platforms'), - hooker = require('../src/cordova/hooker'), + hooker = require('../src/cordova/misc/hooker'), xmlHelpers = require('../src/util/xml-helpers'), fixtures = path.join(__dirname, 'fixtures'), et = require('elementtree'), diff --git a/cordova-lib/spec-cordova-misc/fixtures/base/.cordova/config.json b/cordova-lib/spec-cordova-misc/fixtures/base/.cordova/config.json new file mode 100644 index 000000000..4f52ca7f0 --- /dev/null +++ b/cordova-lib/spec-cordova-misc/fixtures/base/.cordova/config.json @@ -0,0 +1,22 @@ +{ + "id": "org.testing", + "name":"TestBase", + "lib": { + "android": { + "url": "/some/junk/path", + "version": "dev", + "id": "cordova-android-dev" + }, + "ios": { + "url": "/some/junk/path", + "version": "dev", + "id": "cordova-ios-dev" + }, + "wp8": { + "url": "/some/junk/path", + "version": "dev", + "id": "cordova-wp8-dev" + } + } +} + diff --git a/cordova-lib/spec-cordova-misc/fixtures/base/merges/.svn b/cordova-lib/spec-cordova-misc/fixtures/base/merges/.svn new file mode 100644 index 000000000..e69de29bb diff --git a/cordova-lib/spec-cordova-misc/fixtures/base/plugins/.svn b/cordova-lib/spec-cordova-misc/fixtures/base/plugins/.svn new file mode 100644 index 000000000..e69de29bb diff --git a/cordova-lib/spec-cordova-misc/fixtures/base/www/config.xml b/cordova-lib/spec-cordova-misc/fixtures/base/www/config.xml new file mode 100644 index 000000000..9e7b9e046 --- /dev/null +++ b/cordova-lib/spec-cordova-misc/fixtures/base/www/config.xml @@ -0,0 +1,14 @@ + + + TestBase + + A sample Apache Cordova application that responds to the deviceready event. + + + Apache Cordova Team + + + + + + diff --git a/cordova-lib/spec-cordova-misc/fixtures/base/www/css/index.css b/cordova-lib/spec-cordova-misc/fixtures/base/www/css/index.css new file mode 100644 index 000000000..51daa797c --- /dev/null +++ b/cordova-lib/spec-cordova-misc/fixtures/base/www/css/index.css @@ -0,0 +1,115 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +* { + -webkit-tap-highlight-color: rgba(0,0,0,0); /* make transparent link selection, adjust last value opacity 0 to 1.0 */ +} + +body { + -webkit-touch-callout: none; /* prevent callout to copy image, etc when tap to hold */ + -webkit-text-size-adjust: none; /* prevent webkit from resizing text to fit */ + -webkit-user-select: none; /* prevent copy paste, to allow, change 'none' to 'text' */ + background-color:#E4E4E4; + background-image:linear-gradient(top, #A7A7A7 0%, #E4E4E4 51%); + background-image:-webkit-linear-gradient(top, #A7A7A7 0%, #E4E4E4 51%); + background-image:-ms-linear-gradient(top, #A7A7A7 0%, #E4E4E4 51%); + background-image:-webkit-gradient( + linear, + left top, + left bottom, + color-stop(0, #A7A7A7), + color-stop(0.51, #E4E4E4) + ); + background-attachment:fixed; + font-family:'HelveticaNeue-Light', 'HelveticaNeue', Helvetica, Arial, sans-serif; + font-size:12px; + height:100%; + margin:0px; + padding:0px; + text-transform:uppercase; + width:100%; +} + +/* Portrait layout (default) */ +.app { + background:url(../img/logo.png) no-repeat center top; /* 170px x 200px */ + position:absolute; /* position in the center of the screen */ + left:50%; + top:50%; + height:50px; /* text area height */ + width:225px; /* text area width */ + text-align:center; + padding:180px 0px 0px 0px; /* image height is 200px (bottom 20px are overlapped with text) */ + margin:-115px 0px 0px -112px; /* offset vertical: half of image height and text area height */ + /* offset horizontal: half of text area width */ +} + +/* Landscape layout (with min-width) */ +@media screen and (min-aspect-ratio: 1/1) and (min-width:400px) { + .app { + background-position:left center; + padding:75px 0px 75px 170px; /* padding-top + padding-bottom + text area = image height */ + margin:-90px 0px 0px -198px; /* offset vertical: half of image height */ + /* offset horizontal: half of image width and text area width */ + } +} + +h1 { + font-size:24px; + font-weight:normal; + margin:0px; + overflow:visible; + padding:0px; + text-align:center; +} + +.event { + border-radius:4px; + -webkit-border-radius:4px; + color:#FFFFFF; + font-size:12px; + margin:0px 30px; + padding:2px 0px; +} + +.event.listening { + background-color:#333333; + display:block; +} + +.event.received { + background-color:#4B946A; + display:none; +} + +@keyframes fade { + from { opacity: 1.0; } + 50% { opacity: 0.4; } + to { opacity: 1.0; } +} + +@-webkit-keyframes fade { + from { opacity: 1.0; } + 50% { opacity: 0.4; } + to { opacity: 1.0; } +} + +.blink { + animation:fade 3000ms infinite; + -webkit-animation:fade 3000ms infinite; +} diff --git a/cordova-lib/spec-cordova-misc/fixtures/base/www/img/logo.png b/cordova-lib/spec-cordova-misc/fixtures/base/www/img/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..9519e7dd78adb6e44548c08510a7bf02442a7697 GIT binary patch literal 21814 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
Qfv&3%?A-1S}IU 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 + + + + + + + + + Hello World + + +
+

Apache Cordova

+ +
+ + + + + diff --git a/cordova-lib/spec-cordova-misc/fixtures/base/www/js/index.js b/cordova-lib/spec-cordova-misc/fixtures/base/www/js/index.js new file mode 100644 index 000000000..31d9064eb --- /dev/null +++ b/cordova-lib/spec-cordova-misc/fixtures/base/www/js/index.js @@ -0,0 +1,49 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +var app = { + // Application Constructor + initialize: function() { + this.bindEvents(); + }, + // Bind Event Listeners + // + // Bind any events that are required on startup. Common events are: + // 'load', 'deviceready', 'offline', and 'online'. + bindEvents: function() { + document.addEventListener('deviceready', this.onDeviceReady, false); + }, + // deviceready Event Handler + // + // The scope of 'this' is the event. In order to call the 'receivedEvent' + // function, we must explicity call 'app.receivedEvent(...);' + onDeviceReady: function() { + app.receivedEvent('deviceready'); + }, + // Update DOM on a Received Event + receivedEvent: function(id) { + var parentElement = document.getElementById(id); + var listeningElement = parentElement.querySelector('.listening'); + var receivedElement = parentElement.querySelector('.received'); + + listeningElement.setAttribute('style', 'display:none;'); + receivedElement.setAttribute('style', 'display:block;'); + + console.log('Received Event: ' + id); + } +}; diff --git a/cordova-lib/spec-cordova-misc/fixtures/base/www/spec.html b/cordova-lib/spec-cordova-misc/fixtures/base/www/spec.html new file mode 100644 index 000000000..71f00de05 --- /dev/null +++ b/cordova-lib/spec-cordova-misc/fixtures/base/www/spec.html @@ -0,0 +1,68 @@ + + + + + Jasmine Spec Runner + + + + + + + + + + + + + + + + + + + + diff --git a/cordova-lib/spec-cordova-misc/fixtures/hooks_bat/fail/fail.bat b/cordova-lib/spec-cordova-misc/fixtures/hooks_bat/fail/fail.bat new file mode 100644 index 000000000..a89b4c89c --- /dev/null +++ b/cordova-lib/spec-cordova-misc/fixtures/hooks_bat/fail/fail.bat @@ -0,0 +1,2 @@ +@ECHO OFF +EXIT /B 1 diff --git a/cordova-lib/spec-cordova-misc/fixtures/hooks_bat/test/.dotted.bat b/cordova-lib/spec-cordova-misc/fixtures/hooks_bat/test/.dotted.bat new file mode 100644 index 000000000..ada7136e5 --- /dev/null +++ b/cordova-lib/spec-cordova-misc/fixtures/hooks_bat/test/.dotted.bat @@ -0,0 +1,2 @@ +@ECHO OFF +ECHO "Dotted files in hook dirs should not be called" > dotted_hook_should_not_fire.txt \ No newline at end of file diff --git a/cordova-lib/spec-cordova-misc/fixtures/hooks_bat/test/07.bat b/cordova-lib/spec-cordova-misc/fixtures/hooks_bat/test/07.bat new file mode 100644 index 000000000..a88c8c590 --- /dev/null +++ b/cordova-lib/spec-cordova-misc/fixtures/hooks_bat/test/07.bat @@ -0,0 +1,3 @@ +@ECHO OFF +rem ECHO this is script 0 in %~dp0 +ECHO b >> hooks_order.txt diff --git a/cordova-lib/spec-cordova-misc/fixtures/hooks_bat/test/1.bat b/cordova-lib/spec-cordova-misc/fixtures/hooks_bat/test/1.bat new file mode 100644 index 000000000..be004c530 --- /dev/null +++ b/cordova-lib/spec-cordova-misc/fixtures/hooks_bat/test/1.bat @@ -0,0 +1,5 @@ +@ECHO OFF +rem ECHO this is script 1 in %~dp0 +ECHO a >> hooks_order.txt +ECHO %1 > hooks_params.txt +node -e "console.log(JSON.stringify(process.env, null, 2))" > hooks_env.json diff --git a/cordova-lib/spec-cordova-misc/fixtures/hooks_sh/fail/fail.sh b/cordova-lib/spec-cordova-misc/fixtures/hooks_sh/fail/fail.sh new file mode 100755 index 000000000..379a4c986 --- /dev/null +++ b/cordova-lib/spec-cordova-misc/fixtures/hooks_sh/fail/fail.sh @@ -0,0 +1 @@ +exit 1 diff --git a/cordova-lib/spec-cordova-misc/fixtures/hooks_sh/test/.dotted.sh b/cordova-lib/spec-cordova-misc/fixtures/hooks_sh/test/.dotted.sh new file mode 100755 index 000000000..e5fa07f91 --- /dev/null +++ b/cordova-lib/spec-cordova-misc/fixtures/hooks_sh/test/.dotted.sh @@ -0,0 +1 @@ +echo "Dotted files in hook dirs should not be called" > dotted_hook_should_not_fire.txt diff --git a/cordova-lib/spec-cordova-misc/fixtures/hooks_sh/test/07.sh b/cordova-lib/spec-cordova-misc/fixtures/hooks_sh/test/07.sh new file mode 100755 index 000000000..f410ee21f --- /dev/null +++ b/cordova-lib/spec-cordova-misc/fixtures/hooks_sh/test/07.sh @@ -0,0 +1,2 @@ +#echo "this is script 0 in `pwd`"; +echo b >> hooks_order.txt diff --git a/cordova-lib/spec-cordova-misc/fixtures/hooks_sh/test/1.sh b/cordova-lib/spec-cordova-misc/fixtures/hooks_sh/test/1.sh new file mode 100755 index 000000000..892869d7c --- /dev/null +++ b/cordova-lib/spec-cordova-misc/fixtures/hooks_sh/test/1.sh @@ -0,0 +1,4 @@ +#echo "this is script 1 in `pwd`"; +echo a >> hooks_order.txt +echo $1 > hooks_params.txt +node -e "console.log(JSON.stringify(process.env, null, 2))" > hooks_env.json diff --git a/cordova-lib/spec-cordova-misc/fixtures/platforms/android-lib/VERSION b/cordova-lib/spec-cordova-misc/fixtures/platforms/android-lib/VERSION new file mode 100644 index 000000000..15a279981 --- /dev/null +++ b/cordova-lib/spec-cordova-misc/fixtures/platforms/android-lib/VERSION @@ -0,0 +1 @@ +3.3.0 diff --git a/cordova-lib/spec-cordova-misc/fixtures/platforms/android-lib/framework/assets/www/cordova.js b/cordova-lib/spec-cordova-misc/fixtures/platforms/android-lib/framework/assets/www/cordova.js new file mode 100644 index 000000000..91c51fce2 --- /dev/null +++ b/cordova-lib/spec-cordova-misc/fixtures/platforms/android-lib/framework/assets/www/cordova.js @@ -0,0 +1 @@ +This is a placeholder file. diff --git a/cordova-lib/spec-cordova-misc/fixtures/platforms/android/AndroidManifest.xml b/cordova-lib/spec-cordova-misc/fixtures/platforms/android/AndroidManifest.xml new file mode 100644 index 000000000..be3f245f7 --- /dev/null +++ b/cordova-lib/spec-cordova-misc/fixtures/platforms/android/AndroidManifest.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/cordova-lib/spec-cordova-misc/fixtures/platforms/android/assets/www/config.xml b/cordova-lib/spec-cordova-misc/fixtures/platforms/android/assets/www/config.xml new file mode 100644 index 000000000..9e7b9e046 --- /dev/null +++ b/cordova-lib/spec-cordova-misc/fixtures/platforms/android/assets/www/config.xml @@ -0,0 +1,14 @@ + + + TestBase + + A sample Apache Cordova application that responds to the deviceready event. + + + Apache Cordova Team + + + + + + diff --git a/cordova-lib/spec-cordova-misc/fixtures/platforms/android/assets/www/cordova.js b/cordova-lib/spec-cordova-misc/fixtures/platforms/android/assets/www/cordova.js new file mode 100644 index 000000000..07e3feb46 --- /dev/null +++ b/cordova-lib/spec-cordova-misc/fixtures/platforms/android/assets/www/cordova.js @@ -0,0 +1,1712 @@ +// Platform: android +// 3.1.0 +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ +;(function() { +var CORDOVA_JS_BUILD_LABEL = '3.1.0'; +// file: lib/scripts/require.js + +var require, + define; + +(function () { + var modules = {}, + // Stack of moduleIds currently being built. + requireStack = [], + // Map of module ID -> index into requireStack of modules currently being built. + inProgressModules = {}, + SEPERATOR = "."; + + + + function build(module) { + var factory = module.factory, + localRequire = function (id) { + var resultantId = id; + //Its a relative path, so lop off the last portion and add the id (minus "./") + if (id.charAt(0) === ".") { + resultantId = module.id.slice(0, module.id.lastIndexOf(SEPERATOR)) + SEPERATOR + id.slice(2); + } + return require(resultantId); + }; + module.exports = {}; + delete module.factory; + factory(localRequire, module.exports, module); + return module.exports; + } + + require = function (id) { + if (!modules[id]) { + throw "module " + id + " not found"; + } else if (id in inProgressModules) { + var cycle = requireStack.slice(inProgressModules[id]).join('->') + '->' + id; + throw "Cycle in require graph: " + cycle; + } + if (modules[id].factory) { + try { + inProgressModules[id] = requireStack.length; + requireStack.push(id); + return build(modules[id]); + } finally { + delete inProgressModules[id]; + requireStack.pop(); + } + } + return modules[id].exports; + }; + + define = function (id, factory) { + if (modules[id]) { + throw "module " + id + " already defined"; + } + + modules[id] = { + id: id, + factory: factory + }; + }; + + define.remove = function (id) { + delete modules[id]; + }; + + define.moduleMap = modules; +})(); + +//Export for use in node +if (typeof module === "object" && typeof require === "function") { + module.exports.require = require; + module.exports.define = define; +} + +// file: lib/cordova.js +define("cordova", function(require, exports, module) { + + +var channel = require('cordova/channel'); +var platform = require('cordova/platform'); + +/** + * Intercept calls to addEventListener + removeEventListener and handle deviceready, + * resume, and pause events. + */ +var m_document_addEventListener = document.addEventListener; +var m_document_removeEventListener = document.removeEventListener; +var m_window_addEventListener = window.addEventListener; +var m_window_removeEventListener = window.removeEventListener; + +/** + * Houses custom event handlers to intercept on document + window event listeners. + */ +var documentEventHandlers = {}, + windowEventHandlers = {}; + +document.addEventListener = function(evt, handler, capture) { + var e = evt.toLowerCase(); + if (typeof documentEventHandlers[e] != 'undefined') { + documentEventHandlers[e].subscribe(handler); + } else { + m_document_addEventListener.call(document, evt, handler, capture); + } +}; + +window.addEventListener = function(evt, handler, capture) { + var e = evt.toLowerCase(); + if (typeof windowEventHandlers[e] != 'undefined') { + windowEventHandlers[e].subscribe(handler); + } else { + m_window_addEventListener.call(window, evt, handler, capture); + } +}; + +document.removeEventListener = function(evt, handler, capture) { + var e = evt.toLowerCase(); + // If unsubscribing from an event that is handled by a plugin + if (typeof documentEventHandlers[e] != "undefined") { + documentEventHandlers[e].unsubscribe(handler); + } else { + m_document_removeEventListener.call(document, evt, handler, capture); + } +}; + +window.removeEventListener = function(evt, handler, capture) { + var e = evt.toLowerCase(); + // If unsubscribing from an event that is handled by a plugin + if (typeof windowEventHandlers[e] != "undefined") { + windowEventHandlers[e].unsubscribe(handler); + } else { + m_window_removeEventListener.call(window, evt, handler, capture); + } +}; + +function createEvent(type, data) { + var event = document.createEvent('Events'); + event.initEvent(type, false, false); + if (data) { + for (var i in data) { + if (data.hasOwnProperty(i)) { + event[i] = data[i]; + } + } + } + return event; +} + + +var cordova = { + define:define, + require:require, + version:CORDOVA_JS_BUILD_LABEL, + platformId:platform.id, + /** + * Methods to add/remove your own addEventListener hijacking on document + window. + */ + addWindowEventHandler:function(event) { + return (windowEventHandlers[event] = channel.create(event)); + }, + addStickyDocumentEventHandler:function(event) { + return (documentEventHandlers[event] = channel.createSticky(event)); + }, + addDocumentEventHandler:function(event) { + return (documentEventHandlers[event] = channel.create(event)); + }, + removeWindowEventHandler:function(event) { + delete windowEventHandlers[event]; + }, + removeDocumentEventHandler:function(event) { + delete documentEventHandlers[event]; + }, + /** + * Retrieve original event handlers that were replaced by Cordova + * + * @return object + */ + getOriginalHandlers: function() { + return {'document': {'addEventListener': m_document_addEventListener, 'removeEventListener': m_document_removeEventListener}, + 'window': {'addEventListener': m_window_addEventListener, 'removeEventListener': m_window_removeEventListener}}; + }, + /** + * Method to fire event from native code + * bNoDetach is required for events which cause an exception which needs to be caught in native code + */ + fireDocumentEvent: function(type, data, bNoDetach) { + var evt = createEvent(type, data); + if (typeof documentEventHandlers[type] != 'undefined') { + if( bNoDetach ) { + documentEventHandlers[type].fire(evt); + } + else { + setTimeout(function() { + // Fire deviceready on listeners that were registered before cordova.js was loaded. + if (type == 'deviceready') { + document.dispatchEvent(evt); + } + documentEventHandlers[type].fire(evt); + }, 0); + } + } else { + document.dispatchEvent(evt); + } + }, + fireWindowEvent: function(type, data) { + var evt = createEvent(type,data); + if (typeof windowEventHandlers[type] != 'undefined') { + setTimeout(function() { + windowEventHandlers[type].fire(evt); + }, 0); + } else { + window.dispatchEvent(evt); + } + }, + + /** + * Plugin callback mechanism. + */ + // Randomize the starting callbackId to avoid collisions after refreshing or navigating. + // This way, it's very unlikely that any new callback would get the same callbackId as an old callback. + callbackId: Math.floor(Math.random() * 2000000000), + callbacks: {}, + callbackStatus: { + NO_RESULT: 0, + OK: 1, + CLASS_NOT_FOUND_EXCEPTION: 2, + ILLEGAL_ACCESS_EXCEPTION: 3, + INSTANTIATION_EXCEPTION: 4, + MALFORMED_URL_EXCEPTION: 5, + IO_EXCEPTION: 6, + INVALID_ACTION: 7, + JSON_EXCEPTION: 8, + ERROR: 9 + }, + + /** + * Called by native code when returning successful result from an action. + */ + callbackSuccess: function(callbackId, args) { + try { + cordova.callbackFromNative(callbackId, true, args.status, [args.message], args.keepCallback); + } catch (e) { + console.log("Error in error callback: " + callbackId + " = "+e); + } + }, + + /** + * Called by native code when returning error result from an action. + */ + callbackError: function(callbackId, args) { + // TODO: Deprecate callbackSuccess and callbackError in favour of callbackFromNative. + // Derive success from status. + try { + cordova.callbackFromNative(callbackId, false, args.status, [args.message], args.keepCallback); + } catch (e) { + console.log("Error in error callback: " + callbackId + " = "+e); + } + }, + + /** + * Called by native code when returning the result from an action. + */ + callbackFromNative: function(callbackId, success, status, args, keepCallback) { + var callback = cordova.callbacks[callbackId]; + if (callback) { + if (success && status == cordova.callbackStatus.OK) { + callback.success && callback.success.apply(null, args); + } else if (!success) { + callback.fail && callback.fail.apply(null, args); + } + + // Clear callback if not expecting any more results + if (!keepCallback) { + delete cordova.callbacks[callbackId]; + } + } + }, + addConstructor: function(func) { + channel.onCordovaReady.subscribe(function() { + try { + func(); + } catch(e) { + console.log("Failed to run constructor: " + e); + } + }); + } +}; + + +module.exports = cordova; + +}); + +// file: lib/android/android/nativeapiprovider.js +define("cordova/android/nativeapiprovider", function(require, exports, module) { + +/** + * Exports the ExposedJsApi.java object if available, otherwise exports the PromptBasedNativeApi. + */ + +var nativeApi = this._cordovaNative || require('cordova/android/promptbasednativeapi'); +var currentApi = nativeApi; + +module.exports = { + get: function() { return currentApi; }, + setPreferPrompt: function(value) { + currentApi = value ? require('cordova/android/promptbasednativeapi') : nativeApi; + }, + // Used only by tests. + set: function(value) { + currentApi = value; + } +}; + +}); + +// file: lib/android/android/promptbasednativeapi.js +define("cordova/android/promptbasednativeapi", function(require, exports, module) { + +/** + * Implements the API of ExposedJsApi.java, but uses prompt() to communicate. + * This is used only on the 2.3 simulator, where addJavascriptInterface() is broken. + */ + +module.exports = { + exec: function(service, action, callbackId, argsJson) { + return prompt(argsJson, 'gap:'+JSON.stringify([service, action, callbackId])); + }, + setNativeToJsBridgeMode: function(value) { + prompt(value, 'gap_bridge_mode:'); + }, + retrieveJsMessages: function(fromOnlineEvent) { + return prompt(+fromOnlineEvent, 'gap_poll:'); + } +}; + +}); + +// file: lib/common/argscheck.js +define("cordova/argscheck", function(require, exports, module) { + +var exec = require('cordova/exec'); +var utils = require('cordova/utils'); + +var moduleExports = module.exports; + +var typeMap = { + 'A': 'Array', + 'D': 'Date', + 'N': 'Number', + 'S': 'String', + 'F': 'Function', + 'O': 'Object' +}; + +function extractParamName(callee, argIndex) { + return (/.*?\((.*?)\)/).exec(callee)[1].split(', ')[argIndex]; +} + +function checkArgs(spec, functionName, args, opt_callee) { + if (!moduleExports.enableChecks) { + return; + } + var errMsg = null; + var typeName; + for (var i = 0; i < spec.length; ++i) { + var c = spec.charAt(i), + cUpper = c.toUpperCase(), + arg = args[i]; + // Asterix means allow anything. + if (c == '*') { + continue; + } + typeName = utils.typeName(arg); + if ((arg === null || arg === undefined) && c == cUpper) { + continue; + } + if (typeName != typeMap[cUpper]) { + errMsg = 'Expected ' + typeMap[cUpper]; + break; + } + } + if (errMsg) { + errMsg += ', but got ' + typeName + '.'; + errMsg = 'Wrong type for parameter "' + extractParamName(opt_callee || args.callee, i) + '" of ' + functionName + ': ' + errMsg; + // Don't log when running unit tests. + if (typeof jasmine == 'undefined') { + console.error(errMsg); + } + throw TypeError(errMsg); + } +} + +function getValue(value, defaultValue) { + return value === undefined ? defaultValue : value; +} + +moduleExports.checkArgs = checkArgs; +moduleExports.getValue = getValue; +moduleExports.enableChecks = true; + + +}); + +// file: lib/common/base64.js +define("cordova/base64", function(require, exports, module) { + +var base64 = exports; + +base64.fromArrayBuffer = function(arrayBuffer) { + var array = new Uint8Array(arrayBuffer); + return uint8ToBase64(array); +}; + +//------------------------------------------------------------------------------ + +/* This code is based on the performance tests at http://jsperf.com/b64tests + * This 12-bit-at-a-time algorithm was the best performing version on all + * platforms tested. + */ + +var b64_6bit = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; +var b64_12bit; + +var b64_12bitTable = function() { + b64_12bit = []; + for (var i=0; i<64; i++) { + for (var j=0; j<64; j++) { + b64_12bit[i*64+j] = b64_6bit[i] + b64_6bit[j]; + } + } + b64_12bitTable = function() { return b64_12bit; }; + return b64_12bit; +}; + +function uint8ToBase64(rawData) { + var numBytes = rawData.byteLength; + var output=""; + var segment; + var table = b64_12bitTable(); + for (var i=0;i> 12]; + output += table[segment & 0xfff]; + } + if (numBytes - i == 2) { + segment = (rawData[i] << 16) + (rawData[i+1] << 8); + output += table[segment >> 12]; + output += b64_6bit[(segment & 0xfff) >> 6]; + output += '='; + } else if (numBytes - i == 1) { + segment = (rawData[i] << 16); + output += table[segment >> 12]; + output += '=='; + } + return output; +} + +}); + +// file: lib/common/builder.js +define("cordova/builder", function(require, exports, module) { + +var utils = require('cordova/utils'); + +function each(objects, func, context) { + for (var prop in objects) { + if (objects.hasOwnProperty(prop)) { + func.apply(context, [objects[prop], prop]); + } + } +} + +function clobber(obj, key, value) { + exports.replaceHookForTesting(obj, key); + obj[key] = value; + // Getters can only be overridden by getters. + if (obj[key] !== value) { + utils.defineGetter(obj, key, function() { + return value; + }); + } +} + +function assignOrWrapInDeprecateGetter(obj, key, value, message) { + if (message) { + utils.defineGetter(obj, key, function() { + console.log(message); + delete obj[key]; + clobber(obj, key, value); + return value; + }); + } else { + clobber(obj, key, value); + } +} + +function include(parent, objects, clobber, merge) { + each(objects, function (obj, key) { + try { + var result = obj.path ? require(obj.path) : {}; + + if (clobber) { + // Clobber if it doesn't exist. + if (typeof parent[key] === 'undefined') { + assignOrWrapInDeprecateGetter(parent, key, result, obj.deprecated); + } else if (typeof obj.path !== 'undefined') { + // If merging, merge properties onto parent, otherwise, clobber. + if (merge) { + recursiveMerge(parent[key], result); + } else { + assignOrWrapInDeprecateGetter(parent, key, result, obj.deprecated); + } + } + result = parent[key]; + } else { + // Overwrite if not currently defined. + if (typeof parent[key] == 'undefined') { + assignOrWrapInDeprecateGetter(parent, key, result, obj.deprecated); + } else { + // Set result to what already exists, so we can build children into it if they exist. + result = parent[key]; + } + } + + if (obj.children) { + include(result, obj.children, clobber, merge); + } + } catch(e) { + utils.alert('Exception building cordova JS globals: ' + e + ' for key "' + key + '"'); + } + }); +} + +/** + * Merge properties from one object onto another recursively. Properties from + * the src object will overwrite existing target property. + * + * @param target Object to merge properties into. + * @param src Object to merge properties from. + */ +function recursiveMerge(target, src) { + for (var prop in src) { + if (src.hasOwnProperty(prop)) { + if (target.prototype && target.prototype.constructor === target) { + // If the target object is a constructor override off prototype. + clobber(target.prototype, prop, src[prop]); + } else { + if (typeof src[prop] === 'object' && typeof target[prop] === 'object') { + recursiveMerge(target[prop], src[prop]); + } else { + clobber(target, prop, src[prop]); + } + } + } + } +} + +exports.buildIntoButDoNotClobber = function(objects, target) { + include(target, objects, false, false); +}; +exports.buildIntoAndClobber = function(objects, target) { + include(target, objects, true, false); +}; +exports.buildIntoAndMerge = function(objects, target) { + include(target, objects, true, true); +}; +exports.recursiveMerge = recursiveMerge; +exports.assignOrWrapInDeprecateGetter = assignOrWrapInDeprecateGetter; +exports.replaceHookForTesting = function() {}; + +}); + +// file: lib/common/channel.js +define("cordova/channel", function(require, exports, module) { + +var utils = require('cordova/utils'), + nextGuid = 1; + +/** + * Custom pub-sub "channel" that can have functions subscribed to it + * This object is used to define and control firing of events for + * cordova initialization, as well as for custom events thereafter. + * + * The order of events during page load and Cordova startup is as follows: + * + * onDOMContentLoaded* Internal event that is received when the web page is loaded and parsed. + * onNativeReady* Internal event that indicates the Cordova native side is ready. + * onCordovaReady* Internal event fired when all Cordova JavaScript objects have been created. + * onDeviceReady* User event fired to indicate that Cordova is ready + * onResume User event fired to indicate a start/resume lifecycle event + * onPause User event fired to indicate a pause lifecycle event + * onDestroy* Internal event fired when app is being destroyed (User should use window.onunload event, not this one). + * + * The events marked with an * are sticky. Once they have fired, they will stay in the fired state. + * All listeners that subscribe after the event is fired will be executed right away. + * + * The only Cordova events that user code should register for are: + * deviceready Cordova native code is initialized and Cordova APIs can be called from JavaScript + * pause App has moved to background + * resume App has returned to foreground + * + * Listeners can be registered as: + * document.addEventListener("deviceready", myDeviceReadyListener, false); + * document.addEventListener("resume", myResumeListener, false); + * document.addEventListener("pause", myPauseListener, false); + * + * The DOM lifecycle events should be used for saving and restoring state + * window.onload + * window.onunload + * + */ + +/** + * Channel + * @constructor + * @param type String the channel name + */ +var Channel = function(type, sticky) { + this.type = type; + // Map of guid -> function. + this.handlers = {}; + // 0 = Non-sticky, 1 = Sticky non-fired, 2 = Sticky fired. + this.state = sticky ? 1 : 0; + // Used in sticky mode to remember args passed to fire(). + this.fireArgs = null; + // Used by onHasSubscribersChange to know if there are any listeners. + this.numHandlers = 0; + // Function that is called when the first listener is subscribed, or when + // the last listener is unsubscribed. + this.onHasSubscribersChange = null; +}, + channel = { + /** + * Calls the provided function only after all of the channels specified + * have been fired. All channels must be sticky channels. + */ + join: function(h, c) { + var len = c.length, + i = len, + f = function() { + if (!(--i)) h(); + }; + for (var j=0; jNative bridge. + POLLING: 0, + // For LOAD_URL to be viable, it would need to have a work-around for + // the bug where the soft-keyboard gets dismissed when a message is sent. + LOAD_URL: 1, + // For the ONLINE_EVENT to be viable, it would need to intercept all event + // listeners (both through addEventListener and window.ononline) as well + // as set the navigator property itself. + ONLINE_EVENT: 2, + // Uses reflection to access private APIs of the WebView that can send JS + // to be executed. + // Requires Android 3.2.4 or above. + PRIVATE_API: 3 + }, + jsToNativeBridgeMode, // Set lazily. + nativeToJsBridgeMode = nativeToJsModes.ONLINE_EVENT, + pollEnabled = false, + messagesFromNative = []; + +function androidExec(success, fail, service, action, args) { + // Set default bridge modes if they have not already been set. + // By default, we use the failsafe, since addJavascriptInterface breaks too often + if (jsToNativeBridgeMode === undefined) { + androidExec.setJsToNativeBridgeMode(jsToNativeModes.JS_OBJECT); + } + + // Process any ArrayBuffers in the args into a string. + for (var i = 0; i < args.length; i++) { + if (utils.typeName(args[i]) == 'ArrayBuffer') { + args[i] = base64.fromArrayBuffer(args[i]); + } + } + + var callbackId = service + cordova.callbackId++, + argsJson = JSON.stringify(args); + + if (success || fail) { + cordova.callbacks[callbackId] = {success:success, fail:fail}; + } + + if (jsToNativeBridgeMode == jsToNativeModes.LOCATION_CHANGE) { + window.location = 'http://cdv_exec/' + service + '#' + action + '#' + callbackId + '#' + argsJson; + } else { + var messages = nativeApiProvider.get().exec(service, action, callbackId, argsJson); + // If argsJson was received by Java as null, try again with the PROMPT bridge mode. + // This happens in rare circumstances, such as when certain Unicode characters are passed over the bridge on a Galaxy S2. See CB-2666. + if (jsToNativeBridgeMode == jsToNativeModes.JS_OBJECT && messages === "@Null arguments.") { + androidExec.setJsToNativeBridgeMode(jsToNativeModes.PROMPT); + androidExec(success, fail, service, action, args); + androidExec.setJsToNativeBridgeMode(jsToNativeModes.JS_OBJECT); + return; + } else { + androidExec.processMessages(messages); + } + } +} + +function pollOnceFromOnlineEvent() { + pollOnce(true); +} + +function pollOnce(opt_fromOnlineEvent) { + var msg = nativeApiProvider.get().retrieveJsMessages(!!opt_fromOnlineEvent); + androidExec.processMessages(msg); +} + +function pollingTimerFunc() { + if (pollEnabled) { + pollOnce(); + setTimeout(pollingTimerFunc, 50); + } +} + +function hookOnlineApis() { + function proxyEvent(e) { + cordova.fireWindowEvent(e.type); + } + // The network module takes care of firing online and offline events. + // It currently fires them only on document though, so we bridge them + // to window here (while first listening for exec()-releated online/offline + // events). + window.addEventListener('online', pollOnceFromOnlineEvent, false); + window.addEventListener('offline', pollOnceFromOnlineEvent, false); + cordova.addWindowEventHandler('online'); + cordova.addWindowEventHandler('offline'); + document.addEventListener('online', proxyEvent, false); + document.addEventListener('offline', proxyEvent, false); +} + +hookOnlineApis(); + +androidExec.jsToNativeModes = jsToNativeModes; +androidExec.nativeToJsModes = nativeToJsModes; + +androidExec.setJsToNativeBridgeMode = function(mode) { + if (mode == jsToNativeModes.JS_OBJECT && !window._cordovaNative) { + console.log('Falling back on PROMPT mode since _cordovaNative is missing. Expected for Android 3.2 and lower only.'); + mode = jsToNativeModes.PROMPT; + } + nativeApiProvider.setPreferPrompt(mode == jsToNativeModes.PROMPT); + jsToNativeBridgeMode = mode; +}; + +androidExec.setNativeToJsBridgeMode = function(mode) { + if (mode == nativeToJsBridgeMode) { + return; + } + if (nativeToJsBridgeMode == nativeToJsModes.POLLING) { + pollEnabled = false; + } + + nativeToJsBridgeMode = mode; + // Tell the native side to switch modes. + nativeApiProvider.get().setNativeToJsBridgeMode(mode); + + if (mode == nativeToJsModes.POLLING) { + pollEnabled = true; + setTimeout(pollingTimerFunc, 1); + } +}; + +// Processes a single message, as encoded by NativeToJsMessageQueue.java. +function processMessage(message) { + try { + var firstChar = message.charAt(0); + if (firstChar == 'J') { + eval(message.slice(1)); + } else if (firstChar == 'S' || firstChar == 'F') { + var success = firstChar == 'S'; + var keepCallback = message.charAt(1) == '1'; + var spaceIdx = message.indexOf(' ', 2); + var status = +message.slice(2, spaceIdx); + var nextSpaceIdx = message.indexOf(' ', spaceIdx + 1); + var callbackId = message.slice(spaceIdx + 1, nextSpaceIdx); + var payloadKind = message.charAt(nextSpaceIdx + 1); + var payload; + if (payloadKind == 's') { + payload = message.slice(nextSpaceIdx + 2); + } else if (payloadKind == 't') { + payload = true; + } else if (payloadKind == 'f') { + payload = false; + } else if (payloadKind == 'N') { + payload = null; + } else if (payloadKind == 'n') { + payload = +message.slice(nextSpaceIdx + 2); + } else if (payloadKind == 'A') { + var data = message.slice(nextSpaceIdx + 2); + var bytes = window.atob(data); + var arraybuffer = new Uint8Array(bytes.length); + for (var i = 0; i < bytes.length; i++) { + arraybuffer[i] = bytes.charCodeAt(i); + } + payload = arraybuffer.buffer; + } else if (payloadKind == 'S') { + payload = window.atob(message.slice(nextSpaceIdx + 2)); + } else { + payload = JSON.parse(message.slice(nextSpaceIdx + 1)); + } + cordova.callbackFromNative(callbackId, success, status, [payload], keepCallback); + } else { + console.log("processMessage failed: invalid message:" + message); + } + } catch (e) { + console.log("processMessage failed: Message: " + message); + console.log("processMessage failed: Error: " + e); + console.log("processMessage failed: Stack: " + e.stack); + } +} + +// This is called from the NativeToJsMessageQueue.java. +androidExec.processMessages = function(messages) { + if (messages) { + messagesFromNative.push(messages); + // Check for the reentrant case, and enqueue the message if that's the case. + if (messagesFromNative.length > 1) { + return; + } + while (messagesFromNative.length) { + // Don't unshift until the end so that reentrancy can be detected. + messages = messagesFromNative[0]; + // The Java side can send a * message to indicate that it + // still has messages waiting to be retrieved. + if (messages == '*') { + messagesFromNative.shift(); + window.setTimeout(pollOnce, 0); + return; + } + + var spaceIdx = messages.indexOf(' '); + var msgLen = +messages.slice(0, spaceIdx); + var message = messages.substr(spaceIdx + 1, msgLen); + messages = messages.slice(spaceIdx + msgLen + 1); + processMessage(message); + if (messages) { + messagesFromNative[0] = messages; + } else { + messagesFromNative.shift(); + } + } + } +}; + +module.exports = androidExec; + +}); + +// file: lib/common/init.js +define("cordova/init", function(require, exports, module) { + +var channel = require('cordova/channel'); +var cordova = require('cordova'); +var modulemapper = require('cordova/modulemapper'); +var platform = require('cordova/platform'); +var pluginloader = require('cordova/pluginloader'); + +var platformInitChannelsArray = [channel.onNativeReady, channel.onPluginsReady]; + +function logUnfiredChannels(arr) { + for (var i = 0; i < arr.length; ++i) { + if (arr[i].state != 2) { + console.log('Channel not fired: ' + arr[i].type); + } + } +} + +window.setTimeout(function() { + if (channel.onDeviceReady.state != 2) { + console.log('deviceready has not fired after 5 seconds.'); + logUnfiredChannels(platformInitChannelsArray); + logUnfiredChannels(channel.deviceReadyChannelsArray); + } +}, 5000); + +// Replace navigator before any modules are required(), to ensure it happens as soon as possible. +// We replace it so that properties that can't be clobbered can instead be overridden. +function replaceNavigator(origNavigator) { + var CordovaNavigator = function() {}; + CordovaNavigator.prototype = origNavigator; + var newNavigator = new CordovaNavigator(); + // This work-around really only applies to new APIs that are newer than Function.bind. + // Without it, APIs such as getGamepads() break. + if (CordovaNavigator.bind) { + for (var key in origNavigator) { + if (typeof origNavigator[key] == 'function') { + newNavigator[key] = origNavigator[key].bind(origNavigator); + } + } + } + return newNavigator; +} +if (window.navigator) { + window.navigator = replaceNavigator(window.navigator); +} + +if (!window.console) { + window.console = { + log: function(){} + }; +} +if (!window.console.warn) { + window.console.warn = function(msg) { + this.log("warn: " + msg); + }; +} + +// Register pause, resume and deviceready channels as events on document. +channel.onPause = cordova.addDocumentEventHandler('pause'); +channel.onResume = cordova.addDocumentEventHandler('resume'); +channel.onDeviceReady = cordova.addStickyDocumentEventHandler('deviceready'); + +// Listen for DOMContentLoaded and notify our channel subscribers. +if (document.readyState == 'complete' || document.readyState == 'interactive') { + channel.onDOMContentLoaded.fire(); +} else { + document.addEventListener('DOMContentLoaded', function() { + channel.onDOMContentLoaded.fire(); + }, false); +} + +// _nativeReady is global variable that the native side can set +// to signify that the native code is ready. It is a global since +// it may be called before any cordova JS is ready. +if (window._nativeReady) { + channel.onNativeReady.fire(); +} + +modulemapper.clobbers('cordova', 'cordova'); +modulemapper.clobbers('cordova/exec', 'cordova.exec'); +modulemapper.clobbers('cordova/exec', 'Cordova.exec'); + +// Call the platform-specific initialization. +platform.bootstrap && platform.bootstrap(); + +pluginloader.load(function() { + channel.onPluginsReady.fire(); +}); + +/** + * Create all cordova objects once native side is ready. + */ +channel.join(function() { + modulemapper.mapModules(window); + + platform.initialize && platform.initialize(); + + // Fire event to notify that all objects are created + channel.onCordovaReady.fire(); + + // Fire onDeviceReady event once page has fully loaded, all + // constructors have run and cordova info has been received from native + // side. + channel.join(function() { + require('cordova').fireDocumentEvent('deviceready'); + }, channel.deviceReadyChannelsArray); + +}, platformInitChannelsArray); + + +}); + +// file: lib/common/modulemapper.js +define("cordova/modulemapper", function(require, exports, module) { + +var builder = require('cordova/builder'), + moduleMap = define.moduleMap, + symbolList, + deprecationMap; + +exports.reset = function() { + symbolList = []; + deprecationMap = {}; +}; + +function addEntry(strategy, moduleName, symbolPath, opt_deprecationMessage) { + if (!(moduleName in moduleMap)) { + throw new Error('Module ' + moduleName + ' does not exist.'); + } + symbolList.push(strategy, moduleName, symbolPath); + if (opt_deprecationMessage) { + deprecationMap[symbolPath] = opt_deprecationMessage; + } +} + +// Note: Android 2.3 does have Function.bind(). +exports.clobbers = function(moduleName, symbolPath, opt_deprecationMessage) { + addEntry('c', moduleName, symbolPath, opt_deprecationMessage); +}; + +exports.merges = function(moduleName, symbolPath, opt_deprecationMessage) { + addEntry('m', moduleName, symbolPath, opt_deprecationMessage); +}; + +exports.defaults = function(moduleName, symbolPath, opt_deprecationMessage) { + addEntry('d', moduleName, symbolPath, opt_deprecationMessage); +}; + +exports.runs = function(moduleName) { + addEntry('r', moduleName, null); +}; + +function prepareNamespace(symbolPath, context) { + if (!symbolPath) { + return context; + } + var parts = symbolPath.split('.'); + var cur = context; + for (var i = 0, part; part = parts[i]; ++i) { + cur = cur[part] = cur[part] || {}; + } + return cur; +} + +exports.mapModules = function(context) { + var origSymbols = {}; + context.CDV_origSymbols = origSymbols; + for (var i = 0, len = symbolList.length; i < len; i += 3) { + var strategy = symbolList[i]; + var moduleName = symbolList[i + 1]; + var module = require(moduleName); + // + if (strategy == 'r') { + continue; + } + var symbolPath = symbolList[i + 2]; + var lastDot = symbolPath.lastIndexOf('.'); + var namespace = symbolPath.substr(0, lastDot); + var lastName = symbolPath.substr(lastDot + 1); + + var deprecationMsg = symbolPath in deprecationMap ? 'Access made to deprecated symbol: ' + symbolPath + '. ' + deprecationMsg : null; + var parentObj = prepareNamespace(namespace, context); + var target = parentObj[lastName]; + + if (strategy == 'm' && target) { + builder.recursiveMerge(target, module); + } else if ((strategy == 'd' && !target) || (strategy != 'd')) { + if (!(symbolPath in origSymbols)) { + origSymbols[symbolPath] = target; + } + builder.assignOrWrapInDeprecateGetter(parentObj, lastName, module, deprecationMsg); + } + } +}; + +exports.getOriginalSymbol = function(context, symbolPath) { + var origSymbols = context.CDV_origSymbols; + if (origSymbols && (symbolPath in origSymbols)) { + return origSymbols[symbolPath]; + } + var parts = symbolPath.split('.'); + var obj = context; + for (var i = 0; i < parts.length; ++i) { + obj = obj && obj[parts[i]]; + } + return obj; +}; + +exports.reset(); + + +}); + +// file: lib/android/platform.js +define("cordova/platform", function(require, exports, module) { + +module.exports = { + id: 'android', + bootstrap: function() { + var channel = require('cordova/channel'), + cordova = require('cordova'), + exec = require('cordova/exec'), + modulemapper = require('cordova/modulemapper'); + + // Tell the native code that a page change has occurred. + exec(null, null, 'PluginManager', 'startup', []); + // Tell the JS that the native side is ready. + channel.onNativeReady.fire(); + + // TODO: Extract this as a proper plugin. + modulemapper.clobbers('cordova/plugin/android/app', 'navigator.app'); + + // Inject a listener for the backbutton on the document. + var backButtonChannel = cordova.addDocumentEventHandler('backbutton'); + backButtonChannel.onHasSubscribersChange = function() { + // If we just attached the first handler or detached the last handler, + // let native know we need to override the back button. + exec(null, null, "App", "overrideBackbutton", [this.numHandlers == 1]); + }; + + // Add hardware MENU and SEARCH button handlers + cordova.addDocumentEventHandler('menubutton'); + cordova.addDocumentEventHandler('searchbutton'); + + // Let native code know we are all done on the JS side. + // Native code will then un-hide the WebView. + channel.onCordovaReady.subscribe(function() { + exec(null, null, "App", "show", []); + }); + } +}; + +}); + +// file: lib/android/plugin/android/app.js +define("cordova/plugin/android/app", function(require, exports, module) { + +var exec = require('cordova/exec'); + +module.exports = { + /** + * Clear the resource cache. + */ + clearCache:function() { + exec(null, null, "App", "clearCache", []); + }, + + /** + * Load the url into the webview or into new browser instance. + * + * @param url The URL to load + * @param props Properties that can be passed in to the activity: + * wait: int => wait msec before loading URL + * loadingDialog: "Title,Message" => display a native loading dialog + * loadUrlTimeoutValue: int => time in msec to wait before triggering a timeout error + * clearHistory: boolean => clear webview history (default=false) + * openExternal: boolean => open in a new browser (default=false) + * + * Example: + * navigator.app.loadUrl("http://server/myapp/index.html", {wait:2000, loadingDialog:"Wait,Loading App", loadUrlTimeoutValue: 60000}); + */ + loadUrl:function(url, props) { + exec(null, null, "App", "loadUrl", [url, props]); + }, + + /** + * Cancel loadUrl that is waiting to be loaded. + */ + cancelLoadUrl:function() { + exec(null, null, "App", "cancelLoadUrl", []); + }, + + /** + * Clear web history in this web view. + * Instead of BACK button loading the previous web page, it will exit the app. + */ + clearHistory:function() { + exec(null, null, "App", "clearHistory", []); + }, + + /** + * Go to previous page displayed. + * This is the same as pressing the backbutton on Android device. + */ + backHistory:function() { + exec(null, null, "App", "backHistory", []); + }, + + /** + * Override the default behavior of the Android back button. + * If overridden, when the back button is pressed, the "backKeyDown" JavaScript event will be fired. + * + * Note: The user should not have to call this method. Instead, when the user + * registers for the "backbutton" event, this is automatically done. + * + * @param override T=override, F=cancel override + */ + overrideBackbutton:function(override) { + exec(null, null, "App", "overrideBackbutton", [override]); + }, + + /** + * Exit and terminate the application. + */ + exitApp:function() { + return exec(null, null, "App", "exitApp", []); + } +}; + +}); + +// file: lib/common/pluginloader.js +define("cordova/pluginloader", function(require, exports, module) { + +var modulemapper = require('cordova/modulemapper'); + +// Helper function to inject a + + + + diff --git a/cordova-lib/spec-cordova-misc/fixtures/platforms/android/assets/www/js/index.js b/cordova-lib/spec-cordova-misc/fixtures/platforms/android/assets/www/js/index.js new file mode 100644 index 000000000..31d9064eb --- /dev/null +++ b/cordova-lib/spec-cordova-misc/fixtures/platforms/android/assets/www/js/index.js @@ -0,0 +1,49 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +var app = { + // Application Constructor + initialize: function() { + this.bindEvents(); + }, + // Bind Event Listeners + // + // Bind any events that are required on startup. Common events are: + // 'load', 'deviceready', 'offline', and 'online'. + bindEvents: function() { + document.addEventListener('deviceready', this.onDeviceReady, false); + }, + // deviceready Event Handler + // + // The scope of 'this' is the event. In order to call the 'receivedEvent' + // function, we must explicity call 'app.receivedEvent(...);' + onDeviceReady: function() { + app.receivedEvent('deviceready'); + }, + // Update DOM on a Received Event + receivedEvent: function(id) { + var parentElement = document.getElementById(id); + var listeningElement = parentElement.querySelector('.listening'); + var receivedElement = parentElement.querySelector('.received'); + + listeningElement.setAttribute('style', 'display:none;'); + receivedElement.setAttribute('style', 'display:block;'); + + console.log('Received Event: ' + id); + } +}; diff --git a/cordova-lib/spec-cordova-misc/fixtures/platforms/android/assets/www/spec.html b/cordova-lib/spec-cordova-misc/fixtures/platforms/android/assets/www/spec.html new file mode 100644 index 000000000..71f00de05 --- /dev/null +++ b/cordova-lib/spec-cordova-misc/fixtures/platforms/android/assets/www/spec.html @@ -0,0 +1,68 @@ + + + + + Jasmine Spec Runner + + + + + + + + + + + + + + + + + + + + diff --git a/cordova-lib/spec-cordova-misc/fixtures/platforms/android/build.xml b/cordova-lib/spec-cordova-misc/fixtures/platforms/android/build.xml new file mode 100644 index 000000000..9674edf7d --- /dev/null +++ b/cordova-lib/spec-cordova-misc/fixtures/platforms/android/build.xml @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cordova-lib/spec-cordova-misc/fixtures/platforms/android/cordova/build b/cordova-lib/spec-cordova-misc/fixtures/platforms/android/cordova/build new file mode 100755 index 000000000..7028eb812 --- /dev/null +++ b/cordova-lib/spec-cordova-misc/fixtures/platforms/android/cordova/build @@ -0,0 +1,35 @@ +#!/usr/bin/env node + +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ + +var build = require('./lib/build'), + reqs = require('./lib/check_reqs'), + args = process.argv; + +// Support basic help commands +if(args[2] == '--help' || args[2] == '/?' || args[2] == '-h' || + args[2] == 'help' || args[2] == '-help' || args[2] == '/help') { + build.help(); +} else if(reqs.run()) { + build.run(args[2]); + process.exit(0); +} else { + process.exit(2); +} diff --git a/cordova-lib/spec-cordova-misc/fixtures/platforms/android/cordova/check_reqs b/cordova-lib/spec-cordova-misc/fixtures/platforms/android/cordova/check_reqs new file mode 100755 index 000000000..4a8abee46 --- /dev/null +++ b/cordova-lib/spec-cordova-misc/fixtures/platforms/android/cordova/check_reqs @@ -0,0 +1,27 @@ +#!/usr/bin/env node + +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ + +var check_reqs = require('./lib/check_reqs'); + +if(!check_reqs.run()) { + process.exit(2); +} + diff --git a/cordova-lib/spec-cordova-misc/fixtures/platforms/android/cordova/clean b/cordova-lib/spec-cordova-misc/fixtures/platforms/android/cordova/clean new file mode 100755 index 000000000..70c4ca80e --- /dev/null +++ b/cordova-lib/spec-cordova-misc/fixtures/platforms/android/cordova/clean @@ -0,0 +1,34 @@ +#!/usr/bin/env node + +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ + +var clean = require('./lib/clean'), + reqs = require('./lib/check_reqs'), + args = process.argv; + +// Usage support for when args are given +if(args.length > 2) { + clean.help(); +} else if(reqs.run()) { + clean.run(); + process.exit(0); +} else { + process.exit(2); +} diff --git a/cordova-lib/spec-cordova-misc/fixtures/platforms/android/cordova/defaults.xml b/cordova-lib/spec-cordova-misc/fixtures/platforms/android/cordova/defaults.xml new file mode 100644 index 000000000..24e572540 --- /dev/null +++ b/cordova-lib/spec-cordova-misc/fixtures/platforms/android/cordova/defaults.xml @@ -0,0 +1,50 @@ + + + + Hello Cordova + + + A sample Apache Cordova application that responds to the deviceready event. + + + + Apache Cordova Team + + + + + + + + + + + + + + diff --git a/cordova-lib/spec-cordova-misc/fixtures/platforms/android/cordova/lib/appinfo.js b/cordova-lib/spec-cordova-misc/fixtures/platforms/android/cordova/lib/appinfo.js new file mode 100755 index 000000000..1f8ebe2cf --- /dev/null +++ b/cordova-lib/spec-cordova-misc/fixtures/platforms/android/cordova/lib/appinfo.js @@ -0,0 +1,41 @@ +#!/usr/bin/env node + +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ + +var path = require('path'); +var fs = require('fs'); +var cachedAppInfo = null; + +function readAppInfoFromManifest() { + var manifestPath = path.join(__dirname, '..', '..', 'AndroidManifest.xml'); + var manifestData = fs.readFileSync(manifestPath, {encoding:'utf8'}); + var packageName = /\bpackage\s*=\s*"(.+?)"/.exec(manifestData); + if (!packageName) throw new Error('Could not find package name within ' + manifestPath); + var activityTag = //.exec(manifestData); + if (!activityTag) throw new Error('Could not find within ' + manifestPath); + var activityName = /\bandroid:name\s*=\s*"(.+?)"/.exec(activityTag); + if (!activityName) throw new Error('Could not find android:name within ' + manifestPath); + + return packageName[1] + '/.' + activityName[1]; +} + +exports.getActivityName = function() { + return cachedAppInfo = cachedAppInfo || readAppInfoFromManifest(); +}; diff --git a/cordova-lib/spec-cordova-misc/fixtures/platforms/android/cordova/lib/build.js b/cordova-lib/spec-cordova-misc/fixtures/platforms/android/cordova/lib/build.js new file mode 100755 index 000000000..7bc33ca27 --- /dev/null +++ b/cordova-lib/spec-cordova-misc/fixtures/platforms/android/cordova/lib/build.js @@ -0,0 +1,89 @@ +#!/usr/bin/env node + +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ + +var shell = require('shelljs'), + clean = require('./clean'), + path = require('path'), + fs = require('fs'), + ROOT = path.join(__dirname, '..', '..'); + +/* + * Builds the project with ant. + */ +module.exports.run = function(build_type) { + //default build type + build_type = typeof build_type !== 'undefined' ? build_type : "--debug"; + var cmd; + switch(build_type) { + case '--debug' : + clean.run(); + cmd = 'ant debug -f ' + path.join(ROOT, 'build.xml'); + break; + case '--release' : + clean.run(); + cmd = 'ant release -f ' + path.join(ROOT, 'build.xml'); + break; + case '--nobuild' : + console.log('Skipping build...'); + break; + default : + console.error('Build option \'' + build_type + '\' not recognized.'); + process.exit(2); + break; + } + if(cmd) { + var result = shell.exec(cmd, {silent:false, async:false}); + if(result.code > 0) { + console.error('ERROR: Failed to build android project.'); + console.error(result.output); + process.exit(2); + } + } +} + +/* + * Gets the path to the apk file, if not such file exists then + * the script will error out. (should we error or just return undefined?) + */ +module.exports.get_apk = function() { + if(fs.existsSync(path.join(ROOT, 'bin'))) { + var bin_files = fs.readdirSync(path.join(ROOT, 'bin')); + for (file in bin_files) { + if(path.extname(bin_files[file]) == '.apk') { + return path.join(ROOT, 'bin', bin_files[file]); + } + } + console.error('ERROR : No .apk found in \'bin\' folder'); + process.exit(2); + } else { + console.error('ERROR : unable to find project bin folder, could not locate .apk'); + process.exit(2); + } +} + +module.exports.help = function() { + console.log('Usage: ' + path.relative(process.cwd(), path.join(ROOT, 'cordova', 'build')) + ' [build_type]'); + console.log('Build Types : '); + console.log(' \'--debug\': Default build, will build project in using ant debug'); + console.log(' \'--release\': will build project using ant release'); + console.log(' \'--nobuild\': will skip build process (can be used with run command)'); + process.exit(0); +} diff --git a/cordova-lib/spec-cordova-misc/fixtures/platforms/android/cordova/lib/check_reqs.js b/cordova-lib/spec-cordova-misc/fixtures/platforms/android/cordova/lib/check_reqs.js new file mode 100755 index 000000000..c064499f1 --- /dev/null +++ b/cordova-lib/spec-cordova-misc/fixtures/platforms/android/cordova/lib/check_reqs.js @@ -0,0 +1,78 @@ +#!/usr/bin/env node + +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ + +var shell = require('shelljs'), + path = require('path'), + fs = require('fs'), + ROOT = path.join(__dirname, '..', '..'); + +// Get valid target from framework/project.properties +module.exports.get_target = function() { + if(fs.existsSync(path.join(ROOT, 'framework', 'project.properties'))) { + var target = shell.grep(/target=android-[\d+]/, path.join(ROOT, 'framework', 'project.properties')); + return target.split('=')[1].replace('\n', '').replace('\r', '').replace(' ', ''); + } else if (fs.existsSync(path.join(ROOT, 'project.properties'))) { + // if no target found, we're probably in a project and project.properties is in ROOT. + var target = shell.grep(/target=android-[\d+]/, path.join(ROOT, 'project.properties')); + return target.split('=')[1].replace('\n', '').replace('\r', '').replace(' ', ''); + } +} + +module.exports.check_ant = function() { + var test = shell.exec('ant -version', {silent:true, async:false}); + if(test.code > 0) { + console.error('ERROR : executing command \'ant\', make sure you have ant installed and added to your path.'); + return false; + } + return true; +} + +module.exports.check_java = function() { + if(process.env.JAVA_HOME) { + var test = shell.exec('java', {silent:true, async:false}); + if(test.code > 0) { + console.error('ERROR : executing command \'java\', make sure you java environment is set up. Including your JDK and JRE.'); + return false; + } + return true; + } else { + console.error('ERROR : Make sure JAVA_HOME is set, as well as paths to your JDK and JRE for java.'); + return false; + } +} + +module.exports.check_android = function() { + var valid_target = this.get_target(); + var targets = shell.exec('android list targets', {silent:true, async:false}); + + if(targets.code > 0 && targets.output.match(/command\snot\sfound/)) { + console.error('The command \"android\" failed. Make sure you have the latest Android SDK installed, and the \"android\" command (inside the tools/ folder) is added to your path.'); + return false; + } else if(!targets.output.match(valid_target)) { + console.error('Please install Android target ' + valid_target.split('-')[1] + ' (the Android newest SDK). Make sure you have the latest Android tools installed as well. Run \"android\" from your command-line to install/update any missing SDKs or tools.'); + return false; + } + return true; +} + +module.exports.run = function() { + return this.check_ant() && this.check_java && this.check_android(); +} diff --git a/cordova-lib/spec-cordova-misc/fixtures/platforms/android/cordova/lib/clean.js b/cordova-lib/spec-cordova-misc/fixtures/platforms/android/cordova/lib/clean.js new file mode 100755 index 000000000..8f140153e --- /dev/null +++ b/cordova-lib/spec-cordova-misc/fixtures/platforms/android/cordova/lib/clean.js @@ -0,0 +1,43 @@ +#!/usr/bin/env node + +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ + +var shell = require('shelljs'), + path = require('path'), + ROOT = path.join(__dirname, '..', '..'); + +/* + * Cleans the project using ant + */ +module.exports.run = function() { + var cmd = 'ant clean -f ' + path.join(ROOT, 'build.xml'); + var result = shell.exec(cmd, {silent:false, async:false}); + if (result.code > 0) { + console.error('ERROR: Failed to clean android project.'); + console.error(result.output); + process.exit(2); + } +} + +module.exports.help = function() { + console.log('Usage: ' + path.relative(process.cwd(), path.join(ROOT, 'cordova', 'clean'))); + console.log('Cleans the project directory.'); + process.exit(0); +} diff --git a/cordova-lib/spec-cordova-misc/fixtures/platforms/android/cordova/lib/device.js b/cordova-lib/spec-cordova-misc/fixtures/platforms/android/cordova/lib/device.js new file mode 100755 index 000000000..363dc2bd0 --- /dev/null +++ b/cordova-lib/spec-cordova-misc/fixtures/platforms/android/cordova/lib/device.js @@ -0,0 +1,95 @@ +#!/usr/bin/env node + +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ + +var shell = require('shelljs'), + path = require('path'), + build = require('./build'), + appinfo = require('./appinfo'), + exec = require('child_process').exec, + ROOT = path.join(__dirname, '..', '..'); + +/** + * Returns a list of the device ID's found + */ +module.exports.list = function() { + var cmd = 'adb devices'; + var result = shell.exec(cmd, {silent:true, async:false}); + if (result.code > 0) { + console.error('Failed to execute android command \'' + cmd + '\'.'); + process.exit(2); + } else { + var response = result.output.split('\n'); + var device_list = []; + for (var i = 1; i < response.length; i++) { + if (response[i].match(/\w+\tdevice/) && !response[i].match(/emulator/)) { + device_list.push(response[i].replace(/\tdevice/, '').replace('\r', '')); + } + } + return device_list; + } +} + +/* + * Installs a previously built application on the device + * and launches it. + */ +module.exports.install = function(target) { + var device_list = this.list(); + if (device_list.length > 0) { + // default device + target = typeof target !== 'undefined' ? target : device_list[0]; + if (device_list.indexOf(target) > -1) { + var apk_path = build.get_apk(); + var launchName = appinfo.getActivityName(); + console.log('Installing app on device...'); + cmd = 'adb -s ' + target + ' install -r ' + apk_path; + var install = shell.exec(cmd, {silent:false, async:false}); + if (install.error || install.output.match(/Failure/)) { + console.error('ERROR : Failed to install apk to device : '); + console.error(install.output); + process.exit(2); + } + + //unlock screen + cmd = 'adb -s ' + target + ' shell input keyevent 82'; + shell.exec(cmd, {silent:true, async:false}); + + // launch the application + console.log('Launching application...'); + cmd = 'adb -s ' + target + ' shell am start -W -a android.intent.action.MAIN -n ' + launchName; + var launch = shell.exec(cmd, {silent:true, async:false}); + if(launch.code > 0) { + console.error('ERROR : Failed to launch application on emulator : ' + launch.error); + console.error(launch.output); + process.exit(2); + } else { + console.log('LAUNCH SUCCESS'); + } + } else { + console.error('ERROR : Unable to find target \'' + target + '\'.'); + console.error('Failed to deploy to device.'); + process.exit(2); + } + } else { + console.error('ERROR : Failed to deploy to device, no devices found.'); + process.exit(2); + } +} diff --git a/cordova-lib/spec-cordova-misc/fixtures/platforms/android/cordova/lib/emulator.js b/cordova-lib/spec-cordova-misc/fixtures/platforms/android/cordova/lib/emulator.js new file mode 100755 index 000000000..cc658a9b9 --- /dev/null +++ b/cordova-lib/spec-cordova-misc/fixtures/platforms/android/cordova/lib/emulator.js @@ -0,0 +1,337 @@ +#!/usr/bin/env node + +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ + +var shell = require('shelljs'), + path = require('path'), + appinfo = require('./appinfo'), + build = require('./build'), + ROOT = path.join(__dirname, '..', '..'), + new_emulator = 'cordova_emulator'; + +/** + * Returns a list of emulator images in the form of objects + * { + name : , + path : , + target : , + abi : , + skin : + } + */ +module.exports.list_images = function() { + var cmd = 'android list avds'; + var result = shell.exec(cmd, {silent:true, async:false}); + if (result.code > 0) { + console.error('Failed to execute android command \'' + cmd + '\'.'); + process.exit(2); + } else { + var response = result.output.split('\n'); + var emulator_list = []; + for (var i = 1; i < response.length; i++) { + // To return more detailed information use img_obj + var img_obj = {}; + if (response[i].match(/Name:\s/)) { + img_obj['name'] = response[i].split('Name: ')[1].replace('\r', ''); + if (response[i + 1].match(/Path:\s/)) { + i++; + img_obj['path'] = response[i].split('Path: ')[1].replace('\r', ''); + } + if (response[i + 1].match(/\(API\slevel\s/)) { + i++; + img_obj['target'] = response[i].replace('\r', ''); + } + if (response[i + 1].match(/ABI:\s/)) { + i++; + img_obj['abi'] = response[i].split('ABI: ')[1].replace('\r', ''); + } + if (response[i + 1].match(/Skin:\s/)) { + i++; + img_obj['skin'] = response[i].split('Skin: ')[1].replace('\r', ''); + } + + emulator_list.push(img_obj); + } + /* To just return a list of names use this + if (response[i].match(/Name:\s/)) { + emulator_list.push(response[i].split('Name: ')[1].replace('\r', ''); + }*/ + + } + return emulator_list; + } +} + +/** + * Will return the closest avd to the projects target + * or undefined if no avds exist. + */ +module.exports.best_image = function() { + var project_target = this.get_target().replace('android-', ''); + var images = this.list_images(); + var closest = 9999; + var best = images[0]; + for (i in images) { + var target = images[i].target; + if(target) { + var num = target.split('(API level ')[1].replace(')', ''); + if (num == project_target) { + return images[i]; + } else if (project_target - num < closest && project_target > num) { + var closest = project_target - num; + best = images[i]; + } + } + } + return best; +} + +module.exports.list_started = function() { + var cmd = 'adb devices'; + var result = shell.exec(cmd, {silent:true, async:false}); + if (result.code > 0) { + console.error('Failed to execute android command \'' + cmd + '\'.'); + process.exit(2); + } else { + var response = result.output.split('\n'); + var started_emulator_list = []; + for (var i = 1; i < response.length; i++) { + if (response[i].match(/device/) && response[i].match(/emulator/)) { + started_emulator_list.push(response[i].replace(/\tdevice/, '').replace('\r', '')); + } + } + return started_emulator_list; + } +} + +module.exports.get_target = function() { + var target = shell.grep(/target=android-[\d+]/, path.join(ROOT, 'project.properties')); + return target.split('=')[1].replace('\n', '').replace('\r', '').replace(' ', ''); +} + +module.exports.list_targets = function() { + var target_out = shell.exec('android list targets', {silent:true, async:false}).output.split('\n'); + var targets = []; + for (var i = target_out.length; i >= 0; i--) { + if(target_out[i].match(/id:/)) { + targets.push(targets[i].split(' ')[1]); + } + } + return targets; +} + +/* + * Starts an emulator with the given ID, + * and returns the started ID of that emulator. + * If no ID is given it will used the first image availible, + * if no image is availible it will error out (maybe create one?). + */ +module.exports.start = function(emulator_ID) { + var started_emulators = this.list_started(); + var num_started = started_emulators.length; + if (typeof emulator_ID === 'undefined') { + var emulator_list = this.list_images(); + if (emulator_list.length > 0) { + emulator_ID = this.best_image().name; + console.log('WARNING : no emulator specified, defaulting to ' + emulator_ID); + } else { + console.error('ERROR : No emulator images (avds) found, if you would like to create an'); + console.error(' avd follow the instructions provided here : '); + console.error(' http://developer.android.com/tools/devices/index.html') + console.error(' Or run \'android create avd --name --target \' '); + console.error(' in on the command line.'); + process.exit(2); + /*console.log('WARNING : no emulators availible, creating \'' + new_emulator + '\'.'); + this.create_image(new_emulator, this.get_target()); + emulator_ID = new_emulator;*/ + } + } + + var pipe_null = (process.platform == 'win32' || process.platform == 'win64'? '> NUL' : '> /dev/null'); + var cmd = 'emulator -avd ' + emulator_ID + ' ' + pipe_null + ' &'; + if(process.platform == 'win32' || process.platform == 'win64') { + cmd = '%comspec% /c start cmd /c ' + cmd; + } + var result = shell.exec(cmd, {silent:true, async:false}, function(code, output) { + if (code > 0) { + console.error('Failed to execute android command \'' + cmd + '\'.'); + console.error(output); + process.exit(2); + } + }); + + // wait for emulator to start + console.log('Waiting for emulator...'); + var new_started = this.wait_for_emulator(num_started); + var emulator_id; + if (new_started.length > 1) { + for (i in new_started) { + console.log(new_started[i]); + console.log(started_emulators.indexOf(new_started[i])); + if (started_emulators.indexOf(new_started[i]) < 0) { + emulator_id = new_started[i]; + } + } + } else { + emulator_id = new_started[0]; + } + if (!emulator_id) { + console.error('ERROR : Failed to start emulator, could not find new emulator'); + process.exit(2); + } + + //wait for emulator to boot up + process.stdout.write('Booting up emulator (this may take a while)...'); + this.wait_for_boot(emulator_id); + console.log('BOOT COMPLETE'); + + //unlock screen + cmd = 'adb -s ' + emulator_id + ' shell input keyevent 82'; + shell.exec(cmd, {silent:false, async:false}); + + //return the new emulator id for the started emulators + return emulator_id; +} + +/* + * Waits for the new emulator to apear on the started-emulator list. + */ +module.exports.wait_for_emulator = function(num_running) { + var new_started = this.list_started(); + if (new_started.length > num_running) { + return new_started; + } else { + this.sleep(1); + return this.wait_for_emulator(num_running); + } +} + +/* + * Waits for the boot animation property of the emulator to switch to 'stopped' + */ +module.exports.wait_for_boot = function(emulator_id) { + var cmd; + // ShellJS opens a lot of file handles, and the default on OS X is too small. + // TODO : This is not working, need to find a better way to increese the ulimit. + if(process.platform == 'win32' || process.platform == 'win64') { + cmd = 'adb -s ' + emulator_id + ' shell getprop init.svc.bootanim'; + } else { + cmd = 'ulimit -S -n 4096; adb -s ' + emulator_id + ' shell getprop init.svc.bootanim'; + } + var boot_anim = shell.exec(cmd, {silent:true, async:false}); + if (boot_anim.output.match(/stopped/)) { + return; + } else { + process.stdout.write('.'); + this.sleep(3); + return this.wait_for_boot(emulator_id); + } +} + +/* + * TODO : find a better way to wait for the emulator (maybe using async methods?) + */ +module.exports.sleep = function(time_sec) { + if (process.platform == 'win32' || process.platform == 'win64') { + shell.exec('ping 127.0.0.1 -n ' + time_sec, {silent:true, async:false}); + } else { + shell.exec('sleep ' + time_sec, {silent:true, async:false}); + } +} + +/* + * Create avd + * TODO : Enter the stdin input required to complete the creation of an avd. + */ +module.exports.create_image = function(name, target) { + console.log('Creating avd named ' + name); + if (target) { + var cmd = 'android create avd --name ' + name + ' --target ' + target; + var create = shell.exec(cmd, {sient:false, async:false}); + if (create.error) { + console.error('ERROR : Failed to create emulator image : '); + console.error(' Do you have the latest android targets including ' + target + '?'); + console.error(create.output); + process.exit(2); + } + } else { + console.log('WARNING : Project target not found, creating avd with a different target but the project may fail to install.'); + var cmd = 'android create avd --name ' + name + ' --target ' + this.list_targets()[0]; + var create = shell.exec(cmd, {sient:false, async:false}); + if (create.error) { + console.error('ERROR : Failed to create emulator image : '); + console.error(create.output); + process.exit(2); + } + console.error('ERROR : Unable to create an avd emulator, no targets found.'); + console.error('Please insure you have targets availible by runing the "android" command'). + process.exit(2); + } +} + +/* + * Installs a previously built application on the emulator and launches it. + * If no target is specified, then it picks one. + * If no started emulators are found, error out. + */ +module.exports.install = function(target) { + var emulator_list = this.list_started(); + if (emulator_list.length < 1) { + console.error('ERROR : No started emulators found, please start an emultor before deploying your project.'); + process.exit(2); + /*console.log('WARNING : No started emulators found, attemting to start an avd...'); + this.start(this.best_image().name);*/ + } + // default emulator + target = typeof target !== 'undefined' ? target : emulator_list[0]; + if (emulator_list.indexOf(target) > -1) { + console.log('Installing app on emulator...'); + var apk_path = build.get_apk(); + var cmd = 'adb -s ' + target + ' install -r ' + apk_path; + var install = shell.exec(cmd, {sient:false, async:false}); + if (install.error || install.output.match(/Failure/)) { + console.error('ERROR : Failed to install apk to emulator : '); + console.error(install.output); + process.exit(2); + } + + //unlock screen + cmd = 'adb -s ' + target + ' shell input keyevent 82'; + shell.exec(cmd, {silent:true, async:false}); + + // launch the application + console.log('Launching application...'); + var launchName = appinfo.getActivityName(); + cmd = 'adb -s ' + target + ' shell am start -W -a android.intent.action.MAIN -n ' + launchName; + console.log(cmd); + var launch = shell.exec(cmd, {silent:false, async:false}); + if(launch.code > 0) { + console.error('ERROR : Failed to launch application on emulator : ' + launch.error); + console.error(launch.output); + process.exit(2); + } else { + console.log('LAUNCH SUCCESS'); + } + } else { + console.error('ERROR : Unable to find target \'' + target + '\'.'); + console.error('Failed to deploy to emulator.'); + process.exit(2); + } +} diff --git a/cordova-lib/spec-cordova-misc/fixtures/platforms/android/cordova/lib/install-device b/cordova-lib/spec-cordova-misc/fixtures/platforms/android/cordova/lib/install-device new file mode 100755 index 000000000..679efbf97 --- /dev/null +++ b/cordova-lib/spec-cordova-misc/fixtures/platforms/android/cordova/lib/install-device @@ -0,0 +1,38 @@ +#!/usr/bin/env node + +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ + +var device = require('./device'), + args = process.argv; + +if(args.length > 2) { + var install_target; + if (args[2].substring(0, 9) == '--target=') { + install_target = args[2].substring(9, args[2].length); + device.install(install_target); + process.exit(0); + } else { + console.error('ERROR : argument \'' + args[2] + '\' not recognized.'); + process.exit(2); + } +} else { + device.install(); + process.exit(0); +} diff --git a/cordova-lib/spec-cordova-misc/fixtures/platforms/android/cordova/lib/install-emulator b/cordova-lib/spec-cordova-misc/fixtures/platforms/android/cordova/lib/install-emulator new file mode 100755 index 000000000..c006eb264 --- /dev/null +++ b/cordova-lib/spec-cordova-misc/fixtures/platforms/android/cordova/lib/install-emulator @@ -0,0 +1,38 @@ +#!/usr/bin/env node + +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ + +var emulator = require('./emulator'), + args = process.argv; + +if(args.length > 2) { + var install_target; + if (args[2].substring(0, 9) == '--target=') { + install_target = args[2].substring(9, args[2].length); + emulator.install(install_target); + process.exit(0); + } else { + console.error('ERROR : argument \'' + args[2] + '\' not recognized.'); + process.exit(2); + } +} else { + emulator.install(); + process.exit(0); +} diff --git a/cordova-lib/spec-cordova-misc/fixtures/platforms/android/cordova/lib/list-devices b/cordova-lib/spec-cordova-misc/fixtures/platforms/android/cordova/lib/list-devices new file mode 100755 index 000000000..3ef4efab2 --- /dev/null +++ b/cordova-lib/spec-cordova-misc/fixtures/platforms/android/cordova/lib/list-devices @@ -0,0 +1,28 @@ +#!/usr/bin/env node + +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ + +var devices = require('./device'); + +// Usage support for when args are given +var device_list = devices.list(); +for(device in device_list) { + console.log(device_list[device]); +} diff --git a/cordova-lib/spec-cordova-misc/fixtures/platforms/android/cordova/lib/list-emulator-images b/cordova-lib/spec-cordova-misc/fixtures/platforms/android/cordova/lib/list-emulator-images new file mode 100755 index 000000000..3230537a7 --- /dev/null +++ b/cordova-lib/spec-cordova-misc/fixtures/platforms/android/cordova/lib/list-emulator-images @@ -0,0 +1,29 @@ +#!/usr/bin/env node + +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ + +var emulators = require('./emulator'); + +// Usage support for when args are given +var emulator_list = emulators.list_images(); +for(emulator in emulator_list) { + console.log(emulator_list[emulator].name); + process.exit(0); +} diff --git a/cordova-lib/spec-cordova-misc/fixtures/platforms/android/cordova/lib/list-started-emulators b/cordova-lib/spec-cordova-misc/fixtures/platforms/android/cordova/lib/list-started-emulators new file mode 100755 index 000000000..525a64c17 --- /dev/null +++ b/cordova-lib/spec-cordova-misc/fixtures/platforms/android/cordova/lib/list-started-emulators @@ -0,0 +1,29 @@ +#!/usr/bin/env node + +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ + +var emulators = require('./emulator'); + +// Usage support for when args are given +var emulator_list = emulators.list_started(); +for(emulator in emulator_list) { + console.log(emulator_list[emulator]); + process.exit(0); +} diff --git a/cordova-lib/spec-cordova-misc/fixtures/platforms/android/cordova/lib/log.js b/cordova-lib/spec-cordova-misc/fixtures/platforms/android/cordova/lib/log.js new file mode 100755 index 000000000..b85cf6063 --- /dev/null +++ b/cordova-lib/spec-cordova-misc/fixtures/platforms/android/cordova/lib/log.js @@ -0,0 +1,43 @@ +#!/usr/bin/env node + +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ + +var shell = require('shelljs'), + path = require('path'), + ROOT = path.join(__dirname, '..', '..'); + +/* + * Starts running logcat in the shell. + */ +module.exports.run = function() { + var cmd = 'adb logcat | grep -v nativeGetEnabledTags'; + var result = shell.exec(cmd, {silent:false, async:false}); + if (result.code > 0) { + console.error('ERROR: Failed to run logcat command.'); + console.error(result.output); + process.exit(2); + } +} + +module.exports.help = function() { + console.log('Usage: ' + path.relative(process.cwd(), path.join(ROOT, 'cordova', 'log'))); + console.log('Gives the logcat output on the command line.'); + process.exit(0); +} diff --git a/cordova-lib/spec-cordova-misc/fixtures/platforms/android/cordova/lib/run.js b/cordova-lib/spec-cordova-misc/fixtures/platforms/android/cordova/lib/run.js new file mode 100755 index 000000000..787d12325 --- /dev/null +++ b/cordova-lib/spec-cordova-misc/fixtures/platforms/android/cordova/lib/run.js @@ -0,0 +1,124 @@ +#!/usr/bin/env node + +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ + +var path = require('path'), + build = require('./build'), + emulator = require('./emulator'), + device = require('./device'), + ROOT = path.join(__dirname, '..', '..'); + +/* + * Runs the application on a device if availible. + * If not device is found, it will use a started emulator. + * If no started emulators are found it will attempt to start an avd. + * If no avds are found it will error out. + */ + module.exports.run = function(args) { + var build_type; + var install_target; + + for (var i=2; i -1) { + device.install(install_target); + } else if (started_emulators.indexOf(install_target) > -1) { + emulator.install(install_target); + } else { + // if target emulator isn't started, then start it. + var emulator_ID; + for(avd in avds) { + if(avds[avd].name == install_target) { + emulator_ID = emulator.start(install_target); + emulator.install(emulator_ID); + break; + } + } + if(!emulator_ID) { + console.error('ERROR : Target \'' + install_target + '\' not found, unalbe to run project'); + process.exit(2); + } + } + } else { + // no target given, deploy to device if availible, otherwise use the emulator. + var device_list = device.list(); + if (device_list.length > 0) { + console.log('WARNING : No target specified, deploying to device \'' + device_list[0] + '\'.'); + device.install(device_list[0]) + } else { + var emulator_list = emulator.list_started(); + if (emulator_list.length > 0) { + console.log('WARNING : No target specified, deploying to emulator \'' + emulator_list[0] + '\'.'); + emulator.install(emulator_list[0]); + } else { + console.log('WARNING : No started emulators found, starting an emulator.'); + var best_avd = emulator.best_image(); + if(best_avd) { + var emulator_ID = emulator.start(best_avd.name); + console.log('WARNING : No target specified, deploying to emulator \'' + emulator_ID + '\'.'); + emulator.install(emulator_ID); + } else { + emulator.start(); + } + } + } + } +} + +module.exports.help = function() { + console.log('Usage: ' + path.relative(process.cwd(), path.join(ROOT, 'cordova', 'run')) + ' [options]'); + console.log('Build options :'); + console.log(' --debug : Builds project in debug mode'); + console.log(' --release : Builds project in release mode'); + console.log(' --nobuild : Runs the currently built project without recompiling'); + console.log('Deploy options :'); + console.log(' --device : Will deploy the built project to a device'); + console.log(' --emulator : Will deploy the built project to an emulator if one exists'); + console.log(' --target= : Installs to the target with the specified id.'); + process.exit(0); +} diff --git a/cordova-lib/spec-cordova-misc/fixtures/platforms/android/cordova/lib/start-emulator b/cordova-lib/spec-cordova-misc/fixtures/platforms/android/cordova/lib/start-emulator new file mode 100755 index 000000000..5d6c4dd9e --- /dev/null +++ b/cordova-lib/spec-cordova-misc/fixtures/platforms/android/cordova/lib/start-emulator @@ -0,0 +1,38 @@ +#!/usr/bin/env node + +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ + +var emulator = require('./emulator'), + args = process.argv; + +if(args.length > 2) { + var install_target; + if (args[2].substring(0, 9) == '--target=') { + install_target = args[2].substring(9, args[2].length); + emulator.start(install_target); + process.exit(0); + } else { + console.error('ERROR : argument \'' + args[2] + '\' not recognized.'); + process.exit(2); + } +} else { + emulator.start(); + process.exit(0); +} diff --git a/cordova-lib/spec-cordova-misc/fixtures/platforms/android/cordova/log b/cordova-lib/spec-cordova-misc/fixtures/platforms/android/cordova/log new file mode 100755 index 000000000..087325f8d --- /dev/null +++ b/cordova-lib/spec-cordova-misc/fixtures/platforms/android/cordova/log @@ -0,0 +1,33 @@ +#!/usr/bin/env node + +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ + +var log = require('./lib/log'), + reqs = require('./lib/check_reqs'), + args = process.argv; + +// Usage support for when args are given +if(args.length > 2) { + log.help(); +} else if(reqs.run()) { + log.run(); +} else { + process.exit(2); +} diff --git a/cordova-lib/spec-cordova-misc/fixtures/platforms/android/cordova/run b/cordova-lib/spec-cordova-misc/fixtures/platforms/android/cordova/run new file mode 100755 index 000000000..57d73459b --- /dev/null +++ b/cordova-lib/spec-cordova-misc/fixtures/platforms/android/cordova/run @@ -0,0 +1,35 @@ +#!/usr/bin/env node + +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ + +var run = require('./lib/run'), + reqs = require('./lib/check_reqs'), + args = process.argv; + +// Support basic help commands +if (args[2] == '--help' || args[2] == '/?' || args[2] == '-h' || + args[2] == 'help' || args[2] == '-help' || args[2] == '/help') { + run.help(); +} else if(reqs.run()) { + run.run(args); + process.exit(0); +} else { + process.exit(2); +} diff --git a/cordova-lib/spec-cordova-misc/fixtures/platforms/android/cordova/version b/cordova-lib/spec-cordova-misc/fixtures/platforms/android/cordova/version new file mode 100755 index 000000000..de1a76dd4 --- /dev/null +++ b/cordova-lib/spec-cordova-misc/fixtures/platforms/android/cordova/version @@ -0,0 +1,25 @@ +#!/usr/bin/env node + +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ + +// Coho updates this line: +var VERSION = "3.1.0"; + +console.log(VERSION); diff --git a/cordova-lib/spec-cordova-misc/fixtures/platforms/android/local.properties b/cordova-lib/spec-cordova-misc/fixtures/platforms/android/local.properties new file mode 100644 index 000000000..d3f507212 --- /dev/null +++ b/cordova-lib/spec-cordova-misc/fixtures/platforms/android/local.properties @@ -0,0 +1,10 @@ +# This file is automatically generated by Android Tools. +# Do not modify this file -- YOUR CHANGES WILL BE ERASED! +# +# This file must *NOT* be checked into Version Control Systems, +# as it contains information specific to your local configuration. + +# location of the SDK. This is only used by Ant +# For customization when using a Version Control System, please read the +# header note. +sdk.dir=/Users/braden/cordova/android/android-sdk-macosx diff --git a/cordova-lib/spec-cordova-misc/fixtures/platforms/android/proguard-project.txt b/cordova-lib/spec-cordova-misc/fixtures/platforms/android/proguard-project.txt new file mode 100644 index 000000000..f2fe1559a --- /dev/null +++ b/cordova-lib/spec-cordova-misc/fixtures/platforms/android/proguard-project.txt @@ -0,0 +1,20 @@ +# To enable ProGuard in your project, edit project.properties +# to define the proguard.config property as described in that file. +# +# Add project specific ProGuard rules here. +# By default, the flags in this file are appended to flags specified +# in ${sdk.dir}/tools/proguard/proguard-android.txt +# You can edit the include path and order by changing the ProGuard +# include property in project.properties. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# Add any project specific keep options here: + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} diff --git a/cordova-lib/spec-cordova-misc/fixtures/platforms/android/project.properties b/cordova-lib/spec-cordova-misc/fixtures/platforms/android/project.properties new file mode 100644 index 000000000..a3ee5ab64 --- /dev/null +++ b/cordova-lib/spec-cordova-misc/fixtures/platforms/android/project.properties @@ -0,0 +1,14 @@ +# This file is automatically generated by Android Tools. +# Do not modify this file -- YOUR CHANGES WILL BE ERASED! +# +# This file must be checked in Version Control Systems. +# +# To customize properties used by the Ant build system edit +# "ant.properties", and override values to adapt the script to your +# project structure. +# +# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home): +#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt + +# Project target. +target=android-17 diff --git a/cordova-lib/spec-cordova-misc/fixtures/platforms/android/res/drawable-hdpi/icon.png b/cordova-lib/spec-cordova-misc/fixtures/platforms/android/res/drawable-hdpi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..4d27634485b3a20d8a0188107e84812f4f71084b GIT binary patch literal 6080 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 literal 0 HcmV?d00001 diff --git a/cordova-lib/spec-cordova-misc/fixtures/platforms/android/res/drawable-ldpi/icon.png b/cordova-lib/spec-cordova-misc/fixtures/platforms/android/res/drawable-ldpi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..cd5032a4f2e0b734d4bdece13564c4b55de963a6 GIT binary patch literal 3096 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 literal 0 HcmV?d00001 diff --git a/cordova-lib/spec-cordova-misc/fixtures/platforms/android/res/drawable-mdpi/icon.png b/cordova-lib/spec-cordova-misc/fixtures/platforms/android/res/drawable-mdpi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..e79c6062c1dcd9e98f092dbd7e51b5b76dd897d2 GIT binary patch literal 4090 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 literal 0 HcmV?d00001 diff --git a/cordova-lib/spec-cordova-misc/fixtures/platforms/android/res/drawable-xhdpi/icon.png b/cordova-lib/spec-cordova-misc/fixtures/platforms/android/res/drawable-xhdpi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..ec7ffbfbdafc58df28e6e89041ee21acd0f6177e GIT binary patch literal 7685 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 literal 0 HcmV?d00001 diff --git a/cordova-lib/spec-cordova-misc/fixtures/platforms/android/res/drawable/icon.png b/cordova-lib/spec-cordova-misc/fixtures/platforms/android/res/drawable/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..ec7ffbfbdafc58df28e6e89041ee21acd0f6177e GIT binary patch literal 7685 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 literal 0 HcmV?d00001 diff --git a/cordova-lib/spec-cordova-misc/fixtures/platforms/android/res/values/strings.xml b/cordova-lib/spec-cordova-misc/fixtures/platforms/android/res/values/strings.xml new file mode 100644 index 000000000..1e706b395 --- /dev/null +++ b/cordova-lib/spec-cordova-misc/fixtures/platforms/android/res/values/strings.xml @@ -0,0 +1,4 @@ + + + TestBase + diff --git a/cordova-lib/spec-cordova-misc/fixtures/platforms/android/res/xml/config.xml b/cordova-lib/spec-cordova-misc/fixtures/platforms/android/res/xml/config.xml new file mode 100644 index 000000000..17ca23749 --- /dev/null +++ b/cordova-lib/spec-cordova-misc/fixtures/platforms/android/res/xml/config.xml @@ -0,0 +1,18 @@ + + + Hello Cordova + + A sample Apache Cordova application that responds to the deviceready event. + + + + + + + + Apache Cordova Team + + + + + diff --git a/cordova-lib/spec-cordova-misc/fixtures/platforms/android/src/org/testing/TestBase.java b/cordova-lib/spec-cordova-misc/fixtures/platforms/android/src/org/testing/TestBase.java new file mode 100644 index 000000000..928e074c2 --- /dev/null +++ b/cordova-lib/spec-cordova-misc/fixtures/platforms/android/src/org/testing/TestBase.java @@ -0,0 +1,37 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. + */ + +package org.testing; + +import android.os.Bundle; +import org.apache.cordova.*; + +public class TestBase extends CordovaActivity +{ + @Override + public void onCreate(Bundle savedInstanceState) + { + super.onCreate(savedInstanceState); + super.init(); + // Set by in config.xml + super.loadUrl(Config.getStartUrl()); + //super.loadUrl("file:///android_asset/www/index.html") + } +} + diff --git a/cordova-lib/spec-cordova-misc/fixtures/plugins/ChildBrowser/plugin.xml b/cordova-lib/spec-cordova-misc/fixtures/plugins/ChildBrowser/plugin.xml new file mode 100644 index 000000000..11ddd86d3 --- /dev/null +++ b/cordova-lib/spec-cordova-misc/fixtures/plugins/ChildBrowser/plugin.xml @@ -0,0 +1,126 @@ + + + + + + Child Browser + + + + + + + + + + + + + + No matter what platform you are installing to, this notice is very important. + + + + + + + + + + + + + + + + + + + + + + Please make sure you read this because it is very important to complete the installation of your plugin. + + + + + + + + + + + + + + + $APP_ID + + + + + + PackageName + $PACKAGE_NAME + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cordova-lib/spec-cordova-misc/fixtures/plugins/ChildBrowser/src/android/ChildBrowser.java b/cordova-lib/spec-cordova-misc/fixtures/plugins/ChildBrowser/src/android/ChildBrowser.java new file mode 100644 index 000000000..5263b0c5d --- /dev/null +++ b/cordova-lib/spec-cordova-misc/fixtures/plugins/ChildBrowser/src/android/ChildBrowser.java @@ -0,0 +1,19 @@ +/* + * + * Copyright 2013 Anis Kadri + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + diff --git a/cordova-lib/spec-cordova-misc/fixtures/plugins/ChildBrowser/www/childbrowser.js b/cordova-lib/spec-cordova-misc/fixtures/plugins/ChildBrowser/www/childbrowser.js new file mode 100644 index 000000000..5263b0c5d --- /dev/null +++ b/cordova-lib/spec-cordova-misc/fixtures/plugins/ChildBrowser/www/childbrowser.js @@ -0,0 +1,19 @@ +/* + * + * Copyright 2013 Anis Kadri + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + diff --git a/cordova-lib/spec-cordova-misc/fixtures/plugins/ChildBrowser/www/childbrowser/image.jpg b/cordova-lib/spec-cordova-misc/fixtures/plugins/ChildBrowser/www/childbrowser/image.jpg new file mode 100644 index 000000000..257cc5642 --- /dev/null +++ b/cordova-lib/spec-cordova-misc/fixtures/plugins/ChildBrowser/www/childbrowser/image.jpg @@ -0,0 +1 @@ +foo diff --git a/cordova-lib/spec-cordova-misc/fixtures/plugins/ChildBrowser/www/childbrowser_file.html b/cordova-lib/spec-cordova-misc/fixtures/plugins/ChildBrowser/www/childbrowser_file.html new file mode 100644 index 000000000..6de7b8c69 --- /dev/null +++ b/cordova-lib/spec-cordova-misc/fixtures/plugins/ChildBrowser/www/childbrowser_file.html @@ -0,0 +1 @@ +This is a test file. diff --git a/cordova-lib/spec-cordova-misc/fixtures/plugins/android/plugin.xml b/cordova-lib/spec-cordova-misc/fixtures/plugins/android/plugin.xml new file mode 100644 index 000000000..d8f561906 --- /dev/null +++ b/cordova-lib/spec-cordova-misc/fixtures/plugins/android/plugin.xml @@ -0,0 +1,14 @@ + + + + Android Plugin + + + + + + + diff --git a/cordova-lib/spec-cordova-misc/fixtures/plugins/android/src/android/Android.java b/cordova-lib/spec-cordova-misc/fixtures/plugins/android/src/android/Android.java new file mode 100644 index 000000000..e69de29bb diff --git a/cordova-lib/spec-cordova-misc/fixtures/plugins/android/src/android/SomethingWithR.java b/cordova-lib/spec-cordova-misc/fixtures/plugins/android/src/android/SomethingWithR.java new file mode 100644 index 000000000..c3af060d9 --- /dev/null +++ b/cordova-lib/spec-cordova-misc/fixtures/plugins/android/src/android/SomethingWithR.java @@ -0,0 +1,6 @@ +import com.yourapp.R; + +import android.app.*; + +public class SomethingWithR { +} diff --git a/cordova-lib/spec-cordova-misc/fixtures/plugins/android/www/android.js b/cordova-lib/spec-cordova-misc/fixtures/plugins/android/www/android.js new file mode 100644 index 000000000..e69de29bb diff --git a/cordova-lib/spec-cordova-misc/fixtures/plugins/fake1/plugin.xml b/cordova-lib/spec-cordova-misc/fixtures/plugins/fake1/plugin.xml new file mode 100644 index 000000000..ffdc650ad --- /dev/null +++ b/cordova-lib/spec-cordova-misc/fixtures/plugins/fake1/plugin.xml @@ -0,0 +1,10 @@ + + + + Fake1 + Cordova fake plugin for tests + Apache 2.0 + cordova,cli,test + diff --git a/cordova-lib/spec-cordova-misc/fixtures/plugins/test/plugin.xml b/cordova-lib/spec-cordova-misc/fixtures/plugins/test/plugin.xml new file mode 100644 index 000000000..774eda1de --- /dev/null +++ b/cordova-lib/spec-cordova-misc/fixtures/plugins/test/plugin.xml @@ -0,0 +1,14 @@ + + + + Test Plugin + + + + + + + diff --git a/cordova-lib/spec-cordova-misc/fixtures/plugins/test/www/test.js b/cordova-lib/spec-cordova-misc/fixtures/plugins/test/www/test.js new file mode 100644 index 000000000..e69de29bb diff --git a/cordova-lib/spec-cordova-misc/fixtures/projects/android/AndroidManifest.xml b/cordova-lib/spec-cordova-misc/fixtures/projects/android/AndroidManifest.xml new file mode 100644 index 000000000..0c528031c --- /dev/null +++ b/cordova-lib/spec-cordova-misc/fixtures/projects/android/AndroidManifest.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cordova-lib/spec-cordova-misc/fixtures/projects/android/assets/www/.gitkeep b/cordova-lib/spec-cordova-misc/fixtures/projects/android/assets/www/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/cordova-lib/spec-cordova-misc/fixtures/projects/android/res/xml/config.xml b/cordova-lib/spec-cordova-misc/fixtures/projects/android/res/xml/config.xml new file mode 100644 index 000000000..d37aba5cd --- /dev/null +++ b/cordova-lib/spec-cordova-misc/fixtures/projects/android/res/xml/config.xml @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cordova-lib/spec-cordova-misc/fixtures/projects/android/src/.gitkeep b/cordova-lib/spec-cordova-misc/fixtures/projects/android/src/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/cordova-lib/spec-cordova-misc/fixtures/projects/windows/bom_test.xml b/cordova-lib/spec-cordova-misc/fixtures/projects/windows/bom_test.xml new file mode 100644 index 000000000..57cadf65d --- /dev/null +++ b/cordova-lib/spec-cordova-misc/fixtures/projects/windows/bom_test.xml @@ -0,0 +1,24 @@ + + + + + diff --git a/cordova-lib/spec-cordova-misc/fixtures/templates/no_content_config.xml b/cordova-lib/spec-cordova-misc/fixtures/templates/no_content_config.xml new file mode 100644 index 000000000..7c4ef3d2c --- /dev/null +++ b/cordova-lib/spec-cordova-misc/fixtures/templates/no_content_config.xml @@ -0,0 +1,19 @@ + + + Hello Cordova + + + A sample Apache Cordova application that responds to the deviceready event. + + + + Apache Cordova Team + + + + + + diff --git a/cordova-lib/spec-cordova-misc/helpers.js b/cordova-lib/spec-cordova-misc/helpers.js new file mode 100644 index 000000000..3db75d5c9 --- /dev/null +++ b/cordova-lib/spec-cordova-misc/helpers.js @@ -0,0 +1,64 @@ +/** + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ + +var path = require('path'), + fs = require('fs'), + shell = require('shelljs'), + os = require('os'); + +module.exports.tmpDir = function(subdir) { + var dir = path.join(os.tmpdir(), 'e2e-test'); + if (subdir) { + dir = path.join(dir, subdir); + } + shell.mkdir('-p', dir); + return dir; +}; + +// Returns the platform that should be used for testing on this host platform. +/* +var host = os.platform(); +if (host.match(/win/)) { + module.exports.testPlatform = 'wp8'; +} else if (host.match(/darwin/)) { + module.exports.testPlatform = 'ios'; +} else { + module.exports.testPlatform = 'android'; +} +*/ + +// Just use Android everywhere; we're mocking out any calls to the `android` binary. +module.exports.testPlatform = 'android'; + +// Add the toExist matcher. +beforeEach(function() { + this.addMatchers({ + 'toExist': function() { + var notText = this.isNot ? ' not' : ''; + var self = this; + + this.message = function() { + return 'Expected file ' + self.actual + notText + ' to exist.'; + }; + + return fs.existsSync(this.actual); + } + }); +}); + diff --git a/cordova-lib/spec-cordova/hooker.spec.js b/cordova-lib/spec-cordova-misc/hooker.spec.js similarity index 99% rename from cordova-lib/spec-cordova/hooker.spec.js rename to cordova-lib/spec-cordova-misc/hooker.spec.js index 3696cb1c9..f50b2516c 100644 --- a/cordova-lib/spec-cordova/hooker.spec.js +++ b/cordova-lib/spec-cordova-misc/hooker.spec.js @@ -19,7 +19,7 @@ var cordova = require('../src/cordova/cordova'), - hooker = require('../src/cordova/hooker'), + hooker = require('../src/cordova/misc/hooker'), shell = require('shelljs'), path = require('path'), fs = require('fs'), diff --git a/cordova-lib/spec-cordova/lazy_load.spec.js b/cordova-lib/spec-cordova-misc/lazy_load.spec.js similarity index 99% rename from cordova-lib/spec-cordova/lazy_load.spec.js rename to cordova-lib/spec-cordova-misc/lazy_load.spec.js index 25895d55c..9e8aa0938 100644 --- a/cordova-lib/spec-cordova/lazy_load.spec.js +++ b/cordova-lib/spec-cordova-misc/lazy_load.spec.js @@ -16,13 +16,13 @@ specific language governing permissions and limitations under the License. */ -var lazy_load = require('../src/cordova/lazy_load'), +var lazy_load = require('../src/cordova/misc/lazy_load'), config = require('../src/cordova/config'), util = require('../src/cordova/project/util'), shell = require('shelljs'), npmconf = require('npmconf'); path = require('path'), - hooker = require('../src/cordova/hooker'), + hooker = require('../src/cordova/misc/hooker'), request = require('request'), fs = require('fs'), Q = require('q'), diff --git a/cordova-lib/spec-cordova-project/emulate.spec.js b/cordova-lib/spec-cordova-project/emulate.spec.js index 55824ba93..73a91cedd 100644 --- a/cordova-lib/spec-cordova-project/emulate.spec.js +++ b/cordova-lib/spec-cordova-project/emulate.spec.js @@ -21,7 +21,7 @@ var cordova = require('../src/cordova/cordova'), superspawn = require('../src/cordova/server/superspawn'), path = require('path'), fs = require('fs'), - hooker = require('../src/cordova/hooker'), + hooker = require('../src/cordova/misc/hooker'), Q = require('q'), util = require('../src/cordova/project/util'), os = require('os'); diff --git a/cordova-lib/spec-cordova-project/run.spec.js b/cordova-lib/spec-cordova-project/run.spec.js index 991e3678a..95f9f715c 100644 --- a/cordova-lib/spec-cordova-project/run.spec.js +++ b/cordova-lib/spec-cordova-project/run.spec.js @@ -21,7 +21,7 @@ var cordova = require('../src/cordova/cordova'), superspawn = require('../src/cordova/server/superspawn'), path = require('path'), fs = require('fs'), - hooker = require('../src/cordova/hooker'), + hooker = require('../src/cordova/misc/hooker'), Q = require('q'), util = require('../src/cordova/project/util'); diff --git a/cordova-lib/spec-cordova-server/serve.spec.js b/cordova-lib/spec-cordova-server/serve.spec.js index b6501b6d2..8858a2436 100644 --- a/cordova-lib/spec-cordova-server/serve.spec.js +++ b/cordova-lib/spec-cordova-server/serve.spec.js @@ -23,7 +23,7 @@ var cordova = require('../src/cordova/cordova'), fs = require('fs'), Q = require('q'), util = require('../src/cordova/project/util'), - hooker = require('../src/cordova/hooker'), + hooker = require('../src/cordova/misc/hooker'), tempDir, http = require('http'), firefoxos_parser = require('../src/cordova/metadata/firefoxos_parser'), diff --git a/cordova-lib/src/cordova/build/build.js b/cordova-lib/src/cordova/build/build.js index d40f34bdb..9f7179334 100644 --- a/cordova-lib/src/cordova/build/build.js +++ b/cordova-lib/src/cordova/build/build.js @@ -22,7 +22,7 @@ */ var cordova_util = require('../project/util'), - hooker = require('../hooker'); + hooker = require('../misc/hooker'); // Returns a promise. module.exports = function build(options) { diff --git a/cordova-lib/src/cordova/build/compile.js b/cordova-lib/src/cordova/build/compile.js index 3b14e0635..2e8b64961 100644 --- a/cordova-lib/src/cordova/build/compile.js +++ b/cordova-lib/src/cordova/build/compile.js @@ -23,7 +23,7 @@ var path = require('path'), cordova_util = require('../project/util'), - hooker = require('../hooker'), + hooker = require('../misc/hooker'), superspawn = require('../server/superspawn'); // Returns a promise. diff --git a/cordova-lib/src/cordova/build/prepare.js b/cordova-lib/src/cordova/build/prepare.js index fea582b54..85a79060a 100644 --- a/cordova-lib/src/cordova/build/prepare.js +++ b/cordova-lib/src/cordova/build/prepare.js @@ -28,7 +28,7 @@ var cordova_util = require('../project/util'), fs = require('fs'), shell = require('shelljs'), et = require('elementtree'), - hooker = require('../hooker'), + hooker = require('../misc/hooker'), events = require('../../events'), Q = require('q'), plugman = require('../../plugman/plugman'); diff --git a/cordova-lib/src/cordova/cordova.js b/cordova-lib/src/cordova/cordova.js index 5f3958f2d..7b41b04ed 100644 --- a/cordova-lib/src/cordova/cordova.js +++ b/cordova-lib/src/cordova/cordova.js @@ -70,7 +70,7 @@ addModuleProperty(module, 'platform', './platform', true); addModuleProperty(module, 'platforms', './platform', true); addModuleProperty(module, 'compile', './build/compile', true); addModuleProperty(module, 'run', './project/run', true); -addModuleProperty(module, 'info', './info', true); +addModuleProperty(module, 'info', './project/info', true); addModuleProperty(module, 'save', './project/save', true); addModuleProperty(module, 'restore', './project/restore', true); diff --git a/cordova-lib/src/cordova/metadata/blackberry10_parser.js b/cordova-lib/src/cordova/metadata/blackberry10_parser.js index 9479ce28c..67a53ffbc 100644 --- a/cordova-lib/src/cordova/metadata/blackberry10_parser.js +++ b/cordova-lib/src/cordova/metadata/blackberry10_parser.js @@ -30,7 +30,7 @@ var fs = require('fs'), ConfigParser = require('../../configparser/ConfigParser'), CordovaError = require('../../CordovaError'), events = require('../../events'), - lazy_load = require('../lazy_load'); + lazy_load = require('../misc/lazy_load'); module.exports = function blackberry_parser(project) { if (!fs.existsSync(path.join(project, 'www'))) { diff --git a/cordova-lib/src/cordova/metadata/windows_parser.js b/cordova-lib/src/cordova/metadata/windows_parser.js index f16136cf2..f44569227 100644 --- a/cordova-lib/src/cordova/metadata/windows_parser.js +++ b/cordova-lib/src/cordova/metadata/windows_parser.js @@ -30,7 +30,7 @@ var fs = require('fs'), ConfigParser = require('../../configparser/ConfigParser'), CordovaError = require('../../CordovaError'), xml = require('../../util/xml-helpers'), - hooker = require('../hooker'), + hooker = require('../misc/hooker'), jsproj = require('../../util/windows/jsproj'); module.exports = function windows_parser(project) { diff --git a/cordova-lib/src/cordova/metadata/wp8_parser.js b/cordova-lib/src/cordova/metadata/wp8_parser.js index c5a1f697c..8fb4275d8 100644 --- a/cordova-lib/src/cordova/metadata/wp8_parser.js +++ b/cordova-lib/src/cordova/metadata/wp8_parser.js @@ -30,7 +30,7 @@ var fs = require('fs'), ConfigParser = require('../../configparser/ConfigParser'), CordovaError = require('../../CordovaError'), xml = require('../../util/xml-helpers'), - hooker = require('../hooker'), + hooker = require('../misc/hooker'), csproj = require('../../util/windows/csproj'); module.exports = function wp8_parser(project) { diff --git a/cordova-lib/src/cordova/hooker.js b/cordova-lib/src/cordova/misc/hooker.js similarity index 96% rename from cordova-lib/src/cordova/hooker.js rename to cordova-lib/src/cordova/misc/hooker.js index 1f80e635c..25ac35a6e 100644 --- a/cordova-lib/src/cordova/hooker.js +++ b/cordova-lib/src/cordova/misc/hooker.js @@ -21,12 +21,12 @@ indent:4, unused:vars, latedef:nofunc */ -var util = require('./project/util'), +var util = require('../project/util'), fs = require('fs'), os = require('os'), - events= require('../events'), - superspawn = require('./server/superspawn'), - CordovaError = require('../CordovaError'), + events= require('../../events'), + superspawn = require('../server/superspawn'), + CordovaError = require('../../CordovaError'), Q = require('q'), path = require('path'); @@ -136,7 +136,7 @@ function execute_scripts_serially(scripts, root, dir, opts) { var execOpts = {cwd: root, printCommand: opts.verbose, stdio: 'inherit'}; execOpts.env = {}; - execOpts.env.CORDOVA_VERSION = require('../../package').version; + execOpts.env.CORDOVA_VERSION = require('../../../package').version; execOpts.env.CORDOVA_PLATFORMS = opts.platforms ? opts.platforms.join() : ''; execOpts.env.CORDOVA_PLUGINS = opts.plugins?opts.plugins.join():''; execOpts.env.CORDOVA_HOOK = fullpath; diff --git a/cordova-lib/src/cordova/lazy_load.js b/cordova-lib/src/cordova/misc/lazy_load.js similarity index 98% rename from cordova-lib/src/cordova/lazy_load.js rename to cordova-lib/src/cordova/misc/lazy_load.js index 79f17a15d..4b67c4f85 100644 --- a/cordova-lib/src/cordova/lazy_load.js +++ b/cordova-lib/src/cordova/misc/lazy_load.js @@ -28,18 +28,18 @@ var path = require('path'), _ = require('underscore'), fs = require('fs'), shell = require('shelljs'), - platforms = require('./platforms'), + platforms = require('../platforms'), npmconf = require('npmconf'), - events = require('../events'), + events = require('../../events'), request = require('request'), - config = require('./config'), + config = require('../config'), hooker = require('./hooker'), zlib = require('zlib'), tar = require('tar'), URL = require('url'), Q = require('q'), npm = require('npm'), - util = require('./project/util'), + util = require('../project/util'), stubplatform = { url : undefined, version: undefined, diff --git a/cordova-lib/src/cordova/platform.js b/cordova-lib/src/cordova/platform.js index 2f5ddfd26..27e684774 100644 --- a/cordova-lib/src/cordova/platform.js +++ b/cordova-lib/src/cordova/platform.js @@ -30,9 +30,9 @@ var config = require('./config'), fs = require('fs'), os = require('os'), path = require('path'), - hooker = require('./hooker'), + hooker = require('./misc/hooker'), events = require('../events'), - lazy_load = require('./lazy_load'), + lazy_load = require('./misc/lazy_load'), CordovaError = require('../CordovaError'), Q = require('q'), platforms = require('./platforms'), diff --git a/cordova-lib/src/cordova/plugins/plugin.js b/cordova-lib/src/cordova/plugins/plugin.js index 283e0b89c..c0038b8cd 100644 --- a/cordova-lib/src/cordova/plugins/plugin.js +++ b/cordova-lib/src/cordova/plugins/plugin.js @@ -24,7 +24,7 @@ var cordova_util = require('../project/util'), path = require('path'), semver = require('semver'), - hooker = require('../hooker'), + hooker = require('../misc/hooker'), config = require('../config'), Q = require('q'), CordovaError = require('../../CordovaError'), diff --git a/cordova-lib/src/cordova/project/create.js b/cordova-lib/src/cordova/project/create.js index 1e489c5bb..711b96576 100644 --- a/cordova-lib/src/cordova/project/create.js +++ b/cordova-lib/src/cordova/project/create.js @@ -26,7 +26,7 @@ var path = require('path'), shell = require('shelljs'), events = require('../../events'), config = require('../config'), - lazy_load = require('../lazy_load'), + lazy_load = require('../misc/lazy_load'), Q = require('q'), CordovaError = require('../../CordovaError'), ConfigParser = require('../../configparser/ConfigParser'), diff --git a/cordova-lib/src/cordova/project/emulate.js b/cordova-lib/src/cordova/project/emulate.js index 51fbbfe22..17db7e1ce 100644 --- a/cordova-lib/src/cordova/project/emulate.js +++ b/cordova-lib/src/cordova/project/emulate.js @@ -23,7 +23,7 @@ var cordova_util = require('./util'), path = require('path'), - hooker = require('../hooker'), + hooker = require('../misc/hooker'), superspawn = require('../server/superspawn'), Q = require('q'); diff --git a/cordova-lib/src/cordova/info.js b/cordova-lib/src/cordova/project/info.js similarity index 96% rename from cordova-lib/src/cordova/info.js rename to cordova-lib/src/cordova/project/info.js index 13a8a2cae..caddeb68d 100644 --- a/cordova-lib/src/cordova/info.js +++ b/cordova-lib/src/cordova/project/info.js @@ -26,9 +26,9 @@ A utility funciton to help output the information needed when submitting a help request. Outputs to a file */ -var cordova_util = require('./project/util'), - superspawn = require('./server/superspawn'), - package = require('../../package'), +var cordova_util = require('../project/util'), + superspawn = require('../server/superspawn'), + package = require('../../../package'), path = require('path'), fs = require('fs'), Q = require('q'); diff --git a/cordova-lib/src/cordova/project/run.js b/cordova-lib/src/cordova/project/run.js index c04383caa..f57d5557d 100644 --- a/cordova-lib/src/cordova/project/run.js +++ b/cordova-lib/src/cordova/project/run.js @@ -23,7 +23,7 @@ var cordova_util = require('./util'), path = require('path'), - hooker = require('../hooker'), + hooker = require('../misc/hooker'), superspawn = require('../server/superspawn'), Q = require('q'); diff --git a/cordova-lib/src/cordova/server/serve.js b/cordova-lib/src/cordova/server/serve.js index a6512001e..4f1c9851a 100644 --- a/cordova-lib/src/cordova/server/serve.js +++ b/cordova-lib/src/cordova/server/serve.js @@ -27,7 +27,7 @@ var cordova_util = require('../project/util'), shell = require('shelljs'), platforms = require('../platforms'), ConfigParser = require('../../configparser/ConfigParser'), - hooker = require('../hooker'), + hooker = require('../misc/hooker'), Q = require('q'), fs = require('fs'), http = require('http'), From d4f3e0d0f568d6ea54fb83e59c5ba0ca7a1884d7 Mon Sep 17 00:00:00 2001 From: Suraj Pindoria Date: Thu, 17 Jul 2014 11:35:11 -0700 Subject: [PATCH 15/16] Removed duplicate files/folders --- .../base/.cordova/config.json | 0 .../base/merges/.svn | 0 .../base/plugins/.svn | 0 .../base/www/config.xml | 0 .../base/www/css/index.css | 0 .../base/www/img/logo.png | Bin .../base/www/index.html | 0 .../base/www/js/index.js | 0 .../base/www/spec.html | 0 .../helper.js | 0 .../helpers.js | 0 .../hooks_bat/fail/fail.bat | 0 .../hooks_bat/test/.dotted.bat | 0 .../hooks_bat/test/07.bat | 0 .../hooks_bat/test/1.bat | 0 .../hooks_sh/fail/fail.sh | 0 .../hooks_sh/test/.dotted.sh | 0 .../hooks_sh/test/07.sh | 0 .../hooks_sh/test/1.sh | 0 .../platforms/android-lib/VERSION | 0 .../framework/assets/www/cordova.js | 0 .../platforms/android/AndroidManifest.xml | 0 .../platforms/android/assets/www/config.xml | 0 .../platforms/android/assets/www/cordova.js | 0 .../android/assets/www/cordova_plugins.js | 0 .../android/assets/www/css/index.css | 0 .../platforms/android/assets/www/img/logo.png | Bin .../platforms/android/assets/www/index.html | 0 .../platforms/android/assets/www/js/index.js | 0 .../platforms/android/assets/www/spec.html | 0 .../platforms/android/build.xml | 0 .../platforms/android/cordova/build | 0 .../platforms/android/cordova/check_reqs | 0 .../platforms/android/cordova/clean | 0 .../platforms/android/cordova/defaults.xml | 0 .../platforms/android/cordova/lib/appinfo.js | 0 .../platforms/android/cordova/lib/build.js | 0 .../android/cordova/lib/check_reqs.js | 0 .../platforms/android/cordova/lib/clean.js | 0 .../platforms/android/cordova/lib/device.js | 0 .../platforms/android/cordova/lib/emulator.js | 0 .../android/cordova/lib/install-device | 0 .../android/cordova/lib/install-emulator | 0 .../android/cordova/lib/list-devices | 0 .../android/cordova/lib/list-emulator-images | 0 .../cordova/lib/list-started-emulators | 0 .../platforms/android/cordova/lib/log.js | 0 .../platforms/android/cordova/lib/run.js | 0 .../android/cordova/lib/start-emulator | 0 .../platforms/android/cordova/log | 0 .../platforms/android/cordova/run | 0 .../platforms/android/cordova/version | 0 .../platforms/android/local.properties | 0 .../platforms/android/proguard-project.txt | 0 .../platforms/android/project.properties | 0 .../android/res/drawable-hdpi/icon.png | Bin .../android/res/drawable-ldpi/icon.png | Bin .../android/res/drawable-mdpi/icon.png | Bin .../android/res/drawable-xhdpi/icon.png | Bin .../platforms/android/res/drawable/icon.png | Bin .../platforms/android/res/values/strings.xml | 0 .../platforms/android/res/xml/config.xml | 0 .../android/src/org/testing/TestBase.java | 0 .../plugins/ChildBrowser/plugin.xml | 0 .../src/android/ChildBrowser.java | 0 .../plugins/ChildBrowser/www/childbrowser.js | 0 .../ChildBrowser/www/childbrowser/image.jpg | 0 .../ChildBrowser/www/childbrowser_file.html | 0 .../plugins/android/plugin.xml | 0 .../plugins/android/src/android/Android.java | 0 .../android/src/android/SomethingWithR.java | 0 .../plugins/android/www/android.js | 0 .../plugins/fake1/plugin.xml | 0 .../plugins/test/plugin.xml | 0 .../plugins/test/www/test.js | 0 .../projects/android/AndroidManifest.xml | 0 .../projects/android/assets/www/.gitkeep | 0 .../projects/android/res/xml/config.xml | 0 .../projects/android/src/.gitkeep | 0 .../projects/windows/bom_test.xml | 0 .../templates/no_content_config.xml | 0 .../www => fixtures-plugman/plugins}/.gitkeep | 0 .../plugins/AndroidJS/plugin.xml | 0 .../plugins/AndroidJS/www/android.js | 0 .../plugins/ChildBrowser/plugin.xml | 0 .../src/android/ChildBrowser.java | 0 .../ios/ChildBrowser.bundle/arrow_left.png | Bin .../ios/ChildBrowser.bundle/arrow_left@2x.png | Bin .../ios/ChildBrowser.bundle/arrow_right.png | Bin .../ChildBrowser.bundle/arrow_right@2x.png | Bin .../ios/ChildBrowser.bundle/but_refresh.png | Bin .../ChildBrowser.bundle/but_refresh@2x.png | Bin .../src/ios/ChildBrowser.bundle/compass.png | Bin .../ios/ChildBrowser.bundle/compass@2x.png | Bin .../src/ios/ChildBrowserCommand.h | 0 .../src/ios/ChildBrowserCommand.m | 0 .../src/ios/ChildBrowserViewController.h | 0 .../src/ios/ChildBrowserViewController.m | 0 .../src/ios/ChildBrowserViewController.xib | 0 .../ChildBrowser/src/ios/TargetDirTest.h | 0 .../ChildBrowser/src/ios/TargetDirTest.m | 0 .../src/ios/preserveDirs/PreserveDirsTest.h | 0 .../src/ios/preserveDirs/PreserveDirsTest.m | 0 .../plugins/ChildBrowser/www/childbrowser.js | 0 .../ChildBrowser/www/childbrowser/image.jpg | 0 .../ChildBrowser/www/childbrowser_file.html | 0 .../plugins/ConfigTestPlugin/plugin.xml | 0 .../plugins/Contacts/plugin.xml | 0 .../Contacts/src/android/ContactAccessor.java | 0 .../src/android/ContactAccessorSdk5.java | 0 .../Contacts/src/android/ContactManager.java | 0 .../src/blackberry10/ContactActivity.js | 0 .../src/blackberry10/ContactAddress.js | 0 .../Contacts/src/blackberry10/ContactError.js | 0 .../Contacts/src/blackberry10/ContactField.js | 0 .../src/blackberry10/ContactFindOptions.js | 0 .../Contacts/src/blackberry10/ContactName.js | 0 .../Contacts/src/blackberry10/ContactNews.js | 0 .../src/blackberry10/ContactOrganization.js | 0 .../Contacts/src/blackberry10/ContactPhoto.js | 0 .../src/blackberry10/contactConsts.js | 0 .../Contacts/src/blackberry10/contactUtils.js | 0 .../Contacts/src/blackberry10/index.js | 0 .../Contacts/src/blackberry10/plugin.xml | 0 .../plugins/Contacts/src/ios/CDVContact.h | 0 .../plugins/Contacts/src/ios/CDVContact.m | 0 .../plugins/Contacts/src/ios/CDVContacts.h | 0 .../plugins/Contacts/src/ios/CDVContacts.m | 0 .../plugins/Contacts/src/wp/Contacts.cs | 0 .../plugins/Contacts/www/Contact.js | 0 .../plugins/Contacts/www/ContactAddress.js | 0 .../plugins/Contacts/www/ContactError.js | 0 .../plugins/Contacts/www/ContactField.js | 0 .../Contacts/www/ContactFindOptions.js | 0 .../plugins/Contacts/www/ContactName.js | 0 .../Contacts/www/ContactOrganization.js | 0 .../plugins/Contacts/www/contacts.js | 0 .../plugins/Contacts/www/ios/Contact.js | 0 .../plugins/Contacts/www/ios/contacts.js | 0 .../plugins/DummyPlugin/android-resource.xml | 0 .../plugins/DummyPlugin/plugin.xml | 0 .../DummyPlugin/src/android/DummyPlugin.java | 0 .../DummyPlugin/src/blackberry10/index.js | 0 .../src/ios/Custom.framework/someFheader.h | 0 .../src/ios/Custom.framework/somebinlib | 0 .../DummyPlugin/src/ios/DummyPlugin.bundle | 0 .../DummyPlugin/src/ios/DummyPluginCommand.h | 0 .../DummyPlugin/src/ios/DummyPluginCommand.m | 0 .../DummyPlugin/src/ios/SourceWithFramework.m | 0 .../DummyPlugin/src/ios/TargetDirTest.h | 0 .../DummyPlugin/src/ios/TargetDirTest.m | 0 .../DummyPlugin/src/ios/libsqlite3.dylib | 0 .../plugins/DummyPlugin/src/tizen/dummer.js | 0 .../DummyPlugin/src/windows8/dummer.js | 0 .../DummyPlugin/src/wp7/DummyPlugin.cs | 0 .../DummyPlugin/src/wp8/DummyPlugin.cs | 0 .../plugins/DummyPlugin/www/dummyplugin.js | 0 .../DummyPlugin/www/dummyplugin}/image.jpg | 0 .../plugins/EnginePlugin/megaBoringVersion | 0 .../plugins/EnginePlugin/megaFunVersion | 0 .../plugins/EnginePlugin/plugin.xml | 0 .../plugins/EnginePluginAndroid/plugin.xml | 0 .../plugins/EnginePluginiOS/plugin.xml | 0 .../plugins/FaultyPlugin/plugin.xml | 0 .../src/android/FaultyPlugin.java | 0 .../FaultyPlugin/src/blackberry10/client.js | 0 .../FaultyPlugin/src/ios/FaultyPlugin.h | 0 .../FaultyPlugin/src/ios/FaultyPlugin.m | 0 .../FaultyPlugin/src/windows8/faultyPlugin.js | 0 .../FaultyPlugin/src/wp7/FaultyPlugin.cs | 0 .../FaultyPlugin/src/wp8/FaultyPlugin.cs | 0 .../plugins/VariablePlugin/plugin.xml | 0 .../plugins/WebNotifications/plugin.xml | 0 .../src/ios/AppDelegate.m.diff | 0 .../src/ios/WebNotifications.h | 0 .../src/ios/WebNotifications.m | 0 .../WebNotifications/www/webnotifications.js | 0 .../plugins/WeblessPlugin/plugin.xml | 0 .../src/android/WeblessPlugin.java | 0 .../ios/WeblessPlugin.bundle/arrow_left.png | Bin .../WeblessPlugin.bundle/arrow_left@2x.png | Bin .../ios/WeblessPlugin.bundle/arrow_right.png | Bin .../WeblessPlugin.bundle/arrow_right@2x.png | Bin .../ios/WeblessPlugin.bundle/but_refresh.png | Bin .../WeblessPlugin.bundle/but_refresh@2x.png | Bin .../src/ios/WeblessPlugin.bundle/compass.png | Bin .../ios/WeblessPlugin.bundle/compass@2x.png | Bin .../src/ios/WeblessPluginCommand.h | 0 .../src/ios/WeblessPluginCommand.m | 0 .../src/ios/WeblessPluginViewController.h | 0 .../src/ios/WeblessPluginViewController.m | 0 .../src/ios/WeblessPluginViewController.xib | 0 .../plugins/cordova.echo/.gitignore | 0 .../plugins/cordova.echo/plugin.xml | 0 .../cordova.echo/src/blackberry10/index.js | 0 .../blackberry10/native/device/echoJnext.so | Bin .../native/public/json/autolink.h | 0 .../blackberry10/native/public/json/config.h | 0 .../native/public/json/features.h | 0 .../native/public/json/forwards.h | 0 .../blackberry10/native/public/json/json.h | 0 .../blackberry10/native/public/json/reader.h | 0 .../blackberry10/native/public/json/value.h | 0 .../blackberry10/native/public/json/writer.h | 0 .../native/public/json_batchallocator.h | 0 .../native/public/json_internalarray.inl | 0 .../native/public/json_internalmap.inl | 0 .../native/public/json_reader.cpp | 0 .../blackberry10/native/public/json_value.cpp | 0 .../native/public/json_valueiterator.inl | 0 .../native/public/json_writer.cpp | 0 .../src/blackberry10/native/public/plugin.cpp | 0 .../src/blackberry10/native/public/plugin.h | 0 .../blackberry10/native/public/tokenizer.cpp | 0 .../blackberry10/native/public/tokenizer.h | 0 .../native/simulator/echoJnext.so | Bin .../src/blackberry10/native/src/echo.cpp | 0 .../src/blackberry10/native/src/echo.hpp | 0 .../plugins/cordova.echo/www/client.js | 0 .../plugins/dependencies/A/plugin.xml | 0 .../plugins/dependencies/A/src/android/A.java | 0 .../dependencies/A/src/ios/APluginCommand.h | 0 .../dependencies/A/src/ios/APluginCommand.m | 0 .../plugins/dependencies/A/www/plugin-a.js | 0 .../plugins/dependencies/B/plugin.xml | 0 .../plugins/dependencies/B/src/android/B.java | 0 .../dependencies/B/src/ios/BPluginCommand.h | 0 .../dependencies/B/src/ios/BPluginCommand.m | 0 .../plugins/dependencies/B/www/plugin-b.js | 0 .../plugins/dependencies/C/plugin.xml | 0 .../plugins/dependencies/C/src/android/C.java | 0 .../dependencies/C/src/ios/CPluginCommand.h | 0 .../dependencies/C/src/ios/CPluginCommand.m | 0 .../plugins/dependencies/C/www/plugin-c.js | 0 .../plugins/dependencies/D/plugin.xml | 0 .../plugins/dependencies/D/src/android/D.java | 0 .../dependencies/D/src/ios/DPluginCommand.h | 0 .../dependencies/D/src/ios/DPluginCommand.m | 0 .../plugins/dependencies/D/www/plugin-d.js | 0 .../plugins/dependencies/E/plugin.xml | 0 .../plugins/dependencies/E/src/android/E.java | 0 .../dependencies/E/src/ios/EPluginCommand.h | 0 .../dependencies/E/src/ios/EPluginCommand.m | 0 .../plugins/dependencies/E/www/plugin-d.js | 0 .../plugins/dependencies/F/plugin.xml | 0 .../plugins/dependencies/F/src/android/F.java | 0 .../dependencies/F/src/ios/FPluginCommand.h | 0 .../dependencies/F/src/ios/FPluginCommand.m | 0 .../plugins/dependencies/F/www/plugin-f.js | 0 .../plugins/dependencies/G/plugin.xml | 0 .../plugins/dependencies/G/src/android/G.java | 0 .../dependencies/G/src/ios/EPluginCommand.m | 0 .../dependencies/G/src/ios/GPluginCommand.h | 0 .../plugins/dependencies/G/www/plugin-g.js | 0 .../plugins/dependencies/H/plugin.xml | 0 .../plugins/dependencies/H/src/android/H.java | 0 .../dependencies/H/src/ios/HPluginCommand.h | 0 .../dependencies/H/src/ios/HPluginCommand.m | 0 .../plugins/dependencies/H/www/plugin-h.js | 0 .../plugins/dependencies/README.md | 0 .../plugins/dependencies/meta/D/plugin.xml | 0 .../dependencies/meta/D/src/android/D.java | 0 .../meta/D/src/ios/DPluginCommand.h | 0 .../meta/D/src/ios/DPluginCommand.m | 0 .../dependencies/meta/D/www/plugin-d.js | 0 .../dependencies/meta/subdir/E/plugin.xml | 0 .../meta/subdir/E/src/android/E.java | 0 .../meta/subdir/E/src/ios/EPluginCommand.h | 0 .../meta/subdir/E/src/ios/EPluginCommand.m | 0 .../meta/subdir/E/www/plugin-e.js | 0 .../plugins/dependencies/subdir/E/plugin.xml | 0 .../dependencies/subdir/E/src/android/E.java | 0 .../subdir/E/src/ios/EPluginCommand.h | 0 .../subdir/E/src/ios/EPluginCommand.m | 0 .../dependencies/subdir/E/www/plugin-e.js | 0 .../plugins/multiple-children/plugin.xml | 0 .../shared-deps-multi-child/plugin.xml | 0 .../projects}/.gitkeep | 0 .../android_install/AndroidManifest.xml | 0 .../cordova/android_sdk_version | 0 .../projects/android_install/cordova/version | 0 .../android_install/cordova/version.bat | 0 .../projects/android_one/AndroidManifest.xml | 0 .../projects/android_one}/assets/www/.gitkeep | 0 .../android_one/assets/www/cordova.js | 0 .../projects/android_one/cordova/build | 0 .../projects/android_one/cordova/clean | 0 .../projects/android_one/cordova/lib/cordova | 0 .../android_one/cordova/lib/install-device | 0 .../android_one/cordova/lib/install-emulator | 0 .../android_one/cordova/lib/list-devices | 0 .../cordova/lib/list-emulator-images | 0 .../cordova/lib/list-started-emulators | 0 .../android_one/cordova/lib/start-emulator | 0 .../projects/android_one/cordova/log | 0 .../projects/android_one/cordova/run | 0 .../projects/android_one/cordova/version | 0 .../projects/android_one/res/xml/plugins.xml | 0 .../projects/android_one}/src/.gitkeep | 0 .../projects/android_two}/AndroidManifest.xml | 0 .../projects/android_two}/assets/www/.gitkeep | 0 .../projects/android_two}/res/xml/config.xml | 0 .../projects/android_two}/src/.gitkeep | 0 .../android_two_no_perms/AndroidManifest.xml | 0 .../android_two_no_perms/assets/www}/.gitkeep | 0 .../android_two_no_perms}/res/xml/config.xml | 0 .../android_two_no_perms/src}/.gitkeep | 0 .../android_uninstall/AndroidManifest.xml | 0 .../android_uninstall/cordova/version | 0 .../android_uninstall/cordova/version.bat | 0 .../native/device/chrome}/.gitkeep | 0 .../native/device/plugins/jnext/auth.txt | 0 .../native/simulator/chrome}/.gitkeep | 0 .../native/simulator/plugins/jnext/auth.txt | 0 .../projects/blackberry10/www/config.xml | 0 .../CordovaLib.xcodeproj/project.pbxproj | 0 .../SampleApp.xcodeproj/project.orig.pbxproj | 0 .../SampleApp.xcodeproj/project.pbxproj | 0 .../SampleApp/SampleApp-Info.plist | 0 .../ios-config-xml/SampleApp/config.xml | 0 .../projects/ios-config-xml/www}/.gitkeep | 0 .../CordovaLib.xcodeproj/project.pbxproj | 0 .../SampleApp.xcodeproj/project.orig.pbxproj | 0 .../SampleApp.xcodeproj/project.pbxproj | 0 .../ios-plist/SampleApp/PhoneGap.plist | 0 .../ios-plist/SampleApp/SampleApp-Info.plist | 0 .../projects/ios-plist}/www/.gitkeep | 0 .../multiple-children}/AndroidManifest.xml | 0 .../multiple-children/res/xml/plugins.xml | 0 .../projects/tizen/www/config.xml | 0 .../windows8/CordovaApp_TemporaryKey.pfx | Bin .../projects/windows8/TestApp.jsproj | 0 .../projects/windows8/TestApp.sln | 0 .../projects/windows8/package.appxmanifest | 0 .../projects/windows8/www/cordova-2.6.0.js | 0 .../projects/windows8}/www/css/index.css | 0 .../projects/windows8/www/img/logo.png | Bin .../projects/windows8/www/img/smalllogo.png | Bin .../windows8/www/img/splashscreen.png | Bin .../projects/windows8/www/img/storelogo.png | Bin .../projects/windows8/www/index.html | 0 .../projects/windows8/www/js/index.js | 0 .../projects/wp8/CordovaAppProj.csproj | 0 .../projects/wp8/Properties/WMAppManifest.xml | 0 .../projects/www-only}/.gitkeep | 0 .../spec-cordova-build/prepare.spec.js | 2 +- cordova-lib/spec-cordova-misc/hooker.spec.js | 6 +- .../fixtures/base/.cordova/config.json | 22 - .../fixtures/base/merges/.svn | 0 .../fixtures/base/plugins/.svn | 0 .../fixtures/base/www/config.xml | 14 - .../fixtures/base/www/img/logo.png | Bin 21814 -> 0 bytes .../fixtures/base/www/index.html | 43 - .../fixtures/base/www/js/index.js | 49 - .../fixtures/base/www/spec.html | 68 - .../fixtures/hooks_bat/fail/fail.bat | 2 - .../fixtures/hooks_bat/test/.dotted.bat | 2 - .../fixtures/hooks_bat/test/07.bat | 3 - .../fixtures/hooks_bat/test/1.bat | 5 - .../fixtures/hooks_sh/fail/fail.sh | 1 - .../fixtures/hooks_sh/test/.dotted.sh | 1 - .../fixtures/hooks_sh/test/07.sh | 2 - .../fixtures/hooks_sh/test/1.sh | 4 - .../fixtures/platforms/android-lib/VERSION | 1 - .../framework/assets/www/cordova.js | 1 - .../platforms/android/AndroidManifest.xml | 14 - .../platforms/android/assets/www/config.xml | 14 - .../platforms/android/assets/www/cordova.js | 1712 ---- .../android/assets/www/cordova_plugins.js | 3 - .../android/assets/www/css/index.css | 115 - .../platforms/android/assets/www/img/logo.png | Bin 21814 -> 0 bytes .../platforms/android/assets/www/index.html | 43 - .../platforms/android/assets/www/js/index.js | 49 - .../platforms/android/assets/www/spec.html | 68 - .../fixtures/platforms/android/build.xml | 92 - .../fixtures/platforms/android/cordova/build | 35 - .../platforms/android/cordova/check_reqs | 27 - .../fixtures/platforms/android/cordova/clean | 34 - .../platforms/android/cordova/defaults.xml | 50 - .../platforms/android/cordova/lib/appinfo.js | 41 - .../platforms/android/cordova/lib/build.js | 89 - .../android/cordova/lib/check_reqs.js | 78 - .../platforms/android/cordova/lib/clean.js | 43 - .../platforms/android/cordova/lib/device.js | 95 - .../platforms/android/cordova/lib/emulator.js | 337 - .../android/cordova/lib/install-device | 38 - .../android/cordova/lib/install-emulator | 38 - .../android/cordova/lib/list-devices | 28 - .../android/cordova/lib/list-emulator-images | 29 - .../cordova/lib/list-started-emulators | 29 - .../platforms/android/cordova/lib/log.js | 43 - .../platforms/android/cordova/lib/run.js | 124 - .../android/cordova/lib/start-emulator | 38 - .../fixtures/platforms/android/cordova/log | 33 - .../fixtures/platforms/android/cordova/run | 35 - .../platforms/android/cordova/version | 25 - .../platforms/android/local.properties | 10 - .../platforms/android/proguard-project.txt | 20 - .../platforms/android/project.properties | 14 - .../android/res/drawable-hdpi/icon.png | Bin 6080 -> 0 bytes .../android/res/drawable-ldpi/icon.png | Bin 3096 -> 0 bytes .../android/res/drawable-mdpi/icon.png | Bin 4090 -> 0 bytes .../android/res/drawable-xhdpi/icon.png | Bin 7685 -> 0 bytes .../platforms/android/res/drawable/icon.png | Bin 7685 -> 0 bytes .../platforms/android/res/values/strings.xml | 4 - .../platforms/android/res/xml/config.xml | 18 - .../android/src/org/testing/TestBase.java | 37 - .../fixtures/plugins/ChildBrowser/plugin.xml | 126 - .../fixtures/plugins/android/plugin.xml | 14 - .../plugins/android/src/android/Android.java | 0 .../android/src/android/SomethingWithR.java | 6 - .../fixtures/plugins/android/www/android.js | 0 .../fixtures/plugins/fake1/plugin.xml | 10 - .../fixtures/plugins/test/plugin.xml | 14 - .../fixtures/plugins/test/www/test.js | 0 .../fixtures/projects/windows/bom_test.xml | 24 - .../fixtures/templates/no_content_config.xml | 19 - cordova-lib/spec-cordova-plugins/helpers.js | 64 - .../spec-cordova-plugins/plugin.spec.js | 8 +- .../plugin_parser.spec.js | 2 +- .../spec-cordova-project/create.spec.js | 6 +- .../fixtures/base/.cordova/config.json | 22 - .../fixtures/base/merges/.svn | 0 .../fixtures/base/plugins/.svn | 0 .../fixtures/base/www/config.xml | 14 - .../fixtures/base/www/css/index.css | 115 - .../fixtures/base/www/img/logo.png | Bin 21814 -> 0 bytes .../fixtures/base/www/index.html | 43 - .../fixtures/base/www/js/index.js | 49 - .../fixtures/base/www/spec.html | 68 - .../fixtures/hooks_bat/fail/fail.bat | 2 - .../fixtures/hooks_bat/test/.dotted.bat | 2 - .../fixtures/hooks_bat/test/07.bat | 3 - .../fixtures/hooks_bat/test/1.bat | 5 - .../fixtures/hooks_sh/fail/fail.sh | 1 - .../fixtures/hooks_sh/test/.dotted.sh | 1 - .../fixtures/hooks_sh/test/07.sh | 2 - .../fixtures/hooks_sh/test/1.sh | 4 - .../fixtures/platforms/android-lib/VERSION | 1 - .../framework/assets/www/cordova.js | 1 - .../platforms/android/AndroidManifest.xml | 14 - .../platforms/android/assets/www/config.xml | 14 - .../platforms/android/assets/www/cordova.js | 1712 ---- .../android/assets/www/cordova_plugins.js | 3 - .../android/assets/www/css/index.css | 115 - .../platforms/android/assets/www/img/logo.png | Bin 21814 -> 0 bytes .../platforms/android/assets/www/index.html | 43 - .../platforms/android/assets/www/js/index.js | 49 - .../platforms/android/assets/www/spec.html | 68 - .../fixtures/platforms/android/build.xml | 92 - .../fixtures/platforms/android/cordova/build | 35 - .../platforms/android/cordova/check_reqs | 27 - .../fixtures/platforms/android/cordova/clean | 34 - .../platforms/android/cordova/defaults.xml | 50 - .../platforms/android/cordova/lib/appinfo.js | 41 - .../platforms/android/cordova/lib/build.js | 89 - .../android/cordova/lib/check_reqs.js | 78 - .../platforms/android/cordova/lib/clean.js | 43 - .../platforms/android/cordova/lib/device.js | 95 - .../platforms/android/cordova/lib/emulator.js | 337 - .../android/cordova/lib/install-device | 38 - .../android/cordova/lib/install-emulator | 38 - .../android/cordova/lib/list-devices | 28 - .../android/cordova/lib/list-emulator-images | 29 - .../cordova/lib/list-started-emulators | 29 - .../platforms/android/cordova/lib/log.js | 43 - .../platforms/android/cordova/lib/run.js | 124 - .../android/cordova/lib/start-emulator | 38 - .../fixtures/platforms/android/cordova/log | 33 - .../fixtures/platforms/android/cordova/run | 35 - .../platforms/android/cordova/version | 25 - .../platforms/android/local.properties | 10 - .../platforms/android/proguard-project.txt | 20 - .../platforms/android/project.properties | 14 - .../android/res/drawable-hdpi/icon.png | Bin 6080 -> 0 bytes .../android/res/drawable-ldpi/icon.png | Bin 3096 -> 0 bytes .../android/res/drawable-mdpi/icon.png | Bin 4090 -> 0 bytes .../android/res/drawable-xhdpi/icon.png | Bin 7685 -> 0 bytes .../platforms/android/res/drawable/icon.png | Bin 7685 -> 0 bytes .../platforms/android/res/values/strings.xml | 4 - .../platforms/android/res/xml/config.xml | 18 - .../android/src/org/testing/TestBase.java | 37 - .../fixtures/plugins/ChildBrowser/plugin.xml | 126 - .../src/android/ChildBrowser.java | 19 - .../plugins/ChildBrowser/www/childbrowser.js | 19 - .../ChildBrowser/www/childbrowser_file.html | 1 - .../fixtures/plugins/android/plugin.xml | 14 - .../plugins/android/src/android/Android.java | 0 .../android/src/android/SomethingWithR.java | 6 - .../fixtures/plugins/android/www/android.js | 0 .../fixtures/plugins/fake1/plugin.xml | 10 - .../fixtures/plugins/test/plugin.xml | 14 - .../fixtures/plugins/test/www/test.js | 0 .../fixtures/projects/windows/bom_test.xml | 24 - .../fixtures/templates/no_content_config.xml | 19 - .../spec-cordova-project/restore.spec.js | 2 +- cordova-lib/spec-cordova-project/save.spec.js | 2 +- cordova-lib/spec-cordova-project/util.spec.js | 2 +- cordova-lib/spec-cordova-server/serve.spec.js | 2 +- cordova-lib/spec-cordova/PluginInfo.spec.js | 2 +- .../fixtures/base/.cordova/config.json | 22 - .../spec-cordova/fixtures/base/merges/.svn | 0 .../spec-cordova/fixtures/base/plugins/.svn | 0 .../spec-cordova/fixtures/base/www/config.xml | 14 - .../fixtures/base/www/css/index.css | 115 - .../fixtures/base/www/img/logo.png | Bin 21814 -> 0 bytes .../spec-cordova/fixtures/base/www/index.html | 43 - .../fixtures/base/www/js/index.js | 49 - .../spec-cordova/fixtures/base/www/spec.html | 68 - .../fixtures/hooks_bat/fail/fail.bat | 2 - .../fixtures/hooks_bat/test/.dotted.bat | 2 - .../fixtures/hooks_bat/test/07.bat | 3 - .../fixtures/hooks_bat/test/1.bat | 5 - .../fixtures/hooks_sh/fail/fail.sh | 1 - .../fixtures/hooks_sh/test/.dotted.sh | 1 - .../spec-cordova/fixtures/hooks_sh/test/07.sh | 2 - .../spec-cordova/fixtures/hooks_sh/test/1.sh | 4 - .../fixtures/platforms/android-lib/VERSION | 1 - .../framework/assets/www/cordova.js | 1 - .../platforms/android/AndroidManifest.xml | 14 - .../platforms/android/assets/www/config.xml | 14 - .../platforms/android/assets/www/cordova.js | 1712 ---- .../android/assets/www/cordova_plugins.js | 3 - .../android/assets/www/css/index.css | 115 - .../platforms/android/assets/www/img/logo.png | Bin 21814 -> 0 bytes .../platforms/android/assets/www/index.html | 43 - .../platforms/android/assets/www/js/index.js | 49 - .../platforms/android/assets/www/spec.html | 68 - .../fixtures/platforms/android/build.xml | 92 - .../fixtures/platforms/android/cordova/build | 35 - .../platforms/android/cordova/check_reqs | 27 - .../fixtures/platforms/android/cordova/clean | 34 - .../platforms/android/cordova/defaults.xml | 50 - .../platforms/android/cordova/lib/appinfo.js | 41 - .../platforms/android/cordova/lib/build.js | 89 - .../android/cordova/lib/check_reqs.js | 78 - .../platforms/android/cordova/lib/clean.js | 43 - .../platforms/android/cordova/lib/device.js | 95 - .../platforms/android/cordova/lib/emulator.js | 337 - .../android/cordova/lib/install-device | 38 - .../android/cordova/lib/install-emulator | 38 - .../android/cordova/lib/list-devices | 28 - .../android/cordova/lib/list-emulator-images | 29 - .../cordova/lib/list-started-emulators | 29 - .../platforms/android/cordova/lib/log.js | 43 - .../platforms/android/cordova/lib/run.js | 124 - .../android/cordova/lib/start-emulator | 38 - .../fixtures/platforms/android/cordova/log | 33 - .../fixtures/platforms/android/cordova/run | 35 - .../platforms/android/cordova/version | 25 - .../platforms/android/local.properties | 10 - .../platforms/android/proguard-project.txt | 20 - .../platforms/android/project.properties | 14 - .../android/res/drawable-hdpi/icon.png | Bin 6080 -> 0 bytes .../android/res/drawable-ldpi/icon.png | Bin 3096 -> 0 bytes .../android/res/drawable-mdpi/icon.png | Bin 4090 -> 0 bytes .../android/res/drawable-xhdpi/icon.png | Bin 7685 -> 0 bytes .../platforms/android/res/drawable/icon.png | Bin 7685 -> 0 bytes .../platforms/android/res/values/strings.xml | 4 - .../platforms/android/res/xml/config.xml | 18 - .../android/src/org/testing/TestBase.java | 37 - .../fixtures/plugins/ChildBrowser/plugin.xml | 126 - .../src/android/ChildBrowser.java | 19 - .../plugins/ChildBrowser/www/childbrowser.js | 19 - .../ChildBrowser/www/childbrowser/image.jpg | 1 - .../ChildBrowser/www/childbrowser_file.html | 1 - .../fixtures/plugins/android/plugin.xml | 14 - .../plugins/android/src/android/Android.java | 0 .../android/src/android/SomethingWithR.java | 6 - .../fixtures/plugins/android/www/android.js | 0 .../fixtures/plugins/fake1/plugin.xml | 10 - .../fixtures/plugins/test/plugin.xml | 14 - .../fixtures/plugins/test/www/test.js | 0 .../projects/android/AndroidManifest.xml | 69 - .../projects/android/res/xml/config.xml | 54 - .../fixtures/projects/windows/bom_test.xml | 24 - .../fixtures/templates/no_content_config.xml | 19 - cordova-lib/spec-cordova/helpers.js | 64 - cordova-lib/spec-cordova/platform.spec.js | 8 +- cordova-lib/spec-cordova/xml-helpers.spec.js | 8 +- cordova-lib/spec-plugman-create/fetch.spec.js | 2 +- .../src/android/ChildBrowser.java | 19 - .../plugins/ChildBrowser/www/childbrowser.js | 19 - .../ChildBrowser/www/childbrowser/image.jpg | 1 - .../ChildBrowser/www/childbrowser_file.html | 1 - .../DummyPlugin/www/dummyplugin/image.jpg | 1 - .../spec-plugman-install/install.spec.js | 4 +- .../plugins/AndroidJS/plugin.xml | 34 - .../plugins/AndroidJS/www/android.js | 1 - .../plugins/ChildBrowser/plugin.xml | 124 - .../src/android/ChildBrowser.java | 19 - .../ios/ChildBrowser.bundle/arrow_left.png | Bin 2946 -> 0 bytes .../ios/ChildBrowser.bundle/arrow_left@2x.png | Bin 2946 -> 0 bytes .../ios/ChildBrowser.bundle/arrow_right.png | Bin 2946 -> 0 bytes .../ChildBrowser.bundle/arrow_right@2x.png | Bin 2946 -> 0 bytes .../ios/ChildBrowser.bundle/but_refresh.png | Bin 3369 -> 0 bytes .../ChildBrowser.bundle/but_refresh@2x.png | Bin 3369 -> 0 bytes .../src/ios/ChildBrowser.bundle/compass.png | Bin 3035 -> 0 bytes .../ios/ChildBrowser.bundle/compass@2x.png | Bin 3035 -> 0 bytes .../src/ios/ChildBrowserCommand.h | 49 - .../src/ios/ChildBrowserCommand.m | 86 - .../src/ios/ChildBrowserViewController.h | 73 - .../src/ios/ChildBrowserViewController.m | 239 - .../src/ios/ChildBrowserViewController.xib | 875 -- .../ChildBrowser/src/ios/TargetDirTest.h | 20 - .../ChildBrowser/src/ios/TargetDirTest.m | 1 - .../src/ios/preserveDirs/PreserveDirsTest.h | 20 - .../src/ios/preserveDirs/PreserveDirsTest.m | 1 - .../plugins/ChildBrowser/www/childbrowser.js | 19 - .../ChildBrowser/www/childbrowser/image.jpg | 1 - .../ChildBrowser/www/childbrowser_file.html | 1 - .../plugins/ConfigTestPlugin/plugin.xml | 37 - .../plugins/Contacts/plugin.xml | 128 - .../Contacts/src/android/ContactAccessor.java | 198 - .../src/android/ContactAccessorSdk5.java | 2183 ----- .../Contacts/src/android/ContactManager.java | 122 - .../src/blackberry10/ContactActivity.js | 26 - .../src/blackberry10/ContactAddress.js | 30 - .../Contacts/src/blackberry10/ContactError.js | 30 - .../Contacts/src/blackberry10/ContactField.js | 27 - .../src/blackberry10/ContactFindOptions.js | 50 - .../Contacts/src/blackberry10/ContactName.js | 39 - .../Contacts/src/blackberry10/ContactNews.js | 26 - .../src/blackberry10/ContactOrganization.js | 22 - .../Contacts/src/blackberry10/ContactPhoto.js | 23 - .../src/blackberry10/contactConsts.js | 225 - .../Contacts/src/blackberry10/contactUtils.js | 223 - .../Contacts/src/blackberry10/index.js | 374 - .../Contacts/src/blackberry10/plugin.xml | 41 - .../plugins/Contacts/src/ios/CDVContact.h | 136 - .../plugins/Contacts/src/ios/CDVContact.m | 1752 ---- .../plugins/Contacts/src/ios/CDVContacts.h | 151 - .../plugins/Contacts/src/ios/CDVContacts.m | 593 -- .../plugins/Contacts/src/wp/Contacts.cs | 664 -- .../plugins/Contacts/www/Contact.js | 177 - .../plugins/Contacts/www/ContactAddress.js | 46 - .../plugins/Contacts/www/ContactError.js | 42 - .../plugins/Contacts/www/ContactField.js | 37 - .../Contacts/www/ContactFindOptions.js | 34 - .../plugins/Contacts/www/ContactName.js | 41 - .../Contacts/www/ContactOrganization.js | 44 - .../plugins/Contacts/www/contacts.js | 76 - .../plugins/Contacts/www/ios/Contact.js | 51 - .../plugins/Contacts/www/ios/contacts.js | 62 - .../plugins/DummyPlugin/android-resource.xml | 1 - .../plugins/DummyPlugin/plugin.xml | 187 - .../DummyPlugin/src/android/DummyPlugin.java | 19 - .../DummyPlugin/src/blackberry10/index.js | 19 - .../src/ios/Custom.framework/someFheader.h | 0 .../src/ios/Custom.framework/somebinlib | 0 .../DummyPlugin/src/ios/DummyPlugin.bundle | 0 .../DummyPlugin/src/ios/DummyPluginCommand.h | 0 .../DummyPlugin/src/ios/DummyPluginCommand.m | 0 .../DummyPlugin/src/ios/SourceWithFramework.m | 0 .../DummyPlugin/src/ios/TargetDirTest.h | 0 .../DummyPlugin/src/ios/TargetDirTest.m | 0 .../DummyPlugin/src/ios/libsqlite3.dylib | 0 .../plugins/DummyPlugin/src/tizen/dummer.js | 0 .../DummyPlugin/src/windows8/dummer.js | 0 .../DummyPlugin/src/wp7/DummyPlugin.cs | 19 - .../DummyPlugin/src/wp8/DummyPlugin.cs | 19 - .../plugins/DummyPlugin/www/dummyplugin.js | 19 - .../DummyPlugin/www/dummyplugin/image.jpg | 1 - .../plugins/EnginePlugin/megaBoringVersion | 23 - .../plugins/EnginePlugin/megaFunVersion | 23 - .../plugins/EnginePlugin/plugin.xml | 33 - .../plugins/EnginePluginAndroid/plugin.xml | 32 - .../plugins/EnginePluginiOS/plugin.xml | 34 - .../plugins/FaultyPlugin/plugin.xml | 147 - .../src/android/FaultyPlugin.java | 19 - .../FaultyPlugin/src/blackberry10/client.js | 0 .../FaultyPlugin/src/ios/FaultyPlugin.h | 49 - .../FaultyPlugin/src/ios/FaultyPlugin.m | 86 - .../FaultyPlugin/src/windows8/faultyPlugin.js | 0 .../FaultyPlugin/src/wp7/FaultyPlugin.cs | 19 - .../FaultyPlugin/src/wp8/FaultyPlugin.cs | 19 - .../plugins/VariablePlugin/plugin.xml | 59 - .../plugins/WebNotifications/plugin.xml | 47 - .../src/ios/AppDelegate.m.diff | 18 - .../src/ios/WebNotifications.h | 35 - .../src/ios/WebNotifications.m | 124 - .../WebNotifications/www/webnotifications.js | 123 - .../plugins/WeblessPlugin/plugin.xml | 80 - .../src/android/WeblessPlugin.java | 19 - .../ios/WeblessPlugin.bundle/arrow_left.png | Bin 2946 -> 0 bytes .../WeblessPlugin.bundle/arrow_left@2x.png | Bin 2946 -> 0 bytes .../ios/WeblessPlugin.bundle/arrow_right.png | Bin 2946 -> 0 bytes .../WeblessPlugin.bundle/arrow_right@2x.png | Bin 2946 -> 0 bytes .../ios/WeblessPlugin.bundle/but_refresh.png | Bin 3369 -> 0 bytes .../WeblessPlugin.bundle/but_refresh@2x.png | Bin 3369 -> 0 bytes .../src/ios/WeblessPlugin.bundle/compass.png | Bin 3035 -> 0 bytes .../ios/WeblessPlugin.bundle/compass@2x.png | Bin 3035 -> 0 bytes .../src/ios/WeblessPluginCommand.h | 49 - .../src/ios/WeblessPluginCommand.m | 86 - .../src/ios/WeblessPluginViewController.h | 73 - .../src/ios/WeblessPluginViewController.m | 239 - .../src/ios/WeblessPluginViewController.xib | 875 -- .../plugins/cordova.echo/.gitignore | 1 - .../plugins/cordova.echo/plugin.xml | 24 - .../cordova.echo/src/blackberry10/index.js | 85 - .../blackberry10/native/device/echoJnext.so | Bin 1291818 -> 0 bytes .../native/public/json/autolink.h | 19 - .../blackberry10/native/public/json/config.h | 43 - .../native/public/json/features.h | 42 - .../native/public/json/forwards.h | 39 - .../blackberry10/native/public/json/json.h | 10 - .../blackberry10/native/public/json/reader.h | 196 - .../blackberry10/native/public/json/value.h | 1069 --- .../blackberry10/native/public/json/writer.h | 174 - .../native/public/json_batchallocator.h | 125 - .../native/public/json_internalarray.inl | 448 - .../native/public/json_internalmap.inl | 607 -- .../native/public/json_reader.cpp | 894 -- .../blackberry10/native/public/json_value.cpp | 1726 ---- .../native/public/json_valueiterator.inl | 292 - .../native/public/json_writer.cpp | 829 -- .../src/blackberry10/native/public/plugin.cpp | 320 - .../src/blackberry10/native/public/plugin.h | 70 - .../blackberry10/native/public/tokenizer.cpp | 222 - .../blackberry10/native/public/tokenizer.h | 55 - .../native/simulator/echoJnext.so | Bin 231778 -> 0 bytes .../src/blackberry10/native/src/echo.cpp | 121 - .../src/blackberry10/native/src/echo.hpp | 45 - .../plugins/cordova.echo/www/client.js | 53 - .../plugins/dependencies/A/plugin.xml | 60 - .../plugins/dependencies/A/src/android/A.java | 0 .../dependencies/A/src/ios/APluginCommand.h | 0 .../dependencies/A/src/ios/APluginCommand.m | 0 .../plugins/dependencies/A/www/plugin-a.js | 0 .../plugins/dependencies/B/plugin.xml | 60 - .../plugins/dependencies/B/src/android/B.java | 0 .../dependencies/B/src/ios/BPluginCommand.h | 0 .../dependencies/B/src/ios/BPluginCommand.m | 0 .../plugins/dependencies/B/www/plugin-b.js | 0 .../plugins/dependencies/C/plugin.xml | 57 - .../plugins/dependencies/C/src/android/C.java | 0 .../dependencies/C/src/ios/CPluginCommand.h | 0 .../dependencies/C/src/ios/CPluginCommand.m | 0 .../plugins/dependencies/C/www/plugin-c.js | 0 .../plugins/dependencies/D/plugin.xml | 57 - .../plugins/dependencies/D/src/android/D.java | 0 .../dependencies/D/src/ios/DPluginCommand.h | 0 .../dependencies/D/src/ios/DPluginCommand.m | 0 .../plugins/dependencies/D/www/plugin-d.js | 0 .../plugins/dependencies/E/plugin.xml | 59 - .../plugins/dependencies/E/src/android/E.java | 0 .../dependencies/E/src/ios/EPluginCommand.h | 0 .../dependencies/E/src/ios/EPluginCommand.m | 0 .../plugins/dependencies/E/www/plugin-d.js | 0 .../plugins/dependencies/F/plugin.xml | 60 - .../plugins/dependencies/F/src/android/F.java | 0 .../dependencies/F/src/ios/FPluginCommand.h | 0 .../dependencies/F/src/ios/FPluginCommand.m | 0 .../plugins/dependencies/F/www/plugin-f.js | 0 .../plugins/dependencies/G/plugin.xml | 59 - .../plugins/dependencies/G/src/android/G.java | 0 .../dependencies/G/src/ios/EPluginCommand.m | 0 .../dependencies/G/src/ios/GPluginCommand.h | 0 .../plugins/dependencies/G/www/plugin-g.js | 0 .../plugins/dependencies/H/plugin.xml | 59 - .../plugins/dependencies/H/src/android/H.java | 0 .../dependencies/H/src/ios/HPluginCommand.h | 0 .../dependencies/H/src/ios/HPluginCommand.m | 0 .../plugins/dependencies/H/www/plugin-h.js | 0 .../plugins/dependencies/README.md | 10 - .../plugins/dependencies/meta/D/plugin.xml | 61 - .../dependencies/meta/D/src/android/D.java | 0 .../meta/D/src/ios/DPluginCommand.h | 0 .../meta/D/src/ios/DPluginCommand.m | 0 .../dependencies/meta/D/www/plugin-d.js | 0 .../dependencies/meta/subdir/E/plugin.xml | 57 - .../meta/subdir/E/src/android/E.java | 0 .../meta/subdir/E/src/ios/EPluginCommand.h | 0 .../meta/subdir/E/src/ios/EPluginCommand.m | 0 .../meta/subdir/E/www/plugin-e.js | 0 .../plugins/dependencies/subdir/E/plugin.xml | 57 - .../dependencies/subdir/E/src/android/E.java | 0 .../subdir/E/src/ios/EPluginCommand.h | 0 .../subdir/E/src/ios/EPluginCommand.m | 0 .../dependencies/subdir/E/www/plugin-e.js | 0 .../plugins/multiple-children/plugin.xml | 108 - .../shared-deps-multi-child/plugin.xml | 34 - .../projects/android_two/AndroidManifest.xml | 69 - .../projects/android_two/res/xml/config.xml | 54 - .../android_two_no_perms/assets/www/.gitkeep | 0 .../android_two_no_perms/res/xml/config.xml | 54 - .../android_two_no_perms/src/.gitkeep | 0 .../native/device/chrome/.gitkeep | 0 .../native/simulator/chrome/.gitkeep | 0 .../projects/ios-config-xml/www/.gitkeep | 0 .../projects/ios-plist/www/.gitkeep | 0 .../multiple-children/AndroidManifest.xml | 69 - .../projects/windows8/www/css/index.css | 115 - .../projects/www-only/.gitkeep | 0 .../spec-plugman-install/uninstall.spec.js | 8 +- .../platforms/amazon-fireos.spec.js | 10 +- .../spec-plugman/platforms/android.spec.js | 10 +- .../platforms/blackberry10.spec.js | 8 +- .../spec-plugman/platforms/ios.spec.js | 12 +- .../spec-plugman/platforms/tizen.spec.js | 4 +- .../spec-plugman/platforms/windows8.spec.js | 6 +- .../spec-plugman/platforms/wp8.spec.js | 6 +- cordova-lib/spec-plugman/plugins/.gitkeep | 0 .../spec-plugman/plugins/AndroidJS/plugin.xml | 34 - .../plugins/AndroidJS/www/android.js | 1 - .../plugins/ChildBrowser/plugin.xml | 124 - .../src/android/ChildBrowser.java | 19 - .../ios/ChildBrowser.bundle/arrow_left.png | Bin 2946 -> 0 bytes .../ios/ChildBrowser.bundle/arrow_left@2x.png | Bin 2946 -> 0 bytes .../ios/ChildBrowser.bundle/arrow_right.png | Bin 2946 -> 0 bytes .../ChildBrowser.bundle/arrow_right@2x.png | Bin 2946 -> 0 bytes .../ios/ChildBrowser.bundle/but_refresh.png | Bin 3369 -> 0 bytes .../ChildBrowser.bundle/but_refresh@2x.png | Bin 3369 -> 0 bytes .../src/ios/ChildBrowser.bundle/compass.png | Bin 3035 -> 0 bytes .../ios/ChildBrowser.bundle/compass@2x.png | Bin 3035 -> 0 bytes .../src/ios/ChildBrowserCommand.h | 49 - .../src/ios/ChildBrowserCommand.m | 86 - .../src/ios/ChildBrowserViewController.h | 73 - .../src/ios/ChildBrowserViewController.m | 239 - .../src/ios/ChildBrowserViewController.xib | 875 -- .../ChildBrowser/src/ios/TargetDirTest.h | 20 - .../ChildBrowser/src/ios/TargetDirTest.m | 1 - .../src/ios/preserveDirs/PreserveDirsTest.h | 20 - .../src/ios/preserveDirs/PreserveDirsTest.m | 1 - .../plugins/ChildBrowser/www/childbrowser.js | 19 - .../ChildBrowser/www/childbrowser/image.jpg | 1 - .../ChildBrowser/www/childbrowser_file.html | 1 - .../plugins/ConfigTestPlugin/plugin.xml | 37 - .../spec-plugman/plugins/Contacts/plugin.xml | 128 - .../Contacts/src/android/ContactAccessor.java | 198 - .../src/android/ContactAccessorSdk5.java | 2183 ----- .../Contacts/src/android/ContactManager.java | 122 - .../src/blackberry10/ContactActivity.js | 26 - .../src/blackberry10/ContactAddress.js | 30 - .../Contacts/src/blackberry10/ContactError.js | 30 - .../Contacts/src/blackberry10/ContactField.js | 27 - .../src/blackberry10/ContactFindOptions.js | 50 - .../Contacts/src/blackberry10/ContactName.js | 39 - .../Contacts/src/blackberry10/ContactNews.js | 26 - .../src/blackberry10/ContactOrganization.js | 22 - .../Contacts/src/blackberry10/ContactPhoto.js | 23 - .../src/blackberry10/contactConsts.js | 225 - .../Contacts/src/blackberry10/contactUtils.js | 223 - .../Contacts/src/blackberry10/index.js | 374 - .../Contacts/src/blackberry10/plugin.xml | 41 - .../plugins/Contacts/src/ios/CDVContact.h | 136 - .../plugins/Contacts/src/ios/CDVContact.m | 1752 ---- .../plugins/Contacts/src/ios/CDVContacts.h | 151 - .../plugins/Contacts/src/ios/CDVContacts.m | 593 -- .../plugins/Contacts/src/wp/Contacts.cs | 664 -- .../plugins/Contacts/www/Contact.js | 177 - .../plugins/Contacts/www/ContactAddress.js | 46 - .../plugins/Contacts/www/ContactError.js | 42 - .../plugins/Contacts/www/ContactField.js | 37 - .../Contacts/www/ContactFindOptions.js | 34 - .../plugins/Contacts/www/ContactName.js | 41 - .../Contacts/www/ContactOrganization.js | 44 - .../plugins/Contacts/www/contacts.js | 76 - .../plugins/Contacts/www/ios/Contact.js | 51 - .../plugins/Contacts/www/ios/contacts.js | 62 - .../plugins/DummyPlugin/android-resource.xml | 1 - .../plugins/DummyPlugin/plugin.xml | 187 - .../DummyPlugin/src/android/DummyPlugin.java | 19 - .../DummyPlugin/src/android/TestLib.jar | 0 .../DummyPlugin/src/blackberry10/index.js | 19 - .../src/ios/Custom.framework/someFheader.h | 0 .../src/ios/Custom.framework/somebinlib | 0 .../DummyPlugin/src/ios/DummyPlugin.bundle | 0 .../DummyPlugin/src/ios/DummyPluginCommand.h | 0 .../DummyPlugin/src/ios/DummyPluginCommand.m | 0 .../DummyPlugin/src/ios/SourceWithFramework.m | 0 .../DummyPlugin/src/ios/TargetDirTest.h | 0 .../DummyPlugin/src/ios/TargetDirTest.m | 0 .../DummyPlugin/src/ios/libsqlite3.dylib | 0 .../plugins/DummyPlugin/src/tizen/dummer.js | 0 .../DummyPlugin/src/windows8/dummer.js | 0 .../DummyPlugin/src/wp7/DummyPlugin.cs | 19 - .../DummyPlugin/src/wp8/DummyPlugin.cs | 19 - .../plugins/DummyPlugin/www/dummyplugin.js | 19 - .../DummyPlugin/www/dummyplugin/image.jpg | 1 - .../plugins/EnginePlugin/megaBoringVersion | 23 - .../plugins/EnginePlugin/megaFunVersion | 23 - .../plugins/EnginePlugin/plugin.xml | 33 - .../plugins/EnginePluginAndroid/plugin.xml | 32 - .../plugins/EnginePluginiOS/plugin.xml | 34 - .../plugins/FaultyPlugin/plugin.xml | 147 - .../src/android/FaultyPlugin.java | 19 - .../FaultyPlugin/src/blackberry10/client.js | 0 .../FaultyPlugin/src/ios/FaultyPlugin.h | 49 - .../FaultyPlugin/src/ios/FaultyPlugin.m | 86 - .../FaultyPlugin/src/windows8/faultyPlugin.js | 0 .../FaultyPlugin/src/wp7/FaultyPlugin.cs | 19 - .../FaultyPlugin/src/wp8/FaultyPlugin.cs | 19 - .../plugins/VariablePlugin/plugin.xml | 59 - .../plugins/WebNotifications/plugin.xml | 47 - .../src/ios/AppDelegate.m.diff | 18 - .../src/ios/WebNotifications.h | 35 - .../src/ios/WebNotifications.m | 124 - .../WebNotifications/www/webnotifications.js | 123 - .../plugins/WeblessPlugin/plugin.xml | 80 - .../src/android/WeblessPlugin.java | 19 - .../ios/WeblessPlugin.bundle/arrow_left.png | Bin 2946 -> 0 bytes .../WeblessPlugin.bundle/arrow_left@2x.png | Bin 2946 -> 0 bytes .../ios/WeblessPlugin.bundle/arrow_right.png | Bin 2946 -> 0 bytes .../WeblessPlugin.bundle/arrow_right@2x.png | Bin 2946 -> 0 bytes .../ios/WeblessPlugin.bundle/but_refresh.png | Bin 3369 -> 0 bytes .../WeblessPlugin.bundle/but_refresh@2x.png | Bin 3369 -> 0 bytes .../src/ios/WeblessPlugin.bundle/compass.png | Bin 3035 -> 0 bytes .../ios/WeblessPlugin.bundle/compass@2x.png | Bin 3035 -> 0 bytes .../src/ios/WeblessPluginCommand.h | 49 - .../src/ios/WeblessPluginCommand.m | 86 - .../src/ios/WeblessPluginViewController.h | 73 - .../src/ios/WeblessPluginViewController.m | 239 - .../src/ios/WeblessPluginViewController.xib | 875 -- .../plugins/cordova.echo/.gitignore | 1 - .../plugins/cordova.echo/plugin.xml | 24 - .../cordova.echo/src/blackberry10/index.js | 85 - .../blackberry10/native/device/echoJnext.so | Bin 1291818 -> 0 bytes .../native/public/json/autolink.h | 19 - .../blackberry10/native/public/json/config.h | 43 - .../native/public/json/features.h | 42 - .../native/public/json/forwards.h | 39 - .../blackberry10/native/public/json/json.h | 10 - .../blackberry10/native/public/json/reader.h | 196 - .../blackberry10/native/public/json/value.h | 1069 --- .../blackberry10/native/public/json/writer.h | 174 - .../native/public/json_batchallocator.h | 125 - .../native/public/json_internalarray.inl | 448 - .../native/public/json_internalmap.inl | 607 -- .../native/public/json_reader.cpp | 894 -- .../blackberry10/native/public/json_value.cpp | 1726 ---- .../native/public/json_valueiterator.inl | 292 - .../native/public/json_writer.cpp | 829 -- .../src/blackberry10/native/public/plugin.cpp | 320 - .../src/blackberry10/native/public/plugin.h | 70 - .../blackberry10/native/public/tokenizer.cpp | 222 - .../blackberry10/native/public/tokenizer.h | 55 - .../native/simulator/echoJnext.so | Bin 231778 -> 0 bytes .../src/blackberry10/native/src/echo.cpp | 121 - .../src/blackberry10/native/src/echo.hpp | 45 - .../plugins/cordova.echo/www/client.js | 53 - .../plugins/dependencies/A/plugin.xml | 60 - .../plugins/dependencies/A/src/android/A.java | 0 .../dependencies/A/src/ios/APluginCommand.h | 0 .../dependencies/A/src/ios/APluginCommand.m | 0 .../plugins/dependencies/A/www/plugin-a.js | 0 .../plugins/dependencies/B/plugin.xml | 60 - .../plugins/dependencies/B/src/android/B.java | 0 .../dependencies/B/src/ios/BPluginCommand.h | 0 .../dependencies/B/src/ios/BPluginCommand.m | 0 .../plugins/dependencies/B/www/plugin-b.js | 0 .../plugins/dependencies/C/plugin.xml | 57 - .../plugins/dependencies/C/src/android/C.java | 0 .../dependencies/C/src/ios/CPluginCommand.h | 0 .../dependencies/C/src/ios/CPluginCommand.m | 0 .../plugins/dependencies/C/www/plugin-c.js | 0 .../plugins/dependencies/D/plugin.xml | 57 - .../plugins/dependencies/D/src/android/D.java | 0 .../dependencies/D/src/ios/DPluginCommand.h | 0 .../dependencies/D/src/ios/DPluginCommand.m | 0 .../plugins/dependencies/D/www/plugin-d.js | 0 .../plugins/dependencies/E/plugin.xml | 59 - .../plugins/dependencies/E/src/android/E.java | 0 .../dependencies/E/src/ios/EPluginCommand.h | 0 .../dependencies/E/src/ios/EPluginCommand.m | 0 .../plugins/dependencies/E/www/plugin-d.js | 0 .../plugins/dependencies/F/plugin.xml | 60 - .../plugins/dependencies/F/src/android/F.java | 0 .../dependencies/F/src/ios/FPluginCommand.h | 0 .../dependencies/F/src/ios/FPluginCommand.m | 0 .../plugins/dependencies/F/www/plugin-f.js | 0 .../plugins/dependencies/G/plugin.xml | 59 - .../plugins/dependencies/G/src/android/G.java | 0 .../dependencies/G/src/ios/EPluginCommand.m | 0 .../dependencies/G/src/ios/GPluginCommand.h | 0 .../plugins/dependencies/G/www/plugin-g.js | 0 .../plugins/dependencies/H/plugin.xml | 59 - .../plugins/dependencies/H/src/android/H.java | 0 .../dependencies/H/src/ios/HPluginCommand.h | 0 .../dependencies/H/src/ios/HPluginCommand.m | 0 .../plugins/dependencies/H/www/plugin-h.js | 0 .../plugins/dependencies/README.md | 10 - .../plugins/dependencies/meta/D/plugin.xml | 61 - .../dependencies/meta/D/src/android/D.java | 0 .../meta/D/src/ios/DPluginCommand.h | 0 .../meta/D/src/ios/DPluginCommand.m | 0 .../dependencies/meta/D/www/plugin-d.js | 0 .../dependencies/meta/subdir/E/plugin.xml | 57 - .../meta/subdir/E/src/android/E.java | 0 .../meta/subdir/E/src/ios/EPluginCommand.h | 0 .../meta/subdir/E/src/ios/EPluginCommand.m | 0 .../meta/subdir/E/www/plugin-e.js | 0 .../plugins/dependencies/subdir/E/plugin.xml | 57 - .../dependencies/subdir/E/src/android/E.java | 0 .../subdir/E/src/ios/EPluginCommand.h | 0 .../subdir/E/src/ios/EPluginCommand.m | 0 .../dependencies/subdir/E/www/plugin-e.js | 0 .../plugins/multiple-children/plugin.xml | 108 - .../shared-deps-multi-child/plugin.xml | 34 - cordova-lib/spec-plugman/projects/.gitkeep | 0 .../android_install/AndroidManifest.xml | 20 - .../cordova/android_sdk_version | 1 - .../projects/android_install/cordova/version | 1 - .../android_install/cordova/version.bat | 2 - .../projects/android_one/AndroidManifest.xml | 71 - .../projects/android_one/assets/www/.gitkeep | 0 .../android_one/assets/www/cordova.js | 6848 -------------- .../projects/android_one/cordova/appinfo.jar | Bin 1574 -> 0 bytes .../projects/android_one/cordova/build | 23 - .../projects/android_one/cordova/clean | 23 - .../projects/android_one/cordova/lib/cordova | 386 - .../android_one/cordova/lib/install-device | 23 - .../android_one/cordova/lib/install-emulator | 23 - .../android_one/cordova/lib/list-devices | 23 - .../cordova/lib/list-emulator-images | 23 - .../cordova/lib/list-started-emulators | 23 - .../android_one/cordova/lib/start-emulator | 23 - .../projects/android_one/cordova/log | 23 - .../projects/android_one/cordova/run | 23 - .../projects/android_one/cordova/version | 32 - .../projects/android_one/res/xml/plugins.xml | 38 - .../projects/android_one/src/.gitkeep | 0 .../projects/android_two/AndroidManifest.xml | 69 - .../projects/android_two/assets/www/.gitkeep | 0 .../projects/android_two/res/xml/config.xml | 54 - .../projects/android_two/src/.gitkeep | 0 .../android_two_no_perms/AndroidManifest.xml | 49 - .../android_two_no_perms/assets/www/.gitkeep | 0 .../android_two_no_perms/res/xml/config.xml | 54 - .../android_two_no_perms/src/.gitkeep | 0 .../android_uninstall/AndroidManifest.xml | 20 - .../android_uninstall/cordova/version | 1 - .../android_uninstall/cordova/version.bat | 2 - .../native/device/chrome/.gitkeep | 0 .../native/device/plugins/jnext/auth.txt | 3 - .../native/simulator/chrome/.gitkeep | 0 .../native/simulator/plugins/jnext/auth.txt | 3 - .../projects/blackberry10/www/config.xml | 97 - .../CordovaLib.xcodeproj/project.pbxproj | 636 -- .../SampleApp.xcodeproj/project.orig.pbxproj | 498 - .../SampleApp.xcodeproj/project.pbxproj | 496 - .../SampleApp/SampleApp-Info.plist | 78 - .../ios-config-xml/SampleApp/config.xml | 59 - .../projects/ios-config-xml/www/.gitkeep | 0 .../CordovaLib.xcodeproj/project.pbxproj | 636 -- .../SampleApp.xcodeproj/project.orig.pbxproj | 498 - .../SampleApp.xcodeproj/project.pbxproj | 498 - .../ios-plist/SampleApp/PhoneGap.plist | 53 - .../ios-plist/SampleApp/SampleApp-Info.plist | 80 - .../projects/ios-plist/www/.gitkeep | 0 .../multiple-children/AndroidManifest.xml | 69 - .../multiple-children/res/xml/plugins.xml | 38 - .../projects/tizen/www/config.xml | 2 - .../windows8/CordovaApp_TemporaryKey.pfx | Bin 2504 -> 0 bytes .../projects/windows8/TestApp.jsproj | 81 - .../projects/windows8/TestApp.sln | 46 - .../projects/windows8/package.appxmanifest | 27 - .../projects/windows8/www/cordova-2.6.0.js | 8075 ----------------- .../projects/windows8/www/css/index.css | 115 - .../projects/windows8/www/img/logo.png | Bin 11600 -> 0 bytes .../projects/windows8/www/img/smalllogo.png | Bin 2831 -> 0 bytes .../windows8/www/img/splashscreen.png | Bin 24855 -> 0 bytes .../projects/windows8/www/img/storelogo.png | Bin 4052 -> 0 bytes .../projects/windows8/www/index.html | 42 - .../projects/windows8/www/js/index.js | 49 - .../projects/wp8/CordovaAppProj.csproj | 136 - .../projects/wp8/Properties/WMAppManifest.xml | 39 - .../spec-plugman/projects/www-only/.gitkeep | 0 .../spec-plugman/registry/registry.spec.js | 2 +- .../spec-plugman/util/config-changes.spec.js | 20 +- cordova-lib/spec-plugman/util/csproj.spec.js | 4 +- .../spec-plugman/util/dependencies.spec.js | 2 +- .../spec-plugman/util/xml-helpers.spec.js | 6 +- 1073 files changed, 77 insertions(+), 73420 deletions(-) rename cordova-lib/{spec-cordova-misc/fixtures => fixtures-cordova}/base/.cordova/config.json (100%) rename cordova-lib/{spec-cordova-misc/fixtures => fixtures-cordova}/base/merges/.svn (100%) rename cordova-lib/{spec-cordova-misc/fixtures => fixtures-cordova}/base/plugins/.svn (100%) rename cordova-lib/{spec-cordova-misc/fixtures => fixtures-cordova}/base/www/config.xml (100%) rename cordova-lib/{spec-cordova-misc/fixtures => fixtures-cordova}/base/www/css/index.css (100%) rename cordova-lib/{spec-cordova-misc/fixtures => fixtures-cordova}/base/www/img/logo.png (100%) rename cordova-lib/{spec-cordova-misc/fixtures => fixtures-cordova}/base/www/index.html (100%) rename cordova-lib/{spec-cordova-misc/fixtures => fixtures-cordova}/base/www/js/index.js (100%) rename cordova-lib/{spec-cordova-misc/fixtures => fixtures-cordova}/base/www/spec.html (100%) rename cordova-lib/{spec-cordova => fixtures-cordova}/helper.js (100%) rename cordova-lib/{spec-cordova-misc => fixtures-cordova}/helpers.js (100%) rename cordova-lib/{spec-cordova-misc/fixtures => fixtures-cordova}/hooks_bat/fail/fail.bat (100%) rename cordova-lib/{spec-cordova-misc/fixtures => fixtures-cordova}/hooks_bat/test/.dotted.bat (100%) rename cordova-lib/{spec-cordova-misc/fixtures => fixtures-cordova}/hooks_bat/test/07.bat (100%) rename cordova-lib/{spec-cordova-misc/fixtures => fixtures-cordova}/hooks_bat/test/1.bat (100%) rename cordova-lib/{spec-cordova-misc/fixtures => fixtures-cordova}/hooks_sh/fail/fail.sh (100%) rename cordova-lib/{spec-cordova-misc/fixtures => fixtures-cordova}/hooks_sh/test/.dotted.sh (100%) rename cordova-lib/{spec-cordova-misc/fixtures => fixtures-cordova}/hooks_sh/test/07.sh (100%) rename cordova-lib/{spec-cordova-misc/fixtures => fixtures-cordova}/hooks_sh/test/1.sh (100%) rename cordova-lib/{spec-cordova-misc/fixtures => fixtures-cordova}/platforms/android-lib/VERSION (100%) rename cordova-lib/{spec-cordova-misc/fixtures => fixtures-cordova}/platforms/android-lib/framework/assets/www/cordova.js (100%) rename cordova-lib/{spec-cordova-misc/fixtures => fixtures-cordova}/platforms/android/AndroidManifest.xml (100%) rename cordova-lib/{spec-cordova-misc/fixtures => fixtures-cordova}/platforms/android/assets/www/config.xml (100%) rename cordova-lib/{spec-cordova-misc/fixtures => fixtures-cordova}/platforms/android/assets/www/cordova.js (100%) rename cordova-lib/{spec-cordova-misc/fixtures => fixtures-cordova}/platforms/android/assets/www/cordova_plugins.js (100%) rename cordova-lib/{spec-cordova-misc/fixtures => fixtures-cordova}/platforms/android/assets/www/css/index.css (100%) rename cordova-lib/{spec-cordova-misc/fixtures => fixtures-cordova}/platforms/android/assets/www/img/logo.png (100%) rename cordova-lib/{spec-cordova-misc/fixtures => fixtures-cordova}/platforms/android/assets/www/index.html (100%) rename cordova-lib/{spec-cordova-misc/fixtures => fixtures-cordova}/platforms/android/assets/www/js/index.js (100%) rename cordova-lib/{spec-cordova-misc/fixtures => fixtures-cordova}/platforms/android/assets/www/spec.html (100%) rename cordova-lib/{spec-cordova-misc/fixtures => fixtures-cordova}/platforms/android/build.xml (100%) rename cordova-lib/{spec-cordova-misc/fixtures => fixtures-cordova}/platforms/android/cordova/build (100%) rename cordova-lib/{spec-cordova-misc/fixtures => fixtures-cordova}/platforms/android/cordova/check_reqs (100%) rename cordova-lib/{spec-cordova-misc/fixtures => fixtures-cordova}/platforms/android/cordova/clean (100%) rename cordova-lib/{spec-cordova-misc/fixtures => fixtures-cordova}/platforms/android/cordova/defaults.xml (100%) rename cordova-lib/{spec-cordova-misc/fixtures => fixtures-cordova}/platforms/android/cordova/lib/appinfo.js (100%) rename cordova-lib/{spec-cordova-misc/fixtures => fixtures-cordova}/platforms/android/cordova/lib/build.js (100%) rename cordova-lib/{spec-cordova-misc/fixtures => fixtures-cordova}/platforms/android/cordova/lib/check_reqs.js (100%) rename cordova-lib/{spec-cordova-misc/fixtures => fixtures-cordova}/platforms/android/cordova/lib/clean.js (100%) rename cordova-lib/{spec-cordova-misc/fixtures => fixtures-cordova}/platforms/android/cordova/lib/device.js (100%) rename cordova-lib/{spec-cordova-misc/fixtures => fixtures-cordova}/platforms/android/cordova/lib/emulator.js (100%) rename cordova-lib/{spec-cordova-misc/fixtures => fixtures-cordova}/platforms/android/cordova/lib/install-device (100%) rename cordova-lib/{spec-cordova-misc/fixtures => fixtures-cordova}/platforms/android/cordova/lib/install-emulator (100%) rename cordova-lib/{spec-cordova-misc/fixtures => fixtures-cordova}/platforms/android/cordova/lib/list-devices (100%) rename cordova-lib/{spec-cordova-misc/fixtures => fixtures-cordova}/platforms/android/cordova/lib/list-emulator-images (100%) rename cordova-lib/{spec-cordova-misc/fixtures => fixtures-cordova}/platforms/android/cordova/lib/list-started-emulators (100%) rename cordova-lib/{spec-cordova-misc/fixtures => fixtures-cordova}/platforms/android/cordova/lib/log.js (100%) rename cordova-lib/{spec-cordova-misc/fixtures => fixtures-cordova}/platforms/android/cordova/lib/run.js (100%) rename cordova-lib/{spec-cordova-misc/fixtures => fixtures-cordova}/platforms/android/cordova/lib/start-emulator (100%) rename cordova-lib/{spec-cordova-misc/fixtures => fixtures-cordova}/platforms/android/cordova/log (100%) rename cordova-lib/{spec-cordova-misc/fixtures => fixtures-cordova}/platforms/android/cordova/run (100%) rename cordova-lib/{spec-cordova-misc/fixtures => fixtures-cordova}/platforms/android/cordova/version (100%) rename cordova-lib/{spec-cordova-misc/fixtures => fixtures-cordova}/platforms/android/local.properties (100%) rename cordova-lib/{spec-cordova-misc/fixtures => fixtures-cordova}/platforms/android/proguard-project.txt (100%) rename cordova-lib/{spec-cordova-misc/fixtures => fixtures-cordova}/platforms/android/project.properties (100%) rename cordova-lib/{spec-cordova-misc/fixtures => fixtures-cordova}/platforms/android/res/drawable-hdpi/icon.png (100%) rename cordova-lib/{spec-cordova-misc/fixtures => fixtures-cordova}/platforms/android/res/drawable-ldpi/icon.png (100%) rename cordova-lib/{spec-cordova-misc/fixtures => fixtures-cordova}/platforms/android/res/drawable-mdpi/icon.png (100%) rename cordova-lib/{spec-cordova-misc/fixtures => fixtures-cordova}/platforms/android/res/drawable-xhdpi/icon.png (100%) rename cordova-lib/{spec-cordova-misc/fixtures => fixtures-cordova}/platforms/android/res/drawable/icon.png (100%) rename cordova-lib/{spec-cordova-misc/fixtures => fixtures-cordova}/platforms/android/res/values/strings.xml (100%) rename cordova-lib/{spec-cordova-misc/fixtures => fixtures-cordova}/platforms/android/res/xml/config.xml (100%) rename cordova-lib/{spec-cordova-misc/fixtures => fixtures-cordova}/platforms/android/src/org/testing/TestBase.java (100%) rename cordova-lib/{spec-cordova-misc/fixtures => fixtures-cordova}/plugins/ChildBrowser/plugin.xml (100%) rename cordova-lib/{spec-cordova-misc/fixtures => fixtures-cordova}/plugins/ChildBrowser/src/android/ChildBrowser.java (100%) rename cordova-lib/{spec-cordova-misc/fixtures => fixtures-cordova}/plugins/ChildBrowser/www/childbrowser.js (100%) rename cordova-lib/{spec-cordova-misc/fixtures => fixtures-cordova}/plugins/ChildBrowser/www/childbrowser/image.jpg (100%) rename cordova-lib/{spec-cordova-misc/fixtures => fixtures-cordova}/plugins/ChildBrowser/www/childbrowser_file.html (100%) rename cordova-lib/{spec-cordova-misc/fixtures => fixtures-cordova}/plugins/android/plugin.xml (100%) rename cordova-lib/{spec-cordova-misc/fixtures => fixtures-cordova}/plugins/android/src/android/Android.java (100%) rename cordova-lib/{spec-cordova-misc/fixtures => fixtures-cordova}/plugins/android/src/android/SomethingWithR.java (100%) rename cordova-lib/{spec-cordova-misc/fixtures => fixtures-cordova}/plugins/android/www/android.js (100%) rename cordova-lib/{spec-cordova-misc/fixtures => fixtures-cordova}/plugins/fake1/plugin.xml (100%) rename cordova-lib/{spec-cordova-misc/fixtures => fixtures-cordova}/plugins/test/plugin.xml (100%) rename cordova-lib/{spec-cordova-misc/fixtures => fixtures-cordova}/plugins/test/www/test.js (100%) rename cordova-lib/{spec-cordova-misc/fixtures => fixtures-cordova}/projects/android/AndroidManifest.xml (100%) rename cordova-lib/{spec-cordova-misc/fixtures => fixtures-cordova}/projects/android/assets/www/.gitkeep (100%) rename cordova-lib/{spec-cordova-misc/fixtures => fixtures-cordova}/projects/android/res/xml/config.xml (100%) rename cordova-lib/{spec-cordova-misc/fixtures => fixtures-cordova}/projects/android/src/.gitkeep (100%) rename cordova-lib/{spec-cordova-misc/fixtures => fixtures-cordova}/projects/windows/bom_test.xml (100%) rename cordova-lib/{spec-cordova-misc/fixtures => fixtures-cordova}/templates/no_content_config.xml (100%) rename cordova-lib/{spec-cordova-plugins/fixtures/projects/android/assets/www => fixtures-plugman/plugins}/.gitkeep (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/AndroidJS/plugin.xml (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/AndroidJS/www/android.js (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/ChildBrowser/plugin.xml (100%) rename cordova-lib/{spec-cordova-plugins/fixtures => fixtures-plugman}/plugins/ChildBrowser/src/android/ChildBrowser.java (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/ChildBrowser/src/ios/ChildBrowser.bundle/arrow_left.png (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/ChildBrowser/src/ios/ChildBrowser.bundle/arrow_left@2x.png (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/ChildBrowser/src/ios/ChildBrowser.bundle/arrow_right.png (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/ChildBrowser/src/ios/ChildBrowser.bundle/arrow_right@2x.png (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/ChildBrowser/src/ios/ChildBrowser.bundle/but_refresh.png (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/ChildBrowser/src/ios/ChildBrowser.bundle/but_refresh@2x.png (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/ChildBrowser/src/ios/ChildBrowser.bundle/compass.png (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/ChildBrowser/src/ios/ChildBrowser.bundle/compass@2x.png (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/ChildBrowser/src/ios/ChildBrowserCommand.h (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/ChildBrowser/src/ios/ChildBrowserCommand.m (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/ChildBrowser/src/ios/ChildBrowserViewController.h (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/ChildBrowser/src/ios/ChildBrowserViewController.m (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/ChildBrowser/src/ios/ChildBrowserViewController.xib (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/ChildBrowser/src/ios/TargetDirTest.h (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/ChildBrowser/src/ios/TargetDirTest.m (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/ChildBrowser/src/ios/preserveDirs/PreserveDirsTest.h (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/ChildBrowser/src/ios/preserveDirs/PreserveDirsTest.m (100%) rename cordova-lib/{spec-cordova-plugins/fixtures => fixtures-plugman}/plugins/ChildBrowser/www/childbrowser.js (100%) rename cordova-lib/{spec-cordova-plugins/fixtures => fixtures-plugman}/plugins/ChildBrowser/www/childbrowser/image.jpg (100%) rename cordova-lib/{spec-cordova-plugins/fixtures => fixtures-plugman}/plugins/ChildBrowser/www/childbrowser_file.html (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/ConfigTestPlugin/plugin.xml (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/Contacts/plugin.xml (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/Contacts/src/android/ContactAccessor.java (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/Contacts/src/android/ContactAccessorSdk5.java (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/Contacts/src/android/ContactManager.java (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/Contacts/src/blackberry10/ContactActivity.js (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/Contacts/src/blackberry10/ContactAddress.js (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/Contacts/src/blackberry10/ContactError.js (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/Contacts/src/blackberry10/ContactField.js (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/Contacts/src/blackberry10/ContactFindOptions.js (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/Contacts/src/blackberry10/ContactName.js (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/Contacts/src/blackberry10/ContactNews.js (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/Contacts/src/blackberry10/ContactOrganization.js (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/Contacts/src/blackberry10/ContactPhoto.js (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/Contacts/src/blackberry10/contactConsts.js (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/Contacts/src/blackberry10/contactUtils.js (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/Contacts/src/blackberry10/index.js (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/Contacts/src/blackberry10/plugin.xml (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/Contacts/src/ios/CDVContact.h (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/Contacts/src/ios/CDVContact.m (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/Contacts/src/ios/CDVContacts.h (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/Contacts/src/ios/CDVContacts.m (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/Contacts/src/wp/Contacts.cs (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/Contacts/www/Contact.js (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/Contacts/www/ContactAddress.js (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/Contacts/www/ContactError.js (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/Contacts/www/ContactField.js (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/Contacts/www/ContactFindOptions.js (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/Contacts/www/ContactName.js (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/Contacts/www/ContactOrganization.js (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/Contacts/www/contacts.js (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/Contacts/www/ios/Contact.js (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/Contacts/www/ios/contacts.js (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/DummyPlugin/android-resource.xml (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/DummyPlugin/plugin.xml (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/DummyPlugin/src/android/DummyPlugin.java (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/DummyPlugin/src/blackberry10/index.js (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/DummyPlugin/src/ios/Custom.framework/someFheader.h (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/DummyPlugin/src/ios/Custom.framework/somebinlib (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/DummyPlugin/src/ios/DummyPlugin.bundle (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/DummyPlugin/src/ios/DummyPluginCommand.h (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/DummyPlugin/src/ios/DummyPluginCommand.m (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/DummyPlugin/src/ios/SourceWithFramework.m (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/DummyPlugin/src/ios/TargetDirTest.h (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/DummyPlugin/src/ios/TargetDirTest.m (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/DummyPlugin/src/ios/libsqlite3.dylib (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/DummyPlugin/src/tizen/dummer.js (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/DummyPlugin/src/windows8/dummer.js (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/DummyPlugin/src/wp7/DummyPlugin.cs (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/DummyPlugin/src/wp8/DummyPlugin.cs (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/DummyPlugin/www/dummyplugin.js (100%) rename cordova-lib/{spec-cordova-project/fixtures/plugins/ChildBrowser/www/childbrowser => fixtures-plugman/plugins/DummyPlugin/www/dummyplugin}/image.jpg (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/EnginePlugin/megaBoringVersion (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/EnginePlugin/megaFunVersion (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/EnginePlugin/plugin.xml (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/EnginePluginAndroid/plugin.xml (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/EnginePluginiOS/plugin.xml (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/FaultyPlugin/plugin.xml (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/FaultyPlugin/src/android/FaultyPlugin.java (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/FaultyPlugin/src/blackberry10/client.js (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/FaultyPlugin/src/ios/FaultyPlugin.h (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/FaultyPlugin/src/ios/FaultyPlugin.m (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/FaultyPlugin/src/windows8/faultyPlugin.js (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/FaultyPlugin/src/wp7/FaultyPlugin.cs (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/FaultyPlugin/src/wp8/FaultyPlugin.cs (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/VariablePlugin/plugin.xml (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/WebNotifications/plugin.xml (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/WebNotifications/src/ios/AppDelegate.m.diff (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/WebNotifications/src/ios/WebNotifications.h (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/WebNotifications/src/ios/WebNotifications.m (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/WebNotifications/www/webnotifications.js (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/WeblessPlugin/plugin.xml (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/WeblessPlugin/src/android/WeblessPlugin.java (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/WeblessPlugin/src/ios/WeblessPlugin.bundle/arrow_left.png (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/WeblessPlugin/src/ios/WeblessPlugin.bundle/arrow_left@2x.png (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/WeblessPlugin/src/ios/WeblessPlugin.bundle/arrow_right.png (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/WeblessPlugin/src/ios/WeblessPlugin.bundle/arrow_right@2x.png (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/WeblessPlugin/src/ios/WeblessPlugin.bundle/but_refresh.png (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/WeblessPlugin/src/ios/WeblessPlugin.bundle/but_refresh@2x.png (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/WeblessPlugin/src/ios/WeblessPlugin.bundle/compass.png (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/WeblessPlugin/src/ios/WeblessPlugin.bundle/compass@2x.png (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/WeblessPlugin/src/ios/WeblessPluginCommand.h (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/WeblessPlugin/src/ios/WeblessPluginCommand.m (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/WeblessPlugin/src/ios/WeblessPluginViewController.h (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/WeblessPlugin/src/ios/WeblessPluginViewController.m (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/WeblessPlugin/src/ios/WeblessPluginViewController.xib (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/cordova.echo/.gitignore (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/cordova.echo/plugin.xml (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/cordova.echo/src/blackberry10/index.js (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/cordova.echo/src/blackberry10/native/device/echoJnext.so (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/cordova.echo/src/blackberry10/native/public/json/autolink.h (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/cordova.echo/src/blackberry10/native/public/json/config.h (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/cordova.echo/src/blackberry10/native/public/json/features.h (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/cordova.echo/src/blackberry10/native/public/json/forwards.h (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/cordova.echo/src/blackberry10/native/public/json/json.h (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/cordova.echo/src/blackberry10/native/public/json/reader.h (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/cordova.echo/src/blackberry10/native/public/json/value.h (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/cordova.echo/src/blackberry10/native/public/json/writer.h (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/cordova.echo/src/blackberry10/native/public/json_batchallocator.h (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/cordova.echo/src/blackberry10/native/public/json_internalarray.inl (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/cordova.echo/src/blackberry10/native/public/json_internalmap.inl (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/cordova.echo/src/blackberry10/native/public/json_reader.cpp (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/cordova.echo/src/blackberry10/native/public/json_value.cpp (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/cordova.echo/src/blackberry10/native/public/json_valueiterator.inl (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/cordova.echo/src/blackberry10/native/public/json_writer.cpp (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/cordova.echo/src/blackberry10/native/public/plugin.cpp (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/cordova.echo/src/blackberry10/native/public/plugin.h (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/cordova.echo/src/blackberry10/native/public/tokenizer.cpp (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/cordova.echo/src/blackberry10/native/public/tokenizer.h (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/cordova.echo/src/blackberry10/native/simulator/echoJnext.so (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/cordova.echo/src/blackberry10/native/src/echo.cpp (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/cordova.echo/src/blackberry10/native/src/echo.hpp (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/cordova.echo/www/client.js (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/dependencies/A/plugin.xml (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/dependencies/A/src/android/A.java (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/dependencies/A/src/ios/APluginCommand.h (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/dependencies/A/src/ios/APluginCommand.m (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/dependencies/A/www/plugin-a.js (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/dependencies/B/plugin.xml (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/dependencies/B/src/android/B.java (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/dependencies/B/src/ios/BPluginCommand.h (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/dependencies/B/src/ios/BPluginCommand.m (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/dependencies/B/www/plugin-b.js (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/dependencies/C/plugin.xml (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/dependencies/C/src/android/C.java (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/dependencies/C/src/ios/CPluginCommand.h (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/dependencies/C/src/ios/CPluginCommand.m (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/dependencies/C/www/plugin-c.js (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/dependencies/D/plugin.xml (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/dependencies/D/src/android/D.java (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/dependencies/D/src/ios/DPluginCommand.h (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/dependencies/D/src/ios/DPluginCommand.m (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/dependencies/D/www/plugin-d.js (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/dependencies/E/plugin.xml (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/dependencies/E/src/android/E.java (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/dependencies/E/src/ios/EPluginCommand.h (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/dependencies/E/src/ios/EPluginCommand.m (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/dependencies/E/www/plugin-d.js (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/dependencies/F/plugin.xml (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/dependencies/F/src/android/F.java (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/dependencies/F/src/ios/FPluginCommand.h (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/dependencies/F/src/ios/FPluginCommand.m (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/dependencies/F/www/plugin-f.js (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/dependencies/G/plugin.xml (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/dependencies/G/src/android/G.java (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/dependencies/G/src/ios/EPluginCommand.m (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/dependencies/G/src/ios/GPluginCommand.h (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/dependencies/G/www/plugin-g.js (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/dependencies/H/plugin.xml (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/dependencies/H/src/android/H.java (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/dependencies/H/src/ios/HPluginCommand.h (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/dependencies/H/src/ios/HPluginCommand.m (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/dependencies/H/www/plugin-h.js (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/dependencies/README.md (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/dependencies/meta/D/plugin.xml (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/dependencies/meta/D/src/android/D.java (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/dependencies/meta/D/src/ios/DPluginCommand.h (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/dependencies/meta/D/src/ios/DPluginCommand.m (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/dependencies/meta/D/www/plugin-d.js (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/dependencies/meta/subdir/E/plugin.xml (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/dependencies/meta/subdir/E/src/android/E.java (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/dependencies/meta/subdir/E/src/ios/EPluginCommand.h (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/dependencies/meta/subdir/E/src/ios/EPluginCommand.m (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/dependencies/meta/subdir/E/www/plugin-e.js (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/dependencies/subdir/E/plugin.xml (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/dependencies/subdir/E/src/android/E.java (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/dependencies/subdir/E/src/ios/EPluginCommand.h (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/dependencies/subdir/E/src/ios/EPluginCommand.m (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/dependencies/subdir/E/www/plugin-e.js (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/multiple-children/plugin.xml (100%) rename cordova-lib/{spec-plugman-create => fixtures-plugman}/plugins/shared-deps-multi-child/plugin.xml (100%) rename cordova-lib/{spec-cordova-plugins/fixtures/projects/android/src => fixtures-plugman/projects}/.gitkeep (100%) rename cordova-lib/{spec-plugman-install => fixtures-plugman}/projects/android_install/AndroidManifest.xml (100%) rename cordova-lib/{spec-plugman-install => fixtures-plugman}/projects/android_install/cordova/android_sdk_version (100%) rename cordova-lib/{spec-plugman-install => fixtures-plugman}/projects/android_install/cordova/version (100%) rename cordova-lib/{spec-plugman-install => fixtures-plugman}/projects/android_install/cordova/version.bat (100%) rename cordova-lib/{spec-plugman-install => fixtures-plugman}/projects/android_one/AndroidManifest.xml (100%) rename cordova-lib/{spec-cordova-project/fixtures/projects/android => fixtures-plugman/projects/android_one}/assets/www/.gitkeep (100%) rename cordova-lib/{spec-plugman-install => fixtures-plugman}/projects/android_one/assets/www/cordova.js (100%) rename cordova-lib/{spec-plugman-install => fixtures-plugman}/projects/android_one/cordova/build (100%) rename cordova-lib/{spec-plugman-install => fixtures-plugman}/projects/android_one/cordova/clean (100%) rename cordova-lib/{spec-plugman-install => fixtures-plugman}/projects/android_one/cordova/lib/cordova (100%) rename cordova-lib/{spec-plugman-install => fixtures-plugman}/projects/android_one/cordova/lib/install-device (100%) rename cordova-lib/{spec-plugman-install => fixtures-plugman}/projects/android_one/cordova/lib/install-emulator (100%) rename cordova-lib/{spec-plugman-install => fixtures-plugman}/projects/android_one/cordova/lib/list-devices (100%) rename cordova-lib/{spec-plugman-install => fixtures-plugman}/projects/android_one/cordova/lib/list-emulator-images (100%) rename cordova-lib/{spec-plugman-install => fixtures-plugman}/projects/android_one/cordova/lib/list-started-emulators (100%) rename cordova-lib/{spec-plugman-install => fixtures-plugman}/projects/android_one/cordova/lib/start-emulator (100%) rename cordova-lib/{spec-plugman-install => fixtures-plugman}/projects/android_one/cordova/log (100%) rename cordova-lib/{spec-plugman-install => fixtures-plugman}/projects/android_one/cordova/run (100%) rename cordova-lib/{spec-plugman-install => fixtures-plugman}/projects/android_one/cordova/version (100%) rename cordova-lib/{spec-plugman-install => fixtures-plugman}/projects/android_one/res/xml/plugins.xml (100%) rename cordova-lib/{spec-cordova-project/fixtures/projects/android => fixtures-plugman/projects/android_one}/src/.gitkeep (100%) rename cordova-lib/{spec-cordova-plugins/fixtures/projects/android => fixtures-plugman/projects/android_two}/AndroidManifest.xml (100%) rename cordova-lib/{spec-cordova/fixtures/projects/android => fixtures-plugman/projects/android_two}/assets/www/.gitkeep (100%) rename cordova-lib/{spec-cordova-plugins/fixtures/projects/android => fixtures-plugman/projects/android_two}/res/xml/config.xml (100%) rename cordova-lib/{spec-cordova/fixtures/projects/android => fixtures-plugman/projects/android_two}/src/.gitkeep (100%) rename cordova-lib/{spec-plugman-install => fixtures-plugman}/projects/android_two_no_perms/AndroidManifest.xml (100%) rename cordova-lib/{spec-plugman-create/plugins => fixtures-plugman/projects/android_two_no_perms/assets/www}/.gitkeep (100%) rename cordova-lib/{spec-cordova-project/fixtures/projects/android => fixtures-plugman/projects/android_two_no_perms}/res/xml/config.xml (100%) rename cordova-lib/{spec-plugman-install/plugins => fixtures-plugman/projects/android_two_no_perms/src}/.gitkeep (100%) rename cordova-lib/{spec-plugman-install => fixtures-plugman}/projects/android_uninstall/AndroidManifest.xml (100%) rename cordova-lib/{spec-plugman-install => fixtures-plugman}/projects/android_uninstall/cordova/version (100%) rename cordova-lib/{spec-plugman-install => fixtures-plugman}/projects/android_uninstall/cordova/version.bat (100%) rename cordova-lib/{spec-plugman-install/projects => fixtures-plugman/projects/blackberry10/native/device/chrome}/.gitkeep (100%) rename cordova-lib/{spec-plugman-install => fixtures-plugman}/projects/blackberry10/native/device/plugins/jnext/auth.txt (100%) rename cordova-lib/{spec-plugman-install/projects/android_one/assets/www => fixtures-plugman/projects/blackberry10/native/simulator/chrome}/.gitkeep (100%) rename cordova-lib/{spec-plugman-install => fixtures-plugman}/projects/blackberry10/native/simulator/plugins/jnext/auth.txt (100%) rename cordova-lib/{spec-plugman-install => fixtures-plugman}/projects/blackberry10/www/config.xml (100%) rename cordova-lib/{spec-plugman-install => fixtures-plugman}/projects/ios-config-xml/CordovaLib/CordovaLib.xcodeproj/project.pbxproj (100%) rename cordova-lib/{spec-plugman-install => fixtures-plugman}/projects/ios-config-xml/SampleApp.xcodeproj/project.orig.pbxproj (100%) rename cordova-lib/{spec-plugman-install => fixtures-plugman}/projects/ios-config-xml/SampleApp.xcodeproj/project.pbxproj (100%) rename cordova-lib/{spec-plugman-install => fixtures-plugman}/projects/ios-config-xml/SampleApp/SampleApp-Info.plist (100%) rename cordova-lib/{spec-plugman-install => fixtures-plugman}/projects/ios-config-xml/SampleApp/config.xml (100%) rename cordova-lib/{spec-plugman-install/projects/android_one/src => fixtures-plugman/projects/ios-config-xml/www}/.gitkeep (100%) rename cordova-lib/{spec-plugman-install => fixtures-plugman}/projects/ios-plist/CordovaLib/CordovaLib.xcodeproj/project.pbxproj (100%) rename cordova-lib/{spec-plugman-install => fixtures-plugman}/projects/ios-plist/SampleApp.xcodeproj/project.orig.pbxproj (100%) rename cordova-lib/{spec-plugman-install => fixtures-plugman}/projects/ios-plist/SampleApp.xcodeproj/project.pbxproj (100%) rename cordova-lib/{spec-plugman-install => fixtures-plugman}/projects/ios-plist/SampleApp/PhoneGap.plist (100%) rename cordova-lib/{spec-plugman-install => fixtures-plugman}/projects/ios-plist/SampleApp/SampleApp-Info.plist (100%) rename cordova-lib/{spec-plugman-install/projects/android_two/assets => fixtures-plugman/projects/ios-plist}/www/.gitkeep (100%) rename cordova-lib/{spec-cordova-project/fixtures/projects/android => fixtures-plugman/projects/multiple-children}/AndroidManifest.xml (100%) rename cordova-lib/{spec-plugman-install => fixtures-plugman}/projects/multiple-children/res/xml/plugins.xml (100%) rename cordova-lib/{spec-plugman-install => fixtures-plugman}/projects/tizen/www/config.xml (100%) rename cordova-lib/{spec-plugman-install => fixtures-plugman}/projects/windows8/CordovaApp_TemporaryKey.pfx (100%) rename cordova-lib/{spec-plugman-install => fixtures-plugman}/projects/windows8/TestApp.jsproj (100%) rename cordova-lib/{spec-plugman-install => fixtures-plugman}/projects/windows8/TestApp.sln (100%) rename cordova-lib/{spec-plugman-install => fixtures-plugman}/projects/windows8/package.appxmanifest (100%) rename cordova-lib/{spec-plugman-install => fixtures-plugman}/projects/windows8/www/cordova-2.6.0.js (100%) rename cordova-lib/{spec-cordova-plugins/fixtures/base => fixtures-plugman/projects/windows8}/www/css/index.css (100%) rename cordova-lib/{spec-plugman-install => fixtures-plugman}/projects/windows8/www/img/logo.png (100%) rename cordova-lib/{spec-plugman-install => fixtures-plugman}/projects/windows8/www/img/smalllogo.png (100%) rename cordova-lib/{spec-plugman-install => fixtures-plugman}/projects/windows8/www/img/splashscreen.png (100%) rename cordova-lib/{spec-plugman-install => fixtures-plugman}/projects/windows8/www/img/storelogo.png (100%) rename cordova-lib/{spec-plugman-install => fixtures-plugman}/projects/windows8/www/index.html (100%) rename cordova-lib/{spec-plugman-install => fixtures-plugman}/projects/windows8/www/js/index.js (100%) rename cordova-lib/{spec-plugman-install => fixtures-plugman}/projects/wp8/CordovaAppProj.csproj (100%) rename cordova-lib/{spec-plugman-install => fixtures-plugman}/projects/wp8/Properties/WMAppManifest.xml (100%) rename cordova-lib/{spec-plugman-install/projects/android_two/src => fixtures-plugman/projects/www-only}/.gitkeep (100%) delete mode 100644 cordova-lib/spec-cordova-plugins/fixtures/base/.cordova/config.json delete mode 100644 cordova-lib/spec-cordova-plugins/fixtures/base/merges/.svn delete mode 100644 cordova-lib/spec-cordova-plugins/fixtures/base/plugins/.svn delete mode 100644 cordova-lib/spec-cordova-plugins/fixtures/base/www/config.xml delete mode 100644 cordova-lib/spec-cordova-plugins/fixtures/base/www/img/logo.png delete mode 100644 cordova-lib/spec-cordova-plugins/fixtures/base/www/index.html delete mode 100644 cordova-lib/spec-cordova-plugins/fixtures/base/www/js/index.js delete mode 100644 cordova-lib/spec-cordova-plugins/fixtures/base/www/spec.html delete mode 100644 cordova-lib/spec-cordova-plugins/fixtures/hooks_bat/fail/fail.bat delete mode 100644 cordova-lib/spec-cordova-plugins/fixtures/hooks_bat/test/.dotted.bat delete mode 100644 cordova-lib/spec-cordova-plugins/fixtures/hooks_bat/test/07.bat delete mode 100644 cordova-lib/spec-cordova-plugins/fixtures/hooks_bat/test/1.bat delete mode 100755 cordova-lib/spec-cordova-plugins/fixtures/hooks_sh/fail/fail.sh delete mode 100755 cordova-lib/spec-cordova-plugins/fixtures/hooks_sh/test/.dotted.sh delete mode 100755 cordova-lib/spec-cordova-plugins/fixtures/hooks_sh/test/07.sh delete mode 100755 cordova-lib/spec-cordova-plugins/fixtures/hooks_sh/test/1.sh delete mode 100644 cordova-lib/spec-cordova-plugins/fixtures/platforms/android-lib/VERSION delete mode 100644 cordova-lib/spec-cordova-plugins/fixtures/platforms/android-lib/framework/assets/www/cordova.js delete mode 100644 cordova-lib/spec-cordova-plugins/fixtures/platforms/android/AndroidManifest.xml delete mode 100644 cordova-lib/spec-cordova-plugins/fixtures/platforms/android/assets/www/config.xml delete mode 100644 cordova-lib/spec-cordova-plugins/fixtures/platforms/android/assets/www/cordova.js delete mode 100644 cordova-lib/spec-cordova-plugins/fixtures/platforms/android/assets/www/cordova_plugins.js delete mode 100644 cordova-lib/spec-cordova-plugins/fixtures/platforms/android/assets/www/css/index.css delete mode 100644 cordova-lib/spec-cordova-plugins/fixtures/platforms/android/assets/www/img/logo.png delete mode 100644 cordova-lib/spec-cordova-plugins/fixtures/platforms/android/assets/www/index.html delete mode 100644 cordova-lib/spec-cordova-plugins/fixtures/platforms/android/assets/www/js/index.js delete mode 100644 cordova-lib/spec-cordova-plugins/fixtures/platforms/android/assets/www/spec.html delete mode 100644 cordova-lib/spec-cordova-plugins/fixtures/platforms/android/build.xml delete mode 100755 cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/build delete mode 100755 cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/check_reqs delete mode 100755 cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/clean delete mode 100644 cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/defaults.xml delete mode 100755 cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/lib/appinfo.js delete mode 100755 cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/lib/build.js delete mode 100755 cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/lib/check_reqs.js delete mode 100755 cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/lib/clean.js delete mode 100755 cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/lib/device.js delete mode 100755 cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/lib/emulator.js delete mode 100755 cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/lib/install-device delete mode 100755 cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/lib/install-emulator delete mode 100755 cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/lib/list-devices delete mode 100755 cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/lib/list-emulator-images delete mode 100755 cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/lib/list-started-emulators delete mode 100755 cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/lib/log.js delete mode 100755 cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/lib/run.js delete mode 100755 cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/lib/start-emulator delete mode 100755 cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/log delete mode 100755 cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/run delete mode 100755 cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/version delete mode 100644 cordova-lib/spec-cordova-plugins/fixtures/platforms/android/local.properties delete mode 100644 cordova-lib/spec-cordova-plugins/fixtures/platforms/android/proguard-project.txt delete mode 100644 cordova-lib/spec-cordova-plugins/fixtures/platforms/android/project.properties delete mode 100644 cordova-lib/spec-cordova-plugins/fixtures/platforms/android/res/drawable-hdpi/icon.png delete mode 100644 cordova-lib/spec-cordova-plugins/fixtures/platforms/android/res/drawable-ldpi/icon.png delete mode 100644 cordova-lib/spec-cordova-plugins/fixtures/platforms/android/res/drawable-mdpi/icon.png delete mode 100644 cordova-lib/spec-cordova-plugins/fixtures/platforms/android/res/drawable-xhdpi/icon.png delete mode 100644 cordova-lib/spec-cordova-plugins/fixtures/platforms/android/res/drawable/icon.png delete mode 100644 cordova-lib/spec-cordova-plugins/fixtures/platforms/android/res/values/strings.xml delete mode 100644 cordova-lib/spec-cordova-plugins/fixtures/platforms/android/res/xml/config.xml delete mode 100644 cordova-lib/spec-cordova-plugins/fixtures/platforms/android/src/org/testing/TestBase.java delete mode 100644 cordova-lib/spec-cordova-plugins/fixtures/plugins/ChildBrowser/plugin.xml delete mode 100644 cordova-lib/spec-cordova-plugins/fixtures/plugins/android/plugin.xml delete mode 100644 cordova-lib/spec-cordova-plugins/fixtures/plugins/android/src/android/Android.java delete mode 100644 cordova-lib/spec-cordova-plugins/fixtures/plugins/android/src/android/SomethingWithR.java delete mode 100644 cordova-lib/spec-cordova-plugins/fixtures/plugins/android/www/android.js delete mode 100644 cordova-lib/spec-cordova-plugins/fixtures/plugins/fake1/plugin.xml delete mode 100644 cordova-lib/spec-cordova-plugins/fixtures/plugins/test/plugin.xml delete mode 100644 cordova-lib/spec-cordova-plugins/fixtures/plugins/test/www/test.js delete mode 100644 cordova-lib/spec-cordova-plugins/fixtures/projects/windows/bom_test.xml delete mode 100644 cordova-lib/spec-cordova-plugins/fixtures/templates/no_content_config.xml delete mode 100644 cordova-lib/spec-cordova-plugins/helpers.js delete mode 100644 cordova-lib/spec-cordova-project/fixtures/base/.cordova/config.json delete mode 100644 cordova-lib/spec-cordova-project/fixtures/base/merges/.svn delete mode 100644 cordova-lib/spec-cordova-project/fixtures/base/plugins/.svn delete mode 100644 cordova-lib/spec-cordova-project/fixtures/base/www/config.xml delete mode 100644 cordova-lib/spec-cordova-project/fixtures/base/www/css/index.css delete mode 100644 cordova-lib/spec-cordova-project/fixtures/base/www/img/logo.png delete mode 100644 cordova-lib/spec-cordova-project/fixtures/base/www/index.html delete mode 100644 cordova-lib/spec-cordova-project/fixtures/base/www/js/index.js delete mode 100644 cordova-lib/spec-cordova-project/fixtures/base/www/spec.html delete mode 100644 cordova-lib/spec-cordova-project/fixtures/hooks_bat/fail/fail.bat delete mode 100644 cordova-lib/spec-cordova-project/fixtures/hooks_bat/test/.dotted.bat delete mode 100644 cordova-lib/spec-cordova-project/fixtures/hooks_bat/test/07.bat delete mode 100644 cordova-lib/spec-cordova-project/fixtures/hooks_bat/test/1.bat delete mode 100755 cordova-lib/spec-cordova-project/fixtures/hooks_sh/fail/fail.sh delete mode 100755 cordova-lib/spec-cordova-project/fixtures/hooks_sh/test/.dotted.sh delete mode 100755 cordova-lib/spec-cordova-project/fixtures/hooks_sh/test/07.sh delete mode 100755 cordova-lib/spec-cordova-project/fixtures/hooks_sh/test/1.sh delete mode 100644 cordova-lib/spec-cordova-project/fixtures/platforms/android-lib/VERSION delete mode 100644 cordova-lib/spec-cordova-project/fixtures/platforms/android-lib/framework/assets/www/cordova.js delete mode 100644 cordova-lib/spec-cordova-project/fixtures/platforms/android/AndroidManifest.xml delete mode 100644 cordova-lib/spec-cordova-project/fixtures/platforms/android/assets/www/config.xml delete mode 100644 cordova-lib/spec-cordova-project/fixtures/platforms/android/assets/www/cordova.js delete mode 100644 cordova-lib/spec-cordova-project/fixtures/platforms/android/assets/www/cordova_plugins.js delete mode 100644 cordova-lib/spec-cordova-project/fixtures/platforms/android/assets/www/css/index.css delete mode 100644 cordova-lib/spec-cordova-project/fixtures/platforms/android/assets/www/img/logo.png delete mode 100644 cordova-lib/spec-cordova-project/fixtures/platforms/android/assets/www/index.html delete mode 100644 cordova-lib/spec-cordova-project/fixtures/platforms/android/assets/www/js/index.js delete mode 100644 cordova-lib/spec-cordova-project/fixtures/platforms/android/assets/www/spec.html delete mode 100644 cordova-lib/spec-cordova-project/fixtures/platforms/android/build.xml delete mode 100755 cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/build delete mode 100755 cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/check_reqs delete mode 100755 cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/clean delete mode 100644 cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/defaults.xml delete mode 100755 cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/lib/appinfo.js delete mode 100755 cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/lib/build.js delete mode 100755 cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/lib/check_reqs.js delete mode 100755 cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/lib/clean.js delete mode 100755 cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/lib/device.js delete mode 100755 cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/lib/emulator.js delete mode 100755 cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/lib/install-device delete mode 100755 cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/lib/install-emulator delete mode 100755 cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/lib/list-devices delete mode 100755 cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/lib/list-emulator-images delete mode 100755 cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/lib/list-started-emulators delete mode 100755 cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/lib/log.js delete mode 100755 cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/lib/run.js delete mode 100755 cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/lib/start-emulator delete mode 100755 cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/log delete mode 100755 cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/run delete mode 100755 cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/version delete mode 100644 cordova-lib/spec-cordova-project/fixtures/platforms/android/local.properties delete mode 100644 cordova-lib/spec-cordova-project/fixtures/platforms/android/proguard-project.txt delete mode 100644 cordova-lib/spec-cordova-project/fixtures/platforms/android/project.properties delete mode 100644 cordova-lib/spec-cordova-project/fixtures/platforms/android/res/drawable-hdpi/icon.png delete mode 100644 cordova-lib/spec-cordova-project/fixtures/platforms/android/res/drawable-ldpi/icon.png delete mode 100644 cordova-lib/spec-cordova-project/fixtures/platforms/android/res/drawable-mdpi/icon.png delete mode 100644 cordova-lib/spec-cordova-project/fixtures/platforms/android/res/drawable-xhdpi/icon.png delete mode 100644 cordova-lib/spec-cordova-project/fixtures/platforms/android/res/drawable/icon.png delete mode 100644 cordova-lib/spec-cordova-project/fixtures/platforms/android/res/values/strings.xml delete mode 100644 cordova-lib/spec-cordova-project/fixtures/platforms/android/res/xml/config.xml delete mode 100644 cordova-lib/spec-cordova-project/fixtures/platforms/android/src/org/testing/TestBase.java delete mode 100644 cordova-lib/spec-cordova-project/fixtures/plugins/ChildBrowser/plugin.xml delete mode 100644 cordova-lib/spec-cordova-project/fixtures/plugins/ChildBrowser/src/android/ChildBrowser.java delete mode 100644 cordova-lib/spec-cordova-project/fixtures/plugins/ChildBrowser/www/childbrowser.js delete mode 100644 cordova-lib/spec-cordova-project/fixtures/plugins/ChildBrowser/www/childbrowser_file.html delete mode 100644 cordova-lib/spec-cordova-project/fixtures/plugins/android/plugin.xml delete mode 100644 cordova-lib/spec-cordova-project/fixtures/plugins/android/src/android/Android.java delete mode 100644 cordova-lib/spec-cordova-project/fixtures/plugins/android/src/android/SomethingWithR.java delete mode 100644 cordova-lib/spec-cordova-project/fixtures/plugins/android/www/android.js delete mode 100644 cordova-lib/spec-cordova-project/fixtures/plugins/fake1/plugin.xml delete mode 100644 cordova-lib/spec-cordova-project/fixtures/plugins/test/plugin.xml delete mode 100644 cordova-lib/spec-cordova-project/fixtures/plugins/test/www/test.js delete mode 100644 cordova-lib/spec-cordova-project/fixtures/projects/windows/bom_test.xml delete mode 100644 cordova-lib/spec-cordova-project/fixtures/templates/no_content_config.xml delete mode 100644 cordova-lib/spec-cordova/fixtures/base/.cordova/config.json delete mode 100644 cordova-lib/spec-cordova/fixtures/base/merges/.svn delete mode 100644 cordova-lib/spec-cordova/fixtures/base/plugins/.svn delete mode 100644 cordova-lib/spec-cordova/fixtures/base/www/config.xml delete mode 100644 cordova-lib/spec-cordova/fixtures/base/www/css/index.css delete mode 100644 cordova-lib/spec-cordova/fixtures/base/www/img/logo.png delete mode 100644 cordova-lib/spec-cordova/fixtures/base/www/index.html delete mode 100644 cordova-lib/spec-cordova/fixtures/base/www/js/index.js delete mode 100644 cordova-lib/spec-cordova/fixtures/base/www/spec.html delete mode 100644 cordova-lib/spec-cordova/fixtures/hooks_bat/fail/fail.bat delete mode 100644 cordova-lib/spec-cordova/fixtures/hooks_bat/test/.dotted.bat delete mode 100644 cordova-lib/spec-cordova/fixtures/hooks_bat/test/07.bat delete mode 100644 cordova-lib/spec-cordova/fixtures/hooks_bat/test/1.bat delete mode 100755 cordova-lib/spec-cordova/fixtures/hooks_sh/fail/fail.sh delete mode 100755 cordova-lib/spec-cordova/fixtures/hooks_sh/test/.dotted.sh delete mode 100755 cordova-lib/spec-cordova/fixtures/hooks_sh/test/07.sh delete mode 100755 cordova-lib/spec-cordova/fixtures/hooks_sh/test/1.sh delete mode 100644 cordova-lib/spec-cordova/fixtures/platforms/android-lib/VERSION delete mode 100644 cordova-lib/spec-cordova/fixtures/platforms/android-lib/framework/assets/www/cordova.js delete mode 100644 cordova-lib/spec-cordova/fixtures/platforms/android/AndroidManifest.xml delete mode 100644 cordova-lib/spec-cordova/fixtures/platforms/android/assets/www/config.xml delete mode 100644 cordova-lib/spec-cordova/fixtures/platforms/android/assets/www/cordova.js delete mode 100644 cordova-lib/spec-cordova/fixtures/platforms/android/assets/www/cordova_plugins.js delete mode 100644 cordova-lib/spec-cordova/fixtures/platforms/android/assets/www/css/index.css delete mode 100644 cordova-lib/spec-cordova/fixtures/platforms/android/assets/www/img/logo.png delete mode 100644 cordova-lib/spec-cordova/fixtures/platforms/android/assets/www/index.html delete mode 100644 cordova-lib/spec-cordova/fixtures/platforms/android/assets/www/js/index.js delete mode 100644 cordova-lib/spec-cordova/fixtures/platforms/android/assets/www/spec.html delete mode 100644 cordova-lib/spec-cordova/fixtures/platforms/android/build.xml delete mode 100755 cordova-lib/spec-cordova/fixtures/platforms/android/cordova/build delete mode 100755 cordova-lib/spec-cordova/fixtures/platforms/android/cordova/check_reqs delete mode 100755 cordova-lib/spec-cordova/fixtures/platforms/android/cordova/clean delete mode 100644 cordova-lib/spec-cordova/fixtures/platforms/android/cordova/defaults.xml delete mode 100755 cordova-lib/spec-cordova/fixtures/platforms/android/cordova/lib/appinfo.js delete mode 100755 cordova-lib/spec-cordova/fixtures/platforms/android/cordova/lib/build.js delete mode 100755 cordova-lib/spec-cordova/fixtures/platforms/android/cordova/lib/check_reqs.js delete mode 100755 cordova-lib/spec-cordova/fixtures/platforms/android/cordova/lib/clean.js delete mode 100755 cordova-lib/spec-cordova/fixtures/platforms/android/cordova/lib/device.js delete mode 100755 cordova-lib/spec-cordova/fixtures/platforms/android/cordova/lib/emulator.js delete mode 100755 cordova-lib/spec-cordova/fixtures/platforms/android/cordova/lib/install-device delete mode 100755 cordova-lib/spec-cordova/fixtures/platforms/android/cordova/lib/install-emulator delete mode 100755 cordova-lib/spec-cordova/fixtures/platforms/android/cordova/lib/list-devices delete mode 100755 cordova-lib/spec-cordova/fixtures/platforms/android/cordova/lib/list-emulator-images delete mode 100755 cordova-lib/spec-cordova/fixtures/platforms/android/cordova/lib/list-started-emulators delete mode 100755 cordova-lib/spec-cordova/fixtures/platforms/android/cordova/lib/log.js delete mode 100755 cordova-lib/spec-cordova/fixtures/platforms/android/cordova/lib/run.js delete mode 100755 cordova-lib/spec-cordova/fixtures/platforms/android/cordova/lib/start-emulator delete mode 100755 cordova-lib/spec-cordova/fixtures/platforms/android/cordova/log delete mode 100755 cordova-lib/spec-cordova/fixtures/platforms/android/cordova/run delete mode 100755 cordova-lib/spec-cordova/fixtures/platforms/android/cordova/version delete mode 100644 cordova-lib/spec-cordova/fixtures/platforms/android/local.properties delete mode 100644 cordova-lib/spec-cordova/fixtures/platforms/android/proguard-project.txt delete mode 100644 cordova-lib/spec-cordova/fixtures/platforms/android/project.properties delete mode 100644 cordova-lib/spec-cordova/fixtures/platforms/android/res/drawable-hdpi/icon.png delete mode 100644 cordova-lib/spec-cordova/fixtures/platforms/android/res/drawable-ldpi/icon.png delete mode 100644 cordova-lib/spec-cordova/fixtures/platforms/android/res/drawable-mdpi/icon.png delete mode 100644 cordova-lib/spec-cordova/fixtures/platforms/android/res/drawable-xhdpi/icon.png delete mode 100644 cordova-lib/spec-cordova/fixtures/platforms/android/res/drawable/icon.png delete mode 100644 cordova-lib/spec-cordova/fixtures/platforms/android/res/values/strings.xml delete mode 100644 cordova-lib/spec-cordova/fixtures/platforms/android/res/xml/config.xml delete mode 100644 cordova-lib/spec-cordova/fixtures/platforms/android/src/org/testing/TestBase.java delete mode 100644 cordova-lib/spec-cordova/fixtures/plugins/ChildBrowser/plugin.xml delete mode 100644 cordova-lib/spec-cordova/fixtures/plugins/ChildBrowser/src/android/ChildBrowser.java delete mode 100644 cordova-lib/spec-cordova/fixtures/plugins/ChildBrowser/www/childbrowser.js delete mode 100644 cordova-lib/spec-cordova/fixtures/plugins/ChildBrowser/www/childbrowser/image.jpg delete mode 100644 cordova-lib/spec-cordova/fixtures/plugins/ChildBrowser/www/childbrowser_file.html delete mode 100644 cordova-lib/spec-cordova/fixtures/plugins/android/plugin.xml delete mode 100644 cordova-lib/spec-cordova/fixtures/plugins/android/src/android/Android.java delete mode 100644 cordova-lib/spec-cordova/fixtures/plugins/android/src/android/SomethingWithR.java delete mode 100644 cordova-lib/spec-cordova/fixtures/plugins/android/www/android.js delete mode 100644 cordova-lib/spec-cordova/fixtures/plugins/fake1/plugin.xml delete mode 100644 cordova-lib/spec-cordova/fixtures/plugins/test/plugin.xml delete mode 100644 cordova-lib/spec-cordova/fixtures/plugins/test/www/test.js delete mode 100644 cordova-lib/spec-cordova/fixtures/projects/android/AndroidManifest.xml delete mode 100644 cordova-lib/spec-cordova/fixtures/projects/android/res/xml/config.xml delete mode 100644 cordova-lib/spec-cordova/fixtures/projects/windows/bom_test.xml delete mode 100644 cordova-lib/spec-cordova/fixtures/templates/no_content_config.xml delete mode 100644 cordova-lib/spec-cordova/helpers.js delete mode 100644 cordova-lib/spec-plugman-create/plugins/ChildBrowser/src/android/ChildBrowser.java delete mode 100644 cordova-lib/spec-plugman-create/plugins/ChildBrowser/www/childbrowser.js delete mode 100644 cordova-lib/spec-plugman-create/plugins/ChildBrowser/www/childbrowser/image.jpg delete mode 100644 cordova-lib/spec-plugman-create/plugins/ChildBrowser/www/childbrowser_file.html delete mode 100644 cordova-lib/spec-plugman-create/plugins/DummyPlugin/www/dummyplugin/image.jpg delete mode 100644 cordova-lib/spec-plugman-install/plugins/AndroidJS/plugin.xml delete mode 100644 cordova-lib/spec-plugman-install/plugins/AndroidJS/www/android.js delete mode 100644 cordova-lib/spec-plugman-install/plugins/ChildBrowser/plugin.xml delete mode 100644 cordova-lib/spec-plugman-install/plugins/ChildBrowser/src/android/ChildBrowser.java delete mode 100644 cordova-lib/spec-plugman-install/plugins/ChildBrowser/src/ios/ChildBrowser.bundle/arrow_left.png delete mode 100644 cordova-lib/spec-plugman-install/plugins/ChildBrowser/src/ios/ChildBrowser.bundle/arrow_left@2x.png delete mode 100644 cordova-lib/spec-plugman-install/plugins/ChildBrowser/src/ios/ChildBrowser.bundle/arrow_right.png delete mode 100644 cordova-lib/spec-plugman-install/plugins/ChildBrowser/src/ios/ChildBrowser.bundle/arrow_right@2x.png delete mode 100644 cordova-lib/spec-plugman-install/plugins/ChildBrowser/src/ios/ChildBrowser.bundle/but_refresh.png delete mode 100644 cordova-lib/spec-plugman-install/plugins/ChildBrowser/src/ios/ChildBrowser.bundle/but_refresh@2x.png delete mode 100644 cordova-lib/spec-plugman-install/plugins/ChildBrowser/src/ios/ChildBrowser.bundle/compass.png delete mode 100644 cordova-lib/spec-plugman-install/plugins/ChildBrowser/src/ios/ChildBrowser.bundle/compass@2x.png delete mode 100644 cordova-lib/spec-plugman-install/plugins/ChildBrowser/src/ios/ChildBrowserCommand.h delete mode 100644 cordova-lib/spec-plugman-install/plugins/ChildBrowser/src/ios/ChildBrowserCommand.m delete mode 100644 cordova-lib/spec-plugman-install/plugins/ChildBrowser/src/ios/ChildBrowserViewController.h delete mode 100644 cordova-lib/spec-plugman-install/plugins/ChildBrowser/src/ios/ChildBrowserViewController.m delete mode 100644 cordova-lib/spec-plugman-install/plugins/ChildBrowser/src/ios/ChildBrowserViewController.xib delete mode 100644 cordova-lib/spec-plugman-install/plugins/ChildBrowser/src/ios/TargetDirTest.h delete mode 100644 cordova-lib/spec-plugman-install/plugins/ChildBrowser/src/ios/TargetDirTest.m delete mode 100644 cordova-lib/spec-plugman-install/plugins/ChildBrowser/src/ios/preserveDirs/PreserveDirsTest.h delete mode 100644 cordova-lib/spec-plugman-install/plugins/ChildBrowser/src/ios/preserveDirs/PreserveDirsTest.m delete mode 100644 cordova-lib/spec-plugman-install/plugins/ChildBrowser/www/childbrowser.js delete mode 100644 cordova-lib/spec-plugman-install/plugins/ChildBrowser/www/childbrowser/image.jpg delete mode 100644 cordova-lib/spec-plugman-install/plugins/ChildBrowser/www/childbrowser_file.html delete mode 100644 cordova-lib/spec-plugman-install/plugins/ConfigTestPlugin/plugin.xml delete mode 100644 cordova-lib/spec-plugman-install/plugins/Contacts/plugin.xml delete mode 100644 cordova-lib/spec-plugman-install/plugins/Contacts/src/android/ContactAccessor.java delete mode 100644 cordova-lib/spec-plugman-install/plugins/Contacts/src/android/ContactAccessorSdk5.java delete mode 100755 cordova-lib/spec-plugman-install/plugins/Contacts/src/android/ContactManager.java delete mode 100644 cordova-lib/spec-plugman-install/plugins/Contacts/src/blackberry10/ContactActivity.js delete mode 100644 cordova-lib/spec-plugman-install/plugins/Contacts/src/blackberry10/ContactAddress.js delete mode 100644 cordova-lib/spec-plugman-install/plugins/Contacts/src/blackberry10/ContactError.js delete mode 100644 cordova-lib/spec-plugman-install/plugins/Contacts/src/blackberry10/ContactField.js delete mode 100644 cordova-lib/spec-plugman-install/plugins/Contacts/src/blackberry10/ContactFindOptions.js delete mode 100644 cordova-lib/spec-plugman-install/plugins/Contacts/src/blackberry10/ContactName.js delete mode 100644 cordova-lib/spec-plugman-install/plugins/Contacts/src/blackberry10/ContactNews.js delete mode 100644 cordova-lib/spec-plugman-install/plugins/Contacts/src/blackberry10/ContactOrganization.js delete mode 100644 cordova-lib/spec-plugman-install/plugins/Contacts/src/blackberry10/ContactPhoto.js delete mode 100644 cordova-lib/spec-plugman-install/plugins/Contacts/src/blackberry10/contactConsts.js delete mode 100644 cordova-lib/spec-plugman-install/plugins/Contacts/src/blackberry10/contactUtils.js delete mode 100644 cordova-lib/spec-plugman-install/plugins/Contacts/src/blackberry10/index.js delete mode 100644 cordova-lib/spec-plugman-install/plugins/Contacts/src/blackberry10/plugin.xml delete mode 100644 cordova-lib/spec-plugman-install/plugins/Contacts/src/ios/CDVContact.h delete mode 100644 cordova-lib/spec-plugman-install/plugins/Contacts/src/ios/CDVContact.m delete mode 100644 cordova-lib/spec-plugman-install/plugins/Contacts/src/ios/CDVContacts.h delete mode 100644 cordova-lib/spec-plugman-install/plugins/Contacts/src/ios/CDVContacts.m delete mode 100644 cordova-lib/spec-plugman-install/plugins/Contacts/src/wp/Contacts.cs delete mode 100644 cordova-lib/spec-plugman-install/plugins/Contacts/www/Contact.js delete mode 100644 cordova-lib/spec-plugman-install/plugins/Contacts/www/ContactAddress.js delete mode 100644 cordova-lib/spec-plugman-install/plugins/Contacts/www/ContactError.js delete mode 100644 cordova-lib/spec-plugman-install/plugins/Contacts/www/ContactField.js delete mode 100644 cordova-lib/spec-plugman-install/plugins/Contacts/www/ContactFindOptions.js delete mode 100644 cordova-lib/spec-plugman-install/plugins/Contacts/www/ContactName.js delete mode 100644 cordova-lib/spec-plugman-install/plugins/Contacts/www/ContactOrganization.js delete mode 100644 cordova-lib/spec-plugman-install/plugins/Contacts/www/contacts.js delete mode 100644 cordova-lib/spec-plugman-install/plugins/Contacts/www/ios/Contact.js delete mode 100644 cordova-lib/spec-plugman-install/plugins/Contacts/www/ios/contacts.js delete mode 100644 cordova-lib/spec-plugman-install/plugins/DummyPlugin/android-resource.xml delete mode 100644 cordova-lib/spec-plugman-install/plugins/DummyPlugin/plugin.xml delete mode 100644 cordova-lib/spec-plugman-install/plugins/DummyPlugin/src/android/DummyPlugin.java delete mode 100644 cordova-lib/spec-plugman-install/plugins/DummyPlugin/src/blackberry10/index.js delete mode 100644 cordova-lib/spec-plugman-install/plugins/DummyPlugin/src/ios/Custom.framework/someFheader.h delete mode 100644 cordova-lib/spec-plugman-install/plugins/DummyPlugin/src/ios/Custom.framework/somebinlib delete mode 100644 cordova-lib/spec-plugman-install/plugins/DummyPlugin/src/ios/DummyPlugin.bundle delete mode 100644 cordova-lib/spec-plugman-install/plugins/DummyPlugin/src/ios/DummyPluginCommand.h delete mode 100644 cordova-lib/spec-plugman-install/plugins/DummyPlugin/src/ios/DummyPluginCommand.m delete mode 100644 cordova-lib/spec-plugman-install/plugins/DummyPlugin/src/ios/SourceWithFramework.m delete mode 100644 cordova-lib/spec-plugman-install/plugins/DummyPlugin/src/ios/TargetDirTest.h delete mode 100644 cordova-lib/spec-plugman-install/plugins/DummyPlugin/src/ios/TargetDirTest.m delete mode 100644 cordova-lib/spec-plugman-install/plugins/DummyPlugin/src/ios/libsqlite3.dylib delete mode 100644 cordova-lib/spec-plugman-install/plugins/DummyPlugin/src/tizen/dummer.js delete mode 100644 cordova-lib/spec-plugman-install/plugins/DummyPlugin/src/windows8/dummer.js delete mode 100644 cordova-lib/spec-plugman-install/plugins/DummyPlugin/src/wp7/DummyPlugin.cs delete mode 100644 cordova-lib/spec-plugman-install/plugins/DummyPlugin/src/wp8/DummyPlugin.cs delete mode 100644 cordova-lib/spec-plugman-install/plugins/DummyPlugin/www/dummyplugin.js delete mode 100644 cordova-lib/spec-plugman-install/plugins/DummyPlugin/www/dummyplugin/image.jpg delete mode 100755 cordova-lib/spec-plugman-install/plugins/EnginePlugin/megaBoringVersion delete mode 100755 cordova-lib/spec-plugman-install/plugins/EnginePlugin/megaFunVersion delete mode 100644 cordova-lib/spec-plugman-install/plugins/EnginePlugin/plugin.xml delete mode 100644 cordova-lib/spec-plugman-install/plugins/EnginePluginAndroid/plugin.xml delete mode 100644 cordova-lib/spec-plugman-install/plugins/EnginePluginiOS/plugin.xml delete mode 100644 cordova-lib/spec-plugman-install/plugins/FaultyPlugin/plugin.xml delete mode 100644 cordova-lib/spec-plugman-install/plugins/FaultyPlugin/src/android/FaultyPlugin.java delete mode 100644 cordova-lib/spec-plugman-install/plugins/FaultyPlugin/src/blackberry10/client.js delete mode 100644 cordova-lib/spec-plugman-install/plugins/FaultyPlugin/src/ios/FaultyPlugin.h delete mode 100644 cordova-lib/spec-plugman-install/plugins/FaultyPlugin/src/ios/FaultyPlugin.m delete mode 100644 cordova-lib/spec-plugman-install/plugins/FaultyPlugin/src/windows8/faultyPlugin.js delete mode 100644 cordova-lib/spec-plugman-install/plugins/FaultyPlugin/src/wp7/FaultyPlugin.cs delete mode 100644 cordova-lib/spec-plugman-install/plugins/FaultyPlugin/src/wp8/FaultyPlugin.cs delete mode 100644 cordova-lib/spec-plugman-install/plugins/VariablePlugin/plugin.xml delete mode 100644 cordova-lib/spec-plugman-install/plugins/WebNotifications/plugin.xml delete mode 100644 cordova-lib/spec-plugman-install/plugins/WebNotifications/src/ios/AppDelegate.m.diff delete mode 100644 cordova-lib/spec-plugman-install/plugins/WebNotifications/src/ios/WebNotifications.h delete mode 100644 cordova-lib/spec-plugman-install/plugins/WebNotifications/src/ios/WebNotifications.m delete mode 100644 cordova-lib/spec-plugman-install/plugins/WebNotifications/www/webnotifications.js delete mode 100644 cordova-lib/spec-plugman-install/plugins/WeblessPlugin/plugin.xml delete mode 100644 cordova-lib/spec-plugman-install/plugins/WeblessPlugin/src/android/WeblessPlugin.java delete mode 100644 cordova-lib/spec-plugman-install/plugins/WeblessPlugin/src/ios/WeblessPlugin.bundle/arrow_left.png delete mode 100644 cordova-lib/spec-plugman-install/plugins/WeblessPlugin/src/ios/WeblessPlugin.bundle/arrow_left@2x.png delete mode 100644 cordova-lib/spec-plugman-install/plugins/WeblessPlugin/src/ios/WeblessPlugin.bundle/arrow_right.png delete mode 100644 cordova-lib/spec-plugman-install/plugins/WeblessPlugin/src/ios/WeblessPlugin.bundle/arrow_right@2x.png delete mode 100644 cordova-lib/spec-plugman-install/plugins/WeblessPlugin/src/ios/WeblessPlugin.bundle/but_refresh.png delete mode 100644 cordova-lib/spec-plugman-install/plugins/WeblessPlugin/src/ios/WeblessPlugin.bundle/but_refresh@2x.png delete mode 100644 cordova-lib/spec-plugman-install/plugins/WeblessPlugin/src/ios/WeblessPlugin.bundle/compass.png delete mode 100644 cordova-lib/spec-plugman-install/plugins/WeblessPlugin/src/ios/WeblessPlugin.bundle/compass@2x.png delete mode 100644 cordova-lib/spec-plugman-install/plugins/WeblessPlugin/src/ios/WeblessPluginCommand.h delete mode 100644 cordova-lib/spec-plugman-install/plugins/WeblessPlugin/src/ios/WeblessPluginCommand.m delete mode 100644 cordova-lib/spec-plugman-install/plugins/WeblessPlugin/src/ios/WeblessPluginViewController.h delete mode 100644 cordova-lib/spec-plugman-install/plugins/WeblessPlugin/src/ios/WeblessPluginViewController.m delete mode 100644 cordova-lib/spec-plugman-install/plugins/WeblessPlugin/src/ios/WeblessPluginViewController.xib delete mode 100644 cordova-lib/spec-plugman-install/plugins/cordova.echo/.gitignore delete mode 100644 cordova-lib/spec-plugman-install/plugins/cordova.echo/plugin.xml delete mode 100644 cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/index.js delete mode 100755 cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/device/echoJnext.so delete mode 100644 cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/public/json/autolink.h delete mode 100644 cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/public/json/config.h delete mode 100644 cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/public/json/features.h delete mode 100644 cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/public/json/forwards.h delete mode 100644 cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/public/json/json.h delete mode 100644 cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/public/json/reader.h delete mode 100644 cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/public/json/value.h delete mode 100644 cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/public/json/writer.h delete mode 100644 cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/public/json_batchallocator.h delete mode 100644 cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/public/json_internalarray.inl delete mode 100644 cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/public/json_internalmap.inl delete mode 100644 cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/public/json_reader.cpp delete mode 100644 cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/public/json_value.cpp delete mode 100644 cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/public/json_valueiterator.inl delete mode 100644 cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/public/json_writer.cpp delete mode 100644 cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/public/plugin.cpp delete mode 100644 cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/public/plugin.h delete mode 100644 cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/public/tokenizer.cpp delete mode 100644 cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/public/tokenizer.h delete mode 100644 cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/simulator/echoJnext.so delete mode 100644 cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/src/echo.cpp delete mode 100644 cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/src/echo.hpp delete mode 100644 cordova-lib/spec-plugman-install/plugins/cordova.echo/www/client.js delete mode 100644 cordova-lib/spec-plugman-install/plugins/dependencies/A/plugin.xml delete mode 100644 cordova-lib/spec-plugman-install/plugins/dependencies/A/src/android/A.java delete mode 100644 cordova-lib/spec-plugman-install/plugins/dependencies/A/src/ios/APluginCommand.h delete mode 100644 cordova-lib/spec-plugman-install/plugins/dependencies/A/src/ios/APluginCommand.m delete mode 100644 cordova-lib/spec-plugman-install/plugins/dependencies/A/www/plugin-a.js delete mode 100644 cordova-lib/spec-plugman-install/plugins/dependencies/B/plugin.xml delete mode 100644 cordova-lib/spec-plugman-install/plugins/dependencies/B/src/android/B.java delete mode 100644 cordova-lib/spec-plugman-install/plugins/dependencies/B/src/ios/BPluginCommand.h delete mode 100644 cordova-lib/spec-plugman-install/plugins/dependencies/B/src/ios/BPluginCommand.m delete mode 100644 cordova-lib/spec-plugman-install/plugins/dependencies/B/www/plugin-b.js delete mode 100644 cordova-lib/spec-plugman-install/plugins/dependencies/C/plugin.xml delete mode 100644 cordova-lib/spec-plugman-install/plugins/dependencies/C/src/android/C.java delete mode 100644 cordova-lib/spec-plugman-install/plugins/dependencies/C/src/ios/CPluginCommand.h delete mode 100644 cordova-lib/spec-plugman-install/plugins/dependencies/C/src/ios/CPluginCommand.m delete mode 100644 cordova-lib/spec-plugman-install/plugins/dependencies/C/www/plugin-c.js delete mode 100644 cordova-lib/spec-plugman-install/plugins/dependencies/D/plugin.xml delete mode 100644 cordova-lib/spec-plugman-install/plugins/dependencies/D/src/android/D.java delete mode 100644 cordova-lib/spec-plugman-install/plugins/dependencies/D/src/ios/DPluginCommand.h delete mode 100644 cordova-lib/spec-plugman-install/plugins/dependencies/D/src/ios/DPluginCommand.m delete mode 100644 cordova-lib/spec-plugman-install/plugins/dependencies/D/www/plugin-d.js delete mode 100644 cordova-lib/spec-plugman-install/plugins/dependencies/E/plugin.xml delete mode 100644 cordova-lib/spec-plugman-install/plugins/dependencies/E/src/android/E.java delete mode 100644 cordova-lib/spec-plugman-install/plugins/dependencies/E/src/ios/EPluginCommand.h delete mode 100644 cordova-lib/spec-plugman-install/plugins/dependencies/E/src/ios/EPluginCommand.m delete mode 100644 cordova-lib/spec-plugman-install/plugins/dependencies/E/www/plugin-d.js delete mode 100644 cordova-lib/spec-plugman-install/plugins/dependencies/F/plugin.xml delete mode 100644 cordova-lib/spec-plugman-install/plugins/dependencies/F/src/android/F.java delete mode 100644 cordova-lib/spec-plugman-install/plugins/dependencies/F/src/ios/FPluginCommand.h delete mode 100644 cordova-lib/spec-plugman-install/plugins/dependencies/F/src/ios/FPluginCommand.m delete mode 100644 cordova-lib/spec-plugman-install/plugins/dependencies/F/www/plugin-f.js delete mode 100644 cordova-lib/spec-plugman-install/plugins/dependencies/G/plugin.xml delete mode 100644 cordova-lib/spec-plugman-install/plugins/dependencies/G/src/android/G.java delete mode 100644 cordova-lib/spec-plugman-install/plugins/dependencies/G/src/ios/EPluginCommand.m delete mode 100644 cordova-lib/spec-plugman-install/plugins/dependencies/G/src/ios/GPluginCommand.h delete mode 100644 cordova-lib/spec-plugman-install/plugins/dependencies/G/www/plugin-g.js delete mode 100644 cordova-lib/spec-plugman-install/plugins/dependencies/H/plugin.xml delete mode 100644 cordova-lib/spec-plugman-install/plugins/dependencies/H/src/android/H.java delete mode 100644 cordova-lib/spec-plugman-install/plugins/dependencies/H/src/ios/HPluginCommand.h delete mode 100644 cordova-lib/spec-plugman-install/plugins/dependencies/H/src/ios/HPluginCommand.m delete mode 100644 cordova-lib/spec-plugman-install/plugins/dependencies/H/www/plugin-h.js delete mode 100644 cordova-lib/spec-plugman-install/plugins/dependencies/README.md delete mode 100644 cordova-lib/spec-plugman-install/plugins/dependencies/meta/D/plugin.xml delete mode 100644 cordova-lib/spec-plugman-install/plugins/dependencies/meta/D/src/android/D.java delete mode 100644 cordova-lib/spec-plugman-install/plugins/dependencies/meta/D/src/ios/DPluginCommand.h delete mode 100644 cordova-lib/spec-plugman-install/plugins/dependencies/meta/D/src/ios/DPluginCommand.m delete mode 100644 cordova-lib/spec-plugman-install/plugins/dependencies/meta/D/www/plugin-d.js delete mode 100644 cordova-lib/spec-plugman-install/plugins/dependencies/meta/subdir/E/plugin.xml delete mode 100644 cordova-lib/spec-plugman-install/plugins/dependencies/meta/subdir/E/src/android/E.java delete mode 100644 cordova-lib/spec-plugman-install/plugins/dependencies/meta/subdir/E/src/ios/EPluginCommand.h delete mode 100644 cordova-lib/spec-plugman-install/plugins/dependencies/meta/subdir/E/src/ios/EPluginCommand.m delete mode 100644 cordova-lib/spec-plugman-install/plugins/dependencies/meta/subdir/E/www/plugin-e.js delete mode 100644 cordova-lib/spec-plugman-install/plugins/dependencies/subdir/E/plugin.xml delete mode 100644 cordova-lib/spec-plugman-install/plugins/dependencies/subdir/E/src/android/E.java delete mode 100644 cordova-lib/spec-plugman-install/plugins/dependencies/subdir/E/src/ios/EPluginCommand.h delete mode 100644 cordova-lib/spec-plugman-install/plugins/dependencies/subdir/E/src/ios/EPluginCommand.m delete mode 100644 cordova-lib/spec-plugman-install/plugins/dependencies/subdir/E/www/plugin-e.js delete mode 100644 cordova-lib/spec-plugman-install/plugins/multiple-children/plugin.xml delete mode 100644 cordova-lib/spec-plugman-install/plugins/shared-deps-multi-child/plugin.xml delete mode 100644 cordova-lib/spec-plugman-install/projects/android_two/AndroidManifest.xml delete mode 100644 cordova-lib/spec-plugman-install/projects/android_two/res/xml/config.xml delete mode 100644 cordova-lib/spec-plugman-install/projects/android_two_no_perms/assets/www/.gitkeep delete mode 100644 cordova-lib/spec-plugman-install/projects/android_two_no_perms/res/xml/config.xml delete mode 100644 cordova-lib/spec-plugman-install/projects/android_two_no_perms/src/.gitkeep delete mode 100644 cordova-lib/spec-plugman-install/projects/blackberry10/native/device/chrome/.gitkeep delete mode 100644 cordova-lib/spec-plugman-install/projects/blackberry10/native/simulator/chrome/.gitkeep delete mode 100644 cordova-lib/spec-plugman-install/projects/ios-config-xml/www/.gitkeep delete mode 100644 cordova-lib/spec-plugman-install/projects/ios-plist/www/.gitkeep delete mode 100644 cordova-lib/spec-plugman-install/projects/multiple-children/AndroidManifest.xml delete mode 100644 cordova-lib/spec-plugman-install/projects/windows8/www/css/index.css delete mode 100644 cordova-lib/spec-plugman-install/projects/www-only/.gitkeep delete mode 100644 cordova-lib/spec-plugman/plugins/.gitkeep delete mode 100644 cordova-lib/spec-plugman/plugins/AndroidJS/plugin.xml delete mode 100644 cordova-lib/spec-plugman/plugins/AndroidJS/www/android.js delete mode 100644 cordova-lib/spec-plugman/plugins/ChildBrowser/plugin.xml delete mode 100644 cordova-lib/spec-plugman/plugins/ChildBrowser/src/android/ChildBrowser.java delete mode 100644 cordova-lib/spec-plugman/plugins/ChildBrowser/src/ios/ChildBrowser.bundle/arrow_left.png delete mode 100644 cordova-lib/spec-plugman/plugins/ChildBrowser/src/ios/ChildBrowser.bundle/arrow_left@2x.png delete mode 100644 cordova-lib/spec-plugman/plugins/ChildBrowser/src/ios/ChildBrowser.bundle/arrow_right.png delete mode 100644 cordova-lib/spec-plugman/plugins/ChildBrowser/src/ios/ChildBrowser.bundle/arrow_right@2x.png delete mode 100644 cordova-lib/spec-plugman/plugins/ChildBrowser/src/ios/ChildBrowser.bundle/but_refresh.png delete mode 100644 cordova-lib/spec-plugman/plugins/ChildBrowser/src/ios/ChildBrowser.bundle/but_refresh@2x.png delete mode 100644 cordova-lib/spec-plugman/plugins/ChildBrowser/src/ios/ChildBrowser.bundle/compass.png delete mode 100644 cordova-lib/spec-plugman/plugins/ChildBrowser/src/ios/ChildBrowser.bundle/compass@2x.png delete mode 100644 cordova-lib/spec-plugman/plugins/ChildBrowser/src/ios/ChildBrowserCommand.h delete mode 100644 cordova-lib/spec-plugman/plugins/ChildBrowser/src/ios/ChildBrowserCommand.m delete mode 100644 cordova-lib/spec-plugman/plugins/ChildBrowser/src/ios/ChildBrowserViewController.h delete mode 100644 cordova-lib/spec-plugman/plugins/ChildBrowser/src/ios/ChildBrowserViewController.m delete mode 100644 cordova-lib/spec-plugman/plugins/ChildBrowser/src/ios/ChildBrowserViewController.xib delete mode 100644 cordova-lib/spec-plugman/plugins/ChildBrowser/src/ios/TargetDirTest.h delete mode 100644 cordova-lib/spec-plugman/plugins/ChildBrowser/src/ios/TargetDirTest.m delete mode 100644 cordova-lib/spec-plugman/plugins/ChildBrowser/src/ios/preserveDirs/PreserveDirsTest.h delete mode 100644 cordova-lib/spec-plugman/plugins/ChildBrowser/src/ios/preserveDirs/PreserveDirsTest.m delete mode 100644 cordova-lib/spec-plugman/plugins/ChildBrowser/www/childbrowser.js delete mode 100644 cordova-lib/spec-plugman/plugins/ChildBrowser/www/childbrowser/image.jpg delete mode 100644 cordova-lib/spec-plugman/plugins/ChildBrowser/www/childbrowser_file.html delete mode 100644 cordova-lib/spec-plugman/plugins/ConfigTestPlugin/plugin.xml delete mode 100644 cordova-lib/spec-plugman/plugins/Contacts/plugin.xml delete mode 100644 cordova-lib/spec-plugman/plugins/Contacts/src/android/ContactAccessor.java delete mode 100644 cordova-lib/spec-plugman/plugins/Contacts/src/android/ContactAccessorSdk5.java delete mode 100755 cordova-lib/spec-plugman/plugins/Contacts/src/android/ContactManager.java delete mode 100644 cordova-lib/spec-plugman/plugins/Contacts/src/blackberry10/ContactActivity.js delete mode 100644 cordova-lib/spec-plugman/plugins/Contacts/src/blackberry10/ContactAddress.js delete mode 100644 cordova-lib/spec-plugman/plugins/Contacts/src/blackberry10/ContactError.js delete mode 100644 cordova-lib/spec-plugman/plugins/Contacts/src/blackberry10/ContactField.js delete mode 100644 cordova-lib/spec-plugman/plugins/Contacts/src/blackberry10/ContactFindOptions.js delete mode 100644 cordova-lib/spec-plugman/plugins/Contacts/src/blackberry10/ContactName.js delete mode 100644 cordova-lib/spec-plugman/plugins/Contacts/src/blackberry10/ContactNews.js delete mode 100644 cordova-lib/spec-plugman/plugins/Contacts/src/blackberry10/ContactOrganization.js delete mode 100644 cordova-lib/spec-plugman/plugins/Contacts/src/blackberry10/ContactPhoto.js delete mode 100644 cordova-lib/spec-plugman/plugins/Contacts/src/blackberry10/contactConsts.js delete mode 100644 cordova-lib/spec-plugman/plugins/Contacts/src/blackberry10/contactUtils.js delete mode 100644 cordova-lib/spec-plugman/plugins/Contacts/src/blackberry10/index.js delete mode 100644 cordova-lib/spec-plugman/plugins/Contacts/src/blackberry10/plugin.xml delete mode 100644 cordova-lib/spec-plugman/plugins/Contacts/src/ios/CDVContact.h delete mode 100644 cordova-lib/spec-plugman/plugins/Contacts/src/ios/CDVContact.m delete mode 100644 cordova-lib/spec-plugman/plugins/Contacts/src/ios/CDVContacts.h delete mode 100644 cordova-lib/spec-plugman/plugins/Contacts/src/ios/CDVContacts.m delete mode 100644 cordova-lib/spec-plugman/plugins/Contacts/src/wp/Contacts.cs delete mode 100644 cordova-lib/spec-plugman/plugins/Contacts/www/Contact.js delete mode 100644 cordova-lib/spec-plugman/plugins/Contacts/www/ContactAddress.js delete mode 100644 cordova-lib/spec-plugman/plugins/Contacts/www/ContactError.js delete mode 100644 cordova-lib/spec-plugman/plugins/Contacts/www/ContactField.js delete mode 100644 cordova-lib/spec-plugman/plugins/Contacts/www/ContactFindOptions.js delete mode 100644 cordova-lib/spec-plugman/plugins/Contacts/www/ContactName.js delete mode 100644 cordova-lib/spec-plugman/plugins/Contacts/www/ContactOrganization.js delete mode 100644 cordova-lib/spec-plugman/plugins/Contacts/www/contacts.js delete mode 100644 cordova-lib/spec-plugman/plugins/Contacts/www/ios/Contact.js delete mode 100644 cordova-lib/spec-plugman/plugins/Contacts/www/ios/contacts.js delete mode 100644 cordova-lib/spec-plugman/plugins/DummyPlugin/android-resource.xml delete mode 100644 cordova-lib/spec-plugman/plugins/DummyPlugin/plugin.xml delete mode 100644 cordova-lib/spec-plugman/plugins/DummyPlugin/src/android/DummyPlugin.java delete mode 100644 cordova-lib/spec-plugman/plugins/DummyPlugin/src/android/TestLib.jar delete mode 100644 cordova-lib/spec-plugman/plugins/DummyPlugin/src/blackberry10/index.js delete mode 100644 cordova-lib/spec-plugman/plugins/DummyPlugin/src/ios/Custom.framework/someFheader.h delete mode 100644 cordova-lib/spec-plugman/plugins/DummyPlugin/src/ios/Custom.framework/somebinlib delete mode 100644 cordova-lib/spec-plugman/plugins/DummyPlugin/src/ios/DummyPlugin.bundle delete mode 100644 cordova-lib/spec-plugman/plugins/DummyPlugin/src/ios/DummyPluginCommand.h delete mode 100644 cordova-lib/spec-plugman/plugins/DummyPlugin/src/ios/DummyPluginCommand.m delete mode 100644 cordova-lib/spec-plugman/plugins/DummyPlugin/src/ios/SourceWithFramework.m delete mode 100644 cordova-lib/spec-plugman/plugins/DummyPlugin/src/ios/TargetDirTest.h delete mode 100644 cordova-lib/spec-plugman/plugins/DummyPlugin/src/ios/TargetDirTest.m delete mode 100644 cordova-lib/spec-plugman/plugins/DummyPlugin/src/ios/libsqlite3.dylib delete mode 100644 cordova-lib/spec-plugman/plugins/DummyPlugin/src/tizen/dummer.js delete mode 100644 cordova-lib/spec-plugman/plugins/DummyPlugin/src/windows8/dummer.js delete mode 100644 cordova-lib/spec-plugman/plugins/DummyPlugin/src/wp7/DummyPlugin.cs delete mode 100644 cordova-lib/spec-plugman/plugins/DummyPlugin/src/wp8/DummyPlugin.cs delete mode 100644 cordova-lib/spec-plugman/plugins/DummyPlugin/www/dummyplugin.js delete mode 100644 cordova-lib/spec-plugman/plugins/DummyPlugin/www/dummyplugin/image.jpg delete mode 100755 cordova-lib/spec-plugman/plugins/EnginePlugin/megaBoringVersion delete mode 100755 cordova-lib/spec-plugman/plugins/EnginePlugin/megaFunVersion delete mode 100644 cordova-lib/spec-plugman/plugins/EnginePlugin/plugin.xml delete mode 100644 cordova-lib/spec-plugman/plugins/EnginePluginAndroid/plugin.xml delete mode 100644 cordova-lib/spec-plugman/plugins/EnginePluginiOS/plugin.xml delete mode 100644 cordova-lib/spec-plugman/plugins/FaultyPlugin/plugin.xml delete mode 100644 cordova-lib/spec-plugman/plugins/FaultyPlugin/src/android/FaultyPlugin.java delete mode 100644 cordova-lib/spec-plugman/plugins/FaultyPlugin/src/blackberry10/client.js delete mode 100644 cordova-lib/spec-plugman/plugins/FaultyPlugin/src/ios/FaultyPlugin.h delete mode 100644 cordova-lib/spec-plugman/plugins/FaultyPlugin/src/ios/FaultyPlugin.m delete mode 100644 cordova-lib/spec-plugman/plugins/FaultyPlugin/src/windows8/faultyPlugin.js delete mode 100644 cordova-lib/spec-plugman/plugins/FaultyPlugin/src/wp7/FaultyPlugin.cs delete mode 100644 cordova-lib/spec-plugman/plugins/FaultyPlugin/src/wp8/FaultyPlugin.cs delete mode 100644 cordova-lib/spec-plugman/plugins/VariablePlugin/plugin.xml delete mode 100644 cordova-lib/spec-plugman/plugins/WebNotifications/plugin.xml delete mode 100644 cordova-lib/spec-plugman/plugins/WebNotifications/src/ios/AppDelegate.m.diff delete mode 100644 cordova-lib/spec-plugman/plugins/WebNotifications/src/ios/WebNotifications.h delete mode 100644 cordova-lib/spec-plugman/plugins/WebNotifications/src/ios/WebNotifications.m delete mode 100644 cordova-lib/spec-plugman/plugins/WebNotifications/www/webnotifications.js delete mode 100644 cordova-lib/spec-plugman/plugins/WeblessPlugin/plugin.xml delete mode 100644 cordova-lib/spec-plugman/plugins/WeblessPlugin/src/android/WeblessPlugin.java delete mode 100644 cordova-lib/spec-plugman/plugins/WeblessPlugin/src/ios/WeblessPlugin.bundle/arrow_left.png delete mode 100644 cordova-lib/spec-plugman/plugins/WeblessPlugin/src/ios/WeblessPlugin.bundle/arrow_left@2x.png delete mode 100644 cordova-lib/spec-plugman/plugins/WeblessPlugin/src/ios/WeblessPlugin.bundle/arrow_right.png delete mode 100644 cordova-lib/spec-plugman/plugins/WeblessPlugin/src/ios/WeblessPlugin.bundle/arrow_right@2x.png delete mode 100644 cordova-lib/spec-plugman/plugins/WeblessPlugin/src/ios/WeblessPlugin.bundle/but_refresh.png delete mode 100644 cordova-lib/spec-plugman/plugins/WeblessPlugin/src/ios/WeblessPlugin.bundle/but_refresh@2x.png delete mode 100644 cordova-lib/spec-plugman/plugins/WeblessPlugin/src/ios/WeblessPlugin.bundle/compass.png delete mode 100644 cordova-lib/spec-plugman/plugins/WeblessPlugin/src/ios/WeblessPlugin.bundle/compass@2x.png delete mode 100644 cordova-lib/spec-plugman/plugins/WeblessPlugin/src/ios/WeblessPluginCommand.h delete mode 100644 cordova-lib/spec-plugman/plugins/WeblessPlugin/src/ios/WeblessPluginCommand.m delete mode 100644 cordova-lib/spec-plugman/plugins/WeblessPlugin/src/ios/WeblessPluginViewController.h delete mode 100644 cordova-lib/spec-plugman/plugins/WeblessPlugin/src/ios/WeblessPluginViewController.m delete mode 100644 cordova-lib/spec-plugman/plugins/WeblessPlugin/src/ios/WeblessPluginViewController.xib delete mode 100644 cordova-lib/spec-plugman/plugins/cordova.echo/.gitignore delete mode 100644 cordova-lib/spec-plugman/plugins/cordova.echo/plugin.xml delete mode 100644 cordova-lib/spec-plugman/plugins/cordova.echo/src/blackberry10/index.js delete mode 100755 cordova-lib/spec-plugman/plugins/cordova.echo/src/blackberry10/native/device/echoJnext.so delete mode 100644 cordova-lib/spec-plugman/plugins/cordova.echo/src/blackberry10/native/public/json/autolink.h delete mode 100644 cordova-lib/spec-plugman/plugins/cordova.echo/src/blackberry10/native/public/json/config.h delete mode 100644 cordova-lib/spec-plugman/plugins/cordova.echo/src/blackberry10/native/public/json/features.h delete mode 100644 cordova-lib/spec-plugman/plugins/cordova.echo/src/blackberry10/native/public/json/forwards.h delete mode 100644 cordova-lib/spec-plugman/plugins/cordova.echo/src/blackberry10/native/public/json/json.h delete mode 100644 cordova-lib/spec-plugman/plugins/cordova.echo/src/blackberry10/native/public/json/reader.h delete mode 100644 cordova-lib/spec-plugman/plugins/cordova.echo/src/blackberry10/native/public/json/value.h delete mode 100644 cordova-lib/spec-plugman/plugins/cordova.echo/src/blackberry10/native/public/json/writer.h delete mode 100644 cordova-lib/spec-plugman/plugins/cordova.echo/src/blackberry10/native/public/json_batchallocator.h delete mode 100644 cordova-lib/spec-plugman/plugins/cordova.echo/src/blackberry10/native/public/json_internalarray.inl delete mode 100644 cordova-lib/spec-plugman/plugins/cordova.echo/src/blackberry10/native/public/json_internalmap.inl delete mode 100644 cordova-lib/spec-plugman/plugins/cordova.echo/src/blackberry10/native/public/json_reader.cpp delete mode 100644 cordova-lib/spec-plugman/plugins/cordova.echo/src/blackberry10/native/public/json_value.cpp delete mode 100644 cordova-lib/spec-plugman/plugins/cordova.echo/src/blackberry10/native/public/json_valueiterator.inl delete mode 100644 cordova-lib/spec-plugman/plugins/cordova.echo/src/blackberry10/native/public/json_writer.cpp delete mode 100644 cordova-lib/spec-plugman/plugins/cordova.echo/src/blackberry10/native/public/plugin.cpp delete mode 100644 cordova-lib/spec-plugman/plugins/cordova.echo/src/blackberry10/native/public/plugin.h delete mode 100644 cordova-lib/spec-plugman/plugins/cordova.echo/src/blackberry10/native/public/tokenizer.cpp delete mode 100644 cordova-lib/spec-plugman/plugins/cordova.echo/src/blackberry10/native/public/tokenizer.h delete mode 100644 cordova-lib/spec-plugman/plugins/cordova.echo/src/blackberry10/native/simulator/echoJnext.so delete mode 100644 cordova-lib/spec-plugman/plugins/cordova.echo/src/blackberry10/native/src/echo.cpp delete mode 100644 cordova-lib/spec-plugman/plugins/cordova.echo/src/blackberry10/native/src/echo.hpp delete mode 100644 cordova-lib/spec-plugman/plugins/cordova.echo/www/client.js delete mode 100644 cordova-lib/spec-plugman/plugins/dependencies/A/plugin.xml delete mode 100644 cordova-lib/spec-plugman/plugins/dependencies/A/src/android/A.java delete mode 100644 cordova-lib/spec-plugman/plugins/dependencies/A/src/ios/APluginCommand.h delete mode 100644 cordova-lib/spec-plugman/plugins/dependencies/A/src/ios/APluginCommand.m delete mode 100644 cordova-lib/spec-plugman/plugins/dependencies/A/www/plugin-a.js delete mode 100644 cordova-lib/spec-plugman/plugins/dependencies/B/plugin.xml delete mode 100644 cordova-lib/spec-plugman/plugins/dependencies/B/src/android/B.java delete mode 100644 cordova-lib/spec-plugman/plugins/dependencies/B/src/ios/BPluginCommand.h delete mode 100644 cordova-lib/spec-plugman/plugins/dependencies/B/src/ios/BPluginCommand.m delete mode 100644 cordova-lib/spec-plugman/plugins/dependencies/B/www/plugin-b.js delete mode 100644 cordova-lib/spec-plugman/plugins/dependencies/C/plugin.xml delete mode 100644 cordova-lib/spec-plugman/plugins/dependencies/C/src/android/C.java delete mode 100644 cordova-lib/spec-plugman/plugins/dependencies/C/src/ios/CPluginCommand.h delete mode 100644 cordova-lib/spec-plugman/plugins/dependencies/C/src/ios/CPluginCommand.m delete mode 100644 cordova-lib/spec-plugman/plugins/dependencies/C/www/plugin-c.js delete mode 100644 cordova-lib/spec-plugman/plugins/dependencies/D/plugin.xml delete mode 100644 cordova-lib/spec-plugman/plugins/dependencies/D/src/android/D.java delete mode 100644 cordova-lib/spec-plugman/plugins/dependencies/D/src/ios/DPluginCommand.h delete mode 100644 cordova-lib/spec-plugman/plugins/dependencies/D/src/ios/DPluginCommand.m delete mode 100644 cordova-lib/spec-plugman/plugins/dependencies/D/www/plugin-d.js delete mode 100644 cordova-lib/spec-plugman/plugins/dependencies/E/plugin.xml delete mode 100644 cordova-lib/spec-plugman/plugins/dependencies/E/src/android/E.java delete mode 100644 cordova-lib/spec-plugman/plugins/dependencies/E/src/ios/EPluginCommand.h delete mode 100644 cordova-lib/spec-plugman/plugins/dependencies/E/src/ios/EPluginCommand.m delete mode 100644 cordova-lib/spec-plugman/plugins/dependencies/E/www/plugin-d.js delete mode 100644 cordova-lib/spec-plugman/plugins/dependencies/F/plugin.xml delete mode 100644 cordova-lib/spec-plugman/plugins/dependencies/F/src/android/F.java delete mode 100644 cordova-lib/spec-plugman/plugins/dependencies/F/src/ios/FPluginCommand.h delete mode 100644 cordova-lib/spec-plugman/plugins/dependencies/F/src/ios/FPluginCommand.m delete mode 100644 cordova-lib/spec-plugman/plugins/dependencies/F/www/plugin-f.js delete mode 100644 cordova-lib/spec-plugman/plugins/dependencies/G/plugin.xml delete mode 100644 cordova-lib/spec-plugman/plugins/dependencies/G/src/android/G.java delete mode 100644 cordova-lib/spec-plugman/plugins/dependencies/G/src/ios/EPluginCommand.m delete mode 100644 cordova-lib/spec-plugman/plugins/dependencies/G/src/ios/GPluginCommand.h delete mode 100644 cordova-lib/spec-plugman/plugins/dependencies/G/www/plugin-g.js delete mode 100644 cordova-lib/spec-plugman/plugins/dependencies/H/plugin.xml delete mode 100644 cordova-lib/spec-plugman/plugins/dependencies/H/src/android/H.java delete mode 100644 cordova-lib/spec-plugman/plugins/dependencies/H/src/ios/HPluginCommand.h delete mode 100644 cordova-lib/spec-plugman/plugins/dependencies/H/src/ios/HPluginCommand.m delete mode 100644 cordova-lib/spec-plugman/plugins/dependencies/H/www/plugin-h.js delete mode 100644 cordova-lib/spec-plugman/plugins/dependencies/README.md delete mode 100644 cordova-lib/spec-plugman/plugins/dependencies/meta/D/plugin.xml delete mode 100644 cordova-lib/spec-plugman/plugins/dependencies/meta/D/src/android/D.java delete mode 100644 cordova-lib/spec-plugman/plugins/dependencies/meta/D/src/ios/DPluginCommand.h delete mode 100644 cordova-lib/spec-plugman/plugins/dependencies/meta/D/src/ios/DPluginCommand.m delete mode 100644 cordova-lib/spec-plugman/plugins/dependencies/meta/D/www/plugin-d.js delete mode 100644 cordova-lib/spec-plugman/plugins/dependencies/meta/subdir/E/plugin.xml delete mode 100644 cordova-lib/spec-plugman/plugins/dependencies/meta/subdir/E/src/android/E.java delete mode 100644 cordova-lib/spec-plugman/plugins/dependencies/meta/subdir/E/src/ios/EPluginCommand.h delete mode 100644 cordova-lib/spec-plugman/plugins/dependencies/meta/subdir/E/src/ios/EPluginCommand.m delete mode 100644 cordova-lib/spec-plugman/plugins/dependencies/meta/subdir/E/www/plugin-e.js delete mode 100644 cordova-lib/spec-plugman/plugins/dependencies/subdir/E/plugin.xml delete mode 100644 cordova-lib/spec-plugman/plugins/dependencies/subdir/E/src/android/E.java delete mode 100644 cordova-lib/spec-plugman/plugins/dependencies/subdir/E/src/ios/EPluginCommand.h delete mode 100644 cordova-lib/spec-plugman/plugins/dependencies/subdir/E/src/ios/EPluginCommand.m delete mode 100644 cordova-lib/spec-plugman/plugins/dependencies/subdir/E/www/plugin-e.js delete mode 100644 cordova-lib/spec-plugman/plugins/multiple-children/plugin.xml delete mode 100644 cordova-lib/spec-plugman/plugins/shared-deps-multi-child/plugin.xml delete mode 100644 cordova-lib/spec-plugman/projects/.gitkeep delete mode 100644 cordova-lib/spec-plugman/projects/android_install/AndroidManifest.xml delete mode 100644 cordova-lib/spec-plugman/projects/android_install/cordova/android_sdk_version delete mode 100644 cordova-lib/spec-plugman/projects/android_install/cordova/version delete mode 100644 cordova-lib/spec-plugman/projects/android_install/cordova/version.bat delete mode 100644 cordova-lib/spec-plugman/projects/android_one/AndroidManifest.xml delete mode 100644 cordova-lib/spec-plugman/projects/android_one/assets/www/.gitkeep delete mode 100644 cordova-lib/spec-plugman/projects/android_one/assets/www/cordova.js delete mode 100644 cordova-lib/spec-plugman/projects/android_one/cordova/appinfo.jar delete mode 100755 cordova-lib/spec-plugman/projects/android_one/cordova/build delete mode 100755 cordova-lib/spec-plugman/projects/android_one/cordova/clean delete mode 100755 cordova-lib/spec-plugman/projects/android_one/cordova/lib/cordova delete mode 100755 cordova-lib/spec-plugman/projects/android_one/cordova/lib/install-device delete mode 100755 cordova-lib/spec-plugman/projects/android_one/cordova/lib/install-emulator delete mode 100755 cordova-lib/spec-plugman/projects/android_one/cordova/lib/list-devices delete mode 100755 cordova-lib/spec-plugman/projects/android_one/cordova/lib/list-emulator-images delete mode 100755 cordova-lib/spec-plugman/projects/android_one/cordova/lib/list-started-emulators delete mode 100755 cordova-lib/spec-plugman/projects/android_one/cordova/lib/start-emulator delete mode 100755 cordova-lib/spec-plugman/projects/android_one/cordova/log delete mode 100755 cordova-lib/spec-plugman/projects/android_one/cordova/run delete mode 100755 cordova-lib/spec-plugman/projects/android_one/cordova/version delete mode 100644 cordova-lib/spec-plugman/projects/android_one/res/xml/plugins.xml delete mode 100644 cordova-lib/spec-plugman/projects/android_one/src/.gitkeep delete mode 100644 cordova-lib/spec-plugman/projects/android_two/AndroidManifest.xml delete mode 100644 cordova-lib/spec-plugman/projects/android_two/assets/www/.gitkeep delete mode 100644 cordova-lib/spec-plugman/projects/android_two/res/xml/config.xml delete mode 100644 cordova-lib/spec-plugman/projects/android_two/src/.gitkeep delete mode 100644 cordova-lib/spec-plugman/projects/android_two_no_perms/AndroidManifest.xml delete mode 100644 cordova-lib/spec-plugman/projects/android_two_no_perms/assets/www/.gitkeep delete mode 100644 cordova-lib/spec-plugman/projects/android_two_no_perms/res/xml/config.xml delete mode 100644 cordova-lib/spec-plugman/projects/android_two_no_perms/src/.gitkeep delete mode 100644 cordova-lib/spec-plugman/projects/android_uninstall/AndroidManifest.xml delete mode 100644 cordova-lib/spec-plugman/projects/android_uninstall/cordova/version delete mode 100644 cordova-lib/spec-plugman/projects/android_uninstall/cordova/version.bat delete mode 100644 cordova-lib/spec-plugman/projects/blackberry10/native/device/chrome/.gitkeep delete mode 100644 cordova-lib/spec-plugman/projects/blackberry10/native/device/plugins/jnext/auth.txt delete mode 100644 cordova-lib/spec-plugman/projects/blackberry10/native/simulator/chrome/.gitkeep delete mode 100644 cordova-lib/spec-plugman/projects/blackberry10/native/simulator/plugins/jnext/auth.txt delete mode 100644 cordova-lib/spec-plugman/projects/blackberry10/www/config.xml delete mode 100644 cordova-lib/spec-plugman/projects/ios-config-xml/CordovaLib/CordovaLib.xcodeproj/project.pbxproj delete mode 100644 cordova-lib/spec-plugman/projects/ios-config-xml/SampleApp.xcodeproj/project.orig.pbxproj delete mode 100644 cordova-lib/spec-plugman/projects/ios-config-xml/SampleApp.xcodeproj/project.pbxproj delete mode 100644 cordova-lib/spec-plugman/projects/ios-config-xml/SampleApp/SampleApp-Info.plist delete mode 100644 cordova-lib/spec-plugman/projects/ios-config-xml/SampleApp/config.xml delete mode 100644 cordova-lib/spec-plugman/projects/ios-config-xml/www/.gitkeep delete mode 100644 cordova-lib/spec-plugman/projects/ios-plist/CordovaLib/CordovaLib.xcodeproj/project.pbxproj delete mode 100644 cordova-lib/spec-plugman/projects/ios-plist/SampleApp.xcodeproj/project.orig.pbxproj delete mode 100644 cordova-lib/spec-plugman/projects/ios-plist/SampleApp.xcodeproj/project.pbxproj delete mode 100644 cordova-lib/spec-plugman/projects/ios-plist/SampleApp/PhoneGap.plist delete mode 100644 cordova-lib/spec-plugman/projects/ios-plist/SampleApp/SampleApp-Info.plist delete mode 100644 cordova-lib/spec-plugman/projects/ios-plist/www/.gitkeep delete mode 100644 cordova-lib/spec-plugman/projects/multiple-children/AndroidManifest.xml delete mode 100644 cordova-lib/spec-plugman/projects/multiple-children/res/xml/plugins.xml delete mode 100644 cordova-lib/spec-plugman/projects/tizen/www/config.xml delete mode 100644 cordova-lib/spec-plugman/projects/windows8/CordovaApp_TemporaryKey.pfx delete mode 100644 cordova-lib/spec-plugman/projects/windows8/TestApp.jsproj delete mode 100644 cordova-lib/spec-plugman/projects/windows8/TestApp.sln delete mode 100644 cordova-lib/spec-plugman/projects/windows8/package.appxmanifest delete mode 100644 cordova-lib/spec-plugman/projects/windows8/www/cordova-2.6.0.js delete mode 100644 cordova-lib/spec-plugman/projects/windows8/www/css/index.css delete mode 100644 cordova-lib/spec-plugman/projects/windows8/www/img/logo.png delete mode 100644 cordova-lib/spec-plugman/projects/windows8/www/img/smalllogo.png delete mode 100644 cordova-lib/spec-plugman/projects/windows8/www/img/splashscreen.png delete mode 100644 cordova-lib/spec-plugman/projects/windows8/www/img/storelogo.png delete mode 100644 cordova-lib/spec-plugman/projects/windows8/www/index.html delete mode 100644 cordova-lib/spec-plugman/projects/windows8/www/js/index.js delete mode 100644 cordova-lib/spec-plugman/projects/wp8/CordovaAppProj.csproj delete mode 100644 cordova-lib/spec-plugman/projects/wp8/Properties/WMAppManifest.xml delete mode 100644 cordova-lib/spec-plugman/projects/www-only/.gitkeep diff --git a/cordova-lib/spec-cordova-misc/fixtures/base/.cordova/config.json b/cordova-lib/fixtures-cordova/base/.cordova/config.json similarity index 100% rename from cordova-lib/spec-cordova-misc/fixtures/base/.cordova/config.json rename to cordova-lib/fixtures-cordova/base/.cordova/config.json diff --git a/cordova-lib/spec-cordova-misc/fixtures/base/merges/.svn b/cordova-lib/fixtures-cordova/base/merges/.svn similarity index 100% rename from cordova-lib/spec-cordova-misc/fixtures/base/merges/.svn rename to cordova-lib/fixtures-cordova/base/merges/.svn diff --git a/cordova-lib/spec-cordova-misc/fixtures/base/plugins/.svn b/cordova-lib/fixtures-cordova/base/plugins/.svn similarity index 100% rename from cordova-lib/spec-cordova-misc/fixtures/base/plugins/.svn rename to cordova-lib/fixtures-cordova/base/plugins/.svn diff --git a/cordova-lib/spec-cordova-misc/fixtures/base/www/config.xml b/cordova-lib/fixtures-cordova/base/www/config.xml similarity index 100% rename from cordova-lib/spec-cordova-misc/fixtures/base/www/config.xml rename to cordova-lib/fixtures-cordova/base/www/config.xml diff --git a/cordova-lib/spec-cordova-misc/fixtures/base/www/css/index.css b/cordova-lib/fixtures-cordova/base/www/css/index.css similarity index 100% rename from cordova-lib/spec-cordova-misc/fixtures/base/www/css/index.css rename to cordova-lib/fixtures-cordova/base/www/css/index.css diff --git a/cordova-lib/spec-cordova-misc/fixtures/base/www/img/logo.png b/cordova-lib/fixtures-cordova/base/www/img/logo.png similarity index 100% rename from cordova-lib/spec-cordova-misc/fixtures/base/www/img/logo.png rename to cordova-lib/fixtures-cordova/base/www/img/logo.png diff --git a/cordova-lib/spec-cordova-misc/fixtures/base/www/index.html b/cordova-lib/fixtures-cordova/base/www/index.html similarity index 100% rename from cordova-lib/spec-cordova-misc/fixtures/base/www/index.html rename to cordova-lib/fixtures-cordova/base/www/index.html diff --git a/cordova-lib/spec-cordova-misc/fixtures/base/www/js/index.js b/cordova-lib/fixtures-cordova/base/www/js/index.js similarity index 100% rename from cordova-lib/spec-cordova-misc/fixtures/base/www/js/index.js rename to cordova-lib/fixtures-cordova/base/www/js/index.js diff --git a/cordova-lib/spec-cordova-misc/fixtures/base/www/spec.html b/cordova-lib/fixtures-cordova/base/www/spec.html similarity index 100% rename from cordova-lib/spec-cordova-misc/fixtures/base/www/spec.html rename to cordova-lib/fixtures-cordova/base/www/spec.html diff --git a/cordova-lib/spec-cordova/helper.js b/cordova-lib/fixtures-cordova/helper.js similarity index 100% rename from cordova-lib/spec-cordova/helper.js rename to cordova-lib/fixtures-cordova/helper.js diff --git a/cordova-lib/spec-cordova-misc/helpers.js b/cordova-lib/fixtures-cordova/helpers.js similarity index 100% rename from cordova-lib/spec-cordova-misc/helpers.js rename to cordova-lib/fixtures-cordova/helpers.js diff --git a/cordova-lib/spec-cordova-misc/fixtures/hooks_bat/fail/fail.bat b/cordova-lib/fixtures-cordova/hooks_bat/fail/fail.bat similarity index 100% rename from cordova-lib/spec-cordova-misc/fixtures/hooks_bat/fail/fail.bat rename to cordova-lib/fixtures-cordova/hooks_bat/fail/fail.bat diff --git a/cordova-lib/spec-cordova-misc/fixtures/hooks_bat/test/.dotted.bat b/cordova-lib/fixtures-cordova/hooks_bat/test/.dotted.bat similarity index 100% rename from cordova-lib/spec-cordova-misc/fixtures/hooks_bat/test/.dotted.bat rename to cordova-lib/fixtures-cordova/hooks_bat/test/.dotted.bat diff --git a/cordova-lib/spec-cordova-misc/fixtures/hooks_bat/test/07.bat b/cordova-lib/fixtures-cordova/hooks_bat/test/07.bat similarity index 100% rename from cordova-lib/spec-cordova-misc/fixtures/hooks_bat/test/07.bat rename to cordova-lib/fixtures-cordova/hooks_bat/test/07.bat diff --git a/cordova-lib/spec-cordova-misc/fixtures/hooks_bat/test/1.bat b/cordova-lib/fixtures-cordova/hooks_bat/test/1.bat similarity index 100% rename from cordova-lib/spec-cordova-misc/fixtures/hooks_bat/test/1.bat rename to cordova-lib/fixtures-cordova/hooks_bat/test/1.bat diff --git a/cordova-lib/spec-cordova-misc/fixtures/hooks_sh/fail/fail.sh b/cordova-lib/fixtures-cordova/hooks_sh/fail/fail.sh similarity index 100% rename from cordova-lib/spec-cordova-misc/fixtures/hooks_sh/fail/fail.sh rename to cordova-lib/fixtures-cordova/hooks_sh/fail/fail.sh diff --git a/cordova-lib/spec-cordova-misc/fixtures/hooks_sh/test/.dotted.sh b/cordova-lib/fixtures-cordova/hooks_sh/test/.dotted.sh similarity index 100% rename from cordova-lib/spec-cordova-misc/fixtures/hooks_sh/test/.dotted.sh rename to cordova-lib/fixtures-cordova/hooks_sh/test/.dotted.sh diff --git a/cordova-lib/spec-cordova-misc/fixtures/hooks_sh/test/07.sh b/cordova-lib/fixtures-cordova/hooks_sh/test/07.sh similarity index 100% rename from cordova-lib/spec-cordova-misc/fixtures/hooks_sh/test/07.sh rename to cordova-lib/fixtures-cordova/hooks_sh/test/07.sh diff --git a/cordova-lib/spec-cordova-misc/fixtures/hooks_sh/test/1.sh b/cordova-lib/fixtures-cordova/hooks_sh/test/1.sh similarity index 100% rename from cordova-lib/spec-cordova-misc/fixtures/hooks_sh/test/1.sh rename to cordova-lib/fixtures-cordova/hooks_sh/test/1.sh diff --git a/cordova-lib/spec-cordova-misc/fixtures/platforms/android-lib/VERSION b/cordova-lib/fixtures-cordova/platforms/android-lib/VERSION similarity index 100% rename from cordova-lib/spec-cordova-misc/fixtures/platforms/android-lib/VERSION rename to cordova-lib/fixtures-cordova/platforms/android-lib/VERSION diff --git a/cordova-lib/spec-cordova-misc/fixtures/platforms/android-lib/framework/assets/www/cordova.js b/cordova-lib/fixtures-cordova/platforms/android-lib/framework/assets/www/cordova.js similarity index 100% rename from cordova-lib/spec-cordova-misc/fixtures/platforms/android-lib/framework/assets/www/cordova.js rename to cordova-lib/fixtures-cordova/platforms/android-lib/framework/assets/www/cordova.js diff --git a/cordova-lib/spec-cordova-misc/fixtures/platforms/android/AndroidManifest.xml b/cordova-lib/fixtures-cordova/platforms/android/AndroidManifest.xml similarity index 100% rename from cordova-lib/spec-cordova-misc/fixtures/platforms/android/AndroidManifest.xml rename to cordova-lib/fixtures-cordova/platforms/android/AndroidManifest.xml diff --git a/cordova-lib/spec-cordova-misc/fixtures/platforms/android/assets/www/config.xml b/cordova-lib/fixtures-cordova/platforms/android/assets/www/config.xml similarity index 100% rename from cordova-lib/spec-cordova-misc/fixtures/platforms/android/assets/www/config.xml rename to cordova-lib/fixtures-cordova/platforms/android/assets/www/config.xml diff --git a/cordova-lib/spec-cordova-misc/fixtures/platforms/android/assets/www/cordova.js b/cordova-lib/fixtures-cordova/platforms/android/assets/www/cordova.js similarity index 100% rename from cordova-lib/spec-cordova-misc/fixtures/platforms/android/assets/www/cordova.js rename to cordova-lib/fixtures-cordova/platforms/android/assets/www/cordova.js diff --git a/cordova-lib/spec-cordova-misc/fixtures/platforms/android/assets/www/cordova_plugins.js b/cordova-lib/fixtures-cordova/platforms/android/assets/www/cordova_plugins.js similarity index 100% rename from cordova-lib/spec-cordova-misc/fixtures/platforms/android/assets/www/cordova_plugins.js rename to cordova-lib/fixtures-cordova/platforms/android/assets/www/cordova_plugins.js diff --git a/cordova-lib/spec-cordova-misc/fixtures/platforms/android/assets/www/css/index.css b/cordova-lib/fixtures-cordova/platforms/android/assets/www/css/index.css similarity index 100% rename from cordova-lib/spec-cordova-misc/fixtures/platforms/android/assets/www/css/index.css rename to cordova-lib/fixtures-cordova/platforms/android/assets/www/css/index.css diff --git a/cordova-lib/spec-cordova-misc/fixtures/platforms/android/assets/www/img/logo.png b/cordova-lib/fixtures-cordova/platforms/android/assets/www/img/logo.png similarity index 100% rename from cordova-lib/spec-cordova-misc/fixtures/platforms/android/assets/www/img/logo.png rename to cordova-lib/fixtures-cordova/platforms/android/assets/www/img/logo.png diff --git a/cordova-lib/spec-cordova-misc/fixtures/platforms/android/assets/www/index.html b/cordova-lib/fixtures-cordova/platforms/android/assets/www/index.html similarity index 100% rename from cordova-lib/spec-cordova-misc/fixtures/platforms/android/assets/www/index.html rename to cordova-lib/fixtures-cordova/platforms/android/assets/www/index.html diff --git a/cordova-lib/spec-cordova-misc/fixtures/platforms/android/assets/www/js/index.js b/cordova-lib/fixtures-cordova/platforms/android/assets/www/js/index.js similarity index 100% rename from cordova-lib/spec-cordova-misc/fixtures/platforms/android/assets/www/js/index.js rename to cordova-lib/fixtures-cordova/platforms/android/assets/www/js/index.js diff --git a/cordova-lib/spec-cordova-misc/fixtures/platforms/android/assets/www/spec.html b/cordova-lib/fixtures-cordova/platforms/android/assets/www/spec.html similarity index 100% rename from cordova-lib/spec-cordova-misc/fixtures/platforms/android/assets/www/spec.html rename to cordova-lib/fixtures-cordova/platforms/android/assets/www/spec.html diff --git a/cordova-lib/spec-cordova-misc/fixtures/platforms/android/build.xml b/cordova-lib/fixtures-cordova/platforms/android/build.xml similarity index 100% rename from cordova-lib/spec-cordova-misc/fixtures/platforms/android/build.xml rename to cordova-lib/fixtures-cordova/platforms/android/build.xml diff --git a/cordova-lib/spec-cordova-misc/fixtures/platforms/android/cordova/build b/cordova-lib/fixtures-cordova/platforms/android/cordova/build similarity index 100% rename from cordova-lib/spec-cordova-misc/fixtures/platforms/android/cordova/build rename to cordova-lib/fixtures-cordova/platforms/android/cordova/build diff --git a/cordova-lib/spec-cordova-misc/fixtures/platforms/android/cordova/check_reqs b/cordova-lib/fixtures-cordova/platforms/android/cordova/check_reqs similarity index 100% rename from cordova-lib/spec-cordova-misc/fixtures/platforms/android/cordova/check_reqs rename to cordova-lib/fixtures-cordova/platforms/android/cordova/check_reqs diff --git a/cordova-lib/spec-cordova-misc/fixtures/platforms/android/cordova/clean b/cordova-lib/fixtures-cordova/platforms/android/cordova/clean similarity index 100% rename from cordova-lib/spec-cordova-misc/fixtures/platforms/android/cordova/clean rename to cordova-lib/fixtures-cordova/platforms/android/cordova/clean diff --git a/cordova-lib/spec-cordova-misc/fixtures/platforms/android/cordova/defaults.xml b/cordova-lib/fixtures-cordova/platforms/android/cordova/defaults.xml similarity index 100% rename from cordova-lib/spec-cordova-misc/fixtures/platforms/android/cordova/defaults.xml rename to cordova-lib/fixtures-cordova/platforms/android/cordova/defaults.xml diff --git a/cordova-lib/spec-cordova-misc/fixtures/platforms/android/cordova/lib/appinfo.js b/cordova-lib/fixtures-cordova/platforms/android/cordova/lib/appinfo.js similarity index 100% rename from cordova-lib/spec-cordova-misc/fixtures/platforms/android/cordova/lib/appinfo.js rename to cordova-lib/fixtures-cordova/platforms/android/cordova/lib/appinfo.js diff --git a/cordova-lib/spec-cordova-misc/fixtures/platforms/android/cordova/lib/build.js b/cordova-lib/fixtures-cordova/platforms/android/cordova/lib/build.js similarity index 100% rename from cordova-lib/spec-cordova-misc/fixtures/platforms/android/cordova/lib/build.js rename to cordova-lib/fixtures-cordova/platforms/android/cordova/lib/build.js diff --git a/cordova-lib/spec-cordova-misc/fixtures/platforms/android/cordova/lib/check_reqs.js b/cordova-lib/fixtures-cordova/platforms/android/cordova/lib/check_reqs.js similarity index 100% rename from cordova-lib/spec-cordova-misc/fixtures/platforms/android/cordova/lib/check_reqs.js rename to cordova-lib/fixtures-cordova/platforms/android/cordova/lib/check_reqs.js diff --git a/cordova-lib/spec-cordova-misc/fixtures/platforms/android/cordova/lib/clean.js b/cordova-lib/fixtures-cordova/platforms/android/cordova/lib/clean.js similarity index 100% rename from cordova-lib/spec-cordova-misc/fixtures/platforms/android/cordova/lib/clean.js rename to cordova-lib/fixtures-cordova/platforms/android/cordova/lib/clean.js diff --git a/cordova-lib/spec-cordova-misc/fixtures/platforms/android/cordova/lib/device.js b/cordova-lib/fixtures-cordova/platforms/android/cordova/lib/device.js similarity index 100% rename from cordova-lib/spec-cordova-misc/fixtures/platforms/android/cordova/lib/device.js rename to cordova-lib/fixtures-cordova/platforms/android/cordova/lib/device.js diff --git a/cordova-lib/spec-cordova-misc/fixtures/platforms/android/cordova/lib/emulator.js b/cordova-lib/fixtures-cordova/platforms/android/cordova/lib/emulator.js similarity index 100% rename from cordova-lib/spec-cordova-misc/fixtures/platforms/android/cordova/lib/emulator.js rename to cordova-lib/fixtures-cordova/platforms/android/cordova/lib/emulator.js diff --git a/cordova-lib/spec-cordova-misc/fixtures/platforms/android/cordova/lib/install-device b/cordova-lib/fixtures-cordova/platforms/android/cordova/lib/install-device similarity index 100% rename from cordova-lib/spec-cordova-misc/fixtures/platforms/android/cordova/lib/install-device rename to cordova-lib/fixtures-cordova/platforms/android/cordova/lib/install-device diff --git a/cordova-lib/spec-cordova-misc/fixtures/platforms/android/cordova/lib/install-emulator b/cordova-lib/fixtures-cordova/platforms/android/cordova/lib/install-emulator similarity index 100% rename from cordova-lib/spec-cordova-misc/fixtures/platforms/android/cordova/lib/install-emulator rename to cordova-lib/fixtures-cordova/platforms/android/cordova/lib/install-emulator diff --git a/cordova-lib/spec-cordova-misc/fixtures/platforms/android/cordova/lib/list-devices b/cordova-lib/fixtures-cordova/platforms/android/cordova/lib/list-devices similarity index 100% rename from cordova-lib/spec-cordova-misc/fixtures/platforms/android/cordova/lib/list-devices rename to cordova-lib/fixtures-cordova/platforms/android/cordova/lib/list-devices diff --git a/cordova-lib/spec-cordova-misc/fixtures/platforms/android/cordova/lib/list-emulator-images b/cordova-lib/fixtures-cordova/platforms/android/cordova/lib/list-emulator-images similarity index 100% rename from cordova-lib/spec-cordova-misc/fixtures/platforms/android/cordova/lib/list-emulator-images rename to cordova-lib/fixtures-cordova/platforms/android/cordova/lib/list-emulator-images diff --git a/cordova-lib/spec-cordova-misc/fixtures/platforms/android/cordova/lib/list-started-emulators b/cordova-lib/fixtures-cordova/platforms/android/cordova/lib/list-started-emulators similarity index 100% rename from cordova-lib/spec-cordova-misc/fixtures/platforms/android/cordova/lib/list-started-emulators rename to cordova-lib/fixtures-cordova/platforms/android/cordova/lib/list-started-emulators diff --git a/cordova-lib/spec-cordova-misc/fixtures/platforms/android/cordova/lib/log.js b/cordova-lib/fixtures-cordova/platforms/android/cordova/lib/log.js similarity index 100% rename from cordova-lib/spec-cordova-misc/fixtures/platforms/android/cordova/lib/log.js rename to cordova-lib/fixtures-cordova/platforms/android/cordova/lib/log.js diff --git a/cordova-lib/spec-cordova-misc/fixtures/platforms/android/cordova/lib/run.js b/cordova-lib/fixtures-cordova/platforms/android/cordova/lib/run.js similarity index 100% rename from cordova-lib/spec-cordova-misc/fixtures/platforms/android/cordova/lib/run.js rename to cordova-lib/fixtures-cordova/platforms/android/cordova/lib/run.js diff --git a/cordova-lib/spec-cordova-misc/fixtures/platforms/android/cordova/lib/start-emulator b/cordova-lib/fixtures-cordova/platforms/android/cordova/lib/start-emulator similarity index 100% rename from cordova-lib/spec-cordova-misc/fixtures/platforms/android/cordova/lib/start-emulator rename to cordova-lib/fixtures-cordova/platforms/android/cordova/lib/start-emulator diff --git a/cordova-lib/spec-cordova-misc/fixtures/platforms/android/cordova/log b/cordova-lib/fixtures-cordova/platforms/android/cordova/log similarity index 100% rename from cordova-lib/spec-cordova-misc/fixtures/platforms/android/cordova/log rename to cordova-lib/fixtures-cordova/platforms/android/cordova/log diff --git a/cordova-lib/spec-cordova-misc/fixtures/platforms/android/cordova/run b/cordova-lib/fixtures-cordova/platforms/android/cordova/run similarity index 100% rename from cordova-lib/spec-cordova-misc/fixtures/platforms/android/cordova/run rename to cordova-lib/fixtures-cordova/platforms/android/cordova/run diff --git a/cordova-lib/spec-cordova-misc/fixtures/platforms/android/cordova/version b/cordova-lib/fixtures-cordova/platforms/android/cordova/version similarity index 100% rename from cordova-lib/spec-cordova-misc/fixtures/platforms/android/cordova/version rename to cordova-lib/fixtures-cordova/platforms/android/cordova/version diff --git a/cordova-lib/spec-cordova-misc/fixtures/platforms/android/local.properties b/cordova-lib/fixtures-cordova/platforms/android/local.properties similarity index 100% rename from cordova-lib/spec-cordova-misc/fixtures/platforms/android/local.properties rename to cordova-lib/fixtures-cordova/platforms/android/local.properties diff --git a/cordova-lib/spec-cordova-misc/fixtures/platforms/android/proguard-project.txt b/cordova-lib/fixtures-cordova/platforms/android/proguard-project.txt similarity index 100% rename from cordova-lib/spec-cordova-misc/fixtures/platforms/android/proguard-project.txt rename to cordova-lib/fixtures-cordova/platforms/android/proguard-project.txt diff --git a/cordova-lib/spec-cordova-misc/fixtures/platforms/android/project.properties b/cordova-lib/fixtures-cordova/platforms/android/project.properties similarity index 100% rename from cordova-lib/spec-cordova-misc/fixtures/platforms/android/project.properties rename to cordova-lib/fixtures-cordova/platforms/android/project.properties diff --git a/cordova-lib/spec-cordova-misc/fixtures/platforms/android/res/drawable-hdpi/icon.png b/cordova-lib/fixtures-cordova/platforms/android/res/drawable-hdpi/icon.png similarity index 100% rename from cordova-lib/spec-cordova-misc/fixtures/platforms/android/res/drawable-hdpi/icon.png rename to cordova-lib/fixtures-cordova/platforms/android/res/drawable-hdpi/icon.png diff --git a/cordova-lib/spec-cordova-misc/fixtures/platforms/android/res/drawable-ldpi/icon.png b/cordova-lib/fixtures-cordova/platforms/android/res/drawable-ldpi/icon.png similarity index 100% rename from cordova-lib/spec-cordova-misc/fixtures/platforms/android/res/drawable-ldpi/icon.png rename to cordova-lib/fixtures-cordova/platforms/android/res/drawable-ldpi/icon.png diff --git a/cordova-lib/spec-cordova-misc/fixtures/platforms/android/res/drawable-mdpi/icon.png b/cordova-lib/fixtures-cordova/platforms/android/res/drawable-mdpi/icon.png similarity index 100% rename from cordova-lib/spec-cordova-misc/fixtures/platforms/android/res/drawable-mdpi/icon.png rename to cordova-lib/fixtures-cordova/platforms/android/res/drawable-mdpi/icon.png diff --git a/cordova-lib/spec-cordova-misc/fixtures/platforms/android/res/drawable-xhdpi/icon.png b/cordova-lib/fixtures-cordova/platforms/android/res/drawable-xhdpi/icon.png similarity index 100% rename from cordova-lib/spec-cordova-misc/fixtures/platforms/android/res/drawable-xhdpi/icon.png rename to cordova-lib/fixtures-cordova/platforms/android/res/drawable-xhdpi/icon.png diff --git a/cordova-lib/spec-cordova-misc/fixtures/platforms/android/res/drawable/icon.png b/cordova-lib/fixtures-cordova/platforms/android/res/drawable/icon.png similarity index 100% rename from cordova-lib/spec-cordova-misc/fixtures/platforms/android/res/drawable/icon.png rename to cordova-lib/fixtures-cordova/platforms/android/res/drawable/icon.png diff --git a/cordova-lib/spec-cordova-misc/fixtures/platforms/android/res/values/strings.xml b/cordova-lib/fixtures-cordova/platforms/android/res/values/strings.xml similarity index 100% rename from cordova-lib/spec-cordova-misc/fixtures/platforms/android/res/values/strings.xml rename to cordova-lib/fixtures-cordova/platforms/android/res/values/strings.xml diff --git a/cordova-lib/spec-cordova-misc/fixtures/platforms/android/res/xml/config.xml b/cordova-lib/fixtures-cordova/platforms/android/res/xml/config.xml similarity index 100% rename from cordova-lib/spec-cordova-misc/fixtures/platforms/android/res/xml/config.xml rename to cordova-lib/fixtures-cordova/platforms/android/res/xml/config.xml diff --git a/cordova-lib/spec-cordova-misc/fixtures/platforms/android/src/org/testing/TestBase.java b/cordova-lib/fixtures-cordova/platforms/android/src/org/testing/TestBase.java similarity index 100% rename from cordova-lib/spec-cordova-misc/fixtures/platforms/android/src/org/testing/TestBase.java rename to cordova-lib/fixtures-cordova/platforms/android/src/org/testing/TestBase.java diff --git a/cordova-lib/spec-cordova-misc/fixtures/plugins/ChildBrowser/plugin.xml b/cordova-lib/fixtures-cordova/plugins/ChildBrowser/plugin.xml similarity index 100% rename from cordova-lib/spec-cordova-misc/fixtures/plugins/ChildBrowser/plugin.xml rename to cordova-lib/fixtures-cordova/plugins/ChildBrowser/plugin.xml diff --git a/cordova-lib/spec-cordova-misc/fixtures/plugins/ChildBrowser/src/android/ChildBrowser.java b/cordova-lib/fixtures-cordova/plugins/ChildBrowser/src/android/ChildBrowser.java similarity index 100% rename from cordova-lib/spec-cordova-misc/fixtures/plugins/ChildBrowser/src/android/ChildBrowser.java rename to cordova-lib/fixtures-cordova/plugins/ChildBrowser/src/android/ChildBrowser.java diff --git a/cordova-lib/spec-cordova-misc/fixtures/plugins/ChildBrowser/www/childbrowser.js b/cordova-lib/fixtures-cordova/plugins/ChildBrowser/www/childbrowser.js similarity index 100% rename from cordova-lib/spec-cordova-misc/fixtures/plugins/ChildBrowser/www/childbrowser.js rename to cordova-lib/fixtures-cordova/plugins/ChildBrowser/www/childbrowser.js diff --git a/cordova-lib/spec-cordova-misc/fixtures/plugins/ChildBrowser/www/childbrowser/image.jpg b/cordova-lib/fixtures-cordova/plugins/ChildBrowser/www/childbrowser/image.jpg similarity index 100% rename from cordova-lib/spec-cordova-misc/fixtures/plugins/ChildBrowser/www/childbrowser/image.jpg rename to cordova-lib/fixtures-cordova/plugins/ChildBrowser/www/childbrowser/image.jpg diff --git a/cordova-lib/spec-cordova-misc/fixtures/plugins/ChildBrowser/www/childbrowser_file.html b/cordova-lib/fixtures-cordova/plugins/ChildBrowser/www/childbrowser_file.html similarity index 100% rename from cordova-lib/spec-cordova-misc/fixtures/plugins/ChildBrowser/www/childbrowser_file.html rename to cordova-lib/fixtures-cordova/plugins/ChildBrowser/www/childbrowser_file.html diff --git a/cordova-lib/spec-cordova-misc/fixtures/plugins/android/plugin.xml b/cordova-lib/fixtures-cordova/plugins/android/plugin.xml similarity index 100% rename from cordova-lib/spec-cordova-misc/fixtures/plugins/android/plugin.xml rename to cordova-lib/fixtures-cordova/plugins/android/plugin.xml diff --git a/cordova-lib/spec-cordova-misc/fixtures/plugins/android/src/android/Android.java b/cordova-lib/fixtures-cordova/plugins/android/src/android/Android.java similarity index 100% rename from cordova-lib/spec-cordova-misc/fixtures/plugins/android/src/android/Android.java rename to cordova-lib/fixtures-cordova/plugins/android/src/android/Android.java diff --git a/cordova-lib/spec-cordova-misc/fixtures/plugins/android/src/android/SomethingWithR.java b/cordova-lib/fixtures-cordova/plugins/android/src/android/SomethingWithR.java similarity index 100% rename from cordova-lib/spec-cordova-misc/fixtures/plugins/android/src/android/SomethingWithR.java rename to cordova-lib/fixtures-cordova/plugins/android/src/android/SomethingWithR.java diff --git a/cordova-lib/spec-cordova-misc/fixtures/plugins/android/www/android.js b/cordova-lib/fixtures-cordova/plugins/android/www/android.js similarity index 100% rename from cordova-lib/spec-cordova-misc/fixtures/plugins/android/www/android.js rename to cordova-lib/fixtures-cordova/plugins/android/www/android.js diff --git a/cordova-lib/spec-cordova-misc/fixtures/plugins/fake1/plugin.xml b/cordova-lib/fixtures-cordova/plugins/fake1/plugin.xml similarity index 100% rename from cordova-lib/spec-cordova-misc/fixtures/plugins/fake1/plugin.xml rename to cordova-lib/fixtures-cordova/plugins/fake1/plugin.xml diff --git a/cordova-lib/spec-cordova-misc/fixtures/plugins/test/plugin.xml b/cordova-lib/fixtures-cordova/plugins/test/plugin.xml similarity index 100% rename from cordova-lib/spec-cordova-misc/fixtures/plugins/test/plugin.xml rename to cordova-lib/fixtures-cordova/plugins/test/plugin.xml diff --git a/cordova-lib/spec-cordova-misc/fixtures/plugins/test/www/test.js b/cordova-lib/fixtures-cordova/plugins/test/www/test.js similarity index 100% rename from cordova-lib/spec-cordova-misc/fixtures/plugins/test/www/test.js rename to cordova-lib/fixtures-cordova/plugins/test/www/test.js diff --git a/cordova-lib/spec-cordova-misc/fixtures/projects/android/AndroidManifest.xml b/cordova-lib/fixtures-cordova/projects/android/AndroidManifest.xml similarity index 100% rename from cordova-lib/spec-cordova-misc/fixtures/projects/android/AndroidManifest.xml rename to cordova-lib/fixtures-cordova/projects/android/AndroidManifest.xml diff --git a/cordova-lib/spec-cordova-misc/fixtures/projects/android/assets/www/.gitkeep b/cordova-lib/fixtures-cordova/projects/android/assets/www/.gitkeep similarity index 100% rename from cordova-lib/spec-cordova-misc/fixtures/projects/android/assets/www/.gitkeep rename to cordova-lib/fixtures-cordova/projects/android/assets/www/.gitkeep diff --git a/cordova-lib/spec-cordova-misc/fixtures/projects/android/res/xml/config.xml b/cordova-lib/fixtures-cordova/projects/android/res/xml/config.xml similarity index 100% rename from cordova-lib/spec-cordova-misc/fixtures/projects/android/res/xml/config.xml rename to cordova-lib/fixtures-cordova/projects/android/res/xml/config.xml diff --git a/cordova-lib/spec-cordova-misc/fixtures/projects/android/src/.gitkeep b/cordova-lib/fixtures-cordova/projects/android/src/.gitkeep similarity index 100% rename from cordova-lib/spec-cordova-misc/fixtures/projects/android/src/.gitkeep rename to cordova-lib/fixtures-cordova/projects/android/src/.gitkeep diff --git a/cordova-lib/spec-cordova-misc/fixtures/projects/windows/bom_test.xml b/cordova-lib/fixtures-cordova/projects/windows/bom_test.xml similarity index 100% rename from cordova-lib/spec-cordova-misc/fixtures/projects/windows/bom_test.xml rename to cordova-lib/fixtures-cordova/projects/windows/bom_test.xml diff --git a/cordova-lib/spec-cordova-misc/fixtures/templates/no_content_config.xml b/cordova-lib/fixtures-cordova/templates/no_content_config.xml similarity index 100% rename from cordova-lib/spec-cordova-misc/fixtures/templates/no_content_config.xml rename to cordova-lib/fixtures-cordova/templates/no_content_config.xml diff --git a/cordova-lib/spec-cordova-plugins/fixtures/projects/android/assets/www/.gitkeep b/cordova-lib/fixtures-plugman/plugins/.gitkeep similarity index 100% rename from cordova-lib/spec-cordova-plugins/fixtures/projects/android/assets/www/.gitkeep rename to cordova-lib/fixtures-plugman/plugins/.gitkeep diff --git a/cordova-lib/spec-plugman-create/plugins/AndroidJS/plugin.xml b/cordova-lib/fixtures-plugman/plugins/AndroidJS/plugin.xml similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/AndroidJS/plugin.xml rename to cordova-lib/fixtures-plugman/plugins/AndroidJS/plugin.xml diff --git a/cordova-lib/spec-plugman-create/plugins/AndroidJS/www/android.js b/cordova-lib/fixtures-plugman/plugins/AndroidJS/www/android.js similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/AndroidJS/www/android.js rename to cordova-lib/fixtures-plugman/plugins/AndroidJS/www/android.js diff --git a/cordova-lib/spec-plugman-create/plugins/ChildBrowser/plugin.xml b/cordova-lib/fixtures-plugman/plugins/ChildBrowser/plugin.xml similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/ChildBrowser/plugin.xml rename to cordova-lib/fixtures-plugman/plugins/ChildBrowser/plugin.xml diff --git a/cordova-lib/spec-cordova-plugins/fixtures/plugins/ChildBrowser/src/android/ChildBrowser.java b/cordova-lib/fixtures-plugman/plugins/ChildBrowser/src/android/ChildBrowser.java similarity index 100% rename from cordova-lib/spec-cordova-plugins/fixtures/plugins/ChildBrowser/src/android/ChildBrowser.java rename to cordova-lib/fixtures-plugman/plugins/ChildBrowser/src/android/ChildBrowser.java diff --git a/cordova-lib/spec-plugman-create/plugins/ChildBrowser/src/ios/ChildBrowser.bundle/arrow_left.png b/cordova-lib/fixtures-plugman/plugins/ChildBrowser/src/ios/ChildBrowser.bundle/arrow_left.png similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/ChildBrowser/src/ios/ChildBrowser.bundle/arrow_left.png rename to cordova-lib/fixtures-plugman/plugins/ChildBrowser/src/ios/ChildBrowser.bundle/arrow_left.png diff --git a/cordova-lib/spec-plugman-create/plugins/ChildBrowser/src/ios/ChildBrowser.bundle/arrow_left@2x.png b/cordova-lib/fixtures-plugman/plugins/ChildBrowser/src/ios/ChildBrowser.bundle/arrow_left@2x.png similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/ChildBrowser/src/ios/ChildBrowser.bundle/arrow_left@2x.png rename to cordova-lib/fixtures-plugman/plugins/ChildBrowser/src/ios/ChildBrowser.bundle/arrow_left@2x.png diff --git a/cordova-lib/spec-plugman-create/plugins/ChildBrowser/src/ios/ChildBrowser.bundle/arrow_right.png b/cordova-lib/fixtures-plugman/plugins/ChildBrowser/src/ios/ChildBrowser.bundle/arrow_right.png similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/ChildBrowser/src/ios/ChildBrowser.bundle/arrow_right.png rename to cordova-lib/fixtures-plugman/plugins/ChildBrowser/src/ios/ChildBrowser.bundle/arrow_right.png diff --git a/cordova-lib/spec-plugman-create/plugins/ChildBrowser/src/ios/ChildBrowser.bundle/arrow_right@2x.png b/cordova-lib/fixtures-plugman/plugins/ChildBrowser/src/ios/ChildBrowser.bundle/arrow_right@2x.png similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/ChildBrowser/src/ios/ChildBrowser.bundle/arrow_right@2x.png rename to cordova-lib/fixtures-plugman/plugins/ChildBrowser/src/ios/ChildBrowser.bundle/arrow_right@2x.png diff --git a/cordova-lib/spec-plugman-create/plugins/ChildBrowser/src/ios/ChildBrowser.bundle/but_refresh.png b/cordova-lib/fixtures-plugman/plugins/ChildBrowser/src/ios/ChildBrowser.bundle/but_refresh.png similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/ChildBrowser/src/ios/ChildBrowser.bundle/but_refresh.png rename to cordova-lib/fixtures-plugman/plugins/ChildBrowser/src/ios/ChildBrowser.bundle/but_refresh.png diff --git a/cordova-lib/spec-plugman-create/plugins/ChildBrowser/src/ios/ChildBrowser.bundle/but_refresh@2x.png b/cordova-lib/fixtures-plugman/plugins/ChildBrowser/src/ios/ChildBrowser.bundle/but_refresh@2x.png similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/ChildBrowser/src/ios/ChildBrowser.bundle/but_refresh@2x.png rename to cordova-lib/fixtures-plugman/plugins/ChildBrowser/src/ios/ChildBrowser.bundle/but_refresh@2x.png diff --git a/cordova-lib/spec-plugman-create/plugins/ChildBrowser/src/ios/ChildBrowser.bundle/compass.png b/cordova-lib/fixtures-plugman/plugins/ChildBrowser/src/ios/ChildBrowser.bundle/compass.png similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/ChildBrowser/src/ios/ChildBrowser.bundle/compass.png rename to cordova-lib/fixtures-plugman/plugins/ChildBrowser/src/ios/ChildBrowser.bundle/compass.png diff --git a/cordova-lib/spec-plugman-create/plugins/ChildBrowser/src/ios/ChildBrowser.bundle/compass@2x.png b/cordova-lib/fixtures-plugman/plugins/ChildBrowser/src/ios/ChildBrowser.bundle/compass@2x.png similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/ChildBrowser/src/ios/ChildBrowser.bundle/compass@2x.png rename to cordova-lib/fixtures-plugman/plugins/ChildBrowser/src/ios/ChildBrowser.bundle/compass@2x.png diff --git a/cordova-lib/spec-plugman-create/plugins/ChildBrowser/src/ios/ChildBrowserCommand.h b/cordova-lib/fixtures-plugman/plugins/ChildBrowser/src/ios/ChildBrowserCommand.h similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/ChildBrowser/src/ios/ChildBrowserCommand.h rename to cordova-lib/fixtures-plugman/plugins/ChildBrowser/src/ios/ChildBrowserCommand.h diff --git a/cordova-lib/spec-plugman-create/plugins/ChildBrowser/src/ios/ChildBrowserCommand.m b/cordova-lib/fixtures-plugman/plugins/ChildBrowser/src/ios/ChildBrowserCommand.m similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/ChildBrowser/src/ios/ChildBrowserCommand.m rename to cordova-lib/fixtures-plugman/plugins/ChildBrowser/src/ios/ChildBrowserCommand.m diff --git a/cordova-lib/spec-plugman-create/plugins/ChildBrowser/src/ios/ChildBrowserViewController.h b/cordova-lib/fixtures-plugman/plugins/ChildBrowser/src/ios/ChildBrowserViewController.h similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/ChildBrowser/src/ios/ChildBrowserViewController.h rename to cordova-lib/fixtures-plugman/plugins/ChildBrowser/src/ios/ChildBrowserViewController.h diff --git a/cordova-lib/spec-plugman-create/plugins/ChildBrowser/src/ios/ChildBrowserViewController.m b/cordova-lib/fixtures-plugman/plugins/ChildBrowser/src/ios/ChildBrowserViewController.m similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/ChildBrowser/src/ios/ChildBrowserViewController.m rename to cordova-lib/fixtures-plugman/plugins/ChildBrowser/src/ios/ChildBrowserViewController.m diff --git a/cordova-lib/spec-plugman-create/plugins/ChildBrowser/src/ios/ChildBrowserViewController.xib b/cordova-lib/fixtures-plugman/plugins/ChildBrowser/src/ios/ChildBrowserViewController.xib similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/ChildBrowser/src/ios/ChildBrowserViewController.xib rename to cordova-lib/fixtures-plugman/plugins/ChildBrowser/src/ios/ChildBrowserViewController.xib diff --git a/cordova-lib/spec-plugman-create/plugins/ChildBrowser/src/ios/TargetDirTest.h b/cordova-lib/fixtures-plugman/plugins/ChildBrowser/src/ios/TargetDirTest.h similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/ChildBrowser/src/ios/TargetDirTest.h rename to cordova-lib/fixtures-plugman/plugins/ChildBrowser/src/ios/TargetDirTest.h diff --git a/cordova-lib/spec-plugman-create/plugins/ChildBrowser/src/ios/TargetDirTest.m b/cordova-lib/fixtures-plugman/plugins/ChildBrowser/src/ios/TargetDirTest.m similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/ChildBrowser/src/ios/TargetDirTest.m rename to cordova-lib/fixtures-plugman/plugins/ChildBrowser/src/ios/TargetDirTest.m diff --git a/cordova-lib/spec-plugman-create/plugins/ChildBrowser/src/ios/preserveDirs/PreserveDirsTest.h b/cordova-lib/fixtures-plugman/plugins/ChildBrowser/src/ios/preserveDirs/PreserveDirsTest.h similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/ChildBrowser/src/ios/preserveDirs/PreserveDirsTest.h rename to cordova-lib/fixtures-plugman/plugins/ChildBrowser/src/ios/preserveDirs/PreserveDirsTest.h diff --git a/cordova-lib/spec-plugman-create/plugins/ChildBrowser/src/ios/preserveDirs/PreserveDirsTest.m b/cordova-lib/fixtures-plugman/plugins/ChildBrowser/src/ios/preserveDirs/PreserveDirsTest.m similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/ChildBrowser/src/ios/preserveDirs/PreserveDirsTest.m rename to cordova-lib/fixtures-plugman/plugins/ChildBrowser/src/ios/preserveDirs/PreserveDirsTest.m diff --git a/cordova-lib/spec-cordova-plugins/fixtures/plugins/ChildBrowser/www/childbrowser.js b/cordova-lib/fixtures-plugman/plugins/ChildBrowser/www/childbrowser.js similarity index 100% rename from cordova-lib/spec-cordova-plugins/fixtures/plugins/ChildBrowser/www/childbrowser.js rename to cordova-lib/fixtures-plugman/plugins/ChildBrowser/www/childbrowser.js diff --git a/cordova-lib/spec-cordova-plugins/fixtures/plugins/ChildBrowser/www/childbrowser/image.jpg b/cordova-lib/fixtures-plugman/plugins/ChildBrowser/www/childbrowser/image.jpg similarity index 100% rename from cordova-lib/spec-cordova-plugins/fixtures/plugins/ChildBrowser/www/childbrowser/image.jpg rename to cordova-lib/fixtures-plugman/plugins/ChildBrowser/www/childbrowser/image.jpg diff --git a/cordova-lib/spec-cordova-plugins/fixtures/plugins/ChildBrowser/www/childbrowser_file.html b/cordova-lib/fixtures-plugman/plugins/ChildBrowser/www/childbrowser_file.html similarity index 100% rename from cordova-lib/spec-cordova-plugins/fixtures/plugins/ChildBrowser/www/childbrowser_file.html rename to cordova-lib/fixtures-plugman/plugins/ChildBrowser/www/childbrowser_file.html diff --git a/cordova-lib/spec-plugman-create/plugins/ConfigTestPlugin/plugin.xml b/cordova-lib/fixtures-plugman/plugins/ConfigTestPlugin/plugin.xml similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/ConfigTestPlugin/plugin.xml rename to cordova-lib/fixtures-plugman/plugins/ConfigTestPlugin/plugin.xml diff --git a/cordova-lib/spec-plugman-create/plugins/Contacts/plugin.xml b/cordova-lib/fixtures-plugman/plugins/Contacts/plugin.xml similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/Contacts/plugin.xml rename to cordova-lib/fixtures-plugman/plugins/Contacts/plugin.xml diff --git a/cordova-lib/spec-plugman-create/plugins/Contacts/src/android/ContactAccessor.java b/cordova-lib/fixtures-plugman/plugins/Contacts/src/android/ContactAccessor.java similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/Contacts/src/android/ContactAccessor.java rename to cordova-lib/fixtures-plugman/plugins/Contacts/src/android/ContactAccessor.java diff --git a/cordova-lib/spec-plugman-create/plugins/Contacts/src/android/ContactAccessorSdk5.java b/cordova-lib/fixtures-plugman/plugins/Contacts/src/android/ContactAccessorSdk5.java similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/Contacts/src/android/ContactAccessorSdk5.java rename to cordova-lib/fixtures-plugman/plugins/Contacts/src/android/ContactAccessorSdk5.java diff --git a/cordova-lib/spec-plugman-create/plugins/Contacts/src/android/ContactManager.java b/cordova-lib/fixtures-plugman/plugins/Contacts/src/android/ContactManager.java similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/Contacts/src/android/ContactManager.java rename to cordova-lib/fixtures-plugman/plugins/Contacts/src/android/ContactManager.java diff --git a/cordova-lib/spec-plugman-create/plugins/Contacts/src/blackberry10/ContactActivity.js b/cordova-lib/fixtures-plugman/plugins/Contacts/src/blackberry10/ContactActivity.js similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/Contacts/src/blackberry10/ContactActivity.js rename to cordova-lib/fixtures-plugman/plugins/Contacts/src/blackberry10/ContactActivity.js diff --git a/cordova-lib/spec-plugman-create/plugins/Contacts/src/blackberry10/ContactAddress.js b/cordova-lib/fixtures-plugman/plugins/Contacts/src/blackberry10/ContactAddress.js similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/Contacts/src/blackberry10/ContactAddress.js rename to cordova-lib/fixtures-plugman/plugins/Contacts/src/blackberry10/ContactAddress.js diff --git a/cordova-lib/spec-plugman-create/plugins/Contacts/src/blackberry10/ContactError.js b/cordova-lib/fixtures-plugman/plugins/Contacts/src/blackberry10/ContactError.js similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/Contacts/src/blackberry10/ContactError.js rename to cordova-lib/fixtures-plugman/plugins/Contacts/src/blackberry10/ContactError.js diff --git a/cordova-lib/spec-plugman-create/plugins/Contacts/src/blackberry10/ContactField.js b/cordova-lib/fixtures-plugman/plugins/Contacts/src/blackberry10/ContactField.js similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/Contacts/src/blackberry10/ContactField.js rename to cordova-lib/fixtures-plugman/plugins/Contacts/src/blackberry10/ContactField.js diff --git a/cordova-lib/spec-plugman-create/plugins/Contacts/src/blackberry10/ContactFindOptions.js b/cordova-lib/fixtures-plugman/plugins/Contacts/src/blackberry10/ContactFindOptions.js similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/Contacts/src/blackberry10/ContactFindOptions.js rename to cordova-lib/fixtures-plugman/plugins/Contacts/src/blackberry10/ContactFindOptions.js diff --git a/cordova-lib/spec-plugman-create/plugins/Contacts/src/blackberry10/ContactName.js b/cordova-lib/fixtures-plugman/plugins/Contacts/src/blackberry10/ContactName.js similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/Contacts/src/blackberry10/ContactName.js rename to cordova-lib/fixtures-plugman/plugins/Contacts/src/blackberry10/ContactName.js diff --git a/cordova-lib/spec-plugman-create/plugins/Contacts/src/blackberry10/ContactNews.js b/cordova-lib/fixtures-plugman/plugins/Contacts/src/blackberry10/ContactNews.js similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/Contacts/src/blackberry10/ContactNews.js rename to cordova-lib/fixtures-plugman/plugins/Contacts/src/blackberry10/ContactNews.js diff --git a/cordova-lib/spec-plugman-create/plugins/Contacts/src/blackberry10/ContactOrganization.js b/cordova-lib/fixtures-plugman/plugins/Contacts/src/blackberry10/ContactOrganization.js similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/Contacts/src/blackberry10/ContactOrganization.js rename to cordova-lib/fixtures-plugman/plugins/Contacts/src/blackberry10/ContactOrganization.js diff --git a/cordova-lib/spec-plugman-create/plugins/Contacts/src/blackberry10/ContactPhoto.js b/cordova-lib/fixtures-plugman/plugins/Contacts/src/blackberry10/ContactPhoto.js similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/Contacts/src/blackberry10/ContactPhoto.js rename to cordova-lib/fixtures-plugman/plugins/Contacts/src/blackberry10/ContactPhoto.js diff --git a/cordova-lib/spec-plugman-create/plugins/Contacts/src/blackberry10/contactConsts.js b/cordova-lib/fixtures-plugman/plugins/Contacts/src/blackberry10/contactConsts.js similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/Contacts/src/blackberry10/contactConsts.js rename to cordova-lib/fixtures-plugman/plugins/Contacts/src/blackberry10/contactConsts.js diff --git a/cordova-lib/spec-plugman-create/plugins/Contacts/src/blackberry10/contactUtils.js b/cordova-lib/fixtures-plugman/plugins/Contacts/src/blackberry10/contactUtils.js similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/Contacts/src/blackberry10/contactUtils.js rename to cordova-lib/fixtures-plugman/plugins/Contacts/src/blackberry10/contactUtils.js diff --git a/cordova-lib/spec-plugman-create/plugins/Contacts/src/blackberry10/index.js b/cordova-lib/fixtures-plugman/plugins/Contacts/src/blackberry10/index.js similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/Contacts/src/blackberry10/index.js rename to cordova-lib/fixtures-plugman/plugins/Contacts/src/blackberry10/index.js diff --git a/cordova-lib/spec-plugman-create/plugins/Contacts/src/blackberry10/plugin.xml b/cordova-lib/fixtures-plugman/plugins/Contacts/src/blackberry10/plugin.xml similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/Contacts/src/blackberry10/plugin.xml rename to cordova-lib/fixtures-plugman/plugins/Contacts/src/blackberry10/plugin.xml diff --git a/cordova-lib/spec-plugman-create/plugins/Contacts/src/ios/CDVContact.h b/cordova-lib/fixtures-plugman/plugins/Contacts/src/ios/CDVContact.h similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/Contacts/src/ios/CDVContact.h rename to cordova-lib/fixtures-plugman/plugins/Contacts/src/ios/CDVContact.h diff --git a/cordova-lib/spec-plugman-create/plugins/Contacts/src/ios/CDVContact.m b/cordova-lib/fixtures-plugman/plugins/Contacts/src/ios/CDVContact.m similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/Contacts/src/ios/CDVContact.m rename to cordova-lib/fixtures-plugman/plugins/Contacts/src/ios/CDVContact.m diff --git a/cordova-lib/spec-plugman-create/plugins/Contacts/src/ios/CDVContacts.h b/cordova-lib/fixtures-plugman/plugins/Contacts/src/ios/CDVContacts.h similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/Contacts/src/ios/CDVContacts.h rename to cordova-lib/fixtures-plugman/plugins/Contacts/src/ios/CDVContacts.h diff --git a/cordova-lib/spec-plugman-create/plugins/Contacts/src/ios/CDVContacts.m b/cordova-lib/fixtures-plugman/plugins/Contacts/src/ios/CDVContacts.m similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/Contacts/src/ios/CDVContacts.m rename to cordova-lib/fixtures-plugman/plugins/Contacts/src/ios/CDVContacts.m diff --git a/cordova-lib/spec-plugman-create/plugins/Contacts/src/wp/Contacts.cs b/cordova-lib/fixtures-plugman/plugins/Contacts/src/wp/Contacts.cs similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/Contacts/src/wp/Contacts.cs rename to cordova-lib/fixtures-plugman/plugins/Contacts/src/wp/Contacts.cs diff --git a/cordova-lib/spec-plugman-create/plugins/Contacts/www/Contact.js b/cordova-lib/fixtures-plugman/plugins/Contacts/www/Contact.js similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/Contacts/www/Contact.js rename to cordova-lib/fixtures-plugman/plugins/Contacts/www/Contact.js diff --git a/cordova-lib/spec-plugman-create/plugins/Contacts/www/ContactAddress.js b/cordova-lib/fixtures-plugman/plugins/Contacts/www/ContactAddress.js similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/Contacts/www/ContactAddress.js rename to cordova-lib/fixtures-plugman/plugins/Contacts/www/ContactAddress.js diff --git a/cordova-lib/spec-plugman-create/plugins/Contacts/www/ContactError.js b/cordova-lib/fixtures-plugman/plugins/Contacts/www/ContactError.js similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/Contacts/www/ContactError.js rename to cordova-lib/fixtures-plugman/plugins/Contacts/www/ContactError.js diff --git a/cordova-lib/spec-plugman-create/plugins/Contacts/www/ContactField.js b/cordova-lib/fixtures-plugman/plugins/Contacts/www/ContactField.js similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/Contacts/www/ContactField.js rename to cordova-lib/fixtures-plugman/plugins/Contacts/www/ContactField.js diff --git a/cordova-lib/spec-plugman-create/plugins/Contacts/www/ContactFindOptions.js b/cordova-lib/fixtures-plugman/plugins/Contacts/www/ContactFindOptions.js similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/Contacts/www/ContactFindOptions.js rename to cordova-lib/fixtures-plugman/plugins/Contacts/www/ContactFindOptions.js diff --git a/cordova-lib/spec-plugman-create/plugins/Contacts/www/ContactName.js b/cordova-lib/fixtures-plugman/plugins/Contacts/www/ContactName.js similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/Contacts/www/ContactName.js rename to cordova-lib/fixtures-plugman/plugins/Contacts/www/ContactName.js diff --git a/cordova-lib/spec-plugman-create/plugins/Contacts/www/ContactOrganization.js b/cordova-lib/fixtures-plugman/plugins/Contacts/www/ContactOrganization.js similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/Contacts/www/ContactOrganization.js rename to cordova-lib/fixtures-plugman/plugins/Contacts/www/ContactOrganization.js diff --git a/cordova-lib/spec-plugman-create/plugins/Contacts/www/contacts.js b/cordova-lib/fixtures-plugman/plugins/Contacts/www/contacts.js similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/Contacts/www/contacts.js rename to cordova-lib/fixtures-plugman/plugins/Contacts/www/contacts.js diff --git a/cordova-lib/spec-plugman-create/plugins/Contacts/www/ios/Contact.js b/cordova-lib/fixtures-plugman/plugins/Contacts/www/ios/Contact.js similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/Contacts/www/ios/Contact.js rename to cordova-lib/fixtures-plugman/plugins/Contacts/www/ios/Contact.js diff --git a/cordova-lib/spec-plugman-create/plugins/Contacts/www/ios/contacts.js b/cordova-lib/fixtures-plugman/plugins/Contacts/www/ios/contacts.js similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/Contacts/www/ios/contacts.js rename to cordova-lib/fixtures-plugman/plugins/Contacts/www/ios/contacts.js diff --git a/cordova-lib/spec-plugman-create/plugins/DummyPlugin/android-resource.xml b/cordova-lib/fixtures-plugman/plugins/DummyPlugin/android-resource.xml similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/DummyPlugin/android-resource.xml rename to cordova-lib/fixtures-plugman/plugins/DummyPlugin/android-resource.xml diff --git a/cordova-lib/spec-plugman-create/plugins/DummyPlugin/plugin.xml b/cordova-lib/fixtures-plugman/plugins/DummyPlugin/plugin.xml similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/DummyPlugin/plugin.xml rename to cordova-lib/fixtures-plugman/plugins/DummyPlugin/plugin.xml diff --git a/cordova-lib/spec-plugman-create/plugins/DummyPlugin/src/android/DummyPlugin.java b/cordova-lib/fixtures-plugman/plugins/DummyPlugin/src/android/DummyPlugin.java similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/DummyPlugin/src/android/DummyPlugin.java rename to cordova-lib/fixtures-plugman/plugins/DummyPlugin/src/android/DummyPlugin.java diff --git a/cordova-lib/spec-plugman-create/plugins/DummyPlugin/src/blackberry10/index.js b/cordova-lib/fixtures-plugman/plugins/DummyPlugin/src/blackberry10/index.js similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/DummyPlugin/src/blackberry10/index.js rename to cordova-lib/fixtures-plugman/plugins/DummyPlugin/src/blackberry10/index.js diff --git a/cordova-lib/spec-plugman-create/plugins/DummyPlugin/src/ios/Custom.framework/someFheader.h b/cordova-lib/fixtures-plugman/plugins/DummyPlugin/src/ios/Custom.framework/someFheader.h similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/DummyPlugin/src/ios/Custom.framework/someFheader.h rename to cordova-lib/fixtures-plugman/plugins/DummyPlugin/src/ios/Custom.framework/someFheader.h diff --git a/cordova-lib/spec-plugman-create/plugins/DummyPlugin/src/ios/Custom.framework/somebinlib b/cordova-lib/fixtures-plugman/plugins/DummyPlugin/src/ios/Custom.framework/somebinlib similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/DummyPlugin/src/ios/Custom.framework/somebinlib rename to cordova-lib/fixtures-plugman/plugins/DummyPlugin/src/ios/Custom.framework/somebinlib diff --git a/cordova-lib/spec-plugman-create/plugins/DummyPlugin/src/ios/DummyPlugin.bundle b/cordova-lib/fixtures-plugman/plugins/DummyPlugin/src/ios/DummyPlugin.bundle similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/DummyPlugin/src/ios/DummyPlugin.bundle rename to cordova-lib/fixtures-plugman/plugins/DummyPlugin/src/ios/DummyPlugin.bundle diff --git a/cordova-lib/spec-plugman-create/plugins/DummyPlugin/src/ios/DummyPluginCommand.h b/cordova-lib/fixtures-plugman/plugins/DummyPlugin/src/ios/DummyPluginCommand.h similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/DummyPlugin/src/ios/DummyPluginCommand.h rename to cordova-lib/fixtures-plugman/plugins/DummyPlugin/src/ios/DummyPluginCommand.h diff --git a/cordova-lib/spec-plugman-create/plugins/DummyPlugin/src/ios/DummyPluginCommand.m b/cordova-lib/fixtures-plugman/plugins/DummyPlugin/src/ios/DummyPluginCommand.m similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/DummyPlugin/src/ios/DummyPluginCommand.m rename to cordova-lib/fixtures-plugman/plugins/DummyPlugin/src/ios/DummyPluginCommand.m diff --git a/cordova-lib/spec-plugman-create/plugins/DummyPlugin/src/ios/SourceWithFramework.m b/cordova-lib/fixtures-plugman/plugins/DummyPlugin/src/ios/SourceWithFramework.m similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/DummyPlugin/src/ios/SourceWithFramework.m rename to cordova-lib/fixtures-plugman/plugins/DummyPlugin/src/ios/SourceWithFramework.m diff --git a/cordova-lib/spec-plugman-create/plugins/DummyPlugin/src/ios/TargetDirTest.h b/cordova-lib/fixtures-plugman/plugins/DummyPlugin/src/ios/TargetDirTest.h similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/DummyPlugin/src/ios/TargetDirTest.h rename to cordova-lib/fixtures-plugman/plugins/DummyPlugin/src/ios/TargetDirTest.h diff --git a/cordova-lib/spec-plugman-create/plugins/DummyPlugin/src/ios/TargetDirTest.m b/cordova-lib/fixtures-plugman/plugins/DummyPlugin/src/ios/TargetDirTest.m similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/DummyPlugin/src/ios/TargetDirTest.m rename to cordova-lib/fixtures-plugman/plugins/DummyPlugin/src/ios/TargetDirTest.m diff --git a/cordova-lib/spec-plugman-create/plugins/DummyPlugin/src/ios/libsqlite3.dylib b/cordova-lib/fixtures-plugman/plugins/DummyPlugin/src/ios/libsqlite3.dylib similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/DummyPlugin/src/ios/libsqlite3.dylib rename to cordova-lib/fixtures-plugman/plugins/DummyPlugin/src/ios/libsqlite3.dylib diff --git a/cordova-lib/spec-plugman-create/plugins/DummyPlugin/src/tizen/dummer.js b/cordova-lib/fixtures-plugman/plugins/DummyPlugin/src/tizen/dummer.js similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/DummyPlugin/src/tizen/dummer.js rename to cordova-lib/fixtures-plugman/plugins/DummyPlugin/src/tizen/dummer.js diff --git a/cordova-lib/spec-plugman-create/plugins/DummyPlugin/src/windows8/dummer.js b/cordova-lib/fixtures-plugman/plugins/DummyPlugin/src/windows8/dummer.js similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/DummyPlugin/src/windows8/dummer.js rename to cordova-lib/fixtures-plugman/plugins/DummyPlugin/src/windows8/dummer.js diff --git a/cordova-lib/spec-plugman-create/plugins/DummyPlugin/src/wp7/DummyPlugin.cs b/cordova-lib/fixtures-plugman/plugins/DummyPlugin/src/wp7/DummyPlugin.cs similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/DummyPlugin/src/wp7/DummyPlugin.cs rename to cordova-lib/fixtures-plugman/plugins/DummyPlugin/src/wp7/DummyPlugin.cs diff --git a/cordova-lib/spec-plugman-create/plugins/DummyPlugin/src/wp8/DummyPlugin.cs b/cordova-lib/fixtures-plugman/plugins/DummyPlugin/src/wp8/DummyPlugin.cs similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/DummyPlugin/src/wp8/DummyPlugin.cs rename to cordova-lib/fixtures-plugman/plugins/DummyPlugin/src/wp8/DummyPlugin.cs diff --git a/cordova-lib/spec-plugman-create/plugins/DummyPlugin/www/dummyplugin.js b/cordova-lib/fixtures-plugman/plugins/DummyPlugin/www/dummyplugin.js similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/DummyPlugin/www/dummyplugin.js rename to cordova-lib/fixtures-plugman/plugins/DummyPlugin/www/dummyplugin.js diff --git a/cordova-lib/spec-cordova-project/fixtures/plugins/ChildBrowser/www/childbrowser/image.jpg b/cordova-lib/fixtures-plugman/plugins/DummyPlugin/www/dummyplugin/image.jpg similarity index 100% rename from cordova-lib/spec-cordova-project/fixtures/plugins/ChildBrowser/www/childbrowser/image.jpg rename to cordova-lib/fixtures-plugman/plugins/DummyPlugin/www/dummyplugin/image.jpg diff --git a/cordova-lib/spec-plugman-create/plugins/EnginePlugin/megaBoringVersion b/cordova-lib/fixtures-plugman/plugins/EnginePlugin/megaBoringVersion similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/EnginePlugin/megaBoringVersion rename to cordova-lib/fixtures-plugman/plugins/EnginePlugin/megaBoringVersion diff --git a/cordova-lib/spec-plugman-create/plugins/EnginePlugin/megaFunVersion b/cordova-lib/fixtures-plugman/plugins/EnginePlugin/megaFunVersion similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/EnginePlugin/megaFunVersion rename to cordova-lib/fixtures-plugman/plugins/EnginePlugin/megaFunVersion diff --git a/cordova-lib/spec-plugman-create/plugins/EnginePlugin/plugin.xml b/cordova-lib/fixtures-plugman/plugins/EnginePlugin/plugin.xml similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/EnginePlugin/plugin.xml rename to cordova-lib/fixtures-plugman/plugins/EnginePlugin/plugin.xml diff --git a/cordova-lib/spec-plugman-create/plugins/EnginePluginAndroid/plugin.xml b/cordova-lib/fixtures-plugman/plugins/EnginePluginAndroid/plugin.xml similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/EnginePluginAndroid/plugin.xml rename to cordova-lib/fixtures-plugman/plugins/EnginePluginAndroid/plugin.xml diff --git a/cordova-lib/spec-plugman-create/plugins/EnginePluginiOS/plugin.xml b/cordova-lib/fixtures-plugman/plugins/EnginePluginiOS/plugin.xml similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/EnginePluginiOS/plugin.xml rename to cordova-lib/fixtures-plugman/plugins/EnginePluginiOS/plugin.xml diff --git a/cordova-lib/spec-plugman-create/plugins/FaultyPlugin/plugin.xml b/cordova-lib/fixtures-plugman/plugins/FaultyPlugin/plugin.xml similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/FaultyPlugin/plugin.xml rename to cordova-lib/fixtures-plugman/plugins/FaultyPlugin/plugin.xml diff --git a/cordova-lib/spec-plugman-create/plugins/FaultyPlugin/src/android/FaultyPlugin.java b/cordova-lib/fixtures-plugman/plugins/FaultyPlugin/src/android/FaultyPlugin.java similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/FaultyPlugin/src/android/FaultyPlugin.java rename to cordova-lib/fixtures-plugman/plugins/FaultyPlugin/src/android/FaultyPlugin.java diff --git a/cordova-lib/spec-plugman-create/plugins/FaultyPlugin/src/blackberry10/client.js b/cordova-lib/fixtures-plugman/plugins/FaultyPlugin/src/blackberry10/client.js similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/FaultyPlugin/src/blackberry10/client.js rename to cordova-lib/fixtures-plugman/plugins/FaultyPlugin/src/blackberry10/client.js diff --git a/cordova-lib/spec-plugman-create/plugins/FaultyPlugin/src/ios/FaultyPlugin.h b/cordova-lib/fixtures-plugman/plugins/FaultyPlugin/src/ios/FaultyPlugin.h similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/FaultyPlugin/src/ios/FaultyPlugin.h rename to cordova-lib/fixtures-plugman/plugins/FaultyPlugin/src/ios/FaultyPlugin.h diff --git a/cordova-lib/spec-plugman-create/plugins/FaultyPlugin/src/ios/FaultyPlugin.m b/cordova-lib/fixtures-plugman/plugins/FaultyPlugin/src/ios/FaultyPlugin.m similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/FaultyPlugin/src/ios/FaultyPlugin.m rename to cordova-lib/fixtures-plugman/plugins/FaultyPlugin/src/ios/FaultyPlugin.m diff --git a/cordova-lib/spec-plugman-create/plugins/FaultyPlugin/src/windows8/faultyPlugin.js b/cordova-lib/fixtures-plugman/plugins/FaultyPlugin/src/windows8/faultyPlugin.js similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/FaultyPlugin/src/windows8/faultyPlugin.js rename to cordova-lib/fixtures-plugman/plugins/FaultyPlugin/src/windows8/faultyPlugin.js diff --git a/cordova-lib/spec-plugman-create/plugins/FaultyPlugin/src/wp7/FaultyPlugin.cs b/cordova-lib/fixtures-plugman/plugins/FaultyPlugin/src/wp7/FaultyPlugin.cs similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/FaultyPlugin/src/wp7/FaultyPlugin.cs rename to cordova-lib/fixtures-plugman/plugins/FaultyPlugin/src/wp7/FaultyPlugin.cs diff --git a/cordova-lib/spec-plugman-create/plugins/FaultyPlugin/src/wp8/FaultyPlugin.cs b/cordova-lib/fixtures-plugman/plugins/FaultyPlugin/src/wp8/FaultyPlugin.cs similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/FaultyPlugin/src/wp8/FaultyPlugin.cs rename to cordova-lib/fixtures-plugman/plugins/FaultyPlugin/src/wp8/FaultyPlugin.cs diff --git a/cordova-lib/spec-plugman-create/plugins/VariablePlugin/plugin.xml b/cordova-lib/fixtures-plugman/plugins/VariablePlugin/plugin.xml similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/VariablePlugin/plugin.xml rename to cordova-lib/fixtures-plugman/plugins/VariablePlugin/plugin.xml diff --git a/cordova-lib/spec-plugman-create/plugins/WebNotifications/plugin.xml b/cordova-lib/fixtures-plugman/plugins/WebNotifications/plugin.xml similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/WebNotifications/plugin.xml rename to cordova-lib/fixtures-plugman/plugins/WebNotifications/plugin.xml diff --git a/cordova-lib/spec-plugman-create/plugins/WebNotifications/src/ios/AppDelegate.m.diff b/cordova-lib/fixtures-plugman/plugins/WebNotifications/src/ios/AppDelegate.m.diff similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/WebNotifications/src/ios/AppDelegate.m.diff rename to cordova-lib/fixtures-plugman/plugins/WebNotifications/src/ios/AppDelegate.m.diff diff --git a/cordova-lib/spec-plugman-create/plugins/WebNotifications/src/ios/WebNotifications.h b/cordova-lib/fixtures-plugman/plugins/WebNotifications/src/ios/WebNotifications.h similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/WebNotifications/src/ios/WebNotifications.h rename to cordova-lib/fixtures-plugman/plugins/WebNotifications/src/ios/WebNotifications.h diff --git a/cordova-lib/spec-plugman-create/plugins/WebNotifications/src/ios/WebNotifications.m b/cordova-lib/fixtures-plugman/plugins/WebNotifications/src/ios/WebNotifications.m similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/WebNotifications/src/ios/WebNotifications.m rename to cordova-lib/fixtures-plugman/plugins/WebNotifications/src/ios/WebNotifications.m diff --git a/cordova-lib/spec-plugman-create/plugins/WebNotifications/www/webnotifications.js b/cordova-lib/fixtures-plugman/plugins/WebNotifications/www/webnotifications.js similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/WebNotifications/www/webnotifications.js rename to cordova-lib/fixtures-plugman/plugins/WebNotifications/www/webnotifications.js diff --git a/cordova-lib/spec-plugman-create/plugins/WeblessPlugin/plugin.xml b/cordova-lib/fixtures-plugman/plugins/WeblessPlugin/plugin.xml similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/WeblessPlugin/plugin.xml rename to cordova-lib/fixtures-plugman/plugins/WeblessPlugin/plugin.xml diff --git a/cordova-lib/spec-plugman-create/plugins/WeblessPlugin/src/android/WeblessPlugin.java b/cordova-lib/fixtures-plugman/plugins/WeblessPlugin/src/android/WeblessPlugin.java similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/WeblessPlugin/src/android/WeblessPlugin.java rename to cordova-lib/fixtures-plugman/plugins/WeblessPlugin/src/android/WeblessPlugin.java diff --git a/cordova-lib/spec-plugman-create/plugins/WeblessPlugin/src/ios/WeblessPlugin.bundle/arrow_left.png b/cordova-lib/fixtures-plugman/plugins/WeblessPlugin/src/ios/WeblessPlugin.bundle/arrow_left.png similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/WeblessPlugin/src/ios/WeblessPlugin.bundle/arrow_left.png rename to cordova-lib/fixtures-plugman/plugins/WeblessPlugin/src/ios/WeblessPlugin.bundle/arrow_left.png diff --git a/cordova-lib/spec-plugman-create/plugins/WeblessPlugin/src/ios/WeblessPlugin.bundle/arrow_left@2x.png b/cordova-lib/fixtures-plugman/plugins/WeblessPlugin/src/ios/WeblessPlugin.bundle/arrow_left@2x.png similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/WeblessPlugin/src/ios/WeblessPlugin.bundle/arrow_left@2x.png rename to cordova-lib/fixtures-plugman/plugins/WeblessPlugin/src/ios/WeblessPlugin.bundle/arrow_left@2x.png diff --git a/cordova-lib/spec-plugman-create/plugins/WeblessPlugin/src/ios/WeblessPlugin.bundle/arrow_right.png b/cordova-lib/fixtures-plugman/plugins/WeblessPlugin/src/ios/WeblessPlugin.bundle/arrow_right.png similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/WeblessPlugin/src/ios/WeblessPlugin.bundle/arrow_right.png rename to cordova-lib/fixtures-plugman/plugins/WeblessPlugin/src/ios/WeblessPlugin.bundle/arrow_right.png diff --git a/cordova-lib/spec-plugman-create/plugins/WeblessPlugin/src/ios/WeblessPlugin.bundle/arrow_right@2x.png b/cordova-lib/fixtures-plugman/plugins/WeblessPlugin/src/ios/WeblessPlugin.bundle/arrow_right@2x.png similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/WeblessPlugin/src/ios/WeblessPlugin.bundle/arrow_right@2x.png rename to cordova-lib/fixtures-plugman/plugins/WeblessPlugin/src/ios/WeblessPlugin.bundle/arrow_right@2x.png diff --git a/cordova-lib/spec-plugman-create/plugins/WeblessPlugin/src/ios/WeblessPlugin.bundle/but_refresh.png b/cordova-lib/fixtures-plugman/plugins/WeblessPlugin/src/ios/WeblessPlugin.bundle/but_refresh.png similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/WeblessPlugin/src/ios/WeblessPlugin.bundle/but_refresh.png rename to cordova-lib/fixtures-plugman/plugins/WeblessPlugin/src/ios/WeblessPlugin.bundle/but_refresh.png diff --git a/cordova-lib/spec-plugman-create/plugins/WeblessPlugin/src/ios/WeblessPlugin.bundle/but_refresh@2x.png b/cordova-lib/fixtures-plugman/plugins/WeblessPlugin/src/ios/WeblessPlugin.bundle/but_refresh@2x.png similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/WeblessPlugin/src/ios/WeblessPlugin.bundle/but_refresh@2x.png rename to cordova-lib/fixtures-plugman/plugins/WeblessPlugin/src/ios/WeblessPlugin.bundle/but_refresh@2x.png diff --git a/cordova-lib/spec-plugman-create/plugins/WeblessPlugin/src/ios/WeblessPlugin.bundle/compass.png b/cordova-lib/fixtures-plugman/plugins/WeblessPlugin/src/ios/WeblessPlugin.bundle/compass.png similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/WeblessPlugin/src/ios/WeblessPlugin.bundle/compass.png rename to cordova-lib/fixtures-plugman/plugins/WeblessPlugin/src/ios/WeblessPlugin.bundle/compass.png diff --git a/cordova-lib/spec-plugman-create/plugins/WeblessPlugin/src/ios/WeblessPlugin.bundle/compass@2x.png b/cordova-lib/fixtures-plugman/plugins/WeblessPlugin/src/ios/WeblessPlugin.bundle/compass@2x.png similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/WeblessPlugin/src/ios/WeblessPlugin.bundle/compass@2x.png rename to cordova-lib/fixtures-plugman/plugins/WeblessPlugin/src/ios/WeblessPlugin.bundle/compass@2x.png diff --git a/cordova-lib/spec-plugman-create/plugins/WeblessPlugin/src/ios/WeblessPluginCommand.h b/cordova-lib/fixtures-plugman/plugins/WeblessPlugin/src/ios/WeblessPluginCommand.h similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/WeblessPlugin/src/ios/WeblessPluginCommand.h rename to cordova-lib/fixtures-plugman/plugins/WeblessPlugin/src/ios/WeblessPluginCommand.h diff --git a/cordova-lib/spec-plugman-create/plugins/WeblessPlugin/src/ios/WeblessPluginCommand.m b/cordova-lib/fixtures-plugman/plugins/WeblessPlugin/src/ios/WeblessPluginCommand.m similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/WeblessPlugin/src/ios/WeblessPluginCommand.m rename to cordova-lib/fixtures-plugman/plugins/WeblessPlugin/src/ios/WeblessPluginCommand.m diff --git a/cordova-lib/spec-plugman-create/plugins/WeblessPlugin/src/ios/WeblessPluginViewController.h b/cordova-lib/fixtures-plugman/plugins/WeblessPlugin/src/ios/WeblessPluginViewController.h similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/WeblessPlugin/src/ios/WeblessPluginViewController.h rename to cordova-lib/fixtures-plugman/plugins/WeblessPlugin/src/ios/WeblessPluginViewController.h diff --git a/cordova-lib/spec-plugman-create/plugins/WeblessPlugin/src/ios/WeblessPluginViewController.m b/cordova-lib/fixtures-plugman/plugins/WeblessPlugin/src/ios/WeblessPluginViewController.m similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/WeblessPlugin/src/ios/WeblessPluginViewController.m rename to cordova-lib/fixtures-plugman/plugins/WeblessPlugin/src/ios/WeblessPluginViewController.m diff --git a/cordova-lib/spec-plugman-create/plugins/WeblessPlugin/src/ios/WeblessPluginViewController.xib b/cordova-lib/fixtures-plugman/plugins/WeblessPlugin/src/ios/WeblessPluginViewController.xib similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/WeblessPlugin/src/ios/WeblessPluginViewController.xib rename to cordova-lib/fixtures-plugman/plugins/WeblessPlugin/src/ios/WeblessPluginViewController.xib diff --git a/cordova-lib/spec-plugman-create/plugins/cordova.echo/.gitignore b/cordova-lib/fixtures-plugman/plugins/cordova.echo/.gitignore similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/cordova.echo/.gitignore rename to cordova-lib/fixtures-plugman/plugins/cordova.echo/.gitignore diff --git a/cordova-lib/spec-plugman-create/plugins/cordova.echo/plugin.xml b/cordova-lib/fixtures-plugman/plugins/cordova.echo/plugin.xml similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/cordova.echo/plugin.xml rename to cordova-lib/fixtures-plugman/plugins/cordova.echo/plugin.xml diff --git a/cordova-lib/spec-plugman-create/plugins/cordova.echo/src/blackberry10/index.js b/cordova-lib/fixtures-plugman/plugins/cordova.echo/src/blackberry10/index.js similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/cordova.echo/src/blackberry10/index.js rename to cordova-lib/fixtures-plugman/plugins/cordova.echo/src/blackberry10/index.js diff --git a/cordova-lib/spec-plugman-create/plugins/cordova.echo/src/blackberry10/native/device/echoJnext.so b/cordova-lib/fixtures-plugman/plugins/cordova.echo/src/blackberry10/native/device/echoJnext.so similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/cordova.echo/src/blackberry10/native/device/echoJnext.so rename to cordova-lib/fixtures-plugman/plugins/cordova.echo/src/blackberry10/native/device/echoJnext.so diff --git a/cordova-lib/spec-plugman-create/plugins/cordova.echo/src/blackberry10/native/public/json/autolink.h b/cordova-lib/fixtures-plugman/plugins/cordova.echo/src/blackberry10/native/public/json/autolink.h similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/cordova.echo/src/blackberry10/native/public/json/autolink.h rename to cordova-lib/fixtures-plugman/plugins/cordova.echo/src/blackberry10/native/public/json/autolink.h diff --git a/cordova-lib/spec-plugman-create/plugins/cordova.echo/src/blackberry10/native/public/json/config.h b/cordova-lib/fixtures-plugman/plugins/cordova.echo/src/blackberry10/native/public/json/config.h similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/cordova.echo/src/blackberry10/native/public/json/config.h rename to cordova-lib/fixtures-plugman/plugins/cordova.echo/src/blackberry10/native/public/json/config.h diff --git a/cordova-lib/spec-plugman-create/plugins/cordova.echo/src/blackberry10/native/public/json/features.h b/cordova-lib/fixtures-plugman/plugins/cordova.echo/src/blackberry10/native/public/json/features.h similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/cordova.echo/src/blackberry10/native/public/json/features.h rename to cordova-lib/fixtures-plugman/plugins/cordova.echo/src/blackberry10/native/public/json/features.h diff --git a/cordova-lib/spec-plugman-create/plugins/cordova.echo/src/blackberry10/native/public/json/forwards.h b/cordova-lib/fixtures-plugman/plugins/cordova.echo/src/blackberry10/native/public/json/forwards.h similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/cordova.echo/src/blackberry10/native/public/json/forwards.h rename to cordova-lib/fixtures-plugman/plugins/cordova.echo/src/blackberry10/native/public/json/forwards.h diff --git a/cordova-lib/spec-plugman-create/plugins/cordova.echo/src/blackberry10/native/public/json/json.h b/cordova-lib/fixtures-plugman/plugins/cordova.echo/src/blackberry10/native/public/json/json.h similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/cordova.echo/src/blackberry10/native/public/json/json.h rename to cordova-lib/fixtures-plugman/plugins/cordova.echo/src/blackberry10/native/public/json/json.h diff --git a/cordova-lib/spec-plugman-create/plugins/cordova.echo/src/blackberry10/native/public/json/reader.h b/cordova-lib/fixtures-plugman/plugins/cordova.echo/src/blackberry10/native/public/json/reader.h similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/cordova.echo/src/blackberry10/native/public/json/reader.h rename to cordova-lib/fixtures-plugman/plugins/cordova.echo/src/blackberry10/native/public/json/reader.h diff --git a/cordova-lib/spec-plugman-create/plugins/cordova.echo/src/blackberry10/native/public/json/value.h b/cordova-lib/fixtures-plugman/plugins/cordova.echo/src/blackberry10/native/public/json/value.h similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/cordova.echo/src/blackberry10/native/public/json/value.h rename to cordova-lib/fixtures-plugman/plugins/cordova.echo/src/blackberry10/native/public/json/value.h diff --git a/cordova-lib/spec-plugman-create/plugins/cordova.echo/src/blackberry10/native/public/json/writer.h b/cordova-lib/fixtures-plugman/plugins/cordova.echo/src/blackberry10/native/public/json/writer.h similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/cordova.echo/src/blackberry10/native/public/json/writer.h rename to cordova-lib/fixtures-plugman/plugins/cordova.echo/src/blackberry10/native/public/json/writer.h diff --git a/cordova-lib/spec-plugman-create/plugins/cordova.echo/src/blackberry10/native/public/json_batchallocator.h b/cordova-lib/fixtures-plugman/plugins/cordova.echo/src/blackberry10/native/public/json_batchallocator.h similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/cordova.echo/src/blackberry10/native/public/json_batchallocator.h rename to cordova-lib/fixtures-plugman/plugins/cordova.echo/src/blackberry10/native/public/json_batchallocator.h diff --git a/cordova-lib/spec-plugman-create/plugins/cordova.echo/src/blackberry10/native/public/json_internalarray.inl b/cordova-lib/fixtures-plugman/plugins/cordova.echo/src/blackberry10/native/public/json_internalarray.inl similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/cordova.echo/src/blackberry10/native/public/json_internalarray.inl rename to cordova-lib/fixtures-plugman/plugins/cordova.echo/src/blackberry10/native/public/json_internalarray.inl diff --git a/cordova-lib/spec-plugman-create/plugins/cordova.echo/src/blackberry10/native/public/json_internalmap.inl b/cordova-lib/fixtures-plugman/plugins/cordova.echo/src/blackberry10/native/public/json_internalmap.inl similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/cordova.echo/src/blackberry10/native/public/json_internalmap.inl rename to cordova-lib/fixtures-plugman/plugins/cordova.echo/src/blackberry10/native/public/json_internalmap.inl diff --git a/cordova-lib/spec-plugman-create/plugins/cordova.echo/src/blackberry10/native/public/json_reader.cpp b/cordova-lib/fixtures-plugman/plugins/cordova.echo/src/blackberry10/native/public/json_reader.cpp similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/cordova.echo/src/blackberry10/native/public/json_reader.cpp rename to cordova-lib/fixtures-plugman/plugins/cordova.echo/src/blackberry10/native/public/json_reader.cpp diff --git a/cordova-lib/spec-plugman-create/plugins/cordova.echo/src/blackberry10/native/public/json_value.cpp b/cordova-lib/fixtures-plugman/plugins/cordova.echo/src/blackberry10/native/public/json_value.cpp similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/cordova.echo/src/blackberry10/native/public/json_value.cpp rename to cordova-lib/fixtures-plugman/plugins/cordova.echo/src/blackberry10/native/public/json_value.cpp diff --git a/cordova-lib/spec-plugman-create/plugins/cordova.echo/src/blackberry10/native/public/json_valueiterator.inl b/cordova-lib/fixtures-plugman/plugins/cordova.echo/src/blackberry10/native/public/json_valueiterator.inl similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/cordova.echo/src/blackberry10/native/public/json_valueiterator.inl rename to cordova-lib/fixtures-plugman/plugins/cordova.echo/src/blackberry10/native/public/json_valueiterator.inl diff --git a/cordova-lib/spec-plugman-create/plugins/cordova.echo/src/blackberry10/native/public/json_writer.cpp b/cordova-lib/fixtures-plugman/plugins/cordova.echo/src/blackberry10/native/public/json_writer.cpp similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/cordova.echo/src/blackberry10/native/public/json_writer.cpp rename to cordova-lib/fixtures-plugman/plugins/cordova.echo/src/blackberry10/native/public/json_writer.cpp diff --git a/cordova-lib/spec-plugman-create/plugins/cordova.echo/src/blackberry10/native/public/plugin.cpp b/cordova-lib/fixtures-plugman/plugins/cordova.echo/src/blackberry10/native/public/plugin.cpp similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/cordova.echo/src/blackberry10/native/public/plugin.cpp rename to cordova-lib/fixtures-plugman/plugins/cordova.echo/src/blackberry10/native/public/plugin.cpp diff --git a/cordova-lib/spec-plugman-create/plugins/cordova.echo/src/blackberry10/native/public/plugin.h b/cordova-lib/fixtures-plugman/plugins/cordova.echo/src/blackberry10/native/public/plugin.h similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/cordova.echo/src/blackberry10/native/public/plugin.h rename to cordova-lib/fixtures-plugman/plugins/cordova.echo/src/blackberry10/native/public/plugin.h diff --git a/cordova-lib/spec-plugman-create/plugins/cordova.echo/src/blackberry10/native/public/tokenizer.cpp b/cordova-lib/fixtures-plugman/plugins/cordova.echo/src/blackberry10/native/public/tokenizer.cpp similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/cordova.echo/src/blackberry10/native/public/tokenizer.cpp rename to cordova-lib/fixtures-plugman/plugins/cordova.echo/src/blackberry10/native/public/tokenizer.cpp diff --git a/cordova-lib/spec-plugman-create/plugins/cordova.echo/src/blackberry10/native/public/tokenizer.h b/cordova-lib/fixtures-plugman/plugins/cordova.echo/src/blackberry10/native/public/tokenizer.h similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/cordova.echo/src/blackberry10/native/public/tokenizer.h rename to cordova-lib/fixtures-plugman/plugins/cordova.echo/src/blackberry10/native/public/tokenizer.h diff --git a/cordova-lib/spec-plugman-create/plugins/cordova.echo/src/blackberry10/native/simulator/echoJnext.so b/cordova-lib/fixtures-plugman/plugins/cordova.echo/src/blackberry10/native/simulator/echoJnext.so similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/cordova.echo/src/blackberry10/native/simulator/echoJnext.so rename to cordova-lib/fixtures-plugman/plugins/cordova.echo/src/blackberry10/native/simulator/echoJnext.so diff --git a/cordova-lib/spec-plugman-create/plugins/cordova.echo/src/blackberry10/native/src/echo.cpp b/cordova-lib/fixtures-plugman/plugins/cordova.echo/src/blackberry10/native/src/echo.cpp similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/cordova.echo/src/blackberry10/native/src/echo.cpp rename to cordova-lib/fixtures-plugman/plugins/cordova.echo/src/blackberry10/native/src/echo.cpp diff --git a/cordova-lib/spec-plugman-create/plugins/cordova.echo/src/blackberry10/native/src/echo.hpp b/cordova-lib/fixtures-plugman/plugins/cordova.echo/src/blackberry10/native/src/echo.hpp similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/cordova.echo/src/blackberry10/native/src/echo.hpp rename to cordova-lib/fixtures-plugman/plugins/cordova.echo/src/blackberry10/native/src/echo.hpp diff --git a/cordova-lib/spec-plugman-create/plugins/cordova.echo/www/client.js b/cordova-lib/fixtures-plugman/plugins/cordova.echo/www/client.js similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/cordova.echo/www/client.js rename to cordova-lib/fixtures-plugman/plugins/cordova.echo/www/client.js diff --git a/cordova-lib/spec-plugman-create/plugins/dependencies/A/plugin.xml b/cordova-lib/fixtures-plugman/plugins/dependencies/A/plugin.xml similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/dependencies/A/plugin.xml rename to cordova-lib/fixtures-plugman/plugins/dependencies/A/plugin.xml diff --git a/cordova-lib/spec-plugman-create/plugins/dependencies/A/src/android/A.java b/cordova-lib/fixtures-plugman/plugins/dependencies/A/src/android/A.java similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/dependencies/A/src/android/A.java rename to cordova-lib/fixtures-plugman/plugins/dependencies/A/src/android/A.java diff --git a/cordova-lib/spec-plugman-create/plugins/dependencies/A/src/ios/APluginCommand.h b/cordova-lib/fixtures-plugman/plugins/dependencies/A/src/ios/APluginCommand.h similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/dependencies/A/src/ios/APluginCommand.h rename to cordova-lib/fixtures-plugman/plugins/dependencies/A/src/ios/APluginCommand.h diff --git a/cordova-lib/spec-plugman-create/plugins/dependencies/A/src/ios/APluginCommand.m b/cordova-lib/fixtures-plugman/plugins/dependencies/A/src/ios/APluginCommand.m similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/dependencies/A/src/ios/APluginCommand.m rename to cordova-lib/fixtures-plugman/plugins/dependencies/A/src/ios/APluginCommand.m diff --git a/cordova-lib/spec-plugman-create/plugins/dependencies/A/www/plugin-a.js b/cordova-lib/fixtures-plugman/plugins/dependencies/A/www/plugin-a.js similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/dependencies/A/www/plugin-a.js rename to cordova-lib/fixtures-plugman/plugins/dependencies/A/www/plugin-a.js diff --git a/cordova-lib/spec-plugman-create/plugins/dependencies/B/plugin.xml b/cordova-lib/fixtures-plugman/plugins/dependencies/B/plugin.xml similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/dependencies/B/plugin.xml rename to cordova-lib/fixtures-plugman/plugins/dependencies/B/plugin.xml diff --git a/cordova-lib/spec-plugman-create/plugins/dependencies/B/src/android/B.java b/cordova-lib/fixtures-plugman/plugins/dependencies/B/src/android/B.java similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/dependencies/B/src/android/B.java rename to cordova-lib/fixtures-plugman/plugins/dependencies/B/src/android/B.java diff --git a/cordova-lib/spec-plugman-create/plugins/dependencies/B/src/ios/BPluginCommand.h b/cordova-lib/fixtures-plugman/plugins/dependencies/B/src/ios/BPluginCommand.h similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/dependencies/B/src/ios/BPluginCommand.h rename to cordova-lib/fixtures-plugman/plugins/dependencies/B/src/ios/BPluginCommand.h diff --git a/cordova-lib/spec-plugman-create/plugins/dependencies/B/src/ios/BPluginCommand.m b/cordova-lib/fixtures-plugman/plugins/dependencies/B/src/ios/BPluginCommand.m similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/dependencies/B/src/ios/BPluginCommand.m rename to cordova-lib/fixtures-plugman/plugins/dependencies/B/src/ios/BPluginCommand.m diff --git a/cordova-lib/spec-plugman-create/plugins/dependencies/B/www/plugin-b.js b/cordova-lib/fixtures-plugman/plugins/dependencies/B/www/plugin-b.js similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/dependencies/B/www/plugin-b.js rename to cordova-lib/fixtures-plugman/plugins/dependencies/B/www/plugin-b.js diff --git a/cordova-lib/spec-plugman-create/plugins/dependencies/C/plugin.xml b/cordova-lib/fixtures-plugman/plugins/dependencies/C/plugin.xml similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/dependencies/C/plugin.xml rename to cordova-lib/fixtures-plugman/plugins/dependencies/C/plugin.xml diff --git a/cordova-lib/spec-plugman-create/plugins/dependencies/C/src/android/C.java b/cordova-lib/fixtures-plugman/plugins/dependencies/C/src/android/C.java similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/dependencies/C/src/android/C.java rename to cordova-lib/fixtures-plugman/plugins/dependencies/C/src/android/C.java diff --git a/cordova-lib/spec-plugman-create/plugins/dependencies/C/src/ios/CPluginCommand.h b/cordova-lib/fixtures-plugman/plugins/dependencies/C/src/ios/CPluginCommand.h similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/dependencies/C/src/ios/CPluginCommand.h rename to cordova-lib/fixtures-plugman/plugins/dependencies/C/src/ios/CPluginCommand.h diff --git a/cordova-lib/spec-plugman-create/plugins/dependencies/C/src/ios/CPluginCommand.m b/cordova-lib/fixtures-plugman/plugins/dependencies/C/src/ios/CPluginCommand.m similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/dependencies/C/src/ios/CPluginCommand.m rename to cordova-lib/fixtures-plugman/plugins/dependencies/C/src/ios/CPluginCommand.m diff --git a/cordova-lib/spec-plugman-create/plugins/dependencies/C/www/plugin-c.js b/cordova-lib/fixtures-plugman/plugins/dependencies/C/www/plugin-c.js similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/dependencies/C/www/plugin-c.js rename to cordova-lib/fixtures-plugman/plugins/dependencies/C/www/plugin-c.js diff --git a/cordova-lib/spec-plugman-create/plugins/dependencies/D/plugin.xml b/cordova-lib/fixtures-plugman/plugins/dependencies/D/plugin.xml similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/dependencies/D/plugin.xml rename to cordova-lib/fixtures-plugman/plugins/dependencies/D/plugin.xml diff --git a/cordova-lib/spec-plugman-create/plugins/dependencies/D/src/android/D.java b/cordova-lib/fixtures-plugman/plugins/dependencies/D/src/android/D.java similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/dependencies/D/src/android/D.java rename to cordova-lib/fixtures-plugman/plugins/dependencies/D/src/android/D.java diff --git a/cordova-lib/spec-plugman-create/plugins/dependencies/D/src/ios/DPluginCommand.h b/cordova-lib/fixtures-plugman/plugins/dependencies/D/src/ios/DPluginCommand.h similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/dependencies/D/src/ios/DPluginCommand.h rename to cordova-lib/fixtures-plugman/plugins/dependencies/D/src/ios/DPluginCommand.h diff --git a/cordova-lib/spec-plugman-create/plugins/dependencies/D/src/ios/DPluginCommand.m b/cordova-lib/fixtures-plugman/plugins/dependencies/D/src/ios/DPluginCommand.m similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/dependencies/D/src/ios/DPluginCommand.m rename to cordova-lib/fixtures-plugman/plugins/dependencies/D/src/ios/DPluginCommand.m diff --git a/cordova-lib/spec-plugman-create/plugins/dependencies/D/www/plugin-d.js b/cordova-lib/fixtures-plugman/plugins/dependencies/D/www/plugin-d.js similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/dependencies/D/www/plugin-d.js rename to cordova-lib/fixtures-plugman/plugins/dependencies/D/www/plugin-d.js diff --git a/cordova-lib/spec-plugman-create/plugins/dependencies/E/plugin.xml b/cordova-lib/fixtures-plugman/plugins/dependencies/E/plugin.xml similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/dependencies/E/plugin.xml rename to cordova-lib/fixtures-plugman/plugins/dependencies/E/plugin.xml diff --git a/cordova-lib/spec-plugman-create/plugins/dependencies/E/src/android/E.java b/cordova-lib/fixtures-plugman/plugins/dependencies/E/src/android/E.java similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/dependencies/E/src/android/E.java rename to cordova-lib/fixtures-plugman/plugins/dependencies/E/src/android/E.java diff --git a/cordova-lib/spec-plugman-create/plugins/dependencies/E/src/ios/EPluginCommand.h b/cordova-lib/fixtures-plugman/plugins/dependencies/E/src/ios/EPluginCommand.h similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/dependencies/E/src/ios/EPluginCommand.h rename to cordova-lib/fixtures-plugman/plugins/dependencies/E/src/ios/EPluginCommand.h diff --git a/cordova-lib/spec-plugman-create/plugins/dependencies/E/src/ios/EPluginCommand.m b/cordova-lib/fixtures-plugman/plugins/dependencies/E/src/ios/EPluginCommand.m similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/dependencies/E/src/ios/EPluginCommand.m rename to cordova-lib/fixtures-plugman/plugins/dependencies/E/src/ios/EPluginCommand.m diff --git a/cordova-lib/spec-plugman-create/plugins/dependencies/E/www/plugin-d.js b/cordova-lib/fixtures-plugman/plugins/dependencies/E/www/plugin-d.js similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/dependencies/E/www/plugin-d.js rename to cordova-lib/fixtures-plugman/plugins/dependencies/E/www/plugin-d.js diff --git a/cordova-lib/spec-plugman-create/plugins/dependencies/F/plugin.xml b/cordova-lib/fixtures-plugman/plugins/dependencies/F/plugin.xml similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/dependencies/F/plugin.xml rename to cordova-lib/fixtures-plugman/plugins/dependencies/F/plugin.xml diff --git a/cordova-lib/spec-plugman-create/plugins/dependencies/F/src/android/F.java b/cordova-lib/fixtures-plugman/plugins/dependencies/F/src/android/F.java similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/dependencies/F/src/android/F.java rename to cordova-lib/fixtures-plugman/plugins/dependencies/F/src/android/F.java diff --git a/cordova-lib/spec-plugman-create/plugins/dependencies/F/src/ios/FPluginCommand.h b/cordova-lib/fixtures-plugman/plugins/dependencies/F/src/ios/FPluginCommand.h similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/dependencies/F/src/ios/FPluginCommand.h rename to cordova-lib/fixtures-plugman/plugins/dependencies/F/src/ios/FPluginCommand.h diff --git a/cordova-lib/spec-plugman-create/plugins/dependencies/F/src/ios/FPluginCommand.m b/cordova-lib/fixtures-plugman/plugins/dependencies/F/src/ios/FPluginCommand.m similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/dependencies/F/src/ios/FPluginCommand.m rename to cordova-lib/fixtures-plugman/plugins/dependencies/F/src/ios/FPluginCommand.m diff --git a/cordova-lib/spec-plugman-create/plugins/dependencies/F/www/plugin-f.js b/cordova-lib/fixtures-plugman/plugins/dependencies/F/www/plugin-f.js similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/dependencies/F/www/plugin-f.js rename to cordova-lib/fixtures-plugman/plugins/dependencies/F/www/plugin-f.js diff --git a/cordova-lib/spec-plugman-create/plugins/dependencies/G/plugin.xml b/cordova-lib/fixtures-plugman/plugins/dependencies/G/plugin.xml similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/dependencies/G/plugin.xml rename to cordova-lib/fixtures-plugman/plugins/dependencies/G/plugin.xml diff --git a/cordova-lib/spec-plugman-create/plugins/dependencies/G/src/android/G.java b/cordova-lib/fixtures-plugman/plugins/dependencies/G/src/android/G.java similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/dependencies/G/src/android/G.java rename to cordova-lib/fixtures-plugman/plugins/dependencies/G/src/android/G.java diff --git a/cordova-lib/spec-plugman-create/plugins/dependencies/G/src/ios/EPluginCommand.m b/cordova-lib/fixtures-plugman/plugins/dependencies/G/src/ios/EPluginCommand.m similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/dependencies/G/src/ios/EPluginCommand.m rename to cordova-lib/fixtures-plugman/plugins/dependencies/G/src/ios/EPluginCommand.m diff --git a/cordova-lib/spec-plugman-create/plugins/dependencies/G/src/ios/GPluginCommand.h b/cordova-lib/fixtures-plugman/plugins/dependencies/G/src/ios/GPluginCommand.h similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/dependencies/G/src/ios/GPluginCommand.h rename to cordova-lib/fixtures-plugman/plugins/dependencies/G/src/ios/GPluginCommand.h diff --git a/cordova-lib/spec-plugman-create/plugins/dependencies/G/www/plugin-g.js b/cordova-lib/fixtures-plugman/plugins/dependencies/G/www/plugin-g.js similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/dependencies/G/www/plugin-g.js rename to cordova-lib/fixtures-plugman/plugins/dependencies/G/www/plugin-g.js diff --git a/cordova-lib/spec-plugman-create/plugins/dependencies/H/plugin.xml b/cordova-lib/fixtures-plugman/plugins/dependencies/H/plugin.xml similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/dependencies/H/plugin.xml rename to cordova-lib/fixtures-plugman/plugins/dependencies/H/plugin.xml diff --git a/cordova-lib/spec-plugman-create/plugins/dependencies/H/src/android/H.java b/cordova-lib/fixtures-plugman/plugins/dependencies/H/src/android/H.java similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/dependencies/H/src/android/H.java rename to cordova-lib/fixtures-plugman/plugins/dependencies/H/src/android/H.java diff --git a/cordova-lib/spec-plugman-create/plugins/dependencies/H/src/ios/HPluginCommand.h b/cordova-lib/fixtures-plugman/plugins/dependencies/H/src/ios/HPluginCommand.h similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/dependencies/H/src/ios/HPluginCommand.h rename to cordova-lib/fixtures-plugman/plugins/dependencies/H/src/ios/HPluginCommand.h diff --git a/cordova-lib/spec-plugman-create/plugins/dependencies/H/src/ios/HPluginCommand.m b/cordova-lib/fixtures-plugman/plugins/dependencies/H/src/ios/HPluginCommand.m similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/dependencies/H/src/ios/HPluginCommand.m rename to cordova-lib/fixtures-plugman/plugins/dependencies/H/src/ios/HPluginCommand.m diff --git a/cordova-lib/spec-plugman-create/plugins/dependencies/H/www/plugin-h.js b/cordova-lib/fixtures-plugman/plugins/dependencies/H/www/plugin-h.js similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/dependencies/H/www/plugin-h.js rename to cordova-lib/fixtures-plugman/plugins/dependencies/H/www/plugin-h.js diff --git a/cordova-lib/spec-plugman-create/plugins/dependencies/README.md b/cordova-lib/fixtures-plugman/plugins/dependencies/README.md similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/dependencies/README.md rename to cordova-lib/fixtures-plugman/plugins/dependencies/README.md diff --git a/cordova-lib/spec-plugman-create/plugins/dependencies/meta/D/plugin.xml b/cordova-lib/fixtures-plugman/plugins/dependencies/meta/D/plugin.xml similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/dependencies/meta/D/plugin.xml rename to cordova-lib/fixtures-plugman/plugins/dependencies/meta/D/plugin.xml diff --git a/cordova-lib/spec-plugman-create/plugins/dependencies/meta/D/src/android/D.java b/cordova-lib/fixtures-plugman/plugins/dependencies/meta/D/src/android/D.java similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/dependencies/meta/D/src/android/D.java rename to cordova-lib/fixtures-plugman/plugins/dependencies/meta/D/src/android/D.java diff --git a/cordova-lib/spec-plugman-create/plugins/dependencies/meta/D/src/ios/DPluginCommand.h b/cordova-lib/fixtures-plugman/plugins/dependencies/meta/D/src/ios/DPluginCommand.h similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/dependencies/meta/D/src/ios/DPluginCommand.h rename to cordova-lib/fixtures-plugman/plugins/dependencies/meta/D/src/ios/DPluginCommand.h diff --git a/cordova-lib/spec-plugman-create/plugins/dependencies/meta/D/src/ios/DPluginCommand.m b/cordova-lib/fixtures-plugman/plugins/dependencies/meta/D/src/ios/DPluginCommand.m similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/dependencies/meta/D/src/ios/DPluginCommand.m rename to cordova-lib/fixtures-plugman/plugins/dependencies/meta/D/src/ios/DPluginCommand.m diff --git a/cordova-lib/spec-plugman-create/plugins/dependencies/meta/D/www/plugin-d.js b/cordova-lib/fixtures-plugman/plugins/dependencies/meta/D/www/plugin-d.js similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/dependencies/meta/D/www/plugin-d.js rename to cordova-lib/fixtures-plugman/plugins/dependencies/meta/D/www/plugin-d.js diff --git a/cordova-lib/spec-plugman-create/plugins/dependencies/meta/subdir/E/plugin.xml b/cordova-lib/fixtures-plugman/plugins/dependencies/meta/subdir/E/plugin.xml similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/dependencies/meta/subdir/E/plugin.xml rename to cordova-lib/fixtures-plugman/plugins/dependencies/meta/subdir/E/plugin.xml diff --git a/cordova-lib/spec-plugman-create/plugins/dependencies/meta/subdir/E/src/android/E.java b/cordova-lib/fixtures-plugman/plugins/dependencies/meta/subdir/E/src/android/E.java similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/dependencies/meta/subdir/E/src/android/E.java rename to cordova-lib/fixtures-plugman/plugins/dependencies/meta/subdir/E/src/android/E.java diff --git a/cordova-lib/spec-plugman-create/plugins/dependencies/meta/subdir/E/src/ios/EPluginCommand.h b/cordova-lib/fixtures-plugman/plugins/dependencies/meta/subdir/E/src/ios/EPluginCommand.h similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/dependencies/meta/subdir/E/src/ios/EPluginCommand.h rename to cordova-lib/fixtures-plugman/plugins/dependencies/meta/subdir/E/src/ios/EPluginCommand.h diff --git a/cordova-lib/spec-plugman-create/plugins/dependencies/meta/subdir/E/src/ios/EPluginCommand.m b/cordova-lib/fixtures-plugman/plugins/dependencies/meta/subdir/E/src/ios/EPluginCommand.m similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/dependencies/meta/subdir/E/src/ios/EPluginCommand.m rename to cordova-lib/fixtures-plugman/plugins/dependencies/meta/subdir/E/src/ios/EPluginCommand.m diff --git a/cordova-lib/spec-plugman-create/plugins/dependencies/meta/subdir/E/www/plugin-e.js b/cordova-lib/fixtures-plugman/plugins/dependencies/meta/subdir/E/www/plugin-e.js similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/dependencies/meta/subdir/E/www/plugin-e.js rename to cordova-lib/fixtures-plugman/plugins/dependencies/meta/subdir/E/www/plugin-e.js diff --git a/cordova-lib/spec-plugman-create/plugins/dependencies/subdir/E/plugin.xml b/cordova-lib/fixtures-plugman/plugins/dependencies/subdir/E/plugin.xml similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/dependencies/subdir/E/plugin.xml rename to cordova-lib/fixtures-plugman/plugins/dependencies/subdir/E/plugin.xml diff --git a/cordova-lib/spec-plugman-create/plugins/dependencies/subdir/E/src/android/E.java b/cordova-lib/fixtures-plugman/plugins/dependencies/subdir/E/src/android/E.java similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/dependencies/subdir/E/src/android/E.java rename to cordova-lib/fixtures-plugman/plugins/dependencies/subdir/E/src/android/E.java diff --git a/cordova-lib/spec-plugman-create/plugins/dependencies/subdir/E/src/ios/EPluginCommand.h b/cordova-lib/fixtures-plugman/plugins/dependencies/subdir/E/src/ios/EPluginCommand.h similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/dependencies/subdir/E/src/ios/EPluginCommand.h rename to cordova-lib/fixtures-plugman/plugins/dependencies/subdir/E/src/ios/EPluginCommand.h diff --git a/cordova-lib/spec-plugman-create/plugins/dependencies/subdir/E/src/ios/EPluginCommand.m b/cordova-lib/fixtures-plugman/plugins/dependencies/subdir/E/src/ios/EPluginCommand.m similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/dependencies/subdir/E/src/ios/EPluginCommand.m rename to cordova-lib/fixtures-plugman/plugins/dependencies/subdir/E/src/ios/EPluginCommand.m diff --git a/cordova-lib/spec-plugman-create/plugins/dependencies/subdir/E/www/plugin-e.js b/cordova-lib/fixtures-plugman/plugins/dependencies/subdir/E/www/plugin-e.js similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/dependencies/subdir/E/www/plugin-e.js rename to cordova-lib/fixtures-plugman/plugins/dependencies/subdir/E/www/plugin-e.js diff --git a/cordova-lib/spec-plugman-create/plugins/multiple-children/plugin.xml b/cordova-lib/fixtures-plugman/plugins/multiple-children/plugin.xml similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/multiple-children/plugin.xml rename to cordova-lib/fixtures-plugman/plugins/multiple-children/plugin.xml diff --git a/cordova-lib/spec-plugman-create/plugins/shared-deps-multi-child/plugin.xml b/cordova-lib/fixtures-plugman/plugins/shared-deps-multi-child/plugin.xml similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/shared-deps-multi-child/plugin.xml rename to cordova-lib/fixtures-plugman/plugins/shared-deps-multi-child/plugin.xml diff --git a/cordova-lib/spec-cordova-plugins/fixtures/projects/android/src/.gitkeep b/cordova-lib/fixtures-plugman/projects/.gitkeep similarity index 100% rename from cordova-lib/spec-cordova-plugins/fixtures/projects/android/src/.gitkeep rename to cordova-lib/fixtures-plugman/projects/.gitkeep diff --git a/cordova-lib/spec-plugman-install/projects/android_install/AndroidManifest.xml b/cordova-lib/fixtures-plugman/projects/android_install/AndroidManifest.xml similarity index 100% rename from cordova-lib/spec-plugman-install/projects/android_install/AndroidManifest.xml rename to cordova-lib/fixtures-plugman/projects/android_install/AndroidManifest.xml diff --git a/cordova-lib/spec-plugman-install/projects/android_install/cordova/android_sdk_version b/cordova-lib/fixtures-plugman/projects/android_install/cordova/android_sdk_version similarity index 100% rename from cordova-lib/spec-plugman-install/projects/android_install/cordova/android_sdk_version rename to cordova-lib/fixtures-plugman/projects/android_install/cordova/android_sdk_version diff --git a/cordova-lib/spec-plugman-install/projects/android_install/cordova/version b/cordova-lib/fixtures-plugman/projects/android_install/cordova/version similarity index 100% rename from cordova-lib/spec-plugman-install/projects/android_install/cordova/version rename to cordova-lib/fixtures-plugman/projects/android_install/cordova/version diff --git a/cordova-lib/spec-plugman-install/projects/android_install/cordova/version.bat b/cordova-lib/fixtures-plugman/projects/android_install/cordova/version.bat similarity index 100% rename from cordova-lib/spec-plugman-install/projects/android_install/cordova/version.bat rename to cordova-lib/fixtures-plugman/projects/android_install/cordova/version.bat diff --git a/cordova-lib/spec-plugman-install/projects/android_one/AndroidManifest.xml b/cordova-lib/fixtures-plugman/projects/android_one/AndroidManifest.xml similarity index 100% rename from cordova-lib/spec-plugman-install/projects/android_one/AndroidManifest.xml rename to cordova-lib/fixtures-plugman/projects/android_one/AndroidManifest.xml diff --git a/cordova-lib/spec-cordova-project/fixtures/projects/android/assets/www/.gitkeep b/cordova-lib/fixtures-plugman/projects/android_one/assets/www/.gitkeep similarity index 100% rename from cordova-lib/spec-cordova-project/fixtures/projects/android/assets/www/.gitkeep rename to cordova-lib/fixtures-plugman/projects/android_one/assets/www/.gitkeep diff --git a/cordova-lib/spec-plugman-install/projects/android_one/assets/www/cordova.js b/cordova-lib/fixtures-plugman/projects/android_one/assets/www/cordova.js similarity index 100% rename from cordova-lib/spec-plugman-install/projects/android_one/assets/www/cordova.js rename to cordova-lib/fixtures-plugman/projects/android_one/assets/www/cordova.js diff --git a/cordova-lib/spec-plugman-install/projects/android_one/cordova/build b/cordova-lib/fixtures-plugman/projects/android_one/cordova/build similarity index 100% rename from cordova-lib/spec-plugman-install/projects/android_one/cordova/build rename to cordova-lib/fixtures-plugman/projects/android_one/cordova/build diff --git a/cordova-lib/spec-plugman-install/projects/android_one/cordova/clean b/cordova-lib/fixtures-plugman/projects/android_one/cordova/clean similarity index 100% rename from cordova-lib/spec-plugman-install/projects/android_one/cordova/clean rename to cordova-lib/fixtures-plugman/projects/android_one/cordova/clean diff --git a/cordova-lib/spec-plugman-install/projects/android_one/cordova/lib/cordova b/cordova-lib/fixtures-plugman/projects/android_one/cordova/lib/cordova similarity index 100% rename from cordova-lib/spec-plugman-install/projects/android_one/cordova/lib/cordova rename to cordova-lib/fixtures-plugman/projects/android_one/cordova/lib/cordova diff --git a/cordova-lib/spec-plugman-install/projects/android_one/cordova/lib/install-device b/cordova-lib/fixtures-plugman/projects/android_one/cordova/lib/install-device similarity index 100% rename from cordova-lib/spec-plugman-install/projects/android_one/cordova/lib/install-device rename to cordova-lib/fixtures-plugman/projects/android_one/cordova/lib/install-device diff --git a/cordova-lib/spec-plugman-install/projects/android_one/cordova/lib/install-emulator b/cordova-lib/fixtures-plugman/projects/android_one/cordova/lib/install-emulator similarity index 100% rename from cordova-lib/spec-plugman-install/projects/android_one/cordova/lib/install-emulator rename to cordova-lib/fixtures-plugman/projects/android_one/cordova/lib/install-emulator diff --git a/cordova-lib/spec-plugman-install/projects/android_one/cordova/lib/list-devices b/cordova-lib/fixtures-plugman/projects/android_one/cordova/lib/list-devices similarity index 100% rename from cordova-lib/spec-plugman-install/projects/android_one/cordova/lib/list-devices rename to cordova-lib/fixtures-plugman/projects/android_one/cordova/lib/list-devices diff --git a/cordova-lib/spec-plugman-install/projects/android_one/cordova/lib/list-emulator-images b/cordova-lib/fixtures-plugman/projects/android_one/cordova/lib/list-emulator-images similarity index 100% rename from cordova-lib/spec-plugman-install/projects/android_one/cordova/lib/list-emulator-images rename to cordova-lib/fixtures-plugman/projects/android_one/cordova/lib/list-emulator-images diff --git a/cordova-lib/spec-plugman-install/projects/android_one/cordova/lib/list-started-emulators b/cordova-lib/fixtures-plugman/projects/android_one/cordova/lib/list-started-emulators similarity index 100% rename from cordova-lib/spec-plugman-install/projects/android_one/cordova/lib/list-started-emulators rename to cordova-lib/fixtures-plugman/projects/android_one/cordova/lib/list-started-emulators diff --git a/cordova-lib/spec-plugman-install/projects/android_one/cordova/lib/start-emulator b/cordova-lib/fixtures-plugman/projects/android_one/cordova/lib/start-emulator similarity index 100% rename from cordova-lib/spec-plugman-install/projects/android_one/cordova/lib/start-emulator rename to cordova-lib/fixtures-plugman/projects/android_one/cordova/lib/start-emulator diff --git a/cordova-lib/spec-plugman-install/projects/android_one/cordova/log b/cordova-lib/fixtures-plugman/projects/android_one/cordova/log similarity index 100% rename from cordova-lib/spec-plugman-install/projects/android_one/cordova/log rename to cordova-lib/fixtures-plugman/projects/android_one/cordova/log diff --git a/cordova-lib/spec-plugman-install/projects/android_one/cordova/run b/cordova-lib/fixtures-plugman/projects/android_one/cordova/run similarity index 100% rename from cordova-lib/spec-plugman-install/projects/android_one/cordova/run rename to cordova-lib/fixtures-plugman/projects/android_one/cordova/run diff --git a/cordova-lib/spec-plugman-install/projects/android_one/cordova/version b/cordova-lib/fixtures-plugman/projects/android_one/cordova/version similarity index 100% rename from cordova-lib/spec-plugman-install/projects/android_one/cordova/version rename to cordova-lib/fixtures-plugman/projects/android_one/cordova/version diff --git a/cordova-lib/spec-plugman-install/projects/android_one/res/xml/plugins.xml b/cordova-lib/fixtures-plugman/projects/android_one/res/xml/plugins.xml similarity index 100% rename from cordova-lib/spec-plugman-install/projects/android_one/res/xml/plugins.xml rename to cordova-lib/fixtures-plugman/projects/android_one/res/xml/plugins.xml diff --git a/cordova-lib/spec-cordova-project/fixtures/projects/android/src/.gitkeep b/cordova-lib/fixtures-plugman/projects/android_one/src/.gitkeep similarity index 100% rename from cordova-lib/spec-cordova-project/fixtures/projects/android/src/.gitkeep rename to cordova-lib/fixtures-plugman/projects/android_one/src/.gitkeep diff --git a/cordova-lib/spec-cordova-plugins/fixtures/projects/android/AndroidManifest.xml b/cordova-lib/fixtures-plugman/projects/android_two/AndroidManifest.xml similarity index 100% rename from cordova-lib/spec-cordova-plugins/fixtures/projects/android/AndroidManifest.xml rename to cordova-lib/fixtures-plugman/projects/android_two/AndroidManifest.xml diff --git a/cordova-lib/spec-cordova/fixtures/projects/android/assets/www/.gitkeep b/cordova-lib/fixtures-plugman/projects/android_two/assets/www/.gitkeep similarity index 100% rename from cordova-lib/spec-cordova/fixtures/projects/android/assets/www/.gitkeep rename to cordova-lib/fixtures-plugman/projects/android_two/assets/www/.gitkeep diff --git a/cordova-lib/spec-cordova-plugins/fixtures/projects/android/res/xml/config.xml b/cordova-lib/fixtures-plugman/projects/android_two/res/xml/config.xml similarity index 100% rename from cordova-lib/spec-cordova-plugins/fixtures/projects/android/res/xml/config.xml rename to cordova-lib/fixtures-plugman/projects/android_two/res/xml/config.xml diff --git a/cordova-lib/spec-cordova/fixtures/projects/android/src/.gitkeep b/cordova-lib/fixtures-plugman/projects/android_two/src/.gitkeep similarity index 100% rename from cordova-lib/spec-cordova/fixtures/projects/android/src/.gitkeep rename to cordova-lib/fixtures-plugman/projects/android_two/src/.gitkeep diff --git a/cordova-lib/spec-plugman-install/projects/android_two_no_perms/AndroidManifest.xml b/cordova-lib/fixtures-plugman/projects/android_two_no_perms/AndroidManifest.xml similarity index 100% rename from cordova-lib/spec-plugman-install/projects/android_two_no_perms/AndroidManifest.xml rename to cordova-lib/fixtures-plugman/projects/android_two_no_perms/AndroidManifest.xml diff --git a/cordova-lib/spec-plugman-create/plugins/.gitkeep b/cordova-lib/fixtures-plugman/projects/android_two_no_perms/assets/www/.gitkeep similarity index 100% rename from cordova-lib/spec-plugman-create/plugins/.gitkeep rename to cordova-lib/fixtures-plugman/projects/android_two_no_perms/assets/www/.gitkeep diff --git a/cordova-lib/spec-cordova-project/fixtures/projects/android/res/xml/config.xml b/cordova-lib/fixtures-plugman/projects/android_two_no_perms/res/xml/config.xml similarity index 100% rename from cordova-lib/spec-cordova-project/fixtures/projects/android/res/xml/config.xml rename to cordova-lib/fixtures-plugman/projects/android_two_no_perms/res/xml/config.xml diff --git a/cordova-lib/spec-plugman-install/plugins/.gitkeep b/cordova-lib/fixtures-plugman/projects/android_two_no_perms/src/.gitkeep similarity index 100% rename from cordova-lib/spec-plugman-install/plugins/.gitkeep rename to cordova-lib/fixtures-plugman/projects/android_two_no_perms/src/.gitkeep diff --git a/cordova-lib/spec-plugman-install/projects/android_uninstall/AndroidManifest.xml b/cordova-lib/fixtures-plugman/projects/android_uninstall/AndroidManifest.xml similarity index 100% rename from cordova-lib/spec-plugman-install/projects/android_uninstall/AndroidManifest.xml rename to cordova-lib/fixtures-plugman/projects/android_uninstall/AndroidManifest.xml diff --git a/cordova-lib/spec-plugman-install/projects/android_uninstall/cordova/version b/cordova-lib/fixtures-plugman/projects/android_uninstall/cordova/version similarity index 100% rename from cordova-lib/spec-plugman-install/projects/android_uninstall/cordova/version rename to cordova-lib/fixtures-plugman/projects/android_uninstall/cordova/version diff --git a/cordova-lib/spec-plugman-install/projects/android_uninstall/cordova/version.bat b/cordova-lib/fixtures-plugman/projects/android_uninstall/cordova/version.bat similarity index 100% rename from cordova-lib/spec-plugman-install/projects/android_uninstall/cordova/version.bat rename to cordova-lib/fixtures-plugman/projects/android_uninstall/cordova/version.bat diff --git a/cordova-lib/spec-plugman-install/projects/.gitkeep b/cordova-lib/fixtures-plugman/projects/blackberry10/native/device/chrome/.gitkeep similarity index 100% rename from cordova-lib/spec-plugman-install/projects/.gitkeep rename to cordova-lib/fixtures-plugman/projects/blackberry10/native/device/chrome/.gitkeep diff --git a/cordova-lib/spec-plugman-install/projects/blackberry10/native/device/plugins/jnext/auth.txt b/cordova-lib/fixtures-plugman/projects/blackberry10/native/device/plugins/jnext/auth.txt similarity index 100% rename from cordova-lib/spec-plugman-install/projects/blackberry10/native/device/plugins/jnext/auth.txt rename to cordova-lib/fixtures-plugman/projects/blackberry10/native/device/plugins/jnext/auth.txt diff --git a/cordova-lib/spec-plugman-install/projects/android_one/assets/www/.gitkeep b/cordova-lib/fixtures-plugman/projects/blackberry10/native/simulator/chrome/.gitkeep similarity index 100% rename from cordova-lib/spec-plugman-install/projects/android_one/assets/www/.gitkeep rename to cordova-lib/fixtures-plugman/projects/blackberry10/native/simulator/chrome/.gitkeep diff --git a/cordova-lib/spec-plugman-install/projects/blackberry10/native/simulator/plugins/jnext/auth.txt b/cordova-lib/fixtures-plugman/projects/blackberry10/native/simulator/plugins/jnext/auth.txt similarity index 100% rename from cordova-lib/spec-plugman-install/projects/blackberry10/native/simulator/plugins/jnext/auth.txt rename to cordova-lib/fixtures-plugman/projects/blackberry10/native/simulator/plugins/jnext/auth.txt diff --git a/cordova-lib/spec-plugman-install/projects/blackberry10/www/config.xml b/cordova-lib/fixtures-plugman/projects/blackberry10/www/config.xml similarity index 100% rename from cordova-lib/spec-plugman-install/projects/blackberry10/www/config.xml rename to cordova-lib/fixtures-plugman/projects/blackberry10/www/config.xml diff --git a/cordova-lib/spec-plugman-install/projects/ios-config-xml/CordovaLib/CordovaLib.xcodeproj/project.pbxproj b/cordova-lib/fixtures-plugman/projects/ios-config-xml/CordovaLib/CordovaLib.xcodeproj/project.pbxproj similarity index 100% rename from cordova-lib/spec-plugman-install/projects/ios-config-xml/CordovaLib/CordovaLib.xcodeproj/project.pbxproj rename to cordova-lib/fixtures-plugman/projects/ios-config-xml/CordovaLib/CordovaLib.xcodeproj/project.pbxproj diff --git a/cordova-lib/spec-plugman-install/projects/ios-config-xml/SampleApp.xcodeproj/project.orig.pbxproj b/cordova-lib/fixtures-plugman/projects/ios-config-xml/SampleApp.xcodeproj/project.orig.pbxproj similarity index 100% rename from cordova-lib/spec-plugman-install/projects/ios-config-xml/SampleApp.xcodeproj/project.orig.pbxproj rename to cordova-lib/fixtures-plugman/projects/ios-config-xml/SampleApp.xcodeproj/project.orig.pbxproj diff --git a/cordova-lib/spec-plugman-install/projects/ios-config-xml/SampleApp.xcodeproj/project.pbxproj b/cordova-lib/fixtures-plugman/projects/ios-config-xml/SampleApp.xcodeproj/project.pbxproj similarity index 100% rename from cordova-lib/spec-plugman-install/projects/ios-config-xml/SampleApp.xcodeproj/project.pbxproj rename to cordova-lib/fixtures-plugman/projects/ios-config-xml/SampleApp.xcodeproj/project.pbxproj diff --git a/cordova-lib/spec-plugman-install/projects/ios-config-xml/SampleApp/SampleApp-Info.plist b/cordova-lib/fixtures-plugman/projects/ios-config-xml/SampleApp/SampleApp-Info.plist similarity index 100% rename from cordova-lib/spec-plugman-install/projects/ios-config-xml/SampleApp/SampleApp-Info.plist rename to cordova-lib/fixtures-plugman/projects/ios-config-xml/SampleApp/SampleApp-Info.plist diff --git a/cordova-lib/spec-plugman-install/projects/ios-config-xml/SampleApp/config.xml b/cordova-lib/fixtures-plugman/projects/ios-config-xml/SampleApp/config.xml similarity index 100% rename from cordova-lib/spec-plugman-install/projects/ios-config-xml/SampleApp/config.xml rename to cordova-lib/fixtures-plugman/projects/ios-config-xml/SampleApp/config.xml diff --git a/cordova-lib/spec-plugman-install/projects/android_one/src/.gitkeep b/cordova-lib/fixtures-plugman/projects/ios-config-xml/www/.gitkeep similarity index 100% rename from cordova-lib/spec-plugman-install/projects/android_one/src/.gitkeep rename to cordova-lib/fixtures-plugman/projects/ios-config-xml/www/.gitkeep diff --git a/cordova-lib/spec-plugman-install/projects/ios-plist/CordovaLib/CordovaLib.xcodeproj/project.pbxproj b/cordova-lib/fixtures-plugman/projects/ios-plist/CordovaLib/CordovaLib.xcodeproj/project.pbxproj similarity index 100% rename from cordova-lib/spec-plugman-install/projects/ios-plist/CordovaLib/CordovaLib.xcodeproj/project.pbxproj rename to cordova-lib/fixtures-plugman/projects/ios-plist/CordovaLib/CordovaLib.xcodeproj/project.pbxproj diff --git a/cordova-lib/spec-plugman-install/projects/ios-plist/SampleApp.xcodeproj/project.orig.pbxproj b/cordova-lib/fixtures-plugman/projects/ios-plist/SampleApp.xcodeproj/project.orig.pbxproj similarity index 100% rename from cordova-lib/spec-plugman-install/projects/ios-plist/SampleApp.xcodeproj/project.orig.pbxproj rename to cordova-lib/fixtures-plugman/projects/ios-plist/SampleApp.xcodeproj/project.orig.pbxproj diff --git a/cordova-lib/spec-plugman-install/projects/ios-plist/SampleApp.xcodeproj/project.pbxproj b/cordova-lib/fixtures-plugman/projects/ios-plist/SampleApp.xcodeproj/project.pbxproj similarity index 100% rename from cordova-lib/spec-plugman-install/projects/ios-plist/SampleApp.xcodeproj/project.pbxproj rename to cordova-lib/fixtures-plugman/projects/ios-plist/SampleApp.xcodeproj/project.pbxproj diff --git a/cordova-lib/spec-plugman-install/projects/ios-plist/SampleApp/PhoneGap.plist b/cordova-lib/fixtures-plugman/projects/ios-plist/SampleApp/PhoneGap.plist similarity index 100% rename from cordova-lib/spec-plugman-install/projects/ios-plist/SampleApp/PhoneGap.plist rename to cordova-lib/fixtures-plugman/projects/ios-plist/SampleApp/PhoneGap.plist diff --git a/cordova-lib/spec-plugman-install/projects/ios-plist/SampleApp/SampleApp-Info.plist b/cordova-lib/fixtures-plugman/projects/ios-plist/SampleApp/SampleApp-Info.plist similarity index 100% rename from cordova-lib/spec-plugman-install/projects/ios-plist/SampleApp/SampleApp-Info.plist rename to cordova-lib/fixtures-plugman/projects/ios-plist/SampleApp/SampleApp-Info.plist diff --git a/cordova-lib/spec-plugman-install/projects/android_two/assets/www/.gitkeep b/cordova-lib/fixtures-plugman/projects/ios-plist/www/.gitkeep similarity index 100% rename from cordova-lib/spec-plugman-install/projects/android_two/assets/www/.gitkeep rename to cordova-lib/fixtures-plugman/projects/ios-plist/www/.gitkeep diff --git a/cordova-lib/spec-cordova-project/fixtures/projects/android/AndroidManifest.xml b/cordova-lib/fixtures-plugman/projects/multiple-children/AndroidManifest.xml similarity index 100% rename from cordova-lib/spec-cordova-project/fixtures/projects/android/AndroidManifest.xml rename to cordova-lib/fixtures-plugman/projects/multiple-children/AndroidManifest.xml diff --git a/cordova-lib/spec-plugman-install/projects/multiple-children/res/xml/plugins.xml b/cordova-lib/fixtures-plugman/projects/multiple-children/res/xml/plugins.xml similarity index 100% rename from cordova-lib/spec-plugman-install/projects/multiple-children/res/xml/plugins.xml rename to cordova-lib/fixtures-plugman/projects/multiple-children/res/xml/plugins.xml diff --git a/cordova-lib/spec-plugman-install/projects/tizen/www/config.xml b/cordova-lib/fixtures-plugman/projects/tizen/www/config.xml similarity index 100% rename from cordova-lib/spec-plugman-install/projects/tizen/www/config.xml rename to cordova-lib/fixtures-plugman/projects/tizen/www/config.xml diff --git a/cordova-lib/spec-plugman-install/projects/windows8/CordovaApp_TemporaryKey.pfx b/cordova-lib/fixtures-plugman/projects/windows8/CordovaApp_TemporaryKey.pfx similarity index 100% rename from cordova-lib/spec-plugman-install/projects/windows8/CordovaApp_TemporaryKey.pfx rename to cordova-lib/fixtures-plugman/projects/windows8/CordovaApp_TemporaryKey.pfx diff --git a/cordova-lib/spec-plugman-install/projects/windows8/TestApp.jsproj b/cordova-lib/fixtures-plugman/projects/windows8/TestApp.jsproj similarity index 100% rename from cordova-lib/spec-plugman-install/projects/windows8/TestApp.jsproj rename to cordova-lib/fixtures-plugman/projects/windows8/TestApp.jsproj diff --git a/cordova-lib/spec-plugman-install/projects/windows8/TestApp.sln b/cordova-lib/fixtures-plugman/projects/windows8/TestApp.sln similarity index 100% rename from cordova-lib/spec-plugman-install/projects/windows8/TestApp.sln rename to cordova-lib/fixtures-plugman/projects/windows8/TestApp.sln diff --git a/cordova-lib/spec-plugman-install/projects/windows8/package.appxmanifest b/cordova-lib/fixtures-plugman/projects/windows8/package.appxmanifest similarity index 100% rename from cordova-lib/spec-plugman-install/projects/windows8/package.appxmanifest rename to cordova-lib/fixtures-plugman/projects/windows8/package.appxmanifest diff --git a/cordova-lib/spec-plugman-install/projects/windows8/www/cordova-2.6.0.js b/cordova-lib/fixtures-plugman/projects/windows8/www/cordova-2.6.0.js similarity index 100% rename from cordova-lib/spec-plugman-install/projects/windows8/www/cordova-2.6.0.js rename to cordova-lib/fixtures-plugman/projects/windows8/www/cordova-2.6.0.js diff --git a/cordova-lib/spec-cordova-plugins/fixtures/base/www/css/index.css b/cordova-lib/fixtures-plugman/projects/windows8/www/css/index.css similarity index 100% rename from cordova-lib/spec-cordova-plugins/fixtures/base/www/css/index.css rename to cordova-lib/fixtures-plugman/projects/windows8/www/css/index.css diff --git a/cordova-lib/spec-plugman-install/projects/windows8/www/img/logo.png b/cordova-lib/fixtures-plugman/projects/windows8/www/img/logo.png similarity index 100% rename from cordova-lib/spec-plugman-install/projects/windows8/www/img/logo.png rename to cordova-lib/fixtures-plugman/projects/windows8/www/img/logo.png diff --git a/cordova-lib/spec-plugman-install/projects/windows8/www/img/smalllogo.png b/cordova-lib/fixtures-plugman/projects/windows8/www/img/smalllogo.png similarity index 100% rename from cordova-lib/spec-plugman-install/projects/windows8/www/img/smalllogo.png rename to cordova-lib/fixtures-plugman/projects/windows8/www/img/smalllogo.png diff --git a/cordova-lib/spec-plugman-install/projects/windows8/www/img/splashscreen.png b/cordova-lib/fixtures-plugman/projects/windows8/www/img/splashscreen.png similarity index 100% rename from cordova-lib/spec-plugman-install/projects/windows8/www/img/splashscreen.png rename to cordova-lib/fixtures-plugman/projects/windows8/www/img/splashscreen.png diff --git a/cordova-lib/spec-plugman-install/projects/windows8/www/img/storelogo.png b/cordova-lib/fixtures-plugman/projects/windows8/www/img/storelogo.png similarity index 100% rename from cordova-lib/spec-plugman-install/projects/windows8/www/img/storelogo.png rename to cordova-lib/fixtures-plugman/projects/windows8/www/img/storelogo.png diff --git a/cordova-lib/spec-plugman-install/projects/windows8/www/index.html b/cordova-lib/fixtures-plugman/projects/windows8/www/index.html similarity index 100% rename from cordova-lib/spec-plugman-install/projects/windows8/www/index.html rename to cordova-lib/fixtures-plugman/projects/windows8/www/index.html diff --git a/cordova-lib/spec-plugman-install/projects/windows8/www/js/index.js b/cordova-lib/fixtures-plugman/projects/windows8/www/js/index.js similarity index 100% rename from cordova-lib/spec-plugman-install/projects/windows8/www/js/index.js rename to cordova-lib/fixtures-plugman/projects/windows8/www/js/index.js diff --git a/cordova-lib/spec-plugman-install/projects/wp8/CordovaAppProj.csproj b/cordova-lib/fixtures-plugman/projects/wp8/CordovaAppProj.csproj similarity index 100% rename from cordova-lib/spec-plugman-install/projects/wp8/CordovaAppProj.csproj rename to cordova-lib/fixtures-plugman/projects/wp8/CordovaAppProj.csproj diff --git a/cordova-lib/spec-plugman-install/projects/wp8/Properties/WMAppManifest.xml b/cordova-lib/fixtures-plugman/projects/wp8/Properties/WMAppManifest.xml similarity index 100% rename from cordova-lib/spec-plugman-install/projects/wp8/Properties/WMAppManifest.xml rename to cordova-lib/fixtures-plugman/projects/wp8/Properties/WMAppManifest.xml diff --git a/cordova-lib/spec-plugman-install/projects/android_two/src/.gitkeep b/cordova-lib/fixtures-plugman/projects/www-only/.gitkeep similarity index 100% rename from cordova-lib/spec-plugman-install/projects/android_two/src/.gitkeep rename to cordova-lib/fixtures-plugman/projects/www-only/.gitkeep diff --git a/cordova-lib/spec-cordova-build/prepare.spec.js b/cordova-lib/spec-cordova-build/prepare.spec.js index 77814f163..24b09ee54 100644 --- a/cordova-lib/spec-cordova-build/prepare.spec.js +++ b/cordova-lib/spec-cordova-build/prepare.spec.js @@ -28,7 +28,7 @@ var cordova = require('../src/cordova/cordova'), platforms = require('../src/cordova/platforms'), hooker = require('../src/cordova/misc/hooker'), xmlHelpers = require('../src/util/xml-helpers'), - fixtures = path.join(__dirname, 'fixtures'), + fixtures = path.join(__dirname, '..', 'fixtures-cordova'), et = require('elementtree'), Q = require('q'), hooks = path.join(fixtures, 'hooks'); diff --git a/cordova-lib/spec-cordova-misc/hooker.spec.js b/cordova-lib/spec-cordova-misc/hooker.spec.js index f50b2516c..84f41a305 100644 --- a/cordova-lib/spec-cordova-misc/hooker.spec.js +++ b/cordova-lib/spec-cordova-misc/hooker.spec.js @@ -26,7 +26,7 @@ var cordova = require('../src/cordova/cordova'), os = require('os'), Q = require('q'), child_process = require('child_process'), - helpers = require('./helpers'); + helpers = require('../fixtures-cordova/helpers'); var platform = os.platform(); var tmpDir = helpers.tmpDir('hooks_test'); @@ -39,9 +39,9 @@ var ext = platform.match(/(win32|win64)/)?'bat':'sh'; // copy fixture shell.rm('-rf', project); shell.mkdir('-p', project); -shell.cp('-R', path.join(__dirname, 'fixtures', 'base', '*'), project); +shell.cp('-R', path.join(__dirname, '..', 'fixtures-cordova', 'base', '*'), project); shell.mkdir('-p', dotCordova); -shell.cp('-R', path.join(__dirname, 'fixtures', 'hooks_' + ext), dotCordova); +shell.cp('-R', path.join(__dirname, '..', 'fixtures-cordova', 'hooks_' + ext), dotCordova); shell.mv(path.join(dotCordova, 'hooks_' + ext), hooksDir); shell.chmod('-R', 'ug+x', hooksDir); diff --git a/cordova-lib/spec-cordova-plugins/fixtures/base/.cordova/config.json b/cordova-lib/spec-cordova-plugins/fixtures/base/.cordova/config.json deleted file mode 100644 index 4f52ca7f0..000000000 --- a/cordova-lib/spec-cordova-plugins/fixtures/base/.cordova/config.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "id": "org.testing", - "name":"TestBase", - "lib": { - "android": { - "url": "/some/junk/path", - "version": "dev", - "id": "cordova-android-dev" - }, - "ios": { - "url": "/some/junk/path", - "version": "dev", - "id": "cordova-ios-dev" - }, - "wp8": { - "url": "/some/junk/path", - "version": "dev", - "id": "cordova-wp8-dev" - } - } -} - diff --git a/cordova-lib/spec-cordova-plugins/fixtures/base/merges/.svn b/cordova-lib/spec-cordova-plugins/fixtures/base/merges/.svn deleted file mode 100644 index e69de29bb..000000000 diff --git a/cordova-lib/spec-cordova-plugins/fixtures/base/plugins/.svn b/cordova-lib/spec-cordova-plugins/fixtures/base/plugins/.svn deleted file mode 100644 index e69de29bb..000000000 diff --git a/cordova-lib/spec-cordova-plugins/fixtures/base/www/config.xml b/cordova-lib/spec-cordova-plugins/fixtures/base/www/config.xml deleted file mode 100644 index 9e7b9e046..000000000 --- a/cordova-lib/spec-cordova-plugins/fixtures/base/www/config.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - TestBase - - A sample Apache Cordova application that responds to the deviceready event. - - - Apache Cordova Team - - - - - - diff --git a/cordova-lib/spec-cordova-plugins/fixtures/base/www/img/logo.png b/cordova-lib/spec-cordova-plugins/fixtures/base/www/img/logo.png deleted file mode 100644 index 9519e7dd78adb6e44548c08510a7bf02442a7697..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21814 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
Qfv&3%?A-1S}IU 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 - - - - - - - - - Hello World - - -
-

Apache Cordova

- -
- - - - - diff --git a/cordova-lib/spec-cordova-plugins/fixtures/base/www/js/index.js b/cordova-lib/spec-cordova-plugins/fixtures/base/www/js/index.js deleted file mode 100644 index 31d9064eb..000000000 --- a/cordova-lib/spec-cordova-plugins/fixtures/base/www/js/index.js +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -var app = { - // Application Constructor - initialize: function() { - this.bindEvents(); - }, - // Bind Event Listeners - // - // Bind any events that are required on startup. Common events are: - // 'load', 'deviceready', 'offline', and 'online'. - bindEvents: function() { - document.addEventListener('deviceready', this.onDeviceReady, false); - }, - // deviceready Event Handler - // - // The scope of 'this' is the event. In order to call the 'receivedEvent' - // function, we must explicity call 'app.receivedEvent(...);' - onDeviceReady: function() { - app.receivedEvent('deviceready'); - }, - // Update DOM on a Received Event - receivedEvent: function(id) { - var parentElement = document.getElementById(id); - var listeningElement = parentElement.querySelector('.listening'); - var receivedElement = parentElement.querySelector('.received'); - - listeningElement.setAttribute('style', 'display:none;'); - receivedElement.setAttribute('style', 'display:block;'); - - console.log('Received Event: ' + id); - } -}; diff --git a/cordova-lib/spec-cordova-plugins/fixtures/base/www/spec.html b/cordova-lib/spec-cordova-plugins/fixtures/base/www/spec.html deleted file mode 100644 index 71f00de05..000000000 --- a/cordova-lib/spec-cordova-plugins/fixtures/base/www/spec.html +++ /dev/null @@ -1,68 +0,0 @@ - - - - - Jasmine Spec Runner - - - - - - - - - - - - - - - - - - - - diff --git a/cordova-lib/spec-cordova-plugins/fixtures/hooks_bat/fail/fail.bat b/cordova-lib/spec-cordova-plugins/fixtures/hooks_bat/fail/fail.bat deleted file mode 100644 index a89b4c89c..000000000 --- a/cordova-lib/spec-cordova-plugins/fixtures/hooks_bat/fail/fail.bat +++ /dev/null @@ -1,2 +0,0 @@ -@ECHO OFF -EXIT /B 1 diff --git a/cordova-lib/spec-cordova-plugins/fixtures/hooks_bat/test/.dotted.bat b/cordova-lib/spec-cordova-plugins/fixtures/hooks_bat/test/.dotted.bat deleted file mode 100644 index ada7136e5..000000000 --- a/cordova-lib/spec-cordova-plugins/fixtures/hooks_bat/test/.dotted.bat +++ /dev/null @@ -1,2 +0,0 @@ -@ECHO OFF -ECHO "Dotted files in hook dirs should not be called" > dotted_hook_should_not_fire.txt \ No newline at end of file diff --git a/cordova-lib/spec-cordova-plugins/fixtures/hooks_bat/test/07.bat b/cordova-lib/spec-cordova-plugins/fixtures/hooks_bat/test/07.bat deleted file mode 100644 index a88c8c590..000000000 --- a/cordova-lib/spec-cordova-plugins/fixtures/hooks_bat/test/07.bat +++ /dev/null @@ -1,3 +0,0 @@ -@ECHO OFF -rem ECHO this is script 0 in %~dp0 -ECHO b >> hooks_order.txt diff --git a/cordova-lib/spec-cordova-plugins/fixtures/hooks_bat/test/1.bat b/cordova-lib/spec-cordova-plugins/fixtures/hooks_bat/test/1.bat deleted file mode 100644 index be004c530..000000000 --- a/cordova-lib/spec-cordova-plugins/fixtures/hooks_bat/test/1.bat +++ /dev/null @@ -1,5 +0,0 @@ -@ECHO OFF -rem ECHO this is script 1 in %~dp0 -ECHO a >> hooks_order.txt -ECHO %1 > hooks_params.txt -node -e "console.log(JSON.stringify(process.env, null, 2))" > hooks_env.json diff --git a/cordova-lib/spec-cordova-plugins/fixtures/hooks_sh/fail/fail.sh b/cordova-lib/spec-cordova-plugins/fixtures/hooks_sh/fail/fail.sh deleted file mode 100755 index 379a4c986..000000000 --- a/cordova-lib/spec-cordova-plugins/fixtures/hooks_sh/fail/fail.sh +++ /dev/null @@ -1 +0,0 @@ -exit 1 diff --git a/cordova-lib/spec-cordova-plugins/fixtures/hooks_sh/test/.dotted.sh b/cordova-lib/spec-cordova-plugins/fixtures/hooks_sh/test/.dotted.sh deleted file mode 100755 index e5fa07f91..000000000 --- a/cordova-lib/spec-cordova-plugins/fixtures/hooks_sh/test/.dotted.sh +++ /dev/null @@ -1 +0,0 @@ -echo "Dotted files in hook dirs should not be called" > dotted_hook_should_not_fire.txt diff --git a/cordova-lib/spec-cordova-plugins/fixtures/hooks_sh/test/07.sh b/cordova-lib/spec-cordova-plugins/fixtures/hooks_sh/test/07.sh deleted file mode 100755 index f410ee21f..000000000 --- a/cordova-lib/spec-cordova-plugins/fixtures/hooks_sh/test/07.sh +++ /dev/null @@ -1,2 +0,0 @@ -#echo "this is script 0 in `pwd`"; -echo b >> hooks_order.txt diff --git a/cordova-lib/spec-cordova-plugins/fixtures/hooks_sh/test/1.sh b/cordova-lib/spec-cordova-plugins/fixtures/hooks_sh/test/1.sh deleted file mode 100755 index 892869d7c..000000000 --- a/cordova-lib/spec-cordova-plugins/fixtures/hooks_sh/test/1.sh +++ /dev/null @@ -1,4 +0,0 @@ -#echo "this is script 1 in `pwd`"; -echo a >> hooks_order.txt -echo $1 > hooks_params.txt -node -e "console.log(JSON.stringify(process.env, null, 2))" > hooks_env.json diff --git a/cordova-lib/spec-cordova-plugins/fixtures/platforms/android-lib/VERSION b/cordova-lib/spec-cordova-plugins/fixtures/platforms/android-lib/VERSION deleted file mode 100644 index 15a279981..000000000 --- a/cordova-lib/spec-cordova-plugins/fixtures/platforms/android-lib/VERSION +++ /dev/null @@ -1 +0,0 @@ -3.3.0 diff --git a/cordova-lib/spec-cordova-plugins/fixtures/platforms/android-lib/framework/assets/www/cordova.js b/cordova-lib/spec-cordova-plugins/fixtures/platforms/android-lib/framework/assets/www/cordova.js deleted file mode 100644 index 91c51fce2..000000000 --- a/cordova-lib/spec-cordova-plugins/fixtures/platforms/android-lib/framework/assets/www/cordova.js +++ /dev/null @@ -1 +0,0 @@ -This is a placeholder file. diff --git a/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/AndroidManifest.xml b/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/AndroidManifest.xml deleted file mode 100644 index be3f245f7..000000000 --- a/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/AndroidManifest.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - diff --git a/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/assets/www/config.xml b/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/assets/www/config.xml deleted file mode 100644 index 9e7b9e046..000000000 --- a/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/assets/www/config.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - TestBase - - A sample Apache Cordova application that responds to the deviceready event. - - - Apache Cordova Team - - - - - - diff --git a/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/assets/www/cordova.js b/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/assets/www/cordova.js deleted file mode 100644 index 07e3feb46..000000000 --- a/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/assets/www/cordova.js +++ /dev/null @@ -1,1712 +0,0 @@ -// Platform: android -// 3.1.0 -/* - Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.0 (the - "License"); you may not use this file except in compliance - with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, - software distributed under the License is distributed on an - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - KIND, either express or implied. See the License for the - specific language governing permissions and limitations - under the License. -*/ -;(function() { -var CORDOVA_JS_BUILD_LABEL = '3.1.0'; -// file: lib/scripts/require.js - -var require, - define; - -(function () { - var modules = {}, - // Stack of moduleIds currently being built. - requireStack = [], - // Map of module ID -> index into requireStack of modules currently being built. - inProgressModules = {}, - SEPERATOR = "."; - - - - function build(module) { - var factory = module.factory, - localRequire = function (id) { - var resultantId = id; - //Its a relative path, so lop off the last portion and add the id (minus "./") - if (id.charAt(0) === ".") { - resultantId = module.id.slice(0, module.id.lastIndexOf(SEPERATOR)) + SEPERATOR + id.slice(2); - } - return require(resultantId); - }; - module.exports = {}; - delete module.factory; - factory(localRequire, module.exports, module); - return module.exports; - } - - require = function (id) { - if (!modules[id]) { - throw "module " + id + " not found"; - } else if (id in inProgressModules) { - var cycle = requireStack.slice(inProgressModules[id]).join('->') + '->' + id; - throw "Cycle in require graph: " + cycle; - } - if (modules[id].factory) { - try { - inProgressModules[id] = requireStack.length; - requireStack.push(id); - return build(modules[id]); - } finally { - delete inProgressModules[id]; - requireStack.pop(); - } - } - return modules[id].exports; - }; - - define = function (id, factory) { - if (modules[id]) { - throw "module " + id + " already defined"; - } - - modules[id] = { - id: id, - factory: factory - }; - }; - - define.remove = function (id) { - delete modules[id]; - }; - - define.moduleMap = modules; -})(); - -//Export for use in node -if (typeof module === "object" && typeof require === "function") { - module.exports.require = require; - module.exports.define = define; -} - -// file: lib/cordova.js -define("cordova", function(require, exports, module) { - - -var channel = require('cordova/channel'); -var platform = require('cordova/platform'); - -/** - * Intercept calls to addEventListener + removeEventListener and handle deviceready, - * resume, and pause events. - */ -var m_document_addEventListener = document.addEventListener; -var m_document_removeEventListener = document.removeEventListener; -var m_window_addEventListener = window.addEventListener; -var m_window_removeEventListener = window.removeEventListener; - -/** - * Houses custom event handlers to intercept on document + window event listeners. - */ -var documentEventHandlers = {}, - windowEventHandlers = {}; - -document.addEventListener = function(evt, handler, capture) { - var e = evt.toLowerCase(); - if (typeof documentEventHandlers[e] != 'undefined') { - documentEventHandlers[e].subscribe(handler); - } else { - m_document_addEventListener.call(document, evt, handler, capture); - } -}; - -window.addEventListener = function(evt, handler, capture) { - var e = evt.toLowerCase(); - if (typeof windowEventHandlers[e] != 'undefined') { - windowEventHandlers[e].subscribe(handler); - } else { - m_window_addEventListener.call(window, evt, handler, capture); - } -}; - -document.removeEventListener = function(evt, handler, capture) { - var e = evt.toLowerCase(); - // If unsubscribing from an event that is handled by a plugin - if (typeof documentEventHandlers[e] != "undefined") { - documentEventHandlers[e].unsubscribe(handler); - } else { - m_document_removeEventListener.call(document, evt, handler, capture); - } -}; - -window.removeEventListener = function(evt, handler, capture) { - var e = evt.toLowerCase(); - // If unsubscribing from an event that is handled by a plugin - if (typeof windowEventHandlers[e] != "undefined") { - windowEventHandlers[e].unsubscribe(handler); - } else { - m_window_removeEventListener.call(window, evt, handler, capture); - } -}; - -function createEvent(type, data) { - var event = document.createEvent('Events'); - event.initEvent(type, false, false); - if (data) { - for (var i in data) { - if (data.hasOwnProperty(i)) { - event[i] = data[i]; - } - } - } - return event; -} - - -var cordova = { - define:define, - require:require, - version:CORDOVA_JS_BUILD_LABEL, - platformId:platform.id, - /** - * Methods to add/remove your own addEventListener hijacking on document + window. - */ - addWindowEventHandler:function(event) { - return (windowEventHandlers[event] = channel.create(event)); - }, - addStickyDocumentEventHandler:function(event) { - return (documentEventHandlers[event] = channel.createSticky(event)); - }, - addDocumentEventHandler:function(event) { - return (documentEventHandlers[event] = channel.create(event)); - }, - removeWindowEventHandler:function(event) { - delete windowEventHandlers[event]; - }, - removeDocumentEventHandler:function(event) { - delete documentEventHandlers[event]; - }, - /** - * Retrieve original event handlers that were replaced by Cordova - * - * @return object - */ - getOriginalHandlers: function() { - return {'document': {'addEventListener': m_document_addEventListener, 'removeEventListener': m_document_removeEventListener}, - 'window': {'addEventListener': m_window_addEventListener, 'removeEventListener': m_window_removeEventListener}}; - }, - /** - * Method to fire event from native code - * bNoDetach is required for events which cause an exception which needs to be caught in native code - */ - fireDocumentEvent: function(type, data, bNoDetach) { - var evt = createEvent(type, data); - if (typeof documentEventHandlers[type] != 'undefined') { - if( bNoDetach ) { - documentEventHandlers[type].fire(evt); - } - else { - setTimeout(function() { - // Fire deviceready on listeners that were registered before cordova.js was loaded. - if (type == 'deviceready') { - document.dispatchEvent(evt); - } - documentEventHandlers[type].fire(evt); - }, 0); - } - } else { - document.dispatchEvent(evt); - } - }, - fireWindowEvent: function(type, data) { - var evt = createEvent(type,data); - if (typeof windowEventHandlers[type] != 'undefined') { - setTimeout(function() { - windowEventHandlers[type].fire(evt); - }, 0); - } else { - window.dispatchEvent(evt); - } - }, - - /** - * Plugin callback mechanism. - */ - // Randomize the starting callbackId to avoid collisions after refreshing or navigating. - // This way, it's very unlikely that any new callback would get the same callbackId as an old callback. - callbackId: Math.floor(Math.random() * 2000000000), - callbacks: {}, - callbackStatus: { - NO_RESULT: 0, - OK: 1, - CLASS_NOT_FOUND_EXCEPTION: 2, - ILLEGAL_ACCESS_EXCEPTION: 3, - INSTANTIATION_EXCEPTION: 4, - MALFORMED_URL_EXCEPTION: 5, - IO_EXCEPTION: 6, - INVALID_ACTION: 7, - JSON_EXCEPTION: 8, - ERROR: 9 - }, - - /** - * Called by native code when returning successful result from an action. - */ - callbackSuccess: function(callbackId, args) { - try { - cordova.callbackFromNative(callbackId, true, args.status, [args.message], args.keepCallback); - } catch (e) { - console.log("Error in error callback: " + callbackId + " = "+e); - } - }, - - /** - * Called by native code when returning error result from an action. - */ - callbackError: function(callbackId, args) { - // TODO: Deprecate callbackSuccess and callbackError in favour of callbackFromNative. - // Derive success from status. - try { - cordova.callbackFromNative(callbackId, false, args.status, [args.message], args.keepCallback); - } catch (e) { - console.log("Error in error callback: " + callbackId + " = "+e); - } - }, - - /** - * Called by native code when returning the result from an action. - */ - callbackFromNative: function(callbackId, success, status, args, keepCallback) { - var callback = cordova.callbacks[callbackId]; - if (callback) { - if (success && status == cordova.callbackStatus.OK) { - callback.success && callback.success.apply(null, args); - } else if (!success) { - callback.fail && callback.fail.apply(null, args); - } - - // Clear callback if not expecting any more results - if (!keepCallback) { - delete cordova.callbacks[callbackId]; - } - } - }, - addConstructor: function(func) { - channel.onCordovaReady.subscribe(function() { - try { - func(); - } catch(e) { - console.log("Failed to run constructor: " + e); - } - }); - } -}; - - -module.exports = cordova; - -}); - -// file: lib/android/android/nativeapiprovider.js -define("cordova/android/nativeapiprovider", function(require, exports, module) { - -/** - * Exports the ExposedJsApi.java object if available, otherwise exports the PromptBasedNativeApi. - */ - -var nativeApi = this._cordovaNative || require('cordova/android/promptbasednativeapi'); -var currentApi = nativeApi; - -module.exports = { - get: function() { return currentApi; }, - setPreferPrompt: function(value) { - currentApi = value ? require('cordova/android/promptbasednativeapi') : nativeApi; - }, - // Used only by tests. - set: function(value) { - currentApi = value; - } -}; - -}); - -// file: lib/android/android/promptbasednativeapi.js -define("cordova/android/promptbasednativeapi", function(require, exports, module) { - -/** - * Implements the API of ExposedJsApi.java, but uses prompt() to communicate. - * This is used only on the 2.3 simulator, where addJavascriptInterface() is broken. - */ - -module.exports = { - exec: function(service, action, callbackId, argsJson) { - return prompt(argsJson, 'gap:'+JSON.stringify([service, action, callbackId])); - }, - setNativeToJsBridgeMode: function(value) { - prompt(value, 'gap_bridge_mode:'); - }, - retrieveJsMessages: function(fromOnlineEvent) { - return prompt(+fromOnlineEvent, 'gap_poll:'); - } -}; - -}); - -// file: lib/common/argscheck.js -define("cordova/argscheck", function(require, exports, module) { - -var exec = require('cordova/exec'); -var utils = require('cordova/utils'); - -var moduleExports = module.exports; - -var typeMap = { - 'A': 'Array', - 'D': 'Date', - 'N': 'Number', - 'S': 'String', - 'F': 'Function', - 'O': 'Object' -}; - -function extractParamName(callee, argIndex) { - return (/.*?\((.*?)\)/).exec(callee)[1].split(', ')[argIndex]; -} - -function checkArgs(spec, functionName, args, opt_callee) { - if (!moduleExports.enableChecks) { - return; - } - var errMsg = null; - var typeName; - for (var i = 0; i < spec.length; ++i) { - var c = spec.charAt(i), - cUpper = c.toUpperCase(), - arg = args[i]; - // Asterix means allow anything. - if (c == '*') { - continue; - } - typeName = utils.typeName(arg); - if ((arg === null || arg === undefined) && c == cUpper) { - continue; - } - if (typeName != typeMap[cUpper]) { - errMsg = 'Expected ' + typeMap[cUpper]; - break; - } - } - if (errMsg) { - errMsg += ', but got ' + typeName + '.'; - errMsg = 'Wrong type for parameter "' + extractParamName(opt_callee || args.callee, i) + '" of ' + functionName + ': ' + errMsg; - // Don't log when running unit tests. - if (typeof jasmine == 'undefined') { - console.error(errMsg); - } - throw TypeError(errMsg); - } -} - -function getValue(value, defaultValue) { - return value === undefined ? defaultValue : value; -} - -moduleExports.checkArgs = checkArgs; -moduleExports.getValue = getValue; -moduleExports.enableChecks = true; - - -}); - -// file: lib/common/base64.js -define("cordova/base64", function(require, exports, module) { - -var base64 = exports; - -base64.fromArrayBuffer = function(arrayBuffer) { - var array = new Uint8Array(arrayBuffer); - return uint8ToBase64(array); -}; - -//------------------------------------------------------------------------------ - -/* This code is based on the performance tests at http://jsperf.com/b64tests - * This 12-bit-at-a-time algorithm was the best performing version on all - * platforms tested. - */ - -var b64_6bit = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; -var b64_12bit; - -var b64_12bitTable = function() { - b64_12bit = []; - for (var i=0; i<64; i++) { - for (var j=0; j<64; j++) { - b64_12bit[i*64+j] = b64_6bit[i] + b64_6bit[j]; - } - } - b64_12bitTable = function() { return b64_12bit; }; - return b64_12bit; -}; - -function uint8ToBase64(rawData) { - var numBytes = rawData.byteLength; - var output=""; - var segment; - var table = b64_12bitTable(); - for (var i=0;i> 12]; - output += table[segment & 0xfff]; - } - if (numBytes - i == 2) { - segment = (rawData[i] << 16) + (rawData[i+1] << 8); - output += table[segment >> 12]; - output += b64_6bit[(segment & 0xfff) >> 6]; - output += '='; - } else if (numBytes - i == 1) { - segment = (rawData[i] << 16); - output += table[segment >> 12]; - output += '=='; - } - return output; -} - -}); - -// file: lib/common/builder.js -define("cordova/builder", function(require, exports, module) { - -var utils = require('cordova/utils'); - -function each(objects, func, context) { - for (var prop in objects) { - if (objects.hasOwnProperty(prop)) { - func.apply(context, [objects[prop], prop]); - } - } -} - -function clobber(obj, key, value) { - exports.replaceHookForTesting(obj, key); - obj[key] = value; - // Getters can only be overridden by getters. - if (obj[key] !== value) { - utils.defineGetter(obj, key, function() { - return value; - }); - } -} - -function assignOrWrapInDeprecateGetter(obj, key, value, message) { - if (message) { - utils.defineGetter(obj, key, function() { - console.log(message); - delete obj[key]; - clobber(obj, key, value); - return value; - }); - } else { - clobber(obj, key, value); - } -} - -function include(parent, objects, clobber, merge) { - each(objects, function (obj, key) { - try { - var result = obj.path ? require(obj.path) : {}; - - if (clobber) { - // Clobber if it doesn't exist. - if (typeof parent[key] === 'undefined') { - assignOrWrapInDeprecateGetter(parent, key, result, obj.deprecated); - } else if (typeof obj.path !== 'undefined') { - // If merging, merge properties onto parent, otherwise, clobber. - if (merge) { - recursiveMerge(parent[key], result); - } else { - assignOrWrapInDeprecateGetter(parent, key, result, obj.deprecated); - } - } - result = parent[key]; - } else { - // Overwrite if not currently defined. - if (typeof parent[key] == 'undefined') { - assignOrWrapInDeprecateGetter(parent, key, result, obj.deprecated); - } else { - // Set result to what already exists, so we can build children into it if they exist. - result = parent[key]; - } - } - - if (obj.children) { - include(result, obj.children, clobber, merge); - } - } catch(e) { - utils.alert('Exception building cordova JS globals: ' + e + ' for key "' + key + '"'); - } - }); -} - -/** - * Merge properties from one object onto another recursively. Properties from - * the src object will overwrite existing target property. - * - * @param target Object to merge properties into. - * @param src Object to merge properties from. - */ -function recursiveMerge(target, src) { - for (var prop in src) { - if (src.hasOwnProperty(prop)) { - if (target.prototype && target.prototype.constructor === target) { - // If the target object is a constructor override off prototype. - clobber(target.prototype, prop, src[prop]); - } else { - if (typeof src[prop] === 'object' && typeof target[prop] === 'object') { - recursiveMerge(target[prop], src[prop]); - } else { - clobber(target, prop, src[prop]); - } - } - } - } -} - -exports.buildIntoButDoNotClobber = function(objects, target) { - include(target, objects, false, false); -}; -exports.buildIntoAndClobber = function(objects, target) { - include(target, objects, true, false); -}; -exports.buildIntoAndMerge = function(objects, target) { - include(target, objects, true, true); -}; -exports.recursiveMerge = recursiveMerge; -exports.assignOrWrapInDeprecateGetter = assignOrWrapInDeprecateGetter; -exports.replaceHookForTesting = function() {}; - -}); - -// file: lib/common/channel.js -define("cordova/channel", function(require, exports, module) { - -var utils = require('cordova/utils'), - nextGuid = 1; - -/** - * Custom pub-sub "channel" that can have functions subscribed to it - * This object is used to define and control firing of events for - * cordova initialization, as well as for custom events thereafter. - * - * The order of events during page load and Cordova startup is as follows: - * - * onDOMContentLoaded* Internal event that is received when the web page is loaded and parsed. - * onNativeReady* Internal event that indicates the Cordova native side is ready. - * onCordovaReady* Internal event fired when all Cordova JavaScript objects have been created. - * onDeviceReady* User event fired to indicate that Cordova is ready - * onResume User event fired to indicate a start/resume lifecycle event - * onPause User event fired to indicate a pause lifecycle event - * onDestroy* Internal event fired when app is being destroyed (User should use window.onunload event, not this one). - * - * The events marked with an * are sticky. Once they have fired, they will stay in the fired state. - * All listeners that subscribe after the event is fired will be executed right away. - * - * The only Cordova events that user code should register for are: - * deviceready Cordova native code is initialized and Cordova APIs can be called from JavaScript - * pause App has moved to background - * resume App has returned to foreground - * - * Listeners can be registered as: - * document.addEventListener("deviceready", myDeviceReadyListener, false); - * document.addEventListener("resume", myResumeListener, false); - * document.addEventListener("pause", myPauseListener, false); - * - * The DOM lifecycle events should be used for saving and restoring state - * window.onload - * window.onunload - * - */ - -/** - * Channel - * @constructor - * @param type String the channel name - */ -var Channel = function(type, sticky) { - this.type = type; - // Map of guid -> function. - this.handlers = {}; - // 0 = Non-sticky, 1 = Sticky non-fired, 2 = Sticky fired. - this.state = sticky ? 1 : 0; - // Used in sticky mode to remember args passed to fire(). - this.fireArgs = null; - // Used by onHasSubscribersChange to know if there are any listeners. - this.numHandlers = 0; - // Function that is called when the first listener is subscribed, or when - // the last listener is unsubscribed. - this.onHasSubscribersChange = null; -}, - channel = { - /** - * Calls the provided function only after all of the channels specified - * have been fired. All channels must be sticky channels. - */ - join: function(h, c) { - var len = c.length, - i = len, - f = function() { - if (!(--i)) h(); - }; - for (var j=0; jNative bridge. - POLLING: 0, - // For LOAD_URL to be viable, it would need to have a work-around for - // the bug where the soft-keyboard gets dismissed when a message is sent. - LOAD_URL: 1, - // For the ONLINE_EVENT to be viable, it would need to intercept all event - // listeners (both through addEventListener and window.ononline) as well - // as set the navigator property itself. - ONLINE_EVENT: 2, - // Uses reflection to access private APIs of the WebView that can send JS - // to be executed. - // Requires Android 3.2.4 or above. - PRIVATE_API: 3 - }, - jsToNativeBridgeMode, // Set lazily. - nativeToJsBridgeMode = nativeToJsModes.ONLINE_EVENT, - pollEnabled = false, - messagesFromNative = []; - -function androidExec(success, fail, service, action, args) { - // Set default bridge modes if they have not already been set. - // By default, we use the failsafe, since addJavascriptInterface breaks too often - if (jsToNativeBridgeMode === undefined) { - androidExec.setJsToNativeBridgeMode(jsToNativeModes.JS_OBJECT); - } - - // Process any ArrayBuffers in the args into a string. - for (var i = 0; i < args.length; i++) { - if (utils.typeName(args[i]) == 'ArrayBuffer') { - args[i] = base64.fromArrayBuffer(args[i]); - } - } - - var callbackId = service + cordova.callbackId++, - argsJson = JSON.stringify(args); - - if (success || fail) { - cordova.callbacks[callbackId] = {success:success, fail:fail}; - } - - if (jsToNativeBridgeMode == jsToNativeModes.LOCATION_CHANGE) { - window.location = 'http://cdv_exec/' + service + '#' + action + '#' + callbackId + '#' + argsJson; - } else { - var messages = nativeApiProvider.get().exec(service, action, callbackId, argsJson); - // If argsJson was received by Java as null, try again with the PROMPT bridge mode. - // This happens in rare circumstances, such as when certain Unicode characters are passed over the bridge on a Galaxy S2. See CB-2666. - if (jsToNativeBridgeMode == jsToNativeModes.JS_OBJECT && messages === "@Null arguments.") { - androidExec.setJsToNativeBridgeMode(jsToNativeModes.PROMPT); - androidExec(success, fail, service, action, args); - androidExec.setJsToNativeBridgeMode(jsToNativeModes.JS_OBJECT); - return; - } else { - androidExec.processMessages(messages); - } - } -} - -function pollOnceFromOnlineEvent() { - pollOnce(true); -} - -function pollOnce(opt_fromOnlineEvent) { - var msg = nativeApiProvider.get().retrieveJsMessages(!!opt_fromOnlineEvent); - androidExec.processMessages(msg); -} - -function pollingTimerFunc() { - if (pollEnabled) { - pollOnce(); - setTimeout(pollingTimerFunc, 50); - } -} - -function hookOnlineApis() { - function proxyEvent(e) { - cordova.fireWindowEvent(e.type); - } - // The network module takes care of firing online and offline events. - // It currently fires them only on document though, so we bridge them - // to window here (while first listening for exec()-releated online/offline - // events). - window.addEventListener('online', pollOnceFromOnlineEvent, false); - window.addEventListener('offline', pollOnceFromOnlineEvent, false); - cordova.addWindowEventHandler('online'); - cordova.addWindowEventHandler('offline'); - document.addEventListener('online', proxyEvent, false); - document.addEventListener('offline', proxyEvent, false); -} - -hookOnlineApis(); - -androidExec.jsToNativeModes = jsToNativeModes; -androidExec.nativeToJsModes = nativeToJsModes; - -androidExec.setJsToNativeBridgeMode = function(mode) { - if (mode == jsToNativeModes.JS_OBJECT && !window._cordovaNative) { - console.log('Falling back on PROMPT mode since _cordovaNative is missing. Expected for Android 3.2 and lower only.'); - mode = jsToNativeModes.PROMPT; - } - nativeApiProvider.setPreferPrompt(mode == jsToNativeModes.PROMPT); - jsToNativeBridgeMode = mode; -}; - -androidExec.setNativeToJsBridgeMode = function(mode) { - if (mode == nativeToJsBridgeMode) { - return; - } - if (nativeToJsBridgeMode == nativeToJsModes.POLLING) { - pollEnabled = false; - } - - nativeToJsBridgeMode = mode; - // Tell the native side to switch modes. - nativeApiProvider.get().setNativeToJsBridgeMode(mode); - - if (mode == nativeToJsModes.POLLING) { - pollEnabled = true; - setTimeout(pollingTimerFunc, 1); - } -}; - -// Processes a single message, as encoded by NativeToJsMessageQueue.java. -function processMessage(message) { - try { - var firstChar = message.charAt(0); - if (firstChar == 'J') { - eval(message.slice(1)); - } else if (firstChar == 'S' || firstChar == 'F') { - var success = firstChar == 'S'; - var keepCallback = message.charAt(1) == '1'; - var spaceIdx = message.indexOf(' ', 2); - var status = +message.slice(2, spaceIdx); - var nextSpaceIdx = message.indexOf(' ', spaceIdx + 1); - var callbackId = message.slice(spaceIdx + 1, nextSpaceIdx); - var payloadKind = message.charAt(nextSpaceIdx + 1); - var payload; - if (payloadKind == 's') { - payload = message.slice(nextSpaceIdx + 2); - } else if (payloadKind == 't') { - payload = true; - } else if (payloadKind == 'f') { - payload = false; - } else if (payloadKind == 'N') { - payload = null; - } else if (payloadKind == 'n') { - payload = +message.slice(nextSpaceIdx + 2); - } else if (payloadKind == 'A') { - var data = message.slice(nextSpaceIdx + 2); - var bytes = window.atob(data); - var arraybuffer = new Uint8Array(bytes.length); - for (var i = 0; i < bytes.length; i++) { - arraybuffer[i] = bytes.charCodeAt(i); - } - payload = arraybuffer.buffer; - } else if (payloadKind == 'S') { - payload = window.atob(message.slice(nextSpaceIdx + 2)); - } else { - payload = JSON.parse(message.slice(nextSpaceIdx + 1)); - } - cordova.callbackFromNative(callbackId, success, status, [payload], keepCallback); - } else { - console.log("processMessage failed: invalid message:" + message); - } - } catch (e) { - console.log("processMessage failed: Message: " + message); - console.log("processMessage failed: Error: " + e); - console.log("processMessage failed: Stack: " + e.stack); - } -} - -// This is called from the NativeToJsMessageQueue.java. -androidExec.processMessages = function(messages) { - if (messages) { - messagesFromNative.push(messages); - // Check for the reentrant case, and enqueue the message if that's the case. - if (messagesFromNative.length > 1) { - return; - } - while (messagesFromNative.length) { - // Don't unshift until the end so that reentrancy can be detected. - messages = messagesFromNative[0]; - // The Java side can send a * message to indicate that it - // still has messages waiting to be retrieved. - if (messages == '*') { - messagesFromNative.shift(); - window.setTimeout(pollOnce, 0); - return; - } - - var spaceIdx = messages.indexOf(' '); - var msgLen = +messages.slice(0, spaceIdx); - var message = messages.substr(spaceIdx + 1, msgLen); - messages = messages.slice(spaceIdx + msgLen + 1); - processMessage(message); - if (messages) { - messagesFromNative[0] = messages; - } else { - messagesFromNative.shift(); - } - } - } -}; - -module.exports = androidExec; - -}); - -// file: lib/common/init.js -define("cordova/init", function(require, exports, module) { - -var channel = require('cordova/channel'); -var cordova = require('cordova'); -var modulemapper = require('cordova/modulemapper'); -var platform = require('cordova/platform'); -var pluginloader = require('cordova/pluginloader'); - -var platformInitChannelsArray = [channel.onNativeReady, channel.onPluginsReady]; - -function logUnfiredChannels(arr) { - for (var i = 0; i < arr.length; ++i) { - if (arr[i].state != 2) { - console.log('Channel not fired: ' + arr[i].type); - } - } -} - -window.setTimeout(function() { - if (channel.onDeviceReady.state != 2) { - console.log('deviceready has not fired after 5 seconds.'); - logUnfiredChannels(platformInitChannelsArray); - logUnfiredChannels(channel.deviceReadyChannelsArray); - } -}, 5000); - -// Replace navigator before any modules are required(), to ensure it happens as soon as possible. -// We replace it so that properties that can't be clobbered can instead be overridden. -function replaceNavigator(origNavigator) { - var CordovaNavigator = function() {}; - CordovaNavigator.prototype = origNavigator; - var newNavigator = new CordovaNavigator(); - // This work-around really only applies to new APIs that are newer than Function.bind. - // Without it, APIs such as getGamepads() break. - if (CordovaNavigator.bind) { - for (var key in origNavigator) { - if (typeof origNavigator[key] == 'function') { - newNavigator[key] = origNavigator[key].bind(origNavigator); - } - } - } - return newNavigator; -} -if (window.navigator) { - window.navigator = replaceNavigator(window.navigator); -} - -if (!window.console) { - window.console = { - log: function(){} - }; -} -if (!window.console.warn) { - window.console.warn = function(msg) { - this.log("warn: " + msg); - }; -} - -// Register pause, resume and deviceready channels as events on document. -channel.onPause = cordova.addDocumentEventHandler('pause'); -channel.onResume = cordova.addDocumentEventHandler('resume'); -channel.onDeviceReady = cordova.addStickyDocumentEventHandler('deviceready'); - -// Listen for DOMContentLoaded and notify our channel subscribers. -if (document.readyState == 'complete' || document.readyState == 'interactive') { - channel.onDOMContentLoaded.fire(); -} else { - document.addEventListener('DOMContentLoaded', function() { - channel.onDOMContentLoaded.fire(); - }, false); -} - -// _nativeReady is global variable that the native side can set -// to signify that the native code is ready. It is a global since -// it may be called before any cordova JS is ready. -if (window._nativeReady) { - channel.onNativeReady.fire(); -} - -modulemapper.clobbers('cordova', 'cordova'); -modulemapper.clobbers('cordova/exec', 'cordova.exec'); -modulemapper.clobbers('cordova/exec', 'Cordova.exec'); - -// Call the platform-specific initialization. -platform.bootstrap && platform.bootstrap(); - -pluginloader.load(function() { - channel.onPluginsReady.fire(); -}); - -/** - * Create all cordova objects once native side is ready. - */ -channel.join(function() { - modulemapper.mapModules(window); - - platform.initialize && platform.initialize(); - - // Fire event to notify that all objects are created - channel.onCordovaReady.fire(); - - // Fire onDeviceReady event once page has fully loaded, all - // constructors have run and cordova info has been received from native - // side. - channel.join(function() { - require('cordova').fireDocumentEvent('deviceready'); - }, channel.deviceReadyChannelsArray); - -}, platformInitChannelsArray); - - -}); - -// file: lib/common/modulemapper.js -define("cordova/modulemapper", function(require, exports, module) { - -var builder = require('cordova/builder'), - moduleMap = define.moduleMap, - symbolList, - deprecationMap; - -exports.reset = function() { - symbolList = []; - deprecationMap = {}; -}; - -function addEntry(strategy, moduleName, symbolPath, opt_deprecationMessage) { - if (!(moduleName in moduleMap)) { - throw new Error('Module ' + moduleName + ' does not exist.'); - } - symbolList.push(strategy, moduleName, symbolPath); - if (opt_deprecationMessage) { - deprecationMap[symbolPath] = opt_deprecationMessage; - } -} - -// Note: Android 2.3 does have Function.bind(). -exports.clobbers = function(moduleName, symbolPath, opt_deprecationMessage) { - addEntry('c', moduleName, symbolPath, opt_deprecationMessage); -}; - -exports.merges = function(moduleName, symbolPath, opt_deprecationMessage) { - addEntry('m', moduleName, symbolPath, opt_deprecationMessage); -}; - -exports.defaults = function(moduleName, symbolPath, opt_deprecationMessage) { - addEntry('d', moduleName, symbolPath, opt_deprecationMessage); -}; - -exports.runs = function(moduleName) { - addEntry('r', moduleName, null); -}; - -function prepareNamespace(symbolPath, context) { - if (!symbolPath) { - return context; - } - var parts = symbolPath.split('.'); - var cur = context; - for (var i = 0, part; part = parts[i]; ++i) { - cur = cur[part] = cur[part] || {}; - } - return cur; -} - -exports.mapModules = function(context) { - var origSymbols = {}; - context.CDV_origSymbols = origSymbols; - for (var i = 0, len = symbolList.length; i < len; i += 3) { - var strategy = symbolList[i]; - var moduleName = symbolList[i + 1]; - var module = require(moduleName); - // - if (strategy == 'r') { - continue; - } - var symbolPath = symbolList[i + 2]; - var lastDot = symbolPath.lastIndexOf('.'); - var namespace = symbolPath.substr(0, lastDot); - var lastName = symbolPath.substr(lastDot + 1); - - var deprecationMsg = symbolPath in deprecationMap ? 'Access made to deprecated symbol: ' + symbolPath + '. ' + deprecationMsg : null; - var parentObj = prepareNamespace(namespace, context); - var target = parentObj[lastName]; - - if (strategy == 'm' && target) { - builder.recursiveMerge(target, module); - } else if ((strategy == 'd' && !target) || (strategy != 'd')) { - if (!(symbolPath in origSymbols)) { - origSymbols[symbolPath] = target; - } - builder.assignOrWrapInDeprecateGetter(parentObj, lastName, module, deprecationMsg); - } - } -}; - -exports.getOriginalSymbol = function(context, symbolPath) { - var origSymbols = context.CDV_origSymbols; - if (origSymbols && (symbolPath in origSymbols)) { - return origSymbols[symbolPath]; - } - var parts = symbolPath.split('.'); - var obj = context; - for (var i = 0; i < parts.length; ++i) { - obj = obj && obj[parts[i]]; - } - return obj; -}; - -exports.reset(); - - -}); - -// file: lib/android/platform.js -define("cordova/platform", function(require, exports, module) { - -module.exports = { - id: 'android', - bootstrap: function() { - var channel = require('cordova/channel'), - cordova = require('cordova'), - exec = require('cordova/exec'), - modulemapper = require('cordova/modulemapper'); - - // Tell the native code that a page change has occurred. - exec(null, null, 'PluginManager', 'startup', []); - // Tell the JS that the native side is ready. - channel.onNativeReady.fire(); - - // TODO: Extract this as a proper plugin. - modulemapper.clobbers('cordova/plugin/android/app', 'navigator.app'); - - // Inject a listener for the backbutton on the document. - var backButtonChannel = cordova.addDocumentEventHandler('backbutton'); - backButtonChannel.onHasSubscribersChange = function() { - // If we just attached the first handler or detached the last handler, - // let native know we need to override the back button. - exec(null, null, "App", "overrideBackbutton", [this.numHandlers == 1]); - }; - - // Add hardware MENU and SEARCH button handlers - cordova.addDocumentEventHandler('menubutton'); - cordova.addDocumentEventHandler('searchbutton'); - - // Let native code know we are all done on the JS side. - // Native code will then un-hide the WebView. - channel.onCordovaReady.subscribe(function() { - exec(null, null, "App", "show", []); - }); - } -}; - -}); - -// file: lib/android/plugin/android/app.js -define("cordova/plugin/android/app", function(require, exports, module) { - -var exec = require('cordova/exec'); - -module.exports = { - /** - * Clear the resource cache. - */ - clearCache:function() { - exec(null, null, "App", "clearCache", []); - }, - - /** - * Load the url into the webview or into new browser instance. - * - * @param url The URL to load - * @param props Properties that can be passed in to the activity: - * wait: int => wait msec before loading URL - * loadingDialog: "Title,Message" => display a native loading dialog - * loadUrlTimeoutValue: int => time in msec to wait before triggering a timeout error - * clearHistory: boolean => clear webview history (default=false) - * openExternal: boolean => open in a new browser (default=false) - * - * Example: - * navigator.app.loadUrl("http://server/myapp/index.html", {wait:2000, loadingDialog:"Wait,Loading App", loadUrlTimeoutValue: 60000}); - */ - loadUrl:function(url, props) { - exec(null, null, "App", "loadUrl", [url, props]); - }, - - /** - * Cancel loadUrl that is waiting to be loaded. - */ - cancelLoadUrl:function() { - exec(null, null, "App", "cancelLoadUrl", []); - }, - - /** - * Clear web history in this web view. - * Instead of BACK button loading the previous web page, it will exit the app. - */ - clearHistory:function() { - exec(null, null, "App", "clearHistory", []); - }, - - /** - * Go to previous page displayed. - * This is the same as pressing the backbutton on Android device. - */ - backHistory:function() { - exec(null, null, "App", "backHistory", []); - }, - - /** - * Override the default behavior of the Android back button. - * If overridden, when the back button is pressed, the "backKeyDown" JavaScript event will be fired. - * - * Note: The user should not have to call this method. Instead, when the user - * registers for the "backbutton" event, this is automatically done. - * - * @param override T=override, F=cancel override - */ - overrideBackbutton:function(override) { - exec(null, null, "App", "overrideBackbutton", [override]); - }, - - /** - * Exit and terminate the application. - */ - exitApp:function() { - return exec(null, null, "App", "exitApp", []); - } -}; - -}); - -// file: lib/common/pluginloader.js -define("cordova/pluginloader", function(require, exports, module) { - -var modulemapper = require('cordova/modulemapper'); - -// Helper function to inject a - - - - diff --git a/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/assets/www/js/index.js b/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/assets/www/js/index.js deleted file mode 100644 index 31d9064eb..000000000 --- a/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/assets/www/js/index.js +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -var app = { - // Application Constructor - initialize: function() { - this.bindEvents(); - }, - // Bind Event Listeners - // - // Bind any events that are required on startup. Common events are: - // 'load', 'deviceready', 'offline', and 'online'. - bindEvents: function() { - document.addEventListener('deviceready', this.onDeviceReady, false); - }, - // deviceready Event Handler - // - // The scope of 'this' is the event. In order to call the 'receivedEvent' - // function, we must explicity call 'app.receivedEvent(...);' - onDeviceReady: function() { - app.receivedEvent('deviceready'); - }, - // Update DOM on a Received Event - receivedEvent: function(id) { - var parentElement = document.getElementById(id); - var listeningElement = parentElement.querySelector('.listening'); - var receivedElement = parentElement.querySelector('.received'); - - listeningElement.setAttribute('style', 'display:none;'); - receivedElement.setAttribute('style', 'display:block;'); - - console.log('Received Event: ' + id); - } -}; diff --git a/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/assets/www/spec.html b/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/assets/www/spec.html deleted file mode 100644 index 71f00de05..000000000 --- a/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/assets/www/spec.html +++ /dev/null @@ -1,68 +0,0 @@ - - - - - Jasmine Spec Runner - - - - - - - - - - - - - - - - - - - - diff --git a/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/build.xml b/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/build.xml deleted file mode 100644 index 9674edf7d..000000000 --- a/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/build.xml +++ /dev/null @@ -1,92 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/build b/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/build deleted file mode 100755 index 7028eb812..000000000 --- a/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/build +++ /dev/null @@ -1,35 +0,0 @@ -#!/usr/bin/env node - -/* - Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.0 (the - "License"); you may not use this file except in compliance - with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, - software distributed under the License is distributed on an - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - KIND, either express or implied. See the License for the - specific language governing permissions and limitations - under the License. -*/ - -var build = require('./lib/build'), - reqs = require('./lib/check_reqs'), - args = process.argv; - -// Support basic help commands -if(args[2] == '--help' || args[2] == '/?' || args[2] == '-h' || - args[2] == 'help' || args[2] == '-help' || args[2] == '/help') { - build.help(); -} else if(reqs.run()) { - build.run(args[2]); - process.exit(0); -} else { - process.exit(2); -} diff --git a/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/check_reqs b/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/check_reqs deleted file mode 100755 index 4a8abee46..000000000 --- a/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/check_reqs +++ /dev/null @@ -1,27 +0,0 @@ -#!/usr/bin/env node - -/* - Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.0 (the - "License"); you may not use this file except in compliance - with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, - software distributed under the License is distributed on an - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - KIND, either express or implied. See the License for the - specific language governing permissions and limitations - under the License. -*/ - -var check_reqs = require('./lib/check_reqs'); - -if(!check_reqs.run()) { - process.exit(2); -} - diff --git a/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/clean b/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/clean deleted file mode 100755 index 70c4ca80e..000000000 --- a/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/clean +++ /dev/null @@ -1,34 +0,0 @@ -#!/usr/bin/env node - -/* - Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.0 (the - "License"); you may not use this file except in compliance - with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, - software distributed under the License is distributed on an - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - KIND, either express or implied. See the License for the - specific language governing permissions and limitations - under the License. -*/ - -var clean = require('./lib/clean'), - reqs = require('./lib/check_reqs'), - args = process.argv; - -// Usage support for when args are given -if(args.length > 2) { - clean.help(); -} else if(reqs.run()) { - clean.run(); - process.exit(0); -} else { - process.exit(2); -} diff --git a/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/defaults.xml b/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/defaults.xml deleted file mode 100644 index 24e572540..000000000 --- a/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/defaults.xml +++ /dev/null @@ -1,50 +0,0 @@ - - - - Hello Cordova - - - A sample Apache Cordova application that responds to the deviceready event. - - - - Apache Cordova Team - - - - - - - - - - - - - - diff --git a/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/lib/appinfo.js b/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/lib/appinfo.js deleted file mode 100755 index 1f8ebe2cf..000000000 --- a/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/lib/appinfo.js +++ /dev/null @@ -1,41 +0,0 @@ -#!/usr/bin/env node - -/* - Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.0 (the - "License"); you may not use this file except in compliance - with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, - software distributed under the License is distributed on an - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - KIND, either express or implied. See the License for the - specific language governing permissions and limitations - under the License. -*/ - -var path = require('path'); -var fs = require('fs'); -var cachedAppInfo = null; - -function readAppInfoFromManifest() { - var manifestPath = path.join(__dirname, '..', '..', 'AndroidManifest.xml'); - var manifestData = fs.readFileSync(manifestPath, {encoding:'utf8'}); - var packageName = /\bpackage\s*=\s*"(.+?)"/.exec(manifestData); - if (!packageName) throw new Error('Could not find package name within ' + manifestPath); - var activityTag = //.exec(manifestData); - if (!activityTag) throw new Error('Could not find within ' + manifestPath); - var activityName = /\bandroid:name\s*=\s*"(.+?)"/.exec(activityTag); - if (!activityName) throw new Error('Could not find android:name within ' + manifestPath); - - return packageName[1] + '/.' + activityName[1]; -} - -exports.getActivityName = function() { - return cachedAppInfo = cachedAppInfo || readAppInfoFromManifest(); -}; diff --git a/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/lib/build.js b/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/lib/build.js deleted file mode 100755 index 7bc33ca27..000000000 --- a/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/lib/build.js +++ /dev/null @@ -1,89 +0,0 @@ -#!/usr/bin/env node - -/* - Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.0 (the - "License"); you may not use this file except in compliance - with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, - software distributed under the License is distributed on an - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - KIND, either express or implied. See the License for the - specific language governing permissions and limitations - under the License. -*/ - -var shell = require('shelljs'), - clean = require('./clean'), - path = require('path'), - fs = require('fs'), - ROOT = path.join(__dirname, '..', '..'); - -/* - * Builds the project with ant. - */ -module.exports.run = function(build_type) { - //default build type - build_type = typeof build_type !== 'undefined' ? build_type : "--debug"; - var cmd; - switch(build_type) { - case '--debug' : - clean.run(); - cmd = 'ant debug -f ' + path.join(ROOT, 'build.xml'); - break; - case '--release' : - clean.run(); - cmd = 'ant release -f ' + path.join(ROOT, 'build.xml'); - break; - case '--nobuild' : - console.log('Skipping build...'); - break; - default : - console.error('Build option \'' + build_type + '\' not recognized.'); - process.exit(2); - break; - } - if(cmd) { - var result = shell.exec(cmd, {silent:false, async:false}); - if(result.code > 0) { - console.error('ERROR: Failed to build android project.'); - console.error(result.output); - process.exit(2); - } - } -} - -/* - * Gets the path to the apk file, if not such file exists then - * the script will error out. (should we error or just return undefined?) - */ -module.exports.get_apk = function() { - if(fs.existsSync(path.join(ROOT, 'bin'))) { - var bin_files = fs.readdirSync(path.join(ROOT, 'bin')); - for (file in bin_files) { - if(path.extname(bin_files[file]) == '.apk') { - return path.join(ROOT, 'bin', bin_files[file]); - } - } - console.error('ERROR : No .apk found in \'bin\' folder'); - process.exit(2); - } else { - console.error('ERROR : unable to find project bin folder, could not locate .apk'); - process.exit(2); - } -} - -module.exports.help = function() { - console.log('Usage: ' + path.relative(process.cwd(), path.join(ROOT, 'cordova', 'build')) + ' [build_type]'); - console.log('Build Types : '); - console.log(' \'--debug\': Default build, will build project in using ant debug'); - console.log(' \'--release\': will build project using ant release'); - console.log(' \'--nobuild\': will skip build process (can be used with run command)'); - process.exit(0); -} diff --git a/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/lib/check_reqs.js b/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/lib/check_reqs.js deleted file mode 100755 index c064499f1..000000000 --- a/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/lib/check_reqs.js +++ /dev/null @@ -1,78 +0,0 @@ -#!/usr/bin/env node - -/* - Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.0 (the - "License"); you may not use this file except in compliance - with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, - software distributed under the License is distributed on an - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - KIND, either express or implied. See the License for the - specific language governing permissions and limitations - under the License. -*/ - -var shell = require('shelljs'), - path = require('path'), - fs = require('fs'), - ROOT = path.join(__dirname, '..', '..'); - -// Get valid target from framework/project.properties -module.exports.get_target = function() { - if(fs.existsSync(path.join(ROOT, 'framework', 'project.properties'))) { - var target = shell.grep(/target=android-[\d+]/, path.join(ROOT, 'framework', 'project.properties')); - return target.split('=')[1].replace('\n', '').replace('\r', '').replace(' ', ''); - } else if (fs.existsSync(path.join(ROOT, 'project.properties'))) { - // if no target found, we're probably in a project and project.properties is in ROOT. - var target = shell.grep(/target=android-[\d+]/, path.join(ROOT, 'project.properties')); - return target.split('=')[1].replace('\n', '').replace('\r', '').replace(' ', ''); - } -} - -module.exports.check_ant = function() { - var test = shell.exec('ant -version', {silent:true, async:false}); - if(test.code > 0) { - console.error('ERROR : executing command \'ant\', make sure you have ant installed and added to your path.'); - return false; - } - return true; -} - -module.exports.check_java = function() { - if(process.env.JAVA_HOME) { - var test = shell.exec('java', {silent:true, async:false}); - if(test.code > 0) { - console.error('ERROR : executing command \'java\', make sure you java environment is set up. Including your JDK and JRE.'); - return false; - } - return true; - } else { - console.error('ERROR : Make sure JAVA_HOME is set, as well as paths to your JDK and JRE for java.'); - return false; - } -} - -module.exports.check_android = function() { - var valid_target = this.get_target(); - var targets = shell.exec('android list targets', {silent:true, async:false}); - - if(targets.code > 0 && targets.output.match(/command\snot\sfound/)) { - console.error('The command \"android\" failed. Make sure you have the latest Android SDK installed, and the \"android\" command (inside the tools/ folder) is added to your path.'); - return false; - } else if(!targets.output.match(valid_target)) { - console.error('Please install Android target ' + valid_target.split('-')[1] + ' (the Android newest SDK). Make sure you have the latest Android tools installed as well. Run \"android\" from your command-line to install/update any missing SDKs or tools.'); - return false; - } - return true; -} - -module.exports.run = function() { - return this.check_ant() && this.check_java && this.check_android(); -} diff --git a/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/lib/clean.js b/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/lib/clean.js deleted file mode 100755 index 8f140153e..000000000 --- a/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/lib/clean.js +++ /dev/null @@ -1,43 +0,0 @@ -#!/usr/bin/env node - -/* - Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.0 (the - "License"); you may not use this file except in compliance - with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, - software distributed under the License is distributed on an - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - KIND, either express or implied. See the License for the - specific language governing permissions and limitations - under the License. -*/ - -var shell = require('shelljs'), - path = require('path'), - ROOT = path.join(__dirname, '..', '..'); - -/* - * Cleans the project using ant - */ -module.exports.run = function() { - var cmd = 'ant clean -f ' + path.join(ROOT, 'build.xml'); - var result = shell.exec(cmd, {silent:false, async:false}); - if (result.code > 0) { - console.error('ERROR: Failed to clean android project.'); - console.error(result.output); - process.exit(2); - } -} - -module.exports.help = function() { - console.log('Usage: ' + path.relative(process.cwd(), path.join(ROOT, 'cordova', 'clean'))); - console.log('Cleans the project directory.'); - process.exit(0); -} diff --git a/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/lib/device.js b/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/lib/device.js deleted file mode 100755 index 363dc2bd0..000000000 --- a/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/lib/device.js +++ /dev/null @@ -1,95 +0,0 @@ -#!/usr/bin/env node - -/* - Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.0 (the - "License"); you may not use this file except in compliance - with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, - software distributed under the License is distributed on an - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - KIND, either express or implied. See the License for the - specific language governing permissions and limitations - under the License. -*/ - -var shell = require('shelljs'), - path = require('path'), - build = require('./build'), - appinfo = require('./appinfo'), - exec = require('child_process').exec, - ROOT = path.join(__dirname, '..', '..'); - -/** - * Returns a list of the device ID's found - */ -module.exports.list = function() { - var cmd = 'adb devices'; - var result = shell.exec(cmd, {silent:true, async:false}); - if (result.code > 0) { - console.error('Failed to execute android command \'' + cmd + '\'.'); - process.exit(2); - } else { - var response = result.output.split('\n'); - var device_list = []; - for (var i = 1; i < response.length; i++) { - if (response[i].match(/\w+\tdevice/) && !response[i].match(/emulator/)) { - device_list.push(response[i].replace(/\tdevice/, '').replace('\r', '')); - } - } - return device_list; - } -} - -/* - * Installs a previously built application on the device - * and launches it. - */ -module.exports.install = function(target) { - var device_list = this.list(); - if (device_list.length > 0) { - // default device - target = typeof target !== 'undefined' ? target : device_list[0]; - if (device_list.indexOf(target) > -1) { - var apk_path = build.get_apk(); - var launchName = appinfo.getActivityName(); - console.log('Installing app on device...'); - cmd = 'adb -s ' + target + ' install -r ' + apk_path; - var install = shell.exec(cmd, {silent:false, async:false}); - if (install.error || install.output.match(/Failure/)) { - console.error('ERROR : Failed to install apk to device : '); - console.error(install.output); - process.exit(2); - } - - //unlock screen - cmd = 'adb -s ' + target + ' shell input keyevent 82'; - shell.exec(cmd, {silent:true, async:false}); - - // launch the application - console.log('Launching application...'); - cmd = 'adb -s ' + target + ' shell am start -W -a android.intent.action.MAIN -n ' + launchName; - var launch = shell.exec(cmd, {silent:true, async:false}); - if(launch.code > 0) { - console.error('ERROR : Failed to launch application on emulator : ' + launch.error); - console.error(launch.output); - process.exit(2); - } else { - console.log('LAUNCH SUCCESS'); - } - } else { - console.error('ERROR : Unable to find target \'' + target + '\'.'); - console.error('Failed to deploy to device.'); - process.exit(2); - } - } else { - console.error('ERROR : Failed to deploy to device, no devices found.'); - process.exit(2); - } -} diff --git a/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/lib/emulator.js b/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/lib/emulator.js deleted file mode 100755 index cc658a9b9..000000000 --- a/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/lib/emulator.js +++ /dev/null @@ -1,337 +0,0 @@ -#!/usr/bin/env node - -/* - Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.0 (the - "License"); you may not use this file except in compliance - with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, - software distributed under the License is distributed on an - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - KIND, either express or implied. See the License for the - specific language governing permissions and limitations - under the License. -*/ - -var shell = require('shelljs'), - path = require('path'), - appinfo = require('./appinfo'), - build = require('./build'), - ROOT = path.join(__dirname, '..', '..'), - new_emulator = 'cordova_emulator'; - -/** - * Returns a list of emulator images in the form of objects - * { - name : , - path : , - target : , - abi : , - skin : - } - */ -module.exports.list_images = function() { - var cmd = 'android list avds'; - var result = shell.exec(cmd, {silent:true, async:false}); - if (result.code > 0) { - console.error('Failed to execute android command \'' + cmd + '\'.'); - process.exit(2); - } else { - var response = result.output.split('\n'); - var emulator_list = []; - for (var i = 1; i < response.length; i++) { - // To return more detailed information use img_obj - var img_obj = {}; - if (response[i].match(/Name:\s/)) { - img_obj['name'] = response[i].split('Name: ')[1].replace('\r', ''); - if (response[i + 1].match(/Path:\s/)) { - i++; - img_obj['path'] = response[i].split('Path: ')[1].replace('\r', ''); - } - if (response[i + 1].match(/\(API\slevel\s/)) { - i++; - img_obj['target'] = response[i].replace('\r', ''); - } - if (response[i + 1].match(/ABI:\s/)) { - i++; - img_obj['abi'] = response[i].split('ABI: ')[1].replace('\r', ''); - } - if (response[i + 1].match(/Skin:\s/)) { - i++; - img_obj['skin'] = response[i].split('Skin: ')[1].replace('\r', ''); - } - - emulator_list.push(img_obj); - } - /* To just return a list of names use this - if (response[i].match(/Name:\s/)) { - emulator_list.push(response[i].split('Name: ')[1].replace('\r', ''); - }*/ - - } - return emulator_list; - } -} - -/** - * Will return the closest avd to the projects target - * or undefined if no avds exist. - */ -module.exports.best_image = function() { - var project_target = this.get_target().replace('android-', ''); - var images = this.list_images(); - var closest = 9999; - var best = images[0]; - for (i in images) { - var target = images[i].target; - if(target) { - var num = target.split('(API level ')[1].replace(')', ''); - if (num == project_target) { - return images[i]; - } else if (project_target - num < closest && project_target > num) { - var closest = project_target - num; - best = images[i]; - } - } - } - return best; -} - -module.exports.list_started = function() { - var cmd = 'adb devices'; - var result = shell.exec(cmd, {silent:true, async:false}); - if (result.code > 0) { - console.error('Failed to execute android command \'' + cmd + '\'.'); - process.exit(2); - } else { - var response = result.output.split('\n'); - var started_emulator_list = []; - for (var i = 1; i < response.length; i++) { - if (response[i].match(/device/) && response[i].match(/emulator/)) { - started_emulator_list.push(response[i].replace(/\tdevice/, '').replace('\r', '')); - } - } - return started_emulator_list; - } -} - -module.exports.get_target = function() { - var target = shell.grep(/target=android-[\d+]/, path.join(ROOT, 'project.properties')); - return target.split('=')[1].replace('\n', '').replace('\r', '').replace(' ', ''); -} - -module.exports.list_targets = function() { - var target_out = shell.exec('android list targets', {silent:true, async:false}).output.split('\n'); - var targets = []; - for (var i = target_out.length; i >= 0; i--) { - if(target_out[i].match(/id:/)) { - targets.push(targets[i].split(' ')[1]); - } - } - return targets; -} - -/* - * Starts an emulator with the given ID, - * and returns the started ID of that emulator. - * If no ID is given it will used the first image availible, - * if no image is availible it will error out (maybe create one?). - */ -module.exports.start = function(emulator_ID) { - var started_emulators = this.list_started(); - var num_started = started_emulators.length; - if (typeof emulator_ID === 'undefined') { - var emulator_list = this.list_images(); - if (emulator_list.length > 0) { - emulator_ID = this.best_image().name; - console.log('WARNING : no emulator specified, defaulting to ' + emulator_ID); - } else { - console.error('ERROR : No emulator images (avds) found, if you would like to create an'); - console.error(' avd follow the instructions provided here : '); - console.error(' http://developer.android.com/tools/devices/index.html') - console.error(' Or run \'android create avd --name --target \' '); - console.error(' in on the command line.'); - process.exit(2); - /*console.log('WARNING : no emulators availible, creating \'' + new_emulator + '\'.'); - this.create_image(new_emulator, this.get_target()); - emulator_ID = new_emulator;*/ - } - } - - var pipe_null = (process.platform == 'win32' || process.platform == 'win64'? '> NUL' : '> /dev/null'); - var cmd = 'emulator -avd ' + emulator_ID + ' ' + pipe_null + ' &'; - if(process.platform == 'win32' || process.platform == 'win64') { - cmd = '%comspec% /c start cmd /c ' + cmd; - } - var result = shell.exec(cmd, {silent:true, async:false}, function(code, output) { - if (code > 0) { - console.error('Failed to execute android command \'' + cmd + '\'.'); - console.error(output); - process.exit(2); - } - }); - - // wait for emulator to start - console.log('Waiting for emulator...'); - var new_started = this.wait_for_emulator(num_started); - var emulator_id; - if (new_started.length > 1) { - for (i in new_started) { - console.log(new_started[i]); - console.log(started_emulators.indexOf(new_started[i])); - if (started_emulators.indexOf(new_started[i]) < 0) { - emulator_id = new_started[i]; - } - } - } else { - emulator_id = new_started[0]; - } - if (!emulator_id) { - console.error('ERROR : Failed to start emulator, could not find new emulator'); - process.exit(2); - } - - //wait for emulator to boot up - process.stdout.write('Booting up emulator (this may take a while)...'); - this.wait_for_boot(emulator_id); - console.log('BOOT COMPLETE'); - - //unlock screen - cmd = 'adb -s ' + emulator_id + ' shell input keyevent 82'; - shell.exec(cmd, {silent:false, async:false}); - - //return the new emulator id for the started emulators - return emulator_id; -} - -/* - * Waits for the new emulator to apear on the started-emulator list. - */ -module.exports.wait_for_emulator = function(num_running) { - var new_started = this.list_started(); - if (new_started.length > num_running) { - return new_started; - } else { - this.sleep(1); - return this.wait_for_emulator(num_running); - } -} - -/* - * Waits for the boot animation property of the emulator to switch to 'stopped' - */ -module.exports.wait_for_boot = function(emulator_id) { - var cmd; - // ShellJS opens a lot of file handles, and the default on OS X is too small. - // TODO : This is not working, need to find a better way to increese the ulimit. - if(process.platform == 'win32' || process.platform == 'win64') { - cmd = 'adb -s ' + emulator_id + ' shell getprop init.svc.bootanim'; - } else { - cmd = 'ulimit -S -n 4096; adb -s ' + emulator_id + ' shell getprop init.svc.bootanim'; - } - var boot_anim = shell.exec(cmd, {silent:true, async:false}); - if (boot_anim.output.match(/stopped/)) { - return; - } else { - process.stdout.write('.'); - this.sleep(3); - return this.wait_for_boot(emulator_id); - } -} - -/* - * TODO : find a better way to wait for the emulator (maybe using async methods?) - */ -module.exports.sleep = function(time_sec) { - if (process.platform == 'win32' || process.platform == 'win64') { - shell.exec('ping 127.0.0.1 -n ' + time_sec, {silent:true, async:false}); - } else { - shell.exec('sleep ' + time_sec, {silent:true, async:false}); - } -} - -/* - * Create avd - * TODO : Enter the stdin input required to complete the creation of an avd. - */ -module.exports.create_image = function(name, target) { - console.log('Creating avd named ' + name); - if (target) { - var cmd = 'android create avd --name ' + name + ' --target ' + target; - var create = shell.exec(cmd, {sient:false, async:false}); - if (create.error) { - console.error('ERROR : Failed to create emulator image : '); - console.error(' Do you have the latest android targets including ' + target + '?'); - console.error(create.output); - process.exit(2); - } - } else { - console.log('WARNING : Project target not found, creating avd with a different target but the project may fail to install.'); - var cmd = 'android create avd --name ' + name + ' --target ' + this.list_targets()[0]; - var create = shell.exec(cmd, {sient:false, async:false}); - if (create.error) { - console.error('ERROR : Failed to create emulator image : '); - console.error(create.output); - process.exit(2); - } - console.error('ERROR : Unable to create an avd emulator, no targets found.'); - console.error('Please insure you have targets availible by runing the "android" command'). - process.exit(2); - } -} - -/* - * Installs a previously built application on the emulator and launches it. - * If no target is specified, then it picks one. - * If no started emulators are found, error out. - */ -module.exports.install = function(target) { - var emulator_list = this.list_started(); - if (emulator_list.length < 1) { - console.error('ERROR : No started emulators found, please start an emultor before deploying your project.'); - process.exit(2); - /*console.log('WARNING : No started emulators found, attemting to start an avd...'); - this.start(this.best_image().name);*/ - } - // default emulator - target = typeof target !== 'undefined' ? target : emulator_list[0]; - if (emulator_list.indexOf(target) > -1) { - console.log('Installing app on emulator...'); - var apk_path = build.get_apk(); - var cmd = 'adb -s ' + target + ' install -r ' + apk_path; - var install = shell.exec(cmd, {sient:false, async:false}); - if (install.error || install.output.match(/Failure/)) { - console.error('ERROR : Failed to install apk to emulator : '); - console.error(install.output); - process.exit(2); - } - - //unlock screen - cmd = 'adb -s ' + target + ' shell input keyevent 82'; - shell.exec(cmd, {silent:true, async:false}); - - // launch the application - console.log('Launching application...'); - var launchName = appinfo.getActivityName(); - cmd = 'adb -s ' + target + ' shell am start -W -a android.intent.action.MAIN -n ' + launchName; - console.log(cmd); - var launch = shell.exec(cmd, {silent:false, async:false}); - if(launch.code > 0) { - console.error('ERROR : Failed to launch application on emulator : ' + launch.error); - console.error(launch.output); - process.exit(2); - } else { - console.log('LAUNCH SUCCESS'); - } - } else { - console.error('ERROR : Unable to find target \'' + target + '\'.'); - console.error('Failed to deploy to emulator.'); - process.exit(2); - } -} diff --git a/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/lib/install-device b/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/lib/install-device deleted file mode 100755 index 679efbf97..000000000 --- a/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/lib/install-device +++ /dev/null @@ -1,38 +0,0 @@ -#!/usr/bin/env node - -/* - Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.0 (the - "License"); you may not use this file except in compliance - with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, - software distributed under the License is distributed on an - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - KIND, either express or implied. See the License for the - specific language governing permissions and limitations - under the License. -*/ - -var device = require('./device'), - args = process.argv; - -if(args.length > 2) { - var install_target; - if (args[2].substring(0, 9) == '--target=') { - install_target = args[2].substring(9, args[2].length); - device.install(install_target); - process.exit(0); - } else { - console.error('ERROR : argument \'' + args[2] + '\' not recognized.'); - process.exit(2); - } -} else { - device.install(); - process.exit(0); -} diff --git a/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/lib/install-emulator b/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/lib/install-emulator deleted file mode 100755 index c006eb264..000000000 --- a/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/lib/install-emulator +++ /dev/null @@ -1,38 +0,0 @@ -#!/usr/bin/env node - -/* - Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.0 (the - "License"); you may not use this file except in compliance - with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, - software distributed under the License is distributed on an - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - KIND, either express or implied. See the License for the - specific language governing permissions and limitations - under the License. -*/ - -var emulator = require('./emulator'), - args = process.argv; - -if(args.length > 2) { - var install_target; - if (args[2].substring(0, 9) == '--target=') { - install_target = args[2].substring(9, args[2].length); - emulator.install(install_target); - process.exit(0); - } else { - console.error('ERROR : argument \'' + args[2] + '\' not recognized.'); - process.exit(2); - } -} else { - emulator.install(); - process.exit(0); -} diff --git a/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/lib/list-devices b/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/lib/list-devices deleted file mode 100755 index 3ef4efab2..000000000 --- a/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/lib/list-devices +++ /dev/null @@ -1,28 +0,0 @@ -#!/usr/bin/env node - -/* - Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.0 (the - "License"); you may not use this file except in compliance - with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, - software distributed under the License is distributed on an - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - KIND, either express or implied. See the License for the - specific language governing permissions and limitations - under the License. -*/ - -var devices = require('./device'); - -// Usage support for when args are given -var device_list = devices.list(); -for(device in device_list) { - console.log(device_list[device]); -} diff --git a/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/lib/list-emulator-images b/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/lib/list-emulator-images deleted file mode 100755 index 3230537a7..000000000 --- a/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/lib/list-emulator-images +++ /dev/null @@ -1,29 +0,0 @@ -#!/usr/bin/env node - -/* - Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.0 (the - "License"); you may not use this file except in compliance - with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, - software distributed under the License is distributed on an - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - KIND, either express or implied. See the License for the - specific language governing permissions and limitations - under the License. -*/ - -var emulators = require('./emulator'); - -// Usage support for when args are given -var emulator_list = emulators.list_images(); -for(emulator in emulator_list) { - console.log(emulator_list[emulator].name); - process.exit(0); -} diff --git a/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/lib/list-started-emulators b/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/lib/list-started-emulators deleted file mode 100755 index 525a64c17..000000000 --- a/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/lib/list-started-emulators +++ /dev/null @@ -1,29 +0,0 @@ -#!/usr/bin/env node - -/* - Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.0 (the - "License"); you may not use this file except in compliance - with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, - software distributed under the License is distributed on an - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - KIND, either express or implied. See the License for the - specific language governing permissions and limitations - under the License. -*/ - -var emulators = require('./emulator'); - -// Usage support for when args are given -var emulator_list = emulators.list_started(); -for(emulator in emulator_list) { - console.log(emulator_list[emulator]); - process.exit(0); -} diff --git a/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/lib/log.js b/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/lib/log.js deleted file mode 100755 index b85cf6063..000000000 --- a/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/lib/log.js +++ /dev/null @@ -1,43 +0,0 @@ -#!/usr/bin/env node - -/* - Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.0 (the - "License"); you may not use this file except in compliance - with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, - software distributed under the License is distributed on an - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - KIND, either express or implied. See the License for the - specific language governing permissions and limitations - under the License. -*/ - -var shell = require('shelljs'), - path = require('path'), - ROOT = path.join(__dirname, '..', '..'); - -/* - * Starts running logcat in the shell. - */ -module.exports.run = function() { - var cmd = 'adb logcat | grep -v nativeGetEnabledTags'; - var result = shell.exec(cmd, {silent:false, async:false}); - if (result.code > 0) { - console.error('ERROR: Failed to run logcat command.'); - console.error(result.output); - process.exit(2); - } -} - -module.exports.help = function() { - console.log('Usage: ' + path.relative(process.cwd(), path.join(ROOT, 'cordova', 'log'))); - console.log('Gives the logcat output on the command line.'); - process.exit(0); -} diff --git a/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/lib/run.js b/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/lib/run.js deleted file mode 100755 index 787d12325..000000000 --- a/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/lib/run.js +++ /dev/null @@ -1,124 +0,0 @@ -#!/usr/bin/env node - -/* - Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.0 (the - "License"); you may not use this file except in compliance - with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, - software distributed under the License is distributed on an - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - KIND, either express or implied. See the License for the - specific language governing permissions and limitations - under the License. -*/ - -var path = require('path'), - build = require('./build'), - emulator = require('./emulator'), - device = require('./device'), - ROOT = path.join(__dirname, '..', '..'); - -/* - * Runs the application on a device if availible. - * If not device is found, it will use a started emulator. - * If no started emulators are found it will attempt to start an avd. - * If no avds are found it will error out. - */ - module.exports.run = function(args) { - var build_type; - var install_target; - - for (var i=2; i -1) { - device.install(install_target); - } else if (started_emulators.indexOf(install_target) > -1) { - emulator.install(install_target); - } else { - // if target emulator isn't started, then start it. - var emulator_ID; - for(avd in avds) { - if(avds[avd].name == install_target) { - emulator_ID = emulator.start(install_target); - emulator.install(emulator_ID); - break; - } - } - if(!emulator_ID) { - console.error('ERROR : Target \'' + install_target + '\' not found, unalbe to run project'); - process.exit(2); - } - } - } else { - // no target given, deploy to device if availible, otherwise use the emulator. - var device_list = device.list(); - if (device_list.length > 0) { - console.log('WARNING : No target specified, deploying to device \'' + device_list[0] + '\'.'); - device.install(device_list[0]) - } else { - var emulator_list = emulator.list_started(); - if (emulator_list.length > 0) { - console.log('WARNING : No target specified, deploying to emulator \'' + emulator_list[0] + '\'.'); - emulator.install(emulator_list[0]); - } else { - console.log('WARNING : No started emulators found, starting an emulator.'); - var best_avd = emulator.best_image(); - if(best_avd) { - var emulator_ID = emulator.start(best_avd.name); - console.log('WARNING : No target specified, deploying to emulator \'' + emulator_ID + '\'.'); - emulator.install(emulator_ID); - } else { - emulator.start(); - } - } - } - } -} - -module.exports.help = function() { - console.log('Usage: ' + path.relative(process.cwd(), path.join(ROOT, 'cordova', 'run')) + ' [options]'); - console.log('Build options :'); - console.log(' --debug : Builds project in debug mode'); - console.log(' --release : Builds project in release mode'); - console.log(' --nobuild : Runs the currently built project without recompiling'); - console.log('Deploy options :'); - console.log(' --device : Will deploy the built project to a device'); - console.log(' --emulator : Will deploy the built project to an emulator if one exists'); - console.log(' --target= : Installs to the target with the specified id.'); - process.exit(0); -} diff --git a/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/lib/start-emulator b/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/lib/start-emulator deleted file mode 100755 index 5d6c4dd9e..000000000 --- a/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/lib/start-emulator +++ /dev/null @@ -1,38 +0,0 @@ -#!/usr/bin/env node - -/* - Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.0 (the - "License"); you may not use this file except in compliance - with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, - software distributed under the License is distributed on an - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - KIND, either express or implied. See the License for the - specific language governing permissions and limitations - under the License. -*/ - -var emulator = require('./emulator'), - args = process.argv; - -if(args.length > 2) { - var install_target; - if (args[2].substring(0, 9) == '--target=') { - install_target = args[2].substring(9, args[2].length); - emulator.start(install_target); - process.exit(0); - } else { - console.error('ERROR : argument \'' + args[2] + '\' not recognized.'); - process.exit(2); - } -} else { - emulator.start(); - process.exit(0); -} diff --git a/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/log b/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/log deleted file mode 100755 index 087325f8d..000000000 --- a/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/log +++ /dev/null @@ -1,33 +0,0 @@ -#!/usr/bin/env node - -/* - Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.0 (the - "License"); you may not use this file except in compliance - with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, - software distributed under the License is distributed on an - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - KIND, either express or implied. See the License for the - specific language governing permissions and limitations - under the License. -*/ - -var log = require('./lib/log'), - reqs = require('./lib/check_reqs'), - args = process.argv; - -// Usage support for when args are given -if(args.length > 2) { - log.help(); -} else if(reqs.run()) { - log.run(); -} else { - process.exit(2); -} diff --git a/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/run b/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/run deleted file mode 100755 index 57d73459b..000000000 --- a/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/run +++ /dev/null @@ -1,35 +0,0 @@ -#!/usr/bin/env node - -/* - Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.0 (the - "License"); you may not use this file except in compliance - with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, - software distributed under the License is distributed on an - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - KIND, either express or implied. See the License for the - specific language governing permissions and limitations - under the License. -*/ - -var run = require('./lib/run'), - reqs = require('./lib/check_reqs'), - args = process.argv; - -// Support basic help commands -if (args[2] == '--help' || args[2] == '/?' || args[2] == '-h' || - args[2] == 'help' || args[2] == '-help' || args[2] == '/help') { - run.help(); -} else if(reqs.run()) { - run.run(args); - process.exit(0); -} else { - process.exit(2); -} diff --git a/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/version b/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/version deleted file mode 100755 index de1a76dd4..000000000 --- a/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/cordova/version +++ /dev/null @@ -1,25 +0,0 @@ -#!/usr/bin/env node - -/* - Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.0 (the - "License"); you may not use this file except in compliance - with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, - software distributed under the License is distributed on an - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - KIND, either express or implied. See the License for the - specific language governing permissions and limitations - under the License. -*/ - -// Coho updates this line: -var VERSION = "3.1.0"; - -console.log(VERSION); diff --git a/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/local.properties b/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/local.properties deleted file mode 100644 index d3f507212..000000000 --- a/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/local.properties +++ /dev/null @@ -1,10 +0,0 @@ -# This file is automatically generated by Android Tools. -# Do not modify this file -- YOUR CHANGES WILL BE ERASED! -# -# This file must *NOT* be checked into Version Control Systems, -# as it contains information specific to your local configuration. - -# location of the SDK. This is only used by Ant -# For customization when using a Version Control System, please read the -# header note. -sdk.dir=/Users/braden/cordova/android/android-sdk-macosx diff --git a/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/proguard-project.txt b/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/proguard-project.txt deleted file mode 100644 index f2fe1559a..000000000 --- a/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/proguard-project.txt +++ /dev/null @@ -1,20 +0,0 @@ -# To enable ProGuard in your project, edit project.properties -# to define the proguard.config property as described in that file. -# -# Add project specific ProGuard rules here. -# By default, the flags in this file are appended to flags specified -# in ${sdk.dir}/tools/proguard/proguard-android.txt -# You can edit the include path and order by changing the ProGuard -# include property in project.properties. -# -# For more details, see -# http://developer.android.com/guide/developing/tools/proguard.html - -# Add any project specific keep options here: - -# If your project uses WebView with JS, uncomment the following -# and specify the fully qualified class name to the JavaScript interface -# class: -#-keepclassmembers class fqcn.of.javascript.interface.for.webview { -# public *; -#} diff --git a/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/project.properties b/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/project.properties deleted file mode 100644 index a3ee5ab64..000000000 --- a/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/project.properties +++ /dev/null @@ -1,14 +0,0 @@ -# This file is automatically generated by Android Tools. -# Do not modify this file -- YOUR CHANGES WILL BE ERASED! -# -# This file must be checked in Version Control Systems. -# -# To customize properties used by the Ant build system edit -# "ant.properties", and override values to adapt the script to your -# project structure. -# -# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home): -#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt - -# Project target. -target=android-17 diff --git a/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/res/drawable-hdpi/icon.png b/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/res/drawable-hdpi/icon.png deleted file mode 100644 index 4d27634485b3a20d8a0188107e84812f4f71084b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6080 zcmbVQWmHscyB@kl0Vx%Rc%`R+p}SK`8U%)6K$wtW7+OLJkr3%dKvIw{X%wVWLIDvJ zMLHzKgKvE2{CL;*iZj*;3DiM5qL3y?M`z!AZ;|o<0GX?snWdMdfxavPiv~IV z#(;d#xC=G_Ag|fS?i(83`FtAPfS9fT1ujL`n<_k(HE^g+PISU%VIEJe^%+P1H62 z)^)K`;C1!#!pVZcL?RJH6bE5FQDCTyj0_k81H)iq7YH%DFUHH!M+}4K`$vL05|8k7 z!+E)3F~Hvv9i6ZQF9qHUOaF2KjWaO#k6;Y`??7FI4D92G14BU&FdF^auRqavFB9bd zn(?n_yqPZ!2{u9Eu>?=VMLt~k{vlt)?!PPg4ZN^M_LisHMN%9+)UgNx8j11JQCHx- zH~~4kIm@c6XhLPA)MTVpVNkd<6sjVjBCakY1C>&Ns7Pr@LH?2PZ(K=;BwSKmLJba= zfI^`fP#H-Xh_s3dR8m?~N*tyF|A(uC!FxGk5XgV@x?Sk~o2&X?xw2}WNJlTMrx_OO z@lOR9xnjMrcvmbAsAeh&f&vX35pI~@JHHe3m%r*rPd9I*v!*8&4g530vTpxk0Zd&J zrlJOci%Y^_|L*x;T<8B!)W8?UfPa_A|0$P$wk~S$_w+x-f3f&a`yeqFJ>z-N9PawO zl>h+qrjELbna|w1jg80kY2R~{cM}^ZMe0eSdjIZE(x%|$o6t~J1LNGFyQVCctQ&&u zBy`AX3D)}w5sHmibSMkRDPJQaqANJQ-gQ#b+hbZYqd>#1uhji5TU3Ie@pJx14SzJT zCHUverUm^<6K_Fj;rWKFef#>_QQqEP)@2rt&%et|dc1$m&D|Msj-c*}D>w{yOZP{A z7tbe= zdiUsKiOC<_DI?;z&!&ZBkLM2EynG@}FISTbN|U9=qQ~C-xD*rfcy#a1sVS#+VR0Dh zL;aC2(dYxl8y6pR^u_JuWN-1AoXaJ-jgK6Zv!v2zm@2bpEwNmM)9rgi34%i=T<>#R zP)XqHorw4p9_*%&6@yH6@LBqFZW(Z=s;Wu_HDdRyJL0)unm)DB5r-*#IUnUTCPP9z zFmhK-2GYUX4xg%z<4Vih*@1F$a3z0~Mnk3P$F&u;QYz;Q?#my`1|Fn=PwJORzKsBL z=5O&0DW4;aoQks-h~f2mdp@AJq$XgQ*m^!9bF_oddy?3+1`HqAMJ zKr&AYOZbSEV_?{@U9&2pyZm8w80W9vUuNN!UJf2+0ibS|#D1hOYc!-@yUTOzdbFJtiN#~C zv@@ses8g4OOA$uyoDPUbhHXco4wEib*KcEGNqk|0+P#iO<$!3^S?jFK;C?(HZ-8Sc z%`HiT%qUv3M#pB`n?Rpl_y+aCUBZSmQnO~mw!xZI-CV$K3-!z)>{VwsvaZ$hK=x-h z@lL)v>?*sz(CVF-M={R;CpY?vmI3?k|D_59vs`3 z%Cl=3F)ytob&HQrO`-Cp)v|ZC{A176`AsVk-#ncsr5(YlFTolBZwe3MzlIj*G(SzyJW5lt zDGaAe67PFZ^kouhDh1&u`LYydx_?XHR}w20G%?u|(kBcUZm04c1fMXHe#OIxQS$F- zDg3zW1#*a?s-3`;>H3w($e{VL!^Z`mbwp;oo2I)uY&PruKyb81+j5Kevs%jciZ+wS z{n)sF&gB;6{2_A#`w8~-D+YGQ(LYsTTf4qY!uwWW&+K!MwmCOoT#ry-8O!$lrG=>? zzU|Gbx++`OoAjv{MDHF+)3a+@&l$%DDt`rIL>CHlUPhu9Iy#hRj-N(WwQ+LjSd>jw zIsmlz%8=Su?$!w>iP$_7cMGVu%YORerA~-0Y468vnUGmR+63~cMqtkIRDI{BoB`fK zv0zp&#j#eL8bT855D%KNWYHzVTdoo7T`IgP-@8*A zVu`vMf_SeynBUMW+y`Z?8LGnjv046bRclfyw#nAb_)e`okf&$3YyU@r%GZ6j%sGJI zRm#hz>3Wy-$7D_D=J(2_dUwCGG%QsQn{32SRmL`TirNLI*xK56=He%za-Ui%nrU%2 zw16`ahce0O>Yx0!vWSuH$R~M>{3ES}(r?#F6Xp0Gxs1+}7sj)3Y_Jl>$?`;U;WI9H z{-GNtOnnud_3Jh+i6p`AMh)vUr`b}}7hF{4sdLaX^6tQ?Knt8HzMngw_OfmDT3n|C z-iWi#L8y#+ON;b@Ay%389>D49Qt&Wf!=PsQcwx=YW9&-BvGP@P@ZCLS=;eA2(0fs< z_uuv~jUy_{{dZMXeBEBT^QhY2-^TQ(zy<4WKf9FJP*iVyha@JgHws-gwKm%mPodYR zdL0~2^X|*C8F^Enadn4Mx5P)Zz7`;yq(dKoa=0mXAUlPM9iIcAGf6V)Cs<*F3Ft@_ zw6~6 zJ-4`6+1A|E08md%*h19urzT_ggLRCrGAVmEu7e4fHi?mR?G0`9Te))56tTtoJr7~l z+hNTPS+(3qCeNQr{>c7`>;4y#ax9Am4d27#IbGnv(fX~4=%Wp-`#;3ZQd4=#rq*BE z!M->_$A){3*w>vO*%mExVz07jSjT^V0?>KCt@605^{9%TUQ(;kpqSC0-CT;R06>dk zra=iQ=|>a^Xza`Q>{BO+hdBd)5q|`If%`1g%YcD0ecpNjaKTjMJXfnKbORY?lZ1TP8bl0Bsx!f~Xg6Sfb`JQD}T@OM# zCD>(=YkjBKZgkk{=NfrI)SBT+#7L`^FX(~eM&thE2$j1CgxUf-< z#KHQTGRkhpdNT6wyHJ#qtnqj4rav%n-Wv*8)vQvNa~J_!BUD`NbXXNH*;GwYlvwGB z#GIpuJrrS?>ODj7$h7izO|1kh#mmn#0Fp%B6(*3@`rvwM?i zN{7PJ(N`+wxphB^EZ8AmhD^~LpKNm)T0APO#^0I9a=orxxNqMpvk@%9LjT3v`IVsA zQxYyNPL{RJhSoRVr<`4x8RB=xCHn+ILlu(xZTa0hEjc%8>F2JexOe6g9zeqt6415V zH?E=JEGkm4m2ODh?$($tBIZU>k?}hVJ zov8%8@lm=nGgV5-Udvf0X2|Y!HlQ|bHE-=yUvAIa|KE#%@YoW^hDnqzHIs_foTk6aJ?0QZ2DkEinzVPoN1D>O z^$`DuY3I$HO5Q5=^<98^bD_Fy%%u z2+fs6)3Z~OE<~M7Mx*U(tc$X;N*x%R^x#HC`X$=e+;I|AThF^#$1}P(ql|1OPETGx z*<(q#ZT{1<@Waqfs0r6~i+i9q!bHJ)oh|mGXQ5)CT9jk)ETU=&IXzTi-=pkt-{&fU zkn~0GsuOo}ZKLknI>`?W>XsiLkUz&WbTlf!2iJM#X?croKA`riwJrF=dC&H(93GLT ziCy4dk?VpJL{eavKJllAnxxv;ou{YJ-($TrvP5wydpt?t;GMBcU6D=M^?G@ zJD=^Z+jC5ICppA#M5SMQW{N-INRfT=J?GA(dzUnLMYdiH)L1ZGkyNF;v4%`HuRN!X zmrWBb{NnO$TfE&s764!R@z#7`wi$OoFDOs~vQZ7bx7FI<9{k}^DYx>PbxoWn)XS-?iRU-;%F@1)f^=nQ zE+zTot|kh2>y-RV|JO8xaZ0$&Fo#W1ID=R&=I-dQma@~=}VvsYU^uU{gcC&F%Ee%m+2v6E0P1j+ZpEExak>OPw-nVH7-Z;Z3^3 z8P7*c*xG)05J&P_xLgLT4Tw#TCpCH&OyXaZE1d=|`Y#5)*(~#D-n!S}>*|?FoAJ8w zK3R1$igF%5qA-^vV!=u>m%nf|M3It5eD#HBoWjY=(-ftUD~*fUuZ!DBY5hk0YKG_O*wcff$ z3Mhqh#>^IF`{~O0?iSn-VOwUi!|`|R-Q6tA4%1Ctm@`x_5l=pPp=(6WjOddL=JU2v z*y&-m7NwlO|Lf;knC#`C93gg=C_hx%1cd>3fBiXGF!qZhA8*kywHbfU|U$>G}tvEe8HRd36!1M+4 zEt!}ylb6h{=;t#>JDSKPuShdzR}pm*sBxLir=Lnpiyjx{1f4XDrUm3KC1r4Um)@2o zoJfd?+UD=AqN48{bz$28e7}~KY zPI3C&Oix*A(>}Cf>Z})oz7?hn3zt{5J_+M;NU>!(aH=XM%Z%x>qSBjjpLAyswh#t< zJtG7sWM^feKl*paX#_o{af)5UTJ$3;$XyI`g51-ja68WpDm?=6=D$f-r5s{p zobTo`pwNPe(iDKHMC%WpxfLf^-sRwAIz`7%i0!tVp=kO_4V3EW$>d{IDyQ79)7*@{ z_MK3MV66$8#Sp})Sq^6A=H?O+lL|dw3yC~eTImvE!xgF58fA^9wfBB@&CRhAxw582 zl61xT$xcF+4_i+-J~n&?Fqetw(Ve|NYv4BggNL2H#3e=?HEeqbSf+@42Jke$GCf_X zQ4(=VCA_{j@2LarrEU`?b)j&%Zo0r{~?x?6_qdn^tzZCZDSM7~q#CcB? zGct~$ez|49-Uv4md*~13-b(F zvlmb^D<8p$fx+zwBdf&GD%jUFatBc|(aqJWv9S*iXZPNJ_H6p&(2{NxY};t0=)GuMay~J6<6`@uCg{@3*adwT^WQzg(ECKdQO}=gOSvn()h3-Gu$RY9Xb8;H*v9h;` zoQ2`>ckG+4 z*Jn9B>kr@bHfVRCRfkjeWVSHzX>pfjEYr>HK9!$x&eNQB3=GU!3 z8Ydz9>1KDRE!E?&MmO8PjRwL@_OL5gSyo+S~j32bXAWI(43+?vBAmjpfN x7!UQ(CucrH2U}Yz;xlIQ9|EqN9x0Jf0&+IH2i=|^UjP25uA^b7UZLs``adt{1eE{) diff --git a/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/res/drawable-ldpi/icon.png b/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/res/drawable-ldpi/icon.png deleted file mode 100644 index cd5032a4f2e0b734d4bdece13564c4b55de963a6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3096 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 diff --git a/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/res/drawable-mdpi/icon.png b/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/res/drawable-mdpi/icon.png deleted file mode 100644 index e79c6062c1dcd9e98f092dbd7e51b5b76dd897d2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4090 zcmbVPc{tST+aFu@;zT4g#*%EaV3;u+!`Mzn_UsvBVk|S5!B~_j7;l{r=;LH#ITf$8Q3N;YtM*yH*$u0z-kvGnbU{1if2KhcGpa1|CccP^Y z)dp*f#FM?1a7QvqG;bdU8UR53PV>RxJqc8x3&D*@(gdxyc7lLJS543*RV)PSqf2ln z8V36jEP_oe@xh*Wge&NGEg*`9WGL_^P;o$-w-lLIqM*kmM3`!H^PNn)F!QjBaK&3!sC9Yn3zz`T122*56C{lt*R2)r_M3MZZ z0YjkR{fItPBAEm{(ui{*`%^VR3{U?K!P^Im{f}Z2<)1_`QU<2se85m82-w^ED6YSx zDO7X9|GM$7(iF=e9|G8%Kq344;TiR~BKZr<$lZT8bR@{|26@qs$S4ZV3q!{HdlN`h zBa9}9aiio)bVXv&`cQ74g4#^NaDYE0K@3R z(7F(~vMLPr?~(tFb^ZTj4a{%`eAFKQr(J%r7(IA&{7>^Ui2sZafy9^@KgMuyk7$$v z06elr7_=pAa?CCyPRvd4cgoq2+`U1qTV4fl=zWQ?aaQ>PU{W%NqIA47f8pHO$bxTf zWheL=Y~(8S(F(swa7>DLX4WS;cY_S;i9Bzm)&geNC#I)cch{~C)6+Y@45_KrQI=<> zdk#lAWAC*y=;h5lI;DeLU~^Y*eM$2Dq3*=?XB35bu_NLO=*+r$SM$!^(E4PE?2T9P zLF}s7J*KKgOPAfX=^e`2^G7fsA4d=L3UlqKS&zyPa;Z_$sj!G&;o{uZegH2=P}|4` zQwKZYT8z+Iv_ylD#>B2i_(e?E@gPC-x5q`9outoj-n_V=H|qia;MCLWdywMRI1u4| z2Cy{THg%)*&aUvLSYPjYW)Jq}S)H4tSclzUNMcc8cCJ%6s_8YQAO32EKe2i3nfysL zVIHpi+w2o9`L`cf{|UPt;if~A5#{m*X?35A!Ns|Ss&88K?PjH_SMx6Kzd5tu48bt% zdu!W{fgfL$XY<0GGa?-ItNuO&p=%ZkKvJVC7o|5m&FGhzgvVn83+vZaaj z77vg|lBS~4jHP-K{Dp7X*%rqpqYN(}E*L$ql*>ZVjb%Qr|NM4N^XH$lW^M)=Yuz?a ziX8HRhhc~3W(!~J1Z*~Pn^epyr#yU@z_c2pOsYlXJK8whS9{oo&9pA2USa9aDu^*Q z9)4wztR?jfQ~0ulv$ZvFWaJI&Q;?aA#m^DQ;+=w8TPfTq}+m*gDcX#N7vMFzeG+JzHRc5J1#>;J&FS3FEPB3 zvG#LLtDp3~tXNtq2WOVIaoH&(Du=eO-q0XZW~z{?@kw1d|AbEel=P-#irN7QVjM+jvjzA;gZc61{?Ra`s-{j(aTRP9&Z- zGi}pLPWtvCz-WI!ANPH?fr(bivvA!jlB?n^hF6wJj%Badk8N4bD#cdL>dx4M7|*0X z1g#QrOCGG}?9D!OpFP|c5lmpiNX%b4*Yxv;<*1I#2^0Gh-_Cc|w&<(H>TlG-yB^EL z1L_2JtkebW3vZlF(wAkPkHbhR3MA+OvZ^gnbI+vr(totHuKdo@_;J6u(+u=hF40Aa zCbx5%Eb&!jL!xgqsqNa*C;xt-1j9n6u3o-o$09S6WWE?(!I3iS@<%{skJoqQK&JYx z-@=?NZZv#hqZGHdCxu-*1PP|ZPfpogXA%$M*m68~ay(VIziqBWU8u5nNg&C@c$Acq zc8)_gBQBDK@8ms0Jc?WPysF<+Wp;v!u{DYsl1NH;m_e7#Lk*As?L0G@ghu}Mr7+rd^sZns#=dnMlx z%6haFDn=yo_a_7IWPYH_DcrAFt3Nqf_r+4_gS)r)(8Jrj+P&=u2L~O*uVOr<<)NAP zxrb|9Rt0Yw4gsDir#TzmOSFZ@D94?*C{+oU7FYh*DY=-YcLTcs)jW01qN}$a7fl^d z4s~8vdZiuu!qwzYP;HK*@Y{E`mpQtBnDx1}^UuXE)|5i>Y#wmHX5s;J1rLgt)+J~* z!c6KJG4!8UqM^D#(bLsqLs+b2QDuFGdr8iq+&!-NXy^EPugGt>PoGx#9EjBcHr>Q3 zGY!qP3E!w895SAFGh*>-(V6%PzcjP30EBiTolDfL{gVk7KfKNqTyI@0+gGFXt)<7Jt4^wFE(ldH{;07@su72t|lPNM0 z^h{Tw4Z?d?6#YYE(1GX~8^OjECA3lYSu=($@v?E{D`fR$tQ3*mE=5;(wx%^1R{GfN z8GP>f&5x^ZqKf#1_^Fxb;g%4N3!|`ye$#qF0e4%0kF9vN}WKRpg_>yL^TfoX9zz7|&y=l)1&{IwyxR z5i@r)0(jokhdA3s_9b2=2`U`MQY1LUSMCFG{HEtWd=Z$}VfW{)+2AxiCgurGZ?sU% z%lFucEMaE1X@V!o3Y|&yZ*kV<1`Vn{&C(&jJ-ot2)wzP+v=%IIo~+5R=}7}fUXZh> zIwc$RDZ5y_9{>v0GLW(39GH2^cV3M?#3k!n$FJ~yB+`wTkapFAKuot>(MFpQLJ_@IVg6pa++M9$h>jpu~f&y9)96mKEWoQ z;o3li-I&z&X5gew0Xf)mUq$C+peE9P`2y<=O9ac}WWJM*2oA zm`CrrTO_VFCRR4+vs{^&Sorachh>ip;*}FT8V3tzyEVUFG^-yBu{L+badMt`^R8=e zVKc*hp! z2YZhn?~iRR=3d)L24A*o^7|Y!$FA|zyPo2xaO!P%-lgU63qg8^Ls5^bX_J-Vl%bqu zI4&$KjK!gBaB$G_o%psz%gc6$fT+Mp7hPT5FLEO2s;wQ7Ad18i-owLVoS=<$14j!W zWaF&HctWO3NC(`^^AE0%JC+MR`a=-vx1>;6dk zm2rLU@7bxt%jW2b-X}w?pvh>1VG(wnEq3s|I}s5Pn=>;r_NGeVoC-9FXiAeH`$mR+ zM(!})K{U0NG~IGXXWWDBrAj9_Wky;quR!Xz_>K2tmS&$uU~m*_Cq7vWTd|Y1MR`;+YshYoBbT7wbR=?)tQT6s-QkHI7FJ3yq$lHf5|(|RHjKi+DI7tGDfQ-OS)))F`yr7%IhyS$#slD7Nf eTI2Uz01KeUnH^M8$gFYn8aL82!BpuuNB$2fN-7Zm diff --git a/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/res/drawable-xhdpi/icon.png b/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/res/drawable-xhdpi/icon.png deleted file mode 100644 index ec7ffbfbdafc58df28e6e89041ee21acd0f6177e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7685 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 diff --git a/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/res/drawable/icon.png b/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/res/drawable/icon.png deleted file mode 100644 index ec7ffbfbdafc58df28e6e89041ee21acd0f6177e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7685 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 diff --git a/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/res/values/strings.xml b/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/res/values/strings.xml deleted file mode 100644 index 1e706b395..000000000 --- a/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/res/values/strings.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - TestBase - diff --git a/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/res/xml/config.xml b/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/res/xml/config.xml deleted file mode 100644 index 17ca23749..000000000 --- a/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/res/xml/config.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - Hello Cordova - - A sample Apache Cordova application that responds to the deviceready event. - - - - - - - - Apache Cordova Team - - - - - diff --git a/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/src/org/testing/TestBase.java b/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/src/org/testing/TestBase.java deleted file mode 100644 index 928e074c2..000000000 --- a/cordova-lib/spec-cordova-plugins/fixtures/platforms/android/src/org/testing/TestBase.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.0 (the - "License"); you may not use this file except in compliance - with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, - software distributed under the License is distributed on an - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - KIND, either express or implied. See the License for the - specific language governing permissions and limitations - under the License. - */ - -package org.testing; - -import android.os.Bundle; -import org.apache.cordova.*; - -public class TestBase extends CordovaActivity -{ - @Override - public void onCreate(Bundle savedInstanceState) - { - super.onCreate(savedInstanceState); - super.init(); - // Set by in config.xml - super.loadUrl(Config.getStartUrl()); - //super.loadUrl("file:///android_asset/www/index.html") - } -} - diff --git a/cordova-lib/spec-cordova-plugins/fixtures/plugins/ChildBrowser/plugin.xml b/cordova-lib/spec-cordova-plugins/fixtures/plugins/ChildBrowser/plugin.xml deleted file mode 100644 index 11ddd86d3..000000000 --- a/cordova-lib/spec-cordova-plugins/fixtures/plugins/ChildBrowser/plugin.xml +++ /dev/null @@ -1,126 +0,0 @@ - - - - - - Child Browser - - - - - - - - - - - - - - No matter what platform you are installing to, this notice is very important. - - - - - - - - - - - - - - - - - - - - - - Please make sure you read this because it is very important to complete the installation of your plugin. - - - - - - - - - - - - - - - $APP_ID - - - - - - PackageName - $PACKAGE_NAME - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/cordova-lib/spec-cordova-plugins/fixtures/plugins/android/plugin.xml b/cordova-lib/spec-cordova-plugins/fixtures/plugins/android/plugin.xml deleted file mode 100644 index d8f561906..000000000 --- a/cordova-lib/spec-cordova-plugins/fixtures/plugins/android/plugin.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - Android Plugin - - - - - - - diff --git a/cordova-lib/spec-cordova-plugins/fixtures/plugins/android/src/android/Android.java b/cordova-lib/spec-cordova-plugins/fixtures/plugins/android/src/android/Android.java deleted file mode 100644 index e69de29bb..000000000 diff --git a/cordova-lib/spec-cordova-plugins/fixtures/plugins/android/src/android/SomethingWithR.java b/cordova-lib/spec-cordova-plugins/fixtures/plugins/android/src/android/SomethingWithR.java deleted file mode 100644 index c3af060d9..000000000 --- a/cordova-lib/spec-cordova-plugins/fixtures/plugins/android/src/android/SomethingWithR.java +++ /dev/null @@ -1,6 +0,0 @@ -import com.yourapp.R; - -import android.app.*; - -public class SomethingWithR { -} diff --git a/cordova-lib/spec-cordova-plugins/fixtures/plugins/android/www/android.js b/cordova-lib/spec-cordova-plugins/fixtures/plugins/android/www/android.js deleted file mode 100644 index e69de29bb..000000000 diff --git a/cordova-lib/spec-cordova-plugins/fixtures/plugins/fake1/plugin.xml b/cordova-lib/spec-cordova-plugins/fixtures/plugins/fake1/plugin.xml deleted file mode 100644 index ffdc650ad..000000000 --- a/cordova-lib/spec-cordova-plugins/fixtures/plugins/fake1/plugin.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - Fake1 - Cordova fake plugin for tests - Apache 2.0 - cordova,cli,test - diff --git a/cordova-lib/spec-cordova-plugins/fixtures/plugins/test/plugin.xml b/cordova-lib/spec-cordova-plugins/fixtures/plugins/test/plugin.xml deleted file mode 100644 index 774eda1de..000000000 --- a/cordova-lib/spec-cordova-plugins/fixtures/plugins/test/plugin.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - Test Plugin - - - - - - - diff --git a/cordova-lib/spec-cordova-plugins/fixtures/plugins/test/www/test.js b/cordova-lib/spec-cordova-plugins/fixtures/plugins/test/www/test.js deleted file mode 100644 index e69de29bb..000000000 diff --git a/cordova-lib/spec-cordova-plugins/fixtures/projects/windows/bom_test.xml b/cordova-lib/spec-cordova-plugins/fixtures/projects/windows/bom_test.xml deleted file mode 100644 index 57cadf65d..000000000 --- a/cordova-lib/spec-cordova-plugins/fixtures/projects/windows/bom_test.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - diff --git a/cordova-lib/spec-cordova-plugins/fixtures/templates/no_content_config.xml b/cordova-lib/spec-cordova-plugins/fixtures/templates/no_content_config.xml deleted file mode 100644 index 7c4ef3d2c..000000000 --- a/cordova-lib/spec-cordova-plugins/fixtures/templates/no_content_config.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - Hello Cordova - - - A sample Apache Cordova application that responds to the deviceready event. - - - - Apache Cordova Team - - - - - - diff --git a/cordova-lib/spec-cordova-plugins/helpers.js b/cordova-lib/spec-cordova-plugins/helpers.js deleted file mode 100644 index 3db75d5c9..000000000 --- a/cordova-lib/spec-cordova-plugins/helpers.js +++ /dev/null @@ -1,64 +0,0 @@ -/** - Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.0 (the - "License"); you may not use this file except in compliance - with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, - software distributed under the License is distributed on an - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - KIND, either express or implied. See the License for the - specific language governing permissions and limitations - under the License. -*/ - -var path = require('path'), - fs = require('fs'), - shell = require('shelljs'), - os = require('os'); - -module.exports.tmpDir = function(subdir) { - var dir = path.join(os.tmpdir(), 'e2e-test'); - if (subdir) { - dir = path.join(dir, subdir); - } - shell.mkdir('-p', dir); - return dir; -}; - -// Returns the platform that should be used for testing on this host platform. -/* -var host = os.platform(); -if (host.match(/win/)) { - module.exports.testPlatform = 'wp8'; -} else if (host.match(/darwin/)) { - module.exports.testPlatform = 'ios'; -} else { - module.exports.testPlatform = 'android'; -} -*/ - -// Just use Android everywhere; we're mocking out any calls to the `android` binary. -module.exports.testPlatform = 'android'; - -// Add the toExist matcher. -beforeEach(function() { - this.addMatchers({ - 'toExist': function() { - var notText = this.isNot ? ' not' : ''; - var self = this; - - this.message = function() { - return 'Expected file ' + self.actual + notText + ' to exist.'; - }; - - return fs.existsSync(this.actual); - } - }); -}); - diff --git a/cordova-lib/spec-cordova-plugins/plugin.spec.js b/cordova-lib/spec-cordova-plugins/plugin.spec.js index 3cce8bd97..42298006e 100644 --- a/cordova-lib/spec-cordova-plugins/plugin.spec.js +++ b/cordova-lib/spec-cordova-plugins/plugin.spec.js @@ -17,7 +17,7 @@ under the License. */ -var helpers = require('./helpers'), +var helpers = require('../fixtures-cordova/helpers'), path = require('path'), fs = require('fs'), shell = require('shelljs'), @@ -27,7 +27,7 @@ var helpers = require('./helpers'), var tmpDir = helpers.tmpDir('plugin_test'); var project = path.join(tmpDir, 'project'); -var pluginsDir = path.join(__dirname, 'fixtures', 'plugins'); +var pluginsDir = path.join(__dirname, '..', 'fixtures-cordova', 'plugins'); var pluginId = 'org.apache.cordova.fakeplugin1'; describe('plugin end-to-end', function() { @@ -47,10 +47,10 @@ describe('plugin end-to-end', function() { it('should successfully run', function(done) { // cp then mv because we need to copy everything, but that means it'll copy the whole directory. // Using /* doesn't work because of hidden files. - shell.cp('-R', path.join(__dirname, 'fixtures', 'base'), tmpDir); + shell.cp('-R', path.join(__dirname, '..', 'fixtures-cordova', 'base'), tmpDir); shell.mv(path.join(tmpDir, 'base'), project); // Copy some platform to avoid working on a project with no platforms. - shell.cp('-R', path.join(__dirname, 'fixtures', 'platforms', helpers.testPlatform), path.join(project, 'platforms')); + shell.cp('-R', path.join(__dirname, '..', 'fixtures-cordova', 'platforms', helpers.testPlatform), path.join(project, 'platforms')); process.chdir(project); events.on('results', function(res) { results = res; }); diff --git a/cordova-lib/spec-cordova-plugins/plugin_parser.spec.js b/cordova-lib/spec-cordova-plugins/plugin_parser.spec.js index 8776536b8..d1fbea414 100644 --- a/cordova-lib/spec-cordova-plugins/plugin_parser.spec.js +++ b/cordova-lib/spec-cordova-plugins/plugin_parser.spec.js @@ -21,7 +21,7 @@ var cordova = require('../src/cordova/cordova'), fs = require('fs'), plugin_parser = require('../src/cordova/plugins/plugin_parser'), et = require('elementtree'), - xml = path.join(__dirname, 'fixtures', 'plugins', 'test', 'plugin.xml'); + xml = path.join(__dirname, '..', 'fixtures-cordova', 'plugins', 'test', 'plugin.xml'); var xml_contents = fs.readFileSync(xml, 'utf-8'); diff --git a/cordova-lib/spec-cordova-project/create.spec.js b/cordova-lib/spec-cordova-project/create.spec.js index b28c0135f..0cf106b52 100644 --- a/cordova-lib/spec-cordova-project/create.spec.js +++ b/cordova-lib/spec-cordova-project/create.spec.js @@ -17,7 +17,7 @@ under the License. */ -var helpers = require('../spec-cordova/helpers'), +var helpers = require('../fixtures-cordova/helpers'), path = require('path'), fs = require('fs'), shell = require('shelljs'), @@ -50,7 +50,7 @@ var cordovaDir = path.join(project, '.cordova'); var configNormal = { lib: { www: { - url: path.join(__dirname, 'fixtures', 'base', 'www'), + url: path.join(__dirname, '..', 'fixtures-cordova', 'base', 'www'), version: "testCordovaCreate", id: appName } @@ -59,7 +59,7 @@ var configNormal = { var configSymlink = { lib: { www: { - url: path.join(__dirname, 'fixtures', 'base'), // "create" should copy or link the www child of this dir and not the dir itself. + url: path.join(__dirname, '..', 'fixtures-cordova', 'base'), // "create" should copy or link the www child of this dir and not the dir itself. link: true } } diff --git a/cordova-lib/spec-cordova-project/fixtures/base/.cordova/config.json b/cordova-lib/spec-cordova-project/fixtures/base/.cordova/config.json deleted file mode 100644 index 4f52ca7f0..000000000 --- a/cordova-lib/spec-cordova-project/fixtures/base/.cordova/config.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "id": "org.testing", - "name":"TestBase", - "lib": { - "android": { - "url": "/some/junk/path", - "version": "dev", - "id": "cordova-android-dev" - }, - "ios": { - "url": "/some/junk/path", - "version": "dev", - "id": "cordova-ios-dev" - }, - "wp8": { - "url": "/some/junk/path", - "version": "dev", - "id": "cordova-wp8-dev" - } - } -} - diff --git a/cordova-lib/spec-cordova-project/fixtures/base/merges/.svn b/cordova-lib/spec-cordova-project/fixtures/base/merges/.svn deleted file mode 100644 index e69de29bb..000000000 diff --git a/cordova-lib/spec-cordova-project/fixtures/base/plugins/.svn b/cordova-lib/spec-cordova-project/fixtures/base/plugins/.svn deleted file mode 100644 index e69de29bb..000000000 diff --git a/cordova-lib/spec-cordova-project/fixtures/base/www/config.xml b/cordova-lib/spec-cordova-project/fixtures/base/www/config.xml deleted file mode 100644 index 9e7b9e046..000000000 --- a/cordova-lib/spec-cordova-project/fixtures/base/www/config.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - TestBase - - A sample Apache Cordova application that responds to the deviceready event. - - - Apache Cordova Team - - - - - - diff --git a/cordova-lib/spec-cordova-project/fixtures/base/www/css/index.css b/cordova-lib/spec-cordova-project/fixtures/base/www/css/index.css deleted file mode 100644 index 51daa797c..000000000 --- a/cordova-lib/spec-cordova-project/fixtures/base/www/css/index.css +++ /dev/null @@ -1,115 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -* { - -webkit-tap-highlight-color: rgba(0,0,0,0); /* make transparent link selection, adjust last value opacity 0 to 1.0 */ -} - -body { - -webkit-touch-callout: none; /* prevent callout to copy image, etc when tap to hold */ - -webkit-text-size-adjust: none; /* prevent webkit from resizing text to fit */ - -webkit-user-select: none; /* prevent copy paste, to allow, change 'none' to 'text' */ - background-color:#E4E4E4; - background-image:linear-gradient(top, #A7A7A7 0%, #E4E4E4 51%); - background-image:-webkit-linear-gradient(top, #A7A7A7 0%, #E4E4E4 51%); - background-image:-ms-linear-gradient(top, #A7A7A7 0%, #E4E4E4 51%); - background-image:-webkit-gradient( - linear, - left top, - left bottom, - color-stop(0, #A7A7A7), - color-stop(0.51, #E4E4E4) - ); - background-attachment:fixed; - font-family:'HelveticaNeue-Light', 'HelveticaNeue', Helvetica, Arial, sans-serif; - font-size:12px; - height:100%; - margin:0px; - padding:0px; - text-transform:uppercase; - width:100%; -} - -/* Portrait layout (default) */ -.app { - background:url(../img/logo.png) no-repeat center top; /* 170px x 200px */ - position:absolute; /* position in the center of the screen */ - left:50%; - top:50%; - height:50px; /* text area height */ - width:225px; /* text area width */ - text-align:center; - padding:180px 0px 0px 0px; /* image height is 200px (bottom 20px are overlapped with text) */ - margin:-115px 0px 0px -112px; /* offset vertical: half of image height and text area height */ - /* offset horizontal: half of text area width */ -} - -/* Landscape layout (with min-width) */ -@media screen and (min-aspect-ratio: 1/1) and (min-width:400px) { - .app { - background-position:left center; - padding:75px 0px 75px 170px; /* padding-top + padding-bottom + text area = image height */ - margin:-90px 0px 0px -198px; /* offset vertical: half of image height */ - /* offset horizontal: half of image width and text area width */ - } -} - -h1 { - font-size:24px; - font-weight:normal; - margin:0px; - overflow:visible; - padding:0px; - text-align:center; -} - -.event { - border-radius:4px; - -webkit-border-radius:4px; - color:#FFFFFF; - font-size:12px; - margin:0px 30px; - padding:2px 0px; -} - -.event.listening { - background-color:#333333; - display:block; -} - -.event.received { - background-color:#4B946A; - display:none; -} - -@keyframes fade { - from { opacity: 1.0; } - 50% { opacity: 0.4; } - to { opacity: 1.0; } -} - -@-webkit-keyframes fade { - from { opacity: 1.0; } - 50% { opacity: 0.4; } - to { opacity: 1.0; } -} - -.blink { - animation:fade 3000ms infinite; - -webkit-animation:fade 3000ms infinite; -} diff --git a/cordova-lib/spec-cordova-project/fixtures/base/www/img/logo.png b/cordova-lib/spec-cordova-project/fixtures/base/www/img/logo.png deleted file mode 100644 index 9519e7dd78adb6e44548c08510a7bf02442a7697..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21814 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
Qfv&3%?A-1S}IU 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 - - - - - - - - - Hello World - - -
-

Apache Cordova

- -
- - - - - diff --git a/cordova-lib/spec-cordova-project/fixtures/base/www/js/index.js b/cordova-lib/spec-cordova-project/fixtures/base/www/js/index.js deleted file mode 100644 index 31d9064eb..000000000 --- a/cordova-lib/spec-cordova-project/fixtures/base/www/js/index.js +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -var app = { - // Application Constructor - initialize: function() { - this.bindEvents(); - }, - // Bind Event Listeners - // - // Bind any events that are required on startup. Common events are: - // 'load', 'deviceready', 'offline', and 'online'. - bindEvents: function() { - document.addEventListener('deviceready', this.onDeviceReady, false); - }, - // deviceready Event Handler - // - // The scope of 'this' is the event. In order to call the 'receivedEvent' - // function, we must explicity call 'app.receivedEvent(...);' - onDeviceReady: function() { - app.receivedEvent('deviceready'); - }, - // Update DOM on a Received Event - receivedEvent: function(id) { - var parentElement = document.getElementById(id); - var listeningElement = parentElement.querySelector('.listening'); - var receivedElement = parentElement.querySelector('.received'); - - listeningElement.setAttribute('style', 'display:none;'); - receivedElement.setAttribute('style', 'display:block;'); - - console.log('Received Event: ' + id); - } -}; diff --git a/cordova-lib/spec-cordova-project/fixtures/base/www/spec.html b/cordova-lib/spec-cordova-project/fixtures/base/www/spec.html deleted file mode 100644 index 71f00de05..000000000 --- a/cordova-lib/spec-cordova-project/fixtures/base/www/spec.html +++ /dev/null @@ -1,68 +0,0 @@ - - - - - Jasmine Spec Runner - - - - - - - - - - - - - - - - - - - - diff --git a/cordova-lib/spec-cordova-project/fixtures/hooks_bat/fail/fail.bat b/cordova-lib/spec-cordova-project/fixtures/hooks_bat/fail/fail.bat deleted file mode 100644 index a89b4c89c..000000000 --- a/cordova-lib/spec-cordova-project/fixtures/hooks_bat/fail/fail.bat +++ /dev/null @@ -1,2 +0,0 @@ -@ECHO OFF -EXIT /B 1 diff --git a/cordova-lib/spec-cordova-project/fixtures/hooks_bat/test/.dotted.bat b/cordova-lib/spec-cordova-project/fixtures/hooks_bat/test/.dotted.bat deleted file mode 100644 index ada7136e5..000000000 --- a/cordova-lib/spec-cordova-project/fixtures/hooks_bat/test/.dotted.bat +++ /dev/null @@ -1,2 +0,0 @@ -@ECHO OFF -ECHO "Dotted files in hook dirs should not be called" > dotted_hook_should_not_fire.txt \ No newline at end of file diff --git a/cordova-lib/spec-cordova-project/fixtures/hooks_bat/test/07.bat b/cordova-lib/spec-cordova-project/fixtures/hooks_bat/test/07.bat deleted file mode 100644 index a88c8c590..000000000 --- a/cordova-lib/spec-cordova-project/fixtures/hooks_bat/test/07.bat +++ /dev/null @@ -1,3 +0,0 @@ -@ECHO OFF -rem ECHO this is script 0 in %~dp0 -ECHO b >> hooks_order.txt diff --git a/cordova-lib/spec-cordova-project/fixtures/hooks_bat/test/1.bat b/cordova-lib/spec-cordova-project/fixtures/hooks_bat/test/1.bat deleted file mode 100644 index be004c530..000000000 --- a/cordova-lib/spec-cordova-project/fixtures/hooks_bat/test/1.bat +++ /dev/null @@ -1,5 +0,0 @@ -@ECHO OFF -rem ECHO this is script 1 in %~dp0 -ECHO a >> hooks_order.txt -ECHO %1 > hooks_params.txt -node -e "console.log(JSON.stringify(process.env, null, 2))" > hooks_env.json diff --git a/cordova-lib/spec-cordova-project/fixtures/hooks_sh/fail/fail.sh b/cordova-lib/spec-cordova-project/fixtures/hooks_sh/fail/fail.sh deleted file mode 100755 index 379a4c986..000000000 --- a/cordova-lib/spec-cordova-project/fixtures/hooks_sh/fail/fail.sh +++ /dev/null @@ -1 +0,0 @@ -exit 1 diff --git a/cordova-lib/spec-cordova-project/fixtures/hooks_sh/test/.dotted.sh b/cordova-lib/spec-cordova-project/fixtures/hooks_sh/test/.dotted.sh deleted file mode 100755 index e5fa07f91..000000000 --- a/cordova-lib/spec-cordova-project/fixtures/hooks_sh/test/.dotted.sh +++ /dev/null @@ -1 +0,0 @@ -echo "Dotted files in hook dirs should not be called" > dotted_hook_should_not_fire.txt diff --git a/cordova-lib/spec-cordova-project/fixtures/hooks_sh/test/07.sh b/cordova-lib/spec-cordova-project/fixtures/hooks_sh/test/07.sh deleted file mode 100755 index f410ee21f..000000000 --- a/cordova-lib/spec-cordova-project/fixtures/hooks_sh/test/07.sh +++ /dev/null @@ -1,2 +0,0 @@ -#echo "this is script 0 in `pwd`"; -echo b >> hooks_order.txt diff --git a/cordova-lib/spec-cordova-project/fixtures/hooks_sh/test/1.sh b/cordova-lib/spec-cordova-project/fixtures/hooks_sh/test/1.sh deleted file mode 100755 index 892869d7c..000000000 --- a/cordova-lib/spec-cordova-project/fixtures/hooks_sh/test/1.sh +++ /dev/null @@ -1,4 +0,0 @@ -#echo "this is script 1 in `pwd`"; -echo a >> hooks_order.txt -echo $1 > hooks_params.txt -node -e "console.log(JSON.stringify(process.env, null, 2))" > hooks_env.json diff --git a/cordova-lib/spec-cordova-project/fixtures/platforms/android-lib/VERSION b/cordova-lib/spec-cordova-project/fixtures/platforms/android-lib/VERSION deleted file mode 100644 index 15a279981..000000000 --- a/cordova-lib/spec-cordova-project/fixtures/platforms/android-lib/VERSION +++ /dev/null @@ -1 +0,0 @@ -3.3.0 diff --git a/cordova-lib/spec-cordova-project/fixtures/platforms/android-lib/framework/assets/www/cordova.js b/cordova-lib/spec-cordova-project/fixtures/platforms/android-lib/framework/assets/www/cordova.js deleted file mode 100644 index 91c51fce2..000000000 --- a/cordova-lib/spec-cordova-project/fixtures/platforms/android-lib/framework/assets/www/cordova.js +++ /dev/null @@ -1 +0,0 @@ -This is a placeholder file. diff --git a/cordova-lib/spec-cordova-project/fixtures/platforms/android/AndroidManifest.xml b/cordova-lib/spec-cordova-project/fixtures/platforms/android/AndroidManifest.xml deleted file mode 100644 index be3f245f7..000000000 --- a/cordova-lib/spec-cordova-project/fixtures/platforms/android/AndroidManifest.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - diff --git a/cordova-lib/spec-cordova-project/fixtures/platforms/android/assets/www/config.xml b/cordova-lib/spec-cordova-project/fixtures/platforms/android/assets/www/config.xml deleted file mode 100644 index 9e7b9e046..000000000 --- a/cordova-lib/spec-cordova-project/fixtures/platforms/android/assets/www/config.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - TestBase - - A sample Apache Cordova application that responds to the deviceready event. - - - Apache Cordova Team - - - - - - diff --git a/cordova-lib/spec-cordova-project/fixtures/platforms/android/assets/www/cordova.js b/cordova-lib/spec-cordova-project/fixtures/platforms/android/assets/www/cordova.js deleted file mode 100644 index 07e3feb46..000000000 --- a/cordova-lib/spec-cordova-project/fixtures/platforms/android/assets/www/cordova.js +++ /dev/null @@ -1,1712 +0,0 @@ -// Platform: android -// 3.1.0 -/* - Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.0 (the - "License"); you may not use this file except in compliance - with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, - software distributed under the License is distributed on an - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - KIND, either express or implied. See the License for the - specific language governing permissions and limitations - under the License. -*/ -;(function() { -var CORDOVA_JS_BUILD_LABEL = '3.1.0'; -// file: lib/scripts/require.js - -var require, - define; - -(function () { - var modules = {}, - // Stack of moduleIds currently being built. - requireStack = [], - // Map of module ID -> index into requireStack of modules currently being built. - inProgressModules = {}, - SEPERATOR = "."; - - - - function build(module) { - var factory = module.factory, - localRequire = function (id) { - var resultantId = id; - //Its a relative path, so lop off the last portion and add the id (minus "./") - if (id.charAt(0) === ".") { - resultantId = module.id.slice(0, module.id.lastIndexOf(SEPERATOR)) + SEPERATOR + id.slice(2); - } - return require(resultantId); - }; - module.exports = {}; - delete module.factory; - factory(localRequire, module.exports, module); - return module.exports; - } - - require = function (id) { - if (!modules[id]) { - throw "module " + id + " not found"; - } else if (id in inProgressModules) { - var cycle = requireStack.slice(inProgressModules[id]).join('->') + '->' + id; - throw "Cycle in require graph: " + cycle; - } - if (modules[id].factory) { - try { - inProgressModules[id] = requireStack.length; - requireStack.push(id); - return build(modules[id]); - } finally { - delete inProgressModules[id]; - requireStack.pop(); - } - } - return modules[id].exports; - }; - - define = function (id, factory) { - if (modules[id]) { - throw "module " + id + " already defined"; - } - - modules[id] = { - id: id, - factory: factory - }; - }; - - define.remove = function (id) { - delete modules[id]; - }; - - define.moduleMap = modules; -})(); - -//Export for use in node -if (typeof module === "object" && typeof require === "function") { - module.exports.require = require; - module.exports.define = define; -} - -// file: lib/cordova.js -define("cordova", function(require, exports, module) { - - -var channel = require('cordova/channel'); -var platform = require('cordova/platform'); - -/** - * Intercept calls to addEventListener + removeEventListener and handle deviceready, - * resume, and pause events. - */ -var m_document_addEventListener = document.addEventListener; -var m_document_removeEventListener = document.removeEventListener; -var m_window_addEventListener = window.addEventListener; -var m_window_removeEventListener = window.removeEventListener; - -/** - * Houses custom event handlers to intercept on document + window event listeners. - */ -var documentEventHandlers = {}, - windowEventHandlers = {}; - -document.addEventListener = function(evt, handler, capture) { - var e = evt.toLowerCase(); - if (typeof documentEventHandlers[e] != 'undefined') { - documentEventHandlers[e].subscribe(handler); - } else { - m_document_addEventListener.call(document, evt, handler, capture); - } -}; - -window.addEventListener = function(evt, handler, capture) { - var e = evt.toLowerCase(); - if (typeof windowEventHandlers[e] != 'undefined') { - windowEventHandlers[e].subscribe(handler); - } else { - m_window_addEventListener.call(window, evt, handler, capture); - } -}; - -document.removeEventListener = function(evt, handler, capture) { - var e = evt.toLowerCase(); - // If unsubscribing from an event that is handled by a plugin - if (typeof documentEventHandlers[e] != "undefined") { - documentEventHandlers[e].unsubscribe(handler); - } else { - m_document_removeEventListener.call(document, evt, handler, capture); - } -}; - -window.removeEventListener = function(evt, handler, capture) { - var e = evt.toLowerCase(); - // If unsubscribing from an event that is handled by a plugin - if (typeof windowEventHandlers[e] != "undefined") { - windowEventHandlers[e].unsubscribe(handler); - } else { - m_window_removeEventListener.call(window, evt, handler, capture); - } -}; - -function createEvent(type, data) { - var event = document.createEvent('Events'); - event.initEvent(type, false, false); - if (data) { - for (var i in data) { - if (data.hasOwnProperty(i)) { - event[i] = data[i]; - } - } - } - return event; -} - - -var cordova = { - define:define, - require:require, - version:CORDOVA_JS_BUILD_LABEL, - platformId:platform.id, - /** - * Methods to add/remove your own addEventListener hijacking on document + window. - */ - addWindowEventHandler:function(event) { - return (windowEventHandlers[event] = channel.create(event)); - }, - addStickyDocumentEventHandler:function(event) { - return (documentEventHandlers[event] = channel.createSticky(event)); - }, - addDocumentEventHandler:function(event) { - return (documentEventHandlers[event] = channel.create(event)); - }, - removeWindowEventHandler:function(event) { - delete windowEventHandlers[event]; - }, - removeDocumentEventHandler:function(event) { - delete documentEventHandlers[event]; - }, - /** - * Retrieve original event handlers that were replaced by Cordova - * - * @return object - */ - getOriginalHandlers: function() { - return {'document': {'addEventListener': m_document_addEventListener, 'removeEventListener': m_document_removeEventListener}, - 'window': {'addEventListener': m_window_addEventListener, 'removeEventListener': m_window_removeEventListener}}; - }, - /** - * Method to fire event from native code - * bNoDetach is required for events which cause an exception which needs to be caught in native code - */ - fireDocumentEvent: function(type, data, bNoDetach) { - var evt = createEvent(type, data); - if (typeof documentEventHandlers[type] != 'undefined') { - if( bNoDetach ) { - documentEventHandlers[type].fire(evt); - } - else { - setTimeout(function() { - // Fire deviceready on listeners that were registered before cordova.js was loaded. - if (type == 'deviceready') { - document.dispatchEvent(evt); - } - documentEventHandlers[type].fire(evt); - }, 0); - } - } else { - document.dispatchEvent(evt); - } - }, - fireWindowEvent: function(type, data) { - var evt = createEvent(type,data); - if (typeof windowEventHandlers[type] != 'undefined') { - setTimeout(function() { - windowEventHandlers[type].fire(evt); - }, 0); - } else { - window.dispatchEvent(evt); - } - }, - - /** - * Plugin callback mechanism. - */ - // Randomize the starting callbackId to avoid collisions after refreshing or navigating. - // This way, it's very unlikely that any new callback would get the same callbackId as an old callback. - callbackId: Math.floor(Math.random() * 2000000000), - callbacks: {}, - callbackStatus: { - NO_RESULT: 0, - OK: 1, - CLASS_NOT_FOUND_EXCEPTION: 2, - ILLEGAL_ACCESS_EXCEPTION: 3, - INSTANTIATION_EXCEPTION: 4, - MALFORMED_URL_EXCEPTION: 5, - IO_EXCEPTION: 6, - INVALID_ACTION: 7, - JSON_EXCEPTION: 8, - ERROR: 9 - }, - - /** - * Called by native code when returning successful result from an action. - */ - callbackSuccess: function(callbackId, args) { - try { - cordova.callbackFromNative(callbackId, true, args.status, [args.message], args.keepCallback); - } catch (e) { - console.log("Error in error callback: " + callbackId + " = "+e); - } - }, - - /** - * Called by native code when returning error result from an action. - */ - callbackError: function(callbackId, args) { - // TODO: Deprecate callbackSuccess and callbackError in favour of callbackFromNative. - // Derive success from status. - try { - cordova.callbackFromNative(callbackId, false, args.status, [args.message], args.keepCallback); - } catch (e) { - console.log("Error in error callback: " + callbackId + " = "+e); - } - }, - - /** - * Called by native code when returning the result from an action. - */ - callbackFromNative: function(callbackId, success, status, args, keepCallback) { - var callback = cordova.callbacks[callbackId]; - if (callback) { - if (success && status == cordova.callbackStatus.OK) { - callback.success && callback.success.apply(null, args); - } else if (!success) { - callback.fail && callback.fail.apply(null, args); - } - - // Clear callback if not expecting any more results - if (!keepCallback) { - delete cordova.callbacks[callbackId]; - } - } - }, - addConstructor: function(func) { - channel.onCordovaReady.subscribe(function() { - try { - func(); - } catch(e) { - console.log("Failed to run constructor: " + e); - } - }); - } -}; - - -module.exports = cordova; - -}); - -// file: lib/android/android/nativeapiprovider.js -define("cordova/android/nativeapiprovider", function(require, exports, module) { - -/** - * Exports the ExposedJsApi.java object if available, otherwise exports the PromptBasedNativeApi. - */ - -var nativeApi = this._cordovaNative || require('cordova/android/promptbasednativeapi'); -var currentApi = nativeApi; - -module.exports = { - get: function() { return currentApi; }, - setPreferPrompt: function(value) { - currentApi = value ? require('cordova/android/promptbasednativeapi') : nativeApi; - }, - // Used only by tests. - set: function(value) { - currentApi = value; - } -}; - -}); - -// file: lib/android/android/promptbasednativeapi.js -define("cordova/android/promptbasednativeapi", function(require, exports, module) { - -/** - * Implements the API of ExposedJsApi.java, but uses prompt() to communicate. - * This is used only on the 2.3 simulator, where addJavascriptInterface() is broken. - */ - -module.exports = { - exec: function(service, action, callbackId, argsJson) { - return prompt(argsJson, 'gap:'+JSON.stringify([service, action, callbackId])); - }, - setNativeToJsBridgeMode: function(value) { - prompt(value, 'gap_bridge_mode:'); - }, - retrieveJsMessages: function(fromOnlineEvent) { - return prompt(+fromOnlineEvent, 'gap_poll:'); - } -}; - -}); - -// file: lib/common/argscheck.js -define("cordova/argscheck", function(require, exports, module) { - -var exec = require('cordova/exec'); -var utils = require('cordova/utils'); - -var moduleExports = module.exports; - -var typeMap = { - 'A': 'Array', - 'D': 'Date', - 'N': 'Number', - 'S': 'String', - 'F': 'Function', - 'O': 'Object' -}; - -function extractParamName(callee, argIndex) { - return (/.*?\((.*?)\)/).exec(callee)[1].split(', ')[argIndex]; -} - -function checkArgs(spec, functionName, args, opt_callee) { - if (!moduleExports.enableChecks) { - return; - } - var errMsg = null; - var typeName; - for (var i = 0; i < spec.length; ++i) { - var c = spec.charAt(i), - cUpper = c.toUpperCase(), - arg = args[i]; - // Asterix means allow anything. - if (c == '*') { - continue; - } - typeName = utils.typeName(arg); - if ((arg === null || arg === undefined) && c == cUpper) { - continue; - } - if (typeName != typeMap[cUpper]) { - errMsg = 'Expected ' + typeMap[cUpper]; - break; - } - } - if (errMsg) { - errMsg += ', but got ' + typeName + '.'; - errMsg = 'Wrong type for parameter "' + extractParamName(opt_callee || args.callee, i) + '" of ' + functionName + ': ' + errMsg; - // Don't log when running unit tests. - if (typeof jasmine == 'undefined') { - console.error(errMsg); - } - throw TypeError(errMsg); - } -} - -function getValue(value, defaultValue) { - return value === undefined ? defaultValue : value; -} - -moduleExports.checkArgs = checkArgs; -moduleExports.getValue = getValue; -moduleExports.enableChecks = true; - - -}); - -// file: lib/common/base64.js -define("cordova/base64", function(require, exports, module) { - -var base64 = exports; - -base64.fromArrayBuffer = function(arrayBuffer) { - var array = new Uint8Array(arrayBuffer); - return uint8ToBase64(array); -}; - -//------------------------------------------------------------------------------ - -/* This code is based on the performance tests at http://jsperf.com/b64tests - * This 12-bit-at-a-time algorithm was the best performing version on all - * platforms tested. - */ - -var b64_6bit = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; -var b64_12bit; - -var b64_12bitTable = function() { - b64_12bit = []; - for (var i=0; i<64; i++) { - for (var j=0; j<64; j++) { - b64_12bit[i*64+j] = b64_6bit[i] + b64_6bit[j]; - } - } - b64_12bitTable = function() { return b64_12bit; }; - return b64_12bit; -}; - -function uint8ToBase64(rawData) { - var numBytes = rawData.byteLength; - var output=""; - var segment; - var table = b64_12bitTable(); - for (var i=0;i> 12]; - output += table[segment & 0xfff]; - } - if (numBytes - i == 2) { - segment = (rawData[i] << 16) + (rawData[i+1] << 8); - output += table[segment >> 12]; - output += b64_6bit[(segment & 0xfff) >> 6]; - output += '='; - } else if (numBytes - i == 1) { - segment = (rawData[i] << 16); - output += table[segment >> 12]; - output += '=='; - } - return output; -} - -}); - -// file: lib/common/builder.js -define("cordova/builder", function(require, exports, module) { - -var utils = require('cordova/utils'); - -function each(objects, func, context) { - for (var prop in objects) { - if (objects.hasOwnProperty(prop)) { - func.apply(context, [objects[prop], prop]); - } - } -} - -function clobber(obj, key, value) { - exports.replaceHookForTesting(obj, key); - obj[key] = value; - // Getters can only be overridden by getters. - if (obj[key] !== value) { - utils.defineGetter(obj, key, function() { - return value; - }); - } -} - -function assignOrWrapInDeprecateGetter(obj, key, value, message) { - if (message) { - utils.defineGetter(obj, key, function() { - console.log(message); - delete obj[key]; - clobber(obj, key, value); - return value; - }); - } else { - clobber(obj, key, value); - } -} - -function include(parent, objects, clobber, merge) { - each(objects, function (obj, key) { - try { - var result = obj.path ? require(obj.path) : {}; - - if (clobber) { - // Clobber if it doesn't exist. - if (typeof parent[key] === 'undefined') { - assignOrWrapInDeprecateGetter(parent, key, result, obj.deprecated); - } else if (typeof obj.path !== 'undefined') { - // If merging, merge properties onto parent, otherwise, clobber. - if (merge) { - recursiveMerge(parent[key], result); - } else { - assignOrWrapInDeprecateGetter(parent, key, result, obj.deprecated); - } - } - result = parent[key]; - } else { - // Overwrite if not currently defined. - if (typeof parent[key] == 'undefined') { - assignOrWrapInDeprecateGetter(parent, key, result, obj.deprecated); - } else { - // Set result to what already exists, so we can build children into it if they exist. - result = parent[key]; - } - } - - if (obj.children) { - include(result, obj.children, clobber, merge); - } - } catch(e) { - utils.alert('Exception building cordova JS globals: ' + e + ' for key "' + key + '"'); - } - }); -} - -/** - * Merge properties from one object onto another recursively. Properties from - * the src object will overwrite existing target property. - * - * @param target Object to merge properties into. - * @param src Object to merge properties from. - */ -function recursiveMerge(target, src) { - for (var prop in src) { - if (src.hasOwnProperty(prop)) { - if (target.prototype && target.prototype.constructor === target) { - // If the target object is a constructor override off prototype. - clobber(target.prototype, prop, src[prop]); - } else { - if (typeof src[prop] === 'object' && typeof target[prop] === 'object') { - recursiveMerge(target[prop], src[prop]); - } else { - clobber(target, prop, src[prop]); - } - } - } - } -} - -exports.buildIntoButDoNotClobber = function(objects, target) { - include(target, objects, false, false); -}; -exports.buildIntoAndClobber = function(objects, target) { - include(target, objects, true, false); -}; -exports.buildIntoAndMerge = function(objects, target) { - include(target, objects, true, true); -}; -exports.recursiveMerge = recursiveMerge; -exports.assignOrWrapInDeprecateGetter = assignOrWrapInDeprecateGetter; -exports.replaceHookForTesting = function() {}; - -}); - -// file: lib/common/channel.js -define("cordova/channel", function(require, exports, module) { - -var utils = require('cordova/utils'), - nextGuid = 1; - -/** - * Custom pub-sub "channel" that can have functions subscribed to it - * This object is used to define and control firing of events for - * cordova initialization, as well as for custom events thereafter. - * - * The order of events during page load and Cordova startup is as follows: - * - * onDOMContentLoaded* Internal event that is received when the web page is loaded and parsed. - * onNativeReady* Internal event that indicates the Cordova native side is ready. - * onCordovaReady* Internal event fired when all Cordova JavaScript objects have been created. - * onDeviceReady* User event fired to indicate that Cordova is ready - * onResume User event fired to indicate a start/resume lifecycle event - * onPause User event fired to indicate a pause lifecycle event - * onDestroy* Internal event fired when app is being destroyed (User should use window.onunload event, not this one). - * - * The events marked with an * are sticky. Once they have fired, they will stay in the fired state. - * All listeners that subscribe after the event is fired will be executed right away. - * - * The only Cordova events that user code should register for are: - * deviceready Cordova native code is initialized and Cordova APIs can be called from JavaScript - * pause App has moved to background - * resume App has returned to foreground - * - * Listeners can be registered as: - * document.addEventListener("deviceready", myDeviceReadyListener, false); - * document.addEventListener("resume", myResumeListener, false); - * document.addEventListener("pause", myPauseListener, false); - * - * The DOM lifecycle events should be used for saving and restoring state - * window.onload - * window.onunload - * - */ - -/** - * Channel - * @constructor - * @param type String the channel name - */ -var Channel = function(type, sticky) { - this.type = type; - // Map of guid -> function. - this.handlers = {}; - // 0 = Non-sticky, 1 = Sticky non-fired, 2 = Sticky fired. - this.state = sticky ? 1 : 0; - // Used in sticky mode to remember args passed to fire(). - this.fireArgs = null; - // Used by onHasSubscribersChange to know if there are any listeners. - this.numHandlers = 0; - // Function that is called when the first listener is subscribed, or when - // the last listener is unsubscribed. - this.onHasSubscribersChange = null; -}, - channel = { - /** - * Calls the provided function only after all of the channels specified - * have been fired. All channels must be sticky channels. - */ - join: function(h, c) { - var len = c.length, - i = len, - f = function() { - if (!(--i)) h(); - }; - for (var j=0; jNative bridge. - POLLING: 0, - // For LOAD_URL to be viable, it would need to have a work-around for - // the bug where the soft-keyboard gets dismissed when a message is sent. - LOAD_URL: 1, - // For the ONLINE_EVENT to be viable, it would need to intercept all event - // listeners (both through addEventListener and window.ononline) as well - // as set the navigator property itself. - ONLINE_EVENT: 2, - // Uses reflection to access private APIs of the WebView that can send JS - // to be executed. - // Requires Android 3.2.4 or above. - PRIVATE_API: 3 - }, - jsToNativeBridgeMode, // Set lazily. - nativeToJsBridgeMode = nativeToJsModes.ONLINE_EVENT, - pollEnabled = false, - messagesFromNative = []; - -function androidExec(success, fail, service, action, args) { - // Set default bridge modes if they have not already been set. - // By default, we use the failsafe, since addJavascriptInterface breaks too often - if (jsToNativeBridgeMode === undefined) { - androidExec.setJsToNativeBridgeMode(jsToNativeModes.JS_OBJECT); - } - - // Process any ArrayBuffers in the args into a string. - for (var i = 0; i < args.length; i++) { - if (utils.typeName(args[i]) == 'ArrayBuffer') { - args[i] = base64.fromArrayBuffer(args[i]); - } - } - - var callbackId = service + cordova.callbackId++, - argsJson = JSON.stringify(args); - - if (success || fail) { - cordova.callbacks[callbackId] = {success:success, fail:fail}; - } - - if (jsToNativeBridgeMode == jsToNativeModes.LOCATION_CHANGE) { - window.location = 'http://cdv_exec/' + service + '#' + action + '#' + callbackId + '#' + argsJson; - } else { - var messages = nativeApiProvider.get().exec(service, action, callbackId, argsJson); - // If argsJson was received by Java as null, try again with the PROMPT bridge mode. - // This happens in rare circumstances, such as when certain Unicode characters are passed over the bridge on a Galaxy S2. See CB-2666. - if (jsToNativeBridgeMode == jsToNativeModes.JS_OBJECT && messages === "@Null arguments.") { - androidExec.setJsToNativeBridgeMode(jsToNativeModes.PROMPT); - androidExec(success, fail, service, action, args); - androidExec.setJsToNativeBridgeMode(jsToNativeModes.JS_OBJECT); - return; - } else { - androidExec.processMessages(messages); - } - } -} - -function pollOnceFromOnlineEvent() { - pollOnce(true); -} - -function pollOnce(opt_fromOnlineEvent) { - var msg = nativeApiProvider.get().retrieveJsMessages(!!opt_fromOnlineEvent); - androidExec.processMessages(msg); -} - -function pollingTimerFunc() { - if (pollEnabled) { - pollOnce(); - setTimeout(pollingTimerFunc, 50); - } -} - -function hookOnlineApis() { - function proxyEvent(e) { - cordova.fireWindowEvent(e.type); - } - // The network module takes care of firing online and offline events. - // It currently fires them only on document though, so we bridge them - // to window here (while first listening for exec()-releated online/offline - // events). - window.addEventListener('online', pollOnceFromOnlineEvent, false); - window.addEventListener('offline', pollOnceFromOnlineEvent, false); - cordova.addWindowEventHandler('online'); - cordova.addWindowEventHandler('offline'); - document.addEventListener('online', proxyEvent, false); - document.addEventListener('offline', proxyEvent, false); -} - -hookOnlineApis(); - -androidExec.jsToNativeModes = jsToNativeModes; -androidExec.nativeToJsModes = nativeToJsModes; - -androidExec.setJsToNativeBridgeMode = function(mode) { - if (mode == jsToNativeModes.JS_OBJECT && !window._cordovaNative) { - console.log('Falling back on PROMPT mode since _cordovaNative is missing. Expected for Android 3.2 and lower only.'); - mode = jsToNativeModes.PROMPT; - } - nativeApiProvider.setPreferPrompt(mode == jsToNativeModes.PROMPT); - jsToNativeBridgeMode = mode; -}; - -androidExec.setNativeToJsBridgeMode = function(mode) { - if (mode == nativeToJsBridgeMode) { - return; - } - if (nativeToJsBridgeMode == nativeToJsModes.POLLING) { - pollEnabled = false; - } - - nativeToJsBridgeMode = mode; - // Tell the native side to switch modes. - nativeApiProvider.get().setNativeToJsBridgeMode(mode); - - if (mode == nativeToJsModes.POLLING) { - pollEnabled = true; - setTimeout(pollingTimerFunc, 1); - } -}; - -// Processes a single message, as encoded by NativeToJsMessageQueue.java. -function processMessage(message) { - try { - var firstChar = message.charAt(0); - if (firstChar == 'J') { - eval(message.slice(1)); - } else if (firstChar == 'S' || firstChar == 'F') { - var success = firstChar == 'S'; - var keepCallback = message.charAt(1) == '1'; - var spaceIdx = message.indexOf(' ', 2); - var status = +message.slice(2, spaceIdx); - var nextSpaceIdx = message.indexOf(' ', spaceIdx + 1); - var callbackId = message.slice(spaceIdx + 1, nextSpaceIdx); - var payloadKind = message.charAt(nextSpaceIdx + 1); - var payload; - if (payloadKind == 's') { - payload = message.slice(nextSpaceIdx + 2); - } else if (payloadKind == 't') { - payload = true; - } else if (payloadKind == 'f') { - payload = false; - } else if (payloadKind == 'N') { - payload = null; - } else if (payloadKind == 'n') { - payload = +message.slice(nextSpaceIdx + 2); - } else if (payloadKind == 'A') { - var data = message.slice(nextSpaceIdx + 2); - var bytes = window.atob(data); - var arraybuffer = new Uint8Array(bytes.length); - for (var i = 0; i < bytes.length; i++) { - arraybuffer[i] = bytes.charCodeAt(i); - } - payload = arraybuffer.buffer; - } else if (payloadKind == 'S') { - payload = window.atob(message.slice(nextSpaceIdx + 2)); - } else { - payload = JSON.parse(message.slice(nextSpaceIdx + 1)); - } - cordova.callbackFromNative(callbackId, success, status, [payload], keepCallback); - } else { - console.log("processMessage failed: invalid message:" + message); - } - } catch (e) { - console.log("processMessage failed: Message: " + message); - console.log("processMessage failed: Error: " + e); - console.log("processMessage failed: Stack: " + e.stack); - } -} - -// This is called from the NativeToJsMessageQueue.java. -androidExec.processMessages = function(messages) { - if (messages) { - messagesFromNative.push(messages); - // Check for the reentrant case, and enqueue the message if that's the case. - if (messagesFromNative.length > 1) { - return; - } - while (messagesFromNative.length) { - // Don't unshift until the end so that reentrancy can be detected. - messages = messagesFromNative[0]; - // The Java side can send a * message to indicate that it - // still has messages waiting to be retrieved. - if (messages == '*') { - messagesFromNative.shift(); - window.setTimeout(pollOnce, 0); - return; - } - - var spaceIdx = messages.indexOf(' '); - var msgLen = +messages.slice(0, spaceIdx); - var message = messages.substr(spaceIdx + 1, msgLen); - messages = messages.slice(spaceIdx + msgLen + 1); - processMessage(message); - if (messages) { - messagesFromNative[0] = messages; - } else { - messagesFromNative.shift(); - } - } - } -}; - -module.exports = androidExec; - -}); - -// file: lib/common/init.js -define("cordova/init", function(require, exports, module) { - -var channel = require('cordova/channel'); -var cordova = require('cordova'); -var modulemapper = require('cordova/modulemapper'); -var platform = require('cordova/platform'); -var pluginloader = require('cordova/pluginloader'); - -var platformInitChannelsArray = [channel.onNativeReady, channel.onPluginsReady]; - -function logUnfiredChannels(arr) { - for (var i = 0; i < arr.length; ++i) { - if (arr[i].state != 2) { - console.log('Channel not fired: ' + arr[i].type); - } - } -} - -window.setTimeout(function() { - if (channel.onDeviceReady.state != 2) { - console.log('deviceready has not fired after 5 seconds.'); - logUnfiredChannels(platformInitChannelsArray); - logUnfiredChannels(channel.deviceReadyChannelsArray); - } -}, 5000); - -// Replace navigator before any modules are required(), to ensure it happens as soon as possible. -// We replace it so that properties that can't be clobbered can instead be overridden. -function replaceNavigator(origNavigator) { - var CordovaNavigator = function() {}; - CordovaNavigator.prototype = origNavigator; - var newNavigator = new CordovaNavigator(); - // This work-around really only applies to new APIs that are newer than Function.bind. - // Without it, APIs such as getGamepads() break. - if (CordovaNavigator.bind) { - for (var key in origNavigator) { - if (typeof origNavigator[key] == 'function') { - newNavigator[key] = origNavigator[key].bind(origNavigator); - } - } - } - return newNavigator; -} -if (window.navigator) { - window.navigator = replaceNavigator(window.navigator); -} - -if (!window.console) { - window.console = { - log: function(){} - }; -} -if (!window.console.warn) { - window.console.warn = function(msg) { - this.log("warn: " + msg); - }; -} - -// Register pause, resume and deviceready channels as events on document. -channel.onPause = cordova.addDocumentEventHandler('pause'); -channel.onResume = cordova.addDocumentEventHandler('resume'); -channel.onDeviceReady = cordova.addStickyDocumentEventHandler('deviceready'); - -// Listen for DOMContentLoaded and notify our channel subscribers. -if (document.readyState == 'complete' || document.readyState == 'interactive') { - channel.onDOMContentLoaded.fire(); -} else { - document.addEventListener('DOMContentLoaded', function() { - channel.onDOMContentLoaded.fire(); - }, false); -} - -// _nativeReady is global variable that the native side can set -// to signify that the native code is ready. It is a global since -// it may be called before any cordova JS is ready. -if (window._nativeReady) { - channel.onNativeReady.fire(); -} - -modulemapper.clobbers('cordova', 'cordova'); -modulemapper.clobbers('cordova/exec', 'cordova.exec'); -modulemapper.clobbers('cordova/exec', 'Cordova.exec'); - -// Call the platform-specific initialization. -platform.bootstrap && platform.bootstrap(); - -pluginloader.load(function() { - channel.onPluginsReady.fire(); -}); - -/** - * Create all cordova objects once native side is ready. - */ -channel.join(function() { - modulemapper.mapModules(window); - - platform.initialize && platform.initialize(); - - // Fire event to notify that all objects are created - channel.onCordovaReady.fire(); - - // Fire onDeviceReady event once page has fully loaded, all - // constructors have run and cordova info has been received from native - // side. - channel.join(function() { - require('cordova').fireDocumentEvent('deviceready'); - }, channel.deviceReadyChannelsArray); - -}, platformInitChannelsArray); - - -}); - -// file: lib/common/modulemapper.js -define("cordova/modulemapper", function(require, exports, module) { - -var builder = require('cordova/builder'), - moduleMap = define.moduleMap, - symbolList, - deprecationMap; - -exports.reset = function() { - symbolList = []; - deprecationMap = {}; -}; - -function addEntry(strategy, moduleName, symbolPath, opt_deprecationMessage) { - if (!(moduleName in moduleMap)) { - throw new Error('Module ' + moduleName + ' does not exist.'); - } - symbolList.push(strategy, moduleName, symbolPath); - if (opt_deprecationMessage) { - deprecationMap[symbolPath] = opt_deprecationMessage; - } -} - -// Note: Android 2.3 does have Function.bind(). -exports.clobbers = function(moduleName, symbolPath, opt_deprecationMessage) { - addEntry('c', moduleName, symbolPath, opt_deprecationMessage); -}; - -exports.merges = function(moduleName, symbolPath, opt_deprecationMessage) { - addEntry('m', moduleName, symbolPath, opt_deprecationMessage); -}; - -exports.defaults = function(moduleName, symbolPath, opt_deprecationMessage) { - addEntry('d', moduleName, symbolPath, opt_deprecationMessage); -}; - -exports.runs = function(moduleName) { - addEntry('r', moduleName, null); -}; - -function prepareNamespace(symbolPath, context) { - if (!symbolPath) { - return context; - } - var parts = symbolPath.split('.'); - var cur = context; - for (var i = 0, part; part = parts[i]; ++i) { - cur = cur[part] = cur[part] || {}; - } - return cur; -} - -exports.mapModules = function(context) { - var origSymbols = {}; - context.CDV_origSymbols = origSymbols; - for (var i = 0, len = symbolList.length; i < len; i += 3) { - var strategy = symbolList[i]; - var moduleName = symbolList[i + 1]; - var module = require(moduleName); - // - if (strategy == 'r') { - continue; - } - var symbolPath = symbolList[i + 2]; - var lastDot = symbolPath.lastIndexOf('.'); - var namespace = symbolPath.substr(0, lastDot); - var lastName = symbolPath.substr(lastDot + 1); - - var deprecationMsg = symbolPath in deprecationMap ? 'Access made to deprecated symbol: ' + symbolPath + '. ' + deprecationMsg : null; - var parentObj = prepareNamespace(namespace, context); - var target = parentObj[lastName]; - - if (strategy == 'm' && target) { - builder.recursiveMerge(target, module); - } else if ((strategy == 'd' && !target) || (strategy != 'd')) { - if (!(symbolPath in origSymbols)) { - origSymbols[symbolPath] = target; - } - builder.assignOrWrapInDeprecateGetter(parentObj, lastName, module, deprecationMsg); - } - } -}; - -exports.getOriginalSymbol = function(context, symbolPath) { - var origSymbols = context.CDV_origSymbols; - if (origSymbols && (symbolPath in origSymbols)) { - return origSymbols[symbolPath]; - } - var parts = symbolPath.split('.'); - var obj = context; - for (var i = 0; i < parts.length; ++i) { - obj = obj && obj[parts[i]]; - } - return obj; -}; - -exports.reset(); - - -}); - -// file: lib/android/platform.js -define("cordova/platform", function(require, exports, module) { - -module.exports = { - id: 'android', - bootstrap: function() { - var channel = require('cordova/channel'), - cordova = require('cordova'), - exec = require('cordova/exec'), - modulemapper = require('cordova/modulemapper'); - - // Tell the native code that a page change has occurred. - exec(null, null, 'PluginManager', 'startup', []); - // Tell the JS that the native side is ready. - channel.onNativeReady.fire(); - - // TODO: Extract this as a proper plugin. - modulemapper.clobbers('cordova/plugin/android/app', 'navigator.app'); - - // Inject a listener for the backbutton on the document. - var backButtonChannel = cordova.addDocumentEventHandler('backbutton'); - backButtonChannel.onHasSubscribersChange = function() { - // If we just attached the first handler or detached the last handler, - // let native know we need to override the back button. - exec(null, null, "App", "overrideBackbutton", [this.numHandlers == 1]); - }; - - // Add hardware MENU and SEARCH button handlers - cordova.addDocumentEventHandler('menubutton'); - cordova.addDocumentEventHandler('searchbutton'); - - // Let native code know we are all done on the JS side. - // Native code will then un-hide the WebView. - channel.onCordovaReady.subscribe(function() { - exec(null, null, "App", "show", []); - }); - } -}; - -}); - -// file: lib/android/plugin/android/app.js -define("cordova/plugin/android/app", function(require, exports, module) { - -var exec = require('cordova/exec'); - -module.exports = { - /** - * Clear the resource cache. - */ - clearCache:function() { - exec(null, null, "App", "clearCache", []); - }, - - /** - * Load the url into the webview or into new browser instance. - * - * @param url The URL to load - * @param props Properties that can be passed in to the activity: - * wait: int => wait msec before loading URL - * loadingDialog: "Title,Message" => display a native loading dialog - * loadUrlTimeoutValue: int => time in msec to wait before triggering a timeout error - * clearHistory: boolean => clear webview history (default=false) - * openExternal: boolean => open in a new browser (default=false) - * - * Example: - * navigator.app.loadUrl("http://server/myapp/index.html", {wait:2000, loadingDialog:"Wait,Loading App", loadUrlTimeoutValue: 60000}); - */ - loadUrl:function(url, props) { - exec(null, null, "App", "loadUrl", [url, props]); - }, - - /** - * Cancel loadUrl that is waiting to be loaded. - */ - cancelLoadUrl:function() { - exec(null, null, "App", "cancelLoadUrl", []); - }, - - /** - * Clear web history in this web view. - * Instead of BACK button loading the previous web page, it will exit the app. - */ - clearHistory:function() { - exec(null, null, "App", "clearHistory", []); - }, - - /** - * Go to previous page displayed. - * This is the same as pressing the backbutton on Android device. - */ - backHistory:function() { - exec(null, null, "App", "backHistory", []); - }, - - /** - * Override the default behavior of the Android back button. - * If overridden, when the back button is pressed, the "backKeyDown" JavaScript event will be fired. - * - * Note: The user should not have to call this method. Instead, when the user - * registers for the "backbutton" event, this is automatically done. - * - * @param override T=override, F=cancel override - */ - overrideBackbutton:function(override) { - exec(null, null, "App", "overrideBackbutton", [override]); - }, - - /** - * Exit and terminate the application. - */ - exitApp:function() { - return exec(null, null, "App", "exitApp", []); - } -}; - -}); - -// file: lib/common/pluginloader.js -define("cordova/pluginloader", function(require, exports, module) { - -var modulemapper = require('cordova/modulemapper'); - -// Helper function to inject a - - - - diff --git a/cordova-lib/spec-cordova-project/fixtures/platforms/android/assets/www/js/index.js b/cordova-lib/spec-cordova-project/fixtures/platforms/android/assets/www/js/index.js deleted file mode 100644 index 31d9064eb..000000000 --- a/cordova-lib/spec-cordova-project/fixtures/platforms/android/assets/www/js/index.js +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -var app = { - // Application Constructor - initialize: function() { - this.bindEvents(); - }, - // Bind Event Listeners - // - // Bind any events that are required on startup. Common events are: - // 'load', 'deviceready', 'offline', and 'online'. - bindEvents: function() { - document.addEventListener('deviceready', this.onDeviceReady, false); - }, - // deviceready Event Handler - // - // The scope of 'this' is the event. In order to call the 'receivedEvent' - // function, we must explicity call 'app.receivedEvent(...);' - onDeviceReady: function() { - app.receivedEvent('deviceready'); - }, - // Update DOM on a Received Event - receivedEvent: function(id) { - var parentElement = document.getElementById(id); - var listeningElement = parentElement.querySelector('.listening'); - var receivedElement = parentElement.querySelector('.received'); - - listeningElement.setAttribute('style', 'display:none;'); - receivedElement.setAttribute('style', 'display:block;'); - - console.log('Received Event: ' + id); - } -}; diff --git a/cordova-lib/spec-cordova-project/fixtures/platforms/android/assets/www/spec.html b/cordova-lib/spec-cordova-project/fixtures/platforms/android/assets/www/spec.html deleted file mode 100644 index 71f00de05..000000000 --- a/cordova-lib/spec-cordova-project/fixtures/platforms/android/assets/www/spec.html +++ /dev/null @@ -1,68 +0,0 @@ - - - - - Jasmine Spec Runner - - - - - - - - - - - - - - - - - - - - diff --git a/cordova-lib/spec-cordova-project/fixtures/platforms/android/build.xml b/cordova-lib/spec-cordova-project/fixtures/platforms/android/build.xml deleted file mode 100644 index 9674edf7d..000000000 --- a/cordova-lib/spec-cordova-project/fixtures/platforms/android/build.xml +++ /dev/null @@ -1,92 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/build b/cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/build deleted file mode 100755 index 7028eb812..000000000 --- a/cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/build +++ /dev/null @@ -1,35 +0,0 @@ -#!/usr/bin/env node - -/* - Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.0 (the - "License"); you may not use this file except in compliance - with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, - software distributed under the License is distributed on an - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - KIND, either express or implied. See the License for the - specific language governing permissions and limitations - under the License. -*/ - -var build = require('./lib/build'), - reqs = require('./lib/check_reqs'), - args = process.argv; - -// Support basic help commands -if(args[2] == '--help' || args[2] == '/?' || args[2] == '-h' || - args[2] == 'help' || args[2] == '-help' || args[2] == '/help') { - build.help(); -} else if(reqs.run()) { - build.run(args[2]); - process.exit(0); -} else { - process.exit(2); -} diff --git a/cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/check_reqs b/cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/check_reqs deleted file mode 100755 index 4a8abee46..000000000 --- a/cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/check_reqs +++ /dev/null @@ -1,27 +0,0 @@ -#!/usr/bin/env node - -/* - Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.0 (the - "License"); you may not use this file except in compliance - with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, - software distributed under the License is distributed on an - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - KIND, either express or implied. See the License for the - specific language governing permissions and limitations - under the License. -*/ - -var check_reqs = require('./lib/check_reqs'); - -if(!check_reqs.run()) { - process.exit(2); -} - diff --git a/cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/clean b/cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/clean deleted file mode 100755 index 70c4ca80e..000000000 --- a/cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/clean +++ /dev/null @@ -1,34 +0,0 @@ -#!/usr/bin/env node - -/* - Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.0 (the - "License"); you may not use this file except in compliance - with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, - software distributed under the License is distributed on an - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - KIND, either express or implied. See the License for the - specific language governing permissions and limitations - under the License. -*/ - -var clean = require('./lib/clean'), - reqs = require('./lib/check_reqs'), - args = process.argv; - -// Usage support for when args are given -if(args.length > 2) { - clean.help(); -} else if(reqs.run()) { - clean.run(); - process.exit(0); -} else { - process.exit(2); -} diff --git a/cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/defaults.xml b/cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/defaults.xml deleted file mode 100644 index 24e572540..000000000 --- a/cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/defaults.xml +++ /dev/null @@ -1,50 +0,0 @@ - - - - Hello Cordova - - - A sample Apache Cordova application that responds to the deviceready event. - - - - Apache Cordova Team - - - - - - - - - - - - - - diff --git a/cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/lib/appinfo.js b/cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/lib/appinfo.js deleted file mode 100755 index 1f8ebe2cf..000000000 --- a/cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/lib/appinfo.js +++ /dev/null @@ -1,41 +0,0 @@ -#!/usr/bin/env node - -/* - Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.0 (the - "License"); you may not use this file except in compliance - with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, - software distributed under the License is distributed on an - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - KIND, either express or implied. See the License for the - specific language governing permissions and limitations - under the License. -*/ - -var path = require('path'); -var fs = require('fs'); -var cachedAppInfo = null; - -function readAppInfoFromManifest() { - var manifestPath = path.join(__dirname, '..', '..', 'AndroidManifest.xml'); - var manifestData = fs.readFileSync(manifestPath, {encoding:'utf8'}); - var packageName = /\bpackage\s*=\s*"(.+?)"/.exec(manifestData); - if (!packageName) throw new Error('Could not find package name within ' + manifestPath); - var activityTag = //.exec(manifestData); - if (!activityTag) throw new Error('Could not find within ' + manifestPath); - var activityName = /\bandroid:name\s*=\s*"(.+?)"/.exec(activityTag); - if (!activityName) throw new Error('Could not find android:name within ' + manifestPath); - - return packageName[1] + '/.' + activityName[1]; -} - -exports.getActivityName = function() { - return cachedAppInfo = cachedAppInfo || readAppInfoFromManifest(); -}; diff --git a/cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/lib/build.js b/cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/lib/build.js deleted file mode 100755 index 7bc33ca27..000000000 --- a/cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/lib/build.js +++ /dev/null @@ -1,89 +0,0 @@ -#!/usr/bin/env node - -/* - Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.0 (the - "License"); you may not use this file except in compliance - with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, - software distributed under the License is distributed on an - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - KIND, either express or implied. See the License for the - specific language governing permissions and limitations - under the License. -*/ - -var shell = require('shelljs'), - clean = require('./clean'), - path = require('path'), - fs = require('fs'), - ROOT = path.join(__dirname, '..', '..'); - -/* - * Builds the project with ant. - */ -module.exports.run = function(build_type) { - //default build type - build_type = typeof build_type !== 'undefined' ? build_type : "--debug"; - var cmd; - switch(build_type) { - case '--debug' : - clean.run(); - cmd = 'ant debug -f ' + path.join(ROOT, 'build.xml'); - break; - case '--release' : - clean.run(); - cmd = 'ant release -f ' + path.join(ROOT, 'build.xml'); - break; - case '--nobuild' : - console.log('Skipping build...'); - break; - default : - console.error('Build option \'' + build_type + '\' not recognized.'); - process.exit(2); - break; - } - if(cmd) { - var result = shell.exec(cmd, {silent:false, async:false}); - if(result.code > 0) { - console.error('ERROR: Failed to build android project.'); - console.error(result.output); - process.exit(2); - } - } -} - -/* - * Gets the path to the apk file, if not such file exists then - * the script will error out. (should we error or just return undefined?) - */ -module.exports.get_apk = function() { - if(fs.existsSync(path.join(ROOT, 'bin'))) { - var bin_files = fs.readdirSync(path.join(ROOT, 'bin')); - for (file in bin_files) { - if(path.extname(bin_files[file]) == '.apk') { - return path.join(ROOT, 'bin', bin_files[file]); - } - } - console.error('ERROR : No .apk found in \'bin\' folder'); - process.exit(2); - } else { - console.error('ERROR : unable to find project bin folder, could not locate .apk'); - process.exit(2); - } -} - -module.exports.help = function() { - console.log('Usage: ' + path.relative(process.cwd(), path.join(ROOT, 'cordova', 'build')) + ' [build_type]'); - console.log('Build Types : '); - console.log(' \'--debug\': Default build, will build project in using ant debug'); - console.log(' \'--release\': will build project using ant release'); - console.log(' \'--nobuild\': will skip build process (can be used with run command)'); - process.exit(0); -} diff --git a/cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/lib/check_reqs.js b/cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/lib/check_reqs.js deleted file mode 100755 index c064499f1..000000000 --- a/cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/lib/check_reqs.js +++ /dev/null @@ -1,78 +0,0 @@ -#!/usr/bin/env node - -/* - Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.0 (the - "License"); you may not use this file except in compliance - with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, - software distributed under the License is distributed on an - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - KIND, either express or implied. See the License for the - specific language governing permissions and limitations - under the License. -*/ - -var shell = require('shelljs'), - path = require('path'), - fs = require('fs'), - ROOT = path.join(__dirname, '..', '..'); - -// Get valid target from framework/project.properties -module.exports.get_target = function() { - if(fs.existsSync(path.join(ROOT, 'framework', 'project.properties'))) { - var target = shell.grep(/target=android-[\d+]/, path.join(ROOT, 'framework', 'project.properties')); - return target.split('=')[1].replace('\n', '').replace('\r', '').replace(' ', ''); - } else if (fs.existsSync(path.join(ROOT, 'project.properties'))) { - // if no target found, we're probably in a project and project.properties is in ROOT. - var target = shell.grep(/target=android-[\d+]/, path.join(ROOT, 'project.properties')); - return target.split('=')[1].replace('\n', '').replace('\r', '').replace(' ', ''); - } -} - -module.exports.check_ant = function() { - var test = shell.exec('ant -version', {silent:true, async:false}); - if(test.code > 0) { - console.error('ERROR : executing command \'ant\', make sure you have ant installed and added to your path.'); - return false; - } - return true; -} - -module.exports.check_java = function() { - if(process.env.JAVA_HOME) { - var test = shell.exec('java', {silent:true, async:false}); - if(test.code > 0) { - console.error('ERROR : executing command \'java\', make sure you java environment is set up. Including your JDK and JRE.'); - return false; - } - return true; - } else { - console.error('ERROR : Make sure JAVA_HOME is set, as well as paths to your JDK and JRE for java.'); - return false; - } -} - -module.exports.check_android = function() { - var valid_target = this.get_target(); - var targets = shell.exec('android list targets', {silent:true, async:false}); - - if(targets.code > 0 && targets.output.match(/command\snot\sfound/)) { - console.error('The command \"android\" failed. Make sure you have the latest Android SDK installed, and the \"android\" command (inside the tools/ folder) is added to your path.'); - return false; - } else if(!targets.output.match(valid_target)) { - console.error('Please install Android target ' + valid_target.split('-')[1] + ' (the Android newest SDK). Make sure you have the latest Android tools installed as well. Run \"android\" from your command-line to install/update any missing SDKs or tools.'); - return false; - } - return true; -} - -module.exports.run = function() { - return this.check_ant() && this.check_java && this.check_android(); -} diff --git a/cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/lib/clean.js b/cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/lib/clean.js deleted file mode 100755 index 8f140153e..000000000 --- a/cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/lib/clean.js +++ /dev/null @@ -1,43 +0,0 @@ -#!/usr/bin/env node - -/* - Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.0 (the - "License"); you may not use this file except in compliance - with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, - software distributed under the License is distributed on an - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - KIND, either express or implied. See the License for the - specific language governing permissions and limitations - under the License. -*/ - -var shell = require('shelljs'), - path = require('path'), - ROOT = path.join(__dirname, '..', '..'); - -/* - * Cleans the project using ant - */ -module.exports.run = function() { - var cmd = 'ant clean -f ' + path.join(ROOT, 'build.xml'); - var result = shell.exec(cmd, {silent:false, async:false}); - if (result.code > 0) { - console.error('ERROR: Failed to clean android project.'); - console.error(result.output); - process.exit(2); - } -} - -module.exports.help = function() { - console.log('Usage: ' + path.relative(process.cwd(), path.join(ROOT, 'cordova', 'clean'))); - console.log('Cleans the project directory.'); - process.exit(0); -} diff --git a/cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/lib/device.js b/cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/lib/device.js deleted file mode 100755 index 363dc2bd0..000000000 --- a/cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/lib/device.js +++ /dev/null @@ -1,95 +0,0 @@ -#!/usr/bin/env node - -/* - Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.0 (the - "License"); you may not use this file except in compliance - with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, - software distributed under the License is distributed on an - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - KIND, either express or implied. See the License for the - specific language governing permissions and limitations - under the License. -*/ - -var shell = require('shelljs'), - path = require('path'), - build = require('./build'), - appinfo = require('./appinfo'), - exec = require('child_process').exec, - ROOT = path.join(__dirname, '..', '..'); - -/** - * Returns a list of the device ID's found - */ -module.exports.list = function() { - var cmd = 'adb devices'; - var result = shell.exec(cmd, {silent:true, async:false}); - if (result.code > 0) { - console.error('Failed to execute android command \'' + cmd + '\'.'); - process.exit(2); - } else { - var response = result.output.split('\n'); - var device_list = []; - for (var i = 1; i < response.length; i++) { - if (response[i].match(/\w+\tdevice/) && !response[i].match(/emulator/)) { - device_list.push(response[i].replace(/\tdevice/, '').replace('\r', '')); - } - } - return device_list; - } -} - -/* - * Installs a previously built application on the device - * and launches it. - */ -module.exports.install = function(target) { - var device_list = this.list(); - if (device_list.length > 0) { - // default device - target = typeof target !== 'undefined' ? target : device_list[0]; - if (device_list.indexOf(target) > -1) { - var apk_path = build.get_apk(); - var launchName = appinfo.getActivityName(); - console.log('Installing app on device...'); - cmd = 'adb -s ' + target + ' install -r ' + apk_path; - var install = shell.exec(cmd, {silent:false, async:false}); - if (install.error || install.output.match(/Failure/)) { - console.error('ERROR : Failed to install apk to device : '); - console.error(install.output); - process.exit(2); - } - - //unlock screen - cmd = 'adb -s ' + target + ' shell input keyevent 82'; - shell.exec(cmd, {silent:true, async:false}); - - // launch the application - console.log('Launching application...'); - cmd = 'adb -s ' + target + ' shell am start -W -a android.intent.action.MAIN -n ' + launchName; - var launch = shell.exec(cmd, {silent:true, async:false}); - if(launch.code > 0) { - console.error('ERROR : Failed to launch application on emulator : ' + launch.error); - console.error(launch.output); - process.exit(2); - } else { - console.log('LAUNCH SUCCESS'); - } - } else { - console.error('ERROR : Unable to find target \'' + target + '\'.'); - console.error('Failed to deploy to device.'); - process.exit(2); - } - } else { - console.error('ERROR : Failed to deploy to device, no devices found.'); - process.exit(2); - } -} diff --git a/cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/lib/emulator.js b/cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/lib/emulator.js deleted file mode 100755 index cc658a9b9..000000000 --- a/cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/lib/emulator.js +++ /dev/null @@ -1,337 +0,0 @@ -#!/usr/bin/env node - -/* - Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.0 (the - "License"); you may not use this file except in compliance - with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, - software distributed under the License is distributed on an - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - KIND, either express or implied. See the License for the - specific language governing permissions and limitations - under the License. -*/ - -var shell = require('shelljs'), - path = require('path'), - appinfo = require('./appinfo'), - build = require('./build'), - ROOT = path.join(__dirname, '..', '..'), - new_emulator = 'cordova_emulator'; - -/** - * Returns a list of emulator images in the form of objects - * { - name : , - path : , - target : , - abi : , - skin : - } - */ -module.exports.list_images = function() { - var cmd = 'android list avds'; - var result = shell.exec(cmd, {silent:true, async:false}); - if (result.code > 0) { - console.error('Failed to execute android command \'' + cmd + '\'.'); - process.exit(2); - } else { - var response = result.output.split('\n'); - var emulator_list = []; - for (var i = 1; i < response.length; i++) { - // To return more detailed information use img_obj - var img_obj = {}; - if (response[i].match(/Name:\s/)) { - img_obj['name'] = response[i].split('Name: ')[1].replace('\r', ''); - if (response[i + 1].match(/Path:\s/)) { - i++; - img_obj['path'] = response[i].split('Path: ')[1].replace('\r', ''); - } - if (response[i + 1].match(/\(API\slevel\s/)) { - i++; - img_obj['target'] = response[i].replace('\r', ''); - } - if (response[i + 1].match(/ABI:\s/)) { - i++; - img_obj['abi'] = response[i].split('ABI: ')[1].replace('\r', ''); - } - if (response[i + 1].match(/Skin:\s/)) { - i++; - img_obj['skin'] = response[i].split('Skin: ')[1].replace('\r', ''); - } - - emulator_list.push(img_obj); - } - /* To just return a list of names use this - if (response[i].match(/Name:\s/)) { - emulator_list.push(response[i].split('Name: ')[1].replace('\r', ''); - }*/ - - } - return emulator_list; - } -} - -/** - * Will return the closest avd to the projects target - * or undefined if no avds exist. - */ -module.exports.best_image = function() { - var project_target = this.get_target().replace('android-', ''); - var images = this.list_images(); - var closest = 9999; - var best = images[0]; - for (i in images) { - var target = images[i].target; - if(target) { - var num = target.split('(API level ')[1].replace(')', ''); - if (num == project_target) { - return images[i]; - } else if (project_target - num < closest && project_target > num) { - var closest = project_target - num; - best = images[i]; - } - } - } - return best; -} - -module.exports.list_started = function() { - var cmd = 'adb devices'; - var result = shell.exec(cmd, {silent:true, async:false}); - if (result.code > 0) { - console.error('Failed to execute android command \'' + cmd + '\'.'); - process.exit(2); - } else { - var response = result.output.split('\n'); - var started_emulator_list = []; - for (var i = 1; i < response.length; i++) { - if (response[i].match(/device/) && response[i].match(/emulator/)) { - started_emulator_list.push(response[i].replace(/\tdevice/, '').replace('\r', '')); - } - } - return started_emulator_list; - } -} - -module.exports.get_target = function() { - var target = shell.grep(/target=android-[\d+]/, path.join(ROOT, 'project.properties')); - return target.split('=')[1].replace('\n', '').replace('\r', '').replace(' ', ''); -} - -module.exports.list_targets = function() { - var target_out = shell.exec('android list targets', {silent:true, async:false}).output.split('\n'); - var targets = []; - for (var i = target_out.length; i >= 0; i--) { - if(target_out[i].match(/id:/)) { - targets.push(targets[i].split(' ')[1]); - } - } - return targets; -} - -/* - * Starts an emulator with the given ID, - * and returns the started ID of that emulator. - * If no ID is given it will used the first image availible, - * if no image is availible it will error out (maybe create one?). - */ -module.exports.start = function(emulator_ID) { - var started_emulators = this.list_started(); - var num_started = started_emulators.length; - if (typeof emulator_ID === 'undefined') { - var emulator_list = this.list_images(); - if (emulator_list.length > 0) { - emulator_ID = this.best_image().name; - console.log('WARNING : no emulator specified, defaulting to ' + emulator_ID); - } else { - console.error('ERROR : No emulator images (avds) found, if you would like to create an'); - console.error(' avd follow the instructions provided here : '); - console.error(' http://developer.android.com/tools/devices/index.html') - console.error(' Or run \'android create avd --name --target \' '); - console.error(' in on the command line.'); - process.exit(2); - /*console.log('WARNING : no emulators availible, creating \'' + new_emulator + '\'.'); - this.create_image(new_emulator, this.get_target()); - emulator_ID = new_emulator;*/ - } - } - - var pipe_null = (process.platform == 'win32' || process.platform == 'win64'? '> NUL' : '> /dev/null'); - var cmd = 'emulator -avd ' + emulator_ID + ' ' + pipe_null + ' &'; - if(process.platform == 'win32' || process.platform == 'win64') { - cmd = '%comspec% /c start cmd /c ' + cmd; - } - var result = shell.exec(cmd, {silent:true, async:false}, function(code, output) { - if (code > 0) { - console.error('Failed to execute android command \'' + cmd + '\'.'); - console.error(output); - process.exit(2); - } - }); - - // wait for emulator to start - console.log('Waiting for emulator...'); - var new_started = this.wait_for_emulator(num_started); - var emulator_id; - if (new_started.length > 1) { - for (i in new_started) { - console.log(new_started[i]); - console.log(started_emulators.indexOf(new_started[i])); - if (started_emulators.indexOf(new_started[i]) < 0) { - emulator_id = new_started[i]; - } - } - } else { - emulator_id = new_started[0]; - } - if (!emulator_id) { - console.error('ERROR : Failed to start emulator, could not find new emulator'); - process.exit(2); - } - - //wait for emulator to boot up - process.stdout.write('Booting up emulator (this may take a while)...'); - this.wait_for_boot(emulator_id); - console.log('BOOT COMPLETE'); - - //unlock screen - cmd = 'adb -s ' + emulator_id + ' shell input keyevent 82'; - shell.exec(cmd, {silent:false, async:false}); - - //return the new emulator id for the started emulators - return emulator_id; -} - -/* - * Waits for the new emulator to apear on the started-emulator list. - */ -module.exports.wait_for_emulator = function(num_running) { - var new_started = this.list_started(); - if (new_started.length > num_running) { - return new_started; - } else { - this.sleep(1); - return this.wait_for_emulator(num_running); - } -} - -/* - * Waits for the boot animation property of the emulator to switch to 'stopped' - */ -module.exports.wait_for_boot = function(emulator_id) { - var cmd; - // ShellJS opens a lot of file handles, and the default on OS X is too small. - // TODO : This is not working, need to find a better way to increese the ulimit. - if(process.platform == 'win32' || process.platform == 'win64') { - cmd = 'adb -s ' + emulator_id + ' shell getprop init.svc.bootanim'; - } else { - cmd = 'ulimit -S -n 4096; adb -s ' + emulator_id + ' shell getprop init.svc.bootanim'; - } - var boot_anim = shell.exec(cmd, {silent:true, async:false}); - if (boot_anim.output.match(/stopped/)) { - return; - } else { - process.stdout.write('.'); - this.sleep(3); - return this.wait_for_boot(emulator_id); - } -} - -/* - * TODO : find a better way to wait for the emulator (maybe using async methods?) - */ -module.exports.sleep = function(time_sec) { - if (process.platform == 'win32' || process.platform == 'win64') { - shell.exec('ping 127.0.0.1 -n ' + time_sec, {silent:true, async:false}); - } else { - shell.exec('sleep ' + time_sec, {silent:true, async:false}); - } -} - -/* - * Create avd - * TODO : Enter the stdin input required to complete the creation of an avd. - */ -module.exports.create_image = function(name, target) { - console.log('Creating avd named ' + name); - if (target) { - var cmd = 'android create avd --name ' + name + ' --target ' + target; - var create = shell.exec(cmd, {sient:false, async:false}); - if (create.error) { - console.error('ERROR : Failed to create emulator image : '); - console.error(' Do you have the latest android targets including ' + target + '?'); - console.error(create.output); - process.exit(2); - } - } else { - console.log('WARNING : Project target not found, creating avd with a different target but the project may fail to install.'); - var cmd = 'android create avd --name ' + name + ' --target ' + this.list_targets()[0]; - var create = shell.exec(cmd, {sient:false, async:false}); - if (create.error) { - console.error('ERROR : Failed to create emulator image : '); - console.error(create.output); - process.exit(2); - } - console.error('ERROR : Unable to create an avd emulator, no targets found.'); - console.error('Please insure you have targets availible by runing the "android" command'). - process.exit(2); - } -} - -/* - * Installs a previously built application on the emulator and launches it. - * If no target is specified, then it picks one. - * If no started emulators are found, error out. - */ -module.exports.install = function(target) { - var emulator_list = this.list_started(); - if (emulator_list.length < 1) { - console.error('ERROR : No started emulators found, please start an emultor before deploying your project.'); - process.exit(2); - /*console.log('WARNING : No started emulators found, attemting to start an avd...'); - this.start(this.best_image().name);*/ - } - // default emulator - target = typeof target !== 'undefined' ? target : emulator_list[0]; - if (emulator_list.indexOf(target) > -1) { - console.log('Installing app on emulator...'); - var apk_path = build.get_apk(); - var cmd = 'adb -s ' + target + ' install -r ' + apk_path; - var install = shell.exec(cmd, {sient:false, async:false}); - if (install.error || install.output.match(/Failure/)) { - console.error('ERROR : Failed to install apk to emulator : '); - console.error(install.output); - process.exit(2); - } - - //unlock screen - cmd = 'adb -s ' + target + ' shell input keyevent 82'; - shell.exec(cmd, {silent:true, async:false}); - - // launch the application - console.log('Launching application...'); - var launchName = appinfo.getActivityName(); - cmd = 'adb -s ' + target + ' shell am start -W -a android.intent.action.MAIN -n ' + launchName; - console.log(cmd); - var launch = shell.exec(cmd, {silent:false, async:false}); - if(launch.code > 0) { - console.error('ERROR : Failed to launch application on emulator : ' + launch.error); - console.error(launch.output); - process.exit(2); - } else { - console.log('LAUNCH SUCCESS'); - } - } else { - console.error('ERROR : Unable to find target \'' + target + '\'.'); - console.error('Failed to deploy to emulator.'); - process.exit(2); - } -} diff --git a/cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/lib/install-device b/cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/lib/install-device deleted file mode 100755 index 679efbf97..000000000 --- a/cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/lib/install-device +++ /dev/null @@ -1,38 +0,0 @@ -#!/usr/bin/env node - -/* - Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.0 (the - "License"); you may not use this file except in compliance - with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, - software distributed under the License is distributed on an - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - KIND, either express or implied. See the License for the - specific language governing permissions and limitations - under the License. -*/ - -var device = require('./device'), - args = process.argv; - -if(args.length > 2) { - var install_target; - if (args[2].substring(0, 9) == '--target=') { - install_target = args[2].substring(9, args[2].length); - device.install(install_target); - process.exit(0); - } else { - console.error('ERROR : argument \'' + args[2] + '\' not recognized.'); - process.exit(2); - } -} else { - device.install(); - process.exit(0); -} diff --git a/cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/lib/install-emulator b/cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/lib/install-emulator deleted file mode 100755 index c006eb264..000000000 --- a/cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/lib/install-emulator +++ /dev/null @@ -1,38 +0,0 @@ -#!/usr/bin/env node - -/* - Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.0 (the - "License"); you may not use this file except in compliance - with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, - software distributed under the License is distributed on an - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - KIND, either express or implied. See the License for the - specific language governing permissions and limitations - under the License. -*/ - -var emulator = require('./emulator'), - args = process.argv; - -if(args.length > 2) { - var install_target; - if (args[2].substring(0, 9) == '--target=') { - install_target = args[2].substring(9, args[2].length); - emulator.install(install_target); - process.exit(0); - } else { - console.error('ERROR : argument \'' + args[2] + '\' not recognized.'); - process.exit(2); - } -} else { - emulator.install(); - process.exit(0); -} diff --git a/cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/lib/list-devices b/cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/lib/list-devices deleted file mode 100755 index 3ef4efab2..000000000 --- a/cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/lib/list-devices +++ /dev/null @@ -1,28 +0,0 @@ -#!/usr/bin/env node - -/* - Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.0 (the - "License"); you may not use this file except in compliance - with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, - software distributed under the License is distributed on an - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - KIND, either express or implied. See the License for the - specific language governing permissions and limitations - under the License. -*/ - -var devices = require('./device'); - -// Usage support for when args are given -var device_list = devices.list(); -for(device in device_list) { - console.log(device_list[device]); -} diff --git a/cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/lib/list-emulator-images b/cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/lib/list-emulator-images deleted file mode 100755 index 3230537a7..000000000 --- a/cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/lib/list-emulator-images +++ /dev/null @@ -1,29 +0,0 @@ -#!/usr/bin/env node - -/* - Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.0 (the - "License"); you may not use this file except in compliance - with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, - software distributed under the License is distributed on an - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - KIND, either express or implied. See the License for the - specific language governing permissions and limitations - under the License. -*/ - -var emulators = require('./emulator'); - -// Usage support for when args are given -var emulator_list = emulators.list_images(); -for(emulator in emulator_list) { - console.log(emulator_list[emulator].name); - process.exit(0); -} diff --git a/cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/lib/list-started-emulators b/cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/lib/list-started-emulators deleted file mode 100755 index 525a64c17..000000000 --- a/cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/lib/list-started-emulators +++ /dev/null @@ -1,29 +0,0 @@ -#!/usr/bin/env node - -/* - Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.0 (the - "License"); you may not use this file except in compliance - with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, - software distributed under the License is distributed on an - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - KIND, either express or implied. See the License for the - specific language governing permissions and limitations - under the License. -*/ - -var emulators = require('./emulator'); - -// Usage support for when args are given -var emulator_list = emulators.list_started(); -for(emulator in emulator_list) { - console.log(emulator_list[emulator]); - process.exit(0); -} diff --git a/cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/lib/log.js b/cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/lib/log.js deleted file mode 100755 index b85cf6063..000000000 --- a/cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/lib/log.js +++ /dev/null @@ -1,43 +0,0 @@ -#!/usr/bin/env node - -/* - Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.0 (the - "License"); you may not use this file except in compliance - with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, - software distributed under the License is distributed on an - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - KIND, either express or implied. See the License for the - specific language governing permissions and limitations - under the License. -*/ - -var shell = require('shelljs'), - path = require('path'), - ROOT = path.join(__dirname, '..', '..'); - -/* - * Starts running logcat in the shell. - */ -module.exports.run = function() { - var cmd = 'adb logcat | grep -v nativeGetEnabledTags'; - var result = shell.exec(cmd, {silent:false, async:false}); - if (result.code > 0) { - console.error('ERROR: Failed to run logcat command.'); - console.error(result.output); - process.exit(2); - } -} - -module.exports.help = function() { - console.log('Usage: ' + path.relative(process.cwd(), path.join(ROOT, 'cordova', 'log'))); - console.log('Gives the logcat output on the command line.'); - process.exit(0); -} diff --git a/cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/lib/run.js b/cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/lib/run.js deleted file mode 100755 index 787d12325..000000000 --- a/cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/lib/run.js +++ /dev/null @@ -1,124 +0,0 @@ -#!/usr/bin/env node - -/* - Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.0 (the - "License"); you may not use this file except in compliance - with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, - software distributed under the License is distributed on an - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - KIND, either express or implied. See the License for the - specific language governing permissions and limitations - under the License. -*/ - -var path = require('path'), - build = require('./build'), - emulator = require('./emulator'), - device = require('./device'), - ROOT = path.join(__dirname, '..', '..'); - -/* - * Runs the application on a device if availible. - * If not device is found, it will use a started emulator. - * If no started emulators are found it will attempt to start an avd. - * If no avds are found it will error out. - */ - module.exports.run = function(args) { - var build_type; - var install_target; - - for (var i=2; i -1) { - device.install(install_target); - } else if (started_emulators.indexOf(install_target) > -1) { - emulator.install(install_target); - } else { - // if target emulator isn't started, then start it. - var emulator_ID; - for(avd in avds) { - if(avds[avd].name == install_target) { - emulator_ID = emulator.start(install_target); - emulator.install(emulator_ID); - break; - } - } - if(!emulator_ID) { - console.error('ERROR : Target \'' + install_target + '\' not found, unalbe to run project'); - process.exit(2); - } - } - } else { - // no target given, deploy to device if availible, otherwise use the emulator. - var device_list = device.list(); - if (device_list.length > 0) { - console.log('WARNING : No target specified, deploying to device \'' + device_list[0] + '\'.'); - device.install(device_list[0]) - } else { - var emulator_list = emulator.list_started(); - if (emulator_list.length > 0) { - console.log('WARNING : No target specified, deploying to emulator \'' + emulator_list[0] + '\'.'); - emulator.install(emulator_list[0]); - } else { - console.log('WARNING : No started emulators found, starting an emulator.'); - var best_avd = emulator.best_image(); - if(best_avd) { - var emulator_ID = emulator.start(best_avd.name); - console.log('WARNING : No target specified, deploying to emulator \'' + emulator_ID + '\'.'); - emulator.install(emulator_ID); - } else { - emulator.start(); - } - } - } - } -} - -module.exports.help = function() { - console.log('Usage: ' + path.relative(process.cwd(), path.join(ROOT, 'cordova', 'run')) + ' [options]'); - console.log('Build options :'); - console.log(' --debug : Builds project in debug mode'); - console.log(' --release : Builds project in release mode'); - console.log(' --nobuild : Runs the currently built project without recompiling'); - console.log('Deploy options :'); - console.log(' --device : Will deploy the built project to a device'); - console.log(' --emulator : Will deploy the built project to an emulator if one exists'); - console.log(' --target= : Installs to the target with the specified id.'); - process.exit(0); -} diff --git a/cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/lib/start-emulator b/cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/lib/start-emulator deleted file mode 100755 index 5d6c4dd9e..000000000 --- a/cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/lib/start-emulator +++ /dev/null @@ -1,38 +0,0 @@ -#!/usr/bin/env node - -/* - Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.0 (the - "License"); you may not use this file except in compliance - with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, - software distributed under the License is distributed on an - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - KIND, either express or implied. See the License for the - specific language governing permissions and limitations - under the License. -*/ - -var emulator = require('./emulator'), - args = process.argv; - -if(args.length > 2) { - var install_target; - if (args[2].substring(0, 9) == '--target=') { - install_target = args[2].substring(9, args[2].length); - emulator.start(install_target); - process.exit(0); - } else { - console.error('ERROR : argument \'' + args[2] + '\' not recognized.'); - process.exit(2); - } -} else { - emulator.start(); - process.exit(0); -} diff --git a/cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/log b/cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/log deleted file mode 100755 index 087325f8d..000000000 --- a/cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/log +++ /dev/null @@ -1,33 +0,0 @@ -#!/usr/bin/env node - -/* - Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.0 (the - "License"); you may not use this file except in compliance - with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, - software distributed under the License is distributed on an - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - KIND, either express or implied. See the License for the - specific language governing permissions and limitations - under the License. -*/ - -var log = require('./lib/log'), - reqs = require('./lib/check_reqs'), - args = process.argv; - -// Usage support for when args are given -if(args.length > 2) { - log.help(); -} else if(reqs.run()) { - log.run(); -} else { - process.exit(2); -} diff --git a/cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/run b/cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/run deleted file mode 100755 index 57d73459b..000000000 --- a/cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/run +++ /dev/null @@ -1,35 +0,0 @@ -#!/usr/bin/env node - -/* - Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.0 (the - "License"); you may not use this file except in compliance - with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, - software distributed under the License is distributed on an - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - KIND, either express or implied. See the License for the - specific language governing permissions and limitations - under the License. -*/ - -var run = require('./lib/run'), - reqs = require('./lib/check_reqs'), - args = process.argv; - -// Support basic help commands -if (args[2] == '--help' || args[2] == '/?' || args[2] == '-h' || - args[2] == 'help' || args[2] == '-help' || args[2] == '/help') { - run.help(); -} else if(reqs.run()) { - run.run(args); - process.exit(0); -} else { - process.exit(2); -} diff --git a/cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/version b/cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/version deleted file mode 100755 index de1a76dd4..000000000 --- a/cordova-lib/spec-cordova-project/fixtures/platforms/android/cordova/version +++ /dev/null @@ -1,25 +0,0 @@ -#!/usr/bin/env node - -/* - Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.0 (the - "License"); you may not use this file except in compliance - with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, - software distributed under the License is distributed on an - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - KIND, either express or implied. See the License for the - specific language governing permissions and limitations - under the License. -*/ - -// Coho updates this line: -var VERSION = "3.1.0"; - -console.log(VERSION); diff --git a/cordova-lib/spec-cordova-project/fixtures/platforms/android/local.properties b/cordova-lib/spec-cordova-project/fixtures/platforms/android/local.properties deleted file mode 100644 index d3f507212..000000000 --- a/cordova-lib/spec-cordova-project/fixtures/platforms/android/local.properties +++ /dev/null @@ -1,10 +0,0 @@ -# This file is automatically generated by Android Tools. -# Do not modify this file -- YOUR CHANGES WILL BE ERASED! -# -# This file must *NOT* be checked into Version Control Systems, -# as it contains information specific to your local configuration. - -# location of the SDK. This is only used by Ant -# For customization when using a Version Control System, please read the -# header note. -sdk.dir=/Users/braden/cordova/android/android-sdk-macosx diff --git a/cordova-lib/spec-cordova-project/fixtures/platforms/android/proguard-project.txt b/cordova-lib/spec-cordova-project/fixtures/platforms/android/proguard-project.txt deleted file mode 100644 index f2fe1559a..000000000 --- a/cordova-lib/spec-cordova-project/fixtures/platforms/android/proguard-project.txt +++ /dev/null @@ -1,20 +0,0 @@ -# To enable ProGuard in your project, edit project.properties -# to define the proguard.config property as described in that file. -# -# Add project specific ProGuard rules here. -# By default, the flags in this file are appended to flags specified -# in ${sdk.dir}/tools/proguard/proguard-android.txt -# You can edit the include path and order by changing the ProGuard -# include property in project.properties. -# -# For more details, see -# http://developer.android.com/guide/developing/tools/proguard.html - -# Add any project specific keep options here: - -# If your project uses WebView with JS, uncomment the following -# and specify the fully qualified class name to the JavaScript interface -# class: -#-keepclassmembers class fqcn.of.javascript.interface.for.webview { -# public *; -#} diff --git a/cordova-lib/spec-cordova-project/fixtures/platforms/android/project.properties b/cordova-lib/spec-cordova-project/fixtures/platforms/android/project.properties deleted file mode 100644 index a3ee5ab64..000000000 --- a/cordova-lib/spec-cordova-project/fixtures/platforms/android/project.properties +++ /dev/null @@ -1,14 +0,0 @@ -# This file is automatically generated by Android Tools. -# Do not modify this file -- YOUR CHANGES WILL BE ERASED! -# -# This file must be checked in Version Control Systems. -# -# To customize properties used by the Ant build system edit -# "ant.properties", and override values to adapt the script to your -# project structure. -# -# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home): -#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt - -# Project target. -target=android-17 diff --git a/cordova-lib/spec-cordova-project/fixtures/platforms/android/res/drawable-hdpi/icon.png b/cordova-lib/spec-cordova-project/fixtures/platforms/android/res/drawable-hdpi/icon.png deleted file mode 100644 index 4d27634485b3a20d8a0188107e84812f4f71084b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6080 zcmbVQWmHscyB@kl0Vx%Rc%`R+p}SK`8U%)6K$wtW7+OLJkr3%dKvIw{X%wVWLIDvJ zMLHzKgKvE2{CL;*iZj*;3DiM5qL3y?M`z!AZ;|o<0GX?snWdMdfxavPiv~IV z#(;d#xC=G_Ag|fS?i(83`FtAPfS9fT1ujL`n<_k(HE^g+PISU%VIEJe^%+P1H62 z)^)K`;C1!#!pVZcL?RJH6bE5FQDCTyj0_k81H)iq7YH%DFUHH!M+}4K`$vL05|8k7 z!+E)3F~Hvv9i6ZQF9qHUOaF2KjWaO#k6;Y`??7FI4D92G14BU&FdF^auRqavFB9bd zn(?n_yqPZ!2{u9Eu>?=VMLt~k{vlt)?!PPg4ZN^M_LisHMN%9+)UgNx8j11JQCHx- zH~~4kIm@c6XhLPA)MTVpVNkd<6sjVjBCakY1C>&Ns7Pr@LH?2PZ(K=;BwSKmLJba= zfI^`fP#H-Xh_s3dR8m?~N*tyF|A(uC!FxGk5XgV@x?Sk~o2&X?xw2}WNJlTMrx_OO z@lOR9xnjMrcvmbAsAeh&f&vX35pI~@JHHe3m%r*rPd9I*v!*8&4g530vTpxk0Zd&J zrlJOci%Y^_|L*x;T<8B!)W8?UfPa_A|0$P$wk~S$_w+x-f3f&a`yeqFJ>z-N9PawO zl>h+qrjELbna|w1jg80kY2R~{cM}^ZMe0eSdjIZE(x%|$o6t~J1LNGFyQVCctQ&&u zBy`AX3D)}w5sHmibSMkRDPJQaqANJQ-gQ#b+hbZYqd>#1uhji5TU3Ie@pJx14SzJT zCHUverUm^<6K_Fj;rWKFef#>_QQqEP)@2rt&%et|dc1$m&D|Msj-c*}D>w{yOZP{A z7tbe= zdiUsKiOC<_DI?;z&!&ZBkLM2EynG@}FISTbN|U9=qQ~C-xD*rfcy#a1sVS#+VR0Dh zL;aC2(dYxl8y6pR^u_JuWN-1AoXaJ-jgK6Zv!v2zm@2bpEwNmM)9rgi34%i=T<>#R zP)XqHorw4p9_*%&6@yH6@LBqFZW(Z=s;Wu_HDdRyJL0)unm)DB5r-*#IUnUTCPP9z zFmhK-2GYUX4xg%z<4Vih*@1F$a3z0~Mnk3P$F&u;QYz;Q?#my`1|Fn=PwJORzKsBL z=5O&0DW4;aoQks-h~f2mdp@AJq$XgQ*m^!9bF_oddy?3+1`HqAMJ zKr&AYOZbSEV_?{@U9&2pyZm8w80W9vUuNN!UJf2+0ibS|#D1hOYc!-@yUTOzdbFJtiN#~C zv@@ses8g4OOA$uyoDPUbhHXco4wEib*KcEGNqk|0+P#iO<$!3^S?jFK;C?(HZ-8Sc z%`HiT%qUv3M#pB`n?Rpl_y+aCUBZSmQnO~mw!xZI-CV$K3-!z)>{VwsvaZ$hK=x-h z@lL)v>?*sz(CVF-M={R;CpY?vmI3?k|D_59vs`3 z%Cl=3F)ytob&HQrO`-Cp)v|ZC{A176`AsVk-#ncsr5(YlFTolBZwe3MzlIj*G(SzyJW5lt zDGaAe67PFZ^kouhDh1&u`LYydx_?XHR}w20G%?u|(kBcUZm04c1fMXHe#OIxQS$F- zDg3zW1#*a?s-3`;>H3w($e{VL!^Z`mbwp;oo2I)uY&PruKyb81+j5Kevs%jciZ+wS z{n)sF&gB;6{2_A#`w8~-D+YGQ(LYsTTf4qY!uwWW&+K!MwmCOoT#ry-8O!$lrG=>? zzU|Gbx++`OoAjv{MDHF+)3a+@&l$%DDt`rIL>CHlUPhu9Iy#hRj-N(WwQ+LjSd>jw zIsmlz%8=Su?$!w>iP$_7cMGVu%YORerA~-0Y468vnUGmR+63~cMqtkIRDI{BoB`fK zv0zp&#j#eL8bT855D%KNWYHzVTdoo7T`IgP-@8*A zVu`vMf_SeynBUMW+y`Z?8LGnjv046bRclfyw#nAb_)e`okf&$3YyU@r%GZ6j%sGJI zRm#hz>3Wy-$7D_D=J(2_dUwCGG%QsQn{32SRmL`TirNLI*xK56=He%za-Ui%nrU%2 zw16`ahce0O>Yx0!vWSuH$R~M>{3ES}(r?#F6Xp0Gxs1+}7sj)3Y_Jl>$?`;U;WI9H z{-GNtOnnud_3Jh+i6p`AMh)vUr`b}}7hF{4sdLaX^6tQ?Knt8HzMngw_OfmDT3n|C z-iWi#L8y#+ON;b@Ay%389>D49Qt&Wf!=PsQcwx=YW9&-BvGP@P@ZCLS=;eA2(0fs< z_uuv~jUy_{{dZMXeBEBT^QhY2-^TQ(zy<4WKf9FJP*iVyha@JgHws-gwKm%mPodYR zdL0~2^X|*C8F^Enadn4Mx5P)Zz7`;yq(dKoa=0mXAUlPM9iIcAGf6V)Cs<*F3Ft@_ zw6~6 zJ-4`6+1A|E08md%*h19urzT_ggLRCrGAVmEu7e4fHi?mR?G0`9Te))56tTtoJr7~l z+hNTPS+(3qCeNQr{>c7`>;4y#ax9Am4d27#IbGnv(fX~4=%Wp-`#;3ZQd4=#rq*BE z!M->_$A){3*w>vO*%mExVz07jSjT^V0?>KCt@605^{9%TUQ(;kpqSC0-CT;R06>dk zra=iQ=|>a^Xza`Q>{BO+hdBd)5q|`If%`1g%YcD0ecpNjaKTjMJXfnKbORY?lZ1TP8bl0Bsx!f~Xg6Sfb`JQD}T@OM# zCD>(=YkjBKZgkk{=NfrI)SBT+#7L`^FX(~eM&thE2$j1CgxUf-< z#KHQTGRkhpdNT6wyHJ#qtnqj4rav%n-Wv*8)vQvNa~J_!BUD`NbXXNH*;GwYlvwGB z#GIpuJrrS?>ODj7$h7izO|1kh#mmn#0Fp%B6(*3@`rvwM?i zN{7PJ(N`+wxphB^EZ8AmhD^~LpKNm)T0APO#^0I9a=orxxNqMpvk@%9LjT3v`IVsA zQxYyNPL{RJhSoRVr<`4x8RB=xCHn+ILlu(xZTa0hEjc%8>F2JexOe6g9zeqt6415V zH?E=JEGkm4m2ODh?$($tBIZU>k?}hVJ zov8%8@lm=nGgV5-Udvf0X2|Y!HlQ|bHE-=yUvAIa|KE#%@YoW^hDnqzHIs_foTk6aJ?0QZ2DkEinzVPoN1D>O z^$`DuY3I$HO5Q5=^<98^bD_Fy%%u z2+fs6)3Z~OE<~M7Mx*U(tc$X;N*x%R^x#HC`X$=e+;I|AThF^#$1}P(ql|1OPETGx z*<(q#ZT{1<@Waqfs0r6~i+i9q!bHJ)oh|mGXQ5)CT9jk)ETU=&IXzTi-=pkt-{&fU zkn~0GsuOo}ZKLknI>`?W>XsiLkUz&WbTlf!2iJM#X?croKA`riwJrF=dC&H(93GLT ziCy4dk?VpJL{eavKJllAnxxv;ou{YJ-($TrvP5wydpt?t;GMBcU6D=M^?G@ zJD=^Z+jC5ICppA#M5SMQW{N-INRfT=J?GA(dzUnLMYdiH)L1ZGkyNF;v4%`HuRN!X zmrWBb{NnO$TfE&s764!R@z#7`wi$OoFDOs~vQZ7bx7FI<9{k}^DYx>PbxoWn)XS-?iRU-;%F@1)f^=nQ zE+zTot|kh2>y-RV|JO8xaZ0$&Fo#W1ID=R&=I-dQma@~=}VvsYU^uU{gcC&F%Ee%m+2v6E0P1j+ZpEExak>OPw-nVH7-Z;Z3^3 z8P7*c*xG)05J&P_xLgLT4Tw#TCpCH&OyXaZE1d=|`Y#5)*(~#D-n!S}>*|?FoAJ8w zK3R1$igF%5qA-^vV!=u>m%nf|M3It5eD#HBoWjY=(-ftUD~*fUuZ!DBY5hk0YKG_O*wcff$ z3Mhqh#>^IF`{~O0?iSn-VOwUi!|`|R-Q6tA4%1Ctm@`x_5l=pPp=(6WjOddL=JU2v z*y&-m7NwlO|Lf;knC#`C93gg=C_hx%1cd>3fBiXGF!qZhA8*kywHbfU|U$>G}tvEe8HRd36!1M+4 zEt!}ylb6h{=;t#>JDSKPuShdzR}pm*sBxLir=Lnpiyjx{1f4XDrUm3KC1r4Um)@2o zoJfd?+UD=AqN48{bz$28e7}~KY zPI3C&Oix*A(>}Cf>Z})oz7?hn3zt{5J_+M;NU>!(aH=XM%Z%x>qSBjjpLAyswh#t< zJtG7sWM^feKl*paX#_o{af)5UTJ$3;$XyI`g51-ja68WpDm?=6=D$f-r5s{p zobTo`pwNPe(iDKHMC%WpxfLf^-sRwAIz`7%i0!tVp=kO_4V3EW$>d{IDyQ79)7*@{ z_MK3MV66$8#Sp})Sq^6A=H?O+lL|dw3yC~eTImvE!xgF58fA^9wfBB@&CRhAxw582 zl61xT$xcF+4_i+-J~n&?Fqetw(Ve|NYv4BggNL2H#3e=?HEeqbSf+@42Jke$GCf_X zQ4(=VCA_{j@2LarrEU`?b)j&%Zo0r{~?x?6_qdn^tzZCZDSM7~q#CcB? zGct~$ez|49-Uv4md*~13-b(F zvlmb^D<8p$fx+zwBdf&GD%jUFatBc|(aqJWv9S*iXZPNJ_H6p&(2{NxY};t0=)GuMay~J6<6`@uCg{@3*adwT^WQzg(ECKdQO}=gOSvn()h3-Gu$RY9Xb8;H*v9h;` zoQ2`>ckG+4 z*Jn9B>kr@bHfVRCRfkjeWVSHzX>pfjEYr>HK9!$x&eNQB3=GU!3 z8Ydz9>1KDRE!E?&MmO8PjRwL@_OL5gSyo+S~j32bXAWI(43+?vBAmjpfN x7!UQ(CucrH2U}Yz;xlIQ9|EqN9x0Jf0&+IH2i=|^UjP25uA^b7UZLs``adt{1eE{) diff --git a/cordova-lib/spec-cordova-project/fixtures/platforms/android/res/drawable-ldpi/icon.png b/cordova-lib/spec-cordova-project/fixtures/platforms/android/res/drawable-ldpi/icon.png deleted file mode 100644 index cd5032a4f2e0b734d4bdece13564c4b55de963a6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3096 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 diff --git a/cordova-lib/spec-cordova-project/fixtures/platforms/android/res/drawable-mdpi/icon.png b/cordova-lib/spec-cordova-project/fixtures/platforms/android/res/drawable-mdpi/icon.png deleted file mode 100644 index e79c6062c1dcd9e98f092dbd7e51b5b76dd897d2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4090 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 diff --git a/cordova-lib/spec-cordova-project/fixtures/platforms/android/res/drawable-xhdpi/icon.png b/cordova-lib/spec-cordova-project/fixtures/platforms/android/res/drawable-xhdpi/icon.png deleted file mode 100644 index ec7ffbfbdafc58df28e6e89041ee21acd0f6177e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7685 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 diff --git a/cordova-lib/spec-cordova-project/fixtures/platforms/android/res/drawable/icon.png b/cordova-lib/spec-cordova-project/fixtures/platforms/android/res/drawable/icon.png deleted file mode 100644 index ec7ffbfbdafc58df28e6e89041ee21acd0f6177e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7685 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 diff --git a/cordova-lib/spec-cordova-project/fixtures/platforms/android/res/values/strings.xml b/cordova-lib/spec-cordova-project/fixtures/platforms/android/res/values/strings.xml deleted file mode 100644 index 1e706b395..000000000 --- a/cordova-lib/spec-cordova-project/fixtures/platforms/android/res/values/strings.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - TestBase - diff --git a/cordova-lib/spec-cordova-project/fixtures/platforms/android/res/xml/config.xml b/cordova-lib/spec-cordova-project/fixtures/platforms/android/res/xml/config.xml deleted file mode 100644 index 17ca23749..000000000 --- a/cordova-lib/spec-cordova-project/fixtures/platforms/android/res/xml/config.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - Hello Cordova - - A sample Apache Cordova application that responds to the deviceready event. - - - - - - - - Apache Cordova Team - - - - - diff --git a/cordova-lib/spec-cordova-project/fixtures/platforms/android/src/org/testing/TestBase.java b/cordova-lib/spec-cordova-project/fixtures/platforms/android/src/org/testing/TestBase.java deleted file mode 100644 index 928e074c2..000000000 --- a/cordova-lib/spec-cordova-project/fixtures/platforms/android/src/org/testing/TestBase.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.0 (the - "License"); you may not use this file except in compliance - with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, - software distributed under the License is distributed on an - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - KIND, either express or implied. See the License for the - specific language governing permissions and limitations - under the License. - */ - -package org.testing; - -import android.os.Bundle; -import org.apache.cordova.*; - -public class TestBase extends CordovaActivity -{ - @Override - public void onCreate(Bundle savedInstanceState) - { - super.onCreate(savedInstanceState); - super.init(); - // Set by in config.xml - super.loadUrl(Config.getStartUrl()); - //super.loadUrl("file:///android_asset/www/index.html") - } -} - diff --git a/cordova-lib/spec-cordova-project/fixtures/plugins/ChildBrowser/plugin.xml b/cordova-lib/spec-cordova-project/fixtures/plugins/ChildBrowser/plugin.xml deleted file mode 100644 index 11ddd86d3..000000000 --- a/cordova-lib/spec-cordova-project/fixtures/plugins/ChildBrowser/plugin.xml +++ /dev/null @@ -1,126 +0,0 @@ - - - - - - Child Browser - - - - - - - - - - - - - - No matter what platform you are installing to, this notice is very important. - - - - - - - - - - - - - - - - - - - - - - Please make sure you read this because it is very important to complete the installation of your plugin. - - - - - - - - - - - - - - - $APP_ID - - - - - - PackageName - $PACKAGE_NAME - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/cordova-lib/spec-cordova-project/fixtures/plugins/ChildBrowser/src/android/ChildBrowser.java b/cordova-lib/spec-cordova-project/fixtures/plugins/ChildBrowser/src/android/ChildBrowser.java deleted file mode 100644 index 5263b0c5d..000000000 --- a/cordova-lib/spec-cordova-project/fixtures/plugins/ChildBrowser/src/android/ChildBrowser.java +++ /dev/null @@ -1,19 +0,0 @@ -/* - * - * Copyright 2013 Anis Kadri - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - * -*/ - diff --git a/cordova-lib/spec-cordova-project/fixtures/plugins/ChildBrowser/www/childbrowser.js b/cordova-lib/spec-cordova-project/fixtures/plugins/ChildBrowser/www/childbrowser.js deleted file mode 100644 index 5263b0c5d..000000000 --- a/cordova-lib/spec-cordova-project/fixtures/plugins/ChildBrowser/www/childbrowser.js +++ /dev/null @@ -1,19 +0,0 @@ -/* - * - * Copyright 2013 Anis Kadri - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - * -*/ - diff --git a/cordova-lib/spec-cordova-project/fixtures/plugins/ChildBrowser/www/childbrowser_file.html b/cordova-lib/spec-cordova-project/fixtures/plugins/ChildBrowser/www/childbrowser_file.html deleted file mode 100644 index 6de7b8c69..000000000 --- a/cordova-lib/spec-cordova-project/fixtures/plugins/ChildBrowser/www/childbrowser_file.html +++ /dev/null @@ -1 +0,0 @@ -This is a test file. diff --git a/cordova-lib/spec-cordova-project/fixtures/plugins/android/plugin.xml b/cordova-lib/spec-cordova-project/fixtures/plugins/android/plugin.xml deleted file mode 100644 index d8f561906..000000000 --- a/cordova-lib/spec-cordova-project/fixtures/plugins/android/plugin.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - Android Plugin - - - - - - - diff --git a/cordova-lib/spec-cordova-project/fixtures/plugins/android/src/android/Android.java b/cordova-lib/spec-cordova-project/fixtures/plugins/android/src/android/Android.java deleted file mode 100644 index e69de29bb..000000000 diff --git a/cordova-lib/spec-cordova-project/fixtures/plugins/android/src/android/SomethingWithR.java b/cordova-lib/spec-cordova-project/fixtures/plugins/android/src/android/SomethingWithR.java deleted file mode 100644 index c3af060d9..000000000 --- a/cordova-lib/spec-cordova-project/fixtures/plugins/android/src/android/SomethingWithR.java +++ /dev/null @@ -1,6 +0,0 @@ -import com.yourapp.R; - -import android.app.*; - -public class SomethingWithR { -} diff --git a/cordova-lib/spec-cordova-project/fixtures/plugins/android/www/android.js b/cordova-lib/spec-cordova-project/fixtures/plugins/android/www/android.js deleted file mode 100644 index e69de29bb..000000000 diff --git a/cordova-lib/spec-cordova-project/fixtures/plugins/fake1/plugin.xml b/cordova-lib/spec-cordova-project/fixtures/plugins/fake1/plugin.xml deleted file mode 100644 index ffdc650ad..000000000 --- a/cordova-lib/spec-cordova-project/fixtures/plugins/fake1/plugin.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - Fake1 - Cordova fake plugin for tests - Apache 2.0 - cordova,cli,test - diff --git a/cordova-lib/spec-cordova-project/fixtures/plugins/test/plugin.xml b/cordova-lib/spec-cordova-project/fixtures/plugins/test/plugin.xml deleted file mode 100644 index 774eda1de..000000000 --- a/cordova-lib/spec-cordova-project/fixtures/plugins/test/plugin.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - Test Plugin - - - - - - - diff --git a/cordova-lib/spec-cordova-project/fixtures/plugins/test/www/test.js b/cordova-lib/spec-cordova-project/fixtures/plugins/test/www/test.js deleted file mode 100644 index e69de29bb..000000000 diff --git a/cordova-lib/spec-cordova-project/fixtures/projects/windows/bom_test.xml b/cordova-lib/spec-cordova-project/fixtures/projects/windows/bom_test.xml deleted file mode 100644 index 57cadf65d..000000000 --- a/cordova-lib/spec-cordova-project/fixtures/projects/windows/bom_test.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - diff --git a/cordova-lib/spec-cordova-project/fixtures/templates/no_content_config.xml b/cordova-lib/spec-cordova-project/fixtures/templates/no_content_config.xml deleted file mode 100644 index 7c4ef3d2c..000000000 --- a/cordova-lib/spec-cordova-project/fixtures/templates/no_content_config.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - Hello Cordova - - - A sample Apache Cordova application that responds to the deviceready event. - - - - Apache Cordova Team - - - - - - diff --git a/cordova-lib/spec-cordova-project/restore.spec.js b/cordova-lib/spec-cordova-project/restore.spec.js index d8c7ee38d..97dc62b8b 100644 --- a/cordova-lib/spec-cordova-project/restore.spec.js +++ b/cordova-lib/spec-cordova-project/restore.spec.js @@ -22,7 +22,7 @@ var path = require('path'), cordova = require('../src/cordova/cordova'), cordova_util = require('../src/cordova/project/util'), ConfigParser = require('../src/configparser/ConfigParser'), - project_dir = path.join(__dirname, 'fixtures', 'base'); + project_dir = path.join(__dirname, '..', 'fixtures-cordova', 'base'); describe('restore command', function(){ var is_cordova, result, config_add_feature, cd_project; diff --git a/cordova-lib/spec-cordova-project/save.spec.js b/cordova-lib/spec-cordova-project/save.spec.js index 07a170139..7eb955d2a 100644 --- a/cordova-lib/spec-cordova-project/save.spec.js +++ b/cordova-lib/spec-cordova-project/save.spec.js @@ -22,7 +22,7 @@ var path = require('path'), cordova = require('../src/cordova/cordova'), cordova_util = require('../src/cordova/project/util'), ConfigParser = require('../src/configparser/ConfigParser'), - project_dir = path.join(__dirname, 'fixtures', 'base'); + project_dir = path.join(__dirname, '..', 'fixtures-cordova', 'base'); describe('save command', function(){ var is_cordova, result, config_add_feature, cd_project; diff --git a/cordova-lib/spec-cordova-project/util.spec.js b/cordova-lib/spec-cordova-project/util.spec.js index c4f2b2a68..c4abed8b4 100644 --- a/cordova-lib/spec-cordova-project/util.spec.js +++ b/cordova-lib/spec-cordova-project/util.spec.js @@ -22,7 +22,7 @@ var cordova = require('../src/cordova/cordova'), fs = require('fs'), util = require('../src/cordova/project/util'), temp = path.join(__dirname, '..', 'temp'), - fixtures = path.join(__dirname, 'fixtures'); + fixtures = path.join(__dirname, '..', 'fixtures-cordova'); var cwd = process.cwd(); var home = process.env[(process.platform == 'win32') ? 'USERPROFILE' : 'HOME']; diff --git a/cordova-lib/spec-cordova-server/serve.spec.js b/cordova-lib/spec-cordova-server/serve.spec.js index 8858a2436..b09652c55 100644 --- a/cordova-lib/spec-cordova-server/serve.spec.js +++ b/cordova-lib/spec-cordova-server/serve.spec.js @@ -39,7 +39,7 @@ xdescribe('serve command', function() { consoleSpy; beforeEach(function() { // Make a temp directory - tempDir = path.join(__dirname, '..', 'temp-' + Date.now()); + tempDir = path.join(__dirname, '../temp-' + Date.now()); shell.rm('-rf', tempDir); shell.mkdir('-p', tempDir); consoleSpy = spyOn(console, 'log'); diff --git a/cordova-lib/spec-cordova/PluginInfo.spec.js b/cordova-lib/spec-cordova/PluginInfo.spec.js index a07d603ae..0fe750faa 100644 --- a/cordova-lib/spec-cordova/PluginInfo.spec.js +++ b/cordova-lib/spec-cordova/PluginInfo.spec.js @@ -23,7 +23,7 @@ var PluginInfo = require('../src/PluginInfo'), path = require('path'); -var pluginsDir = path.join(__dirname, 'fixtures', 'plugins'); +var pluginsDir = path.join(__dirname, '..', 'fixtures-cordova', 'plugins'); describe('PluginInfo', function () { it('should read a plugin.xml file', function () { diff --git a/cordova-lib/spec-cordova/fixtures/base/.cordova/config.json b/cordova-lib/spec-cordova/fixtures/base/.cordova/config.json deleted file mode 100644 index 4f52ca7f0..000000000 --- a/cordova-lib/spec-cordova/fixtures/base/.cordova/config.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "id": "org.testing", - "name":"TestBase", - "lib": { - "android": { - "url": "/some/junk/path", - "version": "dev", - "id": "cordova-android-dev" - }, - "ios": { - "url": "/some/junk/path", - "version": "dev", - "id": "cordova-ios-dev" - }, - "wp8": { - "url": "/some/junk/path", - "version": "dev", - "id": "cordova-wp8-dev" - } - } -} - diff --git a/cordova-lib/spec-cordova/fixtures/base/merges/.svn b/cordova-lib/spec-cordova/fixtures/base/merges/.svn deleted file mode 100644 index e69de29bb..000000000 diff --git a/cordova-lib/spec-cordova/fixtures/base/plugins/.svn b/cordova-lib/spec-cordova/fixtures/base/plugins/.svn deleted file mode 100644 index e69de29bb..000000000 diff --git a/cordova-lib/spec-cordova/fixtures/base/www/config.xml b/cordova-lib/spec-cordova/fixtures/base/www/config.xml deleted file mode 100644 index 9e7b9e046..000000000 --- a/cordova-lib/spec-cordova/fixtures/base/www/config.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - TestBase - - A sample Apache Cordova application that responds to the deviceready event. - - - Apache Cordova Team - - - - - - diff --git a/cordova-lib/spec-cordova/fixtures/base/www/css/index.css b/cordova-lib/spec-cordova/fixtures/base/www/css/index.css deleted file mode 100644 index 51daa797c..000000000 --- a/cordova-lib/spec-cordova/fixtures/base/www/css/index.css +++ /dev/null @@ -1,115 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -* { - -webkit-tap-highlight-color: rgba(0,0,0,0); /* make transparent link selection, adjust last value opacity 0 to 1.0 */ -} - -body { - -webkit-touch-callout: none; /* prevent callout to copy image, etc when tap to hold */ - -webkit-text-size-adjust: none; /* prevent webkit from resizing text to fit */ - -webkit-user-select: none; /* prevent copy paste, to allow, change 'none' to 'text' */ - background-color:#E4E4E4; - background-image:linear-gradient(top, #A7A7A7 0%, #E4E4E4 51%); - background-image:-webkit-linear-gradient(top, #A7A7A7 0%, #E4E4E4 51%); - background-image:-ms-linear-gradient(top, #A7A7A7 0%, #E4E4E4 51%); - background-image:-webkit-gradient( - linear, - left top, - left bottom, - color-stop(0, #A7A7A7), - color-stop(0.51, #E4E4E4) - ); - background-attachment:fixed; - font-family:'HelveticaNeue-Light', 'HelveticaNeue', Helvetica, Arial, sans-serif; - font-size:12px; - height:100%; - margin:0px; - padding:0px; - text-transform:uppercase; - width:100%; -} - -/* Portrait layout (default) */ -.app { - background:url(../img/logo.png) no-repeat center top; /* 170px x 200px */ - position:absolute; /* position in the center of the screen */ - left:50%; - top:50%; - height:50px; /* text area height */ - width:225px; /* text area width */ - text-align:center; - padding:180px 0px 0px 0px; /* image height is 200px (bottom 20px are overlapped with text) */ - margin:-115px 0px 0px -112px; /* offset vertical: half of image height and text area height */ - /* offset horizontal: half of text area width */ -} - -/* Landscape layout (with min-width) */ -@media screen and (min-aspect-ratio: 1/1) and (min-width:400px) { - .app { - background-position:left center; - padding:75px 0px 75px 170px; /* padding-top + padding-bottom + text area = image height */ - margin:-90px 0px 0px -198px; /* offset vertical: half of image height */ - /* offset horizontal: half of image width and text area width */ - } -} - -h1 { - font-size:24px; - font-weight:normal; - margin:0px; - overflow:visible; - padding:0px; - text-align:center; -} - -.event { - border-radius:4px; - -webkit-border-radius:4px; - color:#FFFFFF; - font-size:12px; - margin:0px 30px; - padding:2px 0px; -} - -.event.listening { - background-color:#333333; - display:block; -} - -.event.received { - background-color:#4B946A; - display:none; -} - -@keyframes fade { - from { opacity: 1.0; } - 50% { opacity: 0.4; } - to { opacity: 1.0; } -} - -@-webkit-keyframes fade { - from { opacity: 1.0; } - 50% { opacity: 0.4; } - to { opacity: 1.0; } -} - -.blink { - animation:fade 3000ms infinite; - -webkit-animation:fade 3000ms infinite; -} diff --git a/cordova-lib/spec-cordova/fixtures/base/www/img/logo.png b/cordova-lib/spec-cordova/fixtures/base/www/img/logo.png deleted file mode 100644 index 9519e7dd78adb6e44548c08510a7bf02442a7697..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21814 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
Qfv&3%?A-1S}IU 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 - - - - - - - - - Hello World - - -
-

Apache Cordova

- -
- - - - - diff --git a/cordova-lib/spec-cordova/fixtures/base/www/js/index.js b/cordova-lib/spec-cordova/fixtures/base/www/js/index.js deleted file mode 100644 index 31d9064eb..000000000 --- a/cordova-lib/spec-cordova/fixtures/base/www/js/index.js +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -var app = { - // Application Constructor - initialize: function() { - this.bindEvents(); - }, - // Bind Event Listeners - // - // Bind any events that are required on startup. Common events are: - // 'load', 'deviceready', 'offline', and 'online'. - bindEvents: function() { - document.addEventListener('deviceready', this.onDeviceReady, false); - }, - // deviceready Event Handler - // - // The scope of 'this' is the event. In order to call the 'receivedEvent' - // function, we must explicity call 'app.receivedEvent(...);' - onDeviceReady: function() { - app.receivedEvent('deviceready'); - }, - // Update DOM on a Received Event - receivedEvent: function(id) { - var parentElement = document.getElementById(id); - var listeningElement = parentElement.querySelector('.listening'); - var receivedElement = parentElement.querySelector('.received'); - - listeningElement.setAttribute('style', 'display:none;'); - receivedElement.setAttribute('style', 'display:block;'); - - console.log('Received Event: ' + id); - } -}; diff --git a/cordova-lib/spec-cordova/fixtures/base/www/spec.html b/cordova-lib/spec-cordova/fixtures/base/www/spec.html deleted file mode 100644 index 71f00de05..000000000 --- a/cordova-lib/spec-cordova/fixtures/base/www/spec.html +++ /dev/null @@ -1,68 +0,0 @@ - - - - - Jasmine Spec Runner - - - - - - - - - - - - - - - - - - - - diff --git a/cordova-lib/spec-cordova/fixtures/hooks_bat/fail/fail.bat b/cordova-lib/spec-cordova/fixtures/hooks_bat/fail/fail.bat deleted file mode 100644 index a89b4c89c..000000000 --- a/cordova-lib/spec-cordova/fixtures/hooks_bat/fail/fail.bat +++ /dev/null @@ -1,2 +0,0 @@ -@ECHO OFF -EXIT /B 1 diff --git a/cordova-lib/spec-cordova/fixtures/hooks_bat/test/.dotted.bat b/cordova-lib/spec-cordova/fixtures/hooks_bat/test/.dotted.bat deleted file mode 100644 index ada7136e5..000000000 --- a/cordova-lib/spec-cordova/fixtures/hooks_bat/test/.dotted.bat +++ /dev/null @@ -1,2 +0,0 @@ -@ECHO OFF -ECHO "Dotted files in hook dirs should not be called" > dotted_hook_should_not_fire.txt \ No newline at end of file diff --git a/cordova-lib/spec-cordova/fixtures/hooks_bat/test/07.bat b/cordova-lib/spec-cordova/fixtures/hooks_bat/test/07.bat deleted file mode 100644 index a88c8c590..000000000 --- a/cordova-lib/spec-cordova/fixtures/hooks_bat/test/07.bat +++ /dev/null @@ -1,3 +0,0 @@ -@ECHO OFF -rem ECHO this is script 0 in %~dp0 -ECHO b >> hooks_order.txt diff --git a/cordova-lib/spec-cordova/fixtures/hooks_bat/test/1.bat b/cordova-lib/spec-cordova/fixtures/hooks_bat/test/1.bat deleted file mode 100644 index be004c530..000000000 --- a/cordova-lib/spec-cordova/fixtures/hooks_bat/test/1.bat +++ /dev/null @@ -1,5 +0,0 @@ -@ECHO OFF -rem ECHO this is script 1 in %~dp0 -ECHO a >> hooks_order.txt -ECHO %1 > hooks_params.txt -node -e "console.log(JSON.stringify(process.env, null, 2))" > hooks_env.json diff --git a/cordova-lib/spec-cordova/fixtures/hooks_sh/fail/fail.sh b/cordova-lib/spec-cordova/fixtures/hooks_sh/fail/fail.sh deleted file mode 100755 index 379a4c986..000000000 --- a/cordova-lib/spec-cordova/fixtures/hooks_sh/fail/fail.sh +++ /dev/null @@ -1 +0,0 @@ -exit 1 diff --git a/cordova-lib/spec-cordova/fixtures/hooks_sh/test/.dotted.sh b/cordova-lib/spec-cordova/fixtures/hooks_sh/test/.dotted.sh deleted file mode 100755 index e5fa07f91..000000000 --- a/cordova-lib/spec-cordova/fixtures/hooks_sh/test/.dotted.sh +++ /dev/null @@ -1 +0,0 @@ -echo "Dotted files in hook dirs should not be called" > dotted_hook_should_not_fire.txt diff --git a/cordova-lib/spec-cordova/fixtures/hooks_sh/test/07.sh b/cordova-lib/spec-cordova/fixtures/hooks_sh/test/07.sh deleted file mode 100755 index f410ee21f..000000000 --- a/cordova-lib/spec-cordova/fixtures/hooks_sh/test/07.sh +++ /dev/null @@ -1,2 +0,0 @@ -#echo "this is script 0 in `pwd`"; -echo b >> hooks_order.txt diff --git a/cordova-lib/spec-cordova/fixtures/hooks_sh/test/1.sh b/cordova-lib/spec-cordova/fixtures/hooks_sh/test/1.sh deleted file mode 100755 index 892869d7c..000000000 --- a/cordova-lib/spec-cordova/fixtures/hooks_sh/test/1.sh +++ /dev/null @@ -1,4 +0,0 @@ -#echo "this is script 1 in `pwd`"; -echo a >> hooks_order.txt -echo $1 > hooks_params.txt -node -e "console.log(JSON.stringify(process.env, null, 2))" > hooks_env.json diff --git a/cordova-lib/spec-cordova/fixtures/platforms/android-lib/VERSION b/cordova-lib/spec-cordova/fixtures/platforms/android-lib/VERSION deleted file mode 100644 index 15a279981..000000000 --- a/cordova-lib/spec-cordova/fixtures/platforms/android-lib/VERSION +++ /dev/null @@ -1 +0,0 @@ -3.3.0 diff --git a/cordova-lib/spec-cordova/fixtures/platforms/android-lib/framework/assets/www/cordova.js b/cordova-lib/spec-cordova/fixtures/platforms/android-lib/framework/assets/www/cordova.js deleted file mode 100644 index 91c51fce2..000000000 --- a/cordova-lib/spec-cordova/fixtures/platforms/android-lib/framework/assets/www/cordova.js +++ /dev/null @@ -1 +0,0 @@ -This is a placeholder file. diff --git a/cordova-lib/spec-cordova/fixtures/platforms/android/AndroidManifest.xml b/cordova-lib/spec-cordova/fixtures/platforms/android/AndroidManifest.xml deleted file mode 100644 index be3f245f7..000000000 --- a/cordova-lib/spec-cordova/fixtures/platforms/android/AndroidManifest.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - diff --git a/cordova-lib/spec-cordova/fixtures/platforms/android/assets/www/config.xml b/cordova-lib/spec-cordova/fixtures/platforms/android/assets/www/config.xml deleted file mode 100644 index 9e7b9e046..000000000 --- a/cordova-lib/spec-cordova/fixtures/platforms/android/assets/www/config.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - TestBase - - A sample Apache Cordova application that responds to the deviceready event. - - - Apache Cordova Team - - - - - - diff --git a/cordova-lib/spec-cordova/fixtures/platforms/android/assets/www/cordova.js b/cordova-lib/spec-cordova/fixtures/platforms/android/assets/www/cordova.js deleted file mode 100644 index 07e3feb46..000000000 --- a/cordova-lib/spec-cordova/fixtures/platforms/android/assets/www/cordova.js +++ /dev/null @@ -1,1712 +0,0 @@ -// Platform: android -// 3.1.0 -/* - Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.0 (the - "License"); you may not use this file except in compliance - with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, - software distributed under the License is distributed on an - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - KIND, either express or implied. See the License for the - specific language governing permissions and limitations - under the License. -*/ -;(function() { -var CORDOVA_JS_BUILD_LABEL = '3.1.0'; -// file: lib/scripts/require.js - -var require, - define; - -(function () { - var modules = {}, - // Stack of moduleIds currently being built. - requireStack = [], - // Map of module ID -> index into requireStack of modules currently being built. - inProgressModules = {}, - SEPERATOR = "."; - - - - function build(module) { - var factory = module.factory, - localRequire = function (id) { - var resultantId = id; - //Its a relative path, so lop off the last portion and add the id (minus "./") - if (id.charAt(0) === ".") { - resultantId = module.id.slice(0, module.id.lastIndexOf(SEPERATOR)) + SEPERATOR + id.slice(2); - } - return require(resultantId); - }; - module.exports = {}; - delete module.factory; - factory(localRequire, module.exports, module); - return module.exports; - } - - require = function (id) { - if (!modules[id]) { - throw "module " + id + " not found"; - } else if (id in inProgressModules) { - var cycle = requireStack.slice(inProgressModules[id]).join('->') + '->' + id; - throw "Cycle in require graph: " + cycle; - } - if (modules[id].factory) { - try { - inProgressModules[id] = requireStack.length; - requireStack.push(id); - return build(modules[id]); - } finally { - delete inProgressModules[id]; - requireStack.pop(); - } - } - return modules[id].exports; - }; - - define = function (id, factory) { - if (modules[id]) { - throw "module " + id + " already defined"; - } - - modules[id] = { - id: id, - factory: factory - }; - }; - - define.remove = function (id) { - delete modules[id]; - }; - - define.moduleMap = modules; -})(); - -//Export for use in node -if (typeof module === "object" && typeof require === "function") { - module.exports.require = require; - module.exports.define = define; -} - -// file: lib/cordova.js -define("cordova", function(require, exports, module) { - - -var channel = require('cordova/channel'); -var platform = require('cordova/platform'); - -/** - * Intercept calls to addEventListener + removeEventListener and handle deviceready, - * resume, and pause events. - */ -var m_document_addEventListener = document.addEventListener; -var m_document_removeEventListener = document.removeEventListener; -var m_window_addEventListener = window.addEventListener; -var m_window_removeEventListener = window.removeEventListener; - -/** - * Houses custom event handlers to intercept on document + window event listeners. - */ -var documentEventHandlers = {}, - windowEventHandlers = {}; - -document.addEventListener = function(evt, handler, capture) { - var e = evt.toLowerCase(); - if (typeof documentEventHandlers[e] != 'undefined') { - documentEventHandlers[e].subscribe(handler); - } else { - m_document_addEventListener.call(document, evt, handler, capture); - } -}; - -window.addEventListener = function(evt, handler, capture) { - var e = evt.toLowerCase(); - if (typeof windowEventHandlers[e] != 'undefined') { - windowEventHandlers[e].subscribe(handler); - } else { - m_window_addEventListener.call(window, evt, handler, capture); - } -}; - -document.removeEventListener = function(evt, handler, capture) { - var e = evt.toLowerCase(); - // If unsubscribing from an event that is handled by a plugin - if (typeof documentEventHandlers[e] != "undefined") { - documentEventHandlers[e].unsubscribe(handler); - } else { - m_document_removeEventListener.call(document, evt, handler, capture); - } -}; - -window.removeEventListener = function(evt, handler, capture) { - var e = evt.toLowerCase(); - // If unsubscribing from an event that is handled by a plugin - if (typeof windowEventHandlers[e] != "undefined") { - windowEventHandlers[e].unsubscribe(handler); - } else { - m_window_removeEventListener.call(window, evt, handler, capture); - } -}; - -function createEvent(type, data) { - var event = document.createEvent('Events'); - event.initEvent(type, false, false); - if (data) { - for (var i in data) { - if (data.hasOwnProperty(i)) { - event[i] = data[i]; - } - } - } - return event; -} - - -var cordova = { - define:define, - require:require, - version:CORDOVA_JS_BUILD_LABEL, - platformId:platform.id, - /** - * Methods to add/remove your own addEventListener hijacking on document + window. - */ - addWindowEventHandler:function(event) { - return (windowEventHandlers[event] = channel.create(event)); - }, - addStickyDocumentEventHandler:function(event) { - return (documentEventHandlers[event] = channel.createSticky(event)); - }, - addDocumentEventHandler:function(event) { - return (documentEventHandlers[event] = channel.create(event)); - }, - removeWindowEventHandler:function(event) { - delete windowEventHandlers[event]; - }, - removeDocumentEventHandler:function(event) { - delete documentEventHandlers[event]; - }, - /** - * Retrieve original event handlers that were replaced by Cordova - * - * @return object - */ - getOriginalHandlers: function() { - return {'document': {'addEventListener': m_document_addEventListener, 'removeEventListener': m_document_removeEventListener}, - 'window': {'addEventListener': m_window_addEventListener, 'removeEventListener': m_window_removeEventListener}}; - }, - /** - * Method to fire event from native code - * bNoDetach is required for events which cause an exception which needs to be caught in native code - */ - fireDocumentEvent: function(type, data, bNoDetach) { - var evt = createEvent(type, data); - if (typeof documentEventHandlers[type] != 'undefined') { - if( bNoDetach ) { - documentEventHandlers[type].fire(evt); - } - else { - setTimeout(function() { - // Fire deviceready on listeners that were registered before cordova.js was loaded. - if (type == 'deviceready') { - document.dispatchEvent(evt); - } - documentEventHandlers[type].fire(evt); - }, 0); - } - } else { - document.dispatchEvent(evt); - } - }, - fireWindowEvent: function(type, data) { - var evt = createEvent(type,data); - if (typeof windowEventHandlers[type] != 'undefined') { - setTimeout(function() { - windowEventHandlers[type].fire(evt); - }, 0); - } else { - window.dispatchEvent(evt); - } - }, - - /** - * Plugin callback mechanism. - */ - // Randomize the starting callbackId to avoid collisions after refreshing or navigating. - // This way, it's very unlikely that any new callback would get the same callbackId as an old callback. - callbackId: Math.floor(Math.random() * 2000000000), - callbacks: {}, - callbackStatus: { - NO_RESULT: 0, - OK: 1, - CLASS_NOT_FOUND_EXCEPTION: 2, - ILLEGAL_ACCESS_EXCEPTION: 3, - INSTANTIATION_EXCEPTION: 4, - MALFORMED_URL_EXCEPTION: 5, - IO_EXCEPTION: 6, - INVALID_ACTION: 7, - JSON_EXCEPTION: 8, - ERROR: 9 - }, - - /** - * Called by native code when returning successful result from an action. - */ - callbackSuccess: function(callbackId, args) { - try { - cordova.callbackFromNative(callbackId, true, args.status, [args.message], args.keepCallback); - } catch (e) { - console.log("Error in error callback: " + callbackId + " = "+e); - } - }, - - /** - * Called by native code when returning error result from an action. - */ - callbackError: function(callbackId, args) { - // TODO: Deprecate callbackSuccess and callbackError in favour of callbackFromNative. - // Derive success from status. - try { - cordova.callbackFromNative(callbackId, false, args.status, [args.message], args.keepCallback); - } catch (e) { - console.log("Error in error callback: " + callbackId + " = "+e); - } - }, - - /** - * Called by native code when returning the result from an action. - */ - callbackFromNative: function(callbackId, success, status, args, keepCallback) { - var callback = cordova.callbacks[callbackId]; - if (callback) { - if (success && status == cordova.callbackStatus.OK) { - callback.success && callback.success.apply(null, args); - } else if (!success) { - callback.fail && callback.fail.apply(null, args); - } - - // Clear callback if not expecting any more results - if (!keepCallback) { - delete cordova.callbacks[callbackId]; - } - } - }, - addConstructor: function(func) { - channel.onCordovaReady.subscribe(function() { - try { - func(); - } catch(e) { - console.log("Failed to run constructor: " + e); - } - }); - } -}; - - -module.exports = cordova; - -}); - -// file: lib/android/android/nativeapiprovider.js -define("cordova/android/nativeapiprovider", function(require, exports, module) { - -/** - * Exports the ExposedJsApi.java object if available, otherwise exports the PromptBasedNativeApi. - */ - -var nativeApi = this._cordovaNative || require('cordova/android/promptbasednativeapi'); -var currentApi = nativeApi; - -module.exports = { - get: function() { return currentApi; }, - setPreferPrompt: function(value) { - currentApi = value ? require('cordova/android/promptbasednativeapi') : nativeApi; - }, - // Used only by tests. - set: function(value) { - currentApi = value; - } -}; - -}); - -// file: lib/android/android/promptbasednativeapi.js -define("cordova/android/promptbasednativeapi", function(require, exports, module) { - -/** - * Implements the API of ExposedJsApi.java, but uses prompt() to communicate. - * This is used only on the 2.3 simulator, where addJavascriptInterface() is broken. - */ - -module.exports = { - exec: function(service, action, callbackId, argsJson) { - return prompt(argsJson, 'gap:'+JSON.stringify([service, action, callbackId])); - }, - setNativeToJsBridgeMode: function(value) { - prompt(value, 'gap_bridge_mode:'); - }, - retrieveJsMessages: function(fromOnlineEvent) { - return prompt(+fromOnlineEvent, 'gap_poll:'); - } -}; - -}); - -// file: lib/common/argscheck.js -define("cordova/argscheck", function(require, exports, module) { - -var exec = require('cordova/exec'); -var utils = require('cordova/utils'); - -var moduleExports = module.exports; - -var typeMap = { - 'A': 'Array', - 'D': 'Date', - 'N': 'Number', - 'S': 'String', - 'F': 'Function', - 'O': 'Object' -}; - -function extractParamName(callee, argIndex) { - return (/.*?\((.*?)\)/).exec(callee)[1].split(', ')[argIndex]; -} - -function checkArgs(spec, functionName, args, opt_callee) { - if (!moduleExports.enableChecks) { - return; - } - var errMsg = null; - var typeName; - for (var i = 0; i < spec.length; ++i) { - var c = spec.charAt(i), - cUpper = c.toUpperCase(), - arg = args[i]; - // Asterix means allow anything. - if (c == '*') { - continue; - } - typeName = utils.typeName(arg); - if ((arg === null || arg === undefined) && c == cUpper) { - continue; - } - if (typeName != typeMap[cUpper]) { - errMsg = 'Expected ' + typeMap[cUpper]; - break; - } - } - if (errMsg) { - errMsg += ', but got ' + typeName + '.'; - errMsg = 'Wrong type for parameter "' + extractParamName(opt_callee || args.callee, i) + '" of ' + functionName + ': ' + errMsg; - // Don't log when running unit tests. - if (typeof jasmine == 'undefined') { - console.error(errMsg); - } - throw TypeError(errMsg); - } -} - -function getValue(value, defaultValue) { - return value === undefined ? defaultValue : value; -} - -moduleExports.checkArgs = checkArgs; -moduleExports.getValue = getValue; -moduleExports.enableChecks = true; - - -}); - -// file: lib/common/base64.js -define("cordova/base64", function(require, exports, module) { - -var base64 = exports; - -base64.fromArrayBuffer = function(arrayBuffer) { - var array = new Uint8Array(arrayBuffer); - return uint8ToBase64(array); -}; - -//------------------------------------------------------------------------------ - -/* This code is based on the performance tests at http://jsperf.com/b64tests - * This 12-bit-at-a-time algorithm was the best performing version on all - * platforms tested. - */ - -var b64_6bit = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; -var b64_12bit; - -var b64_12bitTable = function() { - b64_12bit = []; - for (var i=0; i<64; i++) { - for (var j=0; j<64; j++) { - b64_12bit[i*64+j] = b64_6bit[i] + b64_6bit[j]; - } - } - b64_12bitTable = function() { return b64_12bit; }; - return b64_12bit; -}; - -function uint8ToBase64(rawData) { - var numBytes = rawData.byteLength; - var output=""; - var segment; - var table = b64_12bitTable(); - for (var i=0;i> 12]; - output += table[segment & 0xfff]; - } - if (numBytes - i == 2) { - segment = (rawData[i] << 16) + (rawData[i+1] << 8); - output += table[segment >> 12]; - output += b64_6bit[(segment & 0xfff) >> 6]; - output += '='; - } else if (numBytes - i == 1) { - segment = (rawData[i] << 16); - output += table[segment >> 12]; - output += '=='; - } - return output; -} - -}); - -// file: lib/common/builder.js -define("cordova/builder", function(require, exports, module) { - -var utils = require('cordova/utils'); - -function each(objects, func, context) { - for (var prop in objects) { - if (objects.hasOwnProperty(prop)) { - func.apply(context, [objects[prop], prop]); - } - } -} - -function clobber(obj, key, value) { - exports.replaceHookForTesting(obj, key); - obj[key] = value; - // Getters can only be overridden by getters. - if (obj[key] !== value) { - utils.defineGetter(obj, key, function() { - return value; - }); - } -} - -function assignOrWrapInDeprecateGetter(obj, key, value, message) { - if (message) { - utils.defineGetter(obj, key, function() { - console.log(message); - delete obj[key]; - clobber(obj, key, value); - return value; - }); - } else { - clobber(obj, key, value); - } -} - -function include(parent, objects, clobber, merge) { - each(objects, function (obj, key) { - try { - var result = obj.path ? require(obj.path) : {}; - - if (clobber) { - // Clobber if it doesn't exist. - if (typeof parent[key] === 'undefined') { - assignOrWrapInDeprecateGetter(parent, key, result, obj.deprecated); - } else if (typeof obj.path !== 'undefined') { - // If merging, merge properties onto parent, otherwise, clobber. - if (merge) { - recursiveMerge(parent[key], result); - } else { - assignOrWrapInDeprecateGetter(parent, key, result, obj.deprecated); - } - } - result = parent[key]; - } else { - // Overwrite if not currently defined. - if (typeof parent[key] == 'undefined') { - assignOrWrapInDeprecateGetter(parent, key, result, obj.deprecated); - } else { - // Set result to what already exists, so we can build children into it if they exist. - result = parent[key]; - } - } - - if (obj.children) { - include(result, obj.children, clobber, merge); - } - } catch(e) { - utils.alert('Exception building cordova JS globals: ' + e + ' for key "' + key + '"'); - } - }); -} - -/** - * Merge properties from one object onto another recursively. Properties from - * the src object will overwrite existing target property. - * - * @param target Object to merge properties into. - * @param src Object to merge properties from. - */ -function recursiveMerge(target, src) { - for (var prop in src) { - if (src.hasOwnProperty(prop)) { - if (target.prototype && target.prototype.constructor === target) { - // If the target object is a constructor override off prototype. - clobber(target.prototype, prop, src[prop]); - } else { - if (typeof src[prop] === 'object' && typeof target[prop] === 'object') { - recursiveMerge(target[prop], src[prop]); - } else { - clobber(target, prop, src[prop]); - } - } - } - } -} - -exports.buildIntoButDoNotClobber = function(objects, target) { - include(target, objects, false, false); -}; -exports.buildIntoAndClobber = function(objects, target) { - include(target, objects, true, false); -}; -exports.buildIntoAndMerge = function(objects, target) { - include(target, objects, true, true); -}; -exports.recursiveMerge = recursiveMerge; -exports.assignOrWrapInDeprecateGetter = assignOrWrapInDeprecateGetter; -exports.replaceHookForTesting = function() {}; - -}); - -// file: lib/common/channel.js -define("cordova/channel", function(require, exports, module) { - -var utils = require('cordova/utils'), - nextGuid = 1; - -/** - * Custom pub-sub "channel" that can have functions subscribed to it - * This object is used to define and control firing of events for - * cordova initialization, as well as for custom events thereafter. - * - * The order of events during page load and Cordova startup is as follows: - * - * onDOMContentLoaded* Internal event that is received when the web page is loaded and parsed. - * onNativeReady* Internal event that indicates the Cordova native side is ready. - * onCordovaReady* Internal event fired when all Cordova JavaScript objects have been created. - * onDeviceReady* User event fired to indicate that Cordova is ready - * onResume User event fired to indicate a start/resume lifecycle event - * onPause User event fired to indicate a pause lifecycle event - * onDestroy* Internal event fired when app is being destroyed (User should use window.onunload event, not this one). - * - * The events marked with an * are sticky. Once they have fired, they will stay in the fired state. - * All listeners that subscribe after the event is fired will be executed right away. - * - * The only Cordova events that user code should register for are: - * deviceready Cordova native code is initialized and Cordova APIs can be called from JavaScript - * pause App has moved to background - * resume App has returned to foreground - * - * Listeners can be registered as: - * document.addEventListener("deviceready", myDeviceReadyListener, false); - * document.addEventListener("resume", myResumeListener, false); - * document.addEventListener("pause", myPauseListener, false); - * - * The DOM lifecycle events should be used for saving and restoring state - * window.onload - * window.onunload - * - */ - -/** - * Channel - * @constructor - * @param type String the channel name - */ -var Channel = function(type, sticky) { - this.type = type; - // Map of guid -> function. - this.handlers = {}; - // 0 = Non-sticky, 1 = Sticky non-fired, 2 = Sticky fired. - this.state = sticky ? 1 : 0; - // Used in sticky mode to remember args passed to fire(). - this.fireArgs = null; - // Used by onHasSubscribersChange to know if there are any listeners. - this.numHandlers = 0; - // Function that is called when the first listener is subscribed, or when - // the last listener is unsubscribed. - this.onHasSubscribersChange = null; -}, - channel = { - /** - * Calls the provided function only after all of the channels specified - * have been fired. All channels must be sticky channels. - */ - join: function(h, c) { - var len = c.length, - i = len, - f = function() { - if (!(--i)) h(); - }; - for (var j=0; jNative bridge. - POLLING: 0, - // For LOAD_URL to be viable, it would need to have a work-around for - // the bug where the soft-keyboard gets dismissed when a message is sent. - LOAD_URL: 1, - // For the ONLINE_EVENT to be viable, it would need to intercept all event - // listeners (both through addEventListener and window.ononline) as well - // as set the navigator property itself. - ONLINE_EVENT: 2, - // Uses reflection to access private APIs of the WebView that can send JS - // to be executed. - // Requires Android 3.2.4 or above. - PRIVATE_API: 3 - }, - jsToNativeBridgeMode, // Set lazily. - nativeToJsBridgeMode = nativeToJsModes.ONLINE_EVENT, - pollEnabled = false, - messagesFromNative = []; - -function androidExec(success, fail, service, action, args) { - // Set default bridge modes if they have not already been set. - // By default, we use the failsafe, since addJavascriptInterface breaks too often - if (jsToNativeBridgeMode === undefined) { - androidExec.setJsToNativeBridgeMode(jsToNativeModes.JS_OBJECT); - } - - // Process any ArrayBuffers in the args into a string. - for (var i = 0; i < args.length; i++) { - if (utils.typeName(args[i]) == 'ArrayBuffer') { - args[i] = base64.fromArrayBuffer(args[i]); - } - } - - var callbackId = service + cordova.callbackId++, - argsJson = JSON.stringify(args); - - if (success || fail) { - cordova.callbacks[callbackId] = {success:success, fail:fail}; - } - - if (jsToNativeBridgeMode == jsToNativeModes.LOCATION_CHANGE) { - window.location = 'http://cdv_exec/' + service + '#' + action + '#' + callbackId + '#' + argsJson; - } else { - var messages = nativeApiProvider.get().exec(service, action, callbackId, argsJson); - // If argsJson was received by Java as null, try again with the PROMPT bridge mode. - // This happens in rare circumstances, such as when certain Unicode characters are passed over the bridge on a Galaxy S2. See CB-2666. - if (jsToNativeBridgeMode == jsToNativeModes.JS_OBJECT && messages === "@Null arguments.") { - androidExec.setJsToNativeBridgeMode(jsToNativeModes.PROMPT); - androidExec(success, fail, service, action, args); - androidExec.setJsToNativeBridgeMode(jsToNativeModes.JS_OBJECT); - return; - } else { - androidExec.processMessages(messages); - } - } -} - -function pollOnceFromOnlineEvent() { - pollOnce(true); -} - -function pollOnce(opt_fromOnlineEvent) { - var msg = nativeApiProvider.get().retrieveJsMessages(!!opt_fromOnlineEvent); - androidExec.processMessages(msg); -} - -function pollingTimerFunc() { - if (pollEnabled) { - pollOnce(); - setTimeout(pollingTimerFunc, 50); - } -} - -function hookOnlineApis() { - function proxyEvent(e) { - cordova.fireWindowEvent(e.type); - } - // The network module takes care of firing online and offline events. - // It currently fires them only on document though, so we bridge them - // to window here (while first listening for exec()-releated online/offline - // events). - window.addEventListener('online', pollOnceFromOnlineEvent, false); - window.addEventListener('offline', pollOnceFromOnlineEvent, false); - cordova.addWindowEventHandler('online'); - cordova.addWindowEventHandler('offline'); - document.addEventListener('online', proxyEvent, false); - document.addEventListener('offline', proxyEvent, false); -} - -hookOnlineApis(); - -androidExec.jsToNativeModes = jsToNativeModes; -androidExec.nativeToJsModes = nativeToJsModes; - -androidExec.setJsToNativeBridgeMode = function(mode) { - if (mode == jsToNativeModes.JS_OBJECT && !window._cordovaNative) { - console.log('Falling back on PROMPT mode since _cordovaNative is missing. Expected for Android 3.2 and lower only.'); - mode = jsToNativeModes.PROMPT; - } - nativeApiProvider.setPreferPrompt(mode == jsToNativeModes.PROMPT); - jsToNativeBridgeMode = mode; -}; - -androidExec.setNativeToJsBridgeMode = function(mode) { - if (mode == nativeToJsBridgeMode) { - return; - } - if (nativeToJsBridgeMode == nativeToJsModes.POLLING) { - pollEnabled = false; - } - - nativeToJsBridgeMode = mode; - // Tell the native side to switch modes. - nativeApiProvider.get().setNativeToJsBridgeMode(mode); - - if (mode == nativeToJsModes.POLLING) { - pollEnabled = true; - setTimeout(pollingTimerFunc, 1); - } -}; - -// Processes a single message, as encoded by NativeToJsMessageQueue.java. -function processMessage(message) { - try { - var firstChar = message.charAt(0); - if (firstChar == 'J') { - eval(message.slice(1)); - } else if (firstChar == 'S' || firstChar == 'F') { - var success = firstChar == 'S'; - var keepCallback = message.charAt(1) == '1'; - var spaceIdx = message.indexOf(' ', 2); - var status = +message.slice(2, spaceIdx); - var nextSpaceIdx = message.indexOf(' ', spaceIdx + 1); - var callbackId = message.slice(spaceIdx + 1, nextSpaceIdx); - var payloadKind = message.charAt(nextSpaceIdx + 1); - var payload; - if (payloadKind == 's') { - payload = message.slice(nextSpaceIdx + 2); - } else if (payloadKind == 't') { - payload = true; - } else if (payloadKind == 'f') { - payload = false; - } else if (payloadKind == 'N') { - payload = null; - } else if (payloadKind == 'n') { - payload = +message.slice(nextSpaceIdx + 2); - } else if (payloadKind == 'A') { - var data = message.slice(nextSpaceIdx + 2); - var bytes = window.atob(data); - var arraybuffer = new Uint8Array(bytes.length); - for (var i = 0; i < bytes.length; i++) { - arraybuffer[i] = bytes.charCodeAt(i); - } - payload = arraybuffer.buffer; - } else if (payloadKind == 'S') { - payload = window.atob(message.slice(nextSpaceIdx + 2)); - } else { - payload = JSON.parse(message.slice(nextSpaceIdx + 1)); - } - cordova.callbackFromNative(callbackId, success, status, [payload], keepCallback); - } else { - console.log("processMessage failed: invalid message:" + message); - } - } catch (e) { - console.log("processMessage failed: Message: " + message); - console.log("processMessage failed: Error: " + e); - console.log("processMessage failed: Stack: " + e.stack); - } -} - -// This is called from the NativeToJsMessageQueue.java. -androidExec.processMessages = function(messages) { - if (messages) { - messagesFromNative.push(messages); - // Check for the reentrant case, and enqueue the message if that's the case. - if (messagesFromNative.length > 1) { - return; - } - while (messagesFromNative.length) { - // Don't unshift until the end so that reentrancy can be detected. - messages = messagesFromNative[0]; - // The Java side can send a * message to indicate that it - // still has messages waiting to be retrieved. - if (messages == '*') { - messagesFromNative.shift(); - window.setTimeout(pollOnce, 0); - return; - } - - var spaceIdx = messages.indexOf(' '); - var msgLen = +messages.slice(0, spaceIdx); - var message = messages.substr(spaceIdx + 1, msgLen); - messages = messages.slice(spaceIdx + msgLen + 1); - processMessage(message); - if (messages) { - messagesFromNative[0] = messages; - } else { - messagesFromNative.shift(); - } - } - } -}; - -module.exports = androidExec; - -}); - -// file: lib/common/init.js -define("cordova/init", function(require, exports, module) { - -var channel = require('cordova/channel'); -var cordova = require('cordova'); -var modulemapper = require('cordova/modulemapper'); -var platform = require('cordova/platform'); -var pluginloader = require('cordova/pluginloader'); - -var platformInitChannelsArray = [channel.onNativeReady, channel.onPluginsReady]; - -function logUnfiredChannels(arr) { - for (var i = 0; i < arr.length; ++i) { - if (arr[i].state != 2) { - console.log('Channel not fired: ' + arr[i].type); - } - } -} - -window.setTimeout(function() { - if (channel.onDeviceReady.state != 2) { - console.log('deviceready has not fired after 5 seconds.'); - logUnfiredChannels(platformInitChannelsArray); - logUnfiredChannels(channel.deviceReadyChannelsArray); - } -}, 5000); - -// Replace navigator before any modules are required(), to ensure it happens as soon as possible. -// We replace it so that properties that can't be clobbered can instead be overridden. -function replaceNavigator(origNavigator) { - var CordovaNavigator = function() {}; - CordovaNavigator.prototype = origNavigator; - var newNavigator = new CordovaNavigator(); - // This work-around really only applies to new APIs that are newer than Function.bind. - // Without it, APIs such as getGamepads() break. - if (CordovaNavigator.bind) { - for (var key in origNavigator) { - if (typeof origNavigator[key] == 'function') { - newNavigator[key] = origNavigator[key].bind(origNavigator); - } - } - } - return newNavigator; -} -if (window.navigator) { - window.navigator = replaceNavigator(window.navigator); -} - -if (!window.console) { - window.console = { - log: function(){} - }; -} -if (!window.console.warn) { - window.console.warn = function(msg) { - this.log("warn: " + msg); - }; -} - -// Register pause, resume and deviceready channels as events on document. -channel.onPause = cordova.addDocumentEventHandler('pause'); -channel.onResume = cordova.addDocumentEventHandler('resume'); -channel.onDeviceReady = cordova.addStickyDocumentEventHandler('deviceready'); - -// Listen for DOMContentLoaded and notify our channel subscribers. -if (document.readyState == 'complete' || document.readyState == 'interactive') { - channel.onDOMContentLoaded.fire(); -} else { - document.addEventListener('DOMContentLoaded', function() { - channel.onDOMContentLoaded.fire(); - }, false); -} - -// _nativeReady is global variable that the native side can set -// to signify that the native code is ready. It is a global since -// it may be called before any cordova JS is ready. -if (window._nativeReady) { - channel.onNativeReady.fire(); -} - -modulemapper.clobbers('cordova', 'cordova'); -modulemapper.clobbers('cordova/exec', 'cordova.exec'); -modulemapper.clobbers('cordova/exec', 'Cordova.exec'); - -// Call the platform-specific initialization. -platform.bootstrap && platform.bootstrap(); - -pluginloader.load(function() { - channel.onPluginsReady.fire(); -}); - -/** - * Create all cordova objects once native side is ready. - */ -channel.join(function() { - modulemapper.mapModules(window); - - platform.initialize && platform.initialize(); - - // Fire event to notify that all objects are created - channel.onCordovaReady.fire(); - - // Fire onDeviceReady event once page has fully loaded, all - // constructors have run and cordova info has been received from native - // side. - channel.join(function() { - require('cordova').fireDocumentEvent('deviceready'); - }, channel.deviceReadyChannelsArray); - -}, platformInitChannelsArray); - - -}); - -// file: lib/common/modulemapper.js -define("cordova/modulemapper", function(require, exports, module) { - -var builder = require('cordova/builder'), - moduleMap = define.moduleMap, - symbolList, - deprecationMap; - -exports.reset = function() { - symbolList = []; - deprecationMap = {}; -}; - -function addEntry(strategy, moduleName, symbolPath, opt_deprecationMessage) { - if (!(moduleName in moduleMap)) { - throw new Error('Module ' + moduleName + ' does not exist.'); - } - symbolList.push(strategy, moduleName, symbolPath); - if (opt_deprecationMessage) { - deprecationMap[symbolPath] = opt_deprecationMessage; - } -} - -// Note: Android 2.3 does have Function.bind(). -exports.clobbers = function(moduleName, symbolPath, opt_deprecationMessage) { - addEntry('c', moduleName, symbolPath, opt_deprecationMessage); -}; - -exports.merges = function(moduleName, symbolPath, opt_deprecationMessage) { - addEntry('m', moduleName, symbolPath, opt_deprecationMessage); -}; - -exports.defaults = function(moduleName, symbolPath, opt_deprecationMessage) { - addEntry('d', moduleName, symbolPath, opt_deprecationMessage); -}; - -exports.runs = function(moduleName) { - addEntry('r', moduleName, null); -}; - -function prepareNamespace(symbolPath, context) { - if (!symbolPath) { - return context; - } - var parts = symbolPath.split('.'); - var cur = context; - for (var i = 0, part; part = parts[i]; ++i) { - cur = cur[part] = cur[part] || {}; - } - return cur; -} - -exports.mapModules = function(context) { - var origSymbols = {}; - context.CDV_origSymbols = origSymbols; - for (var i = 0, len = symbolList.length; i < len; i += 3) { - var strategy = symbolList[i]; - var moduleName = symbolList[i + 1]; - var module = require(moduleName); - // - if (strategy == 'r') { - continue; - } - var symbolPath = symbolList[i + 2]; - var lastDot = symbolPath.lastIndexOf('.'); - var namespace = symbolPath.substr(0, lastDot); - var lastName = symbolPath.substr(lastDot + 1); - - var deprecationMsg = symbolPath in deprecationMap ? 'Access made to deprecated symbol: ' + symbolPath + '. ' + deprecationMsg : null; - var parentObj = prepareNamespace(namespace, context); - var target = parentObj[lastName]; - - if (strategy == 'm' && target) { - builder.recursiveMerge(target, module); - } else if ((strategy == 'd' && !target) || (strategy != 'd')) { - if (!(symbolPath in origSymbols)) { - origSymbols[symbolPath] = target; - } - builder.assignOrWrapInDeprecateGetter(parentObj, lastName, module, deprecationMsg); - } - } -}; - -exports.getOriginalSymbol = function(context, symbolPath) { - var origSymbols = context.CDV_origSymbols; - if (origSymbols && (symbolPath in origSymbols)) { - return origSymbols[symbolPath]; - } - var parts = symbolPath.split('.'); - var obj = context; - for (var i = 0; i < parts.length; ++i) { - obj = obj && obj[parts[i]]; - } - return obj; -}; - -exports.reset(); - - -}); - -// file: lib/android/platform.js -define("cordova/platform", function(require, exports, module) { - -module.exports = { - id: 'android', - bootstrap: function() { - var channel = require('cordova/channel'), - cordova = require('cordova'), - exec = require('cordova/exec'), - modulemapper = require('cordova/modulemapper'); - - // Tell the native code that a page change has occurred. - exec(null, null, 'PluginManager', 'startup', []); - // Tell the JS that the native side is ready. - channel.onNativeReady.fire(); - - // TODO: Extract this as a proper plugin. - modulemapper.clobbers('cordova/plugin/android/app', 'navigator.app'); - - // Inject a listener for the backbutton on the document. - var backButtonChannel = cordova.addDocumentEventHandler('backbutton'); - backButtonChannel.onHasSubscribersChange = function() { - // If we just attached the first handler or detached the last handler, - // let native know we need to override the back button. - exec(null, null, "App", "overrideBackbutton", [this.numHandlers == 1]); - }; - - // Add hardware MENU and SEARCH button handlers - cordova.addDocumentEventHandler('menubutton'); - cordova.addDocumentEventHandler('searchbutton'); - - // Let native code know we are all done on the JS side. - // Native code will then un-hide the WebView. - channel.onCordovaReady.subscribe(function() { - exec(null, null, "App", "show", []); - }); - } -}; - -}); - -// file: lib/android/plugin/android/app.js -define("cordova/plugin/android/app", function(require, exports, module) { - -var exec = require('cordova/exec'); - -module.exports = { - /** - * Clear the resource cache. - */ - clearCache:function() { - exec(null, null, "App", "clearCache", []); - }, - - /** - * Load the url into the webview or into new browser instance. - * - * @param url The URL to load - * @param props Properties that can be passed in to the activity: - * wait: int => wait msec before loading URL - * loadingDialog: "Title,Message" => display a native loading dialog - * loadUrlTimeoutValue: int => time in msec to wait before triggering a timeout error - * clearHistory: boolean => clear webview history (default=false) - * openExternal: boolean => open in a new browser (default=false) - * - * Example: - * navigator.app.loadUrl("http://server/myapp/index.html", {wait:2000, loadingDialog:"Wait,Loading App", loadUrlTimeoutValue: 60000}); - */ - loadUrl:function(url, props) { - exec(null, null, "App", "loadUrl", [url, props]); - }, - - /** - * Cancel loadUrl that is waiting to be loaded. - */ - cancelLoadUrl:function() { - exec(null, null, "App", "cancelLoadUrl", []); - }, - - /** - * Clear web history in this web view. - * Instead of BACK button loading the previous web page, it will exit the app. - */ - clearHistory:function() { - exec(null, null, "App", "clearHistory", []); - }, - - /** - * Go to previous page displayed. - * This is the same as pressing the backbutton on Android device. - */ - backHistory:function() { - exec(null, null, "App", "backHistory", []); - }, - - /** - * Override the default behavior of the Android back button. - * If overridden, when the back button is pressed, the "backKeyDown" JavaScript event will be fired. - * - * Note: The user should not have to call this method. Instead, when the user - * registers for the "backbutton" event, this is automatically done. - * - * @param override T=override, F=cancel override - */ - overrideBackbutton:function(override) { - exec(null, null, "App", "overrideBackbutton", [override]); - }, - - /** - * Exit and terminate the application. - */ - exitApp:function() { - return exec(null, null, "App", "exitApp", []); - } -}; - -}); - -// file: lib/common/pluginloader.js -define("cordova/pluginloader", function(require, exports, module) { - -var modulemapper = require('cordova/modulemapper'); - -// Helper function to inject a - - - - diff --git a/cordova-lib/spec-cordova/fixtures/platforms/android/assets/www/js/index.js b/cordova-lib/spec-cordova/fixtures/platforms/android/assets/www/js/index.js deleted file mode 100644 index 31d9064eb..000000000 --- a/cordova-lib/spec-cordova/fixtures/platforms/android/assets/www/js/index.js +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -var app = { - // Application Constructor - initialize: function() { - this.bindEvents(); - }, - // Bind Event Listeners - // - // Bind any events that are required on startup. Common events are: - // 'load', 'deviceready', 'offline', and 'online'. - bindEvents: function() { - document.addEventListener('deviceready', this.onDeviceReady, false); - }, - // deviceready Event Handler - // - // The scope of 'this' is the event. In order to call the 'receivedEvent' - // function, we must explicity call 'app.receivedEvent(...);' - onDeviceReady: function() { - app.receivedEvent('deviceready'); - }, - // Update DOM on a Received Event - receivedEvent: function(id) { - var parentElement = document.getElementById(id); - var listeningElement = parentElement.querySelector('.listening'); - var receivedElement = parentElement.querySelector('.received'); - - listeningElement.setAttribute('style', 'display:none;'); - receivedElement.setAttribute('style', 'display:block;'); - - console.log('Received Event: ' + id); - } -}; diff --git a/cordova-lib/spec-cordova/fixtures/platforms/android/assets/www/spec.html b/cordova-lib/spec-cordova/fixtures/platforms/android/assets/www/spec.html deleted file mode 100644 index 71f00de05..000000000 --- a/cordova-lib/spec-cordova/fixtures/platforms/android/assets/www/spec.html +++ /dev/null @@ -1,68 +0,0 @@ - - - - - Jasmine Spec Runner - - - - - - - - - - - - - - - - - - - - diff --git a/cordova-lib/spec-cordova/fixtures/platforms/android/build.xml b/cordova-lib/spec-cordova/fixtures/platforms/android/build.xml deleted file mode 100644 index 9674edf7d..000000000 --- a/cordova-lib/spec-cordova/fixtures/platforms/android/build.xml +++ /dev/null @@ -1,92 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/cordova-lib/spec-cordova/fixtures/platforms/android/cordova/build b/cordova-lib/spec-cordova/fixtures/platforms/android/cordova/build deleted file mode 100755 index 7028eb812..000000000 --- a/cordova-lib/spec-cordova/fixtures/platforms/android/cordova/build +++ /dev/null @@ -1,35 +0,0 @@ -#!/usr/bin/env node - -/* - Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.0 (the - "License"); you may not use this file except in compliance - with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, - software distributed under the License is distributed on an - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - KIND, either express or implied. See the License for the - specific language governing permissions and limitations - under the License. -*/ - -var build = require('./lib/build'), - reqs = require('./lib/check_reqs'), - args = process.argv; - -// Support basic help commands -if(args[2] == '--help' || args[2] == '/?' || args[2] == '-h' || - args[2] == 'help' || args[2] == '-help' || args[2] == '/help') { - build.help(); -} else if(reqs.run()) { - build.run(args[2]); - process.exit(0); -} else { - process.exit(2); -} diff --git a/cordova-lib/spec-cordova/fixtures/platforms/android/cordova/check_reqs b/cordova-lib/spec-cordova/fixtures/platforms/android/cordova/check_reqs deleted file mode 100755 index 4a8abee46..000000000 --- a/cordova-lib/spec-cordova/fixtures/platforms/android/cordova/check_reqs +++ /dev/null @@ -1,27 +0,0 @@ -#!/usr/bin/env node - -/* - Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.0 (the - "License"); you may not use this file except in compliance - with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, - software distributed under the License is distributed on an - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - KIND, either express or implied. See the License for the - specific language governing permissions and limitations - under the License. -*/ - -var check_reqs = require('./lib/check_reqs'); - -if(!check_reqs.run()) { - process.exit(2); -} - diff --git a/cordova-lib/spec-cordova/fixtures/platforms/android/cordova/clean b/cordova-lib/spec-cordova/fixtures/platforms/android/cordova/clean deleted file mode 100755 index 70c4ca80e..000000000 --- a/cordova-lib/spec-cordova/fixtures/platforms/android/cordova/clean +++ /dev/null @@ -1,34 +0,0 @@ -#!/usr/bin/env node - -/* - Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.0 (the - "License"); you may not use this file except in compliance - with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, - software distributed under the License is distributed on an - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - KIND, either express or implied. See the License for the - specific language governing permissions and limitations - under the License. -*/ - -var clean = require('./lib/clean'), - reqs = require('./lib/check_reqs'), - args = process.argv; - -// Usage support for when args are given -if(args.length > 2) { - clean.help(); -} else if(reqs.run()) { - clean.run(); - process.exit(0); -} else { - process.exit(2); -} diff --git a/cordova-lib/spec-cordova/fixtures/platforms/android/cordova/defaults.xml b/cordova-lib/spec-cordova/fixtures/platforms/android/cordova/defaults.xml deleted file mode 100644 index 24e572540..000000000 --- a/cordova-lib/spec-cordova/fixtures/platforms/android/cordova/defaults.xml +++ /dev/null @@ -1,50 +0,0 @@ - - - - Hello Cordova - - - A sample Apache Cordova application that responds to the deviceready event. - - - - Apache Cordova Team - - - - - - - - - - - - - - diff --git a/cordova-lib/spec-cordova/fixtures/platforms/android/cordova/lib/appinfo.js b/cordova-lib/spec-cordova/fixtures/platforms/android/cordova/lib/appinfo.js deleted file mode 100755 index 1f8ebe2cf..000000000 --- a/cordova-lib/spec-cordova/fixtures/platforms/android/cordova/lib/appinfo.js +++ /dev/null @@ -1,41 +0,0 @@ -#!/usr/bin/env node - -/* - Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.0 (the - "License"); you may not use this file except in compliance - with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, - software distributed under the License is distributed on an - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - KIND, either express or implied. See the License for the - specific language governing permissions and limitations - under the License. -*/ - -var path = require('path'); -var fs = require('fs'); -var cachedAppInfo = null; - -function readAppInfoFromManifest() { - var manifestPath = path.join(__dirname, '..', '..', 'AndroidManifest.xml'); - var manifestData = fs.readFileSync(manifestPath, {encoding:'utf8'}); - var packageName = /\bpackage\s*=\s*"(.+?)"/.exec(manifestData); - if (!packageName) throw new Error('Could not find package name within ' + manifestPath); - var activityTag = //.exec(manifestData); - if (!activityTag) throw new Error('Could not find within ' + manifestPath); - var activityName = /\bandroid:name\s*=\s*"(.+?)"/.exec(activityTag); - if (!activityName) throw new Error('Could not find android:name within ' + manifestPath); - - return packageName[1] + '/.' + activityName[1]; -} - -exports.getActivityName = function() { - return cachedAppInfo = cachedAppInfo || readAppInfoFromManifest(); -}; diff --git a/cordova-lib/spec-cordova/fixtures/platforms/android/cordova/lib/build.js b/cordova-lib/spec-cordova/fixtures/platforms/android/cordova/lib/build.js deleted file mode 100755 index 7bc33ca27..000000000 --- a/cordova-lib/spec-cordova/fixtures/platforms/android/cordova/lib/build.js +++ /dev/null @@ -1,89 +0,0 @@ -#!/usr/bin/env node - -/* - Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.0 (the - "License"); you may not use this file except in compliance - with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, - software distributed under the License is distributed on an - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - KIND, either express or implied. See the License for the - specific language governing permissions and limitations - under the License. -*/ - -var shell = require('shelljs'), - clean = require('./clean'), - path = require('path'), - fs = require('fs'), - ROOT = path.join(__dirname, '..', '..'); - -/* - * Builds the project with ant. - */ -module.exports.run = function(build_type) { - //default build type - build_type = typeof build_type !== 'undefined' ? build_type : "--debug"; - var cmd; - switch(build_type) { - case '--debug' : - clean.run(); - cmd = 'ant debug -f ' + path.join(ROOT, 'build.xml'); - break; - case '--release' : - clean.run(); - cmd = 'ant release -f ' + path.join(ROOT, 'build.xml'); - break; - case '--nobuild' : - console.log('Skipping build...'); - break; - default : - console.error('Build option \'' + build_type + '\' not recognized.'); - process.exit(2); - break; - } - if(cmd) { - var result = shell.exec(cmd, {silent:false, async:false}); - if(result.code > 0) { - console.error('ERROR: Failed to build android project.'); - console.error(result.output); - process.exit(2); - } - } -} - -/* - * Gets the path to the apk file, if not such file exists then - * the script will error out. (should we error or just return undefined?) - */ -module.exports.get_apk = function() { - if(fs.existsSync(path.join(ROOT, 'bin'))) { - var bin_files = fs.readdirSync(path.join(ROOT, 'bin')); - for (file in bin_files) { - if(path.extname(bin_files[file]) == '.apk') { - return path.join(ROOT, 'bin', bin_files[file]); - } - } - console.error('ERROR : No .apk found in \'bin\' folder'); - process.exit(2); - } else { - console.error('ERROR : unable to find project bin folder, could not locate .apk'); - process.exit(2); - } -} - -module.exports.help = function() { - console.log('Usage: ' + path.relative(process.cwd(), path.join(ROOT, 'cordova', 'build')) + ' [build_type]'); - console.log('Build Types : '); - console.log(' \'--debug\': Default build, will build project in using ant debug'); - console.log(' \'--release\': will build project using ant release'); - console.log(' \'--nobuild\': will skip build process (can be used with run command)'); - process.exit(0); -} diff --git a/cordova-lib/spec-cordova/fixtures/platforms/android/cordova/lib/check_reqs.js b/cordova-lib/spec-cordova/fixtures/platforms/android/cordova/lib/check_reqs.js deleted file mode 100755 index c064499f1..000000000 --- a/cordova-lib/spec-cordova/fixtures/platforms/android/cordova/lib/check_reqs.js +++ /dev/null @@ -1,78 +0,0 @@ -#!/usr/bin/env node - -/* - Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.0 (the - "License"); you may not use this file except in compliance - with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, - software distributed under the License is distributed on an - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - KIND, either express or implied. See the License for the - specific language governing permissions and limitations - under the License. -*/ - -var shell = require('shelljs'), - path = require('path'), - fs = require('fs'), - ROOT = path.join(__dirname, '..', '..'); - -// Get valid target from framework/project.properties -module.exports.get_target = function() { - if(fs.existsSync(path.join(ROOT, 'framework', 'project.properties'))) { - var target = shell.grep(/target=android-[\d+]/, path.join(ROOT, 'framework', 'project.properties')); - return target.split('=')[1].replace('\n', '').replace('\r', '').replace(' ', ''); - } else if (fs.existsSync(path.join(ROOT, 'project.properties'))) { - // if no target found, we're probably in a project and project.properties is in ROOT. - var target = shell.grep(/target=android-[\d+]/, path.join(ROOT, 'project.properties')); - return target.split('=')[1].replace('\n', '').replace('\r', '').replace(' ', ''); - } -} - -module.exports.check_ant = function() { - var test = shell.exec('ant -version', {silent:true, async:false}); - if(test.code > 0) { - console.error('ERROR : executing command \'ant\', make sure you have ant installed and added to your path.'); - return false; - } - return true; -} - -module.exports.check_java = function() { - if(process.env.JAVA_HOME) { - var test = shell.exec('java', {silent:true, async:false}); - if(test.code > 0) { - console.error('ERROR : executing command \'java\', make sure you java environment is set up. Including your JDK and JRE.'); - return false; - } - return true; - } else { - console.error('ERROR : Make sure JAVA_HOME is set, as well as paths to your JDK and JRE for java.'); - return false; - } -} - -module.exports.check_android = function() { - var valid_target = this.get_target(); - var targets = shell.exec('android list targets', {silent:true, async:false}); - - if(targets.code > 0 && targets.output.match(/command\snot\sfound/)) { - console.error('The command \"android\" failed. Make sure you have the latest Android SDK installed, and the \"android\" command (inside the tools/ folder) is added to your path.'); - return false; - } else if(!targets.output.match(valid_target)) { - console.error('Please install Android target ' + valid_target.split('-')[1] + ' (the Android newest SDK). Make sure you have the latest Android tools installed as well. Run \"android\" from your command-line to install/update any missing SDKs or tools.'); - return false; - } - return true; -} - -module.exports.run = function() { - return this.check_ant() && this.check_java && this.check_android(); -} diff --git a/cordova-lib/spec-cordova/fixtures/platforms/android/cordova/lib/clean.js b/cordova-lib/spec-cordova/fixtures/platforms/android/cordova/lib/clean.js deleted file mode 100755 index 8f140153e..000000000 --- a/cordova-lib/spec-cordova/fixtures/platforms/android/cordova/lib/clean.js +++ /dev/null @@ -1,43 +0,0 @@ -#!/usr/bin/env node - -/* - Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.0 (the - "License"); you may not use this file except in compliance - with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, - software distributed under the License is distributed on an - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - KIND, either express or implied. See the License for the - specific language governing permissions and limitations - under the License. -*/ - -var shell = require('shelljs'), - path = require('path'), - ROOT = path.join(__dirname, '..', '..'); - -/* - * Cleans the project using ant - */ -module.exports.run = function() { - var cmd = 'ant clean -f ' + path.join(ROOT, 'build.xml'); - var result = shell.exec(cmd, {silent:false, async:false}); - if (result.code > 0) { - console.error('ERROR: Failed to clean android project.'); - console.error(result.output); - process.exit(2); - } -} - -module.exports.help = function() { - console.log('Usage: ' + path.relative(process.cwd(), path.join(ROOT, 'cordova', 'clean'))); - console.log('Cleans the project directory.'); - process.exit(0); -} diff --git a/cordova-lib/spec-cordova/fixtures/platforms/android/cordova/lib/device.js b/cordova-lib/spec-cordova/fixtures/platforms/android/cordova/lib/device.js deleted file mode 100755 index 363dc2bd0..000000000 --- a/cordova-lib/spec-cordova/fixtures/platforms/android/cordova/lib/device.js +++ /dev/null @@ -1,95 +0,0 @@ -#!/usr/bin/env node - -/* - Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.0 (the - "License"); you may not use this file except in compliance - with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, - software distributed under the License is distributed on an - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - KIND, either express or implied. See the License for the - specific language governing permissions and limitations - under the License. -*/ - -var shell = require('shelljs'), - path = require('path'), - build = require('./build'), - appinfo = require('./appinfo'), - exec = require('child_process').exec, - ROOT = path.join(__dirname, '..', '..'); - -/** - * Returns a list of the device ID's found - */ -module.exports.list = function() { - var cmd = 'adb devices'; - var result = shell.exec(cmd, {silent:true, async:false}); - if (result.code > 0) { - console.error('Failed to execute android command \'' + cmd + '\'.'); - process.exit(2); - } else { - var response = result.output.split('\n'); - var device_list = []; - for (var i = 1; i < response.length; i++) { - if (response[i].match(/\w+\tdevice/) && !response[i].match(/emulator/)) { - device_list.push(response[i].replace(/\tdevice/, '').replace('\r', '')); - } - } - return device_list; - } -} - -/* - * Installs a previously built application on the device - * and launches it. - */ -module.exports.install = function(target) { - var device_list = this.list(); - if (device_list.length > 0) { - // default device - target = typeof target !== 'undefined' ? target : device_list[0]; - if (device_list.indexOf(target) > -1) { - var apk_path = build.get_apk(); - var launchName = appinfo.getActivityName(); - console.log('Installing app on device...'); - cmd = 'adb -s ' + target + ' install -r ' + apk_path; - var install = shell.exec(cmd, {silent:false, async:false}); - if (install.error || install.output.match(/Failure/)) { - console.error('ERROR : Failed to install apk to device : '); - console.error(install.output); - process.exit(2); - } - - //unlock screen - cmd = 'adb -s ' + target + ' shell input keyevent 82'; - shell.exec(cmd, {silent:true, async:false}); - - // launch the application - console.log('Launching application...'); - cmd = 'adb -s ' + target + ' shell am start -W -a android.intent.action.MAIN -n ' + launchName; - var launch = shell.exec(cmd, {silent:true, async:false}); - if(launch.code > 0) { - console.error('ERROR : Failed to launch application on emulator : ' + launch.error); - console.error(launch.output); - process.exit(2); - } else { - console.log('LAUNCH SUCCESS'); - } - } else { - console.error('ERROR : Unable to find target \'' + target + '\'.'); - console.error('Failed to deploy to device.'); - process.exit(2); - } - } else { - console.error('ERROR : Failed to deploy to device, no devices found.'); - process.exit(2); - } -} diff --git a/cordova-lib/spec-cordova/fixtures/platforms/android/cordova/lib/emulator.js b/cordova-lib/spec-cordova/fixtures/platforms/android/cordova/lib/emulator.js deleted file mode 100755 index cc658a9b9..000000000 --- a/cordova-lib/spec-cordova/fixtures/platforms/android/cordova/lib/emulator.js +++ /dev/null @@ -1,337 +0,0 @@ -#!/usr/bin/env node - -/* - Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.0 (the - "License"); you may not use this file except in compliance - with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, - software distributed under the License is distributed on an - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - KIND, either express or implied. See the License for the - specific language governing permissions and limitations - under the License. -*/ - -var shell = require('shelljs'), - path = require('path'), - appinfo = require('./appinfo'), - build = require('./build'), - ROOT = path.join(__dirname, '..', '..'), - new_emulator = 'cordova_emulator'; - -/** - * Returns a list of emulator images in the form of objects - * { - name : , - path : , - target : , - abi : , - skin : - } - */ -module.exports.list_images = function() { - var cmd = 'android list avds'; - var result = shell.exec(cmd, {silent:true, async:false}); - if (result.code > 0) { - console.error('Failed to execute android command \'' + cmd + '\'.'); - process.exit(2); - } else { - var response = result.output.split('\n'); - var emulator_list = []; - for (var i = 1; i < response.length; i++) { - // To return more detailed information use img_obj - var img_obj = {}; - if (response[i].match(/Name:\s/)) { - img_obj['name'] = response[i].split('Name: ')[1].replace('\r', ''); - if (response[i + 1].match(/Path:\s/)) { - i++; - img_obj['path'] = response[i].split('Path: ')[1].replace('\r', ''); - } - if (response[i + 1].match(/\(API\slevel\s/)) { - i++; - img_obj['target'] = response[i].replace('\r', ''); - } - if (response[i + 1].match(/ABI:\s/)) { - i++; - img_obj['abi'] = response[i].split('ABI: ')[1].replace('\r', ''); - } - if (response[i + 1].match(/Skin:\s/)) { - i++; - img_obj['skin'] = response[i].split('Skin: ')[1].replace('\r', ''); - } - - emulator_list.push(img_obj); - } - /* To just return a list of names use this - if (response[i].match(/Name:\s/)) { - emulator_list.push(response[i].split('Name: ')[1].replace('\r', ''); - }*/ - - } - return emulator_list; - } -} - -/** - * Will return the closest avd to the projects target - * or undefined if no avds exist. - */ -module.exports.best_image = function() { - var project_target = this.get_target().replace('android-', ''); - var images = this.list_images(); - var closest = 9999; - var best = images[0]; - for (i in images) { - var target = images[i].target; - if(target) { - var num = target.split('(API level ')[1].replace(')', ''); - if (num == project_target) { - return images[i]; - } else if (project_target - num < closest && project_target > num) { - var closest = project_target - num; - best = images[i]; - } - } - } - return best; -} - -module.exports.list_started = function() { - var cmd = 'adb devices'; - var result = shell.exec(cmd, {silent:true, async:false}); - if (result.code > 0) { - console.error('Failed to execute android command \'' + cmd + '\'.'); - process.exit(2); - } else { - var response = result.output.split('\n'); - var started_emulator_list = []; - for (var i = 1; i < response.length; i++) { - if (response[i].match(/device/) && response[i].match(/emulator/)) { - started_emulator_list.push(response[i].replace(/\tdevice/, '').replace('\r', '')); - } - } - return started_emulator_list; - } -} - -module.exports.get_target = function() { - var target = shell.grep(/target=android-[\d+]/, path.join(ROOT, 'project.properties')); - return target.split('=')[1].replace('\n', '').replace('\r', '').replace(' ', ''); -} - -module.exports.list_targets = function() { - var target_out = shell.exec('android list targets', {silent:true, async:false}).output.split('\n'); - var targets = []; - for (var i = target_out.length; i >= 0; i--) { - if(target_out[i].match(/id:/)) { - targets.push(targets[i].split(' ')[1]); - } - } - return targets; -} - -/* - * Starts an emulator with the given ID, - * and returns the started ID of that emulator. - * If no ID is given it will used the first image availible, - * if no image is availible it will error out (maybe create one?). - */ -module.exports.start = function(emulator_ID) { - var started_emulators = this.list_started(); - var num_started = started_emulators.length; - if (typeof emulator_ID === 'undefined') { - var emulator_list = this.list_images(); - if (emulator_list.length > 0) { - emulator_ID = this.best_image().name; - console.log('WARNING : no emulator specified, defaulting to ' + emulator_ID); - } else { - console.error('ERROR : No emulator images (avds) found, if you would like to create an'); - console.error(' avd follow the instructions provided here : '); - console.error(' http://developer.android.com/tools/devices/index.html') - console.error(' Or run \'android create avd --name --target \' '); - console.error(' in on the command line.'); - process.exit(2); - /*console.log('WARNING : no emulators availible, creating \'' + new_emulator + '\'.'); - this.create_image(new_emulator, this.get_target()); - emulator_ID = new_emulator;*/ - } - } - - var pipe_null = (process.platform == 'win32' || process.platform == 'win64'? '> NUL' : '> /dev/null'); - var cmd = 'emulator -avd ' + emulator_ID + ' ' + pipe_null + ' &'; - if(process.platform == 'win32' || process.platform == 'win64') { - cmd = '%comspec% /c start cmd /c ' + cmd; - } - var result = shell.exec(cmd, {silent:true, async:false}, function(code, output) { - if (code > 0) { - console.error('Failed to execute android command \'' + cmd + '\'.'); - console.error(output); - process.exit(2); - } - }); - - // wait for emulator to start - console.log('Waiting for emulator...'); - var new_started = this.wait_for_emulator(num_started); - var emulator_id; - if (new_started.length > 1) { - for (i in new_started) { - console.log(new_started[i]); - console.log(started_emulators.indexOf(new_started[i])); - if (started_emulators.indexOf(new_started[i]) < 0) { - emulator_id = new_started[i]; - } - } - } else { - emulator_id = new_started[0]; - } - if (!emulator_id) { - console.error('ERROR : Failed to start emulator, could not find new emulator'); - process.exit(2); - } - - //wait for emulator to boot up - process.stdout.write('Booting up emulator (this may take a while)...'); - this.wait_for_boot(emulator_id); - console.log('BOOT COMPLETE'); - - //unlock screen - cmd = 'adb -s ' + emulator_id + ' shell input keyevent 82'; - shell.exec(cmd, {silent:false, async:false}); - - //return the new emulator id for the started emulators - return emulator_id; -} - -/* - * Waits for the new emulator to apear on the started-emulator list. - */ -module.exports.wait_for_emulator = function(num_running) { - var new_started = this.list_started(); - if (new_started.length > num_running) { - return new_started; - } else { - this.sleep(1); - return this.wait_for_emulator(num_running); - } -} - -/* - * Waits for the boot animation property of the emulator to switch to 'stopped' - */ -module.exports.wait_for_boot = function(emulator_id) { - var cmd; - // ShellJS opens a lot of file handles, and the default on OS X is too small. - // TODO : This is not working, need to find a better way to increese the ulimit. - if(process.platform == 'win32' || process.platform == 'win64') { - cmd = 'adb -s ' + emulator_id + ' shell getprop init.svc.bootanim'; - } else { - cmd = 'ulimit -S -n 4096; adb -s ' + emulator_id + ' shell getprop init.svc.bootanim'; - } - var boot_anim = shell.exec(cmd, {silent:true, async:false}); - if (boot_anim.output.match(/stopped/)) { - return; - } else { - process.stdout.write('.'); - this.sleep(3); - return this.wait_for_boot(emulator_id); - } -} - -/* - * TODO : find a better way to wait for the emulator (maybe using async methods?) - */ -module.exports.sleep = function(time_sec) { - if (process.platform == 'win32' || process.platform == 'win64') { - shell.exec('ping 127.0.0.1 -n ' + time_sec, {silent:true, async:false}); - } else { - shell.exec('sleep ' + time_sec, {silent:true, async:false}); - } -} - -/* - * Create avd - * TODO : Enter the stdin input required to complete the creation of an avd. - */ -module.exports.create_image = function(name, target) { - console.log('Creating avd named ' + name); - if (target) { - var cmd = 'android create avd --name ' + name + ' --target ' + target; - var create = shell.exec(cmd, {sient:false, async:false}); - if (create.error) { - console.error('ERROR : Failed to create emulator image : '); - console.error(' Do you have the latest android targets including ' + target + '?'); - console.error(create.output); - process.exit(2); - } - } else { - console.log('WARNING : Project target not found, creating avd with a different target but the project may fail to install.'); - var cmd = 'android create avd --name ' + name + ' --target ' + this.list_targets()[0]; - var create = shell.exec(cmd, {sient:false, async:false}); - if (create.error) { - console.error('ERROR : Failed to create emulator image : '); - console.error(create.output); - process.exit(2); - } - console.error('ERROR : Unable to create an avd emulator, no targets found.'); - console.error('Please insure you have targets availible by runing the "android" command'). - process.exit(2); - } -} - -/* - * Installs a previously built application on the emulator and launches it. - * If no target is specified, then it picks one. - * If no started emulators are found, error out. - */ -module.exports.install = function(target) { - var emulator_list = this.list_started(); - if (emulator_list.length < 1) { - console.error('ERROR : No started emulators found, please start an emultor before deploying your project.'); - process.exit(2); - /*console.log('WARNING : No started emulators found, attemting to start an avd...'); - this.start(this.best_image().name);*/ - } - // default emulator - target = typeof target !== 'undefined' ? target : emulator_list[0]; - if (emulator_list.indexOf(target) > -1) { - console.log('Installing app on emulator...'); - var apk_path = build.get_apk(); - var cmd = 'adb -s ' + target + ' install -r ' + apk_path; - var install = shell.exec(cmd, {sient:false, async:false}); - if (install.error || install.output.match(/Failure/)) { - console.error('ERROR : Failed to install apk to emulator : '); - console.error(install.output); - process.exit(2); - } - - //unlock screen - cmd = 'adb -s ' + target + ' shell input keyevent 82'; - shell.exec(cmd, {silent:true, async:false}); - - // launch the application - console.log('Launching application...'); - var launchName = appinfo.getActivityName(); - cmd = 'adb -s ' + target + ' shell am start -W -a android.intent.action.MAIN -n ' + launchName; - console.log(cmd); - var launch = shell.exec(cmd, {silent:false, async:false}); - if(launch.code > 0) { - console.error('ERROR : Failed to launch application on emulator : ' + launch.error); - console.error(launch.output); - process.exit(2); - } else { - console.log('LAUNCH SUCCESS'); - } - } else { - console.error('ERROR : Unable to find target \'' + target + '\'.'); - console.error('Failed to deploy to emulator.'); - process.exit(2); - } -} diff --git a/cordova-lib/spec-cordova/fixtures/platforms/android/cordova/lib/install-device b/cordova-lib/spec-cordova/fixtures/platforms/android/cordova/lib/install-device deleted file mode 100755 index 679efbf97..000000000 --- a/cordova-lib/spec-cordova/fixtures/platforms/android/cordova/lib/install-device +++ /dev/null @@ -1,38 +0,0 @@ -#!/usr/bin/env node - -/* - Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.0 (the - "License"); you may not use this file except in compliance - with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, - software distributed under the License is distributed on an - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - KIND, either express or implied. See the License for the - specific language governing permissions and limitations - under the License. -*/ - -var device = require('./device'), - args = process.argv; - -if(args.length > 2) { - var install_target; - if (args[2].substring(0, 9) == '--target=') { - install_target = args[2].substring(9, args[2].length); - device.install(install_target); - process.exit(0); - } else { - console.error('ERROR : argument \'' + args[2] + '\' not recognized.'); - process.exit(2); - } -} else { - device.install(); - process.exit(0); -} diff --git a/cordova-lib/spec-cordova/fixtures/platforms/android/cordova/lib/install-emulator b/cordova-lib/spec-cordova/fixtures/platforms/android/cordova/lib/install-emulator deleted file mode 100755 index c006eb264..000000000 --- a/cordova-lib/spec-cordova/fixtures/platforms/android/cordova/lib/install-emulator +++ /dev/null @@ -1,38 +0,0 @@ -#!/usr/bin/env node - -/* - Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.0 (the - "License"); you may not use this file except in compliance - with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, - software distributed under the License is distributed on an - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - KIND, either express or implied. See the License for the - specific language governing permissions and limitations - under the License. -*/ - -var emulator = require('./emulator'), - args = process.argv; - -if(args.length > 2) { - var install_target; - if (args[2].substring(0, 9) == '--target=') { - install_target = args[2].substring(9, args[2].length); - emulator.install(install_target); - process.exit(0); - } else { - console.error('ERROR : argument \'' + args[2] + '\' not recognized.'); - process.exit(2); - } -} else { - emulator.install(); - process.exit(0); -} diff --git a/cordova-lib/spec-cordova/fixtures/platforms/android/cordova/lib/list-devices b/cordova-lib/spec-cordova/fixtures/platforms/android/cordova/lib/list-devices deleted file mode 100755 index 3ef4efab2..000000000 --- a/cordova-lib/spec-cordova/fixtures/platforms/android/cordova/lib/list-devices +++ /dev/null @@ -1,28 +0,0 @@ -#!/usr/bin/env node - -/* - Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.0 (the - "License"); you may not use this file except in compliance - with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, - software distributed under the License is distributed on an - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - KIND, either express or implied. See the License for the - specific language governing permissions and limitations - under the License. -*/ - -var devices = require('./device'); - -// Usage support for when args are given -var device_list = devices.list(); -for(device in device_list) { - console.log(device_list[device]); -} diff --git a/cordova-lib/spec-cordova/fixtures/platforms/android/cordova/lib/list-emulator-images b/cordova-lib/spec-cordova/fixtures/platforms/android/cordova/lib/list-emulator-images deleted file mode 100755 index 3230537a7..000000000 --- a/cordova-lib/spec-cordova/fixtures/platforms/android/cordova/lib/list-emulator-images +++ /dev/null @@ -1,29 +0,0 @@ -#!/usr/bin/env node - -/* - Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.0 (the - "License"); you may not use this file except in compliance - with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, - software distributed under the License is distributed on an - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - KIND, either express or implied. See the License for the - specific language governing permissions and limitations - under the License. -*/ - -var emulators = require('./emulator'); - -// Usage support for when args are given -var emulator_list = emulators.list_images(); -for(emulator in emulator_list) { - console.log(emulator_list[emulator].name); - process.exit(0); -} diff --git a/cordova-lib/spec-cordova/fixtures/platforms/android/cordova/lib/list-started-emulators b/cordova-lib/spec-cordova/fixtures/platforms/android/cordova/lib/list-started-emulators deleted file mode 100755 index 525a64c17..000000000 --- a/cordova-lib/spec-cordova/fixtures/platforms/android/cordova/lib/list-started-emulators +++ /dev/null @@ -1,29 +0,0 @@ -#!/usr/bin/env node - -/* - Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.0 (the - "License"); you may not use this file except in compliance - with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, - software distributed under the License is distributed on an - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - KIND, either express or implied. See the License for the - specific language governing permissions and limitations - under the License. -*/ - -var emulators = require('./emulator'); - -// Usage support for when args are given -var emulator_list = emulators.list_started(); -for(emulator in emulator_list) { - console.log(emulator_list[emulator]); - process.exit(0); -} diff --git a/cordova-lib/spec-cordova/fixtures/platforms/android/cordova/lib/log.js b/cordova-lib/spec-cordova/fixtures/platforms/android/cordova/lib/log.js deleted file mode 100755 index b85cf6063..000000000 --- a/cordova-lib/spec-cordova/fixtures/platforms/android/cordova/lib/log.js +++ /dev/null @@ -1,43 +0,0 @@ -#!/usr/bin/env node - -/* - Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.0 (the - "License"); you may not use this file except in compliance - with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, - software distributed under the License is distributed on an - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - KIND, either express or implied. See the License for the - specific language governing permissions and limitations - under the License. -*/ - -var shell = require('shelljs'), - path = require('path'), - ROOT = path.join(__dirname, '..', '..'); - -/* - * Starts running logcat in the shell. - */ -module.exports.run = function() { - var cmd = 'adb logcat | grep -v nativeGetEnabledTags'; - var result = shell.exec(cmd, {silent:false, async:false}); - if (result.code > 0) { - console.error('ERROR: Failed to run logcat command.'); - console.error(result.output); - process.exit(2); - } -} - -module.exports.help = function() { - console.log('Usage: ' + path.relative(process.cwd(), path.join(ROOT, 'cordova', 'log'))); - console.log('Gives the logcat output on the command line.'); - process.exit(0); -} diff --git a/cordova-lib/spec-cordova/fixtures/platforms/android/cordova/lib/run.js b/cordova-lib/spec-cordova/fixtures/platforms/android/cordova/lib/run.js deleted file mode 100755 index 787d12325..000000000 --- a/cordova-lib/spec-cordova/fixtures/platforms/android/cordova/lib/run.js +++ /dev/null @@ -1,124 +0,0 @@ -#!/usr/bin/env node - -/* - Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.0 (the - "License"); you may not use this file except in compliance - with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, - software distributed under the License is distributed on an - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - KIND, either express or implied. See the License for the - specific language governing permissions and limitations - under the License. -*/ - -var path = require('path'), - build = require('./build'), - emulator = require('./emulator'), - device = require('./device'), - ROOT = path.join(__dirname, '..', '..'); - -/* - * Runs the application on a device if availible. - * If not device is found, it will use a started emulator. - * If no started emulators are found it will attempt to start an avd. - * If no avds are found it will error out. - */ - module.exports.run = function(args) { - var build_type; - var install_target; - - for (var i=2; i -1) { - device.install(install_target); - } else if (started_emulators.indexOf(install_target) > -1) { - emulator.install(install_target); - } else { - // if target emulator isn't started, then start it. - var emulator_ID; - for(avd in avds) { - if(avds[avd].name == install_target) { - emulator_ID = emulator.start(install_target); - emulator.install(emulator_ID); - break; - } - } - if(!emulator_ID) { - console.error('ERROR : Target \'' + install_target + '\' not found, unalbe to run project'); - process.exit(2); - } - } - } else { - // no target given, deploy to device if availible, otherwise use the emulator. - var device_list = device.list(); - if (device_list.length > 0) { - console.log('WARNING : No target specified, deploying to device \'' + device_list[0] + '\'.'); - device.install(device_list[0]) - } else { - var emulator_list = emulator.list_started(); - if (emulator_list.length > 0) { - console.log('WARNING : No target specified, deploying to emulator \'' + emulator_list[0] + '\'.'); - emulator.install(emulator_list[0]); - } else { - console.log('WARNING : No started emulators found, starting an emulator.'); - var best_avd = emulator.best_image(); - if(best_avd) { - var emulator_ID = emulator.start(best_avd.name); - console.log('WARNING : No target specified, deploying to emulator \'' + emulator_ID + '\'.'); - emulator.install(emulator_ID); - } else { - emulator.start(); - } - } - } - } -} - -module.exports.help = function() { - console.log('Usage: ' + path.relative(process.cwd(), path.join(ROOT, 'cordova', 'run')) + ' [options]'); - console.log('Build options :'); - console.log(' --debug : Builds project in debug mode'); - console.log(' --release : Builds project in release mode'); - console.log(' --nobuild : Runs the currently built project without recompiling'); - console.log('Deploy options :'); - console.log(' --device : Will deploy the built project to a device'); - console.log(' --emulator : Will deploy the built project to an emulator if one exists'); - console.log(' --target= : Installs to the target with the specified id.'); - process.exit(0); -} diff --git a/cordova-lib/spec-cordova/fixtures/platforms/android/cordova/lib/start-emulator b/cordova-lib/spec-cordova/fixtures/platforms/android/cordova/lib/start-emulator deleted file mode 100755 index 5d6c4dd9e..000000000 --- a/cordova-lib/spec-cordova/fixtures/platforms/android/cordova/lib/start-emulator +++ /dev/null @@ -1,38 +0,0 @@ -#!/usr/bin/env node - -/* - Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.0 (the - "License"); you may not use this file except in compliance - with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, - software distributed under the License is distributed on an - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - KIND, either express or implied. See the License for the - specific language governing permissions and limitations - under the License. -*/ - -var emulator = require('./emulator'), - args = process.argv; - -if(args.length > 2) { - var install_target; - if (args[2].substring(0, 9) == '--target=') { - install_target = args[2].substring(9, args[2].length); - emulator.start(install_target); - process.exit(0); - } else { - console.error('ERROR : argument \'' + args[2] + '\' not recognized.'); - process.exit(2); - } -} else { - emulator.start(); - process.exit(0); -} diff --git a/cordova-lib/spec-cordova/fixtures/platforms/android/cordova/log b/cordova-lib/spec-cordova/fixtures/platforms/android/cordova/log deleted file mode 100755 index 087325f8d..000000000 --- a/cordova-lib/spec-cordova/fixtures/platforms/android/cordova/log +++ /dev/null @@ -1,33 +0,0 @@ -#!/usr/bin/env node - -/* - Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.0 (the - "License"); you may not use this file except in compliance - with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, - software distributed under the License is distributed on an - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - KIND, either express or implied. See the License for the - specific language governing permissions and limitations - under the License. -*/ - -var log = require('./lib/log'), - reqs = require('./lib/check_reqs'), - args = process.argv; - -// Usage support for when args are given -if(args.length > 2) { - log.help(); -} else if(reqs.run()) { - log.run(); -} else { - process.exit(2); -} diff --git a/cordova-lib/spec-cordova/fixtures/platforms/android/cordova/run b/cordova-lib/spec-cordova/fixtures/platforms/android/cordova/run deleted file mode 100755 index 57d73459b..000000000 --- a/cordova-lib/spec-cordova/fixtures/platforms/android/cordova/run +++ /dev/null @@ -1,35 +0,0 @@ -#!/usr/bin/env node - -/* - Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.0 (the - "License"); you may not use this file except in compliance - with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, - software distributed under the License is distributed on an - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - KIND, either express or implied. See the License for the - specific language governing permissions and limitations - under the License. -*/ - -var run = require('./lib/run'), - reqs = require('./lib/check_reqs'), - args = process.argv; - -// Support basic help commands -if (args[2] == '--help' || args[2] == '/?' || args[2] == '-h' || - args[2] == 'help' || args[2] == '-help' || args[2] == '/help') { - run.help(); -} else if(reqs.run()) { - run.run(args); - process.exit(0); -} else { - process.exit(2); -} diff --git a/cordova-lib/spec-cordova/fixtures/platforms/android/cordova/version b/cordova-lib/spec-cordova/fixtures/platforms/android/cordova/version deleted file mode 100755 index de1a76dd4..000000000 --- a/cordova-lib/spec-cordova/fixtures/platforms/android/cordova/version +++ /dev/null @@ -1,25 +0,0 @@ -#!/usr/bin/env node - -/* - Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.0 (the - "License"); you may not use this file except in compliance - with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, - software distributed under the License is distributed on an - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - KIND, either express or implied. See the License for the - specific language governing permissions and limitations - under the License. -*/ - -// Coho updates this line: -var VERSION = "3.1.0"; - -console.log(VERSION); diff --git a/cordova-lib/spec-cordova/fixtures/platforms/android/local.properties b/cordova-lib/spec-cordova/fixtures/platforms/android/local.properties deleted file mode 100644 index d3f507212..000000000 --- a/cordova-lib/spec-cordova/fixtures/platforms/android/local.properties +++ /dev/null @@ -1,10 +0,0 @@ -# This file is automatically generated by Android Tools. -# Do not modify this file -- YOUR CHANGES WILL BE ERASED! -# -# This file must *NOT* be checked into Version Control Systems, -# as it contains information specific to your local configuration. - -# location of the SDK. This is only used by Ant -# For customization when using a Version Control System, please read the -# header note. -sdk.dir=/Users/braden/cordova/android/android-sdk-macosx diff --git a/cordova-lib/spec-cordova/fixtures/platforms/android/proguard-project.txt b/cordova-lib/spec-cordova/fixtures/platforms/android/proguard-project.txt deleted file mode 100644 index f2fe1559a..000000000 --- a/cordova-lib/spec-cordova/fixtures/platforms/android/proguard-project.txt +++ /dev/null @@ -1,20 +0,0 @@ -# To enable ProGuard in your project, edit project.properties -# to define the proguard.config property as described in that file. -# -# Add project specific ProGuard rules here. -# By default, the flags in this file are appended to flags specified -# in ${sdk.dir}/tools/proguard/proguard-android.txt -# You can edit the include path and order by changing the ProGuard -# include property in project.properties. -# -# For more details, see -# http://developer.android.com/guide/developing/tools/proguard.html - -# Add any project specific keep options here: - -# If your project uses WebView with JS, uncomment the following -# and specify the fully qualified class name to the JavaScript interface -# class: -#-keepclassmembers class fqcn.of.javascript.interface.for.webview { -# public *; -#} diff --git a/cordova-lib/spec-cordova/fixtures/platforms/android/project.properties b/cordova-lib/spec-cordova/fixtures/platforms/android/project.properties deleted file mode 100644 index a3ee5ab64..000000000 --- a/cordova-lib/spec-cordova/fixtures/platforms/android/project.properties +++ /dev/null @@ -1,14 +0,0 @@ -# This file is automatically generated by Android Tools. -# Do not modify this file -- YOUR CHANGES WILL BE ERASED! -# -# This file must be checked in Version Control Systems. -# -# To customize properties used by the Ant build system edit -# "ant.properties", and override values to adapt the script to your -# project structure. -# -# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home): -#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt - -# Project target. -target=android-17 diff --git a/cordova-lib/spec-cordova/fixtures/platforms/android/res/drawable-hdpi/icon.png b/cordova-lib/spec-cordova/fixtures/platforms/android/res/drawable-hdpi/icon.png deleted file mode 100644 index 4d27634485b3a20d8a0188107e84812f4f71084b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6080 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 diff --git a/cordova-lib/spec-cordova/fixtures/platforms/android/res/drawable-ldpi/icon.png b/cordova-lib/spec-cordova/fixtures/platforms/android/res/drawable-ldpi/icon.png deleted file mode 100644 index cd5032a4f2e0b734d4bdece13564c4b55de963a6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3096 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 diff --git a/cordova-lib/spec-cordova/fixtures/platforms/android/res/drawable-mdpi/icon.png b/cordova-lib/spec-cordova/fixtures/platforms/android/res/drawable-mdpi/icon.png deleted file mode 100644 index e79c6062c1dcd9e98f092dbd7e51b5b76dd897d2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4090 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 diff --git a/cordova-lib/spec-cordova/fixtures/platforms/android/res/drawable-xhdpi/icon.png b/cordova-lib/spec-cordova/fixtures/platforms/android/res/drawable-xhdpi/icon.png deleted file mode 100644 index ec7ffbfbdafc58df28e6e89041ee21acd0f6177e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7685 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 diff --git a/cordova-lib/spec-cordova/fixtures/platforms/android/res/drawable/icon.png b/cordova-lib/spec-cordova/fixtures/platforms/android/res/drawable/icon.png deleted file mode 100644 index ec7ffbfbdafc58df28e6e89041ee21acd0f6177e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7685 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 diff --git a/cordova-lib/spec-cordova/fixtures/platforms/android/res/values/strings.xml b/cordova-lib/spec-cordova/fixtures/platforms/android/res/values/strings.xml deleted file mode 100644 index 1e706b395..000000000 --- a/cordova-lib/spec-cordova/fixtures/platforms/android/res/values/strings.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - TestBase - diff --git a/cordova-lib/spec-cordova/fixtures/platforms/android/res/xml/config.xml b/cordova-lib/spec-cordova/fixtures/platforms/android/res/xml/config.xml deleted file mode 100644 index 17ca23749..000000000 --- a/cordova-lib/spec-cordova/fixtures/platforms/android/res/xml/config.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - Hello Cordova - - A sample Apache Cordova application that responds to the deviceready event. - - - - - - - - Apache Cordova Team - - - - - diff --git a/cordova-lib/spec-cordova/fixtures/platforms/android/src/org/testing/TestBase.java b/cordova-lib/spec-cordova/fixtures/platforms/android/src/org/testing/TestBase.java deleted file mode 100644 index 928e074c2..000000000 --- a/cordova-lib/spec-cordova/fixtures/platforms/android/src/org/testing/TestBase.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.0 (the - "License"); you may not use this file except in compliance - with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, - software distributed under the License is distributed on an - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - KIND, either express or implied. See the License for the - specific language governing permissions and limitations - under the License. - */ - -package org.testing; - -import android.os.Bundle; -import org.apache.cordova.*; - -public class TestBase extends CordovaActivity -{ - @Override - public void onCreate(Bundle savedInstanceState) - { - super.onCreate(savedInstanceState); - super.init(); - // Set by in config.xml - super.loadUrl(Config.getStartUrl()); - //super.loadUrl("file:///android_asset/www/index.html") - } -} - diff --git a/cordova-lib/spec-cordova/fixtures/plugins/ChildBrowser/plugin.xml b/cordova-lib/spec-cordova/fixtures/plugins/ChildBrowser/plugin.xml deleted file mode 100644 index 11ddd86d3..000000000 --- a/cordova-lib/spec-cordova/fixtures/plugins/ChildBrowser/plugin.xml +++ /dev/null @@ -1,126 +0,0 @@ - - - - - - Child Browser - - - - - - - - - - - - - - No matter what platform you are installing to, this notice is very important. - - - - - - - - - - - - - - - - - - - - - - Please make sure you read this because it is very important to complete the installation of your plugin. - - - - - - - - - - - - - - - $APP_ID - - - - - - PackageName - $PACKAGE_NAME - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/cordova-lib/spec-cordova/fixtures/plugins/ChildBrowser/src/android/ChildBrowser.java b/cordova-lib/spec-cordova/fixtures/plugins/ChildBrowser/src/android/ChildBrowser.java deleted file mode 100644 index 5263b0c5d..000000000 --- a/cordova-lib/spec-cordova/fixtures/plugins/ChildBrowser/src/android/ChildBrowser.java +++ /dev/null @@ -1,19 +0,0 @@ -/* - * - * Copyright 2013 Anis Kadri - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - * -*/ - diff --git a/cordova-lib/spec-cordova/fixtures/plugins/ChildBrowser/www/childbrowser.js b/cordova-lib/spec-cordova/fixtures/plugins/ChildBrowser/www/childbrowser.js deleted file mode 100644 index 5263b0c5d..000000000 --- a/cordova-lib/spec-cordova/fixtures/plugins/ChildBrowser/www/childbrowser.js +++ /dev/null @@ -1,19 +0,0 @@ -/* - * - * Copyright 2013 Anis Kadri - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - * -*/ - diff --git a/cordova-lib/spec-cordova/fixtures/plugins/ChildBrowser/www/childbrowser/image.jpg b/cordova-lib/spec-cordova/fixtures/plugins/ChildBrowser/www/childbrowser/image.jpg deleted file mode 100644 index 257cc5642..000000000 --- a/cordova-lib/spec-cordova/fixtures/plugins/ChildBrowser/www/childbrowser/image.jpg +++ /dev/null @@ -1 +0,0 @@ -foo diff --git a/cordova-lib/spec-cordova/fixtures/plugins/ChildBrowser/www/childbrowser_file.html b/cordova-lib/spec-cordova/fixtures/plugins/ChildBrowser/www/childbrowser_file.html deleted file mode 100644 index 6de7b8c69..000000000 --- a/cordova-lib/spec-cordova/fixtures/plugins/ChildBrowser/www/childbrowser_file.html +++ /dev/null @@ -1 +0,0 @@ -This is a test file. diff --git a/cordova-lib/spec-cordova/fixtures/plugins/android/plugin.xml b/cordova-lib/spec-cordova/fixtures/plugins/android/plugin.xml deleted file mode 100644 index d8f561906..000000000 --- a/cordova-lib/spec-cordova/fixtures/plugins/android/plugin.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - Android Plugin - - - - - - - diff --git a/cordova-lib/spec-cordova/fixtures/plugins/android/src/android/Android.java b/cordova-lib/spec-cordova/fixtures/plugins/android/src/android/Android.java deleted file mode 100644 index e69de29bb..000000000 diff --git a/cordova-lib/spec-cordova/fixtures/plugins/android/src/android/SomethingWithR.java b/cordova-lib/spec-cordova/fixtures/plugins/android/src/android/SomethingWithR.java deleted file mode 100644 index c3af060d9..000000000 --- a/cordova-lib/spec-cordova/fixtures/plugins/android/src/android/SomethingWithR.java +++ /dev/null @@ -1,6 +0,0 @@ -import com.yourapp.R; - -import android.app.*; - -public class SomethingWithR { -} diff --git a/cordova-lib/spec-cordova/fixtures/plugins/android/www/android.js b/cordova-lib/spec-cordova/fixtures/plugins/android/www/android.js deleted file mode 100644 index e69de29bb..000000000 diff --git a/cordova-lib/spec-cordova/fixtures/plugins/fake1/plugin.xml b/cordova-lib/spec-cordova/fixtures/plugins/fake1/plugin.xml deleted file mode 100644 index ffdc650ad..000000000 --- a/cordova-lib/spec-cordova/fixtures/plugins/fake1/plugin.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - Fake1 - Cordova fake plugin for tests - Apache 2.0 - cordova,cli,test - diff --git a/cordova-lib/spec-cordova/fixtures/plugins/test/plugin.xml b/cordova-lib/spec-cordova/fixtures/plugins/test/plugin.xml deleted file mode 100644 index 774eda1de..000000000 --- a/cordova-lib/spec-cordova/fixtures/plugins/test/plugin.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - Test Plugin - - - - - - - diff --git a/cordova-lib/spec-cordova/fixtures/plugins/test/www/test.js b/cordova-lib/spec-cordova/fixtures/plugins/test/www/test.js deleted file mode 100644 index e69de29bb..000000000 diff --git a/cordova-lib/spec-cordova/fixtures/projects/android/AndroidManifest.xml b/cordova-lib/spec-cordova/fixtures/projects/android/AndroidManifest.xml deleted file mode 100644 index 0c528031c..000000000 --- a/cordova-lib/spec-cordova/fixtures/projects/android/AndroidManifest.xml +++ /dev/null @@ -1,69 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/cordova-lib/spec-cordova/fixtures/projects/android/res/xml/config.xml b/cordova-lib/spec-cordova/fixtures/projects/android/res/xml/config.xml deleted file mode 100644 index d37aba5cd..000000000 --- a/cordova-lib/spec-cordova/fixtures/projects/android/res/xml/config.xml +++ /dev/null @@ -1,54 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/cordova-lib/spec-cordova/fixtures/projects/windows/bom_test.xml b/cordova-lib/spec-cordova/fixtures/projects/windows/bom_test.xml deleted file mode 100644 index 57cadf65d..000000000 --- a/cordova-lib/spec-cordova/fixtures/projects/windows/bom_test.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - diff --git a/cordova-lib/spec-cordova/fixtures/templates/no_content_config.xml b/cordova-lib/spec-cordova/fixtures/templates/no_content_config.xml deleted file mode 100644 index 7c4ef3d2c..000000000 --- a/cordova-lib/spec-cordova/fixtures/templates/no_content_config.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - Hello Cordova - - - A sample Apache Cordova application that responds to the deviceready event. - - - - Apache Cordova Team - - - - - - diff --git a/cordova-lib/spec-cordova/helpers.js b/cordova-lib/spec-cordova/helpers.js deleted file mode 100644 index 3db75d5c9..000000000 --- a/cordova-lib/spec-cordova/helpers.js +++ /dev/null @@ -1,64 +0,0 @@ -/** - Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.0 (the - "License"); you may not use this file except in compliance - with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, - software distributed under the License is distributed on an - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - KIND, either express or implied. See the License for the - specific language governing permissions and limitations - under the License. -*/ - -var path = require('path'), - fs = require('fs'), - shell = require('shelljs'), - os = require('os'); - -module.exports.tmpDir = function(subdir) { - var dir = path.join(os.tmpdir(), 'e2e-test'); - if (subdir) { - dir = path.join(dir, subdir); - } - shell.mkdir('-p', dir); - return dir; -}; - -// Returns the platform that should be used for testing on this host platform. -/* -var host = os.platform(); -if (host.match(/win/)) { - module.exports.testPlatform = 'wp8'; -} else if (host.match(/darwin/)) { - module.exports.testPlatform = 'ios'; -} else { - module.exports.testPlatform = 'android'; -} -*/ - -// Just use Android everywhere; we're mocking out any calls to the `android` binary. -module.exports.testPlatform = 'android'; - -// Add the toExist matcher. -beforeEach(function() { - this.addMatchers({ - 'toExist': function() { - var notText = this.isNot ? ' not' : ''; - var self = this; - - this.message = function() { - return 'Expected file ' + self.actual + notText + ' to exist.'; - }; - - return fs.existsSync(this.actual); - } - }); -}); - diff --git a/cordova-lib/spec-cordova/platform.spec.js b/cordova-lib/spec-cordova/platform.spec.js index b01e1a4a8..6c908f747 100644 --- a/cordova-lib/spec-cordova/platform.spec.js +++ b/cordova-lib/spec-cordova/platform.spec.js @@ -17,7 +17,7 @@ under the License. */ -var helpers = require('./helpers'), +var helpers = require('../fixtures-cordova/helpers'), path = require('path'), fs = require('fs'), shell = require('shelljs'), @@ -68,14 +68,14 @@ describe('platform end-to-end', function() { it('should successfully run', function(done) { // cp then mv because we need to copy everything, but that means it'll copy the whole directory. // Using /* doesn't work because of hidden files. - shell.cp('-R', path.join(__dirname, 'fixtures', 'base'), tmpDir); + shell.cp('-R', path.join(__dirname, '..', 'fixtures-cordova', 'base'), tmpDir); shell.mv(path.join(tmpDir, 'base'), project); process.chdir(project); // Now we load the config.json in the newly created project and edit the target platform's lib entry // to point at the fixture version. This is necessary so that cordova.prepare can find cordova.js there. var c = config.read(project); - c.lib[helpers.testPlatform].url = path.join(__dirname, 'fixtures', 'platforms', helpers.testPlatform + '-lib'); + c.lib[helpers.testPlatform].url = path.join(__dirname, '..', 'fixtures-cordova', 'platforms', helpers.testPlatform + '-lib'); config.write(project, c); // The config.json in the fixture project points at fake "local" paths. @@ -83,7 +83,7 @@ describe('platform end-to-end', function() { spyOn(superspawn, 'spawn').andCallFake(function(cmd, args) { if (cmd.match(/create\b/)) { // This is a call to the bin/create script, so do the copy ourselves. - shell.cp('-R', path.join(__dirname, 'fixtures', 'platforms', 'android'), path.join(project, 'platforms')); + shell.cp('-R', path.join(__dirname, '..', 'fixtures-cordova', 'platforms', 'android'), path.join(project, 'platforms')); } else if(cmd.match(/version\b/)) { return Q('3.3.0'); } else if(cmd.match(/update\b/)) { diff --git a/cordova-lib/spec-cordova/xml-helpers.spec.js b/cordova-lib/spec-cordova/xml-helpers.spec.js index 2f1d7aecc..4c271c7a2 100644 --- a/cordova-lib/spec-cordova/xml-helpers.spec.js +++ b/cordova-lib/spec-cordova/xml-helpers.spec.js @@ -36,7 +36,7 @@ var path = require('path') describe('xml-helpers', function(){ describe('parseElementtreeSync', function() { it('should parse xml with a byte order mark', function() { - var xml_path = path.join(__dirname, 'fixtures', 'projects', 'windows', 'bom_test.xml'); + var xml_path = path.join(__dirname, '..', 'fixtures-cordova', 'projects', 'windows', 'bom_test.xml'); expect(function() { xml_helpers.parseElementtreeSync(xml_path); }).not.toThrow(); @@ -85,7 +85,7 @@ describe('xml-helpers', function(){ var config_xml; beforeEach(function() { - config_xml = xml_helpers.parseElementtreeSync(path.join(__dirname, 'fixtures', 'projects', 'android', 'res', 'xml', 'config.xml')); + config_xml = xml_helpers.parseElementtreeSync(path.join(__dirname, '..', 'fixtures-cordova', 'projects', 'android', 'res', 'xml', 'config.xml')); }); it('should remove any children that match the specified selector', function() { @@ -114,8 +114,8 @@ describe('xml-helpers', function(){ var config_xml, plugin_xml; beforeEach(function() { - config_xml = xml_helpers.parseElementtreeSync(path.join(__dirname, 'fixtures', 'projects', 'android', 'res', 'xml', 'config.xml')); - plugin_xml = xml_helpers.parseElementtreeSync(path.join(__dirname, 'fixtures', 'plugins', 'ChildBrowser', 'plugin.xml')); + config_xml = xml_helpers.parseElementtreeSync(path.join(__dirname, '..', 'fixtures-cordova', 'projects', 'android', 'res', 'xml', 'config.xml')); + plugin_xml = xml_helpers.parseElementtreeSync(path.join(__dirname, '..', 'fixtures-cordova', 'plugins', 'ChildBrowser', 'plugin.xml')); }); it('should add children to the specified selector', function() { diff --git a/cordova-lib/spec-plugman-create/fetch.spec.js b/cordova-lib/spec-plugman-create/fetch.spec.js index c6c037ff3..07655f4c4 100644 --- a/cordova-lib/spec-plugman-create/fetch.spec.js +++ b/cordova-lib/spec-plugman-create/fetch.spec.js @@ -25,7 +25,7 @@ var fetch = require('../src/plugman/create/fetch'), xml_helpers = require('../src/util/xml-helpers'), metadata = require('../src/plugman/util/metadata'), temp = path.join(os.tmpdir(), 'plugman', 'fetch'), - test_plugin = path.join(__dirname, 'plugins', 'ChildBrowser'), + test_plugin = path.join(__dirname, '..', 'fixtures-plugman', 'plugins', 'ChildBrowser'), test_plugin_with_space = path.join(__dirname, 'folder with space', 'plugins', 'ChildBrowser'), test_plugin_xml = xml_helpers.parseElementtreeSync(path.join(test_plugin, 'plugin.xml')), test_plugin_id = 'com.phonegap.plugins.childbrowser', diff --git a/cordova-lib/spec-plugman-create/plugins/ChildBrowser/src/android/ChildBrowser.java b/cordova-lib/spec-plugman-create/plugins/ChildBrowser/src/android/ChildBrowser.java deleted file mode 100644 index 5263b0c5d..000000000 --- a/cordova-lib/spec-plugman-create/plugins/ChildBrowser/src/android/ChildBrowser.java +++ /dev/null @@ -1,19 +0,0 @@ -/* - * - * Copyright 2013 Anis Kadri - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - * -*/ - diff --git a/cordova-lib/spec-plugman-create/plugins/ChildBrowser/www/childbrowser.js b/cordova-lib/spec-plugman-create/plugins/ChildBrowser/www/childbrowser.js deleted file mode 100644 index 5263b0c5d..000000000 --- a/cordova-lib/spec-plugman-create/plugins/ChildBrowser/www/childbrowser.js +++ /dev/null @@ -1,19 +0,0 @@ -/* - * - * Copyright 2013 Anis Kadri - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - * -*/ - diff --git a/cordova-lib/spec-plugman-create/plugins/ChildBrowser/www/childbrowser/image.jpg b/cordova-lib/spec-plugman-create/plugins/ChildBrowser/www/childbrowser/image.jpg deleted file mode 100644 index 257cc5642..000000000 --- a/cordova-lib/spec-plugman-create/plugins/ChildBrowser/www/childbrowser/image.jpg +++ /dev/null @@ -1 +0,0 @@ -foo diff --git a/cordova-lib/spec-plugman-create/plugins/ChildBrowser/www/childbrowser_file.html b/cordova-lib/spec-plugman-create/plugins/ChildBrowser/www/childbrowser_file.html deleted file mode 100644 index 6de7b8c69..000000000 --- a/cordova-lib/spec-plugman-create/plugins/ChildBrowser/www/childbrowser_file.html +++ /dev/null @@ -1 +0,0 @@ -This is a test file. diff --git a/cordova-lib/spec-plugman-create/plugins/DummyPlugin/www/dummyplugin/image.jpg b/cordova-lib/spec-plugman-create/plugins/DummyPlugin/www/dummyplugin/image.jpg deleted file mode 100644 index 257cc5642..000000000 --- a/cordova-lib/spec-plugman-create/plugins/DummyPlugin/www/dummyplugin/image.jpg +++ /dev/null @@ -1 +0,0 @@ -foo diff --git a/cordova-lib/spec-plugman-install/install.spec.js b/cordova-lib/spec-plugman-install/install.spec.js index 3e3da45cc..0e5d873fb 100644 --- a/cordova-lib/spec-plugman-install/install.spec.js +++ b/cordova-lib/spec-plugman-install/install.spec.js @@ -33,10 +33,10 @@ var install = require('../src/plugman/install/install'), Q = require('q'), spec = __dirname, done = false, - srcProject = path.join(spec, 'projects', 'android_install'), + srcProject = path.join(spec, '..', 'fixtures-plugman', 'projects', 'android_install'), temp_dir = path.join(os.tmpdir(), 'plugman-test'), project = path.join(temp_dir, 'android_install'), - plugins_dir = path.join(spec, 'plugins'), + plugins_dir = path.join(spec, '..', 'fixtures-plugman', 'plugins'), plugins_install_dir = path.join(project, 'cordova', 'plugins'), plugins = { 'DummyPlugin' : path.join(plugins_dir, 'DummyPlugin'), diff --git a/cordova-lib/spec-plugman-install/plugins/AndroidJS/plugin.xml b/cordova-lib/spec-plugman-install/plugins/AndroidJS/plugin.xml deleted file mode 100644 index 1a687494f..000000000 --- a/cordova-lib/spec-plugman-install/plugins/AndroidJS/plugin.xml +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - JavaScript in yo droidz - - - - - - - - diff --git a/cordova-lib/spec-plugman-install/plugins/AndroidJS/www/android.js b/cordova-lib/spec-plugman-install/plugins/AndroidJS/www/android.js deleted file mode 100644 index d268b7d3a..000000000 --- a/cordova-lib/spec-plugman-install/plugins/AndroidJS/www/android.js +++ /dev/null @@ -1 +0,0 @@ -{}; diff --git a/cordova-lib/spec-plugman-install/plugins/ChildBrowser/plugin.xml b/cordova-lib/spec-plugman-install/plugins/ChildBrowser/plugin.xml deleted file mode 100644 index 030f8cada..000000000 --- a/cordova-lib/spec-plugman-install/plugins/ChildBrowser/plugin.xml +++ /dev/null @@ -1,124 +0,0 @@ - - - - - - Child Browser - - - - - - - - - - - - - - No matter what platform you are installing to, this notice is very important. - - - - - - - - - - - - - - - - - - - - - - Please make sure you read this because it is very important to complete the installation of your plugin. - - - - - - - - - - - - - $APP_ID - - - - - - PackageName - $PACKAGE_NAME - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/cordova-lib/spec-plugman-install/plugins/ChildBrowser/src/android/ChildBrowser.java b/cordova-lib/spec-plugman-install/plugins/ChildBrowser/src/android/ChildBrowser.java deleted file mode 100644 index 5263b0c5d..000000000 --- a/cordova-lib/spec-plugman-install/plugins/ChildBrowser/src/android/ChildBrowser.java +++ /dev/null @@ -1,19 +0,0 @@ -/* - * - * Copyright 2013 Anis Kadri - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - * -*/ - diff --git a/cordova-lib/spec-plugman-install/plugins/ChildBrowser/src/ios/ChildBrowser.bundle/arrow_left.png b/cordova-lib/spec-plugman-install/plugins/ChildBrowser/src/ios/ChildBrowser.bundle/arrow_left.png deleted file mode 100644 index 530e12babde279931dc58cb36e2af4d9b7d52acc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2946 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 diff --git a/cordova-lib/spec-plugman-install/plugins/ChildBrowser/src/ios/ChildBrowser.bundle/arrow_left@2x.png b/cordova-lib/spec-plugman-install/plugins/ChildBrowser/src/ios/ChildBrowser.bundle/arrow_left@2x.png deleted file mode 100644 index 530e12babde279931dc58cb36e2af4d9b7d52acc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2946 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 diff --git a/cordova-lib/spec-plugman-install/plugins/ChildBrowser/src/ios/ChildBrowser.bundle/arrow_right.png b/cordova-lib/spec-plugman-install/plugins/ChildBrowser/src/ios/ChildBrowser.bundle/arrow_right.png deleted file mode 100644 index 8b3d855e884f8aa8b5d2c78139fa63ff4b5826d9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2946 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 diff --git a/cordova-lib/spec-plugman-install/plugins/ChildBrowser/src/ios/ChildBrowser.bundle/arrow_right@2x.png b/cordova-lib/spec-plugman-install/plugins/ChildBrowser/src/ios/ChildBrowser.bundle/arrow_right@2x.png deleted file mode 100644 index 8b3d855e884f8aa8b5d2c78139fa63ff4b5826d9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2946 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 diff --git a/cordova-lib/spec-plugman-install/plugins/ChildBrowser/src/ios/ChildBrowser.bundle/but_refresh.png b/cordova-lib/spec-plugman-install/plugins/ChildBrowser/src/ios/ChildBrowser.bundle/but_refresh.png deleted file mode 100644 index 309b6bdb255b8784cf884e6fa2bde3febe36da5f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3369 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 diff --git a/cordova-lib/spec-plugman-install/plugins/ChildBrowser/src/ios/ChildBrowser.bundle/compass@2x.png b/cordova-lib/spec-plugman-install/plugins/ChildBrowser/src/ios/ChildBrowser.bundle/compass@2x.png deleted file mode 100644 index 46a890174edb858abbef991828153aea289a3a49..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3035 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 diff --git a/cordova-lib/spec-plugman-install/plugins/ChildBrowser/src/ios/ChildBrowserCommand.h b/cordova-lib/spec-plugman-install/plugins/ChildBrowser/src/ios/ChildBrowserCommand.h deleted file mode 100644 index 6a23ab6f0..000000000 --- a/cordova-lib/spec-plugman-install/plugins/ChildBrowser/src/ios/ChildBrowserCommand.h +++ /dev/null @@ -1,49 +0,0 @@ -/* - * - * Copyright 2013 Anis Kadri - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - * -*/ - -// -// PhoneGap ! ChildBrowserCommand -// -// -// Created by Jesse MacFadyen on 10-05-29. -// Copyright 2010 Nitobi. All rights reserved. -// - -#import -#ifdef PHONEGAP_FRAMEWORK - #import -#else - #import "PGPlugin.h" -#endif -#import "ChildBrowserViewController.h" - - - -@interface ChildBrowserCommand : PGPlugin { - - ChildBrowserViewController* childBrowser; -} - -@property (nonatomic, retain) ChildBrowserViewController *childBrowser; - - -- (void) showWebPage:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options; --(void) onChildLocationChange:(NSString*)newLoc; - -@end diff --git a/cordova-lib/spec-plugman-install/plugins/ChildBrowser/src/ios/ChildBrowserCommand.m b/cordova-lib/spec-plugman-install/plugins/ChildBrowser/src/ios/ChildBrowserCommand.m deleted file mode 100644 index 38aaf6497..000000000 --- a/cordova-lib/spec-plugman-install/plugins/ChildBrowser/src/ios/ChildBrowserCommand.m +++ /dev/null @@ -1,86 +0,0 @@ -// - -// -// -// Created by Jesse MacFadyen on 10-05-29. -// Copyright 2010 Nitobi. All rights reserved. -// Copyright (c) 2011, IBM Corporation -// Copyright 2011, Randy McMillan -// - -#import "ChildBrowserCommand.h" - -#ifdef PHONEGAP_FRAMEWORK - #import -#else - #import "PhoneGapViewController.h" -#endif - - -@implementation ChildBrowserCommand - -@synthesize childBrowser; - -- (void) showWebPage:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options // args: url -{ - - if(childBrowser == NULL) - { - childBrowser = [[ ChildBrowserViewController alloc ] initWithScale:FALSE ]; - childBrowser.delegate = self; - } - -/* // TODO: Work in progress - NSString* strOrientations = [ options objectForKey:@"supportedOrientations"]; - NSArray* supportedOrientations = [strOrientations componentsSeparatedByString:@","]; -*/ - PhoneGapViewController* cont = (PhoneGapViewController*)[ super appViewController ]; - childBrowser.supportedOrientations = cont.supportedOrientations; - - if ([cont respondsToSelector:@selector(presentViewController)]) { - //Reference UIViewController.h Line:179 for update to iOS 5 difference - @RandyMcMillan - [cont presentViewController:childBrowser animated:YES completion:nil]; - } else { - [ cont presentModalViewController:childBrowser animated:YES ]; - } - - NSString *url = (NSString*) [arguments objectAtIndex:0]; - - [childBrowser loadURL:url ]; - -} - --(void) close:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options // args: url -{ - [ childBrowser closeBrowser]; - -} - --(void) onClose -{ - NSString* jsCallback = [NSString stringWithFormat:@"ChildBrowser._onClose();",@""]; - [self.webView stringByEvaluatingJavaScriptFromString:jsCallback]; -} - --(void) onOpenInSafari -{ - NSString* jsCallback = [NSString stringWithFormat:@"ChildBrowser._onOpenExternal();",@""]; - [self.webView stringByEvaluatingJavaScriptFromString:jsCallback]; -} - - --(void) onChildLocationChange:(NSString*)newLoc -{ - - NSString* tempLoc = [NSString stringWithFormat:@"%@",newLoc]; - NSString* encUrl = [tempLoc stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; - - NSString* jsCallback = [NSString stringWithFormat:@"ChildBrowser._onLocationChange('%@');",encUrl]; - [self.webView stringByEvaluatingJavaScriptFromString:jsCallback]; - -} - - - - -@end diff --git a/cordova-lib/spec-plugman-install/plugins/ChildBrowser/src/ios/ChildBrowserViewController.h b/cordova-lib/spec-plugman-install/plugins/ChildBrowser/src/ios/ChildBrowserViewController.h deleted file mode 100644 index d6fc139d5..000000000 --- a/cordova-lib/spec-plugman-install/plugins/ChildBrowser/src/ios/ChildBrowserViewController.h +++ /dev/null @@ -1,73 +0,0 @@ -/* - * - * Copyright 2013 Anis Kadri - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - * -*/ - -// -// ChildBrowserViewController.h -// -// Created by Jesse MacFadyen on 21/07/09. -// Copyright 2009 Nitobi. All rights reserved. -// - -#import - -@protocol ChildBrowserDelegate - - - -/* - * onChildLocationChanging:newLoc - * - * Discussion: - * Invoked when a new page has loaded - */ --(void) onChildLocationChange:(NSString*)newLoc; --(void) onOpenInSafari; --(void) onClose; -@end - - -@interface ChildBrowserViewController : UIViewController < UIWebViewDelegate > { - IBOutlet UIWebView* webView; - IBOutlet UIBarButtonItem* closeBtn; - IBOutlet UIBarButtonItem* refreshBtn; - IBOutlet UILabel* addressLabel; - IBOutlet UIBarButtonItem* backBtn; - IBOutlet UIBarButtonItem* fwdBtn; - IBOutlet UIBarButtonItem* safariBtn; - IBOutlet UIActivityIndicatorView* spinner; - BOOL scaleEnabled; - BOOL isImage; - NSString* imageURL; - NSArray* supportedOrientations; - id delegate; -} - -@property (nonatomic, retain)id delegate; -@property (nonatomic, retain) NSArray* supportedOrientations; -@property(retain) NSString* imageURL; -@property(assign) BOOL isImage; - -- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation) interfaceOrientation; -- (ChildBrowserViewController*)initWithScale:(BOOL)enabled; -- (IBAction)onDoneButtonPress:(id)sender; -- (IBAction)onSafariButtonPress:(id)sender; -- (void)loadURL:(NSString*)url; --(void)closeBrowser; - -@end diff --git a/cordova-lib/spec-plugman-install/plugins/ChildBrowser/src/ios/ChildBrowserViewController.m b/cordova-lib/spec-plugman-install/plugins/ChildBrowser/src/ios/ChildBrowserViewController.m deleted file mode 100644 index 167ef9801..000000000 --- a/cordova-lib/spec-plugman-install/plugins/ChildBrowser/src/ios/ChildBrowserViewController.m +++ /dev/null @@ -1,239 +0,0 @@ -// -// ChildBrowserViewController.m -// -// Created by Jesse MacFadyen on 21/07/09. -// Copyright 2009 Nitobi. All rights reserved. -// Copyright (c) 2011, IBM Corporation -// Copyright 2011, Randy McMillan -// - -#import "ChildBrowserViewController.h" - - -@implementation ChildBrowserViewController - -@synthesize imageURL; -@synthesize supportedOrientations; -@synthesize isImage; -@synthesize delegate; - -/* - // The designated initializer. Override if you create the controller programmatically and want to perform customization that is not appropriate for viewDidLoad. -- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { - if (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) { - // Custom initialization - } - return self; -} -*/ - -+ (NSString*) resolveImageResource:(NSString*)resource -{ - NSString* systemVersion = [[UIDevice currentDevice] systemVersion]; - BOOL isLessThaniOS4 = ([systemVersion compare:@"4.0" options:NSNumericSearch] == NSOrderedAscending); - - // the iPad image (nor retina) differentiation code was not in 3.x, and we have to explicitly set the path - if (isLessThaniOS4) - { - return [NSString stringWithFormat:@"%@.png", resource]; - } - - return resource; -} - - -- (ChildBrowserViewController*)initWithScale:(BOOL)enabled -{ - self = [super init]; - - - scaleEnabled = enabled; - - return self; -} - -// Implement viewDidLoad to do additional setup after loading the view, typically from a nib. -- (void)viewDidLoad { - [super viewDidLoad]; - - refreshBtn.image = [UIImage imageNamed:[[self class] resolveImageResource:@"ChildBrowser.bundle/but_refresh"]]; - backBtn.image = [UIImage imageNamed:[[self class] resolveImageResource:@"ChildBrowser.bundle/arrow_left"]]; - fwdBtn.image = [UIImage imageNamed:[[self class] resolveImageResource:@"ChildBrowser.bundle/arrow_right"]]; - safariBtn.image = [UIImage imageNamed:[[self class] resolveImageResource:@"ChildBrowser.bundle/compass"]]; - - webView.delegate = self; - webView.scalesPageToFit = TRUE; - webView.backgroundColor = [UIColor whiteColor]; - NSLog(@"View did load"); -} - - - - - -- (void)didReceiveMemoryWarning { - // Releases the view if it doesn't have a superview. - [super didReceiveMemoryWarning]; - - // Release any cached data, images, etc that aren't in use. -} - -- (void)viewDidUnload { - // Release any retained subviews of the main view. - // e.g. self.myOutlet = nil; - NSLog(@"View did UN-load"); -} - - -- (void)dealloc { - - webView.delegate = nil; - - [webView release]; - [closeBtn release]; - [refreshBtn release]; - [addressLabel release]; - [backBtn release]; - [fwdBtn release]; - [safariBtn release]; - [spinner release]; - [ supportedOrientations release]; - [super dealloc]; -} - --(void)closeBrowser -{ - - if(delegate != NULL) - { - [delegate onClose]; - } - if ([self respondsToSelector:@selector(presentingViewController)]) { - //Reference UIViewController.h Line:179 for update to iOS 5 difference - @RandyMcMillan - [[self presentingViewController] dismissViewControllerAnimated:YES completion:nil]; - } else { - [[self parentViewController] dismissModalViewControllerAnimated:YES]; - } -} - --(IBAction) onDoneButtonPress:(id)sender -{ - [ self closeBrowser]; - - NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"about:blank"]]; - [webView loadRequest:request]; -} - - --(IBAction) onSafariButtonPress:(id)sender -{ - - if(delegate != NULL) - { - [delegate onOpenInSafari]; - } - - if(isImage) - { - NSURL* pURL = [[ [NSURL alloc] initWithString:imageURL ] autorelease]; - [ [ UIApplication sharedApplication ] openURL:pURL ]; - } - else - { - NSURLRequest *request = webView.request; - [[UIApplication sharedApplication] openURL:request.URL]; - } - - -} - -- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation) interfaceOrientation -{ - BOOL autoRotate = [self.supportedOrientations count] > 1; // autorotate if only more than 1 orientation supported - if (autoRotate) - { - if ([self.supportedOrientations containsObject: - [NSNumber numberWithInt:interfaceOrientation]]) { - return YES; - } - } - - return NO; -} - - - - -- (void)loadURL:(NSString*)url -{ - NSLog(@"Opening Url : %@",url); - - if( [url hasSuffix:@".png" ] || - [url hasSuffix:@".jpg" ] || - [url hasSuffix:@".jpeg" ] || - [url hasSuffix:@".bmp" ] || - [url hasSuffix:@".gif" ] ) - { - [ imageURL release ]; - imageURL = [url copy]; - isImage = YES; - NSString* htmlText = @""; - htmlText = [ htmlText stringByReplacingOccurrencesOfString:@"IMGSRC" withString:url ]; - - [webView loadHTMLString:htmlText baseURL:[NSURL URLWithString:@""]]; - - } - else - { - imageURL = @""; - isImage = NO; - NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:url]]; - [webView loadRequest:request]; - } - webView.hidden = NO; -} - - -- (void)webViewDidStartLoad:(UIWebView *)sender { - addressLabel.text = @"Loading..."; - backBtn.enabled = webView.canGoBack; - fwdBtn.enabled = webView.canGoForward; - - [ spinner startAnimating ]; - -} - -- (void)webViewDidFinishLoad:(UIWebView *)sender -{ - NSURLRequest *request = webView.request; - NSLog(@"New Address is : %@",request.URL.absoluteString); - addressLabel.text = request.URL.absoluteString; - backBtn.enabled = webView.canGoBack; - fwdBtn.enabled = webView.canGoForward; - [ spinner stopAnimating ]; - - if(delegate != NULL) - { - [delegate onChildLocationChange:request.URL.absoluteString]; - } - -} - -- (void)webView:(UIWebView *)wv didFailLoadWithError:(NSError *)error { - NSLog (@"webView:didFailLoadWithError"); - [spinner stopAnimating]; - addressLabel.text = @"Failed"; - if (error != NULL) { - UIAlertView *errorAlert = [[UIAlertView alloc] - initWithTitle: [error localizedDescription] - message: [error localizedFailureReason] - delegate:nil - cancelButtonTitle:@"OK" - otherButtonTitles:nil]; - [errorAlert show]; - [errorAlert release]; - } -} - - -@end diff --git a/cordova-lib/spec-plugman-install/plugins/ChildBrowser/src/ios/ChildBrowserViewController.xib b/cordova-lib/spec-plugman-install/plugins/ChildBrowser/src/ios/ChildBrowserViewController.xib deleted file mode 100644 index cc8dd6592..000000000 --- a/cordova-lib/spec-plugman-install/plugins/ChildBrowser/src/ios/ChildBrowserViewController.xib +++ /dev/null @@ -1,875 +0,0 @@ - - - - 768 - 10K540 - 851 - 1038.36 - 461.00 - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - 141 - - - YES - - - YES - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - YES - - YES - - - YES - - - - YES - - IBFilesOwner - IBCocoaTouchFramework - - - IBFirstResponder - IBCocoaTouchFramework - - - - 292 - - YES - - - -2147483374 - {480, 229} - - - - 1 - MCAwIDAAA - - YES - YES - IBCocoaTouchFramework - 1 - YES - - - - 266 - {{0, 256}, {480, 44}} - - - NO - NO - IBCocoaTouchFramework - 1 - - YES - - IBCocoaTouchFramework - 1 - - 0 - - - IBCocoaTouchFramework - - 5 - - - IBCocoaTouchFramework - - - - IBCocoaTouchFramework - - 5 - - - IBCocoaTouchFramework - 32 - - - - IBCocoaTouchFramework - - 5 - - - IBCocoaTouchFramework - 32 - - - - IBCocoaTouchFramework - - 5 - - - IBCocoaTouchFramework - 32 - - - - IBCocoaTouchFramework - - 5 - - - - - - 270 - {{5, 230}, {418, 21}} - - - - 4 - MC42NjY2NjY2OSAwAA - - NO - YES - NO - IBCocoaTouchFramework - Loading... - - Helvetica - 13 - 16 - - - 3 - MQA - - - 1 - NO - 10 - - - - -2147483383 - {{454, 231}, {20, 20}} - - NO - NO - NO - IBCocoaTouchFramework - - - {{0, 20}, {480, 300}} - - - 3 - MC41AA - - 2 - - - - - 3 - - IBCocoaTouchFramework - - - - - YES - - - webView - - - - 17 - - - - addressLabel - - - - 18 - - - - backBtn - - - - 19 - - - - fwdBtn - - - - 22 - - - - refreshBtn - - - - 23 - - - - onDoneButtonPress: - - - - 26 - - - - reload - - - - 27 - - - - goBack - - - - 28 - - - - goForward - - - - 29 - - - - onSafariButtonPress: - - - - 31 - - - - view - - - - 35 - - - - spinner - - - - 36 - - - - safariBtn - - - - 40 - - - - - YES - - 0 - - - - - - 1 - - - YES - - - - - - - - - -1 - - - File's Owner - - - -2 - - - - - 4 - - - - - 6 - - - YES - - - - - - - - - - - - - - - 7 - - - - - 8 - - - Bar Button Item (Reload) - - - 9 - - - Bar Button Item (Go Back) - - - 10 - - - Bar Button Item (Go Forward) - - - 11 - - - Bar Button Item (Safari) - - - 13 - - - - - 14 - - - - - 15 - - - - - 32 - - - - - 37 - - - - - 38 - - - - - 39 - - - - - - - YES - - YES - -1.CustomClassName - -2.CustomClassName - 1.IBEditorWindowLastContentRect - 1.IBPluginDependency - 10.IBPluginDependency - 11.IBPluginDependency - 13.IBPluginDependency - 13.IBViewBoundsToFrameTransform - 14.IBPluginDependency - 15.IBPluginDependency - 32.IBPluginDependency - 32.IBViewBoundsToFrameTransform - 37.IBPluginDependency - 38.IBPluginDependency - 39.IBPluginDependency - 4.IBPluginDependency - 4.IBViewBoundsToFrameTransform - 6.IBPluginDependency - 6.IBViewBoundsToFrameTransform - 7.IBPluginDependency - 8.IBPluginDependency - 9.IBPluginDependency - - - YES - ChildBrowserViewController - UIResponder - {{250, 643}, {480, 320}} - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABCoAAAwygAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABD5gAAw3kAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABB8AAAwwUAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAAAAAAAAw10AAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - - YES - - - YES - - - - - YES - - - YES - - - - 40 - - - - YES - - ChildBrowserViewController - UIViewController - - YES - - YES - onDoneButtonPress: - onSafariButtonPress: - - - YES - id - id - - - - YES - - YES - onDoneButtonPress: - onSafariButtonPress: - - - YES - - onDoneButtonPress: - id - - - onSafariButtonPress: - id - - - - - YES - - YES - addressLabel - backBtn - closeBtn - delegate - fwdBtn - refreshBtn - safariBtn - spinner - webView - - - YES - UILabel - UIBarButtonItem - UIBarButtonItem - id - UIBarButtonItem - UIBarButtonItem - UIBarButtonItem - UIActivityIndicatorView - UIWebView - - - - YES - - YES - addressLabel - backBtn - closeBtn - delegate - fwdBtn - refreshBtn - safariBtn - spinner - webView - - - YES - - addressLabel - UILabel - - - backBtn - UIBarButtonItem - - - closeBtn - UIBarButtonItem - - - delegate - id - - - fwdBtn - UIBarButtonItem - - - refreshBtn - UIBarButtonItem - - - safariBtn - UIBarButtonItem - - - spinner - UIActivityIndicatorView - - - webView - UIWebView - - - - - IBProjectSource - Plugins/ChildBrowser/ChildBrowserViewController.h - - - - - YES - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSError.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSFileManager.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyValueCoding.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyValueObserving.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyedArchiver.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSObject.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSRunLoop.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSThread.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURL.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURLConnection.h - - - - NSObject - - IBFrameworkSource - QuartzCore.framework/Headers/CAAnimation.h - - - - NSObject - - IBFrameworkSource - QuartzCore.framework/Headers/CALayer.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIAccessibility.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UINibLoading.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIResponder.h - - - - UIActivityIndicatorView - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIActivityIndicatorView.h - - - - UIBarButtonItem - UIBarItem - - IBFrameworkSource - UIKit.framework/Headers/UIBarButtonItem.h - - - - UIBarItem - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIBarItem.h - - - - UILabel - UIView - - IBFrameworkSource - UIKit.framework/Headers/UILabel.h - - - - UIResponder - NSObject - - - - UISearchBar - UIView - - IBFrameworkSource - UIKit.framework/Headers/UISearchBar.h - - - - UISearchDisplayController - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UISearchDisplayController.h - - - - UIToolbar - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIToolbar.h - - - - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIPrintFormatter.h - - - - UIView - - IBFrameworkSource - UIKit.framework/Headers/UITextField.h - - - - UIView - UIResponder - - IBFrameworkSource - UIKit.framework/Headers/UIView.h - - - - UIViewController - - IBFrameworkSource - MediaPlayer.framework/Headers/MPMoviePlayerViewController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UINavigationController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UIPopoverController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UISplitViewController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UITabBarController.h - - - - UIViewController - UIResponder - - IBFrameworkSource - UIKit.framework/Headers/UIViewController.h - - - - UIWebView - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIWebView.h - - - - - 0 - IBCocoaTouchFramework - - com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS - - - - com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS - - - - com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 - - - YES - - 3 - 141 - - diff --git a/cordova-lib/spec-plugman-install/plugins/ChildBrowser/src/ios/TargetDirTest.h b/cordova-lib/spec-plugman-install/plugins/ChildBrowser/src/ios/TargetDirTest.h deleted file mode 100644 index 60a1403a2..000000000 --- a/cordova-lib/spec-plugman-install/plugins/ChildBrowser/src/ios/TargetDirTest.h +++ /dev/null @@ -1,20 +0,0 @@ -/* - * - * Copyright 2013 Anis Kadri - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - * -*/ - - diff --git a/cordova-lib/spec-plugman-install/plugins/ChildBrowser/src/ios/TargetDirTest.m b/cordova-lib/spec-plugman-install/plugins/ChildBrowser/src/ios/TargetDirTest.m deleted file mode 100644 index 8d1c8b69c..000000000 --- a/cordova-lib/spec-plugman-install/plugins/ChildBrowser/src/ios/TargetDirTest.m +++ /dev/null @@ -1 +0,0 @@ - diff --git a/cordova-lib/spec-plugman-install/plugins/ChildBrowser/src/ios/preserveDirs/PreserveDirsTest.h b/cordova-lib/spec-plugman-install/plugins/ChildBrowser/src/ios/preserveDirs/PreserveDirsTest.h deleted file mode 100644 index 60a1403a2..000000000 --- a/cordova-lib/spec-plugman-install/plugins/ChildBrowser/src/ios/preserveDirs/PreserveDirsTest.h +++ /dev/null @@ -1,20 +0,0 @@ -/* - * - * Copyright 2013 Anis Kadri - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - * -*/ - - diff --git a/cordova-lib/spec-plugman-install/plugins/ChildBrowser/src/ios/preserveDirs/PreserveDirsTest.m b/cordova-lib/spec-plugman-install/plugins/ChildBrowser/src/ios/preserveDirs/PreserveDirsTest.m deleted file mode 100644 index 8d1c8b69c..000000000 --- a/cordova-lib/spec-plugman-install/plugins/ChildBrowser/src/ios/preserveDirs/PreserveDirsTest.m +++ /dev/null @@ -1 +0,0 @@ - diff --git a/cordova-lib/spec-plugman-install/plugins/ChildBrowser/www/childbrowser.js b/cordova-lib/spec-plugman-install/plugins/ChildBrowser/www/childbrowser.js deleted file mode 100644 index 5263b0c5d..000000000 --- a/cordova-lib/spec-plugman-install/plugins/ChildBrowser/www/childbrowser.js +++ /dev/null @@ -1,19 +0,0 @@ -/* - * - * Copyright 2013 Anis Kadri - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - * -*/ - diff --git a/cordova-lib/spec-plugman-install/plugins/ChildBrowser/www/childbrowser/image.jpg b/cordova-lib/spec-plugman-install/plugins/ChildBrowser/www/childbrowser/image.jpg deleted file mode 100644 index 257cc5642..000000000 --- a/cordova-lib/spec-plugman-install/plugins/ChildBrowser/www/childbrowser/image.jpg +++ /dev/null @@ -1 +0,0 @@ -foo diff --git a/cordova-lib/spec-plugman-install/plugins/ChildBrowser/www/childbrowser_file.html b/cordova-lib/spec-plugman-install/plugins/ChildBrowser/www/childbrowser_file.html deleted file mode 100644 index 6de7b8c69..000000000 --- a/cordova-lib/spec-plugman-install/plugins/ChildBrowser/www/childbrowser_file.html +++ /dev/null @@ -1 +0,0 @@ -This is a test file. diff --git a/cordova-lib/spec-plugman-install/plugins/ConfigTestPlugin/plugin.xml b/cordova-lib/spec-plugman-install/plugins/ConfigTestPlugin/plugin.xml deleted file mode 100644 index 54b489573..000000000 --- a/cordova-lib/spec-plugman-install/plugins/ConfigTestPlugin/plugin.xml +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - Does Code Fil Write Even Work? Hopefully the Tests Will Tell Us - - - - - - - - - - - diff --git a/cordova-lib/spec-plugman-install/plugins/Contacts/plugin.xml b/cordova-lib/spec-plugman-install/plugins/Contacts/plugin.xml deleted file mode 100644 index 622eb2a2f..000000000 --- a/cordova-lib/spec-plugman-install/plugins/Contacts/plugin.xml +++ /dev/null @@ -1,128 +0,0 @@ - - - - Contacts - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - access_pimdomain_contacts - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/cordova-lib/spec-plugman-install/plugins/Contacts/src/android/ContactAccessor.java b/cordova-lib/spec-plugman-install/plugins/Contacts/src/android/ContactAccessor.java deleted file mode 100644 index 24ef9c61d..000000000 --- a/cordova-lib/spec-plugman-install/plugins/Contacts/src/android/ContactAccessor.java +++ /dev/null @@ -1,198 +0,0 @@ -/* - * Copyright (C) 2009 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.cordova.core; - -import java.util.HashMap; - -import android.util.Log; -import android.webkit.WebView; - -import org.apache.cordova.CordovaInterface; -import org.json.JSONArray; -import org.json.JSONException; -import org.json.JSONObject; - -/** - * This abstract class defines SDK-independent API for communication with - * Contacts Provider. The actual implementation used by the application depends - * on the level of API available on the device. If the API level is Cupcake or - * Donut, we want to use the {@link ContactAccessorSdk3_4} class. If it is - * Eclair or higher, we want to use {@link ContactAccessorSdk5}. - */ -public abstract class ContactAccessor { - - protected final String LOG_TAG = "ContactsAccessor"; - protected CordovaInterface mApp; - protected WebView mView; - - /** - * Check to see if the data associated with the key is required to - * be populated in the Contact object. - * @param key - * @param map created by running buildPopulationSet. - * @return true if the key data is required - */ - protected boolean isRequired(String key, HashMap map) { - Boolean retVal = map.get(key); - return (retVal == null) ? false : retVal.booleanValue(); - } - - /** - * Create a hash map of what data needs to be populated in the Contact object - * @param fields the list of fields to populate - * @return the hash map of required data - */ - protected HashMap buildPopulationSet(JSONArray fields) { - HashMap map = new HashMap(); - - String key; - try { - if (fields.length() == 1 && fields.getString(0).equals("*")) { - map.put("displayName", true); - map.put("name", true); - map.put("nickname", true); - map.put("phoneNumbers", true); - map.put("emails", true); - map.put("addresses", true); - map.put("ims", true); - map.put("organizations", true); - map.put("birthday", true); - map.put("note", true); - map.put("urls", true); - map.put("photos", true); - map.put("categories", true); - } - else { - for (int i=0; i - * This implementation has several advantages: - *
    - *
  • It sees contacts from multiple accounts. - *
  • It works with aggregated contacts. So for example, if the contact is the result - * of aggregation of two raw contacts from different accounts, it may return the name from - * one and the phone number from the other. - *
  • It is efficient because it uses the more efficient current API. - *
  • Not obvious in this particular example, but it has access to new kinds - * of data available exclusively through the new APIs. Exercise for the reader: add support - * for nickname (see {@link android.provider.ContactsContract.CommonDataKinds.Nickname}) or - * social status updates (see {@link android.provider.ContactsContract.StatusUpdates}). - *
- */ - -public class ContactAccessorSdk5 extends ContactAccessor { - - /** - * Keep the photo size under the 1 MB blog limit. - */ - private static final long MAX_PHOTO_SIZE = 1048576; - - private static final String EMAIL_REGEXP = ".+@.+\\.+.+"; /* @.*/ - - /** - * A static map that converts the JavaScript property name to Android database column name. - */ - private static final Map dbMap = new HashMap(); - static { - dbMap.put("id", ContactsContract.Data.CONTACT_ID); - dbMap.put("displayName", ContactsContract.Contacts.DISPLAY_NAME); - dbMap.put("name", ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME); - dbMap.put("name.formatted", ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME); - dbMap.put("name.familyName", ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME); - dbMap.put("name.givenName", ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME); - dbMap.put("name.middleName", ContactsContract.CommonDataKinds.StructuredName.MIDDLE_NAME); - dbMap.put("name.honorificPrefix", ContactsContract.CommonDataKinds.StructuredName.PREFIX); - dbMap.put("name.honorificSuffix", ContactsContract.CommonDataKinds.StructuredName.SUFFIX); - dbMap.put("nickname", ContactsContract.CommonDataKinds.Nickname.NAME); - dbMap.put("phoneNumbers", ContactsContract.CommonDataKinds.Phone.NUMBER); - dbMap.put("phoneNumbers.value", ContactsContract.CommonDataKinds.Phone.NUMBER); - dbMap.put("emails", ContactsContract.CommonDataKinds.Email.DATA); - dbMap.put("emails.value", ContactsContract.CommonDataKinds.Email.DATA); - dbMap.put("addresses", ContactsContract.CommonDataKinds.StructuredPostal.FORMATTED_ADDRESS); - dbMap.put("addresses.formatted", ContactsContract.CommonDataKinds.StructuredPostal.FORMATTED_ADDRESS); - dbMap.put("addresses.streetAddress", ContactsContract.CommonDataKinds.StructuredPostal.STREET); - dbMap.put("addresses.locality", ContactsContract.CommonDataKinds.StructuredPostal.CITY); - dbMap.put("addresses.region", ContactsContract.CommonDataKinds.StructuredPostal.REGION); - dbMap.put("addresses.postalCode", ContactsContract.CommonDataKinds.StructuredPostal.POSTCODE); - dbMap.put("addresses.country", ContactsContract.CommonDataKinds.StructuredPostal.COUNTRY); - dbMap.put("ims", ContactsContract.CommonDataKinds.Im.DATA); - dbMap.put("ims.value", ContactsContract.CommonDataKinds.Im.DATA); - dbMap.put("organizations", ContactsContract.CommonDataKinds.Organization.COMPANY); - dbMap.put("organizations.name", ContactsContract.CommonDataKinds.Organization.COMPANY); - dbMap.put("organizations.department", ContactsContract.CommonDataKinds.Organization.DEPARTMENT); - dbMap.put("organizations.title", ContactsContract.CommonDataKinds.Organization.TITLE); - dbMap.put("birthday", ContactsContract.CommonDataKinds.Event.CONTENT_ITEM_TYPE); - dbMap.put("note", ContactsContract.CommonDataKinds.Note.NOTE); - dbMap.put("photos.value", ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE); - //dbMap.put("categories.value", null); - dbMap.put("urls", ContactsContract.CommonDataKinds.Website.URL); - dbMap.put("urls.value", ContactsContract.CommonDataKinds.Website.URL); - } - - /** - * Create an contact accessor. - */ - public ContactAccessorSdk5(WebView view, CordovaInterface context) { - mApp = context; - mView = view; - } - - /** - * This method takes the fields required and search options in order to produce an - * array of contacts that matches the criteria provided. - * @param fields an array of items to be used as search criteria - * @param options that can be applied to contact searching - * @return an array of contacts - */ - @Override - public JSONArray search(JSONArray fields, JSONObject options) { - // Get the find options - String searchTerm = ""; - int limit = Integer.MAX_VALUE; - boolean multiple = true; - - if (options != null) { - searchTerm = options.optString("filter"); - if (searchTerm.length() == 0) { - searchTerm = "%"; - } - else { - searchTerm = "%" + searchTerm + "%"; - } - - try { - multiple = options.getBoolean("multiple"); - if (!multiple) { - limit = 1; - } - } catch (JSONException e) { - // Multiple was not specified so we assume the default is true. - } - } - else { - searchTerm = "%"; - } - - - //Log.d(LOG_TAG, "Search Term = " + searchTerm); - //Log.d(LOG_TAG, "Field Length = " + fields.length()); - //Log.d(LOG_TAG, "Fields = " + fields.toString()); - - // Loop through the fields the user provided to see what data should be returned. - HashMap populate = buildPopulationSet(fields); - - // Build the ugly where clause and where arguments for one big query. - WhereOptions whereOptions = buildWhereClause(fields, searchTerm); - - // Get all the id's where the search term matches the fields passed in. - Cursor idCursor = mApp.getActivity().getContentResolver().query(ContactsContract.Data.CONTENT_URI, - new String[] { ContactsContract.Data.CONTACT_ID }, - whereOptions.getWhere(), - whereOptions.getWhereArgs(), - ContactsContract.Data.CONTACT_ID + " ASC"); - - // Create a set of unique ids - Set contactIds = new HashSet(); - int idColumn = -1; - while (idCursor.moveToNext()) { - if (idColumn < 0) { - idColumn = idCursor.getColumnIndex(ContactsContract.Data.CONTACT_ID); - } - contactIds.add(idCursor.getString(idColumn)); - } - idCursor.close(); - - // Build a query that only looks at ids - WhereOptions idOptions = buildIdClause(contactIds, searchTerm); - - // Determine which columns we should be fetching. - HashSet columnsToFetch = new HashSet(); - columnsToFetch.add(ContactsContract.Data.CONTACT_ID); - columnsToFetch.add(ContactsContract.Data.RAW_CONTACT_ID); - columnsToFetch.add(ContactsContract.Data.MIMETYPE); - - if (isRequired("displayName", populate)) { - columnsToFetch.add(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME); - } - if (isRequired("name", populate)) { - columnsToFetch.add(ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME); - columnsToFetch.add(ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME); - columnsToFetch.add(ContactsContract.CommonDataKinds.StructuredName.MIDDLE_NAME); - columnsToFetch.add(ContactsContract.CommonDataKinds.StructuredName.PREFIX); - columnsToFetch.add(ContactsContract.CommonDataKinds.StructuredName.SUFFIX); - } - if (isRequired("phoneNumbers", populate)) { - columnsToFetch.add(ContactsContract.CommonDataKinds.Phone._ID); - columnsToFetch.add(ContactsContract.CommonDataKinds.Phone.NUMBER); - columnsToFetch.add(ContactsContract.CommonDataKinds.Phone.TYPE); - } - if (isRequired("emails", populate)) { - columnsToFetch.add(ContactsContract.CommonDataKinds.Email._ID); - columnsToFetch.add(ContactsContract.CommonDataKinds.Email.DATA); - columnsToFetch.add(ContactsContract.CommonDataKinds.Email.TYPE); - } - if (isRequired("addresses", populate)) { - columnsToFetch.add(ContactsContract.CommonDataKinds.StructuredPostal._ID); - columnsToFetch.add(ContactsContract.CommonDataKinds.Organization.TYPE); - columnsToFetch.add(ContactsContract.CommonDataKinds.StructuredPostal.FORMATTED_ADDRESS); - columnsToFetch.add(ContactsContract.CommonDataKinds.StructuredPostal.STREET); - columnsToFetch.add(ContactsContract.CommonDataKinds.StructuredPostal.CITY); - columnsToFetch.add(ContactsContract.CommonDataKinds.StructuredPostal.REGION); - columnsToFetch.add(ContactsContract.CommonDataKinds.StructuredPostal.POSTCODE); - columnsToFetch.add(ContactsContract.CommonDataKinds.StructuredPostal.COUNTRY); - } - if (isRequired("organizations", populate)) { - columnsToFetch.add(ContactsContract.CommonDataKinds.Organization._ID); - columnsToFetch.add(ContactsContract.CommonDataKinds.Organization.TYPE); - columnsToFetch.add(ContactsContract.CommonDataKinds.Organization.DEPARTMENT); - columnsToFetch.add(ContactsContract.CommonDataKinds.Organization.COMPANY); - columnsToFetch.add(ContactsContract.CommonDataKinds.Organization.TITLE); - } - if (isRequired("ims", populate)) { - columnsToFetch.add(ContactsContract.CommonDataKinds.Im._ID); - columnsToFetch.add(ContactsContract.CommonDataKinds.Im.DATA); - columnsToFetch.add(ContactsContract.CommonDataKinds.Im.TYPE); - } - if (isRequired("note", populate)) { - columnsToFetch.add(ContactsContract.CommonDataKinds.Note.NOTE); - } - if (isRequired("nickname", populate)) { - columnsToFetch.add(ContactsContract.CommonDataKinds.Nickname.NAME); - } - if (isRequired("urls", populate)) { - columnsToFetch.add(ContactsContract.CommonDataKinds.Website._ID); - columnsToFetch.add(ContactsContract.CommonDataKinds.Website.URL); - columnsToFetch.add(ContactsContract.CommonDataKinds.Website.TYPE); - } - if (isRequired("birthday", populate)) { - columnsToFetch.add(ContactsContract.CommonDataKinds.Event.START_DATE); - columnsToFetch.add(ContactsContract.CommonDataKinds.Event.TYPE); - } - if (isRequired("photos", populate)) { - columnsToFetch.add(ContactsContract.CommonDataKinds.Photo._ID); - } - - // Do the id query - Cursor c = mApp.getActivity().getContentResolver().query(ContactsContract.Data.CONTENT_URI, - columnsToFetch.toArray(new String[] {}), - idOptions.getWhere(), - idOptions.getWhereArgs(), - ContactsContract.Data.CONTACT_ID + " ASC"); - - JSONArray contacts = populateContactArray(limit, populate, c); - return contacts; - } - - /** - * A special search that finds one contact by id - * - * @param id contact to find by id - * @return a JSONObject representing the contact - * @throws JSONException - */ - public JSONObject getContactById(String id) throws JSONException { - // Do the id query - Cursor c = mApp.getActivity().getContentResolver().query(ContactsContract.Data.CONTENT_URI, - null, - ContactsContract.Data.CONTACT_ID + " = ? ", - new String[] { id }, - ContactsContract.Data.CONTACT_ID + " ASC"); - - JSONArray fields = new JSONArray(); - fields.put("*"); - - HashMap populate = buildPopulationSet(fields); - - JSONArray contacts = populateContactArray(1, populate, c); - - if (contacts.length() == 1) { - return contacts.getJSONObject(0); - } else { - return null; - } - } - - /** - * Creates an array of contacts from the cursor you pass in - * - * @param limit max number of contacts for the array - * @param populate whether or not you should populate a certain value - * @param c the cursor - * @return a JSONArray of contacts - */ - private JSONArray populateContactArray(int limit, - HashMap populate, Cursor c) { - - String contactId = ""; - String rawId = ""; - String oldContactId = ""; - boolean newContact = true; - String mimetype = ""; - - JSONArray contacts = new JSONArray(); - JSONObject contact = new JSONObject(); - JSONArray organizations = new JSONArray(); - JSONArray addresses = new JSONArray(); - JSONArray phones = new JSONArray(); - JSONArray emails = new JSONArray(); - JSONArray ims = new JSONArray(); - JSONArray websites = new JSONArray(); - JSONArray photos = new JSONArray(); - - // Column indices - int colContactId = c.getColumnIndex(ContactsContract.Data.CONTACT_ID); - int colRawContactId = c.getColumnIndex(ContactsContract.Data.RAW_CONTACT_ID); - int colMimetype = c.getColumnIndex(ContactsContract.Data.MIMETYPE); - int colDisplayName = c.getColumnIndex(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME); - int colNote = c.getColumnIndex(ContactsContract.CommonDataKinds.Note.NOTE); - int colNickname = c.getColumnIndex(ContactsContract.CommonDataKinds.Nickname.NAME); - int colBirthday = c.getColumnIndex(ContactsContract.CommonDataKinds.Event.START_DATE); - int colEventType = c.getColumnIndex(ContactsContract.CommonDataKinds.Event.TYPE); - - if (c.getCount() > 0) { - while (c.moveToNext() && (contacts.length() <= (limit - 1))) { - try { - contactId = c.getString(colContactId); - rawId = c.getString(colRawContactId); - - // If we are in the first row set the oldContactId - if (c.getPosition() == 0) { - oldContactId = contactId; - } - - // When the contact ID changes we need to push the Contact object - // to the array of contacts and create new objects. - if (!oldContactId.equals(contactId)) { - // Populate the Contact object with it's arrays - // and push the contact into the contacts array - contacts.put(populateContact(contact, organizations, addresses, phones, - emails, ims, websites, photos)); - - // Clean up the objects - contact = new JSONObject(); - organizations = new JSONArray(); - addresses = new JSONArray(); - phones = new JSONArray(); - emails = new JSONArray(); - ims = new JSONArray(); - websites = new JSONArray(); - photos = new JSONArray(); - - // Set newContact to true as we are starting to populate a new contact - newContact = true; - } - - // When we detect a new contact set the ID and display name. - // These fields are available in every row in the result set returned. - if (newContact) { - newContact = false; - contact.put("id", contactId); - contact.put("rawId", rawId); - } - - // Grab the mimetype of the current row as it will be used in a lot of comparisons - mimetype = c.getString(colMimetype); - - if (mimetype.equals(ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE)) { - contact.put("displayName", c.getString(colDisplayName)); - } - - if (mimetype.equals(ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE) - && isRequired("name", populate)) { - contact.put("name", nameQuery(c)); - } - else if (mimetype.equals(ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE) - && isRequired("phoneNumbers", populate)) { - phones.put(phoneQuery(c)); - } - else if (mimetype.equals(ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE) - && isRequired("emails", populate)) { - emails.put(emailQuery(c)); - } - else if (mimetype.equals(ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_ITEM_TYPE) - && isRequired("addresses", populate)) { - addresses.put(addressQuery(c)); - } - else if (mimetype.equals(ContactsContract.CommonDataKinds.Organization.CONTENT_ITEM_TYPE) - && isRequired("organizations", populate)) { - organizations.put(organizationQuery(c)); - } - else if (mimetype.equals(ContactsContract.CommonDataKinds.Im.CONTENT_ITEM_TYPE) - && isRequired("ims", populate)) { - ims.put(imQuery(c)); - } - else if (mimetype.equals(ContactsContract.CommonDataKinds.Note.CONTENT_ITEM_TYPE) - && isRequired("note", populate)) { - contact.put("note", c.getString(colNote)); - } - else if (mimetype.equals(ContactsContract.CommonDataKinds.Nickname.CONTENT_ITEM_TYPE) - && isRequired("nickname", populate)) { - contact.put("nickname", c.getString(colNickname)); - } - else if (mimetype.equals(ContactsContract.CommonDataKinds.Website.CONTENT_ITEM_TYPE) - && isRequired("urls", populate)) { - websites.put(websiteQuery(c)); - } - else if (mimetype.equals(ContactsContract.CommonDataKinds.Event.CONTENT_ITEM_TYPE)) { - if (isRequired("birthday", populate) && - ContactsContract.CommonDataKinds.Event.TYPE_BIRTHDAY == c.getInt(colEventType)) { - contact.put("birthday", c.getString(colBirthday)); - } - } - else if (mimetype.equals(ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE) - && isRequired("photos", populate)) { - photos.put(photoQuery(c, contactId)); - } - } catch (JSONException e) { - Log.e(LOG_TAG, e.getMessage(), e); - } - - // Set the old contact ID - oldContactId = contactId; - - } - - // Push the last contact into the contacts array - if (contacts.length() < limit) { - contacts.put(populateContact(contact, organizations, addresses, phones, - emails, ims, websites, photos)); - } - } - c.close(); - return contacts; - } - - /** - * Builds a where clause all all the ids passed into the method - * @param contactIds a set of unique contact ids - * @param searchTerm what to search for - * @return an object containing the selection and selection args - */ - private WhereOptions buildIdClause(Set contactIds, String searchTerm) { - WhereOptions options = new WhereOptions(); - - // If the user is searching for every contact then short circuit the method - // and return a shorter where clause to be searched. - if (searchTerm.equals("%")) { - options.setWhere("(" + ContactsContract.Data.CONTACT_ID + " LIKE ? )"); - options.setWhereArgs(new String[] { searchTerm }); - return options; - } - - // This clause means that there are specific ID's to be populated - Iterator it = contactIds.iterator(); - StringBuffer buffer = new StringBuffer("("); - - while (it.hasNext()) { - buffer.append("'" + it.next() + "'"); - if (it.hasNext()) { - buffer.append(","); - } - } - buffer.append(")"); - - options.setWhere(ContactsContract.Data.CONTACT_ID + " IN " + buffer.toString()); - options.setWhereArgs(null); - - return options; - } - - /** - * Create a new contact using a JSONObject to hold all the data. - * @param contact - * @param organizations array of organizations - * @param addresses array of addresses - * @param phones array of phones - * @param emails array of emails - * @param ims array of instant messenger addresses - * @param websites array of websites - * @param photos - * @return - */ - private JSONObject populateContact(JSONObject contact, JSONArray organizations, - JSONArray addresses, JSONArray phones, JSONArray emails, - JSONArray ims, JSONArray websites, JSONArray photos) { - try { - // Only return the array if it has at least one entry - if (organizations.length() > 0) { - contact.put("organizations", organizations); - } - if (addresses.length() > 0) { - contact.put("addresses", addresses); - } - if (phones.length() > 0) { - contact.put("phoneNumbers", phones); - } - if (emails.length() > 0) { - contact.put("emails", emails); - } - if (ims.length() > 0) { - contact.put("ims", ims); - } - if (websites.length() > 0) { - contact.put("urls", websites); - } - if (photos.length() > 0) { - contact.put("photos", photos); - } - } catch (JSONException e) { - Log.e(LOG_TAG, e.getMessage(), e); - } - return contact; - } - - /** - * Take the search criteria passed into the method and create a SQL WHERE clause. - * @param fields the properties to search against - * @param searchTerm the string to search for - * @return an object containing the selection and selection args - */ - private WhereOptions buildWhereClause(JSONArray fields, String searchTerm) { - - ArrayList where = new ArrayList(); - ArrayList whereArgs = new ArrayList(); - - WhereOptions options = new WhereOptions(); - - /* - * Special case where the user wants all fields returned - */ - if (isWildCardSearch(fields)) { - // Get all contacts with all properties - if ("%".equals(searchTerm)) { - options.setWhere("(" + ContactsContract.Contacts.DISPLAY_NAME + " LIKE ? )"); - options.setWhereArgs(new String[] { searchTerm }); - return options; - } else { - // Get all contacts that match the filter but return all properties - where.add("(" + dbMap.get("displayName") + " LIKE ? )"); - whereArgs.add(searchTerm); - where.add("(" + dbMap.get("name") + " LIKE ? AND " - + ContactsContract.Data.MIMETYPE + " = ? )"); - whereArgs.add(searchTerm); - whereArgs.add(ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE); - where.add("(" + dbMap.get("nickname") + " LIKE ? AND " - + ContactsContract.Data.MIMETYPE + " = ? )"); - whereArgs.add(searchTerm); - whereArgs.add(ContactsContract.CommonDataKinds.Nickname.CONTENT_ITEM_TYPE); - where.add("(" + dbMap.get("phoneNumbers") + " LIKE ? AND " - + ContactsContract.Data.MIMETYPE + " = ? )"); - whereArgs.add(searchTerm); - whereArgs.add(ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE); - where.add("(" + dbMap.get("emails") + " LIKE ? AND " - + ContactsContract.Data.MIMETYPE + " = ? )"); - whereArgs.add(searchTerm); - whereArgs.add(ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE); - where.add("(" + dbMap.get("addresses") + " LIKE ? AND " - + ContactsContract.Data.MIMETYPE + " = ? )"); - whereArgs.add(searchTerm); - whereArgs.add(ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_ITEM_TYPE); - where.add("(" + dbMap.get("ims") + " LIKE ? AND " - + ContactsContract.Data.MIMETYPE + " = ? )"); - whereArgs.add(searchTerm); - whereArgs.add(ContactsContract.CommonDataKinds.Im.CONTENT_ITEM_TYPE); - where.add("(" + dbMap.get("organizations") + " LIKE ? AND " - + ContactsContract.Data.MIMETYPE + " = ? )"); - whereArgs.add(searchTerm); - whereArgs.add(ContactsContract.CommonDataKinds.Organization.CONTENT_ITEM_TYPE); - where.add("(" + dbMap.get("note") + " LIKE ? AND " - + ContactsContract.Data.MIMETYPE + " = ? )"); - whereArgs.add(searchTerm); - whereArgs.add(ContactsContract.CommonDataKinds.Note.CONTENT_ITEM_TYPE); - where.add("(" + dbMap.get("urls") + " LIKE ? AND " - + ContactsContract.Data.MIMETYPE + " = ? )"); - whereArgs.add(searchTerm); - whereArgs.add(ContactsContract.CommonDataKinds.Website.CONTENT_ITEM_TYPE); - } - } - - /* - * Special case for when the user wants all the contacts but - */ - if ("%".equals(searchTerm)) { - options.setWhere("(" + ContactsContract.Contacts.DISPLAY_NAME + " LIKE ? )"); - options.setWhereArgs(new String[] { searchTerm }); - return options; - } - - String key; - try { - //Log.d(LOG_TAG, "How many fields do we have = " + fields.length()); - for (int i = 0; i < fields.length(); i++) { - key = fields.getString(i); - - if (key.equals("id")) { - where.add("(" + dbMap.get(key) + " = ? )"); - whereArgs.add(searchTerm.substring(1, searchTerm.length() - 1)); - } - else if (key.startsWith("displayName")) { - where.add("(" + dbMap.get(key) + " LIKE ? )"); - whereArgs.add(searchTerm); - } - else if (key.startsWith("name")) { - where.add("(" + dbMap.get(key) + " LIKE ? AND " - + ContactsContract.Data.MIMETYPE + " = ? )"); - whereArgs.add(searchTerm); - whereArgs.add(ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE); - } - else if (key.startsWith("nickname")) { - where.add("(" + dbMap.get(key) + " LIKE ? AND " - + ContactsContract.Data.MIMETYPE + " = ? )"); - whereArgs.add(searchTerm); - whereArgs.add(ContactsContract.CommonDataKinds.Nickname.CONTENT_ITEM_TYPE); - } - else if (key.startsWith("phoneNumbers")) { - where.add("(" + dbMap.get(key) + " LIKE ? AND " - + ContactsContract.Data.MIMETYPE + " = ? )"); - whereArgs.add(searchTerm); - whereArgs.add(ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE); - } - else if (key.startsWith("emails")) { - where.add("(" + dbMap.get(key) + " LIKE ? AND " - + ContactsContract.Data.MIMETYPE + " = ? )"); - whereArgs.add(searchTerm); - whereArgs.add(ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE); - } - else if (key.startsWith("addresses")) { - where.add("(" + dbMap.get(key) + " LIKE ? AND " - + ContactsContract.Data.MIMETYPE + " = ? )"); - whereArgs.add(searchTerm); - whereArgs.add(ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_ITEM_TYPE); - } - else if (key.startsWith("ims")) { - where.add("(" + dbMap.get(key) + " LIKE ? AND " - + ContactsContract.Data.MIMETYPE + " = ? )"); - whereArgs.add(searchTerm); - whereArgs.add(ContactsContract.CommonDataKinds.Im.CONTENT_ITEM_TYPE); - } - else if (key.startsWith("organizations")) { - where.add("(" + dbMap.get(key) + " LIKE ? AND " - + ContactsContract.Data.MIMETYPE + " = ? )"); - whereArgs.add(searchTerm); - whereArgs.add(ContactsContract.CommonDataKinds.Organization.CONTENT_ITEM_TYPE); - } - // else if (key.startsWith("birthday")) { -// where.add("(" + dbMap.get(key) + " LIKE ? AND " -// + ContactsContract.Data.MIMETYPE + " = ? )"); -// } - else if (key.startsWith("note")) { - where.add("(" + dbMap.get(key) + " LIKE ? AND " - + ContactsContract.Data.MIMETYPE + " = ? )"); - whereArgs.add(searchTerm); - whereArgs.add(ContactsContract.CommonDataKinds.Note.CONTENT_ITEM_TYPE); - } - else if (key.startsWith("urls")) { - where.add("(" + dbMap.get(key) + " LIKE ? AND " - + ContactsContract.Data.MIMETYPE + " = ? )"); - whereArgs.add(searchTerm); - whereArgs.add(ContactsContract.CommonDataKinds.Website.CONTENT_ITEM_TYPE); - } - } - } catch (JSONException e) { - Log.e(LOG_TAG, e.getMessage(), e); - } - - // Creating the where string - StringBuffer selection = new StringBuffer(); - for (int i = 0; i < where.size(); i++) { - selection.append(where.get(i)); - if (i != (where.size() - 1)) { - selection.append(" OR "); - } - } - options.setWhere(selection.toString()); - - // Creating the where args array - String[] selectionArgs = new String[whereArgs.size()]; - for (int i = 0; i < whereArgs.size(); i++) { - selectionArgs[i] = whereArgs.get(i); - } - options.setWhereArgs(selectionArgs); - - return options; - } - - /** - * If the user passes in the '*' wildcard character for search then they want all fields for each contact - * - * @param fields - * @return true if wildcard search requested, false otherwise - */ - private boolean isWildCardSearch(JSONArray fields) { - // Only do a wildcard search if we are passed ["*"] - if (fields.length() == 1) { - try { - if ("*".equals(fields.getString(0))) { - return true; - } - } catch (JSONException e) { - return false; - } - } - return false; - } - - /** - * Create a ContactOrganization JSONObject - * @param cursor the current database row - * @return a JSONObject representing a ContactOrganization - */ - private JSONObject organizationQuery(Cursor cursor) { - JSONObject organization = new JSONObject(); - try { - organization.put("id", cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Organization._ID))); - organization.put("pref", false); // Android does not store pref attribute - organization.put("type", getOrgType(cursor.getInt(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Organization.TYPE)))); - organization.put("department", cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Organization.DEPARTMENT))); - organization.put("name", cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Organization.COMPANY))); - organization.put("title", cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Organization.TITLE))); - } catch (JSONException e) { - Log.e(LOG_TAG, e.getMessage(), e); - } - return organization; - } - - /** - * Create a ContactAddress JSONObject - * @param cursor the current database row - * @return a JSONObject representing a ContactAddress - */ - private JSONObject addressQuery(Cursor cursor) { - JSONObject address = new JSONObject(); - try { - address.put("id", cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal._ID))); - address.put("pref", false); // Android does not store pref attribute - address.put("type", getAddressType(cursor.getInt(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Organization.TYPE)))); - address.put("formatted", cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.FORMATTED_ADDRESS))); - address.put("streetAddress", cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.STREET))); - address.put("locality", cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.CITY))); - address.put("region", cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.REGION))); - address.put("postalCode", cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.POSTCODE))); - address.put("country", cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.COUNTRY))); - } catch (JSONException e) { - Log.e(LOG_TAG, e.getMessage(), e); - } - return address; - } - - /** - * Create a ContactName JSONObject - * @param cursor the current database row - * @return a JSONObject representing a ContactName - */ - private JSONObject nameQuery(Cursor cursor) { - JSONObject contactName = new JSONObject(); - try { - String familyName = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME)); - String givenName = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME)); - String middleName = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredName.MIDDLE_NAME)); - String honorificPrefix = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredName.PREFIX)); - String honorificSuffix = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredName.SUFFIX)); - - // Create the formatted name - StringBuffer formatted = new StringBuffer(""); - if (honorificPrefix != null) { - formatted.append(honorificPrefix + " "); - } - if (givenName != null) { - formatted.append(givenName + " "); - } - if (middleName != null) { - formatted.append(middleName + " "); - } - if (familyName != null) { - formatted.append(familyName); - } - if (honorificSuffix != null) { - formatted.append(" " + honorificSuffix); - } - - contactName.put("familyName", familyName); - contactName.put("givenName", givenName); - contactName.put("middleName", middleName); - contactName.put("honorificPrefix", honorificPrefix); - contactName.put("honorificSuffix", honorificSuffix); - contactName.put("formatted", formatted); - } catch (JSONException e) { - Log.e(LOG_TAG, e.getMessage(), e); - } - return contactName; - } - - /** - * Create a ContactField JSONObject - * @param cursor the current database row - * @return a JSONObject representing a ContactField - */ - private JSONObject phoneQuery(Cursor cursor) { - JSONObject phoneNumber = new JSONObject(); - try { - phoneNumber.put("id", cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone._ID))); - phoneNumber.put("pref", false); // Android does not store pref attribute - phoneNumber.put("value", cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER))); - phoneNumber.put("type", getPhoneType(cursor.getInt(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.TYPE)))); - } catch (JSONException e) { - Log.e(LOG_TAG, e.getMessage(), e); - } catch (Exception excp) { - Log.e(LOG_TAG, excp.getMessage(), excp); - } - return phoneNumber; - } - - /** - * Create a ContactField JSONObject - * @param cursor the current database row - * @return a JSONObject representing a ContactField - */ - private JSONObject emailQuery(Cursor cursor) { - JSONObject email = new JSONObject(); - try { - email.put("id", cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Email._ID))); - email.put("pref", false); // Android does not store pref attribute - email.put("value", cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA))); - email.put("type", getContactType(cursor.getInt(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Email.TYPE)))); - } catch (JSONException e) { - Log.e(LOG_TAG, e.getMessage(), e); - } - return email; - } - - /** - * Create a ContactField JSONObject - * @param cursor the current database row - * @return a JSONObject representing a ContactField - */ - private JSONObject imQuery(Cursor cursor) { - JSONObject im = new JSONObject(); - try { - im.put("id", cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Im._ID))); - im.put("pref", false); // Android does not store pref attribute - im.put("value", cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Im.DATA))); - im.put("type", getImType(cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Im.PROTOCOL)))); - } catch (JSONException e) { - Log.e(LOG_TAG, e.getMessage(), e); - } - return im; - } - - /** - * Create a ContactField JSONObject - * @param cursor the current database row - * @return a JSONObject representing a ContactField - */ - private JSONObject websiteQuery(Cursor cursor) { - JSONObject website = new JSONObject(); - try { - website.put("id", cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Website._ID))); - website.put("pref", false); // Android does not store pref attribute - website.put("value", cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Website.URL))); - website.put("type", getContactType(cursor.getInt(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Website.TYPE)))); - } catch (JSONException e) { - Log.e(LOG_TAG, e.getMessage(), e); - } - return website; - } - - /** - * Create a ContactField JSONObject - * @param contactId - * @return a JSONObject representing a ContactField - */ - private JSONObject photoQuery(Cursor cursor, String contactId) { - JSONObject photo = new JSONObject(); - try { - photo.put("id", cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Photo._ID))); - photo.put("pref", false); - photo.put("type", "url"); - Uri person = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, (new Long(contactId))); - Uri photoUri = Uri.withAppendedPath(person, ContactsContract.Contacts.Photo.CONTENT_DIRECTORY); - photo.put("value", photoUri.toString()); - } catch (JSONException e) { - Log.e(LOG_TAG, e.getMessage(), e); - } - return photo; - } - - @Override - /** - * This method will save a contact object into the devices contacts database. - * - * @param contact the contact to be saved. - * @returns the id if the contact is successfully saved, null otherwise. - */ - public String save(JSONObject contact) { - AccountManager mgr = AccountManager.get(mApp.getActivity()); - Account[] accounts = mgr.getAccounts(); - String accountName = null; - String accountType = null; - - if (accounts.length == 1) { - accountName = accounts[0].name; - accountType = accounts[0].type; - } - else if (accounts.length > 1) { - for (Account a : accounts) { - if (a.type.contains("eas") && a.name.matches(EMAIL_REGEXP)) /*Exchange ActiveSync*/{ - accountName = a.name; - accountType = a.type; - break; - } - } - if (accountName == null) { - for (Account a : accounts) { - if (a.type.contains("com.google") && a.name.matches(EMAIL_REGEXP)) /*Google sync provider*/{ - accountName = a.name; - accountType = a.type; - break; - } - } - } - if (accountName == null) { - for (Account a : accounts) { - if (a.name.matches(EMAIL_REGEXP)) /*Last resort, just look for an email address...*/{ - accountName = a.name; - accountType = a.type; - break; - } - } - } - } - - String id = getJsonString(contact, "id"); - if (id == null) { - // Create new contact - return createNewContact(contact, accountType, accountName); - } else { - // Modify existing contact - return modifyContact(id, contact, accountType, accountName); - } - } - - /** - * Creates a new contact and stores it in the database - * - * @param id the raw contact id which is required for linking items to the contact - * @param contact the contact to be saved - * @param account the account to be saved under - */ - private String modifyContact(String id, JSONObject contact, String accountType, String accountName) { - // Get the RAW_CONTACT_ID which is needed to insert new values in an already existing contact. - // But not needed to update existing values. - int rawId = (new Integer(getJsonString(contact, "rawId"))).intValue(); - - // Create a list of attributes to add to the contact database - ArrayList ops = new ArrayList(); - - //Add contact type - ops.add(ContentProviderOperation.newUpdate(ContactsContract.RawContacts.CONTENT_URI) - .withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, accountType) - .withValue(ContactsContract.RawContacts.ACCOUNT_NAME, accountName) - .build()); - - // Modify name - JSONObject name; - try { - String displayName = getJsonString(contact, "displayName"); - name = contact.getJSONObject("name"); - if (displayName != null || name != null) { - ContentProviderOperation.Builder builder = ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI) - .withSelection(ContactsContract.Data.CONTACT_ID + "=? AND " + - ContactsContract.Data.MIMETYPE + "=?", - new String[] { id, ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE }); - - if (displayName != null) { - builder.withValue(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME, displayName); - } - - String familyName = getJsonString(name, "familyName"); - if (familyName != null) { - builder.withValue(ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME, familyName); - } - String middleName = getJsonString(name, "middleName"); - if (middleName != null) { - builder.withValue(ContactsContract.CommonDataKinds.StructuredName.MIDDLE_NAME, middleName); - } - String givenName = getJsonString(name, "givenName"); - if (givenName != null) { - builder.withValue(ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME, givenName); - } - String honorificPrefix = getJsonString(name, "honorificPrefix"); - if (honorificPrefix != null) { - builder.withValue(ContactsContract.CommonDataKinds.StructuredName.PREFIX, honorificPrefix); - } - String honorificSuffix = getJsonString(name, "honorificSuffix"); - if (honorificSuffix != null) { - builder.withValue(ContactsContract.CommonDataKinds.StructuredName.SUFFIX, honorificSuffix); - } - - ops.add(builder.build()); - } - } catch (JSONException e1) { - Log.d(LOG_TAG, "Could not get name"); - } - - // Modify phone numbers - JSONArray phones = null; - try { - phones = contact.getJSONArray("phoneNumbers"); - if (phones != null) { - // Delete all the phones - if (phones.length() == 0) { - ops.add(ContentProviderOperation.newDelete(ContactsContract.Data.CONTENT_URI) - .withSelection(ContactsContract.Data.RAW_CONTACT_ID + "=? AND " + - ContactsContract.Data.MIMETYPE + "=?", - new String[] { "" + rawId, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE }) - .build()); - } - // Modify or add a phone - else { - for (int i = 0; i < phones.length(); i++) { - JSONObject phone = (JSONObject) phones.get(i); - String phoneId = getJsonString(phone, "id"); - // This is a new phone so do a DB insert - if (phoneId == null) { - ContentValues contentValues = new ContentValues(); - contentValues.put(ContactsContract.Data.RAW_CONTACT_ID, rawId); - contentValues.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE); - contentValues.put(ContactsContract.CommonDataKinds.Phone.NUMBER, getJsonString(phone, "value")); - contentValues.put(ContactsContract.CommonDataKinds.Phone.TYPE, getPhoneType(getJsonString(phone, "type"))); - - ops.add(ContentProviderOperation.newInsert( - ContactsContract.Data.CONTENT_URI).withValues(contentValues).build()); - } - // This is an existing phone so do a DB update - else { - ops.add(ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI) - .withSelection(ContactsContract.CommonDataKinds.Phone._ID + "=? AND " + - ContactsContract.Data.MIMETYPE + "=?", - new String[] { phoneId, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE }) - .withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, getJsonString(phone, "value")) - .withValue(ContactsContract.CommonDataKinds.Phone.TYPE, getPhoneType(getJsonString(phone, "type"))) - .build()); - } - } - } - } - } catch (JSONException e) { - Log.d(LOG_TAG, "Could not get phone numbers"); - } - - // Modify emails - JSONArray emails = null; - try { - emails = contact.getJSONArray("emails"); - if (emails != null) { - // Delete all the emails - if (emails.length() == 0) { - ops.add(ContentProviderOperation.newDelete(ContactsContract.Data.CONTENT_URI) - .withSelection(ContactsContract.Data.RAW_CONTACT_ID + "=? AND " + - ContactsContract.Data.MIMETYPE + "=?", - new String[] { "" + rawId, ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE }) - .build()); - } - // Modify or add a email - else { - for (int i = 0; i < emails.length(); i++) { - JSONObject email = (JSONObject) emails.get(i); - String emailId = getJsonString(email, "id"); - // This is a new email so do a DB insert - if (emailId == null) { - ContentValues contentValues = new ContentValues(); - contentValues.put(ContactsContract.Data.RAW_CONTACT_ID, rawId); - contentValues.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE); - contentValues.put(ContactsContract.CommonDataKinds.Email.DATA, getJsonString(email, "value")); - contentValues.put(ContactsContract.CommonDataKinds.Email.TYPE, getContactType(getJsonString(email, "type"))); - - ops.add(ContentProviderOperation.newInsert( - ContactsContract.Data.CONTENT_URI).withValues(contentValues).build()); - } - // This is an existing email so do a DB update - else { - String emailValue=getJsonString(email, "value"); - if(!emailValue.isEmpty()) { - ops.add(ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI) - .withSelection(ContactsContract.CommonDataKinds.Email._ID + "=? AND " + - ContactsContract.Data.MIMETYPE + "=?", - new String[] { emailId, ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE }) - .withValue(ContactsContract.CommonDataKinds.Email.DATA, getJsonString(email, "value")) - .withValue(ContactsContract.CommonDataKinds.Email.TYPE, getContactType(getJsonString(email, "type"))) - .build()); - } else { - ops.add(ContentProviderOperation.newDelete(ContactsContract.Data.CONTENT_URI) - .withSelection(ContactsContract.CommonDataKinds.Email._ID + "=? AND " + - ContactsContract.Data.MIMETYPE + "=?", - new String[] { emailId, ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE }) - .build()); - } - } - } - } - } - } catch (JSONException e) { - Log.d(LOG_TAG, "Could not get emails"); - } - - // Modify addresses - JSONArray addresses = null; - try { - addresses = contact.getJSONArray("addresses"); - if (addresses != null) { - // Delete all the addresses - if (addresses.length() == 0) { - ops.add(ContentProviderOperation.newDelete(ContactsContract.Data.CONTENT_URI) - .withSelection(ContactsContract.Data.RAW_CONTACT_ID + "=? AND " + - ContactsContract.Data.MIMETYPE + "=?", - new String[] { "" + rawId, ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_ITEM_TYPE }) - .build()); - } - // Modify or add a address - else { - for (int i = 0; i < addresses.length(); i++) { - JSONObject address = (JSONObject) addresses.get(i); - String addressId = getJsonString(address, "id"); - // This is a new address so do a DB insert - if (addressId == null) { - ContentValues contentValues = new ContentValues(); - contentValues.put(ContactsContract.Data.RAW_CONTACT_ID, rawId); - contentValues.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_ITEM_TYPE); - contentValues.put(ContactsContract.CommonDataKinds.StructuredPostal.TYPE, getAddressType(getJsonString(address, "type"))); - contentValues.put(ContactsContract.CommonDataKinds.StructuredPostal.FORMATTED_ADDRESS, getJsonString(address, "formatted")); - contentValues.put(ContactsContract.CommonDataKinds.StructuredPostal.STREET, getJsonString(address, "streetAddress")); - contentValues.put(ContactsContract.CommonDataKinds.StructuredPostal.CITY, getJsonString(address, "locality")); - contentValues.put(ContactsContract.CommonDataKinds.StructuredPostal.REGION, getJsonString(address, "region")); - contentValues.put(ContactsContract.CommonDataKinds.StructuredPostal.POSTCODE, getJsonString(address, "postalCode")); - contentValues.put(ContactsContract.CommonDataKinds.StructuredPostal.COUNTRY, getJsonString(address, "country")); - - ops.add(ContentProviderOperation.newInsert( - ContactsContract.Data.CONTENT_URI).withValues(contentValues).build()); - } - // This is an existing address so do a DB update - else { - ops.add(ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI) - .withSelection(ContactsContract.CommonDataKinds.StructuredPostal._ID + "=? AND " + - ContactsContract.Data.MIMETYPE + "=?", - new String[] { addressId, ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_ITEM_TYPE }) - .withValue(ContactsContract.CommonDataKinds.StructuredPostal.TYPE, getAddressType(getJsonString(address, "type"))) - .withValue(ContactsContract.CommonDataKinds.StructuredPostal.FORMATTED_ADDRESS, getJsonString(address, "formatted")) - .withValue(ContactsContract.CommonDataKinds.StructuredPostal.STREET, getJsonString(address, "streetAddress")) - .withValue(ContactsContract.CommonDataKinds.StructuredPostal.CITY, getJsonString(address, "locality")) - .withValue(ContactsContract.CommonDataKinds.StructuredPostal.REGION, getJsonString(address, "region")) - .withValue(ContactsContract.CommonDataKinds.StructuredPostal.POSTCODE, getJsonString(address, "postalCode")) - .withValue(ContactsContract.CommonDataKinds.StructuredPostal.COUNTRY, getJsonString(address, "country")) - .build()); - } - } - } - } - } catch (JSONException e) { - Log.d(LOG_TAG, "Could not get addresses"); - } - - // Modify organizations - JSONArray organizations = null; - try { - organizations = contact.getJSONArray("organizations"); - if (organizations != null) { - // Delete all the organizations - if (organizations.length() == 0) { - ops.add(ContentProviderOperation.newDelete(ContactsContract.Data.CONTENT_URI) - .withSelection(ContactsContract.Data.RAW_CONTACT_ID + "=? AND " + - ContactsContract.Data.MIMETYPE + "=?", - new String[] { "" + rawId, ContactsContract.CommonDataKinds.Organization.CONTENT_ITEM_TYPE }) - .build()); - } - // Modify or add a organization - else { - for (int i = 0; i < organizations.length(); i++) { - JSONObject org = (JSONObject) organizations.get(i); - String orgId = getJsonString(org, "id"); - // This is a new organization so do a DB insert - if (orgId == null) { - ContentValues contentValues = new ContentValues(); - contentValues.put(ContactsContract.Data.RAW_CONTACT_ID, rawId); - contentValues.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Organization.CONTENT_ITEM_TYPE); - contentValues.put(ContactsContract.CommonDataKinds.Organization.TYPE, getOrgType(getJsonString(org, "type"))); - contentValues.put(ContactsContract.CommonDataKinds.Organization.DEPARTMENT, getJsonString(org, "department")); - contentValues.put(ContactsContract.CommonDataKinds.Organization.COMPANY, getJsonString(org, "name")); - contentValues.put(ContactsContract.CommonDataKinds.Organization.TITLE, getJsonString(org, "title")); - - ops.add(ContentProviderOperation.newInsert( - ContactsContract.Data.CONTENT_URI).withValues(contentValues).build()); - } - // This is an existing organization so do a DB update - else { - ops.add(ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI) - .withSelection(ContactsContract.CommonDataKinds.Organization._ID + "=? AND " + - ContactsContract.Data.MIMETYPE + "=?", - new String[] { orgId, ContactsContract.CommonDataKinds.Organization.CONTENT_ITEM_TYPE }) - .withValue(ContactsContract.CommonDataKinds.Organization.TYPE, getOrgType(getJsonString(org, "type"))) - .withValue(ContactsContract.CommonDataKinds.Organization.DEPARTMENT, getJsonString(org, "department")) - .withValue(ContactsContract.CommonDataKinds.Organization.COMPANY, getJsonString(org, "name")) - .withValue(ContactsContract.CommonDataKinds.Organization.TITLE, getJsonString(org, "title")) - .build()); - } - } - } - } - } catch (JSONException e) { - Log.d(LOG_TAG, "Could not get organizations"); - } - - // Modify IMs - JSONArray ims = null; - try { - ims = contact.getJSONArray("ims"); - if (ims != null) { - // Delete all the ims - if (ims.length() == 0) { - ops.add(ContentProviderOperation.newDelete(ContactsContract.Data.CONTENT_URI) - .withSelection(ContactsContract.Data.RAW_CONTACT_ID + "=? AND " + - ContactsContract.Data.MIMETYPE + "=?", - new String[] { "" + rawId, ContactsContract.CommonDataKinds.Im.CONTENT_ITEM_TYPE }) - .build()); - } - // Modify or add a im - else { - for (int i = 0; i < ims.length(); i++) { - JSONObject im = (JSONObject) ims.get(i); - String imId = getJsonString(im, "id"); - // This is a new IM so do a DB insert - if (imId == null) { - ContentValues contentValues = new ContentValues(); - contentValues.put(ContactsContract.Data.RAW_CONTACT_ID, rawId); - contentValues.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Im.CONTENT_ITEM_TYPE); - contentValues.put(ContactsContract.CommonDataKinds.Im.DATA, getJsonString(im, "value")); - contentValues.put(ContactsContract.CommonDataKinds.Im.TYPE, getImType(getJsonString(im, "type"))); - - ops.add(ContentProviderOperation.newInsert( - ContactsContract.Data.CONTENT_URI).withValues(contentValues).build()); - } - // This is an existing IM so do a DB update - else { - ops.add(ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI) - .withSelection(ContactsContract.CommonDataKinds.Im._ID + "=? AND " + - ContactsContract.Data.MIMETYPE + "=?", - new String[] { imId, ContactsContract.CommonDataKinds.Im.CONTENT_ITEM_TYPE }) - .withValue(ContactsContract.CommonDataKinds.Im.DATA, getJsonString(im, "value")) - .withValue(ContactsContract.CommonDataKinds.Im.TYPE, getContactType(getJsonString(im, "type"))) - .build()); - } - } - } - } - } catch (JSONException e) { - Log.d(LOG_TAG, "Could not get emails"); - } - - // Modify note - String note = getJsonString(contact, "note"); - ops.add(ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI) - .withSelection(ContactsContract.Data.CONTACT_ID + "=? AND " + - ContactsContract.Data.MIMETYPE + "=?", - new String[] { id, ContactsContract.CommonDataKinds.Note.CONTENT_ITEM_TYPE }) - .withValue(ContactsContract.CommonDataKinds.Note.NOTE, note) - .build()); - - // Modify nickname - String nickname = getJsonString(contact, "nickname"); - if (nickname != null) { - ops.add(ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI) - .withSelection(ContactsContract.Data.CONTACT_ID + "=? AND " + - ContactsContract.Data.MIMETYPE + "=?", - new String[] { id, ContactsContract.CommonDataKinds.Nickname.CONTENT_ITEM_TYPE }) - .withValue(ContactsContract.CommonDataKinds.Nickname.NAME, nickname) - .build()); - } - - // Modify urls - JSONArray websites = null; - try { - websites = contact.getJSONArray("urls"); - if (websites != null) { - // Delete all the websites - if (websites.length() == 0) { - Log.d(LOG_TAG, "This means we should be deleting all the phone numbers."); - ops.add(ContentProviderOperation.newDelete(ContactsContract.Data.CONTENT_URI) - .withSelection(ContactsContract.Data.RAW_CONTACT_ID + "=? AND " + - ContactsContract.Data.MIMETYPE + "=?", - new String[] { "" + rawId, ContactsContract.CommonDataKinds.Website.CONTENT_ITEM_TYPE }) - .build()); - } - // Modify or add a website - else { - for (int i = 0; i < websites.length(); i++) { - JSONObject website = (JSONObject) websites.get(i); - String websiteId = getJsonString(website, "id"); - // This is a new website so do a DB insert - if (websiteId == null) { - ContentValues contentValues = new ContentValues(); - contentValues.put(ContactsContract.Data.RAW_CONTACT_ID, rawId); - contentValues.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Website.CONTENT_ITEM_TYPE); - contentValues.put(ContactsContract.CommonDataKinds.Website.DATA, getJsonString(website, "value")); - contentValues.put(ContactsContract.CommonDataKinds.Website.TYPE, getContactType(getJsonString(website, "type"))); - - ops.add(ContentProviderOperation.newInsert( - ContactsContract.Data.CONTENT_URI).withValues(contentValues).build()); - } - // This is an existing website so do a DB update - else { - ops.add(ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI) - .withSelection(ContactsContract.CommonDataKinds.Website._ID + "=? AND " + - ContactsContract.Data.MIMETYPE + "=?", - new String[] { websiteId, ContactsContract.CommonDataKinds.Website.CONTENT_ITEM_TYPE }) - .withValue(ContactsContract.CommonDataKinds.Website.DATA, getJsonString(website, "value")) - .withValue(ContactsContract.CommonDataKinds.Website.TYPE, getContactType(getJsonString(website, "type"))) - .build()); - } - } - } - } - } catch (JSONException e) { - Log.d(LOG_TAG, "Could not get websites"); - } - - // Modify birthday - String birthday = getJsonString(contact, "birthday"); - if (birthday != null) { - ops.add(ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI) - .withSelection(ContactsContract.Data.CONTACT_ID + "=? AND " + - ContactsContract.Data.MIMETYPE + "=? AND " + - ContactsContract.CommonDataKinds.Event.TYPE + "=?", - new String[] { id, ContactsContract.CommonDataKinds.Event.CONTENT_ITEM_TYPE, new String("" + ContactsContract.CommonDataKinds.Event.TYPE_BIRTHDAY) }) - .withValue(ContactsContract.CommonDataKinds.Event.TYPE, ContactsContract.CommonDataKinds.Event.TYPE_BIRTHDAY) - .withValue(ContactsContract.CommonDataKinds.Event.START_DATE, birthday) - .build()); - } - - // Modify photos - JSONArray photos = null; - try { - photos = contact.getJSONArray("photos"); - if (photos != null) { - // Delete all the photos - if (photos.length() == 0) { - ops.add(ContentProviderOperation.newDelete(ContactsContract.Data.CONTENT_URI) - .withSelection(ContactsContract.Data.RAW_CONTACT_ID + "=? AND " + - ContactsContract.Data.MIMETYPE + "=?", - new String[] { "" + rawId, ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE }) - .build()); - } - // Modify or add a photo - else { - for (int i = 0; i < photos.length(); i++) { - JSONObject photo = (JSONObject) photos.get(i); - String photoId = getJsonString(photo, "id"); - byte[] bytes = getPhotoBytes(getJsonString(photo, "value")); - // This is a new photo so do a DB insert - if (photoId == null) { - ContentValues contentValues = new ContentValues(); - contentValues.put(ContactsContract.Data.RAW_CONTACT_ID, rawId); - contentValues.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE); - contentValues.put(ContactsContract.Data.IS_SUPER_PRIMARY, 1); - contentValues.put(ContactsContract.CommonDataKinds.Photo.PHOTO, bytes); - - ops.add(ContentProviderOperation.newInsert( - ContactsContract.Data.CONTENT_URI).withValues(contentValues).build()); - } - // This is an existing photo so do a DB update - else { - ops.add(ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI) - .withSelection(ContactsContract.CommonDataKinds.Photo._ID + "=? AND " + - ContactsContract.Data.MIMETYPE + "=?", - new String[] { photoId, ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE }) - .withValue(ContactsContract.Data.IS_SUPER_PRIMARY, 1) - .withValue(ContactsContract.CommonDataKinds.Photo.PHOTO, bytes) - .build()); - } - } - } - } - } catch (JSONException e) { - Log.d(LOG_TAG, "Could not get photos"); - } - - boolean retVal = true; - - //Modify contact - try { - mApp.getActivity().getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops); - } catch (RemoteException e) { - Log.e(LOG_TAG, e.getMessage(), e); - Log.e(LOG_TAG, Log.getStackTraceString(e), e); - retVal = false; - } catch (OperationApplicationException e) { - Log.e(LOG_TAG, e.getMessage(), e); - Log.e(LOG_TAG, Log.getStackTraceString(e), e); - retVal = false; - } - - // if the save was a success return the contact ID - if (retVal) { - return id; - } else { - return null; - } - } - - /** - * Add a website to a list of database actions to be performed - * - * @param ops the list of database actions - * @param website the item to be inserted - */ - private void insertWebsite(ArrayList ops, - JSONObject website) { - ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI) - .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0) - .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Website.CONTENT_ITEM_TYPE) - .withValue(ContactsContract.CommonDataKinds.Website.DATA, getJsonString(website, "value")) - .withValue(ContactsContract.CommonDataKinds.Website.TYPE, getContactType(getJsonString(website, "type"))) - .build()); - } - - /** - * Add an im to a list of database actions to be performed - * - * @param ops the list of database actions - * @param im the item to be inserted - */ - private void insertIm(ArrayList ops, JSONObject im) { - ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI) - .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0) - .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Im.CONTENT_ITEM_TYPE) - .withValue(ContactsContract.CommonDataKinds.Im.DATA, getJsonString(im, "value")) - .withValue(ContactsContract.CommonDataKinds.Im.TYPE, getImType(getJsonString(im, "type"))) - .build()); - } - - /** - * Add an organization to a list of database actions to be performed - * - * @param ops the list of database actions - * @param org the item to be inserted - */ - private void insertOrganization(ArrayList ops, - JSONObject org) { - ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI) - .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0) - .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Organization.CONTENT_ITEM_TYPE) - .withValue(ContactsContract.CommonDataKinds.Organization.TYPE, getOrgType(getJsonString(org, "type"))) - .withValue(ContactsContract.CommonDataKinds.Organization.DEPARTMENT, getJsonString(org, "department")) - .withValue(ContactsContract.CommonDataKinds.Organization.COMPANY, getJsonString(org, "name")) - .withValue(ContactsContract.CommonDataKinds.Organization.TITLE, getJsonString(org, "title")) - .build()); - } - - /** - * Add an address to a list of database actions to be performed - * - * @param ops the list of database actions - * @param address the item to be inserted - */ - private void insertAddress(ArrayList ops, - JSONObject address) { - ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI) - .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0) - .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_ITEM_TYPE) - .withValue(ContactsContract.CommonDataKinds.StructuredPostal.TYPE, getAddressType(getJsonString(address, "type"))) - .withValue(ContactsContract.CommonDataKinds.StructuredPostal.FORMATTED_ADDRESS, getJsonString(address, "formatted")) - .withValue(ContactsContract.CommonDataKinds.StructuredPostal.STREET, getJsonString(address, "streetAddress")) - .withValue(ContactsContract.CommonDataKinds.StructuredPostal.CITY, getJsonString(address, "locality")) - .withValue(ContactsContract.CommonDataKinds.StructuredPostal.REGION, getJsonString(address, "region")) - .withValue(ContactsContract.CommonDataKinds.StructuredPostal.POSTCODE, getJsonString(address, "postalCode")) - .withValue(ContactsContract.CommonDataKinds.StructuredPostal.COUNTRY, getJsonString(address, "country")) - .build()); - } - - /** - * Add an email to a list of database actions to be performed - * - * @param ops the list of database actions - * @param email the item to be inserted - */ - private void insertEmail(ArrayList ops, - JSONObject email) { - ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI) - .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0) - .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE) - .withValue(ContactsContract.CommonDataKinds.Email.DATA, getJsonString(email, "value")) - .withValue(ContactsContract.CommonDataKinds.Email.TYPE, getContactType(getJsonString(email, "type"))) - .build()); - } - - /** - * Add a phone to a list of database actions to be performed - * - * @param ops the list of database actions - * @param phone the item to be inserted - */ - private void insertPhone(ArrayList ops, - JSONObject phone) { - ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI) - .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0) - .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE) - .withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, getJsonString(phone, "value")) - .withValue(ContactsContract.CommonDataKinds.Phone.TYPE, getPhoneType(getJsonString(phone, "type"))) - .build()); - } - - /** - * Add a phone to a list of database actions to be performed - * - * @param ops the list of database actions - * @param phone the item to be inserted - */ - private void insertPhoto(ArrayList ops, - JSONObject photo) { - byte[] bytes = getPhotoBytes(getJsonString(photo, "value")); - ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI) - .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0) - .withValue(ContactsContract.Data.IS_SUPER_PRIMARY, 1) - .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE) - .withValue(ContactsContract.CommonDataKinds.Photo.PHOTO, bytes) - .build()); - } - - /** - * Gets the raw bytes from the supplied filename - * - * @param filename the file to read the bytes from - * @return a byte array - * @throws IOException - */ - private byte[] getPhotoBytes(String filename) { - ByteArrayOutputStream buffer = new ByteArrayOutputStream(); - try { - int bytesRead = 0; - long totalBytesRead = 0; - byte[] data = new byte[8192]; - InputStream in = getPathFromUri(filename); - - while ((bytesRead = in.read(data, 0, data.length)) != -1 && totalBytesRead <= MAX_PHOTO_SIZE) { - buffer.write(data, 0, bytesRead); - totalBytesRead += bytesRead; - } - - in.close(); - buffer.flush(); - } catch (FileNotFoundException e) { - Log.e(LOG_TAG, e.getMessage(), e); - } catch (IOException e) { - Log.e(LOG_TAG, e.getMessage(), e); - } - return buffer.toByteArray(); - } - - /** - * Get an input stream based on file path or uri content://, http://, file:// - * - * @param path - * @return an input stream - * @throws IOException - */ - private InputStream getPathFromUri(String path) throws IOException { - if (path.startsWith("content:")) { - Uri uri = Uri.parse(path); - return mApp.getActivity().getContentResolver().openInputStream(uri); - } - if (path.startsWith("http:") || path.startsWith("https:") || path.startsWith("file:")) { - URL url = new URL(path); - return url.openStream(); - } - else { - return new FileInputStream(path); - } - } - - /** - * Creates a new contact and stores it in the database - * - * @param contact the contact to be saved - * @param account the account to be saved under - */ - private String createNewContact(JSONObject contact, String accountType, String accountName) { - // Create a list of attributes to add to the contact database - ArrayList ops = new ArrayList(); - - //Add contact type - ops.add(ContentProviderOperation.newInsert(ContactsContract.RawContacts.CONTENT_URI) - .withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, accountType) - .withValue(ContactsContract.RawContacts.ACCOUNT_NAME, accountName) - .build()); - - // Add name - try { - JSONObject name = contact.optJSONObject("name"); - String displayName = contact.getString("displayName"); - if (displayName != null || name != null) { - ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI) - .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0) - .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE) - .withValue(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME, displayName) - .withValue(ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME, getJsonString(name, "familyName")) - .withValue(ContactsContract.CommonDataKinds.StructuredName.MIDDLE_NAME, getJsonString(name, "middleName")) - .withValue(ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME, getJsonString(name, "givenName")) - .withValue(ContactsContract.CommonDataKinds.StructuredName.PREFIX, getJsonString(name, "honorificPrefix")) - .withValue(ContactsContract.CommonDataKinds.StructuredName.SUFFIX, getJsonString(name, "honorificSuffix")) - .build()); - } - } catch (JSONException e) { - Log.d(LOG_TAG, "Could not get name object"); - } - - //Add phone numbers - JSONArray phones = null; - try { - phones = contact.getJSONArray("phoneNumbers"); - if (phones != null) { - for (int i = 0; i < phones.length(); i++) { - JSONObject phone = (JSONObject) phones.get(i); - insertPhone(ops, phone); - } - } - } catch (JSONException e) { - Log.d(LOG_TAG, "Could not get phone numbers"); - } - - // Add emails - JSONArray emails = null; - try { - emails = contact.getJSONArray("emails"); - if (emails != null) { - for (int i = 0; i < emails.length(); i++) { - JSONObject email = (JSONObject) emails.get(i); - insertEmail(ops, email); - } - } - } catch (JSONException e) { - Log.d(LOG_TAG, "Could not get emails"); - } - - // Add addresses - JSONArray addresses = null; - try { - addresses = contact.getJSONArray("addresses"); - if (addresses != null) { - for (int i = 0; i < addresses.length(); i++) { - JSONObject address = (JSONObject) addresses.get(i); - insertAddress(ops, address); - } - } - } catch (JSONException e) { - Log.d(LOG_TAG, "Could not get addresses"); - } - - // Add organizations - JSONArray organizations = null; - try { - organizations = contact.getJSONArray("organizations"); - if (organizations != null) { - for (int i = 0; i < organizations.length(); i++) { - JSONObject org = (JSONObject) organizations.get(i); - insertOrganization(ops, org); - } - } - } catch (JSONException e) { - Log.d(LOG_TAG, "Could not get organizations"); - } - - // Add IMs - JSONArray ims = null; - try { - ims = contact.getJSONArray("ims"); - if (ims != null) { - for (int i = 0; i < ims.length(); i++) { - JSONObject im = (JSONObject) ims.get(i); - insertIm(ops, im); - } - } - } catch (JSONException e) { - Log.d(LOG_TAG, "Could not get emails"); - } - - // Add note - String note = getJsonString(contact, "note"); - if (note != null) { - ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI) - .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0) - .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Note.CONTENT_ITEM_TYPE) - .withValue(ContactsContract.CommonDataKinds.Note.NOTE, note) - .build()); - } - - // Add nickname - String nickname = getJsonString(contact, "nickname"); - if (nickname != null) { - ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI) - .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0) - .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Nickname.CONTENT_ITEM_TYPE) - .withValue(ContactsContract.CommonDataKinds.Nickname.NAME, nickname) - .build()); - } - - // Add urls - JSONArray websites = null; - try { - websites = contact.getJSONArray("urls"); - if (websites != null) { - for (int i = 0; i < websites.length(); i++) { - JSONObject website = (JSONObject) websites.get(i); - insertWebsite(ops, website); - } - } - } catch (JSONException e) { - Log.d(LOG_TAG, "Could not get websites"); - } - - // Add birthday - String birthday = getJsonString(contact, "birthday"); - if (birthday != null) { - ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI) - .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0) - .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Event.CONTENT_ITEM_TYPE) - .withValue(ContactsContract.CommonDataKinds.Event.TYPE, ContactsContract.CommonDataKinds.Event.TYPE_BIRTHDAY) - .withValue(ContactsContract.CommonDataKinds.Event.START_DATE, birthday) - .build()); - } - - // Add photos - JSONArray photos = null; - try { - photos = contact.getJSONArray("photos"); - if (photos != null) { - for (int i = 0; i < photos.length(); i++) { - JSONObject photo = (JSONObject) photos.get(i); - insertPhoto(ops, photo); - } - } - } catch (JSONException e) { - Log.d(LOG_TAG, "Could not get photos"); - } - - String newId = null; - //Add contact - try { - ContentProviderResult[] cpResults = mApp.getActivity().getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops); - if (cpResults.length >= 0) { - newId = cpResults[0].uri.getLastPathSegment(); - } - } catch (RemoteException e) { - Log.e(LOG_TAG, e.getMessage(), e); - } catch (OperationApplicationException e) { - Log.e(LOG_TAG, e.getMessage(), e); - } - return newId; - } - - @Override - /** - * This method will remove a Contact from the database based on ID. - * @param id the unique ID of the contact to remove - */ - public boolean remove(String id) { - int result = 0; - Cursor cursor = mApp.getActivity().getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, - null, - ContactsContract.Contacts._ID + " = ?", - new String[] { id }, null); - if (cursor.getCount() == 1) { - cursor.moveToFirst(); - String lookupKey = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.LOOKUP_KEY)); - Uri uri = Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_LOOKUP_URI, lookupKey); - result = mApp.getActivity().getContentResolver().delete(uri, null, null); - } else { - Log.d(LOG_TAG, "Could not find contact with ID"); - } - - return (result > 0) ? true : false; - } - - /************************************************************************** - * - * All methods below this comment are used to convert from JavaScript - * text types to Android integer types and vice versa. - * - *************************************************************************/ - - /** - * Converts a string from the W3C Contact API to it's Android int value. - * @param string - * @return Android int value - */ - private int getPhoneType(String string) { - int type = ContactsContract.CommonDataKinds.Phone.TYPE_OTHER; - if (string != null) { - if ("home".equals(string.toLowerCase())) { - return ContactsContract.CommonDataKinds.Phone.TYPE_HOME; - } - else if ("mobile".equals(string.toLowerCase())) { - return ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE; - } - else if ("work".equals(string.toLowerCase())) { - return ContactsContract.CommonDataKinds.Phone.TYPE_WORK; - } - else if ("work fax".equals(string.toLowerCase())) { - return ContactsContract.CommonDataKinds.Phone.TYPE_FAX_WORK; - } - else if ("home fax".equals(string.toLowerCase())) { - return ContactsContract.CommonDataKinds.Phone.TYPE_FAX_HOME; - } - else if ("fax".equals(string.toLowerCase())) { - return ContactsContract.CommonDataKinds.Phone.TYPE_FAX_WORK; - } - else if ("pager".equals(string.toLowerCase())) { - return ContactsContract.CommonDataKinds.Phone.TYPE_PAGER; - } - else if ("other".equals(string.toLowerCase())) { - return ContactsContract.CommonDataKinds.Phone.TYPE_OTHER; - } - else if ("car".equals(string.toLowerCase())) { - return ContactsContract.CommonDataKinds.Phone.TYPE_CAR; - } - else if ("company main".equals(string.toLowerCase())) { - return ContactsContract.CommonDataKinds.Phone.TYPE_COMPANY_MAIN; - } - else if ("isdn".equals(string.toLowerCase())) { - return ContactsContract.CommonDataKinds.Phone.TYPE_ISDN; - } - else if ("main".equals(string.toLowerCase())) { - return ContactsContract.CommonDataKinds.Phone.TYPE_MAIN; - } - else if ("other fax".equals(string.toLowerCase())) { - return ContactsContract.CommonDataKinds.Phone.TYPE_OTHER_FAX; - } - else if ("radio".equals(string.toLowerCase())) { - return ContactsContract.CommonDataKinds.Phone.TYPE_RADIO; - } - else if ("telex".equals(string.toLowerCase())) { - return ContactsContract.CommonDataKinds.Phone.TYPE_TELEX; - } - else if ("work mobile".equals(string.toLowerCase())) { - return ContactsContract.CommonDataKinds.Phone.TYPE_WORK_MOBILE; - } - else if ("work pager".equals(string.toLowerCase())) { - return ContactsContract.CommonDataKinds.Phone.TYPE_WORK_PAGER; - } - else if ("assistant".equals(string.toLowerCase())) { - return ContactsContract.CommonDataKinds.Phone.TYPE_ASSISTANT; - } - else if ("mms".equals(string.toLowerCase())) { - return ContactsContract.CommonDataKinds.Phone.TYPE_MMS; - } - else if ("callback".equals(string.toLowerCase())) { - return ContactsContract.CommonDataKinds.Phone.TYPE_CALLBACK; - } - else if ("tty ttd".equals(string.toLowerCase())) { - return ContactsContract.CommonDataKinds.Phone.TYPE_TTY_TDD; - } - else if ("custom".equals(string.toLowerCase())) { - return ContactsContract.CommonDataKinds.Phone.TYPE_CUSTOM; - } - } - return type; - } - - /** - * getPhoneType converts an Android phone type into a string - * @param type - * @return phone type as string. - */ - private String getPhoneType(int type) { - String stringType; - switch (type) { - case ContactsContract.CommonDataKinds.Phone.TYPE_CUSTOM: - stringType = "custom"; - break; - case ContactsContract.CommonDataKinds.Phone.TYPE_FAX_HOME: - stringType = "home fax"; - break; - case ContactsContract.CommonDataKinds.Phone.TYPE_FAX_WORK: - stringType = "work fax"; - break; - case ContactsContract.CommonDataKinds.Phone.TYPE_HOME: - stringType = "home"; - break; - case ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE: - stringType = "mobile"; - break; - case ContactsContract.CommonDataKinds.Phone.TYPE_PAGER: - stringType = "pager"; - break; - case ContactsContract.CommonDataKinds.Phone.TYPE_WORK: - stringType = "work"; - break; - case ContactsContract.CommonDataKinds.Phone.TYPE_CALLBACK: - stringType = "callback"; - break; - case ContactsContract.CommonDataKinds.Phone.TYPE_CAR: - stringType = "car"; - break; - case ContactsContract.CommonDataKinds.Phone.TYPE_COMPANY_MAIN: - stringType = "company main"; - break; - case ContactsContract.CommonDataKinds.Phone.TYPE_OTHER_FAX: - stringType = "other fax"; - break; - case ContactsContract.CommonDataKinds.Phone.TYPE_RADIO: - stringType = "radio"; - break; - case ContactsContract.CommonDataKinds.Phone.TYPE_TELEX: - stringType = "telex"; - break; - case ContactsContract.CommonDataKinds.Phone.TYPE_TTY_TDD: - stringType = "tty tdd"; - break; - case ContactsContract.CommonDataKinds.Phone.TYPE_WORK_MOBILE: - stringType = "work mobile"; - break; - case ContactsContract.CommonDataKinds.Phone.TYPE_WORK_PAGER: - stringType = "work pager"; - break; - case ContactsContract.CommonDataKinds.Phone.TYPE_ASSISTANT: - stringType = "assistant"; - break; - case ContactsContract.CommonDataKinds.Phone.TYPE_MMS: - stringType = "mms"; - break; - case ContactsContract.CommonDataKinds.Phone.TYPE_ISDN: - stringType = "isdn"; - break; - case ContactsContract.CommonDataKinds.Phone.TYPE_OTHER: - default: - stringType = "other"; - break; - } - return stringType; - } - - /** - * Converts a string from the W3C Contact API to it's Android int value. - * @param string - * @return Android int value - */ - private int getContactType(String string) { - int type = ContactsContract.CommonDataKinds.Email.TYPE_OTHER; - if (string != null) { - if ("home".equals(string.toLowerCase())) { - return ContactsContract.CommonDataKinds.Email.TYPE_HOME; - } - else if ("work".equals(string.toLowerCase())) { - return ContactsContract.CommonDataKinds.Email.TYPE_WORK; - } - else if ("other".equals(string.toLowerCase())) { - return ContactsContract.CommonDataKinds.Email.TYPE_OTHER; - } - else if ("mobile".equals(string.toLowerCase())) { - return ContactsContract.CommonDataKinds.Email.TYPE_MOBILE; - } - else if ("custom".equals(string.toLowerCase())) { - return ContactsContract.CommonDataKinds.Email.TYPE_CUSTOM; - } - } - return type; - } - - /** - * getPhoneType converts an Android phone type into a string - * @param type - * @return phone type as string. - */ - private String getContactType(int type) { - String stringType; - switch (type) { - case ContactsContract.CommonDataKinds.Email.TYPE_CUSTOM: - stringType = "custom"; - break; - case ContactsContract.CommonDataKinds.Email.TYPE_HOME: - stringType = "home"; - break; - case ContactsContract.CommonDataKinds.Email.TYPE_WORK: - stringType = "work"; - break; - case ContactsContract.CommonDataKinds.Email.TYPE_MOBILE: - stringType = "mobile"; - break; - case ContactsContract.CommonDataKinds.Email.TYPE_OTHER: - default: - stringType = "other"; - break; - } - return stringType; - } - - /** - * Converts a string from the W3C Contact API to it's Android int value. - * @param string - * @return Android int value - */ - private int getOrgType(String string) { - int type = ContactsContract.CommonDataKinds.Organization.TYPE_OTHER; - if (string != null) { - if ("work".equals(string.toLowerCase())) { - return ContactsContract.CommonDataKinds.Organization.TYPE_WORK; - } - else if ("other".equals(string.toLowerCase())) { - return ContactsContract.CommonDataKinds.Organization.TYPE_OTHER; - } - else if ("custom".equals(string.toLowerCase())) { - return ContactsContract.CommonDataKinds.Organization.TYPE_CUSTOM; - } - } - return type; - } - - /** - * getPhoneType converts an Android phone type into a string - * @param type - * @return phone type as string. - */ - private String getOrgType(int type) { - String stringType; - switch (type) { - case ContactsContract.CommonDataKinds.Organization.TYPE_CUSTOM: - stringType = "custom"; - break; - case ContactsContract.CommonDataKinds.Organization.TYPE_WORK: - stringType = "work"; - break; - case ContactsContract.CommonDataKinds.Organization.TYPE_OTHER: - default: - stringType = "other"; - break; - } - return stringType; - } - - /** - * Converts a string from the W3C Contact API to it's Android int value. - * @param string - * @return Android int value - */ - private int getAddressType(String string) { - int type = ContactsContract.CommonDataKinds.StructuredPostal.TYPE_OTHER; - if (string != null) { - if ("work".equals(string.toLowerCase())) { - return ContactsContract.CommonDataKinds.StructuredPostal.TYPE_WORK; - } - else if ("other".equals(string.toLowerCase())) { - return ContactsContract.CommonDataKinds.StructuredPostal.TYPE_OTHER; - } - else if ("home".equals(string.toLowerCase())) { - return ContactsContract.CommonDataKinds.StructuredPostal.TYPE_HOME; - } - } - return type; - } - - /** - * getPhoneType converts an Android phone type into a string - * @param type - * @return phone type as string. - */ - private String getAddressType(int type) { - String stringType; - switch (type) { - case ContactsContract.CommonDataKinds.StructuredPostal.TYPE_HOME: - stringType = "home"; - break; - case ContactsContract.CommonDataKinds.StructuredPostal.TYPE_WORK: - stringType = "work"; - break; - case ContactsContract.CommonDataKinds.StructuredPostal.TYPE_OTHER: - default: - stringType = "other"; - break; - } - return stringType; - } - - /** - * Converts a string from the W3C Contact API to it's Android int value. - * @param string - * @return Android int value - */ - private int getImType(String string) { - int type = ContactsContract.CommonDataKinds.Im.PROTOCOL_CUSTOM; - if (string != null) { - if ("aim".equals(string.toLowerCase())) { - return ContactsContract.CommonDataKinds.Im.PROTOCOL_AIM; - } - else if ("google talk".equals(string.toLowerCase())) { - return ContactsContract.CommonDataKinds.Im.PROTOCOL_GOOGLE_TALK; - } - else if ("icq".equals(string.toLowerCase())) { - return ContactsContract.CommonDataKinds.Im.PROTOCOL_ICQ; - } - else if ("jabber".equals(string.toLowerCase())) { - return ContactsContract.CommonDataKinds.Im.PROTOCOL_JABBER; - } - else if ("msn".equals(string.toLowerCase())) { - return ContactsContract.CommonDataKinds.Im.PROTOCOL_MSN; - } - else if ("netmeeting".equals(string.toLowerCase())) { - return ContactsContract.CommonDataKinds.Im.PROTOCOL_NETMEETING; - } - else if ("qq".equals(string.toLowerCase())) { - return ContactsContract.CommonDataKinds.Im.PROTOCOL_QQ; - } - else if ("skype".equals(string.toLowerCase())) { - return ContactsContract.CommonDataKinds.Im.PROTOCOL_SKYPE; - } - else if ("yahoo".equals(string.toLowerCase())) { - return ContactsContract.CommonDataKinds.Im.PROTOCOL_YAHOO; - } - } - return type; - } - - /** - * getPhoneType converts an Android phone type into a string - * @param type - * @return phone type as string. - */ - @SuppressWarnings("unused") - private String getImType(int type) { - String stringType; - switch (type) { - case ContactsContract.CommonDataKinds.Im.PROTOCOL_AIM: - stringType = "AIM"; - break; - case ContactsContract.CommonDataKinds.Im.PROTOCOL_GOOGLE_TALK: - stringType = "Google Talk"; - break; - case ContactsContract.CommonDataKinds.Im.PROTOCOL_ICQ: - stringType = "ICQ"; - break; - case ContactsContract.CommonDataKinds.Im.PROTOCOL_JABBER: - stringType = "Jabber"; - break; - case ContactsContract.CommonDataKinds.Im.PROTOCOL_MSN: - stringType = "MSN"; - break; - case ContactsContract.CommonDataKinds.Im.PROTOCOL_NETMEETING: - stringType = "NetMeeting"; - break; - case ContactsContract.CommonDataKinds.Im.PROTOCOL_QQ: - stringType = "QQ"; - break; - case ContactsContract.CommonDataKinds.Im.PROTOCOL_SKYPE: - stringType = "Skype"; - break; - case ContactsContract.CommonDataKinds.Im.PROTOCOL_YAHOO: - stringType = "Yahoo"; - break; - default: - stringType = "custom"; - break; - } - return stringType; - } -} - diff --git a/cordova-lib/spec-plugman-install/plugins/Contacts/src/android/ContactManager.java b/cordova-lib/spec-plugman-install/plugins/Contacts/src/android/ContactManager.java deleted file mode 100755 index 1c086e1f3..000000000 --- a/cordova-lib/spec-plugman-install/plugins/Contacts/src/android/ContactManager.java +++ /dev/null @@ -1,122 +0,0 @@ -/* - Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.0 (the - "License"); you may not use this file except in compliance - with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, - software distributed under the License is distributed on an - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - KIND, either express or implied. See the License for the - specific language governing permissions and limitations - under the License. -*/ -package org.apache.cordova.core; - -import org.apache.cordova.CallbackContext; -import org.apache.cordova.CordovaPlugin; -import org.apache.cordova.PluginResult; -import org.json.JSONArray; -import org.json.JSONException; -import org.json.JSONObject; -import android.util.Log; - -public class ContactManager extends CordovaPlugin { - - private ContactAccessor contactAccessor; - private static final String LOG_TAG = "Contact Query"; - - public static final int UNKNOWN_ERROR = 0; - public static final int INVALID_ARGUMENT_ERROR = 1; - public static final int TIMEOUT_ERROR = 2; - public static final int PENDING_OPERATION_ERROR = 3; - public static final int IO_ERROR = 4; - public static final int NOT_SUPPORTED_ERROR = 5; - public static final int PERMISSION_DENIED_ERROR = 20; - - /** - * Constructor. - */ - public ContactManager() { - } - - /** - * Executes the request and returns PluginResult. - * - * @param action The action to execute. - * @param args JSONArray of arguments for the plugin. - * @param callbackContext The callback context used when calling back into JavaScript. - * @return True if the action was valid, false otherwise. - */ - public boolean execute(String action, JSONArray args, final CallbackContext callbackContext) throws JSONException { - /** - * Check to see if we are on an Android 1.X device. If we are return an error as we - * do not support this as of Cordova 1.0. - */ - if (android.os.Build.VERSION.RELEASE.startsWith("1.")) { - callbackContext.sendPluginResult(new PluginResult(PluginResult.Status.ERROR, ContactManager.NOT_SUPPORTED_ERROR)); - return true; - } - - /** - * Only create the contactAccessor after we check the Android version or the program will crash - * older phones. - */ - if (this.contactAccessor == null) { - this.contactAccessor = new ContactAccessorSdk5(this.webView, this.cordova); - } - - if (action.equals("search")) { - final JSONArray filter = args.getJSONArray(0); - final JSONObject options = args.getJSONObject(1); - this.cordova.getThreadPool().execute(new Runnable() { - public void run() { - JSONArray res = contactAccessor.search(filter, options); - callbackContext.success(res); - } - }); - } - else if (action.equals("save")) { - final JSONObject contact = args.getJSONObject(0); - this.cordova.getThreadPool().execute(new Runnable() { - public void run() { - JSONObject res = null; - String id = contactAccessor.save(contact); - if (id != null) { - try { - res = contactAccessor.getContactById(id); - } catch (JSONException e) { - Log.e(LOG_TAG, "JSON fail.", e); - } - } - if (res != null) { - callbackContext.success(res); - } else { - callbackContext.sendPluginResult(new PluginResult(PluginResult.Status.ERROR, UNKNOWN_ERROR)); - } - } - }); - } - else if (action.equals("remove")) { - final String contactId = args.getString(0); - this.cordova.getThreadPool().execute(new Runnable() { - public void run() { - if (contactAccessor.remove(contactId)) { - callbackContext.success(); - } else { - callbackContext.sendPluginResult(new PluginResult(PluginResult.Status.ERROR, UNKNOWN_ERROR)); - } - } - }); - } - else { - return false; - } - return true; - } -} diff --git a/cordova-lib/spec-plugman-install/plugins/Contacts/src/blackberry10/ContactActivity.js b/cordova-lib/spec-plugman-install/plugins/Contacts/src/blackberry10/ContactActivity.js deleted file mode 100644 index f0f82b362..000000000 --- a/cordova-lib/spec-plugman-install/plugins/Contacts/src/blackberry10/ContactActivity.js +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright 2012 Research In Motion Limited. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -var ContactActivity = function (args) { - this.direction = args.direction || null; - this.description = args.description || ""; - this.mimeType = args.mimeType || ""; - this.timestamp = new Date(parseInt(args.timestamp, 10)) || null; -}; - -Object.defineProperty(ContactActivity, "INCOMING", {"value": true}); -Object.defineProperty(ContactActivity, "OUTGOING", {"value": false}); - -module.exports = ContactActivity; diff --git a/cordova-lib/spec-plugman-install/plugins/Contacts/src/blackberry10/ContactAddress.js b/cordova-lib/spec-plugman-install/plugins/Contacts/src/blackberry10/ContactAddress.js deleted file mode 100644 index 1ba9fe40a..000000000 --- a/cordova-lib/spec-plugman-install/plugins/Contacts/src/blackberry10/ContactAddress.js +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright 2012 Research In Motion Limited. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -var ContactAddress = function (properties) { - this.type = properties && properties.type ? properties.type : ""; - this.streetAddress = properties && properties.streetAddress ? properties.streetAddress : ""; - this.streetOther = properties && properties.streetOther ? properties.streetOther : ""; - this.locality = properties && properties.locality ? properties.locality : ""; - this.region = properties && properties.region ? properties.region : ""; - this.postalCode = properties && properties.postalCode ? properties.postalCode : ""; - this.country = properties && properties.country ? properties.country : ""; -}; - -Object.defineProperty(ContactAddress, "HOME", {"value": "home"}); -Object.defineProperty(ContactAddress, "WORK", {"value": "work"}); -Object.defineProperty(ContactAddress, "OTHER", {"value": "other"}); - -module.exports = ContactAddress; diff --git a/cordova-lib/spec-plugman-install/plugins/Contacts/src/blackberry10/ContactError.js b/cordova-lib/spec-plugman-install/plugins/Contacts/src/blackberry10/ContactError.js deleted file mode 100644 index f20f85e45..000000000 --- a/cordova-lib/spec-plugman-install/plugins/Contacts/src/blackberry10/ContactError.js +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright 2012 Research In Motion Limited. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -var ContactError = function (code, msg) { - this.code = code; - this.message = msg; -}; - -Object.defineProperty(ContactError, "UNKNOWN_ERROR", { "value": 0 }); -Object.defineProperty(ContactError, "INVALID_ARGUMENT_ERROR", { "value": 1 }); -Object.defineProperty(ContactError, "TIMEOUT_ERROR", { "value": 2 }); -Object.defineProperty(ContactError, "PENDING_OPERATION_ERROR", { "value": 3 }); -Object.defineProperty(ContactError, "IO_ERROR", { "value": 4 }); -Object.defineProperty(ContactError, "NOT_SUPPORTED_ERROR", { "value": 5 }); -Object.defineProperty(ContactError, "PERMISSION_DENIED_ERROR", { "value": 20 }); - -module.exports = ContactError; - diff --git a/cordova-lib/spec-plugman-install/plugins/Contacts/src/blackberry10/ContactField.js b/cordova-lib/spec-plugman-install/plugins/Contacts/src/blackberry10/ContactField.js deleted file mode 100644 index aad735c14..000000000 --- a/cordova-lib/spec-plugman-install/plugins/Contacts/src/blackberry10/ContactField.js +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Copyright 2012 Research In Motion Limited. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -var ContactField = function (type, value) { - this.type = type || ""; - this.value = value || ""; -}; - -Object.defineProperty(ContactField, "HOME", {"value": "home"}); -Object.defineProperty(ContactField, "WORK", {"value": "work"}); -Object.defineProperty(ContactField, "OTHER", {"value": "other"}); -Object.defineProperty(ContactField, "MOBILE", {"value": "mobile"}); -Object.defineProperty(ContactField, "DIRECT", {"value": "direct"}); - -module.exports = ContactField; diff --git a/cordova-lib/spec-plugman-install/plugins/Contacts/src/blackberry10/ContactFindOptions.js b/cordova-lib/spec-plugman-install/plugins/Contacts/src/blackberry10/ContactFindOptions.js deleted file mode 100644 index 8be830ddf..000000000 --- a/cordova-lib/spec-plugman-install/plugins/Contacts/src/blackberry10/ContactFindOptions.js +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright 2012 Research In Motion Limited. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * ContactFindOptions. - * @constructor - * @param filter search fields - * @param sort sort fields and order - * @param limit max number of contacts to return - * @param favorite if set, only favorite contacts will be returned - */ - -var ContactFindOptions = function (filter, sort, limit, favorite) { - this.filter = filter || null; - this.sort = sort || null; - this.limit = limit || -1; // -1 for returning all results - this.favorite = favorite || false; - this.includeAccounts = []; - this.excludeAccounts = []; -}; - -Object.defineProperty(ContactFindOptions, "SEARCH_FIELD_GIVEN_NAME", { "value": 0 }); -Object.defineProperty(ContactFindOptions, "SEARCH_FIELD_FAMILY_NAME", { "value": 1 }); -Object.defineProperty(ContactFindOptions, "SEARCH_FIELD_ORGANIZATION_NAME", { "value": 2 }); -Object.defineProperty(ContactFindOptions, "SEARCH_FIELD_PHONE", { "value": 3 }); -Object.defineProperty(ContactFindOptions, "SEARCH_FIELD_EMAIL", { "value": 4 }); -Object.defineProperty(ContactFindOptions, "SEARCH_FIELD_BBMPIN", { "value": 5 }); -Object.defineProperty(ContactFindOptions, "SEARCH_FIELD_LINKEDIN", { "value": 6 }); -Object.defineProperty(ContactFindOptions, "SEARCH_FIELD_TWITTER", { "value": 7 }); -Object.defineProperty(ContactFindOptions, "SEARCH_FIELD_VIDEO_CHAT", { "value": 8 }); - -Object.defineProperty(ContactFindOptions, "SORT_FIELD_GIVEN_NAME", { "value": 0 }); -Object.defineProperty(ContactFindOptions, "SORT_FIELD_FAMILY_NAME", { "value": 1 }); -Object.defineProperty(ContactFindOptions, "SORT_FIELD_ORGANIZATION_NAME", { "value": 2 }); - -module.exports = ContactFindOptions; - diff --git a/cordova-lib/spec-plugman-install/plugins/Contacts/src/blackberry10/ContactName.js b/cordova-lib/spec-plugman-install/plugins/Contacts/src/blackberry10/ContactName.js deleted file mode 100644 index 9b7475347..000000000 --- a/cordova-lib/spec-plugman-install/plugins/Contacts/src/blackberry10/ContactName.js +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright 2012 Research In Motion Limited. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -function toFormattedName(properties) { - var formatted = ""; - if (properties && properties.givenName) { - formatted = properties.givenName; - if (properties && properties.familyName) { - formatted += " " + properties.familyName; - } - } - return formatted; -} - -var ContactName = function (properties) { - this.familyName = properties && properties.familyName ? properties.familyName : ""; - this.givenName = properties && properties.givenName ? properties.givenName : ""; - this.formatted = toFormattedName(properties); - this.middleName = properties && properties.middleName ? properties.middleName : ""; - this.honorificPrefix = properties && properties.honorificPrefix ? properties.honorificPrefix : ""; - this.honorificSuffix = properties && properties.honorificSuffix ? properties.honorificSuffix : ""; - this.phoneticFamilyName = properties && properties.phoneticFamilyName ? properties.phoneticFamilyName : ""; - this.phoneticGivenName = properties && properties.phoneticGivenName ? properties.phoneticGivenName : ""; -}; - -module.exports = ContactName; diff --git a/cordova-lib/spec-plugman-install/plugins/Contacts/src/blackberry10/ContactNews.js b/cordova-lib/spec-plugman-install/plugins/Contacts/src/blackberry10/ContactNews.js deleted file mode 100644 index 9fb86dcda..000000000 --- a/cordova-lib/spec-plugman-install/plugins/Contacts/src/blackberry10/ContactNews.js +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright 2012 Research In Motion Limited. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -var ContactNews = function (args) { - this.title = args.title || ""; - this.body = args.body || ""; - this.articleSource = args.articleSource || ""; - this.companies = args.companies || []; - this.publishedAt = new Date(parseInt(args.publishedAt, 10)) || null; - this.uri = args.uri || ""; - this.type = args.type || ""; -}; - -module.exports = ContactNews; diff --git a/cordova-lib/spec-plugman-install/plugins/Contacts/src/blackberry10/ContactOrganization.js b/cordova-lib/spec-plugman-install/plugins/Contacts/src/blackberry10/ContactOrganization.js deleted file mode 100644 index 987310f7c..000000000 --- a/cordova-lib/spec-plugman-install/plugins/Contacts/src/blackberry10/ContactOrganization.js +++ /dev/null @@ -1,22 +0,0 @@ -/* - * Copyright 2012 Research In Motion Limited. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -var ContactOrganization = function (properties) { - this.name = properties && properties.name ? properties.name : ""; - this.department = properties && properties.department ? properties.department : ""; - this.title = properties && properties.title ? properties.title : ""; -}; - -module.exports = ContactOrganization; diff --git a/cordova-lib/spec-plugman-install/plugins/Contacts/src/blackberry10/ContactPhoto.js b/cordova-lib/spec-plugman-install/plugins/Contacts/src/blackberry10/ContactPhoto.js deleted file mode 100644 index eeaa2632e..000000000 --- a/cordova-lib/spec-plugman-install/plugins/Contacts/src/blackberry10/ContactPhoto.js +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright 2012 Research In Motion Limited. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -var ContactPhoto = function (originalFilePath, pref) { - this.originalFilePath = originalFilePath || ""; - this.pref = pref || false; - this.largeFilePath = ""; - this.smallFilePath = ""; -}; - -module.exports = ContactPhoto; diff --git a/cordova-lib/spec-plugman-install/plugins/Contacts/src/blackberry10/contactConsts.js b/cordova-lib/spec-plugman-install/plugins/Contacts/src/blackberry10/contactConsts.js deleted file mode 100644 index ef2520620..000000000 --- a/cordova-lib/spec-plugman-install/plugins/Contacts/src/blackberry10/contactConsts.js +++ /dev/null @@ -1,225 +0,0 @@ -/* -* Copyright 2012 Research In Motion Limited. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -var ATTRIBUTE_KIND, - ATTRIBUTE_SUBKIND, - kindAttributeMap = {}, - subKindAttributeMap = {}, - _TITLE = 26, - _START_DATE = 43, - _END_DATE = 44; - -function populateKindAttributeMap() { - ATTRIBUTE_KIND = { - Invalid: 0, - Phone: 1, - Fax: 2, - Pager: 3, - Email: 4, - Website: 5, - Feed: 6, - Profile: 7, - Family: 8, - Person: 9, - Date: 10, - Group: 11, - Name: 12, - StockSymbol: 13, - Ranking: 14, - OrganizationAffiliation: 15, - Education: 16, - Note: 17, - InstantMessaging: 18, - VideoChat: 19, - ConnectionCount: 20, - Hidden: 21, - Biography: 22, - Sound: 23, - Notification: 24, - MessageSound: 25, - MessageNotification: 26 - }; - - kindAttributeMap[ATTRIBUTE_KIND.Phone] = "phoneNumbers"; - kindAttributeMap[ATTRIBUTE_KIND.Fax] = "faxNumbers"; - kindAttributeMap[ATTRIBUTE_KIND.Pager] = "pagerNumber"; - kindAttributeMap[ATTRIBUTE_KIND.Email] = "emails"; - kindAttributeMap[ATTRIBUTE_KIND.Website] = "urls"; - kindAttributeMap[ATTRIBUTE_KIND.Profile] = "socialNetworks"; - kindAttributeMap[ATTRIBUTE_KIND.OrganizationAffiliation] = "organizations"; - kindAttributeMap[ATTRIBUTE_KIND.Education] = "education"; - kindAttributeMap[ATTRIBUTE_KIND.Note] = "note"; - kindAttributeMap[ATTRIBUTE_KIND.InstantMessaging] = "ims"; - kindAttributeMap[ATTRIBUTE_KIND.VideoChat] = "videoChat"; - kindAttributeMap[ATTRIBUTE_KIND.Sound] = "ringtone"; -} - -function populateSubKindAttributeMap() { - ATTRIBUTE_SUBKIND = { - Invalid: 0, - Other: 1, - Home: 2, - Work: 3, - PhoneMobile: 4, - FaxDirect: 5, - Blog: 6, - WebsiteResume: 7, - WebsitePortfolio: 8, - WebsitePersonal: 9, - WebsiteCompany: 10, - ProfileFacebook: 11, - ProfileTwitter: 12, - ProfileLinkedIn: 13, - ProfileGist: 14, - ProfileTungle: 15, - FamilySpouse: 16, - FamilyChild: 17, - FamilyParent: 18, - PersonManager: 19, - PersonAssistant: 20, - DateBirthday: 21, - DateAnniversary: 22, - GroupDepartment: 23, - NameGiven: 24, - NameSurname: 25, - Title: _TITLE, - NameSuffix: 27, - NameMiddle: 28, - NameNickname: 29, - NameAlias: 30, - NameDisplayName: 31, - NamePhoneticGiven: 32, - NamePhoneticSurname: 33, - StockSymbolNyse: 34, - StockSymbolNasdaq: 35, - StockSymbolTse: 36, - StockSymbolLse: 37, - StockSymbolTsx: 38, - RankingKlout: 39, - RankingTrstRank: 40, - OrganizationAffiliationName: 41, - OrganizationAffiliationPhoneticName: 42, - OrganizationAffiliationTitle: _TITLE, - StartDate: _START_DATE, - EndDate: _END_DATE, - OrganizationAffiliationDetails: 45, - EducationInstitutionName: 46, - EducationStartDate: _START_DATE, - EducationEndDate: _END_DATE, - EducationDegree: 47, - EducationConcentration: 48, - EducationActivities: 49, - EducationNotes: 50, - InstantMessagingBbmPin: 51, - InstantMessagingAim: 52, - InstantMessagingAliwangwang: 53, - InstantMessagingGoogleTalk: 54, - InstantMessagingSametime: 55, - InstantMessagingIcq: 56, - InstantMessagingIrc: 57, - InstantMessagingJabber: 58, - InstantMessagingMsLcs: 59, - InstantMessagingMsn: 60, - InstantMessagingQq: 61, - InstantMessagingSkype: 62, - InstantMessagingYahooMessenger: 63, - InstantMessagingYahooMessengerJapan: 64, - VideoChatBbPlaybook: 65, - HiddenLinkedIn: 66, - HiddenFacebook: 67, - HiddenTwitter: 68, - ConnectionCountLinkedIn: 69, - ConnectionCountFacebook: 70, - ConnectionCountTwitter: 71, - HiddenChecksum: 72, - HiddenSpeedDial: 73, - BiographyFacebook: 74, - BiographyTwitter: 75, - BiographyLinkedIn: 76, - SoundRingtone: 77, - SimContactType: 78, - EcoID: 79, - Personal: 80, - StockSymbolAll: 81, - NotificationVibration: 82, - NotificationLED: 83, - MessageNotificationVibration: 84, - MessageNotificationLED: 85, - MessageNotificationDuringCall: 86, - VideoChatPin: 87 - }; - - subKindAttributeMap[ATTRIBUTE_SUBKIND.Other] = "other"; - subKindAttributeMap[ATTRIBUTE_SUBKIND.Home] = "home"; - subKindAttributeMap[ATTRIBUTE_SUBKIND.Work] = "work"; - subKindAttributeMap[ATTRIBUTE_SUBKIND.PhoneMobile] = "mobile"; - subKindAttributeMap[ATTRIBUTE_SUBKIND.FaxDirect] = "direct"; - subKindAttributeMap[ATTRIBUTE_SUBKIND.Blog] = "blog"; - subKindAttributeMap[ATTRIBUTE_SUBKIND.WebsiteResume] = "resume"; - subKindAttributeMap[ATTRIBUTE_SUBKIND.WebsitePortfolio] = "portfolio"; - subKindAttributeMap[ATTRIBUTE_SUBKIND.WebsitePersonal] = "personal"; - subKindAttributeMap[ATTRIBUTE_SUBKIND.WebsiteCompany] = "company"; - subKindAttributeMap[ATTRIBUTE_SUBKIND.ProfileFacebook] = "facebook"; - subKindAttributeMap[ATTRIBUTE_SUBKIND.ProfileTwitter] = "twitter"; - subKindAttributeMap[ATTRIBUTE_SUBKIND.ProfileLinkedIn] = "linkedin"; - subKindAttributeMap[ATTRIBUTE_SUBKIND.ProfileGist] = "gist"; - subKindAttributeMap[ATTRIBUTE_SUBKIND.ProfileTungle] = "tungle"; - subKindAttributeMap[ATTRIBUTE_SUBKIND.DateBirthday] = "birthday"; - subKindAttributeMap[ATTRIBUTE_SUBKIND.DateAnniversary] = "anniversary"; - subKindAttributeMap[ATTRIBUTE_SUBKIND.NameGiven] = "givenName"; - subKindAttributeMap[ATTRIBUTE_SUBKIND.NameSurname] = "familyName"; - subKindAttributeMap[ATTRIBUTE_SUBKIND.Title] = "honorificPrefix"; - subKindAttributeMap[ATTRIBUTE_SUBKIND.NameSuffix] = "honorificSuffix"; - subKindAttributeMap[ATTRIBUTE_SUBKIND.NameMiddle] = "middleName"; - subKindAttributeMap[ATTRIBUTE_SUBKIND.NamePhoneticGiven] = "phoneticGivenName"; - subKindAttributeMap[ATTRIBUTE_SUBKIND.NamePhoneticSurname] = "phoneticFamilyName"; - subKindAttributeMap[ATTRIBUTE_SUBKIND.NameNickname] = "nickname"; - subKindAttributeMap[ATTRIBUTE_SUBKIND.NameDisplayName] = "displayName"; - subKindAttributeMap[ATTRIBUTE_SUBKIND.OrganizationAffiliationName] = "name"; - subKindAttributeMap[ATTRIBUTE_SUBKIND.OrganizationAffiliationDetails] = "department"; - subKindAttributeMap[ATTRIBUTE_SUBKIND.Title] = "title"; - subKindAttributeMap[ATTRIBUTE_SUBKIND.InstantMessagingBbmPin] = "BbmPin"; - subKindAttributeMap[ATTRIBUTE_SUBKIND.InstantMessagingAim] = "Aim"; - subKindAttributeMap[ATTRIBUTE_SUBKIND.InstantMessagingAliwangwang] = "Aliwangwang"; - subKindAttributeMap[ATTRIBUTE_SUBKIND.InstantMessagingGoogleTalk] = "GoogleTalk"; - subKindAttributeMap[ATTRIBUTE_SUBKIND.InstantMessagingSametime] = "Sametime"; - subKindAttributeMap[ATTRIBUTE_SUBKIND.InstantMessagingIcq] = "Icq"; - subKindAttributeMap[ATTRIBUTE_SUBKIND.InstantMessagingJabber] = "Jabber"; - subKindAttributeMap[ATTRIBUTE_SUBKIND.InstantMessagingMsLcs] = "MsLcs"; - subKindAttributeMap[ATTRIBUTE_SUBKIND.InstantMessagingSkype] = "Skype"; - subKindAttributeMap[ATTRIBUTE_SUBKIND.InstantMessagingYahooMessenger] = "YahooMessenger"; - subKindAttributeMap[ATTRIBUTE_SUBKIND.InstantMessagingYahooMessengerJapan] = "YahooMessegerJapan"; - subKindAttributeMap[ATTRIBUTE_SUBKIND.VideoChatBbPlaybook] = "BbPlaybook"; - subKindAttributeMap[ATTRIBUTE_SUBKIND.SoundRingtone] = "ringtone"; - subKindAttributeMap[ATTRIBUTE_SUBKIND.Personal] = "personal"; -} - -module.exports = { - getKindAttributeMap: function () { - if (!ATTRIBUTE_KIND) { - populateKindAttributeMap(); - } - - return kindAttributeMap; - }, - getSubKindAttributeMap: function () { - if (!ATTRIBUTE_SUBKIND) { - populateSubKindAttributeMap(); - } - - return subKindAttributeMap; - } -}; diff --git a/cordova-lib/spec-plugman-install/plugins/Contacts/src/blackberry10/contactUtils.js b/cordova-lib/spec-plugman-install/plugins/Contacts/src/blackberry10/contactUtils.js deleted file mode 100644 index cd022c4fa..000000000 --- a/cordova-lib/spec-plugman-install/plugins/Contacts/src/blackberry10/contactUtils.js +++ /dev/null @@ -1,223 +0,0 @@ -/* - * Copyright 2012 Research In Motion Limited. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -var self, - ContactFindOptions = require("./ContactFindOptions"), - ContactError = require("./ContactError"), - ContactName = require("./ContactName"), - ContactOrganization = require("./ContactOrganization"), - ContactAddress = require("./ContactAddress"), - ContactField = require("./ContactField"), - contactConsts = require("./contactConsts"), - ContactPhoto = require("./ContactPhoto"), - ContactNews = require("./ContactNews"), - ContactActivity = require("./ContactActivity"); - -function populateFieldArray(contactProps, field, ClassName) { - if (contactProps[field]) { - var list = [], - obj; - - contactProps[field].forEach(function (args) { - if (ClassName === ContactField) { - list.push(new ClassName(args.type, args.value)); - } else if (ClassName === ContactPhoto) { - obj = new ContactPhoto(args.originalFilePath, args.pref); - obj.largeFilePath = args.largeFilePath; - obj.smallFilePath = args.smallFilePath; - list.push(obj); - } else if (ClassName === ContactNews) { - obj = new ContactNews(args); - list.push(obj); - } else if (ClassName === ContactActivity) { - obj = new ContactActivity(args); - list.push(obj); - } else { - list.push(new ClassName(args)); - } - }); - contactProps[field] = list; - } -} - -function populateDate(contactProps, field) { - if (contactProps[field]) { - contactProps[field] = new Date(contactProps[field]); - } -} - -function validateFindArguments(findOptions) { - var error = false; - - // findOptions is mandatory - if (!findOptions) { - error = true; - } else { - // findOptions.filter is optional - if (findOptions.filter) { - findOptions.filter.forEach(function (f) { - switch (f.fieldName) { - case ContactFindOptions.SEARCH_FIELD_GIVEN_NAME: - case ContactFindOptions.SEARCH_FIELD_FAMILY_NAME: - case ContactFindOptions.SEARCH_FIELD_ORGANIZATION_NAME: - case ContactFindOptions.SEARCH_FIELD_PHONE: - case ContactFindOptions.SEARCH_FIELD_EMAIL: - case ContactFindOptions.SEARCH_FIELD_BBMPIN: - case ContactFindOptions.SEARCH_FIELD_LINKEDIN: - case ContactFindOptions.SEARCH_FIELD_TWITTER: - case ContactFindOptions.SEARCH_FIELD_VIDEO_CHAT: - break; - default: - error = true; - } - - if (!f.fieldValue) { - error = true; - } - }); - } - - //findOptions.limit is optional - if (findOptions.limit) { - if (typeof findOptions.limit !== "number") { - error = true; - } - } - - //findOptions.favorite is optional - if (findOptions.favorite) { - if (typeof findOptions.favorite !== "boolean") { - error = true; - } - } - - // findOptions.sort is optional - if (!error && findOptions.sort && Array.isArray(findOptions.sort)) { - findOptions.sort.forEach(function (s) { - switch (s.fieldName) { - case ContactFindOptions.SORT_FIELD_GIVEN_NAME: - case ContactFindOptions.SORT_FIELD_FAMILY_NAME: - case ContactFindOptions.SORT_FIELD_ORGANIZATION_NAME: - break; - default: - error = true; - } - - if (s.desc === undefined || typeof s.desc !== "boolean") { - error = true; - } - }); - } - - if (!error && findOptions.includeAccounts) { - if (!Array.isArray(findOptions.includeAccounts)) { - error = true; - } else { - findOptions.includeAccounts.forEach(function (acct) { - if (!error && (!acct.id || window.isNaN(window.parseInt(acct.id, 10)))) { - error = true; - } - }); - } - } - - if (!error && findOptions.excludeAccounts) { - if (!Array.isArray(findOptions.excludeAccounts)) { - error = true; - } else { - findOptions.excludeAccounts.forEach(function (acct) { - if (!error && (!acct.id || window.isNaN(window.parseInt(acct.id, 10)))) { - error = true; - } - }); - } - } - } - return !error; -} - -function validateContactsPickerFilter(filter) { - var isValid = true, - availableFields = {}; - - if (typeof(filter) === "undefined") { - isValid = false; - } else { - if (filter && Array.isArray(filter)) { - availableFields = contactConsts.getKindAttributeMap(); - filter.forEach(function (e) { - isValid = isValid && Object.getOwnPropertyNames(availableFields).reduce( - function (found, key) { - return found || availableFields[key] === e; - }, false); - }); - } - } - - return isValid; -} - -function validateContactsPickerOptions(options) { - var isValid = false, - mode = options.mode; - - if (typeof(options) === "undefined") { - isValid = false; - } else { - isValid = mode === ContactPickerOptions.MODE_SINGLE || mode === ContactPickerOptions.MODE_MULTIPLE || mode === ContactPickerOptions.MODE_ATTRIBUTE; - - // if mode is attribute, fields must be defined - if (mode === ContactPickerOptions.MODE_ATTRIBUTE && !validateContactsPickerFilter(options.fields)) { - isValid = false; - } - } - - return isValid; -} - -self = module.exports = { - populateContact: function (contact) { - if (contact.name) { - contact.name = new ContactName(contact.name); - } - - populateFieldArray(contact, "addresses", ContactAddress); - populateFieldArray(contact, "organizations", ContactOrganization); - populateFieldArray(contact, "emails", ContactField); - populateFieldArray(contact, "phoneNumbers", ContactField); - populateFieldArray(contact, "faxNumbers", ContactField); - populateFieldArray(contact, "pagerNumbers", ContactField); - populateFieldArray(contact, "ims", ContactField); - populateFieldArray(contact, "socialNetworks", ContactField); - populateFieldArray(contact, "urls", ContactField); - populateFieldArray(contact, "photos", ContactPhoto); - populateFieldArray(contact, "news", ContactNews); - populateFieldArray(contact, "activities", ContactActivity); - // TODO categories - - populateDate(contact, "birthday"); - populateDate(contact, "anniversary"); - }, - invokeErrorCallback: function (errorCallback, code) { - if (errorCallback) { - errorCallback(new ContactError(code)); - } - }, - validateFindArguments: validateFindArguments, - validateContactsPickerFilter: validateContactsPickerFilter, - validateContactsPickerOptions: validateContactsPickerOptions -}; - diff --git a/cordova-lib/spec-plugman-install/plugins/Contacts/src/blackberry10/index.js b/cordova-lib/spec-plugman-install/plugins/Contacts/src/blackberry10/index.js deleted file mode 100644 index 09a4bd2a5..000000000 --- a/cordova-lib/spec-plugman-install/plugins/Contacts/src/blackberry10/index.js +++ /dev/null @@ -1,374 +0,0 @@ -/* - * Copyright 2013 Research In Motion Limited. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -var pimContacts, - contactUtils = require("./contactUtils"), - contactConsts = require("./contactConsts"), - ContactError = require("./ContactError"), - ContactName = require("./ContactName"), - ContactFindOptions = require("./ContactFindOptions"), - noop = function () {}; - -function getAccountFilters(options) { - if (options.includeAccounts) { - options.includeAccounts = options.includeAccounts.map(function (acct) { - return acct.id.toString(); - }); - } - - if (options.excludeAccounts) { - options.excludeAccounts = options.excludeAccounts.map(function (acct) { - return acct.id.toString(); - }); - } -} - -function populateSearchFields(fields) { - var i, - l, - key, - searchFieldsObject = {}, - searchFields = []; - - for (i = 0, l = fields.length; i < l; i++) { - if (fields[i] === "*") { - searchFieldsObject[ContactFindOptions.SEARCH_FIELD_GIVEN_NAME] = true; - searchFieldsObject[ContactFindOptions.SEARCH_FIELD_FAMILY_NAME] = true; - searchFieldsObject[ContactFindOptions.SEARCH_FIELD_PHONE] = true; - searchFieldsObject[ContactFindOptions.SEARCH_FIELD_EMAIL] = true; - searchFieldsObject[ContactFindOptions.SEARCH_FIELD_ORGANIZATION_NAME] = true; - } else if (fields[i] === "displayName" || fields[i] === "name") { - searchFieldsObject[ContactFindOptions.SEARCH_FIELD_GIVEN_NAME] = true; - searchFieldsObject[ContactFindOptions.SEARCH_FIELD_FAMILY_NAME] = true; - } else if (fields[i] === "nickname") { - // not supported by Cascades - } else if (fields[i] === "phoneNumbers") { - searchFieldsObject[ContactFindOptions.SEARCH_FIELD_PHONE] = true; - } else if (fields[i] === "emails") { - searchFieldsObject[ContactFindOptions.SEARCH_FIELD_EMAIL] = true; - } else if (field === "addresses") { - // not supported by Cascades - } else if (field === "ims") { - // not supported by Cascades - } else if (field === "organizations") { - searchFieldsObject[ContactFindOptions.SEARCH_FIELD_ORGANIZATION_NAME] = true; - } else if (field === "birthday") { - // not supported by Cascades - } else if (field === "note") { - // not supported by Cascades - } else if (field === "photos") { - // not supported by Cascades - } else if (field === "categories") { - // not supported by Cascades - } else if (field === "urls") { - // not supported by Cascades - } - } - - for (key in searchFieldsObject) { - if (searchFieldsObject.hasOwnProperty(key)) { - searchFields.push(window.parseInt(key)); - } - } - - return searchFields; -} - -function convertBirthday(birthday) { - //Convert date string from native to milliseconds since epoch for cordova-js - var birthdayInfo; - if (birthday) { - birthdayInfo = birthday.split("-"); - return new Date(birthdayInfo[0], birthdayInfo[1] - 1, birthdayInfo[2]).getTime(); - } else { - return null; - } -} - -function processJnextSaveData(result, JnextData) { - var data = JnextData, - birthdayInfo; - - if (data._success === true) { - data.birthday = convertBirthday(data.birthday); - result.callbackOk(data, false); - } else { - result.callbackError(data.code, false); - } -} - -function processJnextRemoveData(result, JnextData) { - var data = JnextData; - - if (data._success === true) { - result.callbackOk(data); - } else { - result.callbackError(ContactError.UNKNOWN_ERROR, false); - } -} - -function processJnextFindData(eventId, eventHandler, JnextData) { - var data = JnextData, - i, - l, - more = false, - resultsObject = {}, - birthdayInfo; - - if (data.contacts) { - for (i = 0, l = data.contacts.length; i < l; i++) { - data.contacts[i].birthday = convertBirthday(data.contacts[i].birthday); - data.contacts[i].name = new ContactName(data.contacts[i].name); - } - } else { - data.contacts = []; // if JnextData.contacts return null, return an empty array - } - - if (data._success === true) { - eventHandler.error = false; - } - - if (eventHandler.multiple) { - // Concatenate results; do not add the same contacts - for (i = 0, l = eventHandler.searchResult.length; i < l; i++) { - resultsObject[eventHandler.searchResult[i].id] = true; - } - - for (i = 0, l = data.contacts.length; i < l; i++) { - if (resultsObject[data.contacts[i].id]) { - // Already existing - } else { - eventHandler.searchResult.push(data.contacts[i]); - } - } - - // check if more search is required - eventHandler.searchFieldIndex++; - if (eventHandler.searchFieldIndex < eventHandler.searchFields.length) { - more = true; - } - } else { - eventHandler.searchResult = data.contacts; - } - - if (more) { - pimContacts.getInstance().invokeJnextSearch(eventId); - } else { - if (eventHandler.error) { - eventHandler.result.callbackError(data.code, false); - } else { - eventHandler.result.callbackOk(eventHandler.searchResult, false); - } - } -} - -module.exports = { - search: function (successCb, failCb, args, env) { - var cordovaFindOptions = {}, - result = new PluginResult(args, env), - key; - - for (key in args) { - if (args.hasOwnProperty(key)) { - cordovaFindOptions[key] = JSON.parse(decodeURIComponent(args[key])); - } - } - - pimContacts.getInstance().find(cordovaFindOptions, result, processJnextFindData); - result.noResult(true); - }, - save: function (successCb, failCb, args, env) { - var attributes = {}, - result = new PluginResult(args, env), - key, - nativeEmails = []; - - attributes = JSON.parse(decodeURIComponent(args[0])); - - //convert birthday format for our native .so file - if (attributes.birthday) { - attributes.birthday = new Date(attributes.birthday).toDateString(); - } - - if (attributes.emails) { - attributes.emails.forEach(function (email) { - if (email.value) { - if (email.type) { - nativeEmails.push({ "type" : email.type, "value" : email.value }); - } else { - nativeEmails.push({ "type" : "home", "value" : email.value }); - } - } - }); - attributes.emails = nativeEmails; - } - - if (attributes.id !== null) { - attributes.id = window.parseInt(attributes.id); - } - - attributes._eventId = result.callbackId; - pimContacts.getInstance().save(attributes, result, processJnextSaveData); - result.noResult(true); - }, - remove: function (successCb, failCb, args, env) { - var result = new PluginResult(args, env), - attributes = { - "contactId": window.parseInt(JSON.parse(decodeURIComponent(args[0]))), - "_eventId": result.callbackId - }; - - if (!window.isNaN(attributes.contactId)) { - pimContacts.getInstance().remove(attributes, result, processJnextRemoveData); - result.noResult(true); - } else { - result.error(ContactError.UNKNOWN_ERROR); - result.noResult(false); - } - } -}; - -/////////////////////////////////////////////////////////////////// -// JavaScript wrapper for JNEXT plugin -/////////////////////////////////////////////////////////////////// - -JNEXT.PimContacts = function () -{ - var self = this, - hasInstance = false; - - self.find = function (cordovaFindOptions, pluginResult, handler) { - //register find eventHandler for when JNEXT onEvent fires - self.eventHandlers[cordovaFindOptions.callbackId] = { - "result" : pluginResult, - "action" : "find", - "multiple" : cordovaFindOptions[1].filter ? true : false, - "fields" : cordovaFindOptions[0], - "searchFilter" : cordovaFindOptions[1].filter, - "searchFields" : cordovaFindOptions[1].filter ? populateSearchFields(cordovaFindOptions[0]) : null, - "searchFieldIndex" : 0, - "searchResult" : [], - "handler" : handler, - "error" : true - }; - - self.invokeJnextSearch(cordovaFindOptions.callbackId); - return ""; - }; - - self.invokeJnextSearch = function(eventId) { - var jnextArgs = {}, - findHandler = self.eventHandlers[eventId]; - - jnextArgs._eventId = eventId; - jnextArgs.fields = findHandler.fields; - jnextArgs.options = {}; - jnextArgs.options.filter = []; - - if (findHandler.multiple) { - jnextArgs.options.filter.push({ - "fieldName" : findHandler.searchFields[findHandler.searchFieldIndex], - "fieldValue" : findHandler.searchFilter - }); - //findHandler.searchFieldIndex++; - } - - JNEXT.invoke(self.m_id, "find " + JSON.stringify(jnextArgs)); - } - - self.getContact = function (args) { - return JSON.parse(JNEXT.invoke(self.m_id, "getContact " + JSON.stringify(args))); - }; - - self.save = function (args, pluginResult, handler) { - //register save eventHandler for when JNEXT onEvent fires - self.eventHandlers[args._eventId] = { - "result" : pluginResult, - "action" : "save", - "handler" : handler - }; - JNEXT.invoke(self.m_id, "save " + JSON.stringify(args)); - return ""; - }; - - self.remove = function (args, pluginResult, handler) { - //register remove eventHandler for when JNEXT onEvent fires - self.eventHandlers[args._eventId] = { - "result" : pluginResult, - "action" : "remove", - "handler" : handler - }; - JNEXT.invoke(self.m_id, "remove " + JSON.stringify(args)); - return ""; - }; - - self.getId = function () { - return self.m_id; - }; - - self.getContactAccounts = function () { - var value = JNEXT.invoke(self.m_id, "getContactAccounts"); - return JSON.parse(value); - }; - - self.init = function () { - if (!JNEXT.require("libpimcontacts")) { - return false; - } - - self.m_id = JNEXT.createObject("libpimcontacts.PimContacts"); - - if (self.m_id === "") { - return false; - } - - JNEXT.registerEvents(self); - }; - - // Handle data coming back from JNEXT native layer. Each async function registers a handler and a PluginResult object. - // When JNEXT fires onEvent we parse the result string back into JSON and trigger the appropriate handler (eventHandlers map - // uses callbackId as key), along with the actual data coming back from the native layer. Each function may have its own way of - // processing native data so we do not do any processing here. - - self.onEvent = function (strData) { - var arData = strData.split(" "), - strEventDesc = arData[0], - eventHandler, - args = {}; - - if (strEventDesc === "result") { - args.result = escape(strData.split(" ").slice(2).join(" ")); - eventHandler = self.eventHandlers[arData[1]]; - if (eventHandler.action === "save" || eventHandler.action === "remove") { - eventHandler.handler(eventHandler.result, JSON.parse(decodeURIComponent(args.result))); - } else if (eventHandler.action === "find") { - eventHandler.handler(arData[1], eventHandler, JSON.parse(decodeURIComponent(args.result))); - } - } - }; - - self.m_id = ""; - self.eventHandlers = {}; - - self.getInstance = function () { - if (!hasInstance) { - self.init(); - hasInstance = true; - } - return self; - }; -}; - -pimContacts = new JNEXT.PimContacts(); diff --git a/cordova-lib/spec-plugman-install/plugins/Contacts/src/blackberry10/plugin.xml b/cordova-lib/spec-plugman-install/plugins/Contacts/src/blackberry10/plugin.xml deleted file mode 100644 index d163585f2..000000000 --- a/cordova-lib/spec-plugman-install/plugins/Contacts/src/blackberry10/plugin.xml +++ /dev/null @@ -1,41 +0,0 @@ - - - - - - Contacts - - - - - - - - - - - - - - - - - - - diff --git a/cordova-lib/spec-plugman-install/plugins/Contacts/src/ios/CDVContact.h b/cordova-lib/spec-plugman-install/plugins/Contacts/src/ios/CDVContact.h deleted file mode 100644 index 5187efcdf..000000000 --- a/cordova-lib/spec-plugman-install/plugins/Contacts/src/ios/CDVContact.h +++ /dev/null @@ -1,136 +0,0 @@ -/* - Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.0 (the - "License"); you may not use this file except in compliance - with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, - software distributed under the License is distributed on an - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - KIND, either express or implied. See the License for the - specific language governing permissions and limitations - under the License. - */ - -#import -#import -#import - -enum CDVContactError { - UNKNOWN_ERROR = 0, - INVALID_ARGUMENT_ERROR = 1, - TIMEOUT_ERROR = 2, - PENDING_OPERATION_ERROR = 3, - IO_ERROR = 4, - NOT_SUPPORTED_ERROR = 5, - PERMISSION_DENIED_ERROR = 20 -}; -typedef NSUInteger CDVContactError; - -@interface CDVContact : NSObject { - ABRecordRef record; // the ABRecord associated with this contact - NSDictionary* returnFields; // dictionary of fields to return when performing search -} - -@property (nonatomic, assign) ABRecordRef record; -@property (nonatomic, strong) NSDictionary* returnFields; - -+ (NSDictionary*)defaultABtoW3C; -+ (NSDictionary*)defaultW3CtoAB; -+ (NSSet*)defaultW3CtoNull; -+ (NSDictionary*)defaultObjectAndProperties; -+ (NSDictionary*)defaultFields; - -+ (NSDictionary*)calcReturnFields:(NSArray*)fields; -- (id)init; -- (id)initFromABRecord:(ABRecordRef)aRecord; -- (bool)setFromContactDict:(NSDictionary*)aContact asUpdate:(BOOL)bUpdate; - -+ (BOOL)needsConversion:(NSString*)W3Label; -+ (CFStringRef)convertContactTypeToPropertyLabel:(NSString*)label; -+ (NSString*)convertPropertyLabelToContactType:(NSString*)label; -+ (BOOL)isValidW3ContactType:(NSString*)label; -- (bool)setValue:(id)aValue forProperty:(ABPropertyID)aProperty inRecord:(ABRecordRef)aRecord asUpdate:(BOOL)bUpdate; - -- (NSDictionary*)toDictionary:(NSDictionary*)withFields; -- (NSNumber*)getDateAsNumber:(ABPropertyID)datePropId; -- (NSObject*)extractName; -- (NSObject*)extractMultiValue:(NSString*)propertyId; -- (NSObject*)extractAddresses; -- (NSObject*)extractIms; -- (NSObject*)extractOrganizations; -- (NSObject*)extractPhotos; - -- (NSMutableDictionary*)translateW3Dict:(NSDictionary*)dict forProperty:(ABPropertyID)prop; -- (bool)setMultiValueStrings:(NSArray*)fieldArray forProperty:(ABPropertyID)prop inRecord:(ABRecordRef)person asUpdate:(BOOL)bUpdate; -- (bool)setMultiValueDictionary:(NSArray*)array forProperty:(ABPropertyID)prop inRecord:(ABRecordRef)person asUpdate:(BOOL)bUpdate; -- (ABMultiValueRef)allocStringMultiValueFromArray:array; -- (ABMultiValueRef)allocDictMultiValueFromArray:array forProperty:(ABPropertyID)prop; -- (BOOL)foundValue:(NSString*)testValue inFields:(NSDictionary*)searchFields; -- (BOOL)testStringValue:(NSString*)testValue forW3CProperty:(NSString*)property; -- (BOOL)testDateValue:(NSString*)testValue forW3CProperty:(NSString*)property; -- (BOOL)searchContactFields:(NSArray*)fields forMVStringProperty:(ABPropertyID)propId withValue:testValue; -- (BOOL)testMultiValueStrings:(NSString*)testValue forProperty:(ABPropertyID)propId ofType:(NSString*)type; -- (NSArray*)valuesForProperty:(ABPropertyID)propId inRecord:(ABRecordRef)aRecord; -- (NSArray*)labelsForProperty:(ABPropertyID)propId inRecord:(ABRecordRef)aRecord; -- (BOOL)searchContactFields:(NSArray*)fields forMVDictionaryProperty:(ABPropertyID)propId withValue:(NSString*)testValue; - -@end - -// generic ContactField types -#define kW3ContactFieldType @"type" -#define kW3ContactFieldValue @"value" -#define kW3ContactFieldPrimary @"pref" -// Various labels for ContactField types -#define kW3ContactWorkLabel @"work" -#define kW3ContactHomeLabel @"home" -#define kW3ContactOtherLabel @"other" -#define kW3ContactPhoneFaxLabel @"fax" -#define kW3ContactPhoneMobileLabel @"mobile" -#define kW3ContactPhonePagerLabel @"pager" -#define kW3ContactUrlBlog @"blog" -#define kW3ContactUrlProfile @"profile" -#define kW3ContactImAIMLabel @"aim" -#define kW3ContactImICQLabel @"icq" -#define kW3ContactImMSNLabel @"msn" -#define kW3ContactImYahooLabel @"yahoo" -#define kW3ContactFieldId @"id" -// special translation for IM field value and type -#define kW3ContactImType @"type" -#define kW3ContactImValue @"value" - -// Contact object -#define kW3ContactId @"id" -#define kW3ContactName @"name" -#define kW3ContactFormattedName @"formatted" -#define kW3ContactGivenName @"givenName" -#define kW3ContactFamilyName @"familyName" -#define kW3ContactMiddleName @"middleName" -#define kW3ContactHonorificPrefix @"honorificPrefix" -#define kW3ContactHonorificSuffix @"honorificSuffix" -#define kW3ContactDisplayName @"displayName" -#define kW3ContactNickname @"nickname" -#define kW3ContactPhoneNumbers @"phoneNumbers" -#define kW3ContactAddresses @"addresses" -#define kW3ContactAddressFormatted @"formatted" -#define kW3ContactStreetAddress @"streetAddress" -#define kW3ContactLocality @"locality" -#define kW3ContactRegion @"region" -#define kW3ContactPostalCode @"postalCode" -#define kW3ContactCountry @"country" -#define kW3ContactEmails @"emails" -#define kW3ContactIms @"ims" -#define kW3ContactOrganizations @"organizations" -#define kW3ContactOrganizationName @"name" -#define kW3ContactTitle @"title" -#define kW3ContactDepartment @"department" -#define kW3ContactBirthday @"birthday" -#define kW3ContactNote @"note" -#define kW3ContactPhotos @"photos" -#define kW3ContactCategories @"categories" -#define kW3ContactUrls @"urls" diff --git a/cordova-lib/spec-plugman-install/plugins/Contacts/src/ios/CDVContact.m b/cordova-lib/spec-plugman-install/plugins/Contacts/src/ios/CDVContact.m deleted file mode 100644 index 82704ea05..000000000 --- a/cordova-lib/spec-plugman-install/plugins/Contacts/src/ios/CDVContact.m +++ /dev/null @@ -1,1752 +0,0 @@ -/* - Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.0 (the - "License"); you may not use this file except in compliance - with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, - software distributed under the License is distributed on an - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - KIND, either express or implied. See the License for the - specific language governing permissions and limitations - under the License. - */ - -#import "CDVContact.h" -#import - -#define DATE_OR_NULL(dateObj) ((aDate != nil) ? (id)([aDate descriptionWithLocale:[NSLocale currentLocale]]) : (id)([NSNull null])) -#define IS_VALID_VALUE(value) ((value != nil) && (![value isKindOfClass:[NSNull class]])) - -static NSDictionary* org_apache_cordova_contacts_W3CtoAB = nil; -static NSDictionary* org_apache_cordova_contacts_ABtoW3C = nil; -static NSSet* org_apache_cordova_contacts_W3CtoNull = nil; -static NSDictionary* org_apache_cordova_contacts_objectAndProperties = nil; -static NSDictionary* org_apache_cordova_contacts_defaultFields = nil; - -@implementation CDVContact : NSObject - - @synthesize returnFields; - -- (id)init -{ - if ((self = [super init]) != nil) { - ABRecordRef rec = ABPersonCreate(); - self.record = rec; - if (rec) { - CFRelease(rec); - } - } - return self; -} - -- (id)initFromABRecord:(ABRecordRef)aRecord -{ - if ((self = [super init]) != nil) { - self.record = aRecord; - } - return self; -} - -/* synthesize 'record' ourselves to have retain properties for CF types */ - -- (void)setRecord:(ABRecordRef)aRecord -{ - if (record != NULL) { - CFRelease(record); - } - if (aRecord != NULL) { - record = CFRetain(aRecord); - } -} - -- (ABRecordRef)record -{ - return record; -} - -/* Rather than creating getters and setters for each AddressBook (AB) Property, generic methods are used to deal with - * simple properties, MultiValue properties( phone numbers and emails) and MultiValueDictionary properties (Ims and addresses). - * The dictionaries below are used to translate between the W3C identifiers and the AB properties. Using the dictionaries, - * allows looping through sets of properties to extract from or set into the W3C dictionary to/from the ABRecord. - */ - -/* The two following dictionaries translate between W3C properties and AB properties. It currently mixes both - * Properties (kABPersonAddressProperty for example) and Strings (kABPersonAddressStreetKey) so users should be aware of - * what types of values are expected. - * a bit. -*/ -+ (NSDictionary*)defaultABtoW3C -{ - if (org_apache_cordova_contacts_ABtoW3C == nil) { - org_apache_cordova_contacts_ABtoW3C = [NSDictionary dictionaryWithObjectsAndKeys: - kW3ContactNickname, [NSNumber numberWithInt:kABPersonNicknameProperty], - kW3ContactGivenName, [NSNumber numberWithInt:kABPersonFirstNameProperty], - kW3ContactFamilyName, [NSNumber numberWithInt:kABPersonLastNameProperty], - kW3ContactMiddleName, [NSNumber numberWithInt:kABPersonMiddleNameProperty], - kW3ContactHonorificPrefix, [NSNumber numberWithInt:kABPersonPrefixProperty], - kW3ContactHonorificSuffix, [NSNumber numberWithInt:kABPersonSuffixProperty], - kW3ContactPhoneNumbers, [NSNumber numberWithInt:kABPersonPhoneProperty], - kW3ContactAddresses, [NSNumber numberWithInt:kABPersonAddressProperty], - kW3ContactStreetAddress, kABPersonAddressStreetKey, - kW3ContactLocality, kABPersonAddressCityKey, - kW3ContactRegion, kABPersonAddressStateKey, - kW3ContactPostalCode, kABPersonAddressZIPKey, - kW3ContactCountry, kABPersonAddressCountryKey, - kW3ContactEmails, [NSNumber numberWithInt:kABPersonEmailProperty], - kW3ContactIms, [NSNumber numberWithInt:kABPersonInstantMessageProperty], - kW3ContactOrganizations, [NSNumber numberWithInt:kABPersonOrganizationProperty], - kW3ContactOrganizationName, [NSNumber numberWithInt:kABPersonOrganizationProperty], - kW3ContactTitle, [NSNumber numberWithInt:kABPersonJobTitleProperty], - kW3ContactDepartment, [NSNumber numberWithInt:kABPersonDepartmentProperty], - kW3ContactBirthday, [NSNumber numberWithInt:kABPersonBirthdayProperty], - kW3ContactUrls, [NSNumber numberWithInt:kABPersonURLProperty], - kW3ContactNote, [NSNumber numberWithInt:kABPersonNoteProperty], - nil]; - } - - return org_apache_cordova_contacts_ABtoW3C; -} - -+ (NSDictionary*)defaultW3CtoAB -{ - if (org_apache_cordova_contacts_W3CtoAB == nil) { - org_apache_cordova_contacts_W3CtoAB = [NSDictionary dictionaryWithObjectsAndKeys: - [NSNumber numberWithInt:kABPersonNicknameProperty], kW3ContactNickname, - [NSNumber numberWithInt:kABPersonFirstNameProperty], kW3ContactGivenName, - [NSNumber numberWithInt:kABPersonLastNameProperty], kW3ContactFamilyName, - [NSNumber numberWithInt:kABPersonMiddleNameProperty], kW3ContactMiddleName, - [NSNumber numberWithInt:kABPersonPrefixProperty], kW3ContactHonorificPrefix, - [NSNumber numberWithInt:kABPersonSuffixProperty], kW3ContactHonorificSuffix, - [NSNumber numberWithInt:kABPersonPhoneProperty], kW3ContactPhoneNumbers, - [NSNumber numberWithInt:kABPersonAddressProperty], kW3ContactAddresses, - kABPersonAddressStreetKey, kW3ContactStreetAddress, - kABPersonAddressCityKey, kW3ContactLocality, - kABPersonAddressStateKey, kW3ContactRegion, - kABPersonAddressZIPKey, kW3ContactPostalCode, - kABPersonAddressCountryKey, kW3ContactCountry, - [NSNumber numberWithInt:kABPersonEmailProperty], kW3ContactEmails, - [NSNumber numberWithInt:kABPersonInstantMessageProperty], kW3ContactIms, - [NSNumber numberWithInt:kABPersonOrganizationProperty], kW3ContactOrganizations, - [NSNumber numberWithInt:kABPersonJobTitleProperty], kW3ContactTitle, - [NSNumber numberWithInt:kABPersonDepartmentProperty], kW3ContactDepartment, - [NSNumber numberWithInt:kABPersonBirthdayProperty], kW3ContactBirthday, - [NSNumber numberWithInt:kABPersonNoteProperty], kW3ContactNote, - [NSNumber numberWithInt:kABPersonURLProperty], kW3ContactUrls, - kABPersonInstantMessageUsernameKey, kW3ContactImValue, - kABPersonInstantMessageServiceKey, kW3ContactImType, - [NSNull null], kW3ContactFieldType, /* include entries in dictionary to indicate ContactField properties */ - [NSNull null], kW3ContactFieldValue, - [NSNull null], kW3ContactFieldPrimary, - [NSNull null], kW3ContactFieldId, - [NSNumber numberWithInt:kABPersonOrganizationProperty], kW3ContactOrganizationName, /* careful, name is used multiple times*/ - nil]; - } - return org_apache_cordova_contacts_W3CtoAB; -} - -+ (NSSet*)defaultW3CtoNull -{ - // these are values that have no AddressBook Equivalent OR have not been implemented yet - if (org_apache_cordova_contacts_W3CtoNull == nil) { - org_apache_cordova_contacts_W3CtoNull = [NSSet setWithObjects:kW3ContactDisplayName, - kW3ContactCategories, kW3ContactFormattedName, nil]; - } - return org_apache_cordova_contacts_W3CtoNull; -} - -/* - * The objectAndProperties dictionary contains the all of the properties of the W3C Contact Objects specified by the key - * Used in calcReturnFields, and various extract methods - */ -+ (NSDictionary*)defaultObjectAndProperties -{ - if (org_apache_cordova_contacts_objectAndProperties == nil) { - org_apache_cordova_contacts_objectAndProperties = [NSDictionary dictionaryWithObjectsAndKeys: - [NSArray arrayWithObjects:kW3ContactGivenName, kW3ContactFamilyName, - kW3ContactMiddleName, kW3ContactHonorificPrefix, kW3ContactHonorificSuffix, kW3ContactFormattedName, nil], kW3ContactName, - [NSArray arrayWithObjects:kW3ContactStreetAddress, kW3ContactLocality, kW3ContactRegion, - kW3ContactPostalCode, kW3ContactCountry, /*kW3ContactAddressFormatted,*/ nil], kW3ContactAddresses, - [NSArray arrayWithObjects:kW3ContactOrganizationName, kW3ContactTitle, kW3ContactDepartment, nil], kW3ContactOrganizations, - [NSArray arrayWithObjects:kW3ContactFieldType, kW3ContactFieldValue, kW3ContactFieldPrimary, nil], kW3ContactPhoneNumbers, - [NSArray arrayWithObjects:kW3ContactFieldType, kW3ContactFieldValue, kW3ContactFieldPrimary, nil], kW3ContactEmails, - [NSArray arrayWithObjects:kW3ContactFieldType, kW3ContactFieldValue, kW3ContactFieldPrimary, nil], kW3ContactPhotos, - [NSArray arrayWithObjects:kW3ContactFieldType, kW3ContactFieldValue, kW3ContactFieldPrimary, nil], kW3ContactUrls, - [NSArray arrayWithObjects:kW3ContactImValue, kW3ContactImType, nil], kW3ContactIms, - nil]; - } - return org_apache_cordova_contacts_objectAndProperties; -} - -+ (NSDictionary*)defaultFields -{ - if (org_apache_cordova_contacts_defaultFields == nil) { - org_apache_cordova_contacts_defaultFields = [NSDictionary dictionaryWithObjectsAndKeys: - [[CDVContact defaultObjectAndProperties] objectForKey:kW3ContactName], kW3ContactName, - [NSNull null], kW3ContactNickname, - [[CDVContact defaultObjectAndProperties] objectForKey:kW3ContactAddresses], kW3ContactAddresses, - [[CDVContact defaultObjectAndProperties] objectForKey:kW3ContactOrganizations], kW3ContactOrganizations, - [[CDVContact defaultObjectAndProperties] objectForKey:kW3ContactPhoneNumbers], kW3ContactPhoneNumbers, - [[CDVContact defaultObjectAndProperties] objectForKey:kW3ContactEmails], kW3ContactEmails, - [[CDVContact defaultObjectAndProperties] objectForKey:kW3ContactIms], kW3ContactIms, - [[CDVContact defaultObjectAndProperties] objectForKey:kW3ContactPhotos], kW3ContactPhotos, - [[CDVContact defaultObjectAndProperties] objectForKey:kW3ContactUrls], kW3ContactUrls, - [NSNull null], kW3ContactBirthday, - [NSNull null], kW3ContactNote, - nil]; - } - return org_apache_cordova_contacts_defaultFields; -} - -/* Translate W3C Contact data into ABRecordRef - * - * New contact information comes in as a NSMutableDictionary. All Null entries in Contact object are set - * as [NSNull null] in the dictionary when translating from the JSON input string of Contact data. However, if - * user did not set a value within a Contact object or sub-object (by not using the object constructor) some data - * may not exist. - * bUpdate = YES indicates this is a save of an existing record - */ -- (bool)setFromContactDict:(NSDictionary*)aContact asUpdate:(BOOL)bUpdate -{ - if (![aContact isKindOfClass:[NSDictionary class]]) { - return FALSE; // can't do anything if no dictionary! - } - - ABRecordRef person = self.record; - bool bSuccess = TRUE; - CFErrorRef error; - - // set name info - // iOS doesn't have displayName - might have to pull parts from it to create name - bool bName = false; - NSDictionary* dict = [aContact valueForKey:kW3ContactName]; - if ([dict isKindOfClass:[NSDictionary class]]) { - bName = true; - NSArray* propArray = [[CDVContact defaultObjectAndProperties] objectForKey:kW3ContactName]; - - for (id i in propArray) { - if (![(NSString*)i isEqualToString : kW3ContactFormattedName]) { // kW3ContactFormattedName is generated from ABRecordCopyCompositeName() and can't be set - [self setValue:[dict valueForKey:i] forProperty:(ABPropertyID)[(NSNumber*)[[CDVContact defaultW3CtoAB] objectForKey:i] intValue] - inRecord:person asUpdate:bUpdate]; - } - } - } - - id nn = [aContact valueForKey:kW3ContactNickname]; - if (![nn isKindOfClass:[NSNull class]]) { - bName = true; - [self setValue:nn forProperty:kABPersonNicknameProperty inRecord:person asUpdate:bUpdate]; - } - if (!bName) { - // if no name or nickname - try and use displayName as W3Contact must have displayName or ContactName - [self setValue:[aContact valueForKey:kW3ContactDisplayName] forProperty:kABPersonNicknameProperty - inRecord:person asUpdate:bUpdate]; - } - - // set phoneNumbers - // NSLog(@"setting phoneNumbers"); - NSArray* array = [aContact valueForKey:kW3ContactPhoneNumbers]; - if ([array isKindOfClass:[NSArray class]]) { - [self setMultiValueStrings:array forProperty:kABPersonPhoneProperty inRecord:person asUpdate:bUpdate]; - } - // set Emails - // NSLog(@"setting emails"); - array = [aContact valueForKey:kW3ContactEmails]; - if ([array isKindOfClass:[NSArray class]]) { - [self setMultiValueStrings:array forProperty:kABPersonEmailProperty inRecord:person asUpdate:bUpdate]; - } - // set Urls - // NSLog(@"setting urls"); - array = [aContact valueForKey:kW3ContactUrls]; - if ([array isKindOfClass:[NSArray class]]) { - [self setMultiValueStrings:array forProperty:kABPersonURLProperty inRecord:person asUpdate:bUpdate]; - } - - // set multivalue dictionary properties - // set addresses: streetAddress, locality, region, postalCode, country - // set ims: value = username, type = servicetype - // iOS addresses and im are a MultiValue Properties with label, value=dictionary of info, and id - // NSLog(@"setting addresses"); - error = nil; - array = [aContact valueForKey:kW3ContactAddresses]; - if ([array isKindOfClass:[NSArray class]]) { - [self setMultiValueDictionary:array forProperty:kABPersonAddressProperty inRecord:person asUpdate:bUpdate]; - } - // ims - // NSLog(@"setting ims"); - array = [aContact valueForKey:kW3ContactIms]; - if ([array isKindOfClass:[NSArray class]]) { - [self setMultiValueDictionary:array forProperty:kABPersonInstantMessageProperty inRecord:person asUpdate:bUpdate]; - } - - // organizations - // W3C ContactOrganization has pref, type, name, title, department - // iOS only supports name, title, department - // NSLog(@"setting organizations"); - // TODO this may need work - should Organization information be removed when array is empty?? - array = [aContact valueForKey:kW3ContactOrganizations]; // iOS only supports one organization - use first one - if ([array isKindOfClass:[NSArray class]]) { - BOOL bRemove = NO; - NSDictionary* dict = nil; - if ([array count] > 0) { - dict = [array objectAtIndex:0]; - } else { - // remove the organization info entirely - bRemove = YES; - } - if ([dict isKindOfClass:[NSDictionary class]] || (bRemove == YES)) { - [self setValue:(bRemove ? @"" : [dict valueForKey:@"name"]) forProperty:kABPersonOrganizationProperty inRecord:person asUpdate:bUpdate]; - [self setValue:(bRemove ? @"" : [dict valueForKey:kW3ContactTitle]) forProperty:kABPersonJobTitleProperty inRecord:person asUpdate:bUpdate]; - [self setValue:(bRemove ? @"" : [dict valueForKey:kW3ContactDepartment]) forProperty:kABPersonDepartmentProperty inRecord:person asUpdate:bUpdate]; - } - } - // add dates - // Dates come in as milliseconds in NSNumber Object - id ms = [aContact valueForKey:kW3ContactBirthday]; - NSDate* aDate = nil; - if (ms && [ms isKindOfClass:[NSNumber class]]) { - double msValue = [ms doubleValue]; - msValue = msValue / 1000; - aDate = [NSDate dateWithTimeIntervalSince1970:msValue]; - } - if ((aDate != nil) || [ms isKindOfClass:[NSString class]]) { - [self setValue:aDate != nil ? aDate:ms forProperty:kABPersonBirthdayProperty inRecord:person asUpdate:bUpdate]; - } - // don't update creation date - // modification date will get updated when save - // anniversary is removed from W3C Contact api Dec 9, 2010 spec - don't waste time on it yet - - // kABPersonDateProperty - - // kABPersonAnniversaryLabel - - // iOS doesn't have gender - ignore - // note - [self setValue:[aContact valueForKey:kW3ContactNote] forProperty:kABPersonNoteProperty inRecord:person asUpdate:bUpdate]; - - // iOS doesn't have preferredName- ignore - - // photo - array = [aContact valueForKey:kW3ContactPhotos]; - if ([array isKindOfClass:[NSArray class]]) { - if (bUpdate && ([array count] == 0)) { - // remove photo - bSuccess = ABPersonRemoveImageData(person, &error); - } else if ([array count] > 0) { - NSDictionary* dict = [array objectAtIndex:0]; // currently only support one photo - if ([dict isKindOfClass:[NSDictionary class]]) { - id value = [dict objectForKey:kW3ContactFieldValue]; - if ([value isKindOfClass:[NSString class]]) { - if (bUpdate && ([value length] == 0)) { - // remove the current image - bSuccess = ABPersonRemoveImageData(person, &error); - } else { - // use this image - // don't know if string is encoded or not so first unencode it then encode it again - NSString* cleanPath = [value stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; - NSURL* photoUrl = [NSURL URLWithString:[cleanPath stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]; - // caller is responsible for checking for a connection, if no connection this will fail - NSError* err = nil; - NSData* data = nil; - if (photoUrl) { - data = [NSData dataWithContentsOfURL:photoUrl options:NSDataReadingUncached error:&err]; - } - if (data && ([data length] > 0)) { - bSuccess = ABPersonSetImageData(person, (__bridge CFDataRef)data, &error); - } - if (!data || !bSuccess) { - NSLog(@"error setting contact image: %@", (err != nil ? [err localizedDescription] : @"")); - } - } - } - } - } - } - - // TODO WebURLs - - // TODO timezone - - return bSuccess; -} - -/* Set item into an AddressBook Record for the specified property. - * aValue - the value to set into the address book (code checks for null or [NSNull null] - * aProperty - AddressBook property ID - * aRecord - the record to update - * bUpdate - whether this is a possible update vs a new entry - * RETURN - * true - property was set (or input value as null) - * false - property was not set - */ -- (bool)setValue:(id)aValue forProperty:(ABPropertyID)aProperty inRecord:(ABRecordRef)aRecord asUpdate:(BOOL)bUpdate -{ - bool bSuccess = true; // if property was null, just ignore and return success - CFErrorRef error; - - if (aValue && ![aValue isKindOfClass:[NSNull class]]) { - if (bUpdate && ([aValue isKindOfClass:[NSString class]] && ([aValue length] == 0))) { // if updating, empty string means to delete - aValue = NULL; - } // really only need to set if different - more efficient to just update value or compare and only set if necessary??? - bSuccess = ABRecordSetValue(aRecord, aProperty, (__bridge CFTypeRef)aValue, &error); - if (!bSuccess) { - NSLog(@"error setting %d property", aProperty); - } - } - - return bSuccess; -} - -- (bool)removeProperty:(ABPropertyID)aProperty inRecord:(ABRecordRef)aRecord -{ - CFErrorRef err; - bool bSuccess = ABRecordRemoveValue(aRecord, aProperty, &err); - - if (!bSuccess) { - CFStringRef errDescription = CFErrorCopyDescription(err); - NSLog(@"Unable to remove property %d: %@", aProperty, errDescription); - CFRelease(errDescription); - } - return bSuccess; -} - -- (bool)addToMultiValue:(ABMultiValueRef)multi fromDictionary:dict -{ - bool bSuccess = FALSE; - id value = [dict valueForKey:kW3ContactFieldValue]; - - if (IS_VALID_VALUE(value)) { - CFStringRef label = [CDVContact convertContactTypeToPropertyLabel:[dict valueForKey:kW3ContactFieldType]]; - bSuccess = ABMultiValueAddValueAndLabel(multi, (__bridge CFTypeRef)value, label, NULL); - if (!bSuccess) { - NSLog(@"Error setting Value: %@ and label: %@", value, label); - } - } - return bSuccess; -} - -- (ABMultiValueRef)allocStringMultiValueFromArray:array -{ - ABMutableMultiValueRef multi = ABMultiValueCreateMutable(kABMultiStringPropertyType); - - for (NSDictionary* dict in array) { - [self addToMultiValue:multi fromDictionary:dict]; - } - - return multi; // caller is responsible for releasing multi -} - -- (bool)setValue:(CFTypeRef)value forProperty:(ABPropertyID)prop inRecord:(ABRecordRef)person -{ - CFErrorRef error; - bool bSuccess = ABRecordSetValue(person, prop, value, &error); - - if (!bSuccess) { - NSLog(@"Error setting value for property: %d", prop); - } - return bSuccess; -} - -/* Set MultiValue string properties into Address Book Record. - * NSArray* fieldArray - array of dictionaries containing W3C properties to be set into record - * ABPropertyID prop - the property to be set (generally used for phones and emails) - * ABRecordRef person - the record to set values into - * BOOL bUpdate - whether or not to update date or set as new. - * When updating: - * empty array indicates to remove entire property - * empty string indicates to remove - * [NSNull null] do not modify (keep existing record value) - * RETURNS - * bool false indicates error - * - * used for phones and emails - */ -- (bool)setMultiValueStrings:(NSArray*)fieldArray forProperty:(ABPropertyID)prop inRecord:(ABRecordRef)person asUpdate:(BOOL)bUpdate -{ - bool bSuccess = TRUE; - ABMutableMultiValueRef multi = nil; - - if (!bUpdate) { - multi = [self allocStringMultiValueFromArray:fieldArray]; - bSuccess = [self setValue:multi forProperty:prop inRecord:person]; - } else if (bUpdate && ([fieldArray count] == 0)) { - // remove entire property - bSuccess = [self removeProperty:prop inRecord:person]; - } else { // check for and apply changes - ABMultiValueRef copy = ABRecordCopyValue(person, prop); - if (copy != nil) { - multi = ABMultiValueCreateMutableCopy(copy); - CFRelease(copy); - - for (NSDictionary* dict in fieldArray) { - id val; - NSString* label = nil; - val = [dict valueForKey:kW3ContactFieldValue]; - label = (__bridge NSString*)[CDVContact convertContactTypeToPropertyLabel:[dict valueForKey:kW3ContactFieldType]]; - if (IS_VALID_VALUE(val)) { - // is an update, find index of entry with matching id, if values are different, update. - id idValue = [dict valueForKey:kW3ContactFieldId]; - int identifier = [idValue isKindOfClass:[NSNumber class]] ? [idValue intValue] : -1; - CFIndex i = identifier >= 0 ? ABMultiValueGetIndexForIdentifier(multi, identifier) : kCFNotFound; - if (i != kCFNotFound) { - if ([val length] == 0) { - // remove both value and label - ABMultiValueRemoveValueAndLabelAtIndex(multi, i); - } else { - NSString* valueAB = (__bridge_transfer NSString*)ABMultiValueCopyValueAtIndex(multi, i); - NSString* labelAB = (__bridge_transfer NSString*)ABMultiValueCopyLabelAtIndex(multi, i); - if ((valueAB == nil) || ![val isEqualToString:valueAB]) { - ABMultiValueReplaceValueAtIndex(multi, (__bridge CFTypeRef)val, i); - } - if ((labelAB == nil) || ![label isEqualToString:labelAB]) { - ABMultiValueReplaceLabelAtIndex(multi, (__bridge CFStringRef)label, i); - } - } - } else { - // is a new value - insert - [self addToMultiValue:multi fromDictionary:dict]; - } - } // end of if value - } // end of for - } else { // adding all new value(s) - multi = [self allocStringMultiValueFromArray:fieldArray]; - } - // set the (updated) copy as the new value - bSuccess = [self setValue:multi forProperty:prop inRecord:person]; - } - - if (multi) { - CFRelease(multi); - } - - return bSuccess; -} - -// used for ims and addresses -- (ABMultiValueRef)allocDictMultiValueFromArray:array forProperty:(ABPropertyID)prop -{ - ABMutableMultiValueRef multi = ABMultiValueCreateMutable(kABMultiDictionaryPropertyType); - NSMutableDictionary* newDict; - NSMutableDictionary* addDict; - - for (NSDictionary* dict in array) { - newDict = [self translateW3Dict:dict forProperty:prop]; - addDict = [NSMutableDictionary dictionaryWithCapacity:2]; - if (newDict) { // create a new dictionary with a Label and Value, value is the dictionary previously created - // June, 2011 W3C Contact spec adds type into ContactAddress book - // get the type out of the original dictionary for address - NSString* addrType = (NSString*)[dict valueForKey:kW3ContactFieldType]; - if (!addrType) { - addrType = (NSString*)kABOtherLabel; - } - NSObject* typeValue = ((prop == kABPersonInstantMessageProperty) ? (NSObject*)kABOtherLabel : addrType); - // NSLog(@"typeValue: %@", typeValue); - [addDict setObject:typeValue forKey:kW3ContactFieldType]; // im labels will be set as Other and address labels as type from dictionary - [addDict setObject:newDict forKey:kW3ContactFieldValue]; - [self addToMultiValue:multi fromDictionary:addDict]; - } - } - - return multi; // caller is responsible for releasing -} - -// used for ims and addresses to convert W3 dictionary of values to AB Dictionary -// got messier when June, 2011 W3C Contact spec added type field into ContactAddress -- (NSMutableDictionary*)translateW3Dict:(NSDictionary*)dict forProperty:(ABPropertyID)prop -{ - NSArray* propArray = [[CDVContact defaultObjectAndProperties] valueForKey:[[CDVContact defaultABtoW3C] objectForKey:[NSNumber numberWithInt:prop]]]; - - NSMutableDictionary* newDict = [NSMutableDictionary dictionaryWithCapacity:1]; - id value; - - for (NSString* key in propArray) { // for each W3 Contact key get the value - if (((value = [dict valueForKey:key]) != nil) && ![value isKindOfClass:[NSNull class]]) { - // if necessary convert the W3 value to AB Property label - NSString* setValue = value; - if ([CDVContact needsConversion:key]) { // IM types must be converted - setValue = (NSString*)[CDVContact convertContactTypeToPropertyLabel:value]; - // IMs must have a valid AB value! - if ((prop == kABPersonInstantMessageProperty) && [setValue isEqualToString:(NSString*)kABOtherLabel]) { - setValue = @""; // try empty string - } - } - // set the AB value into the dictionary - [newDict setObject:setValue forKey:(NSString*)[[CDVContact defaultW3CtoAB] valueForKey:(NSString*)key]]; - } - } - - if ([newDict count] == 0) { - newDict = nil; // no items added - } - return newDict; -} - -/* set multivalue dictionary properties into an AddressBook Record - * NSArray* array - array of dictionaries containing the W3C properties to set into the record - * ABPropertyID prop - the property id for the multivalue dictionary (addresses and ims) - * ABRecordRef person - the record to set the values into - * BOOL bUpdate - YES if this is an update to an existing record - * When updating: - * empty array indicates to remove entire property - * value/label == "" indicates to remove - * value/label == [NSNull null] do not modify (keep existing record value) - * RETURN - * bool false indicates fatal error - * - * iOS addresses and im are a MultiValue Properties with label, value=dictionary of info, and id - * set addresses: streetAddress, locality, region, postalCode, country - * set ims: value = username, type = servicetype - * there are some special cases in here for ims - needs cleanup / simplification - * - */ -- (bool)setMultiValueDictionary:(NSArray*)array forProperty:(ABPropertyID)prop inRecord:(ABRecordRef)person asUpdate:(BOOL)bUpdate -{ - bool bSuccess = FALSE; - ABMutableMultiValueRef multi = nil; - - if (!bUpdate) { - multi = [self allocDictMultiValueFromArray:array forProperty:prop]; - bSuccess = [self setValue:multi forProperty:prop inRecord:person]; - } else if (bUpdate && ([array count] == 0)) { - // remove property - bSuccess = [self removeProperty:prop inRecord:person]; - } else { // check for and apply changes - ABMultiValueRef copy = ABRecordCopyValue(person, prop); - if (copy) { - multi = ABMultiValueCreateMutableCopy(copy); - CFRelease(copy); - // get the W3C values for this property - NSArray* propArray = [[CDVContact defaultObjectAndProperties] valueForKey:[[CDVContact defaultABtoW3C] objectForKey:[NSNumber numberWithInt:prop]]]; - id value; - id valueAB; - - for (NSDictionary* field in array) { - NSMutableDictionary* dict; - // find the index for the current property - id idValue = [field valueForKey:kW3ContactFieldId]; - int identifier = [idValue isKindOfClass:[NSNumber class]] ? [idValue intValue] : -1; - CFIndex idx = identifier >= 0 ? ABMultiValueGetIndexForIdentifier(multi, identifier) : kCFNotFound; - BOOL bUpdateLabel = NO; - if (idx != kCFNotFound) { - dict = [NSMutableDictionary dictionaryWithCapacity:1]; - // NSDictionary* existingDictionary = (NSDictionary*)ABMultiValueCopyValueAtIndex(multi, idx); - CFTypeRef existingDictionary = ABMultiValueCopyValueAtIndex(multi, idx); - NSString* existingABLabel = (__bridge_transfer NSString*)ABMultiValueCopyLabelAtIndex(multi, idx); - NSString* testLabel = [field valueForKey:kW3ContactFieldType]; - // fixes cb-143 where setting empty label could cause address to not be removed - // (because empty label would become 'other' in convertContactTypeToPropertyLabel - // which may not have matched existing label thus resulting in an incorrect updating of the label - // and the address not getting removed at the end of the for loop) - if (testLabel && [testLabel isKindOfClass:[NSString class]] && ([testLabel length] > 0)) { - CFStringRef w3cLabel = [CDVContact convertContactTypeToPropertyLabel:testLabel]; - if (w3cLabel && ![existingABLabel isEqualToString:(__bridge NSString*)w3cLabel]) { - // replace the label - ABMultiValueReplaceLabelAtIndex(multi, w3cLabel, idx); - bUpdateLabel = YES; - } - } // else was invalid or empty label string so do not update - - for (id k in propArray) { - value = [field valueForKey:k]; - bool bSet = (value != nil && ![value isKindOfClass:[NSNull class]] && ([value isKindOfClass:[NSString class]] && [value length] > 0)); - // if there is a contact value, put it into dictionary - if (bSet) { - NSString* setValue = [CDVContact needsConversion:(NSString*)k] ? (NSString*)[CDVContact convertContactTypeToPropertyLabel:value] : value; - [dict setObject:setValue forKey:(NSString*)[[CDVContact defaultW3CtoAB] valueForKey:(NSString*)k]]; - } else if ((value == nil) || ([value isKindOfClass:[NSString class]] && ([value length] != 0))) { - // value not provided in contact dictionary - if prop exists in AB dictionary, preserve it - valueAB = [(__bridge NSDictionary*)existingDictionary valueForKey : [[CDVContact defaultW3CtoAB] valueForKey:k]]; - if (valueAB != nil) { - [dict setValue:valueAB forKey:[[CDVContact defaultW3CtoAB] valueForKey:k]]; - } - } // else if value == "" it will not be added into updated dict and thus removed - } // end of for loop (moving here fixes cb-143, need to end for loop before replacing or removing multivalue) - - if ([dict count] > 0) { - // something was added into new dict, - ABMultiValueReplaceValueAtIndex(multi, (__bridge CFTypeRef)dict, idx); - } else if (!bUpdateLabel) { - // nothing added into new dict and no label change so remove this property entry - ABMultiValueRemoveValueAndLabelAtIndex(multi, idx); - } - - CFRelease(existingDictionary); - } else { - // not found in multivalue so add it - dict = [self translateW3Dict:field forProperty:prop]; - if (dict) { - NSMutableDictionary* addDict = [NSMutableDictionary dictionaryWithCapacity:2]; - // get the type out of the original dictionary for address - NSObject* typeValue = ((prop == kABPersonInstantMessageProperty) ? (NSObject*)kABOtherLabel : (NSString*)[field valueForKey:kW3ContactFieldType]); - // NSLog(@"typeValue: %@", typeValue); - [addDict setObject:typeValue forKey:kW3ContactFieldType]; // im labels will be set as Other and address labels as type from dictionary - [addDict setObject:dict forKey:kW3ContactFieldValue]; - [self addToMultiValue:multi fromDictionary:addDict]; - } - } - } // end of looping through dictionaries - - // set the (updated) copy as the new value - bSuccess = [self setValue:multi forProperty:prop inRecord:person]; - } - } // end of copy and apply changes - if (multi) { - CFRelease(multi); - } - - return bSuccess; -} - -/* Determine which W3C labels need to be converted - */ -+ (BOOL)needsConversion:(NSString*)W3Label -{ - BOOL bConvert = NO; - - if ([W3Label isEqualToString:kW3ContactFieldType] || [W3Label isEqualToString:kW3ContactImType]) { - bConvert = YES; - } - return bConvert; -} - -/* Translation of property type labels contact API ---> iPhone - * - * phone: work, home, other, mobile, fax, pager --> - * kABWorkLabel, kABHomeLabel, kABOtherLabel, kABPersonPhoneMobileLabel, kABPersonHomeFAXLabel || kABPersonHomeFAXLabel, kABPersonPhonePagerLabel - * emails: work, home, other ---> kABWorkLabel, kABHomeLabel, kABOtherLabel - * ims: aim, gtalk, icq, xmpp, msn, skype, qq, yahoo --> kABPersonInstantMessageService + (AIM, ICG, MSN, Yahoo). No support for gtalk, xmpp, skype, qq - * addresses: work, home, other --> kABWorkLabel, kABHomeLabel, kABOtherLabel - * - * - */ -+ (CFStringRef)convertContactTypeToPropertyLabel:(NSString*)label -{ - CFStringRef type; - - if ([label isKindOfClass:[NSNull class]] || ![label isKindOfClass:[NSString class]]) { - type = NULL; // no label - } else if ([label caseInsensitiveCompare:kW3ContactWorkLabel] == NSOrderedSame) { - type = kABWorkLabel; - } else if ([label caseInsensitiveCompare:kW3ContactHomeLabel] == NSOrderedSame) { - type = kABHomeLabel; - } else if ([label caseInsensitiveCompare:kW3ContactOtherLabel] == NSOrderedSame) { - type = kABOtherLabel; - } else if ([label caseInsensitiveCompare:kW3ContactPhoneMobileLabel] == NSOrderedSame) { - type = kABPersonPhoneMobileLabel; - } else if ([label caseInsensitiveCompare:kW3ContactPhonePagerLabel] == NSOrderedSame) { - type = kABPersonPhonePagerLabel; - } else if ([label caseInsensitiveCompare:kW3ContactImAIMLabel] == NSOrderedSame) { - type = kABPersonInstantMessageServiceAIM; - } else if ([label caseInsensitiveCompare:kW3ContactImICQLabel] == NSOrderedSame) { - type = kABPersonInstantMessageServiceICQ; - } else if ([label caseInsensitiveCompare:kW3ContactImMSNLabel] == NSOrderedSame) { - type = kABPersonInstantMessageServiceMSN; - } else if ([label caseInsensitiveCompare:kW3ContactImYahooLabel] == NSOrderedSame) { - type = kABPersonInstantMessageServiceYahoo; - } else if ([label caseInsensitiveCompare:kW3ContactUrlProfile] == NSOrderedSame) { - type = kABPersonHomePageLabel; - } else { - type = kABOtherLabel; - } - - return type; -} - -+ (NSString*)convertPropertyLabelToContactType:(NSString*)label -{ - NSString* type = nil; - - if (label != nil) { // improve efficiency...... - if ([label isEqualToString:(NSString*)kABPersonPhoneMobileLabel]) { - type = kW3ContactPhoneMobileLabel; - } else if ([label isEqualToString:(NSString*)kABPersonPhoneHomeFAXLabel] || - [label isEqualToString:(NSString*)kABPersonPhoneWorkFAXLabel]) { - type = kW3ContactPhoneFaxLabel; - } else if ([label isEqualToString:(NSString*)kABPersonPhonePagerLabel]) { - type = kW3ContactPhonePagerLabel; - } else if ([label isEqualToString:(NSString*)kABHomeLabel]) { - type = kW3ContactHomeLabel; - } else if ([label isEqualToString:(NSString*)kABWorkLabel]) { - type = kW3ContactWorkLabel; - } else if ([label isEqualToString:(NSString*)kABOtherLabel]) { - type = kW3ContactOtherLabel; - } else if ([label isEqualToString:(NSString*)kABPersonInstantMessageServiceAIM]) { - type = kW3ContactImAIMLabel; - } else if ([label isEqualToString:(NSString*)kABPersonInstantMessageServiceICQ]) { - type = kW3ContactImICQLabel; - } else if ([label isEqualToString:(NSString*)kABPersonInstantMessageServiceJabber]) { - type = kW3ContactOtherLabel; - } else if ([label isEqualToString:(NSString*)kABPersonInstantMessageServiceMSN]) { - type = kW3ContactImMSNLabel; - } else if ([label isEqualToString:(NSString*)kABPersonInstantMessageServiceYahoo]) { - type = kW3ContactImYahooLabel; - } else if ([label isEqualToString:(NSString*)kABPersonHomePageLabel]) { - type = kW3ContactUrlProfile; - } else { - type = kW3ContactOtherLabel; - } - } - return type; -} - -/* Check if the input label is a valid W3C ContactField.type. This is used when searching, - * only search field types if the search string is a valid type. If we converted any search - * string to a ABPropertyLabel it could convert to kABOtherLabel which is probably not want - * the user wanted to search for and could skew the results. - */ -+ (BOOL)isValidW3ContactType:(NSString*)label -{ - BOOL isValid = NO; - - if ([label isKindOfClass:[NSNull class]] || ![label isKindOfClass:[NSString class]]) { - isValid = NO; // no label - } else if ([label caseInsensitiveCompare:kW3ContactWorkLabel] == NSOrderedSame) { - isValid = YES; - } else if ([label caseInsensitiveCompare:kW3ContactHomeLabel] == NSOrderedSame) { - isValid = YES; - } else if ([label caseInsensitiveCompare:kW3ContactOtherLabel] == NSOrderedSame) { - isValid = YES; - } else if ([label caseInsensitiveCompare:kW3ContactPhoneMobileLabel] == NSOrderedSame) { - isValid = YES; - } else if ([label caseInsensitiveCompare:kW3ContactPhonePagerLabel] == NSOrderedSame) { - isValid = YES; - } else if ([label caseInsensitiveCompare:kW3ContactImAIMLabel] == NSOrderedSame) { - isValid = YES; - } else if ([label caseInsensitiveCompare:kW3ContactImICQLabel] == NSOrderedSame) { - isValid = YES; - } else if ([label caseInsensitiveCompare:kW3ContactImMSNLabel] == NSOrderedSame) { - isValid = YES; - } else if ([label caseInsensitiveCompare:kW3ContactImYahooLabel] == NSOrderedSame) { - isValid = YES; - } else { - isValid = NO; - } - - return isValid; -} - -/* Create a new Contact Dictionary object from an ABRecordRef that contains information in a format such that - * it can be returned to JavaScript callback as JSON object string. - * Uses: - * ABRecordRef set into Contact Object - * NSDictionary withFields indicates which fields to return from the AddressBook Record - * - * JavaScript Contact: - * @param {DOMString} id unique identifier - * @param {DOMString} displayName - * @param {ContactName} name - * @param {DOMString} nickname - * @param {ContactField[]} phoneNumbers array of phone numbers - * @param {ContactField[]} emails array of email addresses - * @param {ContactAddress[]} addresses array of addresses - * @param {ContactField[]} ims instant messaging user ids - * @param {ContactOrganization[]} organizations - * @param {DOMString} published date contact was first created - * @param {DOMString} updated date contact was last updated - * @param {DOMString} birthday contact's birthday - * @param (DOMString} anniversary contact's anniversary - * @param {DOMString} gender contact's gender - * @param {DOMString} note user notes about contact - * @param {DOMString} preferredUsername - * @param {ContactField[]} photos - * @param {ContactField[]} tags - * @param {ContactField[]} relationships - * @param {ContactField[]} urls contact's web sites - * @param {ContactAccounts[]} accounts contact's online accounts - * @param {DOMString} timezone UTC time zone offset - * @param {DOMString} connected - */ - -- (NSDictionary*)toDictionary:(NSDictionary*)withFields -{ - // if not a person type record bail out for now - if (ABRecordGetRecordType(self.record) != kABPersonType) { - return NULL; - } - id value = nil; - self.returnFields = withFields; - - NSMutableDictionary* nc = [NSMutableDictionary dictionaryWithCapacity:1]; // new contact dictionary to fill in from ABRecordRef - // id - [nc setObject:[NSNumber numberWithInt:ABRecordGetRecordID(self.record)] forKey:kW3ContactId]; - if (self.returnFields == nil) { - // if no returnFields specified, W3C says to return empty contact (but Cordova will at least return id) - return nc; - } - if ([self.returnFields objectForKey:kW3ContactDisplayName]) { - // displayname requested - iOS doesn't have so return null - [nc setObject:[NSNull null] forKey:kW3ContactDisplayName]; - // may overwrite below if requested ContactName and there are no values - } - // nickname - if ([self.returnFields valueForKey:kW3ContactNickname]) { - value = (__bridge_transfer NSString*)ABRecordCopyValue(self.record, kABPersonNicknameProperty); - [nc setObject:(value != nil) ? value:[NSNull null] forKey:kW3ContactNickname]; - } - - // name dictionary - // NSLog(@"getting name info"); - NSObject* data = [self extractName]; - if (data != nil) { - [nc setObject:data forKey:kW3ContactName]; - } - if ([self.returnFields objectForKey:kW3ContactDisplayName] && ((data == nil) || ([(NSDictionary*)data objectForKey : kW3ContactFormattedName] == [NSNull null]))) { - // user asked for displayName which iOS doesn't support but there is no other name data being returned - // try and use Composite Name so some name is returned - id tryName = (__bridge_transfer NSString*)ABRecordCopyCompositeName(self.record); - if (tryName != nil) { - [nc setObject:tryName forKey:kW3ContactDisplayName]; - } else { - // use nickname or empty string - value = (__bridge_transfer NSString*)ABRecordCopyValue(self.record, kABPersonNicknameProperty); - [nc setObject:(value != nil) ? value:@"" forKey:kW3ContactDisplayName]; - } - } - // phoneNumbers array - // NSLog(@"getting phoneNumbers"); - value = [self extractMultiValue:kW3ContactPhoneNumbers]; - if (value != nil) { - [nc setObject:value forKey:kW3ContactPhoneNumbers]; - } - // emails array - // NSLog(@"getting emails"); - value = [self extractMultiValue:kW3ContactEmails]; - if (value != nil) { - [nc setObject:value forKey:kW3ContactEmails]; - } - // urls array - value = [self extractMultiValue:kW3ContactUrls]; - if (value != nil) { - [nc setObject:value forKey:kW3ContactUrls]; - } - // addresses array - // NSLog(@"getting addresses"); - value = [self extractAddresses]; - if (value != nil) { - [nc setObject:value forKey:kW3ContactAddresses]; - } - // im array - // NSLog(@"getting ims"); - value = [self extractIms]; - if (value != nil) { - [nc setObject:value forKey:kW3ContactIms]; - } - // organization array (only info for one organization in iOS) - // NSLog(@"getting organizations"); - value = [self extractOrganizations]; - if (value != nil) { - [nc setObject:value forKey:kW3ContactOrganizations]; - } - - // for simple properties, could make this a bit more efficient by storing all simple properties in a single - // array in the returnFields dictionary and setting them via a for loop through the array - - // add dates - // NSLog(@"getting dates"); - NSNumber* ms; - - /** Contact Revision field removed from June 16, 2011 version of specification - - if ([self.returnFields valueForKey:kW3ContactUpdated]){ - ms = [self getDateAsNumber: kABPersonModificationDateProperty]; - if (!ms){ - // try and get published date - ms = [self getDateAsNumber: kABPersonCreationDateProperty]; - } - if (ms){ - [nc setObject: ms forKey:kW3ContactUpdated]; - } - - } - */ - - if ([self.returnFields valueForKey:kW3ContactBirthday]) { - ms = [self getDateAsNumber:kABPersonBirthdayProperty]; - if (ms) { - [nc setObject:ms forKey:kW3ContactBirthday]; - } - } - - /* Anniversary removed from 12-09-2010 W3C Contacts api spec - if ([self.returnFields valueForKey:kW3ContactAnniversary]){ - // Anniversary date is stored in a multivalue property - ABMultiValueRef multi = ABRecordCopyValue(self.record, kABPersonDateProperty); - if (multi){ - CFStringRef label = nil; - CFIndex count = ABMultiValueGetCount(multi); - // see if contains an Anniversary date - for(CFIndex i=0; i 0) { // ?? this will always be true since we set id,label,primary field?? - [(NSMutableArray*)addresses addObject : newAddress]; - } - CFRelease(dict); - } // end of loop through addresses - } else { - addresses = [NSNull null]; - } - if (multi) { - CFRelease(multi); - } - - return addresses; -} - -/* Create array of Dictionaries to match JavaScript ContactField object for ims - * type one of [aim, gtalk, icq, xmpp, msn, skype, qq, yahoo] needs other as well - * value - * (bool) primary - * id - * - * iOS IMs are a MultiValue Properties with label, value=dictionary of IM details (service, username), and id - */ -- (NSObject*)extractIms -{ - NSArray* fields = [self.returnFields objectForKey:kW3ContactIms]; - - if (fields == nil) { // no name fields requested - return nil; - } - NSObject* imArray; - ABMultiValueRef multi = ABRecordCopyValue(self.record, kABPersonInstantMessageProperty); - CFIndex count = multi ? ABMultiValueGetCount(multi) : 0; - if (count) { - imArray = [NSMutableArray arrayWithCapacity:count]; - - for (CFIndex i = 0; i < ABMultiValueGetCount(multi); i++) { - NSMutableDictionary* newDict = [NSMutableDictionary dictionaryWithCapacity:3]; - // iOS has label property (work, home, other) for each IM but W3C contact API doesn't use - CFDictionaryRef dict = (CFDictionaryRef)ABMultiValueCopyValueAtIndex(multi, i); - CFStringRef value; // all values should be CFStringRefs / NSString* - bool bFound; - if ([fields containsObject:kW3ContactFieldValue]) { - // value = user name - bFound = CFDictionaryGetValueIfPresent(dict, kABPersonInstantMessageUsernameKey, (void*)&value); - if (bFound && (value != NULL)) { - CFRetain(value); - [newDict setObject:(__bridge id)value forKey:kW3ContactFieldValue]; - CFRelease(value); - } else { - [newDict setObject:[NSNull null] forKey:kW3ContactFieldValue]; - } - } - if ([fields containsObject:kW3ContactFieldType]) { - bFound = CFDictionaryGetValueIfPresent(dict, kABPersonInstantMessageServiceKey, (void*)&value); - if (bFound && (value != NULL)) { - CFRetain(value); - [newDict setObject:(id)[[CDVContact class] convertPropertyLabelToContactType : (__bridge NSString*)value] forKey:kW3ContactFieldType]; - CFRelease(value); - } else { - [newDict setObject:[NSNull null] forKey:kW3ContactFieldType]; - } - } - // always set ID - id identifier = [NSNumber numberWithUnsignedInt:ABMultiValueGetIdentifierAtIndex(multi, i)]; - [newDict setObject:(identifier != nil) ? identifier:[NSNull null] forKey:kW3ContactFieldId]; - - [(NSMutableArray*)imArray addObject : newDict]; - CFRelease(dict); - } - } else { - imArray = [NSNull null]; - } - - if (multi) { - CFRelease(multi); - } - return imArray; -} - -/* Create array of Dictionaries to match JavaScript ContactOrganization object - * pref - not supported in iOS - * type - not supported in iOS - * name - * department - * title - */ - -- (NSObject*)extractOrganizations -{ - NSArray* fields = [self.returnFields objectForKey:kW3ContactOrganizations]; - - if (fields == nil) { // no name fields requested - return nil; - } - NSObject* array = nil; - NSMutableDictionary* newDict = [NSMutableDictionary dictionaryWithCapacity:5]; - id value; - int validValueCount = 0; - - for (id i in fields) { - id key = [[CDVContact defaultW3CtoAB] valueForKey:i]; - if (key && [key isKindOfClass:[NSNumber class]]) { - value = (__bridge_transfer NSString*)ABRecordCopyValue(self.record, (ABPropertyID)[[[CDVContact defaultW3CtoAB] valueForKey:i] intValue]); - if (value != nil) { - // if there are no organization values we should return null for organization - // this counter keeps indicates if any organization values have been set - validValueCount++; - } - [newDict setObject:(value != nil) ? value:[NSNull null] forKey:i]; - } else { // not a key iOS supports, set to null - [newDict setObject:[NSNull null] forKey:i]; - } - } - - if (([newDict count] > 0) && (validValueCount > 0)) { - // add pref and type - // they are not supported by iOS and thus these values never change - [newDict setObject:@"false" forKey:kW3ContactFieldPrimary]; - [newDict setObject:[NSNull null] forKey:kW3ContactFieldType]; - array = [NSMutableArray arrayWithCapacity:1]; - [(NSMutableArray*)array addObject : newDict]; - } else { - array = [NSNull null]; - } - return array; -} - -// W3C Contacts expects an array of photos. Can return photos in more than one format, currently -// just returning the default format -// Save the photo data into tmp directory and return FileURI - temp directory is deleted upon application exit -- (NSObject*)extractPhotos -{ - NSMutableArray* photos = nil; - - if (ABPersonHasImageData(self.record)) { - CFDataRef photoData = ABPersonCopyImageData(self.record); - NSData* data = (__bridge NSData*)photoData; - // write to temp directory and store URI in photos array - // get the temp directory path - NSString* docsPath = [NSTemporaryDirectory()stringByStandardizingPath]; - NSError* err = nil; - NSString* filePath = [NSString stringWithFormat:@"%@/photo_XXXXX", docsPath]; - char template[filePath.length + 1]; - strcpy(template, [filePath cStringUsingEncoding:NSASCIIStringEncoding]); - mkstemp(template); - filePath = [[NSFileManager defaultManager] - stringWithFileSystemRepresentation:template - length:strlen(template)]; - - // save file - if ([data writeToFile:filePath options:NSAtomicWrite error:&err]) { - photos = [NSMutableArray arrayWithCapacity:1]; - NSMutableDictionary* newDict = [NSMutableDictionary dictionaryWithCapacity:2]; - [newDict setObject:filePath forKey:kW3ContactFieldValue]; - [newDict setObject:@"url" forKey:kW3ContactFieldType]; - [newDict setObject:@"false" forKey:kW3ContactFieldPrimary]; - [photos addObject:newDict]; - } - - CFRelease(photoData); - } - return photos; -} - -/** - * given an array of W3C Contact field names, create a dictionary of field names to extract - * if field name represents an object, return all properties for that object: "name" - returns all properties in ContactName - * if field name is an explicit property, return only those properties: "name.givenName - returns a ContactName with only ContactName.givenName - * if field contains ONLY ["*"] return all fields - * dictionary format: - * key is W3Contact #define - * value is NSMutableArray* for complex keys: name,addresses,organizations, phone, emails, ims - * value is [NSNull null] for simple keys -*/ -+ (NSDictionary*)calcReturnFields:(NSArray*)fieldsArray // NSLog(@"getting self.returnFields"); -{ - NSMutableDictionary* d = [NSMutableDictionary dictionaryWithCapacity:1]; - - if ((fieldsArray != nil) && [fieldsArray isKindOfClass:[NSArray class]]) { - if (([fieldsArray count] == 1) && [[fieldsArray objectAtIndex:0] isEqualToString:@"*"]) { - return [CDVContact defaultFields]; // return all fields - } - - for (id i in fieldsArray) { - NSMutableArray* keys = nil; - NSString* fieldStr = nil; - if ([i isKindOfClass:[NSNumber class]]) { - fieldStr = [i stringValue]; - } else { - fieldStr = i; - } - - // see if this is specific property request in object - object.property - NSArray* parts = [fieldStr componentsSeparatedByString:@"."]; // returns original string if no separator found - NSString* name = [parts objectAtIndex:0]; - NSString* property = nil; - if ([parts count] > 1) { - property = [parts objectAtIndex:1]; - } - // see if this is a complex field by looking for its array of properties in objectAndProperties dictionary - id fields = [[CDVContact defaultObjectAndProperties] objectForKey:name]; - - // if find complex name (name,addresses,organizations, phone, emails, ims) in fields, add name as key - // with array of associated properties as the value - if ((fields != nil) && (property == nil)) { // request was for full object - keys = [NSMutableArray arrayWithArray:fields]; - if (keys != nil) { - [d setObject:keys forKey:name]; // will replace if prop array already exists - } - } else if ((fields != nil) && (property != nil)) { - // found an individual property request in form of name.property - // verify is real property name by using it as key in W3CtoAB - id abEquiv = [[CDVContact defaultW3CtoAB] objectForKey:property]; - if (abEquiv || [[CDVContact defaultW3CtoNull] containsObject:property]) { - // if existing array add to it - if ((keys = [d objectForKey:name]) != nil) { - [keys addObject:property]; - } else { - keys = [NSMutableArray arrayWithObject:property]; - [d setObject:keys forKey:name]; - } - } else { - NSLog(@"Contacts.find -- request for invalid property ignored: %@.%@", name, property); - } - } else { // is an individual property, verify is real property name by using it as key in W3CtoAB - id valid = [[CDVContact defaultW3CtoAB] objectForKey:name]; - if (valid || [[CDVContact defaultW3CtoNull] containsObject:name]) { - [d setObject:[NSNull null] forKey:name]; - } - } - } - } - if ([d count] == 0) { - // no array or nothing in the array. W3C spec says to return nothing - return nil; // [Contact defaultFields]; - } - return d; -} - -/* - * Search for the specified value in each of the fields specified in the searchFields dictionary. - * NSString* value - the string value to search for (need clarification from W3C on how to search for dates) - * NSDictionary* searchFields - a dictionary created via calcReturnFields where the key is the top level W3C - * object and the object is the array of specific fields within that object or null if it is a single property - * RETURNS - * YES as soon as a match is found in any of the fields - * NO - the specified value does not exist in any of the fields in this contact - * - * Note: I'm not a fan of returning in the middle of methods but have done it some in this method in order to - * keep the code simpler. bgibson - */ -- (BOOL)foundValue:(NSString*)testValue inFields:(NSDictionary*)searchFields -{ - BOOL bFound = NO; - - if ((testValue == nil) || ![testValue isKindOfClass:[NSString class]] || ([testValue length] == 0)) { - // nothing to find so return NO - return NO; - } - NSInteger valueAsInt = [testValue integerValue]; - - // per W3C spec, always include id in search - int recordId = ABRecordGetRecordID(self.record); - if (valueAsInt && (recordId == valueAsInt)) { - return YES; - } - - if (searchFields == nil) { - // no fields to search - return NO; - } - - if ([searchFields valueForKey:kW3ContactNickname]) { - bFound = [self testStringValue:testValue forW3CProperty:kW3ContactNickname]; - if (bFound == YES) { - return bFound; - } - } - - if ([searchFields valueForKeyIsArray:kW3ContactName]) { - // test name fields. All are string properties obtained via ABRecordCopyValue except kW3ContactFormattedName - NSArray* fields = [searchFields valueForKey:kW3ContactName]; - - for (NSString* testItem in fields) { - if ([testItem isEqualToString:kW3ContactFormattedName]) { - NSString* propValue = (__bridge_transfer NSString*)ABRecordCopyCompositeName(self.record); - if ((propValue != nil) && ([propValue length] > 0)) { - NSRange range = [propValue rangeOfString:testValue options:NSCaseInsensitiveSearch]; - bFound = (range.location != NSNotFound); - propValue = nil; - } - } else { - bFound = [self testStringValue:testValue forW3CProperty:testItem]; - } - - if (bFound) { - break; - } - } - } - if (!bFound && [searchFields valueForKeyIsArray:kW3ContactPhoneNumbers]) { - bFound = [self searchContactFields:(NSArray*)[searchFields valueForKey:kW3ContactPhoneNumbers] - forMVStringProperty:kABPersonPhoneProperty withValue:testValue]; - } - if (!bFound && [searchFields valueForKeyIsArray:kW3ContactEmails]) { - bFound = [self searchContactFields:(NSArray*)[searchFields valueForKey:kW3ContactEmails] - forMVStringProperty:kABPersonEmailProperty withValue:testValue]; - } - - if (!bFound && [searchFields valueForKeyIsArray:kW3ContactAddresses]) { - bFound = [self searchContactFields:[searchFields valueForKey:kW3ContactAddresses] - forMVDictionaryProperty:kABPersonAddressProperty withValue:testValue]; - } - - if (!bFound && [searchFields valueForKeyIsArray:kW3ContactIms]) { - bFound = [self searchContactFields:[searchFields valueForKey:kW3ContactIms] - forMVDictionaryProperty:kABPersonInstantMessageProperty withValue:testValue]; - } - - if (!bFound && [searchFields valueForKeyIsArray:kW3ContactOrganizations]) { - NSArray* fields = [searchFields valueForKey:kW3ContactOrganizations]; - - for (NSString* testItem in fields) { - bFound = [self testStringValue:testValue forW3CProperty:testItem]; - if (bFound == YES) { - break; - } - } - } - if (!bFound && [searchFields valueForKey:kW3ContactNote]) { - bFound = [self testStringValue:testValue forW3CProperty:kW3ContactNote]; - } - - // if searching for a date field is requested, get the date field as a localized string then look for match against testValue in date string - // searching for photos is not supported - if (!bFound && [searchFields valueForKey:kW3ContactBirthday]) { - bFound = [self testDateValue:testValue forW3CProperty:kW3ContactBirthday]; - } - if (!bFound && [searchFields valueForKeyIsArray:kW3ContactUrls]) { - bFound = [self searchContactFields:(NSArray*)[searchFields valueForKey:kW3ContactUrls] - forMVStringProperty:kABPersonURLProperty withValue:testValue]; - } - - return bFound; -} - -/* - * Test for the existence of a given string within the value of a ABPersonRecord string property based on the W3c property name. - * - * IN: - * NSString* testValue - the value to find - search is case insensitive - * NSString* property - the W3c property string - * OUT: - * BOOL YES if the given string was found within the property value - * NO if the testValue was not found, W3C property string was invalid or the AddressBook property was not a string - */ -- (BOOL)testStringValue:(NSString*)testValue forW3CProperty:(NSString*)property -{ - BOOL bFound = NO; - - if ([[CDVContact defaultW3CtoAB] valueForKeyIsNumber:property]) { - ABPropertyID propId = [[[CDVContact defaultW3CtoAB] objectForKey:property] intValue]; - if (ABPersonGetTypeOfProperty(propId) == kABStringPropertyType) { - NSString* propValue = (__bridge_transfer NSString*)ABRecordCopyValue(self.record, propId); - if ((propValue != nil) && ([propValue length] > 0)) { - NSPredicate* containPred = [NSPredicate predicateWithFormat:@"SELF contains[cd] %@", testValue]; - bFound = [containPred evaluateWithObject:propValue]; - // NSRange range = [propValue rangeOfString:testValue options: NSCaseInsensitiveSearch]; - // bFound = (range.location != NSNotFound); - } - } - } - return bFound; -} - -/* - * Test for the existence of a given Date string within the value of a ABPersonRecord datetime property based on the W3c property name. - * - * IN: - * NSString* testValue - the value to find - search is case insensitive - * NSString* property - the W3c property string - * OUT: - * BOOL YES if the given string was found within the localized date string value - * NO if the testValue was not found, W3C property string was invalid or the AddressBook property was not a DateTime - */ -- (BOOL)testDateValue:(NSString*)testValue forW3CProperty:(NSString*)property -{ - BOOL bFound = NO; - - if ([[CDVContact defaultW3CtoAB] valueForKeyIsNumber:property]) { - ABPropertyID propId = [[[CDVContact defaultW3CtoAB] objectForKey:property] intValue]; - if (ABPersonGetTypeOfProperty(propId) == kABDateTimePropertyType) { - NSDate* date = (__bridge_transfer NSDate*)ABRecordCopyValue(self.record, propId); - if (date != nil) { - NSString* dateString = [date descriptionWithLocale:[NSLocale currentLocale]]; - NSPredicate* containPred = [NSPredicate predicateWithFormat:@"SELF contains[cd] %@", testValue]; - bFound = [containPred evaluateWithObject:dateString]; - } - } - } - return bFound; -} - -/* - * Search the specified fields within an AddressBook multivalue string property for the specified test value. - * Used for phoneNumbers, emails and urls. - * IN: - * NSArray* fields - the fields to search for within the multistring property (value and/or type) - * ABPropertyID - the property to search - * NSString* testValue - the value to search for. Will convert between W3C types and AB types. Will only - * search for types if the testValue is a valid ContactField type. - * OUT: - * YES if the test value was found in one of the specified fields - * NO if the test value was not found - */ -- (BOOL)searchContactFields:(NSArray*)fields forMVStringProperty:(ABPropertyID)propId withValue:testValue -{ - BOOL bFound = NO; - - for (NSString* type in fields) { - NSString* testString = nil; - if ([type isEqualToString:kW3ContactFieldType]) { - if ([CDVContact isValidW3ContactType:testValue]) { - // only search types if the filter string is a valid ContactField.type - testString = (NSString*)[CDVContact convertContactTypeToPropertyLabel:testValue]; - } - } else { - testString = testValue; - } - - if (testString != nil) { - bFound = [self testMultiValueStrings:testString forProperty:propId ofType:type]; - } - if (bFound == YES) { - break; - } - } - - return bFound; -} - -/* - * Searches a multiString value of the specified type for the specified test value. - * - * IN: - * NSString* testValue - the value to test for - * ABPropertyID propId - the property id of the multivalue property to search - * NSString* type - the W3C contact type to search for (value or type) - * OUT: - * YES is the test value was found - * NO if the test value was not found - */ -- (BOOL)testMultiValueStrings:(NSString*)testValue forProperty:(ABPropertyID)propId ofType:(NSString*)type -{ - BOOL bFound = NO; - - if (ABPersonGetTypeOfProperty(propId) == kABMultiStringPropertyType) { - NSArray* valueArray = nil; - if ([type isEqualToString:kW3ContactFieldType]) { - valueArray = [self labelsForProperty:propId inRecord:self.record]; - } else if ([type isEqualToString:kW3ContactFieldValue]) { - valueArray = [self valuesForProperty:propId inRecord:self.record]; - } - if (valueArray) { - NSString* valuesAsString = [valueArray componentsJoinedByString:@" "]; - NSPredicate* containPred = [NSPredicate predicateWithFormat:@"SELF contains[cd] %@", testValue]; - bFound = [containPred evaluateWithObject:valuesAsString]; - } - } - return bFound; -} - -/* - * Returns the array of values for a multivalue string property of the specified property id - */ -- (__autoreleasing NSArray*)valuesForProperty:(ABPropertyID)propId inRecord:(ABRecordRef)aRecord -{ - ABMultiValueRef multi = ABRecordCopyValue(aRecord, propId); - NSArray* values = (__bridge_transfer NSArray*)ABMultiValueCopyArrayOfAllValues(multi); - - CFRelease(multi); - return values; -} - -/* - * Returns the array of labels for a multivalue string property of the specified property id - */ -- (NSArray*)labelsForProperty:(ABPropertyID)propId inRecord:(ABRecordRef)aRecord -{ - ABMultiValueRef multi = ABRecordCopyValue(aRecord, propId); - CFIndex count = ABMultiValueGetCount(multi); - NSMutableArray* labels = [NSMutableArray arrayWithCapacity:count]; - - for (int i = 0; i < count; i++) { - NSString* label = (__bridge_transfer NSString*)ABMultiValueCopyLabelAtIndex(multi, i); - if (label) { - [labels addObject:label]; - } - } - - CFRelease(multi); - return labels; -} - -/* search for values within MultiValue Dictionary properties Address or IM property - * IN: - * (NSArray*) fields - the array of W3C field names to search within - * (ABPropertyID) propId - the AddressBook property that returns a multivalue dictionary - * (NSString*) testValue - the string to search for within the specified fields - * - */ -- (BOOL)searchContactFields:(NSArray*)fields forMVDictionaryProperty:(ABPropertyID)propId withValue:(NSString*)testValue -{ - BOOL bFound = NO; - - NSArray* values = [self valuesForProperty:propId inRecord:self.record]; // array of dictionaries (as CFDictionaryRef) - int dictCount = [values count]; - - // for ims dictionary contains with service (w3C type) and username (W3c value) - // for addresses dictionary contains street, city, state, zip, country - for (int i = 0; i < dictCount; i++) { - CFDictionaryRef dict = (__bridge CFDictionaryRef)[values objectAtIndex:i]; - - for (NSString* member in fields) { - NSString* abKey = [[CDVContact defaultW3CtoAB] valueForKey:member]; // im and address fields are all strings - CFStringRef abValue = nil; - if (abKey) { - NSString* testString = nil; - if ([member isEqualToString:kW3ContactImType]) { - if ([CDVContact isValidW3ContactType:testValue]) { - // only search service/types if the filter string is a valid ContactField.type - testString = (NSString*)[CDVContact convertContactTypeToPropertyLabel:testValue]; - } - } else { - testString = testValue; - } - if (testString != nil) { - BOOL bExists = CFDictionaryGetValueIfPresent(dict, (__bridge const void*)abKey, (void*)&abValue); - if (bExists) { - CFRetain(abValue); - NSPredicate* containPred = [NSPredicate predicateWithFormat:@"SELF contains[cd] %@", testString]; - bFound = [containPred evaluateWithObject:(__bridge id)abValue]; - CFRelease(abValue); - } - } - } - if (bFound == YES) { - break; - } - } // end of for each member in fields - - if (bFound == YES) { - break; - } - } // end of for each dictionary - - return bFound; -} - -@end diff --git a/cordova-lib/spec-plugman-install/plugins/Contacts/src/ios/CDVContacts.h b/cordova-lib/spec-plugman-install/plugins/Contacts/src/ios/CDVContacts.h deleted file mode 100644 index e3deb21b4..000000000 --- a/cordova-lib/spec-plugman-install/plugins/Contacts/src/ios/CDVContacts.h +++ /dev/null @@ -1,151 +0,0 @@ -/* - Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.0 (the - "License"); you may not use this file except in compliance - with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, - software distributed under the License is distributed on an - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - KIND, either express or implied. See the License for the - specific language governing permissions and limitations - under the License. - */ - -#import -#import -#import -#import -#import "CDVContact.h" - -@interface CDVContacts : CDVPlugin -{ - ABAddressBookRef addressBook; -} - -/* - * newContact - create a new contact via the GUI - * - * arguments: - * 1: successCallback: this is the javascript function that will be called with the newly created contactId - */ -- (void)newContact:(CDVInvokedUrlCommand*)command; - -/* - * displayContact - IN PROGRESS - * - * arguments: - * 1: recordID of the contact to display in the iPhone contact display - * 2: successCallback - currently not used - * 3: error callback - * options: - * allowsEditing: set to true to allow the user to edit the contact - currently not supported - */ -- (void)displayContact:(CDVInvokedUrlCommand*)command; - -/* - * chooseContact - * - * arguments: - * 1: this is the javascript function that will be called with the contact data as a JSON object (as the first param) - * options: - * allowsEditing: set to true to not choose the contact, but to edit it in the iPhone contact editor - */ -- (void)chooseContact:(CDVInvokedUrlCommand*)command; - -- (void)newPersonViewController:(ABNewPersonViewController*)newPersonViewController didCompleteWithNewPerson:(ABRecordRef)person; -- (BOOL)personViewController:(ABPersonViewController*)personViewController shouldPerformDefaultActionForPerson:(ABRecordRef)person - property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifierForValue; - -/* - * search - searches for contacts. Only person records are currently supported. - * - * arguments: - * 1: successcallback - this is the javascript function that will be called with the array of found contacts - * 2: errorCallback - optional javascript function to be called in the event of an error with an error code. - * options: dictionary containing ContactFields and ContactFindOptions - * fields - ContactFields array - * findOptions - ContactFindOptions object as dictionary - * - */ -- (void)search:(CDVInvokedUrlCommand*)command; - -/* - * save - saves a new contact or updates and existing contact - * - * arguments: - * 1: success callback - this is the javascript function that will be called with the JSON representation of the saved contact - * search calls a fixed navigator.service.contacts._findCallback which then calls the success callback stored before making the call into obj-c - */ -- (void)save:(CDVInvokedUrlCommand*)command; - -/* - * remove - removes a contact from the address book - * - * arguments: - * 1: 1: successcallback - this is the javascript function that will be called with a (now) empty contact object - * - * options: dictionary containing Contact object to remove - * contact - Contact object as dictionary - */ -- (void)remove:(CDVInvokedUrlCommand*)command; - -// - (void) dealloc; - -@end - -@interface CDVContactsPicker : ABPeoplePickerNavigationController -{ - BOOL allowsEditing; - NSString* callbackId; - NSDictionary* options; - NSDictionary* pickedContactDictionary; -} - -@property BOOL allowsEditing; -@property (copy) NSString* callbackId; -@property (nonatomic, strong) NSDictionary* options; -@property (nonatomic, strong) NSDictionary* pickedContactDictionary; - -@end - -@interface CDVNewContactsController : ABNewPersonViewController -{ - NSString* callbackId; -} -@property (copy) NSString* callbackId; -@end - -/* ABPersonViewController does not have any UI to dismiss. Adding navigationItems to it does not work properly, the navigationItems are lost when the app goes into the background. - The solution was to create an empty NavController in front of the ABPersonViewController. This - causes the ABPersonViewController to have a back button. By subclassing the ABPersonViewController, - we can override viewWillDisappear and take down the entire NavigationController at that time. - */ -@interface CDVDisplayContactViewController : ABPersonViewController -{} -@property (nonatomic, strong) CDVPlugin* contactsPlugin; - -@end -@interface CDVAddressBookAccessError : NSObject -{} -@property (assign) CDVContactError errorCode; -- (CDVAddressBookAccessError*)initWithCode:(CDVContactError)code; -@end - -typedef void (^ CDVAddressBookWorkerBlock)( - ABAddressBookRef addressBook, - CDVAddressBookAccessError* error - ); -@interface CDVAddressBookHelper : NSObject -{} - -- (void)createAddressBook:(CDVAddressBookWorkerBlock)workerBlock; -@end diff --git a/cordova-lib/spec-plugman-install/plugins/Contacts/src/ios/CDVContacts.m b/cordova-lib/spec-plugman-install/plugins/Contacts/src/ios/CDVContacts.m deleted file mode 100644 index 3ca3e814d..000000000 --- a/cordova-lib/spec-plugman-install/plugins/Contacts/src/ios/CDVContacts.m +++ /dev/null @@ -1,593 +0,0 @@ -/* - Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.0 (the - "License"); you may not use this file except in compliance - with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, - software distributed under the License is distributed on an - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - KIND, either express or implied. See the License for the - specific language governing permissions and limitations - under the License. - */ - -#import "CDVContacts.h" -#import -#import -#import -//#import "CDVNotification.h" - -@implementation CDVContactsPicker - -@synthesize allowsEditing; -@synthesize callbackId; -@synthesize options; -@synthesize pickedContactDictionary; - -@end -@implementation CDVNewContactsController - -@synthesize callbackId; - -@end - -@implementation CDVContacts - -// no longer used since code gets AddressBook for each operation. -// If address book changes during save or remove operation, may get error but not much we can do about it -// If address book changes during UI creation, display or edit, we don't control any saves so no need for callback - -/*void addressBookChanged(ABAddressBookRef addressBook, CFDictionaryRef info, void* context) -{ - // note that this function is only called when another AddressBook instance modifies - // the address book, not the current one. For example, through an OTA MobileMe sync - Contacts* contacts = (Contacts*)context; - [contacts addressBookDirty]; - }*/ - -- (CDVPlugin*)initWithWebView:(UIWebView*)theWebView -{ - self = (CDVContacts*)[super initWithWebView:(UIWebView*)theWebView]; - - /*if (self) { - addressBook = ABAddressBookCreate(); - ABAddressBookRegisterExternalChangeCallback(addressBook, addressBookChanged, self); - }*/ - - return self; -} - -// overridden to clean up Contact statics -- (void)onAppTerminate -{ - // NSLog(@"Contacts::onAppTerminate"); -} - -// iPhone only method to create a new contact through the GUI -- (void)newContact:(CDVInvokedUrlCommand*)command -{ - NSString* callbackId = command.callbackId; - - CDVAddressBookHelper* abHelper = [[CDVAddressBookHelper alloc] init]; - CDVContacts* __weak weakSelf = self; // play it safe to avoid retain cycles - - [abHelper createAddressBook: ^(ABAddressBookRef addrBook, CDVAddressBookAccessError* errCode) { - if (addrBook == NULL) { - // permission was denied or other error just return (no error callback) - return; - } - CDVNewContactsController* npController = [[CDVNewContactsController alloc] init]; - npController.addressBook = addrBook; // a CF retaining assign - CFRelease(addrBook); - - npController.newPersonViewDelegate = self; - npController.callbackId = callbackId; - - UINavigationController* navController = [[UINavigationController alloc] initWithRootViewController:npController]; - - if ([weakSelf.viewController respondsToSelector:@selector(presentViewController:::)]) { - [weakSelf.viewController presentViewController:navController animated:YES completion:nil]; - } else { - [weakSelf.viewController presentModalViewController:navController animated:YES]; - } - }]; -} - -- (void)newPersonViewController:(ABNewPersonViewController*)newPersonViewController didCompleteWithNewPerson:(ABRecordRef)person -{ - ABRecordID recordId = kABRecordInvalidID; - CDVNewContactsController* newCP = (CDVNewContactsController*)newPersonViewController; - NSString* callbackId = newCP.callbackId; - - if (person != NULL) { - // return the contact id - recordId = ABRecordGetRecordID(person); - } - - if ([newPersonViewController respondsToSelector:@selector(presentingViewController)]) { - [[newPersonViewController presentingViewController] dismissViewControllerAnimated:YES completion:nil]; - } else { - [[newPersonViewController parentViewController] dismissModalViewControllerAnimated:YES]; - } - - CDVPluginResult* result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsInt:recordId]; - [self.commandDelegate sendPluginResult:result callbackId:callbackId]; -} - -- (void)displayContact:(CDVInvokedUrlCommand*)command -{ - NSString* callbackId = command.callbackId; - ABRecordID recordID = [[command.arguments objectAtIndex:0] intValue]; - NSDictionary* options = [command.arguments objectAtIndex:1 withDefault:[NSNull null]]; - bool bEdit = [options isKindOfClass:[NSNull class]] ? false : [options existsValue:@"true" forKey:@"allowsEditing"]; - - CDVAddressBookHelper* abHelper = [[CDVAddressBookHelper alloc] init]; - CDVContacts* __weak weakSelf = self; // play it safe to avoid retain cycles - - [abHelper createAddressBook: ^(ABAddressBookRef addrBook, CDVAddressBookAccessError* errCode) { - if (addrBook == NULL) { - // permission was denied or other error - return error - CDVPluginResult* result = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageToErrorObject:errCode ? errCode.errorCode:UNKNOWN_ERROR]; - [weakSelf.commandDelegate sendPluginResult:result callbackId:callbackId]; - return; - } - ABRecordRef rec = ABAddressBookGetPersonWithRecordID(addrBook, recordID); - - if (rec) { - CDVDisplayContactViewController* personController = [[CDVDisplayContactViewController alloc] init]; - personController.displayedPerson = rec; - personController.personViewDelegate = self; - personController.allowsEditing = NO; - - // create this so DisplayContactViewController will have a "back" button. - UIViewController* parentController = [[UIViewController alloc] init]; - UINavigationController* navController = [[UINavigationController alloc] initWithRootViewController:parentController]; - - [navController pushViewController:personController animated:YES]; - - if ([self.viewController respondsToSelector:@selector(presentViewController:::)]) { - [self.viewController presentViewController:navController animated:YES completion:nil]; - } else { - [self.viewController presentModalViewController:navController animated:YES]; - } - - if (bEdit) { - // create the editing controller and push it onto the stack - ABPersonViewController* editPersonController = [[ABPersonViewController alloc] init]; - editPersonController.displayedPerson = rec; - editPersonController.personViewDelegate = self; - editPersonController.allowsEditing = YES; - [navController pushViewController:editPersonController animated:YES]; - } - } else { - // no record, return error - CDVPluginResult* result = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsInt:UNKNOWN_ERROR]; - [weakSelf.commandDelegate sendPluginResult:result callbackId:callbackId]; - } - CFRelease(addrBook); - }]; -} - -- (BOOL)personViewController:(ABPersonViewController*)personViewController shouldPerformDefaultActionForPerson:(ABRecordRef)person - property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifierForValue -{ - return YES; -} - -- (void)chooseContact:(CDVInvokedUrlCommand*)command -{ - NSString* callbackId = command.callbackId; - NSDictionary* options = [command.arguments objectAtIndex:0 withDefault:[NSNull null]]; - - CDVContactsPicker* pickerController = [[CDVContactsPicker alloc] init]; - - pickerController.peoplePickerDelegate = self; - pickerController.callbackId = callbackId; - pickerController.options = options; - pickerController.pickedContactDictionary = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithInt:kABRecordInvalidID], kW3ContactId, nil]; - pickerController.allowsEditing = (BOOL)[options existsValue : @"true" forKey : @"allowsEditing"]; - - if ([self.viewController respondsToSelector:@selector(presentViewController:::)]) { - [self.viewController presentViewController:pickerController animated:YES completion:nil]; - } else { - [self.viewController presentModalViewController:pickerController animated:YES]; - } -} - -- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController*)peoplePicker - shouldContinueAfterSelectingPerson:(ABRecordRef)person -{ - CDVContactsPicker* picker = (CDVContactsPicker*)peoplePicker; - NSNumber* pickedId = [NSNumber numberWithInt:ABRecordGetRecordID(person)]; - - if (picker.allowsEditing) { - ABPersonViewController* personController = [[ABPersonViewController alloc] init]; - personController.displayedPerson = person; - personController.personViewDelegate = self; - personController.allowsEditing = picker.allowsEditing; - // store id so can get info in peoplePickerNavigationControllerDidCancel - picker.pickedContactDictionary = [NSDictionary dictionaryWithObjectsAndKeys:pickedId, kW3ContactId, nil]; - - [peoplePicker pushViewController:personController animated:YES]; - } else { - // Retrieve and return pickedContact information - CDVContact* pickedContact = [[CDVContact alloc] initFromABRecord:(ABRecordRef)person]; - NSArray* fields = [picker.options objectForKey:@"fields"]; - NSDictionary* returnFields = [[CDVContact class] calcReturnFields:fields]; - picker.pickedContactDictionary = [pickedContact toDictionary:returnFields]; - - CDVPluginResult* result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDictionary:picker.pickedContactDictionary]; - [self.commandDelegate sendPluginResult:result callbackId:picker.callbackId]; - - if ([picker respondsToSelector:@selector(presentingViewController)]) { - [[picker presentingViewController] dismissViewControllerAnimated:YES completion:nil]; - } else { - [[picker parentViewController] dismissModalViewControllerAnimated:YES]; - } - } - return NO; -} - -- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController*)peoplePicker - shouldContinueAfterSelectingPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier -{ - return YES; -} - -- (void)peoplePickerNavigationControllerDidCancel:(ABPeoplePickerNavigationController*)peoplePicker -{ - // return contactId or invalid if none picked - CDVContactsPicker* picker = (CDVContactsPicker*)peoplePicker; - - if (picker.allowsEditing) { - // get the info after possible edit - // if we got this far, user has already approved/ disapproved addressBook access - ABAddressBookRef addrBook = nil; -#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 60000 - if (&ABAddressBookCreateWithOptions != NULL) { - addrBook = ABAddressBookCreateWithOptions(NULL, NULL); - } else -#endif - { - // iOS 4 & 5 - addrBook = ABAddressBookCreate(); - } - ABRecordRef person = ABAddressBookGetPersonWithRecordID(addrBook, [[picker.pickedContactDictionary objectForKey:kW3ContactId] integerValue]); - if (person) { - CDVContact* pickedContact = [[CDVContact alloc] initFromABRecord:(ABRecordRef)person]; - NSArray* fields = [picker.options objectForKey:@"fields"]; - NSDictionary* returnFields = [[CDVContact class] calcReturnFields:fields]; - picker.pickedContactDictionary = [pickedContact toDictionary:returnFields]; - } - CFRelease(addrBook); - } - CDVPluginResult* result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDictionary:picker.pickedContactDictionary]; - [self.commandDelegate sendPluginResult:result callbackId:picker.callbackId]; - - if ([peoplePicker respondsToSelector:@selector(presentingViewController)]) { - [[peoplePicker presentingViewController] dismissViewControllerAnimated:YES completion:nil]; - } else { - [[peoplePicker parentViewController] dismissModalViewControllerAnimated:YES]; - } -} - -- (void)search:(CDVInvokedUrlCommand*)command -{ - NSString* callbackId = command.callbackId; - NSArray* fields = [command.arguments objectAtIndex:0]; - NSDictionary* findOptions = [command.arguments objectAtIndex:1 withDefault:[NSNull null]]; - - [self.commandDelegate runInBackground:^{ - // from Apple: Important You must ensure that an instance of ABAddressBookRef is used by only one thread. - // which is why address book is created within the dispatch queue. - // more details here: http: //blog.byadrian.net/2012/05/05/ios-addressbook-framework-and-gcd/ - CDVAddressBookHelper* abHelper = [[CDVAddressBookHelper alloc] init]; - CDVContacts* __weak weakSelf = self; // play it safe to avoid retain cycles - // it gets uglier, block within block..... - [abHelper createAddressBook: ^(ABAddressBookRef addrBook, CDVAddressBookAccessError* errCode) { - if (addrBook == NULL) { - // permission was denied or other error - return error - CDVPluginResult* result = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageToErrorObject:errCode ? errCode.errorCode:UNKNOWN_ERROR]; - [weakSelf.commandDelegate sendPluginResult:result callbackId:callbackId]; - return; - } - - NSArray* foundRecords = nil; - // get the findOptions values - BOOL multiple = NO; // default is false - NSString* filter = nil; - if (![findOptions isKindOfClass:[NSNull class]]) { - id value = nil; - filter = (NSString*)[findOptions objectForKey:@"filter"]; - value = [findOptions objectForKey:@"multiple"]; - if ([value isKindOfClass:[NSNumber class]]) { - // multiple is a boolean that will come through as an NSNumber - multiple = [(NSNumber*)value boolValue]; - // NSLog(@"multiple is: %d", multiple); - } - } - - NSDictionary* returnFields = [[CDVContact class] calcReturnFields:fields]; - - NSMutableArray* matches = nil; - if (!filter || [filter isEqualToString:@""]) { - // get all records - foundRecords = (__bridge_transfer NSArray*)ABAddressBookCopyArrayOfAllPeople(addrBook); - if (foundRecords && ([foundRecords count] > 0)) { - // create Contacts and put into matches array - // doesn't make sense to ask for all records when multiple == NO but better check - int xferCount = multiple == YES ? [foundRecords count] : 1; - matches = [NSMutableArray arrayWithCapacity:xferCount]; - - for (int k = 0; k < xferCount; k++) { - CDVContact* xferContact = [[CDVContact alloc] initFromABRecord:(__bridge ABRecordRef)[foundRecords objectAtIndex:k]]; - [matches addObject:xferContact]; - xferContact = nil; - } - } - } else { - foundRecords = (__bridge_transfer NSArray*)ABAddressBookCopyArrayOfAllPeople(addrBook); - matches = [NSMutableArray arrayWithCapacity:1]; - BOOL bFound = NO; - int testCount = [foundRecords count]; - - for (int j = 0; j < testCount; j++) { - CDVContact* testContact = [[CDVContact alloc] initFromABRecord:(__bridge ABRecordRef)[foundRecords objectAtIndex:j]]; - if (testContact) { - bFound = [testContact foundValue:filter inFields:returnFields]; - if (bFound) { - [matches addObject:testContact]; - } - testContact = nil; - } - } - } - NSMutableArray* returnContacts = [NSMutableArray arrayWithCapacity:1]; - - if ((matches != nil) && ([matches count] > 0)) { - // convert to JS Contacts format and return in callback - // - returnFields determines what properties to return - @autoreleasepool { - int count = multiple == YES ? [matches count] : 1; - - for (int i = 0; i < count; i++) { - CDVContact* newContact = [matches objectAtIndex:i]; - NSDictionary* aContact = [newContact toDictionary:returnFields]; - [returnContacts addObject:aContact]; - } - } - } - // return found contacts (array is empty if no contacts found) - CDVPluginResult* result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsArray:returnContacts]; - [weakSelf.commandDelegate sendPluginResult:result callbackId:callbackId]; - // NSLog(@"findCallback string: %@", jsString); - - if (addrBook) { - CFRelease(addrBook); - } - }]; - }]; // end of workQueue block - - return; -} - -- (void)save:(CDVInvokedUrlCommand*)command -{ - NSString* callbackId = command.callbackId; - NSDictionary* contactDict = [command.arguments objectAtIndex:0]; - - [self.commandDelegate runInBackground:^{ - CDVAddressBookHelper* abHelper = [[CDVAddressBookHelper alloc] init]; - CDVContacts* __weak weakSelf = self; // play it safe to avoid retain cycles - - [abHelper createAddressBook: ^(ABAddressBookRef addrBook, CDVAddressBookAccessError* errorCode) { - CDVPluginResult* result = nil; - if (addrBook == NULL) { - // permission was denied or other error - return error - result = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsInt:errorCode ? errorCode.errorCode:UNKNOWN_ERROR]; - [weakSelf.commandDelegate sendPluginResult:result callbackId:callbackId]; - return; - } - - bool bIsError = FALSE, bSuccess = FALSE; - BOOL bUpdate = NO; - CDVContactError errCode = UNKNOWN_ERROR; - CFErrorRef error; - NSNumber* cId = [contactDict valueForKey:kW3ContactId]; - CDVContact* aContact = nil; - ABRecordRef rec = nil; - if (cId && ![cId isKindOfClass:[NSNull class]]) { - rec = ABAddressBookGetPersonWithRecordID(addrBook, [cId intValue]); - if (rec) { - aContact = [[CDVContact alloc] initFromABRecord:rec]; - bUpdate = YES; - } - } - if (!aContact) { - aContact = [[CDVContact alloc] init]; - } - - bSuccess = [aContact setFromContactDict:contactDict asUpdate:bUpdate]; - if (bSuccess) { - if (!bUpdate) { - bSuccess = ABAddressBookAddRecord(addrBook, [aContact record], &error); - } - if (bSuccess) { - bSuccess = ABAddressBookSave(addrBook, &error); - } - if (!bSuccess) { // need to provide error codes - bIsError = TRUE; - errCode = IO_ERROR; - } else { - // give original dictionary back? If generate dictionary from saved contact, have no returnFields specified - // so would give back all fields (which W3C spec. indicates is not desired) - // for now (while testing) give back saved, full contact - NSDictionary* newContact = [aContact toDictionary:[CDVContact defaultFields]]; - // NSString* contactStr = [newContact JSONRepresentation]; - result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDictionary:newContact]; - } - } else { - bIsError = TRUE; - errCode = IO_ERROR; - } - CFRelease(addrBook); - - if (bIsError) { - result = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsInt:errCode]; - } - - if (result) { - [weakSelf.commandDelegate sendPluginResult:result callbackId:callbackId]; - } - }]; - }]; // end of queue -} - -- (void)remove:(CDVInvokedUrlCommand*)command -{ - NSString* callbackId = command.callbackId; - NSNumber* cId = [command.arguments objectAtIndex:0]; - - CDVAddressBookHelper* abHelper = [[CDVAddressBookHelper alloc] init]; - CDVContacts* __weak weakSelf = self; // play it safe to avoid retain cycles - - [abHelper createAddressBook: ^(ABAddressBookRef addrBook, CDVAddressBookAccessError* errorCode) { - CDVPluginResult* result = nil; - if (addrBook == NULL) { - // permission was denied or other error - return error - result = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsInt:errorCode ? errorCode.errorCode:UNKNOWN_ERROR]; - [weakSelf.commandDelegate sendPluginResult:result callbackId:callbackId]; - return; - } - - bool bIsError = FALSE, bSuccess = FALSE; - CDVContactError errCode = UNKNOWN_ERROR; - CFErrorRef error; - ABRecordRef rec = nil; - if (cId && ![cId isKindOfClass:[NSNull class]] && ([cId intValue] != kABRecordInvalidID)) { - rec = ABAddressBookGetPersonWithRecordID(addrBook, [cId intValue]); - if (rec) { - bSuccess = ABAddressBookRemoveRecord(addrBook, rec, &error); - if (!bSuccess) { - bIsError = TRUE; - errCode = IO_ERROR; - } else { - bSuccess = ABAddressBookSave(addrBook, &error); - if (!bSuccess) { - bIsError = TRUE; - errCode = IO_ERROR; - } else { - // set id to null - // [contactDict setObject:[NSNull null] forKey:kW3ContactId]; - // result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDictionary: contactDict]; - result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK]; - // NSString* contactStr = [contactDict JSONRepresentation]; - } - } - } else { - // no record found return error - bIsError = TRUE; - errCode = UNKNOWN_ERROR; - } - } else { - // invalid contact id provided - bIsError = TRUE; - errCode = INVALID_ARGUMENT_ERROR; - } - - if (addrBook) { - CFRelease(addrBook); - } - if (bIsError) { - result = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsInt:errCode]; - } - if (result) { - [weakSelf.commandDelegate sendPluginResult:result callbackId:callbackId]; - } - }]; - return; -} - -@end - -/* ABPersonViewController does not have any UI to dismiss. Adding navigationItems to it does not work properly - * The navigationItems are lost when the app goes into the background. The solution was to create an empty - * NavController in front of the ABPersonViewController. This will cause the ABPersonViewController to have a back button. By subclassing the ABPersonViewController, we can override viewDidDisappear and take down the entire NavigationController. - */ -@implementation CDVDisplayContactViewController -@synthesize contactsPlugin; - -- (void)viewWillDisappear:(BOOL)animated -{ - [super viewWillDisappear:animated]; - - if ([self respondsToSelector:@selector(presentingViewController)]) { - [[self presentingViewController] dismissViewControllerAnimated:YES completion:nil]; - } else { - [[self parentViewController] dismissModalViewControllerAnimated:YES]; - } -} - -@end -@implementation CDVAddressBookAccessError - -@synthesize errorCode; - -- (CDVAddressBookAccessError*)initWithCode:(CDVContactError)code -{ - self = [super init]; - if (self) { - self.errorCode = code; - } - return self; -} - -@end - -@implementation CDVAddressBookHelper - -/** - * NOTE: workerBlock is responsible for releasing the addressBook that is passed to it - */ -- (void)createAddressBook:(CDVAddressBookWorkerBlock)workerBlock -{ - // TODO: this probably should be reworked - seems like the workerBlock can just create and release its own AddressBook, - // and also this important warning from (http://developer.apple.com/library/ios/#documentation/ContactData/Conceptual/AddressBookProgrammingGuideforiPhone/Chapters/BasicObjects.html): - // "Important: Instances of ABAddressBookRef cannot be used by multiple threads. Each thread must make its own instance." - ABAddressBookRef addressBook; - -#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 60000 - if (&ABAddressBookCreateWithOptions != NULL) { - CFErrorRef error = nil; - // CFIndex status = ABAddressBookGetAuthorizationStatus(); - addressBook = ABAddressBookCreateWithOptions(NULL, &error); - // NSLog(@"addressBook access: %lu", status); - ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error) { - // callback can occur in background, address book must be accessed on thread it was created on - dispatch_sync(dispatch_get_main_queue(), ^{ - if (error) { - workerBlock(NULL, [[CDVAddressBookAccessError alloc] initWithCode:UNKNOWN_ERROR]); - } else if (!granted) { - workerBlock(NULL, [[CDVAddressBookAccessError alloc] initWithCode:PERMISSION_DENIED_ERROR]); - } else { - // access granted - workerBlock(addressBook, [[CDVAddressBookAccessError alloc] initWithCode:UNKNOWN_ERROR]); - } - }); - }); - } else -#endif - { - // iOS 4 or 5 no checks needed - addressBook = ABAddressBookCreate(); - workerBlock(addressBook, NULL); - } -} - -@end diff --git a/cordova-lib/spec-plugman-install/plugins/Contacts/src/wp/Contacts.cs b/cordova-lib/spec-plugman-install/plugins/Contacts/src/wp/Contacts.cs deleted file mode 100644 index 6789bb8a0..000000000 --- a/cordova-lib/spec-plugman-install/plugins/Contacts/src/wp/Contacts.cs +++ /dev/null @@ -1,664 +0,0 @@ -/* - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -using Microsoft.Phone.Tasks; -using Microsoft.Phone.UserData; -using System; -using System.Collections; -using System.Collections.Generic; -using System.Diagnostics; -using System.Linq; -using System.Runtime.Serialization; -using System.Windows; -using DeviceContacts = Microsoft.Phone.UserData.Contacts; - - -namespace WPCordovaClassLib.Cordova.Commands -{ - [DataContract] - public class SearchOptions - { - [DataMember] - public string filter { get; set; } - [DataMember] - public bool multiple { get; set; } - } - - [DataContract] - public class ContactSearchParams - { - [DataMember] - public string[] fields { get; set; } - [DataMember] - public SearchOptions options { get; set; } - } - - [DataContract] - public class JSONContactAddress - { - [DataMember] - public string formatted { get; set; } - [DataMember] - public string type { get; set; } - [DataMember] - public string streetAddress { get; set; } - [DataMember] - public string locality { get; set; } - [DataMember] - public string region { get; set; } - [DataMember] - public string postalCode { get; set; } - [DataMember] - public string country { get; set; } - [DataMember] - public bool pref { get; set; } - } - - [DataContract] - public class JSONContactName - { - [DataMember] - public string formatted { get; set; } - [DataMember] - public string familyName { get; set; } - [DataMember] - public string givenName { get; set; } - [DataMember] - public string middleName { get; set; } - [DataMember] - public string honorificPrefix { get; set; } - [DataMember] - public string honorificSuffix { get; set; } - } - - [DataContract] - public class JSONContactField - { - [DataMember] - public string type { get; set; } - [DataMember] - public string value { get; set; } - [DataMember] - public bool pref { get; set; } - } - - [DataContract] - public class JSONContactOrganization - { - [DataMember] - public string type { get; set; } - [DataMember] - public string name { get; set; } - [DataMember] - public bool pref { get; set; } - [DataMember] - public string department { get; set; } - [DataMember] - public string title { get; set; } - } - - [DataContract] - public class JSONContact - { - [DataMember] - public string id { get; set; } - [DataMember] - public string rawId { get; set; } - [DataMember] - public string displayName { get; set; } - [DataMember] - public string nickname { get; set; } - [DataMember] - public string note { get; set; } - - [DataMember] - public JSONContactName name { get; set; } - - [DataMember] - public JSONContactField[] emails { get; set; } - - [DataMember] - public JSONContactField[] phoneNumbers { get; set; } - - [DataMember] - public JSONContactField[] ims { get; set; } - - [DataMember] - public JSONContactField[] photos { get; set; } - - [DataMember] - public JSONContactField[] categories { get; set; } - - [DataMember] - public JSONContactField[] urls { get; set; } - - [DataMember] - public JSONContactOrganization[] organizations { get; set; } - - [DataMember] - public JSONContactAddress[] addresses { get; set; } - } - - - public class Contacts : BaseCommand - { - - public const int UNKNOWN_ERROR = 0; - public const int INVALID_ARGUMENT_ERROR = 1; - public const int TIMEOUT_ERROR = 2; - public const int PENDING_OPERATION_ERROR = 3; - public const int IO_ERROR = 4; - public const int NOT_SUPPORTED_ERROR = 5; - public const int PERMISSION_DENIED_ERROR = 20; - public const int SYNTAX_ERR = 8; - - public Contacts() - { - - } - - // refer here for contact properties we can access: http://msdn.microsoft.com/en-us/library/microsoft.phone.tasks.savecontacttask_members%28v=VS.92%29.aspx - public void save(string jsonContact) - { - - // jsonContact is actually an array of 1 {contact} - string[] args = JSON.JsonHelper.Deserialize(jsonContact); - - - JSONContact contact = JSON.JsonHelper.Deserialize(args[0]); - - SaveContactTask contactTask = new SaveContactTask(); - - if (contact.nickname != null) - { - contactTask.Nickname = contact.nickname; - } - if (contact.urls != null && contact.urls.Length > 0) - { - contactTask.Website = contact.urls[0].value; - } - if (contact.note != null) - { - contactTask.Notes = contact.note; - } - - #region contact.name - if (contact.name != null) - { - if (contact.name.givenName != null) - contactTask.FirstName = contact.name.givenName; - if (contact.name.familyName != null) - contactTask.LastName = contact.name.familyName; - if (contact.name.middleName != null) - contactTask.MiddleName = contact.name.middleName; - if (contact.name.honorificSuffix != null) - contactTask.Suffix = contact.name.honorificSuffix; - if (contact.name.honorificPrefix != null) - contactTask.Title = contact.name.honorificPrefix; - } - #endregion - - #region contact.org - if (contact.organizations != null && contact.organizations.Count() > 0) - { - contactTask.Company = contact.organizations[0].name; - contactTask.JobTitle = contact.organizations[0].title; - } - #endregion - - #region contact.phoneNumbers - if (contact.phoneNumbers != null && contact.phoneNumbers.Length > 0) - { - foreach (JSONContactField field in contact.phoneNumbers) - { - string fieldType = field.type.ToLower(); - if (fieldType == "work") - { - contactTask.WorkPhone = field.value; - } - else if (fieldType == "home") - { - contactTask.HomePhone = field.value; - } - else if (fieldType == "mobile") - { - contactTask.MobilePhone = field.value; - } - } - } - #endregion - - #region contact.emails - - if (contact.emails != null && contact.emails.Length > 0) - { - - // set up different email types if they are not explicitly defined - foreach (string type in new string[] { "personal", "work", "other" }) - { - foreach (JSONContactField field in contact.emails) - { - if (field != null && String.IsNullOrEmpty(field.type)) - { - field.type = type; - break; - } - } - } - - foreach (JSONContactField field in contact.emails) - { - if (field != null) - { - if (field.type != null && field.type != "other") - { - string fieldType = field.type.ToLower(); - if (fieldType == "work") - { - contactTask.WorkEmail = field.value; - } - else if (fieldType == "home" || fieldType == "personal") - { - contactTask.PersonalEmail = field.value; - } - } - else - { - contactTask.OtherEmail = field.value; - } - } - - } - } - #endregion - - if (contact.note != null && contact.note.Length > 0) - { - contactTask.Notes = contact.note; - } - - #region contact.addresses - if (contact.addresses != null && contact.addresses.Length > 0) - { - foreach (JSONContactAddress address in contact.addresses) - { - if (address.type == null) - { - address.type = "home"; // set a default - } - string fieldType = address.type.ToLower(); - if (fieldType == "work") - { - contactTask.WorkAddressCity = address.locality; - contactTask.WorkAddressCountry = address.country; - contactTask.WorkAddressState = address.region; - contactTask.WorkAddressStreet = address.streetAddress; - contactTask.WorkAddressZipCode = address.postalCode; - } - else if (fieldType == "home" || fieldType == "personal") - { - contactTask.HomeAddressCity = address.locality; - contactTask.HomeAddressCountry = address.country; - contactTask.HomeAddressState = address.region; - contactTask.HomeAddressStreet = address.streetAddress; - contactTask.HomeAddressZipCode = address.postalCode; - } - else - { - // no other address fields available ... - Debug.WriteLine("Creating contact with unsupported address type :: " + address.type); - } - } - } - #endregion - - - contactTask.Completed += new EventHandler(ContactSaveTaskCompleted); - contactTask.Show(); - } - - void ContactSaveTaskCompleted(object sender, SaveContactResult e) - { - SaveContactTask task = sender as SaveContactTask; - - if (e.TaskResult == TaskResult.OK) - { - - Deployment.Current.Dispatcher.BeginInvoke(() => - { - DeviceContacts deviceContacts = new DeviceContacts(); - deviceContacts.SearchCompleted += new EventHandler(postAdd_SearchCompleted); - - string displayName = String.Format("{0}{2}{1}", task.FirstName, task.LastName, String.IsNullOrEmpty(task.FirstName) ? "" : " "); - - deviceContacts.SearchAsync(displayName, FilterKind.DisplayName, task); - }); - - - } - else if (e.TaskResult == TaskResult.Cancel) - { - DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, "Operation cancelled.")); - } - } - - void postAdd_SearchCompleted(object sender, ContactsSearchEventArgs e) - { - if (e.Results.Count() > 0) - { - List foundContacts = new List(); - - int n = (from Contact contact in e.Results select contact.GetHashCode()).Max(); - Contact newContact = (from Contact contact in e.Results - where contact.GetHashCode() == n - select contact).First(); - - DispatchCommandResult(new PluginResult(PluginResult.Status.OK, FormatJSONContact(newContact, null))); - } - else - { - DispatchCommandResult(new PluginResult(PluginResult.Status.NO_RESULT)); - } - } - - - - public void remove(string id) - { - // note id is wrapped in [] and always has exactly one string ... - DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, "{\"code\":" + NOT_SUPPORTED_ERROR + "}")); - } - - public void search(string searchCriteria) - { - string[] args = JSON.JsonHelper.Deserialize(searchCriteria); - - ContactSearchParams searchParams = new ContactSearchParams(); - try - { - searchParams.fields = JSON.JsonHelper.Deserialize(args[0]); - searchParams.options = JSON.JsonHelper.Deserialize(args[1]); - } - catch (Exception) - { - DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, INVALID_ARGUMENT_ERROR)); - return; - } - - if (searchParams.options == null) - { - searchParams.options = new SearchOptions(); - searchParams.options.filter = ""; - searchParams.options.multiple = true; - } - - DeviceContacts deviceContacts = new DeviceContacts(); - deviceContacts.SearchCompleted += new EventHandler(contacts_SearchCompleted); - - // default is to search all fields - FilterKind filterKind = FilterKind.None; - // if only one field is specified, we will try the 3 available DeviceContact search filters - if (searchParams.fields.Count() == 1) - { - if (searchParams.fields.Contains("name")) - { - filterKind = FilterKind.DisplayName; - } - else if (searchParams.fields.Contains("emails")) - { - filterKind = FilterKind.EmailAddress; - } - else if (searchParams.fields.Contains("phoneNumbers")) - { - filterKind = FilterKind.PhoneNumber; - } - } - - try - { - - deviceContacts.SearchAsync(searchParams.options.filter, filterKind, searchParams); - } - catch (Exception ex) - { - Debug.WriteLine("search contacts exception :: " + ex.Message); - } - } - - private void contacts_SearchCompleted(object sender, ContactsSearchEventArgs e) - { - ContactSearchParams searchParams = (ContactSearchParams)e.State; - - List foundContacts = null; - - // if we have multiple search fields - if (searchParams.options.filter.Length > 0 && searchParams.fields.Count() > 1) - { - foundContacts = new List(); - if (searchParams.fields.Contains("emails")) - { - foundContacts.AddRange(from Contact con in e.Results - from ContactEmailAddress a in con.EmailAddresses - where a.EmailAddress.Contains(searchParams.options.filter) - select con); - } - if (searchParams.fields.Contains("displayName")) - { - foundContacts.AddRange(from Contact con in e.Results - where con.DisplayName.Contains(searchParams.options.filter) - select con); - } - if (searchParams.fields.Contains("name")) - { - foundContacts.AddRange(from Contact con in e.Results - where con.CompleteName != null && con.CompleteName.ToString().Contains(searchParams.options.filter) - select con); - } - if (searchParams.fields.Contains("phoneNumbers")) - { - foundContacts.AddRange(from Contact con in e.Results - from ContactPhoneNumber a in con.PhoneNumbers - where a.PhoneNumber.Contains(searchParams.options.filter) - select con); - } - if (searchParams.fields.Contains("urls")) - { - foundContacts.AddRange(from Contact con in e.Results - from string a in con.Websites - where a.Contains(searchParams.options.filter) - select con); - } - } - else - { - foundContacts = new List(e.Results); - } - - //List contactList = new List(); - - string strResult = ""; - - IEnumerable distinctContacts = foundContacts.Distinct(); - - foreach (Contact contact in distinctContacts) - { - strResult += FormatJSONContact(contact, null) + ","; - //contactList.Add(FormatJSONContact(contact, null)); - if (!searchParams.options.multiple) - { - break; // just return the first item - } - } - PluginResult result = new PluginResult(PluginResult.Status.OK); - result.Message = "[" + strResult.TrimEnd(',') + "]"; - DispatchCommandResult(result); - - } - - private string FormatJSONPhoneNumbers(Contact con) - { - string retVal = ""; - string contactFieldFormat = "\"type\":\"{0}\",\"value\":\"{1}\",\"pref\":\"false\""; - foreach (ContactPhoneNumber number in con.PhoneNumbers) - { - - string contactField = string.Format(contactFieldFormat, - number.Kind.ToString(), - number.PhoneNumber); - - retVal += "{" + contactField + "},"; - } - return retVal.TrimEnd(','); - } - - private string FormatJSONEmails(Contact con) - { - string retVal = ""; - string contactFieldFormat = "\"type\":\"{0}\",\"value\":\"{1}\",\"pref\":\"false\""; - foreach (ContactEmailAddress address in con.EmailAddresses) - { - string contactField = string.Format(contactFieldFormat, - address.Kind.ToString(), - address.EmailAddress); - - retVal += "{" + contactField + "},"; - } - return retVal.TrimEnd(','); - } - - private string getFormattedJSONAddress(ContactAddress address, bool isPreferred) - { - - string addressFormatString = "\"pref\":{0}," + // bool - "\"type\":\"{1}\"," + - "\"formatted\":\"{2}\"," + - "\"streetAddress\":\"{3}\"," + - "\"locality\":\"{4}\"," + - "\"region\":\"{5}\"," + - "\"postalCode\":\"{6}\"," + - "\"country\":\"{7}\""; - - string formattedAddress = address.PhysicalAddress.AddressLine1 + " " - + address.PhysicalAddress.AddressLine2 + " " - + address.PhysicalAddress.City + " " - + address.PhysicalAddress.StateProvince + " " - + address.PhysicalAddress.CountryRegion + " " - + address.PhysicalAddress.PostalCode; - - string jsonAddress = string.Format(addressFormatString, - isPreferred ? "\"true\"" : "\"false\"", - address.Kind.ToString(), - formattedAddress, - address.PhysicalAddress.AddressLine1 + " " + address.PhysicalAddress.AddressLine2, - address.PhysicalAddress.City, - address.PhysicalAddress.StateProvince, - address.PhysicalAddress.PostalCode, - address.PhysicalAddress.CountryRegion); - - //Debug.WriteLine("getFormattedJSONAddress returning :: " + jsonAddress); - - return "{" + jsonAddress + "}"; - } - - private string FormatJSONAddresses(Contact con) - { - string retVal = ""; - foreach (ContactAddress address in con.Addresses) - { - retVal += this.getFormattedJSONAddress(address, false) + ","; - } - - //Debug.WriteLine("FormatJSONAddresses returning :: " + retVal); - return retVal.TrimEnd(','); - } - - private string FormatJSONWebsites(Contact con) - { - string retVal = ""; - foreach (string website in con.Websites) - { - retVal += "\"" + website + "\","; - } - return retVal.TrimEnd(','); - } - - /* - * formatted: The complete name of the contact. (DOMString) - familyName: The contacts family name. (DOMString) - givenName: The contacts given name. (DOMString) - middleName: The contacts middle name. (DOMString) - honorificPrefix: The contacts prefix (example Mr. or Dr.) (DOMString) - honorificSuffix: The contacts suffix (example Esq.). (DOMString) - */ - private string FormatJSONName(Contact con) - { - string retVal = ""; - string formatStr = "\"formatted\":\"{0}\"," + - "\"familyName\":\"{1}\"," + - "\"givenName\":\"{2}\"," + - "\"middleName\":\"{3}\"," + - "\"honorificPrefix\":\"{4}\"," + - "\"honorificSuffix\":\"{5}\""; - - if (con.CompleteName != null) - { - retVal = string.Format(formatStr, - con.CompleteName.FirstName + " " + con.CompleteName.LastName, // TODO: does this need suffix? middlename? - con.CompleteName.LastName, - con.CompleteName.FirstName, - con.CompleteName.MiddleName, - con.CompleteName.Title, - con.CompleteName.Suffix); - } - else - { - retVal = string.Format(formatStr,"","","","","",""); - } - - return "{" + retVal + "}"; - } - - private string FormatJSONContact(Contact con, string[] fields) - { - - string contactFormatStr = "\"id\":\"{0}\"," + - "\"displayName\":\"{1}\"," + - "\"nickname\":\"{2}\"," + - "\"phoneNumbers\":[{3}]," + - "\"emails\":[{4}]," + - "\"addresses\":[{5}]," + - "\"urls\":[{6}]," + - "\"name\":{7}," + - "\"note\":\"{8}\"," + - "\"birthday\":\"{9}\""; - - - string jsonContact = String.Format(contactFormatStr, - con.GetHashCode(), - con.DisplayName, - con.CompleteName != null ? con.CompleteName.Nickname : "", - FormatJSONPhoneNumbers(con), - FormatJSONEmails(con), - FormatJSONAddresses(con), - FormatJSONWebsites(con), - FormatJSONName(con), - con.Notes.FirstOrDefault(), - con.Birthdays.FirstOrDefault()); - - //Debug.WriteLine("jsonContact = " + jsonContact); - // JSON requires new line characters be escaped - return "{" + jsonContact.Replace("\n", "\\n") + "}"; - } - } -} diff --git a/cordova-lib/spec-plugman-install/plugins/Contacts/www/Contact.js b/cordova-lib/spec-plugman-install/plugins/Contacts/www/Contact.js deleted file mode 100644 index 9c46a0cc7..000000000 --- a/cordova-lib/spec-plugman-install/plugins/Contacts/www/Contact.js +++ /dev/null @@ -1,177 +0,0 @@ -/* - * - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - * -*/ - -var argscheck = require('cordova/argscheck'), - exec = require('cordova/exec'), - ContactError = require('./ContactError'), - utils = require('cordova/utils'); - -/** -* Converts primitives into Complex Object -* Currently only used for Date fields -*/ -function convertIn(contact) { - var value = contact.birthday; - try { - contact.birthday = new Date(parseFloat(value)); - } catch (exception){ - console.log("Cordova Contact convertIn error: exception creating date."); - } - return contact; -} - -/** -* Converts Complex objects into primitives -* Only conversion at present is for Dates. -**/ - -function convertOut(contact) { - var value = contact.birthday; - if (value !== null) { - // try to make it a Date object if it is not already - if (!utils.isDate(value)){ - try { - value = new Date(value); - } catch(exception){ - value = null; - } - } - if (utils.isDate(value)){ - value = value.valueOf(); // convert to milliseconds - } - contact.birthday = value; - } - return contact; -} - -/** -* Contains information about a single contact. -* @constructor -* @param {DOMString} id unique identifier -* @param {DOMString} displayName -* @param {ContactName} name -* @param {DOMString} nickname -* @param {Array.} phoneNumbers array of phone numbers -* @param {Array.} emails array of email addresses -* @param {Array.} addresses array of addresses -* @param {Array.} ims instant messaging user ids -* @param {Array.} organizations -* @param {DOMString} birthday contact's birthday -* @param {DOMString} note user notes about contact -* @param {Array.} photos -* @param {Array.} categories -* @param {Array.} urls contact's web sites -*/ -var Contact = function (id, displayName, name, nickname, phoneNumbers, emails, addresses, - ims, organizations, birthday, note, photos, categories, urls) { - this.id = id || null; - this.rawId = null; - this.displayName = displayName || null; - this.name = name || null; // ContactName - this.nickname = nickname || null; - this.phoneNumbers = phoneNumbers || null; // ContactField[] - this.emails = emails || null; // ContactField[] - this.addresses = addresses || null; // ContactAddress[] - this.ims = ims || null; // ContactField[] - this.organizations = organizations || null; // ContactOrganization[] - this.birthday = birthday || null; - this.note = note || null; - this.photos = photos || null; // ContactField[] - this.categories = categories || null; // ContactField[] - this.urls = urls || null; // ContactField[] -}; - -/** -* Removes contact from device storage. -* @param successCB success callback -* @param errorCB error callback -*/ -Contact.prototype.remove = function(successCB, errorCB) { - argscheck.checkArgs('FF', 'Contact.remove', arguments); - var fail = errorCB && function(code) { - errorCB(new ContactError(code)); - }; - if (this.id === null) { - fail(ContactError.UNKNOWN_ERROR); - } - else { - exec(successCB, fail, "Contacts", "remove", [this.id]); - } -}; - -/** -* Creates a deep copy of this Contact. -* With the contact ID set to null. -* @return copy of this Contact -*/ -Contact.prototype.clone = function() { - var clonedContact = utils.clone(this); - clonedContact.id = null; - clonedContact.rawId = null; - - function nullIds(arr) { - if (arr) { - for (var i = 0; i < arr.length; ++i) { - arr[i].id = null; - } - } - } - - // Loop through and clear out any id's in phones, emails, etc. - nullIds(clonedContact.phoneNumbers); - nullIds(clonedContact.emails); - nullIds(clonedContact.addresses); - nullIds(clonedContact.ims); - nullIds(clonedContact.organizations); - nullIds(clonedContact.categories); - nullIds(clonedContact.photos); - nullIds(clonedContact.urls); - return clonedContact; -}; - -/** -* Persists contact to device storage. -* @param successCB success callback -* @param errorCB error callback -*/ -Contact.prototype.save = function(successCB, errorCB) { - argscheck.checkArgs('FFO', 'Contact.save', arguments); - var fail = errorCB && function(code) { - errorCB(new ContactError(code)); - }; - var success = function(result) { - if (result) { - if (successCB) { - var fullContact = require('./contacts').create(result); - successCB(convertIn(fullContact)); - } - } - else { - // no Entry object returned - fail(ContactError.UNKNOWN_ERROR); - } - }; - var dupContact = convertOut(utils.clone(this)); - exec(success, fail, "Contacts", "save", [dupContact]); -}; - - -module.exports = Contact; diff --git a/cordova-lib/spec-plugman-install/plugins/Contacts/www/ContactAddress.js b/cordova-lib/spec-plugman-install/plugins/Contacts/www/ContactAddress.js deleted file mode 100644 index 3d39086dc..000000000 --- a/cordova-lib/spec-plugman-install/plugins/Contacts/www/ContactAddress.js +++ /dev/null @@ -1,46 +0,0 @@ -/* - * - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - * -*/ - -/** -* Contact address. -* @constructor -* @param {DOMString} id unique identifier, should only be set by native code -* @param formatted // NOTE: not a W3C standard -* @param streetAddress -* @param locality -* @param region -* @param postalCode -* @param country -*/ - -var ContactAddress = function(pref, type, formatted, streetAddress, locality, region, postalCode, country) { - this.id = null; - this.pref = (typeof pref != 'undefined' ? pref : false); - this.type = type || null; - this.formatted = formatted || null; - this.streetAddress = streetAddress || null; - this.locality = locality || null; - this.region = region || null; - this.postalCode = postalCode || null; - this.country = country || null; -}; - -module.exports = ContactAddress; diff --git a/cordova-lib/spec-plugman-install/plugins/Contacts/www/ContactError.js b/cordova-lib/spec-plugman-install/plugins/Contacts/www/ContactError.js deleted file mode 100644 index 01b229ad5..000000000 --- a/cordova-lib/spec-plugman-install/plugins/Contacts/www/ContactError.js +++ /dev/null @@ -1,42 +0,0 @@ -/* - * - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - * -*/ - -/** - * ContactError. - * An error code assigned by an implementation when an error has occurred - * @constructor - */ -var ContactError = function(err) { - this.code = (typeof err != 'undefined' ? err : null); -}; - -/** - * Error codes - */ -ContactError.UNKNOWN_ERROR = 0; -ContactError.INVALID_ARGUMENT_ERROR = 1; -ContactError.TIMEOUT_ERROR = 2; -ContactError.PENDING_OPERATION_ERROR = 3; -ContactError.IO_ERROR = 4; -ContactError.NOT_SUPPORTED_ERROR = 5; -ContactError.PERMISSION_DENIED_ERROR = 20; - -module.exports = ContactError; diff --git a/cordova-lib/spec-plugman-install/plugins/Contacts/www/ContactField.js b/cordova-lib/spec-plugman-install/plugins/Contacts/www/ContactField.js deleted file mode 100644 index e84107a43..000000000 --- a/cordova-lib/spec-plugman-install/plugins/Contacts/www/ContactField.js +++ /dev/null @@ -1,37 +0,0 @@ -/* - * - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - * -*/ - -/** -* Generic contact field. -* @constructor -* @param {DOMString} id unique identifier, should only be set by native code // NOTE: not a W3C standard -* @param type -* @param value -* @param pref -*/ -var ContactField = function(type, value, pref) { - this.id = null; - this.type = (type && type.toString()) || null; - this.value = (value && value.toString()) || null; - this.pref = (typeof pref != 'undefined' ? pref : false); -}; - -module.exports = ContactField; diff --git a/cordova-lib/spec-plugman-install/plugins/Contacts/www/ContactFindOptions.js b/cordova-lib/spec-plugman-install/plugins/Contacts/www/ContactFindOptions.js deleted file mode 100644 index bd8bf3562..000000000 --- a/cordova-lib/spec-plugman-install/plugins/Contacts/www/ContactFindOptions.js +++ /dev/null @@ -1,34 +0,0 @@ -/* - * - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - * -*/ - -/** - * ContactFindOptions. - * @constructor - * @param filter used to match contacts against - * @param multiple boolean used to determine if more than one contact should be returned - */ - -var ContactFindOptions = function(filter, multiple) { - this.filter = filter || ''; - this.multiple = (typeof multiple != 'undefined' ? multiple : false); -}; - -module.exports = ContactFindOptions; diff --git a/cordova-lib/spec-plugman-install/plugins/Contacts/www/ContactName.js b/cordova-lib/spec-plugman-install/plugins/Contacts/www/ContactName.js deleted file mode 100644 index 15cf60b5f..000000000 --- a/cordova-lib/spec-plugman-install/plugins/Contacts/www/ContactName.js +++ /dev/null @@ -1,41 +0,0 @@ -/* - * - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - * -*/ - -/** -* Contact name. -* @constructor -* @param formatted // NOTE: not part of W3C standard -* @param familyName -* @param givenName -* @param middle -* @param prefix -* @param suffix -*/ -var ContactName = function(formatted, familyName, givenName, middle, prefix, suffix) { - this.formatted = formatted || null; - this.familyName = familyName || null; - this.givenName = givenName || null; - this.middleName = middle || null; - this.honorificPrefix = prefix || null; - this.honorificSuffix = suffix || null; -}; - -module.exports = ContactName; diff --git a/cordova-lib/spec-plugman-install/plugins/Contacts/www/ContactOrganization.js b/cordova-lib/spec-plugman-install/plugins/Contacts/www/ContactOrganization.js deleted file mode 100644 index 5dd242bdd..000000000 --- a/cordova-lib/spec-plugman-install/plugins/Contacts/www/ContactOrganization.js +++ /dev/null @@ -1,44 +0,0 @@ -/* - * - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - * -*/ - -/** -* Contact organization. -* @constructor -* @param {DOMString} id unique identifier, should only be set by native code // NOTE: not a W3C standard -* @param name -* @param dept -* @param title -* @param startDate -* @param endDate -* @param location -* @param desc -*/ - -var ContactOrganization = function(pref, type, name, dept, title) { - this.id = null; - this.pref = (typeof pref != 'undefined' ? pref : false); - this.type = type || null; - this.name = name || null; - this.department = dept || null; - this.title = title || null; -}; - -module.exports = ContactOrganization; diff --git a/cordova-lib/spec-plugman-install/plugins/Contacts/www/contacts.js b/cordova-lib/spec-plugman-install/plugins/Contacts/www/contacts.js deleted file mode 100644 index 5e6b4dbe6..000000000 --- a/cordova-lib/spec-plugman-install/plugins/Contacts/www/contacts.js +++ /dev/null @@ -1,76 +0,0 @@ -/* - * - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - * -*/ - -var argscheck = require('cordova/argscheck'), - exec = require('cordova/exec'), - ContactError = require('./ContactError'), - utils = require('cordova/utils'), - Contact = require('./Contact'); - -/** -* Represents a group of Contacts. -* @constructor -*/ -var contacts = { - /** - * Returns an array of Contacts matching the search criteria. - * @param fields that should be searched - * @param successCB success callback - * @param errorCB error callback - * @param {ContactFindOptions} options that can be applied to contact searching - * @return array of Contacts matching search criteria - */ - find:function(fields, successCB, errorCB, options) { - argscheck.checkArgs('afFO', 'contacts.find', arguments); - if (!fields.length) { - errorCB && errorCB(new ContactError(ContactError.INVALID_ARGUMENT_ERROR)); - } else { - var win = function(result) { - var cs = []; - for (var i = 0, l = result.length; i < l; i++) { - cs.push(contacts.create(result[i])); - } - successCB(cs); - }; - exec(win, errorCB, "Contacts", "search", [fields, options]); - } - }, - - /** - * This function creates a new contact, but it does not persist the contact - * to device storage. To persist the contact to device storage, invoke - * contact.save(). - * @param properties an object whose properties will be examined to create a new Contact - * @returns new Contact object - */ - create:function(properties) { - argscheck.checkArgs('O', 'contacts.create', arguments); - var contact = new Contact(); - for (var i in properties) { - if (typeof contact[i] !== 'undefined' && properties.hasOwnProperty(i)) { - contact[i] = properties[i]; - } - } - return contact; - } -}; - -module.exports = contacts; diff --git a/cordova-lib/spec-plugman-install/plugins/Contacts/www/ios/Contact.js b/cordova-lib/spec-plugman-install/plugins/Contacts/www/ios/Contact.js deleted file mode 100644 index b40c41acc..000000000 --- a/cordova-lib/spec-plugman-install/plugins/Contacts/www/ios/Contact.js +++ /dev/null @@ -1,51 +0,0 @@ -/* - * - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - * -*/ - -var exec = require('cordova/exec'), - ContactError = require('./ContactError'); - -/** - * Provides iOS Contact.display API. - */ -module.exports = { - display : function(errorCB, options) { - /* - * Display a contact using the iOS Contact Picker UI - * NOT part of W3C spec so no official documentation - * - * @param errorCB error callback - * @param options object - * allowsEditing: boolean AS STRING - * "true" to allow editing the contact - * "false" (default) display contact - */ - - if (this.id === null) { - if (typeof errorCB === "function") { - var errorObj = new ContactError(ContactError.UNKNOWN_ERROR); - errorCB(errorObj); - } - } - else { - exec(null, errorCB, "Contacts","displayContact", [this.id, options]); - } - } -}; diff --git a/cordova-lib/spec-plugman-install/plugins/Contacts/www/ios/contacts.js b/cordova-lib/spec-plugman-install/plugins/Contacts/www/ios/contacts.js deleted file mode 100644 index 67cf421fd..000000000 --- a/cordova-lib/spec-plugman-install/plugins/Contacts/www/ios/contacts.js +++ /dev/null @@ -1,62 +0,0 @@ -/* - * - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - * -*/ - -var exec = require('cordova/exec'); - -/** - * Provides iOS enhanced contacts API. - */ -module.exports = { - newContactUI : function(successCallback) { - /* - * Create a contact using the iOS Contact Picker UI - * NOT part of W3C spec so no official documentation - * - * returns: the id of the created contact as param to successCallback - */ - exec(successCallback, null, "Contacts","newContact", []); - }, - chooseContact : function(successCallback, options) { - /* - * Select a contact using the iOS Contact Picker UI - * NOT part of W3C spec so no official documentation - * - * @param errorCB error callback - * @param options object - * allowsEditing: boolean AS STRING - * "true" to allow editing the contact - * "false" (default) display contact - * fields: array of fields to return in contact object (see ContactOptions.fields) - * - * @returns - * id of contact selected - * ContactObject - * if no fields provided contact contains just id information - * if fields provided contact object contains information for the specified fields - * - */ - var win = function(result) { - var fullContact = require('./contacts').create(result); - successCallback(fullContact.id, fullContact); - }; - exec(win, null, "Contacts","chooseContact", [options]); - } -}; diff --git a/cordova-lib/spec-plugman-install/plugins/DummyPlugin/android-resource.xml b/cordova-lib/spec-plugman-install/plugins/DummyPlugin/android-resource.xml deleted file mode 100644 index 421376db9..000000000 --- a/cordova-lib/spec-plugman-install/plugins/DummyPlugin/android-resource.xml +++ /dev/null @@ -1 +0,0 @@ -dummy diff --git a/cordova-lib/spec-plugman-install/plugins/DummyPlugin/plugin.xml b/cordova-lib/spec-plugman-install/plugins/DummyPlugin/plugin.xml deleted file mode 100644 index 0e884433c..000000000 --- a/cordova-lib/spec-plugman-install/plugins/DummyPlugin/plugin.xml +++ /dev/null @@ -1,187 +0,0 @@ - - - - - - - dummyplugin - - my description - Jackson Badman - dummy,plugin - BSD - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - .dummy1 - - - - - .dummy2 - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/cordova-lib/spec-plugman-install/plugins/DummyPlugin/src/android/DummyPlugin.java b/cordova-lib/spec-plugman-install/plugins/DummyPlugin/src/android/DummyPlugin.java deleted file mode 100644 index 5263b0c5d..000000000 --- a/cordova-lib/spec-plugman-install/plugins/DummyPlugin/src/android/DummyPlugin.java +++ /dev/null @@ -1,19 +0,0 @@ -/* - * - * Copyright 2013 Anis Kadri - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - * -*/ - diff --git a/cordova-lib/spec-plugman-install/plugins/DummyPlugin/src/blackberry10/index.js b/cordova-lib/spec-plugman-install/plugins/DummyPlugin/src/blackberry10/index.js deleted file mode 100644 index 5263b0c5d..000000000 --- a/cordova-lib/spec-plugman-install/plugins/DummyPlugin/src/blackberry10/index.js +++ /dev/null @@ -1,19 +0,0 @@ -/* - * - * Copyright 2013 Anis Kadri - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - * -*/ - diff --git a/cordova-lib/spec-plugman-install/plugins/DummyPlugin/src/ios/Custom.framework/someFheader.h b/cordova-lib/spec-plugman-install/plugins/DummyPlugin/src/ios/Custom.framework/someFheader.h deleted file mode 100644 index e69de29bb..000000000 diff --git a/cordova-lib/spec-plugman-install/plugins/DummyPlugin/src/ios/Custom.framework/somebinlib b/cordova-lib/spec-plugman-install/plugins/DummyPlugin/src/ios/Custom.framework/somebinlib deleted file mode 100644 index e69de29bb..000000000 diff --git a/cordova-lib/spec-plugman-install/plugins/DummyPlugin/src/ios/DummyPlugin.bundle b/cordova-lib/spec-plugman-install/plugins/DummyPlugin/src/ios/DummyPlugin.bundle deleted file mode 100644 index e69de29bb..000000000 diff --git a/cordova-lib/spec-plugman-install/plugins/DummyPlugin/src/ios/DummyPluginCommand.h b/cordova-lib/spec-plugman-install/plugins/DummyPlugin/src/ios/DummyPluginCommand.h deleted file mode 100644 index e69de29bb..000000000 diff --git a/cordova-lib/spec-plugman-install/plugins/DummyPlugin/src/ios/DummyPluginCommand.m b/cordova-lib/spec-plugman-install/plugins/DummyPlugin/src/ios/DummyPluginCommand.m deleted file mode 100644 index e69de29bb..000000000 diff --git a/cordova-lib/spec-plugman-install/plugins/DummyPlugin/src/ios/SourceWithFramework.m b/cordova-lib/spec-plugman-install/plugins/DummyPlugin/src/ios/SourceWithFramework.m deleted file mode 100644 index e69de29bb..000000000 diff --git a/cordova-lib/spec-plugman-install/plugins/DummyPlugin/src/ios/TargetDirTest.h b/cordova-lib/spec-plugman-install/plugins/DummyPlugin/src/ios/TargetDirTest.h deleted file mode 100644 index e69de29bb..000000000 diff --git a/cordova-lib/spec-plugman-install/plugins/DummyPlugin/src/ios/TargetDirTest.m b/cordova-lib/spec-plugman-install/plugins/DummyPlugin/src/ios/TargetDirTest.m deleted file mode 100644 index e69de29bb..000000000 diff --git a/cordova-lib/spec-plugman-install/plugins/DummyPlugin/src/ios/libsqlite3.dylib b/cordova-lib/spec-plugman-install/plugins/DummyPlugin/src/ios/libsqlite3.dylib deleted file mode 100644 index e69de29bb..000000000 diff --git a/cordova-lib/spec-plugman-install/plugins/DummyPlugin/src/tizen/dummer.js b/cordova-lib/spec-plugman-install/plugins/DummyPlugin/src/tizen/dummer.js deleted file mode 100644 index e69de29bb..000000000 diff --git a/cordova-lib/spec-plugman-install/plugins/DummyPlugin/src/windows8/dummer.js b/cordova-lib/spec-plugman-install/plugins/DummyPlugin/src/windows8/dummer.js deleted file mode 100644 index e69de29bb..000000000 diff --git a/cordova-lib/spec-plugman-install/plugins/DummyPlugin/src/wp7/DummyPlugin.cs b/cordova-lib/spec-plugman-install/plugins/DummyPlugin/src/wp7/DummyPlugin.cs deleted file mode 100644 index 273dc3b3f..000000000 --- a/cordova-lib/spec-plugman-install/plugins/DummyPlugin/src/wp7/DummyPlugin.cs +++ /dev/null @@ -1,19 +0,0 @@ -/* - * - * Copyright 2013 Benn Mapes - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - * -*/ - diff --git a/cordova-lib/spec-plugman-install/plugins/DummyPlugin/src/wp8/DummyPlugin.cs b/cordova-lib/spec-plugman-install/plugins/DummyPlugin/src/wp8/DummyPlugin.cs deleted file mode 100644 index 273dc3b3f..000000000 --- a/cordova-lib/spec-plugman-install/plugins/DummyPlugin/src/wp8/DummyPlugin.cs +++ /dev/null @@ -1,19 +0,0 @@ -/* - * - * Copyright 2013 Benn Mapes - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - * -*/ - diff --git a/cordova-lib/spec-plugman-install/plugins/DummyPlugin/www/dummyplugin.js b/cordova-lib/spec-plugman-install/plugins/DummyPlugin/www/dummyplugin.js deleted file mode 100644 index 5263b0c5d..000000000 --- a/cordova-lib/spec-plugman-install/plugins/DummyPlugin/www/dummyplugin.js +++ /dev/null @@ -1,19 +0,0 @@ -/* - * - * Copyright 2013 Anis Kadri - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - * -*/ - diff --git a/cordova-lib/spec-plugman-install/plugins/DummyPlugin/www/dummyplugin/image.jpg b/cordova-lib/spec-plugman-install/plugins/DummyPlugin/www/dummyplugin/image.jpg deleted file mode 100644 index 257cc5642..000000000 --- a/cordova-lib/spec-plugman-install/plugins/DummyPlugin/www/dummyplugin/image.jpg +++ /dev/null @@ -1 +0,0 @@ -foo diff --git a/cordova-lib/spec-plugman-install/plugins/EnginePlugin/megaBoringVersion b/cordova-lib/spec-plugman-install/plugins/EnginePlugin/megaBoringVersion deleted file mode 100755 index cbf791148..000000000 --- a/cordova-lib/spec-plugman-install/plugins/EnginePlugin/megaBoringVersion +++ /dev/null @@ -1,23 +0,0 @@ -#! /bin/sh - -# -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. -# - -echo 4.0.0 -exit 0 \ No newline at end of file diff --git a/cordova-lib/spec-plugman-install/plugins/EnginePlugin/megaFunVersion b/cordova-lib/spec-plugman-install/plugins/EnginePlugin/megaFunVersion deleted file mode 100755 index 1e4c706fa..000000000 --- a/cordova-lib/spec-plugman-install/plugins/EnginePlugin/megaFunVersion +++ /dev/null @@ -1,23 +0,0 @@ -#! /bin/sh - -# -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. -# - -echo 1.0.0 -exit 0 \ No newline at end of file diff --git a/cordova-lib/spec-plugman-install/plugins/EnginePlugin/plugin.xml b/cordova-lib/spec-plugman-install/plugins/EnginePlugin/plugin.xml deleted file mode 100644 index a58f19efe..000000000 --- a/cordova-lib/spec-plugman-install/plugins/EnginePlugin/plugin.xml +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - Engine Choo Choo - - - - - - - - - diff --git a/cordova-lib/spec-plugman-install/plugins/EnginePluginAndroid/plugin.xml b/cordova-lib/spec-plugman-install/plugins/EnginePluginAndroid/plugin.xml deleted file mode 100644 index fe2bce242..000000000 --- a/cordova-lib/spec-plugman-install/plugins/EnginePluginAndroid/plugin.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - Engine Choo Choo - - - - - - - - diff --git a/cordova-lib/spec-plugman-install/plugins/EnginePluginiOS/plugin.xml b/cordova-lib/spec-plugman-install/plugins/EnginePluginiOS/plugin.xml deleted file mode 100644 index d7a9a8e7b..000000000 --- a/cordova-lib/spec-plugman-install/plugins/EnginePluginiOS/plugin.xml +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - Engine Choo Choo - - - - - - - - - - diff --git a/cordova-lib/spec-plugman-install/plugins/FaultyPlugin/plugin.xml b/cordova-lib/spec-plugman-install/plugins/FaultyPlugin/plugin.xml deleted file mode 100644 index 706db4521..000000000 --- a/cordova-lib/spec-plugman-install/plugins/FaultyPlugin/plugin.xml +++ /dev/null @@ -1,147 +0,0 @@ - - - - - - Faulty Plugin - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/cordova-lib/spec-plugman-install/plugins/FaultyPlugin/src/android/FaultyPlugin.java b/cordova-lib/spec-plugman-install/plugins/FaultyPlugin/src/android/FaultyPlugin.java deleted file mode 100644 index 5263b0c5d..000000000 --- a/cordova-lib/spec-plugman-install/plugins/FaultyPlugin/src/android/FaultyPlugin.java +++ /dev/null @@ -1,19 +0,0 @@ -/* - * - * Copyright 2013 Anis Kadri - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - * -*/ - diff --git a/cordova-lib/spec-plugman-install/plugins/FaultyPlugin/src/blackberry10/client.js b/cordova-lib/spec-plugman-install/plugins/FaultyPlugin/src/blackberry10/client.js deleted file mode 100644 index e69de29bb..000000000 diff --git a/cordova-lib/spec-plugman-install/plugins/FaultyPlugin/src/ios/FaultyPlugin.h b/cordova-lib/spec-plugman-install/plugins/FaultyPlugin/src/ios/FaultyPlugin.h deleted file mode 100644 index 6a23ab6f0..000000000 --- a/cordova-lib/spec-plugman-install/plugins/FaultyPlugin/src/ios/FaultyPlugin.h +++ /dev/null @@ -1,49 +0,0 @@ -/* - * - * Copyright 2013 Anis Kadri - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - * -*/ - -// -// PhoneGap ! ChildBrowserCommand -// -// -// Created by Jesse MacFadyen on 10-05-29. -// Copyright 2010 Nitobi. All rights reserved. -// - -#import -#ifdef PHONEGAP_FRAMEWORK - #import -#else - #import "PGPlugin.h" -#endif -#import "ChildBrowserViewController.h" - - - -@interface ChildBrowserCommand : PGPlugin { - - ChildBrowserViewController* childBrowser; -} - -@property (nonatomic, retain) ChildBrowserViewController *childBrowser; - - -- (void) showWebPage:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options; --(void) onChildLocationChange:(NSString*)newLoc; - -@end diff --git a/cordova-lib/spec-plugman-install/plugins/FaultyPlugin/src/ios/FaultyPlugin.m b/cordova-lib/spec-plugman-install/plugins/FaultyPlugin/src/ios/FaultyPlugin.m deleted file mode 100644 index 38aaf6497..000000000 --- a/cordova-lib/spec-plugman-install/plugins/FaultyPlugin/src/ios/FaultyPlugin.m +++ /dev/null @@ -1,86 +0,0 @@ -// - -// -// -// Created by Jesse MacFadyen on 10-05-29. -// Copyright 2010 Nitobi. All rights reserved. -// Copyright (c) 2011, IBM Corporation -// Copyright 2011, Randy McMillan -// - -#import "ChildBrowserCommand.h" - -#ifdef PHONEGAP_FRAMEWORK - #import -#else - #import "PhoneGapViewController.h" -#endif - - -@implementation ChildBrowserCommand - -@synthesize childBrowser; - -- (void) showWebPage:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options // args: url -{ - - if(childBrowser == NULL) - { - childBrowser = [[ ChildBrowserViewController alloc ] initWithScale:FALSE ]; - childBrowser.delegate = self; - } - -/* // TODO: Work in progress - NSString* strOrientations = [ options objectForKey:@"supportedOrientations"]; - NSArray* supportedOrientations = [strOrientations componentsSeparatedByString:@","]; -*/ - PhoneGapViewController* cont = (PhoneGapViewController*)[ super appViewController ]; - childBrowser.supportedOrientations = cont.supportedOrientations; - - if ([cont respondsToSelector:@selector(presentViewController)]) { - //Reference UIViewController.h Line:179 for update to iOS 5 difference - @RandyMcMillan - [cont presentViewController:childBrowser animated:YES completion:nil]; - } else { - [ cont presentModalViewController:childBrowser animated:YES ]; - } - - NSString *url = (NSString*) [arguments objectAtIndex:0]; - - [childBrowser loadURL:url ]; - -} - --(void) close:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options // args: url -{ - [ childBrowser closeBrowser]; - -} - --(void) onClose -{ - NSString* jsCallback = [NSString stringWithFormat:@"ChildBrowser._onClose();",@""]; - [self.webView stringByEvaluatingJavaScriptFromString:jsCallback]; -} - --(void) onOpenInSafari -{ - NSString* jsCallback = [NSString stringWithFormat:@"ChildBrowser._onOpenExternal();",@""]; - [self.webView stringByEvaluatingJavaScriptFromString:jsCallback]; -} - - --(void) onChildLocationChange:(NSString*)newLoc -{ - - NSString* tempLoc = [NSString stringWithFormat:@"%@",newLoc]; - NSString* encUrl = [tempLoc stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; - - NSString* jsCallback = [NSString stringWithFormat:@"ChildBrowser._onLocationChange('%@');",encUrl]; - [self.webView stringByEvaluatingJavaScriptFromString:jsCallback]; - -} - - - - -@end diff --git a/cordova-lib/spec-plugman-install/plugins/FaultyPlugin/src/windows8/faultyPlugin.js b/cordova-lib/spec-plugman-install/plugins/FaultyPlugin/src/windows8/faultyPlugin.js deleted file mode 100644 index e69de29bb..000000000 diff --git a/cordova-lib/spec-plugman-install/plugins/FaultyPlugin/src/wp7/FaultyPlugin.cs b/cordova-lib/spec-plugman-install/plugins/FaultyPlugin/src/wp7/FaultyPlugin.cs deleted file mode 100644 index 5263b0c5d..000000000 --- a/cordova-lib/spec-plugman-install/plugins/FaultyPlugin/src/wp7/FaultyPlugin.cs +++ /dev/null @@ -1,19 +0,0 @@ -/* - * - * Copyright 2013 Anis Kadri - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - * -*/ - diff --git a/cordova-lib/spec-plugman-install/plugins/FaultyPlugin/src/wp8/FaultyPlugin.cs b/cordova-lib/spec-plugman-install/plugins/FaultyPlugin/src/wp8/FaultyPlugin.cs deleted file mode 100644 index 5263b0c5d..000000000 --- a/cordova-lib/spec-plugman-install/plugins/FaultyPlugin/src/wp8/FaultyPlugin.cs +++ /dev/null @@ -1,19 +0,0 @@ -/* - * - * Copyright 2013 Anis Kadri - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - * -*/ - diff --git a/cordova-lib/spec-plugman-install/plugins/VariablePlugin/plugin.xml b/cordova-lib/spec-plugman-install/plugins/VariablePlugin/plugin.xml deleted file mode 100644 index 9eff72975..000000000 --- a/cordova-lib/spec-plugman-install/plugins/VariablePlugin/plugin.xml +++ /dev/null @@ -1,59 +0,0 @@ - - - - - - Use Variables - - - - Remember that your api key is $API_KEY! - - - - - $PACKAGE_NAME - - - - - - - - - $PACKAGE_NAME - - - - - - - - - $PACKAGE_NAME - - - - - - diff --git a/cordova-lib/spec-plugman-install/plugins/WebNotifications/plugin.xml b/cordova-lib/spec-plugman-install/plugins/WebNotifications/plugin.xml deleted file mode 100644 index b9026f18e..000000000 --- a/cordova-lib/spec-plugman-install/plugins/WebNotifications/plugin.xml +++ /dev/null @@ -1,47 +0,0 @@ - - - - - - Web Notifications - - - - - - - - - - - - - - - - - - - - diff --git a/cordova-lib/spec-plugman-install/plugins/WebNotifications/src/ios/AppDelegate.m.diff b/cordova-lib/spec-plugman-install/plugins/WebNotifications/src/ios/AppDelegate.m.diff deleted file mode 100644 index 754d079fc..000000000 --- a/cordova-lib/spec-plugman-install/plugins/WebNotifications/src/ios/AppDelegate.m.diff +++ /dev/null @@ -1,18 +0,0 @@ -- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification -{ - // Note: if app wasn't running, you can still get a LN and then it doesn't call this function, - // I think it calls app start but notifies you that LN caused the app start or something like that. - - //UIApplicationState state = [application applicationState]; - //BOOL wasForeground = (state == UIApplicationStateActive); - - //NSString *title = [notification.userInfo objectForKey:@"title"]; - //NSString *body = [notification.userInfo objectForKey:@"body"]; - NSString *tag = [notification.userInfo objectForKey:@"tag"]; - - [(WebNotifications*)[self.viewController getCommandInstance:@"WebNotifications"] clickNotification:tag]; - - application.applicationIconBadgeNumber = 0; - application.scheduledLocalNotifications = [NSArray arrayWithArray:application.scheduledLocalNotifications]; // "hack" to clear seen notifications -} - diff --git a/cordova-lib/spec-plugman-install/plugins/WebNotifications/src/ios/WebNotifications.h b/cordova-lib/spec-plugman-install/plugins/WebNotifications/src/ios/WebNotifications.h deleted file mode 100644 index 1702f4071..000000000 --- a/cordova-lib/spec-plugman-install/plugins/WebNotifications/src/ios/WebNotifications.h +++ /dev/null @@ -1,35 +0,0 @@ -/* - Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.0 (the - "License"); you may not use this file except in compliance - with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, - software distributed under the License is distributed on an - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - KIND, either express or implied. See the License for the - specific language governing permissions and limitations - under the License. - */ - -#import -#import - -@interface WebNotifications : CDVPlugin { -} - -@property (nonatomic, strong) NSMutableArray* activeNotifications; - -- (CDVPlugin*)initWithWebView:(UIWebView*)theWebView; - -- (void)createNotification:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options; -- (void)closeNotification:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options; - -- (void)clickNotification:(NSString*)tag; - -@end diff --git a/cordova-lib/spec-plugman-install/plugins/WebNotifications/src/ios/WebNotifications.m b/cordova-lib/spec-plugman-install/plugins/WebNotifications/src/ios/WebNotifications.m deleted file mode 100644 index 6f0c11ff6..000000000 --- a/cordova-lib/spec-plugman-install/plugins/WebNotifications/src/ios/WebNotifications.m +++ /dev/null @@ -1,124 +0,0 @@ -/* - Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.0 (the - "License"); you may not use this file except in compliance - with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, - software distributed under the License is distributed on an - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - KIND, either express or implied. See the License for the - specific language governing permissions and limitations - under the License. - */ - -#define Log(fmt, ...) NSLog((@"%d: %s " fmt), __LINE__, __PRETTY_FUNCTION__, ##__VA_ARGS__); - -#import "WebNotifications.h" -#import "MainViewController.h" - -@implementation WebNotifications - -@synthesize activeNotifications; - -- (CDVPlugin*)initWithWebView:(UIWebView*)theWebView -{ - self = [super init]; - if (self) { - self.activeNotifications = [NSMutableArray array]; - } - return self; -} - -- (void)createNotification:(CDVInvokedUrlCommand*)command -{ - NSDictionary* options = [command.arguments objectAtIndex:0]; - - // w3c options: - NSString *title = [options objectForKey:@"title"]; - NSString *body = [options objectForKey:@"body"]; - NSString *tag = [options objectForKey:@"tag"]; - //NSString *iconUrl = [options objectForKey:@"iconUrl"]; // Not supported - - // cordova option extensions: - NSUInteger delay = [[options objectForKey:@"delay"] unsignedIntegerValue]; - NSString *soundUrl = [options objectForKey:@"soundUrl"]; - NSInteger badgeNumber = [[options objectForKey:@"badgeNumber"] intValue]; - - Log(@"addNotification title: %@ body: %@ tag: %@ delay: %u badge: %u", title, body, tag, delay, badgeNumber); - - //NSString *action = [options objectForKey:@"action"]; - //bool hasAction = ([[options objectForKey:@"hasAction"] intValue] == 1) ? YES : NO; - //alertAction - - UILocalNotification *notif = [[UILocalNotification alloc] init]; - notif.alertBody = [NSString stringWithFormat:@"[%@] %@: %@", tag, title, body]; - notif.timeZone = [NSTimeZone defaultTimeZone]; - - notif.soundName = soundUrl; - notif.applicationIconBadgeNumber = badgeNumber; - - NSDictionary *userDict = [NSDictionary dictionaryWithObjectsAndKeys:title,@"title",body,@"body",tag,@"tag",nil]; - notif.userInfo = userDict; - - if (delay != 0) { - notif.fireDate = [[NSDate date] addTimeInterval:delay]; - //notif.repeatInterval = [[repeatDict objectForKey: repeat] intValue]; - - [[UIApplication sharedApplication] scheduleLocalNotification:notif]; - } else { - [[UIApplication sharedApplication] presentLocalNotificationNow:notif]; - } - - [self.activeNotifications addObject:notif]; -} - -- (void)closeNotification:(CDVInvokedUrlCommand*)command -{ -// command.callbackId; - NSDictionary* options = [command.arguments objectAtIndex:0]; - NSString *tag = [options objectForKey:@"tag"]; - - NSArray *notifications = [[UIApplication sharedApplication] scheduledLocalNotifications]; - for (UILocalNotification *notification in notifications) { - if ([[notification.userInfo objectForKey:@"tag"] isEqualToString:tag]) { - Log(@"Cancelling notification with tag: %@", tag); - [[UIApplication sharedApplication] cancelLocalNotification:notification]; - [self.activeNotifications removeObject:notification]; - [self.commandDelegate sendPluginResult:[CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsInt:0] callbackId:command.callbackId]; - } - } - [self.commandDelegate sendPluginResult:[CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsInt:0] callbackId:command.callbackId]; -} - -- (void)clickNotification:(NSString*)tag { - NSString *jsCallBack; - - jsCallBack = [NSString stringWithFormat:@"window.Notification.callOnclickByTag('%@')", tag]; - [((CDVViewController*)self.viewController).webView stringByEvaluatingJavaScriptFromString:jsCallBack]; - - NSArray *scheduledNotifications = [[UIApplication sharedApplication] scheduledLocalNotifications]; - NSMutableArray *toDiscard = [NSMutableArray array]; - for (UILocalNotification *notification in self.activeNotifications) { - if (![scheduledNotifications containsObject:notification]) { - // This notification is active, but no longer scheduled, so it must be displayed - jsCallBack = [NSString stringWithFormat:@"window.Notification.callOncloseByTag('%@')", [notification.userInfo objectForKey:@"tag"]]; - [((CDVViewController*)self.viewController).webView stringByEvaluatingJavaScriptFromString:jsCallBack]; - [toDiscard addObject:notification]; - } - } - [self.activeNotifications removeObjectsInArray:toDiscard]; -} - -/* -- (void)cancelAllNotifications:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options { - [[UIApplication sharedApplication] cancelAllLocalNotifications]; -} -*/ - -@end diff --git a/cordova-lib/spec-plugman-install/plugins/WebNotifications/www/webnotifications.js b/cordova-lib/spec-plugman-install/plugins/WebNotifications/www/webnotifications.js deleted file mode 100644 index 6597337a2..000000000 --- a/cordova-lib/spec-plugman-install/plugins/WebNotifications/www/webnotifications.js +++ /dev/null @@ -1,123 +0,0 @@ -/* - Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.0 (the - "License"); you may not use this file except in compliance - with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, - software distributed under the License is distributed on an - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - KIND, either express or implied. See the License for the - specific language governing permissions and limitations - under the License. - */ - -/* - * The W3C window.Notification API: http://www.w3.org/TR/notifications/ - */ -if (typeof window.Notification == 'undefined') { - - /** - * Creates and shows a new notification. - * @param title - * @param options - */ - window.Notification = function(title, options) { - options = options || {}; - - this.title = title || 'defaultTitle'; - - // w3c options: - this.body = options.body || ''; - this.tag = options.tag || 'defaultTag'; - this.iconUrl = options.iconUrl || ''; - // titleDir, bodyDir are not supported - - // cordova option extensions: - this.delay = options.delay || 0; - this.soundUrl = options.soundUrl || ''; - this.badgeNumber = options.badgeNumber || 0; - - // there must be one unique notification per tag, so close any existing outstanding notifications - if (window.Notification.active[this.tag]) - window.Notification.active[this.tag].close(); - window.Notification.active[this.tag] = this; - - // Spec claims these must be defined - this.onclick = options.onclick; - this.onerror = options.onerror; - this.onclose = options.onclose; - this.onshow = options.onshow; - if (this.onshow) { - console.log("Warning, WebNotifications plugin will never call onshow"); // this may change on other platforms - } - - var self = this; - cordova.exec(null, function(error) { - if (self.onerror) { - self.onerror(error); - } - }, 'WebNotifications', 'createNotification', [{ - tag: this.tag, - title: this.title, - body: this.body, - delay: this.delay, - }]); - }; - - // TODO: change name to something internal looking? - window.Notification.permission = 'granted'; - - window.Notification.requestPermission = function(callback) { - setTimeout(function() { - callback(window.Notification.permission); - }, 0); - }; - - // Not part of the W3C API. Used by the native side to call onclick handlers. - // TODO: change name to something internal looking? - window.Notification.callOnclickByTag = function(tag) { - var notification = window.Notification.active[tag]; - if (notification && notification.onclick && typeof notification.onclick == 'function') { - notification.onclick(tag); - } - delete window.Notification.active[tag]; - }; - - window.Notification.callOncloseByTag = function(tag) { - var notification = window.Notification.active[tag]; - if (notification && notification.onclose && typeof notification.onclose == 'function') { - notification.onclose(tag); - } - delete window.Notification.active[tag]; - }; - - // A global map of notifications by tag, so their onclick callbacks can be called. - // TODO: change name to something internal looking? - window.Notification.active = {}; - - /** - * Dismiss a notification. - */ - window.Notification.prototype.close = function() { - var self = this; - cordova.exec(function() { - if (self.onclose) { - self.onclose(); - } - delete window.Notification[self.tag]; - }, function(error) { - if (self.onerror) { - self.onerror(error); - } - delete window.Notification[self.tag]; - }, 'WebNotifications', 'closeNotification', [{ - tag: this.tag, - }]); - }; -} diff --git a/cordova-lib/spec-plugman-install/plugins/WeblessPlugin/plugin.xml b/cordova-lib/spec-plugman-install/plugins/WeblessPlugin/plugin.xml deleted file mode 100644 index f91909618..000000000 --- a/cordova-lib/spec-plugman-install/plugins/WeblessPlugin/plugin.xml +++ /dev/null @@ -1,80 +0,0 @@ - - - - - - Webless Plugin - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/cordova-lib/spec-plugman-install/plugins/WeblessPlugin/src/android/WeblessPlugin.java b/cordova-lib/spec-plugman-install/plugins/WeblessPlugin/src/android/WeblessPlugin.java deleted file mode 100644 index 5263b0c5d..000000000 --- a/cordova-lib/spec-plugman-install/plugins/WeblessPlugin/src/android/WeblessPlugin.java +++ /dev/null @@ -1,19 +0,0 @@ -/* - * - * Copyright 2013 Anis Kadri - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - * -*/ - diff --git a/cordova-lib/spec-plugman-install/plugins/WeblessPlugin/src/ios/WeblessPlugin.bundle/arrow_left.png b/cordova-lib/spec-plugman-install/plugins/WeblessPlugin/src/ios/WeblessPlugin.bundle/arrow_left.png deleted file mode 100644 index 530e12babde279931dc58cb36e2af4d9b7d52acc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2946 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 diff --git a/cordova-lib/spec-plugman-install/plugins/WeblessPlugin/src/ios/WeblessPlugin.bundle/arrow_left@2x.png b/cordova-lib/spec-plugman-install/plugins/WeblessPlugin/src/ios/WeblessPlugin.bundle/arrow_left@2x.png deleted file mode 100644 index 530e12babde279931dc58cb36e2af4d9b7d52acc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2946 zcmV-|3w`v7P)KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z00023NklJtSbB+AdXk9fc_N}0iY0oLh#n)l{dG~XWw)(q<|6v| zU!5@@Gjq=L5OUHFnfVDp8A8~$RuP*5E1X?vTo=3f3`dV75sXl2<|{#gB~IFj7EE!_ z&BuZfHs0rLL4ifbaYPFy*o&i4@Z4yFThbBvVv=2Ql~eGlYqK<3eeNU|+*4wkQ*h5b s*RZQ+h;^=UUC$W1wtDaX>34A%0J_xqo=TAm_W%F@07*qoM6N<$f*=%oe*gdg diff --git a/cordova-lib/spec-plugman-install/plugins/WeblessPlugin/src/ios/WeblessPlugin.bundle/arrow_right.png b/cordova-lib/spec-plugman-install/plugins/WeblessPlugin/src/ios/WeblessPlugin.bundle/arrow_right.png deleted file mode 100644 index 8b3d855e884f8aa8b5d2c78139fa63ff4b5826d9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2946 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 diff --git a/cordova-lib/spec-plugman-install/plugins/WeblessPlugin/src/ios/WeblessPlugin.bundle/arrow_right@2x.png b/cordova-lib/spec-plugman-install/plugins/WeblessPlugin/src/ios/WeblessPlugin.bundle/arrow_right@2x.png deleted file mode 100644 index 8b3d855e884f8aa8b5d2c78139fa63ff4b5826d9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2946 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 diff --git a/cordova-lib/spec-plugman-install/plugins/WeblessPlugin/src/ios/WeblessPlugin.bundle/but_refresh.png b/cordova-lib/spec-plugman-install/plugins/WeblessPlugin/src/ios/WeblessPlugin.bundle/but_refresh.png deleted file mode 100644 index 309b6bdb255b8784cf884e6fa2bde3febe36da5f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3369 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 diff --git a/cordova-lib/spec-plugman-install/plugins/WeblessPlugin/src/ios/WeblessPlugin.bundle/compass@2x.png b/cordova-lib/spec-plugman-install/plugins/WeblessPlugin/src/ios/WeblessPlugin.bundle/compass@2x.png deleted file mode 100644 index 46a890174edb858abbef991828153aea289a3a49..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3035 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 diff --git a/cordova-lib/spec-plugman-install/plugins/WeblessPlugin/src/ios/WeblessPluginCommand.h b/cordova-lib/spec-plugman-install/plugins/WeblessPlugin/src/ios/WeblessPluginCommand.h deleted file mode 100644 index 6a23ab6f0..000000000 --- a/cordova-lib/spec-plugman-install/plugins/WeblessPlugin/src/ios/WeblessPluginCommand.h +++ /dev/null @@ -1,49 +0,0 @@ -/* - * - * Copyright 2013 Anis Kadri - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - * -*/ - -// -// PhoneGap ! ChildBrowserCommand -// -// -// Created by Jesse MacFadyen on 10-05-29. -// Copyright 2010 Nitobi. All rights reserved. -// - -#import -#ifdef PHONEGAP_FRAMEWORK - #import -#else - #import "PGPlugin.h" -#endif -#import "ChildBrowserViewController.h" - - - -@interface ChildBrowserCommand : PGPlugin { - - ChildBrowserViewController* childBrowser; -} - -@property (nonatomic, retain) ChildBrowserViewController *childBrowser; - - -- (void) showWebPage:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options; --(void) onChildLocationChange:(NSString*)newLoc; - -@end diff --git a/cordova-lib/spec-plugman-install/plugins/WeblessPlugin/src/ios/WeblessPluginCommand.m b/cordova-lib/spec-plugman-install/plugins/WeblessPlugin/src/ios/WeblessPluginCommand.m deleted file mode 100644 index 38aaf6497..000000000 --- a/cordova-lib/spec-plugman-install/plugins/WeblessPlugin/src/ios/WeblessPluginCommand.m +++ /dev/null @@ -1,86 +0,0 @@ -// - -// -// -// Created by Jesse MacFadyen on 10-05-29. -// Copyright 2010 Nitobi. All rights reserved. -// Copyright (c) 2011, IBM Corporation -// Copyright 2011, Randy McMillan -// - -#import "ChildBrowserCommand.h" - -#ifdef PHONEGAP_FRAMEWORK - #import -#else - #import "PhoneGapViewController.h" -#endif - - -@implementation ChildBrowserCommand - -@synthesize childBrowser; - -- (void) showWebPage:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options // args: url -{ - - if(childBrowser == NULL) - { - childBrowser = [[ ChildBrowserViewController alloc ] initWithScale:FALSE ]; - childBrowser.delegate = self; - } - -/* // TODO: Work in progress - NSString* strOrientations = [ options objectForKey:@"supportedOrientations"]; - NSArray* supportedOrientations = [strOrientations componentsSeparatedByString:@","]; -*/ - PhoneGapViewController* cont = (PhoneGapViewController*)[ super appViewController ]; - childBrowser.supportedOrientations = cont.supportedOrientations; - - if ([cont respondsToSelector:@selector(presentViewController)]) { - //Reference UIViewController.h Line:179 for update to iOS 5 difference - @RandyMcMillan - [cont presentViewController:childBrowser animated:YES completion:nil]; - } else { - [ cont presentModalViewController:childBrowser animated:YES ]; - } - - NSString *url = (NSString*) [arguments objectAtIndex:0]; - - [childBrowser loadURL:url ]; - -} - --(void) close:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options // args: url -{ - [ childBrowser closeBrowser]; - -} - --(void) onClose -{ - NSString* jsCallback = [NSString stringWithFormat:@"ChildBrowser._onClose();",@""]; - [self.webView stringByEvaluatingJavaScriptFromString:jsCallback]; -} - --(void) onOpenInSafari -{ - NSString* jsCallback = [NSString stringWithFormat:@"ChildBrowser._onOpenExternal();",@""]; - [self.webView stringByEvaluatingJavaScriptFromString:jsCallback]; -} - - --(void) onChildLocationChange:(NSString*)newLoc -{ - - NSString* tempLoc = [NSString stringWithFormat:@"%@",newLoc]; - NSString* encUrl = [tempLoc stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; - - NSString* jsCallback = [NSString stringWithFormat:@"ChildBrowser._onLocationChange('%@');",encUrl]; - [self.webView stringByEvaluatingJavaScriptFromString:jsCallback]; - -} - - - - -@end diff --git a/cordova-lib/spec-plugman-install/plugins/WeblessPlugin/src/ios/WeblessPluginViewController.h b/cordova-lib/spec-plugman-install/plugins/WeblessPlugin/src/ios/WeblessPluginViewController.h deleted file mode 100644 index d6fc139d5..000000000 --- a/cordova-lib/spec-plugman-install/plugins/WeblessPlugin/src/ios/WeblessPluginViewController.h +++ /dev/null @@ -1,73 +0,0 @@ -/* - * - * Copyright 2013 Anis Kadri - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - * -*/ - -// -// ChildBrowserViewController.h -// -// Created by Jesse MacFadyen on 21/07/09. -// Copyright 2009 Nitobi. All rights reserved. -// - -#import - -@protocol ChildBrowserDelegate - - - -/* - * onChildLocationChanging:newLoc - * - * Discussion: - * Invoked when a new page has loaded - */ --(void) onChildLocationChange:(NSString*)newLoc; --(void) onOpenInSafari; --(void) onClose; -@end - - -@interface ChildBrowserViewController : UIViewController < UIWebViewDelegate > { - IBOutlet UIWebView* webView; - IBOutlet UIBarButtonItem* closeBtn; - IBOutlet UIBarButtonItem* refreshBtn; - IBOutlet UILabel* addressLabel; - IBOutlet UIBarButtonItem* backBtn; - IBOutlet UIBarButtonItem* fwdBtn; - IBOutlet UIBarButtonItem* safariBtn; - IBOutlet UIActivityIndicatorView* spinner; - BOOL scaleEnabled; - BOOL isImage; - NSString* imageURL; - NSArray* supportedOrientations; - id delegate; -} - -@property (nonatomic, retain)id delegate; -@property (nonatomic, retain) NSArray* supportedOrientations; -@property(retain) NSString* imageURL; -@property(assign) BOOL isImage; - -- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation) interfaceOrientation; -- (ChildBrowserViewController*)initWithScale:(BOOL)enabled; -- (IBAction)onDoneButtonPress:(id)sender; -- (IBAction)onSafariButtonPress:(id)sender; -- (void)loadURL:(NSString*)url; --(void)closeBrowser; - -@end diff --git a/cordova-lib/spec-plugman-install/plugins/WeblessPlugin/src/ios/WeblessPluginViewController.m b/cordova-lib/spec-plugman-install/plugins/WeblessPlugin/src/ios/WeblessPluginViewController.m deleted file mode 100644 index 167ef9801..000000000 --- a/cordova-lib/spec-plugman-install/plugins/WeblessPlugin/src/ios/WeblessPluginViewController.m +++ /dev/null @@ -1,239 +0,0 @@ -// -// ChildBrowserViewController.m -// -// Created by Jesse MacFadyen on 21/07/09. -// Copyright 2009 Nitobi. All rights reserved. -// Copyright (c) 2011, IBM Corporation -// Copyright 2011, Randy McMillan -// - -#import "ChildBrowserViewController.h" - - -@implementation ChildBrowserViewController - -@synthesize imageURL; -@synthesize supportedOrientations; -@synthesize isImage; -@synthesize delegate; - -/* - // The designated initializer. Override if you create the controller programmatically and want to perform customization that is not appropriate for viewDidLoad. -- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { - if (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) { - // Custom initialization - } - return self; -} -*/ - -+ (NSString*) resolveImageResource:(NSString*)resource -{ - NSString* systemVersion = [[UIDevice currentDevice] systemVersion]; - BOOL isLessThaniOS4 = ([systemVersion compare:@"4.0" options:NSNumericSearch] == NSOrderedAscending); - - // the iPad image (nor retina) differentiation code was not in 3.x, and we have to explicitly set the path - if (isLessThaniOS4) - { - return [NSString stringWithFormat:@"%@.png", resource]; - } - - return resource; -} - - -- (ChildBrowserViewController*)initWithScale:(BOOL)enabled -{ - self = [super init]; - - - scaleEnabled = enabled; - - return self; -} - -// Implement viewDidLoad to do additional setup after loading the view, typically from a nib. -- (void)viewDidLoad { - [super viewDidLoad]; - - refreshBtn.image = [UIImage imageNamed:[[self class] resolveImageResource:@"ChildBrowser.bundle/but_refresh"]]; - backBtn.image = [UIImage imageNamed:[[self class] resolveImageResource:@"ChildBrowser.bundle/arrow_left"]]; - fwdBtn.image = [UIImage imageNamed:[[self class] resolveImageResource:@"ChildBrowser.bundle/arrow_right"]]; - safariBtn.image = [UIImage imageNamed:[[self class] resolveImageResource:@"ChildBrowser.bundle/compass"]]; - - webView.delegate = self; - webView.scalesPageToFit = TRUE; - webView.backgroundColor = [UIColor whiteColor]; - NSLog(@"View did load"); -} - - - - - -- (void)didReceiveMemoryWarning { - // Releases the view if it doesn't have a superview. - [super didReceiveMemoryWarning]; - - // Release any cached data, images, etc that aren't in use. -} - -- (void)viewDidUnload { - // Release any retained subviews of the main view. - // e.g. self.myOutlet = nil; - NSLog(@"View did UN-load"); -} - - -- (void)dealloc { - - webView.delegate = nil; - - [webView release]; - [closeBtn release]; - [refreshBtn release]; - [addressLabel release]; - [backBtn release]; - [fwdBtn release]; - [safariBtn release]; - [spinner release]; - [ supportedOrientations release]; - [super dealloc]; -} - --(void)closeBrowser -{ - - if(delegate != NULL) - { - [delegate onClose]; - } - if ([self respondsToSelector:@selector(presentingViewController)]) { - //Reference UIViewController.h Line:179 for update to iOS 5 difference - @RandyMcMillan - [[self presentingViewController] dismissViewControllerAnimated:YES completion:nil]; - } else { - [[self parentViewController] dismissModalViewControllerAnimated:YES]; - } -} - --(IBAction) onDoneButtonPress:(id)sender -{ - [ self closeBrowser]; - - NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"about:blank"]]; - [webView loadRequest:request]; -} - - --(IBAction) onSafariButtonPress:(id)sender -{ - - if(delegate != NULL) - { - [delegate onOpenInSafari]; - } - - if(isImage) - { - NSURL* pURL = [[ [NSURL alloc] initWithString:imageURL ] autorelease]; - [ [ UIApplication sharedApplication ] openURL:pURL ]; - } - else - { - NSURLRequest *request = webView.request; - [[UIApplication sharedApplication] openURL:request.URL]; - } - - -} - -- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation) interfaceOrientation -{ - BOOL autoRotate = [self.supportedOrientations count] > 1; // autorotate if only more than 1 orientation supported - if (autoRotate) - { - if ([self.supportedOrientations containsObject: - [NSNumber numberWithInt:interfaceOrientation]]) { - return YES; - } - } - - return NO; -} - - - - -- (void)loadURL:(NSString*)url -{ - NSLog(@"Opening Url : %@",url); - - if( [url hasSuffix:@".png" ] || - [url hasSuffix:@".jpg" ] || - [url hasSuffix:@".jpeg" ] || - [url hasSuffix:@".bmp" ] || - [url hasSuffix:@".gif" ] ) - { - [ imageURL release ]; - imageURL = [url copy]; - isImage = YES; - NSString* htmlText = @""; - htmlText = [ htmlText stringByReplacingOccurrencesOfString:@"IMGSRC" withString:url ]; - - [webView loadHTMLString:htmlText baseURL:[NSURL URLWithString:@""]]; - - } - else - { - imageURL = @""; - isImage = NO; - NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:url]]; - [webView loadRequest:request]; - } - webView.hidden = NO; -} - - -- (void)webViewDidStartLoad:(UIWebView *)sender { - addressLabel.text = @"Loading..."; - backBtn.enabled = webView.canGoBack; - fwdBtn.enabled = webView.canGoForward; - - [ spinner startAnimating ]; - -} - -- (void)webViewDidFinishLoad:(UIWebView *)sender -{ - NSURLRequest *request = webView.request; - NSLog(@"New Address is : %@",request.URL.absoluteString); - addressLabel.text = request.URL.absoluteString; - backBtn.enabled = webView.canGoBack; - fwdBtn.enabled = webView.canGoForward; - [ spinner stopAnimating ]; - - if(delegate != NULL) - { - [delegate onChildLocationChange:request.URL.absoluteString]; - } - -} - -- (void)webView:(UIWebView *)wv didFailLoadWithError:(NSError *)error { - NSLog (@"webView:didFailLoadWithError"); - [spinner stopAnimating]; - addressLabel.text = @"Failed"; - if (error != NULL) { - UIAlertView *errorAlert = [[UIAlertView alloc] - initWithTitle: [error localizedDescription] - message: [error localizedFailureReason] - delegate:nil - cancelButtonTitle:@"OK" - otherButtonTitles:nil]; - [errorAlert show]; - [errorAlert release]; - } -} - - -@end diff --git a/cordova-lib/spec-plugman-install/plugins/WeblessPlugin/src/ios/WeblessPluginViewController.xib b/cordova-lib/spec-plugman-install/plugins/WeblessPlugin/src/ios/WeblessPluginViewController.xib deleted file mode 100644 index cc8dd6592..000000000 --- a/cordova-lib/spec-plugman-install/plugins/WeblessPlugin/src/ios/WeblessPluginViewController.xib +++ /dev/null @@ -1,875 +0,0 @@ - - - - 768 - 10K540 - 851 - 1038.36 - 461.00 - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - 141 - - - YES - - - YES - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - YES - - YES - - - YES - - - - YES - - IBFilesOwner - IBCocoaTouchFramework - - - IBFirstResponder - IBCocoaTouchFramework - - - - 292 - - YES - - - -2147483374 - {480, 229} - - - - 1 - MCAwIDAAA - - YES - YES - IBCocoaTouchFramework - 1 - YES - - - - 266 - {{0, 256}, {480, 44}} - - - NO - NO - IBCocoaTouchFramework - 1 - - YES - - IBCocoaTouchFramework - 1 - - 0 - - - IBCocoaTouchFramework - - 5 - - - IBCocoaTouchFramework - - - - IBCocoaTouchFramework - - 5 - - - IBCocoaTouchFramework - 32 - - - - IBCocoaTouchFramework - - 5 - - - IBCocoaTouchFramework - 32 - - - - IBCocoaTouchFramework - - 5 - - - IBCocoaTouchFramework - 32 - - - - IBCocoaTouchFramework - - 5 - - - - - - 270 - {{5, 230}, {418, 21}} - - - - 4 - MC42NjY2NjY2OSAwAA - - NO - YES - NO - IBCocoaTouchFramework - Loading... - - Helvetica - 13 - 16 - - - 3 - MQA - - - 1 - NO - 10 - - - - -2147483383 - {{454, 231}, {20, 20}} - - NO - NO - NO - IBCocoaTouchFramework - - - {{0, 20}, {480, 300}} - - - 3 - MC41AA - - 2 - - - - - 3 - - IBCocoaTouchFramework - - - - - YES - - - webView - - - - 17 - - - - addressLabel - - - - 18 - - - - backBtn - - - - 19 - - - - fwdBtn - - - - 22 - - - - refreshBtn - - - - 23 - - - - onDoneButtonPress: - - - - 26 - - - - reload - - - - 27 - - - - goBack - - - - 28 - - - - goForward - - - - 29 - - - - onSafariButtonPress: - - - - 31 - - - - view - - - - 35 - - - - spinner - - - - 36 - - - - safariBtn - - - - 40 - - - - - YES - - 0 - - - - - - 1 - - - YES - - - - - - - - - -1 - - - File's Owner - - - -2 - - - - - 4 - - - - - 6 - - - YES - - - - - - - - - - - - - - - 7 - - - - - 8 - - - Bar Button Item (Reload) - - - 9 - - - Bar Button Item (Go Back) - - - 10 - - - Bar Button Item (Go Forward) - - - 11 - - - Bar Button Item (Safari) - - - 13 - - - - - 14 - - - - - 15 - - - - - 32 - - - - - 37 - - - - - 38 - - - - - 39 - - - - - - - YES - - YES - -1.CustomClassName - -2.CustomClassName - 1.IBEditorWindowLastContentRect - 1.IBPluginDependency - 10.IBPluginDependency - 11.IBPluginDependency - 13.IBPluginDependency - 13.IBViewBoundsToFrameTransform - 14.IBPluginDependency - 15.IBPluginDependency - 32.IBPluginDependency - 32.IBViewBoundsToFrameTransform - 37.IBPluginDependency - 38.IBPluginDependency - 39.IBPluginDependency - 4.IBPluginDependency - 4.IBViewBoundsToFrameTransform - 6.IBPluginDependency - 6.IBViewBoundsToFrameTransform - 7.IBPluginDependency - 8.IBPluginDependency - 9.IBPluginDependency - - - YES - ChildBrowserViewController - UIResponder - {{250, 643}, {480, 320}} - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABCoAAAwygAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABD5gAAw3kAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABB8AAAwwUAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAAAAAAAAw10AAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - - YES - - - YES - - - - - YES - - - YES - - - - 40 - - - - YES - - ChildBrowserViewController - UIViewController - - YES - - YES - onDoneButtonPress: - onSafariButtonPress: - - - YES - id - id - - - - YES - - YES - onDoneButtonPress: - onSafariButtonPress: - - - YES - - onDoneButtonPress: - id - - - onSafariButtonPress: - id - - - - - YES - - YES - addressLabel - backBtn - closeBtn - delegate - fwdBtn - refreshBtn - safariBtn - spinner - webView - - - YES - UILabel - UIBarButtonItem - UIBarButtonItem - id - UIBarButtonItem - UIBarButtonItem - UIBarButtonItem - UIActivityIndicatorView - UIWebView - - - - YES - - YES - addressLabel - backBtn - closeBtn - delegate - fwdBtn - refreshBtn - safariBtn - spinner - webView - - - YES - - addressLabel - UILabel - - - backBtn - UIBarButtonItem - - - closeBtn - UIBarButtonItem - - - delegate - id - - - fwdBtn - UIBarButtonItem - - - refreshBtn - UIBarButtonItem - - - safariBtn - UIBarButtonItem - - - spinner - UIActivityIndicatorView - - - webView - UIWebView - - - - - IBProjectSource - Plugins/ChildBrowser/ChildBrowserViewController.h - - - - - YES - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSError.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSFileManager.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyValueCoding.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyValueObserving.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyedArchiver.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSObject.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSRunLoop.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSThread.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURL.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURLConnection.h - - - - NSObject - - IBFrameworkSource - QuartzCore.framework/Headers/CAAnimation.h - - - - NSObject - - IBFrameworkSource - QuartzCore.framework/Headers/CALayer.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIAccessibility.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UINibLoading.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIResponder.h - - - - UIActivityIndicatorView - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIActivityIndicatorView.h - - - - UIBarButtonItem - UIBarItem - - IBFrameworkSource - UIKit.framework/Headers/UIBarButtonItem.h - - - - UIBarItem - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIBarItem.h - - - - UILabel - UIView - - IBFrameworkSource - UIKit.framework/Headers/UILabel.h - - - - UIResponder - NSObject - - - - UISearchBar - UIView - - IBFrameworkSource - UIKit.framework/Headers/UISearchBar.h - - - - UISearchDisplayController - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UISearchDisplayController.h - - - - UIToolbar - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIToolbar.h - - - - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIPrintFormatter.h - - - - UIView - - IBFrameworkSource - UIKit.framework/Headers/UITextField.h - - - - UIView - UIResponder - - IBFrameworkSource - UIKit.framework/Headers/UIView.h - - - - UIViewController - - IBFrameworkSource - MediaPlayer.framework/Headers/MPMoviePlayerViewController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UINavigationController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UIPopoverController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UISplitViewController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UITabBarController.h - - - - UIViewController - UIResponder - - IBFrameworkSource - UIKit.framework/Headers/UIViewController.h - - - - UIWebView - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIWebView.h - - - - - 0 - IBCocoaTouchFramework - - com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS - - - - com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS - - - - com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 - - - YES - - 3 - 141 - - diff --git a/cordova-lib/spec-plugman-install/plugins/cordova.echo/.gitignore b/cordova-lib/spec-plugman-install/plugins/cordova.echo/.gitignore deleted file mode 100644 index e43b0f988..000000000 --- a/cordova-lib/spec-plugman-install/plugins/cordova.echo/.gitignore +++ /dev/null @@ -1 +0,0 @@ -.DS_Store diff --git a/cordova-lib/spec-plugman-install/plugins/cordova.echo/plugin.xml b/cordova-lib/spec-plugman-install/plugins/cordova.echo/plugin.xml deleted file mode 100644 index a9145e778..000000000 --- a/cordova-lib/spec-plugman-install/plugins/cordova.echo/plugin.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - cordova echo - - - - - - - - - - - - - - diff --git a/cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/index.js b/cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/index.js deleted file mode 100644 index 0759a20eb..000000000 --- a/cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/index.js +++ /dev/null @@ -1,85 +0,0 @@ -/* - * - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - * -*/ - -var echoJNext, - _event = require("../../lib/event"), - winCallback = null, - failCallback = null; - -module.exports = { - doEcho: function (success, fail, args) { - var invokeData = { "message" : JSON.parse(decodeURIComponent(args.message)) }; - try { - success(echoJNext.getEchoJNext(invokeData)); - } catch (e) { - fail(-1, e); - } - } -}; - -/////////////////////////////////////////////////////////////////// -// JavaScript wrapper for JNEXT plugin -/////////////////////////////////////////////////////////////////// - -JNEXT.EchoJNext = function () -{ - var _self = this; - - _self.getEchoJNext = function (args) { - return JNEXT.invoke(_self._id, "doEcho " + JSON.stringify(args)); - }; - - _self.getId = function () { - return _self._id; - }; - - _self.init = function () { - if (!JNEXT.require("echoJnext")) { - return false; - } - - _self._id = JNEXT.createObject("echoJnext.Echo"); - - if (!_self._id || _self._id === "") { - return false; - } - - JNEXT.registerEvents(_self); - }; - - _self.onEvent = function (strData) { - var arData = strData.split(" "), - strEventId = arData[0], - args = arData[1], - info = {}; - - if (strEventId === "cordova.echo.callback") { - _event.trigger("echoCallback", args); - } - - }; - - _self._id = ""; - - _self.init(); -}; - -echoJNext = new JNEXT.EchoJNext(); diff --git a/cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/device/echoJnext.so b/cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/device/echoJnext.so deleted file mode 100755 index 169714a07120b9679dfa9339e5ceb24eec47010e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1291818 zcmZr(30O@}A3k>}w-mRO%6i+Vgi=u{-B#IBmj1FtjB$-(5e!No+BCj)CoVuc7Q zG0~kzNu`ub;@(B#Bn_uzYGO)C@#TF&5g}FWLP;FmsR$=>Tf);<+ez^w#4?J%SR@un zBcfC(S)3vjC-#b>geqo2AtiJc3#F7~2VWSmb4-Pqljc&2FLaWo@RWJ(QjtvNB+;c@ zvR!z}GCpV`dQK^4x=8ihBl%L9EAD_)l9s;(glh5LN^z7KkEbjQrxbf>MhW@;ml7o^ ze3@9nLpcw3k+sqZQ8Xpe*li_RE0y-srKBce(JU%ZMoGm=lnB!z6ffGBoKI0wKBX?v z=Bqe)Bn=fxlqi{^2;-nAiZAAQQX)OdNIgoO&-bknDN=lGzEs^T6J3xd`5Jr5G$uVInQyVT)PD>6KXHFIH^PLo=;5iwYG$n~>8l~RW zNRJvz3F9akB~=@$;O5A~pu{SC@I@w{iV~PnBEFGCVkj%1q!cBS3Mr8Y&27leP(`GH;Va7U1Yab zq^PyZ60uY&-pZHhqW?Uewt)nXPtlq8&o3Z;~ZSSF1@ zl|rc$vmnqGYx43VTzY{=wL3aeJEPD?p-fESnMhwwVe(&1y)qeLpc z`~{*BCY0oQB+o@G7WasLF2sxpeWlU9QBG*a04z))@P^=zNN6VZ9OJ7I$kUVGYb%k2 z`$|Xm;DabKDY-@QUBzNbJu!u9SLM5pDi)fqrNn9!Xl|g?QLIRbByIUJUy(!^jZjjB zwxy%R!+3lX%2TR{4yifuQ3WQCiV7Dx8EpwyQ{0in(^jDZnJBy}g({>( zQgW+H5~a)&s!(FSIYqfjjri!jP@kgo6{C1OnNR}CN}Zr-B&4v|5#nUD+Du680Cz|! z<$fTM3zZlr;_I&FOC*Y7h!#)6GmxMUd?NQ0FHuiL!Hh@smGP+vzKgDm&y!H@Qbn;c zI<=5LCYjVL&>qf{8B&>|D9`y_$RvU4l(tmnfq4d-NGQIel#~N?&_5|fCGtgLkZdia zOWjx0fsm(zw%DDogy)pqhT?BM#WyI48jAjjsQF4lB5&$=9#bgctE?4CBoY~q^5SVH z^2B0)k+O_}tm>&bMJZ^IQq+9PNM?&G%8}BQQMuY~7(BR`r$2;J=Eq58l*CLdl%WeE zs+*ItOnWjKN^u#QFH}+aWCVG#R(EW$q1p;lal0V>KdS8 zN{l8kIeu==N+3%j1tN&3ekznm*DW&9QP)7v>9Sb7OGTtEc2|fqR#2B+a*@g?-9#fu z5#J)hQ!P_W$&L#7s0h=>i;yOI@}!iJ&{!<)t)Zg^OLa#?sYqO;q^k%*Un)wr$dp{> zXHsG@A9NC_Xj5?*jv5v2Nevf?pqog(SgKou`?{$Sw-v|)n3?7GBKJj7JS2oVS5wsE z8A~W9m^Yca+%5|F;!HwMA?i)!cjNOmP+I%cL}CMqA1>^|$3%nmhk>RNG^-;)wK9;* zO^B&RkfM`fM;9eD%@dW)7xFc<3q;y3PWQ}DZUT+PLQRPaJTcXfCyEccQj|^GOo$;RdnBB_ z!##!e9Ib1qvl&OW_W%sXiNv<6HEf8FgFmRU1~Zo3z!WA0Zf>S zi+R9&U?Fppj)M^|2A0t2P&!_YcqM%ufjAO~24aCYU^TD?AYm=A9)QqL8-R@f37dg* zU>mRl*a_?g_5k|;60%z&>JZ|iz%e>~0`Y13I**ReAU+G611`|_nCK!d3V=&MA#fQe z0*V0=N`Y(gD~h^__!dwG+yU+aB;0F>s0WB20u{g`;0f>?s0LmFB)n;fsJDpU(bu(f zT#vW`fFMxc>3fZcn}AVu1Avh!0U!hv0VSXM0B8c*KqsIJ&=u$g zNB~_xA0WX1u_1lk6R|O10`vi3J17gl3Lv3B9g}MtT-yVVfD_;XxB;*{@-PJPFkl4W zMc*5Rcnt6#ogRnS2bc&<0(^m~014CRH~{esU?wmN2m*+M9D+$*dfQ>*hkOFK5(ts^M2CyB-0`>rVfoxzuK*9mU zIlxii1aJz-1I_{$fdYUDmvDWVPG3P>3S0wj05<^=$`IcM?gICL2LK5bh#vt@fM-B8 z@EYKT8czBxu50P^N5u6&1MnI63Va7h_<^_)_z5)8_sIQbT*HFH+=2gqHh>6F0@?y_ zN+?x;3GL}?b;KF~^fA>DfYy=+_;6HbpbO9q=nhB#JwP8I!H|x7A~pef0j5A7fP}t? z`vDe!B`^T60Z6b#Y)@Z1(6J+8XTSv@s}VO~C@>8007w`~$6km>0i%Jjz<&S<;}DMr zCIXY_do4Na-^rZ&ez=}Wr>7wf0Hy;ofLXw7U=A=3SO5eAA;1!VgcXRxffyi`z88-; zfxd1jMN#YM^m@dJKnk7Sgg6b@0&E4g0o#F{00~)$cL95VeZWD02|2hv3>*Va0=d8$ z;2c20dBg?uHA!E>bsikw-41bkKpp4+XaF4nZ9oU; z1dz}bad-Nfq$Rl41@r&|pa)0#*PC{pr}6j%^SR1P0M*C&Yt+ zA;2)e0~iU61;zp60TL!6o(xO@{D5fy2?2;_0CVW{Jj4rtg+MT{1Xv0z1C|3T0Vc@k z>u|(TKnxHEtOiI}hd2>P1~vhk0Vbs4It|zgWB{2!7O)o}VISiCzyTl!I0768P5>u? zT;LRN8XzGL@p<3^aFM>3kGKFR1d8Z;#fYx}C3N~K;_JXopbWSTkZ^~N$@P6)mjjQ0 zO5iE*40sMy1FwMBKn?H~cn8!19{?tN#C1LJnRD+eefhC46c2E@xVl2GQb2sTu%i8 z=zG%<2h!Jb5YGn|0ZZt6OA#*zRsbu3RX{ip4a5L(015Gk*8pqj^g6_ezy>-^$|U1D zg-)l@@m9ncz&2nzuoEC53-K=cnxyyPIvdyz90HC3$AOc;Dc}rn0U#kC@g?9gPy`eM zSAY`WDsUaR3ET!qxP$mEa36R8JOZ8oBvjJzQ#yW*xC(dyyrS>DLHrh|1?qqgKt1po z_zHXjegHp#UjPZsB*ub;2PgoFKpTJr5n?6!nxs{6Ee1LO8h{p{19Sqq09}D@014d@ z>jC;ZVu=~0Ns0N!+ZJmQJKWWX2j2c`ovfIxtR*@))=^MM6GFt8X{0;~YSfN&rRhz4SS zSRf9F2i5=y014|5Cjv>pCi>nM#2LVLAQRXL>;m=z`+#iV0B{f>AqVkc;0SOGI02ji z{tf4F?*ee~|Kt_m-X)+2D5mqTAifG*2W|qlfV%(*_Ygk>9?|JaIwpC~aa~QPUm$)7 zyaHYWHNaco9q=Cb0DJ_P@QHK%1J{kfPv95O3{Y6Q@&FQqh}!^4bXo;*J3tN40JH#Y zKnLgqbOyQuOwh%(9$*Oc0D1x>7$Y_X`T}M^Kfn?o!3yyJz!n$?*a7x{6mSHb0TNsh z4+e$-!|8h?5PJY40Z+gS7zK<0d;k*0Bc1?E0(|LvsOl0IHCWi!ObS`%9DP-&P{&z`-R*0tc*ROS-Fz}4eqW?yOG-T+xMB#yAh!q zElk=J7nWSP-e1*r_{pC$>;#itf;Z&njSnrHWh|>xqKd`!AxRGti!#5N#(TF7=089D z_9lO#R$|eMjb9&`M^64av;5fH`UK@y2VWMiSnyxJuH74#&baPgYL%_HwztAqj{(QB zzUq}VUmY&qGUJJjP42i~%gS!}ezgw1_~^gRzuT#XNCa!7T|T-b=yrM0tJ7_bmA?;! z7(agF^Sg4)Ma>gBT5o=y7Z_htR9LQCY~~^>8@2uYyuIITCPkUg-}^^U($Mc?exS91 z`pcouD!+#Y{vNHCYWI@AbXD=FTzkZWfb&#_?hnz8?O)QKb=+tEr?XAgngv;|&oU3Z z8Qk1?$v~CT`LXBYqMd#?k4kXx@!jjvCt_C7sh#^W-~1FDPAk&rb>n?}*kO~%+^~Q_ zPXjw7B{`ixbf?#&@u3&YL#-TZ+`dzW_TJTJCI!BFJ+F^VuM^W1Ox!lD?o@EhF#S@x zMQ6wEIeXuH_t3cWBG3JV)t1%RgjXi)+a1b!!mY&?1fX|(X~_KU3@$Sn73OpwQAVn<(ZAv z!JAcl=H49j#IVzV>;2OegdJ{Fe}37x!nN{F&&>4_!}FoeuJ>!7%YHN!PaClA&*n|Z zv(8t{&NETnc5c?di(_ksK09ywt;S)TTB^;2MO&JM8M^wzGJKYrc$=I~XlSRqM#W@XW}pFSE=M=XUF>Hfg0w$c!o5A3GY`dmGt`+f{D9@>;oV@U@SHgB)*f6gQts zeR%TQ_>DUhyGR0c->sNak{k13LZ=12e#Wn!X^T3#CvMiXLtMuneuh^a>AdVfQQ4T# zlmhb+X|<2yb_AVJ>?IzqwCYpR_a08;ckN#^zPKddQPGPxNu8aInmXP#@3yG@k?`JT zyQUAhIex(O_p0;NmrR{xcC+Vz%L_wRZWcd$(QF+&bhFqpyyv%z=XyI$UhHU_ey>bF zd&0o${hMaj_E@(+&cQF&deObA&pxu7=JBI%CEe-0yJywFkipwm8_kI5Hhl1LN0Ui` znt69>^S6c$xV(9lG-G4(chQY*Pj-4YymU~?&~+VU)oK0kSDB-x>!y#$o$lto_I{7F zuGHqoQ-*t`(CW-aZocsL2jwT28o;2`l3y3!cT(s! zZpMV>mGtHVo(Sz=zBM)v-C`W%diaX?iSI_-wuo~$l2!B*tBLq{ThvfgN(Xfeeq`6 z;_t7LLgsdRQ`;8@2cQ-@E#w;+4gGrNO%M+=x0+{@Q+ABVF{n&_VHfc9%bByCWepj3mM-iN zqrXpQ_m`u)+RfYlrSpVA6+T%COVgiEy!q~pSApBu@$)w&hJAW+HKNa?z`!NpTZgXH z$k}o&e3JM1JGB8Gg<8D@x0fDL@3sHGBfDP(KHT_1<&soSCpK${)4?8^8$Uc)S3BBg zlV9rS+LZ^NZn2tU9lSer&Ei8^<@a9vy45_v9+4e$A8!valj)v!*Bg7*T_Rl zed+nT=FNU@+WmOCuLyqt~Rmz zGTuy`IpW!Mt8}Gsi+LSgGuw4vw7@zz?Wg|!%ABQ1{on2K?)$rU$KZ2{w$c9$SZh76 zhm)Frih9vuk7V)CYE)+UF7VI67ioWP+RU0z9k8v?Jv7JRow!#~x0kwGzFwp}#x@1# zKV5gLWOe%<38`P_yQB@D!!P>U?6@kuDn`fWN$|qMX2)(m%bsG>W`knp+2F%PX_sUH>Y*AaZZ|Y@thoP<~e6AT>7{4{}{Q#Z7hJ|Aew{O2Bc)d@@e%YG6P0f!) zD{J-3p4xaIY)V}9k~!}R40lV_R{PJ5*SE?M>?})s9NGT*PQ#?oFR#{?SPie3w7yDv z*^%}269=f(+DX$h_Rm)Pe(Y0Sz<*n=eHrj8dx_q&EAF9gd%w*5Gw_Y)Z`*w?f8wu9 z-_~XR>0Rq}Mi?o?q;#tNX4g1Uxm3lpw4nTAr+$kYRloVF`?z)(d35abq|~pYEN!B9 zZvJ&ooEVvXrM_{Qz1ynv=@HGR_45uIrUn|@k2ZB#CGXU+RgkB^&mk15@`xOZe@{-kH& zn!ZtM9A2y+Hf3IDgY)?C^|{ZzJEglex_A0>)2gE9Rx^GuLg_-MzIVX6pPL^(N+Rr;Kh! ze|{9~DBue!%7S{U_1mu%G|uLLso+J~txb((0Rw}aCd?2ho|0TXzd7#y`T9jUQyYu2 zW@w##v0=pw&+ZPV4}8>rH9dU$B=?}UE_=!n1uynHY{;1X=z2d(`vCpBRxgZ`LN5k) zf2A>`P0FW@^%IBx_i4`cLkrTgSNmPJ_Borax@yB$&z+~XCXX?BGwq<};=64&&3%!% zv-;iLkL_kqOZquKiOCvaR$5TwzUg7j=4HFGQ&PW%y|Oqu_ezaRSDn;7D~EjhHmB<` zQ~T|O`W+7@`@ZOyKR?%|p$#-C1lUV(jlPlBvMSM{y zd2k{2@+8mgO8H^^tG&h!duTIiO&s#No;K@lligq#a`8}oN9T$AUY)zPe&SWNXO2Gp z)$5VJ4oKbhxcAFK$@|m}+LZLJRYh~r=Pg_I`h~3BB3jYIcjzRmYuiWuSY7=}{nfeh zkkyKr`J-GMIyd-3p4ePLS4f*>Qci-qC=>LrKTYx!^8UKVTM z{XqT8_diqTRD6jw3CT=webVo_v7JSt_cVj|J!V~9FfGshnB;huLDPl|==H0-(?stN z=9hTA7S|cetOg`ml+EvQa^0LiB^@jd&lF6_G*a~U++NK8oKcduGF|!ch1f+gUsM)E zT!=02TJpibd+e~?ZEi>p<^<+kL%wXG!TVmRvKcks4_Rgnb&x1M(f_7xqZ5A%d1b)2 z^@Woi(-K3+dd_XUzFo8;K(o3zcb#IU`rJ2`ig&B6B8pWbl1C?mR_-ZSFld{rQ`#P_ zpz-GJo!c);U3@^NdD9E!dBZ-ulJ@q0Xnm|^c6dRgaaeX6h19R#s+RmTww&U5*L_`3 z$BiAo{7QDV`}lCn#ixhA&%ZWpxAABfBef0gMY@-E1r85!mSj$z9d+;4leDrAsP9Ev z^N7F`+P~lb$g9e=84!3m@8d#a7wsvkVvbGzfpvv(Jd z3i&gA(Z!R}mlI3%JKf4JxTlt`_SN?Fvo3ePMP?+1dPGc{+y3kI##HI2%K&F{p)=CeO)2&3;Zw_VR|V=dhpxRB z(0{t{RZcn>1#NIQQlkca`}W^_Z{hr=#kZWN?J2U;I6mX$C{tU7Rl&Z&0WJ%g zO?^h{Tk2>%TAZ2c6_z)1otpjmSy_E+GCnwue{sMwRvc<@s_Jau@v-~2t*(6Sd~NCT zXX_h04hVeD9Zy}ZxNU2!^#xm-b8WY}PdMHyW|FH-?5BORf7flcol@*_V)mo8JIycl z+@w_cJ-^$6r8i@gm#BC4i?0ZLZmjOSxvFT$&ii`lS|{yydfK(iZg!Mv z<=q;E>fg56CgLdrZ<_^o2x(ZqvB#a7J>fMIOEs>9As#jZ5%gr&+bni_GU{{?~mMG5Ha!kk@1&u z2P_;vyV6l(qMJg%S-pbjwZZLbQ{S1ztx}(Ib@-aCrB#0#gZ*!{aoFVlJz;mM*1+~j z;dwK2_V%qwKD2GM)}!Z7yT5n7_D?DPr6GjXS)%wx9O@o<2S7&9NGgBrk zzrA^RcAsRW@8|Xgbr7w1=d=E9-S24!uP)UYqT|r@nL$c%yM@uiJDYn92s-d|?N0If zXB(RCAAj;Da>Mhirx6j_%^zbsKRkE)Qa#VgC!|Z>XU-ReCXM&MwCYE_ zW1p#u1k)N)&h!rmlBw?SJYh0OaOAhl;```h`y8KoiXsmi^W0u6xIHi}d~WNg->*e<%Q{+2YuStX}_AsrJ0pEZ;t#*8{X_?`sQj^-Sc_2Z_E{H`_G)= z(RP{exZ_C4_RIa2){XRzSpTT=!1jF)887wr-utxfK;N4F2b4-WAFY~PYLnM7Uny?3 zsk)cJ9i^TV{@bx4JJ)-p*1j1Fm*|*PTJ*f_-|3Q6 zX{I&DLw$$Mg=bqlV$_D#Hq9UJeC_CL&F~*nsso1w@E!RdG^}ox-Fz9)W?=TskGDp5 ztZ#dwljZfA(3M7ae$_Nst9AC6GpkBh)HFu1ZjoF2zIU(sn@lyzRw?N9+(|V)TcvPd z-M|&7vm$8Ppl_=SvzpG9?fBBZa(IJyT|$IrUZ>}8`;N?ZP)o5->wN3>@A{8JV-Fi2 zsBaVccxKa(6B{QSUG{F1dbzAA;J;T()sh?k6u%kbXxH{*yS1HX@O^{Qy?Ms{6>2+# zp8lmh{MgPB^M^dE`7$CyVZhS5O_5{svl4>L+$E0p-~88mcdm20ik)jT{1no66$E#L zUOE2wrShP>jy|=)!|rwDWm`{8J+*oFitOn!x2d|3UiL?4rLFH%yeuba_%-KG8+3xk zPTpR#uD|WA_nV^!2nt_>~4DZ_8JGc6U46eM_k4u+DvJ zI%_F8>z&DYu&!tEU?rb9!_K3w{yN=qo~=?itCnt+qyM4rNTF?spudai!@-UB&+x*0 zO_v4QHyY;8T=VWro6xU$>kd8I_QTeEOS}bjTDo1g(&lFFV%zL3N!>EDr}z8xtnXsu z)Zx1hOq|X4Jz00va@aG;(*A`F)26D7-~8$8jLBD5sPtkN8jjg-QF5cp@?L5kmP~Cpao~a2)yQFI z#Ang>?>@FZ-zIGK`gm+p@x)=u9b&&2UCca)rigEp%63^A< z^}L!V`mFutqEmIuy05RtecT*6zhKKY%MoseyE?0Oo2~NLLGh`M;t4O$6f?aI775+^ z*6hoA_+njXWnSfMEurI|sS33%e)i|yHlE0kSq)e8p1bdB@KfKw*G(z=>vn(nUUhlU+VGJ-mf2?a zS8vLg5`T7YH_OGw%@f-DZ=J{YU9+*MTZ(I#>i$6rwUJZG_b$HDFfChi`oSYj8~41N zs~){^WM-tX&7%IUp%V(DdYoH#-n29@W5<54EI$pa@*~4F53d_BC$z`=n$s^L0&=u_ z8SOeB^geiyzsWY=r4EeH7;C z$3ERVs&Sp)e7-bm>Xc752B*f#X5DZxay+M!cJ}e~lS>A!TY1EBd+cJB%9WZ!A`-S< zn)vv=@3^jqY;3MHo2%(vycH7Nt$pK_dmVnQJ$>=$&KqM-96XTMZs4|`KWa2AbAr-T z*Uw#KH7KXkM5ElclkJ6TPj=X}81?Vnyzys{QD8NE`P|ofv2ls>0fVunHa^QmTYjH; zz3_Lp9&Qm8E1$1FlV`hk#p3>1^?x?*Q5@Q@{NCuy$Y-Vr2O4ab#!cvdUvoV0B0$3` zcINv5$5t90soyYSj;oS})zOV64~OPWdE%AXW;)k(G{-LNTR`~*cHe#H#E*?t z&eQEbgc)=>a(kebR#U~6*H_AEGZ9ZAOFfLGP^qF zl}UBu@z_-kXV$$5x__o%iNwoh1&AD zq-ejXKc>x6a(=MSaoEKt9~zbJAMdjJ%|(N(%{Od(rkJ=zDE(RM+EqNbo94L8$Th}~ z4DuDW+!&nF%lhg44OXMxtaA%AsM}s+`MKt>&%R!Bmd*OrpcAF4Ve;aX?$m3=9d%c| z)3$Hm#}{7jpXC3$Y17)G%*PL|c{b-Iri^ujTdHVRscFF(>7KOxU*?-!@y+_N+7r<_w(4e9l4N<`e2S0~0S zdNcXL-Vo!YyM;T2UFPK8dz$09P*dwopZ-Z-BIhqME%rST-)7poBSY@lgq*tL4;sb-tq!dfFqe|D)L+MKVtlK+1)zbw5oM_FPo&) zaot~jLc8TANss)ezJ=sN3_6hdo5`U#I*{^*$zek}kaV9;ObYKyaoMqL>vR`3Nl9@1 zESkMR%DY`<)1EM6*yY4BQ zPug=Nhf3){(%aiGsTO+I=(JA9(`PTpT~hurOAh(`^rGK|lYBD1)Le4a5=eiG{^19m zf6CwfXMRHdDbE=`rHA?~>AFcI0TTWxKYJy~X$hpiD$D^`T$BD-a2SZ>JO7j3`cHko z|KYzq+wc$_NPRaVm{d#s$sBng`5pgB5Bf(Q+NHF9zUCkL<^0p1(0}N^@Splk{z>=v zr~lsnu@w+{Uj2vP@?+Wl5c;hAr@zPk;pfx;%wP3C>2LqYQ_4T|ii~XCUI9nJ5c(B! z7=WbPE3@TE+WMdI>9fO=^XtQZ`nxT@_47TmTBn=;89zC@$pq5g4<><_&}a2O{6@|@ zGlArbIQ&l1)BoW&{y+1T^$6!*aoB4S%BoW$N+TTSZL|f{G^F*APE+Sm4UGb7IGr99 zgZJq;P)DjI`Jch>ex49o^qZu0ba5sEhZsxf{FzpGzMt@K`F4|WMgWHeC3OBJ8RQu4 zMbYW;P;iwvgxHa;Pk@8gNmT;**>qCBF%Bxf#epWmOC;TG0FOFvfzN*E^yy9LkF`Ml zeI3cagpP&dP#9C*=N)ts4wo_Gd+Wrb6zqf)F$1LhZ^jZb|D}z1MK)x<09&rw51Dpkv zKV3c*2kx``u>HLTek+*Ewl^veX&kaNqRW>j;vAS*KwUE|TAQX7H%`%2P(uYNqr4+rcpjq>s3LqBG_2q-tYe)1u~QXHfbA+3v1 zdZ*z$haEc~lLzytFdTrB(B=Oio`l1}3_Y`Ja8?V45WCU&cNKBA5eI>peBEsDmlr#p z1Z5tTfy0I5tSjl?1r5yqPXPrsl&AU7CpLcIXF6>J{nil8|4Yw>dOS+=56d6>AkYD; z1@g1=Wd6=#{EZkt!#^L#;fzZaTi^0<^iN0dcRb1yc+?SckPJagHT=mbfz1dL$n6-Z zuMz2rqXP1IpuB%+sQ5k(9-Gl=eD_0HWwwlul<(D*M@>Ti`q263k$?0%K0ZR4@!#%~2in1n;kUyx7ebrbVh*Fh-PFQmMEA$+#b7JWd{ zN35V)&f)w3UH&@c?FL8QX72*MhO+#&#R6w*POU+ry-9xggcAQZv*;-CG#nFI<2OK^H07l{6+dFx(IsUU@XJ`CZNL?I-iVh zF6>_|C%t|(&fa})k!SM!2y=`NhqW30{|Nu`m4uz|2FRx$4%-^h?N>v-Pt0i1cjS51 z-Z;CooBvl|@rrRCF1$rvNPZOPzW@i=ed*`lhT(kwdzOC=D1n|h*v{y?;EdM#vyCgh z|ML+3o&VqWpg+#H$R`=!7)>6fg9Ee7_?zQVpDDh~rQ5q11^wNfmEXtdI2-LCpj_zu zVfcV%#7hA+hEC4`f5wAf2|Y;vi;JLNakzO9ot^=G<~2Yl|GtN`ud2$UZs1VwIhY`l ze!l_y-52fC=`hSUSHB+h$Nb~qx`b{o=O6vL<~e+F=zpgF+UVa7PXAQ#0ZugdlgtO{ zUq>$5qkS-<#Oi4M>MVKT7HTPXVE;qWF|GohD~fZ{s77MRZyjAB}Zg z#p=KB5jaDM!@Wd5lKN&nfWC!(bVr)>M*_m~R^Ut${k+`-@N+dgKPvrE9{LNzmecR; zczkHd(a&C*@JGVf{;OXG{cynEh%SHlHSFsx)}JxQcpBj^$>{v14v=RKe^@`n8N;0| z^F#W#yb1Ml^xIp|&weIf{{0@A?}y+Au6~Pzel-LAz;^QSWDz@yA? z&{>7f*YidF`0#@n9}oAL^}jmS|9ses`UoQWozfX@)lnnhN{7B}b>=@b)63D-ABKhXfFO}feD0GCR+o7Rm zjCU)_lk}ZI@E>qcUP7n$E@-U}+a7}dI}Y^bx0Ii881$Y9dr7Bj20*?G+4=p7fqSiP zsh{-!0?H4W!j?Y+{l6Cango)sFX2(HkcNJA`|7ZlLQcLh^pyha(=0lFGUEH_3`5^s zTOJiZQ21Bh?jHjG!%K*dSX=sAlm+@h{}6s9<5d8C6ara(NyEp81?l6;Pw-^s(LGKQ{rji%!ov1N!2l6i+(s4|+9>XY-XD;ZF}0{`J3iUdNsX z^f{4tGXC@{py!GfeMQpa{9Ehe0_ek{#jO3VO~pJ9gfge+bG9Ss4|~kW@9rt659 z2PZ_{2|X>KZ(N~oEa|l72+YqdR$t=y3zafKK!Hu=<=ep_(1AW@=qm<)xPqUU{Q5S$ zR{DO{Y48vH560hFxgGU$^!pDb9%c2B?a#71kmo$sep=h2d=}du6-;DTe8|O&PZ5I9 zIDoYe0kEI(`1pmH&+YIpo(HtZ2brHwda$4A?0T;16y{rt;~!swJ%GMq_)`IfYua3) zd~b&M_eQlC&zY9>1)<+vtS@w7kC^gD2ExC;%-XjHe9Q+v-1~)?w0{}&J_>p>^yg1Q zKJ*PU-}AxWDKiD~Z{bM&w?^@(5PZzS)bA1ATK}Kr@u;eIto@2iBxllF)?cK(Z;G%_ z)Ap##R{)IOE{303p4|+-Hv^)6E z4*aKrG~qu>*vHCaEIkVwFrLS({kMRBT&mHs{v_>-pr5lfS^Mx{KSlY{{7lw6ir^Pj zSJr>Aip6>e_KWCqqHnV-c~k{HFk<@i5c1*(f1IJ$wgAY_OSb>Z!MHkDuQ2lVW(@q( zvut?>e9){0|BI<_5Y~&8zu5kri)n2??tq?F*rX`owa~MAF60`{x8{5r!M_NtOk?ZWe<{C4aw>^2h0zbPm5iN^ER_-!8MdFOAS=W~I4{z&=c z5m=v%ZLuFD-3I#3rwhyflcFI{64u{2nE<-+1Qf(dKL2sq(1%$65q==glkYBcrt;ZTL zG1|{&{m;k$=wo~kK+UgU{ht#T!LL}46a7p2mr&ALABTZ|)A-lf5?u0Zx7ImZR+v1J&A><8gBCmh^L-@<^KkVrG&X~hKskGQ9GC!X|uN=^8 zK3(1h@*55N1UFUwe4+^Y1pYE3KcD);{^#?lNBoxjxv*CiuvfnH^Q*xB0i#)cSZxaV z#z%V$Ka*eS@q<0`rRzTf`5xiR+V8`Q;s0TNptj`g*A9jMg%4nv{f(~hkLEwxx%&MH^p)m3zWiH5GG1Nq?`8NaMBa(NGBX|Pt3d*4Dc#=14dA!-E%us} zPs08d5A>W!=i5Jn{FJi%I12VYVU&=P(fNmP!PUnxQQ)ucZ25X0$X6BXZ(HP{KG+xX zoeSXy`*rY-z~75dA8G#@{KL>d);|oe<5Bk5ADc$E*CiG7fIR|R%b!oic)9vn;0*na z@(leQVNc9pPr&B#`aKMIRM}!7)g5VK9}YsFh6MBf+Mf}yFSXbof*T;ue~s~EV?1C3 zd3&~gkbjQ9Irj+kABVp6Sg(b=68!atMq@l&eO=HO{CkK`EyaB@erw26CHxW6Uo!r} zPq0T%*!`{Ck(f`cx0vykJ%@fhjQOJFV}LW(FOUa@A3}FP{s*(`zqf0UzfmCn{V-C$ zI~)r&tk)TN?3asg+%Vog^msqRUs;Ov8N@)&FN!)Ce+(;c2J6wk-7Whuq`q`5e0K}| z%+Nd39s1W(_}5<+L;v!0S$!P+kNzL2&%f@n zSzsc#_M%LON2Njk_oK@{xet17W7i*QQs{eUw*J9}n4h(L$`14=^%)$5e>E2JOUq|y z1@yxncKzjw`LF86+Lzi1(6=wy^?{)p{KsYdzx%_!=s$PAI`{}L3>5YT%NomT1&dHcieFNH!M?1nzjqx0v1zt3^}rPv3c_YQV` zj$!_dHwY-W`SS7h*$n=}dRsz2uK@k3ix1Y^?S>wYLQRIKkzo_4gZ&s zzn%DDlOfpO#Wc$EuR}h#`a8?MwZ7kQ2J~IZ`b%e$7smR{`Fa8PU&^?`gYE z<5T%`dI}om`ctEVAkXhufBYNh6^Qi%X^+TzDg67c&Fp@{At)Ym=tpL}qZN46j#_rT zYqJ{j-Gkk4*Ln(lgYo#%?aScb^gbk@o+C}>|1{|BiXS+T()o_CKQ4i+|8Vpb`1L01 z?^S@luFz-bwtPO1WwzFL2is!4uz$<&`?rm)*LypPTkE5-a6C?8KbEm)<>=oH><2Ua z+!yT)>CfuV6c8o>{yxm2y!|2d@XsHy`sk|w^~VVCLwhabdmV}X!k&$y%YTD@4F8WE z?I}%k zOV)pxGP?D8R%ZeFhxvvW%KLu`^TpL~@0BnfydRiL=Qmij)^C?*L*L_hX8x6+-^?){ zCOyHUwLUw9dNe1o`tHMatXDYeSGS(vGw3Hqf7%#h{;sq86~QqWAN(0+J}vQnA{_50 zOzHk@REECAeh)KW&nH74Vt?8naQ0e>-*-QP)g1b*7b`o~UXkoRQB zBjlLys|DsWrE|;sS0dk=T%gacvh6G8KtKJ*@=Jay^5H)-{q+Fj+&{ z_hY2~HLxphK`#kCz8h=s{F)Yjh2#&$`ptC}n|Am|UQPys-|+)O^HC4!U&=%9Ycadt zbekq=Z{q08QhX#T_;a?1=)1!Z4K3=o! z-v)my*vbF#!f*75f=xC{OZJL!pm2?|ZDX@H-*!zub{e^l>))k2(|9-fJy{KE-|tBhRtDU{BG1 z3`^erm;=yfST8gBqHYuP3j9$cI^Uof%$3r4O5|3IHG_IloQ$RGRxru>;5SWmmN z`feQbBM;*x{UiM5ybb*A%<|K@U*KQ#XE@D|W}REV|Bi?JbN!XIH(Kk@X6PfIApT$d z`C|;$TO50T@Cn{uAHe#Smd`(UJ}(OPl&1Fur`Gz?2kX0{GIsrGjQQ2Yei*|KHzYV; zg56?k1| zKN5K&{H2NakvzPQWX9JI{>W|kBVu}d#@OFTs$=z6AMmH6L`W@yT_ew%K;K9>_Sx+O z)^FIqf?FY{Pw-jjU-)}W+6M1mc001|o!p1@8TgsdkMMKaO2{|bXY}K0_@g7>k23UL zYm4(Nuy@nw`qMD4+0c(tIz99UtcRHXS3~f>Vt;E8UEhyv=)X|{`EPfU_Pe;ie+2y) zelNkmxb|Qf{7(h=pUimLf&Rbn{*34+GX7G?6Zd_PFZN4x6$F$AoxdOYmTNzZ@I04) z(>;0AZExXUeXTmMwY_-Pg!K*l5k_7n!Tu|BW$B{@!P&8dFaNDkGM+Qgm+{b-j6F$$ zf6IOUpMmyMIr}S*F~9bhU&eo$kM)U-27c?F?*DS^msw%IjNzZ4-k=}$lbHU%yi)s6 z9|`J|67@U+`U?GH=p6|A7~Wk-<;(L$)Dr0b-aS}-VSf$lNvyy8>3o+RkT2|KbwZkq zryBN*tKWT3;XDlXuhfxG_VW&0!t&wd<_+By;Ic{+Uy{&vG+ zcE9D(a_A4p7sHQnm%+cw*!{WnUijTQ*h6N#X&|g4)|)Hn{^{X-mmk(=Oupt3l=oxT zA0}ncZ}6WOewhII8-x8DBHyIH)gNG=%GvSO^H831KEN95(RkPs(mzuE7T)ivVtv8T z$2AS>^G@t}$+}j-`*NJNlQ(j%OLzZCL#_2L4GN$3M9a{l~Qjvt4n%0{fjR z=nv8VckSVy6tVis;R2qAy_F!JjDJWR-cK8_`{xs3kD_}D|DG4L6}3KZ={f`c2js7o z9`6?D_xQ~$y=P;7x%NXDg2lBLzaXF7^BT)B-wm)Y%zP&vMSrHV<9)dr>w(WL^^^W) zAIE+k*5@L6eD|R5?BRd)p!;(d@2@7|$Nz%p@dZLZaP37$$ZNE=ka~`OlKQgBvEJIn z+V3dX|7ffSnfkJ!FS+_&0RK-3{ua~U16co_R~N{CtC`gI3i1)e**{qGkG{XG0s2L- z^YI)0PzCsn(Lb?Pt@V5PF1(L%#d!?$m+)WLo{;}jZ2J#8wSGS%1!JGb`y8f!=1?Sg zSX_D1^r_tseZuiqS7ZF4obf-{i}ml8yMJXh zoA~!EKg@?d&+fwVzxhA=;d!OdzgVvj`$Xt>RHya+cL3Hq3YJ1@9NqsUtUqpJ{lVBP z%b}1Lj(i5Tg}h+B%H;cjaCPvv82wfM1oCi&rQb`eryH?9$mILMUfzej>_fNbjP>5D zWOn^J0P{Tu^Uc`5FeUhhSkE)_XEy}&yw1K~@OS|J&t&!6;{@o#UwB^vx{~om>Z5(g zJJa9p=nq%lroewa$KiKN>}RHM{8N(}=s%pVW#&8ZJN&Kc7JEbZCBYW_i}_*d-x&sb z&e@;vg+G}F|B1=}ErmQ_{l?U14}0_+_NYalC{rD8g1)ir`LXTJ;6KQVgr=8c2J9tg zJvHqI+M1K-}G%N?d3CEF-U_*0Q_f&om_sBdbPF>3kqS6PO|H3=u)^#$RAzx%mD_}`iw|9I6%_#^O-82Ud%dtCeQ z4r#7^c!%{xf`d^0Th(NKhr!;Ag}w2m$7eVe;F=${~7)>!2ELUgEj=S68@PxU4NZ2nO}DO?1lB!QO^3R z8U9E)$Dg&0fWM0UB?D|S5<(TM)R|L9NWuU3Qo!FrSFj~@o!0QqpE^EIFd z8aV!vGv-qh^QlMYXMp}?;CBhqg#RC5yqY*a2eQlQld0O;p2SSWdZvn%*ZI(IT>qo@ zTJU2Q5d(SBfjlw&`;!HE9m4LXsGuVY@I48m?^M7)I^ZA1zuAiU zj>di+nvwUf*A3`9j=h-=f01inDj=WS_X#y9zks73vJ9Y4@jijkk1pV^My!{Qp?=c; zR|2e$u)l?F$=mA}kM`i-45!nDHm&WAJ)ii0E&NWNpO5~l!rwKe%MXogZEqHqVgBHM zG2?rngZYkS&(|K*2ft#y7ezn6LKpgo<3A>VpKgPnnE9UydmD=Noi$y45csbW`zP4e zllR~L1^mBj?Ecm=5ITDkyZ-pN9`XeJM#e|_ZzV>5U<_n*eGgP15Acu8==1>SbFRHg zjKltoA>NPC`Ia9b@8vB0DzP5;#n~?#o`~`EW&OMPkRQW6?ECs@x%jH?}CRYplZ_%v%+r0w&FC6>QW;)XF7s+~t=z}?smuTz{ zG4+qe1^2wdX!wVwSZ_&DUe4dx&*$2^4u z9{gwnel(%SJE0cxeh>Cc*fRcf_#;ZtZ!$Xnm$>!&EmiOXSD*I@!1;C1kLgd%X4Gff z@;;BybN2(}@4)^rtq+Xxd?@${ZmXQ$ivQ?;m+_E?Dx4Rf^Uq>ElZN#S+(vo%-!70R zj{PLR+spIkQ)lS>W*eM8ux07f{|@@g@gF@SaQ+4Mfzi*x4Up&d?E26=rM14D1V-NN z-SR$wj7J0Z^CJ1CU=Ptvt20 zK8=NZ2>o#0N6=FLA*}DX?^krp;E!?Up9jIv+{NzyXurh!HtbjU)AWc#M^!;jh95`U z;(H3v=Lns@67=A{&sYKZ*@yi|;*XI1NK5!9L*Sn<^5B^ddFJTL@32q0cpu8-&jBOk z#PQ|-lZDV@crx}!^jZ0zj`jjz-^}RtzhOOSjQLzdr*-(P_2=}7;MbRYDu&J?zZ~ zJ)@w{aGn-oCC@(vd&m7A(I3xwwQ1R}BjdHk#NOV*zW=|6^9)r(SbKXO{ov})IUrn7 zI6FUak(fX1-#`t@+cU$&W%l48Lo^UOU2GGvohu6ZRecf|Tx0-b(lb*nb9@x|cc8yCA)icIvlQotah^#9&lCU5^$Pr(6)oineTCrn0>}qbpYJW`w|G{c zZ3TbMguM==+ixF+H0&QkpY!jbU+=Q#4Z3-PUf6FV@=xZ=0P@P!mxG>wURT)l@;e8t zhv08A^fA(fKaBl?LG<&-upXF+^?)9ozUU2l6tec>@B#4u820^d$KhR(J+f4sI?g0Hb@4qUsUwm?)@UOpBS`T@{d2Tnl{Y=r2i6!Fv8E*7G2noFB$Q ze{%P?8?gSV_{92~k=QTgzRxZ*;86=;FU;uYi{MWr{1C{0*MhYFQW5?+{F8ljK85|< z3UmCgRXXj3@irf0{d2bl*i#ODMN!~i%oiiS*KiRQ&zJuXFw%b`_XzU+au>nw@p9DcjeG|WcKc2GlRVjjfoz1RCYN7vZB3sUT zkn&HlAI5{f&B*7t@vsk7?Edv>XY>!}NugHc^zHf!^<8JjGlKX7GvOc7?cc@wAFlqT zps(v9SpR(3EAZ1zRvzM^Z+l~M8U8Ydf4akt-9L;)$11~F{gHnG_6PP4o(shAkgoIr`fS`@+nZD)_Df@AnPp zd>s&?sEPI8ov|Nb2z}dw&i4@FJPX!iF?8AmiqU1Rkb;?#uMaF&U_4mAGx}|9H0+0j z9Z#PzDEE;4o?uEa{JZyTe{?2*pE&Ou&cQz3-@|?n-~h$qTE^BlyBz#m#IASNVV=19 zwhSFj)cCg1qtiJWa zd7vBEe`LlRGrzTdU;M4LzHWE0wZ4714)Vlnp(o*2y+o8(VE2pHX}})?e=+kT3B`H~ z?KA!FI|uy5p`Rhv+uZYfJx0R+gFR-Rf1eKeI>S*_WlOseFTJu=tENfZtR~WVE>Gv zR}%bzD)<8o{ZqEJ*4K^5h{t-0(Wm*)M_q!M@5z)Yo8;E|dj{4&mDVlvBlCGt6YFsf zKU>0I?uzvX)Be(xt@X7Mzaiu6zYBgl_QxUC za(*(fzEPvNP9u#1YBy{~ZN?@v2Lf=9Ek^cL`o^thZj2rwNj{kM9 z9Q?PdW&ewm_j!)>)Kyl$*+L&!Lmw!je)7J1U=!-+=wFx5nD0t@4Jpr zlnndZWd4Z1=mh)6)$b0@t=}JAgnX6aJcvKt-!S;&E8ve4dXWCUynyu|#_LY!SBPPs zaQ+@_FCTvy9Hk8G?~S3;>+^^|%-VakjMnyG4){s)P|J8p{pshx-<;p4&_{dq^nN5+ zf6fN~j0OKN;~xh9A`SF3p!=5&{lnGwUYL(&{65Njnx7K(f@T4g(MK}SWgOie;SYs&&_9b<{qPL-;r4$lzf+)xFYK2H&y(_*QP`h` z{$T3cDMWub{OJSxT?c)~=(k6z_{}b~r$Ilj3;&+0f0rR+66^~@PYXEqs=rzNric0F zo=-Redo|}zi~T12Qxk;w;q2$_at1%bpCbHE#v5M%c?)gPH>7-T_$#Ip+4Bg;Ji%YE z_bzn#{P5QLxxf^aJ+i8G0S~3Vw!t>Or@6Z!7r1Q9xa%)4I?nW3m2X_;J7n$QNh-Y9j2} zOq@3$`J}y@+b}<_?Eaa>8_XZae`)&z`m~x|@6^DMW{0u-fTb4x$C6Nfev{PK41HV) zeay7KV-e_`#ir*y!TvJ(=S%mu$_48Sj=z(Y26?e#&!_NWK~KmJQ@$MZa{R%54^mzR zf9N!;f5QI9+_%8lb1BC405h^t7e{R_7!ig2s`-|yOM?fu*P?0p`SndJ5p zzP~wp@Adkv-*c_K_G1x$L;qc6%D)=}BlY*{hr@r^?6;=~`?M7D3pQ*1J@p5Wk9WH9 zEBo`4?a&t|`{VtWcG#cCA^tG@y5?s={rybDN7s!ss~b@spMMGz<0)8Awd1kuIq+BR z^2=+4A(Hz08HhK&hJ5YQO?$TW1oiJ1+Rz57 z_#5(VHANo4dOcTX*S<{E#~`&G2iX@ zy%P3H>e~-ve9rFj_aD4)G1~k2MsGjh521h7BELcX$@Xr{WBwiS_20i?KSknEIBy8^ znEl`KO^hG%Cp~67E`ffM`uKF@*FSI$@-5KIEbrW}V!p%vS$;fi2mHN1H0tkfvb=k@ zLbQ?JvGV$42=cq&KP)uux#GjnKd?W$%-^3u|634$*!IrH^*7);`NR4yf;@ad_(%KS zjrn?xpMO3L`uZEN9~;d5r*FsjKf(7$w*Ca|{h&Ml*uF<%{O(13V8^$y3-j$vj0gJ1 z>!(0oezVD+Z>J+(`#`@Rf1m#*@DK8M7RH(Pzvp83lZSl%eG2nGf%y-$pxe*)OrE;(e>%=6?Y3!393Qoh_JOnBTU2uelWC@k@XHeGd961ATR$DgR?x@LTBn+gq@I z3i+aQ&Gq;0$9M>TuICom|0VwUZ?_>oD$fg;4}0>X27kPMjB*k$_1Ehh-2d}I-+o^E zPn3TI=jWLEPX2399}hx)e-8OwV6HDX0Dtlo{(Spg0p-8b&(~ay`~G;jKmNalJ^vW& zxgC#>J{kHN`#U&aIX@mmeq=59W9?-(@~=`q{|q-ueLRSX_payr?{}r4|B}1h{o&;2 zhh7)dzX!mmt6$rw-+yO)>!AqVI^?fU{RaAC{C+q7;rRn2d!S$Yef#&i&*MA@as3Ne zFPHlXE*}Z5uU~}roQd|ZziiKIAdhP?zZaSQKH<|C-{B?&7V7?YHo`wZ{C~2!{_6)I zAHQhw-cS1r{ENq8J#@Rd{^C~#_4{po$PWsA{o&UJ_X{`!!TiP+^k;t2=3gJ7u6`rp z)i?S3&C|b!{rRcSuaCbP{?t=^|9tFmh!0>-J^n#IFGBp`xNkHCIO z5P!)1y?Mk-&lK_fAowfo#rw~Pep}|x z&)>cW{(ZL}zjk83=&jurY{%t@1x9KC0 z&(#<&GvB|r2>J@~t8L#iAaBy1{1SpA&x3jh{_5A@uX4P}?@h2L&wRT7e*Agckq?8t zuJn|(kJ*inO!Sm$TDbI!efPS|3{|e*VgLr`Rk@3K(@Q1E}KQzzW|7|!< z(%vk<{Qf!ohiBnB+wz|10uZKN0_dgEud>7&q46Ckh@VuaX`Aj$Z2YU!NL0^C4k1*b^a_?t<&)N@v z3i%K#FE4rw^y^W-JtFES z&naNO+$iGB#huWX?ak^=)4ms>e}6>&>4oO+KR-9P-nS6;;-7>5`?7!92EM?4j+y(% zFrM;!sT;8#(|KOA>VW+xKkf%(q&?#IYrj0~>)-QHv0N|tHsb439tr;$&$EAt$HPB> zew#M)^-G7KUy+}Ay6OMRn;KLG`g)aVPv&Kicf_YKJG%aFp#7gj`xlzOM?kb-z1-fv z@{zbMb@i8}gUq_bRS`!e6xW>33Kkmg^;J9|8T0 z_S^YefIr!Q`DOLv_lwXUh@W6~b$PFS8}e~TitlQ0$M+RS5g-4`m*2bK2z?p-xAzZz z2lM|L|GdP+^MmUrOTUi!DEy%**q48{Hz}lKb$v$=Ps#IC5mp-i!V9 zpEB+HI`oq~@8a{|$JJ;L`OWe87WBhYg#LXDCi36E>8}^=hJN|ov;6(rug83Qd#cgP zmwo@Im`@+|*MA@PV~pQ!-#`1U%2m@l&9WZGTTiLp}_D&hoQi8Rp*_ z|NWhZZHGKU-!3uF{|Wj+>c7`cqrbQM{@+88*E7+-4d(vuyc_f7eE;#q5Jb?u6Ld7uP1-|3(&V){dftYuRit?|9sl>px@;B)->u*qJGX7j?dl~!hV0l zAMe+;Vm^&D>iXE9pL|)Vh4A+{qHNEt*v}*Phd%bz@CTu<=i@r<-x1{NCeYs{_?yo^ z)B%5DAL19I4@Z%|lIJ)5@(0joyAY2U`F}|!xBtH2!`HyxBcEjX0oO*o7V~|Pc^;yoK8sBOPdDW^JPZ7O zpYQ)X5Aorn;3V-n`}14K(+40=_U}9P!5(aBQV*Hy2jHLobQJy)+Qa*|PC_4HJ;?e` zAA~)W@#{|1FVABdc{KbHg-?`m|>^C-?`peVgvaeiY$fosIHtfq!!n+QWS8U9SW`u%2$m^Woh= zef`espg+#`$LBogCwacs86U*>BVT*2>EDkoZBTb$e)B)}=ML2WBh=6N&+%)#IC%cj zP2Yz;g}=c0%j@l51phJrG0pVf+rEqPk?*tf;d%J`4WIY@t2ZN`b=Ul6g>LBjK7ASN zH}ajf|JR~@UqkyaEV{fkABX-yJh#C7ed_xlA3gqh)=OY-r9Qt4{Q5GkFEsamcqis# ztH1yLXWxeYfWK$w-%}C4;M98jkMB<|RIkMPxIBM-HT0D{pZ!k60}A|e?>|KyoQL@0 z_kMlf!DV^A#>bJrxvS0hf8YFO*i+1(JPP1=f9KkuzQ6h|jIYq=kKY7)Ch`mKdL!~9 zZ-M@9bf3RHq@Pb;9z6f*pU_XQ75eGNpTYcwzO(b^*Z+y~uk_c`u7JHsz<;&+{0jIZ zw@kV1r~Wy;7wa|1e_@(w{`?01&>CZ(I6uD$`NvLPv(5!{hi+gzu_Nq{_^i@pqZn$NJy89qSuU z@aNB>JD{(==*#E$6XEat)Av`G;&m;WQ zztF$m`uic)KtG?J^YhR5K#|Gw*jFtAWLPk#LEboj&YcUGCd|L|n^gUC-UG=HD(puh0%pJV>+MSek^_oSTcWVWQ7QGjxs z^mK}3YCL;o27iuZ3Ym@BVkuK_MhmHl3~nCH;rGa2FWlk`n7fycr;5c)Q8|~b8!ROf z>9JJ7DHT%LQn4?c?83F|#>wPBdSG=r`j+l=ZX%y5WRm@>(}V5KCN+_nNKfRWZ|)k; zOl~ZV@m^Id74TQ|eI4msep|9Xjr-gJ^V?!>#0ZSAxJ?6t2}jpGRzR;)nbdIBnVQ^+ z%T79sT}LuKmct(ds|PXo&c^9!C!Z-4b7W{~o3o{jl?)b_C+r>McZR(g z&!i@&IKV@f=t6j-CQM`T)C$uO_h-{a_Ye0u&PU~6EcI$fG(t1+G!BQbRxzW_lNzpZuBX~m~ZgP%LMpQ0wYDcp#UDYpu1 zOr;)sqd91ruV=h>YgLYg%dYl7pq3(r&q#_LZ?}4H@a$E|TyK0`c9Xky91@+*((&ZRCW>ul6QNzmJ*Nvm)U{eSwy03B$IM0p^Y%D z>2Q*{Vp9Ks_H-0sfL-xj4J8>UtkYRvNMY8wQ?4^pK*dH`aSmNj$Zbt-8g{S7PLfTV zXy4qM&}umbMuwxA+>_7c(be>3uW=P`@61f(OWRCaQz3N`8VT51w?VisSb4I0Bm=3- z!Fofd=th^{6C76UHE6Lj?W;DgVmnst!B7|DZm-bU*heC}9ea1o0GL@@E*FOT-A>tee1n0r{4VxPq^2EzdUDDwr(xpn5I7U65Ok!ZPBdi^xR4F}X{vL*RJLy0-c)t|jS3umty>eS&jAGJM zE&E-qnS-TXtB0t8Fe;nqiGn-Qz3>g7H48CUT?;qVr+p%nGSp{XPTkM^R3YPR$rege zDcF5@fa?-%9D!-LyIT_Npo>{}h%iS^32u)L0_gh;4SEF*+5*E*C%REm`J*t0J=t7Q zE6t8RL?EuKWL#|ci_;8BXf?Z>OBtb9S1SCRZ}H8I_6N5?{$r7v-J1Rqu7)(Ze<`4R zMS%&c;iWlGc;>v+o0(2$@}(?XVAp~ST>`#(Kcai^XLSgmorCBg3HBk)2&9-X>= z=Qd{34m`13!Dw!Gr2L}IbYOjf+ui#DKiQcRx^snb@54WvQK62I?daG#mMT$0==qd} zBq2=7Oy}Y9XW%$$@2B1MlEV$xjSO6ix?eOiaIa`*@OQVNJta8*lQ5;UZv&W2ThJo- zjEF+ub{3OlmiLeKqGM(E1QdM4WyVegW8xTEX-$jz+A$sIab~|*+taJZJ zb`)G{_w-mgH;JIv>vn7uZW~{;qqYgU$Q6=$Se_qGBDDm&-=1(To}@C*>iiO;Zzzh% zJ~Gsk$SpeRA6SjJe_+Tsd+d7zvs@8oUzzRD#v(k*l7&=S70Q{&lJy)WQ&nh~+}ROR zPcNM)NP{!!%0onJ+nl5~ZL2iJ8?i)(b(I{r{2LKiTg64E0<&fS84|Zi^>73tZl=c! zW(6O1lN0V}nJ_0bTCtPL9cG=*LCD+dEFUvru9;l*$ya`jnOi+hf2ly zS%;YpYlQ40B4uyJJEhddfgw9~sIbG#%UUL6m2y31M9cs)Uon1mzE+xS;k&EMP4{+p zbX`{w50q=2pz|Je3&Km!-FK~Iz%z~%GpJ@JS2^~usf!)V%?`&^AA==Wk@0cOmSPgp z4M!HzZIXbA#e7a%ysgMFS>`eC$LVdH-pYdO&4HSvr7HiT(!6foloO@TSUByuT2o1< z)LK52-vwD6$xS$^bUFi{*X0t?omdMj$^&K z=;ZRAG7ij`N5k4)ajU~^hvN7+`T7TAiwx8qag@?%UxaQHR+WP8^fNqufLyRAn z8wP1C^yo_Ooxcr6jJWNc5z(ryjaUcFP7JsPkdaWgScjR+1=eDa(=KH4$o1V{6Omyi-kW_%X z6?h`ihT=uU2kDOr`qW?s!77sWE2k#m&}to|mpGuYub9dfunHr7D`2%PRSf=?8qO6; zYNL}cUOA8{VL=Eqv^3HdrS`Qcc642$=YsLvaB6%IYoD2swYib0aho2VOlg-s>JG!C zk(A8~Al(h^sP&;UG?B{NWz_yH{ez{&_yH=U-_3Qv(vHL4P^VDml{)gNY@rWh3|owK zn88k`kIJ6ckn>v&dT==|tQl^@Rd1I2lk<309rDqSSG8V`^Ez`u)f88C4MWVOuDVCE zu5xP}rn<_U^D)ThZ8$$GW9!HE@LXr5!~}K)$Y^*{FU>A9LDj5OVG;-H2A4YCcqa#| zRWWA*UY#YgU3E=do9#-Y8GB(B#?E#tJl^+7-lG*TjlwX%U?ke{Q>oCtQCkgd+3{yu z?@>wgY(zfQZo2WeQXFq1;pPJe29s4ru`V5C3+>W{&XrteuAsM6P3Y=sxZ&-OKF;1$FVI$PORenfxv|3vgrtKPRFUP`uG%w!-oV8g z^4YFBY!Z%t3%Z;&6S-nle{;4w?vFX5Ne1jXs6g;E(l@xuNp>PnI%0RToiJ{=8v1w} z=x){~f>>6dHt}-hLKyN?*<|wSF zVOq_sL$f?*MUJDo4y(Uz?8Aj6t*X0cn-?9<>I^nSRx{^rPOyJVGCfX59+81r zdz~d?5MsyNMsc-{bzQnNdLV;l0rSgCuDS#1?b(>Eam2>?)VQ14$F$btNKb7AUZqG) zrZauVrZ*Rt=O>e!^l~hs0CzPO71R~ed3HaLY&Oa0TB4e|xP;m;eLEPk^q7#vB)F>! zmW;L#^m5G;#Z*fMR4=!_pv&%}SvM%PCmOOcHbA$I8%DS&QUr;F-J`;-hY0!fbuJr2 zzGH&@4rkdEHtEJ(wTnZT=au%z_*%|eT(JDMC5Uwgdr1#DmSR@hZBDZzGX8i<4*<1v z2j_=3&5|~&5Lj5k0~NOad)=u%8`|7y*2%;RroZ5wohQ}HkTZ2wiqMPhE6jkHxKB?S zzEm)m3reoMu5gZff&mFI?53y|NmXZsWm;_+6@U64uN)5Q;oCwcV)UFsEc~^14QEHN zjHz>xuqko_N*(h#;ZDXbJ)gN*B#G73m11`acCIW#McCqC$Ey0M284u#!u+6Mf3C;s zhU#V8R@BC^PG?PK6kBR4I#BU3&}=uyV;}_Q|4N&}uI~TgreRabWZD&m6BrBl_R(W! zt@7wwDN02rqymEH8If{P3*HaE2+xT7Z;2du!u=E zCl%H(xsOY|wawhR#xmSBe_GDcv>3?cs#@5(T8z1_Utq->tW?#7t)k<(LgmV!tczQ**9#VIK<}WQ#TnD%tSRJ5c;&8g6EGID(%&9u zptkB#%y`I^s&K?omt2@NF8L<0iT~%Op3qA?%k-nhjme2>P_(@{fvt%!Nhhi`aaQX@wI|+) zowydo*||`Qs@k8~Rzwk|(CoT6VND5H%M0CuK#pS|-|egkE+`&PbF_9FGO}gfS7@4q zy`Q>f1y_HPSUmA|33f5Jhqb_Ec3B9EV52yajY&TGBo&6fF1JgJtGhB7KdyC^%X4j_ z1}z-sgp%Af)WO}DdjE_!B4#OW9B=6Hy{6zf4On_9Kd;PNp_&zsIgyycK}G(Gw;f1# z31$XJmBGs0wkQ8qVJE6V&b*fkRF*(e3?+ zmwGcBbA@f*?8GB&-nwY}950MkPN%#6d->TSUPj!TanUP6bzIh|f{q$ia=bEYN%0}u z2BF8xx^_`@R;Fxl4Q6KRv}l-Ir>&ro>QaR@ybBdLEhBC`X1h{-3=_}O7!Ic$d_w?E z*|p;1)hsV9J27FGnvPf1c70d$IzrH}E-qGDBmTnUuF%*;bo&ElRQ2~S{nTmMiZ?|E zHWbCV$5d39p>>I5P1CQg665EVZ!ggeyKWxG;JWIpW8&0Ru9y|3y<+=Gb)gI|u%p|d z)p5MiiZz>%<50a|Vd!d5F|OJ@0juLZ+y)}HtMRzD%4xRQ?s`P{v6=!JI3KNYlWLeS zzO!NL^WL-f-@c#Cp6hKNShLfoo^nG@52qTAuvlRoO1sbAzVTnl$)5c|_cMR9rKe;z z5sMh!`J)giy`nK&^>jNI+t_TbU0>}CS=X0GxW@Q#=wiqdi_{u5%u|1{b#6Sdki1vm z$!t%#z&Rn6c74x!#h!`_t2W=08eHq(AK19kanH$$UEG-M)`iz*eZQ(|JXgIbu5~L@ zMMe`vyzQSHHu2tt7z}-8Y=s$8*L1F#{q>a^%Uj=*LEwsi;B9v`-quz1F)%K!9+zFd zsq%a#k1fkATPhpG>NDfm+>;aMB`i<$anBip)D#Yc=dq*I%d=^@YjD@B4-q~I>%@&q z;83X5ob6>!R9O2RlTTZwQ>wc+m8Wc+Oo)l<+eUZ%{XLemye#bP3$D1{JljH6Pp9Un zZtozXSsT!>7gJqAW-t->asdyqsaGw`sH*y9en!;<1bR6I+Pt?vMu8)(6g-8v&%p`v)&{plK+fGx8yI;3RxV!D4T+)X6^YxmwcL?j+N^LHM?u|G=BMbpY!d z__*#=^Z`vgYFzVU%SurqE3W}Ucl%1`1bJAI{vMBKUmE-@M>Q2yeVz;9ufw^)7`bm; zR9DM&HKAtx!*!%Gmzavs43K_Nu#!2it66o7Og}$Tu-47w1rESGL97~F;{=Y~#Doqd zb>l=*%nWZen6hDBoUIyt)KG5NwTvt)3}cL!IS) z((_U8X3*=!{(-F3=HpCiW0qH*@p?kEC%72xnnW&LnQy99X=x3E5oWh;MwAsUZ-!pe zw(p~tEBPvIn=4Hwq+vE&aBM0bEvb8eYG7Wu+|=It8j26k4cB^wRDpZ=aQU|A**vDp z&mGKWsc<;8HxPA{tG#C4s^?^#g%jOusv@dJdo60F*wA2gb)gBoqAA`wpLs|j3~CKR zfPsVWenJi>^GDE2#n$@%UiEQ}eV^9L!p!FTv|gddi*4cjxIh2v9!pQLB;~u1UXRL# zDR{qq7t*^wZUnr?YKbu8yH~E3Jz?`|pnq3w|BQEYEzNO-Byb!?L_2CZG(vu{$~_nE z_?!=5r2M#_4-mn~ut(^x6T18R=4t|k>-E>L+N49>U<4D>1Qs`vl)k2HB?lIXW0IqOK-;48{2vGAL-(@B0jIX z+0}3Mvg@2*JjpA88^XKo+w~!#{3N_vK=^v1y_CZztogNhexG|_wK;IG?7jr<%TAW; zZDtQh`E8ji|TD#Bdx~< z_ZXUwnmX-$-TK-V^Nv4TW3T8E##x8k-Lh+=sd0RcSPzA~*25C&@bxyd#J#BdR(=tZ*yZ-KJv)NovjV{Ei$Sa|5Gf13d&mRmf-hZ zb4P!zI_vL-w&R4`5Kb9^G3ENvaH3652m3iI4yXQ{jQH6d4|!ws<9_P{_ZkHbE_dpx z@V-pvR(x-GGHG{S*`LwU{?$eE`E!5DfqmYg<9-qDDNpE`f1}$_Z>svkCZ6)nOkyv+ z-`yv@Ki%n%&v*9sua4oHcdu@p*J$r&e~A2_yl<-dKXGvQ`71U+ju2jm%i&WtT0-1$ zioM#O_CAf{cgQ@ig(&uU_iE(xJ*ZwVNmlM(LcLIk?w17R9ldyXGKKHcZcU~&k7F*n z&!@ctye|TG7e;XCAxs#76)knu8H7jg>Wr(tw|}ijqZj z;WJB6YxaI4x|naiIC~v{=!AP|e$uwZ_8grX#A%W-UB~M-`i9)VfV=}ceR3{4>1|<3SJ6S)#Fw*h%aiT zCIS_jJ}pKpIF%X7;g0O&M$Q=rpU=c=L!7p5b3?ai0~vW`L>2QWr8FA*to94sXM0V> zFPh5Xlg_4kDjs~KBtKlBLpNB;kH^0vIXH~%d;E?b98*l-E(dnsxTXBe7y7UTpZQ`_ zkiP7NF~c{mG40q*{6B^xzG#R<%yiSO8pkKG%HG?=t2?E{V!s+)!4STVh41B>FTdr+ z@sYumxX+uVc-x08hG#(y!mnDU@tx5gXC=to@Fwn0v=V?yBiitpBz_a#tjw=+0_PfX_fIQV*q**B|j>KyIGV24#Ubw27@WPV75 zmchzumpj*e`7u8P1jqg+CC2<_)t@_8g`SAL(2kE1rH02dFJ8KK&GOttK2^#NXUDzI zPnQ+cxs`ecGk4vf(|HMn&~L2NG>JBSqkBjA?$x?j_wf$vg~RZRpF2~$z@6=jH6JlG zCUC&jvdn0%kcnn$L<=fTf{6PUx68_wj>5p{x-Oa=#JH}>>d}gtc!4JCFT>k5y073w z)Rl0@U}>R{+GcOATC{oS(rjt0ZxXJ1$>UN)4R}LO-{Q`>T4sa$=?`}{L=@OFg|CMD zMMm6_=*Sk=PK}o^Qo3U?avB(}L_!a`=}(z}bZ3ihQDs+pvPJh3TviK~eZ44X&!XDf zgRfqjxwSIqGP|tJ_++T}6(*QC_uK3EtSgLV_DW+b1LD}`7Yc*uB)Uuu{rrR`r?FO9 z!ABs$=B^5lMD?J3GFO<;-*Hb~){$rUCDbx|A)hOCgPnHRIoCk#+ z$vDJgAl8fOrf)Xf$72$(6l8p;*q$Y75N_R)y1Y^yNXOS1DUPmO!POh6Lpq>ps)(HD z#`#G~8;`*owz*B~yUCwi*A4l;sba>_nKiiPUN!_8a7cT>Ce)>7fHz_O(wRs7j13dK zs?cPurM-LI1X-^$klBdOCuBT-6>&b(dG4~8UoV1@VhZ7hc8&e^Aj8O?cxs%sAtWkfs=TAQ|uGNOhJTx@(TD|ODoqhG>AlFrd4K8d0*C3Ca zNUI0!Z|N<=#(#%!xRWJra&;C)Fez%i8(-HPH(q{VY9Zc@nOe!tVt%TWw%J)R#?_v| z;jF9EI;yPNi5>*CZca%??tZ4pl?6LGKF9r7JIx&xCWBmM#N099y&=uhJvlYuptD*W zdzo!;yXc*mA1SAN>!?gmd8)^6Yog{7(UTZ0VQdYw;0)Wk7~SLgAB>xq#z>F5lMhl` zYoEKAV9ofMS1~K9N#0^VUr_8y;Up`3w#oRir83XC%egq6%Wq@Crptcg#2y6251k+Z zlf+mRaR_b~jWIhiScI1Kykn%pvKuG;zpb~drwT$#<5N>wXH;-?6u#n)^(uUt!^v(z{87Td<0r=Fyhs>V|cxRhIw;B^O0Opgjm!!wih zRIS~Ba@A3(3DtUIPOF0Q+GMm>ZSA*KllITI@YQN78=-0s_!F;=THvROuY=U_pf?|^ z@&%WSxf;yDUJq&;X4eZnLsm_g7MHRnLp7MgvdmP`u7iZi^g3&+H$PyA5iz7wQ#jn* z$xNp+d46cw_4;z1&PB!1Y0o5z-d31>Jx>2*YKymS6yRZn$KWd>8{w_WRFPcsg+M7R zVIwE<$FOPb)~3x+-`B8o8E}GUSWPnMGS9FS<6vWSuqYrs|h30>s*X^pDkr|&IdasDw%1#{#n#^8p|O`F8a_`BYYk}@a*b8&l!PK^FXpVBDrKfIyurB8|DiSx%f@-78uO~d9$)QOP#I+!zrwwq z`mJ#edbYmC`?;F5G1;GnOK6wh>Uc8mK3Ug%?acUMQmbTj=ck5?+k7os8@GCLTQY@F z?3u9JeQJBGYnlO%3|?w`4x&6Y;eFHApU~;?OsWv@kIGd34D}_ZuhkVZETIcqGb%*{ zGb|QzGCBbdm0MAytqbj|n0Xk33Zk0b@9It+0T@LJt>E;R-1BNN-6Eq1Pd#Dvw!Ir) zKc6gOw;Xm2LbC>}4nDSFK8}f^+KmRBx$3J@TRnOLpJu{lNl(4G`Y!lmZL=7stLc50 zp`yY+&v0VE*qSx{85UqPu)8*nE^`+n#)-;zh9%Ij^w`ysvL4?D3jAtP93kmVu-_xt zqld*yC!fRqCr=vW(}{N6ruQ;WVhKL_7LGBuG<$cjsWTK|w^uWK*dKtI7T}N73`>Y} zEOa7w=9(t1*a?o;>=!#dH^pw7n_@@irr6Bf6x+X=+Ejl6%LI8js05f%H|-vkYIj$; z_!Rar)w%3~k6UO*q0fR0bE>7>I0C5AkM62HP$~4N_G~Xw0_n|q2XkHN$KK*tZY%cn zZS#^*bu_ql3Oj1tV96Rezqb|Q)6OX!VAb^u0xWDZL4ai!hw5l2c3NgO=SD}9<1()3 zK^ii%8Q(ZYnAPbVOYT>fpU)K$33QAC`+A+V!#cfO3WRW#>ZmYWSn?}zwJxgb6&~x% zVs(zY4ZUS0D>^kXsciaIsA|TuZ-x`7Izu}uGPFWhX2we_dK*PiE%~H*VD>7t%N>XA zE&+2z>^_yhi!H9yf!^i=%h=!xH$yz()NFk4-xuOR8PZANv-oL-Cfht+r(U&B`4h34 zek*^X0uSAr-4Jgbd`BleJ)IiPZb`H!9B0c!)=7_Jg-^e?hd1*^b9#s|237KgESB3i z#ETF^gR!i%SHi3`ze`r4>HsV8w|x6acPEyWcB>5Tx_~c;&5)5MxY0$(>EQ=GW+veW z8!rSWlDFzI(Fw;A3r1;jPc$8e5r-#eC#$ z1jd5Pmae#H@^~ghf|~4-;@)%faho_|-Z@LXG?PB3^diGxKlsG?D#DZ|$?MGnn$+?S4WF1#S-Q zdiUB;MHSjIs130-E>+6u@14Xix_Je6nMF76huS8AS7B(W7r)0WEc@|nVsT+=vXq_3 zI2pW8SOD|j6Y=X3di5oE(PdZY39FbeV}o~#g_h6-(>+e|;1&BOHl~Hk88`uWZv^l8 zFpNRlklA1(+#S|rkAF421s6>kA>!fAw1cVbUN@KfQ>C$`g^g3(xNUo(FPZm8Ca18m zi`9uAyC$-ed`qP4=hSq>&)qmpSHD!^-Ja;suLO8!ZJK)RYdYb}em&tUc68mogiAFe ztS`1FR%Av~*t=h`=9s(u2E^PDXh+;VH8dyDF_GGw@!xf^tgh6B1YQHcQcyAQn4Tb& zo@#F!naYo6`O!OfUb!!6=)^8kR>%%|+=}T>qQ}%5c;0_3%qvV>t-UI>s-}D7I4*8m zF*PyazG31`r#^4}n3C*Qn&{S@>@(_U8OF?B=S#XnctM&w!rGmoiBujbw^X)N?344p zXE`hgg)oU%a=qh|@CKbcYZ_J(SIyTQlb-Uk>PdG$x+Q$GAif>;g)q?w)Kuyi&lK_I zAr3qXGyT#rcJq(tLJq!;^N3hoOf#_Y{`i_DTm zY>Qy~k8g|YXIo-9f?rc?5Y zDSUwzruBF?(0%jEZD1U8JGj+EG%oJG#hWwRjD?+h8L^8)x-qUr_T-m;T4 z$?KMN+hS*$EHn0|MB9Y-N~!F3kG2u|7+-5BtdY=-NkrdpoOE|=6R;wvUrdXzEIvmP zivtEQ*sro{$F)n5wL4LRU8y^sYH`OYSg0N%qk6==N+isiiG9fP1ct<&z=7)#9&+G% zq7C7)ebdp1Oqql43a$<>=x+qQf6wg-$tqeFD-pPcy4FD#B)V4^w+`D@`*U#cw)x{# zUZSTz#CZ5}CVi*SvmM2)sXXE;bCievvkz@ZZoys_H%|c9gf}5>)xU|?ZbN0cd~vTw z>WFdu9x!e|?2?|ybA%%AD|^4!tq7w7E!C^1{t(aWVgcs3+!*gJ;X77vxUT+leL&F?t5fs^t3BitO(e7ougZ-hP)WLK#r-~}C`EoB)VP`As;f%o z+Wqtox4;XyrCEdojm55_Ha8G&nH)>59@q5huu13}O50)}loPeIV zp+$L%6P;O{Y%qzPxHwT|97h#J=y-pWW;?3y%uM72Jkh@V75y*)J#qOpo|)oU=;8#>Af1g*`3U#jIBxiwxfIl9=mrmIs-zDbWX%!M}(+ z2n`QJpOBVl(@$hJ7LemCGf^1&*z?n9)+TU7abV%j1j$U$=@o~v2qctgpqNCT#3bjm ze28-({wXKhmKdq>4h54*$Gb0O zwTI_Js27QLxv+~!+P}Z-lAoa{yCgMr*+r{F^ssfXJ~v{AI@L;Bwty#IdjDJp#LB4a zfdos}ITz+xFwVN=zDVP&WS6~x9_k0U;#Kzp`h+XIXpYyM&>{D%P`^j`6zt{C42}W3&^*lI`o*|fyIqX^* z%_q^rSRtcS${AIuX%!2x4XZFh6`!}(zSc(9#*~Uxy4eUz2k>_^sKe5^i8N37Sy^W#*U&H!#Nv5^ZKB1ALfWp zoz8NzZNOcpn8V)qC+*DLYzQg#IT|!i6GQbc9?wi?(>X*<`7vxq8`qOQRnXs;uCw}D zw?l>XRg$089mcw4k|)Qz>2&Zh!`&);LE?lo!*wC+th!ba^lbyOKIozRe%Deb>3-(k zc(HTTgfJ5VpSho-I&oghHu!=ks>?7Oxt!VbR`;x`m9+>zbfWhJv9-%tGm$IKeJ2Nw zLoJDfRsl{SHM!BtoKslrUb{I|4xWT2@trBHn#>6y_3NWrXHH}W(tNFM?kof|B!}b03C^Hh4XADFaP`e4YlhpB$qr}r=p@5(cUffaI1tvv-O!Tw zw54|}#T+SP^bZ>;hXUp2Eu9iE#$I z5Jin6_&h>kNrvtO;AKSaT&|tq=&eii3aW#6Df(`*L1*3Y?G*c=+?txv;Vhfl zR#)=h--%LF1u#zHP-6Q?m2A5hoR~Ys(o%4EV(#Yv=@lsqkh@LMpJ-Jci5#LT&y){R zl?UW7!O^O5ocz6w^v-I0s3)Dur_$bM&uV@SVyHhX(2s%SZWHq*zgnw}67ed7Vt4#t zGhf7+j>s_KMLW@uSnW`y8mxY?PsYc!qZlcbR?eaazTzXX!(QoNT2zTPlr*$q#1 z)3j6?N?e01pSN;}3n&FPLXV@*JF(u*9LvYBCmjQ; zxsM-8+F9Y|X=a!fDi=@dw*_U?n$s=)L$sop@G;-%i1nqtv*E-6*)JQj8 z`lU0!!4E1bq(i)$M64TGrH#@;)3nydI-T|78M|FRu01_oUM!RotK1?xM-Xu$oHCh+ zxH>}Vw>F!8D`!nige#eIY`0+SO?U-&F?!Rl5s0!tI_7pVi5Z!ACRKSb#HN_Lld+77 zdBAIzU=>8O%YDfxzV{(!wQFX<93(;?(P0k7ne6M2seTg%#Wn$J%@9p|c@RgZ581R{ zL@FevC|iukZ`7RZ2_IjcXBYHls>M;D6}FFJ}@*_eM0yl<6m@ z(13{Bs??Gnw{QP>u82+~VCTU|Zo)~W(>UZQkVuFrkikE`_kgI{mqR2E22wZ@D^7^` z48Ponq45(2v5GvVVvq4~qEVVQ60!3zQeSPNc7lL1HBjp;j4a3&BCpZ`Sc zyo)TtV>M@;%~Q_d@)+8Qp~jmm=H!dxmd9A0=!3JFWbG+L$F2^84L>f6fnjrY+1fl+H3fSbPSmq=^2xku>;%F|_%u((F zUvP@vzcnX)^~|H&NiB{xS%6N~mPHP^f5$lK7C0v-?k~n_p8*ZxJPum^g<5&<#4-V9%9QF zzUh|1wQyS|`5qG`V#twljQ;jsKf9?TE!`0J>!Xg1n4$~hi0W2&p%R-0|G82{uG<&k zomJ^Ad=9Zx96Rf(l;ZlPcIB+b;K%NQVg1P@67v`;d=o`)NQFt`AjJlidWdj8-5^@|t~N%%zVtam=f2iOew)=^-d+}5 z1ug50Jj8nYtu3Ozo}^EpW$1I9#vLoI+N4=w!o)uAF-y>$w+*NeZ@K!&ZmyeiPZQN~ zM{1lKU#X#5Gunp6>SoV5^*`1b_KhkkCE>GGH!;WLcvbOqp#80FjB!j{AIi@*L*=1C zk;_VPd21+2>k_)^yqliffcx=x6xO5P&Gp<3CzppX#WaWBn{YX*bZ;H%jbubJkg{MR z-ELKjdqC{8)`l~75F+cN?Jx$(Z9Q^R^x0iEAi_k8BRS(nD6S%DGpo-o8pbjcf*)rf zr1ff2VL@hA;j9=CxCJJdpwk^{dOnz1mB`~^enBFEm7Cjm1RZt^X zl`ivUkxbTiyMh>MeB|x%ldt;pz?bLr?2P%i2os$4mhgu}^fmL1v`UZL&#Q$#3*$bH z@ryZkyXq%J^iL!Pc@1-<6ftn-ENhgMdfKZecjz= zhMxN8N_jt(oqVlN9mGVU#~XYag@(@qM4A5ig=NR|h=C8B%7mxnF;?zDRoWiccu>_G zWlqs9^l^@ljj#tILH6wiCcUyaYg?54^SNfWMcI3Pjz&409mlAf4MgSUshY=$z)ida zGDi(|rv=j{c9qH6OumW(y;W1VS*r=NwRv@wk4mKO7vm6o87A^>>!YAHBkNJ#L5yn_ zTUE^ctc>|8R%Si!;N(B1Wp!`<*u~A5X2@lA@0nWL5jl!-iPbC7wj%ZkyTs}}VLY%o z**33Ln!i43XD)WQpNN?|!~8+r{-!sywaI3!sUR_bBc$^9xYDL;Tt7^g@bQekbQ0(L zCX4=e-g;JMQl%-JC}-VnZN|M{7h}_!@QJ+NA)UU#_I}0pQ*hjAy0q3ie?XVkHIPZ+ z%zs-08iS8rr8grrB76pddDKI9{9YCSezZf5e;buLN%#7|e$5!na9r64!Wk5@QVQm`IPM3U&i> znypJ?`JZkpz6P32JNVpJ0UuJeTjjeEI1DpzUN@gMMST>f@E9#CF&rb8q{gSr!4;B!iSFX&Y~FmAXDGKhGg;(0d~Hsr{-cbW zJvbUu&kTBKMR}+6Bu&MM_ViSN=LW=8-o}<)G`tCKgjKAym-j6#6jIn)UZHV`c6^2o z@_|Exhw&YZT5cV5&k(M3tFGJ~jY_xSOq}UFI^y2RR`zOAe^^I87&TCB#kvHRG=4lwDR6a9E?XSOqD8whW2w(SGyCPMFxayhr8g*&#tXfx7(SW+f zsha%}@A=mJOyG+X_2|>ZB~N|J&bN0!7V+U}d{{U)xdtW)69Xr7Oikc;5}c)e{u~SA=Cfe z+z3|`eN-RA6KIp3%6;5nM7sv}*SlVfAx>)q?~2eBQEODu^A3@u9kB}2 zzQ%hngUv*&RF+Pr*a_=tLx^8hTZU$YwIP18N^UTu5Zz09T4r%*a(;B$ekHOtE!OK? zFqto8@VRcQF)MPhT#E$RRQCE5_nT{`xXTF1SdCG;&k))IT>FFJH^AZ~Ez}99ftaQ3 zxB?i;n?z>R;x>fVU0uxL+Xh!=M!X%1W~j;)M&-A>(7^CcgV>U6yTbc0%QmByHv(&& z*pI4(9W|D(V3t2Y>n;~D>B!XPNc+xJ&5s1%x9K$ghre(FKLVL$zHVd1vc|TAd{o#3 z*R}DAj-3X^zwzJFskKJ;dvDtQgz7@$*$w-CA$4Hrj%ux;#^8%)HP}+03$85;)fAL$ ztD&(C(Y{Vz-ni&Tj@^Anrz#n2G{o$+_BX@@v=W|oU4}A!Rq={HnaZDww*b+DfQqc% z_X;Z)DOgMQH9J)8y-nn+!04i5HD>hfVLchVt7h#Od~C)#F<4CfnlSi$4f-$mK)luq z-dCpU{1*WtxESO}V8@~AJj* zneNU%MiYog0VX^8B?IcoXt$EFrww?bbal*QUe*H7Yo!yZT&q27Us#RFm>4?|Q1aD^ zOtdjW?~E1@@~~&Fot#nY@byRYNz`&1P^}s6uo^$ZeNmy_(d7~{rz`iEW0BR{W8R^+ zbIqtUyp=6{Igaa$2F6%NG$Hgp#Vj?dc6SMjKZeyNSe_B5s#x8S$54&+Vq<=pUlUTd zHg{AxQZMgQOfdncC@!k5<=L8R)XKxUVYNOr(dRi=^)=FSvEW+-yAkP8=-C+UGLarP1_eNc{VLxu;d6=r_x|RrOBP& zaiZ$BH?a2`VO{zBjeFjP37%g)quvzwzuRt1 z+WJgpxlEfSlS;+J$-|5at2NslEWBclyZqL&<44M;MDQW2M*=QG*kT1A3D~K!OJ&wc zYQx~&v!w$kCfoo(Y7g!GVsAlkyHa=yaQrUFIF%>);Vm}>Hz1Z9ZMo*)Jrp;&;%c^> z5`MjFF+$vmdp>S~AntxqpG~NQlIH%#YRs}wD}tPkt2=mCM2-4bNxcGEQ_dgT1?>uG zaKV#vDnbdIBnR2hB^LZyfdgZx{!)^sj2ok>rXGWan)opQKE)zRCz%n$mz^iFy_lbW2$2TJPC z;cwaR!PJ(F6VWsMds(-*%1sR<57ke~R?LDqU8QyRkpzE>|cqvgjl96U3^D>D2urq*THaa$^2^B#)F zc3(Y5(wr!T%tpMayQQigxvw_zOEXNAk79jut>D-c0V8^n$2%?kgWbf{T90XW~_$p#k~Jk8)j zgJ&4L;ScU}>V6kbGT4FZjq6)g5AkhH>RjTPO=<}-*`QVszu%-*5#QRP@&?xso0QsX z@D_uI?ce|HUO!-P)z93&hYW5oIBsy4!5aoUzi(Ej0C({3l?`eq#{CrFb^QB?Qag#yYfyU(9x`|X@%JripTQ#rcN2SB z)Q!ZSH>;b8OB>XF;*T2Ct;Ca*x}EI;u3)?PH-B$#Qb$=o@F4&Glu`@%H}DSreRZq4 zhxm&Y^#E}}qdH2ws7XCY{8OV+Kjrmi)l9skMa?6AqeY!W9B5SYiQ8J#X~cC+Y9a9@ z&FTzdbF*4Rd{l!vi}=(A)ka*{pgM?&2Gv7c+@Q`SKDt3IAwCxKj`-U~)lb~hphgT1 z5ue_u))Rl&pvH)IHmY&rRgEf7{AGi>%HZwf2mUVc?=Lp1X@fh64{K027+gX=RZ{U9Zy|G2zN*rxf2Z-~V)O=nC-p;>IZ&e40PijyL z_&e|p{(Vh@I*oq=59#~B7yf;Ele&|CuWC?-iSruNJ;Yx&sk3+;c!YnyuvNA3Z{U6W z`{E|m!M}kI@bAYpsS?Krc$9w+H>(GUk8W1;c;5$`)k(y`R&_G5xmBG({6M2xM4W0+ z8;HAG)QG`@T5ej@IR8GgRqbT?z&!uHx>1#g&udgy5zlE=+llXKQP&W=TGS3=Ym2&G z|J|r|5nEc+4a6Ip)o$X!CUq0>?TzYIg9i=nB|ZfH5I>{Te&UxJ)$PQVR&|KDw?*AU z{A`OlLOi=k-A6pwsO~5J72`vEN`pE|JO|@KTnss4fBGOt#9t~kkNC|7brSI`j1%#@ z&FUtD3y8NjsndvCn$#J@rA?~e;N=GQ8C*pCtx{(ZcPZ6Dd|QLsL3s!E@b6B@BmV}T z%fEjGJx|OlwTAd4%wyu)z!zc(`kr_*Sp4Hp{Iz48`S|~u0`EJ{FhRPh+oCLXM2Em^6!^He-ig9br11*7-!-gE$Tkvl@00v zViWp9JqJ9>zcbKR#MUNtGJn6MRh>qBLbKY(@_`Ha_g^tT_&4wj{{4{_wTSp2^bzqx z&_BfgYEcI`A2*=A#3I^D{1Mto{6&+xhd7M(5pQf%_Yohh)cwTvM)d&kF-jdJu0i{V z8(WoP{h0>UOuVd7%_E)+yH12*pHFpr{t};})Dq&SVHb%1q0}nkQybM9;=e1^PaJ7gL&UXBYCZ93N?lI;r&1e; z7r>qp2cd6?&xSoEo~cxxcpLO9@j0-Q#EE8g74dAPwiD06d?DVg)OEycgW5%WWsBNP z#F*bmd_tqzL%h6E-9-F;v)W7C3A;ypZmZf){ARPdmG}as4iMh}dq+G^se{C2uy4dy zG^sPd2F@;$vIYxx{^tC*u1s-o$4&t5w8*VZ4c$r~Slhn$!^SA=okEs%CXL@xL0? z1|rPD2(bhH3-J`#H{wTN--wsDs1i{%sA*yg{176h*LLEc;g1l9;D-?3*Ql-|ei`w;I$DVlVhZ zd`649pO}Pv5wC>((bu78iBlK=_$sH~1HX>=+a@)SI1l~`@!^m!;uj!aMAf7g5EnpS z5Fcn%3yEtR)EUH!Th$`stD#qk|7cNd#K$zM4q_30Gx0f)H{!1v)e_g>hxj7M8}Sj4H{t;FG4cOF-iZIvsHTbE zg@&`ph4YC{Bx7qM|>>wIPn1d7UIqDTZlJ7?-Sn-{u2*2sDs1-_$kDD zz<=T`E$U9#Mi;@nhgW@j9hS#63-Fnz#k>Pb`4{#EvF)4RO9wJBV*=R@V{lMm$1< zKXpCvui!uN4~^;u;z{sli7#zXHxj?rr1lUIE8axxgda;BXjL~8PXhmmuW3-X5FZP_ ziTK}2-AY^wzm+)As%|Gf2mB{~3j8Pj4gM+dzZ%q?#Fs-q6G!2f5+@qf5#o2@XAvLS zpzbH$3_pwbjAnI|_&B8=BrbyDJPdp#p@j0-w#8*T9iO+<+CEf`B6JG`X6aU$)dWa_@ZYJ)7y(O+|RV#?+BW@;6H>)+o zRjsO@_(te|;__Ctp7<)nuf&fus13xc;eQby4*4g(qCt%lAK#$z#1)W#Vq2@4CVsd@ zU8S!pwVn9q26YYbU5#o7vAb1WM|?}O+DU}pd_D0Cu*1avfc__b5Bi^Y3gQ^z6A`Bp ze+Bs`Hngg}`a1MKG1sW}5sT3O#02D@_!h*a#8Y9PiLZlwCa#A5Cmw?SC$@qA#4f}o z#5Xsp!^AX~bsup7{3~J}@=yE;=C&Aw${Sncs`0p)h1@Y63Y8COxt!fQ%Bk~!<&w~HN^AK+l z&xQUczP(9pAif&@Hu3LGYK*uW`k(kz_}j#XnpKJTQ}Cbo5$J#7vs=`5;$_hP#BTV1 z#OF7u>xc!!)x`PD>U!eYt!fwX5s-i4`@w(WNwELKHL(B0osfUxryJB>;y)1I5x>}= z_7R^5`6oWVS?wqO684|?WALAtZc(=rN5OyMs}WZbHz2Mez7FzF{1D$;H_$Bb4I0pSsd|InIiTEz?pZGY$+eF0I z3y4>M|HMtLY9aAH_MXe$J0RA8GNr<+2-K8iSv_?mbc{6FH;!GB^q^gnT7t9p?5xkdyI!0*8R6aNbS6aS8U z6!AmgKk?t-{}cZc{3oWtf8r*{zrGIs6Q7NI6|u8Loke_QlWHSwh5jeL1O6ZJ>&Rac zp8@_8pAG#_L{4HA@oDh?h!-}ie&RnM|HPj(sP)8;!Tu9J1^=IjeD4VHO-hXspWdp* ziBE<9M|=(PVZ=AIsA=LN*ngtaq_z{U2LFjKfcz6v$YT;O1^JH+Mo7ExWGZCK?(}@3wzkvJ`J7NEc-$ndKd=~US@ek1d#G4`i#NR;v ziKjFug_!izH-i7fPk{f#?=`BEh$Z;{#BS(+;yd8~6IHW1jkpE=Kk@a@|HL-ff8zHc z|HN;A|HQYz|0CXsJQNYW$GOC-TGSHa-w^*3o8kWx{|EM;_&wNv;+x?A5n;2|6JG-R zPkbcoKk?F5HA1|gMU4@E+@!{dM-l%Mr{Vt-zlnSc@gc}R@#Ww@@dogpcq8PW_*~>& zi02~yBVGai6aS>tE@Hk_-9UU9^gr74K|Y4~X2k!*w;>-xEW!R08)5&6 zN8$eyUj_LmW+DH?&msOJ{tfa^d^`MqBJ$~nh|h=rPh122Ph1B66OlhULc9j@Pkd&R zx}SIp;(ua4{D1vB_)naI|M&lZiB{E2Tm}12JO}wT;)Yf=pV$Nb6VHeLPy878Pkblj zpZH9yUl9Kn@=v@1{3pH%_MiA&$UpJ1kbmMM!GGed$R83HL;n+p!GB^q>_72&(Er5G zL;i^?A^*hRG^xvp-+=#5+z0(nd@=lgqC#Grcy_bO6E`FOPDCDan%D;WPrSWZZ703~ z@jvkyt!f8xKlo2{;QtdZYgN}1Ujz9kJ`47rxCio2ycqhQi2V5;;(x&Y6NeH15i^MY zh~2RN#1$>-7UGS__YzM=evWu%vpPV06ZlWu3Hwj{e~s!6;;HceiJxgycM@-h{wKZz z{vUA)@gMPjVE>7)fcz7`4*nBIApgWB_??C)VJQM38#Lt5N#Mi_BCr%*$LwqFsf8y7m|A|j&RlA9wYEm~6 zAAtTRz7YDKcxj{BOMDjcKg2&l{)s<@{1aCp|3`cc_)k0&{vUA?`k(kD$UpHm`2WPW z!v80}4EmqwU|os`Ufx5z3I0EECDx&cH^BcRUI_jZM`8bo&xHT4|3?1j2=8lD&BPUm z|A-%k{wIC`@jvll;6L$i@c)VDA^%5wD*Qj<^~nDamp7Pny&Q;>pPW5f`_r zG2(|H|HRvxRG#=bb7!GGc#kpCmT8U7#f4^8S;;&$+# z_!Rj6#BYHA#1A9>C%zy2C;kQeCq97uA8{P|pLi4ef8yg{|B0uA|HMPc&lCR>{3pH$ z{vYuU*#F-Ee}()X@gmrNVh{X(;)9TX;%gh!$;6+5|HP+4{}aCj{jU-BpV$cdPfR2K zN4yOBpLhuRpZJqT)kFLw@_)n+G^-`VHzEH=%)tLA-jDS);&UMX#2aA$iA%tL;y(C) z#Qo6!#CIe9Cq4`EPkb`upZIIYKk>cD{}6kj|A}qL{}Qi&{1bOT{)yj$|3|zB`9I5&scKp#O;%L;n+h4gM3~jr>3HZQws~6!K3z0Qo0=1pFtS5C4z&bLfBK z@4Yc z@%zyK#3b}T@r79bA-)y*pZFrI{}BHj`k#0$_)k0x`%ip1_)ok*shfx;@SnJ(Mcqu? z3;q)if&au`BL72t4Dvt3Y54!ddy)Sku7dq1{s8h)bdWiBD`%>VJSQf&WK*dV`ur97Fz>_*%$6@vn&gi2sED zuYYe;rx8C0|DTAtbOvz{`5)rd(Er5$f&C}`5b{qv2mB}g6Z|KxZB$E$XTkp?zN|&9 zBEA9fAMsM;|A`Lbf8r})|B25-{)ae*^;Y7)HK`He*CGGJA4C5W_rw1u{xAH0;wH#H z@j}>tViNv8u?hO0_)+Blh|fd*m-s{QpO^*zi5DRLCl;aqiL0UiiHpF0;EJ){_mF?$MezUb1AZI&pLi7VPy8GFKVm=R zpO|S@Clkk^|B3g3|HNgm|HKbM{)z8_{1dNgRc8^ujr=b$*Q`2-ufh5saRB)r;(Ek? z#4BO{iLgnli0hF5Az}|eKk@DG|A>Rg{}BHO|DX8x7PW!cjQF4U9`K*|C&)kXXW&2a zS;+qqKLq_Gfa90LD|_}?|eHpoBm5y<}#{|x>UOUVBaF9-jLw}Agd?BUr>ya@S! z;^tLlXJA^*f%!GGfW5dRT};Qtff1oG@<{Wt7C@hyn|iMPW36Bi@? zBVGai6Q2+NpE#w|jl@sF|06yP{3jlS{1f}Yf8tA#{~=z8^*>@O_Gb_;h5Qqr2>Va` zBm6(&$?*S(>mmQd3&DTlqhSAu?}q&+-U|6A7Qlbvx!^xB*{tp-Uel}|AWpWbqs0G0 z{6{>aRVm2Wsb7Qq6FXYfJmPy1{}W#f`6qq{@jvk)r4|rjJ5D2B2K!I^H1t35;n4rY zlMw$CuY~*)KZpH7#CxItiGM--Py8hOKjN#f{zrTS*8hl2SpO$}1@@n~1MxrcMX>+G zcfkG=KMwm(oQM1m@e|npLA)3FAL2OTf8zfl{v$SE{h#;}=)9oE1ieAf z>jm8}=v9JVBIq7Lw+VWYpce{yfuQFLdY+(_ppPCE<1gqVf<7$hLxMgi=mUb@FX(-O z-Ye)mg5E9YU4q^z=pBOIF6e1N=LJ0`=naBiFX(G;`Rf1k3=pI4033`#B7YcfTpyvyEo}iVWkN#DRzo3r@`mmr63HqR*4+wg{ zp!W%Sub}q`dbgl=33{iXcL;jBpr-|$7xb8*Hwb#Yp!)^AO3+IL-6QBWK`#>YLP0MO z^n5|j6SNZa(Z7iC7xWQ99~Sf>K_3+K0YUE<^gcoF74#lK?-ukfLGKjw4nc1h^t7P! zf*up}20^bEbibfi33`d3dj#Dk=tY8FDCh-(o-gQmf>we)`hXaJK_3zHVL=}f^g%%% z5cGaQ?-TT1LGKatZb9!7^iDzV5cGCIPYXIP=rKWW5cGOM_X~QJpqB``N6>A8UL@#+ zf?go#`GTG&XeH>Qe-`5}=p%wYEa*dmJ}Bq|g5EFaeS+RA=skkoE$Cf>-YMuEg5ECZ zX+h@&JtpW4f?hA^enGDi^b$e$2)a$siv+z;&y+_cy1-(nqI|aQ%(Axz)E$FkD%KGy-3gt1-(Gf^94Om&`Qup z9}?p)=p%wYEa*dmJ}Bq|g5EFaeS+RA=skkoE$Cf>-YMuEg5ECZX+h@&JtpW4f?hA^ zenGDi^b$e$2)a$siv+z;& zy+_cy1-(nqI|aQ%(Axz)E$Fzgg=K1$QgBOTnEA?ojYC1s_##n}S;v zd_ckb6}(r$EehVF;ARCU72KfUgo5J=u2b-41=lLLTEUeHu2689f=d-#sNezx=PNj( z;FOC+3;h+`t>7*NcPh9;!N(MQRKaZuZdLFB1@BkzUIn)(c#ndc6`WLXgMt$Zjw`rM z!J8FatKez{S1Pzd!DR|ARdAt#3lyBM;D~}#E*35HS8%t2yA<51;0^^JQ}9s*w<)+) z!3Pw)U%`77+@jz;3T{?#Qo#)hPAE98;5r3wR&cF?s})?S;0gtoDY#U@g$gcEaK3^g z3QoCLw9sF{-3snfaHoPh6nspK0R`_@@LmPCD0q*8n-!c?aD##q3XUtd zPQjZMT&v(}1y?G#LcwJUE>&=$f(sO!ui%J+Q!W-Q^jC1Vg1Z#lso)L;A5-vA1-B`< zRlx@oykEh472KlWJqm7Ca8khy3Qj0EuHZTaZ&q-vf~yr=so)9)mnpbZ!G#JgP;kD2 zBMMHrShUbz!QBe(QgEk&I~06O!ABL`rr=fuA5idq1@BdGi-PwkxLLtT1ve--q2RcJ z>lD0M!LL&;8Fz_D!4$w`3jCGIHh9Ig9`3eaF>ER72KiVV+ua1;5G%f zD)@kc_bYg>f?E{4N5RbsPAa%T!3hP&6 z#KE6e@qfaDE-p>DTftol?o@Dxf{!WqsDj%R+^XOM3f`~ay$Wto@E!#>D>$j(1_dV+ z99M9if;TI;R>9Q@u2gV^g3AHFxJAKx6x^)fq=Fk1oKSFF!F3AWtl(M&S1Y(u!4(QFQ*fz*3l&_T z;Cux~6r6IgXraG?yA|A};7$d1DEOFyk1DuL!L15Dpy2%q-mBmi1@BRCvx1WfZcuPS z!EpuGDR{GjYZY9r;7SEoD7Z|)r3x-oaDjsJ6&z7;%Eh9E{tE6^aF>ER72KiVV+ua1 z;5G%fD)@kc_bYg>f?E{4N5RbsPAa%T!3hP&6M8PQ+ix&DTxLd(p3hq>Jhk}nO_^5*06x^!d0}9@+;JpfNQScrGH!C=);06UJ z6dYG@oq{(jxK_c{3a(Ueg@VfzT&mzg1s5ndU%?Rtr(7&r=&#^z1$Qa9Q^6eyKBnNK z3T{(ytAYm!+f(sQ~ zpx}H3M--fLv1p;cg1Z&mrQl8lcPRLnf{!Y=O~I`SKA_9At>8)pS17nl!KDf=RB(ZU^A#LXaLUD^h5iceR&bYsI~Cla;A09t zs^B&Sw<`F6g7+(UuYy|?yhp*!3Qj7xLBRa=8QQu(3DuT;i{>wEj zFB6_JqupmsQGYASZ$o*_hwhW|mj2$|C~fJ62Xji9GDrJtzRvDVgOONlFfaDr!ANd<&ppD7I zdH8k_uuk^HY9i$eJ2nljh)kJVdtx;uHKl0dS+k(~(we+3;uf~F6jWJ%`mA}T@1_f) zk>(dH%{BpdpN4g{9(ogP2X$hF@%fRuq38lzpE4oA~F{$}9P6qV#K)I9XdC@_CEhKH;TK(!AYXv15*LGtKTWOt4Ey>E9hU=3_S9K(N$=TzM?VQB1-<7x z?5E5EdC%5QnK`|49bQxBOb^rB8gCsSOsY`8^( zIEg*FlQ=J<7Vseczlqm><5k?_N35j z%R~xAUb*!<(MZqv(MS!>X*z-b?`O%iPl;U1D_?PZO=8pd*>CP!_vz!TmF>Of^!cdm z{0)ukSp#b>0-rQ=Q%aCy@_Ww3yK~+5eD^&LjEAJ!rA7RBd>V*u{vIrC`vXZIDS|jWk~a(2Ld{#5-%khA$2+0 zC}#>pDk8s=u}RPSQeJJVn?_!dnGiChz zbGScA4FDNRO>w3tnOH3vVbkE*FHM^JghumFN;*NAkkHBPYr%ri#zqTuz-mBx4Xi+yT4brU$a{3@NkfxWWD|^`X>OfYi zkk4&PJr%+}W51j+C!B3&B|%6#O}Q`+`}xjUc!1?inzh}mk5=D1StYZK-6EqF)-=X5 zcVrs9&M!WmNjzSEUiqhfmPu?)G;ME6M9SxPWH1(BZPeUd-v}&^45SlGMLVPb?dAno&x`KcP8~31+Q9#XPS&*?`feZ(tKx0=niOlP3EaLi(B#n$YKC1s{GM>%-!5v} zz9!LBk5O@=3fNE@?pt@>@kYFRyO5F&)V^xcJPlpK5k^V-WY5LWF?ZLqFV2|dke1+c zDf?=`B{k&gqv##V)VB*uF+v;b&zKtqm}kmt>&}QoC;{#*O3pV4RiZxwA19(+lntau z$j{WBQL(|B65Hy@GjGwZ`JUy#a{O*T&Zz5>@n}~P_+A4^2@3{v^87e*9F&K2T?v}s1g@j4nu&wg zdhU7f=a>g{H$8{-h9KRc> zZo=#V6xtzPwpF5U=wDeGc*c|hCfC@MnvdE4Q-;znQhsj75!irJrV*q0mqn?> z1mtH^B4gsPJHFIKuKs#Y4865)U9>aB@c}&$DKBtiz;e7F$JdCy%Jzo}WK?euSz*UW zVGXUVGiC=g(A^jpcMj;$tns8Anl!7>Q^ZM+2`h&xyZL>E`%XF3SYL&7c_*6ctH6I2 zcfPT>-_y(SYjLlFT;XW7xKEibw3ps7GL-ho`76dox;Z#E@afUq-uM4*P8kbk1%!o`Cc@ zV>+Y+|K;tXCvsXqt9)O5@V&4K*0HtoI2tnM3Q*VD@A*Q}7wN;)!`emJCt;^~Kk|%u z5p->=zX|PJQ*Z6}Nz(}r)Y^m@^Fdz*w(A+QK(s#eIpREF?(g@WG1Z_GV=+4+?{e|z zK|eHY&zQq~ZU0XG*EYp1h>y8(<;G5EQD>*km@VNLoGI-Kj9n$;lu_(4N;32tqmt5F z8ijP8Hk6L^C)=GFIeW0tC5Ydjx`iv>)6^*@}f4`erQDOgo*8RWC z{r_CW{GpY=lu=2WqO2kbduS(kqUz?mf03-8z!T+9aWcD_!^n*>3ZsrMJH@sqbSAKW$TEcZ`cOb#y6K& zP)Bsba`d&G)A1PI`loFB>1x3w8DN5QiE}XdEOLJ?$i1k;*7CWE$3V63raYxSUvYld zV-uH^vR(VuErdTroId9$5T;52w|xq?f-KyKX;@b_rk4t))>kFXj$%Ay(`*T1*tWM4 zs)m@uxXj_=d!@Xh4Y+JkDL*+b<$_CFK()qcxD*ArELSy5$Hh{Se8;{k2UR~`!AJpG z5+yCIHF?SD$5Lf@e{N7}DvP6;n`0E0HI^@yG?kE0u>LUCNs)}XvCsBM8EPm;NuNTh zTH)+th}qPluFtxW*^@-tP&>^$xHam|hlr17Icyy4!_UC(>EKc}#otMDiZ z@Tfh#n4awI#n2?@bu2=3-j=`iG$Zd8*Q-w>vT+(w9C*1qUHoA1&$4aikBf6I#`)4E zjQ2Si$M~|gAVRyJHtk~*^DD?%haq2*F5>6)Qtq5!#ym2RJ158(#_B}cq)%IUM!U_= z2`=uRG6kofzJtE4nh*;bxZ*h;`4leIA?ecso^MpFs^<{b&zMq-7g#s2-NPP$z69}Fm_DJr zy>nq_Kb}a61k8(8q0|y-OH*QBJYQl^mC#iDz6QAmL2)}KeEGzq;`AJ(m@-eGmSo~H zz-7u@AEeBp1MHB+QX``bTj9%W>iPR<&G`TG2R|8p?`yG4bi_(O&x3ZZ!?&9`BITDL zzl}!Oc4shy?;}+2fv1`3$1FDzmKzzdvqe*|V6E446Z#Qc5Ja%(1% zejjf`Zby9`ldyTyW)u|tWl>32y1u>s?IJ{nVvQ2{v@*PXdt3e8^^|p2qt7ziGvKn& z^5_U+nJb*^^>L5_jDF4wa+ZcXah1b~QB_dE%`vA2+Cfb{F97=s^51$J`);x0qV>=o zM=Q$TB9vTYOWyvn#JZNF1y$Rt>N)c>X>LMI?c1%CehCq2M)96NqM z>Yv2C5_w@-;ycNccs$eI#!LwqItmtn{EUnqp z^W)g#;HCRx@VjMfdwVr_lX>9;YU-}PU!^lLd3^4h0S)~6ly zQs|dE;h}K6kUl*ag;m>GI;4TbrZVOTG@KnT?clAKC^HZ}oHF_FN2bJI%BJW|RwJT@ zbU@KLz{vAQG{DLF4vT>gwY=w(OVCHYeXva7+vM`c`;fDiKkmSJ=9HTue>BERP+o~^ zpXH7vu(v|)U~Hy+dn2M9w3a4CqoG}xPf44#;1YOUNMBTgu>d}`d@^O8?r%cWEt^mF z0uRe4%N-t}oq+ir>19ex_J^0PAs@6sKeYv4wBOPsIumlx*$3G=iMk9voXX`lpYr$3GuR>nNgpFtc=$AJ;cgv|1>)TXRh>LgapkVkSYY?fsG ze;YAm3^C&(0E~Uv_@R#-!WTP5JwhI81n=L4IgGpETYa@RgZ6sAm-920FYLOi^BiX& z#*%2K^c34EV;+PoDrP?N8NP7_7u*QX*2gL8;+{8lV~)tio2ufI7(0u=-HRM|KiB_P zsmSJ1iC}XU^|fG5((41#+uAUDdI$jr$cE;ZJ)YTPbE_Jg&-An-eYR}7C&2LFA6xu# z>&algTiaNzhgy`L=md9nTAF+f+$YpXn|Co2M`=PnXD>zuH+_eFaTmto#h6LXm}YQD zkHmpj2DW$%V;&Y;U*#|OzX2(zFHaOQeiB;jk-_gb^E>CZVSPx%uEJo@^@-9Z-R?y)R&T6QXu%UV;@XUAbp>C#{O^ZX1 z^sTASlFo?SXA&plIWk+`?n8}-5zTp|i+BO|8LSSrdf&R56EC6mzlC(jF6YM>J(oiU zy?!c__<`U&b1998JX?B9nnsMBALNwt25{ULXB~TUzWjJ75_=Ugt<#EjoX_8<&23f3zIx1Lqb4w`@7|5K8lMsAH=g=YwjU z*Hq$&lSBDV4kdcaYCZ$r{Sw+uKbpA*Uk>dK${iiw_x?%RJbAi_^#^vPmnTV#hZiB! zXZpt2ZN@Bs@3;ml_ZV$#Ul?si>;pRZ}! zzNo7bGoO?fZKv8LhTM)38XGE!W#a9S450&agIKDkTKAB;qQMNtEhTmcQxI-X|OahX_j@*As=B}+O>s5s>dwqQ8E*#1d#qq9qzU-rC4 z`b|g_!P$pyZ2aEv?_GLye8tiXX!r5)_-ske-n|DBE$ofRD}z`^6xvTyiCl^;It2?V zZmCv<7GC1G%}OwB*K!?0#;nci?d-NzH7x9EO8h-X97ZYsw?k6Bgi@dC$?ee|tWnYY z;A1oFpG6%1si}2o3 zmG8A|X~KFa%9gtmX|&}*$X<~Tfo#de@|45U%83axe0tK9!cL={Y3a6dCT$K6gmR`S zhi~CO^m^PVx5HJ8X^9BwzG^x20~y=O$NQ6H;u5z~xNIO}KBN^#o)>=KG`Km6nI^o` z5^)}O6fALh_Vq19)OAsev6)GOJFdXTkN|yHkBr!w*tUO0-JRDlX$qiKZ-Gp1dHIq* zwBtVcYuwX{pT{53kkQ6FqM6tT+t2it%69!zGQJYl?Mkt3o3@t&1Fn=`6nmr_w~EIZ zfxM_WHWbC|^ZDy!<*#7H_{xM?K%XBx!x;a3;7`eNI8lr;CQT9iG}{8MTT7b{AW3}M z0?ZB~ZZenpaIaW6wA_-3&qJ=AE4e3oh0lOhqw{AGO>mN*d~@p-+ty#>PQEAci{saF z=x>8DquO*Uz3Rf6%N=cfy!~_Txele);`<8syqVmIb?hsnkw@?)n)gTwe0Lc1Uk+vWqV4eD(V0}7%hw*DA3|;aR z{y)fPk(bH%=fFSY&pD7WnRq%;J$!cQzI7%4wp@5BQa-n%R3NcD`zVR?V*faFW>ch- z{tMSxWK0EGQB=eAcSZ4~UCV-;T<=~i`n0ld(`ck2V~Qjt_aha>7vS&3h;U-H54ekQ zsI=L3YL3febx-Tdm!Tag;N5cQzsopX9j^e!6_Sct7^{M|SJiw0adI1*7zRgX;-ANN zVipCDGde^6)kkL@#=A)Qazq0bq3<(h8FFk*FiKZ-bJY&49R)@kfl2+q z4P_LH3`m<7q~Bu4=gOSWIr4WNR;w^~+I)z}J7;q_)*E;DvCc8IQh4P~+_}XV%zBB# zypMLt9+`Mm%|-E_r@C+a_Imuins&xNr*>iwPi2fFwg}&Uo_go9XI)Eo$=E{_06Tep zo;rf`Y|Vp0VcP24$58^DOP!uxBJEy?c9%%I_X>}(^c%oag=oW~NZJ(QEq5nPn5Qv1 zDq|&5>o!*_y++2GD&0PjwHRw2-h#TsCII~&LS9SVao9NxsPE^glB>BJY7*LV{?L{@ zyhZv&&aX-v?rveawD~pkHuF**WlSepIe+LOi9Jr3G%TtEQrbJeWlO6=X%ESp*W^uF z*38nM|EFeOP9Dm6LCSf}mGdsjv2{f8?HT#j<-Q%mx3w`!{4Sx~Bz!6IH{x+Z)3q`3 zbQ(KN?AtPVy8^8#bCljDv7bUv`T*YAQYK_=ip9NDFh$HCxbw}V;e2XI%{IuL*Mc1A z%f2XTt(NkuQEQ~U6nm0%nbn}0Ewf`4=>h+RWulDN1eXa@;ZjVRtEG<1yQ)N+u{^F0 zU2E$TU3Dw^9`(7twdL-Tav|x^E4t=6LAeX0T(*-`$w#`^1d5*eyI=UesgzREW*9ZF zZ|?byr$77V*HZ7Kqkn!@-*ocZ*h6=4bff=Ky6u}u*EdOgpWZhmu5VTbeX~;1r%fkD zvz?t~YiubK<_Xsm{|8c(R9q7D%o8ZTq^1ZhS%Fqfm@UZ9`qsxz)N_Q9>uo6(QF$r2I*<4r5eP6>c(sv zz!%UrZLR>H0CwE90NQ-LYfC<{96Qi}H+f8P4%#HRj2-x<<;7v_TRVVKCd|XcQm}eJ zu(G93z>c>4IAL}n1@WA~y!(Z~nW;DV-ghJGAva=g4BGfrTbiVvz#NSoO%vuuK$Ko- z^A6H(k#aYlz7!VnN>~U#P3`;)btMHMur3C%Oyr<+oiLTBzli!dRwppOMC*p5 zb;7JX{V8yrZO>(VFBF;1Crpu~x9wOaFxxR<77I)%JYn($w%F~Koqra;Nm$a? zz>?qFJ%6lCcKbzMd31BA2kU;37g>zo9Q`uIvk({^r~myzA7@aA@dNP9e_6M{eP>jP-=792GKSIu zdo_-`Myado@Z+Al3jBU0e!1Rn*CzYzLY%_6e8!n)o6CQ*7WaaqJa6yMG?$+;2dB;D zBRX`-dUMtv_^_8N4y*B>I! zA0i#&A6w)CY98Vwn>rArVJy4?@R)TC@iTUrt|V#{p?gKJ&a_eb=AD_N>7>i*1<6TnWdp13z58PoF=E#ntOo%mQ(@vNd9UeZO*aZSQLThjb4r5*!v(nB6fnMG(M4uoPJ$?FxAO5bTgKs~%aRMve zHJ|$!GfxokGhOsw2GDM5A3IB)HXHid8S6k@ey%HnRe<0UH>PiQb@}pUo0G!Wm6G(F zR0jJod`Xw&;B5OWg&4D69~kzWZdV59Fz9yqZydLS$Q$Mg<19>%naHes9{+55WX$d8 z)sP+;^DJVzx%4;zedp=%)%BM4zP#D!f%>JSYhp~bTX42A_{kG#iADm~swF!wza%V&ev@L*t)CB1>2j7=Djr$hp zojX^%RA$~6N6+Hss)Xpp00gtjk72(}p@bQr>->)D{}mTmKKf zFKA?E^l!b^(>h#ZklhYM0Km_bUtv2^*d@fW*$%rhCA%FdbBlb>o^xh9Xy`LVOGE*@N`6Y&Hrcn9GS5NlBmN6oeb`^ceNS2P zwiC9!-$U74olU2iL41Z0Vf)U0x!L%E**MM1e-gGBtV1YcY!e38LyyIsq< z20g&Jcd^4kZ?>!;7?mkANs5*)5#FFinJ^cM9Dt-ik9ppB6{X~k-3vOt&1hzN;jkq^%1>H>Qd^yo@;E`UM40JDa7Q2&Oux~e z7{bj}97Wh?05QLs>2hkD5CxWzIi&|0*?+9lx} z+JuQ_*`2M29(KG?393~J)tbI$c>ytg;MXqJ=Y+Wi5+D;tso(`0bDzlK1#&-Vn>QcXND}{3q=(A#+%6{h*R%A8; zZgW($`ctn#;#{6x-N;?mDRUV4xt@UQ0l8`szKy)GD?|J)Ym6MwCVSN)cUh-kar|bx ztf^;1+c5=s4&PHoWkJVUtR#VymJ%c1Yu}OQEXoYHkFKAD|CdF}Fvkl^RLW|?>LagXxbu^ty5j zAzofTS?NP>(61TrYba7?bB=7%`|(4$81BZu8<<=HtC`*aM;zx?h#mVmS4Zu}=<~Yd z#OhqRI5F+44J|WUXI)DGO)p;9ba|Bo9v4DBlOMbfJYA-36-^bNMdtZ6Zz-()v~;s2 zcv|{38nfy8unq7Yvn=6I?y_7^UL>DyMVK#Tu9~&&Y4d27G!Dy5f@2T#e6qGbCtAeU z9F`HbeRmcHA#M}cQ>m#E=H*)>_H?Le!hC7-Ftl>9tb@n;r2$%i58zE>f^!xY>wRKf zj)TkXTej#aNNxM%vGsn<>Ug$i!!?rZ|9b}79UprAoHpy=p?m*m)t9~Q_j>H-sk-ZS zVWwuwm&M-wS`~DqF>R=sw#rHH2~RoFvwN3fcCR#oC^jMm^iE_}iSdoXNW_n|J#QlY+-xdij!Rog4E>a0^JMjRLm z$i-nEcIQoC2QI1F9$(SLr+M{nu2Bxk6EsW`8m#_3Ek>>MhJUj%uE zwJ#`ndOCjLybIIKMY;*h*V-qRz!`?zJWHhPllXG6=wz;vEKX83wk3=y1+UYdF9&W| zGlHkw{E@-en)!`;6>SM!q=YLWg%RgV_+eKP{jx|XLMk_+rZt#7U~fh7_G0XJg(boI zSs$pk79|y7m#miA(T=M6OnjB}Se>M`)O}iNC8vdSv(&9YDpHrUc?&RU!ya3V9IO+) z#JsM~sKCVUa-=1Gq#RF&$!)pqm81B=RAp!#{A$67w){-}xUhq1&bS)VX1A+hf#e+y zYCa0xX(?m*%3{eC7{rpezX`sxZ(j#wXN{ZtS^AIgOm5FpbchT-{hj-N!S-K|8jBL` z%G2UJR9iDSWjAUq#(rRy|AZ?=Q}a_YW;k!mmHb5w%(F+Hpf4K019*NwbbnlxMDHSZ z^hIHXw8vNdf<4a}_hQJL33GFR`FY2Q16T0cFI-<|+Z4sFk#G;bLa%71CHLg;-j8zZ>LceI4@T>76zwPq9~TRwYTx zb0n^%_bwSTj|6x<>*~xaC%x0AI-m!4O3hC1hXWi)@BfNYv92V@dry!zYzgTNi!i8} zvLd9^twDLDH~0YiL((RtcxVe!SbA@k(k;C=s8Z5mgIjuE6TBzA8GE_7s|~bUCnYl4 z!P#{`4i<<6ULoaj)MRtmy`#50&%DcmGMi-W2hY~RDk@liTnWM_w#Q&Tg}ZDxAHe_i zY>R#ID)2XV;WUchbZ*B2_)S)`jpF3GGVuNetV_PC2QnVsnD?K0uC}^1eJn2$K|H)u z#l+bL&gFZXAl=J1&*Dw4O#q)Gc*`{FG2VU?n_vRFAls+e1eNp}VG(m)sPv1U#3q2> z20W;vpO!H*vrRDAGu#=sg1E|Z|1X#g=wYYYa&0)=G zODd2x+Ag6@kT!Qf6H<@UCPm7vscv`}lM%&SO6t;Ih35z3ia`y9j<>NDB|6XsFmnVybc_TUTC(I!Znh|874 zmv?3;n>N9OIfgIP=qd9CF?Jdqx&gY{+XR?l!pP69)7k`Sr(s!wl{MC?fYiiDv?b6c zz-%nbmwu@QX+h zk2#%9KzW->O{=5U;)|8%r03Q0k(A(Vuw_Acmfr7llR7JcHlhEK!qWSUw9e8y1vsR)_3y|neZhN6?}h=| z1Sw~)((nwLn{EY|A<;-+XQ&JJMjAwun;hnXXfKj?FQi7eC;GWHJjxwBe$RGmA zv=@R(j7HuKF4~EFoN=-1WbHmf1Dhaa*Sy!09(f%T=KH|k&L5^fYw_1{a>o3L|AiRK z+@p3W;QL_vc$+Jvzovc|Pf7x-GvGws_D>RN!aYh86n1p>lc<8S&4`TV`UojK%uWly9T6gGi_>n1`&<8s~ z`LPS&H*Q759U~kk_%$Iu(Fi`-3C|W54(Wa~dB(3m9e1l*V)T^Fdi- z?!f3Jg|7gI*flQ(XS%b#$l%)V_*9H@>iXzItdjb;8ZqPQv#Tn{4Rv&+{IjT!7_~TQ zZ!kL|ni=nC3;5c)X$7ISx!+;xq@-qD5!bdw_NaM^QAFnfR(YR zyFEevqkn;zmW*Fu;Qli%2O9zP?NyjOC3&-FjD8Di6pE9| z^E@D%{&m!)+i?J?_rc?_bbrx(^*zYF6aO8p^xvOxm@*n*FOv8(|IM z9W_A;D-aQl!|vt^i6El?g?~PE-1Wbsp~dnJSI-s5<7s%wEOfA#+w%$Fp9XZeW)?cw z^y_lyumY*M>e1GJRSq4v{(e5b$}B8KJmz`Bd28_-DK&OM2CT)n8^pMKc7>CBfh?X) z7Qj}`ipGa>f^(Sg5VO8|`Ok0TSg%1TvKrJKM|@n%lQ5l)K;INZqV4lZ_`RHW0!PQn zyOJ2K8^E_kHC0L@L~za{zwE*N54Ij-el4k*AT{uV2HA)Ie>B6sxs!3o0dOcdhdL$L z-^OwRC%H`l_vY2qzz~|j9d1sbQadtHg6lE8N-)*3$;c{0$|leQc|+NR{zutZ zfiJQN{f}}e-zgi=|E``FP@*qADy2`S17*#)iMSjRTM;^NrP)k$u<5CLG#zL!dD%2B zD?&79U5&3=HjSJ0GsvbZ5U267X>qByX+pcn&f~XZ^v{305)`=}{S9ew8_yQuNVX?I za1NUEy1rLts%JPYmwCCagLye8-dNv+GI-K6R#MzHeHJ}sb`P*DoKPXN=2bdurg_uEyIS*VbL$$@H%V>G@<=H=t!M{WwlAQh2U>n zh?86b%<5*WVU^Ti&-k$CMq~a=Qm($O>9&8tiiDpOg{>|bxE3C<33mT;g@eKRk}PV1 zzWGurqu$xA$I{W2`tS>2?XXL*;EMM}XER8!%i2pbu zYPmLs^*I@T{y1NVcFY)7*w1uEg7-n`r;64BhPhJnI;@=GS7=yZY16F>(uEO?^AYp6 z={CD`c4Z3tqzLikCagv*Lf_aDPC#Na3QT@1lG1QD8fxM_Oz?lD1e_t9HQ)7b_|7tv zAL#bh+EO7aL=S|0_ep4Du$%Fd&_-foIZ-=L8)I%|8-#{kA3+-<+`)8Xvf6EC+R%sg zv}wzs4J3lp^qbPg7{;hVYmwvEu3uaYJ2ew86=`E%_$SWvrFB_^1vo;T7N| z8{^@g`n>2E);nYpyi>>EEJvizi8&v~&NqLKmtPyWRcOU{RW?r9-;d1NpRu7Yi0$hm zFM1r<+XKU>O!haP$C>rb@z7k@=qaHR)-7Yqqzv`G?bC5`Yfh{F9o#q*?kvaPbS~y) zIT-f>b9@Qce_T0%KNFLaTC;Es&T#?9Co|uya<_R^CDKjY+3zC^eq67PSE7E}Q|v>+ zO8}R^_DPvz!bg{)*Wl3#ObnZuHV4B6umTWk57LwXT7z+zLU|VgE~$}{<@=>VIeNL6 zrGOR=BKt-&VMef`j3p<$R*Fl=wk%oB}NZym~y}`;Q`<_^C zLmJ}7oSfli`cPhIx*$p>7?Un3Qw^AOfk%MSiW8)Z!TmlKKg5Cv%|I7pxC6*?Nek*@ z-OTwQU`v2ke$4{hbj zBtEnUh+8G#weEdLm(Z7`&Bn8dy-ykXjcv#|iQNl+-_LaU0iQ-_VdY1K$Pex-%9S6h z;8Sb)F>dba^YVjnfLuDyEte=`vc9XabwREiP~Ye!WRE**0}$_zmLE4r zd#(Ji^Pe15&+=^!_k5K6NSWtJ2PcQImrJuwr_FUi!`49$8kri&6|?jH~F4e?#5f<#+;A3^dbLix*+N=C0Kd6 z1F)5sTs>y#l9F?JS@*a(!n8R(YvtuzlAdX{Ar0$Jq3#={JYvE9)1EHk3(hDntF!1* zDS0R_6EE)Cg>$LKWyK#Y;We;Ke}!7Pld}!{u}Wx$75H84NKJ_& zGv~<9T=Uq199qANvwz9sc4lB!dryrC&MeG4Cdi?8%!qFT@Ur+CSz%`JMLdNV0XvUx z%9ObL#8*bfe>%QlpI~kfwY&%!x2fmtZ@zbs?Xq$^?1S7nu`#n47$Tj_i5auMza8|` zb7HUzus_DqbK@c(WBrR@z9NH@bhzUmw{YP9^tlax)|~GZ&UWejq*VlhFm?BIR## z9Sh=7ZjR@sg}MIbxOp9P*ZwAC9(+pgZyK`-yb=1Fw0puQMh9o}H$xtNTsYfXxUGjC zk$o7v=?-U%-|_R*dfe=dzpJ?NIP#uD`*S6%Te&3)@03QjEjjI22}pfT4Mm4enwk2}AT@1LoBCbx7Ocg;ig3=z|6&Joa_5Xq zzZ_{oZVBiAnTo5_m}=Zy6Qo}t>AB8yDeWvn!2xO;UJF2Hbn-e}TA@)R=1qz9;y6 z5PS{ob*>rqz7co0&P=IST}~q_ze7r~e?t7856XWwNYCD}t5w*7CxaA>4zS%dg4rWM z`Xr#4DJ9-eK&f~7S>9biKKcwHCOh1F#1exP6`F_H_A#6;%~cf!>(SxW^dmA4 zU2e~9ZCGGs+fz?WKWnlHb&cWVLH_r;Mb8g?4Y9qip+5BH*Ql*!r47!7Xor+&$GKd* zZRJZ9mv%MnXutVKn1wdxeT-Dh9qbsFQ-ExAe@sr-W6Hw#S^|6AR{ zJz=(D3H}HADptfr8D^Yj)Sm=OzNi=9ye_$ zYi3Fv335IYV8k5zgD2w6xRR~?=>U2-3%|X=d(Jb3y5%AF-k4>;XJ*~PwL75}zVj4o z7#Ya0^AUmty>U>Ko4i@ z7RKwm2gU3qt6R6H-}BxTFHAcoYt(GojQF8G?XGEQX{Y&et6)j6b@YqK^{jP`lCfhrsmqVec35Pe z2KH%b>y;f>bd6${3+B1ebCi6S!)D7XU+`~iS#(ZY{TO=R#u`Qq?#;kn@bKHX-0;je z#3;0qr-i+#XUx2FYTUeo5!eI2)t*!ldF4Sz%P?k82@X1g@#*8ce!j)t6*-Q(j`Vo+ z`N((Ap^t1XJ)fej3(hI|z2We!c*=&XObXxIxGZo5hlUpA^zV#2>hCYP$npA+-^Y8k75CbEQRgJnECogEy$S1pGr-LVm2^X zKiOCrliNS0kCoR0p4MY!)U52CK30|oY4unc#p>VbX}iz^c3kPPGKzIN94me3J8uPy z8SZ(pdTge#G7he$b;7aoD8@tfSm7+b9S?6#8!L6vryMIk${8!8CXQ0CffvL*)_$yf z)zQ-PFz3!jAiF#l`}Z7oj2n#^dZ;0n4rZN`!CvI*JS(ZF51O`r8>?#yake_fDQ*nl z+3HodMZWjg#HxzC@A;c_#!No;Yq3_+OaS-f^?*KhRzqGxfA7 z#H}LGwK5u|cF3Fu?P&bCShJIXHct5zcrT=x=OOYIcs>uZSa>_+F+JaQH)Ko-{O9J* zT?{+)=6tMO;|wn}Lc4pW9RJ@5f2^czbWrpJzzd=uP#^lTz?k)6dUl7@o5~i>3VCvm7)Ex!hde$bSZ}Ow*8}xZ&qDs~pjhO5E zs}d*co3JKWa{y&Q$d@zsg|#1Eg8lN~0DI#8)XGxZ7x$;W0EoR|`8c;PYC-MU`eMwk z2TWx5#SZbE*%y}wd1vYiA8Q@O*-W$b1y?E{dMemE@M_ZiP!YeM_j z7jq&Pfo9)_F5)WFH8P9idqveNxIUR(?YiucTPMUZze{>+1jX;h-{oS8_pgUOo@fP8^dF9P4qm$ zV!XfIVNnY#=x?TXSbvjyA8;Bv>?^LHeDt)%V=ZvlfZyo-#N%&dzVn|?MJ}xd^{TD^ z3F`3-xND@nKgBn!RDhSmcd+Ro4@f6Qjd?m(Q$4w*LQXv|LG+gKm^r;)>7upFGq;$p z5wkP%f96wWuXe;eJ(#CL>|DyZ0_9v$e!+Wx4}LhO{QOQ|%F?cOl!v=rcxn|^fccu< z>fw5J|8%V9Jb7Y$tAbfUuB-7WUc@OMLL(Pd=KLm3J$E!(;Ak}Yo$yW?-gBIR=8AUA z2R-t-=HYKrTG`SAdI!E=Yja-YDg0Uwy#|_wcU=4gbp46Y^`BFVuEe_6O z@bz)NJ8Qmp#-AC>y23FWDKG1oKlB7>e?;<)WA)Mep|(7{!~LH5^v+?kU4b1#b7Don zr%kx}Akr2=0xie;Hj$eLyKO0>=DF@=zhIr?a+dO@o@>E%vDiPS9z_iP9i$z@9xx02 zH1%i!oNB4~-(5e&U-ti^^2<9GmCt+sobuo4SWy0jj(p5= z{%+TDoMXDJd|}7AcykSUhNb+KE2XpNS@-5a_vWphzjJSPyEm`*>~(MMcW;jL{Iz>? zuY2=C&u;f-mwWSU&$r#1qwDDVClbma=DO@qBy?fTpSq_3JY9@@6_F7+q3pYPFL{_=jn$K}xR-CeFDVK-M3G6fWme9ky@*+w6S`W23 zUGzR$^S+Z*?^jf!)jTm^etBg0Z@&}$yZ@THwDkP-`PY3W5{dj4et(MJ5Agd5epC2; z5nI*&Z~T1Q?R_6u_tgFEU&y<;j5FKyK^S zr0ctAQ%3G{YQOoSE}q+&FOgBMxxB}vtnF^!K^tJ$JO%8iaYnEuVv%L9-W6%NNIAeGoM>cPk>ydT7J-SYl1?ELT?RfH$r{ zr>EuHJUrFn$+qZBA7!8|e^>VyRx;4q_-X3>QfrfqnTMeZx*!9%r#>I!o_AxVn_!PM z=0)DZ?-Bg&!mkLw_wUY&oW$=z{JhNJ-F=iEz-gr4 zG`Jyp@)rJ&MT`CGePlRu1&tjQie>QC2Bmx!u)wk{8|s4$g;Q2fIerO6k9L$)|hz|9xvtChdFZW_aV3L#qS^R`z3xCKz?0^-~WZ5 zy*IDlwP+uDm>Lpi0AM7JVJE8n4hhlsqF7TSa&{c=<00o_jTurfN3F}jQIs+QHRP}w`>Ea=T#m~`;MlIB;mPvM?RaX%lkMk3&-o~y z{X7E7;wDi?%WXY#0b6`-lzWvdmEM7@eWb@q)b(P2=5@frK--=c>v0|Kp`<)r1-UTi zF371r&x@?U?}-;sO#9xb)X!=vmv+=A)`m&MorSKL@fsxnPPlBsT z^_b0tyV zO|UzyJ|30xuepvZ^DWw^T#rA2(Zp35?KtoLrTP)hC8PXBfxewU2|S&H8gUdimd^t& z!{8yN9>t9+8I+Ck;^~|dW-r9b)0gUp;dw@0Ar=SF6LrAK-p&Q728`<*#^c@Rb`eMF z5zk>~5Mf~cYkHppXEEo9*?nqmx14G4_ueVw@bP# zpWXV+yhuKNU%ewQvIf60{Puk#FR}{nRshb&?^QfEAM$rYkk`0^miyTm1G_f14?CjY z+qrMu3xap%TfUXUI7OaxX^(#vy96rH)5CJQIrg=K7tTN4hJIKBs|f1|0guXwhNK?h zXHY|S6e07icHxQk_+jCR{F9k`{o29oXv4AN;g{Pj$3>g!sXaz8n@`Jup2?O{MrQJG z*Y368GuwY(LjPGjHw3)-ENl*1cvVuusJT@lq9bM)7^ZQ$J0iAd&3QQO*XCU5a$-TmSce;4`E|+qa%^@YojU(nxw4Tv1&go*71~lO= z$Hyklt0=`vP5xitYG?XQg9{Kt=n)Hk8Ej?RQ|ymn$kj+!OFgZ_6Q^lS^$f{Mv2GFt$cQLm=u_FnCEPqVayu){GKH7&)zEqsFG@IPXc0A+SaU*)`M(Hia>ev#l4w7>^%dfIL zhBmMt?0)4D?B9YFgErW>(ir0`xbc*hO+n524UOx$vS$?c*Ws;e*~3gB81I9wg9U^( zJ_^Y8Zp#2`jiT1LNSHsgwIbD3PQvy0fqTiz;sxog1M4Ualc zY!vzuF*~7n;%AoLAAsKZr1@=O49U-7kIIQfkX6S$Q5%@ zS{r?@jlJh!1iKQfEG^pZ`(y;?L-5^(Xc6wTiHZNbIx&Peh4m+`RP?EbA?>UOiJ8G} zc&Gh-&d$&0W5ye;wDNj$X@>j*F0k_);7<5`jBVv3a?k%aBZkHQuVTi(SZ;ixw>V^O zz-$c5D8h_`-@ALTJ}>exez`v46h_jN8%fqj1m~dl=p%Oh#y(=7Pt5y>h|Rbh-bZ`@IcS3q zV{iL?k^}RT1EG&NVxDtYc^`2no|`4dfxdc|;{~?e`G~L|VFj`s-bcIvIi8RlEq$9^ z4zBlwO)q)^JmTu`KH?fYw@Hq>`o5gyBM$a{G0R6>21#IT`*kvUypOoo(ewl7(|8|o z5lVhXO5V_S*!d0*yR^q#TJIws#xs43VY7fH4Wpo+xwhteA1*^1=#LGXhtWDxa2P&Q=pPQ7`+DKY;G5;&Mm!zCljY4j@x;5jE#K|L)AM+; zJasFcxRToP%UAKVA5XTA>w3L^IBag{_5R^7PU!Of;jpRc4K?d))BwF!&U^oG)Vzbc zi>-fn$-7q07eFR-{b^q0Y5b!2?YcEDatnT;f4Bz{Vvn_q;2$C$FwH;wj^nzAK~?V` z{zzcbCf)NP1AVOj$0 zykA(*w+MDH`D(r6;76TTnCkzb^9qNtZue%SVtW|-ft4p7VI^`D*6{B|HPyrWmR}8M z1onk3&(1~-;q*4^PZWtiNGqJReZkfCRak@<*R$-^XcKRbu(s(nz1iMD=m)+B`;H}8 zFK`IwLU=E5*j&~#Dzk5Eg`-RH#0U@DK5Po{bW@M)L2_Q80SO|^wE1^T^{|zBF!-q9nDzaJ%@Oz?*7w^ygYS2x^Zka*M#q293cXly ziFseXt{(-&b_oZ{qiDmVJ4`T^I-5 z19Kg((}P+Rcu;;VjpZv^TqCk8l->-j7weskLRVW`$fu|6M+?U0W0@aLOCu$Sm$ypF z84{^#%V~A%qHHas=aZmTiPXAEc=r2vegbPn7;P`Cv7Siv@c44B9f3apTMqaIo+x68 zNPn@)&+{>Q#jhH{iTM`))|cmO&x>3V#~cLyhkjK#WMsLOkY zR$ExFY8a7O?Ntq9Cs62BZ38XJq!pYYvO4BQ_!Atvwk1P|%7i{uEoLTsx^=KDAHaML zWq+gdsjy}kC3>H#^G!Qm5BxFP;C-qsXoJ1oJM^g#osjW!B_t2=r*~mJDny%rZ|G4C zn*uz0kLp_IQNcDvz22i5MqB8&3?VLOJ*pwo2Z*H(VYh|#s77QLSET#~C+)6u((c!2 zKXKURaEL}>O``PBn;JH6@!5G(hf!NnNj_fdi^>rwe)OM4h!I!;?18~Rd=Yg=DxnWOVVpmW<-p;z$>`Jb(gV6;>V zg}pB|B6mX|;^KU%5$r+Dl>)Q*QX}T!QQ-tw^ z^}UoXiFsX|JLdSZ<@i!su!qR*r_L8{AP=sC9Xe0VF^6f-yq*_XOZqzeV!{n!d++%p zjC=PjAH0$OmAC7P60ji%-`^MaJR8tujOM7!~d@xUtZ>om=;JP(#_cdv(W3Nx{zMEw5;K`U`;gU3qU){ zy{vMledq4q>GhHhmgjw6X5Z6LjK1d>=4x?rOQif_%!pB2al{VdPCEPc+~Z5_$i+Hh zj@6?0dGbsfh#sodZgZL8zVdPOaK9z@V1;!*jJmfb z{&DE+Z}aA@t@LJKDcuy**4>v~PbVxGU(Y?S*?!?3JNBz?r>$|Z1Xeb*9Qq&NO~ys5;!ClzzYMJ^ zlTnqqB?F4kW9aG0Bvu3x8Qg`D`5E*nEg#My6v!HESZ@NeSDxx^2gja=^BYER5;J!g zos4Jhwm#O`FIg^5Czc`xYwxd1@1%}d+<|zDl+M`B*?;HP5!eE-{$NvF4voA8eBJW$ zUH@dq)oY;ZC0jz9f@}7dN$*C=3$TA+S!Bq>5eq57PCrT#N@3D@*enLult8v}=d{=J zrNFzge*~+8JPnsfUo8pxik{R5@JWf)_2Mbh(s&OygGMpSJ?w5Yz{m!c&9dHd#H<1K zcYp_X9EF{r_<&`tm9cat%L1_Si2X5{;Ei)Hp`Vxa&w+2Ursfgs#o~S}FJU~M=x5Ag z&&7Ja_ki0l*2LL(34HUDe23XcP{n>*fk>CdFB}(ky}9)y?cCF#*#`?Yn^Tyca?Hli zmvptm_IU3g?@Q+nCE96&a=-1#gYAi;hIUFy%o`l$xL30Pzr?%&Y3_BGZ^LvPxa#CL z$AK1AtmZew!RbefLyn!K+FXVGHoPsp5;x}*fd{&T7gSqZIZGjh(hcoc!#{gj8SFY? zS#9;Uti!XE)s%Q#=;f_5PcQOY94+-074@_4S)GRGvcv}G!5;QAF)E$Im;B?$ft)F) z&%(u>xcpvJQw2LJcI~E~rPnUKRy3}RUdxMCpEtko-GDzb$kT)r%-NK{+4-@eYMkVr zSXiw~$zUF)N$TdFTwAw4UuSC$PX7JlIq&~MbSrI)#|2mHV9deH(}R15w(g+EHi-N9 zLd$D5-Q#6FZBxqIIHbnRmTBabn~&s0-VwXd;>o>PRf(n5*>v^aKv8fIzFSHH_nFgu zR2lN^+N^xe9^;H$HKbib6dq!hehkMv(u_vFF=$d*(kJ}BRAk@MK=w6ZJYzlslzSc4 z3bp5p{nK^U-mKbex~KXv3vv4PcDLRDLJzhiRjFdBk*}Lg@ZOp18%pXUTAuQnotoyP!*8=D7pB^~u*PZ&c`Ge+p(YY(K z%JVq0B*w%BaV}6;#}$rV&u8Tczh5FakfKlaU>+JX9G)NN3k~Kg8tC4RywdYh_TGV+ zY>Q!Y#SHX#?f+-*-Q%RH&V29c3zr}wBGI-RNk@%AnwSm}16{@;#A!JmBgQx$2Qp5B zNU9q&Xgr>#%OoTkbsUc`UZM_~jFUJyzP^4OhNBKp-X`%R9^?2n=%_(sI?$K8bX6C` zaW`E?-|ug&z4oQLQD@G-FMO(N*WPQd%d?*Qde*aiZeu0EF6uFMRWLVYPEyp|Y>SoK z=EoF$0ebj?)e%_v40Ywv-0Aji$3ng}qDQcI(nOSP>MWB>ix}_Kinm%wW>LvZG83;} zfW)_cw>j7j(zBhVi412?Qhfr8o!pA^kZWgWW#7+hpMx%VC1)_O9&B9+94`_>r+rX&PbtNSSzwgJdUS{R9t&%~)_D@K8+OL(ubs zd{5<*;$!#FS^3uh3~U@rWsTKYcBV$WmDC~aXcMs0D$FRnX2iR|zgyP1)B z3zaW(E(0-ge0ETFk%=_5RY5gnUppDI#ShK9ff3H1>e)kk1WcA#F$Ge z==7sQDd-!!$H`jf%eDI!g@NapwwLEOr9MfoY+StP-0bm^&V;V?bWye$G9J695uNG0 zx*nngjy3vVv)g&XP76h8l)a72vQ|gR_$e({6OL_rswed^+k)?Nn(9-Ydce$r`EM1s z{1f{Xf%7BcqdqQ*Q~neTX(A`;%MA_fiSp#psEz4(^r_6psT1_m>a9UPO>5_|N}$X! z8maZ0KU6IZ!~A`N430DvUXh7JJgdpGFH?5#DGj(*Ph%#a+y8-1b!sO zr*VGNF}iZy%;zuRKdjRjp5o;Fw#RSvW#HpL;c@zdC2jV4aNZ~H$ZF55sfOeMKYs57 z^u{=h4|r?Ap~m(M`#ok%@bqH;>C25)lTSkd;sTrKnLNX~E_)lGXXlrn!aAhz9C`*v zmKFE(RkvyBMI~m`9PqA0YpD%1mPE_4-X(olMBG)5p?GgcOr{5|D8%m{aD$G<^CT>i$67Su?VfG`l=Y^f5YtrnKc_oPMd}_D2*Ku0gi{a#m$yF^|X;+sd zgo9l)E=PHdqcC`u7*fWyTjNsR&B_Ghx`W&6clSM`XXd_1Ku7Nhq$na8ZG@eD3=&9HpKnrXOvPTci4@XqqJPxj938(}ZS>^@QI z0dF1H8i$zhz;de#hDXTh^a3jawyqnYlD!4uC-7pl8qSe;X2;`>4~BlVus-@lj)i+; zmb=T}0bH+|0ZqtnE$OO0otKP(Gt)tKDOrO)2i3@9f9fi%o%C;2t zq~Y{e7>hULky5%jl+UE#|x*_C); zh>Qd0IfJw8?E@;(<*feY_`7^uOW@ZJF|U?$M#_Y?8tu(7vN)7O&i)GRi^fzE$W83G zcRo+GSN0w;(Gp3@hVcv19`IHVf2*$>t!A0=TE|PQ1M9@`%3d2|$xsvfsdDwKhn3BF zQ1%R`48PjZ^2=oS0jJPkR-yUL<=vIog7=X{!0K^7Mgy_;-k?^M`bFc4{7)0@@BGu( zetqzb%jznLKUkfFHLBsZl;YTbQFk9@uCLq0nPJ3Qv-4p5U3naL;enh927G52-N^W_ z4|sFnZ1SzNA+fd%OP(Gsrn&6RWqh*Lgeh*u63>MB$K*9T4tf>;BdU4zAK{CVbwno` zy-!@46;NUd#Z@itCJN$0qsEVLz`ea*FT;E z4$m1lR1Dur8~x)(=^x{GN!euD#@9bi!zi2cxY0j|Pnq$XYHBT;lX3La=^r}%P&ULS z@a#6^hOS4v1xU%L{vnIe>L0ba@;Lni>)z0$)jxE0?|A)VJ9je^$myq{po!%4+2FjB z(<9zY_*(`2qX9WR$M=^hYps>jVehtQkLXLTm;RBwj4WmmE$AuoRwP=Mn#?Ha%T7mg zNYSI@IL&UvyTshav2)V=0O+T#eGEXp>pa+W%1Cw3!CWOh2%u$8jDC(UUR@0kzfLe8L=6w)MA`-%K zbLlQuB9B8^1c!*|F2`owx^|gewSn$pB!|^qQh6sWrWT_0M5V<6@8HM?nK7ih2;;Es ziU){|JLtWNgkI{??&5$(ZZk9@S@0-S@~Gt&K9z*{tG&h+e_sS2byDi+=IS1l$=6rc zUej{q1eBwl)WRLBnU9y?M1oMl>e*#)7x0hbd3*2Tz5}c|PmJfv?K%;j_ksiAoN9MK zHJ(rBO)J|So{!Lq!*XHuq}{^x+TS7}gY!Cf8a(^d?gN}`IWeBw(-kFKg*zkOrLFV9z-!34ZIX$bbmn@eXOKO1fvr#=gtb&3ir5sfMQ%y@?!KTu@OE_Cqty*&+;?wQCC>1VeN8;R_DP7aVoJ=D>Xkrl{L z>y}P0?}%3MLN9_mrU%H7V(*7ugae*tGaOlHFGS~9b5rf_aQ!%z^|xb*5vV;dy{0F1 zG%eTHZc5$KaP)s#g7PLHSg-Tf((H4Mzw#}WyMDB_xstZ9kiS9j`(Xci3ETU0t6Tg2 z^|JRaqqqL`5pO9n_VE67Y;~miME>=#zNaE#wleH*45S+P{~bp2!&7m<~o&Qf*y{JMKAja&yfcySj{* zf))7bzkcAHQLxSVgd(`#?eI-=SAP6&d>iQN@VKwrdAb}L-C%j}$95+TM(NbXYC8WM zbS~Oc?xVR_n!jCd%RWZgA1#}_$NrLE|AhA1zGUi+^(RnDZzvyqp%DuZf6V8=)Dbf2 z@XPF{FL6SGu2pV0cPa0wFZFo1U0;-EqPj09o4%C2n~nZ%TT$em`X!3Ej{AS0MfsRc zH7%Y`izoXn?lsqH@v+>e@W3pkb?}9LEcHvgKndL);ru%7iLm{}?wnZO??ZS9Y@YP9{P2^>qqY%0z{ZhsAVL(pu_Ax9>`oytUd9*g3+Eg9^~F7P|Iv zhj9_fj!J3=UcNTkyBPR>5T6k>)^ds$6vz(4od#=(b~D!45$ws9hd>fgEzhH6tuW2> zTMqb7(6$}3Mz(d?%M<|V!@zkUZ-LG?TM z1bxHjm)OidCQ)xxiG3kmbh@; z(n*?H&Na1snYBi=>a}qi&|YIfM^W(db&i-b7oxS*QQMc{LbgOLC6ozme2H4W#8gV0 zY)ZKJ6|HTmj;WNeROoP~?8g$P4GgTdeM+y_UXwOPwLSx z^kgd(FxQkqpXL4^8t0L-Tz0`6gIA(S;j2bk!o#h%+`SUJa?%Ey_sZk7;UwUcHgFPd zl;IWO8itLDZA?*)|JIg}&R;V2ebn7Q+G2B0d>fzeZ zsW)mvs~6P~l2KjojhN2oe9VgSpYLlef>#E4?8a(WbVt~I7iyw5elN7E1dSPnkCwe2 z%2}Qn^%BUwmJ|_xLFS>AhxPAi$QZx8W~=NqT8*9Fxb+_5WAN2D*?!93I5}eHC|Z-| z1#gk*36V2j9bv^@cpJh`F@QuQNd8KnLoS7Ljc!G0$%5cnphK_fYQzh!+{lfbJ{i?1 zLS183R}=g|d1_XzZ^A<5n>)_`8GXm**|0GRX9D{(4eZl)HF(W`=^KSR&Vj-!t1Eb2 z!nMs$vhS|Kj>#G#1}n%#e2DOv#`X$+GexMCwU-ka@^V9_qphpbNuGc;dgJBBG#S1R zAro)N&g*0RjMKz@!L4T2aY`33kuD)m^F!#}@fFw+F9Cf){XsT?q{%iYpQc%X1zV!M z{M+5iK9U5}%pOT#AZ-A;#6K|)sBe4f;d|U1I+-kabqMWFa!6SV#C;Ndnbg>(srZbF zk(0NbJW!i6fwf>h9dGMQq>N7Xc5$R7?`hVM6hA7wb2h2uL_-!VEpB=I@1$d{-ifz& zW{tGW*G4zDRyyt(y`i;o^=qRyx28MhFgJ57U96J^a3XNfp8Fl0N4FoxzJijs)!eab zdE)YCqU&is4y6*e-*f1QnKiegFV)oEUZ?f6PFi9;t>nEjGTLe4!LM|%QTD%UfX$Yt zX54LI^WLe^cxz#j8%2B_2`uZZeip8K^cZX2?xhJ=J<3?>>Wf{QUYfHSjHSODiGHyX zt3FquO*4nIVCPUf`0a|vxj*#hFrbm959njlxITt-(*(7|$EN<*`Z27@j_c6uwG+z5 zft1Ky{NG0t7pRvfwkM&1g}_|zOTy^98^t%WKLcAYjOABEf@-neYwbXn|F&pOrAmSU z)|-28QC`Z$o$|LUGrs(#4eg2rvTHszBFUEhezELbGF&Ea1uF$+=7YcOOw>*BQZ_g?FrJ{vc z+e0gpZ>Qu97T^wn_sYtj20U__-BBcpv%r)y&{{awpQ2cyo(;ly8|!YLO*h#uHO4k( zePyBSJ%+7(o|*Zzci4G<9({HCrxfe{w~7&1vxHTX2E$u2-%PK*XY{(($~BhDyat!a zbnK+pJ8iGm*_nG2BttefcGSPT;73#a>lymn|{yl8a znBRXzP(l_|^0EwPpe|rdOl|hC>X*LEu1t-kb~lWr((Cs$?BMS&8r3hmN{qdf)svSS zR+Jau3CNf}XFBA2w|z$z{MP=`Dw}Hlu5yBzEBT*vwQ~EW^~nvtZp41v6V*6&?(Rkp z-UDyIm-ky;zi4=KhIyUx8~uLH|Lr7n=CW=iq;{Cvl^0@`;O^klhT4|K-t>m4oMM`6 zzvs{~&51j9t*?QjFX>`_;pih?pZH=V`d?IM z>8^>#bq#F^H%ja%@9t8BPLGjUc4w)@%Xjl-Zx3{D%iWU0I_4t@v%%+!kKXS1V$_z( z;I&H9gHJK{ZYMt$$=jP(<0ms3N2s?=Arst+a!b5qc{6s0GQ&kRJX`XlNJ+Q=m~)=d z%-D_D8Mby5*$GyZH$=)-|E51g+u-#9vdECmW^f?gxzy~{uvmIzpZc7*YQ&thXgxKT z82aiqCs&BZzFF7Sc}y@ywIR<}#&A&Iw*BVGsGj+hfp#c)rRpC>#~zUarB^${7T7Hqpk@0W10w;7!{4B18)%_eB$R!*fd zwULi74aI~rQQAF1hL}(;2-Bld!Rcp9klTw>MRR8JN#C+OTRz_p_MaBX`4ab^mWb97 z?7Qh#k-g|2r5-`oaQ;*Hg^6F9 z$bVY$opvUxS zr%};64Q|^AXK3(OQ-3^CVWv2rWVN1;c;{mQMCoBavLM`*BrmD8#KS#Iw*Hg-`o;6+ zv?se7yTy;E*Ih{LoVbK=Y&OuBPNe*LVBARBkHEAo&m0cy0<`!LWA=>efwSc{lW&l7 z4OcHg1Dk5(zt z(PZVD8sWdYjP;XQGp6sx%9;v2`Xt`ER`PhvHe9?FE{?pYjn*^by$jch)|2t`s#nZN zD{CGdN<5QRtF>;QS2w>j<561@j$>fw^ct&2@|IuD(MYuoGbd5>_F~b6Hp~O~Eymk0 zBdofB>myE&5-z=g4kgXzLUcvfQmA7`DKw;A%L$w|rFhIxcRm5##O~CW?z{>stD$$q zoPk$CBU`E6iUtFV-nDQcqeG*k&ouEN=w5~^$75^ju+{`|yZREhD`udNSuJ|jU-`1a z@WZP1PiH>2_b@A0IjpOioArQtcoLDc!2XE$IkSwu^CR{MS4dauTNG~jr zQ^D>>86kHg)W_QVL)f`iFFfyNJC;Sz|J#kqFJkj+F6sCR(EWvlGj+v&C+DiI~R^8U&G!G)w39?IRTkaWXBF=|0|LNE6 zUarBOSZ_-z|I$t5?pImGJG-)q4p-Tg*BEGGF>YOURPXe@B70OvylvDZ9@flC!Z7>r ziE|*LoFUZ}DMABFi`hOmHZ$;vDNnPbUK&A<@_)#*ekLs(C zjUj{lmu!2VGl(*Lv;UD1>KpjSIOovrirK|xsoT+78cGZIYL=LBsDt;kI;-7q_Wvxkh|-Q4~4iO=G7++!=PGLRPbSc6=0zYVy5!vS_PVjufv3p3w(dGgtpL6!q7JqJD*KC9F8tXf^0& zUn+SG;9b;zeN1l#kA&pg38`H@QGbnDQ-r6>Q}fU{Z=!2yz3UM5X)Q+AMX#UQ6i1|A zCGR>#!JDg#OPL-rg<~0=r+2!By+LNa6~1_$&lg`u1J|>n_fA2%_)?}^(HmABluP;L zbh3}06}^3hQ7G?9ByXbS_}}U}#kH~vsLi7HFn#&avgyCk6KP7}llys6@OOV?SogsT z&U0(ql)Np_cQmT(SR)mWkZsc?ndrP#BkVvCG(sIhxS3(}YJY^Y#G-Akq0PqjWP9R= z@jAW_FOAkQD$a&py`fm?#7{OstBYyXjEAidtC7dIn=b;iaTa8Gfu|9(GU$(sutqkh0)_95zy^8><% z4fl-V6;G@DfM}k@xF3*S(?jbAoXlBl>R;Qj@+W+duQEx?HwXGiD7P#4EK6jz4Ex%E z&vMvX8tJP}aT_t`fqt0RvgmcwTeH4J6_4iFM$3i#p%)^^)e+OrCs0aVHJ^sYDsa5{q=M9f}5gsEL_XaS&5ngkn z&uboo*ObVpEc!g+ObAY$?OzKcD1%V^i1nXl{NV3 z(QS2JeWK2;09aZbHnMQV+s{&q;&K1yzis}@aM$H`d+#YG(vO#(O&=)D9J|Que!6M& z^wxX$BwA*fr~gBOQ7g93$EFv6hej*0#AQ zX!F)co4Y1#bI)!&s!6d?eX&b0y#y#tIq-<_$OFOJqFI?go_mWD!j*sFBWq$K5Uj?S zMbP7>uDaWIcGcfL>4%deJZ~7!+i0h}9j}c(7I2Rz;mJD;_xOiDBsPOG&42ko?XvHG z@W@SX%L?3@aZvwXTql723g__Q1d{(JE0=KOeklCS*3@#$yZw)nK= z@t=;TZ8=F$o*nhL{TffRpJ!wf7*YFoz>+Gr>tZ?W|CY@2g zv~Jj2Y(~Antd6`!nG&a}k00NHaq?>;qcV2fH=RV7&zP=*Mz%b4DQ8!S4sJQBCh?hE z`AhDkix=RXFBslg!M;%(#8e_3jzN2tHZvXGiSNMwB_Dw7l{eVg5clpL)BDF`Ykpxmuo>NyY-GP9b!vQy>-G z*Ep8Cv#PgQvom&jFMeiLhGlKqSd~Lq4kaKWdx*F*GbS{3`q2%Z?7|zk6}v^nqf2z%x;3R|K`rU1dQr&IeK z^{fvZzt_wq+BVOAQJBj4vwIqBzgmftD|x*i(5s&m8v9&3vv}XN^UJDs6tSzGw-Svr zpOM~3oofF??h_Gca75OK#S#26(88F%zFOk^4C_sLDqH?u;+b8X^=4&>e87s^X@`2+ z4fV(?qk3O76!S$N6QARk>sdEF`_Z!2->@#g-8cmt3pQWx&*zDT4u*~7d}Dj%8e8uJ zydx`l%7J4HUnqKKaL2u)Ci{^wXb7=aSOc00%*OBbtONx^!e*J+exr;_O2)->h*GY73}D29??*r z5`Er957VaCMH3-mV~~nwZ`S>homG}XioTvlgdJG-m%Qijd5-b0BcJKNPB-)6$uC!< zPPri)FZm(fG(3y7Aaf_KYpGA?a{qJG?aC>#Gujtr!4?*5xh|FJ6b8Mp2Jzpp<6$n!I@l|!!3{hb>QDQ3yeR@V!R(8vx@i_M$Gu+*NH}+ zRL92@gLsS`W)Ex0TU4lgKzxj%w-@wb8`E=ng*4J;MmlO%r_=tvK%2*Tm^ej^R9O(U zb7+_y2l8!YB6+ov#(SJxBTkFI3D`w@d*6g{G9~Y3d;trL487$V3y<>SKM3HF?D%^i zk}

EiH=gXOMmNj`BHFOQ|V57mi%Yv&Qxe@rUxV*VN!UH1B`RfBrK@T^(thDBry~ znZi#%Opds(t?4{40p6UvDN%F%^+pRilsk7PC89&SWD8GekX~ESYIqB+{OdZ0R zZ`ye_aGLQ(w8dGJ&Nrs9<7?lD+9O};eKKYHR7(k0_cGd1>6aU{Qc+^Znd@CId`~jY zzVoX273W`x@|Mj{n>vS$x7*bzo;}AO{}Z$&iE$!zKau@!eP8nXeRZE}=l)nbKbfGN zONimFhU){g;b3ySf$LGgU30gY8eC6qjg)eb`{ZFECzwwJxnlyzt)+yk`#jnSAvcVF zW@?{SyqZ$!j=Da{DqW4T=2&7)RI5o^%PGS%x;fh{i!bl{+bp(9TH&`ft2#YkEZ2!) zZwGv;(vdV{k_-~|x>$NRDtE?XuPv<@G(1aSZ_4yy3|vT*Gn;p8u(;e0kI~H9(o1Ql z8kbiQ2f?n9H0Uj zL}NTA7~|T=7|)|tm9}F91BR#eDFRBFIqLd8=3gmqQPCSUc@%^J=qpQWw{1Kp@ystb zT0GbsiA$<5zSx?!A2TKlajQ?EFB(0Jxpwj>x~_%?Gxj80BUNnn6uetg$n-0It(d`w zh}XyKNbgif2WNj-{0v*-sliW|Q&=)hZ{8Z@hj=Qx*&o*_{`=wENh2Q`>JGPl>tcv) zx!H#;7hmUXFzc`da#9*@-Kp3GMXh1SWTPv+MSLH@`UO%jTyK4A+ z-5X4aC-aK%nO?V|+?qgVW1SgY9m#sr=r>v`X7nxEgexE2j-7rTkK~W{>yY)}>gn<8xg;O2f0uv%ykMQ+E=HtSG4)GugjN{0PBMDH ztSJ;s zC3-BUViLi{Z)H`|Zx_L(H;QC^757k%h+$%m(djQwUtuD+u5b}tC$ZkpW23RwLkT8= zK)K}SRjqPxE?{4pw?4nSvLVsZgq<|j8HpP3-z}K)^P=yHPFYVh>xx8Xm`JXP+WaN{ z=;(WbNqTJ@W4@2Bk-0nr)~)N^WpK>YeR<^ybjpRqdUYmluVF{rx@HsW<@agW(>V{( zx)n|K4Xv}-$cbRwH&pdu2b8)U2r7>3!tLWnTlBiB-f%VdRMmWORk^Xw$`$w>R*$9l zZme{Klr=LLW5~riBBM>NOJ4cGqg{5G(Y96fX?j(kEEWoD7J*ChvL>!V?}JJuzuWPV z)%59aTYKV8qj%m(q|SPaGX-xdTrUdavCia`c7%L0LW?hBsfp$%kKGe}*Fmwm$I3Ai zE!T~noj~L09Z9dh=g>r0wUswSRRtm(Ex#*}AFzAs!;>Rj9jrp!3&*nvd|$+jH4#56YpXyWAg%P+6OHjlqo)dT!|cC|^QcduGwMm+ zn`>}nmj8R$UwgD!_KM~-u9;^4G<0XgI zi*A#5*7`TY?6*Zu$HsqLK$}EIalW#%*I0Pjy*}L?pJar-7r=Oi3*Hm7;pPC#8(F2O z;bHGx?nh%`lvz_x^4^6!Il-(^zyEoAuSiU}GSy792d3yX(yv$ZMX!~9IX~%Y|aP1Tkyuro>6AUSdgJTJI2nVWP9EJZs^d?mg6@b({5v9-0zBMQC4w$ zzsPL?I+|zfjUvn|c= zkY>C=qxngqL2yrJO3Cs*i0)!f6&L2&X9d=kw6|wo`&=ZGauMdeck=Ih#|Ax_S^IIu zq1?*vFVy};$-u^rFv9T2-f2GNVOQtgADRbdZ9%W;&K12q(yt`j;NLSjn@qTye>;&F z=5zHZJe%)pxOXp~C|`CE53^T9;qGku9_FM5@9F#AGw(Xc+kL=0Q(Ne%+2fcx1}R)2 z3x>rUOABu9Ol%&|JzCJ?`$%T-Z(?;V@n=!d04mc%eYUK;VXJs2>fuzGRh0Rfk1ZCv zt8v9-tfuEj(DOAxYc@CPc$^9Q>Tosh-2rt$AGJySH5TYFD=CheTy92r38Q%#E!SC+ zV$P9D(+xk(dtDhg z+R|NzK@QKGAtI_)0n_9bZ`X#>7?ey(x=DO#be@N7Q?P{w<>;*ffw4CvJ?caTM z^rYsa&z^eDcL`?sr2lE*dkLRae7@{|eC?xSe&424(@$R}rskjdoCKUK70g8&n4ZX^ zA<3KB41Hc~;?`%m5*v@~v-*_&>WtUqtRoF?_(?%~g)LXp7`8ms3~esY4|@-@$Hb4b zp%;n7j05E3E+-P_LyrzVnggRf1tYUMZCGD?udFR!Tif`d>QjCe! zIK(jnR?i!w@#QhxrXlvbp$ZwuPjaRe(z zl9)?oiU+Bf(H;Rmb9d#3 zv;48ZIhq+Tp@#P|tXsVpMD4xl?>AnB!Ky97s|F?$6mrd&Z z`vdip=C$Y8iRKM8qZMu|4RbUxtD4o)romMqxr~7kuoIhvEQoO21 z)|^gwI)#}!BABVDhI2eKGAET-a2)w!hS|TSzq7M5`%W6@LPz(?1bizWlTSBNorBXvI`eDFYheKRB6SNgXhTSnRqT8FR4S{~Ou zOk6LYhei}9=pv&+IatwtDBhDCEXis!a&VY^dXj^BlINTar%maVsCTUL$c(q!aNS4`LG|?xH?@2e%TaBWdo|oAXn*sjytle5U zeIIiw97!DftIeS-lN|drpCq3Ze6Htn1)u-re}wzr;Y};ELkWLPlau){J>x$aU-8s_&myI2Ono=UdnYdpG%?3 z1mD{pzt{LuZU(Y98^~5JXD$qdJQJZ1M<1WzwIA>~y(W?P1Rs6tBiet=;Nd?STwd|c zdnQ_R>$2wGScsh#KZ;?89C^*<`L6CXV+-mBcsp2R@M0O-mrgn z8Fv*&t^VY_eg56W+-=Uu%gc%0zP}>0kNW;Ok$Cp~_uv2Bm%g*Y;@86iAwHeO^}GFv z#2I`>_a_pkL9-60t_P>CrqssCi@Ko&vgMjr!i|ysT)mw*IQf)cDWoLkG}e$c%a}R$l9LuWCHXkw?nn(fnc7A$(fMdC&WI z=W=&4cWs+b`*&v#7rb{z6sJ**M}6SW$d~4S#p2J4;ECf$*K)mxPwDsI4WGBbBggOm zGx+nL=^dW+HI^s+d4$`CGW+x3&X@U!_ec5t-xj}+KHtpuWT z)Lr;}UGHa%2cov`RP+7i;p19P^Z9)*XV6*Pa{T@U!?7&<6Tn}1mtzH~n%}>ajr02x z7FvFPVc~C!N2R|;8h$q62|G|eee~DFmIDR@&;3KYG_xmJ$tuwlkcDX6?lzc$g zqwe0+z4#lovm;e+w1!Esh@t)H4At+uH;>@WT5`mE(EGnI?@zJv3%+C_y4>{Rgg~mT z3b>KuSk_BuW!}ZXQz!EhEuY3lsBLKq>b1N2CVG4M1aD8}?Zc0`)AV_=VAky<@C@F- zw`(Bx!6QDGx1|vZZbzsNzHJ_IqkBd4+s{*Sa?3PRa+)bAyg3uEDmq%E+$SkFWn8&= zf&FfM>v~&ak{nE0^d` z%g52zC#kLaBYNA!M=gKRr-_`m0B@&*sJsG}Qk26$`*F-(2g7ZyM1#`$TF#Gu&zijq z@}(RH-%8ZY4yf#B*h$snzRe%^41e6wycq@WYIvGm5j?Bi@|FHK5{aMjdFZW>=DM-v zw6j8U*qzFmeKI=DLu=)0Eab7foTZ{DTD@@_mPzPkRy;(4Q8?Omd`cy?GbDTx`u+rC zySJ;UXR_HFw>Ob^`nQrn?o7q=nc4Hr%vRReR<(kmR*&fYPo}ly{1qPk^TKmXYwJvF(nhUR zU|()cfz?|5l8uq$G${Kd>)l2?Xu+EdJThx62kA~_@rZq`uPv3~{KYB1fdYx}x9|0h zoCA)h*I3J(-8fy$k%oiUN;bj2fm?K10~F;eiRX{FfIy*x*J+OX`AG2b33 zz|GlP@9U6j&$f8e3S2J+uFHYzZQ#$%zaegcdphsV?mg-N#vPV=)>gxKmFd+={tCvw zS@`FsSC0{aAq)_Vo9T^(@m=(-*@y8odZH&;@6D1T1{V2nGW)}@hq+_cj`GA=D87;U zj68Z5N>TLUndD4Z>c=;}Xe?%}&!0(+IdpJ&)x#Q|q=vXft*9ASx|z~MPfR*VaHLk- z?mWiZNbfGuNKAjG(%PZ*<{ntDh)dgA!hhf4%wlGDk(q%Tji=7&4jW_%*w`yO>W)%@ zJt^*;xtvSt-rA65bsLRBnG=@#bCvkAubVMX2VYMlUT2h2; ziEHIs+^NIB=`Z;!T>jXyOAVaPFWGX!<#~){MR^MR;xy)NUfrnS7Y~|i;qtXbTVt!R_aP zxp3RnaK7Qy(RE&n+qSggIR$lP``0Ylw`79|kMl*>A7yV^vccSA{zPB){X6XYb(ytK zZE!RBJhP(s!91tiX%2(zBs@9V%l45aV17m!WDU>8rnr!!j;c06Lsai#dyvwO=%Cu z3GH9-d9xxE618AJf#(4?5mjktT%4+Im9(j%sz(h68&6g9;Y3lYI=^)IwSlF;{atv= z#aQHSZD1=xN>=K z7qzH9G!N)?=3#UQ(RAKh4tKR}FEn*7L5mp%LSgNP!;!tTayT4O=3|E=7oF*FB#hli znzjd_y)nG9qTVFq8#Mc#Y?Ow4+5eZ%S9&@kp3loNK3CDVFlCv+6#W&Ze0Q1F{POGy zw&is8!WY36VeZ@6zW`t46WZkC%d$MB48GXY0CV11jJ>i(cSV8Mihm%97C_srKF7G% zaD>TZiukl&@AKKY)Vsj&4{3v741CGPuQ3~0Tic;7q#d$rrr~ON@6oKI-f2*(^;FF* zP8TOJ6rM17ckKOH#k}_tyKan*x?Zxbrni9C3K6v~eD_;@w!A^k-Dxno;SI4eg2!*Ni^1>`%>%wiRr-I-_Zi7CU{~&k* ztdNl`zI79|tPkH;v^!INO3V_Emv`|KR?4!ji={swyL~p%3))HaQR5Ht-u)jKe^4R* zfKMvz#~mn6CFgAgTSeg}@4;c>28Qt4DQ+OgISqMoQpnB>`Nj??TDyctq39lJEQyCv zqs^`BVxqJruQ=02Zy9SdL4>5uT0b=Et8ZJ6z$^mIeNZD7n=_^tc~S+AWHCF#gE_i~tp zKI<)p8fU|GuVl0v4E;U!c}ssbc1UaJ4YVaaT#?%1P1eFb`gQRb*$0l-NT!%95ymzf z@*WwPm! z1Zl=?Z$&XZ@ljtDiFgo$r zYA{3IW2Izg+P`P5@geVFtgwuK&ss4<-UFpfs^Z@}(@@V489~!2*)OWk`Ui%fMoGTW z&Yhi&w0#4T&f4I$IrYXw3mbW6v;Ny>Z?pQQr&&&3(%8|H;8a%9C7yY9p`9D$r*!94 z+y=GXW~l8~qqnw-EBzAfB(r)4xOD@Vx67Q$B8pmOG}G7mGG=e zMX>L9SEo+L*|j>(OA{^M=zXeFP|!Ksg+`4+Ht_xVRsOg?)iT2$Wo=}XZ0q9=ZoA+uc_m&iAY;*`!vJvQ>(v2Cp&@nInmN@M!AtuZtB{_I2TEC0ZTUenA5NM z^~Zg+xfZ6jQcCZjt>t}q`Zi;t<-2ds{Ri!)6XbH2y6>PLHf*xcRd_?}_Z? zxBS<})#{u^>l-{BtUuk#7<5-GS;M6sg1c8bWc^zI_n4ssu&=A8<#^6#81nkj!JQ9% z3iJC$XE!^gk={mga=(X6Zk6=vBZUiHwTz;>Gsmvmj46$$hL(V&4N+C#GIXMBxvH9{?qKZqj_kO9e>Ig|I~~TjhyqBGG>hO zGNxDmIb&27m>g$2(ki(QHO5nRk21!qBV%N(rt6K)Q8PxX9Y!?|t*wk=(O@g&{x^ms)e)jqnl&IrrAy1%KB*>J}dxM3k<9( z5qwa7lS;>_0X`g*#sQxatXP=rz>?o46;R7U!p^~TxNk*wDR_pvf{ zCVkuRCpC#j&;u^zTYCvF;QKtjm+>vw_a2S^hU?AjbA+oW=~TK?eWSblTV1bc(;$P7Ot!4tdXK1y9$$u5-*y&U$oO*^Z7oCI z4b-mpo*kD5TK+Cuzg;J`d7f@>lWi~ODJxs3 z3)QtxYu`@%b4@SYZbYNKuH@`2twC$=tL=ke9N#C9Hg>uly`H%D#@!G4p!%nq@mBY5 zqTJYM^aXGrc0Of}Q&XZad4co49*e+P5a?!yAR20{oP&c|S2wZx+F@(=LXA69DWV@X zQC2xgRQBF;T(4zQh3Ac=Q#wnd-bj>wc_Ivs)PN&HMBs_<+0!jq3mxg{WdAQG`Is|( z#a;aqM#BCjjh(fa5o`pr?JS0I{!>go^eI6;^y<0!$vnHy*Ws}{(|(Y6qQjkOe>Lw! zVfe21?x84*!@l*TY}E6R*J?OPq<@h)My|%5y7xsn@{SC#qfGVZyjx@C?7i<7@Y|Kb zcU1nA7#+B0-B6%1aE90%T~k&4{pjA|Q}>?k4S8o6`R7L9p4qh#^jPY(awGD7WDjk1 z?5s*T3UPJWc9b(RTE`E3T|iVKOS2Ihzme}T{)SqE-AC!ic7H%Qx3BeRxRurxu#{IT z`dwbfA+KJxv61WZ*oV=`on00plImPmKSMQRJxzs#2sChAbW+w7L z^~-iq?v<_u+ zRN*D|=U+9HpK|#Xg=bmzx5#58nCeW%`!?>LfKl`SV6Os7_XF?NqP8bdL|h@*CPjva#*Gq*go@?;-A zKE10gCj|pu74U*4Y8v#uj%Me2Y5YvVyF=c5AZ7DOA<41tt$xlqc1G@qPi_TLL&&x| z{8hTE7N12UvcDYty4aN^v6CEm3ZCi&>zwzXi4m06GZRbT5cZWgY&VwHSZa{`T}fZp z4e3Jb|85`o=98S>^@lReVml ziC>$Cb)Q}v4AphcD`(L*3+2d~%D>Q?f3Z}GjW0j8Mm);BPVo7-p<%2;FjV+14)dfb zpD3UCJy&WSccSerrM*S82loI=D}H+mj82{PUNU;&8qbi);%9SfxmZKRzq#@+Qa(D4 zpYh&SECLJnC;g{x2JhzSUo%Sg{1MYy)=LFFeTX}5l*3#nT0Vzo){QaiUCF%@XfbO} zIgpR3)sMfKY)T)u+n;|^&h@gJUxJ8E%yG4=Z*dNlXb~K2&pXT;gPuH^77n*)&P&G<&=-Y;Y8j$7C2a_F7}@~ILNc@q9_irdpql$G7`}BdTY7oIHTFFv}yn4EhkpX zyJ&_8OV=rSSTTIZoa_T$gtju&%GkAk$?d(y55yfoHIH>ENiC->=Bqxq#bq-9O~#)SqyGVJ}d zZJ$lsw!JZ~R972W(6%mHTK=oe-T0^8GUY2BJK*JOf?8(>-ls{uJAnKPl#-q$i84$* z=w8$jmYU4`40(M#*+r@2`$nm4I`51xrzeVKQaP<<3>rU^eyIj|@v7gMW$IqclM~w2 z%NeGZ-~@KVpvhb+oMdk&MBD-9$uZE@H;A-f7ezO+h`~Zdz4Nzz}X0 zx^pNc=n5KFQ@fy{HczB>+vXguT${=gD!j=WII4ddoyt~^+|G(L8kL&I=(1$2w{K(D za8>=r5xpw&N>FA#S9*7vdH4C?{wvIeg-q5H-%>BL-VXD;g}x85dSmYnd8ctDddYd0 z=H!Dp#fL+is@1Pk+2CrfWr9^qhW-GH4U1~;nlQMi>%LdEc(4>;UOR1Lxu`elBn?A zdUBzuMchQP+dhe|m@3j$JyITQYq_e{kC|GP56<%O9|!M-Bc5ZZe?!pnt)>QzN%cu~ z+xp z3vXE+7D{0+ExgYP-d1~y&94yNd3<|=-sGUBK}!==a?8T|I%oz;3;HFg6ot3)FIN*Y8T9TAd>!F<6#?Md{mIA2 zkN3iu$4GH&&d)8)Z7MQ*4l_L9J;vNbPZ-dC_4}Av8>g3KzOE7GYh8)FZ<@beA2-^# zz7g$9{(vn{eYib7nW(n7J)Y&{LpN(L%yu{s_H)pC0SZ(!dSI4uiK z@Up+UiFJ~#`1t5_VD@}~K~4vr8;s4`+;N}9eF0`?f%SM8bqBWg&)A3=_36k5+z2I$ z+8pl`jyoUE;r!SiHdjO5>xJ?CSQPYQuHTP|>j}rhn*Id!%na&zbygg2tbO zQ+J@w#QY3;&%tBhI8a8^pQU+#wqw1H_IWmRGrNjz)MxoTU7uyGRZL6rTMc?!O5^*k z6L($T2WQ4{K|Qzw-Xw}%3Cve9@2p2@wsx878t`Uq_+I4 z16~SwS9hSc-a>A`oL-|io&n}1`eev^5WZ=jycl~jV9pw~Po6eUYM{DRCSQf-z(ny# zLe*-1^eq@$E*s|jh|6;9B3X+8#~UCgV8+MkP_`xTA2?aQYlg*(iFwVcNKJbtkS}}T z<+i4-SUqlUfs0iTg-Oy(F)N}2#*=7Aelm0Cyg(P@uhEJr(Dh3z0%5?csN2%Av2AJX z%mo@oqD*F;LGNK9awVUOb`{BE(M3J%v&E}K=Dc=$ufyDn```W_VrHW62`{VPJA2%F zqJIZR8@pl09j>ud@Bt}0;1D^)(oldrH;M~z{nPm}zRd2Fl##~M3QX-P`YA`oX;$(` zt0{x*5z>{TI5&5eFAtbV4NEhjr%b0TSt_^^%oi0lc3jlw?ma4P+tA4CjIx^EY*rS{ z#MYpkqu0g`ou?#g-quBIiJ?aFku%yCVZ(ndw4vKzEM-t}a--|_)$Uuq9$CX`c-Pi!+Y?q+WM^E|T?eLsp<#~>FJ`#|rB ze-qc2uOV%&2h6G6^3&S5lTmX*(*WKF8*4Ha;FoB`;@3;lqO@;u*V5D=5l=Qk?j)pw z@=Q*I=h3K?QF`-B`mP>mRlr8R46!#xlr)Pt9P|!&Q<~@XJh!Jl;axM&GJYQTemfiGM@w9BWOBm%jUzx3jpjBEm?EMPc#NAOLUJL^I5Sm3s<_q ziDkwT&VUoEz>KE8>ry*t`z`t_z9S8H9VL{tc?YFm@=H(Y%TQW(X3$Id8g;D*rfLd$ zl`}*%s}_pd1FHDOo{nS(`S`B>-RRk8%VT@?A~Uy_Y4lnRl(kyHTG+bm*1$jcN#m9$FlME)k!V{IMu(#vv-|xWk zKM1@|Na;$aT8NhonSCsltDR-;{V34l<$?R*W|e+5DBbH{4R~)!=ipqXZpN#1h3eV- zY_Hzj;g^RSQzq1!P78ji)X#$YB~#R!L6hxK^1N}QO57Ec*kZ0StKaC;eMP?6-rr4s z@QuX0t{*dfkVXUEt%g=R2RMIB?@6ZEcEn3;zjR*_Y`Q;$PsEjY-IQ=WxgaQUuDP;Q zwmEyJ>Ce*O>6!l30Oz@=CJQO;ikuiyC;R2`B?mncY_|r#)W4ZQ{nLZ;($YdmC4v%T zmI7C|o1VRGehJslj))fD6)ZJ=p0}r3em?*25{ZrYrk*8+&B>?kRKNEK(n9$6g!zuh zpuombkB|VeS7LEm(YsF0T6tmR(7B93Wqg?!)K_=lR7Mom$h(ne;_1<6(RJ#}kad?? z8|bnf@CCd6pI(!JYh^gOu!b{8&KIIvx19Pn=8Zg`US zq~7i>Gyp^2^?lu4{hm%k2ZPt>{z~DO@zgqNKhg4%iKb?~oqA^#b#k_g5^XW-F*@HX zl)BO|2Z_U%tT+}~K|gDDb*1T@GT7?&8m(K` z1K@$3v3ubuT1m!2i;Qg!btYPl>s7CIAQ5d#vNv@8xmx-hEh%RIb3sdY4No`m?l+At zd388A2@c=y=^Rzd zGy1)&&9z3V6aK1UKSbUW)#U8Tcs*LNclDUn5z1m&e3W{EG1QqT^Jrh4F1-Y+wBJA* zZOdHm0rGQLW9Y}{sFqJc2KJjMNm0#!@nBbvU>ee@-%I$T#DeFl4Q+OmnY@>4*~REu zetnXEPtZzZDjAcLTGtxz6#XqtcwV30>GA9AH~zxvH;%xcJm{r@GCGe#?@lxCem%IK z^6OMD#U0c)y?HJrR2~dr_LbK%4wt(P>@8fjaBbnTjM^Mr&NSD8%cG*UDyp(@(a95* z2P)Q7ZI9CSbgnI2^$Y={IY3x-YoAN*VP{aB*-9;o@*o_`=#BdZxwJXuQr2-nx|dytdjEJ$ZG8;=bVL?>N7ez-+#`` zX&2Kk%r2(u>s}z2vNBZ5(sj7$d|R@15-szvu=Tc9CFGSuKVU^Bo%%YTH}H+5G}kJK;fR_X7;J>2=)4mTHAv{{YR z^*RbiafBOVPvdj3E^lF^y&i|F<8XZp=i<{wUP(uuXf6hbE>x~5I~PxYgU*-g=3*s$ zT>Ht)sp?g8;QDLlpkdq`++5fM{8iH%w4hSI&>YlFHSxJdL#*-*I$VmtE0A-VXPq$~ zn@@8#SE5>0k9+67C=N{gPGsM3$Ug?iB1)ea|1KigHILPN2EAKS2&f@nVou(Tt3Y-~~}q z^vLal+UoZyiWfH*tL8OWBhzZ|#Lt8m`@OAT&EfIl!`3T5e2rt$uvHRH zjXud=NIC3xo#^VG^?UE31>0xOGy4`6I;*y(7HuzwPpB|xG61+7LUVmsI=qntP^;ge zjVRwJvuD)pm99`Gxq1hj=j{nB+5be0*I(fE`#SpFexe_A_Q(!q)p)?V6L%Bmb>}D% zCq1c?;CE{b2V4w9UJB|8wY(b6cucZe2|miW=1>nDQhGi|#9T#6YTmnv%s7>$M@opW?0MV!n#v_XrV{6)c z(9(K%j$03w!!C2WVugt6S;6^RD)06K+V~93kGmVQJvL55pK20yAd6*v+Vww0Mue+# z#K1ECL`yDMgK>7yl8(4WA&-Hm+Xd)f{`SidE|gU79S5ppLGW6&&Q}O zN^8<{q8#l(up_l1h0b7)a(&7IA}8VJ7z@KwvZXZMVh zpPI~Ep31DAQ99k={qmBld6VG}17ubbKI|t>i8YqIbZ5cQ;*x_o@anFl8n3Eoqycn8 zompejdf9$+l9dGe6*HuBQTo>23qYk`dr-8W!j0xci3@XV&sH_=;6mbXWY0OBIABlYg`5w zZ^%`TdrmO!YyEM*2!=eCn>J#{eeF$$A9ufrhKS-pnENLjcW>aes2=y+;EDVhH$`xT zJ?`kYr7Re-)UF{WB^@Gbh#^lFq{Mk%iD^WRp5xRU`bYZNvzy_~IB&Wuh(&mdvyYK|GGU7e*%G6G>K8=oxQF@6d|TdEe8WUbv)UjR!q>?(>c5Dl2`I z(QeOw{`V?TZ*0eO3JZ|co4W#AK2g4Tv+8=7y098MSLDA|x2I8MCcSKa)uzd7Vx>r$ zehhkj@E6&a)iq5q>tR~E(o;@(UtIw*n~=L3z(1S)Oe=U9t755_ zG^Xq8#>`3dd$DT5Us_)r>s;CKqdwKx*si!g*|{3c)@7&f*-5Qi(OB#|zi1HDwq+}+ zzu|tgJUclX?TGe!FAnP+`-aZk+S*}j@#{E{z#>;!YfJZgTXUD1){|?(5^Y_2(~hyN zYrn|}2=u6Hm+K4lEb01ngQTTOEF0cwqCBj{AFaPDC*5&J-maL6Ctge>!lBMxXg7Bi zG+&20d$>MW9Pk=T`@IJ#xyRTQtV|bNd+N{M_-+3hIA}HpylV=q=a!64-qqyGHtoBe zXE<@n8dWmz7zxEvG-+%-J-et+;%6*Ow1A+m@^d z$pY=~N^55cW)GY$|uN;}<#jMb7dIWk!NWFF_uhi=9Z+3Gy)MbB&E~ z4ZAWat^xJ&Y$C3K-)#8L;TrpyPe<#?Dz5PWTw}mH8T!Q|<#P>{ne?*xRhtaBhUH#+ zp=--E;x&nDKqvmwmm89XYb@#9N9F->f=s9QNXRwB4eq5^X}AVCpHiFP8vWi(AexSG zjWp$MK;PU?d~Td;%p1owzK^HHS|o2k_u?8K)yt^;qx-!%BW)&Mlk;@$^0`ZukHOp( zm)QlE`M={_<|BAFEFZei@Sz{UhvK!1AI+yP)6m&|6z51Ep>E5w1kY2cBQ+xWj@SP} zz`gFRdh!dn&(Gmv%>ftNQ*1M%tFWs*>Sa+$%Xuv~8)J^Po0+$qaiY>MH%x`Ajlq+S z&F>sH>Ug_%qoD}<`|*2!O1^;&;zM8TZG-2Xm2K^_*4$gj5@ZcE-UxSQJ+-rqezcVa zhzZ#5&Cky9%e|15mK^Q>{{{x*Mi1P@{W^w;EJO>k?N5dmo&gWtg08sS=YLCme&G1Z z2lKz>6YxJp&_wtjXa9)5*!r9f-hk(Ozt_#ktWB^9>Nqy9ak@7@%-?POJNZJC~doXDO6?>z0(z>c#%i~VL#T%x7VUuRdW_~xhf zakd41aD!?6>Vm z{$Lm4hm5Z1u*S`U?eCO6^cW{WtwY)oSOKmGG(K9`@?bh6|7f9p(P&a#v`BX$#5w>kNczKixpq^vRTKjJEno2 zzU^b5^HEt|EB=^9l8A@aC$v^~o{?#_y*gJ~UPKE;(S;qGs0>b4J04Tjw+M}GoYJQq z!f*tvv=5u5INc>ThE!$o-_qj|0X;_XTXY%6?}Fmae92wyUlCQF74xs`_hb9)J7#@7 zDkC=Tf&*BNf-l3^;?fGyKk-Y5YB_@izO&Dp>_gb6j|eP;(?mOIb;wAGa1IwU@AKuQ zGWW|dU(g>@)tJ|j$1?1&*p~#dm-xI(V=XH#Akt=XqoDOuQ8LicxBR&~d29Y~HMQh@ z85YcSbo|)t)#KN^YQ(n{*=uWHVArVa$YtvZ4;*g&5!^Z%ziz)bH*fvA(p6YZ%uni* z_m*)K`Z;~YLT8&9hsE)3db=xtj>Z?|d6M1Yd7Iedun&(-+F)5a;Ca=f%vDM1+w%S1 zlLmr{KXLqzy|@AYtCrNnJmC?D=8)GKRO3dZpLQDY9j8?*4?JA(@wJ|!*O+_pJ#psPh?-D%{o;yHfX@a z4#oN#a8^{V%G|L`ZA~$KR8Lip;$ruCcNK{>BnyAI zV>FD@GOK=uJ18!=-`iuXl6i&>e?B6txWrsPIdUER<~HPC)Aq*p8%D2b{>2}roOHwJ ze{BuvddpL;{623b*$(teHSO~*@_(s~{X{(InXcy0vs=vh08Vb}K5M^`9^De@QBR~t z*Nn)&R(s$Y@@(nkCg*c~GA8xIKFo^s;qIUhdx!fuwMP8&=3uR%va#a#eJAj{2z%R( zq~EMQ%co_3!>iE5+VG9x)#^^L%Dn_nM4ET@__~kf`u6-g-=^O<2mhY3(h~o>2EJ}! zVsa|fDb{*L`Td2m@p)2P>6SNE9CTlK(w%$xE$-fUx&267UdcH;SI9@c)#wnnGk3R}xzp(si_PBf{hm&DRgC^Q&}IN9 zFxFD?KD;jzkL+0DK!0!ec4NEf<`Odxn&17L=4tOVv|sCw^gD&jdf8D^IU)9@$T`%X zLI;?{Ij~Fo@6~*Nh0lNG^Y?r}#f0nYKCjix?m7P-bMFHmRdwxspEGmvhY)ats4-9+ zFrK}~J0 za=o-SV5-zYm`oBILd57pO)4>YziaPvGG_uo+TQ1VU-(RZd+)RVtiATyYp?z1>=Ouv zov>EkHj)bw^GwEI-C9YF>=YC;hbWMG$tieg zkDCjg>itHJ^n1CRdS!`7&4k8rl$EH;^&M^NX+vvhsuS@Yz^7^Q;Clz3E^8gO-5>Z( zg04cPA*rGfE&Tw${7=B!X@xE!t{fg}t|L6T)vD5s2S=UiE4dAD-M@P)*?oZoy%`fVaX~iqP_vJ zbGdwNmM^Q?VfP;Xy7DI|zx_S=Zm%c8tWI(WsHbw@J2yipO~NV!Pq(V4@^$9xyGN*} zOHNU%Z=A|u5v~KFJBj8T;r+k7n=r8l{@p^ z9k=nFW`5QDoOL((?)aaJ$5kFzy~fYCmZbNL;7eVCqxhPYU=rVzm3aE}6*hy?Za*n@ zub;iQ*HB*%c2*{2&EuiLwORJd`PwC?0E#)wfZp@GC;H(cN?(jE@Qq9k7XB*Q4-rGMU9;^7!MXHpNyVY ze3(glI<|_O{B*dN$Ud(QpQv)D?87RAZ`6w2r1SNYQ$Xe0!uqm)($bTnzPhZf(9s{Z zs&mwmriD3RD|bw(J%43~nT@PrGLGe_ak2g_J$77FU>MW+y^QP!z|s6R;69KqW2Iit z8OkJ+*#yNUy>3!^ls$PG>X%fw`FHh+?1^D_MoPDlieS- zBm1e?nG0+?GptTeIwd4v!7+wW6FGZ2er_0Q12(m?SL?*{?45bX$e8c!8B@}*(#oJJ zXqR*hOSz1aB)zt1J>E#q9O^7Qlb9{60Q{1+gcFn|UqD`-5pIrqs(1e2Y&1%Lp`u@A46|(dSGwp=+F!SzmO?ho6-4MXHt;JoY#35tjRW2v!SXMszjcmRLSTgR7uPh?*7;9 z-@-lX7ceh42f2Q?w?Tce>iotDlqS;K!i^qh;?}M5NY_Z*x>nU)akzC}Yt z0kf6&|6A4j|GSkQYIQte(P5^xDx zJldDyk-$PE)#*#k%AGnl%r|AEr>{He=%VjVNo21g-EQM*nblg4D%)k%60sH}Z-cy< z9o=!y9p*=-dCw9#Ge>*L$h%}^;m$ksJ>oj_9d5CVsQXqP>b=62v63TC;dW$S%a{d) zmnoWWhCfdEa)LwBNiTQ8{d&M%vKQ(3 zI;o|nWzh2YJ|h>_PP53g;g}I+%+46o${!BI2UTlw` z5A|LLhp!_xwyoHn-kJH@Kf3WpswT2il{Rj*Ay#PEv_8p zdbacK@XF$y*wpcFYu?CdmM_dLCRBDiqu(ABD)pBKSLF+bXObp*ez*n>3(w@9op8^M zYRzL+v2Y3rQtxksx%o<@N!C4DSf_F%tMP;B;jbya(jUq59Owx51neASWRhMO?vb0_ z^eRgW_neDcACT}c-;_nl)jEKzqrTg_Md`fB zjiO;SkJ38jdw!ZrDax(+G`bV(Pth;=-1UL1HaRqu;G3<=lV^qaW)b^IXsosS#@5$$ z->6}&B%fdXBE#6q@7S5rSL$qCxSYPSTyf&f-d%xZKY#nMalxC1<1gTC1n;WFA{l9O zMPlDh+qrn>?fxkf4v56;yglKg&9=O->jxd1Jv(oAzSJZ>q0=|_ySDU%)f%&WZ#pV( z8FqR`ek_y>c-7jo$R2+s?e&9cw=}P{8L6`d zB{u+9f`sNP$(?CS?jGbh7$dn8u?a+SgV55#``eO2T-V^rR<5~+<$k8Hx@++ZbKiwe zNED@ql~!`(>@E0_NPKF>S5$P{r>VBzrP}_2Mn7#YHE!t{f4G$!(w#ETW~JXL)u-IL z+$3VnBbLs!jPY&`A4yRDdk`AHQnZ$ZswbA{Nnk2{2gg;=er0~XzwYiy;s>^ zK8dJ16=dv|b7x_7ACNP~s99j#xvI|3+T4-%v-G`Y%#6?!POYPo>Q}YalG?)8J!K6{ zebeX;(eUz3Bc~?GY9!aIfEznnd8ezjXF9dYv}Kq*e6`kB_hM*pzvGXL-hWi1_o~}= zD*4>0 zSNvp#FcIr#!{Jio^ZM>faX)gnNVyl`u0Fg(xf5}(J^WqePR70Z@VAva3HM!xZ&2=0 zxXTXzFXbMA`*yyRDeJq;`|at}z@^sHDSXF2|URiWG`)oVu6VIRu;k9Zf zJ?rBKg39;Fz?V18zIXr2g~wT!e>*L1O6mdGeM+4>&*sX64tYYDM|PxU6oq>h+I*2% zVcwz1W5s10Z~5K0ZP8@r&J)dv`?k@e&EtjV<{FdFWZgwSU2&49v2*|Pv0hWX?pnxQ zEpkiaD)PVznSXufo2?TU{6@FaOA8ER20wdV z<9yS%bXD#xw9_rBosJhcy!I+yr$dF_?To0C_QLD*L0X@+X_Z)E-fmn@8&XTwS;ewD zp6BrXq23Gp@Z57;opBUidB+G(p8DGb*p{QPEib^f9C3iKLUAh#&Lc5qA=MWIa_u-v zhs61|ii3qtoGd%e+#zwks^X-=_bjNqz~;Nh=6lv)U1r&Jkyv4FvKSRU&b}&^dLB4s z&)_>~PjF`B5R z-ul&edz|ss2Q{25<}`rPF7{fE&+Ap^mVZM}s_2}_x5#C!P;MpD_jE+~UIHz^+M%Qm zv#%v1s(jn^Q#GPSchtk|YehH<%&ZFvvy{a6`A&mAZzT6Y$l03cH=B<0c8=chMpIzT z?#vUdBB!WD^I+95);aw;fqo%W?JUwW)K5P6l$nFfh~z9eYg(_xK7U_*q1ApzsYrB_ z*~q#Jbm?0m*1f3d(raq^yn);`D{G@7Z-;tr{;*f=)xAMmM%TxjGk0?O;!uyg+cQp` z*3v6QW7KyFG4EszeQYIP6z4mKd-HGECV9Hf6>pE;moYQZ>LEl6P3g zn=|Gz-&7W-j6s>uIv)GH!nWF5dTtU52+dShdnr9#tkZ7fN7f9_rS0YG6tW5w?pcY2 zuQg@`F0Dz+j_jnRlA)yxT5<>Tl~bCshE}HXy~WPAfxOn)`O13MI+gEr)N|T zZsyu@v;TVbA2?J|1k;zu_1o`k*s%u$)430;w%x$q#!?>%WVrEB}@bYH1pzP*v3b9U|W z+;ga-eD^zj@VnpV?UgtDh1U~4Jd;w-L~=y43I(#V;_Em=J!kFouzc@kl>I!>er_Oj zqP>_Sy_QP3>wbsbMw$15@-6Q&P`>587>xaX_x8c>cRRXrEZ?=A11S&YVM? zIMX%wZ5$Z~Mf&x+&BVi62j85lag&Yj*_eh-jeQq3!YqweQf<=zf-}zOb9;K+XlCU$ zN@w&8$k@5Z@BBU#eP2_=tqkm*a$~8iAx^Pn^KT-Lo)+58k=3|(j|5&m)p zftE1IC++Z|p4CTo**zD&(`&b2DfOcp0!m7Z*NTV8iDW@5mJM}mg$xh^b6Z0*J zvx;>MZVpS6u$u{!Ra5#bme?8Wv#f$S=kY}5M;{r9%&l};+7kZ|qo3># z^0pm%SZ)UvJ>2*F$#jj}B6Xsy$oCok%x#l$v%bu18B0%)waUUnyzk@Ynwk8{cOxIsDQybNmw*LP%r`sUQ*$UD*(?Q!HWI4Ke(v;Jiy+@8CAII;}z4Uo3NI7%k+@7RQU`X6UJ=w^5^3iBLkSXM8 z9RKxrrbn~O)F|j!3VJ2wWbq~vFOAdi$(}LfUh|D1yc*>1xO?0jcH~g>vh1btZuCKM z-=#EhOV5qWRpmX;aqwrnSH5<#@f+@b=X~>g0;Br`HM+0jloaX7%T#$C;*A1H(ZX9q z%qqhz>K^LjsxQ?OOYY5+_lEVXoKaZW++KM8EIr)I>LK%Qc008#veKUOw)DJ3`{^&E zKk}T@9!?()tDE6;T@LZ>LS4Rmy}_xA|D<)%eM$80d(sm0U2nJ7%gHRX|0Wfp^k?Ve zyz$|TDAe^xG`@@|tZ?x*nWWhH4~{ApXOXL+_GF{Vx%63~O2#Jph8VO`cc;*6&tnHi z7gz45T~#~MJFJd@jlWX7H_#k2qV z?nK-()c1-PT0Da%d(+TKsx{D9o=o!S{7^zfLyFw>7X60x(C~*-!cJ~8Pbl@~52X|xu4#)c z@l$fhRwYW#GqIbIX37#>vR$Rs@lRf_G&F(np>reePgETw?2->wsoRT0j%Lc+l)T|D zI%%b{(?lm-!<>7PZD)0DiR}Z<9c0bwJg93-alHd6YZ!;r4HQ}{)x7wqj3sK#)AhyC zC98_kie|EoGG?D%1-OSb`^$KLVjORUyv@x>dRO1TPQXRH!+OuDA8D=$JI9mV6VHZ8?(> zoV6-hIX%fu$WA(4yOWKNoO$Vpt-GV!wcXMd^Yrt_$JNwSkMUu4!QJCyndWiK_$Y5e z=n>s`ttsU2MeAcJzq#ivl}gTRRL4*f9sjhwo2EE}HsgPE9Bfwi%0y?(!;OQ@>UJO* z2NO>^4m$F{w~@-CYi-BX`k^jO?jw`dU&II~v(Hz8LQCwkBy^se7Wwk(&^Wzn)Cu>z z`oZx^XO4E(3Gu?}rX*(ux`{MHPy7`RNh4ZIWSvu0*w!M+&3x}s)&R9HtiFXAOHDKP zREjJgQs0!AnTM=UlH9lyT@OFR4V+T?=pp54+QhPJVfXDqX05VL)7YWoC&x1DMN0_m*h5i5Lo{TO|A=>RA@;5X$J(F$WUc=^|v%CKNFTAJ4Ow#G! z@BP%4p>*Iv+w)!6$Z!>Ap(;08&D@-RJZx8kKsT~XVczcN3=uS1>_8QIlYN)12W zw(x~Ftts8>czW(}h___jX&spwdY>t0st(8AXNql2uKGM>b5Eze#@)>Q<+1mAHj`4~ z>HaJCnPU4K33Dg@w4dnuOvoJmUe817%jwa&op^UdbI+^~-FI`cw};G13cccSvim%n z*)eygL03UzG``s6dLKr1v6^|OPw!@3fX2zDx7uqd_B>I>5N5O<4>MY+Wnv6RPj>f0 z26r!ndvf8Z+^H*fFUWYO?_N06v#Aq1#WnYb#AI&43vmTrLfzXH@NUHIJsm>AZ@fY+D0GkB9+7C#v{_}5kE@g!b{(6bZO>pG*V=V#iq`S3TL$Iu5MNwM_~@9c&Ntb0J`hvq zTyoLU+D7;RJNM?EE?Po3)D;su`>06gF~Zu&xeMv!KH0ynrBsKr^5rR=Utdhh42gGV z!bg2b;+8>4+w>vf_+ZcU55ql+Z7Xx%hZfvtCRccn zyT!z%^=c~GGkV(jgS}zC03bQ(d|$V7@{!XOc1|x0<`h=nWf?xF!cLi?zuQ}(TF7h+ z_f&q6@Yh$>&aLsGYnlLZsz--(G~0H{4Khs-ORdwG=_|)(eo9qn{@J2&DDBj zxr~vF_%h#JO^tfd*X%!W^O~Ap+cVp6&qQY9+VV|$T+>gxOIMY+ z$F=UglaYgYcKR-~?Hrq;Cfo~fOBvzAlJ7k7okPA0$hYaR(kUe}%Nt_fM(6kkd-mIN{AO-tj-~JO)-UuL z!8Db4Ixc4>IK4xuO*~Ieh-a)m(qix{CA@}_sB&FzbspqGh6!*iS zoTKcfc8;mhyy(vu-abCaev_NNnwa~_KtDbI(fp#&Gs= zm~Re5?c+*na}xWQRaMcU@|{Pw3_0&%iVdySvDKY-tlvYU%*ju@^G>gqf8*otURD3` z-uaT|^Y1^!KDW!CF|_>Cx|8(f!js>(hQ)C7@3_t{WT)`Bl9rVH!ouD)^qJm zHzNmbiFRaDcqMmN98`D5M!ETU`_PAacCa%1XZR&wq5pHC8J6{dow+-el`SYU=9{Uj zaLc_1twUn>py}Q84EJtj3WVi9lraA zPTlo8;gv{61UYxs#WGcEOWQi91!7w&%zI+80wFR%40BcCpNRWs#*lS``!inhkX10J zEeGW6w5(uq%YpOev%K@>#B#Xu`D4T)WhV(on$^8ldW^V{Ti0W4g=A{1$B5>Kb$w5V z-hFv} zB9Av0>OB=%?~xeJiu%d(N$!ZrXK+vYAYaJU>78-d(F?NTou)>^=osxh(_`I(M`xbq zIRbh2u9DIEAn)Y5HMVmHhwS}3dyedeX^rvsodHlfM))A3g`9tNcooYX_gcM3c6RJ| zZR_v9|6XJ)_n4Z=K8dpz>!wP|ci(Y2{8-R<nUVq}>9hGtG1 z)Yix8tEawa)oFX#S?#2UOaDzn_5>Xn9F!r~9+AkYyeAkdquS<@wmH~yoozwr)X{dk z#nv!R?v8{H&s#laIcLVlaCa!XDXg=~H`rK9#3l9C0hK%wlV@W?S?VG)d)O( zj@JmaOc=PdMZ!#TY^!JL{bM~-f5!oZU|5A4H?;O%fAL`>E7al%g<8zqka@OYB$;(r zMvSsh>&Ti=%ZQwZ!vAvX1L6P33AH?sR~3#Y&(48?BXPzpEk=+u#siU{Srs;nFkfXi zl3ICY8d;GfV_{32VQfk;zSUyZTpj5e7)Ud6L#>j&_eZaEBpEp^X4wOg_Xh@MIALX3 znwG2^e%hYccx`0X)StF{a<7cU<@_k@4LtD|sn?a1A@MEW`bht(fg^^ILtR5HKBFpb zL?GlnkLObFc)!GXy8S<($H>iz_;U60b9nwTVOHSDc2oG|4|(HAmu*zF`}|dLXYgFg zv5W^J^Ngw&%|PhaIf1Gdy}Sx?F6AdSu8))jU+I`X zt5wlWrb$v>GU(Cej)mT_lzG-d|4-w{*X!{=ksvf29T@1$_EUHN6MwS0zYl{5@(Vi{PFmggkL|Odi&S6zryp}D$aLv_Bfqi20uT)Vt!%XJr>%1@Y^)T zwo3b3hLPsMooxhZJ0q#ILh8Dq-6Bl}5M>AJ zkHjNG$)OGH@j-dMwIeAfG*;q`$O(BV$6qu$w+l|a6d=CL!@M^ccTdeZvf zZ5;VoJbUcY^^q@AUU1se?TV&gsAWIANg#jPC254+Z>o_g^Uv!e-4DG&-5!eEkNjua zea6g@HVn07`JQOckh(%U?Ut5R|AeZalqY4y`9m!!^;PXsULtX5o1_HkLzMH*o%9R( z^D@=1ZcypZFmB}8{Kq}#2a%bOm;Nx;V}!;cbkK0zDOc62v6FL(2v^< z(FF>Qoo{)0t+?f3aT4pFhSo)`iPRrek|Z=qytT;PXxxS${fmDS{^Dsr zZMTRoeu?MxZ~n^$!V?1MGWwzideE&&=t3~ml7T#QGd>uBCn)3Ft)54JCpw=#sQO}( z&o0|AzB6{53ja>)Qqo(Y2O)L-a_2`rLJx~lN}46JtZp1KZ4+A4Enx z`armbekyccYSRdRk}RP;^aSNEZ{1BkCYX#Kpv-n;JW2XkicQ1wmnu0`>#<`70 zCK-p|$zAZ#k)Z@X{nRewPSTpj4Blxn zor%8>jPuQpn7+_hu{+|7`D6DGSKJd9hFZ#V2i}kKKN$9t#)l5@pf4J*#Z2QWY`-#o z{~A8S_*SbC3_WfJL-!{bsV%!m&n-@^@xjoU^sO}E1%+<%1!vP|7PivRe3 zcI$1Rk^W~H_qBZr zP4T~77nby+DZ@v8asJTxK7Z)TX`|Ois!5ydLyw&wRO!#XWHxy`>dIrSE01rt25g$( zJ@qplPBhj>&S!j){1X|kkjKJY+T+7G+rVUZ)Tldw(F z&V-H|%8(!G_CQWu3$oWDd^>Z(`UrMv%Y%9Mg)N`dYktJ?J=k`fI>nj6a3=jo(jLBB zmvtj$`2xRd4NMERiCl)Uy+j@t5S~bQ-PB;)S1Big->P315!$65DU8b^hqDP6+I_hN zkzcMDIP!BzhkrTsdq&bgmqk8}fneLe^85+=`3SoWNjK(6!aRZd8Owrg1*Cfj{~V*H zU2KC{jE~*eE@Jy-1@3D%;k}U+YI*d~wb*j6b}(i}MtpauT^DQL8G&$X*0c+;QN`|g zy8URM(5~$s$KDy`54AY9j_8#CLz|2u{uSt%co|>d?Fj1o=pp(yc8KH^j||lE+{(JR zeOA`v?a97iyO*$3e-Ql{YR$^JpML*J$Mv5LbSC?2+LaAPUr3=Hr4D8e^iU_s+a&(g z^e_#70 z(9n73K&S9DQEWltCkh?NR$}m#M9~GR{?u(&;IVd@V_D&~@O*8%0i7oFKIh_jtQ~zK zzYWGP;q{17>m!fB?-3WTkI-kZBXXD@gj&WT!<&V7&>{Y>K-Y*btdB@LNF4fwvh#AV zb%ieM6m&?=SR*&o(t#{Xns>=pbp3O*iOiu!B6=`g}i zcbq@6rc3I6{>Y$0zwP%A`Wx-=dW9adyUTMXzw`M`<##2&8~Ek%yOZC2{2t}^Gk(9~ z_gj8@`L*!-sN2pXOdkBs=Qow#mHcktm&fl;e)sWvl;6+z{fggj`R(P`!tbN7%EP>` zuFrgw-_Q8{s;*D!VBQxZjNi}r{VJrwj4*XQk9K7oNv7U1?=7K^Wrd$^&&F1gbSI1R zE9B?%;`|a>J7pa7X@qgCjHb1g<1#hr9UEXjo1`*$fNY(AJET&K40Wqkk6<` zg7l}Gao2#8!4P;ESO;DS)`N^yNxj5v#4UAA$TDR7Z8iN>%weJHi)&la;jMFRn}#u7 z=^mMnbU%R2d!LMpw!K7MWUf>h{P2CL%MYb4*pODRI+A6i$XMIz4Ho(mgZCTBLFP5& zPajkDPY$n-7~%Ep|5Y+@1pBk|48IW>1^<~_jWvSU1Hq6NyDllwC%QtH=giCQq#OyC zH3!2VZb|TaBHx}!Jj2&IaEV9H=8P zIEk@ncBrM>wx9nu={+M-TFp>sY&H430S(v>NpFJ1ptO;+*9zRb3Hv_ypWshOCvqV3 z_-<%CgLqLclrvuKN~_3h)} ztN7*l8TNAtUrZY%5&nJh@lvLTGEDzkRi6P<>W8px6pVYG#dV#ND2Jt_Kk_a zucSMK7ScO%pvp&vM1GFbk0sqXr1NBjT7$GFGMXeZwI*yt{;f3FjLuG(xu!#YV5QFB<*UP67Q*fjQG?+ed_kHSykr3XF=T_*gg zvg`FV%9voM`H(b>wJ~W}qfmA3;F;8Us?<3!CUPn1BrnFA);sOICKEQ2_#*R?kHgEP zNm|Bkv*R&mNi*$y_mQvD-adGLAK~*DLm4|;EcA=$3(NmFbNKrs-Z1?#{QLHVz}x7f z^$`!c3p_lEdH*tOFK2B*#^MP1W~1jAhdadIj9>Ci@W0*8T5LGcxIf}NyL%b^jyNko z1C%w9tCtj(G8ZxY{0hp;OUwObdF9KCN^VOsjH~iWN=hqKK!N|7`PX0PFI{|l!IBDz zpI@p|E-P5RJnyywq}G zU>K5>;%(`Qid##U-ddhlLc{WJabCWEN#1hR?o0EEp~5gK%2%joSK(f=qP)DIq{4s2 z*ZhlDEL~bqPS_=vTw1nbadFX-OK)FZT5{{%81-rx=zSxDA9FPW-EYkB^8?Yd#wz~! z3AlxaOA3pM^KZ&4UQw|8)=QQbtt^=ICI8pH<`F%N(zwqZr=IBcFMoq?1NjQKG5CX(+~DSzexZk7B|ppCLsn3Ko=V29S2B ze||+~$%{#(md;HCdvUb?)3{;>=hxYdzA^OVPNS1h(CNq5gqr78e(YuGWksF7jV+TS2*>zV9zxO8>a61g-6a zYE^J!0ov(Q5y1kC|gkyO9Oek%OCpKZ)>Yl zl)pj0iBCDR#x>yuscS6RgKZhxw6$fFnA$ykL20@m&Qs7BCbPlq`|z#5^AoS5Htz+-twykJx+OF`&yKaS;V>5ZY-zG9Apf&yPczl zr%jzxurzN)am7&9hz|I2`HGT?qGbhx#)x~ol<`siUFp9|jnT@C$}e5ALVC6C)JT2- zJ(|u(S5U&`$1K3D8(9*rC=eTA{yilXd6n8En4yC+oJf*F%zTp|(Iu6AsOL-YHt%1>9>o!uA7 zkVjhC<@p((5Kwq=VewMq>SbjWFlhObJoMr6f;(4;a0*$r7MzWpGyGFzDnGwSXhsVz zFRJv*;E)Ha%a;!_T@;tt&jqNjq9vvI6oYM4ipnb>ya+;c^9Tp?P{-2fi&l{8j)D?N zySU&s$RQZ=(A4?s!Obr^ao!3Y)zHtDYLGwZp6TVnV4bCGUix@(IDZb3Qv@9zctTT zKsZ5zX+yDTlgEs~?z3ha*~F{j+1E!(`jJ(nzxgsYO$)7;5mXhQMvW)T8b;cxXkr5znK0nQykyVnfJMD08H!t1p zQ^!Ab{&6lI$1C>;MGwsc@3q?z$YUKf%~}rurZmZEwTYXS;oNOIDgPvL zzemDJ1YIKc$s+fYD1E5xZ*j*nMwy8|%WqDm2eOAL|J-dg91XdWN7|s=`qSrPpESnp zNiZ7Yef0^(`|-1JzmP!j@5rCw^3nW0QKp7#2RChQw>$qtmn^v3EkT8!C~NLGe{WiM zxo-DxvN>FR-88uK>HQ6SK11<&9lWmFuy=h{W9o?vuI3w)x z2Tb2&Yq4>eb(3);(F!G3#Z#@1-EDR{Zg<+@-0pn3c0daO(92SrnV4=(Hl_`sVYkGI ztuEVJX2Mp#w>z!deL88~ zI>YUD)9iM;b%Q(nME!K4UUa8D9olxhh&+uNl&6&Om3$l1v>Hugt2vsp3nF#y`nvNU z&h4i8bZGd$5ywq))ApD;o;!i{+ncOCqm9K@{b*yYiKrU;Mk^7F(O2#~YW|Kq-09qP z8!p@}({A~2$3GpO4wuhxY2E$JUDn@Avpc@q?atHfcE@qk><)Lk-D%zKeuf{pqHFk#cG)z^F1OF+cGDex0lNpr+jh@4C$V@}VfDuu>rCt8IO9ns>1-{V z7a2yQ*=cTxH{S3D&5iNKKFeB%g=|^4-?wskut%)rYO#=CkUvA{uB03ne-kG`v(W37 z%>@$YtEvseF1<4?-!L9Dtzf)SWBLtahiN?$Z@ex}W`~>Ojbq~6?6IDYH=gt0{Da5Z z5pV4G(6GiQ-tv9%Mz>|X5pR5IRpRay`W_b2Hp-vppfeD$`mSF7mTH6zhecrQiAM;vF2K&9`xce-NDdB^0 z+e|zS@z(wXrY9Ee{ZfZc`O_{Hc>aN99k~R_geLK|X&um6s!~u&OL0 zn+2Lm>oE((6oQA(d#sR!h1-Dp5sQSI<2h-{&S-e z^F?In9%JW8T*Xs0KN&wB>ATK)jHBLyt$6N9F`7g|-j_eeiyHa! zjQrUue>&w){qxlC1Xp3Yd!Q*T=z;?wV7!c zdrWJ)N4jaPhi)qFE|c80h(s{UqpjUE*8XquKZRUW%k%RF* z75zHqY~oIrVXzn_r+QOt9UCNmbW9vO&0<`dV{I@E>9Jc?2XNEtc2`SUwf0L{#^vTE z4@>k7rqvK<^qXrvo8rumE#(mrc{$G75NEs^Cjm^HAw&9>{B!3yoNjT)@kzPPJdJV# z>Ew2a^{^Kq`Gd!J)?5(wm~?dlc1WWJz1Djkql(pLudzYo)-Ktd=Wy;V|4La9rFd_g zZ=Rbx2g5h5&opaH&X)H|jn{b+k2!{@J0C>nJ{fa|)-gx&JVkp3Aq; zc_+?%ft81NVJV|voYlxGx(ZN3-ymN*o^$i*D`v(;L=UL7bu;9tiZdD7S!nN&*4Yv# ztMj#S60pP7I_~+D@ zv~@7cZ*$SXGG@e*=UM=o}8F=nIUYsf}eYQa@#C!_XbJ- zIsMfw!}-MjMJn@x0dx9A`G)bBX}#p3Bj%zSJXV9pc*NtwhVWSXJVu=eYrXuz%E4Tb zKU#+Vu{FbvEwTI*y)h|u9=#;CuI_enm*)<5yWRD3hcomK%DbCqxkKm>yL*y#1!{(N zb=j=${-V?CzT=nlEU?)6kG-p0V=iWlyX@0(@BcaZj2X z!_nj}w@~srU-3xBqRdJUHl}H^7|$3wv!0ZkAp*TgInmpNXf>%gDS< zbdy^~hI3!+l0CP3!Z7mX=81caSo7Wdg|xA|JygBS6K!F4eckbke@5LW56ap_ST4zG z?Ru@5Qk%@Q=GchM$*crhczQ>sQ&X`zV`X}hIk{won-II zP5VFNcJtDmPob0_?YCpo*f*Y5Q7_A>)b%Z;kmpDo-H${@e5u32YYXQI9duNZ&%$WP@l={GhPOY zeV8rJqwRafO2V)g6@w@?W;}B110U(OdexY6UL|@Ec2;}gC;g?`V?E|InmyA|T4L$M zaePrxSmnlpp1FS`HI67G^Nh+0gmK#5$)k)Bv)L42gTr zpzgSGrPbt>g@WB)J(4rOW`gph$7=Q(+ayW1#|ok}Jk~L~ug(8dn>;!pb;=a!-1F~VXsm#cjJ8RcTmVc1k+T;(179dsfi`M6C z>cVV;x=^D%vIww2*Tu~zw|lsL6w(+<}U7D=Abare9#bnx#j+~8rYi}MhOO91y;$xe;6F?I2i*6#0PWQ@@x4old%>XGOdJ0)h6d|5RdRgj9o%nut!FIb9j`21g_XNg1V*h{)#?te zZ4zxWy7!LU#m$9qx9!^Kr*_^U)pdcDvKM^K{qqbmF+%wd@Ia;f$G|vu`X+yNU)7__Zm#6d9eXE+hT=vgtpLfdn2h+Lh=cdVU z=f`^4)P>ay7@u(D%QD~aRB)<}@gmNAkg2}x7O`#}m(pb!n`9>cdR!u>PxYkMoxi)D z?y}tO>c^?SV_P}r&AwM{vfIOXvzOvIZ`LRtmf4!)&CPMEaX%v~@eT1Qb!>PgB<_#b z`!*+*@216Frn_C;;qLg|k3km?-Fo>V>oT>*uG{U7<1Wh`K3x1gk5YFcQg@kmp7eZNt;C7pk9ETNICr^jcd?|U zaJvo8klFqCPdqPpjqS?LohQ#xP&}8t=rnnrDq9@sRt1K`QjD~PY-JJ3m>Qc`itIn7 zS$DB+S;&6F&FpVD624%Yc9u~`FWKNk=4K8Z6Hern=mUbr^i_}H^mJav}r zSifrBh5L;-Yg4?@6ldXX7VT0ez1_%_Jfm~j3)11zZ0mWiF>fObh4DMQvOB?6wfup9 zq{)ypUmB$2d(W6J&`8Z5>#aEBn8$iG&UnykZHtrr4BXFnCA^l4(TtE~?T=#vmzO)6 zEm^?qu$YOii<1S+Cxs@+GkBMrKi%@jUeDb12<2TmSl+ekgkzixSnFkmG7H92>H+IEwgghK)y%ld9jbk#qLwNm$ z{89U!@UUY&`J6Rarwb>~Q|l{CMjtb`z|97a#XNMM5UggPaFkTEnxu2Jm#o)hTg;hn zsv{M(XSPi3RR>Ue`lMMcX`=SenX=YCEA1||e9XSI%6B-M!mXp|miIYl|0j{>*A1b6 zguGj^On4TU^q|Go=Br-W?cT<^glRp;I*4*}+aKZ2o8yVX9_Kq=qs_G5@=6!L-D~;@ zXTSebugvm~dW}6EE8;cYQEvJ&;hmmo#93$e)7o{^DJp{($a+!0Vq$i)waqk^%4uAT za{Mgn!cA36cU|0W-QP~M$>&HJj;=DkVosS(R#(W1%Ytgpt6uX-uehI;mTC4%M~SF_ zk0pS{Q2*TJoQ~VAr`_>){195A^Zv6`wb(P=VQRT#s{Rj^=dQckoh{`NV2=^WDP%v< znt^T@e%|Pwi@9lc*NG)5Wava*>$0`}be|PEQ7%tRyZK>gC88RyjH%{DbJ+bv&9Y+F zZ&sVfyyhETj&P{;whflm#Uh+Yk<&!R>CluZWe|}v)LQVV&dy4JxYX(Y62IK#xaGzj?smJ| zU^p3d=R=ntlu>uMyRO5Aia(z-P4jpzXQm|H zey|vv^KZlhbHNI*0;~i#fUChBU=VBqC7(7syw?s-mh*KyF9xf@b>KR1D=6`&bGA^z zH-ZvAuTF;-gDM=9@bq7Owx$ML2W|l8a29tX*au2JzF+I`04U*&;AU{ccKy5-lyHMH z^(sCn`D_FwJmV!DJ`a@euyrQ90c)sS>sK%r;5?e7AG&NANpkmpsP)OUmJuLXra zzTfEQ>pRM>B|HF1_(CunOx%qegE?Rh7z7u98^ML(esB@k4d#Nmd*CBj3;x1-D%b=H zUB`Y89|Pvo(qMH-Zwr3-p0) zU<#Png8YCB!SP@*=m)oh>EJPN66lK{4`4bN05ieq;5;xB+yKr3o4_ov8=M1Lt+X$g z3eE%fgE`>FHrf}Q)K2??J3wi_{h)+rzOTcp!A1BN{)Ki2w}Sa#Jy-~)cA)RT09XcQ zgB9Q+uu}Yo(Fg4tD+Zvo-s{%ukRTuo4V|9iM%+#`-<= z>!%&Td7zY24N7>U9o}V!_u1ho13G>gm`uD4pros}!&8lZ<(~!qVl;B%)&6eqn3Qkz zujvKXfqh^dDDjRZ=UKSXnzhU`4@u{zTFP*vco5(>Ugt2p?@F(7z@V+y%<>g%|d(nT~%4DB*n<^{-h3CV#PiO)i)Y z=7ZBgp?k9(-e`x&{cCE#UQpG0a{roj_-nwe5)YK{4zLz~;gtS0 zyTR3-4YcO;ukr6?e7Kr+1)IQ0 z;DWjRYcjwJFaU0h%S+y!=n>HmxV1i)I{QfmzZ~@o`t_C~gIoJhm2fM+*0@8zBVCvh%zX^E(H-m-XtZ(

o#K0MD@q{FL0iEn&YKi>{YKHXptoc=u> zz6Y$qe+(48Tz6}~(u2KV1O9or{cD=Qd{FdZH7MmZTjd;gk+U`H|X z0VXd)KENC>1g-|RfVE&PIIk2s!9uVLtOmQmEuhq=!wxs@r2Hnz1yjLla6A|S{h+TL zc>^<6^slJ|kKL`)`zz_M_;bNJuoB!3Hh>M__7!oPb> z|C$O(AEZ9uLU1*>1q^~=P~!L5;raLJ@Op3q&r{dJe=q=U29JRfzwCbWrRS+&auxDL zco``1_ki;JfE`}*fDUg2C4AO{I{vJOba){s`PYJ5!8z4BUIkc-f4}Wd{{iide<3L0 zP2dhN^I;u-E4UqhJt*N#;4ZM+exCe89ljZCBz)^5I^F&s(H{5p(x4_!#;ItO6&2^B$*Nz+x}}ZUyIn4WQJs3(Ue_wn6*1fV1#Ve**aiE1slXz%VHB zw?2h_!ruT&_yJJyYoiXY*@WB?p79gv2{wT{z~E-;3GRLdeFpk|hCG4|;MRnvf_+7Lv z_P?Y5@E3wYe+XRkF5{`~&)h-3#=iiR=M~@r{Oj!S&7j2J3g&{7euLfvb3loo4@!8} z%g8a<2yOt4oyZZG0&WH~zz{eG+yX8HYr!&5^4V{PAG7_*yL9|aP~y*fMaL@!>+#ou z4WRE;>J82T_kd+!Be)-we0RLYIDvmdz4rTmiyp#X3?2h_fzoeMU)RrrUuBf$3n*A1M#a2Q$D1FaY}BrJcZC`{6&h{ZHfz zHiFy1sz1}Ozy`1z>;R8}Z3n2|dyL};(ZgUmmb^Yzo`_Z$U2bw}Ha9+z5IPe{w5&2h0FfIJge~7CSt#4f()d0d57uU>!KG zo%(<~z#U){xC`tB>%r9bkqa;j+zn>@g?fXPhoSq=@DY^qk~^sn{x(p;le^$2xEqw` z8$TdD<5d{k4`v=EA20`$acngx@ftuw#uKnt%Ks319t?m6`7Hn~und&=3%Yf987SdZ zU?Nxtjt3h+Ke!(h`no`&&-h5wHy)IHW`Po(WBWIP62HR^Fa8*N3x5!l_#L3gx&Qwl zhlE#v5?%vl;%~IW+rTXRec&80`AA%mnMf8n8j0gS){=UiuWc8Ega(fI@eQrNbA1621X! z0_#9|UJ<9m_kiM0jo0xjL5bf4O8lAxcnwZUByX?`41>Ilv!)FUjgY=Ve+9e1o?zpd$ST+cs``zACj1$o z_!oh~@7}T6-;!nIlKhFXs{%TOdciG`hcKCvH9j_8x&GQ;C2!_Ba zu*rVjVTb2l2n~c+f}15iD0I}@;h7g96NKl0+rdImp0BpUx7dE`i^x0A$Ac2zm`vM% z+2Ap-5|niN?eK0peEbw-g6EBwQ0IfR-KFpa%mO8TF(~0xcKAj+e2X34Vf&K<*qp=* zf|70vn2A3O&I8k@>hS4cHvR_N-vKVdpF9mY!~VzwCH+D$hwut;0l2{q-(rXFvi%1@ z$-mF`2fnQHUjRxz>p-cGHC_AXfD7^GgHrAWFc+)`rTlJC(iMJ1m%9!W|9(*DNxn?` z7lBf4we4>JrC$5(@D5O|Q+`#4=Yo>YMo{Q!1f^bKQ0U3c)X#%pG5$SZ8JK>#4)@Q{ z;Rj~Y7KG=|LT14**Z@xd8hQ)d4u-*suOkD^<6zl@GgDKxdXMq`@l$Y{79bO4a_^w>Wwie3C)6dHmQy=`*;6iXS zxCpeCz)LU{%m>F8(D%R$a0{3P)`B_URxlr|0~43(d{aRQp9e~~|2EnRoDMdDIiS$D z)ehfdhj-ZFiwbr822kQ97g1-@6@rpaE!YNHx9jIAU>N^AP{JF*4lwZ!cmp^nencSgQToL5c4x)BXS``D_3syuMtA9{|%M&{%$$}rP4sea@M|y?y?CAHVPS@i33a-mmpu@7H>-fA6*S+H3E#hyDY1f?L4@;C8U( z_4qBg@CJ0?MsOFn3)~H6%%HAdb5P2$9@Oz=)SdX2;32RWJPa-XkANG%qu@?Z($$`6 z;#-0u&jp3Q%E}u-v9rU*?*qlo>{-UnZtxhgdn4oN3+6b`1vh~~Fncz00=O9Dzjw?C z-(>R110}x1$~!>e@3->8ImXTgP|9@-6#FSR8#y@FVw6YA>K|(f7Oc_>6~wPn4|zCEb3Ik8_r}w;4Gb6uAW4_;^xT+dE8r9=M@>!?GPq zj4b#_@{?tSON~4o6ubMZd=xArzvR1)&v>~0lVv+W$#2iy#{N-I#K#uW;jS#;1!9$8+Mte}ogy|L=x* z)%%3MP5j>&IpP(3{?w5p!ybP$9rXXJ{$%Z2@$VRQl_Nght80AR|5iA@Z%-Be-^%Mh z**R7I|0zCR@7-7Uj~qW9AOD}i@%sN%&i|zUPqyOq@nI?Zn*){h?Y(t<4xjaP)?e*9 z{I5(Wyw`PVf&6|#{%N~Y51HSH==-OC{(gMi5yA-^@?V?-z;^x-IbYp$>JL&*2$WkY zxyQ=**p+{K=Cq8k-vXY&QJrJe?@EUo{geMFjaU%TEQ~vm$$m67p{J-aM zV*8K&`$82TuFIX&*T41E+o9v=5y2fzv*4+6PYi zz-b@&|HlXZ=zh-sQ@q2my{G?UqxtzQ&cD#< zApdrD=?v+zXU^#(=_G42}k!BA@dtuoVrwu ziz|j3ds{$Bw;x;&&K==%-T?cJH2U#iA@Xie>TwXf4JXVEv?+k%Eh46ZvmJAZm{v&t-K$U_C5+qdwYMg*$C!;X}sY1SIRga9|1v{X!36k zN;yyEZ(>L4SJB_{NGIi)1oi@VfQ4YaNv3?A!RE-NU`uc#m;)ZQ`cwH|jmgH}+JaJ_ zeqbT!`QIjF@r#3?Zuco>JhTMGUyDKE@38X!)DI71=MwB?O*Q@J`P(Yw_lYm%qv`#? zU0@lQH_h-DfGv=BfKu=9wLWJtxC)eKScky5;D6OWCtYXScQGh_w$aMFLGdSNI$sI~ zwt&(v!Rt-?XM-8Yg`kvYy_I)@rT9bkOvA6}mkWuPe%t{{f9wM#-=h{&W|@9yX>l+p z?XeM*d1DVK=?;Nq;Fudt`neX@fYOgULFw0Hp!jc%*@nLi%s}1(%6zdO6o0C5lfhn~ z)Vt#NC?mc#@moQ$w-*#YKMczJ>CIcU=NP}q0i~bkf_y8>Sr1+YdgJM^)o0yo>f_Bf zImol&?E+K4&R%@B!ne8K9KEEm#Pyu(CIvw^(_P#lxVC$CNdue$BxQ zcGEeLSbHI8JG7s@jDpx#e z;tzuo-|{gNzj3qae?DcW?bicqpl=I`-<5#kA6u+`pVc1$Gl)-l+UFF5rJ(TFfHE&_ z1*Kej!9uX*7Nai)^OzSmK4*A4LE#+$rTqNYI6dAQfeR76>w`DHdh_WP^uqVnGv4~h zTQBWFFXeHznf$!#inreJ=9P-qiBqj#D$YN7+kMVQKK%J*Q;yD{`1=O12u$ALbM6B- zg3=y4LFvCk;Pc>yS4=98-LiwkJ)YFXM@6D1DK9|0xb!jDb9(?Q9%;<_N?Q&aA_U>^EC`;GlWUh`DsW+1i%=YZQmY43fYj34j1?p@Elb<3&N8^OOB zdyPP`w-FS3yFjs5aXoRA_$=ZZeQD~I4NCtF1~b6vR$d0m`h5c^{C%MK%@M0l{=4C4 zfs#HC6n-Hnem@tK_2C}ykRagRQDa7(KmtT-RFu?nP-lIs zI2hTjV|evIY4={>CE!9(`g=Rr2TVE3$elrvmw{5hO`!P4elP=c&NgxrP}-q0SPv`# zrGFOM`1PQ)+kQ~$RWHNv+gj`gO1e@o16&4*|84}OUk`wizf;%PZ3K$k*aw;tYJkAGQ%-n(yY zS>La(JKj3640!|kCJjva`+-}LlN%bjC76Mn4>H7^>~l=Jjsc~=w}2Obhb(5Ci#^J* ztBGkhZ(VvAS=!xOpL^>P?|!t#d4}H>l=kx0Dc-u*yALl!FLu23uXjJ}-Jj1ze-`wNG2+q*wsf4;H53!H=EHvxa!b?p1d+Xd&t#7^cgtw0H*2CU9x8l0Q+XwOP-}jP_ zTnD^;3va#R?UQ)>Bi=ro)85QC{Xm%~mVx4@-a6P@|9b1)it7_^U9**RV@cN}+sv~I z!9wK2Uy!B6`UZ%gYLAeeTf-+wh z_BMVv7c3+5u16X>fn+Q|>jFoB6ZG0ONOsU@!C=!3=OWD0UB7Ih=3en}AZjNmgDA z4)&4%K;wst2l<_i=sOQKcogh~K4*x*WkZd>_bXyuLK7|?&iq4pwvRCFyB9nM*)1{a zm)T%4^5RkQf5flzuz{HUeuuW$b(FtCq+TUubbIn2+qOKlUTbcpLMy zu|F3S{eDo&eH6?FTW&Ge=f$Apw*{1Tah@^hYJ*b$wqQSSAy@()1*Jc7o;CC7Y*6-z zc5gG|wd8rOr|e^S>!|&&nDw5wPFnD)Nxu)2`g`joZ@qYw_`$^Yd(G&_gCg&;@n45^DDAWllzJbr@onEQ`q`k=dp#)qxC<2C|8#%STX%Wuk^|V4 zdOB~~b_FHBitDm$;$_~m5_RG2kTR{h;)}^RB@Ri`if?(Q7~%H@m@| z;Ij8j`={*T`si}MzSop@4Jhrp6_onz0W-iOptMW!hX$K~vd^;nBf~ogir)RJneX!~ zE(Rsu+b7$IEc;hG_Zi&(vGsFMc;33sTd$pJedn#~Q$8{6HQ3@BQ0B@1w7#o&e{rhy z-Y)DtkG+cPz6GC}danVc+}lB!zxIKWzq{YB_gNQ%vyf|iX82j4@bf_7mw>`w2+kGW z=f*##gL2=r(c%G6)-5St*!qHtkq?7nFMPmYBT)P<50rUemBk}q3*;t$GwCORlHOa7 z2ER1v>sibO#ZEEU2=vym-hGI7U*xT8z55hzJ-mQ)C8Rq7%D!0kLF1Q&;6dVZzB2t@ z2#Vj9fs)@Eum}u(&A(>_7lJZ>?FYqw!{3v4}E(UYJ4PXYi3zT&I4jFzKDDkU6 z@#j;mL${!Bi@xGI)Vq)Pqw7)c{^AJsq<@pYHS3IpUD9?bp8 zr1RF(74J{>qL=Gx@Th6W3{cA57R&$#Te%cG6L|sH4crS#zqvn~`KAnPg1iCj2p$IW zz_z~_yZykW$p2gGYw!Nz5OyWs8o!$IbOxJCK42qo6)66tXlDE8Z7W+&?+heZofUNc|3h`Z~)xGaI=xsLKt?_}dCf z`SyasI}Ba|W+}Ja^Js5h=0Dv>l#));Z?Sk3lzJ!oT=S1L2+QBrpsau0S6%XxKlvZU zztA9mbpQ5L>)}7TZ~Na}H~**g@qgOS_4aWq?$iFC-k)8@@5H5F{%_l#_4ZvW?z4LD zkL{)08I;?5@900hPj;$(Q*XWN?E`xIgh#P2{_nkKmU6zU-}}lcG|y+e=jh&ge>QsI zuL8q9=G~>{`O*gdxv%*74p8*_K^ad+t?cbjdiNFH`q|s3_4ZM{{Yh_M*W1ta_E%Gy zxq3f$J1F+|f^ET+3tVR(co>xY!xy?{9+_#Lvt%L5btunb2`Ka4Vo>J2tzbQHKPdB$ z%m3ZV7aVHR|99W3^VZ$ozM8kb7>xb#*!SMA+l4IccL0=fIv1IG)CP+Yz4!0D=hJ1x zUq<{+un26zKV_5l@YXZlK4)j*vx%P#E&!7+HnO+=@vf8JzNhz|L&f*;dXes3v453$ zFU#A<_4YNr^^>>0^7c9F@z0MBEBdFk@#E&8^iMBvBj~g-?OhL)dd>yqy08gs33}_c zL&(xTZd=nn8KBr{3rf0Ey)U>5y4R-fKW9ueUz&_Dj8eM(@2uZ@+Q7O}8H`BVA!fW2X$1>(?ew zuA2uy@!xPKQ_tq0%yW~#&H=7NU5$P}sQtQ|tM6|M!9vQnJ=f?Df}#)S8GQ*T<(&;m z`_Sp9BL%5xBudN=B6?B;+{u0l}iG2O*bpJ3$QKnK2Xxv z?rqAq0+joUtUjha7Jy~Q;l5^`$gP5t_TQa^A1bqsPg@&-`G&tA(r3Q9gHmm7O6LCL=t zI8gXtJ#aU8C73n9q#q1Qd>NPxZU?12-k;d?IX8cnVAn4P(C@3_X=z8TfAmLBUs8e{ z{SgJj`GhxQeLCo>!8DxPc{mr3LZg(k7xevWrQ=i%JmT_=g|{ZLr|kA;x$lOnPlc3l z&Q)?=hi9sU2RZu^?qKx#6W)IiPC}=CC=+Jf$7dT7dh(@)N{(AX8QpMXg(Q1K{w-a? zySTSXSaq``E=22h{390<71%eJ^AIwtG-(<)4&ga|eBE)ce@HCM+be0`oGs^XS@^1i z=Ps2R1yg(DB+C!-i3nfB@dxL%KwQzAn)@QIKT(OP@a<2)RUw97b&ez>3CFR7g*r<1 zecQzdVl(s%B#*U7v--f0H_@z_r!fs-qU3YODr~BWD9fURB*};GV5pIFZ}`p^bNLUe zBvE(6SQ}-9w3)EFLP(2W;>uA)l06UM4I%B6Bpzwo8c0jtEw-dDAbfuUX>d(QOMj&^ zbpd3Lx+;gUL~)*V638CB2qVt`g6 zDBg@JZBw41#^gg;uHFlip7(cb+K^Plan7uJwRq1%%3rPP*hxqiQt`pVAyZ4?m`)6H=ZP`s2FvsRM2xe1B3B(LNkJ zyh(kiE3C7sTuquv>VSidLp=wVVZkq|a30LBC2?^cT%W!K- z9+eW#T20jx`q1@>2|w_Om868(#D@~T;v7!s*^ZIzRO&lMgu(uNa!Btx2pdDzQ!IKW z^{u){DajM4#kOk+R{M!krl++fSXduAV=BG!c}PQz6m)8JWin}!Q0z~iTA%olQfw@x z-$^D3C8a@;!s(svMH*$&G^(v~NTd5#Er*`8{YL6%JD2*_k^5|4m9R8^`l2>?Q>FyP z>drMt^^K&?QbWg#ajK+TNTp@EQfI4WccHJfi~VUGk)dP;t8#WK$yI<;k`D25h4SrK ztoUcALQ6f~5g#4h0DawH!g6M>y1`0K7oiy39mSYhC{p{<;#H?er`B~VwL%$j6Gq`) zseP$S)zbE&@FfhRFY5X#)hYy3;3nP=s;h!G0;zM)g|=4v$FDR>)u+W&>WGE}w@7R~ zw{Flq|5fGG?*ub>mfCExsy@td8oWe>g2}fl>5Zy;Mxno5Jw%u$soJu@C!(n6ovO3$ z*V^B;m>{KCK=utqU4`XIBgxk1)EA4S+KN=a6OEd@Ts0@$U>w(^is&hw;o9L)t z75{75NlRdYQ1u_bANDb|Ph#$$Co!)z;ryHWPGW{(Mb&TjBAnk9*C8iu3Ij*g-_w%w zadoD|EbSpNKgq=;=&L6&EoV#27Zi!#GPRJHUIQfN6RzMY$(JKB9otLH0pWyv1109@ zDv5bsa<8K8)PF~EscN*x!-UfmZLHE(FOc&ZW>%FpeF$YsyOgzq@{hV)Vit&nv=%s; zN_}Z4GfdVD8o+;`HxYsMGdNelbDFq;Mu88>H{o5%knEi22F?%ozLtn*X|<}(nXf!d zeBjoAFD17tQ^W0nNzA(`9p6SH+H$OzU{u{JK zU~^zTDgDhUr3z%?<*Hqx<1`yp?6_&!7YylI?4%8Nlzzj_{1>jF1=8{*1LarE6{NII zZKOqak?~%RBrSy`0T;5G)H*GvV2tBPg!%`Bqfrw7(OJ^>lN5ecnM`YPSOXo1bXw>O zb6WqFg)CAvt7!!W=AXS&3chq6=ap#P#%(!O?_5GSVQhVw$o&az)?v+I7>la#I#IpF z99rFR-|j3?SKTgAZ_~-gm2>eUOd)RdX$do~reL(t^_ysv-(j>|Qjc7!|JG{xauO#f z+YZS};;TEV?94jQT}&j$oTiHk@LD0a_-Sa&V5J7`H2EKFOjrqyXQ%`*=RY> z=_)aO7EAcg7t7h5D(4yN<$U3za-O?E&VzI=?_WeX^#Jy3n7Qmq#%>Kgm!&Sc8E3k1 z32vID?ybyx^?t1-uuDl8H#$;(##O5Iy`PrMQj41r{y_KWJwlTNPHIz3RJ%fE+&1b` z#!|J7YD-j`r7~%UYES4yZ^uPnLMK#vQb+SYpRKJdbxvKP|D>aTi;I4nhOM?qN2i2i z>`t|b-mIg~jf<{IV^w=fM|bg}L(`^0b}^N<=3iQ(s-1EcFw-YFl($%oc)P zM(d?nmI_GXt$Lh3EIL^P=y7aL)<+chCb*BHX%rUGx_OVwT!wmRF>Ic-&EDO$Gb#brXLYZKMAQ=hFwcd07rWOZ5U zQ(?cXTcKEp5~BN7!Kk)FO_eBJ<+dvPgmS8NQ|t0<+GV1X986`}s#}?ItMybJ89X}U zO&)=I%r8OrnvQ-mYBNjSHj?O_I{NQkw8^iHx{dj|+Ux2UiP!DfMm6JJquQJ5Om4PJ zOX$*OsY`B!x=WjBSx#rlr{~wEDuoHB+S|G}vec_wC93V#^&Tuqtfj>}$>AMssZ^pR zWOC0^)4Q>Zo1}HOi>}X7?MG82da{n*DACVL_i2BS6Lr7zZV2Xz^O_K>3%xjo=qa*D zSD(a1e_NI4soLB>Z?;+rsY!#_kfPITG@<%Dj14!Rk-K(}}~n@d)fdc7E3nH~lkME43= z>7sdrNlY{8Gj-y(PC{s-J{${Smik_l6$X(mcT;tknI!#2Z6Zs3DfBttkd3O5?B(@? zRIrWuUWl{Rxe_m{L(2ZC&~MUh+@(A{ON}3gZmw?8l5#rTG9+%ye3d@$fXuP;PD&`{ z+LFFNmu!_sAl>r*M98!z&|FcGNex#Ihd-cnO-0Age){q4~byxl~9VeTY0UTN4XJ0bkaT=r%c%Ol~ zsU~(FdX$qMI~~-Q*KuRmVjm5yA|&fLq~A1W8^q9|=g6#s+INfS|0;QQ^7L|Z7An}P z^=~i_Cbp=w7X2_!-=r6MF+%#wm{1a1e0vT08$G?;WroCv(_a0y1bv-Hhq28`=c)}J zM~bd}&&(&CK4u+OZK7OBmFhGAH%%`R3PKhWV)|`*;Hu6Wn8|DBt>b+C^P=tiE={A( zc#E@KUWs^i0dVGK&a*TlbqXV|POHPs9jDWd9t7J5stK{v4-~LYwiP}PB6P3<)}7Sr zk2e$ArDJK)vmSF>P(GD$+4O-FJM@q&p)OmA;m~=TrRq+XQMiD6c7|$}!ix(Jk@W2T zdL1Xr+hip-NM~njrCLe$4{{_4RXJUavWrowZD?MPYRv#kR!1d$53|<$6z!oX!>;#i z76rzN56e|JOctSw2|C^MqWA29Y6ivbC|TF5z~J6^40dzfb|~^pP|n>4;pDxl^&Y}3 zm)?lxsMcHGQgUE~C9N#XQ4_@t*xPCqa^CZ(i*P%9?Y zNY7srlWM2;>n+l7vi3zX(tBx}S81tU`m!%YAIM-sU#8 zW%~JrB3-AgWT$rORNm5xpd0;!iMp-h^KT z)4P0yCAsLNPt4|&V_MwlHDUPGPI_0{{!Y)EH97BWM%!7;2!`BUCT`r&kb4-(b$ZL) zxT>AgXN#a3qyjbA7?4>-U7@!Y>aQG4c!>7mzUrB)5sK9Z7Xl^N4hcOJ=H&EK!>@7F zDAns+J3q}8y{J6>m`RQrs}3-lSad3{^;r<<`lQGGkXu800Cgz92IpJd`>xh6|X zb)D+j$KLjR?Xl4Pg-JrqR1=dK#-vlp)k!R&au(i`DQKP=L4%87)k0X&EKF(Jss&z(p*2u1nM5xusNjgZU-=H~f^q#Hp-Te6) zKiUna;7LxnuX6Gi>ex@el-OsZu}gLAfnyRY2{gCM3W*I|s*0Jf3g+18f$H-*+<13Y zD+ZvIsjMkSl5mtWQ2jm)Wv=>}%d)zZxV)IMwvr8-8c(26vdx~PgVLCzg(#Wlua+zm zyT~Otbrb!S*j27zgVcxIWH;7zz6aI)l3I)AVk{heRhEF0zg`;|_$X6i!8oW=8)I$A zbz*p2WegXJI<-x{&q*BmCkc*{*rI17xML>4VLK!^yE(z(;*P0fanr;Rk6}ElnqE%2 zu^+?OgGJSpl}#Itq&J9BA+hI?Ca$^FalRH(KL~{}l9=ZSNPFh5#L~Y=y2&V~3qebs zZn~Bh5r1z~7y7Ft9;}|1GT-teD?{}p%9mpVshwGuhShdqEv&rM7Iq)3gE6LFyjs$d z7cR0SMfx*2Oj*n-Lzeqw+HfJ}?y239OdAr@GRD%G9yF|TI>1_aS5sKsi76=0qII6B z3SrH4j9h75H37mjA?YS`y7xMp$iz|i5S98j@=Cl)oFaQ@XR~CB^>?h}Gu_vr`b#4s@^uoQYDaWejwG?5LXugmxX~qMwA|4c3ic!B^{%t5 z^zBI)Oz2+2Ukj z;mb*(r33c{R$4#|%(k21#I&`lrO#oI$uuZ?x7g;Ymzjrb-DCe}=^0tkNYMlJH!WA>pT)2m;M~ z|01tswS(Rb%vZal*riyW!I7jT7Is?6g+$kBDVo($ZRlMhz4S{BWeeIJF~-MnjC&2^ zBeaLhGmLlZabQcc!Egg-IZj;;Q<{)ii*d_kzsV%H7;;W5fxc0RxBHx-T?u8>l~$(Gg-r@ zJEQ@;i(_1wJ415v3YckV-Jx6=qlssPHBki`p#q$l$lYQU6dE;C3oN=-`mR^ z=R5I&!QF_z6yvwHYSN-e7Z#_$-+<~X*59Q*p(wX>`l zFm8#lv>O*G&C2)Pe}QGKh4EZ@R?Iyqq2`bA{q&&a{{`-sF@DTDEp@tYV|`0?>T&_& zuvNB|(FSMw@;g~p0~i;_SW#c`@?Ps($CRX7r#G~s7&Yc9Ht$D#HK$qXbZEE6s4;gb z(ktk|M&FC|EOi~UKgFoFon%=V*z8-_!m{M?>=)%(<=RQ}clyQ+w*24VR>>?^dCjL< zn)(;t8{F&bYBhq^ygb!oedMcgg=O`CF(k%{ZzpZ=H{aQhTIw`t^JCQbcG6V8|KL@Y zx(3?j7&X3~)=#Acg8omNSnAu*_Q$BY0JgC-wX(k}7j<2uU!bK%qLq(Q%e9zJ)X47+ zvx%CL;L-|-;@wO0+xeTMSpE>W<4?k;?KHKczaY(0=R;dnfg0a{n%~d=d@?&YOzY}d zxUa_e^6byETHrqq&(N&>F#b`VWhTRcrT~Th16-R_B^<2|haCoD%(R0Zx0ZW@UzS1Y zLU>&(aAVzPxwHMB^@TeG-sB40`2MRshyI)AZ@JVq!tHQZ#rV4Za-wFMdXK*$t0_}| zXs^bow*H!RzrP>1OQ!xX{!yM4($s-!3X@P^y}yzy$|^A*RN*l7C$~bb4uMDgAGfjv zYlQNWC?Vz}-n6XwPx^HGm z(dx%)67yqQ{W0#BT(Wfa&n3ZSCrcFX(2cv{H&fk$>#YA3l3-*s5#`r}>2A2taW0Ty zJQL+yAsmrwzB5b>A6v|_(tY)EYhg9Yhhi2iVUBxQe{11olyAf=6sbm1hFjd7jFd|x zivuXXiCM6Oh3<~-?DPpCp%E8B4qJvIb-{U9SmK_`CXKex0Off?FsoHdxW{cW*IMX; zvWF17S`3}!1XjAO2QjQ9hmq(eie4MgUPe`g^q{+h%Y3?!7C=}QHDX9bYDzyDiEh8) z*3^?Qp08lavbMN~xnI$?_QE(&!PY?a%M@(A?6z1yZoi-nG>#U@E>PsPx4=&KGwg_$ zstgzng=H#Mq<)?U;Vn0b%ZMg)K$#Oyke#Q%yY8W`%w#gP7NHy!PdH~Kgb&<@?z04W z|7U(YL2eiW``iu8^xDE2l#j#+1JxD95I%QvCS(3Z6mN+#u4OIb@9tf!O4Ju}pqv{en5P}l`G<`ad2ujMHQ{$ITIxP{4-401DZ`KKhLn#@1Z5&)uw{xnOZD!Yq~?igWW9uY`9q`;d`aH zEa71~OZQSYXoF%@@h7ho?@EDl6YAe@sgt42iBaPVtf{>cUS%1rt*(OhRE!#(Im?+I zo-mc^MDusU{p=)s3am|!PFR*>slP%Cvv9I)5ntd1tkMGG5@sy7)CSNlj#1+atf`X| zs&Ol!3(yr&&7TSPj+5{yu%^ySc$tY#Q#U}{7Nf=&cnM7#xGmus zCU{N#0NTMAHNL=_x;P;`&{BQObu~CnyM_IiwZLJMpD%L%{Fv-~gM9ytl0 z0&D8)32r+}t#Uq(jyO)@5{J7`;6EoE@qD-yv~DqKe1SD}PeLWGfw~!rpQ%StPhPn#d_uPhAb6d7$$;cH2}BG{vHgT_Q}yq+=i#4uRY@ z@Wpr`Uk7o)NyzZN8wqb&HQxCv-ygbhtuC6G9G9<8$-q7#+syCqgwLC2(8n}tq zz#SX-dkc^IFL*v$(Uwy;&$@@~L`I^ahUE#VJ;~YhYX-IEq=HYJ)Z} zW<>Hbtu|cA4s77gz)Y6gvcKt5BjJsWaw(E#EDQLP%re5K=Am6E471QU@sWMUAstHf zBl~}&a`I%rWxBGrnd|PwT%K$_=DJ@o8!4FH=nAAhMhd6DE4sc$N>1O-v!&F2MoLNd-HO!T zNHx-v$ujkFaSC6gc6wN(0Y<8mUWF+!HQz{QrN6=oGPS@+XQwZx(^Cf;DI@)w^+Zji&HisIiLHgBVQ@>5%i!@B< zNAOPSFr#afo-Q_vjnp`OhtzhYsZo>kUnE_Lk+Ra?7u_f$HBUbxy3s~znSON<(p5%k zn|@tAq%lUyPJgK?($z-l+-pdWaZc)ZBjuz|>4feYBju(4@&M8VBlSwZ%te}Lq<-o0 zj(6%L=}KQD-)Sh(UnA&U_DW8ElOS&i*LreMbGrIGDp*Uu4#*~Z`brw6mVOIRp3wi) z5lO%NCr{`r%|z1g{K*UZi%O85HqVli)3?#Qwe)N1Y`CZAjzD_G=xU^I6X{ta)lNTJ z8Rh1DUMW!ofgl3c)xCF?TH;h%rnXgF= zin}{bMvCbaRE4O588ze$j`aPE_l$H2O63ZwAk{Ki^V=!+U&QAP!v*t4Xme+$UF4ao z>zS)FMyu*~kE)tjRf$@&7<-N8r!ZMyL|qCcNq9;M-IqX~7_2h^3vDy9Ze=tCe;7}a z>*X~G3gi#&8jN^@`3;2Y58eYaV}=nk{HgNVbjF1nC}pa=JDt&7s+%e=P-k59s|4jO z>WmhWNurW>sWVziChA=xKH*5xl6keq5?br1A5pqAjU`Bnc&xHsm~5--QxismD9dhA zhgFxQFfMs$t>fG&nYD+}E6Or2zvqAw`T<{KcA z<5%bo$Lnj?LVx8A103f`NuLNQnIoFNN<&}VhtVn(QjO7N#p_?X7X9d}Fsb!j(e;Yg z=Z!)?;oeKEeiXX#F@1@;fGcap)SHJ|{Y^0){*zCUa`idWU5O@7A~M~FB`5=;&TMJZ zw6qp2xw-7g%|cpD2`V+JCe4vcb*_k{OmHgHs?SNJ$vHCrO!%&%1wC+o-Ye4)3QC(;r9pDkZ z)`Tu7`^E^Z$j2ib)`Sw2H5T!=vGWo@2+VKlq+g71Ayy?RcXOLC)dxIe*sk;m9Jk|_G zOJQ}U^a{f9K@h5{ds(vfl&C%^uZ$8*Ll-IeO=j8|>MAB!y-iXIV|I+C8>~nb41!fn z{fmNW)_pJ@uE1)i3b?UNtD%0l$8jW`YOAj8NjIje0}PKow5Qrj8r{77UR5?|(rT;q zBdl(SY3s9o zWe7d2u#1;ds`s?Qz;XZZt?IpvFuHj7FsFJSD~ua9$*JDg3MIo!o$CE;nwRR5 zroR=`OoYp=@F1;GeSj72z8N9k3Ym2f23moiygStgTj9wy2v=HR-ZF&YolUi0UWqWm z3U}OuFwzP)rX!SCVJjU`eUuSKj~eS#AKz7{A3bg|HMqtKLnjS)s!#BQ@#CH96OAyc z@odshvO<04$m)}=aD_DJ6f5lF0#tpf5k?mcAL&%Tp@+$5*yIUL^%+)>UFqs&Mu^V; z(SVcJolee^-#g{WFPrk@w@ke4$T?qrw4{=LeI26(@?Mu*2C~1a%oAFK*t;Pg;?(-$ z@(l%&ah!c!Cjzwy{8z|MAD3Gym6W0ywI{;@a+M7KNIrjr~UFS{Wck816meY}V z{pS|e5%Gvx7ki!-rthBygHqLXoq(2W`tEk?*Z_IDfOEEHNO$%$J4}^j! zi9%@o(3SnHkqPK-i0VBf`t^YlAHJeXauW;0t!dlu2VW*IEbv;W}ra_ui za;vrU8H8_7urx?4P5THB)D;VK;Bgp7c}to!BWIQ443*lS3qgLKW=V5tF>0qDPs|%I z*>*uM2!mrJ@n}dg`v-2@?oIxaAWx| zXw2aHP!BG7=`rxp9tM{gXMdF!x)^8EiT+q@sUsx*l_N<@p6-yAk~{J88Hdq@-<4Dq?xxEgnQLGlim+ddIw|vtf+$f|6IVq>ad~+i=A;IdG#dMUa0aB*BfpeY> zQkGnIn?!8TK{;o-fA%6WUHLvrrhA#6g0DuG93EGPDQHyxJc@CH1X+a5!41MQGL5ie z3__U|MqY_9v!T}HT#|zDl=>QrQrijgU5N10sx@ZaU=6wbns6lpFT6$n1i)3*B`T*H z&KKUMKjgu#kw3KsvvPQ9vN*83Nf|DkOxaT9MauBB>j);QeS^h_{AfrmXQ{W2BS}jk z$;u-+!-Utw>vz-vzqWR%CBMs`HF`}cuo_37iE`d7ON9tgsqxzHp+8j1nF$g z!ZuCFM%lYO!P`vHRoSUoBVbI3u`Zx`o|)G*;bxR~#t1Fr2ybb^dX$@D1evlu3xC#x z*HQi@M(AWL{4Ra?w!R7a8s$$>Lb;ou@H=&v@=lL5dU6i)ABSypZDz3fn9E=K2%#Cu zb}@n^Vgh`XB}n*#MciIXH>t}ZTp^^Mk_5e6w!$C2a;LqHOhGp*st@U0!b+}4;g8-M zYDvo>tUG}uSETS?e@V8a?GSdIK#~h!c;B9xmh?9W|2Tmp7v=CL_|v-AT2fO8ZB8J`^P2EynRv8JKdK*uLLupn@hm;}Fr+V@qX)!`)HDcXQA;$@ z+fC6Qc=tAYpLsXBRq^_ECFl>nI*cV8j;@|Tw>@6pRL0g%Tn%{XaJ>w)$4+vg7sg zL&osGGTCL;=?l;m#_O}sMt}56Z+SNj-Az%wncc!l-VF)=+Odi4#QPwujgoK@xtR|i zU&+>{&g6M?uf+64szxSypQ={X5yA+l%hFT4Wi?V&X(wHUMlhNS%Tytrb&hIVWNr0;F)(IJPvh2B6Sb(Z zwKWMwS$!KGJ zDczkXmz_MB2QpoebM;y@*OgJ8CsoXKWl5QjTi8ee5n&|wrB+8lCWg#*4XK%HM z(K|2Y0#2Pw%^bL$vKNeiu5bSIFXe_zkksb4ZKAfnZF^OMqbjp3D%vH%9bEkrhkYQy z*l*jsAGEzTm#0aXQBH4KfFtQ+h$Y-CrbH3YC98 zCsnt4$G+tAdt1K4NjBL7N^RiH{yu%-`8O&jzqvMX<6=w{9LKPDY*;Pknp$_x5pPjD z9_>tyB%!I$O3wOZ>Lj`9!5{(3dJpP6DO0Y#t*g^WvdBz+h4C8wooaf`)lfSLiyTv% zGCO6aNP0cMGE=2`sqJy)%rxPo%1_cVYg|qNQ!ik&WY!edN`2{8g6Yo@^gnttnIx)a z3yC>fvQqUqHQ`9o67H>a^|aK1`0i0%NV4Ed4nCK}m+WooI8sAZ0wMG!Czed-nl{zd zl=-3KkX{oUNv5}rq<1F0SI=A({)=oHY%O+j-FL_-?>&O~+0tN%T^!bScD@l0(|MN* zICaDYRpP)6v`)eMq>r0#K1a0kji~J;vxT5HoopS)Vv#&lPfmk4l3quvLQit`NE6Sv zhI>gNP2yA*BfTsnZ#vl{>6V~eAp|XXy6IYag7|GwUFai8>`f;>b|dk-D8Gmiq{QW? zlgX?dbYYLd3ZgdIlp`&f-qDikLb#wjsr+S|)9 zm1jk#ldQFNI=KVF-9pk$c(T6AbW_ z<<^D07uG{DX1VKK_pz4r5`_24lgc}2Yp(U`AdH`5ES>30Q#9kC9Vn)%LQFb`saHr? zQ3v%uWF7QEVp|JIH{r=U?-80Y*OhaoI|Oc?iI8BXJ6ObwsXvvqXy*)EP#v z`y=gtB%(k(NP0c}l@T~$uVvaneR@KVTq^#VsOH~?rmL{k+nn}uBxx!1Gr@o3oeNOs zy2m-^JJGlFfweASriUj9nn>Og6(~4EKcvw?K~@ z9(PG-%!)_$#4Ub1z?EHlUswy|5wK$UIp;e&?oITRSj*rl`LTU~n zJ4O;i-Vi8VEb02A94rJadAjLZx`z1cqq@*NlGqy_#mz{32g(Ox1Sx#^;qgAhR2OzD zter7tx#6*%meHioApB6CRDO6&&Lh)G&VsEDJ4P>h#8hpO9M&?URwG-yt|fw!_`X zHhIuhu=y%@j6(g!RAhiMwR3!lN?4KCQpV6NJMi8&Ig+%5yJ_8CE$t`%P*fL^3o~6N z&$A+*tRKxc2+*kn*(K&kN*8nJ<#|@*>uyU}i;2EIx+d{@d7c&d{yAEyzNEMmU7qMo z0nBsb$UigC&zJPW(OnbOo2NqNxp3szg8^$~K7>V4l6{&L@u{J=Su2mAd^$?-o-N5P zZX{8CMLv3K=p7gz3rp7}bS~w?mTcojQqvt!29X}E zFLP6*Se=ioKQ|E>u38aJRzi=AR4t@sS7PTuv85$XImIZqqSzT#n!YVEeLGzhRAZh& zsXpiQm9X0C&Mh*XJ5!y(3hx>r_$gMB93DaU?i_WTVbw*_)I)i$5KJM=71) zcE!S_D0@cxxy%x5(s_p6ynw2^#P zBeGiEEa7EboFWgXTP6IEgx9D$C7hT;c&)mdaH$$CPCW00o=jrW=IUF_n?@>CmCi(W z+w4S7mpC-0tE+-W;-#xU z8RqGx#p&iV=p*ZfE_Iv|ZF5Of*HzuOP;^RWJ*76F*v65h#n3%OhSqYzEi~^j!;=Rn z-^FMfg{Ds@BzVpwaEma(VeLL=Ox`P5zh*uo*8uH>QHFhXWWF*H*`;30W1oaXsymc| zC@rK7nQf}b2kHU(Pj~Y~7}rKwb|);dPfe;}2l`@^%Z0E@jM{yy$Y<)DptZ0W<<^)5 zvsD)PQaxV9T6iDj$1w}$7q5|TR3c+jMxpu%Z zjr>#nh688|tx#qQL3akVkl%$xeo@V)TMGkG4vn`Ud;5{&>NpM}S0Z&C%31LQ*;nDp zRqp~zSb_3^c!KQyM-qMVi(oz1Z9};uo*=*0iB$1DbT5D}DRH>J#S<#y7m;edD!9K- z2**(disPzTZ8d}%zH=_(tw14UplldVkk1fA>iC>_T<)czI-u+>1mlz+i1V0_8$>Sg zP0z4BHWEf@j3s^$vQ+uSeuNKbbh6YtpxsxVib2il;s5wf%i01%K9g#*)duC{QLpfa zl5I170qy%3^1iC+*g+T}IYE<;1Vpa(pTUS%O`u#DrIC~T zx->G)|3r!{RCkmGQ9?-PWLdNPdG}c7oCsrvu(W%7tV;P@&u{VXc*vIeZWwD%U>)c} zj(7TRJWm@0ns9DSWnVB}nzrpy&3AVlzZ@SmNii@5em!T273CL02mS(N? zPp2L9wY(XOcET!G`d4YJ$U1-J3^phWX{rG*h6$@&xio8oe@=v_R>Ha-#ynxg*)l%> zjy&Ptb{~wDXde-Vu_LpL{TW&075~0vGOfRa`p+?no^*!mUz$bU^}o;RO|O~MS5SV5 z(ew_5UJVti!!oIVD z0O*>JP(L(5S?0F7)>Af*Du=5^v`6G-cS&w$h5ZH{hO@3)q7|@jixvC7_KJX z1?6#f_rqR2et{C8Rm(T|bKRlsb~m$DH-1wWN+Y3Z52U=BanQ}5;xRg*9TsJnevZ1A z?s4;Td-LRs{PvODqU5@(VCBhl&5nWuWoplKpOT<_c_-I> zQG$mwSI+EzON2=*G`71X;wP<>V6MJRsw4lWCY+gjCN~)c!j^TZ*+A}%FF2`n+G4Da zY|@$yXKt(~3uQOUW+@^Ufxh zT(_|V&(XmYeQqrgi3IakCQ+WGUmqu;{9DfQl}Wv0A^Y&z<=%1@vVO~19=zzcoc}19 z!pWnHK5KQZNlNZf3ff~%dhn0r_D48mA~Sxbn}PK_3FhjET(_AQk?Bg`XSy9FLV~$E zqKo_+qhNTPe~`)*Vlng)l?R#e`}JqjLq;Fm=`NX-@byf0c&z z3Hg;UhDTWxN&nZaMgFg70{Q<^O8&jaoOr@LH<8a`|H3ZzHKA1~*To3K)rfouclpOs zh(apH^$+dqF-EbvlHn1)+kc$h3!mDL=I^34?N+QNGqZ)4`+p|APyLQ2fo8DU;i|GU z`Mv(eWu}@wm4UX2Fyh*5xLVF+5nk#4W`k)npXvgoZw1=5`qLlb`~AmQt@zXkQR`Be zmd9;h4Wlj~dN@N@oww1M%OZT@>m zlC0#vX@y_VZ1o8-f8$7!w92{8D0gTjKYjTPRU#Ur_S{B(78HKNKh)*t^pY&XscDS$ zcY^e!+$4v0`BfDzMVL`tiS8d`*|%ur7B~E!fA1xhH4esgCue=+AK%{QxCF+ED9g)i zzduN~=psFZa$AhhP2co~zx00!VWX7hJyHI^NlCLx!{oYB%v|?dB6SmIx<@4_x-Rk> zW-$D{e-^i}6`J^;esMF?#6S6eBT2IQkp)BeXU$d}#xuk@k|eG2l)o6|l_*9>m7%#% zJjSnvQHFLwjB%SVt}_`pu9&2o)}Y@QvS6IRoD2rnR z+f5O7?PYw*TS{}SC?DpeyGa^1SNBS;yO_v46Cvg1!L~$5Fw@=W>FPWp^M5FkgfCvW zoPCy1WBmf6pU1a@@(>${Mje3v4M&oeoD4NkbPe@ep~s@}_O2fL@|F5bH;truSqy^w zCnT4|E|(Hv_v7US6MYFO7jWu4t(gP+O~Q?8LDvfk*+ESl(oj;H{diH^$5jI*XdYJ; zN^r+a*_yvff+xPTkvWIi6ff#eF8#b!wy;I8#>SZCcInS& zGS)S^8N#yir1HD;X)HI@qcEP2v2><$P0`Fltg5)VdJo2@qvokSb8l@Rd6TF zIPY62HjMX)+Pd5v37+U@jhGU@Ac3kg*>M_kB;6&gA1dP<^)uPM`A$e3A@qom7759F zSh`x$4MRCv2wL)V)3r2%_*=7AxEDEwc?7d+7Q#FJS*yFW2ag_D}*po zNV*A6-g$dzM!r_UIn!MLH_t>!Fw?zPB3{-yIp^w#Tz8X1ix+fxU3xt@R5c{a=u0s< zcNB6(8>^bYzzz6t^{q^5!Qqs+7yes=J7wTOD<6fHnE*WIsm zL0?YoJCNsDIc&b59h`6FWb?)B;4SJg`1*_4!CQ5`^w+I}x2Z-fa`e};gLkR%*w<^b z;4+mh@iLKd!3u)K{UN$M|m16uirQK~&?_D8j$LO34f2}}72wV&M=W5A3ko5dDG zk+1ZgQ=SphbFHPlU})J;ERTGGRBZG z>}A@P8-w6)W;=c}l$WBka@+AipRW?v>?zVN`=A_*(n2~vvmGBy^F{9CrBGTy`PkV> z>j+tw{tz_1K08UPmXwZu#8T=PPm_Hgtk?AMo3>6i}XAD!Cc=E*3dGd zR9|QVg=*T1Zz)%$ti5~}ux`+VNhq(2C&<2ju)i;>yS)Wnf^tPXLH6~71AVtY#8!zk z$5SY`#R$XXOPawUz8N*SYKs1Sbe~7{#=Q+`gm3y{W=H?#$u=IfRSOe-&>>GU-H?^#*VN8m$STJkCT;D}4ZDzNj zTp|Ro=?3)1!mYlKnbCBaA4mCAISWF#!&i+y(ly_W@`IR#fvS&`;V$1xtaa44D1MHn zHY01GYP=f8BfgC{z^F>K(>Uy4FkcJ}Zu9+4Td5`}T1J&#@(u$?{*Ld-A{af;_Kz|c z-0~^w;7`6>vQSr{m>yN?HZnHM8=AlXOPX8}V!P@M%aDOh(rxWB!NN}0I2rt#FYBWSW4%?SHb2-_kA;A~?H`OQe z)=)Y`X(;8xoxvUc3>i=ZPz;MILoyw)7yVu<7$5qFm2tgN*P^~9Mv0ZXSXI6e-hThG zYlOEN&XyQY7bl+lc^$}2+#eW2KJ_-l_l0a6s967-mS8h?^gPjii{?nYwo-_+E!;iS z&Zp#RQ=KE;hs~aCu+Z(qZn00DkNTo0CAL7&-)1YfWQfMFWRUA-t~-Ksd2*@Db+3_N zZ5@|by`9jN9K zzc`vUBz)(3{+S>dTs&72KZJ5)l)!(=d6lZ`TUfP&=y#$jdpV3P-nP!=+A%eLIp@XD z@;6hlT;2YeZjgNPOvFkZT~i_?nEx}~!YyzP5%yL@e(t67C>L<*9M{Z&190Jjv!Khu z%p@6dj-)m>A)>aoz*k7n+yW1ipt%JeE5Q?QO;+E}TLPF-TQ~_bX%a*g5+l)DlN)Hz z8-(;Rr>|lpvFY7@l+KWJzoSgx1|sSIBkeuFt17m*?=$=Cb55v-CPX08o6?eCK&eU# z66w;B06|&^fj~qALKCHFf`BNXh=2t|R7AywiinC_d%s@wa1|5C%wV^u&$t)8f&W7$h36NMg15V>4ps!mZ!4l{23Pgb2iF#{y;?xn9 za-cx)DUu+Tzzdixj@SS)!TPp|4r6`7wkEeioM+nEMR)M<1OZil8P9*A^73F>RanZ^ zx3eoJ@wc*odIA_2fYu4fTLR0UUFs^B(*>Y?9&f((Eg}3ypI2d*2zz!`Wjn%m!Q2-B zB=M!~?E8ytVqXO%Z)cfkN`cm2UCn~N1rSC@0;sf|&Dcex$sk$;C>`m8`28jDlj}is zA>^{sDBsTZV_w?MCIFZ!AYFuKue=W_#=fpx+5ZSO%LItCp}SQA4r`uV`9qL^zV4$E zELPCFs?<75;PV;D&sYMt0f89=OJG4c>KCLVxXO!HRS@$F`ZK-Yl_1}w{SeagB%-}* z5vMGHcS)QQBBtgofh$X#-V(T%#Fw}P77@mOuFIkF;{AV1KwBhwr;q?y0uQ{A1W1S^ zz*_=~?Rrb#7d0ey<1cP z`n@G^cL|q%nkDcG375@%EPES~cyHO;Lfm%Q+eX}W*?S>wf7vU!RI)8~A5>oZyfy7E zT?9(K0_R*R$;Jg0GTMvBvtpX{<2rY+5@@#EHD$R zzwFi63E*Y~*zuAsf7$!yt>o)ExElh5p556<6PLZafjsWR$}W55_>$>TN^b)BhYzcu zTJ*k$kQ zJFJFJV16EG@Rz-#NrU%dNA~ty(cL~X(j41U;_ne z%FAE&e$28!1E#^8l?brQ-VROd{Bt$Tn-c+c*(+0r_EH@8!`v4Dyk+kjbnT;r|0=xq zeZI+$x9lx_+<$##xqk?5`hjBKt>tL=HfLC;O+54fVVJFP{OKHFWSoWTbSq(43JQis1m%SUB zljGwszVW3i=$7R#dyl#xq8MBy$TkLl*}HKv%tkQU_)JgSE_<&`2hkI5mX8RQy(!&c z%EQJ2pQ%gI=@R!oXLjzWCa_!jkYG}v7rCXT34RFE1Q{!t`68Dk!((4}vN-E$r(7Gl z*GPcCQnrP8G#aV08cUe-UR`D;x5+vzob*5?+?!T{V{{MC8O=lONUlhPlWx8O_vRg% zRU@3#6jP0Ck@wK~dUQCcS4F(HH^I1_Mm@qwm0IDw!+0~pNwOs+vekIA!bz9L@ZM>> z1Hwt|`rzFrPxqWgL&8bNnO;WjGMa~nlSbTwcl$1_d3HES&cBT8Fq>Hl!{yWinfT9@ zjHuB!g+ddc^4iC&SM$!(zPW@i^LZ84f@kLV`Ame*AAY;-5Vrt$H~{HS70AEw=DYS5 z-r;m#3qK0<^8l_tfS@mD$aHxkVr4=+0;ma@G*;L`Iw~Z>8;vJLy_4>udMH}e255%B z?~)9L7OLAAbt8E@;YksM)c}}R1^VuxUMuVorIHZv{d2+3cnNDX_(fn>2Y7*oid64@ zpz;?F5slm6-s>Y!v0IWfvt=Vs#q%)V@&Og38qGiU3)Otm6e-AV?m~S4DK)i(FfNYg5RC&z+%vm(e1GI(NJ`qr_KY+r!Y#oHvK$yb=K#|%mCVcf>UO(31UQPRE2#~nG4lxl7)pS zwLNG7u%gmXQ0uFJDr$3?hq@KSzS5`)2gHzc{T?)`?~=k_dbo)vbPRzn|4%|64n*ks zCe=Nm@Xefh3E3u~TbVXliHVd=Tn2t+xlJBE9cOwml}ra^40{BK838KL zs_{jt+!*jTUW+k?)pg)j`&g8HvH|8zORzm@i($1B=KYC){qq16FT}KDhelYv2=iC~ zC{mAi0Z_7vUNEeV!}wL0y3v{fl&5DEO2E@5Z(=?eS-%K9 zVU+U&17#t-dS7=V zoGj^R`?{Y+WxTjo0t~Ob4wm%xbtUG$t_+TSUD^LKEICK@V&s;4M|+=vf(CA^9VS2Q z+)TsfuG!q@!5(&QA0-QRxepXE?jqLEoh!cTPpi@PzEt0zG3e^gsN1aH;0~%C+J8_z zX77K~_h;1!d;i_uYfwGx&eFc;)CKs4Rew(Pw)e^Uen=l>Kdky8b)WXXpkCq5CLJ1c zmJxkHowTeZ3}RUI!>XRWchvV6)#dh{qwhzQoQ*TA`VqBJ-(OPu^!;V^ioJiX@2{v| z?Y&xM!5>u}?7gSHzp6&dy>=5*5Zn)8{^I{Hcb-UL#f#Li+D+A5jcclIviH6E-b}q{ z?;qRy58U}e2Xc$`cLaCf(hq0M6PjVQo2!a(iK4k`Z|{Tky@i^=ol=qNuiZkevZ1^6 z{e1PRz5j=M1J~_vfq>;;jA6CUSHEfI1uB^?XjttF)CKn5Ti;u%$@ad2dqcPNEfl@d!toGNf}62Av8iR@>nM6;4+?ToNwk(N#RjSfWvPSHH%Ta1}d+;6|N+Z z|1N|dZekF3!F?b=NKYDCs?;0waN!H|KLC&RcJb9-4hsH zoeQN1Bptb)FLfQuFA6-h1wu-gKtoV7!=8dVf|lRU^OLhS?ba)1ifIiebT&u(bFF7o&SK6r`-bsX#u0bY{n z9e}B!D%;A^r?JI5T> zaDU{1s|E8q{J;B{3KCmrl~VolQTA};Q3_mJG`*YAsW6giP=aY2bM}NDkKC7IONYMG z2xTCU6$k~zq%9lCL1Nm^N18PEC0!$#kJR!&vW$%*`3GiG^JqlgtP!1Xgo#7W#B_p&s5RmdS z{bA4;888Ib*F6L?OPme0v!VO81W3Xfx?*GvU2*r-hbc95Wd?JDdXkZ)M$K8Sj4W+- zo-wiYj1^%3A7``weC*^ zwiPY}aFc*~ii{ptDqMu$A{V*;=s}`|cMqXY2S^F4pf4YgPx?GPmaKIDUC-j*1A8jK z>vrY~f!AZn&2CR71zLa7Hr{%I5>t|h*Q3N{x7Jj)!J$@l0NW$L>qOhJr#viM{UHhF0MRz)l2E z-DvDs@`yX8g;f~3i@Jquz5~-2)!tb0gnKp9J)O+9U@r;q5>{#~Iq0?vTh*h06$Vhh zG&R1|SaQTQHnRrwT_Ry@X0#NS^wyS4f|!IF zp$`x^5eRvaXnfU3t6V>lh{2cNK_>{=M3ss}_q4Sm=g}kENTNolD*}B3A#G$NO5^KA zaz^=)#0-80*y{p(8FNGO(r(ye^N2gok15GW-iy?MKvI%n49^p46{$vlW(%&I5&9T` zUjm`CnczfKZwQC6Wkmj+$L0ns&QUeE)`3h(a2nLf#U!d@Btrjh5TPttRW{Tm-Pi2~ zHcKLGsGZE=B|uWx&^6cb5+Hrh8YQ#$iZy42rPKY2;1S}G>HH{l;ARt~)CL&apz?xH z6~5uhU*W>9xiGB59wX>bfRN;bZdB@Vfh-Mc>z)K#edJ@TVUs3d^mTvankCMLuDV;U zF|PW=s)l+*=&J+zYWGd5Z%rODk9I=eK=Qi+aIyMn4N>GM@i-;3i$F^9dl!|S!74u?Sk`P;!TGTiymO-DO zW|UT=V_V_HW)r!>ishH6v22!9E0usH(Y63G&?S0yLdlB#twEBC%Ot6|Op;3cB&}7l z_;vOp`zmy^sx#2I)XnM{BFLa<6`S}N>(?oX;T~f90vbS!C-MIXtydyXd0UL|ldg1_ z5nyHa@&!OBz-&;m;1zyt=pdMO@Vi5|1hI>WE1s>Y^bF`WY?r z@GpbbE5VC`wQ3F3AG#UueUK3sm%3G!y5S}d;AUeO$;py+`Z^`@*~6UBUWnHtLdWob z3awY7gu-91Zr6^OcU?klA{vE4qpdovp!-koGzh}u=|ZmDw|11 zdOHF7%vv{ux(%%3!yT`iVjh%;s&$YXX0-!ui~51SHr!F%WczkqUL8NvzR9MvbdhaP z@`y+zcSD_!R=daxWGYjawq$aHl7~YAx@VLVnho%LKyQ`?hD(kt*us>MmcDh3+`0ONF6}O zX4R#buwe%I+rrK2dnw4_^4L3E@&%gYPr~p>nHPjhK3@>JL$%cr&L-mU1S7Vwh#;Ne zjcV^AHrZBkzC^ct)!0~-xJoyfAAzk??|~8noeb?E)Ahi$fYvLKH&!kW^CMN9iwTy` zL>PtQDy>ld8d#@9Sd_g6oj_qe{&~=PCGw`E<>{J~atFG{^QiuHa9)KJZ zrf{5+oK5O6M3NENtcJy4%raTejoO^ARohZP%CQf>LMEBwQrmPt9o?Y*#23nvv&ysN zjQ4fw4FV*kJ;pkrp`_%z`}y!Uv|foCVqLFJYDYHh=}P9>PB*y2pak`$+mnckx~rfY zQ8^R;wa|JcqNV_%Ehr@TOQ6GG*2CEjnF0`(5@6Q%B$AI-bG=C&sY=5FzZ?1knLk1O z#o zCEL-Q6aw2pMxD4ytCL+n>y(JLMb%|cO{{M){xQ&cCGtkyY-Wy5F5c^)1Y6l=it;%n zMTstv%Rtkf|+g>cnnqYrf;v z^#(N&K@oDsIiaT!jO^vHJycdurZdsOjZ<3Z<1F z9sq?rFK+#m_c9f06KM`85M9Ac~ zskD&Uc-KHihq%;sHTII+P;|H|2OyM{$90_&;arrhh2BBoZv4+c>y>EGSuWC!e2k%S zDk1>?faKu3_u({ps7#&a7ORf*d)~Y4_IU_B_SraLFI9M62Nh2ArbFK^9z2&eh0Zht!fj}pqdk$(0+jb0Q5&$Af=!? zu%xJI64KAKr{_yX=sxHag2@k4M^LGrkF06IIkx8`Yq|p~v>lk2HP27hGSIgf+M!-$ zJd9o&5vBBzn^dOHdA|po`Bvv-seeh=T6IXquRFoN1sP*W9KW_G3EyT)cZ-tJ-KG}| z(Yv(A8`Rc<+D&A2bDU7qa=ZtGKY5>+k?7Wa%5Lq*Uaub4j?wGYVeJ@B$;c~FBKi?@ zCE{s_j)qLh=ss5GrwjbO&<>r3q#X15urVCjUncUKCpw`G=qN;ftFJ?MtXjt(VDiEE zI%MOhHomngTe^w|5PAYKrJ=hD8j7eA)%&4isDB&(KcMwW@FKrKRc^>XKJY(*qUBi@ z!%2R`%SM^b^6iAq@`?Jqwu#UUS2>|B2&N%4zpS8V8M#&v%c#4RTFv#0ev>+hj)my3 zMqUsYIc7^7qJPjNCsarr8_@sFS>n(g@^D93LBks1#bM+0{8--xbY`N{#yKX4(>AOv z6zUKFdC(prj_+p;1)0j#H0E(Nph8w7LjgVn=rTqyz*aZ{i8RjhR9Eac9^uRvm82^4e9}MF&AF7DNNFcqvoS5YM`%ZA84~rN2POB&Bi#H zwROL?p=folySDvNb=#47x%T+1vMxjaQD}#Hwh3viVdKb( zFAy$2jd=tL1|dAoS0FA^in29#gOZKZ6+v!MKfW^U=MLL` znA6IKQ*Kh>YE1i)%zzdm-QY?4!k4gZqstI=W(0i}GwT3!0JI-?N8lqMV<2VB><(*Y zM0Su$zDYGAGLak)okIFXFEU|!k%>AJ*@!yqoCmrZYFdTo18`pVBNG?a$Sf)s{vv3z z9&gL-ln240fg=Ubut7avo2`}bcSBdA=Nlv|KjkGl7~twMT9+#}<61t+?M`w<=4ogH za-EUUFT=^Ua4)%1P7>KhwaR4`mE-gSH4!q?6L~?e)PixH5;X@=`3ZCkwMF<>KdQfdai6!_0TYs_GN0{j~fF3-@mm|{t>#j;bG*?fNJ zZuJJ;vXVzG2cbd)n?5c0URgX#xkjE_QNCN$L(EM*@8r-uYB)e85^q3z@HDHlo=qT# z>PL0)Q1`Fs3aU@Kh!CZ^Khp-!eEm@})%_t_m{a%EEyB51wPmKem1x+4lXYHADr_57 zcc1E6T^<8=%X4uL*6x-(61-21)$X>qcd6ZVSpu*i+NH{M;Qgm=;<~C6=e*x2t^!>0 z+ocxa>ctFlms*3XJJqpE-G-}0U2)xws}eQ1OYOrY-%;45p2hX$L~$L%buO9Tr9Q-^ z28!zo3F{@UA8;%^29upO^CA z(o|BzTNaT`x63WorUb_5%VFe_?NHc_T||iMMyBM=4uze_gnI~dVs)~)spxfJ!YXO0 zRQL@SAhcr$LeA+VoR6X;6mi2zZtKG;6zvYX;u5vZD6KVt$J5V|>7{cn50kiV{N{EEwtubfi{A-U2g)84$4kgXzVsFjqL__hnM!~BxWkx|Ld|GWmC?1(X zNc4d_LI0*6kdQl9NXUyAO89s6tb|NBM?yN|4*#Lvl#oIyTSedM0On8iFA3SuPeOib zOGuLQlZ14j@>TSoL>n&Wlye9fFib)|#>m3uojMY7X;%r6QVUmbT1m*yTP5UaiM_Jc z6MbD`i5u>pn45|#N>atQt(NQdV!6&AtGM<&U)-IKaIH9HsJK_7N5wO);Oaa#jxuUX z=fi2ov?^7#E7ME$IgwU#qs^la;i&uu+$y2!ZnSmOd0qkzP>D4s**sQ9PbxK?~?J|Pt!xfgfzWeOwuNOTjD729E4s%k@w zSygrEAo#1sjd!a(wogtdK5P-G!J5K#wv+kzaEU;LRbBaiBHn$66w6j3-VLQ_U$O{< z&Qs?~hBHUx$_{EkF90~|gF^MR{1A}{E7{oiZ=aXEi@;EQHK{QQuIP|WPpMI1l4hgO z2)Ocps;as{?5qH8r51E*Zq**0a97T2!XxEB!<9SUjkZvw2AH~AHM_sCUZo?c6{_^N z9uhQdf&~4IDE?HT2D?fm?3&8*SzA&RFOQ9>_~T-4@zyVKt$6Fxa$WqaTpvl3>%iyb zy73jcZa65{)d#r7=TlKC-u6+s{{0Zws`u~XdYt$gD($=`Hj;pk2uRT`>f+PpgjC!` z;i-x(o{?)@lr>V@pQJaatG;>=UvEa8#yneHHX?|3A{3Eb)aJsRnyUL2k6`bLeXuO~}8We3M(9 zYRPS=nOgKPGLh)!{idYUWRYuw23>CLts_BB!o33eyo$8{t%&$Blqp!hfJ_>jtCg%& zl2U$r(MI=DqO7R~9YJ$-3{xt9!zh~oRhb6ZxbI^&U9}HeN9k(RvH4MwyBu)kzKqnz zs3chR6)pd#+<8g;eZ3_0{t3+7uoyKPS)I+}6o5&p?v0wLM@VE+lVjvbZ8M-$Z7jOd z#oA2q=@M_Eo~NjjGIAaOEkl-HavBtBuH->|`OC*WWRqNxR{8&!agzb(7izfrU{!&+ z(69|WvKTK3SE_|f%4*!WMtjcRO&f5s?&iAj8sR!^FvRL(WUxH{jdWUg)mOP*N+Ogx z|G;Vjsy)JWiw0kicP<0$9(OCvOVxJ@bLglq8cDa?LN;oj({+IsYw_(;Jl(A4Gs4cf z#CnJ}RBb_(W}-dRaww6yHS4P-<@g-gy{SB+xk5>2Dt&8fC4+FyZknmSLCH^0ia=GU zjbZjSOjVh{+K}Pu4nNdd{VekRl+JfsxUxybAW|d}1w=bt?qGa zj#NeD^kzcToHB?|sw*>wH1|dr>BcG7up8ORB&(fF9+Z=L;V1_60o4aSQ=Uh0%_+p{ z1EmWhqZ#-05ueGnn;}D>fiXYHkpDzHU&V~&_XoZz8ON6ez8V?t)(L#c8N;^+zPcGh z28!m21GFoSgPrlpb zH0qXd8G}Lff%2(GUd+v?$;6}jKuRB9uZ*}@Ljyu&0k-d-%LGxJuwxif6wAUEDF^V0&pvN7a9HOtd^lMe68v~$j%4e^-%EMo(ylX zDyTwEkyG+^S+cl{8mmFhstK=9SJj{$396B#QO6?yliFr#wdg8VN3XKF`UvU_U5`%( zwNcd^XHheJl-51w(-Q?)bI z2Fv5VbkWc;e34T^DRc~9?A)dA9i2z?y_55zzIS%s*Y~c@*ZSVg`CZ>HapI21UFtN@ z_a08VzV~#xa_`iaiz;{c79#4bBo&*-6QFLwpQ4>$25QX9PiTxxsR!l>=3&8TCtU;k zanSQdCpIc^|KNRiT||IRL4`W;-wvVw_>Y7>?}zfJmeAue{&x`pjcvz60zyx8qQ5^{B6QFdYzZjH!X)WoF zTiSrSl8~vTQAGGSNl4m$Ev;KhS1kpwQb4*0Ll+LHM_|&FT?9G*BCe!qVib+X^}vKA z#eRMJ4h-o7AZhxV>b{0#x(N_xs{5$~h>}!Su4y_T)%}^^?zDg5isqJU#eAXzRS`3< zE@G8pKRxp4oufmQJm+&-ZKmIej#0Hiz;t@5x0@3%T#GoWAHgG`6w#oPC9)v7dV(uK ze!Be-66PYIpG?TqP>)G*LUpn>lB~MX9Q7VuW*5OpvZ7+2(P^qGh1u(s`*7bK6@XH` z$6h)&6fKF$(wL_pPOBP}baYGfK`mLsX*H-i{@blT*@=$AilUR1%r~PlEsjpr`HSXH z$307ZLz1J?T%rZ4dNthANTRbfgj0l`mFBuUFrRTfSHo zy+QpVZaFVFn(D|2i>=imYB#!4=?V45Y+ z4IrBZA680bvZL##J-EyOD}86OT)YG}G_Wgy%m`p&8Od@1_Po^n1N+56eVCn8 zXX+_)^g`!v8+m*{d8*w&9`j+k0z(#cvD2;4qTT@Uae&g#Yb>g(bL1S0`Wb|a$7WU+ zN2YqTfJF6hQs@hHjOT$kKR{`tvZy}JcxK-k)dR$U0A*v;y81bj=UUWM5QPEC#+b)+ zhD}tR>0`7mdHrg0fU+@a)Ntp{G>h5~;%I49f+=Szjn8#{+G+78!2T5A1M9TV`OaRZ z(>eiFYf>mex}MGBE{j_14DW7H?LlM)DBo774;?orHqs?&h2w!01kk`#EOeJ6A5+)R zHNb8UpnREPluk&nU3w;dOp#W;j>GA25<|9sVhDFI!%hp$STC{{l_c zLUJL4TBv#0onVE!AuzOzP@;KheCKdWnwu_=e6Wkpg7;Kk8XiG?Y3L?k50-)Iq}ZmT zRSyZv)T6z0?XQ4+H^9p?V^8adaI5JS^Cjk>H%(K8EjB}7P~C`>0q$=;AC@TqTa;%tGk@~TM_QC!4|?+unz`!odmg% zGY!2h+>Bw^iIBY%RY~U z-5>t@MK)mDPeyZpCaS z1xitR#lH@Rs=swEdG+0qu0xr}0vafVKd**H>adnW}Jzv_yBvM62p~ z5PvJ9%Ay`~zhS+ib$toqhcddls$UDy^}L(0n%FAP!fQd+25c|;v`qGoxSyg&tW>3f z=pZPsXnt7%;8nLg!-xh9f;l1)AWx^FZ@4FUASp`_RRD8dB0xSQAAQ%o_jU_d2Xj** zKo*SAkKEn#^jgCsFrN$nUDcQz0H3*;b5Q>VjE{wBCNR3Qw205$TbPxo@8L%3l|pze z{OcqX{l`7v+L-DAYbsEa+penaApqaI&+J4`Cm5Nf^LrUWW7 z^%J>hI8uv_Sm$Ob%v*gxvaJ6S`opgJCD2 z@of+%0*(G4?m=5dejpMZd8j_mwjq;2J>5%)+^W7LvXd61@om9gau&R&x>w{rDoaC0 z0m}`b$3r$>K;MuA_l-2U(?XX6yCr}oCRjrUL=Mlj&`Iy;Mw%Y|OOKiVPkpLb|fGNqAaU-%o;PM2a?9XnSCp0W>ke8agLZouz~>hVj7W z2GBDStntetub*%6Yr)=i7CZ^o&=ryA>FBiTr+^&`pot~C{!S8nW90Gq7WxISUjk@i zf;Dtqq~b^mt==#cY61N(lhF9PB86VDbq71-EO-*Eq4!2!V&rm@JbTA zCz8F~LT?3jUjR)^u!cSo**4BX4*~lifSysp8vlIc4>~HHitoWjXia4^NP;!=rHI?v zLhAu*8$c5i{7r8Xd@S-k1+BGS229R@wOSJstf6m3VvKfC|!+h_4pix7BK`$QrmAWNWZA-Yc4p{VAG; z(L6@8Nis%Xf{`9FL0mfaS8NmYX^ru6&T`lYD=JG!) zrC6=M49q-v&G?p?cC`V<=VlzFx~mN|zNC!iWAF_!zKR)d2yd|QRmnKm9^Vk-tC1m3 zzN%eee90MAsMu;lC3{Yzx)~M4H_Z4_GAb{}H{AHn%XonqWVI2-S1)4|m0oS6@zu|m zc@Mr(#@8U@I|{7YXya>`ao#k1V~np+MtRXW*7zD{JS#f0jju_@EuwRr@ionuE;{uF z0H;y2jQ@zv35M4^qqgYGF}@ZVha|U?OpaP+{3>#jjjwISJHne{eC;y67v5Ck>yR;h zJickh*D2%L#`toLuUp1*OeU&LH@+U1kL@=jR4w25GBXOh!<%V*SsB0Hg>RPe4an%_ z;wvz|AsMm{u-a^?N~h8AP&o-cjYmIakA?bGyGiyDq`Gp&6Csb>s&VTi`@U4IYN;)- zf}G2lAJ;Ish1CvLQmtg!w2<)$4XIXbaf*SAz$Rfw%3jiq!54?@=T1CcNKkUe6wp!^m(c#FBwp#5ZyN+yYt99W- zamwDdS{V|_B}#U<)#@OTs7_2-GNBahGmi=_;9?y#24-FWkP`7wiw2;wlg`gl5XC;q zKK(sU_1*xYi+tGRcZuv?5C?oz!d|@d)PI+O?ABr;|HMflz6t6BL56toePEy0mleY~?M8#1Vn(Jy}Gw+OUt%{N=J@XIGVMS9>=N$BcDG%?*` zWN%G;jhHLDX~NC*r}^SJdl^auqB2`y+1De>KeJyjXvU}fhBc`%1m{30TZmpP@yAB+ zW>#Q0*$7xIfVV8*U#j}u4u4*wweW5wd~3iPs)`AXFIYnyN|NlTC*U6O5w_h7QL2jG_AzGr=x_sBArQ__C+n3Ulg8xRB@=dk=*kuo_|gCYVb!P%g1j`K)x{tD zd$&-iL~_>$#8^SyBEDo%uA?(?UZP|NZ2Y)p&IWd^52a7hyc3#NO!#J>mpq!%^#EUK zz=JTK3IKNzj|cch1Kxo7MQK2?pprkQ)IuXnWZ!A1`U70Njh|>~9tLL9^rMC~261tK z(#jH{#hGaNWewU@e_*41sNa`OY7FAfG}o5Z91x3rlujMf*Ei{;+D*9#>l?@qW7mJqh!O4=@Ftsh-*ns;Zhcz|8H`XCO`mC|zKgYJ}*ju6`t8 zGEY-UD69dQ$V`$(su2`fJXw8v8%t7&v6-6JpK7eFj!)+a3`}(?!5&(ke8lUjd#*)e`^8eLUVbGqw3;^cdiO);aYms!s}bZ}MsTF(GlRn;u(namhb^>XVO z)C*5P>p42q303WHJtJ8iRvlnHchPTE9cVm*b0$s*RUKqKGbYRqRUK?SlPAs%RUKkw zo@;>271pB`;~8o_J1LE-!>s4l>+uY?o`xxSMp{olGFo-C^*pp4&z07*Vk4f3drY>U zzXQ)z*0c6HJd>B}{t>;N9qUsdm89XH~R5kx$EkAh19C9$zddAJ37^*tU^W^7; zsumc}pcc!JpKU!&B6#Ll&loAtLhCs?4$sxbGkE;ONujC>A2abxm@_L>wa9wpac|W{ z#^d+@z9W?0fV`*6F7$NSZ=ODZODEZ&uF9RxOlJU)?Nri*cT=)A;nqAcfD^>?Zzx53 zLyb>?kquG7P7K-Stw)@%Nu@OI#@BYoQ3c2U3pmvN8l99H>N!cvQ^aY~GU5p9a-Ei0 zFs^}8wD(9Z%5)vI{9gudtq$eTr}#z3HQlq*8Bh ziq@|i$Emk@G?bkkm#Dwr$%Lq}s8dbbv9A_N(LRrNq4r%$ct4+Kb^$PZW2B3AEZ>hS zJT-|+o`9-~I!2HF%&DS%R?OxvE0UnDhj(Kl|Fc=}`^}3nXA+6K;q4K=Nx*qZ^M`c9 z*uD|@7va6>^UcQH^VFERC>gb#iIY}x62Nyph(u`qxI2beB^8Pl^5?f3j1~ zDoF*<`3%rN$!=bJv(+>dz<2@a?0T9iUju0Neiwd)5V$QijAeY%_Tsb{pGJQ zH~QM`JPGKcn~*d$-J;%V1;{yf8Hsy4Xk72>#wEKCqaXZ>wrJYfhqAMZcE;)|`ghT# zZbW!Jl%jne@1*wKNBDl9mn?sKQ-8XhecNLK%?qCT8<%$kv|ZG}*X``5KbZ?p5dMF- z{Funs?dZ4e@E;I~cnAItfNTOXO*?bccPp9Nih{NQwVjS(z-ONl^VgYFkA}ZLJ*e(s7G*;N8R4i)R)U` zU5p}lQh?G8?l0`_FIX6(m{qEKAL`P@ndVAz)7&Q{;BuU!lbiNc+#)UH)~U!PnMu9n zJte!FRvv2Uaio+Z)c-n-9QoglnDQ}!iz(|3xMM#Muh}vyY`bOlCvi@}l#|B)F3v-X zaZX6;g!3=A%+7z2-t}UVRlubPN~w&DN)~+>Y8z%)Nd?UxX4{2;Hgee>fJ8mbp=*EQ zntQIuJr47r0JP8J&DXxS3IEjRCD#*SZ_8|@XAu4oW{h}^aI)miJgM}y%npCVCbmAT zmI3l|G?7@nuXcT*2kHr6XlYP#sV%ereVRz8ftVklbfo&to=cV4GJF4Hph`e&DUBjR zvt@SUQM=yU58x>Q=^_kWcv>WrrhH70-7+gRueZ!fb)T)`Q{74wLYls&x?zea-2{k} z^}hs&61K^5P16Bst~?)YDX+7u*hOk57=L%T-Xqp?Lh)0M2t2nmKqzbU(Jqw z@B;3kO6;xG8#u0G!^Zln-Qe|h*w{dw553_w zHdysQr`{SH8>t$JTjor$QK~hof~Yix*l2Z;gv<0ZHd)<5V)fS8*c7!z+_E(`HbdPd zZrK_e%UAc}ZmpUe!ZS@_v%024VWm#2Ze?8B06eDWWC>?hTY zzC?Wj_hf+3#gM7wZ~j;ID}vneIk$!T!dYM25uKhR(SmpJpVKCNLT%#uKZ*_0CN?R@$W zd*~&KT`(UCG+02Ev-b%$mI~k~%r_G?q_rX!1D(AuSq=Y&`F)}W4H)X2rnP7dmAlFN zc78dSZ4zuKFm)N2{?a0{oq7jBTn_ij(uic;|70rJ;}M(ejH6C;iO&UA zBv7x!rH6}6cP=?-0k^{3nh21m3$a}U31u^#wU2-05Y^!q%rlwJALEP%2utg2n;f#CMM)okw0|M}hZrDIH+~*v7 z*=l$T=7$3Cj8y|3aQ;h2sFV8x%-;eHW*bm!pVI|nRn;zKgoA93b&t?hT{4U~-g2gi zA+&?r(MQn0AD<5Mzs?@?tAQ}a`^zVVwAwep{-ZRWQmo6gEOt}4)sq(W3yAXF{cP&UjP=#!(eVtg}FQYgfKh9=;Je!rAy+!+BYu(aWH%bhU%zn*fRr2knX{2(0}BE|nU;K&ADh zp~!J&@l>Usw5rB(idp_366HBUogNW%xzkSpF7wc-=}b6k6pZmuiuRUyjwIcp{ajbnC+Te0{ z>T@oq1XLvI;LEx=*5ep$>ssN*dh_QU1r!v6@Z;h-G?t@<6iIjm@5N&}ym=prwFHY0{v1 zkI~%oCHFl63=BZUlo+{_^>A!il~-*QOa&l&#!73F=TET}dl?e+pnem8O##SilIKsc zn;*v>G-w}ygJ*!``BQ9T6A$!0fPb9I%V!Qv&0Hr~h0EUzS1ue+?*u9a*C5rgU@@ApNu{_G-|oUJqK;8`20(t9nxwE0?Is)NJf+(WQPvILt&h zMf*J7C)$@xcw?Ves#Tr%V=v#aLsoSL&_h6fh&r!TeXW?}y)OJQ@NyFQx>bF1Gj&uh z3;qIl%Y<(dU|ZFXL*efg`7QA7_4%HK>Q?jnX~sFNQ*xMJniZ%3?}a%ABg$fU(X>2_5`&1C4(y4rx~C@7s{52YJcO;zqitLq97o5L2h)-53R1gI;$RFi<0cA(H4wx|^z0rpk^wF))L9JZ(xo&xb_ zfJ#)DPYa2g!xpu|bE(57kS&4ZWSeL;${e;Rf0C)LAg%~d5@z<0i)!#ayP?$_wkR6Z z46us=yu>6sGJL2xY*DB6HeingPzf_tAb7n?o<|;f56aqzv7e)$-xCRAKZ_K=)&{cC zKu*E^GeG2sP7P~jc66A-79~X0=?`zJr8I>!6ZW4H4*v6Qxj5%ph7Y#>W8JVZSzZJ*? zWu(nITOYI-HwP_RLDvZWgixgcr6cpDNu`{#7&qrETEU1BY>QB@zYt6oLpR4PYBS=P zMI$%`p*ew|HqdN+2w2>lvS{Op8Tdw^_XhC5QnU4$UU75CqKzWS$Q%X#ULa$mkR!d~ z=8Q!fML7dM4YcAwzYKyX`sySk!GBUNXS!<8NDBJ!RHw4F@5irxmnW~+s?qCU!WU+xmU&WoK zH<+cmvZNX#UuvrnpXJI>vW+lDPhU_ zk~nyn(-k#-2-v9sUJAhAh3gF-=5$4kUk3KJzrgFk!i$ zAAtBeK)vLp+8aE~>55umg!w{M$QFfFs0R;ox}sKi0fx7R>32TH#P&;{&MF zk2iRj(-pPC`5@K?sKD$+wKsT}(-pPW-C&;z@Df&P@HnVXSJbNC1@>(Kl`vBUl9W<| z#}U`qOt~v~oer`#^EZ(YJ2B&f9Y)?U;0wXY+lCf<#xP<|SJcDEcwnW5krS>SM&wz7 zqZYzl_AT2YrC6Z4^->^9cB70~u{zwl_A%D%vPw27VmquK~P_o!KtaoT_N!Niu>d7(r_& zp|nbMv*u7m8(BFcGZ1`kAS2AOme*Gwsu(wiDvF^w>Uyp>`ciC*JGq#=n?n^1f=%8` zOZd(iRhH&H3^rYysoI(99+Ch_eX47&Z%cr5J>zALUNJr^EIsY0;qS{@kHg8_N%--FVI6ipK^Xx;Pn#y_BNgLI!`h}lAWC()53%MbsMk<Z+4%;C z$&P%@Q-YLw7x+J+6zxrJLm*o}h3`%?h+p7F2)2mYlvHT4sw{|notygrs5(9($c-@4 z+za8Pi*u61U*C;OdcGmBi#Q}b19J|dtd+OxzMGOyjtWAlLas}o6zxs^5huwLzFXZO zHWIWwK%?M!tg_0wLFEYtzn6w0l`tU(-#muI+5uf)YIa6;{%52`W|#(z1KCld16@fm6g zkB*&5kL@w9EC?_Qs#cBlKA8MPqyXSdeFWAd$&Z{CFslRot#^#(WndozTksR?aE=l; zA_a2D3Ero)H$RmAT}3h=--eqdAJ6m7&|HFag!N#79BRo2^yE`^A}uFq`riD4x?Azi zRwg;Qp;=F$!aG0n04mNG74lqY@Vc%>4g9ByHNfJl#NP0ndg+u2u%}9cKRSU7Sh%t4mGFvY3!tW z4sNzhfk_uDo-PqcWQU+Ph;Rx1o1r|>K-TgG>-*%;G_il@PJH{JKyU6dwfJkWrP$+i z5fnv@XLGDV4fX-ye-FwNF)G3!gxdqU6vTgF{F;a;lm;Z+xzIci)p_vW0J>W2UL5*_ zj&x}_)1*&v+7Wgcq?05Lo7HLkafi~Se=%8YieI$ug&solbo>jUJkcOo?V|5wReB<4 zHNHEcKyPAJMNky|41I;N1NfhZ@Cn;tZE;E}B_!q=UDK_HHbi`TS!vsFrQDcU{rUD)casmKSPo zana14ui|ZWvG%Smx@Ka*1iW3f_lBZ*dmWy#=kq!9$c6GYUbtj?(X|sMhawrrDXwtI z?xOksIEs9GJ z-lA)BC+3ABT}?dq6wNzA-1DbD0;G?DJXkdUFwf~C{fzgaqWK?6Ha=P7*5G#*5sY2Ao<*nh@FDk zC9?%YxZ`c+Y=pT?0OX6A3vc0))Z0mh-w4umBn}3Dk(r*v#XGk#7iE{=zYNL~39++j z@*zuSIKIh{mKTRgmiIhE>GDm>boq$obdmDTY}}5fRruwzr+Ffaro8d`o=?gO7*-b+ zaVdA$d5F-bAgx&(q)f!7Z{y+}*Z2|oKE!_<$`c7m8C%}ST+tXVa#-VOf}<0xB5|Nd z@YBEI;vLmk<6Qm+f!7Mk6A7Kg_F^|32^tLPgouLy(w@^OpN9;k%SRxmi=cN*qZ|`C z6aNw@PsAmcJ@p+Ml$Wc$Ga8qH+yvt@NZX)SO$8lyk?I9e>8?1TvA`bCXpAdovGNXR zT;d(jsNaDl^P$2+G#c-G#wXE#8r=hPO6$+j^D91~CJd(}yWoXoM7Q5D`bXF?GW_TVL&jT4JpmfNb|*7iLqm zQtXAY^Pw$}+o2p_PXT$wgN^fG)8tdD&ijNPhXMl(O&6?p65wX!f5#u4NL>h6#~@!# z*^2hUxlZUU5cS}0g%bOL(FOWQiIx#rNIE6MO#^Rb8~6}YMxJ-TVzmc-x#(NU@odvW z(R2%>vQEO83}=aYzXvJFuo`ohnByQl|77Z|P(Fz?7wl1}VjbE)sd~{%nY9jjN%;Vp zK(el3$^+~ZAkD5SUCE;hWZoSe5pFNNamjGg*Ng}sCmyF{*kW}81?Qt+i8)|yRM^xi z=_r)FbfSADG#~xl(B03|AJmlWE?EuaIcOiSNkF!FFt4U`IkL}0Z~G`Qvt+ytJ4-Tb zUv{}GVnJUfd+ZLOwBkG`bP~k};T|iam|_@zDIGPCtx#i1?sFimC)r}K@ta~`Lz3(o zl6usg=Z}uyoRT4nRbzzbL#7yFKRYI66octk<=a;h!AWQ|?kogHdXXel33e}#+1GL^ zIj{mC2g<-k>s3bdPOnM|dOk)Cd0x`uB0LCMVor{{E1^o{19TmFUFQ+hYIEMP2Ta0 zosjB<#1Ky^Xx7Wgxpz3@Y+%!Y?DJq=0on1Y{e-V(09?Z9BSu3(x%d=>yMc+$l%ck^oDA)rHLCHcCZ1a?eL;5*eRr;TMs!H}7 zOI4-I*7j-gc8K!`$X6iUw~0f|(OuF>dB-D^F0YGBznkE_MDrT7ny9|S|0|Ry!o-sI zjJ~t#mhXNDDm0(j1<2M@$?4buY4Yh0`63%&ys4q+TPIueujAAT7*KWv;C4DR~mtN=I4m=Eim9&5v3|;hoqB`Y8Cl1QZ zMpswKD;f-4i`6kCj%$S{pQbgPr{tXp=}JQB@~TLh-q}9uHfn=$-L32;sjDv6o#9X@7UA7?<$_7J` z?Y5Zl2Kg)?KS4n>;gTnd^kBo*L+NG1C65*9f{J|?md;cbaHiY+E-aGalD$Rqe#R7+ zD5(Dq+5IfXEVc(-Ao3>?o3HCO)z9*54zvST$e7 zlmS|zzB~%Fi)Cd=$?6HR?E8>R6hq6&$T`z_pamrsgfXvJ6(zeew0R8$oeSBtR#UQZ zLYr5ie7(*)E%Ip;UWKxoJcZ@5b;;%~_797+7XPtbkH}e-Ts}g_kI?Ptc@Mw5 zV4EirMvuG`TXZFtay69mGr{2*R*^VRB>3r{bNLx1oB|el2Sp9woe$-SgeaOOFTy$< z2;yrrCL!XmUGRnSI%_ChUQ?YeVl_~c0ab1Y7XJb$PlQpGcd5S9VC45bb(%^YxAs8HU{6Mb(%`_b6~eZ4%LddwjQMrTdi<>u3+ihazIgReyHE9exm z%aCL1TbTo`@+BA(%wM7JtX4(8zRZ#%uudYKyOaYy8?jED`G40bYbz~ptu%M0?vp>c zoEo8B&XoCG`AqeWIzx;lHUm8=VG3rjj8ntY$UD%ro z#@Gqj-jFs%abQET*LQkL2_)sqp({x}r@-iaxOpOBj8XQ=7QHEYFvjZ$E*2Si;wTOj z$wuAjv$@=Wl5Nli6z#$PD3m7>+8AY5tn&iC4XWJ;3$?IqJdu8I#m= zQn8sSkptOZE&?AzClES?K#Kw_$lFmKj8J04deU|>Z0b8-PrccYZoIi>k#f>b=_ZF} z{T5+Wh2rGvIGVf()*y;&A2#y^e}ku1%8_c;h_q7Qo3F<_ydtaTb}|gjl9Sg&>i}pd zn%@)6ZJx6;k@nVMG)JuF9HZIuW*5Bm0ygD&M~4b!=c6cG1l@?z|Dv=qMy-oL&orb6 zhZ*umm~Eqfibd z5e0Hm?jI=0MeYVqiN7#0b!QeN%tqxHIZ5jQD5EJ)KoIat)qfMvj7Fc^(lw)z_2rw< z=yMU2-o>Z!1qf{Sgv4P=^=BYefSggP^0wzRIX=R96!0-f zw|L#dFVHK1=af8@2u;5iURE}1Z>VN7*1!0FhVn#^-Y@T2ea{Zf+8U*IC9+;nKai~o z6Utk6ph+pVUh_?HQ%Q38UM2#|g%H|+&|e%iXL{uujJTOQl()X@nPRY>Z?x%^SBO4V z}3U1r-B||Mxvr-8}2JWgZjN!} z3fCnRGtYU0IYzy7ErRM_g_u|=^%ymSj|eu0;0s`GhVY}VMw~`#nb{_h)|?uZ(Myi8 zu|$NK4!~s!EUN)bdbUcndehcxUC^H|4|aw47h%dZ#MxwU{LiBAsUw{v4YjoKjn_qQ zd}cuIMR`c1Hy}@AVr4+?>uPSQ1z(Dw7Dr(&fF>`1^NUmTmuj)oCc&!~bND8N`=0zl zu!aipIS7-QblvlZ4w|HopZV8F01uj_P<%e|ZcXLU!cxF*Qi`^eZtJFE0BPiV2=vXgPQ-KTy@~1dfiFyJB%15qC z)Xc{Ek?RumN^||lb&2`_F8-CMui)Y%*Cpx~xH?`&m(v0ruG)$aRT20N4EM=z0UL$>-Ab30!>Sxk?H2*T~*Ipx)1Vje-(iK>VTsy|Lqy; z^8a6+u`Yiri%g!eF8{F1ImgyV9J?8s{-Sk-B?>c43(sWxFIrc)T78c&dC?kfWD^gO z$cxs7gp26pMQeDE3Dtkmnw%lj5vf$>MQgwwU~tE6_!vli(YnG`)g4%Q(HibdxET|l zWrUYvycezEuMWSwXkF8)R~BmoeCg7>Xnn@ac_5zdMQfY0X})M(vECBskp80e9big- z(fUz_q`heUB16(%wEmDGb5Ppei`G9dB<)3O+eSzd^}u`4I*TD`FIv}QNZO0mNrwEo znOu8NC-I^+<+v|e3zd)assA4@T30;fMeC!8LSD3f0*-R8A(Pw}tzTxqqsY6{y=eX2 znP>*mC9e*hfExw!4_>scv}9rvBtXAtU8#tSsx|sm`Ta_CWFv_AXD?cF+c@<_>uL^q z1N`*E$`QytI)@AkC05S5`>dQtIM~t>V`}3qGN=wIcY>8-s^vc`-$*TBeD-kB2ubFZ8hpM z1Ux+E6;3bfkJY^i|umX<)L+zn>-j~wB*m0;D7lW>X7Bd4*|}& z;sS>J6{r0vQRS;mp}poD+8ajLi>kW40-hjNGQKsq?P}R?)IY) zUUBJ}uzO+Lm7Hzv=WOe#sX42CZq90-o3l*>nVz$a({i?no3mW|Qsog_Gnkn8qW59q zkYZha+MGS#!}~eA#$m#)K;>5%rO?r;jPCEiUGYggIIWh0;lJf<=-*^n@C$Wm*PKG; ze@yq=XythFz9a1&(`grNWq8U%_T?MZN4S2@{u@Nmz&vMP;U)kNQ%P~5_)?#<4)7B=e)LV_zvq)N*j5*A!o59kU58pGY=++mF zh2G{x^fRT4a?vM3+A6*tk8{LCi29cGDNx%IB=)4zSbf?VkXm(t z2DPvl6VNTi5&h~5u+Va~{7;30KreJfGAaK}%P0jS8~$9!Y}h`^j0U&6yiyUQ-f$!U zu;+IKK2cg(()qpO0wqrcC>h%bPa+|4bu*VC<4um-k7ROjvvTwC@T}4uce8t1qqpmEJM6zeR?2RMA+O4??&ye{y@sY5 zsQ41>yCGhwW{<8!K<0z69rmiqo->*k(>>D!QSjHbXPy6!0Gl3N3Qvyld>V!)*LV<- zRcS$CBeFN2QU$AmJDf-h_-a}$Mj%qBT21wJS$y~2iNIuT{KbgNs*-Qzfqf3MbwG zxlkpqC*&ic@w>Xw$7u|{tl}4nk1%}w#G9h&YbN}FInLz=*HBmnKk2mMCQ5Ti^m`B;UgQzyI^I|jiGt``LliBxp97&Rms!eWyyHc zeEK?xl$?0?LG*POU#EB_?E6;9L+&FD7sSi6R_3u3>^fcJ3+vK1M36m@c|>J9TVO|! zI*S73>ro-JVmX8oK)4ANKdZR-1D4He%<{m+YG_4#K5?W843lr# z(56e_9xgTPY`H852l%;9ruINyl?lI{6F75CjWEnFg|+E59Hca<$njevHb63x0nB& z?e6%WGZ2<4yWh&>l$f97Z|_2Y`V|q!#0kt$!8{)qj6!R)A10<6{4sH&YZxh**K)?o z|Mxfp$Rz_h1!d)6vjVYvG?<}{y-*yhN9bV=bGc*?Y-^nALg;rb7V|&OlzvF^A?QPL z2e}q0)J@%pMyj@gbSF%V7=`O7PZXk+T&RA-kguLZ*nXc_PfZwTSvBtiMZLvfaWcaX z!HNtQcAGDb9^lb3&Hj68?VeZ_E&YELIG|I8S}Dr-*}0q59j zAY9+;nK9)9^pd@xi@FomgH);$cvO_~T+qyIS78r@Aiin+o)4mUtFB!BnNiT2eBXn3 zi~#Yuv?B5G8SBb0nid^E=1yu4b-wb);b7)lwC#KVQztVt=)rqEGggo3}`+8E7L*Ii*=;+S3}(O)sl#G3lR7DD2a5WMxC7t)TZm20d)X~*V9pm z@R9NWY@2_L>8-v2;75Wa3#~SNYJf9iLKdXS<)0Z7St%Nh=%lCmetG)^pY3!6Bq4UT z(;A#f9YANc)13hnlI_q=NIPcp{z+y1X>pTO`#kjpLULIvS${5=hTb_eQ2hlJ z?Upy9-w6#%9t`RaO~CZ6722o#$PjtI5jgi^+& z@(2~RZh>0WLZekKhLK$2sFqyc8Jei(A&#yu+yy0W4-ueLx8WTMtk9Ye7v3-vuv=y! zr$aY|s#c;u%Wl~hETNl?KdLVX4UJcv0LlfSp-Uxwaw%wNhT=2uaw%wNrYa(ajU+Tn z@$GlH6g0G0arsX!1q~G|o_CTcsQTtGnLRTnG zI@M8x{00*fA0}o(T&;uS@(sYFWl96^` zw7ExP7Xv4cSBo}LO7pR4(LbOWc7fq(U$`t(rOJIw!`=bpyVJnZL_V#tP85r%Fec6N zDQmQRP9ylbbs`;+Cg>Fn>j}suK8$MVg%~64Z4H|R$Q7r7rHPE%k|Ude+vQ`~cSdQs zg;HC?4gm6w4`a=U(gKXPT!$Lj8{kpj0dm}fnMrkbnKFl3+5ZA&Jgdl=nC{ksF&QF7 zY*20NoH+*77KkoBO0vzM&bJRjN0BuGh{-;R?F_dH%7xvX>{u&UAJK@=+#6d0oDr-41<>$odV4VAYe;D5$~qmX-#^m#kZ* zqx|ZLbO?Tu{mX3z-y7I`AMe*r11++5Vmd7f%mb_>9qI}!wg-1KsLep^@=<=3G6HY4 zZ%3CT0$%{^kPr2%ihvR2LwIrK8gFN$>~lsY4BZF0k^TwQlyQ`6SRc?dP`|D4((3;fpqfE~xkHC?+kE z_=7;a>!VWhNuYn)HMSe*kAOLthMUBv=954JfiET+Xm!Av`OwsSx??VKARPFpv4M62 zY={pP1x#iMv}~Xo26fSO7GPJO1{xJ6TBr!Z)F9xDGE8@Z;mMPjQnO9)?E;*mNF?t9 z`_*aiuILVdi!cZXl*jk0!k7&4w9tK*QKf%?4+m@pk2)9F93Rgi$(4Fhpvh!|8Un<` zbd(m@L8mQ0a2V>TVnD7t2__myyEWK_f%+&kwH>%;PQv=dXRylxpY#LvUEsby37cAe z)k;u)D+0;&CKDpnkqIy-X97|t(CY*B%e(0ZEXRkM^b2ZBpg%sTB$tK&F)7q32hI2(Ap@r75?2Gz^@}RR=W860;8}#<4xBs&P7)W7$@@QKHSk`O?VlaY@j=4{5tL9|hfu_+w$@scVZPzn`0`v)2c)j+I6fSxHD zK#9W}Y(zpk5Igx2x~m4%;Y#NqTFP!laS4cHdzqbV zNhE9r@%B^+0=V93e7TYE6o?0X2^V7B*9vWN+FXog#TY&T?ORWP)PE$Epxc~v80N1f zC{!Dp$S^u9G^o3Nmt(ure~b~;7>FcMdeCAqBU^c+VraMX!-YmxUmz|yNmd8-`y8O2 zak5t;wppMq_T@-N*In%?2I8Re3FNTCsq2B*;>kfozpVh^C8soo5dk~~;?t=Bu1jOHdVWR=~ z)Zw8;)fNQamYbR#2Js)~y1RfF2I`b_ggd72BK^?!&ZCZr>2koXCRA6(4yxKd0Df|w z#LP1S?lDaeM=!9e3l3+B1*2_h3W^N=wu}Fm~wBTL~H-+#f3Hw{){yp$;t_UE%Ko( z!L-g;MCS%?Lkkl8Mquwc4c--fLGUgVmO%Fb_NEVIeR8X?JZgVou@#`c;i0fVR|KCy zM<;nv53qy}O;vauvNp6T_y{_9f#v}=(ubxhEYNF%8AA-T2(W8>sHcFNK*8S<kjCs>1S8{ma3h+&X+eVEcS%Y7PtZ zjbJH^fug{Nfc@k{Pf=L#p9WuX8(p~u_~katX{v-kzX*0~ZbY{Rth*0QRhXMwp>Km+ zqZ-YAcr;+MeW>5%beC<1(9z&4ZOpdA)qvgLL(K<-ykh@L@U@8s^&k*0_$W`HI~@}I zpTS4aL1J*S)W3lZHuRE}j!)}_gfkqu!n5-V^p~(Q88|rjBdUbUWln+Vu z$7Y={77W1o!vQ`o^w~6me+H0OL7of-?z?dy4GC34M{lbbFb&gjR!=o-F(AW3x1%(; z*JP_sfDA~7MM(iRG9B0{q5ovN*lEBO`B=%IUTXLPz~+YfV!q3IYpa_9kp&#Riqk_L zX~69bzXnNt5Y+v?5XPl*t*3hBEJ#`#Dqf`5H*NI^a9?;>s3eFDp+IRpjj&Y!g<2X$ zSNhW&^=Ldiw?K}1oO%kxBUwo*p6zgLGvV}wxFnYz6V5O?*$lAhg9edsw0jnV3C<}U zz`5p1J^DA{J}bK9O1-%-i#Kbk@z+S}r+pRT zdlT^W*S@T{eHDBIv@aU3fP$?wkd?x&Q!SoB-yrRa#mk{ftTb5rs>h$j46@Qi+E*if z0}8#;5bdiOpMD2?7i(Xw_>V|IrJ>qaJ6?Sve8aS_PP{Z_4%fbT{3*)J*S@;(>nL-C z_SK6|rc5~iVArW1|DG~OXGJSR*0fH&hvSEdm8NN5*Z7={piS4l9`WCA zfp3QP^@(5Lz&BI-`p1``kFGR}MQPU=Y(*G68Xj3?FJ<+qbTv;EWIMFs;V*IVFNS|P zJXNY3FpO{ z=cAMCcN85;Y(c%UqEMjUi$mdEI0yh}6zF$-7~VzNTQgvP4&7qsEP@Ps^i9f&oy+9f zpKOJ*)ys6gQ3OCXBdMz%yc5AmMxt&-)O@}=CO&=E$^hC((0&l#_5sWh7qz$#_|C)1 zuBE;K;x`XvR)6v0#d;vx-+3#3ZOq6ro8hYu#zf}Js;-VKLvT*RG5F$VCY}dWM3Q&6IuUhD=+!{0lS=O~0rVL+wKw$hKK|`L7%%E(?M{WA|#ww>l$aj3=A0YQ|F@dS%9p zXU=4Js%y`H5tAlanKcY$?RB8k)SiYsQ_T|g99ELvY-c7238yM_NoptUya}+J%+^1h zYgxHVpg8x(GTNflRZE^N&#b3NLTJF|eW#i2C~P1fme0t%b82mFDhu zDHUBQyT5EPJX@1_6{{;w(*$bE?dqAMcV?O`%w3QXwQc~plllUKX6A%HP@B|#1iu6m z3!(0?CLXH;+VnCQPAUSdJ_qevpWaFJ!Y6R%ygJu_W<#Y2jNu)uRwFcXfwUN^Y^yk^ zEj)y2Hy0@;D{~2Bw3X@#I?lrxDf$@l5Di&DNI+c*>Kq?YnTe<=TQ8YcG#mv^1O(K| zlMqNtEwsAKT_5D&cl^j)bsrE1iL#j1D23~@Bg{ke8@2ZT6V;A7c5G|cFG zOkh_5af^={$=$^<_N#mHAgo$K=(AKz!w)L_17hUq>gMSz2w( zH~pA{Y%K#5tIQk);IE4TD6ek9T(CBS>Vnw91L(r-E-xTwR#X%FnDvJXff(eYB*VHZ zK0%XthB^ktI8Rg4fmm=7YN)yh+X$Iab@Y0)6vo&@&BIaG%&O`znnzvar@9+FIsrpv zJ30YW)zaCQ8r0ym^?9%8CSE%0iM@t1IY=8^0ST2 z8lP}7At$MWxkYE34d^5wuQoDRWu2dyK&1~iz-0y9=v1nIJyfHt?#6QmrrB8+8c&~V z;OSvJ<1t2L^)#No7r@iYcwWR=ovhx*GX!6US$&M>7W7+LdD=5z^q5grR$t?pI%<}c z)z5gwk14RS`Wv37Yk_Bg@u*^W1{%+8D37c`#KPdy{q&uoHctnplP89d{RXK7V<#v9M$D2S{H+B0Cn6f0|*JTI;WOr4Ds zOgEkpv&L9iGhENKX;#)u?djie8Te-zPu(CqvyEpMGjxveyf^}$x!N;e;FB6m28Z(C;1zfB!A74W2-%H#Su zUcPVN7Sfp}N|&=sp;|mo6qj$MJ*AUE(eHGhMOEaWQmCf96VkN;`i-QJynJ5=!RmKdA$(zJx;}zyUbdH)??p%r0P1-lD8V<9 zLh|yx2st0L3q86kM0Vum<$Dn_8h~l1fbuXz>zD6E(h3095hTfVC6y}#NM61dNjm^| zlpsly3*yU1`sI6(^f~|^5tJrLK#RI=#yM!Fp3nX{Z9LEb!?k9!s&dHH?| zXv#hh^FNr_+Y|@7v@?16em&{6L2H;wmv$yE-+xMu4xn`-T`Pb$EoVT!Eid2Crhri( zPW1q~(stJkNxytAVpagL+CyOyA}vk7d@o||0`Vaa;EIu^reD4nF|Pn|=oFN+HU09v z$T|ju4dr#3U0KrDYRk*_BC8q@4TzGIxhQE!`sI6()d7fJr^phNe);}NX2N(NX8EWu z;6xgwz3G?lr7Tt<_r8x2WjklV9^MF+-UHvj9^jH1^@z)Ms9vAS$JT+jPxLK{ z!oRKBw_X0dy<7gh!yje#iN4F9UE&{qVc948UUT{PejojBn*2MoTL0rO9&`B9Mx4~; zZ+py1T`rjEle#bO1x=o@eir1Ic=Z5GjEsJCSb49DkRh+;pxv#dB(}Q;Dr25Gd=tI; zq%O(kr0&~vPC&cM7|CxAb5i#UI{)^hZqWh!x)u^uzw?o2FtP8zqoS0DR@Dp>yNsC) z?#HhPK~n{=miZuxN83FgAJ7>Ezrmw6g1DIg@wv1j@jZy}r#xEpFEYC)b;~{p=C?rn zj}Kt#^a81SQg`r!Mp+A_3>Y0v8fe`d7gQI3>~v82N!=rR5b1?L4E0eGsr&@3lhP-3 zx9atSENnI&rue?16s^_QytTK_-sw5Y6#yylSr*k76)t%HqPUl8C zt6D&yLfKu^T9kgIov_$y0D?!r#3(^U8G&CVy(q(jd6M*68Z>W!SpjSNu%x;ep%T&&7uwLD}k2qf3Et zAqx%U5s;ttAw7X`qgbXP?}PeHIzoP{>B6qiFdH-TD2&!bZR64|t2MSMaBY0- zD(Zz}S5=U%J*o+si|PaF2p>VU+(_e0{tNooU2_3h=E2P8yFNS`c}0zT6e~r{mzx2( z%Y#Ktd^{Qu`9-U_IS}6xwMlYYpM{CEv>!T% z`a?jePUx3lOmP@M!oKPO9Cjw40f@~A&=T}nn8y5)2^Mo`>2e5-tUi zZ&-Ue@UTpzi~Y%c7zr80l^|Z@OVEd9B0cP#k6{gsfO|l^KUD(H!bI}yozEEwFM;?* zsssTHw2wb)B=8CApM44Xv_|A&`*9>wmFbM%Kft6^1Qae$d_?l?8he3g0&4qoL{$2p z?utiCBIE55C==|^~&`0dJwmy0=OX< znQJdcYLB6Qs>eWl+6Ty?o=A~B8hvFwX4m_m{l}y0u3dwc+ShN#P8&fM79TQTQWLG` zC6O!aFHv?PsvZz6iIUW4Q3kcn{`grVigc$T7PP zDzr4Jp@2>Hq3kH#=mh$wec>aJxD=3$C&B!FLm$74lmy}^3=w-juurDr5jl@vMy?Jt zdEB7h1>&o8RFoQ^O3%RzFmij~#+MMe)fFE>FkV`>VSOudPv9{UV<0s2h*5S)*dpfl zWn^z)(*e|El>@T8V6Ai0*Sn{B7EJr5wH6$E`iHTS1(Q2Gghz=`{8&oP|NUI)}mAeu!I4oaUP@1B52Cj+t2M@gg;v}$^W+&CAg zwLol2M|m^kiJzGn@@@d0BuKK*YSZ~&$dQZ*A0x=jkXaLChAc(frhh|-&X}MOodGmK zVGDp)2Uu<1%@;szAHYjp1RysGNWD$3FWF92M1pNH*x61Oa3*yCo!QP{22hP`hju~& z63$cxvvTItf~Cq;ei#7_Pn@TBof{4+Fpd`n*wS(Q4av%>FCvykP%OE#Acr-!y1EvF zcDa(KubQFs-yj@=i4mrvS+K>@ZD0dZFNvcAx|RnyNu7`|IvJdI7UL;Z;rw2R$NeOT zSJ{frvm>F1)^4^8zAU1p0hT(GX|&HryD3#kF#JhcsptzVqLyXhtir}%KYbOPRhz?^ zv3)rrsjFIGCQzydqf(ooz-=%w@u7|jEiS&t5Pra;MHvMyaCnCLz;EV9W52#YBH^|;Qm|05c?Rs#_woC^_CvL~E5=P<)Ex~xNh z>5o{=bboZi*PyBSAT5E3iB}f^F`}Q;$vjq3^hdnlC$|qJ`5*5?>DB!a$)*!pLg%SH z&#FF3p2Sw)gX=isTnnIz7Qyy>TOvyVGQUhg4}QOo5|M-#PbLcpGzwe zUmn7Td9>&@GP^y`tnz4LGeBJG1LX1|WEl0(zoI?6u~GI$pziRIsi1W^NA)A$>L~zT zO9!R*JkNJQr2hfpS05#j-lbL3JN+0NzQOzHqSvz?6$U=7N4XeT5f;p}8E zD@a~zSa!I4N6i0nSpiu;`t@0l^D=F|VKb|v>=A5r;Yy=O9l^#Jt~^-WTmuS6Sy$~5 zxZT|f*LVZ(tSWRY~c_{A|(%DxyaVR1jCl(%D~w1j+m zbxR=GjLao;>XCURobDK$d%m)s1cUkwRz{;A|gs9YJnO zxPyG>gLnY};&W+5;=35(<2+h)2btZL@CR>QDgyB;A3){P$Ka+IG)39lfV$5|GPm94 zvaavj7zwHD3jiES2c@@!2XJGfIs$}^n6$=GiB#^uaaXBAyj`j?5OvZ~UQ2kcQ0dz* z&I6z$L6U`DOOV8mK=@=Bza>bpo{4y+>p4()9zYrrVrM(ofHSEB=*)I*VZbIJvK`t9 z2}n4PGMLpQ&nks2?eO_6`lEiZ8nS-GpB;;u+^4LJPqr-$p_4QOX$PIz4(h5aZU(3u z8C6+W)nQ`dizeXwo7(;)B2PFx;*$Ip&b$y*aKZz2BOsSFs-RonMG|R0{-ixTauDct zoq%bKL!>bdQ4c}q@KEyF>RQ;m5;R7yitd5^H)?bMIpOSsotyzH=Nzbkf#*lKO`}U2 z;3dmtq|f6GZ)j6@p@YbMj&Of;d6Qnro<+Z6tDw;O68i4Bvk}TByU|RX11%#nlLhNkkabS}=fX-~^B?hqY zvmM$A3CPPpQD=n5y*3I(%?cxRvvpb2xuw$Uw`_Md+A0~@i(6V(xb?gZIT+TB15f3@O2=(9;51=^*lbZ!uazb}m9 z#yN5<1?>vbwE}vhKK%3dm6dgn{I`I1uSeJ0aC##?{6}Zp&nQ9;0`M;ng!K?^ABJ&M zyoZtUC5S(J04+tIVG2joqG{${z4FL5dAeHC55U7_Bq0`hswQmGsYt`jL5NClf-zTaEL^#UfH`NYuG$ zjp8!96TU>fJ_M06Ls+7+84w<=_+Yv$(1*vUxp1GO2oH}_)tR#&K+a*x5}!+)qlv$R z5Q0oi)MeXUHiyGSDv9>^7yzm!5cP?QQy}t!yTjpPwKGRq_Y#l`V%JoFlrCd# zG5bBD7NIvH!dq19Qf4C}yj7h~H=hU(-=aFxeJ9=96mO&tMX+QPzE$PHJz8DLbgr1b zKv~x_&s8JT0i8*smE26a>P~zwXj+#PS}g^>wY|~H@>zOYjY^^Y!p6SgOVE}GZBYtM zO$Y6!t6R9V8&YU;XX@6Q=DW0qQ)qI7>g~hPSZ))UuY0s})y=CR^LE8vPpPj!I1UpN zZ}c4mMn8jvY9Y8C8dq^BW}h$y_8nnjox<>#X6OKLFQ4HzE%GKteL!z^@FDBz9wKeC zBmAN|HWyc{j)sO;0&<-Pi;5t<5fOe{%|gCPG4BFmw}(Q7?r|sQFoM_!G6imyz%zhIoquhnm_;*ufMGSv#i z^9Ycvgbv)w2>+l)ou#ag2p91W=1Un@k#=8r92ZwhU^qnd%JX5Q)0IQ@sN*VJ%}18m%YQc+GjQ~&{qIEln#YJ zLG=o(SZGkkfGCAw+(at^X}Qp0fkw(?V=cg%_|UVcA%309XvYT1LZIphYJVS54~Qr& zv(g@(98g06yA+V=9t<(@7q8*Mz|F&qQdfd_od<|YOa`?i@G`#Jq83!3W=2*wAO;YnOVY>^)Yd@NI!4x1Am*PUYrh3qw+B9|q^w_9E7k$Ag{U-Hg1RSA zA6K6S(2uFdfH*)@ieCCh%;8;ubv2RYAAtI$FNeJhwhH)DxbU-q40ITnxT8vEz?i6{ z)9I-puLTZZb|G^nRUeR~50mv1S`haGJM}LEYf)Kk)f_F>Yste-|B%3-#?(<-iYxQ7k9gsxc@@ zQgyLN`gN`Y;k}hJsb7Nl@@gu0e6QO1F zPz#YK;TxQDu3#c7V*HBHq$IMZnt2@{_c{wNb`zNdq!VFjSoLUTMB{Vt{@|lzu2%+hex{xc$ zx$-r{&u3W#*LSDJ&O;~Lmt?&N-rrvYA4nx^PE|_{V^35~O&&4LDm8j8z-ld`xE>}Z zK5LAoO%R{j3BuzZF}eT@F835cyb9u{>450vMCsG5rM5iu8Lrx5Jja151&59&x{;uc z*rYTM38=FW(7>acY0E!ZMgJ!lWHWd0vYnRDBH=7WJV_okNI0wL952qkVsBzV7dS^& zFNIDmIOS^u)K&BZXV9&lh4ms#OnkWbJVx5w4M>pszza7iK%CnUmNN*`TpVRD8jIp{ zkFs}^&xZ>i21Qi`p%zR`y!zleFYuHF6z&7bmFD=C)~DPlM^3qOLrYG%|5Gp&;+9a` zVWLoJ#ZRW(BT$haIvrJEp0chLjqU;AerhD%f27DiQ5NxYWW~Ay5|yMgApr@eiW`8X zXw=ed=WGVhiKS@RIo#n1m&y78!SS*W;u`lB+%baQ@vWFlmT4)KAIk|`GAL7tnO0W~ zzy-@?s**)5fVB)JCO(%|Lwp+%ewRnndsfHb$C?Va=*u)}jlM`diI5k3lp4?CIB^6A zC7?&cz)?&&kddc`AT87;;rszRNeq6e3}+6nQNrq34+t`=XA=;jm#qKV!+OyYq}DJo z@#<1|e5t7ybXa*)MaYn%OHq)eD2Y7-mqIdzpFyu)SR>giRxhDbFIHbp=e}ZKN3Esv z)Xkhm9hEf+V$|cX4#LDX0;r-C;w`sb_!~Bt2>Jxpw?2q6kx!6EF#aiHXmp z6^XAp!q4_-(Ywg(F1Ibd1o?kHh<$tjla#iSwz?{cK$M*T)NCJ#;-Rv#Xb_kj339px>zO-Cok^SbIU0778ZS!lI+ z|5pTNOsJ0_vrEjHAdA>iv~Au$8=^BNboBwtQP={w2@b1G@%JKOf)C&e76OnP6p1teiRXS>4K2K7jz)E9Q|b*+v#e z+BWj(Nmfp=h*;WZB5Leoki#15ZX?$cT76sGJD4qA?>8pnM|13I~ELA4@*Te3Dy*7?vdP{t z%jKlKe{pgsT$^+BB5yIo4bd*quAVgUi-b7@85y9(hOJzDf*GP~W)>v)e%?EvvfA3){P zyPIlQLKJ1+0gAt!)X}7Y);)`_Zvp)YKsm@r0i}00w{YFQ4iM-1D2eoQ_@SEaZYIBn zbag|>fOM4C-F$-YEa`5h05F>%$wDNa&){SfOXAleoR3j^osH2-I$f_^JqN1I=g9Dc z*xAlLa3*yCo!QQt3}6k)c4#LgAmMz&U{;X4wXm>vya;QrxvYS!A7=0P9BGx_-ti_< z&ED~~;+AFoDC?@bcg+0s_KqpjRu{wO%hfS@RrE60Q8pAkS!a|oS*HU^9)V&B=SqN* zwP5A+4}&SA3;Rsd2I$mn;F8ZlQ;)&_G)zpqy6O`nStNaJwj(KJ2aJ~R_;jRnH2^6s z;YNCOOCZ?{$4}F#hvS2Ay8B!ku*h;8464;MNP>yI3#y6|?t*4s9KtJIps69S#`>Vw z333PC!{nO};t~SH=hBMAcOAlS@o3Sn$n3U+iTS9MyFq-;2T=L6O1`?ds!{e+puY2w zJs}Co>Vdawz<^4TA4cmUlG0nkHD5yGCP1|JQ4*;^d z6VAV>?Z**$!YKqO*$`GmHlZ|dcbl*(I8wF=H;nhU3A2Ud zZ4(CR)!T#%*5df8Hhi3eeW1()BjsVt)RS z<1Wy4k**bRw+X9){yq7h2aP{x(e(6f!c1)Ah>-6AIOc({2y3}?sohDEyXppoha#1NwHmV)-S41XP*cvfY~yffoZ}+Y6q$g@&yyEX#lNHcs>j-})4q-ZCut0waRZ?n|NREyG!Zm7%?yLepD@7h%s! z^L>><(_4lwVNLcWkr~2zvewhvGGq^^R15?zHpj#pErY;lC0PEJp%6L>evNB227P z7#>r?FdN`vpP{i9nYv|o9jMzp#K~KRobV*Tr1k*vya$VlAaBd?mvN?;4+HVFheAU& zTZTWh$1BWUwA5YxE7=eUBpxH8P@v}iS1foqk zN?vhvp~C_-vH2$X+#j%fAKHr=dRvBr@Y`uM2h`<0;vyiTwEQi@?Oa{D36O0b3^AE4 z!yOqWm3u&Z-UCD>CU48IMJZD`4+HT7QBpBnl-V+Tbhy#FbP?{ZgGoo3EyI;K%^@wJ zIS}U&rE}lJXtoTqJDV5>0x|LwS!T=dvPDK#5fGQ3BFk(U&O3zr>scYT0)QfPa(C{$YUlPtFYG4n%8Z$nNMjm`m~4NOeDdb#a? z$duJ&Sp0t+hNVmc6Kp<&V&TyaI>IhnXKKY4Q3mX_gFx0 zvkfT?s!lbt4M{!RZAh{x2UZ!FnD|^;4e`}PcngoF_dNE%kJUK64f$`Jc~ci4q_2;9 zj)0D;|2%gqeJlcIdUR7SJIYq5#G;mixYh$iWj9N9EtwG6$7C8#4MAowIXM3h<|Hu* z=P&}=?qVrsHd22gysJG7lk66%b}Lq>hS%PVp>G|exehCb-*VW;-F=ytfy`Y$1GUfH z$E8d!1Hqy?!|DMOqX7JDRPXWD5Z?#{&G2Z^J#dQUW#EI8k%7w*yw*qUgHxxLF-!Wz z!JXZ-5Tu{lB&15+tUA#DsAb1V5~geMB+rw ztat??W==3-`@Lte)mx31rpV29kw*?|iZqN!Rca|W+eKyYH;U!Z9_6lr*!KCZ-#5P2?V&{Ek6s!-xIX=ip;(}jf?IWlUvMSgEfWfDLhQ$He zP}c=b2VlV|AYO78+4=#BO(d-cVCyL$UUCPh1B_Gx`WS$3 zP6GKYi0h?kcM_ytMa1Ti?Zl92Njeh_D?`F*$^bg^c%6h3Ik*}VhFoboY-2p?5_$0) zfaFTM$V+~!dev`Ludxy8R`ohB8LF$wp=2X(QkJ?F%s0Tq#OKmJ7T->UKkm`eTGi(# zcH)jT(A1l-4iU7T;@npCwYuN3CXoI!tUpre(yD$~i!$0mjx(>s3=zgCU|Q9&fuMIK ze=E>(J-Sw5>UKDhMqX$asi%ga>yVNdj^K$t3RJT{DINIVRzFsuZ0ANWC+SQ$%(R5F zodNyeZ2L?YYLu<5K17HtbeD~*w>Vsupu3S#(skfI{8BQ&Z@kJI;CX(_AK=+mxS^vD zYEhy)z>`JQgVh8kCO(%|Lwp?&-p`{&H^CXb6_z)^m$?)J{CI@S@=-epkm(HdkO7`5 zoEm~Gpf(9PdX{kR249lMgcE`@hYQk}xJ<{?-OT)$@c)*shrr^di!AB{0)lYF#OKm# zh_5Qb8+kN6aY;*8f1JZoIY9LAQFGxuY2xCg%bU0`1nHtSIG!r@Qt%~@^kKj%I-5*I zQ)O-8m(QgDZ^QqI&eHCfCc%Z@$r3dvfF1Uu$bx9*1wmfS{QR|OnAIG~0X2ETXe)Dd zkQcY()Y`sYm;*Ks@#1~EPDY?*OU!06TZDMgKHe%0ggyZ*vqx|{;>0P)kd~!X&8tyi zVPX`mqOZWl^6!M1R%Y+u1J|2Qwle@D33^{Zec%i&n+$nHJg9C(Ed&^@{=tVPVuzBr z`3PO(b1^I`);El#yBe?s5{3kC=xp$J1N)SZXDk{|Cg9a-;PZp+#u@zk037)n{8^X> zXO0b)bObkGstoum!2KK13ifxy8iGK3^&yX*`OgyKwax2er1LVtckw-|K?!fmFDV&djX4{U@E4l zpHLu~w*@ya1&^RH*y;sP-|+;Qk1YM;gUs#0d$Im$tM5TS?qQ;g%$lltPlK%cgAXIS z**5V#Z)=g&ud%FVFew#VS7yWWNbs)FCTp-xpn3WNKi=o@^GK@oRMnT&`k7$e1|FlM z8LtG>7N7B?`aM;hxEhQv2HUvp$F306jQha!-rq1rS<&ANK2Q&dg$yJwq#6GNQ)I1| zJgJ~lmB2p?UId~Px?Q1^hBpSZoe%eG>QuF#RsZYY7}O~fMOgFX13$^ZzB6A0FZLOjQr(QEst!58)(oA8 z0-%;CfD9eULg24H9nUn)Q#aHF(^*prWi`(ZAMe*Kiq-88V+C;u=PlrpbY_b)+xZUz zs8+Vax|QwFoshRkvYpzkP)^@qD9Os4;czI)Mt71vljeo3IXz3nnJsXf6WHkTBo*Wu|F(s{q(UP!IA%r3rL{-yjz|A9cb) z3u(I%`m&E?SX8Xk!Q%?&TXda*{{q+(K3*hyOzz;Z*6EyO@X__y`h`i=Bo!~i!i`Sl zOVJ@htm+DEe;+SOo55p?b9||hIt7SDK5Ce&wL5s+=8Q-0AObf6cB>CH0%h>H+bJI~ z0-prp6(5x-04kX6XnO(!*!4{396cj*Mu0u-_Xy3ULoW_K ziZO~oO5F(i4w#sDqd&umxfAJ`3j-3i2SLyK2$?p`P>&F?G=TE9)D%$FCmzI9XJ|x1 z!Z{8*NoTebx`B2EY2B{EPWIBSmX>!I6-)m zbmFo?IPsVsw4d`jlMsi$8O+?X^0Y%)$qMinRD$Kqw5@YtzQYL86aIlPh2*etm~oz( z@HkxKcJIKU79@?p9x(OJ#?4p2%x8@SuqbvfVT9OgrdbQNpp$=NsBQfKa|y6d0lSb# z!2+Wd-C$YB6JGG{7wRaz}^(*Wr#S3BKma!Xuc}~x3~l3{)N!3&++0ZRx?xMDK^~8fwb>{|hnw1o zRp7Cb>>zY%zXy_XcfzcK>;&jtVG1dNsVxPMy#}deS7Hx@Zz7DORs^S}mW&kiE6jcf zTL%ACFok53)Dl5zbhd4s0OB_I?@dL_VIONhfuJ{FBpNzg{Y&13$4aup)%ugU)3vr$ z1e4vwvVMU-yaiEG1ob~4|Div-X1fwdjbMDisrr+Vg7(2ofv`^S_k<}Vo9IsjsfS^1 z17a-vQ&SQ1)Qvbn6FhSTN}v7WPs?p<<>j{ZA;6CVxKxGV8ws;a?XCi3Wulxl*DeYz zQ*&_8EZBgsz?vHup%Q&>;rGArmhK5hZ|gFp?&clAtwPn5NWBMgqD_&dz!WXPPY{Bw zh@`6XRCaUt+qd};^VqF8W&~)_3ft-fIQ=DR=Byc@4}#lXGjyri3qTJ5mZ?0PWDDjF z6~gG{YTDG9RJ`3--O|edxo;uCT4k5#erNOoV;u z4j{cn&+O(!g-?ig^`fFqztQ`&cvmjc#Vci;JblB0d=C^8;ol)|{PVfT#(MMlezn=s@4kUs)GW z6pJ^y&bEGs=x*@$g()Nl1Y2|Xi)=d|z8x?=zh9HCKms+NKFILu0QvjpWc#(8QMj>iSp-BDUu z%q8aNjaS;%B*ZuYu@!xB1PNJ3r@dzMQuQn7SAf1uJ%EE;!Rz`%26IIh*gW+j?)nJc zT?N&EA2gISYo%>%gR~zg?Hm^0-E`V(dK8^;7G&Rz5evSqOVxcq_X2vEDvxug!JR+r zNSCR@F9LTTGt*wvf0-&v>J!I>I)1rAHGY!WiE3=r!1bfZLCH*1nY&p9o@e5y%Fea6 zbqMO*avRinABP-*&vTLtjwi)qCuwl{F%)nC0m9t9Asi3r=eG678yD1nlWke0EIf#Hs1qe9D1iXTPyV>cT zYeYVSTcfkM3B^Wq|+g7FKmURSv`*t)B%0N{u+$;a{tvT;R5l{i7x-h5D|M`f$RuvqnMZ3NY<`|$K zf$}Gej$LvJYAzJPj=}Jaf)Rc?z+ZhF_=zR&Hkb>*Ukv{h zFoopMRp>hOPbB{Yvk;JNpxh6m3xh6Hq0v^7H`Ej>-gQRgc^ho&A)sFa{gYGC#ftYD z5|j_~9e~FHs&bbrmM+#z`L4iaht=U{-AM8t!Xz(3ELL5Ia7_mj1Qo&-sy zP62NWBxpU%B>;{EXtoEWOE-cz#LoGBHe$LQVQXO|zvw`I@z*~E^Wfe9F%M82MD2qA zQJ6w<=-BuR5R#pZ_*ent4NyLV(fLJ}&adENCW1foAhHKc=v>IS8;>NzoP;h`{DBui z(_q>I*a)C*9+0lo{OSe20yNzux(%G?9RVbZFZCr0+meKFcgF`uDXy)w?WzJM7BF?}IogeS&rodELk zGsg7_%qjrq1N49gG}U_O!XY>{h-=YEvDXY{_>)_1T?xw@b4kMQok^4DVI)TNLt22sndr3v%&j2ZNHOvXfZ3ND4p4{~E zk0?^4{B_aury^wh6(&0yf zkTN^4s0*XZU-~>uql%bsrM8e@uj#W?jRi*t9LuCQO5LJoTlr9k7bwjc*#Wo#0O!Mq zLUf=p^L?0tE^srtWiTHi%7ySRhbbfn`?NVDI>NCIzPn(2{?tL33>0uPOr-=CgW-P> zrjTs9J@Kug%^+KwFir#VIVcWlk4~CsggjW7?4zv6I@_ksYX(~jN=G0WBg8!%yTO(R zmcMypv4|@&r3Vm&Xp1-jDLv2~Qdg$kd`b%pQoG2Jk9R6K_P6$xA1j6sbg< zx)iImV6F+q_Atl5ydC5hPGy$Syqhr13XHxeD z*!CW7%h3J~WW5ITUnk3&rkTHWrvtL66mq?sWE_uTTrNRNfT_?LBjYZ7VZrERrWaHz zn-s60vYjt8ag+o1YNO-nV)p~>5*W#LI#B!1!@q(Ku$&RLRTZWyqToT&%U}x0!OWg> z3=(V}L%Rh=_~}s5J78PM-e0!~Zr+A$cLG@Fw{`4a=B^DpIvC zV3*x*e}~}TU_>+>P>p;AAHbrpUNE~Mu=0JVc`$|KplaF99Hj9YwI6n9S)svdDd<-63#OBd zlOX6CmUcO4yi>L!SE0~{VD10l zNeLOPHTW)|%Oqcae|&GeL$$i!2Xse1SeKYf#ll>5$R7>)SF7Q@CR?H34c{bFf`1u5 zv?^BnkU`Uc4c&tI5%ie?U7q#yNzb4+(lhAI^bB&n$eM%9W!`i_^*d%}{B!{$7KD=dDLr{Gf;im)q zd|j)6*qY#N12Y)>o#F2VQ%H{g$Jv{}*<8N=|L^;pGh@aKN5-58VK7M&5~J*91|dsi z&tUBPJ|{+$L?H@^5Q!2cZQ3_Ur4p@DskCX|_xzvNb>HWG&fxR;eZK$mcwG0n@B4aP z*S%f$`rcGt-a;K1Kxi(c^18lTYOd$>kylbnwC(UIcbfSG_!#R@oKJ9yL{)QC-wMem zp*InJ0*Z=4+3yb5|AOcg{b$Q1@1G95Oy~#{PcC7)D-s2w@F8d~O8*eqhfykGl4tG* zDKC|mj$7uXKqYv!Ak`)w3NQGg6rA021KuIXYr&F5b=WLcc*OFCOIOWs60E{T|u!n*!dQ$Y<{2-gqb~5+Xm> z$m?Y*z-|N`0g?l|J!FRnw|Hj;lh@4$dchb6X+pX!Txx#j&^l$heu98?Ak4;S>Iqfk zAa*|Co1v&kl3;X@{>!*7@9Y=YET|jM`{29=*@R2(T2qa1bY8X_R{89J2(E+{Ap9-t ze|%xB0$V(J5&kMb4?s@?JpB=_13@+wf5X}&RK)sanOTfW)3yN70n&1chYA&`qIx)@ z>QzYYbRSMwo)(LWgrwLcl*(4_MpF$}n)X`aZ-i8nc+eyQMbmKhqvaUXpcU6m2tNWv zMM5-9uP_zQ3xp0pDlZ=7NRnXmLj9MfCHD#& z4YXWqcEE7fKsI45h0S3zQXUIv0n`EDgMfDXK!1BY*T^&V0y+%M0r&x+Z+xI%l(|OU zE+U{>n_2GwEcF;~Hi2x?Zf9ONv!^F{F1XtK2-X9;#C-iEW9JfMH;X#Re|ZHX1-x6g zv*JP5rRaIo*QJTd0(rJ>U+)Nrq+KBwu|i&A%xpTw&VWAJyR7pP9yun=3W3^W$-Knu z;4(|f!!De=#CD`zF5E$88F~4*CQb(Gvg>$*#6R&f;P=hBW>h~608q|7Tw4P851{iN zkCob;-z1be8C(U(FSXrzYpLaZ?4oDKg8^?fx;mm~hp$T$O)RxY+EOn~EVaG^Iib`x z951yE$4hO)T55T{xg_pA#Fm*1yhP$(l*|Bgg*{HVDJUFT(w-R<%Lf}oE(=O;%lXd} zj1xLS-DFdcAx}QhQ42tGC>PKpHAViDSka0e(V5;9m#mv_wuE+aG;QhD(pFE5lW671v1 zz6CW${z}3Npr}Zwyu6Gju#(VYkjiVt_$w!g_E%0%6Yz4rxSsECWw$Ms*P;qKI09bmhle}QH^%Ol^A zZ4`G{Hg$GCx*4By4zv|{k-H7K1~WK^gPP>i{>bz@Ne-ZVdA^{Sr6n{T;8Z|Yp9m}j zD9^dIW?8)y+6-_lptpRW_!w{O_ARxXk;l+N=c4iq57~ABWeNr z*1;U1Aa@xuQ+>IThewwNgrkd8yTdOygT*4kqF_G4H^IK|WMSQX&+>QQ)8&c%z*FEp zhSV7Jh%eT2WdM%#TtRp_^4NZnD3)sY7kZM!yxkmiK~d2pcJZSAPmI2)|I%sYWlP=@ zTrhc>Q%FS42R<9J_Hn}crlr5WiFI0m+D=;$C3R5ZcUrrM!i;h{%#n8LT8m>_tZ8}? zi(R7EB3kYFSW2$?-3Gm$+xGUcyZLk7cDbkBug8KMSl@%fu_$!=_46H&!=A6%2No127wgrwu`g7X$+8=<6y z?Fa}b!NN|jz@mi9GvlFm5dH=B8GB;Fdc;W6&k_quzy6X8m7RHo{)+)5*X0xgQMt-f zj-!Rfi1zTsUD}2AEUlkAODjO`yQ+*k$V?x}vK_gx$UJbeoL&uH7(0!z?RQ=5H0ElP zh4g4>iP6Kl<+1Y?F_^Q-SrNSQqgd~g!mDWi>%+&@R+uzQD>4Dp|Pz2hs{(jA5)F%Tga;OF&~z1iJBIuj{HKXCEIzdVAf;o{V$7 zNUsknwnFmhsB2Jh`-y7YRr>L6n2`~8*O^?AqyuF?#~CMbPaxA{?+N)FU^~Q4S5JNH z@z(t=*wda*-X9b>F6h|v$r#tOwI2(Ht~UKht_sPy)2&CGnnKr`o^s)lu63Sv;j#2- z8QrGK2igO}NNXCT{YDRxDoW7Hk?#T*^~PI=Byyouz;7bF35trC&VTyP{5PBZSYRii zHz8Ff9u_Nlsx;sbf#rINoHDStY~6Bp;pRMvQzQx{fo;%!68W9*X)nrrh)25KD&v5WInv0caX)IMZq1&nQw7Ew+_sI0{tG&885{O;Z8sp3;V#|2)X@bNBgZvxnXOrsY{-=!Fvg+PKz~0 zzMZeb-v|}Udn@;W`55X0ZUh)tzS!nty1YU*Fb&2cNXw`D{8;$}=M{k(nQ{ZHVe>d=uUu-0NQ&puvlI?dMlWRpd;YE24fpx zNvsiyp;2(f0UV`!Ni(xkUn4MtWfd4HdpI&e5W7hf@d2QSG@SE)AYz9nUFtc?V zJxAa7MN@gj^7^+N0J9qtD)ZkZS+%H7)y<}Az>TE(NxL@YB$uN zD`yxW^@SF~)jf7vy2NqCK=;_O5bdxTkw>9_3-Vu&7R#cvQB@07%Kfc7YjminAyYoM& zToYIM86w9JaVpm)s+3pp{|qnvWhQe}K8v~!eU;+VO}S3y>wh2@x)6|8?9Vl~jAK89 zTsBm$8&3p+uK8-Lge7IKcd|1}A!Kjw%3(yTgXpbL2gF+-I^7p{BcgBrc1)w*8v$Pq z`Su?h?a0wX%#EV%QD_b-m!fX{i7LhZ<-=i*13Col0{94^y(a^U zB;P)*9QOGcBF7N%?bCA9KL14J&+tmW#*~E0@P5uSpi`+_~UwhNr zj*4ICA`L*#hx(9KPqfXFbBaL9r#-n8=W&hG(? z-On@z=w?7iAlnY&OU(JFgf-`XA~FOKKj(H(is#&hCFd>X;9P=JEZ=>RbgqIt)<$Iy z_&FD^=3Kt|Qhbb|aUP&`P!7PR0<<}g4a&vq7>;j)zZ;qeW*(UT=PfhE_H@wQGBewT zWHy&~#)_s2uQSP^Z5`SkhfWxQwE@=#h2tN6PL~(31zscSM@Ux|;_*+iej^au5C4sy z#UTPY@;)|oik=}-(rpPHA?-5`vekv6qEi+f@9O`==%@P6dhT7y-WqgIsA4Y;KS290 zpP4Bk88%gW@xNdNw+iY8_Hn_^K6c8J%gfx!5w^R zUVkg_+0gHZtbnr#D$(pR3CI_5=Kxv-$!F=G1oVmzbRArPQAPp*h2CZ=2lzRlzHi1f z#t$0*tiV$3pP<|h5?uD!m3D6bCnz0L&MfR1#=k)k4KCZkT}^kEl4~~io{3n%jSD_aGsTnzsoNMF**OHm)&_=Wuq48QjLkYLe4!hh_(C&Ab4FGNcboyH- z>C7uq2*=+e`TV%1%^5BJtfp=$)}JupML>BX1SOH}pU zVQOwX_k;4db^2(zXH|MLQn&)Rqd@`nEh#jS@Rd5Bl3hE5H5dM@C(VYQ)&f%zl zc0uz1E(WyK2kJp9YG=toO8U}Ta+0bCk44n$)S0X)pvMv0jmQtan15g?k1M9W9o*PP z<+LyPK{?iV28E*H9_VM(q`l2-4q2=7Q@5ugaut`a4iJSZyC((5|tzl?v^Ue6WLYgh?Eg+SNAc^tA? z(gYCD4L$b9O{iO;r=ympU`?b)1aj^ZK&^akkAJKUlL z*;M>fPCb_??@mod+GB)_*sW6bE}0B>I8k8F4PspHYI8BV_d!d{GqpMWsO;pXO8QA0 zcrF+o@Oq4370do~9%;Ylr|+L9={=Es0>WXGw+9t{OWsHo3vyS?N)&cLp*yG;c+!nj z7m%vl;3O&MlIox6ZToJl)PAbce92?o*^MjL*jTEZ8KPk}8eB3{;>pZ42coRcXn~)h zS)?!k?PL5D+$1ielf27YKn3qJ76ZHn&~H94exmvxMkkqk6GtZzwWHJ1iKCO9qZyrA z9wJYNCC@r}S9H4x9i2MNkrt6}X-H;fLEn<0$RVDBfviO&+^8;Z<`+=)57|WYV|oDe zpbvC8kB?5mvZK>-g#P_N^58}%o4fevWW%QzoysF+CEe&`PmOhSvbhh{c7mcxg1Xk{EZ{*E&B5b2smdS zjup-A+IlWD-)rV|$$KEa1pbK^6Qmprk+!H8V+oKY(e*Xd8h!21Rp9FrpA0tkGyd8>)7^=PErlpw? z;ATNPKpcXhhXC@uGn;Y~`LvaQmzg({HPNpCdGEVKA0;~_5)~D-Pp0gqPJ*qrH{YE&Z;NK$xt8Aqd*ry)}RuWD)Q#}seo>T zmIAyH&;}ovFltPzgINID5A6l`7@&83V9dvi*hK z=7U&vN^UUj4GBj#7>5vPi-;RK?sG#&Y=f~gelVeXi|LJJ-PjZ98A9^hxp;ibo<$&L z*=OpyQN9+IBOePZ%7-VpdjQHIhpP$S4@E_tSoY=mUl1Lw|6z*paby|oNU?hZ8yJB7WieVV~K0!W|3toV~Lq+%Fxs zn_Z?7L``6sH~Sb5zQX-Z`)p{TsU9!?S5AhW>{h1t_F)tuFNdIRj&6@aV4{i+p9ZWee^Yofq`eyf5 z4O0FV4aGC)xS}E-`W-dpK5`vbUP5YDmsOp}OnGor#;c|wxtLyj8=`VGdNYT+bo`NRq#Y@WW74BxF!(5|Wo&-)P3*mZ@L@uMvL;QcdDPlL!<&fwKTD z8=>3K^tp+;OY)IwB6I;+WJW2{)j=W~NNaQx5XAkrax^fBkf}$cV zEm=wbWnn6x8%m+U>phI%uyDo%=}RS7;aMEG2vw6cwFPmtFOLVzj^hORqRsfh`rw zlts|@h&%`9Ysl8A_-wBj3x5uDa<9nElo6{1dPK)IsLo*aKSwDhWcA#BpX!P2zOKlS z>~J!W+8s|5V0|Giuy|r4{P~v?a3g%wh8E-4nTGW(+R3@oXddVMtRI55_I>MQd+~ikuF#&O1!%sDUz+xGyvLG9G76pioGQ$@uG8LdRsR;UPdKY-B{ig4Wu8&bX`%Xf>ZqT-)uNKth;v=?=cg3*Q)u4~9^RZdUEImtPY z^$xw-B00zC@}u^5v;&WQGTapfh?dN~0p*avX@oaJQAthe{|x<~7|quIvC&5QKQh`< z|GntN`X8dA+ps$oHBW!Rk`Gl+!#M`ovc|7x_k_O-atqh9;@7jAhGd>D&PYSiRa_Z? z?nF_YFSUvrdcviy8>wfeMAJGm&((jQv zh#Xi~LaI!6a4|b+hKa`P#QLqBSiiLskt}H^3&c(&y$YmX04*R7YYD#!MI|-KLtFiy z7`;UQ$42|<|H$ZY{r94i^MUQ1u0z@?XX3E`DFY5iq%6d^@oV0e0!d zvuWSonHwuiVA+U@_K0gI6w5wg*=QdVq;fWQA*a1Sj)k;x#N$TQQnenYqj@>4E}^iZ zPI5OAYA~FaKoDL7MMYW)J4pZK8BV$WzRZlkW$@fd^b?RO7Y~D{$Q5nC5oNPQDGJ{s zd=!d`1PZQkm;|p?M4}){Rr(v;8&>J2-f#jsG%na?T7KntG1oI#@dmy zwm|7FSDORKehbahM+Vc+T16?Oz+R3_j?+ILL-0$$-Z!q=#N)S#d}GYZnK_mWzX#}d z6jk_24imZm6Wn=FRHUV>Kk2`;$s+K}%ZiXzG9E&5OO{!8@=d@>}r zZl{0i+C)!EO16nTF+u38bXG42Y=r8Jn3lZE5*}<*k>HB(j`tB9?B4-V*Wh)2CSGNz^oY^tgO^j}+ zrFBZtYfE(s90l|Tq^+axHAs9gP*iLpqfbNoQCXhuT^Wjsm^9G}b6^H7Dldd;zze@p zM$y*rXXkfjIoZPWqItRK$czcR?nM5ly2w^^Y+; zR~k`ByfO8kI*-6C(P_-hX6M=H%qY!H)FcHPe;=YY=W`yHG)UeXm=xSKA>`d`W(**v zKt>=yIe>09PezCu`(Q_nYOYZqb|>nlP1Fde4n(ao4JfU26=O_JYFUhIj^WdT=JYb6 z`*C!yHrecuA1cLRj5*u@duuJeW*5+rmWVGOpZr#vOY!B;7heIscGrk+9KN%wi0=w~ zW$2Ep&9(Rr7K?8=zAwqmYO?`fB`R;Vxd)%2+pji{NnF18_Tqb%YFKUF#Mgpst~MXz zyQe^W-{I@9NPMYHJn!!7#TUVsvq5|{@olUpz6SVa-YmWr_{KFB-^KVokBF}~zSFgo zlkjDZm$+hlzlFv3DZU|H#dnyNnhtsUTJb?eZ(CKaotOb<;8wWNc)Q6_?6)eDeRy*W z<9J)FX*B71!IY#m>*TN0dCOo7zy>OhrC?q#RH_*=&+SST?sU?HJ@%sUb@lx&#f z7SDkB*Bm3}wCS|GsTpKk_+HY<$fMFc{Z33qwg55)J;jS3dR;4RTGOjw1eMX@MuMh3 z$P1xN4Mi3a=bdi86F}F+_)RCDnJI0Gwu;}b88*I{qH!c$Q*cuEZylJWUXAKg6US09G*eh-;Ou>YY({)YysLLc~ z5t>c7NiW>Mvx6yU14e!?{b+Y0s}5T_mH6=DdxK@ht(MBnXd+P z@Po-ykW6n($2HZmuzWKv$@8-LJWi-|>oW#*Ec8nEzS-Ja@T^S~zH}co$DpZW0F`dH z>LMinCgBw1GBp$t0Y1W7i2|4I(044iEJ=B40I1`Gyt7rlr$_`%3*tNayvRBtoh6m- zl~cg6m!bxpfFS?!#&1(?rF7QU;FdX?fi;wty9$5V@wG9}~y_yEX*m1fM+ORS_ji$mjf(@xjYeY4ntGgP}BAm z<1LgV?t%GWB4FEYl9*sl-{JtT!F*2uH@^owB0^+DQ8UaNw>i`=Ad;z@1XK*_J%Yk{ zX3IX~jVXhQ>cGwtXsl4vRs-Oj%TG8!8<_IC$&!E-W-GO$8iv3eF94e*i6cvw>_E+} z<{CzmdFYbelB&KDmxR;HRmvkeQ?uXxKZ3?GNPsDUnlOcnz-T4t;HX>P~4`{XyLbdh}-mBae0d` zZs-PalQ-k0_wOwJ`Y($AmM6uX`;55VpA&c0%i^wlT3mUWo}ptcHCXknvlb9|p1dUt z9f3dSM^!I9jVYkES>6!;+uH3v7nlfexra_ubzm!U(ZJ;O$G^iQQ7e{P+hmc|s`sf- zm4xV)rHS6D(dQ>b*R4VH{Th97LiB5ttLg(9Jvbq{T@|7q)aasw=@ zawe!JR6|8d8P^c2k{_kUp3?j^6M#S?vNq9-kjYQ30`Rl~dij9IYyn@lxtVC39fzNAXK3Wei&x~y6c(u)kf__eG;XVP1kLJ4#MAhA9w?yg8(a@yd z$7Fx8+0xm`ekwdk!4{^WSgLKbtB=upwSg2T6NYoOGXgASEC!p zqAjn1S<)EZi>AHAYkf8_4R0X}FPlNJD4W~brX|&1b)TxarUcLCPbZ&Rrb0_luW4)4 zHhZQL*stZjOGLEX81`OLcwIF;FVW(&sRx>2*wvfT9$sKlMZC?0cfQ$w9sc_VbTFRS z0R0#NwFVW{q|Z04rvlpbH~N;s}hs`jij0`ACoZY z^2G~A!^-Q}soW^a%&Q2*T1!4FRO)7p{?w0dGB^b6d{c*NNxgeB*-$_lTTp97Zy!L< z`R0Ph;NRDs6`1nRDamhWev|p;FLOC%EoO8uodqC1b?DzU_XGIbe8|N96$WL-2|#=i zS>gat4gZ+gRJN>a%n|{JPaOb9WQP04JokbF+*=aR)QlWfUwp{k zc{UZ+$c$kIRo-VlFL?`bp`^f!wSp^r&3L7onYz?Nhdt;xJ6v;Fcp7SJzfW>XunJZZtZ02b+=`0=sDRy+0#6 zOJrjr5s8X*glV@LuR_JVmyNf2A;8-b6NyMlG|EcB)UD6@M3o&##GIgY5B&~_XIXev z==3@EsuE?&oigj=T{GJZRsB^(wbT{Ap+{(`JDgh7FSU*ZQgmvyCB}2w*g!iPP?Mea z|B%&saI#usPX=CG?qu%~*^)J;wb9UALT{w)!t4zD(3s|+Af@ddSs8D;>mH#8RsHn^ z7LCk{=5H{~2K9_;nIc`tZA9X!sVB&Dr3L%f8w+f68p`A)9EX`p9r;R-J3Zx|3 zIuakLU)iuNHuZLs+L7Rcq%;);eoApUMaM-hGMgUfP^gMIb{{fNNuqvQ@7B`?_q?1X z=#w@$L5t>IjZIT;XsU9E5Lss4eaLt+yP6+u78+_9$V($FL!@~Yu(mjq`m<*#b(j1V zuGG!Tlgj_C)DcOFHvi=bs$rQ4z09o>lK2Evk!C|pGoHAlYZG_1^?A9ypto4GZI=_u z>DQJ`>O!-e`lxiI(<{jRDjEL&Sz}h+MW)6*514y-xDHK@k zLp%wUe4%-c+RbcIcrWOCE!y>4SD8sWD1H}t7pFv+KP2t{Tk&JXC}dzQy~{LXvX}Zd zbutr+p+lR*N3%&s^!|7?fz~eYF~X(V zxB%L{l;SU>_@?FfN*vJK6S_$@lhs?z>WAL6cV%jAwI0Q1oVzcI-)nstO%XEH&9(@4 zOWxIxxL)?Wzor+gXY{zTwKDZB4>dq#3e2@oH|lAJ%k;jO!F&}|A<WuoO;-T~mdE-!wS1#k|ym+WW#@m(Sp^6!OHpN3#GUQ&Ss@>lt=|Iiu8QoOp zdm5^h@o48bvR+1e%rcfjgN&Ez#zT!W1_CuZQ(J<{4XwmY-H0O!^}L_yF|><1Ocj8@ zU95)XXHb}cw@*I$%0y7hA@_39aG}tV{f021)9H2t;HY0*rM6wZ46KR0sbvDB$d7)9J z+c_NB!7|%~FRU1U>{Kr_-hAD{@%NSFH#GNOi}ESvo5^mQ`=bCZ5(VnWu83)7UOK3m zrfUy()LHfn2Y~k`qgjZLo|U63A!iy3Pkbdb9AvWRZrtGvzM|Oli)pY&3|g9oW|8Px zYW59xy5^ixmsZFs6B+DKn|+jIH`0nCkgwEibgeTJ$+N_mX9d-swBg+<^?tj#?MB|* zB)kuV=kjn!@^Gh_+{snh@tB+y?qY^b819AcG4Ih|RQM88idBB-elxtOi?K+$pd_3Z zYC@v<;>}fWu8Zy>(W0Sis9Atff&U8wkLv$L0T!)`|icqFt3`6_BQJ9^~A1w*iC+>ncv%8UtEO%-3=Sj4B#Ud^xlrMSe_O>LM z*fd?2&GCLl{SbLav2XYhKKk&@eu&#qLH5gwK`fEe4+xx1d-^yxayAMz)q}4X4 zP=XVvz{~<+2QKOp;MCw&@s5(%AsfZJdoJFg+r>MtG2UU)rvl@tv3ckG{rzG zo?>~Vpko03DhZ0bWD`AWDe6{N$sy5l#MFRnjw71r>lRhF4bkgwJ`YqAV%nBOk>Dd? z0Gnnq{7CJZ{s4vuNUPB6*bTqQ9CbB+flo;*bIe*QF=ueDJxn-N!{>%}0?AW1H*_bG z`8GnlxuHiSLX_l&#Ld%)+|YiaFUt$PEnG3S*59hxcQ?JOV?Sb*Vn4m*y~^Rs%y?jd zHn%b`h6kD-B~X)Na`R>#BKoLEz+@xX2+9-6CaNSj$yT!1XLyYH5`}$U-im)qvH*!ua+63*ex-$MfV(}8*pq-*YZ1@EeYYgS z?k2S#xZG^B*zdrV&WhzGBHH5E63IVc1*!vX7#GmpP@>+)EUZ0{fv13#Q2DIIP62mi zNo=glFIvP3xSLBNN+{ZIVUGiOB@UBp*~2nd=C>{E6Ci(_0#-t0#elX?xTfb-hiq#_ zWb9NYmcc9wYXYQw943|#5eL|F()Q;B785W7fsFQHZYRNo(^^0-2)wq6d)>sc=K)#j z!?aPjLa3+<1Ffe!)K(A=#Zh|3=uoW!dovwsKZwI|)KRj5u7{_PVs4-+scDM8f(Vcc zS4=f3hvKU%EM62<1w@@V%B85fE(we*a;UZ-E{UU#+7!pL-U?qDXwkx>>F{=DZmz<08Okw#rF(8$<`~(aBXe}dv6@yE~H&rQGJ8w zj&rCNK^!WHvV&oJn}LGhQ6_%#J&M)P`VB z_I!$Z5yYXAsE9(_o9PTf;X8w+lBN7We)D0ZR=|=lygm4SGncW`&gO;>D6!!+ch0&L zzcV|dwCYnimsT^-a7$x~b^lv$TuGL&c}YAK0z&>&Pe+u`LFw1QLNPbx{%Q0H5m z&=m+Q{ZB%%lC%g7i#5zvu+N_ge^N;bLf_7EiF}B_pQjRv+p#PD*wAMqolphNUCx6} zDt@9tpM5cQGb7Y@rnA3}2*`nr6(au%m=#Jd;I3Bb#-m|Q62SX1=X?Fku` zlBl84xoB7sI)^yb5N3RhKz=C{usT$4fz!|cW>W#gN-=n<7hWH_us_|ZIw^F6H^5h* z_D@j-v^lhbX+9{~m5e3wR z*)S0x$7kUKp|3kKl1b4!!R(O;sJkA(+o8MGIlx$$QxXBPVGJJ*ZDXWY4U1tej|1A9 zfrS7*4t1D@`mHb?5~eLi7sg7)Yejq>x_K*zeQ@6|iHMcl*$v?5&{LbyQ=vYKASf}V`lbdI5&k#y8rKZ;Q1U_$Z3Jai)Yl`!a4_lgN-mB5 zFemu{dnu?3nYQiS-fTisIGpq^Yf*D8xSIrP3n!xxT}X}>!)GNuk?S;W2k~TFql`u| z<56h6q+d>R(071+8;AM>Q3-sTq|Njot&o)S*n>j0H1_5e$!sha`AJ)8EQOvAEH@54 z>KCcLIUpJClvI0zgI*47LL8cyVTE=}+QTwhwJrpm7$CW_bGLWcZ$>0@gnY zodoQvI5aWC3VkqX<6sB971+)=^rRYA{BueFGEk}NePG`|1)dBm^u?qQDNN2|U`ON7_>fayuZx6#Op>n-GTC_M zUtp!r_p3q5M%r@qB>Y>_fiVtM3&e$Sl&>(hQ&;>yNslab_?}>={wKUzTg>ECG9|eQ zrPTZ^L27keQYtW(pEAj>$Min{;-xq$o}WZ~`Q!&~b6SsrJ^r8Yv8-Iwl|pAFk7qV( zRfDRj)R>U~vKHd?HxG>i&^S4F3r7d0DV#3CjZa3lVA3#v3kCshp8Ux~0T%+Cb_y`K zZ%2UZmt2K$Ghh~hSyd9}4KM@e02!3Lh1QUHCt&Uevb!WKA{?-(lfaHo{=7*H`ysfm z;#jSqfo4!Kuo=lcF0sZHFlDG{J;1T2IQ>nhO(2Sse@~JGYr(w$a)p(&Y^@D2`zwRH zDS0l-?Qzuw+YMZAA4`@Lu_`%O+AbpkW-{EUAnd&9-!S3d=hSRan3ZAkRc~uDZOl{Vn#U{Hsvxg zia^aO8R-)0Z9`Qv$}%LT^s%8cGoEJ!nIbRV09h?#%^X7gY^Zw1q&o@qx1kytKLrU5 zu%WDsGqH=5fi_e#qqOK8WJ9$wo)Mh|HdH&~X3;s=hO#rpiB7$DBT)0KjPFF}P|K^6 zafawDw4t*zc1vkT*b>#t_*3LY+E9axw}dy!h8k!5EWFV+l#?-T2%#}H)I4KmEkb&) zYM^H8jAz4y##vtO<%2Gn;H6Bop$-|-+rgV;L!C4Jyq(Zw8|s#kA0jlxhI(dP#TcD3 zRhlwTvyYc5(FY0WDSIhzP|6K*Z%A%PTmo|QCx7Gl>vkQENiCnsVP!^P7f$Fa9MzhK zwG>uLYDKvbCF2MkDfJBTax|aOw=AK`Jrx*2Zw~SKRI%4>rK+pe$5&S)rmo;tW!1jH zXVr78!DiEP^wqhp0xudsiMbX?rr?ZZdIg?*QCP4M4b4*>A$X+?Ru2Z`L88?2zm@8dr-@P=eWY<)KSAt{o%8`Mrgz9({AZ)$Ws{Jb+s{UAj!FT*>K z$j?lM->Jt8UL7O+ui!}^_vPDP1^?1Ju#PWPMM*VsJ7B)xIkn(fyyq>L||21AWXhWS9O8u;|QE-1BHXfj`d1cbDW!QhEv@J zdYFs3<@oG3N!Ub5cMg=PK`-ZSMj$aH-{a*=FgLWDeCCBV0nN8waSLQ87b@Lsb}P0m zKTsyQbe4V*24ULBLwTjMjj)If1}YvU2Q5U|upZO7GrIKUpQ5ZLOTpot31?73ksdNy z%CJZ;3`=K{+lNXoUW^zw3_L-MpwdMxXiu>|W*z=F`%n{>IQuH==t( znM+Atj8rZ)l%ABvOmhZcGZEg5IKP*YNU~3mA*<+3>b3&{s%tB-tAx2LKX@nXnuw(-?_DUj8vCG*atvMUw8IUo+Bh8 zXd)*dC`*lbq;ucC(=6fXp5kW-`QEOghn~|RsYJLD0z;s=vrRQ0g z%kQrWI~~Niag-`cgf8tsP5hxP(-v4)ALRyKilel` z>YKizE5rOs#uW7zh*BuEiP5VeWrD|%KX(M^%g2JSi(^7dM(Vy#FvG}~u ztpM_E^p?1Hr+5WWFeQmRrnUN{jpq$bsl(%x9mQ+R&}_^o?P3>@CnC~1xj;91Ra$2k z7L$G-D{H4`0%YxQvran0@C8fvQst+ zXzEDj56#Xs0G6GkslRB79;)axZ3XbqNtzUNWry25FNyLPc{KjLIH(>qM#iU8fbhcJ z(_9n$48Y4fF;6mygqJ)Wn?ouAs2vA6O)`gsSCvAOP9ZG;TznE}U@bsvr(fnkLjg=U z2{cJSTfWM0palSyp9I>p5zw|_$quv~z#}Jt{-9OE_np3NnMIM*YwS1 zFD{kP3Ph(k>M6XGQTtmX^W}Wk7Q=|16i4ZB@?Y%kzpyYyF{|9r1E|XvZ(c~Un-_Xs zB6{N;{VPj=n#nD?@bZjaL98?D^zv+F%GMo2-pb0eW~S_B+(6kIN3%vN`_^VKW!sUd zq_S78SQ7XgS4q&Sfq9@Cx+pL?fqiv;}<~evTCGv;SCRwX4 zTH_M=1m3YYf2>}3%v!xPS61kM3&Yl`l#Rh*!vtxxl_q!%W>Aq~U$Qd`}^mnk1>38ESW;zGel94*!%%4#PWW1XJyYFSwJw zDTz)DWt9z-{U}M^P;>lvn8SptXmyi*{;L4eKUpm9y*#08(qCr}Y$mnkiQ2N|w5i7+ zZm&j9`iTeb%4TZpT#1!d^d`S?FR^EuRT3jPh>Saed%pRFC2rZeO&>P)6zqQCOTENc z&D!w-8a*I;RajCtF;?5G80$-6N%h27qf=t65Q*9A2j`nlo*}IXdsjMz)r6(FyTsJy zxv#Pp1h3;6o*D}%b41+8B$|_1P{xQ*R?COM4~a;x?k-Z&t1BBBA+p*C%b4-FS3sE> zw5qF^QA~bW`A3F0d%g+4Y5_fgW4yuE-a92x>uT@!#(4~cGS2aA7;e7xwkI!np*JML zdd1BReHx3%4awNVp%`vK3wY(SCN!oPLwiw2S+m8<_Hlj=fh(KYz^!8m%yEGcmlK%V zQaNo}Rv_?@k**@8opLGbqpXL`n+(RGl!|h2H0AO#MD5b2p+e?#iE5Li^ z>A^sg#e`>kfN2KgzU!=_a%3eSw_RsNBX}zq8DO(^wUb15vXXuh%G6Lql8ONy(Wrwk zKa2yU-^2iqD&S|BURPg(^q?5vF$HA8tPuyO-MBnFu7D;m+r|NEA`b9`0(!%g4{o|l z3c$9uL+w>mF^Gk6R7Z*z%gBogSO;@!9MClZ@QMPSg86bBAbl#P;Z+43f%$bD(9df4 zSK9D3YMrL;#g2@cxKNyK!g~n_fXSW zZ!hCuP@2h%129!U!$l{2oipBj{w6n4FNSxE&$p>mF|r8GI&_dNrw$oA0X%sUNEX3a z@BLZMf!+r2$w?qtb7viXgXu#x{S6?6-fFWGOHQY#46ckI!__Dtl(9Ln|JEhLcN zM5Qak|EksqSJDRXnkMo`vhT?HX7m}3-wj^xME;$F;D39(hT~6!HzSc>kyNw3YeV|l zCQISnoX9^c{O{-Ycl;gj9!})5`qhrVAKu%E{Fhi9XZ`qcO#k=reoN$kv$cl>VfdMEPxgy8?0Ro3w*!kdxE zZ(R-k@1IR`{H5@2_4#&mt77C%vaG+_)^m;cAb`hx5Jn=$kXgsqPjO1#gm*a3uWu@5 z!4H^>umk)G^Pf1t-Xfb-%5f6tQkQang%fBtwPR-b?meY{;W(h zgt1zOi_1U^IW?-1X-T(}0mRG#u|QBd97I%CKQm$&E1xQ6GcEpW7f>5P$UC+YP`2;X zH>WqESk=tOOb*&OuK;_uB$VBVJT#D1)7;};p&dJs3qbtR&5OqEtn z*L@(Ki0jfh!&O>qQxjv-N_!i`7ja!W|LCCYpzX{%jD-pfT*iqQ$(nlF0f_-wKeBTtEe8P2^~QdUJ7DR9OcR}_$qYuG8Z;>Z50J^ji5@@oT7T0UK1T^ zJ&3#GD5q=L1au8CwJ^6?%rNG85c_--7OSi5(Pjn>U_OTNlQ83%j>v{E1{-H&tz=Sr zWA%`OX*DRUz8NXKZ-V(LHU>5Z)>@!8>kjqqJW!L&p0RGE?gwJ{NvLYcpr)9E%N=SC zh--Zm)+)CRXH7HzjN@Xclx+jdJL3R*S8&#J^EQ210nfsGF%EDVip-VR=(VEZ6PU*Y zpcUY5JkE-mG7N(X2+`zekOOouQ>4JNOgB1-*l*Be`CMJa*yXa9FU_4V(@wth-Q19b z^K>nm7wUybzAVf0Lb9aHQ)X^RT1Msa)N7-=9W6yZGuv;0=^m0jMvNZzmhgB5-z&1; z+gN6$Vu8zflRj5FXrTn{ld!^ePr|-0-ce;J-H=bjyPMfRbLh9?jXwz+d;Il<1)lc; zYRu`(Dm9_Zp8=YPC}Eh@XJn`B#CYBpP;&qs;vmt<;>$k%dR*iN!YmYkhGM)~8j2Es zjn9iDG2Ho&zmBSm@M@TM#{p8L2=y!Zu#dm?Ywt3<8`Sj3_VL$g13_H?qD@H@xw4PHmd4WL`lsm!V6cF+3cZeV<`bDY z>MEk#$u+FS((|NhD9* z+|ZXu=GzGI=7#>12+2lnNL-FLiO36`Mv3z!Q{Da+bE|c_EcbH$C3)FP<@7Fco|k(C zbmI9hEU#ODJepcp-;Ih&5gf7DDrR{h&sWd?d9WMju7$A*$`qK1JcO%`Et90Gg%b~X zy$^Q2=G8st*gDl>$~e+&P`AmR*1J5qE3Gs2U@co) z|3@?x_PEy77o?Pb3~#rx(k7YhPsf?H+sJ&>;cEhLf*EZX3+| z1)!lAZ?q)XfdO2{zwGh&MO%nM6p7=Z3`1(}=v#KN2mCUQhuikR2Y&P*O<@Mw)s^x0PI@ zx^Rhfi<%}dO*%~W>AwiKs>#Mov(FcNz;wXv3uQ{sL?+`##Axm7>qMR2-zgq45P+Q* zD#Fdr#_4vBT3LG;#hg8gSM9Nc2T{$cjC)vRA;U+dVi8K11tn;$QrK=594%fu3r@rv zGtlD^9-cwKlqz5m2xZQNYa#-Vfu`iuU@tA8dH{0bpqT=S8R#OB>jJZ<05lZi&C<{) z;-~q%$c-W#GtfP02ww+tO&lPZFJXI2!*g9`9{}}q97!ukW_40r(Pg{?y$j%2Nl-}x zy>J1E9tTm5lx&V8n&>K0tA1gm`m9awA**cIAnirxAIfbrLOBP|%Q84`#P2&8oJNSdg@O#`D85!fyAffd+Iy z&(0J3tYEHN2dAT;&1dNN4a(F|q#SYo#X4^XnHP!x%HM;xpegBwvU@F)bcHABPLuf} zyRRo>;1GFvMD~yd@Oh(+>m>bLCwYk7UiJWy4VZDbv!P50n#j$#|0NrhVdsU`;^ue4 z>DEz=zWqM@u9K9Q7vmFTK|4kEySk7JZxndEd)y;I+dYKs`os<5-949_4PA{l);+c} zPJE4k$>w;a5tMlwTwW`V8v{*gdpC6}piTgK$3dbf)&+|07P+x7rwBkpG2ScBOG9+g zpS}GjhGu<#NVb>sg|botdf7UA%)=6tm* zJzz))|C#``ADDLb_4wz@rSHJBJH&sj zEVKfFS!d(FPqr9pli3e{fw#OIhljGCn2dr-`=-FdsP$gY?B2$f&I?p9g35m39F|Px zy9FhL@#s&wvt9?M>T@KvgoMnJi5MxJ?CN%hcYqJO^eoGffKA1xC*}vz^&4E#KYr ztHSvNW@SbT)7GXpT`qNmvM)E=M$)2EA=0ABGB#xwnmoe#a+>U6Mm}CwPhX#vJ;HR6 zntcd8PlzrJ#hBAA^B{~5eWq>O`nGLnnZ6l}Gce5`I36iyUaE~--!|@Cb6Q&(MF3~O ztdR)N)}3#TbF6f^$Xo=otpIE$>>U!>i_E!OS?r320We4UfLP1O4G`HknLE}vHCKUH z=%aZ5qXKR*@<6$&S?@Eg3Qu3clfA)oO`(qDB|O<1O)v4UVt<=`yXi0fyTrfA3>JTC z2mE)K5%_1A(PG34<-*AnsdEz=#Yn0hV1_AG9^R69sWD#l1YQjT@1}{Ia*a^A<_Wyt zq_eMjh-CUJuTKKcFf?Va9oHbno0`Duz6svO4;T%s+|mTzbuw{o8N8C0<*3eWKCi7= zw^VpWMm=MmgCXBR%G6-wJ|ZKJ<6stwyT{^=0ZF23JJ<^XQ|Bas$E-kQz-Pq;4p^0I zCFvLJHSQL0FZL1c+L3)HP4+(X3^U042$@146Ma}j71?8|?6=MBw4XNfbs(1cD0dQ; zeb`K`=sNn{Fn0>z6H)5Uv9dohb!k@Bun*?JxCVPvmi?KLcZchM^9{_O;~MPq@!4OQ zR7Pp(g{JHn)C*}m&<$qqL=6h~ z(=?prG)#h7l&C?@_Op+h;~0p{MCL}Awt4BHXFnZag?-T#6ji# z9@)HZr=5e|1?<6+P!uZalHmI{In-+)j+8`2L~9H>Fql@(RpXz)lE?Wu{8@6ybMTVv z@SuFo-Bf`q?^khUI1VBr4lsG8NcOnkX&r#I19GtsBPDqjJv$n_uY$`|AHwnWNxJq>S=n2H zWvX*PDONEa#1$v$Qq;EKd{!Ta1+^T+Z71lmuM5b&FZcwz8uJj`XXAQglyMK8WUp8sti+Clopv^f%uxCi7ng2Xq&8b-*+( zi6ce1lRx|CVE!_Jbb{T(hw$jNhb6rp4tP&=IfYogC}~m3q_Y1 zi?L3DGBxBCS>7lOnT0S`_{@lWKQ1OcUJ+YiK2{PCxlmB{{_ffvj!Q`;oi{)oi6c7+ z=zlq2{$DWEVj8ORLKmPlzlnNVi?@w>&r!F#L{!JyZCncZiTt&Ph>{Oh$V+qe#6r&D zb4ol|Az*#5LN2`MgBAZPn9Rwgi%wHC)zU`xD3vZlo$M_Bm(>0j42j5y&yBcf&lhi= zM&yM$#3FJ-()PKbz7iqcJdJ2Aw-BaeO$c5`Cuy^20~Z8bB%AP-pzPNE zKi1v_PRDBf|9`IgerD1%#={)RDI^IUHYHTl%uo?YC6oz8&gGDD3`wOJgoc?IGQvoO zRFX{9*S*IMhj?`MYg|NDRae)D==&#bks&vmWy>AKf_FFpU7 ztRJUsFv{;iv!8HH1st$EJh*rm-^gMKfnSR5itX+vnx`OCk z3Drx6+;m5z!GnIR67!VTz6iG5CUJLy%DFQveC<|Z~CjyG@CZ75JoR038(9&XXCeu49ca&5WwmN682gT?-TkoP2$ zBB%{HZXcVc*oy&p+n68G57eW5B!lAxfs`i zcq%}}BRk+%p;}Cm-h}yX2)M*-`Wt-a{}aHgnwqbac_NXE7ONHvABZr&Q36d7=SHik zQ+e(67-p3Q-}w)-AgNTuKl$3sY!UzBXCTr{^vH07{}{CNB&08tsj_;*f?@t@nPXtw z6)>|N0TM_2W)TbFE)NlpD&kJ7BNA1WRMT_tUkx#?cbjTDAzGt3kBcBh&b}d#so8PJ2M1=|Q;L)uUf;5a~8q zRcCh8D`lJ!epG#Z5m7&9{!j{MzNI^?>r~u$?IfodGq)gha&EJYEaJ_j*h$mkX{1cR^8ZdAWLD(dNOQ(Xg1|cNo5yaZ->GW9a za=DwCxTc1f=|)>>tfyRz&g2hX!F`R)LUV_`lv-?9^jyOAsY8cvH7UcLp9`a}e;oe^ z=TEhtDvx!Q`l?6IJH)Ou`7j?tk6k63(P=(g9_u9w)veQ9thbaZUOPjqkCbb;+LU91 zq>$1wpDmBwA`8{6pDmA#kYaVK#WXfjmg8?9mMKl) zoEvbn?gtZxOmdJeu&)atrs29Mrd!AexKk=3%$0fZl-y@w3xKRW4$Q{tRL-&3m%!}~ zu?sX^e4Dl=`PwSY=`L~*?oS~?lNFD&k!Jr5Yt7Vh$$@P4D_ApQdt~6VSUR*^&H-{^ z0Lyam>Gu<3zesz=66pcAAVipAXdz!y-mz?N?n{_?s5ZG1gnltgh;)j6!TcPn1*AXr@%~`-Sa(kZ^M^~8FgaGs9)7S)W0AuB|${zu5e89K)v7l*QQF$b?PC@elELD&xbPKY_ zg=6=5Us88Q)w3XWR8r+o4|xYDU8Cy&h(pKdy0#I?Ug|BRsTou<#+Is3P|XJLsCVOw zF0#{LwopL4WUjpu4XeG~uR9H$VCv(+P=f*<_r7N!G|9aM=EzWk{X}bQgLff~Rc64L z8%W#E*-<)Ni;8!>A=(gD!F@bH(82ZF;j!<%b?BE@V7wnNO@Ub**5Vxd*=tCHHl6A) zFu`!<%2o%;cywyQj{WXk{tO6xpP+dqSeHl~Ywgal8Ga)w!>H{D_Nt0_I;z-POWq{%`9Ky2FqrzK)Yw}8Ib}WpUs)0AcGRlhcanb~MdWIDDUD6y^emMdwmvA_H8(LOwB2)ktnF>463 zM6i~t*nWRgx#BJd(>=hEsH&tP_JjY_^UA#i&g6h=vYk*-e7bKt;4aaLl$Dt^r3mo) zP{2eRW~H~ev?q2|bP-kH$*TZ&E7-Qr-saYxSkLH{G!IWcg>xw6_L0MUSR;1G&*y?x z8(EBEYz(!YLCNU#o~}H?n?6mB`$(%7Nai8GfReG2mmyUUm)yuw#Yw8uUTA0}gN23p zx}UB-jtya{p$mY#Xd(LYbv)twFY26Rocfy^E!O~r69Rq`289WqHjN}D6e6Rw~Tq6vTD()sCqN}e#KkyF781i@*1Ay_iM2S z?-I*x>GykLE#6{llIg}P$@-pW)rlvgOU|cl=Rujqm!%>sh|f{Lqz7#p8b06NOh}Yr1UkNcm=B)!U@7CAig>V?e(MqU^k~9a@ z{Jk&O_g?w-l}S6T?IY1P_atp8&$(Zz!a!eVt32lZ?=k;h5IytVwayFjx$|4xHu=H$ zw@K28%HJln&HoqWZ|?tP?*EPa=VC{Leo4le(3fPs`@hlr-!6K|eOE4h|Hb@&MfA%0 z+~|ul=@VA;712xTyViL{^e+0Yb#|D0=k@_5HLyxZwj=}j4_U);;;{QPB{vra!~ zx+~pn9nC)@O*!%!Kkq@A#%CWbgdbA)*msvq@nJkb-Ofa3m5jf2y$_wg)7LWE+=P?y zBK-qi;?8Jm2ZU&bw56kFv>F0a&fupVlxcifDqsyIt>afn2ad=jy?EQ)$88~b(YKPc zrZmFb=(n1LR+_D>-;NRzn8xiTanow59ia%uGAPq{D}7-|S9lez=K3{NV>Q?9ZN<+K z{eOTXm$x-Z$&j)4la^bFQ}=e=<+`2RE@RTt7)Em_(|E(7`@bY17~cO2CQ_iAvuG@H zGc!(2EeVa-GaJd;x{owpDvCXGKT*Rm2h?JDV=aj_(4An0 zOn8Ess*!4zPmwsJ$v3_@?`-3fSxgU*<;C~@dJ-&l-kGm*ypSQ;D154O6~NfISHo>v}i*6)Hai-rRt1n~XgP7Q5zc zwi-ss8URlQAQGWg)L5VC@Qso;;Qc+|$Cc=pRAT+_BBe&jVE{*u0bQxty`{~wPE+Os zk;o~K&2C(ien%xXV%s{WsSSX91(`g>LHa--Hu{!rPE%h1Lypm8KzD9t(pRx#i%yM$a!5oY$Q6Opq%Tm%O8-H%8BG@exbzs%ic&yjht@ezKLEpz0qOhN zv9^95OjFPWsxIEEz83bYG377eXL%yu^s2-2sH09Qu?61C%C`w{ zz3S&{;D1NPWIwzw0)D)OnqKq!Z{<#ju*IzcIVJYlM9i1>02nO|V73SVR*StWES4fi z86r(uI)UhM49fJYnB2O{=^75=PDPm<$90*Gl_e)K+8AB)K`cE+m+3So%l-{c*RvpY z9HYyiPLcL+VAvq*asb4k5OoFR#>UL_t;TXaLx-t}WP)oziRn7Fu^k&i!_y{|8@&YK ze0AnUwb1gSJv87~oR@c~N-|Q;kb4N}>0QsKAI}!^ElV+1x<}Yz2aZVoEKqsTh^I<_ zG>fn6jC+OZQzsvZ44oR#z9SJ-$+|bG`8*o9-npuiNQc&}kF&NUY45`CC%?)vGHXuK z4s>?NW4Dm?yb;hxt=DR2$eNY(EQ~X-XlB61Jwk}dVqd-g!QM#A`r87=eSyB$mb%S~sgx=(9V*{X# zKWlB$kyQ@xEX)^=0X&hkJr4K~=H~$*-q^BPh-Ym|s>0U7j66b;sz8}}nzr!%`rvcy z;UelnCg^i0PpaksMU@-X0?Uh@NE~_5qbB5Xl;msh#gqhYel=rDYjsCg}szpV!b)O_bH3ooHIt%*9Sd=VQHiyZRcaS zfHI9YYl&v0wrn4U74@tS*?XySDF84~L1iifUyr8cv`XP4L54pC-aU!@Usu6zvw(f1 zZYgCcys||81#D$Y@0or?dzL$}Otk`Uf=oT3?>r z1oO5)joS*3H>byP`hQs{KxV?8A3(A+rpOc#pY?vu9rtpHxG60!=2?wT1Kp}{TdW|j zqC|2g-Ti!k^eysZP+wF)ZYl*i?H%j@ri8s%)FMwJ&KgjtvyGPZ%u>FTWXjTuC0S%E zQ0*!pt7)k}a0Nq$Lnd2fUr;xP$noZ4g`9b<_`;Ge6JShJrYY-$u9vV|Q8jtdQc(Ho z%r#El5ox1t9Y*hxzEznoa~k>D3%VC4bcd;;{h@i1?GPQ#=|IbB@9VeD=@DM?wQPEG znwVlr?nr6mH1%y0|A`HeDiW!?kSDTGrtxO=B#?W?^-I_}&HO8|3+Qf7@#GXp5ngm^= z=Y*Oe(D5&YYU{}8gl_O}iwoU|z=XdPxG9gcs{O1|zOiY6j zxce`K%uUqOMb3JfD!<#`OwTh?^myBf9z%5dUyAEg7Kw{5_iv{=I&t5Me}Sl9^jG;b zbr%<3>+cT5qgMPhL@)kJaZ`(N@lF1~H-gxctoY4{-u0K_rat51FZf$S@nkFhD5Bf` zQry&RT>Lfv-csa=t^C(=qB} zveW2%c@6N9P(T9{dbCdE*4(b+M(9G*H<%!Eo{WCSXlA2MUlNI&4!QiAsExdfdLScK z&aP+=jFvX)T)+cDfl5&uc{5t|k=v-7oIj)2GXq)C$%s8vNi;|+iMv|kIw9#G-^8{8 z>jCfhF9P*2=jK#Px_@(A;A6l?|4P7`$@)k~;5nxx<+JLr(PYzyn?s3pZiYsak#I@4 z$@T7ILztel{_~7PiUzXRwa5mYp%QHrm9TzH6D?#m`O4oVfIpoF6NRS zVsfdmLJp@!A|0Ah-8FW~Ty&Ykkvd7UcwX*efwNAvJq7dG5O9xJ#7puOs|tA=&OelE zvY4d_OITUNm+=3~&mU{*bEDcv^P-K>l&=AK(X-X5X~~UhjpQ2MOjA>xYE;!NR{K(F zQXOV5)?gc1Y$MteyoT+3?|pVvHJbGxWgY&;lBq^p8Hz^k1@g_yq&2D+*I^^ox5Lm# zjdpU6VdeUssq=KLa_^DBOy4aoXVCYiF#Xjy^ICNd*G6(yf1KUrr`ci>A@T|G-$I$1 zCdta@mn$KZU&97TbSVoc$RSKMI>gCFNE*XEFGO644qMyzvfxooYAuV%#Y7|B!SxNW zZn<-xtE6)dko8i9-2r5Z!un{kBKJE${{1{>kp(bH107i!pRR@<#+PJ{U>0yhqz#*w3}P|Jhnz18L?c!9|HU&05h1r$YfEYg-m6N()NZ@xF=G! zi4`A?WdA?=ispomF{3WuI&>OI?c{ziU>v$3CKr#gHSzr&;z_^Ud9Grz+_ zJeub9uTi#Yu^|gv+HTzP4CTa67=5e(}Uid-Bf#T z9eIqB$*$Ivy!lePoRt8Ssb0xCi{Hou(POUJ)qkc5wl%1oAl|Kna(XgUkoRBUejgy> zk<_xx6ISrB0dkS_qoyMC?e8@c4IjWGnsR9Yq-_9meY>_?Mt{g|_Bn|jO9avb#NYr` zxf?k6Ijvdi82B`x4_AVBAxgW`t}UJEG}-4D(LM}Z@BVl>gok~_Ausxs)^CveL48vR zsfw{ev>@{A+=kR)2MR}$AEh)QmwmHjF~dS_8O|;-`_k#O7QKZ<^m{bzLS#pzQFnzl zmMfo_?Lb!p=%b)6svLef>zC|nn)0lDNL50{z?%>#fj^azJG;*%E5&{(^dWdl68Ue? zbF**!hG}Go7Vt)RTN3%#Y2zK(fdS0$--EY5kw1;eHG9}$ny88YCwR##kDJ}uEP=9b zE1|O)P4z%E4v?g@8{<&+ovj#x4gVr|mj`^ioVr>@Yw1q?1G|9~z#JF=P%uvw+_#Vf z83j||-IK^aN&EerYpHX?UkYz+z_$_9mVMek7H%M|CO@wL(9gKL>NCTlslHhvdShJn zk~=6`<_piX;va$j7QiEb`mI9WvOga%Am4y$mPI1;eW)Gp0xzm>m>g zD|vz((VVSqLseQpZcc&cZ7)Ea`ie8^(2Q@>&ZXhe5qVJbeJOPEsyHR)kyl%nmlYkbTlZj<*RCQ zT{CmWa~zDwK3#4{pN;Wsz^zrlX1kA6*9vPPzrPtrTm`pRpb{OTL-*fg6lO82V+`C0 ziHJXS0BJ3MW8r8K3*nX|A{H@uWM3c;JZh`llV{*=Q-n=NZ@EX?#KrOv9J#T&cP*v>nww4z@9V!)A~5LcnN(&ug|_xM$kNL+OGoK zD-a<6>8yFOuaQ?+*=Te1WDML1iioFO-y_ZLEicn=JedclD3rHLfb9PA5e4nZ6L8)S zxLG=X{pAm`_wJRgP3&jd2TdX=@>mbpkL>W)?XO z=fFHa5nu+li86-K$3$@z%wCCr*K~B8DmPO41~3}t_z=)hy3(Gr?~&fLT`7c7rcB#r zwMb1#+d6!}E&{V>Nz2FG2*E1QblBGsdOs92jUBiy0<#OH?VbRhWZ?e+nzSZ}Cl24H zBk=;^D-w2S@nXpa-UR5G0X%|YT`p!Xmb=+-nvu$jonVmNL0wk?`6o;C?4@!=e9ZG= zRSa?hsA(0DQ+1qPDW@(CVn5L!SAu#vKvpb|ziYdHS+1v7o59eFr5KqHz<(Xego7e! z*9C0$0U1ukn3>Xxon&Ov*7DRBa)n=M0gIq6V6#7yiy5MvV5$-9h)~Z^Fr1W;Ia_Cg zL(-9sX(n4QW|n|59{j9OW|-D=yc+J-YWQB7F-DmtK6Gx#$r(I?jthv!)q%qet zx4h`NF!MFKJQI)`EnsTSi4Qby}?x=yFJMX2Vs1RB-co8S39|Z$jxUn zYsc5W-gHKX^wSjJ>Bc|3iK_PWIAZ$gYLoB|Gdra>H8v&P^QB*`tH$nf9!gZX$QwlS zFDTP^D{TI+0l=nDvFXh%`adAE)*TnEJBCg{1m3p+KkG&<3I}><+%pbz!sC=PWXmq=_5{$9rA&cFQ!@aq zL(seg(DE4D4+FXq!1W=>7-n5`PcLH?|ksHPUSoT^KsIO?SJ4D^sI17j0*s8gjy9CbE`3qq7J z{W??|xjK%z7DWFL)iNQ*E2M86H4((UA&T{NkgopHBc8?OARZ4H7;l&Manx%d z-V0H)6Lj4#m&H-vf%q*%8RMHB1UywThUVpxbeXw#*qVABuD4NNm8#(O|43Q^%;-9q-TQcV}{6;?h5`Xn$t z%VQHqNt~j6A;mitJBILO)( z4V(C0J!aR`8k(kl-I+B~AO6*FnsFGKIW)CMt4I$+n=N~4^-VWI7b zElP9~OX)-RK3gqGB1F+ef8Dm zD>JE$j!^Tm3hpxjB5M)Zv_rH*H7#L!mE9md2vJ>#fPwU9W{%V|>tbh>?_fqY1Sw8b zV^FR9a!{EdP6<&)O>J31vq)|8BAb}%n)@~Y@;S{(nXw`k0UzXRUhP>Ct# z+Gc5x+WWvtw=4e|z%L=lZQW1WPR;gjORluuB}R1FkV|iEG5kUAu~IVpv*5K;zO8Z% zBe{9)Q8J?LE(f|Az|DaYvuTa*Tt~8&NFB2Ydw@|l8Pxq1k(>&@zB8Z+W2rVzmce~e z5jH~2nyvUcwxKQBHw#r6UlfHZc`^x~r?p9w}NPAPZP|iMvXbJ#wh3FLM zI}2&=$-gnM_|gz|(*S}3eQ6=15~r)%MrSHn{pUIK9bC1w@+h+ZxI=-mI^2a$HFH zX`4+@7eaaj0Bvu3U{|01*uI$@9?h!XSn-DTKQyKt$%dwz%WHH^ZiA zR6Pr5M*y@%JJdGCJ+Cov`m(PQmoBW5dC~7- z@<**TU#Y%12$XVmvONft;V0|rC8cu`O9k>&GubK=Ir%w0p8#d5ZpqrmFYCKoMnzJ( zCT%Ek2bbFe&|{>T|1zMDpit+@lsl8Iujdr50=6N9nt8W{7}VsXcc=|rGRtld2Sb!uMw_2sZ8_;Y zopN{5GZXFGF!Bf3YR^~5x1Fe4m?=HwzN9)VKDChLbYQt5)YO*w(WF>g;Kio#q|8k+ z4Muu{9;gzw{V)>f{G{zGWs!wUg!^EKFbB2_%$_kzDM`BHe)si-)xg3tX4FW^$|Tdd zo}~VG{}J}PfhO0xtmQDJJn8Y<74tRxUjmFhV#vXjt|L+QRMOKFxDI-1CAT_H-b#9* zgr;qqb6n_|q}2ml>3A{U3Ux!^=1?dsCeyN!?5<7w<)l-a1d>rJc^^_sL&-{Q9LYas zBe^T7O}rCv9MMW{N9u$BCYe)$LfmF&1K^9FjB_@OaC`pepYX&Hi z6D+<3*o#8Ewkq2L5Za+#;OnHDCI*pIu|oY37!eA^BQf|NlYVO%L~^3V&jY(6#D|ge zk%govMUro;Yvb_b1#oYKSko;?%P{RdCnoQn5u_!>>i!PwZ-0SLOP-VI`Vsa(i?2rx zTS2Z3RO(QDqumDOJ zeyq>}Cv<9Z$8&>Xs%nKcg#uwK3p*ndhT?c_5nR4Hd7BYuZuC11(1hhiwUOmU)qR)f z<}M@Uwy4e~7wkA@HrWxi$4GlNdW2m3E2q!YpsQ3S%k+Sb_#JXe^q;wymX)`O&|M)?!?Mgz;{0)6 z^qYDP{~6e$A>L>XgyQqZyl7sA!)Luj*M|~Ql884m!;)zBU@Rc0m3*+>L%d0}n?IIC zf1BpC4h1nWL=A|iIzE4_j1F4n6fOj|JcK%hX8u?ct>!z0&x6<iz>rZzI(_Utc2)TTR&0ST4H}l7H(c4Ejtrvpr8sasX73Pm^(U!hb zeG9PZAv7pWgRd}u?2Otrvl#RfDq-8qU@a~kp|cWalJ_n6RdD-4>@hRR{%EUdZYKE= zSjCy-v#6O#BBb7v>f0lcx{!^v;!JWVx?qB0TEXuSVC+m{51*v`9DSJn;Ym-}eFKOd zO*Mn+AJM89Z%mtEp0P1b12$Wsw%MDyj^q8LQA|%-Sd13F#Xkjhdx#Hf9U(KQrY3c} zG>9Z>g}y-G$51F9iNRM-YCbfGB+24)Uf~cV~fN9g}NYcT_|)= z8ySf*_W~pp`<3G;xOAhsYdl6 zx)ZI?Ap}mKC|#b8*97}Wy&hg9<=muihI57kEYCmrJw1?$+#-kWB2jIVk{I(XB9gBy zGS`%JUi1pE`5Ixaapp$*YJjFNH)?-JYJiSGcZ;srQ&Vm;XZMc~9K6cXU7nrCfmVV< zR`9zX$~4}rKX9^;Qhv%L--PWTXm5xx9b}=%GYXkz&*G1PEnfu~*RV;GGV-F)S4opP z`TiZw+-Rl-=v=_n$^7P-0PfquJ^4|lifD4R3H;j)tfo5bj_I3nF+n2N!MF*^RD@)` z%P*TnY*VJu z8RkkkdC?E}%~vPysqs7c2@+aAX`rU}rkx~wO_1RP^R%_4Z(>~Q~60l zETSbr?L&mI89XeKrjU^)U7r$}TpK{bWGN#rdMliKbxzg<)K4-c+2XZ?lI%BN8_Jr; zH|5>sbQUd&5P1^et*Y91vsw~J`jnrPZV~UoJrE*H`q+^+QAmzS-&nZv8$VT$wu)RD z*^z2BB-PHuWTG8X*TV+hSfLkb60|rqC@IOM29~{ z>iFqNkqyszfwYj)3}8k;_yu zMq7&B&TH2baoN?DYRHlzS6p6iF`hr8to`Ov=Z~z0xOp1!5q!-BMmbB z$k1EJ+%9b1P>HApuW)pU{M|T4qB&PJH->uwl%RRBypYZ8#c(L7RPjcryBJ!5%4_l8 z2$hJ6qLTFMs8b{}`1QsTI2E$`)FqL8#TUy!exswjNK0rxnwH^T1C@vhsisFnZeic< z58TXCUG2^a?F?lMCf9(LnvanHT_$xNSD=Et!jX|u8NvGL-9BFAFw_}%?KfFx$}a$- z14KPYEte~`#s|nL#y>KW-}Ge4?ks*vWflr@$>d0AIts2272G1~2^HKT{o)E#)+zV_ z1sT_SkrvPv6g+4YT-A{n$4gsqn#EE{tEClY|Mbd=_YACQS73KZ2Mb#+uP!ovD>ibu z)Lx2zs>}XR)bv8lbYfZwH5)>HcWZu)nmLu!%yF^D)f6VEnSvTE;nC0l)buxMOrjTs zYE0~loY=?}()W@qml&~8i+oaVcD`gJ$g{1VG@kH`< zZpzoWs94$%phdYIT7~kv@h^f(M75x~M0yyZhtt71`%@^hh_VT=LzllLTI%0wqb<&T59fvFGwOlXxEQ`9A<;B_J_5?v>F zmk`(+vT0LSJm*6S@I>-;)!=g8k^oh`9-4{z$@u3&C8AnP&aW^I&AF~Iyk&SdLkZd| z=3K>9-4SRTD)-{w50!|D+MFv!`8i|2f%zGKxTH*PJj{$7@Y{sq6-&h+WV=P+LRP!Z_+t`4p5QzJOvQI5;AE&*#Noe08(^NIOEl zLM~%(JT2-XEhAUU4`4FDtdVNWUMF@@Q-)tSI+;5Au#GDE0Y&uz6hNa<^fyHNR8}-} zwY1cTLPb{_`#Pg8Dr%re#m7NwQ85D8cQ$~v41NA_r`a4W7ayw7$PF&+ka;c~iJ6D{P#-IT7Ff9YsUhmzw3U$#IP_YXB`=N>o(qv2cpN>c@UMYf zQbq-Oiew%tys^kU0NG+P@mK8Bs#GJ{46PudGW<_KtOEG8omw%<-v{jn^9KI+DqxD_ zIgRZgfk&Z)*jCCcmX9e@O{Elzim95~wdf1Cv1opeJug%uDr@TFJL4G1I_7(t-deed zicHD!+Jov0S>5Vlz);a*Ig?*icn+lBu^)ne3{)a2q;;Osf+dH;9;b5l5bnLZpMp6g;m*6=tmR|z<)bb zBC5d*^5+?c4)VHf_h#TNh7vSaOrwgcy4;ifNV8EKhQX)G4SD1U$wm=E!P zS^-lgYAsa$d}s-nKjGK?d%Pp4O9$xXW>833Z_Kz};V4cpk;)=b`<-_Vpqn6@R&`Md z2hODwc1G16vP2$unx^$yRM+^fd|r>*@=;4(u{1v7{a9sbog>t&I0w*HsPPzH1_Ja+0F2k6 zT`Q*iVQfxXhh?Hh#%&1IsOv{=K=3F+XZ%k*eR09%qU+ieKS^zV%mm9NZ!`XAlG@Ac zG_Tgj43u09EkIEoN(LOG$fY1PNv&Qs1!{rJRUv3Mf|C#`KSt1{pn9bg)JRBynkE;a zWCN5umUA#D`Rq7~baG3nm2}XoCbSIHJgGt-K^Gzz`G6-{kgcOiWl%3kEg)eT)OUXB z@LiqL>bn#ULb2L051=$skHHDW*P-;TV-&kGX%a7!rDBtI8yeJ}snSiMb!b?O^uLbL z;0mX?D~x#cw1^i@T;mXz#uiD#>T4b-_~@5t%hwZvWpZ{hHbf%Ig+3#)Dj%{3hHN>g z%dXTk0cFx1v?2#Vb#ISE&V`?MEV@ia0aVZ&=o)~10S!MMa6Uif_4CZ8tC@{TwNrWY8ile=A;pFZwJltpw;pu_`OiMByp_hq+1<_?v<~x zmC1)FJ^-LmeLtdCn8fz;xCyf5P)YIaamCB!eNIN56!)`oIE0QIbhwD_2qP+!>Q%+jwI21>j3`eKxTLgWC&RXa@J<#b=sq_ESOvGztBSn1DMP7Rl zogq88s!Qj8{xSdatIF0vS$8o1;~xW+hzi+xbvBWD)A7!MtPWG=h%0nGq6eWX5MPad z1H??vuMR||at2FOCSzn}u9Nc140 zH-f+!kgaNURg6-PEf$N4s;bRUKI$ID|2R}4DsQ7yjPmzElfb-&|D6h$BGKa zAIL_ju8L8fJX51oQB~ErA#*qCat=fy4ImbQa5PHp*zL^x`8CEf=vy!y;Xfw*2Sw6i zb`-xI&=5chXm^NWJwtJ@`F zqFp8vu+FB{Q((ggI8n3LoRAbvRXyuh zgz;C6R4{&PfmiT-LB>4 z7ydYDjimPSB5C9F!H!?JVe)!u4T@yZZLH+sN$aJX2^%qLR3z<@&*;#8;TOcBD{wty z7}-E{Z$P$1tE*y*)-#I5qKVQ3*8aB_*@XC4_)$@piGP$3>OD9@2YJo`mxvWM^ojN#iLKJvFMJDnEMWLX-~y{iiZ;@ROp&kSDerwi9~5fK54clJ|^` zT@%Y?--{@{R6Z~PdrVgeOU6~O9!b~K4gJ%Ld_@ZX19;1474qj79-ZV;SRl&t3y)Cv zM@*!8O?6s7u^oBVWII5;2#5h{Ed$hg$*G|^+0En1w1J|7g9~9;9_v)GMVjZ z+EB+@IJw-miD6FXbOwWNMuo}FNZDahFo(3RmRWyzk%N$vndxL^!i=|q>+3rgW?1s7 z`HTru@)WE9XnN%H3VHPk`?#z=B+Bv%d#;wT$Rs0EZrkxf^VE!5E|>Eblk`O<>0aUO zPsj?8wIY6GAfhf!EGkHgS6HxG*1|muxtdubD@+X7?p8}rGYio#^rK?2p zRlZC*p;@)A@-b(l+50jQX$U10fSO>I+i~)sD37i>IX+VA>kKMeKZ#h8zZic1%JTc^ zNM@w?R+Q%#?wb^s*LNLMb~y9}@>Ah2t0>QS?yB#1QI;t{t^88aS0F|rnUzcmrm`CS zN*C=nbZ1gc_S9n<;GG~+L6plu9)PD+@$7s%Ai3OJB9)fn*`?UfC*`K$10rcBIseFV zyEIC5es+-SQ1vbJq%cQU^B6CQ;&y(`u)9GT&0t)p??o;p?tYLRdCf9&iHzd02~3Th zVfZ}QIi%`Ns3&QkfPXf`V=sQmG>^TEV`OBb=+z-R`ny^ zG@32=!G|g(G8nB#d&;w;^-dG78Lh{9#~rQbn9=$RgEOP`crP5StEBTm7nHftdWvHO zqxD@*r;gV3!MY)Cx;Mh4z>d~SQmHh^jbuxlOyX#*t$CxotvP+n(_B{JRA)PKT8N&@ zzp0SZaIAjJQM$O98D6|#@Pl0&p7zLE3UQCnrsi(L(&_S^O1oy`=SU0$Q z>M1KBvYx8o8&8EdK((hcQhm$wU#MbgiA=AtN&C@LTx(8d_5j-%-0hXIjL}=bGy-GC zXhkqaPd8(<8Iw1PUVD>v)Kf)Ap;;(<7}&EFl_dC~`M@z3+I)1y#(xE5A%%S;64ENsg+5y8ae~ z`=wJZDA)_ajn8#`^_cN_2Z){^-1uDIuQWb4@GFkb4V^zeJ~wiH#^+yA)dp2&d_K)T zNCQk5pG&1)7pybzqa64dNrIXj)&%{jE5=s7dURXnCaYF{a}%I@u-2w?-@$35wDWwu z07zGdH11$9Et30BA+8Qc^n&cTuPz>ksKu$;0_lq{lCL*m!z0KN>1-SY?3+3^Bxot#r=bM(i8h*IQE^pwGxP~6-^TwTR3a)$&tl5| zt{EFJ_*0=;^vIv!M8A*Ms=BPPSMQKnD|*&4xtdpt;IkncvpEV-G3FCt>b`F&)E%vt zD43Fb0J#@>Z-Wa)*A|oB}Vx45-(B${Ynn5 z#@`nz5tY}HD3a?N;2Mti9w?zUm&gbfFV$WWZSm+*xy}V%WCL^#{b?Eg4N!@wuxTQ9 z7)JrCq3miD9l2mzk4Z)tf8KE9|t)wA1P>Y+uWb zl`4BpoElabrRBJ42gqQ5Z{IPJ3%F)coIir`=dEglb%V?elY#uEP?D0 zVmb(0isiD3Z$DJ~F?w%(6{I6y1AZ)2E`8~o)s8sMXkD{#FwL?OQZ?28J~xJqyy!buU}Bj*RRL& zfE*Q5NL;hVJj*5l=K;SA;sH4v@>3#7c(nl)iGCy2yAJPo$QI!7BUL`;avO!J>w)^% zX*}5`iX!|gpb}A4y4Nli#k7Xs6WRi1EB>7c7&R?kMe8ky{m)fMd4}M%0xdbqv;q7wYV2M5V6jMY>QBr4nNDJ9jAcPm*{6@ z%$%Yh-6@p`WMn9Uo1vQ#-T^#l;`X#qh8k;-8A$GT!Oqt!zDi{&k}CBTR6)_tRL8U>1OE?##e%hqspjZok8eq~7U83IKKh)a`gcy@yKE-ws*? za4?{m0Z?7G)oTgF<~@Ml6oB3^mj4z%WwLxW)={KyfcBtaEtuy54eGMfwqAc!CjCKg z-hy!*sxpfQ+wi{((CV^iy?Urfe#T1X{Z8PC|A~)LCX);@-xAt{nM`N2_9$uyqB&F| zinpbZaTl3m5@-jF1Je=yHIOYXb=k+q1OHmY%iJ8!P&|~1w3(%E{;$G#LqOhf~ zgQ%906m3mkAp9ikw*z5UGZ?d4cjHdehr9)vvBI9jx_1hVXe=jnOeUTJx~71v?CY7XZ4aGH}3hGfr|DwoM9)jorvB zL8jbHP_f_TT$9K_cB+ddyF?GwvO2pt7NWjPbIkuciDMc1*9UO~Yqc^N$=-bc+1n09 zXfLk=`Z55za$%m;(|6o6tSs%?W|A+H`YkveNq$q1ZjE%6-+2BH**qsib5}D0N&D;2 zNPuSp>J|XQj{NOqEP2b_q^*aqR_cPMFUY&0gk{7MQ#{r7$i4Mh+M45@cyt7(?WyKn z#MJ&w3{=GS2>$1w5>ZWN^)uKw3QFX5Pm2K0M;M!!}NF4);`0pL=0VXQ)s9h^PM5Z}YT# z?Hpcxw41|oZHucu#(Tpgg%+rDc=fT)Uts6(>f_8Dt}_l>{j;fj$WH&&?{&}t)R$>X zr81p-XdZU8;t(DAcvkZf|9ZAtYrNo6y=Af;wbNfPqqbl89I4(Jt~OqFDedf56WiTt zA{XPoL76qj&iERHMC3+$*3oUt2!1m=dT$f?KOo!U)Wr%*Q^aEsexo}_x7OolJ3qyulC{y)8aj6l%R&6tLnWf(Xe*KW z#-V2>R-dd%+{ACz4sSHUQy{BeT_jOOi={ums_+U(FN=Ew|6@>zsE{U+*YRqzBal{g zXrg)Iy-4_*kX5EGl&MIuJkD=76b*(}qU;d>_A)DW7G!ifAPY%36R)@NTj@e;o zq*_n;fy_qouLV{tDm)ZrbD@t=cmc?65Q|@aO_pQEp~rTsGLz2-_y?55oHH2C2FP~G za39ci4H=o3Y@e=jYRUAyNy*xJ>F=v$6Y`%ycJQn=J$abnjMl+&$*Cl+pBH%+(yQ%u zqrV9SP$3QmWV6cH=qZcE&vJQXI&p3?J;WH-YA;Rj^B^P*ee0oe`LiFKXC0CO+HB-G z2u$X-05}NEAmWZ_z9xt`VffUG!_Q&@DuK2F90_Q00Cc0Y?hh}mOMV}OQv@Y6Jc?cM zOK##RF7z`xHsIe1m5AcC9?RqxN@6qo15k^(j4N<{fhv?le24U2!op`!OO~*Myhx2( zupuB=T_n;Tsw`-#rLU_NPMtknLctWcY8ycc#-L~<1F#OnB`E5Jk~=CZqArZ0UQST~ zf^RhZ$hs9o3Ya4KS2?kbBCs5?v6<~pLTq+Bs(cPX=e@`xy}5pmbfwgO7Wdz@o5XjFs$FB- z0&OD3UHHF;N<^bD-SJ-I7+E6oje~9KQsWpx)-PE{V)#r_qyhBb5~F+y)oxQY0*$cN zc{~>((he|tKv-$`HIZf+$4JUV!MOm}LyhNi6cEn1M6ko`gMS3N0nA+ZODbTBMDOqL z))4qIWRt2cO2};3v+RDoeW}*E%Brq{)|@j%-zWHgf=Wacn63II`jVF@7h%RpK!DKohKow3spVO)+U5Ecgs6p7Wsrk&A7P%|4a6L^D>n+n;QQI~8s ztKW9Wpet0=B z#%icB#vV!6HRk`VF?IuK*#rHRF*Y~4+pM2H(Dl>n-Uedd2HBES7o$@#|B7WfzuWKf zA|F62N&Y|ae+hA*iC=BqT*kusX|3GIZ`N;Yl_>zo>QWcFRH9hE<5!EJ4fGMZ&Vbnp zVx;5O>eB0GH^`f+tCo0O2)_=p%G8B26)Bds{I)~UHBiG=cTLVPWoy)aalrwLq?yPH>z+J1ekuGJQ=iT`H3+8WA~$1ESO@|2Zer1}YIP4qr!5Ym^!eyFlE8*m*|s@>(5kb|7j z>Mm!r8n{}9BflGRi_IAhIa;?ir`@S-^+JBx+N?$SX2>=Tbq zPqE810jO53PJq|Kc>}W56JI+omtLE(aJ=eUbBiWP4}y9hfcycnNix>5mDc`pAO@er zsIKEXE06Rf8F>xCfk>_YJUkj%{ zWFt4lOoWQxNx6Ok9Y)7Q{P#e-+QhHcQknE%U)7$`YYx<8G2=g+4|VNov1U*nfstU06PM@rZP~oGk!dC2--G7RhF)LL%@_<*ccZUp+$QtXhgEHv1cmI6P$P-lAl&hkbK zSCg{&JtYL0_O~K1$v>jv|wVE>W8W6zRYc>k_r?K5psj5>?RzOW*rb zY1tU7mqPU!pMQYeu39{wE}7U*^-~eCpUnv#?5ECd__JrV^;j*9ke>jR+opHK87&9t zK-#JmYc)2I?I67*_!{)z6vPp?s{yQoVJ&hI&x@fs04D=lcMQ;tnIE{3(0xjw+6QjT z)ZON$<~%J!$s%Ycigu#pm*XfhyUowzmOMB3e(qjuR7GXjH&w~AP=q~g^_WD?f^0L0 z@8oTNtF}3=2*DX_*n6-mm@v7$_NVHWseh!?qL zD33OX<2&@%tsc)^XoS&3R@>?J)+_}6?8lt7)0MwI)g487uSLmz=m3gZqoiM;$Q2W3 zT{ghq3%SYcBUfNdW@XZ)CDSdul;I3T%+M2%-y7%%Gi>UtUED&jT;3i|V&eWj>!pA> zy<9%0zN%g5P#7{z7IK|+$Yg#+BQ_@3LuTI0w;YJ?5OJMbqf+K6U?VxyWjJDPo-4LVdw~& zj^a<|^GGG4qN=G_6r=oD2fp&a_);H!(*%r;=?j-JQo!F24FZ#^e8_egvoS}REmy8? zw7V-Bl{VZO(fFARp4eQ6*(qx8{?uc`7ozW7s9ZjNoK;+^z3h-#kvKmgPL1z|i#c$D zp3TJf!*Sv?_J9`V0X}2kYWWPA9>`cjc#X4MY)0pHbQZviUcw>{ov9hv0iX)`7{HWX zlckW?6wbwvEnaoS_wAkRzI`sc;bKt*s&F_IBZ3?8kA_M_6_`auE920GN*h%?4Q~;Y zptxeasrX3L?S(p_as&RYP>HChT{h%z;8-&JL(mj3``~;I*}MdsaNd%5f{p-aRW6TK z0ZJxcV}dNuJ&ecf8i79@a;E@%XO}m_yIL?4_ zY5qL-Fvb0*l=MOijc+Mbg$xcMzC}Tt;n1MnAhl6N<3XeN&`>H(*?OvqFQE3Qc>xvn zRrj1`e*9JUGTF{LT_LkN@>(dc{{ePgc07k>i{}?E;+c`Yxtz1y?D2H>HNa`3D8G~IV;RI&o7+LGoc(Jxfv>#%P)ns($|>$!WF#J&~6i3#+Cjp z1n8q;`>vS!%qjGXtpARnZ7b>holjHk7bJr`m(0LMIf z{M0xKO5_LQ=tJW521J#(4C;kcHzfK($0T0wQtS-qW@s+JI{?i*9#Ahl90X`8^g6&& zKu;VGIJyx}qnVbvvxe{<<&`i%r`C)|9Zsia_uA7_R`~Gay7=_w))R3*4?h;5vlBYq zba#C?-MNP!^;`07gQ+Zfp*BREi{@#SBj#Cyc_iF2d}Lr2E^+@*w-#%ed@!P&e+awX zTRE|@R%Y;vWu^#?DJ@;j9M%nax@67UNCx1bVHAsrBNqes!QL27Vp zA}d3@&k6rGWRd4??RC4G?I%mb{F z;zvB(ZZE~{_EfO?1V&bbYR{knAh;8u?*l<~G5oO}I|3#KW{sJBGgmI8Q)r$d`BTwQ zD(_(LQyuxxeduX%vP91B+vASNsQTD7FU5~=F<{2XWC5~c1iuRMBF=QnHidD&a{yXz_QB|$eQ=6 zPTDOW5W`U_9jf!PIQ!h~(62=Kdt!ns#guu#>9R4!y#-cv<^h%E`CnZ1XjE6h7N9nP zbLfQ=Ym=KG6aT|Tp$paA`au?PS~@{w_LB@XYrEocCLjC?H+D50Kx@_!yO$b3%h#OM z5se_o8t)*|81($nPG~UkFM<6WWE(^L1dn~189POkrInGdPd+&WF`ZVRsi$B{k^TVo zeRbl}W}l}I^xa192j9M`v6%qvm$82v`-wePV2+IZ+t=jUV+G?fbj7V_#9~K%&AT}c zXzVV(JG)E!r(_POVZ>N2vv-0#(d|?_xnnOW&Yv4uElsBIkPs@DFLwdG(6KsGU`%C< zFFn~OtcLcJlNIQEImn3{*y7JJhbKGhJ%Sh4W0q%gF$>CA#W?_klIzBcKwY*|423@h zI<`|hg$AA;)MZA3zZU9@o>P&$B+wIX?X=)B=hz*cc1peTNV`JrrL3KhyB?XsK+Y|~ z`q)oyrH--VUhnm?igH^c>zA`7xLx7KYLmYJS6*}pzxj1pNtDS1Ry?YCJ+uYw&%t^f zvdtsDm;$I*-YVz-^drE7fEw1T479D5i*SdT`ox|vgQZg7rxk1O4E*|ylYgO1m8MI0ZNDdmEw+}VxuVT*R8MKxEn)BQ)mE+W}xJuKvBY!|2{pu8K6$k5`d2b+8O{8 z^86b>1r31S1-K8;=f?w1U`STb3@DZ5snqA#7<5c2ZX=B|0j-5{0X7A6=`lb%G;{B6 z51Ov_M!xXHg3ap*@>a-B7V2`}ipsgfeJiRvR*Pa$jV6Z6{m2AjnS=jPs6tdAp)&$@dGF5@1aEZ${OW&x^(c zm{s1J#uDNeE+)V%<=!-(Cg4?P0awC7kL8z z+tI6gx?$lt8gkBFb3p($_;Q)1{LhRUz5q}zcP_*KRrKBtif2vTv@;7GNDt``jO6T# zYKPX-t=7_%^FJ;HTP9P)`Q=2L7k!G~{2zEERVGI;KWcG|?aF3^BH0V8U4sfmVs@iu zVfv)Wo*9#mEFu|CnaEh&Ete*`aDB=pi{0p8bPh$Q9ldfkI!RtZIYlM6JLG6RCaV)# zUQ{QWQh9+{WE^r2LV9cNG}6M1dbXJpahzl3#HFI)By6e7G!9PYX{z%t=7)D8P%;Mv zjk~c8LP@QL|C@=mOT~%RdE*mnmx>eX6{?fjXQ|}Y)|%j9$v!g>=`c{Uy9JXwH}AHq z!3L8B-&fEgQq&7+lPv`%WJ|+Mw)z?e+0q=jY>hyPE_I%T_MqfttHiE0g89@g6EZ({ zNpO?5^Nw_r_vb2WBC^RRBD+8+BaTBPQWuC-*76O?M*q86+$~Prl7YpEHvgIj+#GIC zUf2BCP2p~F^06wfScZqgGW@b)8J5YA2biKs)~`@|k~R_P#gH9);?EH5YZ-aqJIR9L-=K7pGw};BCau6EtTxfhkTm|hIbu>v4C5@GtVSg#7pI8O6~yK zbEuv5#L!!{$Jakpv8^UMZ)6QkcDb{P13wYz@&UgsD*a4P({u(Bl_c zR)^;~hf|#76w@U&#aVGbhB+P70)HPA_e1d!Ch3e3UZg(F_7I9qLUnFEX7xI(zP59n zsP)?ACUmX#P*3EN8%rb;I%X0W$ylzS8=yG=&jfTu05rq88C>*}ZaHmzW$El~KIv8} z_mjK=Bnz&@NR9NTu+78tweu1lrfaBqm|i9G|HZ@fABiwVgn#ugos$*wNfwA1Py|y> z^fXQuK{og5VwuFcvdoOHN11YFg8Tw%4f-7Tw+3i4<$!iG&M8Uu*|B@fnbRQ2u5z$g znAxO3lHE&0sf346tV#!W=VUR8??>tDl@-SyN}u2q(+YIUl~cuiiY>0VN`m4YC?1N^ zHdkThLh(VA_WD1ZeFvCSwfFYTojXg}ncW3x1Gr0PK%{rsU7GaH(w5$Pk&dp2hzJM* z3Wx|&MCru>iXbYYC}IOq?4Z~iqF6xXd*74XduJB(`Tak5l1*~noSY;lx#<&i^JgS> z87JproRW)iip%(6_32BfSH>u$$??#Yi z5X@=FGa0hn;mKplo6BWKu_bi?ZR8Y8F>J@I0qCd)%(W%8%4|vLo~iIEx4CUn=fH+6 zI6v$JHfO=YuH@!F7n`+)4O$Zq54XZRa4yU|#G8OPGMi&d_d0@H-LyAfb7yn9TNn^O zo9pAw=E#%B^QE)iq(+s6av`}#Vfa(di$UJ$iRusaWeuZ_O_Hc4uTySN7a;Iv#QYKF z55z89`9J!VZ-Vh1mg_gFTg3I_i|l?;HmGXLFReYtY4>yL+@v`V1k>}L6pK~us8%W3v7CWJPIbR6ec6Rfk^Kh zs;uf=*cS%y2tYEFn1l{mh7xq>!&!yP>slLP)V#b_^8vV^TbQ$^*U`2LS6l=^DG8V_ z2J`A*+ydqtnE$4ky9*lZJPOw}ngIANz*_-&3?}+GMr&367o9glDR%|Kc>isnMV|44 zgia#+)dpId)YS6O5lC|$W&kAGfY>j<=wi&(BzD^*c}-%K`U>S?pG4RXFnaPq7gnnH zP;If+?0)fSYiPqq6#R!xB1D3SFq4f8mdZ-9S0%tMM%**&aL#E||L z%(uY24F6kkm`!RKQWH8bWuCn`^{)VkHN(|}CVC+4Z z|HHp84zo$!`2dbgfPO9;pL}3WfIhUkE5Df&&%%6G=EQfJosU0enmO@Yv-81M0Ax-) z*X(@!f&kh1m>Y-|=8W__9`s7-1!0kpnFcQkFeOfxag*kG=+8X?9@^wii<$T?lj**k zQ`3{zO)9Vo{U3NN>y6Aq;5lI7)W{{Uw^g$}_g2l0+*>s}a&Oh_2#mzyg5Ihrg+#`| zn5~*!xwmR|`CBzuK!aqIs(BwA{Dowxkm{j-m27Wr$)3tB*;BbCdn!;H%_FdM7B-QN zA)%5;$Vj#?w`BVQOxoW>+6kX*BISWD-VRAA<*zVbL(*43Y*q8$%J8||l0KhX(&uwa z`h4I9PtqJDa?F?XP;N;N`I2r@&qK050B+SE?QSnR2T0YlRxZijf^LaAzG@_U#Z||n zMzX`MIvzEWz38gr(ZFJn>}jZD&A!-ML_($vj|G@gVCnZW%|_fYSF#=Ih1D3eydL1; zW_mOK}n1Ov0d$dD~X?Tm&EzpC2>A?Nt_Q%5Itu} z%tk^zk&r2gUvrnluenO%Lhh3IBX>z$%3TtF#gxP!NbZjTUP)N;+PNtSTolEc6my+5 z2uIM7^I^#K@40i%y;sqJh*_qahX7foD{hwQ<{&`2q~d0o?hXVip@Kg6(&#<;ShnRyANSx)ns(rrIn8p}(Hi4cI1UkO~ge-mGmZ<2vl94btA8+hp!m zaEP9W_hIsHBY7tM{4gl;Q&{vu(mQh}k0ogtKDO(;Rn^{Uu@c%NJ=UUD4_uH@Ki z9NH4NUJH&xa&zsZ2j&IOJS|+Ouh(~QKGST9ZB;$Np(;3R)2W|bsFd#o#F96vM+#-kp4#B#~1b{w(83ABPfO>ntTq`}7rPGp? zbQ#-Qxz&zxDuEV8V6+39kw*x;W_t{*vfQ=-@Bj0 zR;D}r4gs=j(aP)@oJD|q#af#^gVP9*ub3Oa=dUh2gl|_HgE)nNlIVoIfOq%^E5>_f zgxB7oq#VDQosJH&)4_ew9ePEmqw`)G`{JDlxMdYscXIfg71}s_rpo1lObagV$q z_gv-HJM9{Z^d@1wtM70;?C}>sV$*vJF!s*EUQ|sZhM& zVzyyw`r9y#!LuBAnvB)GxXINx_>cCA{aWIekF-rnF!Bjqg?;n7bVDvzMF02aUoq7I%B)*mv zkxUNmB*P2>x)tafJhWM*a1Spx&2@OWnR|HIoB?Vk13P`o2X>LTRg1C_lqE~_fO;NXLNG7}ul5~KZ-_hV9Niy?yC>Yws^z8d zG*uo8uC_N|Qr?)Z7c)`r_t5ngT>ST}`WUVjbLsjPu4dTSc~<=nSEZ74IgN1>X);{} z;5u#HJkoq?;U2d-@>?t^OBQv3`WY5`@6vOB2WS%H$+q~Px({=WC& zHE|4Af`JL*e+m9Y>**gL{=4B%evtmj;_r-h@zgr{r^9dc%7%hlV=JRcs6NGEKk^k8 zy9QX^zfR>)s}s?dE;q%J$0+2{3gitw_z?f(sRrTfKJ7smgTk}|PM!t`ah%}Dag(ip z9UP3-8nE+}7=S-2;Z9%zD(@ZmW6!$|ksirHB>PfcIG+L&E9eCBI#plBVU%Vd7n-d$ zXr@I6;|Hk^p(yhfS}g0UdEXfc`eKE$z%Suqpn{{JhGds@^3Gl_)bE5EWYPE0yp$k`3gu!!|-X^Pf;U;ccdptf`lw$SOslG*!xmg|s&=p`Fto zT}aA}&@+{i{tE5i+u4>1jqFbMLU2TBf1x=j5`R#eK6 zHO$r-Y;CE~J2?mm?ZNy{B^*Wk#61b^5i?X9YNiU7fm*8)4)~26VmU<{m*C5bMSIMF zG|;O+$&JW-(Vk2|1=O_)prXyjH-c{~65b1wD!vFKSZOMP3>R(HYYaY{2vBbV@U924 zN=f`I#t5kI5dOPIi%dbFRay-%2L|2h55PeKL4_fjNkS0FB7Zp@tDe-hTR}~#1fUaX z-U9CAapmze{^daO4V%EtN-B*u>_i6iBI)&;!P!cBvpIuCk7dxCsNc(2E#1c6Au=QR zwy_WlGp<|t0s07tvdhaMmB`=a9()ib9F&m(%Avesc*Ih7H3j)e0QbYBiqEQ`5)m4) z)gnlsUiS#8Qiupk$qz+VDf_6@q2BFiA42bsI;zR=#=ju((Blr(@chSgKmP&ks$yrC zWO)0Ev^#x-@RYks)17&On0pfG-ibV^(5D~LE+zKlA`GvY2X;zEKBm%rBvY)@m-eOR z4B6G6_Hj1ZP)`(}O4)ut?1D?t=cyafH&hJ&Vp-M0W$Y+_nl^mh!Wp6?QFRl1RkY8E za;GYMz4qmeF6abb)mef}iH@2LU$wI+1G{WAnx`Oq)wQouB}MMxa#7ThNwVn z*~ve4hQ20`?TIo&+Zb9FfRuKP8O3f$yIvE9yxWC#z3XY`P{C82#k3P1r7b_-9(v#) z+@afFpxyaJ+ACk9z2bS=3n4sOa1Off5|c$EEJZRoNw-lD%{DR;NlE@(z-08;C2p61cf=7K&sEXrOMzK8WtO!~!XliVS9-A2|UwZlSzc z6o9)WUNaAXZv~EmtHzTte|q}h$GG2%Xlk%WC)`T;k=;bfhVN*PtHQ3~qkOb;5M8BI ze~R|UhiPA5h}}n85O%>GPa@<1SXEQvobkXh1U!j=RB@s8oQWbNv<;sE6`Fyy0u`$C z9No#!z^<-_SH`wrXz{NgTt>7SJeeeA|I%gTiQ7~b3kEM>{IQoxISI&GeBNy56d)VfK+*zo z+*u%l!C?h3FCucyzar0Hz!SGmBs5Po$PbA81il`#;P}EgBJ}05kj&HQ!jo$!%y`QP zR50;>h-}qX4c%*Fk)`VDr3EaZsV9+}(TE~t z&8{=TI~Za?Pd>rdB!9=1h23nE_dh@55O)VS0_QDjBpi{yCmRb{$odPSBqw})9cFv` z!29I?l!cn=?7N6JPaVi>TT7`77a5NS;6!kqEkiyJ6-4=T4^+ZHPt^(mF!S60&S&I~ zYZ0-!TJ;BB`>uNnhK#B!;z?$g1z93DgI-mAdIk^c&HMTsrsinsY9)EI3}4#`2M@|I zxYoPK=YZvi#b9kQJn|d1`M_iW@|$$+Z$~s*z2GLqF_m-`5uyQnc0W^lYpqEwA#75s z_V`s(V{k+)Keg(r3ff=N>A)U{+W-tCOH9d^QqX>s+G^tg>;jZj-#&&obC{@?GgnP& z@e0IMxUi#(EW$@$=e4$48@0)*?oZITH(gehumtOAoUrPgZ3OBAM}%};5cB)MTMb@R z>R)K8U}a&)dkbPY*$A6BU5hTtS+ z!Wxczo&kDQwF$jg{>;Uno8~o!sr|P)7fFW3EmfnFY-<-(Nv+jvYlvome@)Sh$ebp~ z*#cNdzo^v{3_)Ypx@T$ z8CO##PbGCy)zva6U4heWUq`%BDG>PoQ!O>S+N$(UNIoVZ^APxD#qxvHS|DkN+M-gU zsAoNaIKhO~drjkA$ap-+N?~j9Agf3nZ=tde{(z3<+65P}0sxIvdk{@hp|)!MWH?l_ zFngfWvjA6L$AWUHwCJ^Hb5*qzol?@Z_o8{Q;iv)y3~x3n&70xiophYMZ~O$H=CL5* z?YBH>e$wb_sx)+U$q%Rp(d$0N+8yV{>p|v%6y~*6jpAtOj(V1}h&?V!+I3v>6rm)Z z^c7wMkB~iDc?xolN^$UoSKok*R5I~WTz+g}!PuyjzG%p(lo{o1T>_;Gno1!^Dn-!o z7UGpc3xw)^^`mJwS%`;ZYDgWyQBxd|P#dT&Efirnj5!LNeu90_!%T%L$h!DH_Cc-+ zRt!P%F$q=9gWr3x{Cwq*nih*a7^MCaMT6YV#bl1bD)}0dTakk*=tuEfP{GRoP)(Nn zt}K}o@#ifh75TnNWynXax|)NUOe!Bjm8)SIR70XjiFn;)q*)HcsjA+16^(LUZ=?BY z8>L}4CJn-Cq24DkzGdjoL`^jW#hCm}uoOmy1gNjwJPDV7X;yBxAWi10^q(PbsX``G zSNRG^S+L2t@uWGNn~5q=J>7VsuoU(x&B0aC@%d2!^An0yK*Z&USZnV--Sj*qkaG2P z)zfqo*CPpNCiB7=z)>C52aM0+5>;h!iQ_5~i1wORxe9qr{x#SMGkoDvv~VmJR~)~2 zYL~RIs%j6KNr8EvW5~-AQGMLF^!fTs3H&dpr$_n=T2nOw6I9rg_l*)hKrZYDh0DJv zp)UBU>hI+o0PPrTW)+7JSL-_zN_SYCZJ@R70mG#7Z(yXP&S_8$`A~=^%5X{4N&4pM z>P2+QNp*+p0y?FLVd;TT^ugWG)b;}(H#(LL%>PkS-3*+;0!x9>^GccGe~_FwJ`nBU zaM!PUsWz|fvj#ss)H7u&EWK6yZQsUC$tE);_rAew=3*Ef>#?6=q zLdMcCUM2m2R?XXXk4);WI%JdKU#GfZ%=ZDKrtTE%bupf35<%RvSUCf?=1Q*SL; z6}&#XHQe>bMKEjJ>5M`KR4J=LcL?L8mQpVi!_O3KsezegH@zo^1E055Z3vJEu^F`3NA~ zgo>ZKE`FR3V!;;fOlZIfu6qbC+j@&#HPu4$TB42(GrWGe zDlaLJm8!@?~>M;G$X?Y zlwq@)*wz%;L^qy}+)@o4KgEcW` z!Ot_899jn&*qEc?Z$o>N{Jp`(U<3X}_G|Jt-Nphx{FyeU*!bJn#$XtKo7mUL-=;Rc z)bKaA>&f36?PmDfrXwts{Bjcvx+^PgZAC-u%NxL-Do$X!3Fhcf!EocNO%gGEi4i9b z;Pw{G@iqhH?+08)Y0C)EaAma_E}@@3z|gT?=vWCo%h_UEMi6ZCNfP>F^BMB@=LWa& zZ{m%rVk%(Q8dy8^8C;32)oOGT>N~j4!=w^}lcnmP86dV*e`dg&7h%aThFDo~LvFI< zGL6CFWWiq#U*>aQ)8esc?yVgeE@SO13Ad?JW)%+ z=$A#$wx_|+mJF)m74&y z_Wo)>r68mvjLuhtC?vQq8Gwzq+-rKRItXn8P7~6h*xgkt!0d*r(f=g&RmbQlYuTOE$tVJPN)#+ZBVq_9l^j%riTUEnOrJrX z!g?VPY%e&QZErRVJzGe)dq&M86{3qA2XbdCvmcRn&FY#;GQKL>UYSKP=MigslVw?qlvjsQ>xm1L%tpJG!EJY#RPkYqD8wb2 zsBQw~R*xFlfdX*juh5YDKwax2o{mA_h!zWM52&xjBlJW_+J}*5yT+aY?yrBt#wGux zj!>{Hnm&vcUvE;y^4+gt4FKtQ6<8e0LmJE7&70z}Zk}J&h`T^t8IOo#^p=M01mrm% zMzQq9tjY6x8g>$p@2&!iV_D3WvQ*_TEr2oE&4IE;Xt@HG(J=nPSOXtM&4|zf>_yi7 zb@n27R7XJicrY`*&yvx5VjcUeUxmy8dRqJ z3TC*%>ktrc_^7iG!^%=mO@dI(?Q79T3hHYhe)Ul%MM1T;2Sp4j34`R~Ffn!S^6FrZ zm~K$DfoSZbOp4<$+)3Z^)@ZnGmZ473MeBYdc@E?F`PPsBY;REBV!4cI+C)RYs4ripv(CD0Z@Z3g0CJSwi7 z1pkUXzK_A50`?mpA6rfWJ!v1^V4#7D82Z4(SGu4+u#5FIs7gRI^ii?pB+$R@v>gVT z1=vs@8e2{R4FtX(ZJ@USw#0|Vmeb~GD1p3zPpcT{R>1cAP!YfsmO#US*7(>@lSxgMnXMp^X3+5+o zurmV{F+NmD_6i{xe}#o;f>3;sB;KU@v(SGp;K%Fb(8Q_gLsSWgIn$znRqklIbLQ^jiYX zWo*WMKpafKo9M-H0YD8MHw42<=jHB(!>u6B@i`d4T&G1h!{H$iAMrV4sVHT*+j#{o zCBh`01My{_g8?jY4x@<56L1>DuVOjWydE5uJJ+FzgoA=VFO1GQav^|KPL+9vLm3b& z5#Z)x;AAUtt<$hKniX_ZH3hAM$3XNSStaOEXE{Fe7YG^-0G|ZcOf)DbN^N#4ubk-JVJj0 zveb8Z!RROF8ONmb4PfU8)z#Qel{^fuRUQ}AUBqeXyQ09)!quMk-9Lxa=M zod|v#um`S!N3jWXRB&Z01AP~;uY72%zzcUk;PJuR9yCyeIw=TaT4t=k0-X}P22%+U zpbB73edrYe3w}=U?aBt<2iUP!!9!qy&JVtbj!szL1=va-8Y}Q}6m8-?!F}l91^PH( zFZ$3}fd#rO7|J%#j{*C|hh8DD;2#c7b&D;G?kbf=6g*BP1iB^oDn>pcMSZ|p`_Nc{ zr}l%uJA(r-{t@V4z$W|9Sb+t)C%9ptf!+hyMjv{Gz=D4<_zyZNVSNzTH?M+62@CYq zpo5W+K)(U(q7RJ~_*_c}{6_FsSBDGLLe~#-6_pU^JHb5o1`5|qz`FU+D+Ct&XTi7J zMmHYVSy#bBV1a%eYz?&))~f*9=0jrzo)(6{KLnpDjMd80=u2J#>|Gz~cR5+IEs=OW z_*O&oE@-yu9AJO>P*w)g=H^A>@4@4v4XQ|O%c=rnO2A|2&eR3}cW~blgKq)suz$l# z2juob5;JcCdy_26GYhd6`Y~C6t~}v{w_W~^0&&1c`SQf#3no0d&TxGf*q{Fm?}~Cm zM`XH8!Z>`*YH+BKSO+};jLx*xUF{tUK<$L)oA8}fl|acP)&CgjjIm+>9?&1)MhTx! zAhwl1}Oty-2hijf0&J$pl$)(2(=OCSI2I;acoZ)EqNd^<#CLfZUUcB8N zEK^0JSPv=QQ3S^h@Og~1i+9pKC;B|9yLe~q%NvdMg|CbDg`&qv>#BVz(dX;Im!*A$ zqFnhZ-c9?8MN?3*#k(_mcG;5A5Pdzg@7ib*y2Ro=wJ$aL5=M~4dud-<^g&d5@oeoY z6}@RQe7&`=bo3YGpm-ncD-%tHUKH=EePyHh$+N%qm5aVWo&&V6eDr?u9H@O2qGQQZ z&M4SrD@K1J&%v4&jTR@*A=+0ddYHK#u5(l+dXe!)XkYc{yQGcOzS>bfmt1_5_SKJ$ z9R%NK?Q0ahr5t=?w6AgW5C#*)$7)~mX8k*iw~9~DzE;tx%|N?J``Se>J`CSP?duff zEu-R-v@a{l8-2wmvnuVfJ*|8UehD5~ea~a{D!!NpAJQG#@FXLT_)`*p+VI|%N-KDY zS}>$NHZ=3RQ`64RK<{btBuRRFS?+RxkEDpkW}Ing}w`pOft;Iiytip@sesMPXlb=hvv_zTEv+`QYx7!K zTAga(Z1ZkfT3semN%4kST74#>5*niGgGm*iz6)Uh4JD`|i1mE{OTI9aJ&;~5k z9*ArYWmbRFRLd1WWNdi^&u%cWNkGi;Q2Hv1bW>^S=Q%(&u7vpzv!vDlwUNlz84vqV zHSY%fMsyU`OUQzH7PP~$^uh_Cx9x(Jv$sh97__so^p>+h@5=74$CxeH8mb zq2CJHoLG9hk)TgplVRvj=O=Ws zL1g3A8tiNq;i;d#9jD`RUPKN6slE{uThZdiQ)CA`C5)#oVI_?x8FCf9)_A6(A1Iot zJ^cob8H0QLhQjx}io_N8f$Ohd|18qNt z;M_M0-GEwG4S9RBXaz+QTY_B-t*U4`nf3276`OcP`yBwYix}?>Xa|3-XLam8qbTS? z*%fAs;i;dZi>R(R=M$)^7GX?Sbja?4s0p+}RS@wbPrnLs2le%>AdUQM8iFe#xGGHQ za3oJn{H-i#Hzne8@+!cpC1@RddI#0vA<%CwdoO5%5kAVN4OB}ITJ%lRA*T2$}1%B`hHH8@$0<^sEpw0K3tHy0kBamW}XX9xXB; zCi1rexCO+!e85upfbN zGQF$`vsmboRw#)-rDh_4Rq&u*UpBlP5SME@rmQl7XzQUwIt*V=^Z_WpdSHO*$A$ti zhA8$d_~|Egxiomnu45&J=o4^3JjZYvB+}7%ve6hKos8$<`{C)VJ^h9Z9gIiajc5Ge$yTJR@r)Qc9ak?+oI|A% zrGZZe*MlZRT7iLPhD1S>L0 zd-_(IgZPt;r+g5eDaO;61v=Gujtzuon)dV?G<3KXnK@ghGkD5GD{`ChaJe@!OMATj z-*Z@**CFqj9N%T~zIf(XSQrJtZo{kKD*4jiVA__4uJ{?K^$=gr3zH%Cms+2ZA=%qw6!lX{s;A6^Xq!qRNEHTmTk%AP6D! zfooB@!sJoV9{1=j6WP5VVdpbUUIXC0D?pu@-EqmQ4X1Me{6&yt*X5Kn1E9$x(D92n zg>S@{6GrFB1@$JU86OlgoEieqf}l7~0=li$I?Gzl-1i4yv=2If5<~7}-G6?MDW(eM z0I0pfyvw8_+KRT)qNy z6G5B4yT*WuLDF(CCU+*ejT->kJ~Y9A(gA3F1?W%IYT{!Rvkhnv0ON9juAJw42dn;r zgx-Oz0`q*Z%cL{Ip?YLEe9j@0&g`G1sl8RdHJX|QSTf9$d1f`a3_VrGlGfl zOXK1x!^98n_uAQqJSl~CmV@Ar$xB6BT2?ifRPnjA@5R>~;hj91duC4B+4<&!(Y!!Y zBVkP-D1+?WcJ}*ajBWphU}`>SOJeELj{a%}dTYkm0@`lUwE$VVo!RP_1$Zlt432{M zt_RRco2464J~a`GF~a5?5WjmU3`L}+C9B;~Az@PhL!fJ6bUH2@X=+8(qWXqSJs_H0 zfs(dXQWeG^LwNNCVkA+LXP1{WwleCMA%@o-KrFt3mo%h`Y6aFRh1V7!_FTbBP}i$o z6>zkbh43a2ANr_{C^_U&+FMQa&0JF#7l2S8#me;`diNhBC?nM>-DwVXnRI426gR`^ z#(=Nj%>LRzY6Z*gLO@AAYf`WhTR2`dsigQANx=%FsQIv#z@&-~m;JLztB5YiQtQ2N zGY&<9yvQ;9Hw+6(CG2jGBbRt++;W0N|3+|f<^Y2e90XX@y?NzGy>}!POxm5Hi)+ERz^NvfsxnU#mECd#cPnmmmsL%M}1&_ z0og`OMyHuKI5+TXTO@z$7IK*1j~re@8?%yss7?<1(b3pepTeDy=7ao1;|mw)GaruN zY8C@mF)Ast3NF3@-z2pZ9M-_3icjl|0W6WA$3cA22gvX}6MnQwVY5_Frx0@1M>PR! z046b=d!vZDA_rd#K0HGbFNrU4$4;2wM_&SvXn`MU0G$Zp@~Uz{ z?7xG{j}I}RkpN7&0@No0(27f_M$w6T09fvU&`EI5HhBL6)GhO=c7nDimOd195?px$ zv`Y8?pq=#TBNcZXgR7P_=WzTh5_G9DZAJ0l#p#prvA@764u2Fia4d?nu4X#vu znW>5ZRE0?uABgKnd_Z67X%0eXk7$Z=v>MYBkO$R?5aJK^$a>kxDqMOjwP%Y8jA@NG z!h*L@rHULaiYVLE&2ZZ_P))&`&oTH_25(nO>Ao3X@*sXO5AqkOJsR$vidir64B@-9 z^gU+6z5YiB!FD2?PpZL^VM(ggHKKQ9U#d`huu1u)FeFUbjY?1jtKs~=s)pdPMK0i_ zn&2BMkQ~Nsbt}0Au9d0e@E?39%?kaFTaBvV&wLu96VT(FV3M7DCdkK-E?-UtV0JmM z>y;tTPB?$kwCrgqkZEE!Hq252YkbcfGb zNI<&7J|f*Yh6>E)5e__Nwh7wNw;KY2GwH1q#CN@KmtMikk3g*g;!zJ35jGukhjy|H!qt9QM|=Pyp~rj~N*8=@=`_n?HL248 zd_~av7(PnWb2S*WQL*%Oy+HrA!Yvr~Q6268Z9yzOe+kgPD>vNa^kLAp z#?nV*gZ{%PD4vw*i=Z8irEl&J`j3}O8~W#cF=!u>Y4a=fVLo(zP%gh zzwUw#ihK`)wl$XiLjlk)Y+q*RFM@V7mfjP+TJX0rNrwJ8Xy3-t8>fN($CnuK>->_gtt07`t&SStPJS3x+d8GMuIrO z2k0}Z!91#U6e=(mgheEZp5kg6kAVe~)NqucdKiRV9x)<)rykP>3#&oUFzGH{1>)q@ zQ4z)diXDjh35ZKXNq3-mbyLHKVgyoBJ&GFV%S);-Dxd;P3`)11ELF571j8Z+J`PfN zjR9*H55>(l5X7as-l)wGQ9o)B7b*}S1hW&Dw%0`l>?$WQCfQWW|%^2 ztawXK3at$gy?tJkOBb4fHdCk27YcL=U~_#alXc5?Jll3B^?hXnT?g29LUr0Ew}R@T z>Y^bCL!Kx-?xRdT2F?brZmMBzQ&-;u@dr_HB`2sJs@nvED%b-E8jUi%mW~InL8=_o z?I)^8eIPPD6f{;wyQ9=JRDkLR!Y~qjp(C7_xv;V79Skv44j_wsm=uG+veXE+zVYf8 zw-4L|*b{_mp$zK%IY8Z{ULIq5>eqpI{|Z!E0#K9GiDd@$3lJAQ6ttD+c7s#Y-(&Ho zBjhTC`X~XT6Eo*_gHzReXv+eq17af|U^q-yw?RiQvUIwG*p~n)0GGoI6-GBKfN3Dk z^Z^sqBxX2Abwb;u{sz=?k1C@Wecr{&WOZlqvy;hwAl;!KzlJULD~OWGjpGc5L&^*x zraPZ9n79UcQ0nD^FDkzD&~QGU-U+^=^xnA@Xee{ilZq1#oZJXBEQseOg72yVh=bev zcn5(~gWxL?S=GZQAOj{U|Ku@Bk5c8)K4O#41=Eze?Md_jCWuMMrt^ zp^P>c@d3fjUOvlVZuZitZ}tYtFlIgYGhkB1tC!@7k@avoz>04kWs+aEg?WTZ%I=0v zvn>xN%KEol8SY<4H=QHHSXUS{kj}#xKP3$wL+5{9@+}y#Exvi7-h=fy zOzK3$Q4#XPH%o2;PkODgZQV=IU$F9`&o>~l$4FLR^1YSut_86i0pfFMIpS-8@Ebi^ z#x}$j`jh}ojyb5Uh>@;Fv89OYKf18!ckbc3A}vD^#-&BfM?=C@t1s0 zft`92h|@kw5}mI_)0cc}lm+Sn5DK9>UlF2^puXh$1171m6J8vlr3sQEv>M;Tr>c@h zHbs!R;SOkZ2jAH3&g~lu%pMcqjy52sJl>>Kf{)>Vap%2QR_hUFCpt!{f)`9_w6(aJj|% zBSjf!{CVw$eRsh>-uOfM7H_DdDoj4S#T)7@`H*|Up{{B(c*@P)P`0{@Zr!+4Wuc^9ejvruSsH#h7199N<1PWN@-vVH0*9b)?Wpt zQ#IHn8v7J*FZ$Tdlnd9hBFNW4)sBxczYprSK7wMoiI!vbU(;(>R)4H~!07CoepFvF z4ZWo{~v~pMWJG-tVz7ALmd#dt6c5Izqr>AU^GL(067+jqI{`%3U}d2l0KM zg8?+L$9<V8Sy`{v@0QNPZuB`0lLSyZNpDGQo2jUt(j0fP%CN$B07vB;Y z;+F-nax8!cheOlskMTa>Z7h!FAhz`Za``8eV>da8hw?}t0@?(RuJfZoci87X!B1fl zG#`NF1W7y8AU$9YEwJy$i+93m7ZCe%u`;OT_H4YfC%jGqapnqMJ<37sb#@;-j3uZ` zK-d_rdetm|N9;O$m6IZs1hFguZqfC?QbK5}z41@OAsxi#aU2NPW#5d#7Y_YE9O`q> zx0FIp+K=!p;#)wt%ZsfWXFJsdBh%13cJ0$ZtO0eShd=}8_1VzRc2~SasGb4gHIFC- zrg`X_qM_gHn}eoNeF4~SK9n7$n;fs6hW@sPLmN~GD;i~BOce;s?>F={&CuLHSQ)mB zfNd3zM}y@x&Cue&9Z(->kAr}i6pxCKHL}BNnxRdB{m=n5ACM&;3`8#7hqeduLyOd- zAUy67BkYoJl>9^kAf68t!6LM+UIqCBAL7g1Lp}8*a7P03Drtqb)dk?x5HF*|f?emQ z0ede{46ZR=%2QF~E=b5hPhZE8XQin^0Hh9w>mV4gmNf!CF7N%Y!zdp3a>p zPg{Ke${C;9LmhzPhrSO~L|?2E3!)fHz{rEhe00uKy#ENDNmtWD)0Dj=yPUkr4g&cQfY53q-pLWQf9AgzT-6|YW_ zV`)j64lBF5Fv;GAIbz$fU?LF zbsQYk^}{eGf=PV^aa4r-yis*u3=h91s0#r7d=S~YBj@QS7;h4YHxnQ}mzE>G#Rz}U zqeb3lWOr2kE1rW@yFq-x2QYWKuXIP%ucp~r*bjjE(npGtyQAu6_?k+NE(4GP9$FTy zn;T0>qWbBa9^A7j4@6xbC5g&}%6&S=!Rw-`Ef788QQoL}D2ClKs-6JAG=iiEt;Xx| z3?W9@obPj9Tt8dQ%MLGgVhS=%Ovxu3g1L#b5-e3Tkq&u`TBmmk7y=_o8 zi1NpPdH~j^t{70?K^f$^91N&0(GxqMW)xdhgM9-`D!nSg1bh)?_{<3~wZJ|Cbk5Fyuc_5Au^#r-P$6JbX4o$h$fN;@2J< z7f{ds41@M!1lXf7{(~_byaDwIJk}~4%7Vxf6{bSH0rjM>@OygX&>Y0JJ_m0={TW6% z

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

^SxS zg7cZ=K09H-?9bp@!Yyac>X6OuM>)Gio3W2NZ!d~wSW)??cMax7O+1Nn_)PAzpFhSq z(G-8gPuoY_h$rOA$HgOPlk1GfMYryr$^CrS=iNxdfC`MQ+9sghFZX&b_td7Lo{P0p zl2dR?k`qz`1Y0iG>j_{&ZVib`17qzjkM#ixADO?re~&QEMqZxyZnS?v;~@Q-$>-ga z?}Ir2geQ@aY+6~yX`W$KUhvDPyyI5Gv)H`#qz{@bx6MU$0<(mZ`0_4rx6NJyiSxo@ zHyN8zw$Y%RUur}PCjddeDofsLNBDJ^efm55jMw_6NcK=gh?ZcDD_{m0xy zWu}{&%yhHqDt#j=P5$B+ryM3*usfbW_1Kq@wbYXOSvb9rHEH zOSXUpxH7Y)L&@dG13NYgZjX?zc^CX8OXM!9IEh-g}?--tuNwLU5&3s3$En`QaLnnkiq5 z(5weIMdZ!W<%yvG6(BgKvS^JJJx`(+_v@HK4Ro(JcLOPNmoLnGgXIOqaW(^-2J(P( z>RP1#Ujmp065YXq@ZRUWx4gA>A^6u-_Y$aAvJccR=|;j<|6D~6K!5op@AKYU-Zvj1 zI5$NzK%OCuvy%q;D^P|RAic|Exi+I`19mO|S4*elL4bFbIDu+l@L~W>k?0ThP49i) zdslvG-3EH=0K4y`sF$(k7{z)S{=V}93VHyHm2}Nyd1GVyB>-O1Mw8{W%cEnB71gf? z$y?qdXl@2L^W|kS}4oMtK#a4U9bt zphXhh!LtYNecpS^Th=91;A0HbCCvcdfzwEVSE}D}jOP2y+fWUvHCa#EYH}r?b@1T@ zwq(+;nQY)Qj9V%t4V$cg1e%9ia>SAr0>P+g{-Ajq>Ol1-SFQ%Fmn3Zkvco&&PnoBo z4b)?@p2TMg7ze3er6lzEk6GH1TRi*Im@!&kFlWOED7BmFmDQkHll3Itp=VQ=M;)3k zn75%3)MRocX@|*rQin=Oy!63h?F9`<=CNiHTRZing2|Pn87i#?@$MXxPr{o|wm`xQ zieU0-tug0H(q@zOq*qNg>;|=&TuEvNvN@TIIiY#XybY&7XHBjoY1=7pm~PwQIfWZf zm95Daxh?ForS~G2eU;7KizF_=iMj7NMpj$p+m=C8(ne7}p*Nyvqcyo2joZKlcgh-B zU=L^dp|Lcan{D<3+%3r0r1RwLM!LMCF}4rD5)7-~wIaLc|Ld{d-mC&1_x9x`y)S=^ zwTA(m8}r8~SOMqk9p#%hjxzx`J>&}M@-dVCcLKpQ6kw)fi&(1&uoZHZbh#D!-wgz< z%z(+;=%AV`?W0P- zPxRU-K9k$sPZZ;SYy@pNDYP@Q1~ zxE^>J*a#c|4g!yX+&cWa9=HJ9$}sIG(VqzL8gL5Wx1j{Tg(Uc`BXJJkcVzs3yQ_(cJ~BH$MR1b^|*@4!}Jo%7e!uL1ndj=xwYxc>Poa{juI z;I9Yy3%>dc{I%VBfWLks`0FNuziwmyP<&HP@J%@1x>mg6x2HwWm$zVh0`38BIDqm! zS@}><8#9;PxZx+W>nfVb3E4pgO}k@Ot1%buJ7BC7- z-GzMySOio9F9Q53fWP=Bu4T9bz6&ttJFy371&#wJfXhHH@DO+e6n6{lV4^$24e$_9 z{8@qd3W*jV-p^Tf9$-$Vfeg&aPRzhQ#Q4ZicYE0j~pY=)E~Hx8n=gKY%-c80a}35fEylQSwDC1Z+{$n+T&L(#=RrMB`|R-L-Ai=`vlmt)RT^LZu?^l zdzR`1t^(J9{J#|DgWYkj3c5AJ2{7>>!{T-vGl9koJHW&tpdC1yA^)$?F0eeqW-zfY z!%1)_%MJ_Gzv$2VrfCCBM}#&oF`A+NUt^sEl}Cl$VB#py0kFpeN*HLc2{M#PS-SOM)zZ^&U{|cLqW4?h&{|3iRU?xxko&^>IM>3oPyW?Ru z^i|**a1R&(rk=oY5m*2$1XgC)0VWOs?ZDX#Z-D!OJHTCF%D=_*0P}$=pgzOP;Eh0Q zhCwhf8~ZqM1p7BJlA#*=IMIduo5-CLW`Sn|i!*EhHv!!lu7d}G2N^1U1@i+mXE+W% z0h|Xe0B-^VKy|mU4!j=d`c>gFxEHty+yZhJggM|!fcfm)`PH4D-1&$;=CR|oEw5|c zb+Wr|rtdM3`_I^}d$66os`IkD?sdoI_On{CedbxbEvo8c6gm~sj02{;XO z0hfVZ;0|yXc%PRp1(M z4;TR!^cgfh9l>+n9u-6y&GCi)&^XvF!E*pZ?1`(Jup#j@56*M_iMfV&wAe}Lr(%mQWu&jO2q z24E$y1=tE401g8E8J6F~J^-A}kh_Kb0w`vv1`|BL_5jy`L15A!VtxFqu8Z9Dkh|`C z()C(`I+YoCUhV>}0DZt)Kzuzmin7Yv!V+)|uqML}FwvgjHSj55FvETD10ek)p$bea z&#)HU2()In1}1uj!Mm_O0`7W{Wy2Y!{xP;MpfSVpJN|l)x+%j>a0_rG!)0(U@D?x% zRQ!oB7d#KB%diE!6*vy?8kEb}T|b^cSr6cbZGVb$#eF;*0QLfISUiH`+n-^1qHIS{ zo=4fmw<*8%7ue?i63mr^9Xq zP6g$|D8KdB*d9^V5tL8<8?0;KIbhjitTSNN7kztS`6zso;0ygLvwCs)VU*_(KO0yA zxMAZ2jXxPa7ksSrN2Rs7YF#U({{1ljqerig98(6jzxR?3n!?!r_ zpUix$L!TR-bRY87K7SdgLmuoO!!!Z&0XH=NBV?vofn^FT1>A7-C(s8La1WSM@5`U` zyk;w6WTEqt2+_gvLIAL6qiK2LSeg&4zJhy-&TGQS~n6%x!# zNH9;_)82ovF7w3^%>PC(pBuq^Z3OeQ5zNC@0vaA^1Az9YWBYCo&&i1 zANSmlKIRE0mhFG6ypA8@u~#_uP`tQu!Q}zLV&?+&xcl&q>{LRQ7+) zzRmjp_Mz^c_fxa4boP484vmRNI3Eyw--q?}(%RYG5!0o9|E-*y1>LhhEXulSS?%t6N4Fc{Q$NX;4;t)u+Kw+eHs!K&k8St zHv)$M_T$Gs`mO;FGL(K0>z!DP{r{)+{FM4xU@@=?SPkp~b^{lIOTb_T_VwoOcd6N@ z8}F%kKmDZpXm{V@?pNG>x4WN??|iGGxyMMZXI&*8VzX5F-M!-b+!@?k#So<8-8<77I zVH0>Wa1~&W3hW($VDAUSJzxZw{10(G22^EO4<^`y5y2jch~W(TeiY{~;3UuqTm&uw z><8KaUhl;BSME8# zd!El{_iy*y-aS{ZL>o03)`A-eTo)00fL35Q!^^lv+6X+0>!ZcMIv{?&|D@;m>k)e@ zLm!y93ETo60*`>!mBLAICvXvnpZmwp`!6A8&4+{&t8g9ziXRr%f*XOZ4EY&jw)tOiXOT{sQdI zaPX6e18O!3b(_#0unt%cG-o&fJ_wx3Fa#z_uLw)Qb-*TIGjJUk1gf?P^Iru6jTzWO z8NnXN2=;tN%xf0v!R|d4^)}ksaC1BE8-5D=C2$yU!zJj79k^})765LTwiD+yU;wxW zxM61t))jCTxCpr6%1>iG?0P2G0-ONcaA`N%-Gk)>v;c0{^K)1(zy;t6;D*kBhGWA& z$94f61>Eom`ryx_ZQwTGhQ$Z4&HMuPO`ryF!^L(ilYfQ#1)vsK3cLxpfp#0v8CG@<&)VKp!x7*q3jFp7qCAwm===hJ7e6y-oS`Kf(IBi|q?&0Nn7^ z-d~>kQ|!CIL!k1{FipTopcB||-?uw`ME(S23xe|7e~#_=EgY|aEr03b>mOi!{)NhC z2jx$?FJAW$;{?tCcK|nhwfD1g{|5b_18abTfE&Kr`__vS&>ItQ6SxPsVdg}9g$=9$ z4gzjyZpQikmvB78Zx0q`2!F@$r2EsSz2AJ&`#$D!uRJ5Pf{D%ygJ9wz@Cc~*kHS1K zQ3u5LIV@|-&;=&01B1Y0Aa@q`fEhM{Hv=6Ru7QcW8K(R)&iBB)42|F?-8Z@WBgX8= za0uKEoXyY=CLUy%aSqqnKsDg*tEd|@w1SBtz}~p&g*MUsw+&>VI2!8N3k~%J3MRyNdg3pad)dYJd|N-T?Ol z?Y|>bT*LkcvUF+H~<_3 zP6O^eTo?4^L7YQ@8^4EX2SzhYz2WcY+%q;Ys&- zeQ0a%?_;0%EZ#2w?tX6{%8mmkfY*T@U@*hPAuI>rV1{XbfO91HiYiz(iMuelT$dxC{$N zB5(<~n_=Q3OgAt)!!q!4U<JxEbim zFa(aDU$E>^hN)k~`Uk2qya-+c>;>F&(S6XT0r$KsejX4%H+|CcfiARh2e=EMZ!i0+ z#eZTO&%PTdWUE!F6sLUGHB0MqK;i zW04e?3AkY;^u>3e=OADRa6>v7ZM_pcQWo;L8o&*EQuMk7Tm`NHZrCst^8{Q6mVc`+ zKLFhY^a59c^0%PV3gnRh<^pc0{Wg>r^SN0-BjAR;C_noyv;p)3^Wj?>_zy$RoQ`r} z8Q_MA-;SQ1U@wl!cfiiS2R%Xo8vr+Ke>c_{zM^6I;-I{f`n~8e4_FDfVe(A$`~INSiN12zM082&EwJoXPToxmG_8y=&4 z(c6^Io0rdZ0_TB2zzt7&4}E?fV34_ml3upL<{G-jllbmTZezKM7{> zB$$%79IkDEmJG}Q!K@EA0cLSvMh1cz7no&%85Ec`f%y*z z<}_XRu!nH=_D!%iZ}#BL-nrQ$ zH+$P=58Lc5n`q3y-mD4sPED})Y4$kXk%7HI6YTAoJv_6oW`cb$6YNWwU{}cmdpago zW?)am1bZ4j2(ag1_7=>Ze+m1DdZl{mW$(P~d6&KIvL{>jJ)nCZ$};v;ORy(e_CCv= zW!anTf)8Q+0_^FPU=OVB`k$ITs}k%vmA$31=To9$m9PlR-bvZ>Xg$E5MA>^Ndjcic z($A^wx9muXRg*AAAUlbE8uii0Th9a zz*e9SaKkBluG$)yq zTzMA+zhHM=6S(r+{7--OQ(IqJ2j03x+~m|JHhpG((@URj%FSQ@*-Z!&Z{3oczvbf_ zSthZ0SgU%|GSdyt_IU0KlPz)hQYKY;aU zYA;W@y?4IzdYUT7}+$2j800TPgyJ(9S%&QIay40yZovcojSv4t+g5J!R?#ZBK!LEQ4~I3NSH-;cs< zaB&-9qrJ_$z-_;TgC@}V9zR_!?p4Lvc&mR42Rgv{*rd}x4bA1r>068#qTF=@$~f&D zehxrKEwL4;N0r&{RffVAI5}0WK~#f)aq+xf|Rh{00ix zF2|cP2IzoxgPXo9C}4Zo#cW{Qw`7_`AMrZ?+S&}V;X4rb-Od0rhQk*Cr)k$Cu9Z7s zHaOpX*iO?m@SbnTo%}1DU9!RX9>aE;uAT3CCvN7mpukr^P#9PI*gJEt{`Qx~sSjUY z-d0t}4gQw5-ST^X)}C7~8*|^3`_M=I{>E_;>hi?b|1Tf?=G?XxKP686AcWJ5{{F!f z7sS4v^Ksd8ow?zE6u%|+W6p^}C&_+laQu7kx8xczG4Dh9&tgC3d~mzqF)eJbR6jL0 zd4p@kw}-GV8F>8V@Ju#V9%E%^W9IP`!!y|!c+8ZorO0EWY^_%w17&lMzy(R!=AMp| zFOF#(@Oa&r$1d5N3mvCq<1CJW$082T*qK1b9oagN@z^38T~lG;F@ytt@@C9qg=`)f zaG_APx#YC}lb^}<2=3#uwPSK$mi?{9+-GH17~B2{^-S*D%;vtu;hEetWB2cw+`F7K z#$)Wr{`Sb89@#u=`T>vKy#e)14hQ03z^l=~qW`^-U9vUqw~{~mB9~ZbvxU(9uE^#o zEcEld8QM!Ddj)K_eej4$+pT|Y#jG3F|5{AXV77g_={c2ckDQ+8F+Fa`=l<-A@%*fT z(`|nfaO`*mHqRv-CSZHoL6L0_Icy)Fhv~L|9=UhH{>^NE;FW{Le>mIkV7J51?McgJ zn)%)K%RT?!!SCz|u-X2Mp#B@M-;>#{{kp(^9sUZm&nuu<8Gn z^88H8eS=?FI2Qfc7r)&4=k&3&5e=H(0bE09DA@F~1E2ByeAqgkpPl`T=Vxaoq2C=} zc%{kti>HSlw}kOS!SqhS{LhQl4{Z(8ax>wt3jCaZb~>a%^FI{X!$JFuX9q=LeC%hZ zMdSI|nNjGkjqJERcBT}@cSiQ=?0D>!7q0;|X#I6X@yTl69_J?wY%cGbz~*^2kLATP z$pq{#^z)ik!(`h&YJ+(C+X9>I9}H~zTgvD2#Om{5t_Cgt>YsA$YyHQ|gAaMb_}VCb zB%1%uV0;|^>|lH5^zlbnVS9@|Hr8&6+8>SDuZ`ljM)A2bZho{r*hy75zLqFHiQ?Hw zLm0m=ich0>c6=4aw@2~CD4v}^3dNEwO19z^I>`ze<6ym zj^g={Jd8gT*}YNyny5Y>&W81`Me%h}JRjnQ@k3F3eH71!;$i&i$j{EiLVsiAXGde> z`Puo{cz$+DHlClIm4*Jh(fq{IlUp}7el&`2il(2PpM~vjj{NLABJ}5Xxcx)>dvg@e z&eOv9G>UJD;@R0m7+-;x1ED=5s^1#b=Szn$zA}n$i{kn6A&g%b#kWWCd{Gg`cSL@^ zWC;B=QG1a@ynz5t|*=l)x-GJQG9n4&zB5gd{5-(OO4Rq8`q>5dm~XiUk-)wqmiGT@rC|_ zQG2=n==KMlFZl8%j87szJM#C5B>9^_FAKOz7z`MtE2d~D4s8Y!uZ-KzCDQN^`U#-kjqWA>)qAa z{iCyMH@WpS+5F9cpVyPs!SyAdA^iaCR+PK@y^g^DS@>(v9$TD{)Ae*u;NJuPe}T;> zAFh5{9-r?2czv!x*XMeQ!jkvoj-tLBzS8?ae#D_c*W>ddyE9l`oL_$M5yp2#e*WlY zJU@SI6Z$Vic73$I;`Z6$Wmtd4*0FX|RKGi#K6a8B*54h)_eAmRP&15gi{g8ucy_uO z#&1Fg}gqN1}NCSSO4>71=YQ`lC_(vr&9y6mLCm+X!_2<&Sg1@g-;7 z{K(HvPecF0sJ%3bX9uZad`%QzjN!bFnqj+}u7RGOm;%lOKcG?=oUyAG(}B#iO_D1>eom0`O$qCzdG{s zz&yPI9`1Z&?71iGy)n|tQVf|Z?-5u3$j_Tiy z;y0q>fv~+xQT>*vK07H0$ich2YV<#G6{BRUsjN;izb{PL4iZ4a+>`*(5uZ;Zss3`PTMSga!82WQ9ZvE+a zR2{|hBb_k55XIL-@$5V?j4wvQFiFB zirQ<6;ya`G#Zmm`D4rh?h3(fx@y$^@JDCjQ8>9G^D4v~~gz+1r_|_<%KY9-1+oJfk zAl}};l3}>x2D^@m-O>Ir3i!{JfuS4DM%Hf3|)$0QH{Ssi(Lf<;VUSbU(5+ zvX4abI~2?>j}Pn^Jgk2qvOA;t!%=;9CLY#58^wb0s zjAzH{8niyre=*ihc8xvWj7HPX&e+5H&42KOM z*1t8d>EHYdWBvR{Lxb9{h^9Y@riY!whw-H-K8@npiF_D8FN!Zl@$7IujIWO3OHn*K zqYvX-BD*%KUm4YBNA_X;`Y66Cif3o{Vf@|5UK7=?j_R|c{ILGQ_OW(TRKF&w&(8J3 z`dg#;x+tC<@rUs(QG9(A&(8Y8_L{L_`iJrDQG8<*&jbKr{G-S|5!G*s>N9CT zSid&1yQ2D=qxwuZ5Z1pC#WzRsOiB>O_eSw8Q9KhEgz?v+_|_<%Ne;sJro&_Hp{Raa zRG$eF!unOeIM%)!)o+jLGnqnIzc;c+qxv0DeI{WD>o*=5Yv+H)9nWhtNL~*=f{%cT}GVA;S7~|9Y%FBdXsM)n^ikuzu<2Si3T+-y79u=PqIW9g)2- zs^1^gXJ=c7^mR`H@~2zdni|iQ;Rb z_{~xLXcW&x9AW!)9b@esQT^Pnxb02nPbTjO>vu%)Nfgf{9AW&aC_atinXn^_?~dY& zQ9P4+gz=Z6_)-+lkmfp)zSEvgd~iw ziTq4X68h^RKa-Y>=VvmL&_5haPuw1po`mraqWJn~{7jG%#;=b2Oqvq< z6wl-;VSFKqZ;IlXh$W2Q9Qm1?CG*J&I>inlOIG$+7mzsD4LOpUG^(`mIQ46WWbY z{m!U9li-B$`=a=+D4q#(!uYDwW9{~+es@%#Np`~eM}B#%eIlyg6V!_oMd zj3|sBiTq4d6#8>NJNEc68pSi2Q5e5DvI|lDT(@ga=Qk!o3hNi6_#}#FvZOFRjr>fa z6#9#ipUIU%e^vKbdv-MbxIPmzh4o8O`%Kmp`a6GhtX&z!vlHqtzAEywGqccN9r>-3 zGYio69{Vjp)Hr@7jSAbZisnCVkDaE6@r$GQnrQl%R4R1dls?TIrVf~F!{N^a0Nw32A<|w{7if3}H zFuo=7Gig@nZ;kv+rWN{kN8^j*nRF|RZ;RsFqV}1bD~xZC{7l*v`a2>&lX->yBhmQc zcqaV{<2$4H&ZvDR2MgoRM)6%yJQIn9@jX#|cNEWLV_|$>6yFoYGbvdZ-y8XvtSt2R zM}8(T8_&<=X5;yp^lUsolcA00XXlLL`I$g1^bbVKBc2~7SqtNDMezgC{4*I_7(Wul z4@L1z+!n?UM}8)A3;mCx_C}(3CVmU!lRfVIrt9g^D4xmT!uX0PKKGwoeVrefL@ta^ zB0rPMh5j`1GwIxTekP+E&(9=vON6zB?Kp6Gevc#or%m_eAkb9vQ~BM0W1y-0@h)^WLaF6HkWq`-aBag{XdiRG-Nz z!}`@x{6G}X#Fk-vZ4^Hg#WVS37+)X74@dE{qxg}?&*Yh5d!vz`Nj1mwGuh^NekS1z z{cED>jmO7?ond@a6rVfq)}PL&OzIiNpNj0QQT-&U&xD|1{n0OswOgY4X;j~O6S4+$ zzji8$FGlgjTVvZVMgHo@-yOAA8O1YMX*m5uQG8Vt&!nbde0Ah!^3u>>6Zx6gH1yw% z#uvvk`Dqwm(dyQp_P@HQeI`i_)&4dbh$_{~xKOzaxQH%ERZdky`yQF|>>JQKr)@vV`c$znr)TjWpwXso|J8ebe= z6~(WK;@hM4mq+m(k)O$G!|Cgc{7hs!p8wjH@iWQoc=ee8H}p3}^Ak@GljMf+Tch}{ zX!@B@H;nI&{7kMJ`gUqW4`hI9A@bmX9Ohz2G*B*_3 zC}^MYUBT~J_`T6D!EQmh`(CIR{9fnJ;qS)yIR*UQh`-mm5ZG+5Du_oTx$l7;et%R^ zo?d-_bgkTt%6oFt-K3+Puk?E(cIvA^=d%;h{8nFZ%S-29CPfY7yQ27-D4t1D!}z+$ z&*Z3~zdrIaY3g`>CQ}{H&m^nk`I&rmJU=@P4*fNe9ZoN|w`;-n#r4UgtYQ7e$PVi> zp2=Io__oN7}PV} z(0@0YpE#aLh{O28KXJ!5U7xl_)5~PVVf=&0Zj0iX)HsY^{O+-Kdlb*)$6Wz-L{RjsN%lplDD-K~X`6fuf;pFkmR;_%qxT zaIk?>p?hN+Y&f>D-NT_+LqS2&u&^L8XJKK1K@Tbv7CfP%LP6ovFi1!=P^h7pP@uo} z_4$0xea`3N�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 G`2PU_Q{dSE diff --git a/cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/public/json/autolink.h b/cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/public/json/autolink.h deleted file mode 100644 index 37c9258ed..000000000 --- a/cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/public/json/autolink.h +++ /dev/null @@ -1,19 +0,0 @@ -#ifndef JSON_AUTOLINK_H_INCLUDED -# define JSON_AUTOLINK_H_INCLUDED - -# include "config.h" - -# ifdef JSON_IN_CPPTL -# include -# endif - -# if !defined(JSON_NO_AUTOLINK) && !defined(JSON_DLL_BUILD) && !defined(JSON_IN_CPPTL) -# define CPPTL_AUTOLINK_NAME "json" -# undef CPPTL_AUTOLINK_DLL -# ifdef JSON_DLL -# define CPPTL_AUTOLINK_DLL -# endif -# include "autolink.h" -# endif - -#endif // JSON_AUTOLINK_H_INCLUDED diff --git a/cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/public/json/config.h b/cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/public/json/config.h deleted file mode 100644 index 5d334cbc5..000000000 --- a/cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/public/json/config.h +++ /dev/null @@ -1,43 +0,0 @@ -#ifndef JSON_CONFIG_H_INCLUDED -# define JSON_CONFIG_H_INCLUDED - -/// If defined, indicates that json library is embedded in CppTL library. -//# define JSON_IN_CPPTL 1 - -/// If defined, indicates that json may leverage CppTL library -//# define JSON_USE_CPPTL 1 -/// If defined, indicates that cpptl vector based map should be used instead of std::map -/// as Value container. -//# define JSON_USE_CPPTL_SMALLMAP 1 -/// If defined, indicates that Json specific container should be used -/// (hash table & simple deque container with customizable allocator). -/// THIS FEATURE IS STILL EXPERIMENTAL! -//# define JSON_VALUE_USE_INTERNAL_MAP 1 -/// Force usage of standard new/malloc based allocator instead of memory pool based allocator. -/// The memory pools allocator used optimization (initializing Value and ValueInternalLink -/// as if it was a POD) that may cause some validation tool to report errors. -/// Only has effects if JSON_VALUE_USE_INTERNAL_MAP is defined. -//# define JSON_USE_SIMPLE_INTERNAL_ALLOCATOR 1 - -/// If defined, indicates that Json use exception to report invalid type manipulation -/// instead of C assert macro. -# define JSON_USE_EXCEPTION 1 - -# ifdef JSON_IN_CPPTL -# include -# ifndef JSON_USE_CPPTL -# define JSON_USE_CPPTL 1 -# endif -# endif - -# ifdef JSON_IN_CPPTL -# define JSON_API CPPTL_API -# elif defined(JSON_DLL_BUILD) -# define JSON_API __declspec(dllexport) -# elif defined(JSON_DLL) -# define JSON_API __declspec(dllimport) -# else -# define JSON_API -# endif - -#endif // JSON_CONFIG_H_INCLUDED diff --git a/cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/public/json/features.h b/cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/public/json/features.h deleted file mode 100644 index 5a9adec11..000000000 --- a/cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/public/json/features.h +++ /dev/null @@ -1,42 +0,0 @@ -#ifndef CPPTL_JSON_FEATURES_H_INCLUDED -# define CPPTL_JSON_FEATURES_H_INCLUDED - -# include "forwards.h" - -namespace Json { - - /** \brief Configuration passed to reader and writer. - * This configuration object can be used to force the Reader or Writer - * to behave in a standard conforming way. - */ - class JSON_API Features - { - public: - /** \brief A configuration that allows all features and assumes all strings are UTF-8. - * - C & C++ comments are allowed - * - Root object can be any JSON value - * - Assumes Value strings are encoded in UTF-8 - */ - static Features all(); - - /** \brief A configuration that is strictly compatible with the JSON specification. - * - Comments are forbidden. - * - Root object must be either an array or an object value. - * - Assumes Value strings are encoded in UTF-8 - */ - static Features strictMode(); - - /** \brief Initialize the configuration like JsonConfig::allFeatures; - */ - Features(); - - /// \c true if comments are allowed. Default: \c true. - bool allowComments_; - - /// \c true if root must be either an array or an object value. Default: \c false. - bool strictRoot_; - }; - -} // namespace Json - -#endif // CPPTL_JSON_FEATURES_H_INCLUDED diff --git a/cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/public/json/forwards.h b/cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/public/json/forwards.h deleted file mode 100644 index d0ce8300c..000000000 --- a/cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/public/json/forwards.h +++ /dev/null @@ -1,39 +0,0 @@ -#ifndef JSON_FORWARDS_H_INCLUDED -# define JSON_FORWARDS_H_INCLUDED - -# include "config.h" - -namespace Json { - - // writer.h - class FastWriter; - class StyledWriter; - - // reader.h - class Reader; - - // features.h - class Features; - - // value.h - typedef int Int; - typedef unsigned int UInt; - class StaticString; - class Path; - class PathArgument; - class Value; - class ValueIteratorBase; - class ValueIterator; - class ValueConstIterator; -#ifdef JSON_VALUE_USE_INTERNAL_MAP - class ValueAllocator; - class ValueMapAllocator; - class ValueInternalLink; - class ValueInternalArray; - class ValueInternalMap; -#endif // #ifdef JSON_VALUE_USE_INTERNAL_MAP - -} // namespace Json - - -#endif // JSON_FORWARDS_H_INCLUDED diff --git a/cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/public/json/json.h b/cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/public/json/json.h deleted file mode 100644 index c71ed65ab..000000000 --- a/cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/public/json/json.h +++ /dev/null @@ -1,10 +0,0 @@ -#ifndef JSON_JSON_H_INCLUDED -# define JSON_JSON_H_INCLUDED - -# include "autolink.h" -# include "value.h" -# include "reader.h" -# include "writer.h" -# include "features.h" - -#endif // JSON_JSON_H_INCLUDED diff --git a/cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/public/json/reader.h b/cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/public/json/reader.h deleted file mode 100644 index ee1d6a244..000000000 --- a/cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/public/json/reader.h +++ /dev/null @@ -1,196 +0,0 @@ -#ifndef CPPTL_JSON_READER_H_INCLUDED -# define CPPTL_JSON_READER_H_INCLUDED - -# include "features.h" -# include "value.h" -# include -# include -# include -# include - -namespace Json { - - /** \brief Unserialize a JSON document into a Value. - * - */ - class JSON_API Reader - { - public: - typedef char Char; - typedef const Char *Location; - - /** \brief Constructs a Reader allowing all features - * for parsing. - */ - Reader(); - - /** \brief Constructs a Reader allowing the specified feature set - * for parsing. - */ - Reader( const Features &features ); - - /** \brief Read a Value from a JSON document. - * \param document UTF-8 encoded string containing the document to read. - * \param root [out] Contains the root value of the document if it was - * successfully parsed. - * \param collectComments \c true to collect comment and allow writing them back during - * serialization, \c false to discard comments. - * This parameter is ignored if Features::allowComments_ - * is \c false. - * \return \c true if the document was successfully parsed, \c false if an error occurred. - */ - bool parse( const std::string &document, - Value &root, - bool collectComments = true ); - - /** \brief Read a Value from a JSON document. - * \param document UTF-8 encoded string containing the document to read. - * \param root [out] Contains the root value of the document if it was - * successfully parsed. - * \param collectComments \c true to collect comment and allow writing them back during - * serialization, \c false to discard comments. - * This parameter is ignored if Features::allowComments_ - * is \c false. - * \return \c true if the document was successfully parsed, \c false if an error occurred. - */ - bool parse( const char *beginDoc, const char *endDoc, - Value &root, - bool collectComments = true ); - - /// \brief Parse from input stream. - /// \see Json::operator>>(std::istream&, Json::Value&). - bool parse( std::istream &is, - Value &root, - bool collectComments = true ); - - /** \brief Returns a user friendly string that list errors in the parsed document. - * \return Formatted error message with the list of errors with their location in - * the parsed document. An empty string is returned if no error occurred - * during parsing. - */ - std::string getFormatedErrorMessages() const; - - private: - enum TokenType - { - tokenEndOfStream = 0, - tokenObjectBegin, - tokenObjectEnd, - tokenArrayBegin, - tokenArrayEnd, - tokenString, - tokenNumber, - tokenTrue, - tokenFalse, - tokenNull, - tokenArraySeparator, - tokenMemberSeparator, - tokenComment, - tokenError - }; - - class Token - { - public: - TokenType type_; - Location start_; - Location end_; - }; - - class ErrorInfo - { - public: - Token token_; - std::string message_; - Location extra_; - }; - - typedef std::deque Errors; - - bool expectToken( TokenType type, Token &token, const char *message ); - bool readToken( Token &token ); - void skipSpaces(); - bool match( Location pattern, - int patternLength ); - bool readComment(); - bool readCStyleComment(); - bool readCppStyleComment(); - bool readString(); - void readNumber(); - bool readValue(); - bool readObject( Token &token ); - bool readArray( Token &token ); - bool decodeNumber( Token &token ); - bool decodeString( Token &token ); - bool decodeString( Token &token, std::string &decoded ); - bool decodeDouble( Token &token ); - bool decodeUnicodeCodePoint( Token &token, - Location ¤t, - Location end, - unsigned int &unicode ); - bool decodeUnicodeEscapeSequence( Token &token, - Location ¤t, - Location end, - unsigned int &unicode ); - bool addError( const std::string &message, - Token &token, - Location extra = 0 ); - bool recoverFromError( TokenType skipUntilToken ); - bool addErrorAndRecover( const std::string &message, - Token &token, - TokenType skipUntilToken ); - void skipUntilSpace(); - Value ¤tValue(); - Char getNextChar(); - void getLocationLineAndColumn( Location location, - int &line, - int &column ) const; - std::string getLocationLineAndColumn( Location location ) const; - void addComment( Location begin, - Location end, - CommentPlacement placement ); - void skipCommentTokens( Token &token ); - - typedef std::stack Nodes; - Nodes nodes_; - Errors errors_; - std::string document_; - Location begin_; - Location end_; - Location current_; - Location lastValueEnd_; - Value *lastValue_; - std::string commentsBefore_; - Features features_; - bool collectComments_; - }; - - /** \brief Read from 'sin' into 'root'. - - Always keep comments from the input JSON. - - This can be used to read a file into a particular sub-object. - For example: - \code - Json::Value root; - cin >> root["dir"]["file"]; - cout << root; - \endcode - Result: - \verbatim - { - "dir": { - "file": { - // The input stream JSON would be nested here. - } - } - } - \endverbatim - \throw std::exception on parse error. - \see Json::operator<<() - */ - std::istream& operator>>( std::istream&, Value& ); - -} // namespace Json - -#endif // CPPTL_JSON_READER_H_INCLUDED diff --git a/cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/public/json/value.h b/cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/public/json/value.h deleted file mode 100644 index 912b8304f..000000000 --- a/cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/public/json/value.h +++ /dev/null @@ -1,1069 +0,0 @@ -#ifndef CPPTL_JSON_H_INCLUDED -# define CPPTL_JSON_H_INCLUDED - -# include "forwards.h" -# include -# include - -# ifndef JSON_USE_CPPTL_SMALLMAP -# include -# else -# include -# endif -# ifdef JSON_USE_CPPTL -# include -# endif - -/** \brief JSON (JavaScript Object Notation). - */ -namespace Json { - - /** \brief Type of the value held by a Value object. - */ - enum ValueType - { - nullValue = 0, ///< 'null' value - intValue, ///< signed integer value - uintValue, ///< unsigned integer value - realValue, ///< double value - stringValue, ///< UTF-8 string value - booleanValue, ///< bool value - arrayValue, ///< array value (ordered list) - objectValue ///< object value (collection of name/value pairs). - }; - - enum CommentPlacement - { - commentBefore = 0, ///< a comment placed on the line before a value - commentAfterOnSameLine, ///< a comment just after a value on the same line - commentAfter, ///< a comment on the line after a value (only make sense for root value) - numberOfCommentPlacement - }; - -//# ifdef JSON_USE_CPPTL -// typedef CppTL::AnyEnumerator EnumMemberNames; -// typedef CppTL::AnyEnumerator EnumValues; -//# endif - - /** \brief Lightweight wrapper to tag static string. - * - * Value constructor and objectValue member assignment takes advantage of the - * StaticString and avoid the cost of string duplication when storing the - * string or the member name. - * - * Example of usage: - * \code - * Json::Value aValue( StaticString("some text") ); - * Json::Value object; - * static const StaticString code("code"); - * object[code] = 1234; - * \endcode - */ - class JSON_API StaticString - { - public: - explicit StaticString( const char *czstring ) - : str_( czstring ) - { - } - - operator const char *() const - { - return str_; - } - - const char *c_str() const - { - return str_; - } - - private: - const char *str_; - }; - - /** \brief Represents a JSON value. - * - * This class is a discriminated union wrapper that can represents a: - * - signed integer [range: Value::minInt - Value::maxInt] - * - unsigned integer (range: 0 - Value::maxUInt) - * - double - * - UTF-8 string - * - boolean - * - 'null' - * - an ordered list of Value - * - collection of name/value pairs (javascript object) - * - * The type of the held value is represented by a #ValueType and - * can be obtained using type(). - * - * values of an #objectValue or #arrayValue can be accessed using operator[]() methods. - * Non const methods will automatically create the a #nullValue element - * if it does not exist. - * The sequence of an #arrayValue will be automatically resize and initialized - * with #nullValue. resize() can be used to enlarge or truncate an #arrayValue. - * - * The get() methods can be used to obtains default value in the case the required element - * does not exist. - * - * It is possible to iterate over the list of a #objectValue values using - * the getMemberNames() method. - */ - class JSON_API Value - { - friend class ValueIteratorBase; -# ifdef JSON_VALUE_USE_INTERNAL_MAP - friend class ValueInternalLink; - friend class ValueInternalMap; -# endif - public: - typedef std::vector Members; - typedef ValueIterator iterator; - typedef ValueConstIterator const_iterator; - typedef Json::UInt UInt; - typedef Json::Int Int; - typedef UInt ArrayIndex; - - static const Value null; - static const Int minInt; - static const Int maxInt; - static const UInt maxUInt; - - private: -#ifndef JSONCPP_DOC_EXCLUDE_IMPLEMENTATION -# ifndef JSON_VALUE_USE_INTERNAL_MAP - class CZString - { - public: - enum DuplicationPolicy - { - noDuplication = 0, - duplicate, - duplicateOnCopy - }; - CZString( int index ); - CZString( const char *cstr, DuplicationPolicy allocate ); - CZString( const CZString &other ); - ~CZString(); - CZString &operator =( const CZString &other ); - bool operator<( const CZString &other ) const; - bool operator==( const CZString &other ) const; - int index() const; - const char *c_str() const; - bool isStaticString() const; - private: - void swap( CZString &other ); - const char *cstr_; - int index_; - }; - - public: -# ifndef JSON_USE_CPPTL_SMALLMAP - typedef std::map ObjectValues; -# else - typedef CppTL::SmallMap ObjectValues; -# endif // ifndef JSON_USE_CPPTL_SMALLMAP -# endif // ifndef JSON_VALUE_USE_INTERNAL_MAP -#endif // ifndef JSONCPP_DOC_EXCLUDE_IMPLEMENTATION - - public: - /** \brief Create a default Value of the given type. - - This is a very useful constructor. - To create an empty array, pass arrayValue. - To create an empty object, pass objectValue. - Another Value can then be set to this one by assignment. - This is useful since clear() and resize() will not alter types. - - Examples: - \code - Json::Value null_value; // null - Json::Value arr_value(Json::arrayValue); // [] - Json::Value obj_value(Json::objectValue); // {} - \endcode - */ - Value( ValueType type = nullValue ); - Value( Int value ); - Value( UInt value ); - Value( double value ); - Value( const char *value ); - Value( const char *beginValue, const char *endValue ); - /** \brief Constructs a value from a static string. - - * Like other value string constructor but do not duplicate the string for - * internal storage. The given string must remain alive after the call to this - * constructor. - * Example of usage: - * \code - * Json::Value aValue( StaticString("some text") ); - * \endcode - */ - Value( const StaticString &value ); - Value( const std::string &value ); -# ifdef JSON_USE_CPPTL - Value( const CppTL::ConstString &value ); -# endif - Value( bool value ); - Value( const Value &other ); - ~Value(); - - Value &operator=( const Value &other ); - /// Swap values. - /// \note Currently, comments are intentionally not swapped, for - /// both logic and efficiency. - void swap( Value &other ); - - ValueType type() const; - - bool operator <( const Value &other ) const; - bool operator <=( const Value &other ) const; - bool operator >=( const Value &other ) const; - bool operator >( const Value &other ) const; - - bool operator ==( const Value &other ) const; - bool operator !=( const Value &other ) const; - - int compare( const Value &other ); - - const char *asCString() const; - std::string asString() const; -# ifdef JSON_USE_CPPTL - CppTL::ConstString asConstString() const; -# endif - Int asInt() const; - UInt asUInt() const; - double asDouble() const; - bool asBool() const; - - bool isNull() const; - bool isBool() const; - bool isInt() const; - bool isUInt() const; - bool isIntegral() const; - bool isDouble() const; - bool isNumeric() const; - bool isString() const; - bool isArray() const; - bool isObject() const; - - bool isConvertibleTo( ValueType other ) const; - - /// Number of values in array or object - UInt size() const; - - /// \brief Return true if empty array, empty object, or null; - /// otherwise, false. - bool empty() const; - - /// Return isNull() - bool operator!() const; - - /// Remove all object members and array elements. - /// \pre type() is arrayValue, objectValue, or nullValue - /// \post type() is unchanged - void clear(); - - /// Resize the array to size elements. - /// New elements are initialized to null. - /// May only be called on nullValue or arrayValue. - /// \pre type() is arrayValue or nullValue - /// \post type() is arrayValue - void resize( UInt size ); - - /// Access an array element (zero based index ). - /// If the array contains less than index element, then null value are inserted - /// in the array so that its size is index+1. - /// (You may need to say 'value[0u]' to get your compiler to distinguish - /// this from the operator[] which takes a string.) - Value &operator[]( UInt index ); - /// Access an array element (zero based index ) - /// (You may need to say 'value[0u]' to get your compiler to distinguish - /// this from the operator[] which takes a string.) - const Value &operator[]( UInt index ) const; - /// If the array contains at least index+1 elements, returns the element value, - /// otherwise returns defaultValue. - Value get( UInt index, - const Value &defaultValue ) const; - /// Return true if index < size(). - bool isValidIndex( UInt index ) const; - /// \brief Append value to array at the end. - /// - /// Equivalent to jsonvalue[jsonvalue.size()] = value; - Value &append( const Value &value ); - - /// Access an object value by name, create a null member if it does not exist. - Value &operator[]( const char *key ); - /// Access an object value by name, returns null if there is no member with that name. - const Value &operator[]( const char *key ) const; - /// Access an object value by name, create a null member if it does not exist. - Value &operator[]( const std::string &key ); - /// Access an object value by name, returns null if there is no member with that name. - const Value &operator[]( const std::string &key ) const; - /** \brief Access an object value by name, create a null member if it does not exist. - - * If the object as no entry for that name, then the member name used to store - * the new entry is not duplicated. - * Example of use: - * \code - * Json::Value object; - * static const StaticString code("code"); - * object[code] = 1234; - * \endcode - */ - Value &operator[]( const StaticString &key ); -# ifdef JSON_USE_CPPTL - /// Access an object value by name, create a null member if it does not exist. - Value &operator[]( const CppTL::ConstString &key ); - /// Access an object value by name, returns null if there is no member with that name. - const Value &operator[]( const CppTL::ConstString &key ) const; -# endif - /// Return the member named key if it exist, defaultValue otherwise. - Value get( const char *key, - const Value &defaultValue ) const; - /// Return the member named key if it exist, defaultValue otherwise. - Value get( const std::string &key, - const Value &defaultValue ) const; -# ifdef JSON_USE_CPPTL - /// Return the member named key if it exist, defaultValue otherwise. - Value get( const CppTL::ConstString &key, - const Value &defaultValue ) const; -# endif - /// \brief Remove and return the named member. - /// - /// Do nothing if it did not exist. - /// \return the removed Value, or null. - /// \pre type() is objectValue or nullValue - /// \post type() is unchanged - Value removeMember( const char* key ); - /// Same as removeMember(const char*) - Value removeMember( const std::string &key ); - - /// Return true if the object has a member named key. - bool isMember( const char *key ) const; - /// Return true if the object has a member named key. - bool isMember( const std::string &key ) const; -# ifdef JSON_USE_CPPTL - /// Return true if the object has a member named key. - bool isMember( const CppTL::ConstString &key ) const; -# endif - - /// \brief Return a list of the member names. - /// - /// If null, return an empty list. - /// \pre type() is objectValue or nullValue - /// \post if type() was nullValue, it remains nullValue - Members getMemberNames() const; - -//# ifdef JSON_USE_CPPTL -// EnumMemberNames enumMemberNames() const; -// EnumValues enumValues() const; -//# endif - - /// Comments must be //... or /* ... */ - void setComment( const char *comment, - CommentPlacement placement ); - /// Comments must be //... or /* ... */ - void setComment( const std::string &comment, - CommentPlacement placement ); - bool hasComment( CommentPlacement placement ) const; - /// Include delimiters and embedded newlines. - std::string getComment( CommentPlacement placement ) const; - - std::string toStyledString() const; - - const_iterator begin() const; - const_iterator end() const; - - iterator begin(); - iterator end(); - - private: - Value &resolveReference( const char *key, - bool isStatic ); - -# ifdef JSON_VALUE_USE_INTERNAL_MAP - inline bool isItemAvailable() const - { - return itemIsUsed_ == 0; - } - - inline void setItemUsed( bool isUsed = true ) - { - itemIsUsed_ = isUsed ? 1 : 0; - } - - inline bool isMemberNameStatic() const - { - return memberNameIsStatic_ == 0; - } - - inline void setMemberNameIsStatic( bool isStatic ) - { - memberNameIsStatic_ = isStatic ? 1 : 0; - } -# endif // # ifdef JSON_VALUE_USE_INTERNAL_MAP - - private: - struct CommentInfo - { - CommentInfo(); - ~CommentInfo(); - - void setComment( const char *text ); - - char *comment_; - }; - - //struct MemberNamesTransform - //{ - // typedef const char *result_type; - // const char *operator()( const CZString &name ) const - // { - // return name.c_str(); - // } - //}; - - union ValueHolder - { - Int int_; - UInt uint_; - double real_; - bool bool_; - char *string_; -# ifdef JSON_VALUE_USE_INTERNAL_MAP - ValueInternalArray *array_; - ValueInternalMap *map_; -#else - ObjectValues *map_; -# endif - } value_; - ValueType type_ : 8; - int allocated_ : 1; // Notes: if declared as bool, bitfield is useless. -# ifdef JSON_VALUE_USE_INTERNAL_MAP - unsigned int itemIsUsed_ : 1; // used by the ValueInternalMap container. - int memberNameIsStatic_ : 1; // used by the ValueInternalMap container. -# endif - CommentInfo *comments_; - }; - - - /** \brief Experimental and untested: represents an element of the "path" to access a node. - */ - class PathArgument - { - public: - friend class Path; - - PathArgument(); - PathArgument( UInt index ); - PathArgument( const char *key ); - PathArgument( const std::string &key ); - - private: - enum Kind - { - kindNone = 0, - kindIndex, - kindKey - }; - std::string key_; - UInt index_; - Kind kind_; - }; - - /** \brief Experimental and untested: represents a "path" to access a node. - * - * Syntax: - * - "." => root node - * - ".[n]" => elements at index 'n' of root node (an array value) - * - ".name" => member named 'name' of root node (an object value) - * - ".name1.name2.name3" - * - ".[0][1][2].name1[3]" - * - ".%" => member name is provided as parameter - * - ".[%]" => index is provided as parameter - */ - class Path - { - public: - Path( const std::string &path, - const PathArgument &a1 = PathArgument(), - const PathArgument &a2 = PathArgument(), - const PathArgument &a3 = PathArgument(), - const PathArgument &a4 = PathArgument(), - const PathArgument &a5 = PathArgument() ); - - const Value &resolve( const Value &root ) const; - Value resolve( const Value &root, - const Value &defaultValue ) const; - /// Creates the "path" to access the specified node and returns a reference on the node. - Value &make( Value &root ) const; - - private: - typedef std::vector InArgs; - typedef std::vector Args; - - void makePath( const std::string &path, - const InArgs &in ); - void addPathInArg( const std::string &path, - const InArgs &in, - InArgs::const_iterator &itInArg, - PathArgument::Kind kind ); - void invalidPath( const std::string &path, - int location ); - - Args args_; - }; - - /** \brief Experimental do not use: Allocator to customize member name and string value memory management done by Value. - * - * - makeMemberName() and releaseMemberName() are called to respectively duplicate and - * free an Json::objectValue member name. - * - duplicateStringValue() and releaseStringValue() are called similarly to - * duplicate and free a Json::stringValue value. - */ - class ValueAllocator - { - public: - enum { unknown = (unsigned)-1 }; - - virtual ~ValueAllocator(); - - virtual char *makeMemberName( const char *memberName ) = 0; - virtual void releaseMemberName( char *memberName ) = 0; - virtual char *duplicateStringValue( const char *value, - unsigned int length = unknown ) = 0; - virtual void releaseStringValue( char *value ) = 0; - }; - -#ifdef JSON_VALUE_USE_INTERNAL_MAP - /** \brief Allocator to customize Value internal map. - * Below is an example of a simple implementation (default implementation actually - * use memory pool for speed). - * \code - class DefaultValueMapAllocator : public ValueMapAllocator - { - public: // overridden from ValueMapAllocator - virtual ValueInternalMap *newMap() - { - return new ValueInternalMap(); - } - - virtual ValueInternalMap *newMapCopy( const ValueInternalMap &other ) - { - return new ValueInternalMap( other ); - } - - virtual void destructMap( ValueInternalMap *map ) - { - delete map; - } - - virtual ValueInternalLink *allocateMapBuckets( unsigned int size ) - { - return new ValueInternalLink[size]; - } - - virtual void releaseMapBuckets( ValueInternalLink *links ) - { - delete [] links; - } - - virtual ValueInternalLink *allocateMapLink() - { - return new ValueInternalLink(); - } - - virtual void releaseMapLink( ValueInternalLink *link ) - { - delete link; - } - }; - * \endcode - */ - class JSON_API ValueMapAllocator - { - public: - virtual ~ValueMapAllocator(); - virtual ValueInternalMap *newMap() = 0; - virtual ValueInternalMap *newMapCopy( const ValueInternalMap &other ) = 0; - virtual void destructMap( ValueInternalMap *map ) = 0; - virtual ValueInternalLink *allocateMapBuckets( unsigned int size ) = 0; - virtual void releaseMapBuckets( ValueInternalLink *links ) = 0; - virtual ValueInternalLink *allocateMapLink() = 0; - virtual void releaseMapLink( ValueInternalLink *link ) = 0; - }; - - /** \brief ValueInternalMap hash-map bucket chain link (for internal use only). - * \internal previous_ & next_ allows for bidirectional traversal. - */ - class JSON_API ValueInternalLink - { - public: - enum { itemPerLink = 6 }; // sizeof(ValueInternalLink) = 128 on 32 bits architecture. - enum InternalFlags { - flagAvailable = 0, - flagUsed = 1 - }; - - ValueInternalLink(); - - ~ValueInternalLink(); - - Value items_[itemPerLink]; - char *keys_[itemPerLink]; - ValueInternalLink *previous_; - ValueInternalLink *next_; - }; - - - /** \brief A linked page based hash-table implementation used internally by Value. - * \internal ValueInternalMap is a traditional bucket based hash-table, with a linked - * list in each bucket to handle collision. There is an addional twist in that - * each node of the collision linked list is a page containing a fixed amount of - * value. This provides a better compromise between memory usage and speed. - * - * Each bucket is made up of a chained list of ValueInternalLink. The last - * link of a given bucket can be found in the 'previous_' field of the following bucket. - * The last link of the last bucket is stored in tailLink_ as it has no following bucket. - * Only the last link of a bucket may contains 'available' item. The last link always - * contains at least one element unless is it the bucket one very first link. - */ - class JSON_API ValueInternalMap - { - friend class ValueIteratorBase; - friend class Value; - public: - typedef unsigned int HashKey; - typedef unsigned int BucketIndex; - -# ifndef JSONCPP_DOC_EXCLUDE_IMPLEMENTATION - struct IteratorState - { - IteratorState() - : map_(0) - , link_(0) - , itemIndex_(0) - , bucketIndex_(0) - { - } - ValueInternalMap *map_; - ValueInternalLink *link_; - BucketIndex itemIndex_; - BucketIndex bucketIndex_; - }; -# endif // ifndef JSONCPP_DOC_EXCLUDE_IMPLEMENTATION - - ValueInternalMap(); - ValueInternalMap( const ValueInternalMap &other ); - ValueInternalMap &operator =( const ValueInternalMap &other ); - ~ValueInternalMap(); - - void swap( ValueInternalMap &other ); - - BucketIndex size() const; - - void clear(); - - bool reserveDelta( BucketIndex growth ); - - bool reserve( BucketIndex newItemCount ); - - const Value *find( const char *key ) const; - - Value *find( const char *key ); - - Value &resolveReference( const char *key, - bool isStatic ); - - void remove( const char *key ); - - void doActualRemove( ValueInternalLink *link, - BucketIndex index, - BucketIndex bucketIndex ); - - ValueInternalLink *&getLastLinkInBucket( BucketIndex bucketIndex ); - - Value &setNewItem( const char *key, - bool isStatic, - ValueInternalLink *link, - BucketIndex index ); - - Value &unsafeAdd( const char *key, - bool isStatic, - HashKey hashedKey ); - - HashKey hash( const char *key ) const; - - int compare( const ValueInternalMap &other ) const; - - private: - void makeBeginIterator( IteratorState &it ) const; - void makeEndIterator( IteratorState &it ) const; - static bool equals( const IteratorState &x, const IteratorState &other ); - static void increment( IteratorState &iterator ); - static void incrementBucket( IteratorState &iterator ); - static void decrement( IteratorState &iterator ); - static const char *key( const IteratorState &iterator ); - static const char *key( const IteratorState &iterator, bool &isStatic ); - static Value &value( const IteratorState &iterator ); - static int distance( const IteratorState &x, const IteratorState &y ); - - private: - ValueInternalLink *buckets_; - ValueInternalLink *tailLink_; - BucketIndex bucketsSize_; - BucketIndex itemCount_; - }; - - /** \brief A simplified deque implementation used internally by Value. - * \internal - * It is based on a list of fixed "page", each page contains a fixed number of items. - * Instead of using a linked-list, a array of pointer is used for fast item look-up. - * Look-up for an element is as follow: - * - compute page index: pageIndex = itemIndex / itemsPerPage - * - look-up item in page: pages_[pageIndex][itemIndex % itemsPerPage] - * - * Insertion is amortized constant time (only the array containing the index of pointers - * need to be reallocated when items are appended). - */ - class JSON_API ValueInternalArray - { - friend class Value; - friend class ValueIteratorBase; - public: - enum { itemsPerPage = 8 }; // should be a power of 2 for fast divide and modulo. - typedef Value::ArrayIndex ArrayIndex; - typedef unsigned int PageIndex; - -# ifndef JSONCPP_DOC_EXCLUDE_IMPLEMENTATION - struct IteratorState // Must be a POD - { - IteratorState() - : array_(0) - , currentPageIndex_(0) - , currentItemIndex_(0) - { - } - ValueInternalArray *array_; - Value **currentPageIndex_; - unsigned int currentItemIndex_; - }; -# endif // ifndef JSONCPP_DOC_EXCLUDE_IMPLEMENTATION - - ValueInternalArray(); - ValueInternalArray( const ValueInternalArray &other ); - ValueInternalArray &operator =( const ValueInternalArray &other ); - ~ValueInternalArray(); - void swap( ValueInternalArray &other ); - - void clear(); - void resize( ArrayIndex newSize ); - - Value &resolveReference( ArrayIndex index ); - - Value *find( ArrayIndex index ) const; - - ArrayIndex size() const; - - int compare( const ValueInternalArray &other ) const; - - private: - static bool equals( const IteratorState &x, const IteratorState &other ); - static void increment( IteratorState &iterator ); - static void decrement( IteratorState &iterator ); - static Value &dereference( const IteratorState &iterator ); - static Value &unsafeDereference( const IteratorState &iterator ); - static int distance( const IteratorState &x, const IteratorState &y ); - static ArrayIndex indexOf( const IteratorState &iterator ); - void makeBeginIterator( IteratorState &it ) const; - void makeEndIterator( IteratorState &it ) const; - void makeIterator( IteratorState &it, ArrayIndex index ) const; - - void makeIndexValid( ArrayIndex index ); - - Value **pages_; - ArrayIndex size_; - PageIndex pageCount_; - }; - - /** \brief Experimental: do not use. Allocator to customize Value internal array. - * Below is an example of a simple implementation (actual implementation use - * memory pool). - \code -class DefaultValueArrayAllocator : public ValueArrayAllocator -{ -public: // overridden from ValueArrayAllocator - virtual ~DefaultValueArrayAllocator() - { - } - - virtual ValueInternalArray *newArray() - { - return new ValueInternalArray(); - } - - virtual ValueInternalArray *newArrayCopy( const ValueInternalArray &other ) - { - return new ValueInternalArray( other ); - } - - virtual void destruct( ValueInternalArray *array ) - { - delete array; - } - - virtual void reallocateArrayPageIndex( Value **&indexes, - ValueInternalArray::PageIndex &indexCount, - ValueInternalArray::PageIndex minNewIndexCount ) - { - ValueInternalArray::PageIndex newIndexCount = (indexCount*3)/2 + 1; - if ( minNewIndexCount > newIndexCount ) - newIndexCount = minNewIndexCount; - void *newIndexes = realloc( indexes, sizeof(Value*) * newIndexCount ); - if ( !newIndexes ) - throw std::bad_alloc(); - indexCount = newIndexCount; - indexes = static_cast( newIndexes ); - } - virtual void releaseArrayPageIndex( Value **indexes, - ValueInternalArray::PageIndex indexCount ) - { - if ( indexes ) - free( indexes ); - } - - virtual Value *allocateArrayPage() - { - return static_cast( malloc( sizeof(Value) * ValueInternalArray::itemsPerPage ) ); - } - - virtual void releaseArrayPage( Value *value ) - { - if ( value ) - free( value ); - } -}; - \endcode - */ - class JSON_API ValueArrayAllocator - { - public: - virtual ~ValueArrayAllocator(); - virtual ValueInternalArray *newArray() = 0; - virtual ValueInternalArray *newArrayCopy( const ValueInternalArray &other ) = 0; - virtual void destructArray( ValueInternalArray *array ) = 0; - /** \brief Reallocate array page index. - * Reallocates an array of pointer on each page. - * \param indexes [input] pointer on the current index. May be \c NULL. - * [output] pointer on the new index of at least - * \a minNewIndexCount pages. - * \param indexCount [input] current number of pages in the index. - * [output] number of page the reallocated index can handle. - * \b MUST be >= \a minNewIndexCount. - * \param minNewIndexCount Minimum number of page the new index must be able to - * handle. - */ - virtual void reallocateArrayPageIndex( Value **&indexes, - ValueInternalArray::PageIndex &indexCount, - ValueInternalArray::PageIndex minNewIndexCount ) = 0; - virtual void releaseArrayPageIndex( Value **indexes, - ValueInternalArray::PageIndex indexCount ) = 0; - virtual Value *allocateArrayPage() = 0; - virtual void releaseArrayPage( Value *value ) = 0; - }; -#endif // #ifdef JSON_VALUE_USE_INTERNAL_MAP - - - /** \brief base class for Value iterators. - * - */ - class ValueIteratorBase - { - public: - typedef unsigned int size_t; - typedef int difference_type; - typedef ValueIteratorBase SelfType; - - ValueIteratorBase(); -#ifndef JSON_VALUE_USE_INTERNAL_MAP - explicit ValueIteratorBase( const Value::ObjectValues::iterator ¤t ); -#else - ValueIteratorBase( const ValueInternalArray::IteratorState &state ); - ValueIteratorBase( const ValueInternalMap::IteratorState &state ); -#endif - - bool operator ==( const SelfType &other ) const - { - return isEqual( other ); - } - - bool operator !=( const SelfType &other ) const - { - return !isEqual( other ); - } - - difference_type operator -( const SelfType &other ) const - { - return computeDistance( other ); - } - - /// Return either the index or the member name of the referenced value as a Value. - Value key() const; - - /// Return the index of the referenced Value. -1 if it is not an arrayValue. - UInt index() const; - - /// Return the member name of the referenced Value. "" if it is not an objectValue. - const char *memberName() const; - - protected: - Value &deref() const; - - void increment(); - - void decrement(); - - difference_type computeDistance( const SelfType &other ) const; - - bool isEqual( const SelfType &other ) const; - - void copy( const SelfType &other ); - - private: -#ifndef JSON_VALUE_USE_INTERNAL_MAP - Value::ObjectValues::iterator current_; - // Indicates that iterator is for a null value. - bool isNull_; -#else - union - { - ValueInternalArray::IteratorState array_; - ValueInternalMap::IteratorState map_; - } iterator_; - bool isArray_; -#endif - }; - - /** \brief const iterator for object and array value. - * - */ - class ValueConstIterator : public ValueIteratorBase - { - friend class Value; - public: - typedef unsigned int size_t; - typedef int difference_type; - typedef const Value &reference; - typedef const Value *pointer; - typedef ValueConstIterator SelfType; - - ValueConstIterator(); - private: - /*! \internal Use by Value to create an iterator. - */ -#ifndef JSON_VALUE_USE_INTERNAL_MAP - explicit ValueConstIterator( const Value::ObjectValues::iterator ¤t ); -#else - ValueConstIterator( const ValueInternalArray::IteratorState &state ); - ValueConstIterator( const ValueInternalMap::IteratorState &state ); -#endif - public: - SelfType &operator =( const ValueIteratorBase &other ); - - SelfType operator++( int ) - { - SelfType temp( *this ); - ++*this; - return temp; - } - - SelfType operator--( int ) - { - SelfType temp( *this ); - --*this; - return temp; - } - - SelfType &operator--() - { - decrement(); - return *this; - } - - SelfType &operator++() - { - increment(); - return *this; - } - - reference operator *() const - { - return deref(); - } - }; - - - /** \brief Iterator for object and array value. - */ - class ValueIterator : public ValueIteratorBase - { - friend class Value; - public: - typedef unsigned int size_t; - typedef int difference_type; - typedef Value &reference; - typedef Value *pointer; - typedef ValueIterator SelfType; - - ValueIterator(); - ValueIterator( const ValueConstIterator &other ); - ValueIterator( const ValueIterator &other ); - private: - /*! \internal Use by Value to create an iterator. - */ -#ifndef JSON_VALUE_USE_INTERNAL_MAP - explicit ValueIterator( const Value::ObjectValues::iterator ¤t ); -#else - ValueIterator( const ValueInternalArray::IteratorState &state ); - ValueIterator( const ValueInternalMap::IteratorState &state ); -#endif - public: - - SelfType &operator =( const SelfType &other ); - - SelfType operator++( int ) - { - SelfType temp( *this ); - ++*this; - return temp; - } - - SelfType operator--( int ) - { - SelfType temp( *this ); - --*this; - return temp; - } - - SelfType &operator--() - { - decrement(); - return *this; - } - - SelfType &operator++() - { - increment(); - return *this; - } - - reference operator *() const - { - return deref(); - } - }; - - -} // namespace Json - - -#endif // CPPTL_JSON_H_INCLUDED diff --git a/cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/public/json/writer.h b/cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/public/json/writer.h deleted file mode 100644 index 16cf022b2..000000000 --- a/cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/public/json/writer.h +++ /dev/null @@ -1,174 +0,0 @@ -#ifndef JSON_WRITER_H_INCLUDED -# define JSON_WRITER_H_INCLUDED - -# include "value.h" -# include -# include -# include - -namespace Json { - - class Value; - - /** \brief Abstract class for writers. - */ - class JSON_API Writer - { - public: - virtual ~Writer(); - - virtual std::string write( const Value &root ) = 0; - }; - - /** \brief Outputs a Value in JSON format without formatting (not human friendly). - * - * The JSON document is written in a single line. It is not intended for 'human' consumption, - * but may be useful to support feature such as RPC where bandwidth is limited. - * \sa Reader, Value - */ - class JSON_API FastWriter : public Writer - { - public: - FastWriter(); - virtual ~FastWriter(){} - - void enableYAMLCompatibility(); - - public: // overridden from Writer - virtual std::string write( const Value &root ); - - private: - void writeValue( const Value &value ); - - std::string document_; - bool yamlCompatibilityEnabled_; - }; - - /** \brief Writes a Value in JSON format in a human friendly way. - * - * The rules for line break and indent are as follow: - * - Object value: - * - if empty then print {} without indent and line break - * - if not empty the print '{', line break & indent, print one value per line - * and then unindent and line break and print '}'. - * - Array value: - * - if empty then print [] without indent and line break - * - if the array contains no object value, empty array or some other value types, - * and all the values fit on one lines, then print the array on a single line. - * - otherwise, it the values do not fit on one line, or the array contains - * object or non empty array, then print one value per line. - * - * If the Value have comments then they are outputed according to their #CommentPlacement. - * - * \sa Reader, Value, Value::setComment() - */ - class JSON_API StyledWriter: public Writer - { - public: - StyledWriter(); - virtual ~StyledWriter(){} - - public: // overridden from Writer - /** \brief Serialize a Value in JSON format. - * \param root Value to serialize. - * \return String containing the JSON document that represents the root value. - */ - virtual std::string write( const Value &root ); - - private: - void writeValue( const Value &value ); - void writeArrayValue( const Value &value ); - bool isMultineArray( const Value &value ); - void pushValue( const std::string &value ); - void writeIndent(); - void writeWithIndent( const std::string &value ); - void indent(); - void unindent(); - void writeCommentBeforeValue( const Value &root ); - void writeCommentAfterValueOnSameLine( const Value &root ); - bool hasCommentForValue( const Value &value ); - static std::string normalizeEOL( const std::string &text ); - - typedef std::vector ChildValues; - - ChildValues childValues_; - std::string document_; - std::string indentString_; - int rightMargin_; - int indentSize_; - bool addChildValues_; - }; - - /** \brief Writes a Value in JSON format in a human friendly way, - to a stream rather than to a string. - * - * The rules for line break and indent are as follow: - * - Object value: - * - if empty then print {} without indent and line break - * - if not empty the print '{', line break & indent, print one value per line - * and then unindent and line break and print '}'. - * - Array value: - * - if empty then print [] without indent and line break - * - if the array contains no object value, empty array or some other value types, - * and all the values fit on one lines, then print the array on a single line. - * - otherwise, it the values do not fit on one line, or the array contains - * object or non empty array, then print one value per line. - * - * If the Value have comments then they are outputed according to their #CommentPlacement. - * - * \param indentation Each level will be indented by this amount extra. - * \sa Reader, Value, Value::setComment() - */ - class JSON_API StyledStreamWriter - { - public: - StyledStreamWriter( std::string indentation="\t" ); - ~StyledStreamWriter(){} - - public: - /** \brief Serialize a Value in JSON format. - * \param out Stream to write to. (Can be ostringstream, e.g.) - * \param root Value to serialize. - * \note There is no point in deriving from Writer, since write() should not return a value. - */ - void write( std::ostream &out, const Value &root ); - - private: - void writeValue( const Value &value ); - void writeArrayValue( const Value &value ); - bool isMultineArray( const Value &value ); - void pushValue( const std::string &value ); - void writeIndent(); - void writeWithIndent( const std::string &value ); - void indent(); - void unindent(); - void writeCommentBeforeValue( const Value &root ); - void writeCommentAfterValueOnSameLine( const Value &root ); - bool hasCommentForValue( const Value &value ); - static std::string normalizeEOL( const std::string &text ); - - typedef std::vector ChildValues; - - ChildValues childValues_; - std::ostream* document_; - std::string indentString_; - int rightMargin_; - std::string indentation_; - bool addChildValues_; - }; - - std::string JSON_API valueToString( Int value ); - std::string JSON_API valueToString( UInt value ); - std::string JSON_API valueToString( double value ); - std::string JSON_API valueToString( bool value ); - std::string JSON_API valueToQuotedString( const char *value ); - - /// \brief Output using the StyledStreamWriter. - /// \see Json::operator>>() - std::ostream& operator<<( std::ostream&, const Value &root ); - -} // namespace Json - - - -#endif // JSON_WRITER_H_INCLUDED diff --git a/cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/public/json_batchallocator.h b/cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/public/json_batchallocator.h deleted file mode 100644 index 141ca77a2..000000000 --- a/cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/public/json_batchallocator.h +++ /dev/null @@ -1,125 +0,0 @@ -#ifndef JSONCPP_BATCHALLOCATOR_H_INCLUDED -# define JSONCPP_BATCHALLOCATOR_H_INCLUDED - -# include -# include - -# ifndef JSONCPP_DOC_EXCLUDE_IMPLEMENTATION - -namespace Json { - -/* Fast memory allocator. - * - * This memory allocator allocates memory for a batch of object (specified by - * the page size, the number of object in each page). - * - * It does not allow the destruction of a single object. All the allocated objects - * can be destroyed at once. The memory can be either released or reused for future - * allocation. - * - * The in-place new operator must be used to construct the object using the pointer - * returned by allocate. - */ -template -class BatchAllocator -{ -public: - typedef AllocatedType Type; - - BatchAllocator( unsigned int objectsPerPage = 255 ) - : freeHead_( 0 ) - , objectsPerPage_( objectsPerPage ) - { -// printf( "Size: %d => %s\n", sizeof(AllocatedType), typeid(AllocatedType).name() ); - assert( sizeof(AllocatedType) * objectPerAllocation >= sizeof(AllocatedType *) ); // We must be able to store a slist in the object free space. - assert( objectsPerPage >= 16 ); - batches_ = allocateBatch( 0 ); // allocated a dummy page - currentBatch_ = batches_; - } - - ~BatchAllocator() - { - for ( BatchInfo *batch = batches_; batch; ) - { - BatchInfo *nextBatch = batch->next_; - free( batch ); - batch = nextBatch; - } - } - - /// allocate space for an array of objectPerAllocation object. - /// @warning it is the responsibility of the caller to call objects constructors. - AllocatedType *allocate() - { - if ( freeHead_ ) // returns node from free list. - { - AllocatedType *object = freeHead_; - freeHead_ = *(AllocatedType **)object; - return object; - } - if ( currentBatch_->used_ == currentBatch_->end_ ) - { - currentBatch_ = currentBatch_->next_; - while ( currentBatch_ && currentBatch_->used_ == currentBatch_->end_ ) - currentBatch_ = currentBatch_->next_; - - if ( !currentBatch_ ) // no free batch found, allocate a new one - { - currentBatch_ = allocateBatch( objectsPerPage_ ); - currentBatch_->next_ = batches_; // insert at the head of the list - batches_ = currentBatch_; - } - } - AllocatedType *allocated = currentBatch_->used_; - currentBatch_->used_ += objectPerAllocation; - return allocated; - } - - /// Release the object. - /// @warning it is the responsibility of the caller to actually destruct the object. - void release( AllocatedType *object ) - { - assert( object != 0 ); - *(AllocatedType **)object = freeHead_; - freeHead_ = object; - } - -private: - struct BatchInfo - { - BatchInfo *next_; - AllocatedType *used_; - AllocatedType *end_; - AllocatedType buffer_[objectPerAllocation]; - }; - - // disabled copy constructor and assignment operator. - BatchAllocator( const BatchAllocator & ); - void operator =( const BatchAllocator &); - - static BatchInfo *allocateBatch( unsigned int objectsPerPage ) - { - const unsigned int mallocSize = sizeof(BatchInfo) - sizeof(AllocatedType)* objectPerAllocation - + sizeof(AllocatedType) * objectPerAllocation * objectsPerPage; - BatchInfo *batch = static_cast( malloc( mallocSize ) ); - batch->next_ = 0; - batch->used_ = batch->buffer_; - batch->end_ = batch->buffer_ + objectsPerPage; - return batch; - } - - BatchInfo *batches_; - BatchInfo *currentBatch_; - /// Head of a single linked list within the allocated space of freed object - AllocatedType *freeHead_; - unsigned int objectsPerPage_; -}; - - -} // namespace Json - -# endif // ifndef JSONCPP_DOC_INCLUDE_IMPLEMENTATION - -#endif // JSONCPP_BATCHALLOCATOR_H_INCLUDED - diff --git a/cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/public/json_internalarray.inl b/cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/public/json_internalarray.inl deleted file mode 100644 index 9b985d258..000000000 --- a/cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/public/json_internalarray.inl +++ /dev/null @@ -1,448 +0,0 @@ -// included by json_value.cpp -// everything is within Json namespace - -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// -// class ValueInternalArray -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// - -ValueArrayAllocator::~ValueArrayAllocator() -{ -} - -// ////////////////////////////////////////////////////////////////// -// class DefaultValueArrayAllocator -// ////////////////////////////////////////////////////////////////// -#ifdef JSON_USE_SIMPLE_INTERNAL_ALLOCATOR -class DefaultValueArrayAllocator : public ValueArrayAllocator -{ -public: // overridden from ValueArrayAllocator - virtual ~DefaultValueArrayAllocator() - { - } - - virtual ValueInternalArray *newArray() - { - return new ValueInternalArray(); - } - - virtual ValueInternalArray *newArrayCopy( const ValueInternalArray &other ) - { - return new ValueInternalArray( other ); - } - - virtual void destructArray( ValueInternalArray *array ) - { - delete array; - } - - virtual void reallocateArrayPageIndex( Value **&indexes, - ValueInternalArray::PageIndex &indexCount, - ValueInternalArray::PageIndex minNewIndexCount ) - { - ValueInternalArray::PageIndex newIndexCount = (indexCount*3)/2 + 1; - if ( minNewIndexCount > newIndexCount ) - newIndexCount = minNewIndexCount; - void *newIndexes = realloc( indexes, sizeof(Value*) * newIndexCount ); - if ( !newIndexes ) - throw std::bad_alloc(); - indexCount = newIndexCount; - indexes = static_cast( newIndexes ); - } - virtual void releaseArrayPageIndex( Value **indexes, - ValueInternalArray::PageIndex indexCount ) - { - if ( indexes ) - free( indexes ); - } - - virtual Value *allocateArrayPage() - { - return static_cast( malloc( sizeof(Value) * ValueInternalArray::itemsPerPage ) ); - } - - virtual void releaseArrayPage( Value *value ) - { - if ( value ) - free( value ); - } -}; - -#else // #ifdef JSON_USE_SIMPLE_INTERNAL_ALLOCATOR -/// @todo make this thread-safe (lock when accessign batch allocator) -class DefaultValueArrayAllocator : public ValueArrayAllocator -{ -public: // overridden from ValueArrayAllocator - virtual ~DefaultValueArrayAllocator() - { - } - - virtual ValueInternalArray *newArray() - { - ValueInternalArray *array = arraysAllocator_.allocate(); - new (array) ValueInternalArray(); // placement new - return array; - } - - virtual ValueInternalArray *newArrayCopy( const ValueInternalArray &other ) - { - ValueInternalArray *array = arraysAllocator_.allocate(); - new (array) ValueInternalArray( other ); // placement new - return array; - } - - virtual void destructArray( ValueInternalArray *array ) - { - if ( array ) - { - array->~ValueInternalArray(); - arraysAllocator_.release( array ); - } - } - - virtual void reallocateArrayPageIndex( Value **&indexes, - ValueInternalArray::PageIndex &indexCount, - ValueInternalArray::PageIndex minNewIndexCount ) - { - ValueInternalArray::PageIndex newIndexCount = (indexCount*3)/2 + 1; - if ( minNewIndexCount > newIndexCount ) - newIndexCount = minNewIndexCount; - void *newIndexes = realloc( indexes, sizeof(Value*) * newIndexCount ); - if ( !newIndexes ) - throw std::bad_alloc(); - indexCount = newIndexCount; - indexes = static_cast( newIndexes ); - } - virtual void releaseArrayPageIndex( Value **indexes, - ValueInternalArray::PageIndex indexCount ) - { - if ( indexes ) - free( indexes ); - } - - virtual Value *allocateArrayPage() - { - return static_cast( pagesAllocator_.allocate() ); - } - - virtual void releaseArrayPage( Value *value ) - { - if ( value ) - pagesAllocator_.release( value ); - } -private: - BatchAllocator arraysAllocator_; - BatchAllocator pagesAllocator_; -}; -#endif // #ifdef JSON_USE_SIMPLE_INTERNAL_ALLOCATOR - -static ValueArrayAllocator *&arrayAllocator() -{ - static DefaultValueArrayAllocator defaultAllocator; - static ValueArrayAllocator *arrayAllocator = &defaultAllocator; - return arrayAllocator; -} - -static struct DummyArrayAllocatorInitializer { - DummyArrayAllocatorInitializer() - { - arrayAllocator(); // ensure arrayAllocator() statics are initialized before main(). - } -} dummyArrayAllocatorInitializer; - -// ////////////////////////////////////////////////////////////////// -// class ValueInternalArray -// ////////////////////////////////////////////////////////////////// -bool -ValueInternalArray::equals( const IteratorState &x, - const IteratorState &other ) -{ - return x.array_ == other.array_ - && x.currentItemIndex_ == other.currentItemIndex_ - && x.currentPageIndex_ == other.currentPageIndex_; -} - - -void -ValueInternalArray::increment( IteratorState &it ) -{ - JSON_ASSERT_MESSAGE( it.array_ && - (it.currentPageIndex_ - it.array_->pages_)*itemsPerPage + it.currentItemIndex_ - != it.array_->size_, - "ValueInternalArray::increment(): moving iterator beyond end" ); - ++(it.currentItemIndex_); - if ( it.currentItemIndex_ == itemsPerPage ) - { - it.currentItemIndex_ = 0; - ++(it.currentPageIndex_); - } -} - - -void -ValueInternalArray::decrement( IteratorState &it ) -{ - JSON_ASSERT_MESSAGE( it.array_ && it.currentPageIndex_ == it.array_->pages_ - && it.currentItemIndex_ == 0, - "ValueInternalArray::decrement(): moving iterator beyond end" ); - if ( it.currentItemIndex_ == 0 ) - { - it.currentItemIndex_ = itemsPerPage-1; - --(it.currentPageIndex_); - } - else - { - --(it.currentItemIndex_); - } -} - - -Value & -ValueInternalArray::unsafeDereference( const IteratorState &it ) -{ - return (*(it.currentPageIndex_))[it.currentItemIndex_]; -} - - -Value & -ValueInternalArray::dereference( const IteratorState &it ) -{ - JSON_ASSERT_MESSAGE( it.array_ && - (it.currentPageIndex_ - it.array_->pages_)*itemsPerPage + it.currentItemIndex_ - < it.array_->size_, - "ValueInternalArray::dereference(): dereferencing invalid iterator" ); - return unsafeDereference( it ); -} - -void -ValueInternalArray::makeBeginIterator( IteratorState &it ) const -{ - it.array_ = const_cast( this ); - it.currentItemIndex_ = 0; - it.currentPageIndex_ = pages_; -} - - -void -ValueInternalArray::makeIterator( IteratorState &it, ArrayIndex index ) const -{ - it.array_ = const_cast( this ); - it.currentItemIndex_ = index % itemsPerPage; - it.currentPageIndex_ = pages_ + index / itemsPerPage; -} - - -void -ValueInternalArray::makeEndIterator( IteratorState &it ) const -{ - makeIterator( it, size_ ); -} - - -ValueInternalArray::ValueInternalArray() - : pages_( 0 ) - , size_( 0 ) - , pageCount_( 0 ) -{ -} - - -ValueInternalArray::ValueInternalArray( const ValueInternalArray &other ) - : pages_( 0 ) - , pageCount_( 0 ) - , size_( other.size_ ) -{ - PageIndex minNewPages = other.size_ / itemsPerPage; - arrayAllocator()->reallocateArrayPageIndex( pages_, pageCount_, minNewPages ); - JSON_ASSERT_MESSAGE( pageCount_ >= minNewPages, - "ValueInternalArray::reserve(): bad reallocation" ); - IteratorState itOther; - other.makeBeginIterator( itOther ); - Value *value; - for ( ArrayIndex index = 0; index < size_; ++index, increment(itOther) ) - { - if ( index % itemsPerPage == 0 ) - { - PageIndex pageIndex = index / itemsPerPage; - value = arrayAllocator()->allocateArrayPage(); - pages_[pageIndex] = value; - } - new (value) Value( dereference( itOther ) ); - } -} - - -ValueInternalArray & -ValueInternalArray::operator =( const ValueInternalArray &other ) -{ - ValueInternalArray temp( other ); - swap( temp ); - return *this; -} - - -ValueInternalArray::~ValueInternalArray() -{ - // destroy all constructed items - IteratorState it; - IteratorState itEnd; - makeBeginIterator( it); - makeEndIterator( itEnd ); - for ( ; !equals(it,itEnd); increment(it) ) - { - Value *value = &dereference(it); - value->~Value(); - } - // release all pages - PageIndex lastPageIndex = size_ / itemsPerPage; - for ( PageIndex pageIndex = 0; pageIndex < lastPageIndex; ++pageIndex ) - arrayAllocator()->releaseArrayPage( pages_[pageIndex] ); - // release pages index - arrayAllocator()->releaseArrayPageIndex( pages_, pageCount_ ); -} - - -void -ValueInternalArray::swap( ValueInternalArray &other ) -{ - Value **tempPages = pages_; - pages_ = other.pages_; - other.pages_ = tempPages; - ArrayIndex tempSize = size_; - size_ = other.size_; - other.size_ = tempSize; - PageIndex tempPageCount = pageCount_; - pageCount_ = other.pageCount_; - other.pageCount_ = tempPageCount; -} - -void -ValueInternalArray::clear() -{ - ValueInternalArray dummy; - swap( dummy ); -} - - -void -ValueInternalArray::resize( ArrayIndex newSize ) -{ - if ( newSize == 0 ) - clear(); - else if ( newSize < size_ ) - { - IteratorState it; - IteratorState itEnd; - makeIterator( it, newSize ); - makeIterator( itEnd, size_ ); - for ( ; !equals(it,itEnd); increment(it) ) - { - Value *value = &dereference(it); - value->~Value(); - } - PageIndex pageIndex = (newSize + itemsPerPage - 1) / itemsPerPage; - PageIndex lastPageIndex = size_ / itemsPerPage; - for ( ; pageIndex < lastPageIndex; ++pageIndex ) - arrayAllocator()->releaseArrayPage( pages_[pageIndex] ); - size_ = newSize; - } - else if ( newSize > size_ ) - resolveReference( newSize ); -} - - -void -ValueInternalArray::makeIndexValid( ArrayIndex index ) -{ - // Need to enlarge page index ? - if ( index >= pageCount_ * itemsPerPage ) - { - PageIndex minNewPages = (index + 1) / itemsPerPage; - arrayAllocator()->reallocateArrayPageIndex( pages_, pageCount_, minNewPages ); - JSON_ASSERT_MESSAGE( pageCount_ >= minNewPages, "ValueInternalArray::reserve(): bad reallocation" ); - } - - // Need to allocate new pages ? - ArrayIndex nextPageIndex = - (size_ % itemsPerPage) != 0 ? size_ - (size_%itemsPerPage) + itemsPerPage - : size_; - if ( nextPageIndex <= index ) - { - PageIndex pageIndex = nextPageIndex / itemsPerPage; - PageIndex pageToAllocate = (index - nextPageIndex) / itemsPerPage + 1; - for ( ; pageToAllocate-- > 0; ++pageIndex ) - pages_[pageIndex] = arrayAllocator()->allocateArrayPage(); - } - - // Initialize all new entries - IteratorState it; - IteratorState itEnd; - makeIterator( it, size_ ); - size_ = index + 1; - makeIterator( itEnd, size_ ); - for ( ; !equals(it,itEnd); increment(it) ) - { - Value *value = &dereference(it); - new (value) Value(); // Construct a default value using placement new - } -} - -Value & -ValueInternalArray::resolveReference( ArrayIndex index ) -{ - if ( index >= size_ ) - makeIndexValid( index ); - return pages_[index/itemsPerPage][index%itemsPerPage]; -} - -Value * -ValueInternalArray::find( ArrayIndex index ) const -{ - if ( index >= size_ ) - return 0; - return &(pages_[index/itemsPerPage][index%itemsPerPage]); -} - -ValueInternalArray::ArrayIndex -ValueInternalArray::size() const -{ - return size_; -} - -int -ValueInternalArray::distance( const IteratorState &x, const IteratorState &y ) -{ - return indexOf(y) - indexOf(x); -} - - -ValueInternalArray::ArrayIndex -ValueInternalArray::indexOf( const IteratorState &iterator ) -{ - if ( !iterator.array_ ) - return ArrayIndex(-1); - return ArrayIndex( - (iterator.currentPageIndex_ - iterator.array_->pages_) * itemsPerPage - + iterator.currentItemIndex_ ); -} - - -int -ValueInternalArray::compare( const ValueInternalArray &other ) const -{ - int sizeDiff( size_ - other.size_ ); - if ( sizeDiff != 0 ) - return sizeDiff; - - for ( ArrayIndex index =0; index < size_; ++index ) - { - int diff = pages_[index/itemsPerPage][index%itemsPerPage].compare( - other.pages_[index/itemsPerPage][index%itemsPerPage] ); - if ( diff != 0 ) - return diff; - } - return 0; -} diff --git a/cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/public/json_internalmap.inl b/cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/public/json_internalmap.inl deleted file mode 100644 index ef37991c8..000000000 --- a/cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/public/json_internalmap.inl +++ /dev/null @@ -1,607 +0,0 @@ -// included by json_value.cpp -// everything is within Json namespace - -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// -// class ValueInternalMap -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// - -/** \internal MUST be safely initialized using memset( this, 0, sizeof(ValueInternalLink) ); - * This optimization is used by the fast allocator. - */ -ValueInternalLink::ValueInternalLink() - : previous_( 0 ) - , next_( 0 ) -{ -} - -ValueInternalLink::~ValueInternalLink() -{ - for ( int index =0; index < itemPerLink; ++index ) - { - if ( !items_[index].isItemAvailable() ) - { - if ( !items_[index].isMemberNameStatic() ) - free( keys_[index] ); - } - else - break; - } -} - - - -ValueMapAllocator::~ValueMapAllocator() -{ -} - -#ifdef JSON_USE_SIMPLE_INTERNAL_ALLOCATOR -class DefaultValueMapAllocator : public ValueMapAllocator -{ -public: // overridden from ValueMapAllocator - virtual ValueInternalMap *newMap() - { - return new ValueInternalMap(); - } - - virtual ValueInternalMap *newMapCopy( const ValueInternalMap &other ) - { - return new ValueInternalMap( other ); - } - - virtual void destructMap( ValueInternalMap *map ) - { - delete map; - } - - virtual ValueInternalLink *allocateMapBuckets( unsigned int size ) - { - return new ValueInternalLink[size]; - } - - virtual void releaseMapBuckets( ValueInternalLink *links ) - { - delete [] links; - } - - virtual ValueInternalLink *allocateMapLink() - { - return new ValueInternalLink(); - } - - virtual void releaseMapLink( ValueInternalLink *link ) - { - delete link; - } -}; -#else -/// @todo make this thread-safe (lock when accessign batch allocator) -class DefaultValueMapAllocator : public ValueMapAllocator -{ -public: // overridden from ValueMapAllocator - virtual ValueInternalMap *newMap() - { - ValueInternalMap *map = mapsAllocator_.allocate(); - new (map) ValueInternalMap(); // placement new - return map; - } - - virtual ValueInternalMap *newMapCopy( const ValueInternalMap &other ) - { - ValueInternalMap *map = mapsAllocator_.allocate(); - new (map) ValueInternalMap( other ); // placement new - return map; - } - - virtual void destructMap( ValueInternalMap *map ) - { - if ( map ) - { - map->~ValueInternalMap(); - mapsAllocator_.release( map ); - } - } - - virtual ValueInternalLink *allocateMapBuckets( unsigned int size ) - { - return new ValueInternalLink[size]; - } - - virtual void releaseMapBuckets( ValueInternalLink *links ) - { - delete [] links; - } - - virtual ValueInternalLink *allocateMapLink() - { - ValueInternalLink *link = linksAllocator_.allocate(); - memset( link, 0, sizeof(ValueInternalLink) ); - return link; - } - - virtual void releaseMapLink( ValueInternalLink *link ) - { - link->~ValueInternalLink(); - linksAllocator_.release( link ); - } -private: - BatchAllocator mapsAllocator_; - BatchAllocator linksAllocator_; -}; -#endif - -static ValueMapAllocator *&mapAllocator() -{ - static DefaultValueMapAllocator defaultAllocator; - static ValueMapAllocator *mapAllocator = &defaultAllocator; - return mapAllocator; -} - -static struct DummyMapAllocatorInitializer { - DummyMapAllocatorInitializer() - { - mapAllocator(); // ensure mapAllocator() statics are initialized before main(). - } -} dummyMapAllocatorInitializer; - - - -// h(K) = value * K >> w ; with w = 32 & K prime w.r.t. 2^32. - -/* -use linked list hash map. -buckets array is a container. -linked list element contains 6 key/values. (memory = (16+4) * 6 + 4 = 124) -value have extra state: valid, available, deleted -*/ - - -ValueInternalMap::ValueInternalMap() - : buckets_( 0 ) - , tailLink_( 0 ) - , bucketsSize_( 0 ) - , itemCount_( 0 ) -{ -} - - -ValueInternalMap::ValueInternalMap( const ValueInternalMap &other ) - : buckets_( 0 ) - , tailLink_( 0 ) - , bucketsSize_( 0 ) - , itemCount_( 0 ) -{ - reserve( other.itemCount_ ); - IteratorState it; - IteratorState itEnd; - other.makeBeginIterator( it ); - other.makeEndIterator( itEnd ); - for ( ; !equals(it,itEnd); increment(it) ) - { - bool isStatic; - const char *memberName = key( it, isStatic ); - const Value &aValue = value( it ); - resolveReference(memberName, isStatic) = aValue; - } -} - - -ValueInternalMap & -ValueInternalMap::operator =( const ValueInternalMap &other ) -{ - ValueInternalMap dummy( other ); - swap( dummy ); - return *this; -} - - -ValueInternalMap::~ValueInternalMap() -{ - if ( buckets_ ) - { - for ( BucketIndex bucketIndex =0; bucketIndex < bucketsSize_; ++bucketIndex ) - { - ValueInternalLink *link = buckets_[bucketIndex].next_; - while ( link ) - { - ValueInternalLink *linkToRelease = link; - link = link->next_; - mapAllocator()->releaseMapLink( linkToRelease ); - } - } - mapAllocator()->releaseMapBuckets( buckets_ ); - } -} - - -void -ValueInternalMap::swap( ValueInternalMap &other ) -{ - ValueInternalLink *tempBuckets = buckets_; - buckets_ = other.buckets_; - other.buckets_ = tempBuckets; - ValueInternalLink *tempTailLink = tailLink_; - tailLink_ = other.tailLink_; - other.tailLink_ = tempTailLink; - BucketIndex tempBucketsSize = bucketsSize_; - bucketsSize_ = other.bucketsSize_; - other.bucketsSize_ = tempBucketsSize; - BucketIndex tempItemCount = itemCount_; - itemCount_ = other.itemCount_; - other.itemCount_ = tempItemCount; -} - - -void -ValueInternalMap::clear() -{ - ValueInternalMap dummy; - swap( dummy ); -} - - -ValueInternalMap::BucketIndex -ValueInternalMap::size() const -{ - return itemCount_; -} - -bool -ValueInternalMap::reserveDelta( BucketIndex growth ) -{ - return reserve( itemCount_ + growth ); -} - -bool -ValueInternalMap::reserve( BucketIndex newItemCount ) -{ - if ( !buckets_ && newItemCount > 0 ) - { - buckets_ = mapAllocator()->allocateMapBuckets( 1 ); - bucketsSize_ = 1; - tailLink_ = &buckets_[0]; - } -// BucketIndex idealBucketCount = (newItemCount + ValueInternalLink::itemPerLink) / ValueInternalLink::itemPerLink; - return true; -} - - -const Value * -ValueInternalMap::find( const char *key ) const -{ - if ( !bucketsSize_ ) - return 0; - HashKey hashedKey = hash( key ); - BucketIndex bucketIndex = hashedKey % bucketsSize_; - for ( const ValueInternalLink *current = &buckets_[bucketIndex]; - current != 0; - current = current->next_ ) - { - for ( BucketIndex index=0; index < ValueInternalLink::itemPerLink; ++index ) - { - if ( current->items_[index].isItemAvailable() ) - return 0; - if ( strcmp( key, current->keys_[index] ) == 0 ) - return ¤t->items_[index]; - } - } - return 0; -} - - -Value * -ValueInternalMap::find( const char *key ) -{ - const ValueInternalMap *constThis = this; - return const_cast( constThis->find( key ) ); -} - - -Value & -ValueInternalMap::resolveReference( const char *key, - bool isStatic ) -{ - HashKey hashedKey = hash( key ); - if ( bucketsSize_ ) - { - BucketIndex bucketIndex = hashedKey % bucketsSize_; - ValueInternalLink **previous = 0; - BucketIndex index; - for ( ValueInternalLink *current = &buckets_[bucketIndex]; - current != 0; - previous = ¤t->next_, current = current->next_ ) - { - for ( index=0; index < ValueInternalLink::itemPerLink; ++index ) - { - if ( current->items_[index].isItemAvailable() ) - return setNewItem( key, isStatic, current, index ); - if ( strcmp( key, current->keys_[index] ) == 0 ) - return current->items_[index]; - } - } - } - - reserveDelta( 1 ); - return unsafeAdd( key, isStatic, hashedKey ); -} - - -void -ValueInternalMap::remove( const char *key ) -{ - HashKey hashedKey = hash( key ); - if ( !bucketsSize_ ) - return; - BucketIndex bucketIndex = hashedKey % bucketsSize_; - for ( ValueInternalLink *link = &buckets_[bucketIndex]; - link != 0; - link = link->next_ ) - { - BucketIndex index; - for ( index =0; index < ValueInternalLink::itemPerLink; ++index ) - { - if ( link->items_[index].isItemAvailable() ) - return; - if ( strcmp( key, link->keys_[index] ) == 0 ) - { - doActualRemove( link, index, bucketIndex ); - return; - } - } - } -} - -void -ValueInternalMap::doActualRemove( ValueInternalLink *link, - BucketIndex index, - BucketIndex bucketIndex ) -{ - // find last item of the bucket and swap it with the 'removed' one. - // set removed items flags to 'available'. - // if last page only contains 'available' items, then deallocate it (it's empty) - ValueInternalLink *&lastLink = getLastLinkInBucket( index ); - BucketIndex lastItemIndex = 1; // a link can never be empty, so start at 1 - for ( ; - lastItemIndex < ValueInternalLink::itemPerLink; - ++lastItemIndex ) // may be optimized with dicotomic search - { - if ( lastLink->items_[lastItemIndex].isItemAvailable() ) - break; - } - - BucketIndex lastUsedIndex = lastItemIndex - 1; - Value *valueToDelete = &link->items_[index]; - Value *valueToPreserve = &lastLink->items_[lastUsedIndex]; - if ( valueToDelete != valueToPreserve ) - valueToDelete->swap( *valueToPreserve ); - if ( lastUsedIndex == 0 ) // page is now empty - { // remove it from bucket linked list and delete it. - ValueInternalLink *linkPreviousToLast = lastLink->previous_; - if ( linkPreviousToLast != 0 ) // can not deleted bucket link. - { - mapAllocator()->releaseMapLink( lastLink ); - linkPreviousToLast->next_ = 0; - lastLink = linkPreviousToLast; - } - } - else - { - Value dummy; - valueToPreserve->swap( dummy ); // restore deleted to default Value. - valueToPreserve->setItemUsed( false ); - } - --itemCount_; -} - - -ValueInternalLink *& -ValueInternalMap::getLastLinkInBucket( BucketIndex bucketIndex ) -{ - if ( bucketIndex == bucketsSize_ - 1 ) - return tailLink_; - ValueInternalLink *&previous = buckets_[bucketIndex+1].previous_; - if ( !previous ) - previous = &buckets_[bucketIndex]; - return previous; -} - - -Value & -ValueInternalMap::setNewItem( const char *key, - bool isStatic, - ValueInternalLink *link, - BucketIndex index ) -{ - char *duplicatedKey = valueAllocator()->makeMemberName( key ); - ++itemCount_; - link->keys_[index] = duplicatedKey; - link->items_[index].setItemUsed(); - link->items_[index].setMemberNameIsStatic( isStatic ); - return link->items_[index]; // items already default constructed. -} - - -Value & -ValueInternalMap::unsafeAdd( const char *key, - bool isStatic, - HashKey hashedKey ) -{ - JSON_ASSERT_MESSAGE( bucketsSize_ > 0, "ValueInternalMap::unsafeAdd(): internal logic error." ); - BucketIndex bucketIndex = hashedKey % bucketsSize_; - ValueInternalLink *&previousLink = getLastLinkInBucket( bucketIndex ); - ValueInternalLink *link = previousLink; - BucketIndex index; - for ( index =0; index < ValueInternalLink::itemPerLink; ++index ) - { - if ( link->items_[index].isItemAvailable() ) - break; - } - if ( index == ValueInternalLink::itemPerLink ) // need to add a new page - { - ValueInternalLink *newLink = mapAllocator()->allocateMapLink(); - index = 0; - link->next_ = newLink; - previousLink = newLink; - link = newLink; - } - return setNewItem( key, isStatic, link, index ); -} - - -ValueInternalMap::HashKey -ValueInternalMap::hash( const char *key ) const -{ - HashKey hash = 0; - while ( *key ) - hash += *key++ * 37; - return hash; -} - - -int -ValueInternalMap::compare( const ValueInternalMap &other ) const -{ - int sizeDiff( itemCount_ - other.itemCount_ ); - if ( sizeDiff != 0 ) - return sizeDiff; - // Strict order guaranty is required. Compare all keys FIRST, then compare values. - IteratorState it; - IteratorState itEnd; - makeBeginIterator( it ); - makeEndIterator( itEnd ); - for ( ; !equals(it,itEnd); increment(it) ) - { - if ( !other.find( key( it ) ) ) - return 1; - } - - // All keys are equals, let's compare values - makeBeginIterator( it ); - for ( ; !equals(it,itEnd); increment(it) ) - { - const Value *otherValue = other.find( key( it ) ); - int valueDiff = value(it).compare( *otherValue ); - if ( valueDiff != 0 ) - return valueDiff; - } - return 0; -} - - -void -ValueInternalMap::makeBeginIterator( IteratorState &it ) const -{ - it.map_ = const_cast( this ); - it.bucketIndex_ = 0; - it.itemIndex_ = 0; - it.link_ = buckets_; -} - - -void -ValueInternalMap::makeEndIterator( IteratorState &it ) const -{ - it.map_ = const_cast( this ); - it.bucketIndex_ = bucketsSize_; - it.itemIndex_ = 0; - it.link_ = 0; -} - - -bool -ValueInternalMap::equals( const IteratorState &x, const IteratorState &other ) -{ - return x.map_ == other.map_ - && x.bucketIndex_ == other.bucketIndex_ - && x.link_ == other.link_ - && x.itemIndex_ == other.itemIndex_; -} - - -void -ValueInternalMap::incrementBucket( IteratorState &iterator ) -{ - ++iterator.bucketIndex_; - JSON_ASSERT_MESSAGE( iterator.bucketIndex_ <= iterator.map_->bucketsSize_, - "ValueInternalMap::increment(): attempting to iterate beyond end." ); - if ( iterator.bucketIndex_ == iterator.map_->bucketsSize_ ) - iterator.link_ = 0; - else - iterator.link_ = &(iterator.map_->buckets_[iterator.bucketIndex_]); - iterator.itemIndex_ = 0; -} - - -void -ValueInternalMap::increment( IteratorState &iterator ) -{ - JSON_ASSERT_MESSAGE( iterator.map_, "Attempting to iterator using invalid iterator." ); - ++iterator.itemIndex_; - if ( iterator.itemIndex_ == ValueInternalLink::itemPerLink ) - { - JSON_ASSERT_MESSAGE( iterator.link_ != 0, - "ValueInternalMap::increment(): attempting to iterate beyond end." ); - iterator.link_ = iterator.link_->next_; - if ( iterator.link_ == 0 ) - incrementBucket( iterator ); - } - else if ( iterator.link_->items_[iterator.itemIndex_].isItemAvailable() ) - { - incrementBucket( iterator ); - } -} - - -void -ValueInternalMap::decrement( IteratorState &iterator ) -{ - if ( iterator.itemIndex_ == 0 ) - { - JSON_ASSERT_MESSAGE( iterator.map_, "Attempting to iterate using invalid iterator." ); - if ( iterator.link_ == &iterator.map_->buckets_[iterator.bucketIndex_] ) - { - JSON_ASSERT_MESSAGE( iterator.bucketIndex_ > 0, "Attempting to iterate beyond beginning." ); - --(iterator.bucketIndex_); - } - iterator.link_ = iterator.link_->previous_; - iterator.itemIndex_ = ValueInternalLink::itemPerLink - 1; - } -} - - -const char * -ValueInternalMap::key( const IteratorState &iterator ) -{ - JSON_ASSERT_MESSAGE( iterator.link_, "Attempting to iterate using invalid iterator." ); - return iterator.link_->keys_[iterator.itemIndex_]; -} - -const char * -ValueInternalMap::key( const IteratorState &iterator, bool &isStatic ) -{ - JSON_ASSERT_MESSAGE( iterator.link_, "Attempting to iterate using invalid iterator." ); - isStatic = iterator.link_->items_[iterator.itemIndex_].isMemberNameStatic(); - return iterator.link_->keys_[iterator.itemIndex_]; -} - - -Value & -ValueInternalMap::value( const IteratorState &iterator ) -{ - JSON_ASSERT_MESSAGE( iterator.link_, "Attempting to iterate using invalid iterator." ); - return iterator.link_->items_[iterator.itemIndex_]; -} - - -int -ValueInternalMap::distance( const IteratorState &x, const IteratorState &y ) -{ - int offset = 0; - IteratorState it = x; - while ( !equals( it, y ) ) - increment( it ); - return offset; -} diff --git a/cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/public/json_reader.cpp b/cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/public/json_reader.cpp deleted file mode 100644 index 750088c65..000000000 --- a/cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/public/json_reader.cpp +++ /dev/null @@ -1,894 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include - -#if _MSC_VER >= 1400 // VC++ 8.0 -#pragma warning( disable : 4996 ) // disable warning about strdup being deprecated. -#endif - -namespace Json { - -// QNX is strict about declaring C symbols in the std namespace. -#ifdef __QNXNTO__ -using std::memcpy; -using std::sprintf; -using std::sscanf; -#endif - -// Implementation of class Features -// //////////////////////////////// - -Features::Features() - : allowComments_( true ) - , strictRoot_( false ) -{ -} - - -Features -Features::all() -{ - return Features(); -} - - -Features -Features::strictMode() -{ - Features features; - features.allowComments_ = false; - features.strictRoot_ = true; - return features; -} - -// Implementation of class Reader -// //////////////////////////////// - - -static inline bool -in( Reader::Char c, Reader::Char c1, Reader::Char c2, Reader::Char c3, Reader::Char c4 ) -{ - return c == c1 || c == c2 || c == c3 || c == c4; -} - -static inline bool -in( Reader::Char c, Reader::Char c1, Reader::Char c2, Reader::Char c3, Reader::Char c4, Reader::Char c5 ) -{ - return c == c1 || c == c2 || c == c3 || c == c4 || c == c5; -} - - -static bool -containsNewLine( Reader::Location begin, - Reader::Location end ) -{ - for ( ;begin < end; ++begin ) - if ( *begin == '\n' || *begin == '\r' ) - return true; - return false; -} - -static std::string codePointToUTF8(unsigned int cp) -{ - std::string result; - - // based on description from http://en.wikipedia.org/wiki/UTF-8 - - if (cp <= 0x7f) - { - result.resize(1); - result[0] = static_cast(cp); - } - else if (cp <= 0x7FF) - { - result.resize(2); - result[1] = static_cast(0x80 | (0x3f & cp)); - result[0] = static_cast(0xC0 | (0x1f & (cp >> 6))); - } - else if (cp <= 0xFFFF) - { - result.resize(3); - result[2] = static_cast(0x80 | (0x3f & cp)); - result[1] = 0x80 | static_cast((0x3f & (cp >> 6))); - result[0] = 0xE0 | static_cast((0xf & (cp >> 12))); - } - else if (cp <= 0x10FFFF) - { - result.resize(4); - result[3] = static_cast(0x80 | (0x3f & cp)); - result[2] = static_cast(0x80 | (0x3f & (cp >> 6))); - result[1] = static_cast(0x80 | (0x3f & (cp >> 12))); - result[0] = static_cast(0xF0 | (0x7 & (cp >> 18))); - } - - return result; -} - - -// Class Reader -// ////////////////////////////////////////////////////////////////// - -Reader::Reader() - : features_( Features::all() ) -{ -} - - -Reader::Reader( const Features &features ) - : features_( features ) -{ -} - - -bool -Reader::parse( const std::string &document, - Value &root, - bool collectComments ) -{ - document_ = document; - const char *begin = document_.c_str(); - const char *end = begin + document_.length(); - return parse( begin, end, root, collectComments ); -} - - -bool -Reader::parse( std::istream& sin, - Value &root, - bool collectComments ) -{ - //std::istream_iterator begin(sin); - //std::istream_iterator end; - // Those would allow streamed input from a file, if parse() were a - // template function. - - // Since std::string is reference-counted, this at least does not - // create an extra copy. - std::string doc; - std::getline(sin, doc, (char)EOF); - return parse( doc, root, collectComments ); -} - -bool -Reader::parse( const char *beginDoc, const char *endDoc, - Value &root, - bool collectComments ) -{ - if ( !features_.allowComments_ ) - { - collectComments = false; - } - - begin_ = beginDoc; - end_ = endDoc; - collectComments_ = collectComments; - current_ = begin_; - lastValueEnd_ = 0; - lastValue_ = 0; - commentsBefore_ = ""; - errors_.clear(); - while ( !nodes_.empty() ) - nodes_.pop(); - nodes_.push( &root ); - - bool successful = readValue(); - Token token; - skipCommentTokens( token ); - if ( collectComments_ && !commentsBefore_.empty() ) - root.setComment( commentsBefore_, commentAfter ); - if ( features_.strictRoot_ ) - { - if ( !root.isArray() && !root.isObject() ) - { - // Set error location to start of doc, ideally should be first token found in doc - token.type_ = tokenError; - token.start_ = beginDoc; - token.end_ = endDoc; - addError( "A valid JSON document must be either an array or an object value.", - token ); - return false; - } - } - return successful; -} - - -bool -Reader::readValue() -{ - Token token; - skipCommentTokens( token ); - bool successful = true; - - if ( collectComments_ && !commentsBefore_.empty() ) - { - currentValue().setComment( commentsBefore_, commentBefore ); - commentsBefore_ = ""; - } - - - switch ( token.type_ ) - { - case tokenObjectBegin: - successful = readObject( token ); - break; - case tokenArrayBegin: - successful = readArray( token ); - break; - case tokenNumber: - successful = decodeNumber( token ); - break; - case tokenString: - successful = decodeString( token ); - break; - case tokenTrue: - currentValue() = true; - break; - case tokenFalse: - currentValue() = false; - break; - case tokenNull: - currentValue() = Value(); - break; - default: - return addError( "Syntax error: value, object or array expected.", token ); - } - - if ( collectComments_ ) - { - lastValueEnd_ = current_; - lastValue_ = ¤tValue(); - } - - return successful; -} - - -void -Reader::skipCommentTokens( Token &token ) -{ - if ( features_.allowComments_ ) - { - do - { - readToken( token ); - } - while ( token.type_ == tokenComment ); - } - else - { - readToken( token ); - } -} - - -bool -Reader::expectToken( TokenType type, Token &token, const char *message ) -{ - readToken( token ); - if ( token.type_ != type ) - return addError( message, token ); - return true; -} - - -bool -Reader::readToken( Token &token ) -{ - skipSpaces(); - token.start_ = current_; - Char c = getNextChar(); - bool ok = true; - switch ( c ) - { - case '{': - token.type_ = tokenObjectBegin; - break; - case '}': - token.type_ = tokenObjectEnd; - break; - case '[': - token.type_ = tokenArrayBegin; - break; - case ']': - token.type_ = tokenArrayEnd; - break; - case '"': - token.type_ = tokenString; - ok = readString(); - break; - case '/': - token.type_ = tokenComment; - ok = readComment(); - break; - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - case '-': - token.type_ = tokenNumber; - readNumber(); - break; - case 't': - token.type_ = tokenTrue; - ok = match( "rue", 3 ); - break; - case 'f': - token.type_ = tokenFalse; - ok = match( "alse", 4 ); - break; - case 'n': - token.type_ = tokenNull; - ok = match( "ull", 3 ); - break; - case ',': - token.type_ = tokenArraySeparator; - break; - case ':': - token.type_ = tokenMemberSeparator; - break; - case 0: - token.type_ = tokenEndOfStream; - break; - default: - ok = false; - break; - } - if ( !ok ) - token.type_ = tokenError; - token.end_ = current_; - return true; -} - - -void -Reader::skipSpaces() -{ - while ( current_ != end_ ) - { - Char c = *current_; - if ( c == ' ' || c == '\t' || c == '\r' || c == '\n' ) - ++current_; - else - break; - } -} - - -bool -Reader::match( Location pattern, - int patternLength ) -{ - if ( end_ - current_ < patternLength ) - return false; - int index = patternLength; - while ( index-- ) - if ( current_[index] != pattern[index] ) - return false; - current_ += patternLength; - return true; -} - - -bool -Reader::readComment() -{ - Location commentBegin = current_ - 1; - Char c = getNextChar(); - bool successful = false; - if ( c == '*' ) - successful = readCStyleComment(); - else if ( c == '/' ) - successful = readCppStyleComment(); - if ( !successful ) - return false; - - if ( collectComments_ ) - { - CommentPlacement placement = commentBefore; - if ( lastValueEnd_ && !containsNewLine( lastValueEnd_, commentBegin ) ) - { - if ( c != '*' || !containsNewLine( commentBegin, current_ ) ) - placement = commentAfterOnSameLine; - } - - addComment( commentBegin, current_, placement ); - } - return true; -} - - -void -Reader::addComment( Location begin, - Location end, - CommentPlacement placement ) -{ - assert( collectComments_ ); - if ( placement == commentAfterOnSameLine ) - { - assert( lastValue_ != 0 ); - lastValue_->setComment( std::string( begin, end ), placement ); - } - else - { - if ( !commentsBefore_.empty() ) - commentsBefore_ += "\n"; - commentsBefore_ += std::string( begin, end ); - } -} - - -bool -Reader::readCStyleComment() -{ - while ( current_ != end_ ) - { - Char c = getNextChar(); - if ( c == '*' && *current_ == '/' ) - break; - } - return getNextChar() == '/'; -} - - -bool -Reader::readCppStyleComment() -{ - while ( current_ != end_ ) - { - Char c = getNextChar(); - if ( c == '\r' || c == '\n' ) - break; - } - return true; -} - - -void -Reader::readNumber() -{ - while ( current_ != end_ ) - { - if ( !(*current_ >= '0' && *current_ <= '9') && - !in( *current_, '.', 'e', 'E', '+', '-' ) ) - break; - ++current_; - } -} - -bool -Reader::readString() -{ - Char c = 0; - while ( current_ != end_ ) - { - c = getNextChar(); - if ( c == '\\' ) - getNextChar(); - else if ( c == '"' ) - break; - } - return c == '"'; -} - - -bool -Reader::readObject( Token &tokenStart ) -{ - Token tokenName; - Token something = tokenStart; - std::string name; - currentValue() = Value( objectValue ); - while ( readToken( tokenName ) ) - { - bool initialTokenOk = true; - while ( tokenName.type_ == tokenComment && initialTokenOk ) - initialTokenOk = readToken( tokenName ); - if ( !initialTokenOk ) - break; - if ( tokenName.type_ == tokenObjectEnd && name.empty() ) // empty object - return true; - if ( tokenName.type_ != tokenString ) - break; - - name = ""; - if ( !decodeString( tokenName, name ) ) - return recoverFromError( tokenObjectEnd ); - - Token colon; - if ( !readToken( colon ) || colon.type_ != tokenMemberSeparator ) - { - return addErrorAndRecover( "Missing ':' after object member name", - colon, - tokenObjectEnd ); - } - Value &value = currentValue()[ name ]; - nodes_.push( &value ); - bool ok = readValue(); - nodes_.pop(); - if ( !ok ) // error already set - return recoverFromError( tokenObjectEnd ); - - Token comma; - if ( !readToken( comma ) - || ( comma.type_ != tokenObjectEnd && - comma.type_ != tokenArraySeparator && - comma.type_ != tokenComment ) ) - { - return addErrorAndRecover( "Missing ',' or '}' in object declaration", - comma, - tokenObjectEnd ); - } - bool finalizeTokenOk = true; - while ( comma.type_ == tokenComment && - finalizeTokenOk ) - finalizeTokenOk = readToken( comma ); - if ( comma.type_ == tokenObjectEnd ) - return true; - } - return addErrorAndRecover( "Missing '}' or object member name", - tokenName, - tokenObjectEnd ); -} - - -bool -Reader::readArray( Token &tokenStart ) -{ - Token something = tokenStart; - currentValue() = Value( arrayValue ); - skipSpaces(); - if ( *current_ == ']' ) // empty array - { - Token endArray; - readToken( endArray ); - return true; - } - int index = 0; - while ( true ) - { - Value &value = currentValue()[ index++ ]; - nodes_.push( &value ); - bool ok = readValue(); - nodes_.pop(); - if ( !ok ) // error already set - return recoverFromError( tokenArrayEnd ); - - Token token; - // Accept Comment after last item in the array. - ok = readToken( token ); - while ( token.type_ == tokenComment && ok ) - { - ok = readToken( token ); - } - bool badTokenType = ( token.type_ == tokenArraySeparator && - token.type_ == tokenArrayEnd ); - if ( !ok || badTokenType ) - { - return addErrorAndRecover( "Missing ',' or ']' in array declaration", - token, - tokenArrayEnd ); - } - if ( token.type_ == tokenArrayEnd ) - break; - } - return true; -} - - -bool -Reader::decodeNumber( Token &token ) -{ - bool isDouble = false; - for ( Location inspect = token.start_; inspect != token.end_; ++inspect ) - { - isDouble = isDouble - || in( *inspect, '.', 'e', 'E', '+' ) - || ( *inspect == '-' && inspect != token.start_ ); - } - if ( isDouble ) - return decodeDouble( token ); - Location current = token.start_; - bool isNegative = *current == '-'; - if ( isNegative ) - ++current; - Value::UInt threshold = (isNegative ? Value::UInt(-Value::minInt) - : Value::maxUInt) / 10; - Value::UInt value = 0; - while ( current < token.end_ ) - { - Char c = *current++; - if ( c < '0' || c > '9' ) - return addError( "'" + std::string( token.start_, token.end_ ) + "' is not a number.", token ); - if ( value >= threshold ) - return decodeDouble( token ); - value = value * 10 + Value::UInt(c - '0'); - } - if ( isNegative ) - currentValue() = -Value::Int( value ); - else if ( value <= Value::UInt(Value::maxInt) ) - currentValue() = Value::Int( value ); - else - currentValue() = value; - return true; -} - - -bool -Reader::decodeDouble( Token &token ) -{ - double value = 0; - const int bufferSize = 32; - int count; - int length = int(token.end_ - token.start_); - if ( length <= bufferSize ) - { - Char buffer[bufferSize]; - memcpy( buffer, token.start_, length ); - buffer[length] = 0; - count = sscanf( buffer, "%lf", &value ); - } - else - { - std::string buffer( token.start_, token.end_ ); - count = sscanf( buffer.c_str(), "%lf", &value ); - } - - if ( count != 1 ) - return addError( "'" + std::string( token.start_, token.end_ ) + "' is not a number.", token ); - currentValue() = value; - return true; -} - - -bool -Reader::decodeString( Token &token ) -{ - std::string decoded; - if ( !decodeString( token, decoded ) ) - return false; - currentValue() = decoded; - return true; -} - - -bool -Reader::decodeString( Token &token, std::string &decoded ) -{ - decoded.reserve( token.end_ - token.start_ - 2 ); - Location current = token.start_ + 1; // skip '"' - Location end = token.end_ - 1; // do not include '"' - while ( current != end ) - { - Char c = *current++; - if ( c == '"' ) - break; - else if ( c == '\\' ) - { - if ( current == end ) - return addError( "Empty escape sequence in string", token, current ); - Char escape = *current++; - switch ( escape ) - { - case '"': decoded += '"'; break; - case '/': decoded += '/'; break; - case '\\': decoded += '\\'; break; - case 'b': decoded += '\b'; break; - case 'f': decoded += '\f'; break; - case 'n': decoded += '\n'; break; - case 'r': decoded += '\r'; break; - case 't': decoded += '\t'; break; - case 'u': - { - unsigned int unicode; - if ( !decodeUnicodeCodePoint( token, current, end, unicode ) ) - return false; - decoded += codePointToUTF8(unicode); - } - break; - default: - return addError( "Bad escape sequence in string", token, current ); - } - } - else - { - decoded += c; - } - } - return true; -} - -bool -Reader::decodeUnicodeCodePoint( Token &token, - Location ¤t, - Location end, - unsigned int &unicode ) -{ - - if ( !decodeUnicodeEscapeSequence( token, current, end, unicode ) ) - return false; - if (unicode >= 0xD800 && unicode <= 0xDBFF) - { - // surrogate pairs - if (end - current < 6) - return addError( "additional six characters expected to parse unicode surrogate pair.", token, current ); - unsigned int surrogatePair; - if (*(current++) == '\\' && *(current++)== 'u') - { - if (decodeUnicodeEscapeSequence( token, current, end, surrogatePair )) - { - unicode = 0x10000 + ((unicode & 0x3FF) << 10) + (surrogatePair & 0x3FF); - } - else - return false; - } - else - return addError( "expecting another \\u token to begin the second half of a unicode surrogate pair", token, current ); - } - return true; -} - -bool -Reader::decodeUnicodeEscapeSequence( Token &token, - Location ¤t, - Location end, - unsigned int &unicode ) -{ - if ( end - current < 4 ) - return addError( "Bad unicode escape sequence in string: four digits expected.", token, current ); - unicode = 0; - for ( int index =0; index < 4; ++index ) - { - Char c = *current++; - unicode *= 16; - if ( c >= '0' && c <= '9' ) - unicode += c - '0'; - else if ( c >= 'a' && c <= 'f' ) - unicode += c - 'a' + 10; - else if ( c >= 'A' && c <= 'F' ) - unicode += c - 'A' + 10; - else - return addError( "Bad unicode escape sequence in string: hexadecimal digit expected.", token, current ); - } - return true; -} - - -bool -Reader::addError( const std::string &message, - Token &token, - Location extra ) -{ - ErrorInfo info; - info.token_ = token; - info.message_ = message; - info.extra_ = extra; - errors_.push_back( info ); - return false; -} - - -bool -Reader::recoverFromError( TokenType skipUntilToken ) -{ - int errorCount = int(errors_.size()); - Token skip; - while ( true ) - { - if ( !readToken(skip) ) - errors_.resize( errorCount ); // discard errors caused by recovery - if ( skip.type_ == skipUntilToken || skip.type_ == tokenEndOfStream ) - break; - } - errors_.resize( errorCount ); - return false; -} - - -bool -Reader::addErrorAndRecover( const std::string &message, - Token &token, - TokenType skipUntilToken ) -{ - addError( message, token ); - return recoverFromError( skipUntilToken ); -} - - -Value & -Reader::currentValue() -{ - return *(nodes_.top()); -} - - -Reader::Char -Reader::getNextChar() -{ - if ( current_ == end_ ) - return 0; - return *current_++; -} - - -void -Reader::getLocationLineAndColumn( Location location, - int &line, - int &column ) const -{ - Location current = begin_; - Location lastLineStart = current; - line = 0; - while ( current < location && current != end_ ) - { - Char c = *current++; - if ( c == '\r' ) - { - if ( *current == '\n' ) - ++current; - lastLineStart = current; - ++line; - } - else if ( c == '\n' ) - { - lastLineStart = current; - ++line; - } - } - // column & line start at 1 - column = int(location - lastLineStart) + 1; - ++line; -} - - -std::string -Reader::getLocationLineAndColumn( Location location ) const -{ - int line, column; - getLocationLineAndColumn( location, line, column ); - char buffer[18+16+16+1]; - sprintf( buffer, "Line %d, Column %d", line, column ); - return buffer; -} - - -std::string -Reader::getFormatedErrorMessages() const -{ - std::string formattedMessage; - for ( Errors::const_iterator itError = errors_.begin(); - itError != errors_.end(); - ++itError ) - { - const ErrorInfo &error = *itError; - formattedMessage += "* " + getLocationLineAndColumn( error.token_.start_ ) + "\n"; - formattedMessage += " " + error.message_ + "\n"; - if ( error.extra_ ) - formattedMessage += "See " + getLocationLineAndColumn( error.extra_ ) + " for detail.\n"; - } - return formattedMessage; -} - - -std::istream& operator>>( std::istream &sin, Value &root ) -{ - Json::Reader reader; - bool ok = reader.parse(sin, root, true); - //JSON_ASSERT( ok ); - if (!ok) throw std::runtime_error(reader.getFormatedErrorMessages()); - return sin; -} - - -} // namespace Json diff --git a/cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/public/json_value.cpp b/cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/public/json_value.cpp deleted file mode 100644 index 67638ca15..000000000 --- a/cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/public/json_value.cpp +++ /dev/null @@ -1,1726 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#ifdef JSON_USE_CPPTL -# include -#endif -#include // size_t -#ifndef JSON_USE_SIMPLE_INTERNAL_ALLOCATOR -# include "json_batchallocator.h" -#endif // #ifndef JSON_USE_SIMPLE_INTERNAL_ALLOCATOR - -#define JSON_ASSERT_UNREACHABLE assert( false ) -#define JSON_ASSERT( condition ) assert( condition ); // @todo <= change this into an exception throw -#define JSON_ASSERT_MESSAGE( condition, message ) if (!( condition )) throw std::runtime_error( message ); - -namespace Json { - -// QNX is strict about declaring C symbols in the std namespace. -#ifdef __QNXNTO__ -using std::memcpy; -using std::strchr; -using std::strcmp; -using std::strlen; -#endif - -const Value Value::null; -const Int Value::minInt = Int( ~(UInt(-1)/2) ); -const Int Value::maxInt = Int( UInt(-1)/2 ); -const UInt Value::maxUInt = UInt(-1); - -// A "safe" implementation of strdup. Allow null pointer to be passed. -// Also avoid warning on msvc80. -// -//inline char *safeStringDup( const char *czstring ) -//{ -// if ( czstring ) -// { -// const size_t length = (unsigned int)( strlen(czstring) + 1 ); -// char *newString = static_cast( malloc( length ) ); -// memcpy( newString, czstring, length ); -// return newString; -// } -// return 0; -//} -// -//inline char *safeStringDup( const std::string &str ) -//{ -// if ( !str.empty() ) -// { -// const size_t length = str.length(); -// char *newString = static_cast( malloc( length + 1 ) ); -// memcpy( newString, str.c_str(), length ); -// newString[length] = 0; -// return newString; -// } -// return 0; -//} - -ValueAllocator::~ValueAllocator() -{ -} - -class DefaultValueAllocator : public ValueAllocator -{ -public: - virtual ~DefaultValueAllocator() - { - } - - virtual char *makeMemberName( const char *memberName ) - { - return duplicateStringValue( memberName ); - } - - virtual void releaseMemberName( char *memberName ) - { - releaseStringValue( memberName ); - } - - virtual char *duplicateStringValue( const char *value, - unsigned int length = unknown ) - { - //@todo investigate this old optimization - //if ( !value || value[0] == 0 ) - // return 0; - - if ( length == unknown ) - length = (unsigned int)strlen(value); - char *newString = static_cast( malloc( length + 1 ) ); - memcpy( newString, value, length ); - newString[length] = 0; - return newString; - } - - virtual void releaseStringValue( char *value ) - { - if ( value ) - free( value ); - } -}; - -static ValueAllocator *&valueAllocator() -{ - static DefaultValueAllocator defaultAllocator; - static ValueAllocator *valueAllocator = &defaultAllocator; - return valueAllocator; -} - -static struct DummyValueAllocatorInitializer { - DummyValueAllocatorInitializer() - { - valueAllocator(); // ensure valueAllocator() statics are initialized before main(). - } -} dummyValueAllocatorInitializer; - - - -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// -// ValueInternals... -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// -#ifdef JSON_VALUE_USE_INTERNAL_MAP -# include "json_internalarray.inl" -# include "json_internalmap.inl" -#endif // JSON_VALUE_USE_INTERNAL_MAP - -# include "json_valueiterator.inl" - - -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// -// class Value::CommentInfo -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// - - -Value::CommentInfo::CommentInfo() - : comment_( 0 ) -{ -} - -Value::CommentInfo::~CommentInfo() -{ - if ( comment_ ) - valueAllocator()->releaseStringValue( comment_ ); -} - - -void -Value::CommentInfo::setComment( const char *text ) -{ - if ( comment_ ) - valueAllocator()->releaseStringValue( comment_ ); - JSON_ASSERT( text ); - JSON_ASSERT_MESSAGE( text[0]=='\0' || text[0]=='/', "Comments must start with /"); - // It seems that /**/ style comments are acceptable as well. - comment_ = valueAllocator()->duplicateStringValue( text ); -} - - -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// -// class Value::CZString -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// -# ifndef JSON_VALUE_USE_INTERNAL_MAP - -// Notes: index_ indicates if the string was allocated when -// a string is stored. - -Value::CZString::CZString( int index ) - : cstr_( 0 ) - , index_( index ) -{ -} - -Value::CZString::CZString( const char *cstr, DuplicationPolicy allocate ) - : cstr_( allocate == duplicate ? valueAllocator()->makeMemberName(cstr) - : cstr ) - , index_( allocate ) -{ -} - -Value::CZString::CZString( const CZString &other ) -: cstr_( other.index_ != noDuplication && other.cstr_ != 0 - ? valueAllocator()->makeMemberName( other.cstr_ ) - : other.cstr_ ) - , index_( other.cstr_ ? (other.index_ == noDuplication ? noDuplication : duplicate) - : other.index_ ) -{ -} - -Value::CZString::~CZString() -{ - if ( cstr_ && index_ == duplicate ) - valueAllocator()->releaseMemberName( const_cast( cstr_ ) ); -} - -void -Value::CZString::swap( CZString &other ) -{ - std::swap( cstr_, other.cstr_ ); - std::swap( index_, other.index_ ); -} - -Value::CZString & -Value::CZString::operator =( const CZString &other ) -{ - CZString temp( other ); - swap( temp ); - return *this; -} - -bool -Value::CZString::operator<( const CZString &other ) const -{ - if ( cstr_ ) - return strcmp( cstr_, other.cstr_ ) < 0; - return index_ < other.index_; -} - -bool -Value::CZString::operator==( const CZString &other ) const -{ - if ( cstr_ ) - return strcmp( cstr_, other.cstr_ ) == 0; - return index_ == other.index_; -} - - -int -Value::CZString::index() const -{ - return index_; -} - - -const char * -Value::CZString::c_str() const -{ - return cstr_; -} - -bool -Value::CZString::isStaticString() const -{ - return index_ == noDuplication; -} - -#endif // ifndef JSON_VALUE_USE_INTERNAL_MAP - - -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// -// class Value::Value -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// - -/*! \internal Default constructor initialization must be equivalent to: - * memset( this, 0, sizeof(Value) ) - * This optimization is used in ValueInternalMap fast allocator. - */ -Value::Value( ValueType type ) - : type_( type ) - , allocated_( 0 ) - , comments_( 0 ) -# ifdef JSON_VALUE_USE_INTERNAL_MAP - , itemIsUsed_( 0 ) -#endif -{ - switch ( type ) - { - case nullValue: - break; - case intValue: - case uintValue: - value_.int_ = 0; - break; - case realValue: - value_.real_ = 0.0; - break; - case stringValue: - value_.string_ = 0; - break; -#ifndef JSON_VALUE_USE_INTERNAL_MAP - case arrayValue: - case objectValue: - value_.map_ = new ObjectValues(); - break; -#else - case arrayValue: - value_.array_ = arrayAllocator()->newArray(); - break; - case objectValue: - value_.map_ = mapAllocator()->newMap(); - break; -#endif - case booleanValue: - value_.bool_ = false; - break; - default: - JSON_ASSERT_UNREACHABLE; - } -} - - -Value::Value( Int value ) - : type_( intValue ) - , comments_( 0 ) -# ifdef JSON_VALUE_USE_INTERNAL_MAP - , itemIsUsed_( 0 ) -#endif -{ - value_.int_ = value; -} - - -Value::Value( UInt value ) - : type_( uintValue ) - , comments_( 0 ) -# ifdef JSON_VALUE_USE_INTERNAL_MAP - , itemIsUsed_( 0 ) -#endif -{ - value_.uint_ = value; -} - -Value::Value( double value ) - : type_( realValue ) - , comments_( 0 ) -# ifdef JSON_VALUE_USE_INTERNAL_MAP - , itemIsUsed_( 0 ) -#endif -{ - value_.real_ = value; -} - -Value::Value( const char *value ) - : type_( stringValue ) - , allocated_( true ) - , comments_( 0 ) -# ifdef JSON_VALUE_USE_INTERNAL_MAP - , itemIsUsed_( 0 ) -#endif -{ - value_.string_ = valueAllocator()->duplicateStringValue( value ); -} - - -Value::Value( const char *beginValue, - const char *endValue ) - : type_( stringValue ) - , allocated_( true ) - , comments_( 0 ) -# ifdef JSON_VALUE_USE_INTERNAL_MAP - , itemIsUsed_( 0 ) -#endif -{ - value_.string_ = valueAllocator()->duplicateStringValue( beginValue, - UInt(endValue - beginValue) ); -} - - -Value::Value( const std::string &value ) - : type_( stringValue ) - , allocated_( true ) - , comments_( 0 ) -# ifdef JSON_VALUE_USE_INTERNAL_MAP - , itemIsUsed_( 0 ) -#endif -{ - value_.string_ = valueAllocator()->duplicateStringValue( value.c_str(), - (unsigned int)value.length() ); - -} - -Value::Value( const StaticString &value ) - : type_( stringValue ) - , allocated_( false ) - , comments_( 0 ) -# ifdef JSON_VALUE_USE_INTERNAL_MAP - , itemIsUsed_( 0 ) -#endif -{ - value_.string_ = const_cast( value.c_str() ); -} - - -# ifdef JSON_USE_CPPTL -Value::Value( const CppTL::ConstString &value ) - : type_( stringValue ) - , allocated_( true ) - , comments_( 0 ) -# ifdef JSON_VALUE_USE_INTERNAL_MAP - , itemIsUsed_( 0 ) -#endif -{ - value_.string_ = valueAllocator()->duplicateStringValue( value, value.length() ); -} -# endif - -Value::Value( bool value ) - : type_( booleanValue ) - , comments_( 0 ) -# ifdef JSON_VALUE_USE_INTERNAL_MAP - , itemIsUsed_( 0 ) -#endif -{ - value_.bool_ = value; -} - - -Value::Value( const Value &other ) - : type_( other.type_ ) - , comments_( 0 ) -# ifdef JSON_VALUE_USE_INTERNAL_MAP - , itemIsUsed_( 0 ) -#endif -{ - switch ( type_ ) - { - case nullValue: - case intValue: - case uintValue: - case realValue: - case booleanValue: - value_ = other.value_; - break; - case stringValue: - if ( other.value_.string_ ) - { - value_.string_ = valueAllocator()->duplicateStringValue( other.value_.string_ ); - allocated_ = true; - } - else - value_.string_ = 0; - break; -#ifndef JSON_VALUE_USE_INTERNAL_MAP - case arrayValue: - case objectValue: - value_.map_ = new ObjectValues( *other.value_.map_ ); - break; -#else - case arrayValue: - value_.array_ = arrayAllocator()->newArrayCopy( *other.value_.array_ ); - break; - case objectValue: - value_.map_ = mapAllocator()->newMapCopy( *other.value_.map_ ); - break; -#endif - default: - JSON_ASSERT_UNREACHABLE; - } - if ( other.comments_ ) - { - comments_ = new CommentInfo[numberOfCommentPlacement]; - for ( int comment =0; comment < numberOfCommentPlacement; ++comment ) - { - const CommentInfo &otherComment = other.comments_[comment]; - if ( otherComment.comment_ ) - comments_[comment].setComment( otherComment.comment_ ); - } - } -} - - -Value::~Value() -{ - switch ( type_ ) - { - case nullValue: - case intValue: - case uintValue: - case realValue: - case booleanValue: - break; - case stringValue: - if ( allocated_ ) - valueAllocator()->releaseStringValue( value_.string_ ); - break; -#ifndef JSON_VALUE_USE_INTERNAL_MAP - case arrayValue: - case objectValue: - delete value_.map_; - break; -#else - case arrayValue: - arrayAllocator()->destructArray( value_.array_ ); - break; - case objectValue: - mapAllocator()->destructMap( value_.map_ ); - break; -#endif - default: - JSON_ASSERT_UNREACHABLE; - } - - if ( comments_ ) - delete[] comments_; -} - -Value & -Value::operator=( const Value &other ) -{ - Value temp( other ); - swap( temp ); - return *this; -} - -void -Value::swap( Value &other ) -{ - ValueType temp = type_; - type_ = other.type_; - other.type_ = temp; - std::swap( value_, other.value_ ); - int temp2 = allocated_; - allocated_ = other.allocated_; - other.allocated_ = temp2; -} - -ValueType -Value::type() const -{ - return type_; -} - - -int -Value::compare( const Value &other ) -{ - /* - int typeDelta = other.type_ - type_; - switch ( type_ ) - { - case nullValue: - - return other.type_ == type_; - case intValue: - if ( other.type_.isNumeric() - case uintValue: - case realValue: - case booleanValue: - break; - case stringValue, - break; - case arrayValue: - delete value_.array_; - break; - case objectValue: - delete value_.map_; - default: - JSON_ASSERT_UNREACHABLE; - } - */ - return 0; // unreachable -} - -bool -Value::operator <( const Value &other ) const -{ - int typeDelta = type_ - other.type_; - if ( typeDelta ) - return typeDelta < 0 ? true : false; - switch ( type_ ) - { - case nullValue: - return false; - case intValue: - return value_.int_ < other.value_.int_; - case uintValue: - return value_.uint_ < other.value_.uint_; - case realValue: - return value_.real_ < other.value_.real_; - case booleanValue: - return value_.bool_ < other.value_.bool_; - case stringValue: - return ( value_.string_ == 0 && other.value_.string_ ) - || ( other.value_.string_ - && value_.string_ - && strcmp( value_.string_, other.value_.string_ ) < 0 ); -#ifndef JSON_VALUE_USE_INTERNAL_MAP - case arrayValue: - case objectValue: - { - int delta = int( value_.map_->size() - other.value_.map_->size() ); - if ( delta ) - return delta < 0; - return (*value_.map_) < (*other.value_.map_); - } -#else - case arrayValue: - return value_.array_->compare( *(other.value_.array_) ) < 0; - case objectValue: - return value_.map_->compare( *(other.value_.map_) ) < 0; -#endif - default: - JSON_ASSERT_UNREACHABLE; - } - return 0; // unreachable -} - -bool -Value::operator <=( const Value &other ) const -{ - return !(other > *this); -} - -bool -Value::operator >=( const Value &other ) const -{ - return !(*this < other); -} - -bool -Value::operator >( const Value &other ) const -{ - return other < *this; -} - -bool -Value::operator ==( const Value &other ) const -{ - //if ( type_ != other.type_ ) - // GCC 2.95.3 says: - // attempt to take address of bit-field structure member `Json::Value::type_' - // Beats me, but a temp solves the problem. - int temp = other.type_; - if ( type_ != temp ) - return false; - switch ( type_ ) - { - case nullValue: - return true; - case intValue: - return value_.int_ == other.value_.int_; - case uintValue: - return value_.uint_ == other.value_.uint_; - case realValue: - return value_.real_ == other.value_.real_; - case booleanValue: - return value_.bool_ == other.value_.bool_; - case stringValue: - return ( value_.string_ == other.value_.string_ ) - || ( other.value_.string_ - && value_.string_ - && strcmp( value_.string_, other.value_.string_ ) == 0 ); -#ifndef JSON_VALUE_USE_INTERNAL_MAP - case arrayValue: - case objectValue: - return value_.map_->size() == other.value_.map_->size() - && (*value_.map_) == (*other.value_.map_); -#else - case arrayValue: - return value_.array_->compare( *(other.value_.array_) ) == 0; - case objectValue: - return value_.map_->compare( *(other.value_.map_) ) == 0; -#endif - default: - JSON_ASSERT_UNREACHABLE; - } - return 0; // unreachable -} - -bool -Value::operator !=( const Value &other ) const -{ - return !( *this == other ); -} - -const char * -Value::asCString() const -{ - JSON_ASSERT( type_ == stringValue ); - return value_.string_; -} - - -std::string -Value::asString() const -{ - switch ( type_ ) - { - case nullValue: - return ""; - case stringValue: - return value_.string_ ? value_.string_ : ""; - case booleanValue: - return value_.bool_ ? "true" : "false"; - case intValue: - case uintValue: - case realValue: - case arrayValue: - case objectValue: - JSON_ASSERT_MESSAGE( false, "Type is not convertible to string" ); - default: - JSON_ASSERT_UNREACHABLE; - } - return ""; // unreachable -} - -# ifdef JSON_USE_CPPTL -CppTL::ConstString -Value::asConstString() const -{ - return CppTL::ConstString( asString().c_str() ); -} -# endif - -Value::Int -Value::asInt() const -{ - switch ( type_ ) - { - case nullValue: - return 0; - case intValue: - return value_.int_; - case uintValue: - JSON_ASSERT_MESSAGE( value_.uint_ < (unsigned)maxInt, "integer out of signed integer range" ); - return value_.uint_; - case realValue: - JSON_ASSERT_MESSAGE( value_.real_ >= minInt && value_.real_ <= maxInt, "Real out of signed integer range" ); - return Int( value_.real_ ); - case booleanValue: - return value_.bool_ ? 1 : 0; - case stringValue: - case arrayValue: - case objectValue: - JSON_ASSERT_MESSAGE( false, "Type is not convertible to int" ); - default: - JSON_ASSERT_UNREACHABLE; - } - return 0; // unreachable; -} - -Value::UInt -Value::asUInt() const -{ - switch ( type_ ) - { - case nullValue: - return 0; - case intValue: - JSON_ASSERT_MESSAGE( value_.int_ >= 0, "Negative integer can not be converted to unsigned integer" ); - return value_.int_; - case uintValue: - return value_.uint_; - case realValue: - JSON_ASSERT_MESSAGE( value_.real_ >= 0 && value_.real_ <= maxUInt, "Real out of unsigned integer range" ); - return UInt( value_.real_ ); - case booleanValue: - return value_.bool_ ? 1 : 0; - case stringValue: - case arrayValue: - case objectValue: - JSON_ASSERT_MESSAGE( false, "Type is not convertible to uint" ); - default: - JSON_ASSERT_UNREACHABLE; - } - return 0; // unreachable; -} - -double -Value::asDouble() const -{ - switch ( type_ ) - { - case nullValue: - return 0.0; - case intValue: - return value_.int_; - case uintValue: - return value_.uint_; - case realValue: - return value_.real_; - case booleanValue: - return value_.bool_ ? 1.0 : 0.0; - case stringValue: - case arrayValue: - case objectValue: - JSON_ASSERT_MESSAGE( false, "Type is not convertible to double" ); - default: - JSON_ASSERT_UNREACHABLE; - } - return 0; // unreachable; -} - -bool -Value::asBool() const -{ - switch ( type_ ) - { - case nullValue: - return false; - case intValue: - case uintValue: - return value_.int_ != 0; - case realValue: - return value_.real_ != 0.0; - case booleanValue: - return value_.bool_; - case stringValue: - return value_.string_ && value_.string_[0] != 0; - case arrayValue: - case objectValue: - return value_.map_->size() != 0; - default: - JSON_ASSERT_UNREACHABLE; - } - return false; // unreachable; -} - - -bool -Value::isConvertibleTo( ValueType other ) const -{ - switch ( type_ ) - { - case nullValue: - return true; - case intValue: - return ( other == nullValue && value_.int_ == 0 ) - || other == intValue - || ( other == uintValue && value_.int_ >= 0 ) - || other == realValue - || other == stringValue - || other == booleanValue; - case uintValue: - return ( other == nullValue && value_.uint_ == 0 ) - || ( other == intValue && value_.uint_ <= (unsigned)maxInt ) - || other == uintValue - || other == realValue - || other == stringValue - || other == booleanValue; - case realValue: - return ( other == nullValue && value_.real_ == 0.0 ) - || ( other == intValue && value_.real_ >= minInt && value_.real_ <= maxInt ) - || ( other == uintValue && value_.real_ >= 0 && value_.real_ <= maxUInt ) - || other == realValue - || other == stringValue - || other == booleanValue; - case booleanValue: - return ( other == nullValue && value_.bool_ == false ) - || other == intValue - || other == uintValue - || other == realValue - || other == stringValue - || other == booleanValue; - case stringValue: - return other == stringValue - || ( other == nullValue && (!value_.string_ || value_.string_[0] == 0) ); - case arrayValue: - return other == arrayValue - || ( other == nullValue && value_.map_->size() == 0 ); - case objectValue: - return other == objectValue - || ( other == nullValue && value_.map_->size() == 0 ); - default: - JSON_ASSERT_UNREACHABLE; - } - return false; // unreachable; -} - - -/// Number of values in array or object -Value::UInt -Value::size() const -{ - switch ( type_ ) - { - case nullValue: - case intValue: - case uintValue: - case realValue: - case booleanValue: - case stringValue: - return 0; -#ifndef JSON_VALUE_USE_INTERNAL_MAP - case arrayValue: // size of the array is highest index + 1 - if ( !value_.map_->empty() ) - { - ObjectValues::const_iterator itLast = value_.map_->end(); - --itLast; - return (*itLast).first.index()+1; - } - return 0; - case objectValue: - return Int( value_.map_->size() ); -#else - case arrayValue: - return Int( value_.array_->size() ); - case objectValue: - return Int( value_.map_->size() ); -#endif - default: - JSON_ASSERT_UNREACHABLE; - } - return 0; // unreachable; -} - - -bool -Value::empty() const -{ - if ( isNull() || isArray() || isObject() ) - return size() == 0u; - else - return false; -} - - -bool -Value::operator!() const -{ - return isNull(); -} - - -void -Value::clear() -{ - JSON_ASSERT( type_ == nullValue || type_ == arrayValue || type_ == objectValue ); - - switch ( type_ ) - { -#ifndef JSON_VALUE_USE_INTERNAL_MAP - case arrayValue: - case objectValue: - value_.map_->clear(); - break; -#else - case arrayValue: - value_.array_->clear(); - break; - case objectValue: - value_.map_->clear(); - break; -#endif - default: - break; - } -} - -void -Value::resize( UInt newSize ) -{ - JSON_ASSERT( type_ == nullValue || type_ == arrayValue ); - if ( type_ == nullValue ) - *this = Value( arrayValue ); -#ifndef JSON_VALUE_USE_INTERNAL_MAP - UInt oldSize = size(); - if ( newSize == 0 ) - clear(); - else if ( newSize > oldSize ) - (*this)[ newSize - 1 ]; - else - { - for ( UInt index = newSize; index < oldSize; ++index ) - value_.map_->erase( index ); - assert( size() == newSize ); - } -#else - value_.array_->resize( newSize ); -#endif -} - - -Value & -Value::operator[]( UInt index ) -{ - JSON_ASSERT( type_ == nullValue || type_ == arrayValue ); - if ( type_ == nullValue ) - *this = Value( arrayValue ); -#ifndef JSON_VALUE_USE_INTERNAL_MAP - CZString key( index ); - ObjectValues::iterator it = value_.map_->lower_bound( key ); - if ( it != value_.map_->end() && (*it).first == key ) - return (*it).second; - - ObjectValues::value_type defaultValue( key, null ); - it = value_.map_->insert( it, defaultValue ); - return (*it).second; -#else - return value_.array_->resolveReference( index ); -#endif -} - - -const Value & -Value::operator[]( UInt index ) const -{ - JSON_ASSERT( type_ == nullValue || type_ == arrayValue ); - if ( type_ == nullValue ) - return null; -#ifndef JSON_VALUE_USE_INTERNAL_MAP - CZString key( index ); - ObjectValues::const_iterator it = value_.map_->find( key ); - if ( it == value_.map_->end() ) - return null; - return (*it).second; -#else - Value *value = value_.array_->find( index ); - return value ? *value : null; -#endif -} - - -Value & -Value::operator[]( const char *key ) -{ - return resolveReference( key, false ); -} - - -Value & -Value::resolveReference( const char *key, - bool isStatic ) -{ - JSON_ASSERT( type_ == nullValue || type_ == objectValue ); - if ( type_ == nullValue ) - *this = Value( objectValue ); -#ifndef JSON_VALUE_USE_INTERNAL_MAP - CZString actualKey( key, isStatic ? CZString::noDuplication - : CZString::duplicateOnCopy ); - ObjectValues::iterator it = value_.map_->lower_bound( actualKey ); - if ( it != value_.map_->end() && (*it).first == actualKey ) - return (*it).second; - - ObjectValues::value_type defaultValue( actualKey, null ); - it = value_.map_->insert( it, defaultValue ); - Value &value = (*it).second; - return value; -#else - return value_.map_->resolveReference( key, isStatic ); -#endif -} - - -Value -Value::get( UInt index, - const Value &defaultValue ) const -{ - const Value *value = &((*this)[index]); - return value == &null ? defaultValue : *value; -} - - -bool -Value::isValidIndex( UInt index ) const -{ - return index < size(); -} - - - -const Value & -Value::operator[]( const char *key ) const -{ - JSON_ASSERT( type_ == nullValue || type_ == objectValue ); - if ( type_ == nullValue ) - return null; -#ifndef JSON_VALUE_USE_INTERNAL_MAP - CZString actualKey( key, CZString::noDuplication ); - ObjectValues::const_iterator it = value_.map_->find( actualKey ); - if ( it == value_.map_->end() ) - return null; - return (*it).second; -#else - const Value *value = value_.map_->find( key ); - return value ? *value : null; -#endif -} - - -Value & -Value::operator[]( const std::string &key ) -{ - return (*this)[ key.c_str() ]; -} - - -const Value & -Value::operator[]( const std::string &key ) const -{ - return (*this)[ key.c_str() ]; -} - -Value & -Value::operator[]( const StaticString &key ) -{ - return resolveReference( key, true ); -} - - -# ifdef JSON_USE_CPPTL -Value & -Value::operator[]( const CppTL::ConstString &key ) -{ - return (*this)[ key.c_str() ]; -} - - -const Value & -Value::operator[]( const CppTL::ConstString &key ) const -{ - return (*this)[ key.c_str() ]; -} -# endif - - -Value & -Value::append( const Value &value ) -{ - return (*this)[size()] = value; -} - - -Value -Value::get( const char *key, - const Value &defaultValue ) const -{ - const Value *value = &((*this)[key]); - return value == &null ? defaultValue : *value; -} - - -Value -Value::get( const std::string &key, - const Value &defaultValue ) const -{ - return get( key.c_str(), defaultValue ); -} - -Value -Value::removeMember( const char* key ) -{ - JSON_ASSERT( type_ == nullValue || type_ == objectValue ); - if ( type_ == nullValue ) - return null; -#ifndef JSON_VALUE_USE_INTERNAL_MAP - CZString actualKey( key, CZString::noDuplication ); - ObjectValues::iterator it = value_.map_->find( actualKey ); - if ( it == value_.map_->end() ) - return null; - Value old(it->second); - value_.map_->erase(it); - return old; -#else - Value *value = value_.map_->find( key ); - if (value){ - Value old(*value); - value_.map_.remove( key ); - return old; - } else { - return null; - } -#endif -} - -Value -Value::removeMember( const std::string &key ) -{ - return removeMember( key.c_str() ); -} - -# ifdef JSON_USE_CPPTL -Value -Value::get( const CppTL::ConstString &key, - const Value &defaultValue ) const -{ - return get( key.c_str(), defaultValue ); -} -# endif - -bool -Value::isMember( const char *key ) const -{ - const Value *value = &((*this)[key]); - return value != &null; -} - - -bool -Value::isMember( const std::string &key ) const -{ - return isMember( key.c_str() ); -} - - -# ifdef JSON_USE_CPPTL -bool -Value::isMember( const CppTL::ConstString &key ) const -{ - return isMember( key.c_str() ); -} -#endif - -Value::Members -Value::getMemberNames() const -{ - JSON_ASSERT( type_ == nullValue || type_ == objectValue ); - if ( type_ == nullValue ) - return Value::Members(); - Members members; - members.reserve( value_.map_->size() ); -#ifndef JSON_VALUE_USE_INTERNAL_MAP - ObjectValues::const_iterator it = value_.map_->begin(); - ObjectValues::const_iterator itEnd = value_.map_->end(); - for ( ; it != itEnd; ++it ) - members.push_back( std::string( (*it).first.c_str() ) ); -#else - ValueInternalMap::IteratorState it; - ValueInternalMap::IteratorState itEnd; - value_.map_->makeBeginIterator( it ); - value_.map_->makeEndIterator( itEnd ); - for ( ; !ValueInternalMap::equals( it, itEnd ); ValueInternalMap::increment(it) ) - members.push_back( std::string( ValueInternalMap::key( it ) ) ); -#endif - return members; -} -// -//# ifdef JSON_USE_CPPTL -//EnumMemberNames -//Value::enumMemberNames() const -//{ -// if ( type_ == objectValue ) -// { -// return CppTL::Enum::any( CppTL::Enum::transform( -// CppTL::Enum::keys( *(value_.map_), CppTL::Type() ), -// MemberNamesTransform() ) ); -// } -// return EnumMemberNames(); -//} -// -// -//EnumValues -//Value::enumValues() const -//{ -// if ( type_ == objectValue || type_ == arrayValue ) -// return CppTL::Enum::anyValues( *(value_.map_), -// CppTL::Type() ); -// return EnumValues(); -//} -// -//# endif - - -bool -Value::isNull() const -{ - return type_ == nullValue; -} - - -bool -Value::isBool() const -{ - return type_ == booleanValue; -} - - -bool -Value::isInt() const -{ - return type_ == intValue; -} - - -bool -Value::isUInt() const -{ - return type_ == uintValue; -} - - -bool -Value::isIntegral() const -{ - return type_ == intValue - || type_ == uintValue - || type_ == booleanValue; -} - - -bool -Value::isDouble() const -{ - return type_ == realValue; -} - - -bool -Value::isNumeric() const -{ - return isIntegral() || isDouble(); -} - - -bool -Value::isString() const -{ - return type_ == stringValue; -} - - -bool -Value::isArray() const -{ - return type_ == nullValue || type_ == arrayValue; -} - - -bool -Value::isObject() const -{ - return type_ == nullValue || type_ == objectValue; -} - - -void -Value::setComment( const char *comment, - CommentPlacement placement ) -{ - if ( !comments_ ) - comments_ = new CommentInfo[numberOfCommentPlacement]; - comments_[placement].setComment( comment ); -} - - -void -Value::setComment( const std::string &comment, - CommentPlacement placement ) -{ - setComment( comment.c_str(), placement ); -} - - -bool -Value::hasComment( CommentPlacement placement ) const -{ - return comments_ != 0 && comments_[placement].comment_ != 0; -} - -std::string -Value::getComment( CommentPlacement placement ) const -{ - if ( hasComment(placement) ) - return comments_[placement].comment_; - return ""; -} - - -std::string -Value::toStyledString() const -{ - StyledWriter writer; - return writer.write( *this ); -} - - -Value::const_iterator -Value::begin() const -{ - switch ( type_ ) - { -#ifdef JSON_VALUE_USE_INTERNAL_MAP - case arrayValue: - if ( value_.array_ ) - { - ValueInternalArray::IteratorState it; - value_.array_->makeBeginIterator( it ); - return const_iterator( it ); - } - break; - case objectValue: - if ( value_.map_ ) - { - ValueInternalMap::IteratorState it; - value_.map_->makeBeginIterator( it ); - return const_iterator( it ); - } - break; -#else - case arrayValue: - case objectValue: - if ( value_.map_ ) - return const_iterator( value_.map_->begin() ); - break; -#endif - default: - break; - } - return const_iterator(); -} - -Value::const_iterator -Value::end() const -{ - switch ( type_ ) - { -#ifdef JSON_VALUE_USE_INTERNAL_MAP - case arrayValue: - if ( value_.array_ ) - { - ValueInternalArray::IteratorState it; - value_.array_->makeEndIterator( it ); - return const_iterator( it ); - } - break; - case objectValue: - if ( value_.map_ ) - { - ValueInternalMap::IteratorState it; - value_.map_->makeEndIterator( it ); - return const_iterator( it ); - } - break; -#else - case arrayValue: - case objectValue: - if ( value_.map_ ) - return const_iterator( value_.map_->end() ); - break; -#endif - default: - break; - } - return const_iterator(); -} - - -Value::iterator -Value::begin() -{ - switch ( type_ ) - { -#ifdef JSON_VALUE_USE_INTERNAL_MAP - case arrayValue: - if ( value_.array_ ) - { - ValueInternalArray::IteratorState it; - value_.array_->makeBeginIterator( it ); - return iterator( it ); - } - break; - case objectValue: - if ( value_.map_ ) - { - ValueInternalMap::IteratorState it; - value_.map_->makeBeginIterator( it ); - return iterator( it ); - } - break; -#else - case arrayValue: - case objectValue: - if ( value_.map_ ) - return iterator( value_.map_->begin() ); - break; -#endif - default: - break; - } - return iterator(); -} - -Value::iterator -Value::end() -{ - switch ( type_ ) - { -#ifdef JSON_VALUE_USE_INTERNAL_MAP - case arrayValue: - if ( value_.array_ ) - { - ValueInternalArray::IteratorState it; - value_.array_->makeEndIterator( it ); - return iterator( it ); - } - break; - case objectValue: - if ( value_.map_ ) - { - ValueInternalMap::IteratorState it; - value_.map_->makeEndIterator( it ); - return iterator( it ); - } - break; -#else - case arrayValue: - case objectValue: - if ( value_.map_ ) - return iterator( value_.map_->end() ); - break; -#endif - default: - break; - } - return iterator(); -} - - -// class PathArgument -// ////////////////////////////////////////////////////////////////// - -PathArgument::PathArgument() - : kind_( kindNone ) -{ -} - - -PathArgument::PathArgument( Value::UInt index ) - : index_( index ) - , kind_( kindIndex ) -{ -} - - -PathArgument::PathArgument( const char *key ) - : key_( key ) - , kind_( kindKey ) -{ -} - - -PathArgument::PathArgument( const std::string &key ) - : key_( key.c_str() ) - , kind_( kindKey ) -{ -} - -// class Path -// ////////////////////////////////////////////////////////////////// - -Path::Path( const std::string &path, - const PathArgument &a1, - const PathArgument &a2, - const PathArgument &a3, - const PathArgument &a4, - const PathArgument &a5 ) -{ - InArgs in; - in.push_back( &a1 ); - in.push_back( &a2 ); - in.push_back( &a3 ); - in.push_back( &a4 ); - in.push_back( &a5 ); - makePath( path, in ); -} - - -void -Path::makePath( const std::string &path, - const InArgs &in ) -{ - const char *current = path.c_str(); - const char *end = current + path.length(); - InArgs::const_iterator itInArg = in.begin(); - while ( current != end ) - { - if ( *current == '[' ) - { - ++current; - if ( *current == '%' ) - addPathInArg( path, in, itInArg, PathArgument::kindIndex ); - else - { - Value::UInt index = 0; - for ( ; current != end && *current >= '0' && *current <= '9'; ++current ) - index = index * 10 + Value::UInt(*current - '0'); - args_.push_back( index ); - } - if ( current == end || *current++ != ']' ) - invalidPath( path, int(current - path.c_str()) ); - } - else if ( *current == '%' ) - { - addPathInArg( path, in, itInArg, PathArgument::kindKey ); - ++current; - } - else if ( *current == '.' ) - { - ++current; - } - else - { - const char *beginName = current; - while ( current != end && !strchr( "[.", *current ) ) - ++current; - args_.push_back( std::string( beginName, current ) ); - } - } -} - - -void -Path::addPathInArg( const std::string &path, - const InArgs &in, - InArgs::const_iterator &itInArg, - PathArgument::Kind kind ) -{ - if ( itInArg == in.end() ) - { - // Error: missing argument %d - } - else if ( (*itInArg)->kind_ != kind ) - { - // Error: bad argument type - } - else - { - args_.push_back( **itInArg ); - } -} - - -void -Path::invalidPath( const std::string &path, - int location ) -{ - // Error: invalid path. -} - - -const Value & -Path::resolve( const Value &root ) const -{ - const Value *node = &root; - for ( Args::const_iterator it = args_.begin(); it != args_.end(); ++it ) - { - const PathArgument &arg = *it; - if ( arg.kind_ == PathArgument::kindIndex ) - { - if ( !node->isArray() || node->isValidIndex( arg.index_ ) ) - { - // Error: unable to resolve path (array value expected at position... - } - node = &((*node)[arg.index_]); - } - else if ( arg.kind_ == PathArgument::kindKey ) - { - if ( !node->isObject() ) - { - // Error: unable to resolve path (object value expected at position...) - } - node = &((*node)[arg.key_]); - if ( node == &Value::null ) - { - // Error: unable to resolve path (object has no member named '' at position...) - } - } - } - return *node; -} - - -Value -Path::resolve( const Value &root, - const Value &defaultValue ) const -{ - const Value *node = &root; - for ( Args::const_iterator it = args_.begin(); it != args_.end(); ++it ) - { - const PathArgument &arg = *it; - if ( arg.kind_ == PathArgument::kindIndex ) - { - if ( !node->isArray() || node->isValidIndex( arg.index_ ) ) - return defaultValue; - node = &((*node)[arg.index_]); - } - else if ( arg.kind_ == PathArgument::kindKey ) - { - if ( !node->isObject() ) - return defaultValue; - node = &((*node)[arg.key_]); - if ( node == &Value::null ) - return defaultValue; - } - } - return *node; -} - - -Value & -Path::make( Value &root ) const -{ - Value *node = &root; - for ( Args::const_iterator it = args_.begin(); it != args_.end(); ++it ) - { - const PathArgument &arg = *it; - if ( arg.kind_ == PathArgument::kindIndex ) - { - if ( !node->isArray() ) - { - // Error: node is not an array at position ... - } - node = &((*node)[arg.index_]); - } - else if ( arg.kind_ == PathArgument::kindKey ) - { - if ( !node->isObject() ) - { - // Error: node is not an object at position... - } - node = &((*node)[arg.key_]); - } - } - return *node; -} - - -} // namespace Json diff --git a/cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/public/json_valueiterator.inl b/cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/public/json_valueiterator.inl deleted file mode 100644 index 736e260ea..000000000 --- a/cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/public/json_valueiterator.inl +++ /dev/null @@ -1,292 +0,0 @@ -// included by json_value.cpp -// everything is within Json namespace - - -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// -// class ValueIteratorBase -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// - -ValueIteratorBase::ValueIteratorBase() -#ifndef JSON_VALUE_USE_INTERNAL_MAP - : current_() - , isNull_( true ) -{ -} -#else - : isArray_( true ) - , isNull_( true ) -{ - iterator_.array_ = ValueInternalArray::IteratorState(); -} -#endif - - -#ifndef JSON_VALUE_USE_INTERNAL_MAP -ValueIteratorBase::ValueIteratorBase( const Value::ObjectValues::iterator ¤t ) - : current_( current ) - , isNull_( false ) -{ -} -#else -ValueIteratorBase::ValueIteratorBase( const ValueInternalArray::IteratorState &state ) - : isArray_( true ) -{ - iterator_.array_ = state; -} - - -ValueIteratorBase::ValueIteratorBase( const ValueInternalMap::IteratorState &state ) - : isArray_( false ) -{ - iterator_.map_ = state; -} -#endif - -Value & -ValueIteratorBase::deref() const -{ -#ifndef JSON_VALUE_USE_INTERNAL_MAP - return current_->second; -#else - if ( isArray_ ) - return ValueInternalArray::dereference( iterator_.array_ ); - return ValueInternalMap::value( iterator_.map_ ); -#endif -} - - -void -ValueIteratorBase::increment() -{ -#ifndef JSON_VALUE_USE_INTERNAL_MAP - ++current_; -#else - if ( isArray_ ) - ValueInternalArray::increment( iterator_.array_ ); - ValueInternalMap::increment( iterator_.map_ ); -#endif -} - - -void -ValueIteratorBase::decrement() -{ -#ifndef JSON_VALUE_USE_INTERNAL_MAP - --current_; -#else - if ( isArray_ ) - ValueInternalArray::decrement( iterator_.array_ ); - ValueInternalMap::decrement( iterator_.map_ ); -#endif -} - - -ValueIteratorBase::difference_type -ValueIteratorBase::computeDistance( const SelfType &other ) const -{ -#ifndef JSON_VALUE_USE_INTERNAL_MAP -# ifdef JSON_USE_CPPTL_SMALLMAP - return current_ - other.current_; -# else - // Iterator for null value are initialized using the default - // constructor, which initialize current_ to the default - // std::map::iterator. As begin() and end() are two instance - // of the default std::map::iterator, they can not be compared. - // To allow this, we handle this comparison specifically. - if ( isNull_ && other.isNull_ ) - { - return 0; - } - - - // Usage of std::distance is not portable (does not compile with Sun Studio 12 RogueWave STL, - // which is the one used by default). - // Using a portable hand-made version for non random iterator instead: - // return difference_type( std::distance( current_, other.current_ ) ); - difference_type myDistance = 0; - for ( Value::ObjectValues::iterator it = current_; it != other.current_; ++it ) - { - ++myDistance; - } - return myDistance; -# endif -#else - if ( isArray_ ) - return ValueInternalArray::distance( iterator_.array_, other.iterator_.array_ ); - return ValueInternalMap::distance( iterator_.map_, other.iterator_.map_ ); -#endif -} - - -bool -ValueIteratorBase::isEqual( const SelfType &other ) const -{ -#ifndef JSON_VALUE_USE_INTERNAL_MAP - if ( isNull_ ) - { - return other.isNull_; - } - return current_ == other.current_; -#else - if ( isArray_ ) - return ValueInternalArray::equals( iterator_.array_, other.iterator_.array_ ); - return ValueInternalMap::equals( iterator_.map_, other.iterator_.map_ ); -#endif -} - - -void -ValueIteratorBase::copy( const SelfType &other ) -{ -#ifndef JSON_VALUE_USE_INTERNAL_MAP - current_ = other.current_; -#else - if ( isArray_ ) - iterator_.array_ = other.iterator_.array_; - iterator_.map_ = other.iterator_.map_; -#endif -} - - -Value -ValueIteratorBase::key() const -{ -#ifndef JSON_VALUE_USE_INTERNAL_MAP - const Value::CZString czstring = (*current_).first; - if ( czstring.c_str() ) - { - if ( czstring.isStaticString() ) - return Value( StaticString( czstring.c_str() ) ); - return Value( czstring.c_str() ); - } - return Value( czstring.index() ); -#else - if ( isArray_ ) - return Value( ValueInternalArray::indexOf( iterator_.array_ ) ); - bool isStatic; - const char *memberName = ValueInternalMap::key( iterator_.map_, isStatic ); - if ( isStatic ) - return Value( StaticString( memberName ) ); - return Value( memberName ); -#endif -} - - -UInt -ValueIteratorBase::index() const -{ -#ifndef JSON_VALUE_USE_INTERNAL_MAP - const Value::CZString czstring = (*current_).first; - if ( !czstring.c_str() ) - return czstring.index(); - return Value::UInt( -1 ); -#else - if ( isArray_ ) - return Value::UInt( ValueInternalArray::indexOf( iterator_.array_ ) ); - return Value::UInt( -1 ); -#endif -} - - -const char * -ValueIteratorBase::memberName() const -{ -#ifndef JSON_VALUE_USE_INTERNAL_MAP - const char *name = (*current_).first.c_str(); - return name ? name : ""; -#else - if ( !isArray_ ) - return ValueInternalMap::key( iterator_.map_ ); - return ""; -#endif -} - - -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// -// class ValueConstIterator -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// - -ValueConstIterator::ValueConstIterator() -{ -} - - -#ifndef JSON_VALUE_USE_INTERNAL_MAP -ValueConstIterator::ValueConstIterator( const Value::ObjectValues::iterator ¤t ) - : ValueIteratorBase( current ) -{ -} -#else -ValueConstIterator::ValueConstIterator( const ValueInternalArray::IteratorState &state ) - : ValueIteratorBase( state ) -{ -} - -ValueConstIterator::ValueConstIterator( const ValueInternalMap::IteratorState &state ) - : ValueIteratorBase( state ) -{ -} -#endif - -ValueConstIterator & -ValueConstIterator::operator =( const ValueIteratorBase &other ) -{ - copy( other ); - return *this; -} - - -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// -// class ValueIterator -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// - -ValueIterator::ValueIterator() -{ -} - - -#ifndef JSON_VALUE_USE_INTERNAL_MAP -ValueIterator::ValueIterator( const Value::ObjectValues::iterator ¤t ) - : ValueIteratorBase( current ) -{ -} -#else -ValueIterator::ValueIterator( const ValueInternalArray::IteratorState &state ) - : ValueIteratorBase( state ) -{ -} - -ValueIterator::ValueIterator( const ValueInternalMap::IteratorState &state ) - : ValueIteratorBase( state ) -{ -} -#endif - -ValueIterator::ValueIterator( const ValueConstIterator &other ) - : ValueIteratorBase( other ) -{ -} - -ValueIterator::ValueIterator( const ValueIterator &other ) - : ValueIteratorBase( other ) -{ -} - -ValueIterator & -ValueIterator::operator =( const SelfType &other ) -{ - copy( other ); - return *this; -} diff --git a/cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/public/json_writer.cpp b/cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/public/json_writer.cpp deleted file mode 100644 index a522ef6b0..000000000 --- a/cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/public/json_writer.cpp +++ /dev/null @@ -1,829 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include - -#if _MSC_VER >= 1400 // VC++ 8.0 -#pragma warning( disable : 4996 ) // disable warning about strdup being deprecated. -#endif - -namespace Json { - -static bool isControlCharacter(char ch) -{ - return ch > 0 && ch <= 0x1F; -} - -static bool containsControlCharacter( const char* str ) -{ - while ( *str ) - { - if ( isControlCharacter( *(str++) ) ) - return true; - } - return false; -} -static void uintToString( unsigned int value, - char *¤t ) -{ - *--current = 0; - do - { - *--current = (value % 10) + '0'; - value /= 10; - } - while ( value != 0 ); -} - -std::string valueToString( Int value ) -{ - char buffer[32]; - char *current = buffer + sizeof(buffer); - bool isNegative = value < 0; - if ( isNegative ) - value = -value; - uintToString( UInt(value), current ); - if ( isNegative ) - *--current = '-'; - assert( current >= buffer ); - return current; -} - - -std::string valueToString( UInt value ) -{ - char buffer[32]; - char *current = buffer + sizeof(buffer); - uintToString( value, current ); - assert( current >= buffer ); - return current; -} - -std::string valueToString( double value ) -{ - char buffer[32]; -#if defined(_MSC_VER) && defined(__STDC_SECURE_LIB__) // Use secure version with visual studio 2005 to avoid warning. - sprintf_s(buffer, sizeof(buffer), "%#.16g", value); -#else - sprintf(buffer, "%#.16g", value); -#endif - char* ch = buffer + strlen(buffer) - 1; - if (*ch != '0') return buffer; // nothing to truncate, so save time - while(ch > buffer && *ch == '0'){ - --ch; - } - char* last_nonzero = ch; - while(ch >= buffer){ - switch(*ch){ - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - --ch; - continue; - case '.': - // Truncate zeroes to save bytes in output, but keep one. - *(last_nonzero+2) = '\0'; - return buffer; - default: - return buffer; - } - } - return buffer; -} - - -std::string valueToString( bool value ) -{ - return value ? "true" : "false"; -} - -std::string valueToQuotedString( const char *value ) -{ - // Not sure how to handle unicode... - if (strpbrk(value, "\"\\\b\f\n\r\t") == NULL && !containsControlCharacter( value )) - return std::string("\"") + value + "\""; - // We have to walk value and escape any special characters. - // Appending to std::string is not efficient, but this should be rare. - // (Note: forward slashes are *not* rare, but I am not escaping them.) - unsigned maxsize = strlen(value)*2 + 3; // allescaped+quotes+NULL - std::string result; - result.reserve(maxsize); // to avoid lots of mallocs - result += "\""; - for (const char* c=value; *c != 0; ++c) - { - switch(*c) - { - case '\"': - result += "\\\""; - break; - case '\\': - result += "\\\\"; - break; - case '\b': - result += "\\b"; - break; - case '\f': - result += "\\f"; - break; - case '\n': - result += "\\n"; - break; - case '\r': - result += "\\r"; - break; - case '\t': - result += "\\t"; - break; - //case '/': - // Even though \/ is considered a legal escape in JSON, a bare - // slash is also legal, so I see no reason to escape it. - // (I hope I am not misunderstanding something. - // blep notes: actually escaping \/ may be useful in javascript to avoid (*c); - result += oss.str(); - } - else - { - result += *c; - } - break; - } - } - result += "\""; - return result; -} - -// Class Writer -// ////////////////////////////////////////////////////////////////// -Writer::~Writer() -{ -} - - -// Class FastWriter -// ////////////////////////////////////////////////////////////////// - -FastWriter::FastWriter() - : yamlCompatibilityEnabled_( false ) -{ -} - - -void -FastWriter::enableYAMLCompatibility() -{ - yamlCompatibilityEnabled_ = true; -} - - -std::string -FastWriter::write( const Value &root ) -{ - document_ = ""; - writeValue( root ); - document_ += "\n"; - return document_; -} - - -void -FastWriter::writeValue( const Value &value ) -{ - switch ( value.type() ) - { - case nullValue: - document_ += "null"; - break; - case intValue: - document_ += valueToString( value.asInt() ); - break; - case uintValue: - document_ += valueToString( value.asUInt() ); - break; - case realValue: - document_ += valueToString( value.asDouble() ); - break; - case stringValue: - document_ += valueToQuotedString( value.asCString() ); - break; - case booleanValue: - document_ += valueToString( value.asBool() ); - break; - case arrayValue: - { - document_ += "["; - int size = value.size(); - for ( int index =0; index < size; ++index ) - { - if ( index > 0 ) - document_ += ","; - writeValue( value[index] ); - } - document_ += "]"; - } - break; - case objectValue: - { - Value::Members members( value.getMemberNames() ); - document_ += "{"; - for ( Value::Members::iterator it = members.begin(); - it != members.end(); - ++it ) - { - const std::string &name = *it; - if ( it != members.begin() ) - document_ += ","; - document_ += valueToQuotedString( name.c_str() ); - document_ += yamlCompatibilityEnabled_ ? ": " - : ":"; - writeValue( value[name] ); - } - document_ += "}"; - } - break; - } -} - - -// Class StyledWriter -// ////////////////////////////////////////////////////////////////// - -StyledWriter::StyledWriter() - : rightMargin_( 74 ) - , indentSize_( 3 ) -{ -} - - -std::string -StyledWriter::write( const Value &root ) -{ - document_ = ""; - addChildValues_ = false; - indentString_ = ""; - writeCommentBeforeValue( root ); - writeValue( root ); - writeCommentAfterValueOnSameLine( root ); - document_ += "\n"; - return document_; -} - - -void -StyledWriter::writeValue( const Value &value ) -{ - switch ( value.type() ) - { - case nullValue: - pushValue( "null" ); - break; - case intValue: - pushValue( valueToString( value.asInt() ) ); - break; - case uintValue: - pushValue( valueToString( value.asUInt() ) ); - break; - case realValue: - pushValue( valueToString( value.asDouble() ) ); - break; - case stringValue: - pushValue( valueToQuotedString( value.asCString() ) ); - break; - case booleanValue: - pushValue( valueToString( value.asBool() ) ); - break; - case arrayValue: - writeArrayValue( value); - break; - case objectValue: - { - Value::Members members( value.getMemberNames() ); - if ( members.empty() ) - pushValue( "{}" ); - else - { - writeWithIndent( "{" ); - indent(); - Value::Members::iterator it = members.begin(); - while ( true ) - { - const std::string &name = *it; - const Value &childValue = value[name]; - writeCommentBeforeValue( childValue ); - writeWithIndent( valueToQuotedString( name.c_str() ) ); - document_ += " : "; - writeValue( childValue ); - if ( ++it == members.end() ) - { - writeCommentAfterValueOnSameLine( childValue ); - break; - } - document_ += ","; - writeCommentAfterValueOnSameLine( childValue ); - } - unindent(); - writeWithIndent( "}" ); - } - } - break; - } -} - - -void -StyledWriter::writeArrayValue( const Value &value ) -{ - unsigned size = value.size(); - if ( size == 0 ) - pushValue( "[]" ); - else - { - bool isArrayMultiLine = isMultineArray( value ); - if ( isArrayMultiLine ) - { - writeWithIndent( "[" ); - indent(); - bool hasChildValue = !childValues_.empty(); - unsigned index =0; - while ( true ) - { - const Value &childValue = value[index]; - writeCommentBeforeValue( childValue ); - if ( hasChildValue ) - writeWithIndent( childValues_[index] ); - else - { - writeIndent(); - writeValue( childValue ); - } - if ( ++index == size ) - { - writeCommentAfterValueOnSameLine( childValue ); - break; - } - document_ += ","; - writeCommentAfterValueOnSameLine( childValue ); - } - unindent(); - writeWithIndent( "]" ); - } - else // output on a single line - { - assert( childValues_.size() == size ); - document_ += "[ "; - for ( unsigned index =0; index < size; ++index ) - { - if ( index > 0 ) - document_ += ", "; - document_ += childValues_[index]; - } - document_ += " ]"; - } - } -} - - -bool -StyledWriter::isMultineArray( const Value &value ) -{ - int size = value.size(); - bool isMultiLine = size*3 >= rightMargin_ ; - childValues_.clear(); - for ( int index =0; index < size && !isMultiLine; ++index ) - { - const Value &childValue = value[index]; - isMultiLine = isMultiLine || - ( (childValue.isArray() || childValue.isObject()) && - childValue.size() > 0 ); - } - if ( !isMultiLine ) // check if line length > max line length - { - childValues_.reserve( size ); - addChildValues_ = true; - int lineLength = 4 + (size-1)*2; // '[ ' + ', '*n + ' ]' - for ( int index =0; index < size && !isMultiLine; ++index ) - { - writeValue( value[index] ); - lineLength += int( childValues_[index].length() ); - isMultiLine = isMultiLine && hasCommentForValue( value[index] ); - } - addChildValues_ = false; - isMultiLine = isMultiLine || lineLength >= rightMargin_; - } - return isMultiLine; -} - - -void -StyledWriter::pushValue( const std::string &value ) -{ - if ( addChildValues_ ) - childValues_.push_back( value ); - else - document_ += value; -} - - -void -StyledWriter::writeIndent() -{ - if ( !document_.empty() ) - { - char last = document_[document_.length()-1]; - if ( last == ' ' ) // already indented - return; - if ( last != '\n' ) // Comments may add new-line - document_ += '\n'; - } - document_ += indentString_; -} - - -void -StyledWriter::writeWithIndent( const std::string &value ) -{ - writeIndent(); - document_ += value; -} - - -void -StyledWriter::indent() -{ - indentString_ += std::string( indentSize_, ' ' ); -} - - -void -StyledWriter::unindent() -{ - assert( int(indentString_.size()) >= indentSize_ ); - indentString_.resize( indentString_.size() - indentSize_ ); -} - - -void -StyledWriter::writeCommentBeforeValue( const Value &root ) -{ - if ( !root.hasComment( commentBefore ) ) - return; - document_ += normalizeEOL( root.getComment( commentBefore ) ); - document_ += "\n"; -} - - -void -StyledWriter::writeCommentAfterValueOnSameLine( const Value &root ) -{ - if ( root.hasComment( commentAfterOnSameLine ) ) - document_ += " " + normalizeEOL( root.getComment( commentAfterOnSameLine ) ); - - if ( root.hasComment( commentAfter ) ) - { - document_ += "\n"; - document_ += normalizeEOL( root.getComment( commentAfter ) ); - document_ += "\n"; - } -} - - -bool -StyledWriter::hasCommentForValue( const Value &value ) -{ - return value.hasComment( commentBefore ) - || value.hasComment( commentAfterOnSameLine ) - || value.hasComment( commentAfter ); -} - - -std::string -StyledWriter::normalizeEOL( const std::string &text ) -{ - std::string normalized; - normalized.reserve( text.length() ); - const char *begin = text.c_str(); - const char *end = begin + text.length(); - const char *current = begin; - while ( current != end ) - { - char c = *current++; - if ( c == '\r' ) // mac or dos EOL - { - if ( *current == '\n' ) // convert dos EOL - ++current; - normalized += '\n'; - } - else // handle unix EOL & other char - normalized += c; - } - return normalized; -} - - -// Class StyledStreamWriter -// ////////////////////////////////////////////////////////////////// - -StyledStreamWriter::StyledStreamWriter( std::string indentation ) - : document_(NULL) - , rightMargin_( 74 ) - , indentation_( indentation ) -{ -} - - -void -StyledStreamWriter::write( std::ostream &out, const Value &root ) -{ - document_ = &out; - addChildValues_ = false; - indentString_ = ""; - writeCommentBeforeValue( root ); - writeValue( root ); - writeCommentAfterValueOnSameLine( root ); - *document_ << "\n"; - document_ = NULL; // Forget the stream, for safety. -} - - -void -StyledStreamWriter::writeValue( const Value &value ) -{ - switch ( value.type() ) - { - case nullValue: - pushValue( "null" ); - break; - case intValue: - pushValue( valueToString( value.asInt() ) ); - break; - case uintValue: - pushValue( valueToString( value.asUInt() ) ); - break; - case realValue: - pushValue( valueToString( value.asDouble() ) ); - break; - case stringValue: - pushValue( valueToQuotedString( value.asCString() ) ); - break; - case booleanValue: - pushValue( valueToString( value.asBool() ) ); - break; - case arrayValue: - writeArrayValue( value); - break; - case objectValue: - { - Value::Members members( value.getMemberNames() ); - if ( members.empty() ) - pushValue( "{}" ); - else - { - writeWithIndent( "{" ); - indent(); - Value::Members::iterator it = members.begin(); - while ( true ) - { - const std::string &name = *it; - const Value &childValue = value[name]; - writeCommentBeforeValue( childValue ); - writeWithIndent( valueToQuotedString( name.c_str() ) ); - *document_ << " : "; - writeValue( childValue ); - if ( ++it == members.end() ) - { - writeCommentAfterValueOnSameLine( childValue ); - break; - } - *document_ << ","; - writeCommentAfterValueOnSameLine( childValue ); - } - unindent(); - writeWithIndent( "}" ); - } - } - break; - } -} - - -void -StyledStreamWriter::writeArrayValue( const Value &value ) -{ - unsigned size = value.size(); - if ( size == 0 ) - pushValue( "[]" ); - else - { - bool isArrayMultiLine = isMultineArray( value ); - if ( isArrayMultiLine ) - { - writeWithIndent( "[" ); - indent(); - bool hasChildValue = !childValues_.empty(); - unsigned index =0; - while ( true ) - { - const Value &childValue = value[index]; - writeCommentBeforeValue( childValue ); - if ( hasChildValue ) - writeWithIndent( childValues_[index] ); - else - { - writeIndent(); - writeValue( childValue ); - } - if ( ++index == size ) - { - writeCommentAfterValueOnSameLine( childValue ); - break; - } - *document_ << ","; - writeCommentAfterValueOnSameLine( childValue ); - } - unindent(); - writeWithIndent( "]" ); - } - else // output on a single line - { - assert( childValues_.size() == size ); - *document_ << "[ "; - for ( unsigned index =0; index < size; ++index ) - { - if ( index > 0 ) - *document_ << ", "; - *document_ << childValues_[index]; - } - *document_ << " ]"; - } - } -} - - -bool -StyledStreamWriter::isMultineArray( const Value &value ) -{ - int size = value.size(); - bool isMultiLine = size*3 >= rightMargin_ ; - childValues_.clear(); - for ( int index =0; index < size && !isMultiLine; ++index ) - { - const Value &childValue = value[index]; - isMultiLine = isMultiLine || - ( (childValue.isArray() || childValue.isObject()) && - childValue.size() > 0 ); - } - if ( !isMultiLine ) // check if line length > max line length - { - childValues_.reserve( size ); - addChildValues_ = true; - int lineLength = 4 + (size-1)*2; // '[ ' + ', '*n + ' ]' - for ( int index =0; index < size && !isMultiLine; ++index ) - { - writeValue( value[index] ); - lineLength += int( childValues_[index].length() ); - isMultiLine = isMultiLine && hasCommentForValue( value[index] ); - } - addChildValues_ = false; - isMultiLine = isMultiLine || lineLength >= rightMargin_; - } - return isMultiLine; -} - - -void -StyledStreamWriter::pushValue( const std::string &value ) -{ - if ( addChildValues_ ) - childValues_.push_back( value ); - else - *document_ << value; -} - - -void -StyledStreamWriter::writeIndent() -{ - /* - Some comments in this method would have been nice. ;-) - - if ( !document_.empty() ) - { - char last = document_[document_.length()-1]; - if ( last == ' ' ) // already indented - return; - if ( last != '\n' ) // Comments may add new-line - *document_ << '\n'; - } - */ - *document_ << '\n' << indentString_; -} - - -void -StyledStreamWriter::writeWithIndent( const std::string &value ) -{ - writeIndent(); - *document_ << value; -} - - -void -StyledStreamWriter::indent() -{ - indentString_ += indentation_; -} - - -void -StyledStreamWriter::unindent() -{ - assert( indentString_.size() >= indentation_.size() ); - indentString_.resize( indentString_.size() - indentation_.size() ); -} - - -void -StyledStreamWriter::writeCommentBeforeValue( const Value &root ) -{ - if ( !root.hasComment( commentBefore ) ) - return; - *document_ << normalizeEOL( root.getComment( commentBefore ) ); - *document_ << "\n"; -} - - -void -StyledStreamWriter::writeCommentAfterValueOnSameLine( const Value &root ) -{ - if ( root.hasComment( commentAfterOnSameLine ) ) - *document_ << " " + normalizeEOL( root.getComment( commentAfterOnSameLine ) ); - - if ( root.hasComment( commentAfter ) ) - { - *document_ << "\n"; - *document_ << normalizeEOL( root.getComment( commentAfter ) ); - *document_ << "\n"; - } -} - - -bool -StyledStreamWriter::hasCommentForValue( const Value &value ) -{ - return value.hasComment( commentBefore ) - || value.hasComment( commentAfterOnSameLine ) - || value.hasComment( commentAfter ); -} - - -std::string -StyledStreamWriter::normalizeEOL( const std::string &text ) -{ - std::string normalized; - normalized.reserve( text.length() ); - const char *begin = text.c_str(); - const char *end = begin + text.length(); - const char *current = begin; - while ( current != end ) - { - char c = *current++; - if ( c == '\r' ) // mac or dos EOL - { - if ( *current == '\n' ) // convert dos EOL - ++current; - normalized += '\n'; - } - else // handle unix EOL & other char - normalized += c; - } - return normalized; -} - - -std::ostream& operator<<( std::ostream &sout, const Value &root ) -{ - Json::StyledStreamWriter writer; - writer.write(sout, root); - return sout; -} - - -} // namespace Json diff --git a/cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/public/plugin.cpp b/cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/public/plugin.cpp deleted file mode 100644 index 387fceaf1..000000000 --- a/cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/public/plugin.cpp +++ /dev/null @@ -1,320 +0,0 @@ -#include "plugin.h" -#include "tokenizer.h" - -#ifdef _WINDOWS -#include -BOOL APIENTRY DllMain( HANDLE hModule, - DWORD ul_reason_for_call, - LPVOID lpReserved ) -{ - return TRUE; -} -#else -#include -#include - -extern int errno; -#endif - -SendPluginEv SendPluginEvent; - -string g_GetSysErrMsg( void ) -{ - string strError = "Unknown"; - // Problem loading -#ifdef _WINDOWS - int nErrorCode = GetLastError(); - LPTSTR s; - if ( ::FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, - NULL, nErrorCode, 0, ( LPTSTR ) &s, 0, NULL ) ) - { - strError = s; - } - else - { - char szBuf[ 20 ]; - _snprintf_s( szBuf, _countof(szBuf), 19, "%d", nErrorCode ); - strError = szBuf; - } -#else - char szError[80]; - if ( strerror_r( errno, szError, sizeof(szError) ) ) - { - strError = "no description found"; - } - else - { - strError = szError; - } -#endif - return strError; -} - -void g_sleep( unsigned int mseconds ) -{ -#ifdef _WINDOWS - Sleep( mseconds ); -#else - usleep( mseconds * 1000 ); -#endif -} - -string& g_trim( string& str ) -{ - // Whitespace characters - char whspc[] = " \t\r\n\v\f"; - - // Whack off first part - size_t pos = str.find_first_not_of( whspc ); - - if ( pos != string::npos ) - str.replace( 0, pos, "" ); - - // Whack off trailing stuff - pos = str.find_last_not_of( whspc ); - - if ( pos != string::npos ) - str.replace( pos + 1, str.length() - pos, "" ); - - return str; -} - -void g_tokenize( const string& str, const string& delimiters, vector& tokens ) -{ - tokenize( str, tokens, delimiters ); -} - -char* SetEventFunc( SendPluginEv funcPtr ) -{ - static char * szObjList = onGetObjList(); - SendPluginEvent = funcPtr; - return szObjList; -} - - -const int nMAXSIZE = 512; -char* g_pszRetVal = NULL; - -//----------------------------------------------------------- -// Map from an object Id to an object instance -//----------------------------------------------------------- -typedef std::map StringToJExt_T; - -//----------------------------------------------------------- -// Map from a browser context to an id mapping -//----------------------------------------------------------- -typedef std::map VoidToMap_T; - -VoidToMap_T g_context2Map; - -class GlobalSharedModule -{ - -public: - GlobalSharedModule( void ) - { - g_pszRetVal = new char[ nMAXSIZE ]; - } - - ~GlobalSharedModule() - { - delete [] g_pszRetVal; - - VoidToMap_T::iterator posMaps; - - for ( posMaps = g_context2Map.begin(); posMaps != g_context2Map.end(); ++posMaps ) - { - StringToJExt_T& id2Obj = *posMaps->second; - StringToJExt_T::iterator posMap; - - for ( posMap = id2Obj.begin(); posMap != id2Obj.end(); ++posMap ) - { - JSExt* pJSExt = posMap->second; - - if ( pJSExt->CanDelete() ) - { - delete pJSExt; - } - } - - id2Obj.erase( id2Obj.begin(), id2Obj.end() ); - } - - g_context2Map.erase( g_context2Map.begin(), g_context2Map.end() ); - } -}; - -GlobalSharedModule g_sharedModule; - -char* g_str2global( const string& strRetVal ) -{ - int nLen = strRetVal.size(); - - if ( nLen >= nMAXSIZE ) - { - delete [] g_pszRetVal; - g_pszRetVal = new char[ nLen + 1 ]; - } - - else - { - // To minimize the number of memory reallocations, the assumption - // is that in most times this will be the case - delete [] g_pszRetVal; - g_pszRetVal = new char[ nMAXSIZE ]; - } - - strcpy( g_pszRetVal, strRetVal.c_str() ); - return g_pszRetVal; -} - -bool g_unregisterObject( const string& strObjId, void* pContext ) -{ - // Called by the plugin extension implementation - // if the extension handles the deletion of its object - - StringToJExt_T * pID2Obj = NULL; - - VoidToMap_T::iterator iter = g_context2Map.find( pContext ); - - if ( iter != g_context2Map.end() ) - { - pID2Obj = iter->second; - } - else - { - return false; - } - - StringToJExt_T& mapID2Obj = *pID2Obj; - - StringToJExt_T::iterator r = mapID2Obj.find( strObjId ); - - if ( r == mapID2Obj.end() ) - { - return false; - } - - mapID2Obj.erase( strObjId ); - return true; -} - -char* InvokeFunction( const char* szCommand, void* pContext ) -{ - StringToJExt_T * pID2Obj = NULL; - - VoidToMap_T::iterator iter = g_context2Map.find( pContext ); - - if ( iter != g_context2Map.end() ) - { - pID2Obj = iter->second; - } - else - { - pID2Obj = new StringToJExt_T; - g_context2Map[ pContext ] = pID2Obj; - } - - StringToJExt_T& mapID2Obj = *pID2Obj; - - string strFullCommand = szCommand; - vector arParams; - g_tokenize( strFullCommand, " ", arParams ); - string strCommand = arParams[ 0 ]; - string strRetVal = szERROR; - - if ( strCommand == szCREATE ) - { - string strClassName = arParams[ 1 ]; - string strObjId = arParams[ 2 ]; - - StringToJExt_T::iterator r = mapID2Obj.find( strObjId ); - - if ( r != mapID2Obj.end() ) - { - strRetVal += strObjId; - strRetVal += " :Object already exists."; - return g_str2global( strRetVal ); - } - - JSExt* pJSExt = onCreateObject( strClassName, strObjId ); - - if ( pJSExt == NULL ) - { - strRetVal += strObjId; - strRetVal += " :Unknown object type "; - strRetVal += strClassName; - return g_str2global( strRetVal ); - } - - pJSExt->m_pContext = pContext; - mapID2Obj[ strObjId ] = pJSExt; - - strRetVal = szOK; - strRetVal += strObjId; - return g_str2global( strRetVal ); - } - else - if ( strCommand == szINVOKE ) - { - string strObjId = arParams[ 1 ]; - string strMethod = arParams[ 2 ]; - - StringToJExt_T::iterator r = mapID2Obj.find( strObjId ); - - if ( r == mapID2Obj.end() ) - { - strRetVal += strObjId; - strRetVal += " :No object found for id."; - return g_str2global( strRetVal ); - } - - JSExt* pJSExt = r->second; - - size_t nLoc = strFullCommand.find( strObjId ); - - if ( nLoc == string::npos ) - { - strRetVal += strObjId; - strRetVal += " :Internal InvokeMethod error."; - return g_str2global( strRetVal ); - } - - if ( strMethod == szDISPOSE ) - { - StringToJExt_T::iterator r = mapID2Obj.find( strObjId ); - - if ( r == mapID2Obj.end() ) - { - strRetVal = szERROR; - strRetVal += strObjId; - return g_str2global( strRetVal ); - } - - JSExt * pJSExt = mapID2Obj[ strObjId ]; - - if ( pJSExt->CanDelete() ) - { - delete pJSExt; - } - - mapID2Obj.erase( strObjId ); - strRetVal = szOK; - strRetVal += strObjId; - return g_str2global( strRetVal ); - } - - size_t nSuffixLoc = nLoc + strObjId.size(); - string strInvoke = strFullCommand.substr( nSuffixLoc ); - strInvoke = g_trim( strInvoke ); - strRetVal = pJSExt->InvokeMethod( strInvoke ); - return g_str2global( strRetVal ); - } - - strRetVal += " :Unknown command "; - strRetVal += strCommand; - return g_str2global( strRetVal ); -} - -//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - diff --git a/cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/public/plugin.h b/cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/public/plugin.h deleted file mode 100644 index 4ef711691..000000000 --- a/cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/public/plugin.h +++ /dev/null @@ -1,70 +0,0 @@ -#ifndef _PLUGIN_H -#define _PLUGIN_H - -#include -#include -#include -#include -//#include "tokenizer.h" - -using namespace std; - -//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -//%% Functions exported by this DLL -//%% Should always be only SetEventFunc and InvokeFunction -//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -// g++ requires extern "C" otherwise the names of SetEventFunc and InvokeFunction -// are mangled C++ style. MS Visual Studio doesn't seem to care though. -extern "C" -{ - typedef void (*SendPluginEv)( const char* szEvent, void* pContext ); - char* SetEventFunc(SendPluginEv funcPtr); - char* InvokeFunction( const char* szCommand, void* pContext ); -} - -// JNEXT Framework function of the form: -// typedef void (*SendPluginEv)( const char* szEvent ); -// used to notify JavaScript of an asynchronous event -extern SendPluginEv SendPluginEvent; - -///////////////////////////////////////////////////////////////////////// -// Constants and methods common to all JNEXT extensions types -///////////////////////////////////////////////////////////////////////// -#define szERROR "Error " -#define szOK "Ok " - -#define szDISPOSE "Dispose" -#define szINVOKE "InvokeMethod" -#define szCREATE "CreateObj" - -///////////////////////////////////////////////////////////////////////// -// Utility functions -///////////////////////////////////////////////////////////////////////// -string& g_trim( string& str ); -void g_tokenize(const string& str,const string& delimiters, vector& tokens); -char* g_str2static( const string& strRetVal ); -void g_sleep( unsigned int mseconds ); -bool g_unregisterObject( const string& strObjId, void* pContext ); - - -///////////////////////////////////////////////////////////////////////// -// Abstract extension object -///////////////////////////////////////////////////////////////////////// -class JSExt -{ -public: - virtual ~JSExt() {}; - virtual string InvokeMethod( const string& strCommand ) = 0; - virtual bool CanDelete( void ) = 0; - virtual void TryDelete( void ) {} -public: - void* m_pContext; -}; - -///////////////////////////////////////////////////////////////////////// -// Callback functions to be implemented by the plugin implementation -///////////////////////////////////////////////////////////////////////// -extern char* onGetObjList( void ); -extern JSExt* onCreateObject( const string& strClassName, const string& strObjId ); - -#endif diff --git a/cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/public/tokenizer.cpp b/cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/public/tokenizer.cpp deleted file mode 100644 index 4a39573b9..000000000 --- a/cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/public/tokenizer.cpp +++ /dev/null @@ -1,222 +0,0 @@ -/************************************************************************ -The zlib/libpng License - -Copyright (c) 2006 Joerg Wiedenmann - -This software is provided 'as-is', without any express or implied warranty. -In no event will the authors be held liable for any damages arising from -the use of this software. - -Permission is granted to anyone to use this software for any purpose, -including commercial applications, and to alter it and redistribute it -freely, subject to the following restrictions: - -1. The origin of this software must not be misrepresented; -you must not claim that you wrote the original software. -If you use this software in a product, an acknowledgment -in the product documentation would be appreciated but is -not required. - -2. Altered source versions must be plainly marked as such, -and must not be misrepresented as being the original software. - -3. This notice may not be removed or altered from any source distribution. - -***********************************************************************/ - -/******************************************************************** - created: 2006-01-28 - filename: tokenizer.cpp - author: Jörg Wiedenmann - - purpose: A tokenizer function which provides a very - customizable way of breaking up strings. - - history: 2006-01-28, Original version - 2006-03-04, Fixed a small parsing bug, thanks Elias. -*********************************************************************/ - -#include "tokenizer.h" - -using namespace std; - -void tokenize ( const string& str, vector& result, - const string& delimiters, const string& delimiters_preserve, - const string& quote, const string& esc ) -{ - // clear the vector - if ( false == result.empty() ) - { - result.clear(); - } - - string::size_type pos = 0; // the current position (char) in the string - char ch = 0; // buffer for the current character - char delimiter = 0; // the buffer for the delimiter char which - // will be added to the tokens if the delimiter - // is preserved - char current_quote = 0; // the char of the current open quote - bool quoted = false; // indicator if there is an open quote - string token; // string buffer for the token - bool token_complete = false; // indicates if the current token is - // read to be added to the result vector - string::size_type len = str.length(); // length of the input-string - - // for every char in the input-string - while ( len > pos ) - { - // get the character of the string and reset the delimiter buffer - ch = str.at(pos); - delimiter = 0; - - // assume ch isn't a delimiter - bool add_char = true; - - // check ... - - // ... if the delimiter is an escaped character - bool escaped = false; // indicates if the next char is protected - if ( false == esc.empty() ) // check if esc-chars are provided - { - if ( string::npos != esc.find_first_of(ch) ) - { - // get the escaped char - ++pos; - if ( pos < len ) // if there are more chars left - { - // get the next one - ch = str.at(pos); - - // add the escaped character to the token - add_char = true; - } - else // cannot get any more characters - { - // don't add the esc-char - add_char = false; - } - - // ignore the remaining delimiter checks - escaped = true; - } - } - - // ... if the delimiter is a quote - if ( false == quote.empty() && false == escaped ) - { - // if quote chars are provided and the char isn't protected - if ( string::npos != quote.find_first_of(ch) ) - { - // if not quoted, set state to open quote and set - // the quote character - if ( false == quoted ) - { - quoted = true; - current_quote = ch; - - // don't add the quote-char to the token - add_char = false; - } - else // if quote is open already - { - // check if it is the matching character to close it - if ( current_quote == ch ) - { - // close quote and reset the quote character - quoted = false; - current_quote = 0; - - // don't add the quote-char to the token - add_char = false; - } - } // else - } - } - - // ... if the delimiter isn't preserved - if ( false == delimiters.empty() && false == escaped && - false == quoted ) - { - // if a delimiter is provided and the char isn't protected by - // quote or escape char - if ( string::npos != delimiters.find_first_of(ch) ) - { - // if ch is a delimiter and the token string isn't empty - // the token is complete - if ( false == token.empty() ) // BUGFIX: 2006-03-04 - { - token_complete = true; - } - - // don't add the delimiter to the token - add_char = false; - } - } - - // ... if the delimiter is preserved - add it as a token - bool add_delimiter = false; - if ( false == delimiters_preserve.empty() && false == escaped && - false == quoted ) - { - // if a delimiter which will be preserved is provided and the - // char isn't protected by quote or escape char - if ( string::npos != delimiters_preserve.find_first_of(ch) ) - { - // if ch is a delimiter and the token string isn't empty - // the token is complete - if ( false == token.empty() ) // BUGFIX: 2006-03-04 - { - token_complete = true; - } - - // don't add the delimiter to the token - add_char = false; - - // add the delimiter - delimiter = ch; - add_delimiter = true; - } - } - - - // add the character to the token - if ( true == add_char ) - { - // add the current char - token.push_back( ch ); - } - - // add the token if it is complete - if ( true == token_complete && false == token.empty() ) - { - // add the token string - result.push_back( token ); - - // clear the contents - token.clear(); - - // build the next token - token_complete = false; - } - - // add the delimiter - if ( true == add_delimiter ) - { - // the next token is the delimiter - string delim_token; - delim_token.push_back( delimiter ); - result.push_back( delim_token ); - - // REMOVED: 2006-03-04, Bugfix - } - - // repeat for the next character - ++pos; - } // while - - // add the final token - if ( false == token.empty() ) - { - result.push_back( token ); - } -} diff --git a/cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/public/tokenizer.h b/cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/public/tokenizer.h deleted file mode 100644 index 75f567ceb..000000000 --- a/cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/public/tokenizer.h +++ /dev/null @@ -1,55 +0,0 @@ -/************************************************************************ -The zlib/libpng License - -Copyright (c) 2006 Joerg Wiedenmann - -This software is provided 'as-is', without any express or implied warranty. -In no event will the authors be held liable for any damages arising from -the use of this software. - -Permission is granted to anyone to use this software for any purpose, -including commercial applications, and to alter it and redistribute it -freely, subject to the following restrictions: - -1. The origin of this software must not be misrepresented; - you must not claim that you wrote the original software. - If you use this software in a product, an acknowledgment - in the product documentation would be appreciated but is - not required. - -2. Altered source versions must be plainly marked as such, - and must not be misrepresented as being the original software. - -3. This notice may not be removed or altered from any source distribution. - -***********************************************************************/ - -/******************************************************************** - created: 2006-01-28 - filename: tokenizer.cpp - author: Jörg Wiedenmann - - purpose: A tokenizer function which provides a very - customizable way of breaking up strings. -*********************************************************************/ - -#include -#include -using namespace std; - -// Function to break up a string into tokens -// -// Parameters: -//----------- -// str = the input string that will be tokenized -// result = the tokens for str -// delimiters = the delimiter characters -// delimiters preserve = same as above, but the delimiter characters -// will be put into the result as a token -// quote = characters to protect the enclosed characters -// esc = characters to protect a single character -// - -void tokenize ( const string& str, vector& result, - const string& delimiters, const string& delimiters_preserve = "", - const string& quote = "\"", const string& esc = "\\" ); diff --git a/cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/simulator/echoJnext.so b/cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/simulator/echoJnext.so deleted file mode 100644 index 2b3c5f5486d29871ad41fce91cbdcdf5c9347bec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 231778 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 z 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 KM{=zB2>c(tnf}B8 diff --git a/cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/src/echo.cpp b/cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/src/echo.cpp deleted file mode 100644 index 0d5cc2f85..000000000 --- a/cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/src/echo.cpp +++ /dev/null @@ -1,121 +0,0 @@ -/* - * - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - * -*/ - - -#include <../public/json/reader.h> -#include -#include -#include -#include -#include -#include -#include "echo.hpp" - -using namespace std; - -/** - * Default constructor. - */ -Echo::Echo(const std::string& id) : m_id(id) { -} - -/** - * Memory destructor. - */ -Echo::~Echo() { -} - -/** - * This method returns the list of objects implemented by this native - * extension. - */ -char* onGetObjList() { - static char name[] = "Echo"; - return name; -} - -/** - * This method is used by JNext to instantiate the Memory object when - * an object is created on the JavaScript server side. - */ -JSExt* onCreateObject(const string& className, const string& id) { - if (className == "Echo") { - return new Echo(id); - } - - return NULL; -} - -/** - * Method used by JNext to determine if the object can be deleted. - */ -bool Echo::CanDelete() { - return true; -} - -/** - * It will be called from JNext JavaScript side with passed string. - * This method implements the interface for the JavaScript to native binding - * for invoking native code. This method is triggered when JNext.invoke is - * called on the JavaScript side with this native objects id. - */ -string Echo::InvokeMethod(const string& command) { - int index = command.find_first_of(" "); - std::string method = command.substr(0, index); - - // read in arguments - Json::Value obj; - if (static_cast(command.length()) > index && index != -1) { - std::string jsonObject = command.substr(index + 1, command.length()); - Json::Reader reader; - - bool parse = reader.parse(jsonObject, obj); - if (!parse) { - fprintf(stderr, "%s", "error parsing\n"); - return "Cannot parse JSON object"; - } - } - - // Determine which function should be executed - if (method == "doEcho") { - std::string message = obj["message"].asString(); - if(message.length() > 0) { - return doEcho(message); - }else{ - return doEcho("Nothing to echo."); - } - }else{ - return doEcho("Unsupported Method"); - } -} - -/** - * Method that sends off Event message - */ -string Echo::doEcho(const std::string& message) { - std::string eventString = m_id; - eventString.append(" "); - eventString.append("cordova.echo.callback"); - eventString.append(" "); - eventString.append(message); - SendPluginEvent(eventString.c_str(), m_pContext); - return eventString; -} diff --git a/cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/src/echo.hpp b/cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/src/echo.hpp deleted file mode 100644 index 408be6964..000000000 --- a/cordova-lib/spec-plugman-install/plugins/cordova.echo/src/blackberry10/native/src/echo.hpp +++ /dev/null @@ -1,45 +0,0 @@ -/* - * - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - * -*/ - -#ifndef ECHO_HPP_ -#define ECHO_HPP_ - -#include -#include -#include "../public/plugin.h" - -class Echo: public JSExt { - -public: - explicit Echo(const std::string& id); - virtual ~Echo(); - -// Interfaces of JSExt - virtual bool CanDelete(); - virtual std::string InvokeMethod(const std::string& command); - -private: - std::string doEcho(const std::string& message); - - std::string m_id; -}; - -#endif /* ECHO_HPP_ */ diff --git a/cordova-lib/spec-plugman-install/plugins/cordova.echo/www/client.js b/cordova-lib/spec-plugman-install/plugins/cordova.echo/www/client.js deleted file mode 100644 index 4e7a1b3ce..000000000 --- a/cordova-lib/spec-plugman-install/plugins/cordova.echo/www/client.js +++ /dev/null @@ -1,53 +0,0 @@ -/* - * - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - * -*/ - -var _self = {}, - _ID = require("./manifest.json").namespace, - win = null, - fail = null; - -function handleCallback(result) { - if (result) { - if(win){ - win(result); - } - } else { - if(fail){ - fail(result); - } - } - win = null; - fail = null; -} - -_self.doEcho = function (args, theWin, theFail) { - var data = { "message" : args.message || "" }; - - win = theWin; - fail = theFail; - - window.webworks.event.add(_ID, "echoCallback", handleCallback); - - return window.webworks.execSync(_ID, "doEcho", data); -}; - - -module.exports = _self; diff --git a/cordova-lib/spec-plugman-install/plugins/dependencies/A/plugin.xml b/cordova-lib/spec-plugman-install/plugins/dependencies/A/plugin.xml deleted file mode 100644 index ec83e8c2f..000000000 --- a/cordova-lib/spec-plugman-install/plugins/dependencies/A/plugin.xml +++ /dev/null @@ -1,60 +0,0 @@ - - - - - - Plugin A - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/cordova-lib/spec-plugman-install/plugins/dependencies/A/src/android/A.java b/cordova-lib/spec-plugman-install/plugins/dependencies/A/src/android/A.java deleted file mode 100644 index e69de29bb..000000000 diff --git a/cordova-lib/spec-plugman-install/plugins/dependencies/A/src/ios/APluginCommand.h b/cordova-lib/spec-plugman-install/plugins/dependencies/A/src/ios/APluginCommand.h deleted file mode 100644 index e69de29bb..000000000 diff --git a/cordova-lib/spec-plugman-install/plugins/dependencies/A/src/ios/APluginCommand.m b/cordova-lib/spec-plugman-install/plugins/dependencies/A/src/ios/APluginCommand.m deleted file mode 100644 index e69de29bb..000000000 diff --git a/cordova-lib/spec-plugman-install/plugins/dependencies/A/www/plugin-a.js b/cordova-lib/spec-plugman-install/plugins/dependencies/A/www/plugin-a.js deleted file mode 100644 index e69de29bb..000000000 diff --git a/cordova-lib/spec-plugman-install/plugins/dependencies/B/plugin.xml b/cordova-lib/spec-plugman-install/plugins/dependencies/B/plugin.xml deleted file mode 100644 index ee32e2d46..000000000 --- a/cordova-lib/spec-plugman-install/plugins/dependencies/B/plugin.xml +++ /dev/null @@ -1,60 +0,0 @@ - - - - - - Plugin B - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/cordova-lib/spec-plugman-install/plugins/dependencies/B/src/android/B.java b/cordova-lib/spec-plugman-install/plugins/dependencies/B/src/android/B.java deleted file mode 100644 index e69de29bb..000000000 diff --git a/cordova-lib/spec-plugman-install/plugins/dependencies/B/src/ios/BPluginCommand.h b/cordova-lib/spec-plugman-install/plugins/dependencies/B/src/ios/BPluginCommand.h deleted file mode 100644 index e69de29bb..000000000 diff --git a/cordova-lib/spec-plugman-install/plugins/dependencies/B/src/ios/BPluginCommand.m b/cordova-lib/spec-plugman-install/plugins/dependencies/B/src/ios/BPluginCommand.m deleted file mode 100644 index e69de29bb..000000000 diff --git a/cordova-lib/spec-plugman-install/plugins/dependencies/B/www/plugin-b.js b/cordova-lib/spec-plugman-install/plugins/dependencies/B/www/plugin-b.js deleted file mode 100644 index e69de29bb..000000000 diff --git a/cordova-lib/spec-plugman-install/plugins/dependencies/C/plugin.xml b/cordova-lib/spec-plugman-install/plugins/dependencies/C/plugin.xml deleted file mode 100644 index 88c2d2cdb..000000000 --- a/cordova-lib/spec-plugman-install/plugins/dependencies/C/plugin.xml +++ /dev/null @@ -1,57 +0,0 @@ - - - - - - Plugin C - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/cordova-lib/spec-plugman-install/plugins/dependencies/C/src/android/C.java b/cordova-lib/spec-plugman-install/plugins/dependencies/C/src/android/C.java deleted file mode 100644 index e69de29bb..000000000 diff --git a/cordova-lib/spec-plugman-install/plugins/dependencies/C/src/ios/CPluginCommand.h b/cordova-lib/spec-plugman-install/plugins/dependencies/C/src/ios/CPluginCommand.h deleted file mode 100644 index e69de29bb..000000000 diff --git a/cordova-lib/spec-plugman-install/plugins/dependencies/C/src/ios/CPluginCommand.m b/cordova-lib/spec-plugman-install/plugins/dependencies/C/src/ios/CPluginCommand.m deleted file mode 100644 index e69de29bb..000000000 diff --git a/cordova-lib/spec-plugman-install/plugins/dependencies/C/www/plugin-c.js b/cordova-lib/spec-plugman-install/plugins/dependencies/C/www/plugin-c.js deleted file mode 100644 index e69de29bb..000000000 diff --git a/cordova-lib/spec-plugman-install/plugins/dependencies/D/plugin.xml b/cordova-lib/spec-plugman-install/plugins/dependencies/D/plugin.xml deleted file mode 100644 index f07b06377..000000000 --- a/cordova-lib/spec-plugman-install/plugins/dependencies/D/plugin.xml +++ /dev/null @@ -1,57 +0,0 @@ - - - - - - Plugin D - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/cordova-lib/spec-plugman-install/plugins/dependencies/D/src/android/D.java b/cordova-lib/spec-plugman-install/plugins/dependencies/D/src/android/D.java deleted file mode 100644 index e69de29bb..000000000 diff --git a/cordova-lib/spec-plugman-install/plugins/dependencies/D/src/ios/DPluginCommand.h b/cordova-lib/spec-plugman-install/plugins/dependencies/D/src/ios/DPluginCommand.h deleted file mode 100644 index e69de29bb..000000000 diff --git a/cordova-lib/spec-plugman-install/plugins/dependencies/D/src/ios/DPluginCommand.m b/cordova-lib/spec-plugman-install/plugins/dependencies/D/src/ios/DPluginCommand.m deleted file mode 100644 index e69de29bb..000000000 diff --git a/cordova-lib/spec-plugman-install/plugins/dependencies/D/www/plugin-d.js b/cordova-lib/spec-plugman-install/plugins/dependencies/D/www/plugin-d.js deleted file mode 100644 index e69de29bb..000000000 diff --git a/cordova-lib/spec-plugman-install/plugins/dependencies/E/plugin.xml b/cordova-lib/spec-plugman-install/plugins/dependencies/E/plugin.xml deleted file mode 100644 index bb28fa12d..000000000 --- a/cordova-lib/spec-plugman-install/plugins/dependencies/E/plugin.xml +++ /dev/null @@ -1,59 +0,0 @@ - - - - - - Plugin E - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/cordova-lib/spec-plugman-install/plugins/dependencies/E/src/android/E.java b/cordova-lib/spec-plugman-install/plugins/dependencies/E/src/android/E.java deleted file mode 100644 index e69de29bb..000000000 diff --git a/cordova-lib/spec-plugman-install/plugins/dependencies/E/src/ios/EPluginCommand.h b/cordova-lib/spec-plugman-install/plugins/dependencies/E/src/ios/EPluginCommand.h deleted file mode 100644 index e69de29bb..000000000 diff --git a/cordova-lib/spec-plugman-install/plugins/dependencies/E/src/ios/EPluginCommand.m b/cordova-lib/spec-plugman-install/plugins/dependencies/E/src/ios/EPluginCommand.m deleted file mode 100644 index e69de29bb..000000000 diff --git a/cordova-lib/spec-plugman-install/plugins/dependencies/E/www/plugin-d.js b/cordova-lib/spec-plugman-install/plugins/dependencies/E/www/plugin-d.js deleted file mode 100644 index e69de29bb..000000000 diff --git a/cordova-lib/spec-plugman-install/plugins/dependencies/F/plugin.xml b/cordova-lib/spec-plugman-install/plugins/dependencies/F/plugin.xml deleted file mode 100644 index 86869bab4..000000000 --- a/cordova-lib/spec-plugman-install/plugins/dependencies/F/plugin.xml +++ /dev/null @@ -1,60 +0,0 @@ - - - - - - Plugin F - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/cordova-lib/spec-plugman-install/plugins/dependencies/F/src/android/F.java b/cordova-lib/spec-plugman-install/plugins/dependencies/F/src/android/F.java deleted file mode 100644 index e69de29bb..000000000 diff --git a/cordova-lib/spec-plugman-install/plugins/dependencies/F/src/ios/FPluginCommand.h b/cordova-lib/spec-plugman-install/plugins/dependencies/F/src/ios/FPluginCommand.h deleted file mode 100644 index e69de29bb..000000000 diff --git a/cordova-lib/spec-plugman-install/plugins/dependencies/F/src/ios/FPluginCommand.m b/cordova-lib/spec-plugman-install/plugins/dependencies/F/src/ios/FPluginCommand.m deleted file mode 100644 index e69de29bb..000000000 diff --git a/cordova-lib/spec-plugman-install/plugins/dependencies/F/www/plugin-f.js b/cordova-lib/spec-plugman-install/plugins/dependencies/F/www/plugin-f.js deleted file mode 100644 index e69de29bb..000000000 diff --git a/cordova-lib/spec-plugman-install/plugins/dependencies/G/plugin.xml b/cordova-lib/spec-plugman-install/plugins/dependencies/G/plugin.xml deleted file mode 100644 index 0e365daf6..000000000 --- a/cordova-lib/spec-plugman-install/plugins/dependencies/G/plugin.xml +++ /dev/null @@ -1,59 +0,0 @@ - - - - - - Plugin G - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/cordova-lib/spec-plugman-install/plugins/dependencies/G/src/android/G.java b/cordova-lib/spec-plugman-install/plugins/dependencies/G/src/android/G.java deleted file mode 100644 index e69de29bb..000000000 diff --git a/cordova-lib/spec-plugman-install/plugins/dependencies/G/src/ios/EPluginCommand.m b/cordova-lib/spec-plugman-install/plugins/dependencies/G/src/ios/EPluginCommand.m deleted file mode 100644 index e69de29bb..000000000 diff --git a/cordova-lib/spec-plugman-install/plugins/dependencies/G/src/ios/GPluginCommand.h b/cordova-lib/spec-plugman-install/plugins/dependencies/G/src/ios/GPluginCommand.h deleted file mode 100644 index e69de29bb..000000000 diff --git a/cordova-lib/spec-plugman-install/plugins/dependencies/G/www/plugin-g.js b/cordova-lib/spec-plugman-install/plugins/dependencies/G/www/plugin-g.js deleted file mode 100644 index e69de29bb..000000000 diff --git a/cordova-lib/spec-plugman-install/plugins/dependencies/H/plugin.xml b/cordova-lib/spec-plugman-install/plugins/dependencies/H/plugin.xml deleted file mode 100644 index e72a19a06..000000000 --- a/cordova-lib/spec-plugman-install/plugins/dependencies/H/plugin.xml +++ /dev/null @@ -1,59 +0,0 @@ - - - - - - Plugin H - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/cordova-lib/spec-plugman-install/plugins/dependencies/H/src/android/H.java b/cordova-lib/spec-plugman-install/plugins/dependencies/H/src/android/H.java deleted file mode 100644 index e69de29bb..000000000 diff --git a/cordova-lib/spec-plugman-install/plugins/dependencies/H/src/ios/HPluginCommand.h b/cordova-lib/spec-plugman-install/plugins/dependencies/H/src/ios/HPluginCommand.h deleted file mode 100644 index e69de29bb..000000000 diff --git a/cordova-lib/spec-plugman-install/plugins/dependencies/H/src/ios/HPluginCommand.m b/cordova-lib/spec-plugman-install/plugins/dependencies/H/src/ios/HPluginCommand.m deleted file mode 100644 index e69de29bb..000000000 diff --git a/cordova-lib/spec-plugman-install/plugins/dependencies/H/www/plugin-h.js b/cordova-lib/spec-plugman-install/plugins/dependencies/H/www/plugin-h.js deleted file mode 100644 index e69de29bb..000000000 diff --git a/cordova-lib/spec-plugman-install/plugins/dependencies/README.md b/cordova-lib/spec-plugman-install/plugins/dependencies/README.md deleted file mode 100644 index 0955be526..000000000 --- a/cordova-lib/spec-plugman-install/plugins/dependencies/README.md +++ /dev/null @@ -1,10 +0,0 @@ -Here's a general overview of how the plugins in this directory are dependent on each other: - - F - / \ - A \ B - / \ \ / \ - C '---D--' E - - - G <-> H diff --git a/cordova-lib/spec-plugman-install/plugins/dependencies/meta/D/plugin.xml b/cordova-lib/spec-plugman-install/plugins/dependencies/meta/D/plugin.xml deleted file mode 100644 index 941bd5755..000000000 --- a/cordova-lib/spec-plugman-install/plugins/dependencies/meta/D/plugin.xml +++ /dev/null @@ -1,61 +0,0 @@ - - - - - - Plugin D - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/cordova-lib/spec-plugman-install/plugins/dependencies/meta/D/src/android/D.java b/cordova-lib/spec-plugman-install/plugins/dependencies/meta/D/src/android/D.java deleted file mode 100644 index e69de29bb..000000000 diff --git a/cordova-lib/spec-plugman-install/plugins/dependencies/meta/D/src/ios/DPluginCommand.h b/cordova-lib/spec-plugman-install/plugins/dependencies/meta/D/src/ios/DPluginCommand.h deleted file mode 100644 index e69de29bb..000000000 diff --git a/cordova-lib/spec-plugman-install/plugins/dependencies/meta/D/src/ios/DPluginCommand.m b/cordova-lib/spec-plugman-install/plugins/dependencies/meta/D/src/ios/DPluginCommand.m deleted file mode 100644 index e69de29bb..000000000 diff --git a/cordova-lib/spec-plugman-install/plugins/dependencies/meta/D/www/plugin-d.js b/cordova-lib/spec-plugman-install/plugins/dependencies/meta/D/www/plugin-d.js deleted file mode 100644 index e69de29bb..000000000 diff --git a/cordova-lib/spec-plugman-install/plugins/dependencies/meta/subdir/E/plugin.xml b/cordova-lib/spec-plugman-install/plugins/dependencies/meta/subdir/E/plugin.xml deleted file mode 100644 index 57d96d9ed..000000000 --- a/cordova-lib/spec-plugman-install/plugins/dependencies/meta/subdir/E/plugin.xml +++ /dev/null @@ -1,57 +0,0 @@ - - - - - - Plugin E - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/cordova-lib/spec-plugman-install/plugins/dependencies/meta/subdir/E/src/android/E.java b/cordova-lib/spec-plugman-install/plugins/dependencies/meta/subdir/E/src/android/E.java deleted file mode 100644 index e69de29bb..000000000 diff --git a/cordova-lib/spec-plugman-install/plugins/dependencies/meta/subdir/E/src/ios/EPluginCommand.h b/cordova-lib/spec-plugman-install/plugins/dependencies/meta/subdir/E/src/ios/EPluginCommand.h deleted file mode 100644 index e69de29bb..000000000 diff --git a/cordova-lib/spec-plugman-install/plugins/dependencies/meta/subdir/E/src/ios/EPluginCommand.m b/cordova-lib/spec-plugman-install/plugins/dependencies/meta/subdir/E/src/ios/EPluginCommand.m deleted file mode 100644 index e69de29bb..000000000 diff --git a/cordova-lib/spec-plugman-install/plugins/dependencies/meta/subdir/E/www/plugin-e.js b/cordova-lib/spec-plugman-install/plugins/dependencies/meta/subdir/E/www/plugin-e.js deleted file mode 100644 index e69de29bb..000000000 diff --git a/cordova-lib/spec-plugman-install/plugins/dependencies/subdir/E/plugin.xml b/cordova-lib/spec-plugman-install/plugins/dependencies/subdir/E/plugin.xml deleted file mode 100644 index 57d96d9ed..000000000 --- a/cordova-lib/spec-plugman-install/plugins/dependencies/subdir/E/plugin.xml +++ /dev/null @@ -1,57 +0,0 @@ - - - - - - Plugin E - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/cordova-lib/spec-plugman-install/plugins/dependencies/subdir/E/src/android/E.java b/cordova-lib/spec-plugman-install/plugins/dependencies/subdir/E/src/android/E.java deleted file mode 100644 index e69de29bb..000000000 diff --git a/cordova-lib/spec-plugman-install/plugins/dependencies/subdir/E/src/ios/EPluginCommand.h b/cordova-lib/spec-plugman-install/plugins/dependencies/subdir/E/src/ios/EPluginCommand.h deleted file mode 100644 index e69de29bb..000000000 diff --git a/cordova-lib/spec-plugman-install/plugins/dependencies/subdir/E/src/ios/EPluginCommand.m b/cordova-lib/spec-plugman-install/plugins/dependencies/subdir/E/src/ios/EPluginCommand.m deleted file mode 100644 index e69de29bb..000000000 diff --git a/cordova-lib/spec-plugman-install/plugins/dependencies/subdir/E/www/plugin-e.js b/cordova-lib/spec-plugman-install/plugins/dependencies/subdir/E/www/plugin-e.js deleted file mode 100644 index e69de29bb..000000000 diff --git a/cordova-lib/spec-plugman-install/plugins/multiple-children/plugin.xml b/cordova-lib/spec-plugman-install/plugins/multiple-children/plugin.xml deleted file mode 100644 index fd10a04d5..000000000 --- a/cordova-lib/spec-plugman-install/plugins/multiple-children/plugin.xml +++ /dev/null @@ -1,108 +0,0 @@ - - - - - - Pushwoosh - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/cordova-lib/spec-plugman-install/plugins/shared-deps-multi-child/plugin.xml b/cordova-lib/spec-plugman-install/plugins/shared-deps-multi-child/plugin.xml deleted file mode 100644 index 6c1747693..000000000 --- a/cordova-lib/spec-plugman-install/plugins/shared-deps-multi-child/plugin.xml +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - Sharing Dependencies with the Multi-Child Plugin, woo - - - - - - - - diff --git a/cordova-lib/spec-plugman-install/projects/android_two/AndroidManifest.xml b/cordova-lib/spec-plugman-install/projects/android_two/AndroidManifest.xml deleted file mode 100644 index 0c528031c..000000000 --- a/cordova-lib/spec-plugman-install/projects/android_two/AndroidManifest.xml +++ /dev/null @@ -1,69 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/cordova-lib/spec-plugman-install/projects/android_two/res/xml/config.xml b/cordova-lib/spec-plugman-install/projects/android_two/res/xml/config.xml deleted file mode 100644 index d37aba5cd..000000000 --- a/cordova-lib/spec-plugman-install/projects/android_two/res/xml/config.xml +++ /dev/null @@ -1,54 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/cordova-lib/spec-plugman-install/projects/android_two_no_perms/assets/www/.gitkeep b/cordova-lib/spec-plugman-install/projects/android_two_no_perms/assets/www/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/cordova-lib/spec-plugman-install/projects/android_two_no_perms/res/xml/config.xml b/cordova-lib/spec-plugman-install/projects/android_two_no_perms/res/xml/config.xml deleted file mode 100644 index d37aba5cd..000000000 --- a/cordova-lib/spec-plugman-install/projects/android_two_no_perms/res/xml/config.xml +++ /dev/null @@ -1,54 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/cordova-lib/spec-plugman-install/projects/android_two_no_perms/src/.gitkeep b/cordova-lib/spec-plugman-install/projects/android_two_no_perms/src/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/cordova-lib/spec-plugman-install/projects/blackberry10/native/device/chrome/.gitkeep b/cordova-lib/spec-plugman-install/projects/blackberry10/native/device/chrome/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/cordova-lib/spec-plugman-install/projects/blackberry10/native/simulator/chrome/.gitkeep b/cordova-lib/spec-plugman-install/projects/blackberry10/native/simulator/chrome/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/cordova-lib/spec-plugman-install/projects/ios-config-xml/www/.gitkeep b/cordova-lib/spec-plugman-install/projects/ios-config-xml/www/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/cordova-lib/spec-plugman-install/projects/ios-plist/www/.gitkeep b/cordova-lib/spec-plugman-install/projects/ios-plist/www/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/cordova-lib/spec-plugman-install/projects/multiple-children/AndroidManifest.xml b/cordova-lib/spec-plugman-install/projects/multiple-children/AndroidManifest.xml deleted file mode 100644 index 0c528031c..000000000 --- a/cordova-lib/spec-plugman-install/projects/multiple-children/AndroidManifest.xml +++ /dev/null @@ -1,69 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/cordova-lib/spec-plugman-install/projects/windows8/www/css/index.css b/cordova-lib/spec-plugman-install/projects/windows8/www/css/index.css deleted file mode 100644 index 51daa797c..000000000 --- a/cordova-lib/spec-plugman-install/projects/windows8/www/css/index.css +++ /dev/null @@ -1,115 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -* { - -webkit-tap-highlight-color: rgba(0,0,0,0); /* make transparent link selection, adjust last value opacity 0 to 1.0 */ -} - -body { - -webkit-touch-callout: none; /* prevent callout to copy image, etc when tap to hold */ - -webkit-text-size-adjust: none; /* prevent webkit from resizing text to fit */ - -webkit-user-select: none; /* prevent copy paste, to allow, change 'none' to 'text' */ - background-color:#E4E4E4; - background-image:linear-gradient(top, #A7A7A7 0%, #E4E4E4 51%); - background-image:-webkit-linear-gradient(top, #A7A7A7 0%, #E4E4E4 51%); - background-image:-ms-linear-gradient(top, #A7A7A7 0%, #E4E4E4 51%); - background-image:-webkit-gradient( - linear, - left top, - left bottom, - color-stop(0, #A7A7A7), - color-stop(0.51, #E4E4E4) - ); - background-attachment:fixed; - font-family:'HelveticaNeue-Light', 'HelveticaNeue', Helvetica, Arial, sans-serif; - font-size:12px; - height:100%; - margin:0px; - padding:0px; - text-transform:uppercase; - width:100%; -} - -/* Portrait layout (default) */ -.app { - background:url(../img/logo.png) no-repeat center top; /* 170px x 200px */ - position:absolute; /* position in the center of the screen */ - left:50%; - top:50%; - height:50px; /* text area height */ - width:225px; /* text area width */ - text-align:center; - padding:180px 0px 0px 0px; /* image height is 200px (bottom 20px are overlapped with text) */ - margin:-115px 0px 0px -112px; /* offset vertical: half of image height and text area height */ - /* offset horizontal: half of text area width */ -} - -/* Landscape layout (with min-width) */ -@media screen and (min-aspect-ratio: 1/1) and (min-width:400px) { - .app { - background-position:left center; - padding:75px 0px 75px 170px; /* padding-top + padding-bottom + text area = image height */ - margin:-90px 0px 0px -198px; /* offset vertical: half of image height */ - /* offset horizontal: half of image width and text area width */ - } -} - -h1 { - font-size:24px; - font-weight:normal; - margin:0px; - overflow:visible; - padding:0px; - text-align:center; -} - -.event { - border-radius:4px; - -webkit-border-radius:4px; - color:#FFFFFF; - font-size:12px; - margin:0px 30px; - padding:2px 0px; -} - -.event.listening { - background-color:#333333; - display:block; -} - -.event.received { - background-color:#4B946A; - display:none; -} - -@keyframes fade { - from { opacity: 1.0; } - 50% { opacity: 0.4; } - to { opacity: 1.0; } -} - -@-webkit-keyframes fade { - from { opacity: 1.0; } - 50% { opacity: 0.4; } - to { opacity: 1.0; } -} - -.blink { - animation:fade 3000ms infinite; - -webkit-animation:fade 3000ms infinite; -} diff --git a/cordova-lib/spec-plugman-install/projects/www-only/.gitkeep b/cordova-lib/spec-plugman-install/projects/www-only/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/cordova-lib/spec-plugman-install/uninstall.spec.js b/cordova-lib/spec-plugman-install/uninstall.spec.js index 4efa79547..9a3bae298 100644 --- a/cordova-lib/spec-plugman-install/uninstall.spec.js +++ b/cordova-lib/spec-plugman-install/uninstall.spec.js @@ -29,11 +29,11 @@ var uninstall = require('../src/plugman/install/uninstall'), Q = require('q'), spec = __dirname, done = false, - srcProject = path.join(spec, 'projects', 'android_uninstall'), - project = path.join(spec, 'projects', 'android_uninstall.test'), - project2 = path.join(spec, 'projects', 'android_uninstall.test2'), + srcProject = path.join(spec, '..', 'fixtures-plugman', 'projects', 'android_uninstall'), + project = path.join(spec, '..', 'fixtures-plugman', 'projects', 'android_uninstall.test'), + project2 = path.join(spec, '..', 'fixtures-plugman', 'projects', 'android_uninstall.test2'), - plugins_dir = path.join(spec, 'plugins'), + plugins_dir = path.join(spec, '..', 'fixtures-plugman', 'plugins'), plugins_install_dir = path.join(project, 'cordova', 'plugins'), plugins_install_dir2 = path.join(project2, 'cordova', 'plugins'), diff --git a/cordova-lib/spec-plugman/platforms/amazon-fireos.spec.js b/cordova-lib/spec-plugman/platforms/amazon-fireos.spec.js index a2fdbf46e..9d0d73d9e 100644 --- a/cordova-lib/spec-plugman/platforms/amazon-fireos.spec.js +++ b/cordova-lib/spec-plugman/platforms/amazon-fireos.spec.js @@ -28,11 +28,11 @@ var amazon_fireos = require('../../src/plugman/platforms/amazon-fireos'), plugins_dir = path.join(temp, 'cordova', 'plugins'), xml_helpers = require('../../src/util/xml-helpers'), plugins_module = require('../../src/plugman/util/plugins'), - dummyplugin = path.join(__dirname, '..', 'plugins', 'DummyPlugin'), - faultyplugin = path.join(__dirname, '..', 'plugins', 'FaultyPlugin'), - variableplugin = path.join(__dirname, '..', 'plugins', 'VariablePlugin'), - amazon_fireos_one_project = path.join(__dirname, '..', 'projects', 'android_one', '*'), - amazon_fireos_two_project = path.join(__dirname, '..', 'projects', 'android_two', '*'); + dummyplugin = path.join(__dirname, '..', '..', 'fixtures-plugman', 'plugins', 'DummyPlugin'), + faultyplugin = path.join(__dirname, '..', '..', 'fixtures-plugman', 'plugins', 'FaultyPlugin'), + variableplugin = path.join(__dirname, '..', '..', 'fixtures-plugman', 'plugins', 'VariablePlugin'), + amazon_fireos_one_project = path.join(__dirname, '..', 'fixtures-plugman', '..', 'projects', 'android_one', '*'), + amazon_fireos_two_project = path.join(__dirname, '..', 'fixtures-plugman', '..', 'projects', 'android_two', '*'); var xml_path = path.join(dummyplugin, 'plugin.xml') , xml_text = fs.readFileSync(xml_path, 'utf-8') diff --git a/cordova-lib/spec-plugman/platforms/android.spec.js b/cordova-lib/spec-plugman/platforms/android.spec.js index dc7801ae2..d82832c9e 100644 --- a/cordova-lib/spec-plugman/platforms/android.spec.js +++ b/cordova-lib/spec-plugman/platforms/android.spec.js @@ -30,11 +30,11 @@ var android = require('../../src/plugman/platforms/android'), plugins_dir = path.join(temp, 'cordova', 'plugins'), xml_helpers = require('../../src/util/xml-helpers'), plugins_module = require('../../src/plugman/util/plugins'), - dummyplugin = path.join(__dirname, '..', 'plugins', 'DummyPlugin'), - faultyplugin = path.join(__dirname, '..', 'plugins', 'FaultyPlugin'), - variableplugin = path.join(__dirname, '..', 'plugins', 'VariablePlugin'), - android_one_project = path.join(__dirname, '..', 'projects', 'android_one', '*'), - android_two_project = path.join(__dirname, '..', 'projects', 'android_two', '*'); + dummyplugin = path.join(__dirname, '..', '..', 'fixtures-plugman', 'plugins', 'DummyPlugin'), + faultyplugin = path.join(__dirname, '..', '..', 'fixtures-plugman', 'plugins', 'FaultyPlugin'), + variableplugin = path.join(__dirname, '..', '..', 'fixtures-plugman', 'plugins', 'VariablePlugin'), + android_one_project = path.join(__dirname, '..', '..', 'fixtures-plugman', 'projects', 'android_one', '*'), + android_two_project = path.join(__dirname, '..', '..', 'fixtures-plugman', 'projects', 'android_two', '*'); var xml_path = path.join(dummyplugin, 'plugin.xml') , xml_text = fs.readFileSync(xml_path, 'utf-8') diff --git a/cordova-lib/spec-plugman/platforms/blackberry10.spec.js b/cordova-lib/spec-plugman/platforms/blackberry10.spec.js index 9a4121263..ab7e41f42 100644 --- a/cordova-lib/spec-plugman/platforms/blackberry10.spec.js +++ b/cordova-lib/spec-plugman/platforms/blackberry10.spec.js @@ -28,11 +28,11 @@ var blackberry10 = require('../../src/plugman/platforms/blackberry10'), plugins_dir = path.join(temp, 'cordova', 'plugins'), xml_helpers = require('../../src/util/xml-helpers'), plugins_module = require('../../src/plugman/util/plugins'), - blackberry10_project = path.join(__dirname, '..', 'projects', 'blackberry10', '*'), + blackberry10_project = path.join(__dirname, '..', '..', 'fixtures-plugman', 'projects', 'blackberry10', '*'), plugins = { - dummy: parsePlugin(path.join(__dirname, '..', 'plugins', 'DummyPlugin')), - faulty: parsePlugin(path.join(__dirname, '..', 'plugins', 'FaultyPlugin')), - echo: parsePlugin(path.join(__dirname, '..', 'plugins', 'cordova.echo')) + dummy: parsePlugin(path.join(__dirname, '..', '..', 'fixtures-plugman', 'plugins', 'DummyPlugin')), + faulty: parsePlugin(path.join(__dirname, '..', '..', 'fixtures-plugman', 'plugins', 'FaultyPlugin')), + echo: parsePlugin(path.join(__dirname, '..', '..', 'fixtures-plugman', 'plugins', 'cordova.echo')) }; function copyArray(arr) { diff --git a/cordova-lib/spec-plugman/platforms/ios.spec.js b/cordova-lib/spec-plugman/platforms/ios.spec.js index 4684c6c33..03317386a 100644 --- a/cordova-lib/spec-plugman/platforms/ios.spec.js +++ b/cordova-lib/spec-plugman/platforms/ios.spec.js @@ -27,14 +27,14 @@ var ios = require('../../src/plugman/platforms/ios'), bplist = require('bplist-parser'), temp = path.join(os.tmpdir(), 'plugman'), plugins_dir = path.join(temp, 'cordova', 'plugins'), - ios_config_xml_project = path.join(__dirname, '..', 'projects', 'ios-config-xml', '*'), - ios_plist_project = path.join(__dirname, '..', 'projects', 'ios-plist', '*'), + ios_config_xml_project = path.join(__dirname, '..', '..', 'fixtures-plugman', 'projects', 'ios-config-xml', '*'), + ios_plist_project = path.join(__dirname, '..', '..', 'fixtures-plugman', 'projects', 'ios-plist', '*'), ios_project = path.join(ios_config_xml_project, '..'), xml_helpers = require('../../src/util/xml-helpers'), - variableplugin = path.join(__dirname, '..', 'plugins', 'VariablePlugin'), - faultyplugin = path.join(__dirname, '..', 'plugins', 'FaultyPlugin'), - dummyplugin = path.join(__dirname, '..', 'plugins', 'DummyPlugin'), - weblessplugin = path.join(__dirname, '..', 'plugins', 'WeblessPlugin'), + variableplugin = path.join(__dirname, '..', '..', 'fixtures-plugman', 'plugins', 'VariablePlugin'), + faultyplugin = path.join(__dirname, '..', '..', 'fixtures-plugman', 'plugins', 'FaultyPlugin'), + dummyplugin = path.join(__dirname, '..', '..', 'fixtures-plugman', 'plugins', 'DummyPlugin'), + weblessplugin = path.join(__dirname, '..', '..', 'fixtures-plugman', 'plugins', 'WeblessPlugin'), done = false; var xml_path = path.join(dummyplugin, 'plugin.xml'), diff --git a/cordova-lib/spec-plugman/platforms/tizen.spec.js b/cordova-lib/spec-plugman/platforms/tizen.spec.js index 79198bc5d..0512c78ac 100644 --- a/cordova-lib/spec-plugman/platforms/tizen.spec.js +++ b/cordova-lib/spec-plugman/platforms/tizen.spec.js @@ -22,10 +22,10 @@ var tizen = require('../../src/plugman/platforms/tizen'), fs = require('fs'), et = require('elementtree'), path = require('path'), - tizen_project = path.join(__dirname, '..', 'projects', 'tizen'), + tizen_project = path.join(__dirname, '..', '..', 'fixtures-plugman', 'projects', 'tizen'), destination = temp.path(), shell = require('shelljs'), - dummyPluginPath = path.join(__dirname, '..', 'plugins', 'DummyPlugin'), + dummyPluginPath = path.join(__dirname, '..', '..', 'fixtures-plugman', 'plugins', 'DummyPlugin'), dummyPlugin = et.XML(fs.readFileSync( path.join(dummyPluginPath, 'plugin.xml'), {encoding: "utf-8"})), dummySources = dummyPlugin diff --git a/cordova-lib/spec-plugman/platforms/windows8.spec.js b/cordova-lib/spec-plugman/platforms/windows8.spec.js index 3276b6932..55a95d96c 100644 --- a/cordova-lib/spec-plugman/platforms/windows8.spec.js +++ b/cordova-lib/spec-plugman/platforms/windows8.spec.js @@ -28,9 +28,9 @@ var windows8 = require('../../src/plugman/platforms/windows'), plugins_dir = path.join(temp, 'cordova', 'plugins'), xml_helpers = require('../../src/util/xml-helpers'), plugins_module = require('../../src/plugman/util/plugins'), - dummyplugin = path.join(__dirname, '..', 'plugins', 'DummyPlugin'), - faultyplugin = path.join(__dirname, '..', 'plugins', 'FaultyPlugin'), - windows8_project = path.join(__dirname, '..', 'projects', 'windows8'); + dummyplugin = path.join(__dirname, '..', '..', 'fixtures-plugman', 'plugins', 'DummyPlugin'), + faultyplugin = path.join(__dirname, '..', '..', 'fixtures-plugman', 'plugins', 'FaultyPlugin'), + windows8_project = path.join(__dirname, '..', '..', 'fixtures-plugman', 'projects', 'windows8'); var xml_path = path.join(dummyplugin, 'plugin.xml') , xml_text = fs.readFileSync(xml_path, 'utf-8') diff --git a/cordova-lib/spec-plugman/platforms/wp8.spec.js b/cordova-lib/spec-plugman/platforms/wp8.spec.js index 8080a2638..28bbfb94b 100644 --- a/cordova-lib/spec-plugman/platforms/wp8.spec.js +++ b/cordova-lib/spec-plugman/platforms/wp8.spec.js @@ -28,9 +28,9 @@ var wp8 = require('../../src/plugman/platforms/wp8'), plugins_dir = path.join(temp, 'cordova', 'plugins'), xml_helpers = require('../../src/util/xml-helpers'), plugins_module = require('../../src/plugman/util/plugins'), - dummyplugin = path.join(__dirname, '..', 'plugins', 'DummyPlugin'), - faultyplugin = path.join(__dirname, '..', 'plugins', 'FaultyPlugin'), - wp8_project = path.join(__dirname, '..', 'projects', 'wp8'); + dummyplugin = path.join(__dirname, '..', '..', 'fixtures-plugman', 'plugins', 'DummyPlugin'), + faultyplugin = path.join(__dirname, '..', '..', 'fixtures-plugman', 'plugins', 'FaultyPlugin'), + wp8_project = path.join(__dirname, '..', '..', 'fixtures-plugman', 'projects', 'wp8'); var xml_path = path.join(dummyplugin, 'plugin.xml') , xml_text = fs.readFileSync(xml_path, 'utf-8') diff --git a/cordova-lib/spec-plugman/plugins/.gitkeep b/cordova-lib/spec-plugman/plugins/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/cordova-lib/spec-plugman/plugins/AndroidJS/plugin.xml b/cordova-lib/spec-plugman/plugins/AndroidJS/plugin.xml deleted file mode 100644 index 1a687494f..000000000 --- a/cordova-lib/spec-plugman/plugins/AndroidJS/plugin.xml +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - JavaScript in yo droidz - - - - - - - - diff --git a/cordova-lib/spec-plugman/plugins/AndroidJS/www/android.js b/cordova-lib/spec-plugman/plugins/AndroidJS/www/android.js deleted file mode 100644 index d268b7d3a..000000000 --- a/cordova-lib/spec-plugman/plugins/AndroidJS/www/android.js +++ /dev/null @@ -1 +0,0 @@ -{}; diff --git a/cordova-lib/spec-plugman/plugins/ChildBrowser/plugin.xml b/cordova-lib/spec-plugman/plugins/ChildBrowser/plugin.xml deleted file mode 100644 index 030f8cada..000000000 --- a/cordova-lib/spec-plugman/plugins/ChildBrowser/plugin.xml +++ /dev/null @@ -1,124 +0,0 @@ - - - - - - Child Browser - - - - - - - - - - - - - - No matter what platform you are installing to, this notice is very important. - - - - - - - - - - - - - - - - - - - - - - Please make sure you read this because it is very important to complete the installation of your plugin. - - - - - - - - - - - - - $APP_ID - - - - - - PackageName - $PACKAGE_NAME - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/cordova-lib/spec-plugman/plugins/ChildBrowser/src/android/ChildBrowser.java b/cordova-lib/spec-plugman/plugins/ChildBrowser/src/android/ChildBrowser.java deleted file mode 100644 index 5263b0c5d..000000000 --- a/cordova-lib/spec-plugman/plugins/ChildBrowser/src/android/ChildBrowser.java +++ /dev/null @@ -1,19 +0,0 @@ -/* - * - * Copyright 2013 Anis Kadri - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - * -*/ - diff --git a/cordova-lib/spec-plugman/plugins/ChildBrowser/src/ios/ChildBrowser.bundle/arrow_left.png b/cordova-lib/spec-plugman/plugins/ChildBrowser/src/ios/ChildBrowser.bundle/arrow_left.png deleted file mode 100644 index 530e12babde279931dc58cb36e2af4d9b7d52acc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2946 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 diff --git a/cordova-lib/spec-plugman/plugins/ChildBrowser/src/ios/ChildBrowser.bundle/arrow_left@2x.png b/cordova-lib/spec-plugman/plugins/ChildBrowser/src/ios/ChildBrowser.bundle/arrow_left@2x.png deleted file mode 100644 index 530e12babde279931dc58cb36e2af4d9b7d52acc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2946 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 diff --git a/cordova-lib/spec-plugman/plugins/ChildBrowser/src/ios/ChildBrowser.bundle/arrow_right.png b/cordova-lib/spec-plugman/plugins/ChildBrowser/src/ios/ChildBrowser.bundle/arrow_right.png deleted file mode 100644 index 8b3d855e884f8aa8b5d2c78139fa63ff4b5826d9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2946 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 diff --git a/cordova-lib/spec-plugman/plugins/ChildBrowser/src/ios/ChildBrowser.bundle/arrow_right@2x.png b/cordova-lib/spec-plugman/plugins/ChildBrowser/src/ios/ChildBrowser.bundle/arrow_right@2x.png deleted file mode 100644 index 8b3d855e884f8aa8b5d2c78139fa63ff4b5826d9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2946 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 diff --git a/cordova-lib/spec-plugman/plugins/ChildBrowser/src/ios/ChildBrowser.bundle/but_refresh.png b/cordova-lib/spec-plugman/plugins/ChildBrowser/src/ios/ChildBrowser.bundle/but_refresh.png deleted file mode 100644 index 309b6bdb255b8784cf884e6fa2bde3febe36da5f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3369 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 diff --git a/cordova-lib/spec-plugman/plugins/ChildBrowser/src/ios/ChildBrowser.bundle/compass@2x.png b/cordova-lib/spec-plugman/plugins/ChildBrowser/src/ios/ChildBrowser.bundle/compass@2x.png deleted file mode 100644 index 46a890174edb858abbef991828153aea289a3a49..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3035 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 diff --git a/cordova-lib/spec-plugman/plugins/ChildBrowser/src/ios/ChildBrowserCommand.h b/cordova-lib/spec-plugman/plugins/ChildBrowser/src/ios/ChildBrowserCommand.h deleted file mode 100644 index 6a23ab6f0..000000000 --- a/cordova-lib/spec-plugman/plugins/ChildBrowser/src/ios/ChildBrowserCommand.h +++ /dev/null @@ -1,49 +0,0 @@ -/* - * - * Copyright 2013 Anis Kadri - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - * -*/ - -// -// PhoneGap ! ChildBrowserCommand -// -// -// Created by Jesse MacFadyen on 10-05-29. -// Copyright 2010 Nitobi. All rights reserved. -// - -#import -#ifdef PHONEGAP_FRAMEWORK - #import -#else - #import "PGPlugin.h" -#endif -#import "ChildBrowserViewController.h" - - - -@interface ChildBrowserCommand : PGPlugin { - - ChildBrowserViewController* childBrowser; -} - -@property (nonatomic, retain) ChildBrowserViewController *childBrowser; - - -- (void) showWebPage:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options; --(void) onChildLocationChange:(NSString*)newLoc; - -@end diff --git a/cordova-lib/spec-plugman/plugins/ChildBrowser/src/ios/ChildBrowserCommand.m b/cordova-lib/spec-plugman/plugins/ChildBrowser/src/ios/ChildBrowserCommand.m deleted file mode 100644 index 38aaf6497..000000000 --- a/cordova-lib/spec-plugman/plugins/ChildBrowser/src/ios/ChildBrowserCommand.m +++ /dev/null @@ -1,86 +0,0 @@ -// - -// -// -// Created by Jesse MacFadyen on 10-05-29. -// Copyright 2010 Nitobi. All rights reserved. -// Copyright (c) 2011, IBM Corporation -// Copyright 2011, Randy McMillan -// - -#import "ChildBrowserCommand.h" - -#ifdef PHONEGAP_FRAMEWORK - #import -#else - #import "PhoneGapViewController.h" -#endif - - -@implementation ChildBrowserCommand - -@synthesize childBrowser; - -- (void) showWebPage:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options // args: url -{ - - if(childBrowser == NULL) - { - childBrowser = [[ ChildBrowserViewController alloc ] initWithScale:FALSE ]; - childBrowser.delegate = self; - } - -/* // TODO: Work in progress - NSString* strOrientations = [ options objectForKey:@"supportedOrientations"]; - NSArray* supportedOrientations = [strOrientations componentsSeparatedByString:@","]; -*/ - PhoneGapViewController* cont = (PhoneGapViewController*)[ super appViewController ]; - childBrowser.supportedOrientations = cont.supportedOrientations; - - if ([cont respondsToSelector:@selector(presentViewController)]) { - //Reference UIViewController.h Line:179 for update to iOS 5 difference - @RandyMcMillan - [cont presentViewController:childBrowser animated:YES completion:nil]; - } else { - [ cont presentModalViewController:childBrowser animated:YES ]; - } - - NSString *url = (NSString*) [arguments objectAtIndex:0]; - - [childBrowser loadURL:url ]; - -} - --(void) close:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options // args: url -{ - [ childBrowser closeBrowser]; - -} - --(void) onClose -{ - NSString* jsCallback = [NSString stringWithFormat:@"ChildBrowser._onClose();",@""]; - [self.webView stringByEvaluatingJavaScriptFromString:jsCallback]; -} - --(void) onOpenInSafari -{ - NSString* jsCallback = [NSString stringWithFormat:@"ChildBrowser._onOpenExternal();",@""]; - [self.webView stringByEvaluatingJavaScriptFromString:jsCallback]; -} - - --(void) onChildLocationChange:(NSString*)newLoc -{ - - NSString* tempLoc = [NSString stringWithFormat:@"%@",newLoc]; - NSString* encUrl = [tempLoc stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; - - NSString* jsCallback = [NSString stringWithFormat:@"ChildBrowser._onLocationChange('%@');",encUrl]; - [self.webView stringByEvaluatingJavaScriptFromString:jsCallback]; - -} - - - - -@end diff --git a/cordova-lib/spec-plugman/plugins/ChildBrowser/src/ios/ChildBrowserViewController.h b/cordova-lib/spec-plugman/plugins/ChildBrowser/src/ios/ChildBrowserViewController.h deleted file mode 100644 index d6fc139d5..000000000 --- a/cordova-lib/spec-plugman/plugins/ChildBrowser/src/ios/ChildBrowserViewController.h +++ /dev/null @@ -1,73 +0,0 @@ -/* - * - * Copyright 2013 Anis Kadri - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - * -*/ - -// -// ChildBrowserViewController.h -// -// Created by Jesse MacFadyen on 21/07/09. -// Copyright 2009 Nitobi. All rights reserved. -// - -#import - -@protocol ChildBrowserDelegate - - - -/* - * onChildLocationChanging:newLoc - * - * Discussion: - * Invoked when a new page has loaded - */ --(void) onChildLocationChange:(NSString*)newLoc; --(void) onOpenInSafari; --(void) onClose; -@end - - -@interface ChildBrowserViewController : UIViewController < UIWebViewDelegate > { - IBOutlet UIWebView* webView; - IBOutlet UIBarButtonItem* closeBtn; - IBOutlet UIBarButtonItem* refreshBtn; - IBOutlet UILabel* addressLabel; - IBOutlet UIBarButtonItem* backBtn; - IBOutlet UIBarButtonItem* fwdBtn; - IBOutlet UIBarButtonItem* safariBtn; - IBOutlet UIActivityIndicatorView* spinner; - BOOL scaleEnabled; - BOOL isImage; - NSString* imageURL; - NSArray* supportedOrientations; - id delegate; -} - -@property (nonatomic, retain)id delegate; -@property (nonatomic, retain) NSArray* supportedOrientations; -@property(retain) NSString* imageURL; -@property(assign) BOOL isImage; - -- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation) interfaceOrientation; -- (ChildBrowserViewController*)initWithScale:(BOOL)enabled; -- (IBAction)onDoneButtonPress:(id)sender; -- (IBAction)onSafariButtonPress:(id)sender; -- (void)loadURL:(NSString*)url; --(void)closeBrowser; - -@end diff --git a/cordova-lib/spec-plugman/plugins/ChildBrowser/src/ios/ChildBrowserViewController.m b/cordova-lib/spec-plugman/plugins/ChildBrowser/src/ios/ChildBrowserViewController.m deleted file mode 100644 index 167ef9801..000000000 --- a/cordova-lib/spec-plugman/plugins/ChildBrowser/src/ios/ChildBrowserViewController.m +++ /dev/null @@ -1,239 +0,0 @@ -// -// ChildBrowserViewController.m -// -// Created by Jesse MacFadyen on 21/07/09. -// Copyright 2009 Nitobi. All rights reserved. -// Copyright (c) 2011, IBM Corporation -// Copyright 2011, Randy McMillan -// - -#import "ChildBrowserViewController.h" - - -@implementation ChildBrowserViewController - -@synthesize imageURL; -@synthesize supportedOrientations; -@synthesize isImage; -@synthesize delegate; - -/* - // The designated initializer. Override if you create the controller programmatically and want to perform customization that is not appropriate for viewDidLoad. -- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { - if (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) { - // Custom initialization - } - return self; -} -*/ - -+ (NSString*) resolveImageResource:(NSString*)resource -{ - NSString* systemVersion = [[UIDevice currentDevice] systemVersion]; - BOOL isLessThaniOS4 = ([systemVersion compare:@"4.0" options:NSNumericSearch] == NSOrderedAscending); - - // the iPad image (nor retina) differentiation code was not in 3.x, and we have to explicitly set the path - if (isLessThaniOS4) - { - return [NSString stringWithFormat:@"%@.png", resource]; - } - - return resource; -} - - -- (ChildBrowserViewController*)initWithScale:(BOOL)enabled -{ - self = [super init]; - - - scaleEnabled = enabled; - - return self; -} - -// Implement viewDidLoad to do additional setup after loading the view, typically from a nib. -- (void)viewDidLoad { - [super viewDidLoad]; - - refreshBtn.image = [UIImage imageNamed:[[self class] resolveImageResource:@"ChildBrowser.bundle/but_refresh"]]; - backBtn.image = [UIImage imageNamed:[[self class] resolveImageResource:@"ChildBrowser.bundle/arrow_left"]]; - fwdBtn.image = [UIImage imageNamed:[[self class] resolveImageResource:@"ChildBrowser.bundle/arrow_right"]]; - safariBtn.image = [UIImage imageNamed:[[self class] resolveImageResource:@"ChildBrowser.bundle/compass"]]; - - webView.delegate = self; - webView.scalesPageToFit = TRUE; - webView.backgroundColor = [UIColor whiteColor]; - NSLog(@"View did load"); -} - - - - - -- (void)didReceiveMemoryWarning { - // Releases the view if it doesn't have a superview. - [super didReceiveMemoryWarning]; - - // Release any cached data, images, etc that aren't in use. -} - -- (void)viewDidUnload { - // Release any retained subviews of the main view. - // e.g. self.myOutlet = nil; - NSLog(@"View did UN-load"); -} - - -- (void)dealloc { - - webView.delegate = nil; - - [webView release]; - [closeBtn release]; - [refreshBtn release]; - [addressLabel release]; - [backBtn release]; - [fwdBtn release]; - [safariBtn release]; - [spinner release]; - [ supportedOrientations release]; - [super dealloc]; -} - --(void)closeBrowser -{ - - if(delegate != NULL) - { - [delegate onClose]; - } - if ([self respondsToSelector:@selector(presentingViewController)]) { - //Reference UIViewController.h Line:179 for update to iOS 5 difference - @RandyMcMillan - [[self presentingViewController] dismissViewControllerAnimated:YES completion:nil]; - } else { - [[self parentViewController] dismissModalViewControllerAnimated:YES]; - } -} - --(IBAction) onDoneButtonPress:(id)sender -{ - [ self closeBrowser]; - - NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"about:blank"]]; - [webView loadRequest:request]; -} - - --(IBAction) onSafariButtonPress:(id)sender -{ - - if(delegate != NULL) - { - [delegate onOpenInSafari]; - } - - if(isImage) - { - NSURL* pURL = [[ [NSURL alloc] initWithString:imageURL ] autorelease]; - [ [ UIApplication sharedApplication ] openURL:pURL ]; - } - else - { - NSURLRequest *request = webView.request; - [[UIApplication sharedApplication] openURL:request.URL]; - } - - -} - -- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation) interfaceOrientation -{ - BOOL autoRotate = [self.supportedOrientations count] > 1; // autorotate if only more than 1 orientation supported - if (autoRotate) - { - if ([self.supportedOrientations containsObject: - [NSNumber numberWithInt:interfaceOrientation]]) { - return YES; - } - } - - return NO; -} - - - - -- (void)loadURL:(NSString*)url -{ - NSLog(@"Opening Url : %@",url); - - if( [url hasSuffix:@".png" ] || - [url hasSuffix:@".jpg" ] || - [url hasSuffix:@".jpeg" ] || - [url hasSuffix:@".bmp" ] || - [url hasSuffix:@".gif" ] ) - { - [ imageURL release ]; - imageURL = [url copy]; - isImage = YES; - NSString* htmlText = @""; - htmlText = [ htmlText stringByReplacingOccurrencesOfString:@"IMGSRC" withString:url ]; - - [webView loadHTMLString:htmlText baseURL:[NSURL URLWithString:@""]]; - - } - else - { - imageURL = @""; - isImage = NO; - NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:url]]; - [webView loadRequest:request]; - } - webView.hidden = NO; -} - - -- (void)webViewDidStartLoad:(UIWebView *)sender { - addressLabel.text = @"Loading..."; - backBtn.enabled = webView.canGoBack; - fwdBtn.enabled = webView.canGoForward; - - [ spinner startAnimating ]; - -} - -- (void)webViewDidFinishLoad:(UIWebView *)sender -{ - NSURLRequest *request = webView.request; - NSLog(@"New Address is : %@",request.URL.absoluteString); - addressLabel.text = request.URL.absoluteString; - backBtn.enabled = webView.canGoBack; - fwdBtn.enabled = webView.canGoForward; - [ spinner stopAnimating ]; - - if(delegate != NULL) - { - [delegate onChildLocationChange:request.URL.absoluteString]; - } - -} - -- (void)webView:(UIWebView *)wv didFailLoadWithError:(NSError *)error { - NSLog (@"webView:didFailLoadWithError"); - [spinner stopAnimating]; - addressLabel.text = @"Failed"; - if (error != NULL) { - UIAlertView *errorAlert = [[UIAlertView alloc] - initWithTitle: [error localizedDescription] - message: [error localizedFailureReason] - delegate:nil - cancelButtonTitle:@"OK" - otherButtonTitles:nil]; - [errorAlert show]; - [errorAlert release]; - } -} - - -@end diff --git a/cordova-lib/spec-plugman/plugins/ChildBrowser/src/ios/ChildBrowserViewController.xib b/cordova-lib/spec-plugman/plugins/ChildBrowser/src/ios/ChildBrowserViewController.xib deleted file mode 100644 index cc8dd6592..000000000 --- a/cordova-lib/spec-plugman/plugins/ChildBrowser/src/ios/ChildBrowserViewController.xib +++ /dev/null @@ -1,875 +0,0 @@ - - - - 768 - 10K540 - 851 - 1038.36 - 461.00 - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - 141 - - - YES - - - YES - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - YES - - YES - - - YES - - - - YES - - IBFilesOwner - IBCocoaTouchFramework - - - IBFirstResponder - IBCocoaTouchFramework - - - - 292 - - YES - - - -2147483374 - {480, 229} - - - - 1 - MCAwIDAAA - - YES - YES - IBCocoaTouchFramework - 1 - YES - - - - 266 - {{0, 256}, {480, 44}} - - - NO - NO - IBCocoaTouchFramework - 1 - - YES - - IBCocoaTouchFramework - 1 - - 0 - - - IBCocoaTouchFramework - - 5 - - - IBCocoaTouchFramework - - - - IBCocoaTouchFramework - - 5 - - - IBCocoaTouchFramework - 32 - - - - IBCocoaTouchFramework - - 5 - - - IBCocoaTouchFramework - 32 - - - - IBCocoaTouchFramework - - 5 - - - IBCocoaTouchFramework - 32 - - - - IBCocoaTouchFramework - - 5 - - - - - - 270 - {{5, 230}, {418, 21}} - - - - 4 - MC42NjY2NjY2OSAwAA - - NO - YES - NO - IBCocoaTouchFramework - Loading... - - Helvetica - 13 - 16 - - - 3 - MQA - - - 1 - NO - 10 - - - - -2147483383 - {{454, 231}, {20, 20}} - - NO - NO - NO - IBCocoaTouchFramework - - - {{0, 20}, {480, 300}} - - - 3 - MC41AA - - 2 - - - - - 3 - - IBCocoaTouchFramework - - - - - YES - - - webView - - - - 17 - - - - addressLabel - - - - 18 - - - - backBtn - - - - 19 - - - - fwdBtn - - - - 22 - - - - refreshBtn - - - - 23 - - - - onDoneButtonPress: - - - - 26 - - - - reload - - - - 27 - - - - goBack - - - - 28 - - - - goForward - - - - 29 - - - - onSafariButtonPress: - - - - 31 - - - - view - - - - 35 - - - - spinner - - - - 36 - - - - safariBtn - - - - 40 - - - - - YES - - 0 - - - - - - 1 - - - YES - - - - - - - - - -1 - - - File's Owner - - - -2 - - - - - 4 - - - - - 6 - - - YES - - - - - - - - - - - - - - - 7 - - - - - 8 - - - Bar Button Item (Reload) - - - 9 - - - Bar Button Item (Go Back) - - - 10 - - - Bar Button Item (Go Forward) - - - 11 - - - Bar Button Item (Safari) - - - 13 - - - - - 14 - - - - - 15 - - - - - 32 - - - - - 37 - - - - - 38 - - - - - 39 - - - - - - - YES - - YES - -1.CustomClassName - -2.CustomClassName - 1.IBEditorWindowLastContentRect - 1.IBPluginDependency - 10.IBPluginDependency - 11.IBPluginDependency - 13.IBPluginDependency - 13.IBViewBoundsToFrameTransform - 14.IBPluginDependency - 15.IBPluginDependency - 32.IBPluginDependency - 32.IBViewBoundsToFrameTransform - 37.IBPluginDependency - 38.IBPluginDependency - 39.IBPluginDependency - 4.IBPluginDependency - 4.IBViewBoundsToFrameTransform - 6.IBPluginDependency - 6.IBViewBoundsToFrameTransform - 7.IBPluginDependency - 8.IBPluginDependency - 9.IBPluginDependency - - - YES - ChildBrowserViewController - UIResponder - {{250, 643}, {480, 320}} - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABCoAAAwygAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABD5gAAw3kAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABB8AAAwwUAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAAAAAAAAw10AAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - - YES - - - YES - - - - - YES - - - YES - - - - 40 - - - - YES - - ChildBrowserViewController - UIViewController - - YES - - YES - onDoneButtonPress: - onSafariButtonPress: - - - YES - id - id - - - - YES - - YES - onDoneButtonPress: - onSafariButtonPress: - - - YES - - onDoneButtonPress: - id - - - onSafariButtonPress: - id - - - - - YES - - YES - addressLabel - backBtn - closeBtn - delegate - fwdBtn - refreshBtn - safariBtn - spinner - webView - - - YES - UILabel - UIBarButtonItem - UIBarButtonItem - id - UIBarButtonItem - UIBarButtonItem - UIBarButtonItem - UIActivityIndicatorView - UIWebView - - - - YES - - YES - addressLabel - backBtn - closeBtn - delegate - fwdBtn - refreshBtn - safariBtn - spinner - webView - - - YES - - addressLabel - UILabel - - - backBtn - UIBarButtonItem - - - closeBtn - UIBarButtonItem - - - delegate - id - - - fwdBtn - UIBarButtonItem - - - refreshBtn - UIBarButtonItem - - - safariBtn - UIBarButtonItem - - - spinner - UIActivityIndicatorView - - - webView - UIWebView - - - - - IBProjectSource - Plugins/ChildBrowser/ChildBrowserViewController.h - - - - - YES - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSError.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSFileManager.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyValueCoding.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyValueObserving.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyedArchiver.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSObject.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSRunLoop.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSThread.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURL.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURLConnection.h - - - - NSObject - - IBFrameworkSource - QuartzCore.framework/Headers/CAAnimation.h - - - - NSObject - - IBFrameworkSource - QuartzCore.framework/Headers/CALayer.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIAccessibility.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UINibLoading.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIResponder.h - - - - UIActivityIndicatorView - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIActivityIndicatorView.h - - - - UIBarButtonItem - UIBarItem - - IBFrameworkSource - UIKit.framework/Headers/UIBarButtonItem.h - - - - UIBarItem - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIBarItem.h - - - - UILabel - UIView - - IBFrameworkSource - UIKit.framework/Headers/UILabel.h - - - - UIResponder - NSObject - - - - UISearchBar - UIView - - IBFrameworkSource - UIKit.framework/Headers/UISearchBar.h - - - - UISearchDisplayController - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UISearchDisplayController.h - - - - UIToolbar - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIToolbar.h - - - - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIPrintFormatter.h - - - - UIView - - IBFrameworkSource - UIKit.framework/Headers/UITextField.h - - - - UIView - UIResponder - - IBFrameworkSource - UIKit.framework/Headers/UIView.h - - - - UIViewController - - IBFrameworkSource - MediaPlayer.framework/Headers/MPMoviePlayerViewController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UINavigationController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UIPopoverController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UISplitViewController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UITabBarController.h - - - - UIViewController - UIResponder - - IBFrameworkSource - UIKit.framework/Headers/UIViewController.h - - - - UIWebView - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIWebView.h - - - - - 0 - IBCocoaTouchFramework - - com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS - - - - com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS - - - - com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 - - - YES - - 3 - 141 - - diff --git a/cordova-lib/spec-plugman/plugins/ChildBrowser/src/ios/TargetDirTest.h b/cordova-lib/spec-plugman/plugins/ChildBrowser/src/ios/TargetDirTest.h deleted file mode 100644 index 60a1403a2..000000000 --- a/cordova-lib/spec-plugman/plugins/ChildBrowser/src/ios/TargetDirTest.h +++ /dev/null @@ -1,20 +0,0 @@ -/* - * - * Copyright 2013 Anis Kadri - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - * -*/ - - diff --git a/cordova-lib/spec-plugman/plugins/ChildBrowser/src/ios/TargetDirTest.m b/cordova-lib/spec-plugman/plugins/ChildBrowser/src/ios/TargetDirTest.m deleted file mode 100644 index 8d1c8b69c..000000000 --- a/cordova-lib/spec-plugman/plugins/ChildBrowser/src/ios/TargetDirTest.m +++ /dev/null @@ -1 +0,0 @@ - diff --git a/cordova-lib/spec-plugman/plugins/ChildBrowser/src/ios/preserveDirs/PreserveDirsTest.h b/cordova-lib/spec-plugman/plugins/ChildBrowser/src/ios/preserveDirs/PreserveDirsTest.h deleted file mode 100644 index 60a1403a2..000000000 --- a/cordova-lib/spec-plugman/plugins/ChildBrowser/src/ios/preserveDirs/PreserveDirsTest.h +++ /dev/null @@ -1,20 +0,0 @@ -/* - * - * Copyright 2013 Anis Kadri - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - * -*/ - - diff --git a/cordova-lib/spec-plugman/plugins/ChildBrowser/src/ios/preserveDirs/PreserveDirsTest.m b/cordova-lib/spec-plugman/plugins/ChildBrowser/src/ios/preserveDirs/PreserveDirsTest.m deleted file mode 100644 index 8d1c8b69c..000000000 --- a/cordova-lib/spec-plugman/plugins/ChildBrowser/src/ios/preserveDirs/PreserveDirsTest.m +++ /dev/null @@ -1 +0,0 @@ - diff --git a/cordova-lib/spec-plugman/plugins/ChildBrowser/www/childbrowser.js b/cordova-lib/spec-plugman/plugins/ChildBrowser/www/childbrowser.js deleted file mode 100644 index 5263b0c5d..000000000 --- a/cordova-lib/spec-plugman/plugins/ChildBrowser/www/childbrowser.js +++ /dev/null @@ -1,19 +0,0 @@ -/* - * - * Copyright 2013 Anis Kadri - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - * -*/ - diff --git a/cordova-lib/spec-plugman/plugins/ChildBrowser/www/childbrowser/image.jpg b/cordova-lib/spec-plugman/plugins/ChildBrowser/www/childbrowser/image.jpg deleted file mode 100644 index 257cc5642..000000000 --- a/cordova-lib/spec-plugman/plugins/ChildBrowser/www/childbrowser/image.jpg +++ /dev/null @@ -1 +0,0 @@ -foo diff --git a/cordova-lib/spec-plugman/plugins/ChildBrowser/www/childbrowser_file.html b/cordova-lib/spec-plugman/plugins/ChildBrowser/www/childbrowser_file.html deleted file mode 100644 index 6de7b8c69..000000000 --- a/cordova-lib/spec-plugman/plugins/ChildBrowser/www/childbrowser_file.html +++ /dev/null @@ -1 +0,0 @@ -This is a test file. diff --git a/cordova-lib/spec-plugman/plugins/ConfigTestPlugin/plugin.xml b/cordova-lib/spec-plugman/plugins/ConfigTestPlugin/plugin.xml deleted file mode 100644 index 54b489573..000000000 --- a/cordova-lib/spec-plugman/plugins/ConfigTestPlugin/plugin.xml +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - Does Code Fil Write Even Work? Hopefully the Tests Will Tell Us - - - - - - - - - - - diff --git a/cordova-lib/spec-plugman/plugins/Contacts/plugin.xml b/cordova-lib/spec-plugman/plugins/Contacts/plugin.xml deleted file mode 100644 index 622eb2a2f..000000000 --- a/cordova-lib/spec-plugman/plugins/Contacts/plugin.xml +++ /dev/null @@ -1,128 +0,0 @@ - - - - Contacts - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - access_pimdomain_contacts - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/cordova-lib/spec-plugman/plugins/Contacts/src/android/ContactAccessor.java b/cordova-lib/spec-plugman/plugins/Contacts/src/android/ContactAccessor.java deleted file mode 100644 index 24ef9c61d..000000000 --- a/cordova-lib/spec-plugman/plugins/Contacts/src/android/ContactAccessor.java +++ /dev/null @@ -1,198 +0,0 @@ -/* - * Copyright (C) 2009 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.cordova.core; - -import java.util.HashMap; - -import android.util.Log; -import android.webkit.WebView; - -import org.apache.cordova.CordovaInterface; -import org.json.JSONArray; -import org.json.JSONException; -import org.json.JSONObject; - -/** - * This abstract class defines SDK-independent API for communication with - * Contacts Provider. The actual implementation used by the application depends - * on the level of API available on the device. If the API level is Cupcake or - * Donut, we want to use the {@link ContactAccessorSdk3_4} class. If it is - * Eclair or higher, we want to use {@link ContactAccessorSdk5}. - */ -public abstract class ContactAccessor { - - protected final String LOG_TAG = "ContactsAccessor"; - protected CordovaInterface mApp; - protected WebView mView; - - /** - * Check to see if the data associated with the key is required to - * be populated in the Contact object. - * @param key - * @param map created by running buildPopulationSet. - * @return true if the key data is required - */ - protected boolean isRequired(String key, HashMap map) { - Boolean retVal = map.get(key); - return (retVal == null) ? false : retVal.booleanValue(); - } - - /** - * Create a hash map of what data needs to be populated in the Contact object - * @param fields the list of fields to populate - * @return the hash map of required data - */ - protected HashMap buildPopulationSet(JSONArray fields) { - HashMap map = new HashMap(); - - String key; - try { - if (fields.length() == 1 && fields.getString(0).equals("*")) { - map.put("displayName", true); - map.put("name", true); - map.put("nickname", true); - map.put("phoneNumbers", true); - map.put("emails", true); - map.put("addresses", true); - map.put("ims", true); - map.put("organizations", true); - map.put("birthday", true); - map.put("note", true); - map.put("urls", true); - map.put("photos", true); - map.put("categories", true); - } - else { - for (int i=0; i - * This implementation has several advantages: - *
    - *
  • It sees contacts from multiple accounts. - *
  • It works with aggregated contacts. So for example, if the contact is the result - * of aggregation of two raw contacts from different accounts, it may return the name from - * one and the phone number from the other. - *
  • It is efficient because it uses the more efficient current API. - *
  • Not obvious in this particular example, but it has access to new kinds - * of data available exclusively through the new APIs. Exercise for the reader: add support - * for nickname (see {@link android.provider.ContactsContract.CommonDataKinds.Nickname}) or - * social status updates (see {@link android.provider.ContactsContract.StatusUpdates}). - *
- */ - -public class ContactAccessorSdk5 extends ContactAccessor { - - /** - * Keep the photo size under the 1 MB blog limit. - */ - private static final long MAX_PHOTO_SIZE = 1048576; - - private static final String EMAIL_REGEXP = ".+@.+\\.+.+"; /* @.*/ - - /** - * A static map that converts the JavaScript property name to Android database column name. - */ - private static final Map dbMap = new HashMap(); - static { - dbMap.put("id", ContactsContract.Data.CONTACT_ID); - dbMap.put("displayName", ContactsContract.Contacts.DISPLAY_NAME); - dbMap.put("name", ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME); - dbMap.put("name.formatted", ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME); - dbMap.put("name.familyName", ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME); - dbMap.put("name.givenName", ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME); - dbMap.put("name.middleName", ContactsContract.CommonDataKinds.StructuredName.MIDDLE_NAME); - dbMap.put("name.honorificPrefix", ContactsContract.CommonDataKinds.StructuredName.PREFIX); - dbMap.put("name.honorificSuffix", ContactsContract.CommonDataKinds.StructuredName.SUFFIX); - dbMap.put("nickname", ContactsContract.CommonDataKinds.Nickname.NAME); - dbMap.put("phoneNumbers", ContactsContract.CommonDataKinds.Phone.NUMBER); - dbMap.put("phoneNumbers.value", ContactsContract.CommonDataKinds.Phone.NUMBER); - dbMap.put("emails", ContactsContract.CommonDataKinds.Email.DATA); - dbMap.put("emails.value", ContactsContract.CommonDataKinds.Email.DATA); - dbMap.put("addresses", ContactsContract.CommonDataKinds.StructuredPostal.FORMATTED_ADDRESS); - dbMap.put("addresses.formatted", ContactsContract.CommonDataKinds.StructuredPostal.FORMATTED_ADDRESS); - dbMap.put("addresses.streetAddress", ContactsContract.CommonDataKinds.StructuredPostal.STREET); - dbMap.put("addresses.locality", ContactsContract.CommonDataKinds.StructuredPostal.CITY); - dbMap.put("addresses.region", ContactsContract.CommonDataKinds.StructuredPostal.REGION); - dbMap.put("addresses.postalCode", ContactsContract.CommonDataKinds.StructuredPostal.POSTCODE); - dbMap.put("addresses.country", ContactsContract.CommonDataKinds.StructuredPostal.COUNTRY); - dbMap.put("ims", ContactsContract.CommonDataKinds.Im.DATA); - dbMap.put("ims.value", ContactsContract.CommonDataKinds.Im.DATA); - dbMap.put("organizations", ContactsContract.CommonDataKinds.Organization.COMPANY); - dbMap.put("organizations.name", ContactsContract.CommonDataKinds.Organization.COMPANY); - dbMap.put("organizations.department", ContactsContract.CommonDataKinds.Organization.DEPARTMENT); - dbMap.put("organizations.title", ContactsContract.CommonDataKinds.Organization.TITLE); - dbMap.put("birthday", ContactsContract.CommonDataKinds.Event.CONTENT_ITEM_TYPE); - dbMap.put("note", ContactsContract.CommonDataKinds.Note.NOTE); - dbMap.put("photos.value", ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE); - //dbMap.put("categories.value", null); - dbMap.put("urls", ContactsContract.CommonDataKinds.Website.URL); - dbMap.put("urls.value", ContactsContract.CommonDataKinds.Website.URL); - } - - /** - * Create an contact accessor. - */ - public ContactAccessorSdk5(WebView view, CordovaInterface context) { - mApp = context; - mView = view; - } - - /** - * This method takes the fields required and search options in order to produce an - * array of contacts that matches the criteria provided. - * @param fields an array of items to be used as search criteria - * @param options that can be applied to contact searching - * @return an array of contacts - */ - @Override - public JSONArray search(JSONArray fields, JSONObject options) { - // Get the find options - String searchTerm = ""; - int limit = Integer.MAX_VALUE; - boolean multiple = true; - - if (options != null) { - searchTerm = options.optString("filter"); - if (searchTerm.length() == 0) { - searchTerm = "%"; - } - else { - searchTerm = "%" + searchTerm + "%"; - } - - try { - multiple = options.getBoolean("multiple"); - if (!multiple) { - limit = 1; - } - } catch (JSONException e) { - // Multiple was not specified so we assume the default is true. - } - } - else { - searchTerm = "%"; - } - - - //Log.d(LOG_TAG, "Search Term = " + searchTerm); - //Log.d(LOG_TAG, "Field Length = " + fields.length()); - //Log.d(LOG_TAG, "Fields = " + fields.toString()); - - // Loop through the fields the user provided to see what data should be returned. - HashMap populate = buildPopulationSet(fields); - - // Build the ugly where clause and where arguments for one big query. - WhereOptions whereOptions = buildWhereClause(fields, searchTerm); - - // Get all the id's where the search term matches the fields passed in. - Cursor idCursor = mApp.getActivity().getContentResolver().query(ContactsContract.Data.CONTENT_URI, - new String[] { ContactsContract.Data.CONTACT_ID }, - whereOptions.getWhere(), - whereOptions.getWhereArgs(), - ContactsContract.Data.CONTACT_ID + " ASC"); - - // Create a set of unique ids - Set contactIds = new HashSet(); - int idColumn = -1; - while (idCursor.moveToNext()) { - if (idColumn < 0) { - idColumn = idCursor.getColumnIndex(ContactsContract.Data.CONTACT_ID); - } - contactIds.add(idCursor.getString(idColumn)); - } - idCursor.close(); - - // Build a query that only looks at ids - WhereOptions idOptions = buildIdClause(contactIds, searchTerm); - - // Determine which columns we should be fetching. - HashSet columnsToFetch = new HashSet(); - columnsToFetch.add(ContactsContract.Data.CONTACT_ID); - columnsToFetch.add(ContactsContract.Data.RAW_CONTACT_ID); - columnsToFetch.add(ContactsContract.Data.MIMETYPE); - - if (isRequired("displayName", populate)) { - columnsToFetch.add(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME); - } - if (isRequired("name", populate)) { - columnsToFetch.add(ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME); - columnsToFetch.add(ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME); - columnsToFetch.add(ContactsContract.CommonDataKinds.StructuredName.MIDDLE_NAME); - columnsToFetch.add(ContactsContract.CommonDataKinds.StructuredName.PREFIX); - columnsToFetch.add(ContactsContract.CommonDataKinds.StructuredName.SUFFIX); - } - if (isRequired("phoneNumbers", populate)) { - columnsToFetch.add(ContactsContract.CommonDataKinds.Phone._ID); - columnsToFetch.add(ContactsContract.CommonDataKinds.Phone.NUMBER); - columnsToFetch.add(ContactsContract.CommonDataKinds.Phone.TYPE); - } - if (isRequired("emails", populate)) { - columnsToFetch.add(ContactsContract.CommonDataKinds.Email._ID); - columnsToFetch.add(ContactsContract.CommonDataKinds.Email.DATA); - columnsToFetch.add(ContactsContract.CommonDataKinds.Email.TYPE); - } - if (isRequired("addresses", populate)) { - columnsToFetch.add(ContactsContract.CommonDataKinds.StructuredPostal._ID); - columnsToFetch.add(ContactsContract.CommonDataKinds.Organization.TYPE); - columnsToFetch.add(ContactsContract.CommonDataKinds.StructuredPostal.FORMATTED_ADDRESS); - columnsToFetch.add(ContactsContract.CommonDataKinds.StructuredPostal.STREET); - columnsToFetch.add(ContactsContract.CommonDataKinds.StructuredPostal.CITY); - columnsToFetch.add(ContactsContract.CommonDataKinds.StructuredPostal.REGION); - columnsToFetch.add(ContactsContract.CommonDataKinds.StructuredPostal.POSTCODE); - columnsToFetch.add(ContactsContract.CommonDataKinds.StructuredPostal.COUNTRY); - } - if (isRequired("organizations", populate)) { - columnsToFetch.add(ContactsContract.CommonDataKinds.Organization._ID); - columnsToFetch.add(ContactsContract.CommonDataKinds.Organization.TYPE); - columnsToFetch.add(ContactsContract.CommonDataKinds.Organization.DEPARTMENT); - columnsToFetch.add(ContactsContract.CommonDataKinds.Organization.COMPANY); - columnsToFetch.add(ContactsContract.CommonDataKinds.Organization.TITLE); - } - if (isRequired("ims", populate)) { - columnsToFetch.add(ContactsContract.CommonDataKinds.Im._ID); - columnsToFetch.add(ContactsContract.CommonDataKinds.Im.DATA); - columnsToFetch.add(ContactsContract.CommonDataKinds.Im.TYPE); - } - if (isRequired("note", populate)) { - columnsToFetch.add(ContactsContract.CommonDataKinds.Note.NOTE); - } - if (isRequired("nickname", populate)) { - columnsToFetch.add(ContactsContract.CommonDataKinds.Nickname.NAME); - } - if (isRequired("urls", populate)) { - columnsToFetch.add(ContactsContract.CommonDataKinds.Website._ID); - columnsToFetch.add(ContactsContract.CommonDataKinds.Website.URL); - columnsToFetch.add(ContactsContract.CommonDataKinds.Website.TYPE); - } - if (isRequired("birthday", populate)) { - columnsToFetch.add(ContactsContract.CommonDataKinds.Event.START_DATE); - columnsToFetch.add(ContactsContract.CommonDataKinds.Event.TYPE); - } - if (isRequired("photos", populate)) { - columnsToFetch.add(ContactsContract.CommonDataKinds.Photo._ID); - } - - // Do the id query - Cursor c = mApp.getActivity().getContentResolver().query(ContactsContract.Data.CONTENT_URI, - columnsToFetch.toArray(new String[] {}), - idOptions.getWhere(), - idOptions.getWhereArgs(), - ContactsContract.Data.CONTACT_ID + " ASC"); - - JSONArray contacts = populateContactArray(limit, populate, c); - return contacts; - } - - /** - * A special search that finds one contact by id - * - * @param id contact to find by id - * @return a JSONObject representing the contact - * @throws JSONException - */ - public JSONObject getContactById(String id) throws JSONException { - // Do the id query - Cursor c = mApp.getActivity().getContentResolver().query(ContactsContract.Data.CONTENT_URI, - null, - ContactsContract.Data.CONTACT_ID + " = ? ", - new String[] { id }, - ContactsContract.Data.CONTACT_ID + " ASC"); - - JSONArray fields = new JSONArray(); - fields.put("*"); - - HashMap populate = buildPopulationSet(fields); - - JSONArray contacts = populateContactArray(1, populate, c); - - if (contacts.length() == 1) { - return contacts.getJSONObject(0); - } else { - return null; - } - } - - /** - * Creates an array of contacts from the cursor you pass in - * - * @param limit max number of contacts for the array - * @param populate whether or not you should populate a certain value - * @param c the cursor - * @return a JSONArray of contacts - */ - private JSONArray populateContactArray(int limit, - HashMap populate, Cursor c) { - - String contactId = ""; - String rawId = ""; - String oldContactId = ""; - boolean newContact = true; - String mimetype = ""; - - JSONArray contacts = new JSONArray(); - JSONObject contact = new JSONObject(); - JSONArray organizations = new JSONArray(); - JSONArray addresses = new JSONArray(); - JSONArray phones = new JSONArray(); - JSONArray emails = new JSONArray(); - JSONArray ims = new JSONArray(); - JSONArray websites = new JSONArray(); - JSONArray photos = new JSONArray(); - - // Column indices - int colContactId = c.getColumnIndex(ContactsContract.Data.CONTACT_ID); - int colRawContactId = c.getColumnIndex(ContactsContract.Data.RAW_CONTACT_ID); - int colMimetype = c.getColumnIndex(ContactsContract.Data.MIMETYPE); - int colDisplayName = c.getColumnIndex(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME); - int colNote = c.getColumnIndex(ContactsContract.CommonDataKinds.Note.NOTE); - int colNickname = c.getColumnIndex(ContactsContract.CommonDataKinds.Nickname.NAME); - int colBirthday = c.getColumnIndex(ContactsContract.CommonDataKinds.Event.START_DATE); - int colEventType = c.getColumnIndex(ContactsContract.CommonDataKinds.Event.TYPE); - - if (c.getCount() > 0) { - while (c.moveToNext() && (contacts.length() <= (limit - 1))) { - try { - contactId = c.getString(colContactId); - rawId = c.getString(colRawContactId); - - // If we are in the first row set the oldContactId - if (c.getPosition() == 0) { - oldContactId = contactId; - } - - // When the contact ID changes we need to push the Contact object - // to the array of contacts and create new objects. - if (!oldContactId.equals(contactId)) { - // Populate the Contact object with it's arrays - // and push the contact into the contacts array - contacts.put(populateContact(contact, organizations, addresses, phones, - emails, ims, websites, photos)); - - // Clean up the objects - contact = new JSONObject(); - organizations = new JSONArray(); - addresses = new JSONArray(); - phones = new JSONArray(); - emails = new JSONArray(); - ims = new JSONArray(); - websites = new JSONArray(); - photos = new JSONArray(); - - // Set newContact to true as we are starting to populate a new contact - newContact = true; - } - - // When we detect a new contact set the ID and display name. - // These fields are available in every row in the result set returned. - if (newContact) { - newContact = false; - contact.put("id", contactId); - contact.put("rawId", rawId); - } - - // Grab the mimetype of the current row as it will be used in a lot of comparisons - mimetype = c.getString(colMimetype); - - if (mimetype.equals(ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE)) { - contact.put("displayName", c.getString(colDisplayName)); - } - - if (mimetype.equals(ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE) - && isRequired("name", populate)) { - contact.put("name", nameQuery(c)); - } - else if (mimetype.equals(ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE) - && isRequired("phoneNumbers", populate)) { - phones.put(phoneQuery(c)); - } - else if (mimetype.equals(ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE) - && isRequired("emails", populate)) { - emails.put(emailQuery(c)); - } - else if (mimetype.equals(ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_ITEM_TYPE) - && isRequired("addresses", populate)) { - addresses.put(addressQuery(c)); - } - else if (mimetype.equals(ContactsContract.CommonDataKinds.Organization.CONTENT_ITEM_TYPE) - && isRequired("organizations", populate)) { - organizations.put(organizationQuery(c)); - } - else if (mimetype.equals(ContactsContract.CommonDataKinds.Im.CONTENT_ITEM_TYPE) - && isRequired("ims", populate)) { - ims.put(imQuery(c)); - } - else if (mimetype.equals(ContactsContract.CommonDataKinds.Note.CONTENT_ITEM_TYPE) - && isRequired("note", populate)) { - contact.put("note", c.getString(colNote)); - } - else if (mimetype.equals(ContactsContract.CommonDataKinds.Nickname.CONTENT_ITEM_TYPE) - && isRequired("nickname", populate)) { - contact.put("nickname", c.getString(colNickname)); - } - else if (mimetype.equals(ContactsContract.CommonDataKinds.Website.CONTENT_ITEM_TYPE) - && isRequired("urls", populate)) { - websites.put(websiteQuery(c)); - } - else if (mimetype.equals(ContactsContract.CommonDataKinds.Event.CONTENT_ITEM_TYPE)) { - if (isRequired("birthday", populate) && - ContactsContract.CommonDataKinds.Event.TYPE_BIRTHDAY == c.getInt(colEventType)) { - contact.put("birthday", c.getString(colBirthday)); - } - } - else if (mimetype.equals(ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE) - && isRequired("photos", populate)) { - photos.put(photoQuery(c, contactId)); - } - } catch (JSONException e) { - Log.e(LOG_TAG, e.getMessage(), e); - } - - // Set the old contact ID - oldContactId = contactId; - - } - - // Push the last contact into the contacts array - if (contacts.length() < limit) { - contacts.put(populateContact(contact, organizations, addresses, phones, - emails, ims, websites, photos)); - } - } - c.close(); - return contacts; - } - - /** - * Builds a where clause all all the ids passed into the method - * @param contactIds a set of unique contact ids - * @param searchTerm what to search for - * @return an object containing the selection and selection args - */ - private WhereOptions buildIdClause(Set contactIds, String searchTerm) { - WhereOptions options = new WhereOptions(); - - // If the user is searching for every contact then short circuit the method - // and return a shorter where clause to be searched. - if (searchTerm.equals("%")) { - options.setWhere("(" + ContactsContract.Data.CONTACT_ID + " LIKE ? )"); - options.setWhereArgs(new String[] { searchTerm }); - return options; - } - - // This clause means that there are specific ID's to be populated - Iterator it = contactIds.iterator(); - StringBuffer buffer = new StringBuffer("("); - - while (it.hasNext()) { - buffer.append("'" + it.next() + "'"); - if (it.hasNext()) { - buffer.append(","); - } - } - buffer.append(")"); - - options.setWhere(ContactsContract.Data.CONTACT_ID + " IN " + buffer.toString()); - options.setWhereArgs(null); - - return options; - } - - /** - * Create a new contact using a JSONObject to hold all the data. - * @param contact - * @param organizations array of organizations - * @param addresses array of addresses - * @param phones array of phones - * @param emails array of emails - * @param ims array of instant messenger addresses - * @param websites array of websites - * @param photos - * @return - */ - private JSONObject populateContact(JSONObject contact, JSONArray organizations, - JSONArray addresses, JSONArray phones, JSONArray emails, - JSONArray ims, JSONArray websites, JSONArray photos) { - try { - // Only return the array if it has at least one entry - if (organizations.length() > 0) { - contact.put("organizations", organizations); - } - if (addresses.length() > 0) { - contact.put("addresses", addresses); - } - if (phones.length() > 0) { - contact.put("phoneNumbers", phones); - } - if (emails.length() > 0) { - contact.put("emails", emails); - } - if (ims.length() > 0) { - contact.put("ims", ims); - } - if (websites.length() > 0) { - contact.put("urls", websites); - } - if (photos.length() > 0) { - contact.put("photos", photos); - } - } catch (JSONException e) { - Log.e(LOG_TAG, e.getMessage(), e); - } - return contact; - } - - /** - * Take the search criteria passed into the method and create a SQL WHERE clause. - * @param fields the properties to search against - * @param searchTerm the string to search for - * @return an object containing the selection and selection args - */ - private WhereOptions buildWhereClause(JSONArray fields, String searchTerm) { - - ArrayList where = new ArrayList(); - ArrayList whereArgs = new ArrayList(); - - WhereOptions options = new WhereOptions(); - - /* - * Special case where the user wants all fields returned - */ - if (isWildCardSearch(fields)) { - // Get all contacts with all properties - if ("%".equals(searchTerm)) { - options.setWhere("(" + ContactsContract.Contacts.DISPLAY_NAME + " LIKE ? )"); - options.setWhereArgs(new String[] { searchTerm }); - return options; - } else { - // Get all contacts that match the filter but return all properties - where.add("(" + dbMap.get("displayName") + " LIKE ? )"); - whereArgs.add(searchTerm); - where.add("(" + dbMap.get("name") + " LIKE ? AND " - + ContactsContract.Data.MIMETYPE + " = ? )"); - whereArgs.add(searchTerm); - whereArgs.add(ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE); - where.add("(" + dbMap.get("nickname") + " LIKE ? AND " - + ContactsContract.Data.MIMETYPE + " = ? )"); - whereArgs.add(searchTerm); - whereArgs.add(ContactsContract.CommonDataKinds.Nickname.CONTENT_ITEM_TYPE); - where.add("(" + dbMap.get("phoneNumbers") + " LIKE ? AND " - + ContactsContract.Data.MIMETYPE + " = ? )"); - whereArgs.add(searchTerm); - whereArgs.add(ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE); - where.add("(" + dbMap.get("emails") + " LIKE ? AND " - + ContactsContract.Data.MIMETYPE + " = ? )"); - whereArgs.add(searchTerm); - whereArgs.add(ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE); - where.add("(" + dbMap.get("addresses") + " LIKE ? AND " - + ContactsContract.Data.MIMETYPE + " = ? )"); - whereArgs.add(searchTerm); - whereArgs.add(ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_ITEM_TYPE); - where.add("(" + dbMap.get("ims") + " LIKE ? AND " - + ContactsContract.Data.MIMETYPE + " = ? )"); - whereArgs.add(searchTerm); - whereArgs.add(ContactsContract.CommonDataKinds.Im.CONTENT_ITEM_TYPE); - where.add("(" + dbMap.get("organizations") + " LIKE ? AND " - + ContactsContract.Data.MIMETYPE + " = ? )"); - whereArgs.add(searchTerm); - whereArgs.add(ContactsContract.CommonDataKinds.Organization.CONTENT_ITEM_TYPE); - where.add("(" + dbMap.get("note") + " LIKE ? AND " - + ContactsContract.Data.MIMETYPE + " = ? )"); - whereArgs.add(searchTerm); - whereArgs.add(ContactsContract.CommonDataKinds.Note.CONTENT_ITEM_TYPE); - where.add("(" + dbMap.get("urls") + " LIKE ? AND " - + ContactsContract.Data.MIMETYPE + " = ? )"); - whereArgs.add(searchTerm); - whereArgs.add(ContactsContract.CommonDataKinds.Website.CONTENT_ITEM_TYPE); - } - } - - /* - * Special case for when the user wants all the contacts but - */ - if ("%".equals(searchTerm)) { - options.setWhere("(" + ContactsContract.Contacts.DISPLAY_NAME + " LIKE ? )"); - options.setWhereArgs(new String[] { searchTerm }); - return options; - } - - String key; - try { - //Log.d(LOG_TAG, "How many fields do we have = " + fields.length()); - for (int i = 0; i < fields.length(); i++) { - key = fields.getString(i); - - if (key.equals("id")) { - where.add("(" + dbMap.get(key) + " = ? )"); - whereArgs.add(searchTerm.substring(1, searchTerm.length() - 1)); - } - else if (key.startsWith("displayName")) { - where.add("(" + dbMap.get(key) + " LIKE ? )"); - whereArgs.add(searchTerm); - } - else if (key.startsWith("name")) { - where.add("(" + dbMap.get(key) + " LIKE ? AND " - + ContactsContract.Data.MIMETYPE + " = ? )"); - whereArgs.add(searchTerm); - whereArgs.add(ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE); - } - else if (key.startsWith("nickname")) { - where.add("(" + dbMap.get(key) + " LIKE ? AND " - + ContactsContract.Data.MIMETYPE + " = ? )"); - whereArgs.add(searchTerm); - whereArgs.add(ContactsContract.CommonDataKinds.Nickname.CONTENT_ITEM_TYPE); - } - else if (key.startsWith("phoneNumbers")) { - where.add("(" + dbMap.get(key) + " LIKE ? AND " - + ContactsContract.Data.MIMETYPE + " = ? )"); - whereArgs.add(searchTerm); - whereArgs.add(ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE); - } - else if (key.startsWith("emails")) { - where.add("(" + dbMap.get(key) + " LIKE ? AND " - + ContactsContract.Data.MIMETYPE + " = ? )"); - whereArgs.add(searchTerm); - whereArgs.add(ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE); - } - else if (key.startsWith("addresses")) { - where.add("(" + dbMap.get(key) + " LIKE ? AND " - + ContactsContract.Data.MIMETYPE + " = ? )"); - whereArgs.add(searchTerm); - whereArgs.add(ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_ITEM_TYPE); - } - else if (key.startsWith("ims")) { - where.add("(" + dbMap.get(key) + " LIKE ? AND " - + ContactsContract.Data.MIMETYPE + " = ? )"); - whereArgs.add(searchTerm); - whereArgs.add(ContactsContract.CommonDataKinds.Im.CONTENT_ITEM_TYPE); - } - else if (key.startsWith("organizations")) { - where.add("(" + dbMap.get(key) + " LIKE ? AND " - + ContactsContract.Data.MIMETYPE + " = ? )"); - whereArgs.add(searchTerm); - whereArgs.add(ContactsContract.CommonDataKinds.Organization.CONTENT_ITEM_TYPE); - } - // else if (key.startsWith("birthday")) { -// where.add("(" + dbMap.get(key) + " LIKE ? AND " -// + ContactsContract.Data.MIMETYPE + " = ? )"); -// } - else if (key.startsWith("note")) { - where.add("(" + dbMap.get(key) + " LIKE ? AND " - + ContactsContract.Data.MIMETYPE + " = ? )"); - whereArgs.add(searchTerm); - whereArgs.add(ContactsContract.CommonDataKinds.Note.CONTENT_ITEM_TYPE); - } - else if (key.startsWith("urls")) { - where.add("(" + dbMap.get(key) + " LIKE ? AND " - + ContactsContract.Data.MIMETYPE + " = ? )"); - whereArgs.add(searchTerm); - whereArgs.add(ContactsContract.CommonDataKinds.Website.CONTENT_ITEM_TYPE); - } - } - } catch (JSONException e) { - Log.e(LOG_TAG, e.getMessage(), e); - } - - // Creating the where string - StringBuffer selection = new StringBuffer(); - for (int i = 0; i < where.size(); i++) { - selection.append(where.get(i)); - if (i != (where.size() - 1)) { - selection.append(" OR "); - } - } - options.setWhere(selection.toString()); - - // Creating the where args array - String[] selectionArgs = new String[whereArgs.size()]; - for (int i = 0; i < whereArgs.size(); i++) { - selectionArgs[i] = whereArgs.get(i); - } - options.setWhereArgs(selectionArgs); - - return options; - } - - /** - * If the user passes in the '*' wildcard character for search then they want all fields for each contact - * - * @param fields - * @return true if wildcard search requested, false otherwise - */ - private boolean isWildCardSearch(JSONArray fields) { - // Only do a wildcard search if we are passed ["*"] - if (fields.length() == 1) { - try { - if ("*".equals(fields.getString(0))) { - return true; - } - } catch (JSONException e) { - return false; - } - } - return false; - } - - /** - * Create a ContactOrganization JSONObject - * @param cursor the current database row - * @return a JSONObject representing a ContactOrganization - */ - private JSONObject organizationQuery(Cursor cursor) { - JSONObject organization = new JSONObject(); - try { - organization.put("id", cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Organization._ID))); - organization.put("pref", false); // Android does not store pref attribute - organization.put("type", getOrgType(cursor.getInt(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Organization.TYPE)))); - organization.put("department", cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Organization.DEPARTMENT))); - organization.put("name", cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Organization.COMPANY))); - organization.put("title", cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Organization.TITLE))); - } catch (JSONException e) { - Log.e(LOG_TAG, e.getMessage(), e); - } - return organization; - } - - /** - * Create a ContactAddress JSONObject - * @param cursor the current database row - * @return a JSONObject representing a ContactAddress - */ - private JSONObject addressQuery(Cursor cursor) { - JSONObject address = new JSONObject(); - try { - address.put("id", cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal._ID))); - address.put("pref", false); // Android does not store pref attribute - address.put("type", getAddressType(cursor.getInt(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Organization.TYPE)))); - address.put("formatted", cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.FORMATTED_ADDRESS))); - address.put("streetAddress", cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.STREET))); - address.put("locality", cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.CITY))); - address.put("region", cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.REGION))); - address.put("postalCode", cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.POSTCODE))); - address.put("country", cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.COUNTRY))); - } catch (JSONException e) { - Log.e(LOG_TAG, e.getMessage(), e); - } - return address; - } - - /** - * Create a ContactName JSONObject - * @param cursor the current database row - * @return a JSONObject representing a ContactName - */ - private JSONObject nameQuery(Cursor cursor) { - JSONObject contactName = new JSONObject(); - try { - String familyName = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME)); - String givenName = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME)); - String middleName = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredName.MIDDLE_NAME)); - String honorificPrefix = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredName.PREFIX)); - String honorificSuffix = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredName.SUFFIX)); - - // Create the formatted name - StringBuffer formatted = new StringBuffer(""); - if (honorificPrefix != null) { - formatted.append(honorificPrefix + " "); - } - if (givenName != null) { - formatted.append(givenName + " "); - } - if (middleName != null) { - formatted.append(middleName + " "); - } - if (familyName != null) { - formatted.append(familyName); - } - if (honorificSuffix != null) { - formatted.append(" " + honorificSuffix); - } - - contactName.put("familyName", familyName); - contactName.put("givenName", givenName); - contactName.put("middleName", middleName); - contactName.put("honorificPrefix", honorificPrefix); - contactName.put("honorificSuffix", honorificSuffix); - contactName.put("formatted", formatted); - } catch (JSONException e) { - Log.e(LOG_TAG, e.getMessage(), e); - } - return contactName; - } - - /** - * Create a ContactField JSONObject - * @param cursor the current database row - * @return a JSONObject representing a ContactField - */ - private JSONObject phoneQuery(Cursor cursor) { - JSONObject phoneNumber = new JSONObject(); - try { - phoneNumber.put("id", cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone._ID))); - phoneNumber.put("pref", false); // Android does not store pref attribute - phoneNumber.put("value", cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER))); - phoneNumber.put("type", getPhoneType(cursor.getInt(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.TYPE)))); - } catch (JSONException e) { - Log.e(LOG_TAG, e.getMessage(), e); - } catch (Exception excp) { - Log.e(LOG_TAG, excp.getMessage(), excp); - } - return phoneNumber; - } - - /** - * Create a ContactField JSONObject - * @param cursor the current database row - * @return a JSONObject representing a ContactField - */ - private JSONObject emailQuery(Cursor cursor) { - JSONObject email = new JSONObject(); - try { - email.put("id", cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Email._ID))); - email.put("pref", false); // Android does not store pref attribute - email.put("value", cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA))); - email.put("type", getContactType(cursor.getInt(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Email.TYPE)))); - } catch (JSONException e) { - Log.e(LOG_TAG, e.getMessage(), e); - } - return email; - } - - /** - * Create a ContactField JSONObject - * @param cursor the current database row - * @return a JSONObject representing a ContactField - */ - private JSONObject imQuery(Cursor cursor) { - JSONObject im = new JSONObject(); - try { - im.put("id", cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Im._ID))); - im.put("pref", false); // Android does not store pref attribute - im.put("value", cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Im.DATA))); - im.put("type", getImType(cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Im.PROTOCOL)))); - } catch (JSONException e) { - Log.e(LOG_TAG, e.getMessage(), e); - } - return im; - } - - /** - * Create a ContactField JSONObject - * @param cursor the current database row - * @return a JSONObject representing a ContactField - */ - private JSONObject websiteQuery(Cursor cursor) { - JSONObject website = new JSONObject(); - try { - website.put("id", cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Website._ID))); - website.put("pref", false); // Android does not store pref attribute - website.put("value", cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Website.URL))); - website.put("type", getContactType(cursor.getInt(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Website.TYPE)))); - } catch (JSONException e) { - Log.e(LOG_TAG, e.getMessage(), e); - } - return website; - } - - /** - * Create a ContactField JSONObject - * @param contactId - * @return a JSONObject representing a ContactField - */ - private JSONObject photoQuery(Cursor cursor, String contactId) { - JSONObject photo = new JSONObject(); - try { - photo.put("id", cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Photo._ID))); - photo.put("pref", false); - photo.put("type", "url"); - Uri person = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, (new Long(contactId))); - Uri photoUri = Uri.withAppendedPath(person, ContactsContract.Contacts.Photo.CONTENT_DIRECTORY); - photo.put("value", photoUri.toString()); - } catch (JSONException e) { - Log.e(LOG_TAG, e.getMessage(), e); - } - return photo; - } - - @Override - /** - * This method will save a contact object into the devices contacts database. - * - * @param contact the contact to be saved. - * @returns the id if the contact is successfully saved, null otherwise. - */ - public String save(JSONObject contact) { - AccountManager mgr = AccountManager.get(mApp.getActivity()); - Account[] accounts = mgr.getAccounts(); - String accountName = null; - String accountType = null; - - if (accounts.length == 1) { - accountName = accounts[0].name; - accountType = accounts[0].type; - } - else if (accounts.length > 1) { - for (Account a : accounts) { - if (a.type.contains("eas") && a.name.matches(EMAIL_REGEXP)) /*Exchange ActiveSync*/{ - accountName = a.name; - accountType = a.type; - break; - } - } - if (accountName == null) { - for (Account a : accounts) { - if (a.type.contains("com.google") && a.name.matches(EMAIL_REGEXP)) /*Google sync provider*/{ - accountName = a.name; - accountType = a.type; - break; - } - } - } - if (accountName == null) { - for (Account a : accounts) { - if (a.name.matches(EMAIL_REGEXP)) /*Last resort, just look for an email address...*/{ - accountName = a.name; - accountType = a.type; - break; - } - } - } - } - - String id = getJsonString(contact, "id"); - if (id == null) { - // Create new contact - return createNewContact(contact, accountType, accountName); - } else { - // Modify existing contact - return modifyContact(id, contact, accountType, accountName); - } - } - - /** - * Creates a new contact and stores it in the database - * - * @param id the raw contact id which is required for linking items to the contact - * @param contact the contact to be saved - * @param account the account to be saved under - */ - private String modifyContact(String id, JSONObject contact, String accountType, String accountName) { - // Get the RAW_CONTACT_ID which is needed to insert new values in an already existing contact. - // But not needed to update existing values. - int rawId = (new Integer(getJsonString(contact, "rawId"))).intValue(); - - // Create a list of attributes to add to the contact database - ArrayList ops = new ArrayList(); - - //Add contact type - ops.add(ContentProviderOperation.newUpdate(ContactsContract.RawContacts.CONTENT_URI) - .withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, accountType) - .withValue(ContactsContract.RawContacts.ACCOUNT_NAME, accountName) - .build()); - - // Modify name - JSONObject name; - try { - String displayName = getJsonString(contact, "displayName"); - name = contact.getJSONObject("name"); - if (displayName != null || name != null) { - ContentProviderOperation.Builder builder = ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI) - .withSelection(ContactsContract.Data.CONTACT_ID + "=? AND " + - ContactsContract.Data.MIMETYPE + "=?", - new String[] { id, ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE }); - - if (displayName != null) { - builder.withValue(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME, displayName); - } - - String familyName = getJsonString(name, "familyName"); - if (familyName != null) { - builder.withValue(ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME, familyName); - } - String middleName = getJsonString(name, "middleName"); - if (middleName != null) { - builder.withValue(ContactsContract.CommonDataKinds.StructuredName.MIDDLE_NAME, middleName); - } - String givenName = getJsonString(name, "givenName"); - if (givenName != null) { - builder.withValue(ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME, givenName); - } - String honorificPrefix = getJsonString(name, "honorificPrefix"); - if (honorificPrefix != null) { - builder.withValue(ContactsContract.CommonDataKinds.StructuredName.PREFIX, honorificPrefix); - } - String honorificSuffix = getJsonString(name, "honorificSuffix"); - if (honorificSuffix != null) { - builder.withValue(ContactsContract.CommonDataKinds.StructuredName.SUFFIX, honorificSuffix); - } - - ops.add(builder.build()); - } - } catch (JSONException e1) { - Log.d(LOG_TAG, "Could not get name"); - } - - // Modify phone numbers - JSONArray phones = null; - try { - phones = contact.getJSONArray("phoneNumbers"); - if (phones != null) { - // Delete all the phones - if (phones.length() == 0) { - ops.add(ContentProviderOperation.newDelete(ContactsContract.Data.CONTENT_URI) - .withSelection(ContactsContract.Data.RAW_CONTACT_ID + "=? AND " + - ContactsContract.Data.MIMETYPE + "=?", - new String[] { "" + rawId, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE }) - .build()); - } - // Modify or add a phone - else { - for (int i = 0; i < phones.length(); i++) { - JSONObject phone = (JSONObject) phones.get(i); - String phoneId = getJsonString(phone, "id"); - // This is a new phone so do a DB insert - if (phoneId == null) { - ContentValues contentValues = new ContentValues(); - contentValues.put(ContactsContract.Data.RAW_CONTACT_ID, rawId); - contentValues.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE); - contentValues.put(ContactsContract.CommonDataKinds.Phone.NUMBER, getJsonString(phone, "value")); - contentValues.put(ContactsContract.CommonDataKinds.Phone.TYPE, getPhoneType(getJsonString(phone, "type"))); - - ops.add(ContentProviderOperation.newInsert( - ContactsContract.Data.CONTENT_URI).withValues(contentValues).build()); - } - // This is an existing phone so do a DB update - else { - ops.add(ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI) - .withSelection(ContactsContract.CommonDataKinds.Phone._ID + "=? AND " + - ContactsContract.Data.MIMETYPE + "=?", - new String[] { phoneId, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE }) - .withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, getJsonString(phone, "value")) - .withValue(ContactsContract.CommonDataKinds.Phone.TYPE, getPhoneType(getJsonString(phone, "type"))) - .build()); - } - } - } - } - } catch (JSONException e) { - Log.d(LOG_TAG, "Could not get phone numbers"); - } - - // Modify emails - JSONArray emails = null; - try { - emails = contact.getJSONArray("emails"); - if (emails != null) { - // Delete all the emails - if (emails.length() == 0) { - ops.add(ContentProviderOperation.newDelete(ContactsContract.Data.CONTENT_URI) - .withSelection(ContactsContract.Data.RAW_CONTACT_ID + "=? AND " + - ContactsContract.Data.MIMETYPE + "=?", - new String[] { "" + rawId, ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE }) - .build()); - } - // Modify or add a email - else { - for (int i = 0; i < emails.length(); i++) { - JSONObject email = (JSONObject) emails.get(i); - String emailId = getJsonString(email, "id"); - // This is a new email so do a DB insert - if (emailId == null) { - ContentValues contentValues = new ContentValues(); - contentValues.put(ContactsContract.Data.RAW_CONTACT_ID, rawId); - contentValues.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE); - contentValues.put(ContactsContract.CommonDataKinds.Email.DATA, getJsonString(email, "value")); - contentValues.put(ContactsContract.CommonDataKinds.Email.TYPE, getContactType(getJsonString(email, "type"))); - - ops.add(ContentProviderOperation.newInsert( - ContactsContract.Data.CONTENT_URI).withValues(contentValues).build()); - } - // This is an existing email so do a DB update - else { - String emailValue=getJsonString(email, "value"); - if(!emailValue.isEmpty()) { - ops.add(ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI) - .withSelection(ContactsContract.CommonDataKinds.Email._ID + "=? AND " + - ContactsContract.Data.MIMETYPE + "=?", - new String[] { emailId, ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE }) - .withValue(ContactsContract.CommonDataKinds.Email.DATA, getJsonString(email, "value")) - .withValue(ContactsContract.CommonDataKinds.Email.TYPE, getContactType(getJsonString(email, "type"))) - .build()); - } else { - ops.add(ContentProviderOperation.newDelete(ContactsContract.Data.CONTENT_URI) - .withSelection(ContactsContract.CommonDataKinds.Email._ID + "=? AND " + - ContactsContract.Data.MIMETYPE + "=?", - new String[] { emailId, ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE }) - .build()); - } - } - } - } - } - } catch (JSONException e) { - Log.d(LOG_TAG, "Could not get emails"); - } - - // Modify addresses - JSONArray addresses = null; - try { - addresses = contact.getJSONArray("addresses"); - if (addresses != null) { - // Delete all the addresses - if (addresses.length() == 0) { - ops.add(ContentProviderOperation.newDelete(ContactsContract.Data.CONTENT_URI) - .withSelection(ContactsContract.Data.RAW_CONTACT_ID + "=? AND " + - ContactsContract.Data.MIMETYPE + "=?", - new String[] { "" + rawId, ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_ITEM_TYPE }) - .build()); - } - // Modify or add a address - else { - for (int i = 0; i < addresses.length(); i++) { - JSONObject address = (JSONObject) addresses.get(i); - String addressId = getJsonString(address, "id"); - // This is a new address so do a DB insert - if (addressId == null) { - ContentValues contentValues = new ContentValues(); - contentValues.put(ContactsContract.Data.RAW_CONTACT_ID, rawId); - contentValues.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_ITEM_TYPE); - contentValues.put(ContactsContract.CommonDataKinds.StructuredPostal.TYPE, getAddressType(getJsonString(address, "type"))); - contentValues.put(ContactsContract.CommonDataKinds.StructuredPostal.FORMATTED_ADDRESS, getJsonString(address, "formatted")); - contentValues.put(ContactsContract.CommonDataKinds.StructuredPostal.STREET, getJsonString(address, "streetAddress")); - contentValues.put(ContactsContract.CommonDataKinds.StructuredPostal.CITY, getJsonString(address, "locality")); - contentValues.put(ContactsContract.CommonDataKinds.StructuredPostal.REGION, getJsonString(address, "region")); - contentValues.put(ContactsContract.CommonDataKinds.StructuredPostal.POSTCODE, getJsonString(address, "postalCode")); - contentValues.put(ContactsContract.CommonDataKinds.StructuredPostal.COUNTRY, getJsonString(address, "country")); - - ops.add(ContentProviderOperation.newInsert( - ContactsContract.Data.CONTENT_URI).withValues(contentValues).build()); - } - // This is an existing address so do a DB update - else { - ops.add(ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI) - .withSelection(ContactsContract.CommonDataKinds.StructuredPostal._ID + "=? AND " + - ContactsContract.Data.MIMETYPE + "=?", - new String[] { addressId, ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_ITEM_TYPE }) - .withValue(ContactsContract.CommonDataKinds.StructuredPostal.TYPE, getAddressType(getJsonString(address, "type"))) - .withValue(ContactsContract.CommonDataKinds.StructuredPostal.FORMATTED_ADDRESS, getJsonString(address, "formatted")) - .withValue(ContactsContract.CommonDataKinds.StructuredPostal.STREET, getJsonString(address, "streetAddress")) - .withValue(ContactsContract.CommonDataKinds.StructuredPostal.CITY, getJsonString(address, "locality")) - .withValue(ContactsContract.CommonDataKinds.StructuredPostal.REGION, getJsonString(address, "region")) - .withValue(ContactsContract.CommonDataKinds.StructuredPostal.POSTCODE, getJsonString(address, "postalCode")) - .withValue(ContactsContract.CommonDataKinds.StructuredPostal.COUNTRY, getJsonString(address, "country")) - .build()); - } - } - } - } - } catch (JSONException e) { - Log.d(LOG_TAG, "Could not get addresses"); - } - - // Modify organizations - JSONArray organizations = null; - try { - organizations = contact.getJSONArray("organizations"); - if (organizations != null) { - // Delete all the organizations - if (organizations.length() == 0) { - ops.add(ContentProviderOperation.newDelete(ContactsContract.Data.CONTENT_URI) - .withSelection(ContactsContract.Data.RAW_CONTACT_ID + "=? AND " + - ContactsContract.Data.MIMETYPE + "=?", - new String[] { "" + rawId, ContactsContract.CommonDataKinds.Organization.CONTENT_ITEM_TYPE }) - .build()); - } - // Modify or add a organization - else { - for (int i = 0; i < organizations.length(); i++) { - JSONObject org = (JSONObject) organizations.get(i); - String orgId = getJsonString(org, "id"); - // This is a new organization so do a DB insert - if (orgId == null) { - ContentValues contentValues = new ContentValues(); - contentValues.put(ContactsContract.Data.RAW_CONTACT_ID, rawId); - contentValues.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Organization.CONTENT_ITEM_TYPE); - contentValues.put(ContactsContract.CommonDataKinds.Organization.TYPE, getOrgType(getJsonString(org, "type"))); - contentValues.put(ContactsContract.CommonDataKinds.Organization.DEPARTMENT, getJsonString(org, "department")); - contentValues.put(ContactsContract.CommonDataKinds.Organization.COMPANY, getJsonString(org, "name")); - contentValues.put(ContactsContract.CommonDataKinds.Organization.TITLE, getJsonString(org, "title")); - - ops.add(ContentProviderOperation.newInsert( - ContactsContract.Data.CONTENT_URI).withValues(contentValues).build()); - } - // This is an existing organization so do a DB update - else { - ops.add(ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI) - .withSelection(ContactsContract.CommonDataKinds.Organization._ID + "=? AND " + - ContactsContract.Data.MIMETYPE + "=?", - new String[] { orgId, ContactsContract.CommonDataKinds.Organization.CONTENT_ITEM_TYPE }) - .withValue(ContactsContract.CommonDataKinds.Organization.TYPE, getOrgType(getJsonString(org, "type"))) - .withValue(ContactsContract.CommonDataKinds.Organization.DEPARTMENT, getJsonString(org, "department")) - .withValue(ContactsContract.CommonDataKinds.Organization.COMPANY, getJsonString(org, "name")) - .withValue(ContactsContract.CommonDataKinds.Organization.TITLE, getJsonString(org, "title")) - .build()); - } - } - } - } - } catch (JSONException e) { - Log.d(LOG_TAG, "Could not get organizations"); - } - - // Modify IMs - JSONArray ims = null; - try { - ims = contact.getJSONArray("ims"); - if (ims != null) { - // Delete all the ims - if (ims.length() == 0) { - ops.add(ContentProviderOperation.newDelete(ContactsContract.Data.CONTENT_URI) - .withSelection(ContactsContract.Data.RAW_CONTACT_ID + "=? AND " + - ContactsContract.Data.MIMETYPE + "=?", - new String[] { "" + rawId, ContactsContract.CommonDataKinds.Im.CONTENT_ITEM_TYPE }) - .build()); - } - // Modify or add a im - else { - for (int i = 0; i < ims.length(); i++) { - JSONObject im = (JSONObject) ims.get(i); - String imId = getJsonString(im, "id"); - // This is a new IM so do a DB insert - if (imId == null) { - ContentValues contentValues = new ContentValues(); - contentValues.put(ContactsContract.Data.RAW_CONTACT_ID, rawId); - contentValues.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Im.CONTENT_ITEM_TYPE); - contentValues.put(ContactsContract.CommonDataKinds.Im.DATA, getJsonString(im, "value")); - contentValues.put(ContactsContract.CommonDataKinds.Im.TYPE, getImType(getJsonString(im, "type"))); - - ops.add(ContentProviderOperation.newInsert( - ContactsContract.Data.CONTENT_URI).withValues(contentValues).build()); - } - // This is an existing IM so do a DB update - else { - ops.add(ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI) - .withSelection(ContactsContract.CommonDataKinds.Im._ID + "=? AND " + - ContactsContract.Data.MIMETYPE + "=?", - new String[] { imId, ContactsContract.CommonDataKinds.Im.CONTENT_ITEM_TYPE }) - .withValue(ContactsContract.CommonDataKinds.Im.DATA, getJsonString(im, "value")) - .withValue(ContactsContract.CommonDataKinds.Im.TYPE, getContactType(getJsonString(im, "type"))) - .build()); - } - } - } - } - } catch (JSONException e) { - Log.d(LOG_TAG, "Could not get emails"); - } - - // Modify note - String note = getJsonString(contact, "note"); - ops.add(ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI) - .withSelection(ContactsContract.Data.CONTACT_ID + "=? AND " + - ContactsContract.Data.MIMETYPE + "=?", - new String[] { id, ContactsContract.CommonDataKinds.Note.CONTENT_ITEM_TYPE }) - .withValue(ContactsContract.CommonDataKinds.Note.NOTE, note) - .build()); - - // Modify nickname - String nickname = getJsonString(contact, "nickname"); - if (nickname != null) { - ops.add(ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI) - .withSelection(ContactsContract.Data.CONTACT_ID + "=? AND " + - ContactsContract.Data.MIMETYPE + "=?", - new String[] { id, ContactsContract.CommonDataKinds.Nickname.CONTENT_ITEM_TYPE }) - .withValue(ContactsContract.CommonDataKinds.Nickname.NAME, nickname) - .build()); - } - - // Modify urls - JSONArray websites = null; - try { - websites = contact.getJSONArray("urls"); - if (websites != null) { - // Delete all the websites - if (websites.length() == 0) { - Log.d(LOG_TAG, "This means we should be deleting all the phone numbers."); - ops.add(ContentProviderOperation.newDelete(ContactsContract.Data.CONTENT_URI) - .withSelection(ContactsContract.Data.RAW_CONTACT_ID + "=? AND " + - ContactsContract.Data.MIMETYPE + "=?", - new String[] { "" + rawId, ContactsContract.CommonDataKinds.Website.CONTENT_ITEM_TYPE }) - .build()); - } - // Modify or add a website - else { - for (int i = 0; i < websites.length(); i++) { - JSONObject website = (JSONObject) websites.get(i); - String websiteId = getJsonString(website, "id"); - // This is a new website so do a DB insert - if (websiteId == null) { - ContentValues contentValues = new ContentValues(); - contentValues.put(ContactsContract.Data.RAW_CONTACT_ID, rawId); - contentValues.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Website.CONTENT_ITEM_TYPE); - contentValues.put(ContactsContract.CommonDataKinds.Website.DATA, getJsonString(website, "value")); - contentValues.put(ContactsContract.CommonDataKinds.Website.TYPE, getContactType(getJsonString(website, "type"))); - - ops.add(ContentProviderOperation.newInsert( - ContactsContract.Data.CONTENT_URI).withValues(contentValues).build()); - } - // This is an existing website so do a DB update - else { - ops.add(ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI) - .withSelection(ContactsContract.CommonDataKinds.Website._ID + "=? AND " + - ContactsContract.Data.MIMETYPE + "=?", - new String[] { websiteId, ContactsContract.CommonDataKinds.Website.CONTENT_ITEM_TYPE }) - .withValue(ContactsContract.CommonDataKinds.Website.DATA, getJsonString(website, "value")) - .withValue(ContactsContract.CommonDataKinds.Website.TYPE, getContactType(getJsonString(website, "type"))) - .build()); - } - } - } - } - } catch (JSONException e) { - Log.d(LOG_TAG, "Could not get websites"); - } - - // Modify birthday - String birthday = getJsonString(contact, "birthday"); - if (birthday != null) { - ops.add(ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI) - .withSelection(ContactsContract.Data.CONTACT_ID + "=? AND " + - ContactsContract.Data.MIMETYPE + "=? AND " + - ContactsContract.CommonDataKinds.Event.TYPE + "=?", - new String[] { id, ContactsContract.CommonDataKinds.Event.CONTENT_ITEM_TYPE, new String("" + ContactsContract.CommonDataKinds.Event.TYPE_BIRTHDAY) }) - .withValue(ContactsContract.CommonDataKinds.Event.TYPE, ContactsContract.CommonDataKinds.Event.TYPE_BIRTHDAY) - .withValue(ContactsContract.CommonDataKinds.Event.START_DATE, birthday) - .build()); - } - - // Modify photos - JSONArray photos = null; - try { - photos = contact.getJSONArray("photos"); - if (photos != null) { - // Delete all the photos - if (photos.length() == 0) { - ops.add(ContentProviderOperation.newDelete(ContactsContract.Data.CONTENT_URI) - .withSelection(ContactsContract.Data.RAW_CONTACT_ID + "=? AND " + - ContactsContract.Data.MIMETYPE + "=?", - new String[] { "" + rawId, ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE }) - .build()); - } - // Modify or add a photo - else { - for (int i = 0; i < photos.length(); i++) { - JSONObject photo = (JSONObject) photos.get(i); - String photoId = getJsonString(photo, "id"); - byte[] bytes = getPhotoBytes(getJsonString(photo, "value")); - // This is a new photo so do a DB insert - if (photoId == null) { - ContentValues contentValues = new ContentValues(); - contentValues.put(ContactsContract.Data.RAW_CONTACT_ID, rawId); - contentValues.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE); - contentValues.put(ContactsContract.Data.IS_SUPER_PRIMARY, 1); - contentValues.put(ContactsContract.CommonDataKinds.Photo.PHOTO, bytes); - - ops.add(ContentProviderOperation.newInsert( - ContactsContract.Data.CONTENT_URI).withValues(contentValues).build()); - } - // This is an existing photo so do a DB update - else { - ops.add(ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI) - .withSelection(ContactsContract.CommonDataKinds.Photo._ID + "=? AND " + - ContactsContract.Data.MIMETYPE + "=?", - new String[] { photoId, ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE }) - .withValue(ContactsContract.Data.IS_SUPER_PRIMARY, 1) - .withValue(ContactsContract.CommonDataKinds.Photo.PHOTO, bytes) - .build()); - } - } - } - } - } catch (JSONException e) { - Log.d(LOG_TAG, "Could not get photos"); - } - - boolean retVal = true; - - //Modify contact - try { - mApp.getActivity().getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops); - } catch (RemoteException e) { - Log.e(LOG_TAG, e.getMessage(), e); - Log.e(LOG_TAG, Log.getStackTraceString(e), e); - retVal = false; - } catch (OperationApplicationException e) { - Log.e(LOG_TAG, e.getMessage(), e); - Log.e(LOG_TAG, Log.getStackTraceString(e), e); - retVal = false; - } - - // if the save was a success return the contact ID - if (retVal) { - return id; - } else { - return null; - } - } - - /** - * Add a website to a list of database actions to be performed - * - * @param ops the list of database actions - * @param website the item to be inserted - */ - private void insertWebsite(ArrayList ops, - JSONObject website) { - ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI) - .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0) - .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Website.CONTENT_ITEM_TYPE) - .withValue(ContactsContract.CommonDataKinds.Website.DATA, getJsonString(website, "value")) - .withValue(ContactsContract.CommonDataKinds.Website.TYPE, getContactType(getJsonString(website, "type"))) - .build()); - } - - /** - * Add an im to a list of database actions to be performed - * - * @param ops the list of database actions - * @param im the item to be inserted - */ - private void insertIm(ArrayList ops, JSONObject im) { - ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI) - .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0) - .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Im.CONTENT_ITEM_TYPE) - .withValue(ContactsContract.CommonDataKinds.Im.DATA, getJsonString(im, "value")) - .withValue(ContactsContract.CommonDataKinds.Im.TYPE, getImType(getJsonString(im, "type"))) - .build()); - } - - /** - * Add an organization to a list of database actions to be performed - * - * @param ops the list of database actions - * @param org the item to be inserted - */ - private void insertOrganization(ArrayList ops, - JSONObject org) { - ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI) - .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0) - .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Organization.CONTENT_ITEM_TYPE) - .withValue(ContactsContract.CommonDataKinds.Organization.TYPE, getOrgType(getJsonString(org, "type"))) - .withValue(ContactsContract.CommonDataKinds.Organization.DEPARTMENT, getJsonString(org, "department")) - .withValue(ContactsContract.CommonDataKinds.Organization.COMPANY, getJsonString(org, "name")) - .withValue(ContactsContract.CommonDataKinds.Organization.TITLE, getJsonString(org, "title")) - .build()); - } - - /** - * Add an address to a list of database actions to be performed - * - * @param ops the list of database actions - * @param address the item to be inserted - */ - private void insertAddress(ArrayList ops, - JSONObject address) { - ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI) - .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0) - .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_ITEM_TYPE) - .withValue(ContactsContract.CommonDataKinds.StructuredPostal.TYPE, getAddressType(getJsonString(address, "type"))) - .withValue(ContactsContract.CommonDataKinds.StructuredPostal.FORMATTED_ADDRESS, getJsonString(address, "formatted")) - .withValue(ContactsContract.CommonDataKinds.StructuredPostal.STREET, getJsonString(address, "streetAddress")) - .withValue(ContactsContract.CommonDataKinds.StructuredPostal.CITY, getJsonString(address, "locality")) - .withValue(ContactsContract.CommonDataKinds.StructuredPostal.REGION, getJsonString(address, "region")) - .withValue(ContactsContract.CommonDataKinds.StructuredPostal.POSTCODE, getJsonString(address, "postalCode")) - .withValue(ContactsContract.CommonDataKinds.StructuredPostal.COUNTRY, getJsonString(address, "country")) - .build()); - } - - /** - * Add an email to a list of database actions to be performed - * - * @param ops the list of database actions - * @param email the item to be inserted - */ - private void insertEmail(ArrayList ops, - JSONObject email) { - ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI) - .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0) - .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE) - .withValue(ContactsContract.CommonDataKinds.Email.DATA, getJsonString(email, "value")) - .withValue(ContactsContract.CommonDataKinds.Email.TYPE, getContactType(getJsonString(email, "type"))) - .build()); - } - - /** - * Add a phone to a list of database actions to be performed - * - * @param ops the list of database actions - * @param phone the item to be inserted - */ - private void insertPhone(ArrayList ops, - JSONObject phone) { - ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI) - .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0) - .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE) - .withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, getJsonString(phone, "value")) - .withValue(ContactsContract.CommonDataKinds.Phone.TYPE, getPhoneType(getJsonString(phone, "type"))) - .build()); - } - - /** - * Add a phone to a list of database actions to be performed - * - * @param ops the list of database actions - * @param phone the item to be inserted - */ - private void insertPhoto(ArrayList ops, - JSONObject photo) { - byte[] bytes = getPhotoBytes(getJsonString(photo, "value")); - ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI) - .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0) - .withValue(ContactsContract.Data.IS_SUPER_PRIMARY, 1) - .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE) - .withValue(ContactsContract.CommonDataKinds.Photo.PHOTO, bytes) - .build()); - } - - /** - * Gets the raw bytes from the supplied filename - * - * @param filename the file to read the bytes from - * @return a byte array - * @throws IOException - */ - private byte[] getPhotoBytes(String filename) { - ByteArrayOutputStream buffer = new ByteArrayOutputStream(); - try { - int bytesRead = 0; - long totalBytesRead = 0; - byte[] data = new byte[8192]; - InputStream in = getPathFromUri(filename); - - while ((bytesRead = in.read(data, 0, data.length)) != -1 && totalBytesRead <= MAX_PHOTO_SIZE) { - buffer.write(data, 0, bytesRead); - totalBytesRead += bytesRead; - } - - in.close(); - buffer.flush(); - } catch (FileNotFoundException e) { - Log.e(LOG_TAG, e.getMessage(), e); - } catch (IOException e) { - Log.e(LOG_TAG, e.getMessage(), e); - } - return buffer.toByteArray(); - } - - /** - * Get an input stream based on file path or uri content://, http://, file:// - * - * @param path - * @return an input stream - * @throws IOException - */ - private InputStream getPathFromUri(String path) throws IOException { - if (path.startsWith("content:")) { - Uri uri = Uri.parse(path); - return mApp.getActivity().getContentResolver().openInputStream(uri); - } - if (path.startsWith("http:") || path.startsWith("https:") || path.startsWith("file:")) { - URL url = new URL(path); - return url.openStream(); - } - else { - return new FileInputStream(path); - } - } - - /** - * Creates a new contact and stores it in the database - * - * @param contact the contact to be saved - * @param account the account to be saved under - */ - private String createNewContact(JSONObject contact, String accountType, String accountName) { - // Create a list of attributes to add to the contact database - ArrayList ops = new ArrayList(); - - //Add contact type - ops.add(ContentProviderOperation.newInsert(ContactsContract.RawContacts.CONTENT_URI) - .withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, accountType) - .withValue(ContactsContract.RawContacts.ACCOUNT_NAME, accountName) - .build()); - - // Add name - try { - JSONObject name = contact.optJSONObject("name"); - String displayName = contact.getString("displayName"); - if (displayName != null || name != null) { - ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI) - .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0) - .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE) - .withValue(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME, displayName) - .withValue(ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME, getJsonString(name, "familyName")) - .withValue(ContactsContract.CommonDataKinds.StructuredName.MIDDLE_NAME, getJsonString(name, "middleName")) - .withValue(ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME, getJsonString(name, "givenName")) - .withValue(ContactsContract.CommonDataKinds.StructuredName.PREFIX, getJsonString(name, "honorificPrefix")) - .withValue(ContactsContract.CommonDataKinds.StructuredName.SUFFIX, getJsonString(name, "honorificSuffix")) - .build()); - } - } catch (JSONException e) { - Log.d(LOG_TAG, "Could not get name object"); - } - - //Add phone numbers - JSONArray phones = null; - try { - phones = contact.getJSONArray("phoneNumbers"); - if (phones != null) { - for (int i = 0; i < phones.length(); i++) { - JSONObject phone = (JSONObject) phones.get(i); - insertPhone(ops, phone); - } - } - } catch (JSONException e) { - Log.d(LOG_TAG, "Could not get phone numbers"); - } - - // Add emails - JSONArray emails = null; - try { - emails = contact.getJSONArray("emails"); - if (emails != null) { - for (int i = 0; i < emails.length(); i++) { - JSONObject email = (JSONObject) emails.get(i); - insertEmail(ops, email); - } - } - } catch (JSONException e) { - Log.d(LOG_TAG, "Could not get emails"); - } - - // Add addresses - JSONArray addresses = null; - try { - addresses = contact.getJSONArray("addresses"); - if (addresses != null) { - for (int i = 0; i < addresses.length(); i++) { - JSONObject address = (JSONObject) addresses.get(i); - insertAddress(ops, address); - } - } - } catch (JSONException e) { - Log.d(LOG_TAG, "Could not get addresses"); - } - - // Add organizations - JSONArray organizations = null; - try { - organizations = contact.getJSONArray("organizations"); - if (organizations != null) { - for (int i = 0; i < organizations.length(); i++) { - JSONObject org = (JSONObject) organizations.get(i); - insertOrganization(ops, org); - } - } - } catch (JSONException e) { - Log.d(LOG_TAG, "Could not get organizations"); - } - - // Add IMs - JSONArray ims = null; - try { - ims = contact.getJSONArray("ims"); - if (ims != null) { - for (int i = 0; i < ims.length(); i++) { - JSONObject im = (JSONObject) ims.get(i); - insertIm(ops, im); - } - } - } catch (JSONException e) { - Log.d(LOG_TAG, "Could not get emails"); - } - - // Add note - String note = getJsonString(contact, "note"); - if (note != null) { - ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI) - .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0) - .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Note.CONTENT_ITEM_TYPE) - .withValue(ContactsContract.CommonDataKinds.Note.NOTE, note) - .build()); - } - - // Add nickname - String nickname = getJsonString(contact, "nickname"); - if (nickname != null) { - ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI) - .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0) - .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Nickname.CONTENT_ITEM_TYPE) - .withValue(ContactsContract.CommonDataKinds.Nickname.NAME, nickname) - .build()); - } - - // Add urls - JSONArray websites = null; - try { - websites = contact.getJSONArray("urls"); - if (websites != null) { - for (int i = 0; i < websites.length(); i++) { - JSONObject website = (JSONObject) websites.get(i); - insertWebsite(ops, website); - } - } - } catch (JSONException e) { - Log.d(LOG_TAG, "Could not get websites"); - } - - // Add birthday - String birthday = getJsonString(contact, "birthday"); - if (birthday != null) { - ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI) - .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0) - .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Event.CONTENT_ITEM_TYPE) - .withValue(ContactsContract.CommonDataKinds.Event.TYPE, ContactsContract.CommonDataKinds.Event.TYPE_BIRTHDAY) - .withValue(ContactsContract.CommonDataKinds.Event.START_DATE, birthday) - .build()); - } - - // Add photos - JSONArray photos = null; - try { - photos = contact.getJSONArray("photos"); - if (photos != null) { - for (int i = 0; i < photos.length(); i++) { - JSONObject photo = (JSONObject) photos.get(i); - insertPhoto(ops, photo); - } - } - } catch (JSONException e) { - Log.d(LOG_TAG, "Could not get photos"); - } - - String newId = null; - //Add contact - try { - ContentProviderResult[] cpResults = mApp.getActivity().getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops); - if (cpResults.length >= 0) { - newId = cpResults[0].uri.getLastPathSegment(); - } - } catch (RemoteException e) { - Log.e(LOG_TAG, e.getMessage(), e); - } catch (OperationApplicationException e) { - Log.e(LOG_TAG, e.getMessage(), e); - } - return newId; - } - - @Override - /** - * This method will remove a Contact from the database based on ID. - * @param id the unique ID of the contact to remove - */ - public boolean remove(String id) { - int result = 0; - Cursor cursor = mApp.getActivity().getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, - null, - ContactsContract.Contacts._ID + " = ?", - new String[] { id }, null); - if (cursor.getCount() == 1) { - cursor.moveToFirst(); - String lookupKey = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.LOOKUP_KEY)); - Uri uri = Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_LOOKUP_URI, lookupKey); - result = mApp.getActivity().getContentResolver().delete(uri, null, null); - } else { - Log.d(LOG_TAG, "Could not find contact with ID"); - } - - return (result > 0) ? true : false; - } - - /************************************************************************** - * - * All methods below this comment are used to convert from JavaScript - * text types to Android integer types and vice versa. - * - *************************************************************************/ - - /** - * Converts a string from the W3C Contact API to it's Android int value. - * @param string - * @return Android int value - */ - private int getPhoneType(String string) { - int type = ContactsContract.CommonDataKinds.Phone.TYPE_OTHER; - if (string != null) { - if ("home".equals(string.toLowerCase())) { - return ContactsContract.CommonDataKinds.Phone.TYPE_HOME; - } - else if ("mobile".equals(string.toLowerCase())) { - return ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE; - } - else if ("work".equals(string.toLowerCase())) { - return ContactsContract.CommonDataKinds.Phone.TYPE_WORK; - } - else if ("work fax".equals(string.toLowerCase())) { - return ContactsContract.CommonDataKinds.Phone.TYPE_FAX_WORK; - } - else if ("home fax".equals(string.toLowerCase())) { - return ContactsContract.CommonDataKinds.Phone.TYPE_FAX_HOME; - } - else if ("fax".equals(string.toLowerCase())) { - return ContactsContract.CommonDataKinds.Phone.TYPE_FAX_WORK; - } - else if ("pager".equals(string.toLowerCase())) { - return ContactsContract.CommonDataKinds.Phone.TYPE_PAGER; - } - else if ("other".equals(string.toLowerCase())) { - return ContactsContract.CommonDataKinds.Phone.TYPE_OTHER; - } - else if ("car".equals(string.toLowerCase())) { - return ContactsContract.CommonDataKinds.Phone.TYPE_CAR; - } - else if ("company main".equals(string.toLowerCase())) { - return ContactsContract.CommonDataKinds.Phone.TYPE_COMPANY_MAIN; - } - else if ("isdn".equals(string.toLowerCase())) { - return ContactsContract.CommonDataKinds.Phone.TYPE_ISDN; - } - else if ("main".equals(string.toLowerCase())) { - return ContactsContract.CommonDataKinds.Phone.TYPE_MAIN; - } - else if ("other fax".equals(string.toLowerCase())) { - return ContactsContract.CommonDataKinds.Phone.TYPE_OTHER_FAX; - } - else if ("radio".equals(string.toLowerCase())) { - return ContactsContract.CommonDataKinds.Phone.TYPE_RADIO; - } - else if ("telex".equals(string.toLowerCase())) { - return ContactsContract.CommonDataKinds.Phone.TYPE_TELEX; - } - else if ("work mobile".equals(string.toLowerCase())) { - return ContactsContract.CommonDataKinds.Phone.TYPE_WORK_MOBILE; - } - else if ("work pager".equals(string.toLowerCase())) { - return ContactsContract.CommonDataKinds.Phone.TYPE_WORK_PAGER; - } - else if ("assistant".equals(string.toLowerCase())) { - return ContactsContract.CommonDataKinds.Phone.TYPE_ASSISTANT; - } - else if ("mms".equals(string.toLowerCase())) { - return ContactsContract.CommonDataKinds.Phone.TYPE_MMS; - } - else if ("callback".equals(string.toLowerCase())) { - return ContactsContract.CommonDataKinds.Phone.TYPE_CALLBACK; - } - else if ("tty ttd".equals(string.toLowerCase())) { - return ContactsContract.CommonDataKinds.Phone.TYPE_TTY_TDD; - } - else if ("custom".equals(string.toLowerCase())) { - return ContactsContract.CommonDataKinds.Phone.TYPE_CUSTOM; - } - } - return type; - } - - /** - * getPhoneType converts an Android phone type into a string - * @param type - * @return phone type as string. - */ - private String getPhoneType(int type) { - String stringType; - switch (type) { - case ContactsContract.CommonDataKinds.Phone.TYPE_CUSTOM: - stringType = "custom"; - break; - case ContactsContract.CommonDataKinds.Phone.TYPE_FAX_HOME: - stringType = "home fax"; - break; - case ContactsContract.CommonDataKinds.Phone.TYPE_FAX_WORK: - stringType = "work fax"; - break; - case ContactsContract.CommonDataKinds.Phone.TYPE_HOME: - stringType = "home"; - break; - case ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE: - stringType = "mobile"; - break; - case ContactsContract.CommonDataKinds.Phone.TYPE_PAGER: - stringType = "pager"; - break; - case ContactsContract.CommonDataKinds.Phone.TYPE_WORK: - stringType = "work"; - break; - case ContactsContract.CommonDataKinds.Phone.TYPE_CALLBACK: - stringType = "callback"; - break; - case ContactsContract.CommonDataKinds.Phone.TYPE_CAR: - stringType = "car"; - break; - case ContactsContract.CommonDataKinds.Phone.TYPE_COMPANY_MAIN: - stringType = "company main"; - break; - case ContactsContract.CommonDataKinds.Phone.TYPE_OTHER_FAX: - stringType = "other fax"; - break; - case ContactsContract.CommonDataKinds.Phone.TYPE_RADIO: - stringType = "radio"; - break; - case ContactsContract.CommonDataKinds.Phone.TYPE_TELEX: - stringType = "telex"; - break; - case ContactsContract.CommonDataKinds.Phone.TYPE_TTY_TDD: - stringType = "tty tdd"; - break; - case ContactsContract.CommonDataKinds.Phone.TYPE_WORK_MOBILE: - stringType = "work mobile"; - break; - case ContactsContract.CommonDataKinds.Phone.TYPE_WORK_PAGER: - stringType = "work pager"; - break; - case ContactsContract.CommonDataKinds.Phone.TYPE_ASSISTANT: - stringType = "assistant"; - break; - case ContactsContract.CommonDataKinds.Phone.TYPE_MMS: - stringType = "mms"; - break; - case ContactsContract.CommonDataKinds.Phone.TYPE_ISDN: - stringType = "isdn"; - break; - case ContactsContract.CommonDataKinds.Phone.TYPE_OTHER: - default: - stringType = "other"; - break; - } - return stringType; - } - - /** - * Converts a string from the W3C Contact API to it's Android int value. - * @param string - * @return Android int value - */ - private int getContactType(String string) { - int type = ContactsContract.CommonDataKinds.Email.TYPE_OTHER; - if (string != null) { - if ("home".equals(string.toLowerCase())) { - return ContactsContract.CommonDataKinds.Email.TYPE_HOME; - } - else if ("work".equals(string.toLowerCase())) { - return ContactsContract.CommonDataKinds.Email.TYPE_WORK; - } - else if ("other".equals(string.toLowerCase())) { - return ContactsContract.CommonDataKinds.Email.TYPE_OTHER; - } - else if ("mobile".equals(string.toLowerCase())) { - return ContactsContract.CommonDataKinds.Email.TYPE_MOBILE; - } - else if ("custom".equals(string.toLowerCase())) { - return ContactsContract.CommonDataKinds.Email.TYPE_CUSTOM; - } - } - return type; - } - - /** - * getPhoneType converts an Android phone type into a string - * @param type - * @return phone type as string. - */ - private String getContactType(int type) { - String stringType; - switch (type) { - case ContactsContract.CommonDataKinds.Email.TYPE_CUSTOM: - stringType = "custom"; - break; - case ContactsContract.CommonDataKinds.Email.TYPE_HOME: - stringType = "home"; - break; - case ContactsContract.CommonDataKinds.Email.TYPE_WORK: - stringType = "work"; - break; - case ContactsContract.CommonDataKinds.Email.TYPE_MOBILE: - stringType = "mobile"; - break; - case ContactsContract.CommonDataKinds.Email.TYPE_OTHER: - default: - stringType = "other"; - break; - } - return stringType; - } - - /** - * Converts a string from the W3C Contact API to it's Android int value. - * @param string - * @return Android int value - */ - private int getOrgType(String string) { - int type = ContactsContract.CommonDataKinds.Organization.TYPE_OTHER; - if (string != null) { - if ("work".equals(string.toLowerCase())) { - return ContactsContract.CommonDataKinds.Organization.TYPE_WORK; - } - else if ("other".equals(string.toLowerCase())) { - return ContactsContract.CommonDataKinds.Organization.TYPE_OTHER; - } - else if ("custom".equals(string.toLowerCase())) { - return ContactsContract.CommonDataKinds.Organization.TYPE_CUSTOM; - } - } - return type; - } - - /** - * getPhoneType converts an Android phone type into a string - * @param type - * @return phone type as string. - */ - private String getOrgType(int type) { - String stringType; - switch (type) { - case ContactsContract.CommonDataKinds.Organization.TYPE_CUSTOM: - stringType = "custom"; - break; - case ContactsContract.CommonDataKinds.Organization.TYPE_WORK: - stringType = "work"; - break; - case ContactsContract.CommonDataKinds.Organization.TYPE_OTHER: - default: - stringType = "other"; - break; - } - return stringType; - } - - /** - * Converts a string from the W3C Contact API to it's Android int value. - * @param string - * @return Android int value - */ - private int getAddressType(String string) { - int type = ContactsContract.CommonDataKinds.StructuredPostal.TYPE_OTHER; - if (string != null) { - if ("work".equals(string.toLowerCase())) { - return ContactsContract.CommonDataKinds.StructuredPostal.TYPE_WORK; - } - else if ("other".equals(string.toLowerCase())) { - return ContactsContract.CommonDataKinds.StructuredPostal.TYPE_OTHER; - } - else if ("home".equals(string.toLowerCase())) { - return ContactsContract.CommonDataKinds.StructuredPostal.TYPE_HOME; - } - } - return type; - } - - /** - * getPhoneType converts an Android phone type into a string - * @param type - * @return phone type as string. - */ - private String getAddressType(int type) { - String stringType; - switch (type) { - case ContactsContract.CommonDataKinds.StructuredPostal.TYPE_HOME: - stringType = "home"; - break; - case ContactsContract.CommonDataKinds.StructuredPostal.TYPE_WORK: - stringType = "work"; - break; - case ContactsContract.CommonDataKinds.StructuredPostal.TYPE_OTHER: - default: - stringType = "other"; - break; - } - return stringType; - } - - /** - * Converts a string from the W3C Contact API to it's Android int value. - * @param string - * @return Android int value - */ - private int getImType(String string) { - int type = ContactsContract.CommonDataKinds.Im.PROTOCOL_CUSTOM; - if (string != null) { - if ("aim".equals(string.toLowerCase())) { - return ContactsContract.CommonDataKinds.Im.PROTOCOL_AIM; - } - else if ("google talk".equals(string.toLowerCase())) { - return ContactsContract.CommonDataKinds.Im.PROTOCOL_GOOGLE_TALK; - } - else if ("icq".equals(string.toLowerCase())) { - return ContactsContract.CommonDataKinds.Im.PROTOCOL_ICQ; - } - else if ("jabber".equals(string.toLowerCase())) { - return ContactsContract.CommonDataKinds.Im.PROTOCOL_JABBER; - } - else if ("msn".equals(string.toLowerCase())) { - return ContactsContract.CommonDataKinds.Im.PROTOCOL_MSN; - } - else if ("netmeeting".equals(string.toLowerCase())) { - return ContactsContract.CommonDataKinds.Im.PROTOCOL_NETMEETING; - } - else if ("qq".equals(string.toLowerCase())) { - return ContactsContract.CommonDataKinds.Im.PROTOCOL_QQ; - } - else if ("skype".equals(string.toLowerCase())) { - return ContactsContract.CommonDataKinds.Im.PROTOCOL_SKYPE; - } - else if ("yahoo".equals(string.toLowerCase())) { - return ContactsContract.CommonDataKinds.Im.PROTOCOL_YAHOO; - } - } - return type; - } - - /** - * getPhoneType converts an Android phone type into a string - * @param type - * @return phone type as string. - */ - @SuppressWarnings("unused") - private String getImType(int type) { - String stringType; - switch (type) { - case ContactsContract.CommonDataKinds.Im.PROTOCOL_AIM: - stringType = "AIM"; - break; - case ContactsContract.CommonDataKinds.Im.PROTOCOL_GOOGLE_TALK: - stringType = "Google Talk"; - break; - case ContactsContract.CommonDataKinds.Im.PROTOCOL_ICQ: - stringType = "ICQ"; - break; - case ContactsContract.CommonDataKinds.Im.PROTOCOL_JABBER: - stringType = "Jabber"; - break; - case ContactsContract.CommonDataKinds.Im.PROTOCOL_MSN: - stringType = "MSN"; - break; - case ContactsContract.CommonDataKinds.Im.PROTOCOL_NETMEETING: - stringType = "NetMeeting"; - break; - case ContactsContract.CommonDataKinds.Im.PROTOCOL_QQ: - stringType = "QQ"; - break; - case ContactsContract.CommonDataKinds.Im.PROTOCOL_SKYPE: - stringType = "Skype"; - break; - case ContactsContract.CommonDataKinds.Im.PROTOCOL_YAHOO: - stringType = "Yahoo"; - break; - default: - stringType = "custom"; - break; - } - return stringType; - } -} - diff --git a/cordova-lib/spec-plugman/plugins/Contacts/src/android/ContactManager.java b/cordova-lib/spec-plugman/plugins/Contacts/src/android/ContactManager.java deleted file mode 100755 index 1c086e1f3..000000000 --- a/cordova-lib/spec-plugman/plugins/Contacts/src/android/ContactManager.java +++ /dev/null @@ -1,122 +0,0 @@ -/* - Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.0 (the - "License"); you may not use this file except in compliance - with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, - software distributed under the License is distributed on an - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - KIND, either express or implied. See the License for the - specific language governing permissions and limitations - under the License. -*/ -package org.apache.cordova.core; - -import org.apache.cordova.CallbackContext; -import org.apache.cordova.CordovaPlugin; -import org.apache.cordova.PluginResult; -import org.json.JSONArray; -import org.json.JSONException; -import org.json.JSONObject; -import android.util.Log; - -public class ContactManager extends CordovaPlugin { - - private ContactAccessor contactAccessor; - private static final String LOG_TAG = "Contact Query"; - - public static final int UNKNOWN_ERROR = 0; - public static final int INVALID_ARGUMENT_ERROR = 1; - public static final int TIMEOUT_ERROR = 2; - public static final int PENDING_OPERATION_ERROR = 3; - public static final int IO_ERROR = 4; - public static final int NOT_SUPPORTED_ERROR = 5; - public static final int PERMISSION_DENIED_ERROR = 20; - - /** - * Constructor. - */ - public ContactManager() { - } - - /** - * Executes the request and returns PluginResult. - * - * @param action The action to execute. - * @param args JSONArray of arguments for the plugin. - * @param callbackContext The callback context used when calling back into JavaScript. - * @return True if the action was valid, false otherwise. - */ - public boolean execute(String action, JSONArray args, final CallbackContext callbackContext) throws JSONException { - /** - * Check to see if we are on an Android 1.X device. If we are return an error as we - * do not support this as of Cordova 1.0. - */ - if (android.os.Build.VERSION.RELEASE.startsWith("1.")) { - callbackContext.sendPluginResult(new PluginResult(PluginResult.Status.ERROR, ContactManager.NOT_SUPPORTED_ERROR)); - return true; - } - - /** - * Only create the contactAccessor after we check the Android version or the program will crash - * older phones. - */ - if (this.contactAccessor == null) { - this.contactAccessor = new ContactAccessorSdk5(this.webView, this.cordova); - } - - if (action.equals("search")) { - final JSONArray filter = args.getJSONArray(0); - final JSONObject options = args.getJSONObject(1); - this.cordova.getThreadPool().execute(new Runnable() { - public void run() { - JSONArray res = contactAccessor.search(filter, options); - callbackContext.success(res); - } - }); - } - else if (action.equals("save")) { - final JSONObject contact = args.getJSONObject(0); - this.cordova.getThreadPool().execute(new Runnable() { - public void run() { - JSONObject res = null; - String id = contactAccessor.save(contact); - if (id != null) { - try { - res = contactAccessor.getContactById(id); - } catch (JSONException e) { - Log.e(LOG_TAG, "JSON fail.", e); - } - } - if (res != null) { - callbackContext.success(res); - } else { - callbackContext.sendPluginResult(new PluginResult(PluginResult.Status.ERROR, UNKNOWN_ERROR)); - } - } - }); - } - else if (action.equals("remove")) { - final String contactId = args.getString(0); - this.cordova.getThreadPool().execute(new Runnable() { - public void run() { - if (contactAccessor.remove(contactId)) { - callbackContext.success(); - } else { - callbackContext.sendPluginResult(new PluginResult(PluginResult.Status.ERROR, UNKNOWN_ERROR)); - } - } - }); - } - else { - return false; - } - return true; - } -} diff --git a/cordova-lib/spec-plugman/plugins/Contacts/src/blackberry10/ContactActivity.js b/cordova-lib/spec-plugman/plugins/Contacts/src/blackberry10/ContactActivity.js deleted file mode 100644 index f0f82b362..000000000 --- a/cordova-lib/spec-plugman/plugins/Contacts/src/blackberry10/ContactActivity.js +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright 2012 Research In Motion Limited. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -var ContactActivity = function (args) { - this.direction = args.direction || null; - this.description = args.description || ""; - this.mimeType = args.mimeType || ""; - this.timestamp = new Date(parseInt(args.timestamp, 10)) || null; -}; - -Object.defineProperty(ContactActivity, "INCOMING", {"value": true}); -Object.defineProperty(ContactActivity, "OUTGOING", {"value": false}); - -module.exports = ContactActivity; diff --git a/cordova-lib/spec-plugman/plugins/Contacts/src/blackberry10/ContactAddress.js b/cordova-lib/spec-plugman/plugins/Contacts/src/blackberry10/ContactAddress.js deleted file mode 100644 index 1ba9fe40a..000000000 --- a/cordova-lib/spec-plugman/plugins/Contacts/src/blackberry10/ContactAddress.js +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright 2012 Research In Motion Limited. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -var ContactAddress = function (properties) { - this.type = properties && properties.type ? properties.type : ""; - this.streetAddress = properties && properties.streetAddress ? properties.streetAddress : ""; - this.streetOther = properties && properties.streetOther ? properties.streetOther : ""; - this.locality = properties && properties.locality ? properties.locality : ""; - this.region = properties && properties.region ? properties.region : ""; - this.postalCode = properties && properties.postalCode ? properties.postalCode : ""; - this.country = properties && properties.country ? properties.country : ""; -}; - -Object.defineProperty(ContactAddress, "HOME", {"value": "home"}); -Object.defineProperty(ContactAddress, "WORK", {"value": "work"}); -Object.defineProperty(ContactAddress, "OTHER", {"value": "other"}); - -module.exports = ContactAddress; diff --git a/cordova-lib/spec-plugman/plugins/Contacts/src/blackberry10/ContactError.js b/cordova-lib/spec-plugman/plugins/Contacts/src/blackberry10/ContactError.js deleted file mode 100644 index f20f85e45..000000000 --- a/cordova-lib/spec-plugman/plugins/Contacts/src/blackberry10/ContactError.js +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright 2012 Research In Motion Limited. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -var ContactError = function (code, msg) { - this.code = code; - this.message = msg; -}; - -Object.defineProperty(ContactError, "UNKNOWN_ERROR", { "value": 0 }); -Object.defineProperty(ContactError, "INVALID_ARGUMENT_ERROR", { "value": 1 }); -Object.defineProperty(ContactError, "TIMEOUT_ERROR", { "value": 2 }); -Object.defineProperty(ContactError, "PENDING_OPERATION_ERROR", { "value": 3 }); -Object.defineProperty(ContactError, "IO_ERROR", { "value": 4 }); -Object.defineProperty(ContactError, "NOT_SUPPORTED_ERROR", { "value": 5 }); -Object.defineProperty(ContactError, "PERMISSION_DENIED_ERROR", { "value": 20 }); - -module.exports = ContactError; - diff --git a/cordova-lib/spec-plugman/plugins/Contacts/src/blackberry10/ContactField.js b/cordova-lib/spec-plugman/plugins/Contacts/src/blackberry10/ContactField.js deleted file mode 100644 index aad735c14..000000000 --- a/cordova-lib/spec-plugman/plugins/Contacts/src/blackberry10/ContactField.js +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Copyright 2012 Research In Motion Limited. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -var ContactField = function (type, value) { - this.type = type || ""; - this.value = value || ""; -}; - -Object.defineProperty(ContactField, "HOME", {"value": "home"}); -Object.defineProperty(ContactField, "WORK", {"value": "work"}); -Object.defineProperty(ContactField, "OTHER", {"value": "other"}); -Object.defineProperty(ContactField, "MOBILE", {"value": "mobile"}); -Object.defineProperty(ContactField, "DIRECT", {"value": "direct"}); - -module.exports = ContactField; diff --git a/cordova-lib/spec-plugman/plugins/Contacts/src/blackberry10/ContactFindOptions.js b/cordova-lib/spec-plugman/plugins/Contacts/src/blackberry10/ContactFindOptions.js deleted file mode 100644 index 8be830ddf..000000000 --- a/cordova-lib/spec-plugman/plugins/Contacts/src/blackberry10/ContactFindOptions.js +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright 2012 Research In Motion Limited. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * ContactFindOptions. - * @constructor - * @param filter search fields - * @param sort sort fields and order - * @param limit max number of contacts to return - * @param favorite if set, only favorite contacts will be returned - */ - -var ContactFindOptions = function (filter, sort, limit, favorite) { - this.filter = filter || null; - this.sort = sort || null; - this.limit = limit || -1; // -1 for returning all results - this.favorite = favorite || false; - this.includeAccounts = []; - this.excludeAccounts = []; -}; - -Object.defineProperty(ContactFindOptions, "SEARCH_FIELD_GIVEN_NAME", { "value": 0 }); -Object.defineProperty(ContactFindOptions, "SEARCH_FIELD_FAMILY_NAME", { "value": 1 }); -Object.defineProperty(ContactFindOptions, "SEARCH_FIELD_ORGANIZATION_NAME", { "value": 2 }); -Object.defineProperty(ContactFindOptions, "SEARCH_FIELD_PHONE", { "value": 3 }); -Object.defineProperty(ContactFindOptions, "SEARCH_FIELD_EMAIL", { "value": 4 }); -Object.defineProperty(ContactFindOptions, "SEARCH_FIELD_BBMPIN", { "value": 5 }); -Object.defineProperty(ContactFindOptions, "SEARCH_FIELD_LINKEDIN", { "value": 6 }); -Object.defineProperty(ContactFindOptions, "SEARCH_FIELD_TWITTER", { "value": 7 }); -Object.defineProperty(ContactFindOptions, "SEARCH_FIELD_VIDEO_CHAT", { "value": 8 }); - -Object.defineProperty(ContactFindOptions, "SORT_FIELD_GIVEN_NAME", { "value": 0 }); -Object.defineProperty(ContactFindOptions, "SORT_FIELD_FAMILY_NAME", { "value": 1 }); -Object.defineProperty(ContactFindOptions, "SORT_FIELD_ORGANIZATION_NAME", { "value": 2 }); - -module.exports = ContactFindOptions; - diff --git a/cordova-lib/spec-plugman/plugins/Contacts/src/blackberry10/ContactName.js b/cordova-lib/spec-plugman/plugins/Contacts/src/blackberry10/ContactName.js deleted file mode 100644 index 9b7475347..000000000 --- a/cordova-lib/spec-plugman/plugins/Contacts/src/blackberry10/ContactName.js +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright 2012 Research In Motion Limited. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -function toFormattedName(properties) { - var formatted = ""; - if (properties && properties.givenName) { - formatted = properties.givenName; - if (properties && properties.familyName) { - formatted += " " + properties.familyName; - } - } - return formatted; -} - -var ContactName = function (properties) { - this.familyName = properties && properties.familyName ? properties.familyName : ""; - this.givenName = properties && properties.givenName ? properties.givenName : ""; - this.formatted = toFormattedName(properties); - this.middleName = properties && properties.middleName ? properties.middleName : ""; - this.honorificPrefix = properties && properties.honorificPrefix ? properties.honorificPrefix : ""; - this.honorificSuffix = properties && properties.honorificSuffix ? properties.honorificSuffix : ""; - this.phoneticFamilyName = properties && properties.phoneticFamilyName ? properties.phoneticFamilyName : ""; - this.phoneticGivenName = properties && properties.phoneticGivenName ? properties.phoneticGivenName : ""; -}; - -module.exports = ContactName; diff --git a/cordova-lib/spec-plugman/plugins/Contacts/src/blackberry10/ContactNews.js b/cordova-lib/spec-plugman/plugins/Contacts/src/blackberry10/ContactNews.js deleted file mode 100644 index 9fb86dcda..000000000 --- a/cordova-lib/spec-plugman/plugins/Contacts/src/blackberry10/ContactNews.js +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright 2012 Research In Motion Limited. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -var ContactNews = function (args) { - this.title = args.title || ""; - this.body = args.body || ""; - this.articleSource = args.articleSource || ""; - this.companies = args.companies || []; - this.publishedAt = new Date(parseInt(args.publishedAt, 10)) || null; - this.uri = args.uri || ""; - this.type = args.type || ""; -}; - -module.exports = ContactNews; diff --git a/cordova-lib/spec-plugman/plugins/Contacts/src/blackberry10/ContactOrganization.js b/cordova-lib/spec-plugman/plugins/Contacts/src/blackberry10/ContactOrganization.js deleted file mode 100644 index 987310f7c..000000000 --- a/cordova-lib/spec-plugman/plugins/Contacts/src/blackberry10/ContactOrganization.js +++ /dev/null @@ -1,22 +0,0 @@ -/* - * Copyright 2012 Research In Motion Limited. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -var ContactOrganization = function (properties) { - this.name = properties && properties.name ? properties.name : ""; - this.department = properties && properties.department ? properties.department : ""; - this.title = properties && properties.title ? properties.title : ""; -}; - -module.exports = ContactOrganization; diff --git a/cordova-lib/spec-plugman/plugins/Contacts/src/blackberry10/ContactPhoto.js b/cordova-lib/spec-plugman/plugins/Contacts/src/blackberry10/ContactPhoto.js deleted file mode 100644 index eeaa2632e..000000000 --- a/cordova-lib/spec-plugman/plugins/Contacts/src/blackberry10/ContactPhoto.js +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright 2012 Research In Motion Limited. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -var ContactPhoto = function (originalFilePath, pref) { - this.originalFilePath = originalFilePath || ""; - this.pref = pref || false; - this.largeFilePath = ""; - this.smallFilePath = ""; -}; - -module.exports = ContactPhoto; diff --git a/cordova-lib/spec-plugman/plugins/Contacts/src/blackberry10/contactConsts.js b/cordova-lib/spec-plugman/plugins/Contacts/src/blackberry10/contactConsts.js deleted file mode 100644 index ef2520620..000000000 --- a/cordova-lib/spec-plugman/plugins/Contacts/src/blackberry10/contactConsts.js +++ /dev/null @@ -1,225 +0,0 @@ -/* -* Copyright 2012 Research In Motion Limited. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -var ATTRIBUTE_KIND, - ATTRIBUTE_SUBKIND, - kindAttributeMap = {}, - subKindAttributeMap = {}, - _TITLE = 26, - _START_DATE = 43, - _END_DATE = 44; - -function populateKindAttributeMap() { - ATTRIBUTE_KIND = { - Invalid: 0, - Phone: 1, - Fax: 2, - Pager: 3, - Email: 4, - Website: 5, - Feed: 6, - Profile: 7, - Family: 8, - Person: 9, - Date: 10, - Group: 11, - Name: 12, - StockSymbol: 13, - Ranking: 14, - OrganizationAffiliation: 15, - Education: 16, - Note: 17, - InstantMessaging: 18, - VideoChat: 19, - ConnectionCount: 20, - Hidden: 21, - Biography: 22, - Sound: 23, - Notification: 24, - MessageSound: 25, - MessageNotification: 26 - }; - - kindAttributeMap[ATTRIBUTE_KIND.Phone] = "phoneNumbers"; - kindAttributeMap[ATTRIBUTE_KIND.Fax] = "faxNumbers"; - kindAttributeMap[ATTRIBUTE_KIND.Pager] = "pagerNumber"; - kindAttributeMap[ATTRIBUTE_KIND.Email] = "emails"; - kindAttributeMap[ATTRIBUTE_KIND.Website] = "urls"; - kindAttributeMap[ATTRIBUTE_KIND.Profile] = "socialNetworks"; - kindAttributeMap[ATTRIBUTE_KIND.OrganizationAffiliation] = "organizations"; - kindAttributeMap[ATTRIBUTE_KIND.Education] = "education"; - kindAttributeMap[ATTRIBUTE_KIND.Note] = "note"; - kindAttributeMap[ATTRIBUTE_KIND.InstantMessaging] = "ims"; - kindAttributeMap[ATTRIBUTE_KIND.VideoChat] = "videoChat"; - kindAttributeMap[ATTRIBUTE_KIND.Sound] = "ringtone"; -} - -function populateSubKindAttributeMap() { - ATTRIBUTE_SUBKIND = { - Invalid: 0, - Other: 1, - Home: 2, - Work: 3, - PhoneMobile: 4, - FaxDirect: 5, - Blog: 6, - WebsiteResume: 7, - WebsitePortfolio: 8, - WebsitePersonal: 9, - WebsiteCompany: 10, - ProfileFacebook: 11, - ProfileTwitter: 12, - ProfileLinkedIn: 13, - ProfileGist: 14, - ProfileTungle: 15, - FamilySpouse: 16, - FamilyChild: 17, - FamilyParent: 18, - PersonManager: 19, - PersonAssistant: 20, - DateBirthday: 21, - DateAnniversary: 22, - GroupDepartment: 23, - NameGiven: 24, - NameSurname: 25, - Title: _TITLE, - NameSuffix: 27, - NameMiddle: 28, - NameNickname: 29, - NameAlias: 30, - NameDisplayName: 31, - NamePhoneticGiven: 32, - NamePhoneticSurname: 33, - StockSymbolNyse: 34, - StockSymbolNasdaq: 35, - StockSymbolTse: 36, - StockSymbolLse: 37, - StockSymbolTsx: 38, - RankingKlout: 39, - RankingTrstRank: 40, - OrganizationAffiliationName: 41, - OrganizationAffiliationPhoneticName: 42, - OrganizationAffiliationTitle: _TITLE, - StartDate: _START_DATE, - EndDate: _END_DATE, - OrganizationAffiliationDetails: 45, - EducationInstitutionName: 46, - EducationStartDate: _START_DATE, - EducationEndDate: _END_DATE, - EducationDegree: 47, - EducationConcentration: 48, - EducationActivities: 49, - EducationNotes: 50, - InstantMessagingBbmPin: 51, - InstantMessagingAim: 52, - InstantMessagingAliwangwang: 53, - InstantMessagingGoogleTalk: 54, - InstantMessagingSametime: 55, - InstantMessagingIcq: 56, - InstantMessagingIrc: 57, - InstantMessagingJabber: 58, - InstantMessagingMsLcs: 59, - InstantMessagingMsn: 60, - InstantMessagingQq: 61, - InstantMessagingSkype: 62, - InstantMessagingYahooMessenger: 63, - InstantMessagingYahooMessengerJapan: 64, - VideoChatBbPlaybook: 65, - HiddenLinkedIn: 66, - HiddenFacebook: 67, - HiddenTwitter: 68, - ConnectionCountLinkedIn: 69, - ConnectionCountFacebook: 70, - ConnectionCountTwitter: 71, - HiddenChecksum: 72, - HiddenSpeedDial: 73, - BiographyFacebook: 74, - BiographyTwitter: 75, - BiographyLinkedIn: 76, - SoundRingtone: 77, - SimContactType: 78, - EcoID: 79, - Personal: 80, - StockSymbolAll: 81, - NotificationVibration: 82, - NotificationLED: 83, - MessageNotificationVibration: 84, - MessageNotificationLED: 85, - MessageNotificationDuringCall: 86, - VideoChatPin: 87 - }; - - subKindAttributeMap[ATTRIBUTE_SUBKIND.Other] = "other"; - subKindAttributeMap[ATTRIBUTE_SUBKIND.Home] = "home"; - subKindAttributeMap[ATTRIBUTE_SUBKIND.Work] = "work"; - subKindAttributeMap[ATTRIBUTE_SUBKIND.PhoneMobile] = "mobile"; - subKindAttributeMap[ATTRIBUTE_SUBKIND.FaxDirect] = "direct"; - subKindAttributeMap[ATTRIBUTE_SUBKIND.Blog] = "blog"; - subKindAttributeMap[ATTRIBUTE_SUBKIND.WebsiteResume] = "resume"; - subKindAttributeMap[ATTRIBUTE_SUBKIND.WebsitePortfolio] = "portfolio"; - subKindAttributeMap[ATTRIBUTE_SUBKIND.WebsitePersonal] = "personal"; - subKindAttributeMap[ATTRIBUTE_SUBKIND.WebsiteCompany] = "company"; - subKindAttributeMap[ATTRIBUTE_SUBKIND.ProfileFacebook] = "facebook"; - subKindAttributeMap[ATTRIBUTE_SUBKIND.ProfileTwitter] = "twitter"; - subKindAttributeMap[ATTRIBUTE_SUBKIND.ProfileLinkedIn] = "linkedin"; - subKindAttributeMap[ATTRIBUTE_SUBKIND.ProfileGist] = "gist"; - subKindAttributeMap[ATTRIBUTE_SUBKIND.ProfileTungle] = "tungle"; - subKindAttributeMap[ATTRIBUTE_SUBKIND.DateBirthday] = "birthday"; - subKindAttributeMap[ATTRIBUTE_SUBKIND.DateAnniversary] = "anniversary"; - subKindAttributeMap[ATTRIBUTE_SUBKIND.NameGiven] = "givenName"; - subKindAttributeMap[ATTRIBUTE_SUBKIND.NameSurname] = "familyName"; - subKindAttributeMap[ATTRIBUTE_SUBKIND.Title] = "honorificPrefix"; - subKindAttributeMap[ATTRIBUTE_SUBKIND.NameSuffix] = "honorificSuffix"; - subKindAttributeMap[ATTRIBUTE_SUBKIND.NameMiddle] = "middleName"; - subKindAttributeMap[ATTRIBUTE_SUBKIND.NamePhoneticGiven] = "phoneticGivenName"; - subKindAttributeMap[ATTRIBUTE_SUBKIND.NamePhoneticSurname] = "phoneticFamilyName"; - subKindAttributeMap[ATTRIBUTE_SUBKIND.NameNickname] = "nickname"; - subKindAttributeMap[ATTRIBUTE_SUBKIND.NameDisplayName] = "displayName"; - subKindAttributeMap[ATTRIBUTE_SUBKIND.OrganizationAffiliationName] = "name"; - subKindAttributeMap[ATTRIBUTE_SUBKIND.OrganizationAffiliationDetails] = "department"; - subKindAttributeMap[ATTRIBUTE_SUBKIND.Title] = "title"; - subKindAttributeMap[ATTRIBUTE_SUBKIND.InstantMessagingBbmPin] = "BbmPin"; - subKindAttributeMap[ATTRIBUTE_SUBKIND.InstantMessagingAim] = "Aim"; - subKindAttributeMap[ATTRIBUTE_SUBKIND.InstantMessagingAliwangwang] = "Aliwangwang"; - subKindAttributeMap[ATTRIBUTE_SUBKIND.InstantMessagingGoogleTalk] = "GoogleTalk"; - subKindAttributeMap[ATTRIBUTE_SUBKIND.InstantMessagingSametime] = "Sametime"; - subKindAttributeMap[ATTRIBUTE_SUBKIND.InstantMessagingIcq] = "Icq"; - subKindAttributeMap[ATTRIBUTE_SUBKIND.InstantMessagingJabber] = "Jabber"; - subKindAttributeMap[ATTRIBUTE_SUBKIND.InstantMessagingMsLcs] = "MsLcs"; - subKindAttributeMap[ATTRIBUTE_SUBKIND.InstantMessagingSkype] = "Skype"; - subKindAttributeMap[ATTRIBUTE_SUBKIND.InstantMessagingYahooMessenger] = "YahooMessenger"; - subKindAttributeMap[ATTRIBUTE_SUBKIND.InstantMessagingYahooMessengerJapan] = "YahooMessegerJapan"; - subKindAttributeMap[ATTRIBUTE_SUBKIND.VideoChatBbPlaybook] = "BbPlaybook"; - subKindAttributeMap[ATTRIBUTE_SUBKIND.SoundRingtone] = "ringtone"; - subKindAttributeMap[ATTRIBUTE_SUBKIND.Personal] = "personal"; -} - -module.exports = { - getKindAttributeMap: function () { - if (!ATTRIBUTE_KIND) { - populateKindAttributeMap(); - } - - return kindAttributeMap; - }, - getSubKindAttributeMap: function () { - if (!ATTRIBUTE_SUBKIND) { - populateSubKindAttributeMap(); - } - - return subKindAttributeMap; - } -}; diff --git a/cordova-lib/spec-plugman/plugins/Contacts/src/blackberry10/contactUtils.js b/cordova-lib/spec-plugman/plugins/Contacts/src/blackberry10/contactUtils.js deleted file mode 100644 index cd022c4fa..000000000 --- a/cordova-lib/spec-plugman/plugins/Contacts/src/blackberry10/contactUtils.js +++ /dev/null @@ -1,223 +0,0 @@ -/* - * Copyright 2012 Research In Motion Limited. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -var self, - ContactFindOptions = require("./ContactFindOptions"), - ContactError = require("./ContactError"), - ContactName = require("./ContactName"), - ContactOrganization = require("./ContactOrganization"), - ContactAddress = require("./ContactAddress"), - ContactField = require("./ContactField"), - contactConsts = require("./contactConsts"), - ContactPhoto = require("./ContactPhoto"), - ContactNews = require("./ContactNews"), - ContactActivity = require("./ContactActivity"); - -function populateFieldArray(contactProps, field, ClassName) { - if (contactProps[field]) { - var list = [], - obj; - - contactProps[field].forEach(function (args) { - if (ClassName === ContactField) { - list.push(new ClassName(args.type, args.value)); - } else if (ClassName === ContactPhoto) { - obj = new ContactPhoto(args.originalFilePath, args.pref); - obj.largeFilePath = args.largeFilePath; - obj.smallFilePath = args.smallFilePath; - list.push(obj); - } else if (ClassName === ContactNews) { - obj = new ContactNews(args); - list.push(obj); - } else if (ClassName === ContactActivity) { - obj = new ContactActivity(args); - list.push(obj); - } else { - list.push(new ClassName(args)); - } - }); - contactProps[field] = list; - } -} - -function populateDate(contactProps, field) { - if (contactProps[field]) { - contactProps[field] = new Date(contactProps[field]); - } -} - -function validateFindArguments(findOptions) { - var error = false; - - // findOptions is mandatory - if (!findOptions) { - error = true; - } else { - // findOptions.filter is optional - if (findOptions.filter) { - findOptions.filter.forEach(function (f) { - switch (f.fieldName) { - case ContactFindOptions.SEARCH_FIELD_GIVEN_NAME: - case ContactFindOptions.SEARCH_FIELD_FAMILY_NAME: - case ContactFindOptions.SEARCH_FIELD_ORGANIZATION_NAME: - case ContactFindOptions.SEARCH_FIELD_PHONE: - case ContactFindOptions.SEARCH_FIELD_EMAIL: - case ContactFindOptions.SEARCH_FIELD_BBMPIN: - case ContactFindOptions.SEARCH_FIELD_LINKEDIN: - case ContactFindOptions.SEARCH_FIELD_TWITTER: - case ContactFindOptions.SEARCH_FIELD_VIDEO_CHAT: - break; - default: - error = true; - } - - if (!f.fieldValue) { - error = true; - } - }); - } - - //findOptions.limit is optional - if (findOptions.limit) { - if (typeof findOptions.limit !== "number") { - error = true; - } - } - - //findOptions.favorite is optional - if (findOptions.favorite) { - if (typeof findOptions.favorite !== "boolean") { - error = true; - } - } - - // findOptions.sort is optional - if (!error && findOptions.sort && Array.isArray(findOptions.sort)) { - findOptions.sort.forEach(function (s) { - switch (s.fieldName) { - case ContactFindOptions.SORT_FIELD_GIVEN_NAME: - case ContactFindOptions.SORT_FIELD_FAMILY_NAME: - case ContactFindOptions.SORT_FIELD_ORGANIZATION_NAME: - break; - default: - error = true; - } - - if (s.desc === undefined || typeof s.desc !== "boolean") { - error = true; - } - }); - } - - if (!error && findOptions.includeAccounts) { - if (!Array.isArray(findOptions.includeAccounts)) { - error = true; - } else { - findOptions.includeAccounts.forEach(function (acct) { - if (!error && (!acct.id || window.isNaN(window.parseInt(acct.id, 10)))) { - error = true; - } - }); - } - } - - if (!error && findOptions.excludeAccounts) { - if (!Array.isArray(findOptions.excludeAccounts)) { - error = true; - } else { - findOptions.excludeAccounts.forEach(function (acct) { - if (!error && (!acct.id || window.isNaN(window.parseInt(acct.id, 10)))) { - error = true; - } - }); - } - } - } - return !error; -} - -function validateContactsPickerFilter(filter) { - var isValid = true, - availableFields = {}; - - if (typeof(filter) === "undefined") { - isValid = false; - } else { - if (filter && Array.isArray(filter)) { - availableFields = contactConsts.getKindAttributeMap(); - filter.forEach(function (e) { - isValid = isValid && Object.getOwnPropertyNames(availableFields).reduce( - function (found, key) { - return found || availableFields[key] === e; - }, false); - }); - } - } - - return isValid; -} - -function validateContactsPickerOptions(options) { - var isValid = false, - mode = options.mode; - - if (typeof(options) === "undefined") { - isValid = false; - } else { - isValid = mode === ContactPickerOptions.MODE_SINGLE || mode === ContactPickerOptions.MODE_MULTIPLE || mode === ContactPickerOptions.MODE_ATTRIBUTE; - - // if mode is attribute, fields must be defined - if (mode === ContactPickerOptions.MODE_ATTRIBUTE && !validateContactsPickerFilter(options.fields)) { - isValid = false; - } - } - - return isValid; -} - -self = module.exports = { - populateContact: function (contact) { - if (contact.name) { - contact.name = new ContactName(contact.name); - } - - populateFieldArray(contact, "addresses", ContactAddress); - populateFieldArray(contact, "organizations", ContactOrganization); - populateFieldArray(contact, "emails", ContactField); - populateFieldArray(contact, "phoneNumbers", ContactField); - populateFieldArray(contact, "faxNumbers", ContactField); - populateFieldArray(contact, "pagerNumbers", ContactField); - populateFieldArray(contact, "ims", ContactField); - populateFieldArray(contact, "socialNetworks", ContactField); - populateFieldArray(contact, "urls", ContactField); - populateFieldArray(contact, "photos", ContactPhoto); - populateFieldArray(contact, "news", ContactNews); - populateFieldArray(contact, "activities", ContactActivity); - // TODO categories - - populateDate(contact, "birthday"); - populateDate(contact, "anniversary"); - }, - invokeErrorCallback: function (errorCallback, code) { - if (errorCallback) { - errorCallback(new ContactError(code)); - } - }, - validateFindArguments: validateFindArguments, - validateContactsPickerFilter: validateContactsPickerFilter, - validateContactsPickerOptions: validateContactsPickerOptions -}; - diff --git a/cordova-lib/spec-plugman/plugins/Contacts/src/blackberry10/index.js b/cordova-lib/spec-plugman/plugins/Contacts/src/blackberry10/index.js deleted file mode 100644 index 09a4bd2a5..000000000 --- a/cordova-lib/spec-plugman/plugins/Contacts/src/blackberry10/index.js +++ /dev/null @@ -1,374 +0,0 @@ -/* - * Copyright 2013 Research In Motion Limited. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -var pimContacts, - contactUtils = require("./contactUtils"), - contactConsts = require("./contactConsts"), - ContactError = require("./ContactError"), - ContactName = require("./ContactName"), - ContactFindOptions = require("./ContactFindOptions"), - noop = function () {}; - -function getAccountFilters(options) { - if (options.includeAccounts) { - options.includeAccounts = options.includeAccounts.map(function (acct) { - return acct.id.toString(); - }); - } - - if (options.excludeAccounts) { - options.excludeAccounts = options.excludeAccounts.map(function (acct) { - return acct.id.toString(); - }); - } -} - -function populateSearchFields(fields) { - var i, - l, - key, - searchFieldsObject = {}, - searchFields = []; - - for (i = 0, l = fields.length; i < l; i++) { - if (fields[i] === "*") { - searchFieldsObject[ContactFindOptions.SEARCH_FIELD_GIVEN_NAME] = true; - searchFieldsObject[ContactFindOptions.SEARCH_FIELD_FAMILY_NAME] = true; - searchFieldsObject[ContactFindOptions.SEARCH_FIELD_PHONE] = true; - searchFieldsObject[ContactFindOptions.SEARCH_FIELD_EMAIL] = true; - searchFieldsObject[ContactFindOptions.SEARCH_FIELD_ORGANIZATION_NAME] = true; - } else if (fields[i] === "displayName" || fields[i] === "name") { - searchFieldsObject[ContactFindOptions.SEARCH_FIELD_GIVEN_NAME] = true; - searchFieldsObject[ContactFindOptions.SEARCH_FIELD_FAMILY_NAME] = true; - } else if (fields[i] === "nickname") { - // not supported by Cascades - } else if (fields[i] === "phoneNumbers") { - searchFieldsObject[ContactFindOptions.SEARCH_FIELD_PHONE] = true; - } else if (fields[i] === "emails") { - searchFieldsObject[ContactFindOptions.SEARCH_FIELD_EMAIL] = true; - } else if (field === "addresses") { - // not supported by Cascades - } else if (field === "ims") { - // not supported by Cascades - } else if (field === "organizations") { - searchFieldsObject[ContactFindOptions.SEARCH_FIELD_ORGANIZATION_NAME] = true; - } else if (field === "birthday") { - // not supported by Cascades - } else if (field === "note") { - // not supported by Cascades - } else if (field === "photos") { - // not supported by Cascades - } else if (field === "categories") { - // not supported by Cascades - } else if (field === "urls") { - // not supported by Cascades - } - } - - for (key in searchFieldsObject) { - if (searchFieldsObject.hasOwnProperty(key)) { - searchFields.push(window.parseInt(key)); - } - } - - return searchFields; -} - -function convertBirthday(birthday) { - //Convert date string from native to milliseconds since epoch for cordova-js - var birthdayInfo; - if (birthday) { - birthdayInfo = birthday.split("-"); - return new Date(birthdayInfo[0], birthdayInfo[1] - 1, birthdayInfo[2]).getTime(); - } else { - return null; - } -} - -function processJnextSaveData(result, JnextData) { - var data = JnextData, - birthdayInfo; - - if (data._success === true) { - data.birthday = convertBirthday(data.birthday); - result.callbackOk(data, false); - } else { - result.callbackError(data.code, false); - } -} - -function processJnextRemoveData(result, JnextData) { - var data = JnextData; - - if (data._success === true) { - result.callbackOk(data); - } else { - result.callbackError(ContactError.UNKNOWN_ERROR, false); - } -} - -function processJnextFindData(eventId, eventHandler, JnextData) { - var data = JnextData, - i, - l, - more = false, - resultsObject = {}, - birthdayInfo; - - if (data.contacts) { - for (i = 0, l = data.contacts.length; i < l; i++) { - data.contacts[i].birthday = convertBirthday(data.contacts[i].birthday); - data.contacts[i].name = new ContactName(data.contacts[i].name); - } - } else { - data.contacts = []; // if JnextData.contacts return null, return an empty array - } - - if (data._success === true) { - eventHandler.error = false; - } - - if (eventHandler.multiple) { - // Concatenate results; do not add the same contacts - for (i = 0, l = eventHandler.searchResult.length; i < l; i++) { - resultsObject[eventHandler.searchResult[i].id] = true; - } - - for (i = 0, l = data.contacts.length; i < l; i++) { - if (resultsObject[data.contacts[i].id]) { - // Already existing - } else { - eventHandler.searchResult.push(data.contacts[i]); - } - } - - // check if more search is required - eventHandler.searchFieldIndex++; - if (eventHandler.searchFieldIndex < eventHandler.searchFields.length) { - more = true; - } - } else { - eventHandler.searchResult = data.contacts; - } - - if (more) { - pimContacts.getInstance().invokeJnextSearch(eventId); - } else { - if (eventHandler.error) { - eventHandler.result.callbackError(data.code, false); - } else { - eventHandler.result.callbackOk(eventHandler.searchResult, false); - } - } -} - -module.exports = { - search: function (successCb, failCb, args, env) { - var cordovaFindOptions = {}, - result = new PluginResult(args, env), - key; - - for (key in args) { - if (args.hasOwnProperty(key)) { - cordovaFindOptions[key] = JSON.parse(decodeURIComponent(args[key])); - } - } - - pimContacts.getInstance().find(cordovaFindOptions, result, processJnextFindData); - result.noResult(true); - }, - save: function (successCb, failCb, args, env) { - var attributes = {}, - result = new PluginResult(args, env), - key, - nativeEmails = []; - - attributes = JSON.parse(decodeURIComponent(args[0])); - - //convert birthday format for our native .so file - if (attributes.birthday) { - attributes.birthday = new Date(attributes.birthday).toDateString(); - } - - if (attributes.emails) { - attributes.emails.forEach(function (email) { - if (email.value) { - if (email.type) { - nativeEmails.push({ "type" : email.type, "value" : email.value }); - } else { - nativeEmails.push({ "type" : "home", "value" : email.value }); - } - } - }); - attributes.emails = nativeEmails; - } - - if (attributes.id !== null) { - attributes.id = window.parseInt(attributes.id); - } - - attributes._eventId = result.callbackId; - pimContacts.getInstance().save(attributes, result, processJnextSaveData); - result.noResult(true); - }, - remove: function (successCb, failCb, args, env) { - var result = new PluginResult(args, env), - attributes = { - "contactId": window.parseInt(JSON.parse(decodeURIComponent(args[0]))), - "_eventId": result.callbackId - }; - - if (!window.isNaN(attributes.contactId)) { - pimContacts.getInstance().remove(attributes, result, processJnextRemoveData); - result.noResult(true); - } else { - result.error(ContactError.UNKNOWN_ERROR); - result.noResult(false); - } - } -}; - -/////////////////////////////////////////////////////////////////// -// JavaScript wrapper for JNEXT plugin -/////////////////////////////////////////////////////////////////// - -JNEXT.PimContacts = function () -{ - var self = this, - hasInstance = false; - - self.find = function (cordovaFindOptions, pluginResult, handler) { - //register find eventHandler for when JNEXT onEvent fires - self.eventHandlers[cordovaFindOptions.callbackId] = { - "result" : pluginResult, - "action" : "find", - "multiple" : cordovaFindOptions[1].filter ? true : false, - "fields" : cordovaFindOptions[0], - "searchFilter" : cordovaFindOptions[1].filter, - "searchFields" : cordovaFindOptions[1].filter ? populateSearchFields(cordovaFindOptions[0]) : null, - "searchFieldIndex" : 0, - "searchResult" : [], - "handler" : handler, - "error" : true - }; - - self.invokeJnextSearch(cordovaFindOptions.callbackId); - return ""; - }; - - self.invokeJnextSearch = function(eventId) { - var jnextArgs = {}, - findHandler = self.eventHandlers[eventId]; - - jnextArgs._eventId = eventId; - jnextArgs.fields = findHandler.fields; - jnextArgs.options = {}; - jnextArgs.options.filter = []; - - if (findHandler.multiple) { - jnextArgs.options.filter.push({ - "fieldName" : findHandler.searchFields[findHandler.searchFieldIndex], - "fieldValue" : findHandler.searchFilter - }); - //findHandler.searchFieldIndex++; - } - - JNEXT.invoke(self.m_id, "find " + JSON.stringify(jnextArgs)); - } - - self.getContact = function (args) { - return JSON.parse(JNEXT.invoke(self.m_id, "getContact " + JSON.stringify(args))); - }; - - self.save = function (args, pluginResult, handler) { - //register save eventHandler for when JNEXT onEvent fires - self.eventHandlers[args._eventId] = { - "result" : pluginResult, - "action" : "save", - "handler" : handler - }; - JNEXT.invoke(self.m_id, "save " + JSON.stringify(args)); - return ""; - }; - - self.remove = function (args, pluginResult, handler) { - //register remove eventHandler for when JNEXT onEvent fires - self.eventHandlers[args._eventId] = { - "result" : pluginResult, - "action" : "remove", - "handler" : handler - }; - JNEXT.invoke(self.m_id, "remove " + JSON.stringify(args)); - return ""; - }; - - self.getId = function () { - return self.m_id; - }; - - self.getContactAccounts = function () { - var value = JNEXT.invoke(self.m_id, "getContactAccounts"); - return JSON.parse(value); - }; - - self.init = function () { - if (!JNEXT.require("libpimcontacts")) { - return false; - } - - self.m_id = JNEXT.createObject("libpimcontacts.PimContacts"); - - if (self.m_id === "") { - return false; - } - - JNEXT.registerEvents(self); - }; - - // Handle data coming back from JNEXT native layer. Each async function registers a handler and a PluginResult object. - // When JNEXT fires onEvent we parse the result string back into JSON and trigger the appropriate handler (eventHandlers map - // uses callbackId as key), along with the actual data coming back from the native layer. Each function may have its own way of - // processing native data so we do not do any processing here. - - self.onEvent = function (strData) { - var arData = strData.split(" "), - strEventDesc = arData[0], - eventHandler, - args = {}; - - if (strEventDesc === "result") { - args.result = escape(strData.split(" ").slice(2).join(" ")); - eventHandler = self.eventHandlers[arData[1]]; - if (eventHandler.action === "save" || eventHandler.action === "remove") { - eventHandler.handler(eventHandler.result, JSON.parse(decodeURIComponent(args.result))); - } else if (eventHandler.action === "find") { - eventHandler.handler(arData[1], eventHandler, JSON.parse(decodeURIComponent(args.result))); - } - } - }; - - self.m_id = ""; - self.eventHandlers = {}; - - self.getInstance = function () { - if (!hasInstance) { - self.init(); - hasInstance = true; - } - return self; - }; -}; - -pimContacts = new JNEXT.PimContacts(); diff --git a/cordova-lib/spec-plugman/plugins/Contacts/src/blackberry10/plugin.xml b/cordova-lib/spec-plugman/plugins/Contacts/src/blackberry10/plugin.xml deleted file mode 100644 index d163585f2..000000000 --- a/cordova-lib/spec-plugman/plugins/Contacts/src/blackberry10/plugin.xml +++ /dev/null @@ -1,41 +0,0 @@ - - - - - - Contacts - - - - - - - - - - - - - - - - - - - diff --git a/cordova-lib/spec-plugman/plugins/Contacts/src/ios/CDVContact.h b/cordova-lib/spec-plugman/plugins/Contacts/src/ios/CDVContact.h deleted file mode 100644 index 5187efcdf..000000000 --- a/cordova-lib/spec-plugman/plugins/Contacts/src/ios/CDVContact.h +++ /dev/null @@ -1,136 +0,0 @@ -/* - Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.0 (the - "License"); you may not use this file except in compliance - with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, - software distributed under the License is distributed on an - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - KIND, either express or implied. See the License for the - specific language governing permissions and limitations - under the License. - */ - -#import -#import -#import - -enum CDVContactError { - UNKNOWN_ERROR = 0, - INVALID_ARGUMENT_ERROR = 1, - TIMEOUT_ERROR = 2, - PENDING_OPERATION_ERROR = 3, - IO_ERROR = 4, - NOT_SUPPORTED_ERROR = 5, - PERMISSION_DENIED_ERROR = 20 -}; -typedef NSUInteger CDVContactError; - -@interface CDVContact : NSObject { - ABRecordRef record; // the ABRecord associated with this contact - NSDictionary* returnFields; // dictionary of fields to return when performing search -} - -@property (nonatomic, assign) ABRecordRef record; -@property (nonatomic, strong) NSDictionary* returnFields; - -+ (NSDictionary*)defaultABtoW3C; -+ (NSDictionary*)defaultW3CtoAB; -+ (NSSet*)defaultW3CtoNull; -+ (NSDictionary*)defaultObjectAndProperties; -+ (NSDictionary*)defaultFields; - -+ (NSDictionary*)calcReturnFields:(NSArray*)fields; -- (id)init; -- (id)initFromABRecord:(ABRecordRef)aRecord; -- (bool)setFromContactDict:(NSDictionary*)aContact asUpdate:(BOOL)bUpdate; - -+ (BOOL)needsConversion:(NSString*)W3Label; -+ (CFStringRef)convertContactTypeToPropertyLabel:(NSString*)label; -+ (NSString*)convertPropertyLabelToContactType:(NSString*)label; -+ (BOOL)isValidW3ContactType:(NSString*)label; -- (bool)setValue:(id)aValue forProperty:(ABPropertyID)aProperty inRecord:(ABRecordRef)aRecord asUpdate:(BOOL)bUpdate; - -- (NSDictionary*)toDictionary:(NSDictionary*)withFields; -- (NSNumber*)getDateAsNumber:(ABPropertyID)datePropId; -- (NSObject*)extractName; -- (NSObject*)extractMultiValue:(NSString*)propertyId; -- (NSObject*)extractAddresses; -- (NSObject*)extractIms; -- (NSObject*)extractOrganizations; -- (NSObject*)extractPhotos; - -- (NSMutableDictionary*)translateW3Dict:(NSDictionary*)dict forProperty:(ABPropertyID)prop; -- (bool)setMultiValueStrings:(NSArray*)fieldArray forProperty:(ABPropertyID)prop inRecord:(ABRecordRef)person asUpdate:(BOOL)bUpdate; -- (bool)setMultiValueDictionary:(NSArray*)array forProperty:(ABPropertyID)prop inRecord:(ABRecordRef)person asUpdate:(BOOL)bUpdate; -- (ABMultiValueRef)allocStringMultiValueFromArray:array; -- (ABMultiValueRef)allocDictMultiValueFromArray:array forProperty:(ABPropertyID)prop; -- (BOOL)foundValue:(NSString*)testValue inFields:(NSDictionary*)searchFields; -- (BOOL)testStringValue:(NSString*)testValue forW3CProperty:(NSString*)property; -- (BOOL)testDateValue:(NSString*)testValue forW3CProperty:(NSString*)property; -- (BOOL)searchContactFields:(NSArray*)fields forMVStringProperty:(ABPropertyID)propId withValue:testValue; -- (BOOL)testMultiValueStrings:(NSString*)testValue forProperty:(ABPropertyID)propId ofType:(NSString*)type; -- (NSArray*)valuesForProperty:(ABPropertyID)propId inRecord:(ABRecordRef)aRecord; -- (NSArray*)labelsForProperty:(ABPropertyID)propId inRecord:(ABRecordRef)aRecord; -- (BOOL)searchContactFields:(NSArray*)fields forMVDictionaryProperty:(ABPropertyID)propId withValue:(NSString*)testValue; - -@end - -// generic ContactField types -#define kW3ContactFieldType @"type" -#define kW3ContactFieldValue @"value" -#define kW3ContactFieldPrimary @"pref" -// Various labels for ContactField types -#define kW3ContactWorkLabel @"work" -#define kW3ContactHomeLabel @"home" -#define kW3ContactOtherLabel @"other" -#define kW3ContactPhoneFaxLabel @"fax" -#define kW3ContactPhoneMobileLabel @"mobile" -#define kW3ContactPhonePagerLabel @"pager" -#define kW3ContactUrlBlog @"blog" -#define kW3ContactUrlProfile @"profile" -#define kW3ContactImAIMLabel @"aim" -#define kW3ContactImICQLabel @"icq" -#define kW3ContactImMSNLabel @"msn" -#define kW3ContactImYahooLabel @"yahoo" -#define kW3ContactFieldId @"id" -// special translation for IM field value and type -#define kW3ContactImType @"type" -#define kW3ContactImValue @"value" - -// Contact object -#define kW3ContactId @"id" -#define kW3ContactName @"name" -#define kW3ContactFormattedName @"formatted" -#define kW3ContactGivenName @"givenName" -#define kW3ContactFamilyName @"familyName" -#define kW3ContactMiddleName @"middleName" -#define kW3ContactHonorificPrefix @"honorificPrefix" -#define kW3ContactHonorificSuffix @"honorificSuffix" -#define kW3ContactDisplayName @"displayName" -#define kW3ContactNickname @"nickname" -#define kW3ContactPhoneNumbers @"phoneNumbers" -#define kW3ContactAddresses @"addresses" -#define kW3ContactAddressFormatted @"formatted" -#define kW3ContactStreetAddress @"streetAddress" -#define kW3ContactLocality @"locality" -#define kW3ContactRegion @"region" -#define kW3ContactPostalCode @"postalCode" -#define kW3ContactCountry @"country" -#define kW3ContactEmails @"emails" -#define kW3ContactIms @"ims" -#define kW3ContactOrganizations @"organizations" -#define kW3ContactOrganizationName @"name" -#define kW3ContactTitle @"title" -#define kW3ContactDepartment @"department" -#define kW3ContactBirthday @"birthday" -#define kW3ContactNote @"note" -#define kW3ContactPhotos @"photos" -#define kW3ContactCategories @"categories" -#define kW3ContactUrls @"urls" diff --git a/cordova-lib/spec-plugman/plugins/Contacts/src/ios/CDVContact.m b/cordova-lib/spec-plugman/plugins/Contacts/src/ios/CDVContact.m deleted file mode 100644 index 82704ea05..000000000 --- a/cordova-lib/spec-plugman/plugins/Contacts/src/ios/CDVContact.m +++ /dev/null @@ -1,1752 +0,0 @@ -/* - Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.0 (the - "License"); you may not use this file except in compliance - with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, - software distributed under the License is distributed on an - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - KIND, either express or implied. See the License for the - specific language governing permissions and limitations - under the License. - */ - -#import "CDVContact.h" -#import - -#define DATE_OR_NULL(dateObj) ((aDate != nil) ? (id)([aDate descriptionWithLocale:[NSLocale currentLocale]]) : (id)([NSNull null])) -#define IS_VALID_VALUE(value) ((value != nil) && (![value isKindOfClass:[NSNull class]])) - -static NSDictionary* org_apache_cordova_contacts_W3CtoAB = nil; -static NSDictionary* org_apache_cordova_contacts_ABtoW3C = nil; -static NSSet* org_apache_cordova_contacts_W3CtoNull = nil; -static NSDictionary* org_apache_cordova_contacts_objectAndProperties = nil; -static NSDictionary* org_apache_cordova_contacts_defaultFields = nil; - -@implementation CDVContact : NSObject - - @synthesize returnFields; - -- (id)init -{ - if ((self = [super init]) != nil) { - ABRecordRef rec = ABPersonCreate(); - self.record = rec; - if (rec) { - CFRelease(rec); - } - } - return self; -} - -- (id)initFromABRecord:(ABRecordRef)aRecord -{ - if ((self = [super init]) != nil) { - self.record = aRecord; - } - return self; -} - -/* synthesize 'record' ourselves to have retain properties for CF types */ - -- (void)setRecord:(ABRecordRef)aRecord -{ - if (record != NULL) { - CFRelease(record); - } - if (aRecord != NULL) { - record = CFRetain(aRecord); - } -} - -- (ABRecordRef)record -{ - return record; -} - -/* Rather than creating getters and setters for each AddressBook (AB) Property, generic methods are used to deal with - * simple properties, MultiValue properties( phone numbers and emails) and MultiValueDictionary properties (Ims and addresses). - * The dictionaries below are used to translate between the W3C identifiers and the AB properties. Using the dictionaries, - * allows looping through sets of properties to extract from or set into the W3C dictionary to/from the ABRecord. - */ - -/* The two following dictionaries translate between W3C properties and AB properties. It currently mixes both - * Properties (kABPersonAddressProperty for example) and Strings (kABPersonAddressStreetKey) so users should be aware of - * what types of values are expected. - * a bit. -*/ -+ (NSDictionary*)defaultABtoW3C -{ - if (org_apache_cordova_contacts_ABtoW3C == nil) { - org_apache_cordova_contacts_ABtoW3C = [NSDictionary dictionaryWithObjectsAndKeys: - kW3ContactNickname, [NSNumber numberWithInt:kABPersonNicknameProperty], - kW3ContactGivenName, [NSNumber numberWithInt:kABPersonFirstNameProperty], - kW3ContactFamilyName, [NSNumber numberWithInt:kABPersonLastNameProperty], - kW3ContactMiddleName, [NSNumber numberWithInt:kABPersonMiddleNameProperty], - kW3ContactHonorificPrefix, [NSNumber numberWithInt:kABPersonPrefixProperty], - kW3ContactHonorificSuffix, [NSNumber numberWithInt:kABPersonSuffixProperty], - kW3ContactPhoneNumbers, [NSNumber numberWithInt:kABPersonPhoneProperty], - kW3ContactAddresses, [NSNumber numberWithInt:kABPersonAddressProperty], - kW3ContactStreetAddress, kABPersonAddressStreetKey, - kW3ContactLocality, kABPersonAddressCityKey, - kW3ContactRegion, kABPersonAddressStateKey, - kW3ContactPostalCode, kABPersonAddressZIPKey, - kW3ContactCountry, kABPersonAddressCountryKey, - kW3ContactEmails, [NSNumber numberWithInt:kABPersonEmailProperty], - kW3ContactIms, [NSNumber numberWithInt:kABPersonInstantMessageProperty], - kW3ContactOrganizations, [NSNumber numberWithInt:kABPersonOrganizationProperty], - kW3ContactOrganizationName, [NSNumber numberWithInt:kABPersonOrganizationProperty], - kW3ContactTitle, [NSNumber numberWithInt:kABPersonJobTitleProperty], - kW3ContactDepartment, [NSNumber numberWithInt:kABPersonDepartmentProperty], - kW3ContactBirthday, [NSNumber numberWithInt:kABPersonBirthdayProperty], - kW3ContactUrls, [NSNumber numberWithInt:kABPersonURLProperty], - kW3ContactNote, [NSNumber numberWithInt:kABPersonNoteProperty], - nil]; - } - - return org_apache_cordova_contacts_ABtoW3C; -} - -+ (NSDictionary*)defaultW3CtoAB -{ - if (org_apache_cordova_contacts_W3CtoAB == nil) { - org_apache_cordova_contacts_W3CtoAB = [NSDictionary dictionaryWithObjectsAndKeys: - [NSNumber numberWithInt:kABPersonNicknameProperty], kW3ContactNickname, - [NSNumber numberWithInt:kABPersonFirstNameProperty], kW3ContactGivenName, - [NSNumber numberWithInt:kABPersonLastNameProperty], kW3ContactFamilyName, - [NSNumber numberWithInt:kABPersonMiddleNameProperty], kW3ContactMiddleName, - [NSNumber numberWithInt:kABPersonPrefixProperty], kW3ContactHonorificPrefix, - [NSNumber numberWithInt:kABPersonSuffixProperty], kW3ContactHonorificSuffix, - [NSNumber numberWithInt:kABPersonPhoneProperty], kW3ContactPhoneNumbers, - [NSNumber numberWithInt:kABPersonAddressProperty], kW3ContactAddresses, - kABPersonAddressStreetKey, kW3ContactStreetAddress, - kABPersonAddressCityKey, kW3ContactLocality, - kABPersonAddressStateKey, kW3ContactRegion, - kABPersonAddressZIPKey, kW3ContactPostalCode, - kABPersonAddressCountryKey, kW3ContactCountry, - [NSNumber numberWithInt:kABPersonEmailProperty], kW3ContactEmails, - [NSNumber numberWithInt:kABPersonInstantMessageProperty], kW3ContactIms, - [NSNumber numberWithInt:kABPersonOrganizationProperty], kW3ContactOrganizations, - [NSNumber numberWithInt:kABPersonJobTitleProperty], kW3ContactTitle, - [NSNumber numberWithInt:kABPersonDepartmentProperty], kW3ContactDepartment, - [NSNumber numberWithInt:kABPersonBirthdayProperty], kW3ContactBirthday, - [NSNumber numberWithInt:kABPersonNoteProperty], kW3ContactNote, - [NSNumber numberWithInt:kABPersonURLProperty], kW3ContactUrls, - kABPersonInstantMessageUsernameKey, kW3ContactImValue, - kABPersonInstantMessageServiceKey, kW3ContactImType, - [NSNull null], kW3ContactFieldType, /* include entries in dictionary to indicate ContactField properties */ - [NSNull null], kW3ContactFieldValue, - [NSNull null], kW3ContactFieldPrimary, - [NSNull null], kW3ContactFieldId, - [NSNumber numberWithInt:kABPersonOrganizationProperty], kW3ContactOrganizationName, /* careful, name is used multiple times*/ - nil]; - } - return org_apache_cordova_contacts_W3CtoAB; -} - -+ (NSSet*)defaultW3CtoNull -{ - // these are values that have no AddressBook Equivalent OR have not been implemented yet - if (org_apache_cordova_contacts_W3CtoNull == nil) { - org_apache_cordova_contacts_W3CtoNull = [NSSet setWithObjects:kW3ContactDisplayName, - kW3ContactCategories, kW3ContactFormattedName, nil]; - } - return org_apache_cordova_contacts_W3CtoNull; -} - -/* - * The objectAndProperties dictionary contains the all of the properties of the W3C Contact Objects specified by the key - * Used in calcReturnFields, and various extract methods - */ -+ (NSDictionary*)defaultObjectAndProperties -{ - if (org_apache_cordova_contacts_objectAndProperties == nil) { - org_apache_cordova_contacts_objectAndProperties = [NSDictionary dictionaryWithObjectsAndKeys: - [NSArray arrayWithObjects:kW3ContactGivenName, kW3ContactFamilyName, - kW3ContactMiddleName, kW3ContactHonorificPrefix, kW3ContactHonorificSuffix, kW3ContactFormattedName, nil], kW3ContactName, - [NSArray arrayWithObjects:kW3ContactStreetAddress, kW3ContactLocality, kW3ContactRegion, - kW3ContactPostalCode, kW3ContactCountry, /*kW3ContactAddressFormatted,*/ nil], kW3ContactAddresses, - [NSArray arrayWithObjects:kW3ContactOrganizationName, kW3ContactTitle, kW3ContactDepartment, nil], kW3ContactOrganizations, - [NSArray arrayWithObjects:kW3ContactFieldType, kW3ContactFieldValue, kW3ContactFieldPrimary, nil], kW3ContactPhoneNumbers, - [NSArray arrayWithObjects:kW3ContactFieldType, kW3ContactFieldValue, kW3ContactFieldPrimary, nil], kW3ContactEmails, - [NSArray arrayWithObjects:kW3ContactFieldType, kW3ContactFieldValue, kW3ContactFieldPrimary, nil], kW3ContactPhotos, - [NSArray arrayWithObjects:kW3ContactFieldType, kW3ContactFieldValue, kW3ContactFieldPrimary, nil], kW3ContactUrls, - [NSArray arrayWithObjects:kW3ContactImValue, kW3ContactImType, nil], kW3ContactIms, - nil]; - } - return org_apache_cordova_contacts_objectAndProperties; -} - -+ (NSDictionary*)defaultFields -{ - if (org_apache_cordova_contacts_defaultFields == nil) { - org_apache_cordova_contacts_defaultFields = [NSDictionary dictionaryWithObjectsAndKeys: - [[CDVContact defaultObjectAndProperties] objectForKey:kW3ContactName], kW3ContactName, - [NSNull null], kW3ContactNickname, - [[CDVContact defaultObjectAndProperties] objectForKey:kW3ContactAddresses], kW3ContactAddresses, - [[CDVContact defaultObjectAndProperties] objectForKey:kW3ContactOrganizations], kW3ContactOrganizations, - [[CDVContact defaultObjectAndProperties] objectForKey:kW3ContactPhoneNumbers], kW3ContactPhoneNumbers, - [[CDVContact defaultObjectAndProperties] objectForKey:kW3ContactEmails], kW3ContactEmails, - [[CDVContact defaultObjectAndProperties] objectForKey:kW3ContactIms], kW3ContactIms, - [[CDVContact defaultObjectAndProperties] objectForKey:kW3ContactPhotos], kW3ContactPhotos, - [[CDVContact defaultObjectAndProperties] objectForKey:kW3ContactUrls], kW3ContactUrls, - [NSNull null], kW3ContactBirthday, - [NSNull null], kW3ContactNote, - nil]; - } - return org_apache_cordova_contacts_defaultFields; -} - -/* Translate W3C Contact data into ABRecordRef - * - * New contact information comes in as a NSMutableDictionary. All Null entries in Contact object are set - * as [NSNull null] in the dictionary when translating from the JSON input string of Contact data. However, if - * user did not set a value within a Contact object or sub-object (by not using the object constructor) some data - * may not exist. - * bUpdate = YES indicates this is a save of an existing record - */ -- (bool)setFromContactDict:(NSDictionary*)aContact asUpdate:(BOOL)bUpdate -{ - if (![aContact isKindOfClass:[NSDictionary class]]) { - return FALSE; // can't do anything if no dictionary! - } - - ABRecordRef person = self.record; - bool bSuccess = TRUE; - CFErrorRef error; - - // set name info - // iOS doesn't have displayName - might have to pull parts from it to create name - bool bName = false; - NSDictionary* dict = [aContact valueForKey:kW3ContactName]; - if ([dict isKindOfClass:[NSDictionary class]]) { - bName = true; - NSArray* propArray = [[CDVContact defaultObjectAndProperties] objectForKey:kW3ContactName]; - - for (id i in propArray) { - if (![(NSString*)i isEqualToString : kW3ContactFormattedName]) { // kW3ContactFormattedName is generated from ABRecordCopyCompositeName() and can't be set - [self setValue:[dict valueForKey:i] forProperty:(ABPropertyID)[(NSNumber*)[[CDVContact defaultW3CtoAB] objectForKey:i] intValue] - inRecord:person asUpdate:bUpdate]; - } - } - } - - id nn = [aContact valueForKey:kW3ContactNickname]; - if (![nn isKindOfClass:[NSNull class]]) { - bName = true; - [self setValue:nn forProperty:kABPersonNicknameProperty inRecord:person asUpdate:bUpdate]; - } - if (!bName) { - // if no name or nickname - try and use displayName as W3Contact must have displayName or ContactName - [self setValue:[aContact valueForKey:kW3ContactDisplayName] forProperty:kABPersonNicknameProperty - inRecord:person asUpdate:bUpdate]; - } - - // set phoneNumbers - // NSLog(@"setting phoneNumbers"); - NSArray* array = [aContact valueForKey:kW3ContactPhoneNumbers]; - if ([array isKindOfClass:[NSArray class]]) { - [self setMultiValueStrings:array forProperty:kABPersonPhoneProperty inRecord:person asUpdate:bUpdate]; - } - // set Emails - // NSLog(@"setting emails"); - array = [aContact valueForKey:kW3ContactEmails]; - if ([array isKindOfClass:[NSArray class]]) { - [self setMultiValueStrings:array forProperty:kABPersonEmailProperty inRecord:person asUpdate:bUpdate]; - } - // set Urls - // NSLog(@"setting urls"); - array = [aContact valueForKey:kW3ContactUrls]; - if ([array isKindOfClass:[NSArray class]]) { - [self setMultiValueStrings:array forProperty:kABPersonURLProperty inRecord:person asUpdate:bUpdate]; - } - - // set multivalue dictionary properties - // set addresses: streetAddress, locality, region, postalCode, country - // set ims: value = username, type = servicetype - // iOS addresses and im are a MultiValue Properties with label, value=dictionary of info, and id - // NSLog(@"setting addresses"); - error = nil; - array = [aContact valueForKey:kW3ContactAddresses]; - if ([array isKindOfClass:[NSArray class]]) { - [self setMultiValueDictionary:array forProperty:kABPersonAddressProperty inRecord:person asUpdate:bUpdate]; - } - // ims - // NSLog(@"setting ims"); - array = [aContact valueForKey:kW3ContactIms]; - if ([array isKindOfClass:[NSArray class]]) { - [self setMultiValueDictionary:array forProperty:kABPersonInstantMessageProperty inRecord:person asUpdate:bUpdate]; - } - - // organizations - // W3C ContactOrganization has pref, type, name, title, department - // iOS only supports name, title, department - // NSLog(@"setting organizations"); - // TODO this may need work - should Organization information be removed when array is empty?? - array = [aContact valueForKey:kW3ContactOrganizations]; // iOS only supports one organization - use first one - if ([array isKindOfClass:[NSArray class]]) { - BOOL bRemove = NO; - NSDictionary* dict = nil; - if ([array count] > 0) { - dict = [array objectAtIndex:0]; - } else { - // remove the organization info entirely - bRemove = YES; - } - if ([dict isKindOfClass:[NSDictionary class]] || (bRemove == YES)) { - [self setValue:(bRemove ? @"" : [dict valueForKey:@"name"]) forProperty:kABPersonOrganizationProperty inRecord:person asUpdate:bUpdate]; - [self setValue:(bRemove ? @"" : [dict valueForKey:kW3ContactTitle]) forProperty:kABPersonJobTitleProperty inRecord:person asUpdate:bUpdate]; - [self setValue:(bRemove ? @"" : [dict valueForKey:kW3ContactDepartment]) forProperty:kABPersonDepartmentProperty inRecord:person asUpdate:bUpdate]; - } - } - // add dates - // Dates come in as milliseconds in NSNumber Object - id ms = [aContact valueForKey:kW3ContactBirthday]; - NSDate* aDate = nil; - if (ms && [ms isKindOfClass:[NSNumber class]]) { - double msValue = [ms doubleValue]; - msValue = msValue / 1000; - aDate = [NSDate dateWithTimeIntervalSince1970:msValue]; - } - if ((aDate != nil) || [ms isKindOfClass:[NSString class]]) { - [self setValue:aDate != nil ? aDate:ms forProperty:kABPersonBirthdayProperty inRecord:person asUpdate:bUpdate]; - } - // don't update creation date - // modification date will get updated when save - // anniversary is removed from W3C Contact api Dec 9, 2010 spec - don't waste time on it yet - - // kABPersonDateProperty - - // kABPersonAnniversaryLabel - - // iOS doesn't have gender - ignore - // note - [self setValue:[aContact valueForKey:kW3ContactNote] forProperty:kABPersonNoteProperty inRecord:person asUpdate:bUpdate]; - - // iOS doesn't have preferredName- ignore - - // photo - array = [aContact valueForKey:kW3ContactPhotos]; - if ([array isKindOfClass:[NSArray class]]) { - if (bUpdate && ([array count] == 0)) { - // remove photo - bSuccess = ABPersonRemoveImageData(person, &error); - } else if ([array count] > 0) { - NSDictionary* dict = [array objectAtIndex:0]; // currently only support one photo - if ([dict isKindOfClass:[NSDictionary class]]) { - id value = [dict objectForKey:kW3ContactFieldValue]; - if ([value isKindOfClass:[NSString class]]) { - if (bUpdate && ([value length] == 0)) { - // remove the current image - bSuccess = ABPersonRemoveImageData(person, &error); - } else { - // use this image - // don't know if string is encoded or not so first unencode it then encode it again - NSString* cleanPath = [value stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; - NSURL* photoUrl = [NSURL URLWithString:[cleanPath stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]; - // caller is responsible for checking for a connection, if no connection this will fail - NSError* err = nil; - NSData* data = nil; - if (photoUrl) { - data = [NSData dataWithContentsOfURL:photoUrl options:NSDataReadingUncached error:&err]; - } - if (data && ([data length] > 0)) { - bSuccess = ABPersonSetImageData(person, (__bridge CFDataRef)data, &error); - } - if (!data || !bSuccess) { - NSLog(@"error setting contact image: %@", (err != nil ? [err localizedDescription] : @"")); - } - } - } - } - } - } - - // TODO WebURLs - - // TODO timezone - - return bSuccess; -} - -/* Set item into an AddressBook Record for the specified property. - * aValue - the value to set into the address book (code checks for null or [NSNull null] - * aProperty - AddressBook property ID - * aRecord - the record to update - * bUpdate - whether this is a possible update vs a new entry - * RETURN - * true - property was set (or input value as null) - * false - property was not set - */ -- (bool)setValue:(id)aValue forProperty:(ABPropertyID)aProperty inRecord:(ABRecordRef)aRecord asUpdate:(BOOL)bUpdate -{ - bool bSuccess = true; // if property was null, just ignore and return success - CFErrorRef error; - - if (aValue && ![aValue isKindOfClass:[NSNull class]]) { - if (bUpdate && ([aValue isKindOfClass:[NSString class]] && ([aValue length] == 0))) { // if updating, empty string means to delete - aValue = NULL; - } // really only need to set if different - more efficient to just update value or compare and only set if necessary??? - bSuccess = ABRecordSetValue(aRecord, aProperty, (__bridge CFTypeRef)aValue, &error); - if (!bSuccess) { - NSLog(@"error setting %d property", aProperty); - } - } - - return bSuccess; -} - -- (bool)removeProperty:(ABPropertyID)aProperty inRecord:(ABRecordRef)aRecord -{ - CFErrorRef err; - bool bSuccess = ABRecordRemoveValue(aRecord, aProperty, &err); - - if (!bSuccess) { - CFStringRef errDescription = CFErrorCopyDescription(err); - NSLog(@"Unable to remove property %d: %@", aProperty, errDescription); - CFRelease(errDescription); - } - return bSuccess; -} - -- (bool)addToMultiValue:(ABMultiValueRef)multi fromDictionary:dict -{ - bool bSuccess = FALSE; - id value = [dict valueForKey:kW3ContactFieldValue]; - - if (IS_VALID_VALUE(value)) { - CFStringRef label = [CDVContact convertContactTypeToPropertyLabel:[dict valueForKey:kW3ContactFieldType]]; - bSuccess = ABMultiValueAddValueAndLabel(multi, (__bridge CFTypeRef)value, label, NULL); - if (!bSuccess) { - NSLog(@"Error setting Value: %@ and label: %@", value, label); - } - } - return bSuccess; -} - -- (ABMultiValueRef)allocStringMultiValueFromArray:array -{ - ABMutableMultiValueRef multi = ABMultiValueCreateMutable(kABMultiStringPropertyType); - - for (NSDictionary* dict in array) { - [self addToMultiValue:multi fromDictionary:dict]; - } - - return multi; // caller is responsible for releasing multi -} - -- (bool)setValue:(CFTypeRef)value forProperty:(ABPropertyID)prop inRecord:(ABRecordRef)person -{ - CFErrorRef error; - bool bSuccess = ABRecordSetValue(person, prop, value, &error); - - if (!bSuccess) { - NSLog(@"Error setting value for property: %d", prop); - } - return bSuccess; -} - -/* Set MultiValue string properties into Address Book Record. - * NSArray* fieldArray - array of dictionaries containing W3C properties to be set into record - * ABPropertyID prop - the property to be set (generally used for phones and emails) - * ABRecordRef person - the record to set values into - * BOOL bUpdate - whether or not to update date or set as new. - * When updating: - * empty array indicates to remove entire property - * empty string indicates to remove - * [NSNull null] do not modify (keep existing record value) - * RETURNS - * bool false indicates error - * - * used for phones and emails - */ -- (bool)setMultiValueStrings:(NSArray*)fieldArray forProperty:(ABPropertyID)prop inRecord:(ABRecordRef)person asUpdate:(BOOL)bUpdate -{ - bool bSuccess = TRUE; - ABMutableMultiValueRef multi = nil; - - if (!bUpdate) { - multi = [self allocStringMultiValueFromArray:fieldArray]; - bSuccess = [self setValue:multi forProperty:prop inRecord:person]; - } else if (bUpdate && ([fieldArray count] == 0)) { - // remove entire property - bSuccess = [self removeProperty:prop inRecord:person]; - } else { // check for and apply changes - ABMultiValueRef copy = ABRecordCopyValue(person, prop); - if (copy != nil) { - multi = ABMultiValueCreateMutableCopy(copy); - CFRelease(copy); - - for (NSDictionary* dict in fieldArray) { - id val; - NSString* label = nil; - val = [dict valueForKey:kW3ContactFieldValue]; - label = (__bridge NSString*)[CDVContact convertContactTypeToPropertyLabel:[dict valueForKey:kW3ContactFieldType]]; - if (IS_VALID_VALUE(val)) { - // is an update, find index of entry with matching id, if values are different, update. - id idValue = [dict valueForKey:kW3ContactFieldId]; - int identifier = [idValue isKindOfClass:[NSNumber class]] ? [idValue intValue] : -1; - CFIndex i = identifier >= 0 ? ABMultiValueGetIndexForIdentifier(multi, identifier) : kCFNotFound; - if (i != kCFNotFound) { - if ([val length] == 0) { - // remove both value and label - ABMultiValueRemoveValueAndLabelAtIndex(multi, i); - } else { - NSString* valueAB = (__bridge_transfer NSString*)ABMultiValueCopyValueAtIndex(multi, i); - NSString* labelAB = (__bridge_transfer NSString*)ABMultiValueCopyLabelAtIndex(multi, i); - if ((valueAB == nil) || ![val isEqualToString:valueAB]) { - ABMultiValueReplaceValueAtIndex(multi, (__bridge CFTypeRef)val, i); - } - if ((labelAB == nil) || ![label isEqualToString:labelAB]) { - ABMultiValueReplaceLabelAtIndex(multi, (__bridge CFStringRef)label, i); - } - } - } else { - // is a new value - insert - [self addToMultiValue:multi fromDictionary:dict]; - } - } // end of if value - } // end of for - } else { // adding all new value(s) - multi = [self allocStringMultiValueFromArray:fieldArray]; - } - // set the (updated) copy as the new value - bSuccess = [self setValue:multi forProperty:prop inRecord:person]; - } - - if (multi) { - CFRelease(multi); - } - - return bSuccess; -} - -// used for ims and addresses -- (ABMultiValueRef)allocDictMultiValueFromArray:array forProperty:(ABPropertyID)prop -{ - ABMutableMultiValueRef multi = ABMultiValueCreateMutable(kABMultiDictionaryPropertyType); - NSMutableDictionary* newDict; - NSMutableDictionary* addDict; - - for (NSDictionary* dict in array) { - newDict = [self translateW3Dict:dict forProperty:prop]; - addDict = [NSMutableDictionary dictionaryWithCapacity:2]; - if (newDict) { // create a new dictionary with a Label and Value, value is the dictionary previously created - // June, 2011 W3C Contact spec adds type into ContactAddress book - // get the type out of the original dictionary for address - NSString* addrType = (NSString*)[dict valueForKey:kW3ContactFieldType]; - if (!addrType) { - addrType = (NSString*)kABOtherLabel; - } - NSObject* typeValue = ((prop == kABPersonInstantMessageProperty) ? (NSObject*)kABOtherLabel : addrType); - // NSLog(@"typeValue: %@", typeValue); - [addDict setObject:typeValue forKey:kW3ContactFieldType]; // im labels will be set as Other and address labels as type from dictionary - [addDict setObject:newDict forKey:kW3ContactFieldValue]; - [self addToMultiValue:multi fromDictionary:addDict]; - } - } - - return multi; // caller is responsible for releasing -} - -// used for ims and addresses to convert W3 dictionary of values to AB Dictionary -// got messier when June, 2011 W3C Contact spec added type field into ContactAddress -- (NSMutableDictionary*)translateW3Dict:(NSDictionary*)dict forProperty:(ABPropertyID)prop -{ - NSArray* propArray = [[CDVContact defaultObjectAndProperties] valueForKey:[[CDVContact defaultABtoW3C] objectForKey:[NSNumber numberWithInt:prop]]]; - - NSMutableDictionary* newDict = [NSMutableDictionary dictionaryWithCapacity:1]; - id value; - - for (NSString* key in propArray) { // for each W3 Contact key get the value - if (((value = [dict valueForKey:key]) != nil) && ![value isKindOfClass:[NSNull class]]) { - // if necessary convert the W3 value to AB Property label - NSString* setValue = value; - if ([CDVContact needsConversion:key]) { // IM types must be converted - setValue = (NSString*)[CDVContact convertContactTypeToPropertyLabel:value]; - // IMs must have a valid AB value! - if ((prop == kABPersonInstantMessageProperty) && [setValue isEqualToString:(NSString*)kABOtherLabel]) { - setValue = @""; // try empty string - } - } - // set the AB value into the dictionary - [newDict setObject:setValue forKey:(NSString*)[[CDVContact defaultW3CtoAB] valueForKey:(NSString*)key]]; - } - } - - if ([newDict count] == 0) { - newDict = nil; // no items added - } - return newDict; -} - -/* set multivalue dictionary properties into an AddressBook Record - * NSArray* array - array of dictionaries containing the W3C properties to set into the record - * ABPropertyID prop - the property id for the multivalue dictionary (addresses and ims) - * ABRecordRef person - the record to set the values into - * BOOL bUpdate - YES if this is an update to an existing record - * When updating: - * empty array indicates to remove entire property - * value/label == "" indicates to remove - * value/label == [NSNull null] do not modify (keep existing record value) - * RETURN - * bool false indicates fatal error - * - * iOS addresses and im are a MultiValue Properties with label, value=dictionary of info, and id - * set addresses: streetAddress, locality, region, postalCode, country - * set ims: value = username, type = servicetype - * there are some special cases in here for ims - needs cleanup / simplification - * - */ -- (bool)setMultiValueDictionary:(NSArray*)array forProperty:(ABPropertyID)prop inRecord:(ABRecordRef)person asUpdate:(BOOL)bUpdate -{ - bool bSuccess = FALSE; - ABMutableMultiValueRef multi = nil; - - if (!bUpdate) { - multi = [self allocDictMultiValueFromArray:array forProperty:prop]; - bSuccess = [self setValue:multi forProperty:prop inRecord:person]; - } else if (bUpdate && ([array count] == 0)) { - // remove property - bSuccess = [self removeProperty:prop inRecord:person]; - } else { // check for and apply changes - ABMultiValueRef copy = ABRecordCopyValue(person, prop); - if (copy) { - multi = ABMultiValueCreateMutableCopy(copy); - CFRelease(copy); - // get the W3C values for this property - NSArray* propArray = [[CDVContact defaultObjectAndProperties] valueForKey:[[CDVContact defaultABtoW3C] objectForKey:[NSNumber numberWithInt:prop]]]; - id value; - id valueAB; - - for (NSDictionary* field in array) { - NSMutableDictionary* dict; - // find the index for the current property - id idValue = [field valueForKey:kW3ContactFieldId]; - int identifier = [idValue isKindOfClass:[NSNumber class]] ? [idValue intValue] : -1; - CFIndex idx = identifier >= 0 ? ABMultiValueGetIndexForIdentifier(multi, identifier) : kCFNotFound; - BOOL bUpdateLabel = NO; - if (idx != kCFNotFound) { - dict = [NSMutableDictionary dictionaryWithCapacity:1]; - // NSDictionary* existingDictionary = (NSDictionary*)ABMultiValueCopyValueAtIndex(multi, idx); - CFTypeRef existingDictionary = ABMultiValueCopyValueAtIndex(multi, idx); - NSString* existingABLabel = (__bridge_transfer NSString*)ABMultiValueCopyLabelAtIndex(multi, idx); - NSString* testLabel = [field valueForKey:kW3ContactFieldType]; - // fixes cb-143 where setting empty label could cause address to not be removed - // (because empty label would become 'other' in convertContactTypeToPropertyLabel - // which may not have matched existing label thus resulting in an incorrect updating of the label - // and the address not getting removed at the end of the for loop) - if (testLabel && [testLabel isKindOfClass:[NSString class]] && ([testLabel length] > 0)) { - CFStringRef w3cLabel = [CDVContact convertContactTypeToPropertyLabel:testLabel]; - if (w3cLabel && ![existingABLabel isEqualToString:(__bridge NSString*)w3cLabel]) { - // replace the label - ABMultiValueReplaceLabelAtIndex(multi, w3cLabel, idx); - bUpdateLabel = YES; - } - } // else was invalid or empty label string so do not update - - for (id k in propArray) { - value = [field valueForKey:k]; - bool bSet = (value != nil && ![value isKindOfClass:[NSNull class]] && ([value isKindOfClass:[NSString class]] && [value length] > 0)); - // if there is a contact value, put it into dictionary - if (bSet) { - NSString* setValue = [CDVContact needsConversion:(NSString*)k] ? (NSString*)[CDVContact convertContactTypeToPropertyLabel:value] : value; - [dict setObject:setValue forKey:(NSString*)[[CDVContact defaultW3CtoAB] valueForKey:(NSString*)k]]; - } else if ((value == nil) || ([value isKindOfClass:[NSString class]] && ([value length] != 0))) { - // value not provided in contact dictionary - if prop exists in AB dictionary, preserve it - valueAB = [(__bridge NSDictionary*)existingDictionary valueForKey : [[CDVContact defaultW3CtoAB] valueForKey:k]]; - if (valueAB != nil) { - [dict setValue:valueAB forKey:[[CDVContact defaultW3CtoAB] valueForKey:k]]; - } - } // else if value == "" it will not be added into updated dict and thus removed - } // end of for loop (moving here fixes cb-143, need to end for loop before replacing or removing multivalue) - - if ([dict count] > 0) { - // something was added into new dict, - ABMultiValueReplaceValueAtIndex(multi, (__bridge CFTypeRef)dict, idx); - } else if (!bUpdateLabel) { - // nothing added into new dict and no label change so remove this property entry - ABMultiValueRemoveValueAndLabelAtIndex(multi, idx); - } - - CFRelease(existingDictionary); - } else { - // not found in multivalue so add it - dict = [self translateW3Dict:field forProperty:prop]; - if (dict) { - NSMutableDictionary* addDict = [NSMutableDictionary dictionaryWithCapacity:2]; - // get the type out of the original dictionary for address - NSObject* typeValue = ((prop == kABPersonInstantMessageProperty) ? (NSObject*)kABOtherLabel : (NSString*)[field valueForKey:kW3ContactFieldType]); - // NSLog(@"typeValue: %@", typeValue); - [addDict setObject:typeValue forKey:kW3ContactFieldType]; // im labels will be set as Other and address labels as type from dictionary - [addDict setObject:dict forKey:kW3ContactFieldValue]; - [self addToMultiValue:multi fromDictionary:addDict]; - } - } - } // end of looping through dictionaries - - // set the (updated) copy as the new value - bSuccess = [self setValue:multi forProperty:prop inRecord:person]; - } - } // end of copy and apply changes - if (multi) { - CFRelease(multi); - } - - return bSuccess; -} - -/* Determine which W3C labels need to be converted - */ -+ (BOOL)needsConversion:(NSString*)W3Label -{ - BOOL bConvert = NO; - - if ([W3Label isEqualToString:kW3ContactFieldType] || [W3Label isEqualToString:kW3ContactImType]) { - bConvert = YES; - } - return bConvert; -} - -/* Translation of property type labels contact API ---> iPhone - * - * phone: work, home, other, mobile, fax, pager --> - * kABWorkLabel, kABHomeLabel, kABOtherLabel, kABPersonPhoneMobileLabel, kABPersonHomeFAXLabel || kABPersonHomeFAXLabel, kABPersonPhonePagerLabel - * emails: work, home, other ---> kABWorkLabel, kABHomeLabel, kABOtherLabel - * ims: aim, gtalk, icq, xmpp, msn, skype, qq, yahoo --> kABPersonInstantMessageService + (AIM, ICG, MSN, Yahoo). No support for gtalk, xmpp, skype, qq - * addresses: work, home, other --> kABWorkLabel, kABHomeLabel, kABOtherLabel - * - * - */ -+ (CFStringRef)convertContactTypeToPropertyLabel:(NSString*)label -{ - CFStringRef type; - - if ([label isKindOfClass:[NSNull class]] || ![label isKindOfClass:[NSString class]]) { - type = NULL; // no label - } else if ([label caseInsensitiveCompare:kW3ContactWorkLabel] == NSOrderedSame) { - type = kABWorkLabel; - } else if ([label caseInsensitiveCompare:kW3ContactHomeLabel] == NSOrderedSame) { - type = kABHomeLabel; - } else if ([label caseInsensitiveCompare:kW3ContactOtherLabel] == NSOrderedSame) { - type = kABOtherLabel; - } else if ([label caseInsensitiveCompare:kW3ContactPhoneMobileLabel] == NSOrderedSame) { - type = kABPersonPhoneMobileLabel; - } else if ([label caseInsensitiveCompare:kW3ContactPhonePagerLabel] == NSOrderedSame) { - type = kABPersonPhonePagerLabel; - } else if ([label caseInsensitiveCompare:kW3ContactImAIMLabel] == NSOrderedSame) { - type = kABPersonInstantMessageServiceAIM; - } else if ([label caseInsensitiveCompare:kW3ContactImICQLabel] == NSOrderedSame) { - type = kABPersonInstantMessageServiceICQ; - } else if ([label caseInsensitiveCompare:kW3ContactImMSNLabel] == NSOrderedSame) { - type = kABPersonInstantMessageServiceMSN; - } else if ([label caseInsensitiveCompare:kW3ContactImYahooLabel] == NSOrderedSame) { - type = kABPersonInstantMessageServiceYahoo; - } else if ([label caseInsensitiveCompare:kW3ContactUrlProfile] == NSOrderedSame) { - type = kABPersonHomePageLabel; - } else { - type = kABOtherLabel; - } - - return type; -} - -+ (NSString*)convertPropertyLabelToContactType:(NSString*)label -{ - NSString* type = nil; - - if (label != nil) { // improve efficiency...... - if ([label isEqualToString:(NSString*)kABPersonPhoneMobileLabel]) { - type = kW3ContactPhoneMobileLabel; - } else if ([label isEqualToString:(NSString*)kABPersonPhoneHomeFAXLabel] || - [label isEqualToString:(NSString*)kABPersonPhoneWorkFAXLabel]) { - type = kW3ContactPhoneFaxLabel; - } else if ([label isEqualToString:(NSString*)kABPersonPhonePagerLabel]) { - type = kW3ContactPhonePagerLabel; - } else if ([label isEqualToString:(NSString*)kABHomeLabel]) { - type = kW3ContactHomeLabel; - } else if ([label isEqualToString:(NSString*)kABWorkLabel]) { - type = kW3ContactWorkLabel; - } else if ([label isEqualToString:(NSString*)kABOtherLabel]) { - type = kW3ContactOtherLabel; - } else if ([label isEqualToString:(NSString*)kABPersonInstantMessageServiceAIM]) { - type = kW3ContactImAIMLabel; - } else if ([label isEqualToString:(NSString*)kABPersonInstantMessageServiceICQ]) { - type = kW3ContactImICQLabel; - } else if ([label isEqualToString:(NSString*)kABPersonInstantMessageServiceJabber]) { - type = kW3ContactOtherLabel; - } else if ([label isEqualToString:(NSString*)kABPersonInstantMessageServiceMSN]) { - type = kW3ContactImMSNLabel; - } else if ([label isEqualToString:(NSString*)kABPersonInstantMessageServiceYahoo]) { - type = kW3ContactImYahooLabel; - } else if ([label isEqualToString:(NSString*)kABPersonHomePageLabel]) { - type = kW3ContactUrlProfile; - } else { - type = kW3ContactOtherLabel; - } - } - return type; -} - -/* Check if the input label is a valid W3C ContactField.type. This is used when searching, - * only search field types if the search string is a valid type. If we converted any search - * string to a ABPropertyLabel it could convert to kABOtherLabel which is probably not want - * the user wanted to search for and could skew the results. - */ -+ (BOOL)isValidW3ContactType:(NSString*)label -{ - BOOL isValid = NO; - - if ([label isKindOfClass:[NSNull class]] || ![label isKindOfClass:[NSString class]]) { - isValid = NO; // no label - } else if ([label caseInsensitiveCompare:kW3ContactWorkLabel] == NSOrderedSame) { - isValid = YES; - } else if ([label caseInsensitiveCompare:kW3ContactHomeLabel] == NSOrderedSame) { - isValid = YES; - } else if ([label caseInsensitiveCompare:kW3ContactOtherLabel] == NSOrderedSame) { - isValid = YES; - } else if ([label caseInsensitiveCompare:kW3ContactPhoneMobileLabel] == NSOrderedSame) { - isValid = YES; - } else if ([label caseInsensitiveCompare:kW3ContactPhonePagerLabel] == NSOrderedSame) { - isValid = YES; - } else if ([label caseInsensitiveCompare:kW3ContactImAIMLabel] == NSOrderedSame) { - isValid = YES; - } else if ([label caseInsensitiveCompare:kW3ContactImICQLabel] == NSOrderedSame) { - isValid = YES; - } else if ([label caseInsensitiveCompare:kW3ContactImMSNLabel] == NSOrderedSame) { - isValid = YES; - } else if ([label caseInsensitiveCompare:kW3ContactImYahooLabel] == NSOrderedSame) { - isValid = YES; - } else { - isValid = NO; - } - - return isValid; -} - -/* Create a new Contact Dictionary object from an ABRecordRef that contains information in a format such that - * it can be returned to JavaScript callback as JSON object string. - * Uses: - * ABRecordRef set into Contact Object - * NSDictionary withFields indicates which fields to return from the AddressBook Record - * - * JavaScript Contact: - * @param {DOMString} id unique identifier - * @param {DOMString} displayName - * @param {ContactName} name - * @param {DOMString} nickname - * @param {ContactField[]} phoneNumbers array of phone numbers - * @param {ContactField[]} emails array of email addresses - * @param {ContactAddress[]} addresses array of addresses - * @param {ContactField[]} ims instant messaging user ids - * @param {ContactOrganization[]} organizations - * @param {DOMString} published date contact was first created - * @param {DOMString} updated date contact was last updated - * @param {DOMString} birthday contact's birthday - * @param (DOMString} anniversary contact's anniversary - * @param {DOMString} gender contact's gender - * @param {DOMString} note user notes about contact - * @param {DOMString} preferredUsername - * @param {ContactField[]} photos - * @param {ContactField[]} tags - * @param {ContactField[]} relationships - * @param {ContactField[]} urls contact's web sites - * @param {ContactAccounts[]} accounts contact's online accounts - * @param {DOMString} timezone UTC time zone offset - * @param {DOMString} connected - */ - -- (NSDictionary*)toDictionary:(NSDictionary*)withFields -{ - // if not a person type record bail out for now - if (ABRecordGetRecordType(self.record) != kABPersonType) { - return NULL; - } - id value = nil; - self.returnFields = withFields; - - NSMutableDictionary* nc = [NSMutableDictionary dictionaryWithCapacity:1]; // new contact dictionary to fill in from ABRecordRef - // id - [nc setObject:[NSNumber numberWithInt:ABRecordGetRecordID(self.record)] forKey:kW3ContactId]; - if (self.returnFields == nil) { - // if no returnFields specified, W3C says to return empty contact (but Cordova will at least return id) - return nc; - } - if ([self.returnFields objectForKey:kW3ContactDisplayName]) { - // displayname requested - iOS doesn't have so return null - [nc setObject:[NSNull null] forKey:kW3ContactDisplayName]; - // may overwrite below if requested ContactName and there are no values - } - // nickname - if ([self.returnFields valueForKey:kW3ContactNickname]) { - value = (__bridge_transfer NSString*)ABRecordCopyValue(self.record, kABPersonNicknameProperty); - [nc setObject:(value != nil) ? value:[NSNull null] forKey:kW3ContactNickname]; - } - - // name dictionary - // NSLog(@"getting name info"); - NSObject* data = [self extractName]; - if (data != nil) { - [nc setObject:data forKey:kW3ContactName]; - } - if ([self.returnFields objectForKey:kW3ContactDisplayName] && ((data == nil) || ([(NSDictionary*)data objectForKey : kW3ContactFormattedName] == [NSNull null]))) { - // user asked for displayName which iOS doesn't support but there is no other name data being returned - // try and use Composite Name so some name is returned - id tryName = (__bridge_transfer NSString*)ABRecordCopyCompositeName(self.record); - if (tryName != nil) { - [nc setObject:tryName forKey:kW3ContactDisplayName]; - } else { - // use nickname or empty string - value = (__bridge_transfer NSString*)ABRecordCopyValue(self.record, kABPersonNicknameProperty); - [nc setObject:(value != nil) ? value:@"" forKey:kW3ContactDisplayName]; - } - } - // phoneNumbers array - // NSLog(@"getting phoneNumbers"); - value = [self extractMultiValue:kW3ContactPhoneNumbers]; - if (value != nil) { - [nc setObject:value forKey:kW3ContactPhoneNumbers]; - } - // emails array - // NSLog(@"getting emails"); - value = [self extractMultiValue:kW3ContactEmails]; - if (value != nil) { - [nc setObject:value forKey:kW3ContactEmails]; - } - // urls array - value = [self extractMultiValue:kW3ContactUrls]; - if (value != nil) { - [nc setObject:value forKey:kW3ContactUrls]; - } - // addresses array - // NSLog(@"getting addresses"); - value = [self extractAddresses]; - if (value != nil) { - [nc setObject:value forKey:kW3ContactAddresses]; - } - // im array - // NSLog(@"getting ims"); - value = [self extractIms]; - if (value != nil) { - [nc setObject:value forKey:kW3ContactIms]; - } - // organization array (only info for one organization in iOS) - // NSLog(@"getting organizations"); - value = [self extractOrganizations]; - if (value != nil) { - [nc setObject:value forKey:kW3ContactOrganizations]; - } - - // for simple properties, could make this a bit more efficient by storing all simple properties in a single - // array in the returnFields dictionary and setting them via a for loop through the array - - // add dates - // NSLog(@"getting dates"); - NSNumber* ms; - - /** Contact Revision field removed from June 16, 2011 version of specification - - if ([self.returnFields valueForKey:kW3ContactUpdated]){ - ms = [self getDateAsNumber: kABPersonModificationDateProperty]; - if (!ms){ - // try and get published date - ms = [self getDateAsNumber: kABPersonCreationDateProperty]; - } - if (ms){ - [nc setObject: ms forKey:kW3ContactUpdated]; - } - - } - */ - - if ([self.returnFields valueForKey:kW3ContactBirthday]) { - ms = [self getDateAsNumber:kABPersonBirthdayProperty]; - if (ms) { - [nc setObject:ms forKey:kW3ContactBirthday]; - } - } - - /* Anniversary removed from 12-09-2010 W3C Contacts api spec - if ([self.returnFields valueForKey:kW3ContactAnniversary]){ - // Anniversary date is stored in a multivalue property - ABMultiValueRef multi = ABRecordCopyValue(self.record, kABPersonDateProperty); - if (multi){ - CFStringRef label = nil; - CFIndex count = ABMultiValueGetCount(multi); - // see if contains an Anniversary date - for(CFIndex i=0; i 0) { // ?? this will always be true since we set id,label,primary field?? - [(NSMutableArray*)addresses addObject : newAddress]; - } - CFRelease(dict); - } // end of loop through addresses - } else { - addresses = [NSNull null]; - } - if (multi) { - CFRelease(multi); - } - - return addresses; -} - -/* Create array of Dictionaries to match JavaScript ContactField object for ims - * type one of [aim, gtalk, icq, xmpp, msn, skype, qq, yahoo] needs other as well - * value - * (bool) primary - * id - * - * iOS IMs are a MultiValue Properties with label, value=dictionary of IM details (service, username), and id - */ -- (NSObject*)extractIms -{ - NSArray* fields = [self.returnFields objectForKey:kW3ContactIms]; - - if (fields == nil) { // no name fields requested - return nil; - } - NSObject* imArray; - ABMultiValueRef multi = ABRecordCopyValue(self.record, kABPersonInstantMessageProperty); - CFIndex count = multi ? ABMultiValueGetCount(multi) : 0; - if (count) { - imArray = [NSMutableArray arrayWithCapacity:count]; - - for (CFIndex i = 0; i < ABMultiValueGetCount(multi); i++) { - NSMutableDictionary* newDict = [NSMutableDictionary dictionaryWithCapacity:3]; - // iOS has label property (work, home, other) for each IM but W3C contact API doesn't use - CFDictionaryRef dict = (CFDictionaryRef)ABMultiValueCopyValueAtIndex(multi, i); - CFStringRef value; // all values should be CFStringRefs / NSString* - bool bFound; - if ([fields containsObject:kW3ContactFieldValue]) { - // value = user name - bFound = CFDictionaryGetValueIfPresent(dict, kABPersonInstantMessageUsernameKey, (void*)&value); - if (bFound && (value != NULL)) { - CFRetain(value); - [newDict setObject:(__bridge id)value forKey:kW3ContactFieldValue]; - CFRelease(value); - } else { - [newDict setObject:[NSNull null] forKey:kW3ContactFieldValue]; - } - } - if ([fields containsObject:kW3ContactFieldType]) { - bFound = CFDictionaryGetValueIfPresent(dict, kABPersonInstantMessageServiceKey, (void*)&value); - if (bFound && (value != NULL)) { - CFRetain(value); - [newDict setObject:(id)[[CDVContact class] convertPropertyLabelToContactType : (__bridge NSString*)value] forKey:kW3ContactFieldType]; - CFRelease(value); - } else { - [newDict setObject:[NSNull null] forKey:kW3ContactFieldType]; - } - } - // always set ID - id identifier = [NSNumber numberWithUnsignedInt:ABMultiValueGetIdentifierAtIndex(multi, i)]; - [newDict setObject:(identifier != nil) ? identifier:[NSNull null] forKey:kW3ContactFieldId]; - - [(NSMutableArray*)imArray addObject : newDict]; - CFRelease(dict); - } - } else { - imArray = [NSNull null]; - } - - if (multi) { - CFRelease(multi); - } - return imArray; -} - -/* Create array of Dictionaries to match JavaScript ContactOrganization object - * pref - not supported in iOS - * type - not supported in iOS - * name - * department - * title - */ - -- (NSObject*)extractOrganizations -{ - NSArray* fields = [self.returnFields objectForKey:kW3ContactOrganizations]; - - if (fields == nil) { // no name fields requested - return nil; - } - NSObject* array = nil; - NSMutableDictionary* newDict = [NSMutableDictionary dictionaryWithCapacity:5]; - id value; - int validValueCount = 0; - - for (id i in fields) { - id key = [[CDVContact defaultW3CtoAB] valueForKey:i]; - if (key && [key isKindOfClass:[NSNumber class]]) { - value = (__bridge_transfer NSString*)ABRecordCopyValue(self.record, (ABPropertyID)[[[CDVContact defaultW3CtoAB] valueForKey:i] intValue]); - if (value != nil) { - // if there are no organization values we should return null for organization - // this counter keeps indicates if any organization values have been set - validValueCount++; - } - [newDict setObject:(value != nil) ? value:[NSNull null] forKey:i]; - } else { // not a key iOS supports, set to null - [newDict setObject:[NSNull null] forKey:i]; - } - } - - if (([newDict count] > 0) && (validValueCount > 0)) { - // add pref and type - // they are not supported by iOS and thus these values never change - [newDict setObject:@"false" forKey:kW3ContactFieldPrimary]; - [newDict setObject:[NSNull null] forKey:kW3ContactFieldType]; - array = [NSMutableArray arrayWithCapacity:1]; - [(NSMutableArray*)array addObject : newDict]; - } else { - array = [NSNull null]; - } - return array; -} - -// W3C Contacts expects an array of photos. Can return photos in more than one format, currently -// just returning the default format -// Save the photo data into tmp directory and return FileURI - temp directory is deleted upon application exit -- (NSObject*)extractPhotos -{ - NSMutableArray* photos = nil; - - if (ABPersonHasImageData(self.record)) { - CFDataRef photoData = ABPersonCopyImageData(self.record); - NSData* data = (__bridge NSData*)photoData; - // write to temp directory and store URI in photos array - // get the temp directory path - NSString* docsPath = [NSTemporaryDirectory()stringByStandardizingPath]; - NSError* err = nil; - NSString* filePath = [NSString stringWithFormat:@"%@/photo_XXXXX", docsPath]; - char template[filePath.length + 1]; - strcpy(template, [filePath cStringUsingEncoding:NSASCIIStringEncoding]); - mkstemp(template); - filePath = [[NSFileManager defaultManager] - stringWithFileSystemRepresentation:template - length:strlen(template)]; - - // save file - if ([data writeToFile:filePath options:NSAtomicWrite error:&err]) { - photos = [NSMutableArray arrayWithCapacity:1]; - NSMutableDictionary* newDict = [NSMutableDictionary dictionaryWithCapacity:2]; - [newDict setObject:filePath forKey:kW3ContactFieldValue]; - [newDict setObject:@"url" forKey:kW3ContactFieldType]; - [newDict setObject:@"false" forKey:kW3ContactFieldPrimary]; - [photos addObject:newDict]; - } - - CFRelease(photoData); - } - return photos; -} - -/** - * given an array of W3C Contact field names, create a dictionary of field names to extract - * if field name represents an object, return all properties for that object: "name" - returns all properties in ContactName - * if field name is an explicit property, return only those properties: "name.givenName - returns a ContactName with only ContactName.givenName - * if field contains ONLY ["*"] return all fields - * dictionary format: - * key is W3Contact #define - * value is NSMutableArray* for complex keys: name,addresses,organizations, phone, emails, ims - * value is [NSNull null] for simple keys -*/ -+ (NSDictionary*)calcReturnFields:(NSArray*)fieldsArray // NSLog(@"getting self.returnFields"); -{ - NSMutableDictionary* d = [NSMutableDictionary dictionaryWithCapacity:1]; - - if ((fieldsArray != nil) && [fieldsArray isKindOfClass:[NSArray class]]) { - if (([fieldsArray count] == 1) && [[fieldsArray objectAtIndex:0] isEqualToString:@"*"]) { - return [CDVContact defaultFields]; // return all fields - } - - for (id i in fieldsArray) { - NSMutableArray* keys = nil; - NSString* fieldStr = nil; - if ([i isKindOfClass:[NSNumber class]]) { - fieldStr = [i stringValue]; - } else { - fieldStr = i; - } - - // see if this is specific property request in object - object.property - NSArray* parts = [fieldStr componentsSeparatedByString:@"."]; // returns original string if no separator found - NSString* name = [parts objectAtIndex:0]; - NSString* property = nil; - if ([parts count] > 1) { - property = [parts objectAtIndex:1]; - } - // see if this is a complex field by looking for its array of properties in objectAndProperties dictionary - id fields = [[CDVContact defaultObjectAndProperties] objectForKey:name]; - - // if find complex name (name,addresses,organizations, phone, emails, ims) in fields, add name as key - // with array of associated properties as the value - if ((fields != nil) && (property == nil)) { // request was for full object - keys = [NSMutableArray arrayWithArray:fields]; - if (keys != nil) { - [d setObject:keys forKey:name]; // will replace if prop array already exists - } - } else if ((fields != nil) && (property != nil)) { - // found an individual property request in form of name.property - // verify is real property name by using it as key in W3CtoAB - id abEquiv = [[CDVContact defaultW3CtoAB] objectForKey:property]; - if (abEquiv || [[CDVContact defaultW3CtoNull] containsObject:property]) { - // if existing array add to it - if ((keys = [d objectForKey:name]) != nil) { - [keys addObject:property]; - } else { - keys = [NSMutableArray arrayWithObject:property]; - [d setObject:keys forKey:name]; - } - } else { - NSLog(@"Contacts.find -- request for invalid property ignored: %@.%@", name, property); - } - } else { // is an individual property, verify is real property name by using it as key in W3CtoAB - id valid = [[CDVContact defaultW3CtoAB] objectForKey:name]; - if (valid || [[CDVContact defaultW3CtoNull] containsObject:name]) { - [d setObject:[NSNull null] forKey:name]; - } - } - } - } - if ([d count] == 0) { - // no array or nothing in the array. W3C spec says to return nothing - return nil; // [Contact defaultFields]; - } - return d; -} - -/* - * Search for the specified value in each of the fields specified in the searchFields dictionary. - * NSString* value - the string value to search for (need clarification from W3C on how to search for dates) - * NSDictionary* searchFields - a dictionary created via calcReturnFields where the key is the top level W3C - * object and the object is the array of specific fields within that object or null if it is a single property - * RETURNS - * YES as soon as a match is found in any of the fields - * NO - the specified value does not exist in any of the fields in this contact - * - * Note: I'm not a fan of returning in the middle of methods but have done it some in this method in order to - * keep the code simpler. bgibson - */ -- (BOOL)foundValue:(NSString*)testValue inFields:(NSDictionary*)searchFields -{ - BOOL bFound = NO; - - if ((testValue == nil) || ![testValue isKindOfClass:[NSString class]] || ([testValue length] == 0)) { - // nothing to find so return NO - return NO; - } - NSInteger valueAsInt = [testValue integerValue]; - - // per W3C spec, always include id in search - int recordId = ABRecordGetRecordID(self.record); - if (valueAsInt && (recordId == valueAsInt)) { - return YES; - } - - if (searchFields == nil) { - // no fields to search - return NO; - } - - if ([searchFields valueForKey:kW3ContactNickname]) { - bFound = [self testStringValue:testValue forW3CProperty:kW3ContactNickname]; - if (bFound == YES) { - return bFound; - } - } - - if ([searchFields valueForKeyIsArray:kW3ContactName]) { - // test name fields. All are string properties obtained via ABRecordCopyValue except kW3ContactFormattedName - NSArray* fields = [searchFields valueForKey:kW3ContactName]; - - for (NSString* testItem in fields) { - if ([testItem isEqualToString:kW3ContactFormattedName]) { - NSString* propValue = (__bridge_transfer NSString*)ABRecordCopyCompositeName(self.record); - if ((propValue != nil) && ([propValue length] > 0)) { - NSRange range = [propValue rangeOfString:testValue options:NSCaseInsensitiveSearch]; - bFound = (range.location != NSNotFound); - propValue = nil; - } - } else { - bFound = [self testStringValue:testValue forW3CProperty:testItem]; - } - - if (bFound) { - break; - } - } - } - if (!bFound && [searchFields valueForKeyIsArray:kW3ContactPhoneNumbers]) { - bFound = [self searchContactFields:(NSArray*)[searchFields valueForKey:kW3ContactPhoneNumbers] - forMVStringProperty:kABPersonPhoneProperty withValue:testValue]; - } - if (!bFound && [searchFields valueForKeyIsArray:kW3ContactEmails]) { - bFound = [self searchContactFields:(NSArray*)[searchFields valueForKey:kW3ContactEmails] - forMVStringProperty:kABPersonEmailProperty withValue:testValue]; - } - - if (!bFound && [searchFields valueForKeyIsArray:kW3ContactAddresses]) { - bFound = [self searchContactFields:[searchFields valueForKey:kW3ContactAddresses] - forMVDictionaryProperty:kABPersonAddressProperty withValue:testValue]; - } - - if (!bFound && [searchFields valueForKeyIsArray:kW3ContactIms]) { - bFound = [self searchContactFields:[searchFields valueForKey:kW3ContactIms] - forMVDictionaryProperty:kABPersonInstantMessageProperty withValue:testValue]; - } - - if (!bFound && [searchFields valueForKeyIsArray:kW3ContactOrganizations]) { - NSArray* fields = [searchFields valueForKey:kW3ContactOrganizations]; - - for (NSString* testItem in fields) { - bFound = [self testStringValue:testValue forW3CProperty:testItem]; - if (bFound == YES) { - break; - } - } - } - if (!bFound && [searchFields valueForKey:kW3ContactNote]) { - bFound = [self testStringValue:testValue forW3CProperty:kW3ContactNote]; - } - - // if searching for a date field is requested, get the date field as a localized string then look for match against testValue in date string - // searching for photos is not supported - if (!bFound && [searchFields valueForKey:kW3ContactBirthday]) { - bFound = [self testDateValue:testValue forW3CProperty:kW3ContactBirthday]; - } - if (!bFound && [searchFields valueForKeyIsArray:kW3ContactUrls]) { - bFound = [self searchContactFields:(NSArray*)[searchFields valueForKey:kW3ContactUrls] - forMVStringProperty:kABPersonURLProperty withValue:testValue]; - } - - return bFound; -} - -/* - * Test for the existence of a given string within the value of a ABPersonRecord string property based on the W3c property name. - * - * IN: - * NSString* testValue - the value to find - search is case insensitive - * NSString* property - the W3c property string - * OUT: - * BOOL YES if the given string was found within the property value - * NO if the testValue was not found, W3C property string was invalid or the AddressBook property was not a string - */ -- (BOOL)testStringValue:(NSString*)testValue forW3CProperty:(NSString*)property -{ - BOOL bFound = NO; - - if ([[CDVContact defaultW3CtoAB] valueForKeyIsNumber:property]) { - ABPropertyID propId = [[[CDVContact defaultW3CtoAB] objectForKey:property] intValue]; - if (ABPersonGetTypeOfProperty(propId) == kABStringPropertyType) { - NSString* propValue = (__bridge_transfer NSString*)ABRecordCopyValue(self.record, propId); - if ((propValue != nil) && ([propValue length] > 0)) { - NSPredicate* containPred = [NSPredicate predicateWithFormat:@"SELF contains[cd] %@", testValue]; - bFound = [containPred evaluateWithObject:propValue]; - // NSRange range = [propValue rangeOfString:testValue options: NSCaseInsensitiveSearch]; - // bFound = (range.location != NSNotFound); - } - } - } - return bFound; -} - -/* - * Test for the existence of a given Date string within the value of a ABPersonRecord datetime property based on the W3c property name. - * - * IN: - * NSString* testValue - the value to find - search is case insensitive - * NSString* property - the W3c property string - * OUT: - * BOOL YES if the given string was found within the localized date string value - * NO if the testValue was not found, W3C property string was invalid or the AddressBook property was not a DateTime - */ -- (BOOL)testDateValue:(NSString*)testValue forW3CProperty:(NSString*)property -{ - BOOL bFound = NO; - - if ([[CDVContact defaultW3CtoAB] valueForKeyIsNumber:property]) { - ABPropertyID propId = [[[CDVContact defaultW3CtoAB] objectForKey:property] intValue]; - if (ABPersonGetTypeOfProperty(propId) == kABDateTimePropertyType) { - NSDate* date = (__bridge_transfer NSDate*)ABRecordCopyValue(self.record, propId); - if (date != nil) { - NSString* dateString = [date descriptionWithLocale:[NSLocale currentLocale]]; - NSPredicate* containPred = [NSPredicate predicateWithFormat:@"SELF contains[cd] %@", testValue]; - bFound = [containPred evaluateWithObject:dateString]; - } - } - } - return bFound; -} - -/* - * Search the specified fields within an AddressBook multivalue string property for the specified test value. - * Used for phoneNumbers, emails and urls. - * IN: - * NSArray* fields - the fields to search for within the multistring property (value and/or type) - * ABPropertyID - the property to search - * NSString* testValue - the value to search for. Will convert between W3C types and AB types. Will only - * search for types if the testValue is a valid ContactField type. - * OUT: - * YES if the test value was found in one of the specified fields - * NO if the test value was not found - */ -- (BOOL)searchContactFields:(NSArray*)fields forMVStringProperty:(ABPropertyID)propId withValue:testValue -{ - BOOL bFound = NO; - - for (NSString* type in fields) { - NSString* testString = nil; - if ([type isEqualToString:kW3ContactFieldType]) { - if ([CDVContact isValidW3ContactType:testValue]) { - // only search types if the filter string is a valid ContactField.type - testString = (NSString*)[CDVContact convertContactTypeToPropertyLabel:testValue]; - } - } else { - testString = testValue; - } - - if (testString != nil) { - bFound = [self testMultiValueStrings:testString forProperty:propId ofType:type]; - } - if (bFound == YES) { - break; - } - } - - return bFound; -} - -/* - * Searches a multiString value of the specified type for the specified test value. - * - * IN: - * NSString* testValue - the value to test for - * ABPropertyID propId - the property id of the multivalue property to search - * NSString* type - the W3C contact type to search for (value or type) - * OUT: - * YES is the test value was found - * NO if the test value was not found - */ -- (BOOL)testMultiValueStrings:(NSString*)testValue forProperty:(ABPropertyID)propId ofType:(NSString*)type -{ - BOOL bFound = NO; - - if (ABPersonGetTypeOfProperty(propId) == kABMultiStringPropertyType) { - NSArray* valueArray = nil; - if ([type isEqualToString:kW3ContactFieldType]) { - valueArray = [self labelsForProperty:propId inRecord:self.record]; - } else if ([type isEqualToString:kW3ContactFieldValue]) { - valueArray = [self valuesForProperty:propId inRecord:self.record]; - } - if (valueArray) { - NSString* valuesAsString = [valueArray componentsJoinedByString:@" "]; - NSPredicate* containPred = [NSPredicate predicateWithFormat:@"SELF contains[cd] %@", testValue]; - bFound = [containPred evaluateWithObject:valuesAsString]; - } - } - return bFound; -} - -/* - * Returns the array of values for a multivalue string property of the specified property id - */ -- (__autoreleasing NSArray*)valuesForProperty:(ABPropertyID)propId inRecord:(ABRecordRef)aRecord -{ - ABMultiValueRef multi = ABRecordCopyValue(aRecord, propId); - NSArray* values = (__bridge_transfer NSArray*)ABMultiValueCopyArrayOfAllValues(multi); - - CFRelease(multi); - return values; -} - -/* - * Returns the array of labels for a multivalue string property of the specified property id - */ -- (NSArray*)labelsForProperty:(ABPropertyID)propId inRecord:(ABRecordRef)aRecord -{ - ABMultiValueRef multi = ABRecordCopyValue(aRecord, propId); - CFIndex count = ABMultiValueGetCount(multi); - NSMutableArray* labels = [NSMutableArray arrayWithCapacity:count]; - - for (int i = 0; i < count; i++) { - NSString* label = (__bridge_transfer NSString*)ABMultiValueCopyLabelAtIndex(multi, i); - if (label) { - [labels addObject:label]; - } - } - - CFRelease(multi); - return labels; -} - -/* search for values within MultiValue Dictionary properties Address or IM property - * IN: - * (NSArray*) fields - the array of W3C field names to search within - * (ABPropertyID) propId - the AddressBook property that returns a multivalue dictionary - * (NSString*) testValue - the string to search for within the specified fields - * - */ -- (BOOL)searchContactFields:(NSArray*)fields forMVDictionaryProperty:(ABPropertyID)propId withValue:(NSString*)testValue -{ - BOOL bFound = NO; - - NSArray* values = [self valuesForProperty:propId inRecord:self.record]; // array of dictionaries (as CFDictionaryRef) - int dictCount = [values count]; - - // for ims dictionary contains with service (w3C type) and username (W3c value) - // for addresses dictionary contains street, city, state, zip, country - for (int i = 0; i < dictCount; i++) { - CFDictionaryRef dict = (__bridge CFDictionaryRef)[values objectAtIndex:i]; - - for (NSString* member in fields) { - NSString* abKey = [[CDVContact defaultW3CtoAB] valueForKey:member]; // im and address fields are all strings - CFStringRef abValue = nil; - if (abKey) { - NSString* testString = nil; - if ([member isEqualToString:kW3ContactImType]) { - if ([CDVContact isValidW3ContactType:testValue]) { - // only search service/types if the filter string is a valid ContactField.type - testString = (NSString*)[CDVContact convertContactTypeToPropertyLabel:testValue]; - } - } else { - testString = testValue; - } - if (testString != nil) { - BOOL bExists = CFDictionaryGetValueIfPresent(dict, (__bridge const void*)abKey, (void*)&abValue); - if (bExists) { - CFRetain(abValue); - NSPredicate* containPred = [NSPredicate predicateWithFormat:@"SELF contains[cd] %@", testString]; - bFound = [containPred evaluateWithObject:(__bridge id)abValue]; - CFRelease(abValue); - } - } - } - if (bFound == YES) { - break; - } - } // end of for each member in fields - - if (bFound == YES) { - break; - } - } // end of for each dictionary - - return bFound; -} - -@end diff --git a/cordova-lib/spec-plugman/plugins/Contacts/src/ios/CDVContacts.h b/cordova-lib/spec-plugman/plugins/Contacts/src/ios/CDVContacts.h deleted file mode 100644 index e3deb21b4..000000000 --- a/cordova-lib/spec-plugman/plugins/Contacts/src/ios/CDVContacts.h +++ /dev/null @@ -1,151 +0,0 @@ -/* - Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.0 (the - "License"); you may not use this file except in compliance - with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, - software distributed under the License is distributed on an - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - KIND, either express or implied. See the License for the - specific language governing permissions and limitations - under the License. - */ - -#import -#import -#import -#import -#import "CDVContact.h" - -@interface CDVContacts : CDVPlugin -{ - ABAddressBookRef addressBook; -} - -/* - * newContact - create a new contact via the GUI - * - * arguments: - * 1: successCallback: this is the javascript function that will be called with the newly created contactId - */ -- (void)newContact:(CDVInvokedUrlCommand*)command; - -/* - * displayContact - IN PROGRESS - * - * arguments: - * 1: recordID of the contact to display in the iPhone contact display - * 2: successCallback - currently not used - * 3: error callback - * options: - * allowsEditing: set to true to allow the user to edit the contact - currently not supported - */ -- (void)displayContact:(CDVInvokedUrlCommand*)command; - -/* - * chooseContact - * - * arguments: - * 1: this is the javascript function that will be called with the contact data as a JSON object (as the first param) - * options: - * allowsEditing: set to true to not choose the contact, but to edit it in the iPhone contact editor - */ -- (void)chooseContact:(CDVInvokedUrlCommand*)command; - -- (void)newPersonViewController:(ABNewPersonViewController*)newPersonViewController didCompleteWithNewPerson:(ABRecordRef)person; -- (BOOL)personViewController:(ABPersonViewController*)personViewController shouldPerformDefaultActionForPerson:(ABRecordRef)person - property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifierForValue; - -/* - * search - searches for contacts. Only person records are currently supported. - * - * arguments: - * 1: successcallback - this is the javascript function that will be called with the array of found contacts - * 2: errorCallback - optional javascript function to be called in the event of an error with an error code. - * options: dictionary containing ContactFields and ContactFindOptions - * fields - ContactFields array - * findOptions - ContactFindOptions object as dictionary - * - */ -- (void)search:(CDVInvokedUrlCommand*)command; - -/* - * save - saves a new contact or updates and existing contact - * - * arguments: - * 1: success callback - this is the javascript function that will be called with the JSON representation of the saved contact - * search calls a fixed navigator.service.contacts._findCallback which then calls the success callback stored before making the call into obj-c - */ -- (void)save:(CDVInvokedUrlCommand*)command; - -/* - * remove - removes a contact from the address book - * - * arguments: - * 1: 1: successcallback - this is the javascript function that will be called with a (now) empty contact object - * - * options: dictionary containing Contact object to remove - * contact - Contact object as dictionary - */ -- (void)remove:(CDVInvokedUrlCommand*)command; - -// - (void) dealloc; - -@end - -@interface CDVContactsPicker : ABPeoplePickerNavigationController -{ - BOOL allowsEditing; - NSString* callbackId; - NSDictionary* options; - NSDictionary* pickedContactDictionary; -} - -@property BOOL allowsEditing; -@property (copy) NSString* callbackId; -@property (nonatomic, strong) NSDictionary* options; -@property (nonatomic, strong) NSDictionary* pickedContactDictionary; - -@end - -@interface CDVNewContactsController : ABNewPersonViewController -{ - NSString* callbackId; -} -@property (copy) NSString* callbackId; -@end - -/* ABPersonViewController does not have any UI to dismiss. Adding navigationItems to it does not work properly, the navigationItems are lost when the app goes into the background. - The solution was to create an empty NavController in front of the ABPersonViewController. This - causes the ABPersonViewController to have a back button. By subclassing the ABPersonViewController, - we can override viewWillDisappear and take down the entire NavigationController at that time. - */ -@interface CDVDisplayContactViewController : ABPersonViewController -{} -@property (nonatomic, strong) CDVPlugin* contactsPlugin; - -@end -@interface CDVAddressBookAccessError : NSObject -{} -@property (assign) CDVContactError errorCode; -- (CDVAddressBookAccessError*)initWithCode:(CDVContactError)code; -@end - -typedef void (^ CDVAddressBookWorkerBlock)( - ABAddressBookRef addressBook, - CDVAddressBookAccessError* error - ); -@interface CDVAddressBookHelper : NSObject -{} - -- (void)createAddressBook:(CDVAddressBookWorkerBlock)workerBlock; -@end diff --git a/cordova-lib/spec-plugman/plugins/Contacts/src/ios/CDVContacts.m b/cordova-lib/spec-plugman/plugins/Contacts/src/ios/CDVContacts.m deleted file mode 100644 index 3ca3e814d..000000000 --- a/cordova-lib/spec-plugman/plugins/Contacts/src/ios/CDVContacts.m +++ /dev/null @@ -1,593 +0,0 @@ -/* - Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.0 (the - "License"); you may not use this file except in compliance - with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, - software distributed under the License is distributed on an - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - KIND, either express or implied. See the License for the - specific language governing permissions and limitations - under the License. - */ - -#import "CDVContacts.h" -#import -#import -#import -//#import "CDVNotification.h" - -@implementation CDVContactsPicker - -@synthesize allowsEditing; -@synthesize callbackId; -@synthesize options; -@synthesize pickedContactDictionary; - -@end -@implementation CDVNewContactsController - -@synthesize callbackId; - -@end - -@implementation CDVContacts - -// no longer used since code gets AddressBook for each operation. -// If address book changes during save or remove operation, may get error but not much we can do about it -// If address book changes during UI creation, display or edit, we don't control any saves so no need for callback - -/*void addressBookChanged(ABAddressBookRef addressBook, CFDictionaryRef info, void* context) -{ - // note that this function is only called when another AddressBook instance modifies - // the address book, not the current one. For example, through an OTA MobileMe sync - Contacts* contacts = (Contacts*)context; - [contacts addressBookDirty]; - }*/ - -- (CDVPlugin*)initWithWebView:(UIWebView*)theWebView -{ - self = (CDVContacts*)[super initWithWebView:(UIWebView*)theWebView]; - - /*if (self) { - addressBook = ABAddressBookCreate(); - ABAddressBookRegisterExternalChangeCallback(addressBook, addressBookChanged, self); - }*/ - - return self; -} - -// overridden to clean up Contact statics -- (void)onAppTerminate -{ - // NSLog(@"Contacts::onAppTerminate"); -} - -// iPhone only method to create a new contact through the GUI -- (void)newContact:(CDVInvokedUrlCommand*)command -{ - NSString* callbackId = command.callbackId; - - CDVAddressBookHelper* abHelper = [[CDVAddressBookHelper alloc] init]; - CDVContacts* __weak weakSelf = self; // play it safe to avoid retain cycles - - [abHelper createAddressBook: ^(ABAddressBookRef addrBook, CDVAddressBookAccessError* errCode) { - if (addrBook == NULL) { - // permission was denied or other error just return (no error callback) - return; - } - CDVNewContactsController* npController = [[CDVNewContactsController alloc] init]; - npController.addressBook = addrBook; // a CF retaining assign - CFRelease(addrBook); - - npController.newPersonViewDelegate = self; - npController.callbackId = callbackId; - - UINavigationController* navController = [[UINavigationController alloc] initWithRootViewController:npController]; - - if ([weakSelf.viewController respondsToSelector:@selector(presentViewController:::)]) { - [weakSelf.viewController presentViewController:navController animated:YES completion:nil]; - } else { - [weakSelf.viewController presentModalViewController:navController animated:YES]; - } - }]; -} - -- (void)newPersonViewController:(ABNewPersonViewController*)newPersonViewController didCompleteWithNewPerson:(ABRecordRef)person -{ - ABRecordID recordId = kABRecordInvalidID; - CDVNewContactsController* newCP = (CDVNewContactsController*)newPersonViewController; - NSString* callbackId = newCP.callbackId; - - if (person != NULL) { - // return the contact id - recordId = ABRecordGetRecordID(person); - } - - if ([newPersonViewController respondsToSelector:@selector(presentingViewController)]) { - [[newPersonViewController presentingViewController] dismissViewControllerAnimated:YES completion:nil]; - } else { - [[newPersonViewController parentViewController] dismissModalViewControllerAnimated:YES]; - } - - CDVPluginResult* result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsInt:recordId]; - [self.commandDelegate sendPluginResult:result callbackId:callbackId]; -} - -- (void)displayContact:(CDVInvokedUrlCommand*)command -{ - NSString* callbackId = command.callbackId; - ABRecordID recordID = [[command.arguments objectAtIndex:0] intValue]; - NSDictionary* options = [command.arguments objectAtIndex:1 withDefault:[NSNull null]]; - bool bEdit = [options isKindOfClass:[NSNull class]] ? false : [options existsValue:@"true" forKey:@"allowsEditing"]; - - CDVAddressBookHelper* abHelper = [[CDVAddressBookHelper alloc] init]; - CDVContacts* __weak weakSelf = self; // play it safe to avoid retain cycles - - [abHelper createAddressBook: ^(ABAddressBookRef addrBook, CDVAddressBookAccessError* errCode) { - if (addrBook == NULL) { - // permission was denied or other error - return error - CDVPluginResult* result = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageToErrorObject:errCode ? errCode.errorCode:UNKNOWN_ERROR]; - [weakSelf.commandDelegate sendPluginResult:result callbackId:callbackId]; - return; - } - ABRecordRef rec = ABAddressBookGetPersonWithRecordID(addrBook, recordID); - - if (rec) { - CDVDisplayContactViewController* personController = [[CDVDisplayContactViewController alloc] init]; - personController.displayedPerson = rec; - personController.personViewDelegate = self; - personController.allowsEditing = NO; - - // create this so DisplayContactViewController will have a "back" button. - UIViewController* parentController = [[UIViewController alloc] init]; - UINavigationController* navController = [[UINavigationController alloc] initWithRootViewController:parentController]; - - [navController pushViewController:personController animated:YES]; - - if ([self.viewController respondsToSelector:@selector(presentViewController:::)]) { - [self.viewController presentViewController:navController animated:YES completion:nil]; - } else { - [self.viewController presentModalViewController:navController animated:YES]; - } - - if (bEdit) { - // create the editing controller and push it onto the stack - ABPersonViewController* editPersonController = [[ABPersonViewController alloc] init]; - editPersonController.displayedPerson = rec; - editPersonController.personViewDelegate = self; - editPersonController.allowsEditing = YES; - [navController pushViewController:editPersonController animated:YES]; - } - } else { - // no record, return error - CDVPluginResult* result = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsInt:UNKNOWN_ERROR]; - [weakSelf.commandDelegate sendPluginResult:result callbackId:callbackId]; - } - CFRelease(addrBook); - }]; -} - -- (BOOL)personViewController:(ABPersonViewController*)personViewController shouldPerformDefaultActionForPerson:(ABRecordRef)person - property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifierForValue -{ - return YES; -} - -- (void)chooseContact:(CDVInvokedUrlCommand*)command -{ - NSString* callbackId = command.callbackId; - NSDictionary* options = [command.arguments objectAtIndex:0 withDefault:[NSNull null]]; - - CDVContactsPicker* pickerController = [[CDVContactsPicker alloc] init]; - - pickerController.peoplePickerDelegate = self; - pickerController.callbackId = callbackId; - pickerController.options = options; - pickerController.pickedContactDictionary = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithInt:kABRecordInvalidID], kW3ContactId, nil]; - pickerController.allowsEditing = (BOOL)[options existsValue : @"true" forKey : @"allowsEditing"]; - - if ([self.viewController respondsToSelector:@selector(presentViewController:::)]) { - [self.viewController presentViewController:pickerController animated:YES completion:nil]; - } else { - [self.viewController presentModalViewController:pickerController animated:YES]; - } -} - -- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController*)peoplePicker - shouldContinueAfterSelectingPerson:(ABRecordRef)person -{ - CDVContactsPicker* picker = (CDVContactsPicker*)peoplePicker; - NSNumber* pickedId = [NSNumber numberWithInt:ABRecordGetRecordID(person)]; - - if (picker.allowsEditing) { - ABPersonViewController* personController = [[ABPersonViewController alloc] init]; - personController.displayedPerson = person; - personController.personViewDelegate = self; - personController.allowsEditing = picker.allowsEditing; - // store id so can get info in peoplePickerNavigationControllerDidCancel - picker.pickedContactDictionary = [NSDictionary dictionaryWithObjectsAndKeys:pickedId, kW3ContactId, nil]; - - [peoplePicker pushViewController:personController animated:YES]; - } else { - // Retrieve and return pickedContact information - CDVContact* pickedContact = [[CDVContact alloc] initFromABRecord:(ABRecordRef)person]; - NSArray* fields = [picker.options objectForKey:@"fields"]; - NSDictionary* returnFields = [[CDVContact class] calcReturnFields:fields]; - picker.pickedContactDictionary = [pickedContact toDictionary:returnFields]; - - CDVPluginResult* result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDictionary:picker.pickedContactDictionary]; - [self.commandDelegate sendPluginResult:result callbackId:picker.callbackId]; - - if ([picker respondsToSelector:@selector(presentingViewController)]) { - [[picker presentingViewController] dismissViewControllerAnimated:YES completion:nil]; - } else { - [[picker parentViewController] dismissModalViewControllerAnimated:YES]; - } - } - return NO; -} - -- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController*)peoplePicker - shouldContinueAfterSelectingPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier -{ - return YES; -} - -- (void)peoplePickerNavigationControllerDidCancel:(ABPeoplePickerNavigationController*)peoplePicker -{ - // return contactId or invalid if none picked - CDVContactsPicker* picker = (CDVContactsPicker*)peoplePicker; - - if (picker.allowsEditing) { - // get the info after possible edit - // if we got this far, user has already approved/ disapproved addressBook access - ABAddressBookRef addrBook = nil; -#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 60000 - if (&ABAddressBookCreateWithOptions != NULL) { - addrBook = ABAddressBookCreateWithOptions(NULL, NULL); - } else -#endif - { - // iOS 4 & 5 - addrBook = ABAddressBookCreate(); - } - ABRecordRef person = ABAddressBookGetPersonWithRecordID(addrBook, [[picker.pickedContactDictionary objectForKey:kW3ContactId] integerValue]); - if (person) { - CDVContact* pickedContact = [[CDVContact alloc] initFromABRecord:(ABRecordRef)person]; - NSArray* fields = [picker.options objectForKey:@"fields"]; - NSDictionary* returnFields = [[CDVContact class] calcReturnFields:fields]; - picker.pickedContactDictionary = [pickedContact toDictionary:returnFields]; - } - CFRelease(addrBook); - } - CDVPluginResult* result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDictionary:picker.pickedContactDictionary]; - [self.commandDelegate sendPluginResult:result callbackId:picker.callbackId]; - - if ([peoplePicker respondsToSelector:@selector(presentingViewController)]) { - [[peoplePicker presentingViewController] dismissViewControllerAnimated:YES completion:nil]; - } else { - [[peoplePicker parentViewController] dismissModalViewControllerAnimated:YES]; - } -} - -- (void)search:(CDVInvokedUrlCommand*)command -{ - NSString* callbackId = command.callbackId; - NSArray* fields = [command.arguments objectAtIndex:0]; - NSDictionary* findOptions = [command.arguments objectAtIndex:1 withDefault:[NSNull null]]; - - [self.commandDelegate runInBackground:^{ - // from Apple: Important You must ensure that an instance of ABAddressBookRef is used by only one thread. - // which is why address book is created within the dispatch queue. - // more details here: http: //blog.byadrian.net/2012/05/05/ios-addressbook-framework-and-gcd/ - CDVAddressBookHelper* abHelper = [[CDVAddressBookHelper alloc] init]; - CDVContacts* __weak weakSelf = self; // play it safe to avoid retain cycles - // it gets uglier, block within block..... - [abHelper createAddressBook: ^(ABAddressBookRef addrBook, CDVAddressBookAccessError* errCode) { - if (addrBook == NULL) { - // permission was denied or other error - return error - CDVPluginResult* result = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageToErrorObject:errCode ? errCode.errorCode:UNKNOWN_ERROR]; - [weakSelf.commandDelegate sendPluginResult:result callbackId:callbackId]; - return; - } - - NSArray* foundRecords = nil; - // get the findOptions values - BOOL multiple = NO; // default is false - NSString* filter = nil; - if (![findOptions isKindOfClass:[NSNull class]]) { - id value = nil; - filter = (NSString*)[findOptions objectForKey:@"filter"]; - value = [findOptions objectForKey:@"multiple"]; - if ([value isKindOfClass:[NSNumber class]]) { - // multiple is a boolean that will come through as an NSNumber - multiple = [(NSNumber*)value boolValue]; - // NSLog(@"multiple is: %d", multiple); - } - } - - NSDictionary* returnFields = [[CDVContact class] calcReturnFields:fields]; - - NSMutableArray* matches = nil; - if (!filter || [filter isEqualToString:@""]) { - // get all records - foundRecords = (__bridge_transfer NSArray*)ABAddressBookCopyArrayOfAllPeople(addrBook); - if (foundRecords && ([foundRecords count] > 0)) { - // create Contacts and put into matches array - // doesn't make sense to ask for all records when multiple == NO but better check - int xferCount = multiple == YES ? [foundRecords count] : 1; - matches = [NSMutableArray arrayWithCapacity:xferCount]; - - for (int k = 0; k < xferCount; k++) { - CDVContact* xferContact = [[CDVContact alloc] initFromABRecord:(__bridge ABRecordRef)[foundRecords objectAtIndex:k]]; - [matches addObject:xferContact]; - xferContact = nil; - } - } - } else { - foundRecords = (__bridge_transfer NSArray*)ABAddressBookCopyArrayOfAllPeople(addrBook); - matches = [NSMutableArray arrayWithCapacity:1]; - BOOL bFound = NO; - int testCount = [foundRecords count]; - - for (int j = 0; j < testCount; j++) { - CDVContact* testContact = [[CDVContact alloc] initFromABRecord:(__bridge ABRecordRef)[foundRecords objectAtIndex:j]]; - if (testContact) { - bFound = [testContact foundValue:filter inFields:returnFields]; - if (bFound) { - [matches addObject:testContact]; - } - testContact = nil; - } - } - } - NSMutableArray* returnContacts = [NSMutableArray arrayWithCapacity:1]; - - if ((matches != nil) && ([matches count] > 0)) { - // convert to JS Contacts format and return in callback - // - returnFields determines what properties to return - @autoreleasepool { - int count = multiple == YES ? [matches count] : 1; - - for (int i = 0; i < count; i++) { - CDVContact* newContact = [matches objectAtIndex:i]; - NSDictionary* aContact = [newContact toDictionary:returnFields]; - [returnContacts addObject:aContact]; - } - } - } - // return found contacts (array is empty if no contacts found) - CDVPluginResult* result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsArray:returnContacts]; - [weakSelf.commandDelegate sendPluginResult:result callbackId:callbackId]; - // NSLog(@"findCallback string: %@", jsString); - - if (addrBook) { - CFRelease(addrBook); - } - }]; - }]; // end of workQueue block - - return; -} - -- (void)save:(CDVInvokedUrlCommand*)command -{ - NSString* callbackId = command.callbackId; - NSDictionary* contactDict = [command.arguments objectAtIndex:0]; - - [self.commandDelegate runInBackground:^{ - CDVAddressBookHelper* abHelper = [[CDVAddressBookHelper alloc] init]; - CDVContacts* __weak weakSelf = self; // play it safe to avoid retain cycles - - [abHelper createAddressBook: ^(ABAddressBookRef addrBook, CDVAddressBookAccessError* errorCode) { - CDVPluginResult* result = nil; - if (addrBook == NULL) { - // permission was denied or other error - return error - result = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsInt:errorCode ? errorCode.errorCode:UNKNOWN_ERROR]; - [weakSelf.commandDelegate sendPluginResult:result callbackId:callbackId]; - return; - } - - bool bIsError = FALSE, bSuccess = FALSE; - BOOL bUpdate = NO; - CDVContactError errCode = UNKNOWN_ERROR; - CFErrorRef error; - NSNumber* cId = [contactDict valueForKey:kW3ContactId]; - CDVContact* aContact = nil; - ABRecordRef rec = nil; - if (cId && ![cId isKindOfClass:[NSNull class]]) { - rec = ABAddressBookGetPersonWithRecordID(addrBook, [cId intValue]); - if (rec) { - aContact = [[CDVContact alloc] initFromABRecord:rec]; - bUpdate = YES; - } - } - if (!aContact) { - aContact = [[CDVContact alloc] init]; - } - - bSuccess = [aContact setFromContactDict:contactDict asUpdate:bUpdate]; - if (bSuccess) { - if (!bUpdate) { - bSuccess = ABAddressBookAddRecord(addrBook, [aContact record], &error); - } - if (bSuccess) { - bSuccess = ABAddressBookSave(addrBook, &error); - } - if (!bSuccess) { // need to provide error codes - bIsError = TRUE; - errCode = IO_ERROR; - } else { - // give original dictionary back? If generate dictionary from saved contact, have no returnFields specified - // so would give back all fields (which W3C spec. indicates is not desired) - // for now (while testing) give back saved, full contact - NSDictionary* newContact = [aContact toDictionary:[CDVContact defaultFields]]; - // NSString* contactStr = [newContact JSONRepresentation]; - result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDictionary:newContact]; - } - } else { - bIsError = TRUE; - errCode = IO_ERROR; - } - CFRelease(addrBook); - - if (bIsError) { - result = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsInt:errCode]; - } - - if (result) { - [weakSelf.commandDelegate sendPluginResult:result callbackId:callbackId]; - } - }]; - }]; // end of queue -} - -- (void)remove:(CDVInvokedUrlCommand*)command -{ - NSString* callbackId = command.callbackId; - NSNumber* cId = [command.arguments objectAtIndex:0]; - - CDVAddressBookHelper* abHelper = [[CDVAddressBookHelper alloc] init]; - CDVContacts* __weak weakSelf = self; // play it safe to avoid retain cycles - - [abHelper createAddressBook: ^(ABAddressBookRef addrBook, CDVAddressBookAccessError* errorCode) { - CDVPluginResult* result = nil; - if (addrBook == NULL) { - // permission was denied or other error - return error - result = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsInt:errorCode ? errorCode.errorCode:UNKNOWN_ERROR]; - [weakSelf.commandDelegate sendPluginResult:result callbackId:callbackId]; - return; - } - - bool bIsError = FALSE, bSuccess = FALSE; - CDVContactError errCode = UNKNOWN_ERROR; - CFErrorRef error; - ABRecordRef rec = nil; - if (cId && ![cId isKindOfClass:[NSNull class]] && ([cId intValue] != kABRecordInvalidID)) { - rec = ABAddressBookGetPersonWithRecordID(addrBook, [cId intValue]); - if (rec) { - bSuccess = ABAddressBookRemoveRecord(addrBook, rec, &error); - if (!bSuccess) { - bIsError = TRUE; - errCode = IO_ERROR; - } else { - bSuccess = ABAddressBookSave(addrBook, &error); - if (!bSuccess) { - bIsError = TRUE; - errCode = IO_ERROR; - } else { - // set id to null - // [contactDict setObject:[NSNull null] forKey:kW3ContactId]; - // result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDictionary: contactDict]; - result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK]; - // NSString* contactStr = [contactDict JSONRepresentation]; - } - } - } else { - // no record found return error - bIsError = TRUE; - errCode = UNKNOWN_ERROR; - } - } else { - // invalid contact id provided - bIsError = TRUE; - errCode = INVALID_ARGUMENT_ERROR; - } - - if (addrBook) { - CFRelease(addrBook); - } - if (bIsError) { - result = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsInt:errCode]; - } - if (result) { - [weakSelf.commandDelegate sendPluginResult:result callbackId:callbackId]; - } - }]; - return; -} - -@end - -/* ABPersonViewController does not have any UI to dismiss. Adding navigationItems to it does not work properly - * The navigationItems are lost when the app goes into the background. The solution was to create an empty - * NavController in front of the ABPersonViewController. This will cause the ABPersonViewController to have a back button. By subclassing the ABPersonViewController, we can override viewDidDisappear and take down the entire NavigationController. - */ -@implementation CDVDisplayContactViewController -@synthesize contactsPlugin; - -- (void)viewWillDisappear:(BOOL)animated -{ - [super viewWillDisappear:animated]; - - if ([self respondsToSelector:@selector(presentingViewController)]) { - [[self presentingViewController] dismissViewControllerAnimated:YES completion:nil]; - } else { - [[self parentViewController] dismissModalViewControllerAnimated:YES]; - } -} - -@end -@implementation CDVAddressBookAccessError - -@synthesize errorCode; - -- (CDVAddressBookAccessError*)initWithCode:(CDVContactError)code -{ - self = [super init]; - if (self) { - self.errorCode = code; - } - return self; -} - -@end - -@implementation CDVAddressBookHelper - -/** - * NOTE: workerBlock is responsible for releasing the addressBook that is passed to it - */ -- (void)createAddressBook:(CDVAddressBookWorkerBlock)workerBlock -{ - // TODO: this probably should be reworked - seems like the workerBlock can just create and release its own AddressBook, - // and also this important warning from (http://developer.apple.com/library/ios/#documentation/ContactData/Conceptual/AddressBookProgrammingGuideforiPhone/Chapters/BasicObjects.html): - // "Important: Instances of ABAddressBookRef cannot be used by multiple threads. Each thread must make its own instance." - ABAddressBookRef addressBook; - -#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 60000 - if (&ABAddressBookCreateWithOptions != NULL) { - CFErrorRef error = nil; - // CFIndex status = ABAddressBookGetAuthorizationStatus(); - addressBook = ABAddressBookCreateWithOptions(NULL, &error); - // NSLog(@"addressBook access: %lu", status); - ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error) { - // callback can occur in background, address book must be accessed on thread it was created on - dispatch_sync(dispatch_get_main_queue(), ^{ - if (error) { - workerBlock(NULL, [[CDVAddressBookAccessError alloc] initWithCode:UNKNOWN_ERROR]); - } else if (!granted) { - workerBlock(NULL, [[CDVAddressBookAccessError alloc] initWithCode:PERMISSION_DENIED_ERROR]); - } else { - // access granted - workerBlock(addressBook, [[CDVAddressBookAccessError alloc] initWithCode:UNKNOWN_ERROR]); - } - }); - }); - } else -#endif - { - // iOS 4 or 5 no checks needed - addressBook = ABAddressBookCreate(); - workerBlock(addressBook, NULL); - } -} - -@end diff --git a/cordova-lib/spec-plugman/plugins/Contacts/src/wp/Contacts.cs b/cordova-lib/spec-plugman/plugins/Contacts/src/wp/Contacts.cs deleted file mode 100644 index 6789bb8a0..000000000 --- a/cordova-lib/spec-plugman/plugins/Contacts/src/wp/Contacts.cs +++ /dev/null @@ -1,664 +0,0 @@ -/* - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -using Microsoft.Phone.Tasks; -using Microsoft.Phone.UserData; -using System; -using System.Collections; -using System.Collections.Generic; -using System.Diagnostics; -using System.Linq; -using System.Runtime.Serialization; -using System.Windows; -using DeviceContacts = Microsoft.Phone.UserData.Contacts; - - -namespace WPCordovaClassLib.Cordova.Commands -{ - [DataContract] - public class SearchOptions - { - [DataMember] - public string filter { get; set; } - [DataMember] - public bool multiple { get; set; } - } - - [DataContract] - public class ContactSearchParams - { - [DataMember] - public string[] fields { get; set; } - [DataMember] - public SearchOptions options { get; set; } - } - - [DataContract] - public class JSONContactAddress - { - [DataMember] - public string formatted { get; set; } - [DataMember] - public string type { get; set; } - [DataMember] - public string streetAddress { get; set; } - [DataMember] - public string locality { get; set; } - [DataMember] - public string region { get; set; } - [DataMember] - public string postalCode { get; set; } - [DataMember] - public string country { get; set; } - [DataMember] - public bool pref { get; set; } - } - - [DataContract] - public class JSONContactName - { - [DataMember] - public string formatted { get; set; } - [DataMember] - public string familyName { get; set; } - [DataMember] - public string givenName { get; set; } - [DataMember] - public string middleName { get; set; } - [DataMember] - public string honorificPrefix { get; set; } - [DataMember] - public string honorificSuffix { get; set; } - } - - [DataContract] - public class JSONContactField - { - [DataMember] - public string type { get; set; } - [DataMember] - public string value { get; set; } - [DataMember] - public bool pref { get; set; } - } - - [DataContract] - public class JSONContactOrganization - { - [DataMember] - public string type { get; set; } - [DataMember] - public string name { get; set; } - [DataMember] - public bool pref { get; set; } - [DataMember] - public string department { get; set; } - [DataMember] - public string title { get; set; } - } - - [DataContract] - public class JSONContact - { - [DataMember] - public string id { get; set; } - [DataMember] - public string rawId { get; set; } - [DataMember] - public string displayName { get; set; } - [DataMember] - public string nickname { get; set; } - [DataMember] - public string note { get; set; } - - [DataMember] - public JSONContactName name { get; set; } - - [DataMember] - public JSONContactField[] emails { get; set; } - - [DataMember] - public JSONContactField[] phoneNumbers { get; set; } - - [DataMember] - public JSONContactField[] ims { get; set; } - - [DataMember] - public JSONContactField[] photos { get; set; } - - [DataMember] - public JSONContactField[] categories { get; set; } - - [DataMember] - public JSONContactField[] urls { get; set; } - - [DataMember] - public JSONContactOrganization[] organizations { get; set; } - - [DataMember] - public JSONContactAddress[] addresses { get; set; } - } - - - public class Contacts : BaseCommand - { - - public const int UNKNOWN_ERROR = 0; - public const int INVALID_ARGUMENT_ERROR = 1; - public const int TIMEOUT_ERROR = 2; - public const int PENDING_OPERATION_ERROR = 3; - public const int IO_ERROR = 4; - public const int NOT_SUPPORTED_ERROR = 5; - public const int PERMISSION_DENIED_ERROR = 20; - public const int SYNTAX_ERR = 8; - - public Contacts() - { - - } - - // refer here for contact properties we can access: http://msdn.microsoft.com/en-us/library/microsoft.phone.tasks.savecontacttask_members%28v=VS.92%29.aspx - public void save(string jsonContact) - { - - // jsonContact is actually an array of 1 {contact} - string[] args = JSON.JsonHelper.Deserialize(jsonContact); - - - JSONContact contact = JSON.JsonHelper.Deserialize(args[0]); - - SaveContactTask contactTask = new SaveContactTask(); - - if (contact.nickname != null) - { - contactTask.Nickname = contact.nickname; - } - if (contact.urls != null && contact.urls.Length > 0) - { - contactTask.Website = contact.urls[0].value; - } - if (contact.note != null) - { - contactTask.Notes = contact.note; - } - - #region contact.name - if (contact.name != null) - { - if (contact.name.givenName != null) - contactTask.FirstName = contact.name.givenName; - if (contact.name.familyName != null) - contactTask.LastName = contact.name.familyName; - if (contact.name.middleName != null) - contactTask.MiddleName = contact.name.middleName; - if (contact.name.honorificSuffix != null) - contactTask.Suffix = contact.name.honorificSuffix; - if (contact.name.honorificPrefix != null) - contactTask.Title = contact.name.honorificPrefix; - } - #endregion - - #region contact.org - if (contact.organizations != null && contact.organizations.Count() > 0) - { - contactTask.Company = contact.organizations[0].name; - contactTask.JobTitle = contact.organizations[0].title; - } - #endregion - - #region contact.phoneNumbers - if (contact.phoneNumbers != null && contact.phoneNumbers.Length > 0) - { - foreach (JSONContactField field in contact.phoneNumbers) - { - string fieldType = field.type.ToLower(); - if (fieldType == "work") - { - contactTask.WorkPhone = field.value; - } - else if (fieldType == "home") - { - contactTask.HomePhone = field.value; - } - else if (fieldType == "mobile") - { - contactTask.MobilePhone = field.value; - } - } - } - #endregion - - #region contact.emails - - if (contact.emails != null && contact.emails.Length > 0) - { - - // set up different email types if they are not explicitly defined - foreach (string type in new string[] { "personal", "work", "other" }) - { - foreach (JSONContactField field in contact.emails) - { - if (field != null && String.IsNullOrEmpty(field.type)) - { - field.type = type; - break; - } - } - } - - foreach (JSONContactField field in contact.emails) - { - if (field != null) - { - if (field.type != null && field.type != "other") - { - string fieldType = field.type.ToLower(); - if (fieldType == "work") - { - contactTask.WorkEmail = field.value; - } - else if (fieldType == "home" || fieldType == "personal") - { - contactTask.PersonalEmail = field.value; - } - } - else - { - contactTask.OtherEmail = field.value; - } - } - - } - } - #endregion - - if (contact.note != null && contact.note.Length > 0) - { - contactTask.Notes = contact.note; - } - - #region contact.addresses - if (contact.addresses != null && contact.addresses.Length > 0) - { - foreach (JSONContactAddress address in contact.addresses) - { - if (address.type == null) - { - address.type = "home"; // set a default - } - string fieldType = address.type.ToLower(); - if (fieldType == "work") - { - contactTask.WorkAddressCity = address.locality; - contactTask.WorkAddressCountry = address.country; - contactTask.WorkAddressState = address.region; - contactTask.WorkAddressStreet = address.streetAddress; - contactTask.WorkAddressZipCode = address.postalCode; - } - else if (fieldType == "home" || fieldType == "personal") - { - contactTask.HomeAddressCity = address.locality; - contactTask.HomeAddressCountry = address.country; - contactTask.HomeAddressState = address.region; - contactTask.HomeAddressStreet = address.streetAddress; - contactTask.HomeAddressZipCode = address.postalCode; - } - else - { - // no other address fields available ... - Debug.WriteLine("Creating contact with unsupported address type :: " + address.type); - } - } - } - #endregion - - - contactTask.Completed += new EventHandler(ContactSaveTaskCompleted); - contactTask.Show(); - } - - void ContactSaveTaskCompleted(object sender, SaveContactResult e) - { - SaveContactTask task = sender as SaveContactTask; - - if (e.TaskResult == TaskResult.OK) - { - - Deployment.Current.Dispatcher.BeginInvoke(() => - { - DeviceContacts deviceContacts = new DeviceContacts(); - deviceContacts.SearchCompleted += new EventHandler(postAdd_SearchCompleted); - - string displayName = String.Format("{0}{2}{1}", task.FirstName, task.LastName, String.IsNullOrEmpty(task.FirstName) ? "" : " "); - - deviceContacts.SearchAsync(displayName, FilterKind.DisplayName, task); - }); - - - } - else if (e.TaskResult == TaskResult.Cancel) - { - DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, "Operation cancelled.")); - } - } - - void postAdd_SearchCompleted(object sender, ContactsSearchEventArgs e) - { - if (e.Results.Count() > 0) - { - List foundContacts = new List(); - - int n = (from Contact contact in e.Results select contact.GetHashCode()).Max(); - Contact newContact = (from Contact contact in e.Results - where contact.GetHashCode() == n - select contact).First(); - - DispatchCommandResult(new PluginResult(PluginResult.Status.OK, FormatJSONContact(newContact, null))); - } - else - { - DispatchCommandResult(new PluginResult(PluginResult.Status.NO_RESULT)); - } - } - - - - public void remove(string id) - { - // note id is wrapped in [] and always has exactly one string ... - DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, "{\"code\":" + NOT_SUPPORTED_ERROR + "}")); - } - - public void search(string searchCriteria) - { - string[] args = JSON.JsonHelper.Deserialize(searchCriteria); - - ContactSearchParams searchParams = new ContactSearchParams(); - try - { - searchParams.fields = JSON.JsonHelper.Deserialize(args[0]); - searchParams.options = JSON.JsonHelper.Deserialize(args[1]); - } - catch (Exception) - { - DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, INVALID_ARGUMENT_ERROR)); - return; - } - - if (searchParams.options == null) - { - searchParams.options = new SearchOptions(); - searchParams.options.filter = ""; - searchParams.options.multiple = true; - } - - DeviceContacts deviceContacts = new DeviceContacts(); - deviceContacts.SearchCompleted += new EventHandler(contacts_SearchCompleted); - - // default is to search all fields - FilterKind filterKind = FilterKind.None; - // if only one field is specified, we will try the 3 available DeviceContact search filters - if (searchParams.fields.Count() == 1) - { - if (searchParams.fields.Contains("name")) - { - filterKind = FilterKind.DisplayName; - } - else if (searchParams.fields.Contains("emails")) - { - filterKind = FilterKind.EmailAddress; - } - else if (searchParams.fields.Contains("phoneNumbers")) - { - filterKind = FilterKind.PhoneNumber; - } - } - - try - { - - deviceContacts.SearchAsync(searchParams.options.filter, filterKind, searchParams); - } - catch (Exception ex) - { - Debug.WriteLine("search contacts exception :: " + ex.Message); - } - } - - private void contacts_SearchCompleted(object sender, ContactsSearchEventArgs e) - { - ContactSearchParams searchParams = (ContactSearchParams)e.State; - - List foundContacts = null; - - // if we have multiple search fields - if (searchParams.options.filter.Length > 0 && searchParams.fields.Count() > 1) - { - foundContacts = new List(); - if (searchParams.fields.Contains("emails")) - { - foundContacts.AddRange(from Contact con in e.Results - from ContactEmailAddress a in con.EmailAddresses - where a.EmailAddress.Contains(searchParams.options.filter) - select con); - } - if (searchParams.fields.Contains("displayName")) - { - foundContacts.AddRange(from Contact con in e.Results - where con.DisplayName.Contains(searchParams.options.filter) - select con); - } - if (searchParams.fields.Contains("name")) - { - foundContacts.AddRange(from Contact con in e.Results - where con.CompleteName != null && con.CompleteName.ToString().Contains(searchParams.options.filter) - select con); - } - if (searchParams.fields.Contains("phoneNumbers")) - { - foundContacts.AddRange(from Contact con in e.Results - from ContactPhoneNumber a in con.PhoneNumbers - where a.PhoneNumber.Contains(searchParams.options.filter) - select con); - } - if (searchParams.fields.Contains("urls")) - { - foundContacts.AddRange(from Contact con in e.Results - from string a in con.Websites - where a.Contains(searchParams.options.filter) - select con); - } - } - else - { - foundContacts = new List(e.Results); - } - - //List contactList = new List(); - - string strResult = ""; - - IEnumerable distinctContacts = foundContacts.Distinct(); - - foreach (Contact contact in distinctContacts) - { - strResult += FormatJSONContact(contact, null) + ","; - //contactList.Add(FormatJSONContact(contact, null)); - if (!searchParams.options.multiple) - { - break; // just return the first item - } - } - PluginResult result = new PluginResult(PluginResult.Status.OK); - result.Message = "[" + strResult.TrimEnd(',') + "]"; - DispatchCommandResult(result); - - } - - private string FormatJSONPhoneNumbers(Contact con) - { - string retVal = ""; - string contactFieldFormat = "\"type\":\"{0}\",\"value\":\"{1}\",\"pref\":\"false\""; - foreach (ContactPhoneNumber number in con.PhoneNumbers) - { - - string contactField = string.Format(contactFieldFormat, - number.Kind.ToString(), - number.PhoneNumber); - - retVal += "{" + contactField + "},"; - } - return retVal.TrimEnd(','); - } - - private string FormatJSONEmails(Contact con) - { - string retVal = ""; - string contactFieldFormat = "\"type\":\"{0}\",\"value\":\"{1}\",\"pref\":\"false\""; - foreach (ContactEmailAddress address in con.EmailAddresses) - { - string contactField = string.Format(contactFieldFormat, - address.Kind.ToString(), - address.EmailAddress); - - retVal += "{" + contactField + "},"; - } - return retVal.TrimEnd(','); - } - - private string getFormattedJSONAddress(ContactAddress address, bool isPreferred) - { - - string addressFormatString = "\"pref\":{0}," + // bool - "\"type\":\"{1}\"," + - "\"formatted\":\"{2}\"," + - "\"streetAddress\":\"{3}\"," + - "\"locality\":\"{4}\"," + - "\"region\":\"{5}\"," + - "\"postalCode\":\"{6}\"," + - "\"country\":\"{7}\""; - - string formattedAddress = address.PhysicalAddress.AddressLine1 + " " - + address.PhysicalAddress.AddressLine2 + " " - + address.PhysicalAddress.City + " " - + address.PhysicalAddress.StateProvince + " " - + address.PhysicalAddress.CountryRegion + " " - + address.PhysicalAddress.PostalCode; - - string jsonAddress = string.Format(addressFormatString, - isPreferred ? "\"true\"" : "\"false\"", - address.Kind.ToString(), - formattedAddress, - address.PhysicalAddress.AddressLine1 + " " + address.PhysicalAddress.AddressLine2, - address.PhysicalAddress.City, - address.PhysicalAddress.StateProvince, - address.PhysicalAddress.PostalCode, - address.PhysicalAddress.CountryRegion); - - //Debug.WriteLine("getFormattedJSONAddress returning :: " + jsonAddress); - - return "{" + jsonAddress + "}"; - } - - private string FormatJSONAddresses(Contact con) - { - string retVal = ""; - foreach (ContactAddress address in con.Addresses) - { - retVal += this.getFormattedJSONAddress(address, false) + ","; - } - - //Debug.WriteLine("FormatJSONAddresses returning :: " + retVal); - return retVal.TrimEnd(','); - } - - private string FormatJSONWebsites(Contact con) - { - string retVal = ""; - foreach (string website in con.Websites) - { - retVal += "\"" + website + "\","; - } - return retVal.TrimEnd(','); - } - - /* - * formatted: The complete name of the contact. (DOMString) - familyName: The contacts family name. (DOMString) - givenName: The contacts given name. (DOMString) - middleName: The contacts middle name. (DOMString) - honorificPrefix: The contacts prefix (example Mr. or Dr.) (DOMString) - honorificSuffix: The contacts suffix (example Esq.). (DOMString) - */ - private string FormatJSONName(Contact con) - { - string retVal = ""; - string formatStr = "\"formatted\":\"{0}\"," + - "\"familyName\":\"{1}\"," + - "\"givenName\":\"{2}\"," + - "\"middleName\":\"{3}\"," + - "\"honorificPrefix\":\"{4}\"," + - "\"honorificSuffix\":\"{5}\""; - - if (con.CompleteName != null) - { - retVal = string.Format(formatStr, - con.CompleteName.FirstName + " " + con.CompleteName.LastName, // TODO: does this need suffix? middlename? - con.CompleteName.LastName, - con.CompleteName.FirstName, - con.CompleteName.MiddleName, - con.CompleteName.Title, - con.CompleteName.Suffix); - } - else - { - retVal = string.Format(formatStr,"","","","","",""); - } - - return "{" + retVal + "}"; - } - - private string FormatJSONContact(Contact con, string[] fields) - { - - string contactFormatStr = "\"id\":\"{0}\"," + - "\"displayName\":\"{1}\"," + - "\"nickname\":\"{2}\"," + - "\"phoneNumbers\":[{3}]," + - "\"emails\":[{4}]," + - "\"addresses\":[{5}]," + - "\"urls\":[{6}]," + - "\"name\":{7}," + - "\"note\":\"{8}\"," + - "\"birthday\":\"{9}\""; - - - string jsonContact = String.Format(contactFormatStr, - con.GetHashCode(), - con.DisplayName, - con.CompleteName != null ? con.CompleteName.Nickname : "", - FormatJSONPhoneNumbers(con), - FormatJSONEmails(con), - FormatJSONAddresses(con), - FormatJSONWebsites(con), - FormatJSONName(con), - con.Notes.FirstOrDefault(), - con.Birthdays.FirstOrDefault()); - - //Debug.WriteLine("jsonContact = " + jsonContact); - // JSON requires new line characters be escaped - return "{" + jsonContact.Replace("\n", "\\n") + "}"; - } - } -} diff --git a/cordova-lib/spec-plugman/plugins/Contacts/www/Contact.js b/cordova-lib/spec-plugman/plugins/Contacts/www/Contact.js deleted file mode 100644 index 9c46a0cc7..000000000 --- a/cordova-lib/spec-plugman/plugins/Contacts/www/Contact.js +++ /dev/null @@ -1,177 +0,0 @@ -/* - * - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - * -*/ - -var argscheck = require('cordova/argscheck'), - exec = require('cordova/exec'), - ContactError = require('./ContactError'), - utils = require('cordova/utils'); - -/** -* Converts primitives into Complex Object -* Currently only used for Date fields -*/ -function convertIn(contact) { - var value = contact.birthday; - try { - contact.birthday = new Date(parseFloat(value)); - } catch (exception){ - console.log("Cordova Contact convertIn error: exception creating date."); - } - return contact; -} - -/** -* Converts Complex objects into primitives -* Only conversion at present is for Dates. -**/ - -function convertOut(contact) { - var value = contact.birthday; - if (value !== null) { - // try to make it a Date object if it is not already - if (!utils.isDate(value)){ - try { - value = new Date(value); - } catch(exception){ - value = null; - } - } - if (utils.isDate(value)){ - value = value.valueOf(); // convert to milliseconds - } - contact.birthday = value; - } - return contact; -} - -/** -* Contains information about a single contact. -* @constructor -* @param {DOMString} id unique identifier -* @param {DOMString} displayName -* @param {ContactName} name -* @param {DOMString} nickname -* @param {Array.} phoneNumbers array of phone numbers -* @param {Array.} emails array of email addresses -* @param {Array.} addresses array of addresses -* @param {Array.} ims instant messaging user ids -* @param {Array.} organizations -* @param {DOMString} birthday contact's birthday -* @param {DOMString} note user notes about contact -* @param {Array.} photos -* @param {Array.} categories -* @param {Array.} urls contact's web sites -*/ -var Contact = function (id, displayName, name, nickname, phoneNumbers, emails, addresses, - ims, organizations, birthday, note, photos, categories, urls) { - this.id = id || null; - this.rawId = null; - this.displayName = displayName || null; - this.name = name || null; // ContactName - this.nickname = nickname || null; - this.phoneNumbers = phoneNumbers || null; // ContactField[] - this.emails = emails || null; // ContactField[] - this.addresses = addresses || null; // ContactAddress[] - this.ims = ims || null; // ContactField[] - this.organizations = organizations || null; // ContactOrganization[] - this.birthday = birthday || null; - this.note = note || null; - this.photos = photos || null; // ContactField[] - this.categories = categories || null; // ContactField[] - this.urls = urls || null; // ContactField[] -}; - -/** -* Removes contact from device storage. -* @param successCB success callback -* @param errorCB error callback -*/ -Contact.prototype.remove = function(successCB, errorCB) { - argscheck.checkArgs('FF', 'Contact.remove', arguments); - var fail = errorCB && function(code) { - errorCB(new ContactError(code)); - }; - if (this.id === null) { - fail(ContactError.UNKNOWN_ERROR); - } - else { - exec(successCB, fail, "Contacts", "remove", [this.id]); - } -}; - -/** -* Creates a deep copy of this Contact. -* With the contact ID set to null. -* @return copy of this Contact -*/ -Contact.prototype.clone = function() { - var clonedContact = utils.clone(this); - clonedContact.id = null; - clonedContact.rawId = null; - - function nullIds(arr) { - if (arr) { - for (var i = 0; i < arr.length; ++i) { - arr[i].id = null; - } - } - } - - // Loop through and clear out any id's in phones, emails, etc. - nullIds(clonedContact.phoneNumbers); - nullIds(clonedContact.emails); - nullIds(clonedContact.addresses); - nullIds(clonedContact.ims); - nullIds(clonedContact.organizations); - nullIds(clonedContact.categories); - nullIds(clonedContact.photos); - nullIds(clonedContact.urls); - return clonedContact; -}; - -/** -* Persists contact to device storage. -* @param successCB success callback -* @param errorCB error callback -*/ -Contact.prototype.save = function(successCB, errorCB) { - argscheck.checkArgs('FFO', 'Contact.save', arguments); - var fail = errorCB && function(code) { - errorCB(new ContactError(code)); - }; - var success = function(result) { - if (result) { - if (successCB) { - var fullContact = require('./contacts').create(result); - successCB(convertIn(fullContact)); - } - } - else { - // no Entry object returned - fail(ContactError.UNKNOWN_ERROR); - } - }; - var dupContact = convertOut(utils.clone(this)); - exec(success, fail, "Contacts", "save", [dupContact]); -}; - - -module.exports = Contact; diff --git a/cordova-lib/spec-plugman/plugins/Contacts/www/ContactAddress.js b/cordova-lib/spec-plugman/plugins/Contacts/www/ContactAddress.js deleted file mode 100644 index 3d39086dc..000000000 --- a/cordova-lib/spec-plugman/plugins/Contacts/www/ContactAddress.js +++ /dev/null @@ -1,46 +0,0 @@ -/* - * - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - * -*/ - -/** -* Contact address. -* @constructor -* @param {DOMString} id unique identifier, should only be set by native code -* @param formatted // NOTE: not a W3C standard -* @param streetAddress -* @param locality -* @param region -* @param postalCode -* @param country -*/ - -var ContactAddress = function(pref, type, formatted, streetAddress, locality, region, postalCode, country) { - this.id = null; - this.pref = (typeof pref != 'undefined' ? pref : false); - this.type = type || null; - this.formatted = formatted || null; - this.streetAddress = streetAddress || null; - this.locality = locality || null; - this.region = region || null; - this.postalCode = postalCode || null; - this.country = country || null; -}; - -module.exports = ContactAddress; diff --git a/cordova-lib/spec-plugman/plugins/Contacts/www/ContactError.js b/cordova-lib/spec-plugman/plugins/Contacts/www/ContactError.js deleted file mode 100644 index 01b229ad5..000000000 --- a/cordova-lib/spec-plugman/plugins/Contacts/www/ContactError.js +++ /dev/null @@ -1,42 +0,0 @@ -/* - * - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - * -*/ - -/** - * ContactError. - * An error code assigned by an implementation when an error has occurred - * @constructor - */ -var ContactError = function(err) { - this.code = (typeof err != 'undefined' ? err : null); -}; - -/** - * Error codes - */ -ContactError.UNKNOWN_ERROR = 0; -ContactError.INVALID_ARGUMENT_ERROR = 1; -ContactError.TIMEOUT_ERROR = 2; -ContactError.PENDING_OPERATION_ERROR = 3; -ContactError.IO_ERROR = 4; -ContactError.NOT_SUPPORTED_ERROR = 5; -ContactError.PERMISSION_DENIED_ERROR = 20; - -module.exports = ContactError; diff --git a/cordova-lib/spec-plugman/plugins/Contacts/www/ContactField.js b/cordova-lib/spec-plugman/plugins/Contacts/www/ContactField.js deleted file mode 100644 index e84107a43..000000000 --- a/cordova-lib/spec-plugman/plugins/Contacts/www/ContactField.js +++ /dev/null @@ -1,37 +0,0 @@ -/* - * - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - * -*/ - -/** -* Generic contact field. -* @constructor -* @param {DOMString} id unique identifier, should only be set by native code // NOTE: not a W3C standard -* @param type -* @param value -* @param pref -*/ -var ContactField = function(type, value, pref) { - this.id = null; - this.type = (type && type.toString()) || null; - this.value = (value && value.toString()) || null; - this.pref = (typeof pref != 'undefined' ? pref : false); -}; - -module.exports = ContactField; diff --git a/cordova-lib/spec-plugman/plugins/Contacts/www/ContactFindOptions.js b/cordova-lib/spec-plugman/plugins/Contacts/www/ContactFindOptions.js deleted file mode 100644 index bd8bf3562..000000000 --- a/cordova-lib/spec-plugman/plugins/Contacts/www/ContactFindOptions.js +++ /dev/null @@ -1,34 +0,0 @@ -/* - * - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - * -*/ - -/** - * ContactFindOptions. - * @constructor - * @param filter used to match contacts against - * @param multiple boolean used to determine if more than one contact should be returned - */ - -var ContactFindOptions = function(filter, multiple) { - this.filter = filter || ''; - this.multiple = (typeof multiple != 'undefined' ? multiple : false); -}; - -module.exports = ContactFindOptions; diff --git a/cordova-lib/spec-plugman/plugins/Contacts/www/ContactName.js b/cordova-lib/spec-plugman/plugins/Contacts/www/ContactName.js deleted file mode 100644 index 15cf60b5f..000000000 --- a/cordova-lib/spec-plugman/plugins/Contacts/www/ContactName.js +++ /dev/null @@ -1,41 +0,0 @@ -/* - * - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - * -*/ - -/** -* Contact name. -* @constructor -* @param formatted // NOTE: not part of W3C standard -* @param familyName -* @param givenName -* @param middle -* @param prefix -* @param suffix -*/ -var ContactName = function(formatted, familyName, givenName, middle, prefix, suffix) { - this.formatted = formatted || null; - this.familyName = familyName || null; - this.givenName = givenName || null; - this.middleName = middle || null; - this.honorificPrefix = prefix || null; - this.honorificSuffix = suffix || null; -}; - -module.exports = ContactName; diff --git a/cordova-lib/spec-plugman/plugins/Contacts/www/ContactOrganization.js b/cordova-lib/spec-plugman/plugins/Contacts/www/ContactOrganization.js deleted file mode 100644 index 5dd242bdd..000000000 --- a/cordova-lib/spec-plugman/plugins/Contacts/www/ContactOrganization.js +++ /dev/null @@ -1,44 +0,0 @@ -/* - * - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - * -*/ - -/** -* Contact organization. -* @constructor -* @param {DOMString} id unique identifier, should only be set by native code // NOTE: not a W3C standard -* @param name -* @param dept -* @param title -* @param startDate -* @param endDate -* @param location -* @param desc -*/ - -var ContactOrganization = function(pref, type, name, dept, title) { - this.id = null; - this.pref = (typeof pref != 'undefined' ? pref : false); - this.type = type || null; - this.name = name || null; - this.department = dept || null; - this.title = title || null; -}; - -module.exports = ContactOrganization; diff --git a/cordova-lib/spec-plugman/plugins/Contacts/www/contacts.js b/cordova-lib/spec-plugman/plugins/Contacts/www/contacts.js deleted file mode 100644 index 5e6b4dbe6..000000000 --- a/cordova-lib/spec-plugman/plugins/Contacts/www/contacts.js +++ /dev/null @@ -1,76 +0,0 @@ -/* - * - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - * -*/ - -var argscheck = require('cordova/argscheck'), - exec = require('cordova/exec'), - ContactError = require('./ContactError'), - utils = require('cordova/utils'), - Contact = require('./Contact'); - -/** -* Represents a group of Contacts. -* @constructor -*/ -var contacts = { - /** - * Returns an array of Contacts matching the search criteria. - * @param fields that should be searched - * @param successCB success callback - * @param errorCB error callback - * @param {ContactFindOptions} options that can be applied to contact searching - * @return array of Contacts matching search criteria - */ - find:function(fields, successCB, errorCB, options) { - argscheck.checkArgs('afFO', 'contacts.find', arguments); - if (!fields.length) { - errorCB && errorCB(new ContactError(ContactError.INVALID_ARGUMENT_ERROR)); - } else { - var win = function(result) { - var cs = []; - for (var i = 0, l = result.length; i < l; i++) { - cs.push(contacts.create(result[i])); - } - successCB(cs); - }; - exec(win, errorCB, "Contacts", "search", [fields, options]); - } - }, - - /** - * This function creates a new contact, but it does not persist the contact - * to device storage. To persist the contact to device storage, invoke - * contact.save(). - * @param properties an object whose properties will be examined to create a new Contact - * @returns new Contact object - */ - create:function(properties) { - argscheck.checkArgs('O', 'contacts.create', arguments); - var contact = new Contact(); - for (var i in properties) { - if (typeof contact[i] !== 'undefined' && properties.hasOwnProperty(i)) { - contact[i] = properties[i]; - } - } - return contact; - } -}; - -module.exports = contacts; diff --git a/cordova-lib/spec-plugman/plugins/Contacts/www/ios/Contact.js b/cordova-lib/spec-plugman/plugins/Contacts/www/ios/Contact.js deleted file mode 100644 index b40c41acc..000000000 --- a/cordova-lib/spec-plugman/plugins/Contacts/www/ios/Contact.js +++ /dev/null @@ -1,51 +0,0 @@ -/* - * - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - * -*/ - -var exec = require('cordova/exec'), - ContactError = require('./ContactError'); - -/** - * Provides iOS Contact.display API. - */ -module.exports = { - display : function(errorCB, options) { - /* - * Display a contact using the iOS Contact Picker UI - * NOT part of W3C spec so no official documentation - * - * @param errorCB error callback - * @param options object - * allowsEditing: boolean AS STRING - * "true" to allow editing the contact - * "false" (default) display contact - */ - - if (this.id === null) { - if (typeof errorCB === "function") { - var errorObj = new ContactError(ContactError.UNKNOWN_ERROR); - errorCB(errorObj); - } - } - else { - exec(null, errorCB, "Contacts","displayContact", [this.id, options]); - } - } -}; diff --git a/cordova-lib/spec-plugman/plugins/Contacts/www/ios/contacts.js b/cordova-lib/spec-plugman/plugins/Contacts/www/ios/contacts.js deleted file mode 100644 index 67cf421fd..000000000 --- a/cordova-lib/spec-plugman/plugins/Contacts/www/ios/contacts.js +++ /dev/null @@ -1,62 +0,0 @@ -/* - * - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - * -*/ - -var exec = require('cordova/exec'); - -/** - * Provides iOS enhanced contacts API. - */ -module.exports = { - newContactUI : function(successCallback) { - /* - * Create a contact using the iOS Contact Picker UI - * NOT part of W3C spec so no official documentation - * - * returns: the id of the created contact as param to successCallback - */ - exec(successCallback, null, "Contacts","newContact", []); - }, - chooseContact : function(successCallback, options) { - /* - * Select a contact using the iOS Contact Picker UI - * NOT part of W3C spec so no official documentation - * - * @param errorCB error callback - * @param options object - * allowsEditing: boolean AS STRING - * "true" to allow editing the contact - * "false" (default) display contact - * fields: array of fields to return in contact object (see ContactOptions.fields) - * - * @returns - * id of contact selected - * ContactObject - * if no fields provided contact contains just id information - * if fields provided contact object contains information for the specified fields - * - */ - var win = function(result) { - var fullContact = require('./contacts').create(result); - successCallback(fullContact.id, fullContact); - }; - exec(win, null, "Contacts","chooseContact", [options]); - } -}; diff --git a/cordova-lib/spec-plugman/plugins/DummyPlugin/android-resource.xml b/cordova-lib/spec-plugman/plugins/DummyPlugin/android-resource.xml deleted file mode 100644 index 421376db9..000000000 --- a/cordova-lib/spec-plugman/plugins/DummyPlugin/android-resource.xml +++ /dev/null @@ -1 +0,0 @@ -dummy diff --git a/cordova-lib/spec-plugman/plugins/DummyPlugin/plugin.xml b/cordova-lib/spec-plugman/plugins/DummyPlugin/plugin.xml deleted file mode 100644 index 0e884433c..000000000 --- a/cordova-lib/spec-plugman/plugins/DummyPlugin/plugin.xml +++ /dev/null @@ -1,187 +0,0 @@ - - - - - - - dummyplugin - - my description - Jackson Badman - dummy,plugin - BSD - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - .dummy1 - - - - - .dummy2 - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/cordova-lib/spec-plugman/plugins/DummyPlugin/src/android/DummyPlugin.java b/cordova-lib/spec-plugman/plugins/DummyPlugin/src/android/DummyPlugin.java deleted file mode 100644 index 5263b0c5d..000000000 --- a/cordova-lib/spec-plugman/plugins/DummyPlugin/src/android/DummyPlugin.java +++ /dev/null @@ -1,19 +0,0 @@ -/* - * - * Copyright 2013 Anis Kadri - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - * -*/ - diff --git a/cordova-lib/spec-plugman/plugins/DummyPlugin/src/android/TestLib.jar b/cordova-lib/spec-plugman/plugins/DummyPlugin/src/android/TestLib.jar deleted file mode 100644 index e69de29bb..000000000 diff --git a/cordova-lib/spec-plugman/plugins/DummyPlugin/src/blackberry10/index.js b/cordova-lib/spec-plugman/plugins/DummyPlugin/src/blackberry10/index.js deleted file mode 100644 index 5263b0c5d..000000000 --- a/cordova-lib/spec-plugman/plugins/DummyPlugin/src/blackberry10/index.js +++ /dev/null @@ -1,19 +0,0 @@ -/* - * - * Copyright 2013 Anis Kadri - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - * -*/ - diff --git a/cordova-lib/spec-plugman/plugins/DummyPlugin/src/ios/Custom.framework/someFheader.h b/cordova-lib/spec-plugman/plugins/DummyPlugin/src/ios/Custom.framework/someFheader.h deleted file mode 100644 index e69de29bb..000000000 diff --git a/cordova-lib/spec-plugman/plugins/DummyPlugin/src/ios/Custom.framework/somebinlib b/cordova-lib/spec-plugman/plugins/DummyPlugin/src/ios/Custom.framework/somebinlib deleted file mode 100644 index e69de29bb..000000000 diff --git a/cordova-lib/spec-plugman/plugins/DummyPlugin/src/ios/DummyPlugin.bundle b/cordova-lib/spec-plugman/plugins/DummyPlugin/src/ios/DummyPlugin.bundle deleted file mode 100644 index e69de29bb..000000000 diff --git a/cordova-lib/spec-plugman/plugins/DummyPlugin/src/ios/DummyPluginCommand.h b/cordova-lib/spec-plugman/plugins/DummyPlugin/src/ios/DummyPluginCommand.h deleted file mode 100644 index e69de29bb..000000000 diff --git a/cordova-lib/spec-plugman/plugins/DummyPlugin/src/ios/DummyPluginCommand.m b/cordova-lib/spec-plugman/plugins/DummyPlugin/src/ios/DummyPluginCommand.m deleted file mode 100644 index e69de29bb..000000000 diff --git a/cordova-lib/spec-plugman/plugins/DummyPlugin/src/ios/SourceWithFramework.m b/cordova-lib/spec-plugman/plugins/DummyPlugin/src/ios/SourceWithFramework.m deleted file mode 100644 index e69de29bb..000000000 diff --git a/cordova-lib/spec-plugman/plugins/DummyPlugin/src/ios/TargetDirTest.h b/cordova-lib/spec-plugman/plugins/DummyPlugin/src/ios/TargetDirTest.h deleted file mode 100644 index e69de29bb..000000000 diff --git a/cordova-lib/spec-plugman/plugins/DummyPlugin/src/ios/TargetDirTest.m b/cordova-lib/spec-plugman/plugins/DummyPlugin/src/ios/TargetDirTest.m deleted file mode 100644 index e69de29bb..000000000 diff --git a/cordova-lib/spec-plugman/plugins/DummyPlugin/src/ios/libsqlite3.dylib b/cordova-lib/spec-plugman/plugins/DummyPlugin/src/ios/libsqlite3.dylib deleted file mode 100644 index e69de29bb..000000000 diff --git a/cordova-lib/spec-plugman/plugins/DummyPlugin/src/tizen/dummer.js b/cordova-lib/spec-plugman/plugins/DummyPlugin/src/tizen/dummer.js deleted file mode 100644 index e69de29bb..000000000 diff --git a/cordova-lib/spec-plugman/plugins/DummyPlugin/src/windows8/dummer.js b/cordova-lib/spec-plugman/plugins/DummyPlugin/src/windows8/dummer.js deleted file mode 100644 index e69de29bb..000000000 diff --git a/cordova-lib/spec-plugman/plugins/DummyPlugin/src/wp7/DummyPlugin.cs b/cordova-lib/spec-plugman/plugins/DummyPlugin/src/wp7/DummyPlugin.cs deleted file mode 100644 index 273dc3b3f..000000000 --- a/cordova-lib/spec-plugman/plugins/DummyPlugin/src/wp7/DummyPlugin.cs +++ /dev/null @@ -1,19 +0,0 @@ -/* - * - * Copyright 2013 Benn Mapes - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - * -*/ - diff --git a/cordova-lib/spec-plugman/plugins/DummyPlugin/src/wp8/DummyPlugin.cs b/cordova-lib/spec-plugman/plugins/DummyPlugin/src/wp8/DummyPlugin.cs deleted file mode 100644 index 273dc3b3f..000000000 --- a/cordova-lib/spec-plugman/plugins/DummyPlugin/src/wp8/DummyPlugin.cs +++ /dev/null @@ -1,19 +0,0 @@ -/* - * - * Copyright 2013 Benn Mapes - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - * -*/ - diff --git a/cordova-lib/spec-plugman/plugins/DummyPlugin/www/dummyplugin.js b/cordova-lib/spec-plugman/plugins/DummyPlugin/www/dummyplugin.js deleted file mode 100644 index 5263b0c5d..000000000 --- a/cordova-lib/spec-plugman/plugins/DummyPlugin/www/dummyplugin.js +++ /dev/null @@ -1,19 +0,0 @@ -/* - * - * Copyright 2013 Anis Kadri - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - * -*/ - diff --git a/cordova-lib/spec-plugman/plugins/DummyPlugin/www/dummyplugin/image.jpg b/cordova-lib/spec-plugman/plugins/DummyPlugin/www/dummyplugin/image.jpg deleted file mode 100644 index 257cc5642..000000000 --- a/cordova-lib/spec-plugman/plugins/DummyPlugin/www/dummyplugin/image.jpg +++ /dev/null @@ -1 +0,0 @@ -foo diff --git a/cordova-lib/spec-plugman/plugins/EnginePlugin/megaBoringVersion b/cordova-lib/spec-plugman/plugins/EnginePlugin/megaBoringVersion deleted file mode 100755 index cbf791148..000000000 --- a/cordova-lib/spec-plugman/plugins/EnginePlugin/megaBoringVersion +++ /dev/null @@ -1,23 +0,0 @@ -#! /bin/sh - -# -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. -# - -echo 4.0.0 -exit 0 \ No newline at end of file diff --git a/cordova-lib/spec-plugman/plugins/EnginePlugin/megaFunVersion b/cordova-lib/spec-plugman/plugins/EnginePlugin/megaFunVersion deleted file mode 100755 index 1e4c706fa..000000000 --- a/cordova-lib/spec-plugman/plugins/EnginePlugin/megaFunVersion +++ /dev/null @@ -1,23 +0,0 @@ -#! /bin/sh - -# -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. -# - -echo 1.0.0 -exit 0 \ No newline at end of file diff --git a/cordova-lib/spec-plugman/plugins/EnginePlugin/plugin.xml b/cordova-lib/spec-plugman/plugins/EnginePlugin/plugin.xml deleted file mode 100644 index a58f19efe..000000000 --- a/cordova-lib/spec-plugman/plugins/EnginePlugin/plugin.xml +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - Engine Choo Choo - - - - - - - - - diff --git a/cordova-lib/spec-plugman/plugins/EnginePluginAndroid/plugin.xml b/cordova-lib/spec-plugman/plugins/EnginePluginAndroid/plugin.xml deleted file mode 100644 index fe2bce242..000000000 --- a/cordova-lib/spec-plugman/plugins/EnginePluginAndroid/plugin.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - Engine Choo Choo - - - - - - - - diff --git a/cordova-lib/spec-plugman/plugins/EnginePluginiOS/plugin.xml b/cordova-lib/spec-plugman/plugins/EnginePluginiOS/plugin.xml deleted file mode 100644 index d7a9a8e7b..000000000 --- a/cordova-lib/spec-plugman/plugins/EnginePluginiOS/plugin.xml +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - Engine Choo Choo - - - - - - - - - - diff --git a/cordova-lib/spec-plugman/plugins/FaultyPlugin/plugin.xml b/cordova-lib/spec-plugman/plugins/FaultyPlugin/plugin.xml deleted file mode 100644 index 706db4521..000000000 --- a/cordova-lib/spec-plugman/plugins/FaultyPlugin/plugin.xml +++ /dev/null @@ -1,147 +0,0 @@ - - - - - - Faulty Plugin - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/cordova-lib/spec-plugman/plugins/FaultyPlugin/src/android/FaultyPlugin.java b/cordova-lib/spec-plugman/plugins/FaultyPlugin/src/android/FaultyPlugin.java deleted file mode 100644 index 5263b0c5d..000000000 --- a/cordova-lib/spec-plugman/plugins/FaultyPlugin/src/android/FaultyPlugin.java +++ /dev/null @@ -1,19 +0,0 @@ -/* - * - * Copyright 2013 Anis Kadri - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - * -*/ - diff --git a/cordova-lib/spec-plugman/plugins/FaultyPlugin/src/blackberry10/client.js b/cordova-lib/spec-plugman/plugins/FaultyPlugin/src/blackberry10/client.js deleted file mode 100644 index e69de29bb..000000000 diff --git a/cordova-lib/spec-plugman/plugins/FaultyPlugin/src/ios/FaultyPlugin.h b/cordova-lib/spec-plugman/plugins/FaultyPlugin/src/ios/FaultyPlugin.h deleted file mode 100644 index 6a23ab6f0..000000000 --- a/cordova-lib/spec-plugman/plugins/FaultyPlugin/src/ios/FaultyPlugin.h +++ /dev/null @@ -1,49 +0,0 @@ -/* - * - * Copyright 2013 Anis Kadri - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - * -*/ - -// -// PhoneGap ! ChildBrowserCommand -// -// -// Created by Jesse MacFadyen on 10-05-29. -// Copyright 2010 Nitobi. All rights reserved. -// - -#import -#ifdef PHONEGAP_FRAMEWORK - #import -#else - #import "PGPlugin.h" -#endif -#import "ChildBrowserViewController.h" - - - -@interface ChildBrowserCommand : PGPlugin { - - ChildBrowserViewController* childBrowser; -} - -@property (nonatomic, retain) ChildBrowserViewController *childBrowser; - - -- (void) showWebPage:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options; --(void) onChildLocationChange:(NSString*)newLoc; - -@end diff --git a/cordova-lib/spec-plugman/plugins/FaultyPlugin/src/ios/FaultyPlugin.m b/cordova-lib/spec-plugman/plugins/FaultyPlugin/src/ios/FaultyPlugin.m deleted file mode 100644 index 38aaf6497..000000000 --- a/cordova-lib/spec-plugman/plugins/FaultyPlugin/src/ios/FaultyPlugin.m +++ /dev/null @@ -1,86 +0,0 @@ -// - -// -// -// Created by Jesse MacFadyen on 10-05-29. -// Copyright 2010 Nitobi. All rights reserved. -// Copyright (c) 2011, IBM Corporation -// Copyright 2011, Randy McMillan -// - -#import "ChildBrowserCommand.h" - -#ifdef PHONEGAP_FRAMEWORK - #import -#else - #import "PhoneGapViewController.h" -#endif - - -@implementation ChildBrowserCommand - -@synthesize childBrowser; - -- (void) showWebPage:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options // args: url -{ - - if(childBrowser == NULL) - { - childBrowser = [[ ChildBrowserViewController alloc ] initWithScale:FALSE ]; - childBrowser.delegate = self; - } - -/* // TODO: Work in progress - NSString* strOrientations = [ options objectForKey:@"supportedOrientations"]; - NSArray* supportedOrientations = [strOrientations componentsSeparatedByString:@","]; -*/ - PhoneGapViewController* cont = (PhoneGapViewController*)[ super appViewController ]; - childBrowser.supportedOrientations = cont.supportedOrientations; - - if ([cont respondsToSelector:@selector(presentViewController)]) { - //Reference UIViewController.h Line:179 for update to iOS 5 difference - @RandyMcMillan - [cont presentViewController:childBrowser animated:YES completion:nil]; - } else { - [ cont presentModalViewController:childBrowser animated:YES ]; - } - - NSString *url = (NSString*) [arguments objectAtIndex:0]; - - [childBrowser loadURL:url ]; - -} - --(void) close:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options // args: url -{ - [ childBrowser closeBrowser]; - -} - --(void) onClose -{ - NSString* jsCallback = [NSString stringWithFormat:@"ChildBrowser._onClose();",@""]; - [self.webView stringByEvaluatingJavaScriptFromString:jsCallback]; -} - --(void) onOpenInSafari -{ - NSString* jsCallback = [NSString stringWithFormat:@"ChildBrowser._onOpenExternal();",@""]; - [self.webView stringByEvaluatingJavaScriptFromString:jsCallback]; -} - - --(void) onChildLocationChange:(NSString*)newLoc -{ - - NSString* tempLoc = [NSString stringWithFormat:@"%@",newLoc]; - NSString* encUrl = [tempLoc stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; - - NSString* jsCallback = [NSString stringWithFormat:@"ChildBrowser._onLocationChange('%@');",encUrl]; - [self.webView stringByEvaluatingJavaScriptFromString:jsCallback]; - -} - - - - -@end diff --git a/cordova-lib/spec-plugman/plugins/FaultyPlugin/src/windows8/faultyPlugin.js b/cordova-lib/spec-plugman/plugins/FaultyPlugin/src/windows8/faultyPlugin.js deleted file mode 100644 index e69de29bb..000000000 diff --git a/cordova-lib/spec-plugman/plugins/FaultyPlugin/src/wp7/FaultyPlugin.cs b/cordova-lib/spec-plugman/plugins/FaultyPlugin/src/wp7/FaultyPlugin.cs deleted file mode 100644 index 5263b0c5d..000000000 --- a/cordova-lib/spec-plugman/plugins/FaultyPlugin/src/wp7/FaultyPlugin.cs +++ /dev/null @@ -1,19 +0,0 @@ -/* - * - * Copyright 2013 Anis Kadri - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - * -*/ - diff --git a/cordova-lib/spec-plugman/plugins/FaultyPlugin/src/wp8/FaultyPlugin.cs b/cordova-lib/spec-plugman/plugins/FaultyPlugin/src/wp8/FaultyPlugin.cs deleted file mode 100644 index 5263b0c5d..000000000 --- a/cordova-lib/spec-plugman/plugins/FaultyPlugin/src/wp8/FaultyPlugin.cs +++ /dev/null @@ -1,19 +0,0 @@ -/* - * - * Copyright 2013 Anis Kadri - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - * -*/ - diff --git a/cordova-lib/spec-plugman/plugins/VariablePlugin/plugin.xml b/cordova-lib/spec-plugman/plugins/VariablePlugin/plugin.xml deleted file mode 100644 index 9eff72975..000000000 --- a/cordova-lib/spec-plugman/plugins/VariablePlugin/plugin.xml +++ /dev/null @@ -1,59 +0,0 @@ - - - - - - Use Variables - - - - Remember that your api key is $API_KEY! - - - - - $PACKAGE_NAME - - - - - - - - - $PACKAGE_NAME - - - - - - - - - $PACKAGE_NAME - - - - - - diff --git a/cordova-lib/spec-plugman/plugins/WebNotifications/plugin.xml b/cordova-lib/spec-plugman/plugins/WebNotifications/plugin.xml deleted file mode 100644 index b9026f18e..000000000 --- a/cordova-lib/spec-plugman/plugins/WebNotifications/plugin.xml +++ /dev/null @@ -1,47 +0,0 @@ - - - - - - Web Notifications - - - - - - - - - - - - - - - - - - - - diff --git a/cordova-lib/spec-plugman/plugins/WebNotifications/src/ios/AppDelegate.m.diff b/cordova-lib/spec-plugman/plugins/WebNotifications/src/ios/AppDelegate.m.diff deleted file mode 100644 index 754d079fc..000000000 --- a/cordova-lib/spec-plugman/plugins/WebNotifications/src/ios/AppDelegate.m.diff +++ /dev/null @@ -1,18 +0,0 @@ -- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification -{ - // Note: if app wasn't running, you can still get a LN and then it doesn't call this function, - // I think it calls app start but notifies you that LN caused the app start or something like that. - - //UIApplicationState state = [application applicationState]; - //BOOL wasForeground = (state == UIApplicationStateActive); - - //NSString *title = [notification.userInfo objectForKey:@"title"]; - //NSString *body = [notification.userInfo objectForKey:@"body"]; - NSString *tag = [notification.userInfo objectForKey:@"tag"]; - - [(WebNotifications*)[self.viewController getCommandInstance:@"WebNotifications"] clickNotification:tag]; - - application.applicationIconBadgeNumber = 0; - application.scheduledLocalNotifications = [NSArray arrayWithArray:application.scheduledLocalNotifications]; // "hack" to clear seen notifications -} - diff --git a/cordova-lib/spec-plugman/plugins/WebNotifications/src/ios/WebNotifications.h b/cordova-lib/spec-plugman/plugins/WebNotifications/src/ios/WebNotifications.h deleted file mode 100644 index 1702f4071..000000000 --- a/cordova-lib/spec-plugman/plugins/WebNotifications/src/ios/WebNotifications.h +++ /dev/null @@ -1,35 +0,0 @@ -/* - Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.0 (the - "License"); you may not use this file except in compliance - with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, - software distributed under the License is distributed on an - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - KIND, either express or implied. See the License for the - specific language governing permissions and limitations - under the License. - */ - -#import -#import - -@interface WebNotifications : CDVPlugin { -} - -@property (nonatomic, strong) NSMutableArray* activeNotifications; - -- (CDVPlugin*)initWithWebView:(UIWebView*)theWebView; - -- (void)createNotification:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options; -- (void)closeNotification:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options; - -- (void)clickNotification:(NSString*)tag; - -@end diff --git a/cordova-lib/spec-plugman/plugins/WebNotifications/src/ios/WebNotifications.m b/cordova-lib/spec-plugman/plugins/WebNotifications/src/ios/WebNotifications.m deleted file mode 100644 index 6f0c11ff6..000000000 --- a/cordova-lib/spec-plugman/plugins/WebNotifications/src/ios/WebNotifications.m +++ /dev/null @@ -1,124 +0,0 @@ -/* - Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.0 (the - "License"); you may not use this file except in compliance - with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, - software distributed under the License is distributed on an - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - KIND, either express or implied. See the License for the - specific language governing permissions and limitations - under the License. - */ - -#define Log(fmt, ...) NSLog((@"%d: %s " fmt), __LINE__, __PRETTY_FUNCTION__, ##__VA_ARGS__); - -#import "WebNotifications.h" -#import "MainViewController.h" - -@implementation WebNotifications - -@synthesize activeNotifications; - -- (CDVPlugin*)initWithWebView:(UIWebView*)theWebView -{ - self = [super init]; - if (self) { - self.activeNotifications = [NSMutableArray array]; - } - return self; -} - -- (void)createNotification:(CDVInvokedUrlCommand*)command -{ - NSDictionary* options = [command.arguments objectAtIndex:0]; - - // w3c options: - NSString *title = [options objectForKey:@"title"]; - NSString *body = [options objectForKey:@"body"]; - NSString *tag = [options objectForKey:@"tag"]; - //NSString *iconUrl = [options objectForKey:@"iconUrl"]; // Not supported - - // cordova option extensions: - NSUInteger delay = [[options objectForKey:@"delay"] unsignedIntegerValue]; - NSString *soundUrl = [options objectForKey:@"soundUrl"]; - NSInteger badgeNumber = [[options objectForKey:@"badgeNumber"] intValue]; - - Log(@"addNotification title: %@ body: %@ tag: %@ delay: %u badge: %u", title, body, tag, delay, badgeNumber); - - //NSString *action = [options objectForKey:@"action"]; - //bool hasAction = ([[options objectForKey:@"hasAction"] intValue] == 1) ? YES : NO; - //alertAction - - UILocalNotification *notif = [[UILocalNotification alloc] init]; - notif.alertBody = [NSString stringWithFormat:@"[%@] %@: %@", tag, title, body]; - notif.timeZone = [NSTimeZone defaultTimeZone]; - - notif.soundName = soundUrl; - notif.applicationIconBadgeNumber = badgeNumber; - - NSDictionary *userDict = [NSDictionary dictionaryWithObjectsAndKeys:title,@"title",body,@"body",tag,@"tag",nil]; - notif.userInfo = userDict; - - if (delay != 0) { - notif.fireDate = [[NSDate date] addTimeInterval:delay]; - //notif.repeatInterval = [[repeatDict objectForKey: repeat] intValue]; - - [[UIApplication sharedApplication] scheduleLocalNotification:notif]; - } else { - [[UIApplication sharedApplication] presentLocalNotificationNow:notif]; - } - - [self.activeNotifications addObject:notif]; -} - -- (void)closeNotification:(CDVInvokedUrlCommand*)command -{ -// command.callbackId; - NSDictionary* options = [command.arguments objectAtIndex:0]; - NSString *tag = [options objectForKey:@"tag"]; - - NSArray *notifications = [[UIApplication sharedApplication] scheduledLocalNotifications]; - for (UILocalNotification *notification in notifications) { - if ([[notification.userInfo objectForKey:@"tag"] isEqualToString:tag]) { - Log(@"Cancelling notification with tag: %@", tag); - [[UIApplication sharedApplication] cancelLocalNotification:notification]; - [self.activeNotifications removeObject:notification]; - [self.commandDelegate sendPluginResult:[CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsInt:0] callbackId:command.callbackId]; - } - } - [self.commandDelegate sendPluginResult:[CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsInt:0] callbackId:command.callbackId]; -} - -- (void)clickNotification:(NSString*)tag { - NSString *jsCallBack; - - jsCallBack = [NSString stringWithFormat:@"window.Notification.callOnclickByTag('%@')", tag]; - [((CDVViewController*)self.viewController).webView stringByEvaluatingJavaScriptFromString:jsCallBack]; - - NSArray *scheduledNotifications = [[UIApplication sharedApplication] scheduledLocalNotifications]; - NSMutableArray *toDiscard = [NSMutableArray array]; - for (UILocalNotification *notification in self.activeNotifications) { - if (![scheduledNotifications containsObject:notification]) { - // This notification is active, but no longer scheduled, so it must be displayed - jsCallBack = [NSString stringWithFormat:@"window.Notification.callOncloseByTag('%@')", [notification.userInfo objectForKey:@"tag"]]; - [((CDVViewController*)self.viewController).webView stringByEvaluatingJavaScriptFromString:jsCallBack]; - [toDiscard addObject:notification]; - } - } - [self.activeNotifications removeObjectsInArray:toDiscard]; -} - -/* -- (void)cancelAllNotifications:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options { - [[UIApplication sharedApplication] cancelAllLocalNotifications]; -} -*/ - -@end diff --git a/cordova-lib/spec-plugman/plugins/WebNotifications/www/webnotifications.js b/cordova-lib/spec-plugman/plugins/WebNotifications/www/webnotifications.js deleted file mode 100644 index 6597337a2..000000000 --- a/cordova-lib/spec-plugman/plugins/WebNotifications/www/webnotifications.js +++ /dev/null @@ -1,123 +0,0 @@ -/* - Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.0 (the - "License"); you may not use this file except in compliance - with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, - software distributed under the License is distributed on an - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - KIND, either express or implied. See the License for the - specific language governing permissions and limitations - under the License. - */ - -/* - * The W3C window.Notification API: http://www.w3.org/TR/notifications/ - */ -if (typeof window.Notification == 'undefined') { - - /** - * Creates and shows a new notification. - * @param title - * @param options - */ - window.Notification = function(title, options) { - options = options || {}; - - this.title = title || 'defaultTitle'; - - // w3c options: - this.body = options.body || ''; - this.tag = options.tag || 'defaultTag'; - this.iconUrl = options.iconUrl || ''; - // titleDir, bodyDir are not supported - - // cordova option extensions: - this.delay = options.delay || 0; - this.soundUrl = options.soundUrl || ''; - this.badgeNumber = options.badgeNumber || 0; - - // there must be one unique notification per tag, so close any existing outstanding notifications - if (window.Notification.active[this.tag]) - window.Notification.active[this.tag].close(); - window.Notification.active[this.tag] = this; - - // Spec claims these must be defined - this.onclick = options.onclick; - this.onerror = options.onerror; - this.onclose = options.onclose; - this.onshow = options.onshow; - if (this.onshow) { - console.log("Warning, WebNotifications plugin will never call onshow"); // this may change on other platforms - } - - var self = this; - cordova.exec(null, function(error) { - if (self.onerror) { - self.onerror(error); - } - }, 'WebNotifications', 'createNotification', [{ - tag: this.tag, - title: this.title, - body: this.body, - delay: this.delay, - }]); - }; - - // TODO: change name to something internal looking? - window.Notification.permission = 'granted'; - - window.Notification.requestPermission = function(callback) { - setTimeout(function() { - callback(window.Notification.permission); - }, 0); - }; - - // Not part of the W3C API. Used by the native side to call onclick handlers. - // TODO: change name to something internal looking? - window.Notification.callOnclickByTag = function(tag) { - var notification = window.Notification.active[tag]; - if (notification && notification.onclick && typeof notification.onclick == 'function') { - notification.onclick(tag); - } - delete window.Notification.active[tag]; - }; - - window.Notification.callOncloseByTag = function(tag) { - var notification = window.Notification.active[tag]; - if (notification && notification.onclose && typeof notification.onclose == 'function') { - notification.onclose(tag); - } - delete window.Notification.active[tag]; - }; - - // A global map of notifications by tag, so their onclick callbacks can be called. - // TODO: change name to something internal looking? - window.Notification.active = {}; - - /** - * Dismiss a notification. - */ - window.Notification.prototype.close = function() { - var self = this; - cordova.exec(function() { - if (self.onclose) { - self.onclose(); - } - delete window.Notification[self.tag]; - }, function(error) { - if (self.onerror) { - self.onerror(error); - } - delete window.Notification[self.tag]; - }, 'WebNotifications', 'closeNotification', [{ - tag: this.tag, - }]); - }; -} diff --git a/cordova-lib/spec-plugman/plugins/WeblessPlugin/plugin.xml b/cordova-lib/spec-plugman/plugins/WeblessPlugin/plugin.xml deleted file mode 100644 index f91909618..000000000 --- a/cordova-lib/spec-plugman/plugins/WeblessPlugin/plugin.xml +++ /dev/null @@ -1,80 +0,0 @@ - - - - - - Webless Plugin - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/cordova-lib/spec-plugman/plugins/WeblessPlugin/src/android/WeblessPlugin.java b/cordova-lib/spec-plugman/plugins/WeblessPlugin/src/android/WeblessPlugin.java deleted file mode 100644 index 5263b0c5d..000000000 --- a/cordova-lib/spec-plugman/plugins/WeblessPlugin/src/android/WeblessPlugin.java +++ /dev/null @@ -1,19 +0,0 @@ -/* - * - * Copyright 2013 Anis Kadri - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - * -*/ - diff --git a/cordova-lib/spec-plugman/plugins/WeblessPlugin/src/ios/WeblessPlugin.bundle/arrow_left.png b/cordova-lib/spec-plugman/plugins/WeblessPlugin/src/ios/WeblessPlugin.bundle/arrow_left.png deleted file mode 100644 index 530e12babde279931dc58cb36e2af4d9b7d52acc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2946 zcmV-|3w`v7P)KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z00023NklJtSbB+AdXk9fc_N}0iY0oLh#n)l{dG~XWw)(q<|6v| zU!5@@Gjq=L5OUHFnfVDp8A8~$RuP*5E1X?vTo=3f3`dV75sXl2<|{#gB~IFj7EE!_ z&BuZfHs0rLL4ifbaYPFy*o&i4@Z4yFThbBvVv=2Ql~eGlYqK<3eeNU|+*4wkQ*h5b s*RZQ+h;^=UUC$W1wtDaX>34A%0J_xqo=TAm_W%F@07*qoM6N<$f*=%oe*gdg diff --git a/cordova-lib/spec-plugman/plugins/WeblessPlugin/src/ios/WeblessPlugin.bundle/arrow_left@2x.png b/cordova-lib/spec-plugman/plugins/WeblessPlugin/src/ios/WeblessPlugin.bundle/arrow_left@2x.png deleted file mode 100644 index 530e12babde279931dc58cb36e2af4d9b7d52acc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2946 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 diff --git a/cordova-lib/spec-plugman/plugins/WeblessPlugin/src/ios/WeblessPlugin.bundle/arrow_right.png b/cordova-lib/spec-plugman/plugins/WeblessPlugin/src/ios/WeblessPlugin.bundle/arrow_right.png deleted file mode 100644 index 8b3d855e884f8aa8b5d2c78139fa63ff4b5826d9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2946 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 diff --git a/cordova-lib/spec-plugman/plugins/WeblessPlugin/src/ios/WeblessPlugin.bundle/arrow_right@2x.png b/cordova-lib/spec-plugman/plugins/WeblessPlugin/src/ios/WeblessPlugin.bundle/arrow_right@2x.png deleted file mode 100644 index 8b3d855e884f8aa8b5d2c78139fa63ff4b5826d9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2946 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 diff --git a/cordova-lib/spec-plugman/plugins/WeblessPlugin/src/ios/WeblessPlugin.bundle/but_refresh.png b/cordova-lib/spec-plugman/plugins/WeblessPlugin/src/ios/WeblessPlugin.bundle/but_refresh.png deleted file mode 100644 index 309b6bdb255b8784cf884e6fa2bde3febe36da5f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3369 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 diff --git a/cordova-lib/spec-plugman/plugins/WeblessPlugin/src/ios/WeblessPlugin.bundle/compass@2x.png b/cordova-lib/spec-plugman/plugins/WeblessPlugin/src/ios/WeblessPlugin.bundle/compass@2x.png deleted file mode 100644 index 46a890174edb858abbef991828153aea289a3a49..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3035 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 diff --git a/cordova-lib/spec-plugman/plugins/WeblessPlugin/src/ios/WeblessPluginCommand.h b/cordova-lib/spec-plugman/plugins/WeblessPlugin/src/ios/WeblessPluginCommand.h deleted file mode 100644 index 6a23ab6f0..000000000 --- a/cordova-lib/spec-plugman/plugins/WeblessPlugin/src/ios/WeblessPluginCommand.h +++ /dev/null @@ -1,49 +0,0 @@ -/* - * - * Copyright 2013 Anis Kadri - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - * -*/ - -// -// PhoneGap ! ChildBrowserCommand -// -// -// Created by Jesse MacFadyen on 10-05-29. -// Copyright 2010 Nitobi. All rights reserved. -// - -#import -#ifdef PHONEGAP_FRAMEWORK - #import -#else - #import "PGPlugin.h" -#endif -#import "ChildBrowserViewController.h" - - - -@interface ChildBrowserCommand : PGPlugin { - - ChildBrowserViewController* childBrowser; -} - -@property (nonatomic, retain) ChildBrowserViewController *childBrowser; - - -- (void) showWebPage:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options; --(void) onChildLocationChange:(NSString*)newLoc; - -@end diff --git a/cordova-lib/spec-plugman/plugins/WeblessPlugin/src/ios/WeblessPluginCommand.m b/cordova-lib/spec-plugman/plugins/WeblessPlugin/src/ios/WeblessPluginCommand.m deleted file mode 100644 index 38aaf6497..000000000 --- a/cordova-lib/spec-plugman/plugins/WeblessPlugin/src/ios/WeblessPluginCommand.m +++ /dev/null @@ -1,86 +0,0 @@ -// - -// -// -// Created by Jesse MacFadyen on 10-05-29. -// Copyright 2010 Nitobi. All rights reserved. -// Copyright (c) 2011, IBM Corporation -// Copyright 2011, Randy McMillan -// - -#import "ChildBrowserCommand.h" - -#ifdef PHONEGAP_FRAMEWORK - #import -#else - #import "PhoneGapViewController.h" -#endif - - -@implementation ChildBrowserCommand - -@synthesize childBrowser; - -- (void) showWebPage:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options // args: url -{ - - if(childBrowser == NULL) - { - childBrowser = [[ ChildBrowserViewController alloc ] initWithScale:FALSE ]; - childBrowser.delegate = self; - } - -/* // TODO: Work in progress - NSString* strOrientations = [ options objectForKey:@"supportedOrientations"]; - NSArray* supportedOrientations = [strOrientations componentsSeparatedByString:@","]; -*/ - PhoneGapViewController* cont = (PhoneGapViewController*)[ super appViewController ]; - childBrowser.supportedOrientations = cont.supportedOrientations; - - if ([cont respondsToSelector:@selector(presentViewController)]) { - //Reference UIViewController.h Line:179 for update to iOS 5 difference - @RandyMcMillan - [cont presentViewController:childBrowser animated:YES completion:nil]; - } else { - [ cont presentModalViewController:childBrowser animated:YES ]; - } - - NSString *url = (NSString*) [arguments objectAtIndex:0]; - - [childBrowser loadURL:url ]; - -} - --(void) close:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options // args: url -{ - [ childBrowser closeBrowser]; - -} - --(void) onClose -{ - NSString* jsCallback = [NSString stringWithFormat:@"ChildBrowser._onClose();",@""]; - [self.webView stringByEvaluatingJavaScriptFromString:jsCallback]; -} - --(void) onOpenInSafari -{ - NSString* jsCallback = [NSString stringWithFormat:@"ChildBrowser._onOpenExternal();",@""]; - [self.webView stringByEvaluatingJavaScriptFromString:jsCallback]; -} - - --(void) onChildLocationChange:(NSString*)newLoc -{ - - NSString* tempLoc = [NSString stringWithFormat:@"%@",newLoc]; - NSString* encUrl = [tempLoc stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; - - NSString* jsCallback = [NSString stringWithFormat:@"ChildBrowser._onLocationChange('%@');",encUrl]; - [self.webView stringByEvaluatingJavaScriptFromString:jsCallback]; - -} - - - - -@end diff --git a/cordova-lib/spec-plugman/plugins/WeblessPlugin/src/ios/WeblessPluginViewController.h b/cordova-lib/spec-plugman/plugins/WeblessPlugin/src/ios/WeblessPluginViewController.h deleted file mode 100644 index d6fc139d5..000000000 --- a/cordova-lib/spec-plugman/plugins/WeblessPlugin/src/ios/WeblessPluginViewController.h +++ /dev/null @@ -1,73 +0,0 @@ -/* - * - * Copyright 2013 Anis Kadri - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - * -*/ - -// -// ChildBrowserViewController.h -// -// Created by Jesse MacFadyen on 21/07/09. -// Copyright 2009 Nitobi. All rights reserved. -// - -#import - -@protocol ChildBrowserDelegate - - - -/* - * onChildLocationChanging:newLoc - * - * Discussion: - * Invoked when a new page has loaded - */ --(void) onChildLocationChange:(NSString*)newLoc; --(void) onOpenInSafari; --(void) onClose; -@end - - -@interface ChildBrowserViewController : UIViewController < UIWebViewDelegate > { - IBOutlet UIWebView* webView; - IBOutlet UIBarButtonItem* closeBtn; - IBOutlet UIBarButtonItem* refreshBtn; - IBOutlet UILabel* addressLabel; - IBOutlet UIBarButtonItem* backBtn; - IBOutlet UIBarButtonItem* fwdBtn; - IBOutlet UIBarButtonItem* safariBtn; - IBOutlet UIActivityIndicatorView* spinner; - BOOL scaleEnabled; - BOOL isImage; - NSString* imageURL; - NSArray* supportedOrientations; - id delegate; -} - -@property (nonatomic, retain)id delegate; -@property (nonatomic, retain) NSArray* supportedOrientations; -@property(retain) NSString* imageURL; -@property(assign) BOOL isImage; - -- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation) interfaceOrientation; -- (ChildBrowserViewController*)initWithScale:(BOOL)enabled; -- (IBAction)onDoneButtonPress:(id)sender; -- (IBAction)onSafariButtonPress:(id)sender; -- (void)loadURL:(NSString*)url; --(void)closeBrowser; - -@end diff --git a/cordova-lib/spec-plugman/plugins/WeblessPlugin/src/ios/WeblessPluginViewController.m b/cordova-lib/spec-plugman/plugins/WeblessPlugin/src/ios/WeblessPluginViewController.m deleted file mode 100644 index 167ef9801..000000000 --- a/cordova-lib/spec-plugman/plugins/WeblessPlugin/src/ios/WeblessPluginViewController.m +++ /dev/null @@ -1,239 +0,0 @@ -// -// ChildBrowserViewController.m -// -// Created by Jesse MacFadyen on 21/07/09. -// Copyright 2009 Nitobi. All rights reserved. -// Copyright (c) 2011, IBM Corporation -// Copyright 2011, Randy McMillan -// - -#import "ChildBrowserViewController.h" - - -@implementation ChildBrowserViewController - -@synthesize imageURL; -@synthesize supportedOrientations; -@synthesize isImage; -@synthesize delegate; - -/* - // The designated initializer. Override if you create the controller programmatically and want to perform customization that is not appropriate for viewDidLoad. -- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { - if (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) { - // Custom initialization - } - return self; -} -*/ - -+ (NSString*) resolveImageResource:(NSString*)resource -{ - NSString* systemVersion = [[UIDevice currentDevice] systemVersion]; - BOOL isLessThaniOS4 = ([systemVersion compare:@"4.0" options:NSNumericSearch] == NSOrderedAscending); - - // the iPad image (nor retina) differentiation code was not in 3.x, and we have to explicitly set the path - if (isLessThaniOS4) - { - return [NSString stringWithFormat:@"%@.png", resource]; - } - - return resource; -} - - -- (ChildBrowserViewController*)initWithScale:(BOOL)enabled -{ - self = [super init]; - - - scaleEnabled = enabled; - - return self; -} - -// Implement viewDidLoad to do additional setup after loading the view, typically from a nib. -- (void)viewDidLoad { - [super viewDidLoad]; - - refreshBtn.image = [UIImage imageNamed:[[self class] resolveImageResource:@"ChildBrowser.bundle/but_refresh"]]; - backBtn.image = [UIImage imageNamed:[[self class] resolveImageResource:@"ChildBrowser.bundle/arrow_left"]]; - fwdBtn.image = [UIImage imageNamed:[[self class] resolveImageResource:@"ChildBrowser.bundle/arrow_right"]]; - safariBtn.image = [UIImage imageNamed:[[self class] resolveImageResource:@"ChildBrowser.bundle/compass"]]; - - webView.delegate = self; - webView.scalesPageToFit = TRUE; - webView.backgroundColor = [UIColor whiteColor]; - NSLog(@"View did load"); -} - - - - - -- (void)didReceiveMemoryWarning { - // Releases the view if it doesn't have a superview. - [super didReceiveMemoryWarning]; - - // Release any cached data, images, etc that aren't in use. -} - -- (void)viewDidUnload { - // Release any retained subviews of the main view. - // e.g. self.myOutlet = nil; - NSLog(@"View did UN-load"); -} - - -- (void)dealloc { - - webView.delegate = nil; - - [webView release]; - [closeBtn release]; - [refreshBtn release]; - [addressLabel release]; - [backBtn release]; - [fwdBtn release]; - [safariBtn release]; - [spinner release]; - [ supportedOrientations release]; - [super dealloc]; -} - --(void)closeBrowser -{ - - if(delegate != NULL) - { - [delegate onClose]; - } - if ([self respondsToSelector:@selector(presentingViewController)]) { - //Reference UIViewController.h Line:179 for update to iOS 5 difference - @RandyMcMillan - [[self presentingViewController] dismissViewControllerAnimated:YES completion:nil]; - } else { - [[self parentViewController] dismissModalViewControllerAnimated:YES]; - } -} - --(IBAction) onDoneButtonPress:(id)sender -{ - [ self closeBrowser]; - - NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"about:blank"]]; - [webView loadRequest:request]; -} - - --(IBAction) onSafariButtonPress:(id)sender -{ - - if(delegate != NULL) - { - [delegate onOpenInSafari]; - } - - if(isImage) - { - NSURL* pURL = [[ [NSURL alloc] initWithString:imageURL ] autorelease]; - [ [ UIApplication sharedApplication ] openURL:pURL ]; - } - else - { - NSURLRequest *request = webView.request; - [[UIApplication sharedApplication] openURL:request.URL]; - } - - -} - -- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation) interfaceOrientation -{ - BOOL autoRotate = [self.supportedOrientations count] > 1; // autorotate if only more than 1 orientation supported - if (autoRotate) - { - if ([self.supportedOrientations containsObject: - [NSNumber numberWithInt:interfaceOrientation]]) { - return YES; - } - } - - return NO; -} - - - - -- (void)loadURL:(NSString*)url -{ - NSLog(@"Opening Url : %@",url); - - if( [url hasSuffix:@".png" ] || - [url hasSuffix:@".jpg" ] || - [url hasSuffix:@".jpeg" ] || - [url hasSuffix:@".bmp" ] || - [url hasSuffix:@".gif" ] ) - { - [ imageURL release ]; - imageURL = [url copy]; - isImage = YES; - NSString* htmlText = @""; - htmlText = [ htmlText stringByReplacingOccurrencesOfString:@"IMGSRC" withString:url ]; - - [webView loadHTMLString:htmlText baseURL:[NSURL URLWithString:@""]]; - - } - else - { - imageURL = @""; - isImage = NO; - NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:url]]; - [webView loadRequest:request]; - } - webView.hidden = NO; -} - - -- (void)webViewDidStartLoad:(UIWebView *)sender { - addressLabel.text = @"Loading..."; - backBtn.enabled = webView.canGoBack; - fwdBtn.enabled = webView.canGoForward; - - [ spinner startAnimating ]; - -} - -- (void)webViewDidFinishLoad:(UIWebView *)sender -{ - NSURLRequest *request = webView.request; - NSLog(@"New Address is : %@",request.URL.absoluteString); - addressLabel.text = request.URL.absoluteString; - backBtn.enabled = webView.canGoBack; - fwdBtn.enabled = webView.canGoForward; - [ spinner stopAnimating ]; - - if(delegate != NULL) - { - [delegate onChildLocationChange:request.URL.absoluteString]; - } - -} - -- (void)webView:(UIWebView *)wv didFailLoadWithError:(NSError *)error { - NSLog (@"webView:didFailLoadWithError"); - [spinner stopAnimating]; - addressLabel.text = @"Failed"; - if (error != NULL) { - UIAlertView *errorAlert = [[UIAlertView alloc] - initWithTitle: [error localizedDescription] - message: [error localizedFailureReason] - delegate:nil - cancelButtonTitle:@"OK" - otherButtonTitles:nil]; - [errorAlert show]; - [errorAlert release]; - } -} - - -@end diff --git a/cordova-lib/spec-plugman/plugins/WeblessPlugin/src/ios/WeblessPluginViewController.xib b/cordova-lib/spec-plugman/plugins/WeblessPlugin/src/ios/WeblessPluginViewController.xib deleted file mode 100644 index cc8dd6592..000000000 --- a/cordova-lib/spec-plugman/plugins/WeblessPlugin/src/ios/WeblessPluginViewController.xib +++ /dev/null @@ -1,875 +0,0 @@ - - - - 768 - 10K540 - 851 - 1038.36 - 461.00 - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - 141 - - - YES - - - YES - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - YES - - YES - - - YES - - - - YES - - IBFilesOwner - IBCocoaTouchFramework - - - IBFirstResponder - IBCocoaTouchFramework - - - - 292 - - YES - - - -2147483374 - {480, 229} - - - - 1 - MCAwIDAAA - - YES - YES - IBCocoaTouchFramework - 1 - YES - - - - 266 - {{0, 256}, {480, 44}} - - - NO - NO - IBCocoaTouchFramework - 1 - - YES - - IBCocoaTouchFramework - 1 - - 0 - - - IBCocoaTouchFramework - - 5 - - - IBCocoaTouchFramework - - - - IBCocoaTouchFramework - - 5 - - - IBCocoaTouchFramework - 32 - - - - IBCocoaTouchFramework - - 5 - - - IBCocoaTouchFramework - 32 - - - - IBCocoaTouchFramework - - 5 - - - IBCocoaTouchFramework - 32 - - - - IBCocoaTouchFramework - - 5 - - - - - - 270 - {{5, 230}, {418, 21}} - - - - 4 - MC42NjY2NjY2OSAwAA - - NO - YES - NO - IBCocoaTouchFramework - Loading... - - Helvetica - 13 - 16 - - - 3 - MQA - - - 1 - NO - 10 - - - - -2147483383 - {{454, 231}, {20, 20}} - - NO - NO - NO - IBCocoaTouchFramework - - - {{0, 20}, {480, 300}} - - - 3 - MC41AA - - 2 - - - - - 3 - - IBCocoaTouchFramework - - - - - YES - - - webView - - - - 17 - - - - addressLabel - - - - 18 - - - - backBtn - - - - 19 - - - - fwdBtn - - - - 22 - - - - refreshBtn - - - - 23 - - - - onDoneButtonPress: - - - - 26 - - - - reload - - - - 27 - - - - goBack - - - - 28 - - - - goForward - - - - 29 - - - - onSafariButtonPress: - - - - 31 - - - - view - - - - 35 - - - - spinner - - - - 36 - - - - safariBtn - - - - 40 - - - - - YES - - 0 - - - - - - 1 - - - YES - - - - - - - - - -1 - - - File's Owner - - - -2 - - - - - 4 - - - - - 6 - - - YES - - - - - - - - - - - - - - - 7 - - - - - 8 - - - Bar Button Item (Reload) - - - 9 - - - Bar Button Item (Go Back) - - - 10 - - - Bar Button Item (Go Forward) - - - 11 - - - Bar Button Item (Safari) - - - 13 - - - - - 14 - - - - - 15 - - - - - 32 - - - - - 37 - - - - - 38 - - - - - 39 - - - - - - - YES - - YES - -1.CustomClassName - -2.CustomClassName - 1.IBEditorWindowLastContentRect - 1.IBPluginDependency - 10.IBPluginDependency - 11.IBPluginDependency - 13.IBPluginDependency - 13.IBViewBoundsToFrameTransform - 14.IBPluginDependency - 15.IBPluginDependency - 32.IBPluginDependency - 32.IBViewBoundsToFrameTransform - 37.IBPluginDependency - 38.IBPluginDependency - 39.IBPluginDependency - 4.IBPluginDependency - 4.IBViewBoundsToFrameTransform - 6.IBPluginDependency - 6.IBViewBoundsToFrameTransform - 7.IBPluginDependency - 8.IBPluginDependency - 9.IBPluginDependency - - - YES - ChildBrowserViewController - UIResponder - {{250, 643}, {480, 320}} - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABCoAAAwygAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABD5gAAw3kAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABB8AAAwwUAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAAAAAAAAw10AAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - - YES - - - YES - - - - - YES - - - YES - - - - 40 - - - - YES - - ChildBrowserViewController - UIViewController - - YES - - YES - onDoneButtonPress: - onSafariButtonPress: - - - YES - id - id - - - - YES - - YES - onDoneButtonPress: - onSafariButtonPress: - - - YES - - onDoneButtonPress: - id - - - onSafariButtonPress: - id - - - - - YES - - YES - addressLabel - backBtn - closeBtn - delegate - fwdBtn - refreshBtn - safariBtn - spinner - webView - - - YES - UILabel - UIBarButtonItem - UIBarButtonItem - id - UIBarButtonItem - UIBarButtonItem - UIBarButtonItem - UIActivityIndicatorView - UIWebView - - - - YES - - YES - addressLabel - backBtn - closeBtn - delegate - fwdBtn - refreshBtn - safariBtn - spinner - webView - - - YES - - addressLabel - UILabel - - - backBtn - UIBarButtonItem - - - closeBtn - UIBarButtonItem - - - delegate - id - - - fwdBtn - UIBarButtonItem - - - refreshBtn - UIBarButtonItem - - - safariBtn - UIBarButtonItem - - - spinner - UIActivityIndicatorView - - - webView - UIWebView - - - - - IBProjectSource - Plugins/ChildBrowser/ChildBrowserViewController.h - - - - - YES - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSError.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSFileManager.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyValueCoding.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyValueObserving.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyedArchiver.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSObject.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSRunLoop.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSThread.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURL.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURLConnection.h - - - - NSObject - - IBFrameworkSource - QuartzCore.framework/Headers/CAAnimation.h - - - - NSObject - - IBFrameworkSource - QuartzCore.framework/Headers/CALayer.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIAccessibility.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UINibLoading.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIResponder.h - - - - UIActivityIndicatorView - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIActivityIndicatorView.h - - - - UIBarButtonItem - UIBarItem - - IBFrameworkSource - UIKit.framework/Headers/UIBarButtonItem.h - - - - UIBarItem - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIBarItem.h - - - - UILabel - UIView - - IBFrameworkSource - UIKit.framework/Headers/UILabel.h - - - - UIResponder - NSObject - - - - UISearchBar - UIView - - IBFrameworkSource - UIKit.framework/Headers/UISearchBar.h - - - - UISearchDisplayController - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UISearchDisplayController.h - - - - UIToolbar - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIToolbar.h - - - - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIPrintFormatter.h - - - - UIView - - IBFrameworkSource - UIKit.framework/Headers/UITextField.h - - - - UIView - UIResponder - - IBFrameworkSource - UIKit.framework/Headers/UIView.h - - - - UIViewController - - IBFrameworkSource - MediaPlayer.framework/Headers/MPMoviePlayerViewController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UINavigationController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UIPopoverController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UISplitViewController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UITabBarController.h - - - - UIViewController - UIResponder - - IBFrameworkSource - UIKit.framework/Headers/UIViewController.h - - - - UIWebView - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIWebView.h - - - - - 0 - IBCocoaTouchFramework - - com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS - - - - com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS - - - - com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 - - - YES - - 3 - 141 - - diff --git a/cordova-lib/spec-plugman/plugins/cordova.echo/.gitignore b/cordova-lib/spec-plugman/plugins/cordova.echo/.gitignore deleted file mode 100644 index e43b0f988..000000000 --- a/cordova-lib/spec-plugman/plugins/cordova.echo/.gitignore +++ /dev/null @@ -1 +0,0 @@ -.DS_Store diff --git a/cordova-lib/spec-plugman/plugins/cordova.echo/plugin.xml b/cordova-lib/spec-plugman/plugins/cordova.echo/plugin.xml deleted file mode 100644 index a9145e778..000000000 --- a/cordova-lib/spec-plugman/plugins/cordova.echo/plugin.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - cordova echo - - - - - - - - - - - - - - diff --git a/cordova-lib/spec-plugman/plugins/cordova.echo/src/blackberry10/index.js b/cordova-lib/spec-plugman/plugins/cordova.echo/src/blackberry10/index.js deleted file mode 100644 index 0759a20eb..000000000 --- a/cordova-lib/spec-plugman/plugins/cordova.echo/src/blackberry10/index.js +++ /dev/null @@ -1,85 +0,0 @@ -/* - * - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - * -*/ - -var echoJNext, - _event = require("../../lib/event"), - winCallback = null, - failCallback = null; - -module.exports = { - doEcho: function (success, fail, args) { - var invokeData = { "message" : JSON.parse(decodeURIComponent(args.message)) }; - try { - success(echoJNext.getEchoJNext(invokeData)); - } catch (e) { - fail(-1, e); - } - } -}; - -/////////////////////////////////////////////////////////////////// -// JavaScript wrapper for JNEXT plugin -/////////////////////////////////////////////////////////////////// - -JNEXT.EchoJNext = function () -{ - var _self = this; - - _self.getEchoJNext = function (args) { - return JNEXT.invoke(_self._id, "doEcho " + JSON.stringify(args)); - }; - - _self.getId = function () { - return _self._id; - }; - - _self.init = function () { - if (!JNEXT.require("echoJnext")) { - return false; - } - - _self._id = JNEXT.createObject("echoJnext.Echo"); - - if (!_self._id || _self._id === "") { - return false; - } - - JNEXT.registerEvents(_self); - }; - - _self.onEvent = function (strData) { - var arData = strData.split(" "), - strEventId = arData[0], - args = arData[1], - info = {}; - - if (strEventId === "cordova.echo.callback") { - _event.trigger("echoCallback", args); - } - - }; - - _self._id = ""; - - _self.init(); -}; - -echoJNext = new JNEXT.EchoJNext(); diff --git a/cordova-lib/spec-plugman/plugins/cordova.echo/src/blackberry10/native/device/echoJnext.so b/cordova-lib/spec-plugman/plugins/cordova.echo/src/blackberry10/native/device/echoJnext.so deleted file mode 100755 index 169714a07120b9679dfa9339e5ceb24eec47010e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1291818 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

o#K0MD@q{FL0iEn&YKi>{YKHXptoc=u> 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 z

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

^SxS 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�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 G`2PU_Q{dSE diff --git a/cordova-lib/spec-plugman/plugins/cordova.echo/src/blackberry10/native/public/json/autolink.h b/cordova-lib/spec-plugman/plugins/cordova.echo/src/blackberry10/native/public/json/autolink.h deleted file mode 100644 index 37c9258ed..000000000 --- a/cordova-lib/spec-plugman/plugins/cordova.echo/src/blackberry10/native/public/json/autolink.h +++ /dev/null @@ -1,19 +0,0 @@ -#ifndef JSON_AUTOLINK_H_INCLUDED -# define JSON_AUTOLINK_H_INCLUDED - -# include "config.h" - -# ifdef JSON_IN_CPPTL -# include -# endif - -# if !defined(JSON_NO_AUTOLINK) && !defined(JSON_DLL_BUILD) && !defined(JSON_IN_CPPTL) -# define CPPTL_AUTOLINK_NAME "json" -# undef CPPTL_AUTOLINK_DLL -# ifdef JSON_DLL -# define CPPTL_AUTOLINK_DLL -# endif -# include "autolink.h" -# endif - -#endif // JSON_AUTOLINK_H_INCLUDED diff --git a/cordova-lib/spec-plugman/plugins/cordova.echo/src/blackberry10/native/public/json/config.h b/cordova-lib/spec-plugman/plugins/cordova.echo/src/blackberry10/native/public/json/config.h deleted file mode 100644 index 5d334cbc5..000000000 --- a/cordova-lib/spec-plugman/plugins/cordova.echo/src/blackberry10/native/public/json/config.h +++ /dev/null @@ -1,43 +0,0 @@ -#ifndef JSON_CONFIG_H_INCLUDED -# define JSON_CONFIG_H_INCLUDED - -/// If defined, indicates that json library is embedded in CppTL library. -//# define JSON_IN_CPPTL 1 - -/// If defined, indicates that json may leverage CppTL library -//# define JSON_USE_CPPTL 1 -/// If defined, indicates that cpptl vector based map should be used instead of std::map -/// as Value container. -//# define JSON_USE_CPPTL_SMALLMAP 1 -/// If defined, indicates that Json specific container should be used -/// (hash table & simple deque container with customizable allocator). -/// THIS FEATURE IS STILL EXPERIMENTAL! -//# define JSON_VALUE_USE_INTERNAL_MAP 1 -/// Force usage of standard new/malloc based allocator instead of memory pool based allocator. -/// The memory pools allocator used optimization (initializing Value and ValueInternalLink -/// as if it was a POD) that may cause some validation tool to report errors. -/// Only has effects if JSON_VALUE_USE_INTERNAL_MAP is defined. -//# define JSON_USE_SIMPLE_INTERNAL_ALLOCATOR 1 - -/// If defined, indicates that Json use exception to report invalid type manipulation -/// instead of C assert macro. -# define JSON_USE_EXCEPTION 1 - -# ifdef JSON_IN_CPPTL -# include -# ifndef JSON_USE_CPPTL -# define JSON_USE_CPPTL 1 -# endif -# endif - -# ifdef JSON_IN_CPPTL -# define JSON_API CPPTL_API -# elif defined(JSON_DLL_BUILD) -# define JSON_API __declspec(dllexport) -# elif defined(JSON_DLL) -# define JSON_API __declspec(dllimport) -# else -# define JSON_API -# endif - -#endif // JSON_CONFIG_H_INCLUDED diff --git a/cordova-lib/spec-plugman/plugins/cordova.echo/src/blackberry10/native/public/json/features.h b/cordova-lib/spec-plugman/plugins/cordova.echo/src/blackberry10/native/public/json/features.h deleted file mode 100644 index 5a9adec11..000000000 --- a/cordova-lib/spec-plugman/plugins/cordova.echo/src/blackberry10/native/public/json/features.h +++ /dev/null @@ -1,42 +0,0 @@ -#ifndef CPPTL_JSON_FEATURES_H_INCLUDED -# define CPPTL_JSON_FEATURES_H_INCLUDED - -# include "forwards.h" - -namespace Json { - - /** \brief Configuration passed to reader and writer. - * This configuration object can be used to force the Reader or Writer - * to behave in a standard conforming way. - */ - class JSON_API Features - { - public: - /** \brief A configuration that allows all features and assumes all strings are UTF-8. - * - C & C++ comments are allowed - * - Root object can be any JSON value - * - Assumes Value strings are encoded in UTF-8 - */ - static Features all(); - - /** \brief A configuration that is strictly compatible with the JSON specification. - * - Comments are forbidden. - * - Root object must be either an array or an object value. - * - Assumes Value strings are encoded in UTF-8 - */ - static Features strictMode(); - - /** \brief Initialize the configuration like JsonConfig::allFeatures; - */ - Features(); - - /// \c true if comments are allowed. Default: \c true. - bool allowComments_; - - /// \c true if root must be either an array or an object value. Default: \c false. - bool strictRoot_; - }; - -} // namespace Json - -#endif // CPPTL_JSON_FEATURES_H_INCLUDED diff --git a/cordova-lib/spec-plugman/plugins/cordova.echo/src/blackberry10/native/public/json/forwards.h b/cordova-lib/spec-plugman/plugins/cordova.echo/src/blackberry10/native/public/json/forwards.h deleted file mode 100644 index d0ce8300c..000000000 --- a/cordova-lib/spec-plugman/plugins/cordova.echo/src/blackberry10/native/public/json/forwards.h +++ /dev/null @@ -1,39 +0,0 @@ -#ifndef JSON_FORWARDS_H_INCLUDED -# define JSON_FORWARDS_H_INCLUDED - -# include "config.h" - -namespace Json { - - // writer.h - class FastWriter; - class StyledWriter; - - // reader.h - class Reader; - - // features.h - class Features; - - // value.h - typedef int Int; - typedef unsigned int UInt; - class StaticString; - class Path; - class PathArgument; - class Value; - class ValueIteratorBase; - class ValueIterator; - class ValueConstIterator; -#ifdef JSON_VALUE_USE_INTERNAL_MAP - class ValueAllocator; - class ValueMapAllocator; - class ValueInternalLink; - class ValueInternalArray; - class ValueInternalMap; -#endif // #ifdef JSON_VALUE_USE_INTERNAL_MAP - -} // namespace Json - - -#endif // JSON_FORWARDS_H_INCLUDED diff --git a/cordova-lib/spec-plugman/plugins/cordova.echo/src/blackberry10/native/public/json/json.h b/cordova-lib/spec-plugman/plugins/cordova.echo/src/blackberry10/native/public/json/json.h deleted file mode 100644 index c71ed65ab..000000000 --- a/cordova-lib/spec-plugman/plugins/cordova.echo/src/blackberry10/native/public/json/json.h +++ /dev/null @@ -1,10 +0,0 @@ -#ifndef JSON_JSON_H_INCLUDED -# define JSON_JSON_H_INCLUDED - -# include "autolink.h" -# include "value.h" -# include "reader.h" -# include "writer.h" -# include "features.h" - -#endif // JSON_JSON_H_INCLUDED diff --git a/cordova-lib/spec-plugman/plugins/cordova.echo/src/blackberry10/native/public/json/reader.h b/cordova-lib/spec-plugman/plugins/cordova.echo/src/blackberry10/native/public/json/reader.h deleted file mode 100644 index ee1d6a244..000000000 --- a/cordova-lib/spec-plugman/plugins/cordova.echo/src/blackberry10/native/public/json/reader.h +++ /dev/null @@ -1,196 +0,0 @@ -#ifndef CPPTL_JSON_READER_H_INCLUDED -# define CPPTL_JSON_READER_H_INCLUDED - -# include "features.h" -# include "value.h" -# include -# include -# include -# include - -namespace Json { - - /** \brief Unserialize a JSON document into a Value. - * - */ - class JSON_API Reader - { - public: - typedef char Char; - typedef const Char *Location; - - /** \brief Constructs a Reader allowing all features - * for parsing. - */ - Reader(); - - /** \brief Constructs a Reader allowing the specified feature set - * for parsing. - */ - Reader( const Features &features ); - - /** \brief Read a Value from a JSON document. - * \param document UTF-8 encoded string containing the document to read. - * \param root [out] Contains the root value of the document if it was - * successfully parsed. - * \param collectComments \c true to collect comment and allow writing them back during - * serialization, \c false to discard comments. - * This parameter is ignored if Features::allowComments_ - * is \c false. - * \return \c true if the document was successfully parsed, \c false if an error occurred. - */ - bool parse( const std::string &document, - Value &root, - bool collectComments = true ); - - /** \brief Read a Value from a JSON document. - * \param document UTF-8 encoded string containing the document to read. - * \param root [out] Contains the root value of the document if it was - * successfully parsed. - * \param collectComments \c true to collect comment and allow writing them back during - * serialization, \c false to discard comments. - * This parameter is ignored if Features::allowComments_ - * is \c false. - * \return \c true if the document was successfully parsed, \c false if an error occurred. - */ - bool parse( const char *beginDoc, const char *endDoc, - Value &root, - bool collectComments = true ); - - /// \brief Parse from input stream. - /// \see Json::operator>>(std::istream&, Json::Value&). - bool parse( std::istream &is, - Value &root, - bool collectComments = true ); - - /** \brief Returns a user friendly string that list errors in the parsed document. - * \return Formatted error message with the list of errors with their location in - * the parsed document. An empty string is returned if no error occurred - * during parsing. - */ - std::string getFormatedErrorMessages() const; - - private: - enum TokenType - { - tokenEndOfStream = 0, - tokenObjectBegin, - tokenObjectEnd, - tokenArrayBegin, - tokenArrayEnd, - tokenString, - tokenNumber, - tokenTrue, - tokenFalse, - tokenNull, - tokenArraySeparator, - tokenMemberSeparator, - tokenComment, - tokenError - }; - - class Token - { - public: - TokenType type_; - Location start_; - Location end_; - }; - - class ErrorInfo - { - public: - Token token_; - std::string message_; - Location extra_; - }; - - typedef std::deque Errors; - - bool expectToken( TokenType type, Token &token, const char *message ); - bool readToken( Token &token ); - void skipSpaces(); - bool match( Location pattern, - int patternLength ); - bool readComment(); - bool readCStyleComment(); - bool readCppStyleComment(); - bool readString(); - void readNumber(); - bool readValue(); - bool readObject( Token &token ); - bool readArray( Token &token ); - bool decodeNumber( Token &token ); - bool decodeString( Token &token ); - bool decodeString( Token &token, std::string &decoded ); - bool decodeDouble( Token &token ); - bool decodeUnicodeCodePoint( Token &token, - Location ¤t, - Location end, - unsigned int &unicode ); - bool decodeUnicodeEscapeSequence( Token &token, - Location ¤t, - Location end, - unsigned int &unicode ); - bool addError( const std::string &message, - Token &token, - Location extra = 0 ); - bool recoverFromError( TokenType skipUntilToken ); - bool addErrorAndRecover( const std::string &message, - Token &token, - TokenType skipUntilToken ); - void skipUntilSpace(); - Value ¤tValue(); - Char getNextChar(); - void getLocationLineAndColumn( Location location, - int &line, - int &column ) const; - std::string getLocationLineAndColumn( Location location ) const; - void addComment( Location begin, - Location end, - CommentPlacement placement ); - void skipCommentTokens( Token &token ); - - typedef std::stack Nodes; - Nodes nodes_; - Errors errors_; - std::string document_; - Location begin_; - Location end_; - Location current_; - Location lastValueEnd_; - Value *lastValue_; - std::string commentsBefore_; - Features features_; - bool collectComments_; - }; - - /** \brief Read from 'sin' into 'root'. - - Always keep comments from the input JSON. - - This can be used to read a file into a particular sub-object. - For example: - \code - Json::Value root; - cin >> root["dir"]["file"]; - cout << root; - \endcode - Result: - \verbatim - { - "dir": { - "file": { - // The input stream JSON would be nested here. - } - } - } - \endverbatim - \throw std::exception on parse error. - \see Json::operator<<() - */ - std::istream& operator>>( std::istream&, Value& ); - -} // namespace Json - -#endif // CPPTL_JSON_READER_H_INCLUDED diff --git a/cordova-lib/spec-plugman/plugins/cordova.echo/src/blackberry10/native/public/json/value.h b/cordova-lib/spec-plugman/plugins/cordova.echo/src/blackberry10/native/public/json/value.h deleted file mode 100644 index 912b8304f..000000000 --- a/cordova-lib/spec-plugman/plugins/cordova.echo/src/blackberry10/native/public/json/value.h +++ /dev/null @@ -1,1069 +0,0 @@ -#ifndef CPPTL_JSON_H_INCLUDED -# define CPPTL_JSON_H_INCLUDED - -# include "forwards.h" -# include -# include - -# ifndef JSON_USE_CPPTL_SMALLMAP -# include -# else -# include -# endif -# ifdef JSON_USE_CPPTL -# include -# endif - -/** \brief JSON (JavaScript Object Notation). - */ -namespace Json { - - /** \brief Type of the value held by a Value object. - */ - enum ValueType - { - nullValue = 0, ///< 'null' value - intValue, ///< signed integer value - uintValue, ///< unsigned integer value - realValue, ///< double value - stringValue, ///< UTF-8 string value - booleanValue, ///< bool value - arrayValue, ///< array value (ordered list) - objectValue ///< object value (collection of name/value pairs). - }; - - enum CommentPlacement - { - commentBefore = 0, ///< a comment placed on the line before a value - commentAfterOnSameLine, ///< a comment just after a value on the same line - commentAfter, ///< a comment on the line after a value (only make sense for root value) - numberOfCommentPlacement - }; - -//# ifdef JSON_USE_CPPTL -// typedef CppTL::AnyEnumerator EnumMemberNames; -// typedef CppTL::AnyEnumerator EnumValues; -//# endif - - /** \brief Lightweight wrapper to tag static string. - * - * Value constructor and objectValue member assignment takes advantage of the - * StaticString and avoid the cost of string duplication when storing the - * string or the member name. - * - * Example of usage: - * \code - * Json::Value aValue( StaticString("some text") ); - * Json::Value object; - * static const StaticString code("code"); - * object[code] = 1234; - * \endcode - */ - class JSON_API StaticString - { - public: - explicit StaticString( const char *czstring ) - : str_( czstring ) - { - } - - operator const char *() const - { - return str_; - } - - const char *c_str() const - { - return str_; - } - - private: - const char *str_; - }; - - /** \brief Represents a JSON value. - * - * This class is a discriminated union wrapper that can represents a: - * - signed integer [range: Value::minInt - Value::maxInt] - * - unsigned integer (range: 0 - Value::maxUInt) - * - double - * - UTF-8 string - * - boolean - * - 'null' - * - an ordered list of Value - * - collection of name/value pairs (javascript object) - * - * The type of the held value is represented by a #ValueType and - * can be obtained using type(). - * - * values of an #objectValue or #arrayValue can be accessed using operator[]() methods. - * Non const methods will automatically create the a #nullValue element - * if it does not exist. - * The sequence of an #arrayValue will be automatically resize and initialized - * with #nullValue. resize() can be used to enlarge or truncate an #arrayValue. - * - * The get() methods can be used to obtains default value in the case the required element - * does not exist. - * - * It is possible to iterate over the list of a #objectValue values using - * the getMemberNames() method. - */ - class JSON_API Value - { - friend class ValueIteratorBase; -# ifdef JSON_VALUE_USE_INTERNAL_MAP - friend class ValueInternalLink; - friend class ValueInternalMap; -# endif - public: - typedef std::vector Members; - typedef ValueIterator iterator; - typedef ValueConstIterator const_iterator; - typedef Json::UInt UInt; - typedef Json::Int Int; - typedef UInt ArrayIndex; - - static const Value null; - static const Int minInt; - static const Int maxInt; - static const UInt maxUInt; - - private: -#ifndef JSONCPP_DOC_EXCLUDE_IMPLEMENTATION -# ifndef JSON_VALUE_USE_INTERNAL_MAP - class CZString - { - public: - enum DuplicationPolicy - { - noDuplication = 0, - duplicate, - duplicateOnCopy - }; - CZString( int index ); - CZString( const char *cstr, DuplicationPolicy allocate ); - CZString( const CZString &other ); - ~CZString(); - CZString &operator =( const CZString &other ); - bool operator<( const CZString &other ) const; - bool operator==( const CZString &other ) const; - int index() const; - const char *c_str() const; - bool isStaticString() const; - private: - void swap( CZString &other ); - const char *cstr_; - int index_; - }; - - public: -# ifndef JSON_USE_CPPTL_SMALLMAP - typedef std::map ObjectValues; -# else - typedef CppTL::SmallMap ObjectValues; -# endif // ifndef JSON_USE_CPPTL_SMALLMAP -# endif // ifndef JSON_VALUE_USE_INTERNAL_MAP -#endif // ifndef JSONCPP_DOC_EXCLUDE_IMPLEMENTATION - - public: - /** \brief Create a default Value of the given type. - - This is a very useful constructor. - To create an empty array, pass arrayValue. - To create an empty object, pass objectValue. - Another Value can then be set to this one by assignment. - This is useful since clear() and resize() will not alter types. - - Examples: - \code - Json::Value null_value; // null - Json::Value arr_value(Json::arrayValue); // [] - Json::Value obj_value(Json::objectValue); // {} - \endcode - */ - Value( ValueType type = nullValue ); - Value( Int value ); - Value( UInt value ); - Value( double value ); - Value( const char *value ); - Value( const char *beginValue, const char *endValue ); - /** \brief Constructs a value from a static string. - - * Like other value string constructor but do not duplicate the string for - * internal storage. The given string must remain alive after the call to this - * constructor. - * Example of usage: - * \code - * Json::Value aValue( StaticString("some text") ); - * \endcode - */ - Value( const StaticString &value ); - Value( const std::string &value ); -# ifdef JSON_USE_CPPTL - Value( const CppTL::ConstString &value ); -# endif - Value( bool value ); - Value( const Value &other ); - ~Value(); - - Value &operator=( const Value &other ); - /// Swap values. - /// \note Currently, comments are intentionally not swapped, for - /// both logic and efficiency. - void swap( Value &other ); - - ValueType type() const; - - bool operator <( const Value &other ) const; - bool operator <=( const Value &other ) const; - bool operator >=( const Value &other ) const; - bool operator >( const Value &other ) const; - - bool operator ==( const Value &other ) const; - bool operator !=( const Value &other ) const; - - int compare( const Value &other ); - - const char *asCString() const; - std::string asString() const; -# ifdef JSON_USE_CPPTL - CppTL::ConstString asConstString() const; -# endif - Int asInt() const; - UInt asUInt() const; - double asDouble() const; - bool asBool() const; - - bool isNull() const; - bool isBool() const; - bool isInt() const; - bool isUInt() const; - bool isIntegral() const; - bool isDouble() const; - bool isNumeric() const; - bool isString() const; - bool isArray() const; - bool isObject() const; - - bool isConvertibleTo( ValueType other ) const; - - /// Number of values in array or object - UInt size() const; - - /// \brief Return true if empty array, empty object, or null; - /// otherwise, false. - bool empty() const; - - /// Return isNull() - bool operator!() const; - - /// Remove all object members and array elements. - /// \pre type() is arrayValue, objectValue, or nullValue - /// \post type() is unchanged - void clear(); - - /// Resize the array to size elements. - /// New elements are initialized to null. - /// May only be called on nullValue or arrayValue. - /// \pre type() is arrayValue or nullValue - /// \post type() is arrayValue - void resize( UInt size ); - - /// Access an array element (zero based index ). - /// If the array contains less than index element, then null value are inserted - /// in the array so that its size is index+1. - /// (You may need to say 'value[0u]' to get your compiler to distinguish - /// this from the operator[] which takes a string.) - Value &operator[]( UInt index ); - /// Access an array element (zero based index ) - /// (You may need to say 'value[0u]' to get your compiler to distinguish - /// this from the operator[] which takes a string.) - const Value &operator[]( UInt index ) const; - /// If the array contains at least index+1 elements, returns the element value, - /// otherwise returns defaultValue. - Value get( UInt index, - const Value &defaultValue ) const; - /// Return true if index < size(). - bool isValidIndex( UInt index ) const; - /// \brief Append value to array at the end. - /// - /// Equivalent to jsonvalue[jsonvalue.size()] = value; - Value &append( const Value &value ); - - /// Access an object value by name, create a null member if it does not exist. - Value &operator[]( const char *key ); - /// Access an object value by name, returns null if there is no member with that name. - const Value &operator[]( const char *key ) const; - /// Access an object value by name, create a null member if it does not exist. - Value &operator[]( const std::string &key ); - /// Access an object value by name, returns null if there is no member with that name. - const Value &operator[]( const std::string &key ) const; - /** \brief Access an object value by name, create a null member if it does not exist. - - * If the object as no entry for that name, then the member name used to store - * the new entry is not duplicated. - * Example of use: - * \code - * Json::Value object; - * static const StaticString code("code"); - * object[code] = 1234; - * \endcode - */ - Value &operator[]( const StaticString &key ); -# ifdef JSON_USE_CPPTL - /// Access an object value by name, create a null member if it does not exist. - Value &operator[]( const CppTL::ConstString &key ); - /// Access an object value by name, returns null if there is no member with that name. - const Value &operator[]( const CppTL::ConstString &key ) const; -# endif - /// Return the member named key if it exist, defaultValue otherwise. - Value get( const char *key, - const Value &defaultValue ) const; - /// Return the member named key if it exist, defaultValue otherwise. - Value get( const std::string &key, - const Value &defaultValue ) const; -# ifdef JSON_USE_CPPTL - /// Return the member named key if it exist, defaultValue otherwise. - Value get( const CppTL::ConstString &key, - const Value &defaultValue ) const; -# endif - /// \brief Remove and return the named member. - /// - /// Do nothing if it did not exist. - /// \return the removed Value, or null. - /// \pre type() is objectValue or nullValue - /// \post type() is unchanged - Value removeMember( const char* key ); - /// Same as removeMember(const char*) - Value removeMember( const std::string &key ); - - /// Return true if the object has a member named key. - bool isMember( const char *key ) const; - /// Return true if the object has a member named key. - bool isMember( const std::string &key ) const; -# ifdef JSON_USE_CPPTL - /// Return true if the object has a member named key. - bool isMember( const CppTL::ConstString &key ) const; -# endif - - /// \brief Return a list of the member names. - /// - /// If null, return an empty list. - /// \pre type() is objectValue or nullValue - /// \post if type() was nullValue, it remains nullValue - Members getMemberNames() const; - -//# ifdef JSON_USE_CPPTL -// EnumMemberNames enumMemberNames() const; -// EnumValues enumValues() const; -//# endif - - /// Comments must be //... or /* ... */ - void setComment( const char *comment, - CommentPlacement placement ); - /// Comments must be //... or /* ... */ - void setComment( const std::string &comment, - CommentPlacement placement ); - bool hasComment( CommentPlacement placement ) const; - /// Include delimiters and embedded newlines. - std::string getComment( CommentPlacement placement ) const; - - std::string toStyledString() const; - - const_iterator begin() const; - const_iterator end() const; - - iterator begin(); - iterator end(); - - private: - Value &resolveReference( const char *key, - bool isStatic ); - -# ifdef JSON_VALUE_USE_INTERNAL_MAP - inline bool isItemAvailable() const - { - return itemIsUsed_ == 0; - } - - inline void setItemUsed( bool isUsed = true ) - { - itemIsUsed_ = isUsed ? 1 : 0; - } - - inline bool isMemberNameStatic() const - { - return memberNameIsStatic_ == 0; - } - - inline void setMemberNameIsStatic( bool isStatic ) - { - memberNameIsStatic_ = isStatic ? 1 : 0; - } -# endif // # ifdef JSON_VALUE_USE_INTERNAL_MAP - - private: - struct CommentInfo - { - CommentInfo(); - ~CommentInfo(); - - void setComment( const char *text ); - - char *comment_; - }; - - //struct MemberNamesTransform - //{ - // typedef const char *result_type; - // const char *operator()( const CZString &name ) const - // { - // return name.c_str(); - // } - //}; - - union ValueHolder - { - Int int_; - UInt uint_; - double real_; - bool bool_; - char *string_; -# ifdef JSON_VALUE_USE_INTERNAL_MAP - ValueInternalArray *array_; - ValueInternalMap *map_; -#else - ObjectValues *map_; -# endif - } value_; - ValueType type_ : 8; - int allocated_ : 1; // Notes: if declared as bool, bitfield is useless. -# ifdef JSON_VALUE_USE_INTERNAL_MAP - unsigned int itemIsUsed_ : 1; // used by the ValueInternalMap container. - int memberNameIsStatic_ : 1; // used by the ValueInternalMap container. -# endif - CommentInfo *comments_; - }; - - - /** \brief Experimental and untested: represents an element of the "path" to access a node. - */ - class PathArgument - { - public: - friend class Path; - - PathArgument(); - PathArgument( UInt index ); - PathArgument( const char *key ); - PathArgument( const std::string &key ); - - private: - enum Kind - { - kindNone = 0, - kindIndex, - kindKey - }; - std::string key_; - UInt index_; - Kind kind_; - }; - - /** \brief Experimental and untested: represents a "path" to access a node. - * - * Syntax: - * - "." => root node - * - ".[n]" => elements at index 'n' of root node (an array value) - * - ".name" => member named 'name' of root node (an object value) - * - ".name1.name2.name3" - * - ".[0][1][2].name1[3]" - * - ".%" => member name is provided as parameter - * - ".[%]" => index is provided as parameter - */ - class Path - { - public: - Path( const std::string &path, - const PathArgument &a1 = PathArgument(), - const PathArgument &a2 = PathArgument(), - const PathArgument &a3 = PathArgument(), - const PathArgument &a4 = PathArgument(), - const PathArgument &a5 = PathArgument() ); - - const Value &resolve( const Value &root ) const; - Value resolve( const Value &root, - const Value &defaultValue ) const; - /// Creates the "path" to access the specified node and returns a reference on the node. - Value &make( Value &root ) const; - - private: - typedef std::vector InArgs; - typedef std::vector Args; - - void makePath( const std::string &path, - const InArgs &in ); - void addPathInArg( const std::string &path, - const InArgs &in, - InArgs::const_iterator &itInArg, - PathArgument::Kind kind ); - void invalidPath( const std::string &path, - int location ); - - Args args_; - }; - - /** \brief Experimental do not use: Allocator to customize member name and string value memory management done by Value. - * - * - makeMemberName() and releaseMemberName() are called to respectively duplicate and - * free an Json::objectValue member name. - * - duplicateStringValue() and releaseStringValue() are called similarly to - * duplicate and free a Json::stringValue value. - */ - class ValueAllocator - { - public: - enum { unknown = (unsigned)-1 }; - - virtual ~ValueAllocator(); - - virtual char *makeMemberName( const char *memberName ) = 0; - virtual void releaseMemberName( char *memberName ) = 0; - virtual char *duplicateStringValue( const char *value, - unsigned int length = unknown ) = 0; - virtual void releaseStringValue( char *value ) = 0; - }; - -#ifdef JSON_VALUE_USE_INTERNAL_MAP - /** \brief Allocator to customize Value internal map. - * Below is an example of a simple implementation (default implementation actually - * use memory pool for speed). - * \code - class DefaultValueMapAllocator : public ValueMapAllocator - { - public: // overridden from ValueMapAllocator - virtual ValueInternalMap *newMap() - { - return new ValueInternalMap(); - } - - virtual ValueInternalMap *newMapCopy( const ValueInternalMap &other ) - { - return new ValueInternalMap( other ); - } - - virtual void destructMap( ValueInternalMap *map ) - { - delete map; - } - - virtual ValueInternalLink *allocateMapBuckets( unsigned int size ) - { - return new ValueInternalLink[size]; - } - - virtual void releaseMapBuckets( ValueInternalLink *links ) - { - delete [] links; - } - - virtual ValueInternalLink *allocateMapLink() - { - return new ValueInternalLink(); - } - - virtual void releaseMapLink( ValueInternalLink *link ) - { - delete link; - } - }; - * \endcode - */ - class JSON_API ValueMapAllocator - { - public: - virtual ~ValueMapAllocator(); - virtual ValueInternalMap *newMap() = 0; - virtual ValueInternalMap *newMapCopy( const ValueInternalMap &other ) = 0; - virtual void destructMap( ValueInternalMap *map ) = 0; - virtual ValueInternalLink *allocateMapBuckets( unsigned int size ) = 0; - virtual void releaseMapBuckets( ValueInternalLink *links ) = 0; - virtual ValueInternalLink *allocateMapLink() = 0; - virtual void releaseMapLink( ValueInternalLink *link ) = 0; - }; - - /** \brief ValueInternalMap hash-map bucket chain link (for internal use only). - * \internal previous_ & next_ allows for bidirectional traversal. - */ - class JSON_API ValueInternalLink - { - public: - enum { itemPerLink = 6 }; // sizeof(ValueInternalLink) = 128 on 32 bits architecture. - enum InternalFlags { - flagAvailable = 0, - flagUsed = 1 - }; - - ValueInternalLink(); - - ~ValueInternalLink(); - - Value items_[itemPerLink]; - char *keys_[itemPerLink]; - ValueInternalLink *previous_; - ValueInternalLink *next_; - }; - - - /** \brief A linked page based hash-table implementation used internally by Value. - * \internal ValueInternalMap is a traditional bucket based hash-table, with a linked - * list in each bucket to handle collision. There is an addional twist in that - * each node of the collision linked list is a page containing a fixed amount of - * value. This provides a better compromise between memory usage and speed. - * - * Each bucket is made up of a chained list of ValueInternalLink. The last - * link of a given bucket can be found in the 'previous_' field of the following bucket. - * The last link of the last bucket is stored in tailLink_ as it has no following bucket. - * Only the last link of a bucket may contains 'available' item. The last link always - * contains at least one element unless is it the bucket one very first link. - */ - class JSON_API ValueInternalMap - { - friend class ValueIteratorBase; - friend class Value; - public: - typedef unsigned int HashKey; - typedef unsigned int BucketIndex; - -# ifndef JSONCPP_DOC_EXCLUDE_IMPLEMENTATION - struct IteratorState - { - IteratorState() - : map_(0) - , link_(0) - , itemIndex_(0) - , bucketIndex_(0) - { - } - ValueInternalMap *map_; - ValueInternalLink *link_; - BucketIndex itemIndex_; - BucketIndex bucketIndex_; - }; -# endif // ifndef JSONCPP_DOC_EXCLUDE_IMPLEMENTATION - - ValueInternalMap(); - ValueInternalMap( const ValueInternalMap &other ); - ValueInternalMap &operator =( const ValueInternalMap &other ); - ~ValueInternalMap(); - - void swap( ValueInternalMap &other ); - - BucketIndex size() const; - - void clear(); - - bool reserveDelta( BucketIndex growth ); - - bool reserve( BucketIndex newItemCount ); - - const Value *find( const char *key ) const; - - Value *find( const char *key ); - - Value &resolveReference( const char *key, - bool isStatic ); - - void remove( const char *key ); - - void doActualRemove( ValueInternalLink *link, - BucketIndex index, - BucketIndex bucketIndex ); - - ValueInternalLink *&getLastLinkInBucket( BucketIndex bucketIndex ); - - Value &setNewItem( const char *key, - bool isStatic, - ValueInternalLink *link, - BucketIndex index ); - - Value &unsafeAdd( const char *key, - bool isStatic, - HashKey hashedKey ); - - HashKey hash( const char *key ) const; - - int compare( const ValueInternalMap &other ) const; - - private: - void makeBeginIterator( IteratorState &it ) const; - void makeEndIterator( IteratorState &it ) const; - static bool equals( const IteratorState &x, const IteratorState &other ); - static void increment( IteratorState &iterator ); - static void incrementBucket( IteratorState &iterator ); - static void decrement( IteratorState &iterator ); - static const char *key( const IteratorState &iterator ); - static const char *key( const IteratorState &iterator, bool &isStatic ); - static Value &value( const IteratorState &iterator ); - static int distance( const IteratorState &x, const IteratorState &y ); - - private: - ValueInternalLink *buckets_; - ValueInternalLink *tailLink_; - BucketIndex bucketsSize_; - BucketIndex itemCount_; - }; - - /** \brief A simplified deque implementation used internally by Value. - * \internal - * It is based on a list of fixed "page", each page contains a fixed number of items. - * Instead of using a linked-list, a array of pointer is used for fast item look-up. - * Look-up for an element is as follow: - * - compute page index: pageIndex = itemIndex / itemsPerPage - * - look-up item in page: pages_[pageIndex][itemIndex % itemsPerPage] - * - * Insertion is amortized constant time (only the array containing the index of pointers - * need to be reallocated when items are appended). - */ - class JSON_API ValueInternalArray - { - friend class Value; - friend class ValueIteratorBase; - public: - enum { itemsPerPage = 8 }; // should be a power of 2 for fast divide and modulo. - typedef Value::ArrayIndex ArrayIndex; - typedef unsigned int PageIndex; - -# ifndef JSONCPP_DOC_EXCLUDE_IMPLEMENTATION - struct IteratorState // Must be a POD - { - IteratorState() - : array_(0) - , currentPageIndex_(0) - , currentItemIndex_(0) - { - } - ValueInternalArray *array_; - Value **currentPageIndex_; - unsigned int currentItemIndex_; - }; -# endif // ifndef JSONCPP_DOC_EXCLUDE_IMPLEMENTATION - - ValueInternalArray(); - ValueInternalArray( const ValueInternalArray &other ); - ValueInternalArray &operator =( const ValueInternalArray &other ); - ~ValueInternalArray(); - void swap( ValueInternalArray &other ); - - void clear(); - void resize( ArrayIndex newSize ); - - Value &resolveReference( ArrayIndex index ); - - Value *find( ArrayIndex index ) const; - - ArrayIndex size() const; - - int compare( const ValueInternalArray &other ) const; - - private: - static bool equals( const IteratorState &x, const IteratorState &other ); - static void increment( IteratorState &iterator ); - static void decrement( IteratorState &iterator ); - static Value &dereference( const IteratorState &iterator ); - static Value &unsafeDereference( const IteratorState &iterator ); - static int distance( const IteratorState &x, const IteratorState &y ); - static ArrayIndex indexOf( const IteratorState &iterator ); - void makeBeginIterator( IteratorState &it ) const; - void makeEndIterator( IteratorState &it ) const; - void makeIterator( IteratorState &it, ArrayIndex index ) const; - - void makeIndexValid( ArrayIndex index ); - - Value **pages_; - ArrayIndex size_; - PageIndex pageCount_; - }; - - /** \brief Experimental: do not use. Allocator to customize Value internal array. - * Below is an example of a simple implementation (actual implementation use - * memory pool). - \code -class DefaultValueArrayAllocator : public ValueArrayAllocator -{ -public: // overridden from ValueArrayAllocator - virtual ~DefaultValueArrayAllocator() - { - } - - virtual ValueInternalArray *newArray() - { - return new ValueInternalArray(); - } - - virtual ValueInternalArray *newArrayCopy( const ValueInternalArray &other ) - { - return new ValueInternalArray( other ); - } - - virtual void destruct( ValueInternalArray *array ) - { - delete array; - } - - virtual void reallocateArrayPageIndex( Value **&indexes, - ValueInternalArray::PageIndex &indexCount, - ValueInternalArray::PageIndex minNewIndexCount ) - { - ValueInternalArray::PageIndex newIndexCount = (indexCount*3)/2 + 1; - if ( minNewIndexCount > newIndexCount ) - newIndexCount = minNewIndexCount; - void *newIndexes = realloc( indexes, sizeof(Value*) * newIndexCount ); - if ( !newIndexes ) - throw std::bad_alloc(); - indexCount = newIndexCount; - indexes = static_cast( newIndexes ); - } - virtual void releaseArrayPageIndex( Value **indexes, - ValueInternalArray::PageIndex indexCount ) - { - if ( indexes ) - free( indexes ); - } - - virtual Value *allocateArrayPage() - { - return static_cast( malloc( sizeof(Value) * ValueInternalArray::itemsPerPage ) ); - } - - virtual void releaseArrayPage( Value *value ) - { - if ( value ) - free( value ); - } -}; - \endcode - */ - class JSON_API ValueArrayAllocator - { - public: - virtual ~ValueArrayAllocator(); - virtual ValueInternalArray *newArray() = 0; - virtual ValueInternalArray *newArrayCopy( const ValueInternalArray &other ) = 0; - virtual void destructArray( ValueInternalArray *array ) = 0; - /** \brief Reallocate array page index. - * Reallocates an array of pointer on each page. - * \param indexes [input] pointer on the current index. May be \c NULL. - * [output] pointer on the new index of at least - * \a minNewIndexCount pages. - * \param indexCount [input] current number of pages in the index. - * [output] number of page the reallocated index can handle. - * \b MUST be >= \a minNewIndexCount. - * \param minNewIndexCount Minimum number of page the new index must be able to - * handle. - */ - virtual void reallocateArrayPageIndex( Value **&indexes, - ValueInternalArray::PageIndex &indexCount, - ValueInternalArray::PageIndex minNewIndexCount ) = 0; - virtual void releaseArrayPageIndex( Value **indexes, - ValueInternalArray::PageIndex indexCount ) = 0; - virtual Value *allocateArrayPage() = 0; - virtual void releaseArrayPage( Value *value ) = 0; - }; -#endif // #ifdef JSON_VALUE_USE_INTERNAL_MAP - - - /** \brief base class for Value iterators. - * - */ - class ValueIteratorBase - { - public: - typedef unsigned int size_t; - typedef int difference_type; - typedef ValueIteratorBase SelfType; - - ValueIteratorBase(); -#ifndef JSON_VALUE_USE_INTERNAL_MAP - explicit ValueIteratorBase( const Value::ObjectValues::iterator ¤t ); -#else - ValueIteratorBase( const ValueInternalArray::IteratorState &state ); - ValueIteratorBase( const ValueInternalMap::IteratorState &state ); -#endif - - bool operator ==( const SelfType &other ) const - { - return isEqual( other ); - } - - bool operator !=( const SelfType &other ) const - { - return !isEqual( other ); - } - - difference_type operator -( const SelfType &other ) const - { - return computeDistance( other ); - } - - /// Return either the index or the member name of the referenced value as a Value. - Value key() const; - - /// Return the index of the referenced Value. -1 if it is not an arrayValue. - UInt index() const; - - /// Return the member name of the referenced Value. "" if it is not an objectValue. - const char *memberName() const; - - protected: - Value &deref() const; - - void increment(); - - void decrement(); - - difference_type computeDistance( const SelfType &other ) const; - - bool isEqual( const SelfType &other ) const; - - void copy( const SelfType &other ); - - private: -#ifndef JSON_VALUE_USE_INTERNAL_MAP - Value::ObjectValues::iterator current_; - // Indicates that iterator is for a null value. - bool isNull_; -#else - union - { - ValueInternalArray::IteratorState array_; - ValueInternalMap::IteratorState map_; - } iterator_; - bool isArray_; -#endif - }; - - /** \brief const iterator for object and array value. - * - */ - class ValueConstIterator : public ValueIteratorBase - { - friend class Value; - public: - typedef unsigned int size_t; - typedef int difference_type; - typedef const Value &reference; - typedef const Value *pointer; - typedef ValueConstIterator SelfType; - - ValueConstIterator(); - private: - /*! \internal Use by Value to create an iterator. - */ -#ifndef JSON_VALUE_USE_INTERNAL_MAP - explicit ValueConstIterator( const Value::ObjectValues::iterator ¤t ); -#else - ValueConstIterator( const ValueInternalArray::IteratorState &state ); - ValueConstIterator( const ValueInternalMap::IteratorState &state ); -#endif - public: - SelfType &operator =( const ValueIteratorBase &other ); - - SelfType operator++( int ) - { - SelfType temp( *this ); - ++*this; - return temp; - } - - SelfType operator--( int ) - { - SelfType temp( *this ); - --*this; - return temp; - } - - SelfType &operator--() - { - decrement(); - return *this; - } - - SelfType &operator++() - { - increment(); - return *this; - } - - reference operator *() const - { - return deref(); - } - }; - - - /** \brief Iterator for object and array value. - */ - class ValueIterator : public ValueIteratorBase - { - friend class Value; - public: - typedef unsigned int size_t; - typedef int difference_type; - typedef Value &reference; - typedef Value *pointer; - typedef ValueIterator SelfType; - - ValueIterator(); - ValueIterator( const ValueConstIterator &other ); - ValueIterator( const ValueIterator &other ); - private: - /*! \internal Use by Value to create an iterator. - */ -#ifndef JSON_VALUE_USE_INTERNAL_MAP - explicit ValueIterator( const Value::ObjectValues::iterator ¤t ); -#else - ValueIterator( const ValueInternalArray::IteratorState &state ); - ValueIterator( const ValueInternalMap::IteratorState &state ); -#endif - public: - - SelfType &operator =( const SelfType &other ); - - SelfType operator++( int ) - { - SelfType temp( *this ); - ++*this; - return temp; - } - - SelfType operator--( int ) - { - SelfType temp( *this ); - --*this; - return temp; - } - - SelfType &operator--() - { - decrement(); - return *this; - } - - SelfType &operator++() - { - increment(); - return *this; - } - - reference operator *() const - { - return deref(); - } - }; - - -} // namespace Json - - -#endif // CPPTL_JSON_H_INCLUDED diff --git a/cordova-lib/spec-plugman/plugins/cordova.echo/src/blackberry10/native/public/json/writer.h b/cordova-lib/spec-plugman/plugins/cordova.echo/src/blackberry10/native/public/json/writer.h deleted file mode 100644 index 16cf022b2..000000000 --- a/cordova-lib/spec-plugman/plugins/cordova.echo/src/blackberry10/native/public/json/writer.h +++ /dev/null @@ -1,174 +0,0 @@ -#ifndef JSON_WRITER_H_INCLUDED -# define JSON_WRITER_H_INCLUDED - -# include "value.h" -# include -# include -# include - -namespace Json { - - class Value; - - /** \brief Abstract class for writers. - */ - class JSON_API Writer - { - public: - virtual ~Writer(); - - virtual std::string write( const Value &root ) = 0; - }; - - /** \brief Outputs a Value in JSON format without formatting (not human friendly). - * - * The JSON document is written in a single line. It is not intended for 'human' consumption, - * but may be useful to support feature such as RPC where bandwidth is limited. - * \sa Reader, Value - */ - class JSON_API FastWriter : public Writer - { - public: - FastWriter(); - virtual ~FastWriter(){} - - void enableYAMLCompatibility(); - - public: // overridden from Writer - virtual std::string write( const Value &root ); - - private: - void writeValue( const Value &value ); - - std::string document_; - bool yamlCompatibilityEnabled_; - }; - - /** \brief Writes a Value in JSON format in a human friendly way. - * - * The rules for line break and indent are as follow: - * - Object value: - * - if empty then print {} without indent and line break - * - if not empty the print '{', line break & indent, print one value per line - * and then unindent and line break and print '}'. - * - Array value: - * - if empty then print [] without indent and line break - * - if the array contains no object value, empty array or some other value types, - * and all the values fit on one lines, then print the array on a single line. - * - otherwise, it the values do not fit on one line, or the array contains - * object or non empty array, then print one value per line. - * - * If the Value have comments then they are outputed according to their #CommentPlacement. - * - * \sa Reader, Value, Value::setComment() - */ - class JSON_API StyledWriter: public Writer - { - public: - StyledWriter(); - virtual ~StyledWriter(){} - - public: // overridden from Writer - /** \brief Serialize a Value in JSON format. - * \param root Value to serialize. - * \return String containing the JSON document that represents the root value. - */ - virtual std::string write( const Value &root ); - - private: - void writeValue( const Value &value ); - void writeArrayValue( const Value &value ); - bool isMultineArray( const Value &value ); - void pushValue( const std::string &value ); - void writeIndent(); - void writeWithIndent( const std::string &value ); - void indent(); - void unindent(); - void writeCommentBeforeValue( const Value &root ); - void writeCommentAfterValueOnSameLine( const Value &root ); - bool hasCommentForValue( const Value &value ); - static std::string normalizeEOL( const std::string &text ); - - typedef std::vector ChildValues; - - ChildValues childValues_; - std::string document_; - std::string indentString_; - int rightMargin_; - int indentSize_; - bool addChildValues_; - }; - - /** \brief Writes a Value in JSON format in a human friendly way, - to a stream rather than to a string. - * - * The rules for line break and indent are as follow: - * - Object value: - * - if empty then print {} without indent and line break - * - if not empty the print '{', line break & indent, print one value per line - * and then unindent and line break and print '}'. - * - Array value: - * - if empty then print [] without indent and line break - * - if the array contains no object value, empty array or some other value types, - * and all the values fit on one lines, then print the array on a single line. - * - otherwise, it the values do not fit on one line, or the array contains - * object or non empty array, then print one value per line. - * - * If the Value have comments then they are outputed according to their #CommentPlacement. - * - * \param indentation Each level will be indented by this amount extra. - * \sa Reader, Value, Value::setComment() - */ - class JSON_API StyledStreamWriter - { - public: - StyledStreamWriter( std::string indentation="\t" ); - ~StyledStreamWriter(){} - - public: - /** \brief Serialize a Value in JSON format. - * \param out Stream to write to. (Can be ostringstream, e.g.) - * \param root Value to serialize. - * \note There is no point in deriving from Writer, since write() should not return a value. - */ - void write( std::ostream &out, const Value &root ); - - private: - void writeValue( const Value &value ); - void writeArrayValue( const Value &value ); - bool isMultineArray( const Value &value ); - void pushValue( const std::string &value ); - void writeIndent(); - void writeWithIndent( const std::string &value ); - void indent(); - void unindent(); - void writeCommentBeforeValue( const Value &root ); - void writeCommentAfterValueOnSameLine( const Value &root ); - bool hasCommentForValue( const Value &value ); - static std::string normalizeEOL( const std::string &text ); - - typedef std::vector ChildValues; - - ChildValues childValues_; - std::ostream* document_; - std::string indentString_; - int rightMargin_; - std::string indentation_; - bool addChildValues_; - }; - - std::string JSON_API valueToString( Int value ); - std::string JSON_API valueToString( UInt value ); - std::string JSON_API valueToString( double value ); - std::string JSON_API valueToString( bool value ); - std::string JSON_API valueToQuotedString( const char *value ); - - /// \brief Output using the StyledStreamWriter. - /// \see Json::operator>>() - std::ostream& operator<<( std::ostream&, const Value &root ); - -} // namespace Json - - - -#endif // JSON_WRITER_H_INCLUDED diff --git a/cordova-lib/spec-plugman/plugins/cordova.echo/src/blackberry10/native/public/json_batchallocator.h b/cordova-lib/spec-plugman/plugins/cordova.echo/src/blackberry10/native/public/json_batchallocator.h deleted file mode 100644 index 141ca77a2..000000000 --- a/cordova-lib/spec-plugman/plugins/cordova.echo/src/blackberry10/native/public/json_batchallocator.h +++ /dev/null @@ -1,125 +0,0 @@ -#ifndef JSONCPP_BATCHALLOCATOR_H_INCLUDED -# define JSONCPP_BATCHALLOCATOR_H_INCLUDED - -# include -# include - -# ifndef JSONCPP_DOC_EXCLUDE_IMPLEMENTATION - -namespace Json { - -/* Fast memory allocator. - * - * This memory allocator allocates memory for a batch of object (specified by - * the page size, the number of object in each page). - * - * It does not allow the destruction of a single object. All the allocated objects - * can be destroyed at once. The memory can be either released or reused for future - * allocation. - * - * The in-place new operator must be used to construct the object using the pointer - * returned by allocate. - */ -template -class BatchAllocator -{ -public: - typedef AllocatedType Type; - - BatchAllocator( unsigned int objectsPerPage = 255 ) - : freeHead_( 0 ) - , objectsPerPage_( objectsPerPage ) - { -// printf( "Size: %d => %s\n", sizeof(AllocatedType), typeid(AllocatedType).name() ); - assert( sizeof(AllocatedType) * objectPerAllocation >= sizeof(AllocatedType *) ); // We must be able to store a slist in the object free space. - assert( objectsPerPage >= 16 ); - batches_ = allocateBatch( 0 ); // allocated a dummy page - currentBatch_ = batches_; - } - - ~BatchAllocator() - { - for ( BatchInfo *batch = batches_; batch; ) - { - BatchInfo *nextBatch = batch->next_; - free( batch ); - batch = nextBatch; - } - } - - /// allocate space for an array of objectPerAllocation object. - /// @warning it is the responsibility of the caller to call objects constructors. - AllocatedType *allocate() - { - if ( freeHead_ ) // returns node from free list. - { - AllocatedType *object = freeHead_; - freeHead_ = *(AllocatedType **)object; - return object; - } - if ( currentBatch_->used_ == currentBatch_->end_ ) - { - currentBatch_ = currentBatch_->next_; - while ( currentBatch_ && currentBatch_->used_ == currentBatch_->end_ ) - currentBatch_ = currentBatch_->next_; - - if ( !currentBatch_ ) // no free batch found, allocate a new one - { - currentBatch_ = allocateBatch( objectsPerPage_ ); - currentBatch_->next_ = batches_; // insert at the head of the list - batches_ = currentBatch_; - } - } - AllocatedType *allocated = currentBatch_->used_; - currentBatch_->used_ += objectPerAllocation; - return allocated; - } - - /// Release the object. - /// @warning it is the responsibility of the caller to actually destruct the object. - void release( AllocatedType *object ) - { - assert( object != 0 ); - *(AllocatedType **)object = freeHead_; - freeHead_ = object; - } - -private: - struct BatchInfo - { - BatchInfo *next_; - AllocatedType *used_; - AllocatedType *end_; - AllocatedType buffer_[objectPerAllocation]; - }; - - // disabled copy constructor and assignment operator. - BatchAllocator( const BatchAllocator & ); - void operator =( const BatchAllocator &); - - static BatchInfo *allocateBatch( unsigned int objectsPerPage ) - { - const unsigned int mallocSize = sizeof(BatchInfo) - sizeof(AllocatedType)* objectPerAllocation - + sizeof(AllocatedType) * objectPerAllocation * objectsPerPage; - BatchInfo *batch = static_cast( malloc( mallocSize ) ); - batch->next_ = 0; - batch->used_ = batch->buffer_; - batch->end_ = batch->buffer_ + objectsPerPage; - return batch; - } - - BatchInfo *batches_; - BatchInfo *currentBatch_; - /// Head of a single linked list within the allocated space of freed object - AllocatedType *freeHead_; - unsigned int objectsPerPage_; -}; - - -} // namespace Json - -# endif // ifndef JSONCPP_DOC_INCLUDE_IMPLEMENTATION - -#endif // JSONCPP_BATCHALLOCATOR_H_INCLUDED - diff --git a/cordova-lib/spec-plugman/plugins/cordova.echo/src/blackberry10/native/public/json_internalarray.inl b/cordova-lib/spec-plugman/plugins/cordova.echo/src/blackberry10/native/public/json_internalarray.inl deleted file mode 100644 index 9b985d258..000000000 --- a/cordova-lib/spec-plugman/plugins/cordova.echo/src/blackberry10/native/public/json_internalarray.inl +++ /dev/null @@ -1,448 +0,0 @@ -// included by json_value.cpp -// everything is within Json namespace - -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// -// class ValueInternalArray -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// - -ValueArrayAllocator::~ValueArrayAllocator() -{ -} - -// ////////////////////////////////////////////////////////////////// -// class DefaultValueArrayAllocator -// ////////////////////////////////////////////////////////////////// -#ifdef JSON_USE_SIMPLE_INTERNAL_ALLOCATOR -class DefaultValueArrayAllocator : public ValueArrayAllocator -{ -public: // overridden from ValueArrayAllocator - virtual ~DefaultValueArrayAllocator() - { - } - - virtual ValueInternalArray *newArray() - { - return new ValueInternalArray(); - } - - virtual ValueInternalArray *newArrayCopy( const ValueInternalArray &other ) - { - return new ValueInternalArray( other ); - } - - virtual void destructArray( ValueInternalArray *array ) - { - delete array; - } - - virtual void reallocateArrayPageIndex( Value **&indexes, - ValueInternalArray::PageIndex &indexCount, - ValueInternalArray::PageIndex minNewIndexCount ) - { - ValueInternalArray::PageIndex newIndexCount = (indexCount*3)/2 + 1; - if ( minNewIndexCount > newIndexCount ) - newIndexCount = minNewIndexCount; - void *newIndexes = realloc( indexes, sizeof(Value*) * newIndexCount ); - if ( !newIndexes ) - throw std::bad_alloc(); - indexCount = newIndexCount; - indexes = static_cast( newIndexes ); - } - virtual void releaseArrayPageIndex( Value **indexes, - ValueInternalArray::PageIndex indexCount ) - { - if ( indexes ) - free( indexes ); - } - - virtual Value *allocateArrayPage() - { - return static_cast( malloc( sizeof(Value) * ValueInternalArray::itemsPerPage ) ); - } - - virtual void releaseArrayPage( Value *value ) - { - if ( value ) - free( value ); - } -}; - -#else // #ifdef JSON_USE_SIMPLE_INTERNAL_ALLOCATOR -/// @todo make this thread-safe (lock when accessign batch allocator) -class DefaultValueArrayAllocator : public ValueArrayAllocator -{ -public: // overridden from ValueArrayAllocator - virtual ~DefaultValueArrayAllocator() - { - } - - virtual ValueInternalArray *newArray() - { - ValueInternalArray *array = arraysAllocator_.allocate(); - new (array) ValueInternalArray(); // placement new - return array; - } - - virtual ValueInternalArray *newArrayCopy( const ValueInternalArray &other ) - { - ValueInternalArray *array = arraysAllocator_.allocate(); - new (array) ValueInternalArray( other ); // placement new - return array; - } - - virtual void destructArray( ValueInternalArray *array ) - { - if ( array ) - { - array->~ValueInternalArray(); - arraysAllocator_.release( array ); - } - } - - virtual void reallocateArrayPageIndex( Value **&indexes, - ValueInternalArray::PageIndex &indexCount, - ValueInternalArray::PageIndex minNewIndexCount ) - { - ValueInternalArray::PageIndex newIndexCount = (indexCount*3)/2 + 1; - if ( minNewIndexCount > newIndexCount ) - newIndexCount = minNewIndexCount; - void *newIndexes = realloc( indexes, sizeof(Value*) * newIndexCount ); - if ( !newIndexes ) - throw std::bad_alloc(); - indexCount = newIndexCount; - indexes = static_cast( newIndexes ); - } - virtual void releaseArrayPageIndex( Value **indexes, - ValueInternalArray::PageIndex indexCount ) - { - if ( indexes ) - free( indexes ); - } - - virtual Value *allocateArrayPage() - { - return static_cast( pagesAllocator_.allocate() ); - } - - virtual void releaseArrayPage( Value *value ) - { - if ( value ) - pagesAllocator_.release( value ); - } -private: - BatchAllocator arraysAllocator_; - BatchAllocator pagesAllocator_; -}; -#endif // #ifdef JSON_USE_SIMPLE_INTERNAL_ALLOCATOR - -static ValueArrayAllocator *&arrayAllocator() -{ - static DefaultValueArrayAllocator defaultAllocator; - static ValueArrayAllocator *arrayAllocator = &defaultAllocator; - return arrayAllocator; -} - -static struct DummyArrayAllocatorInitializer { - DummyArrayAllocatorInitializer() - { - arrayAllocator(); // ensure arrayAllocator() statics are initialized before main(). - } -} dummyArrayAllocatorInitializer; - -// ////////////////////////////////////////////////////////////////// -// class ValueInternalArray -// ////////////////////////////////////////////////////////////////// -bool -ValueInternalArray::equals( const IteratorState &x, - const IteratorState &other ) -{ - return x.array_ == other.array_ - && x.currentItemIndex_ == other.currentItemIndex_ - && x.currentPageIndex_ == other.currentPageIndex_; -} - - -void -ValueInternalArray::increment( IteratorState &it ) -{ - JSON_ASSERT_MESSAGE( it.array_ && - (it.currentPageIndex_ - it.array_->pages_)*itemsPerPage + it.currentItemIndex_ - != it.array_->size_, - "ValueInternalArray::increment(): moving iterator beyond end" ); - ++(it.currentItemIndex_); - if ( it.currentItemIndex_ == itemsPerPage ) - { - it.currentItemIndex_ = 0; - ++(it.currentPageIndex_); - } -} - - -void -ValueInternalArray::decrement( IteratorState &it ) -{ - JSON_ASSERT_MESSAGE( it.array_ && it.currentPageIndex_ == it.array_->pages_ - && it.currentItemIndex_ == 0, - "ValueInternalArray::decrement(): moving iterator beyond end" ); - if ( it.currentItemIndex_ == 0 ) - { - it.currentItemIndex_ = itemsPerPage-1; - --(it.currentPageIndex_); - } - else - { - --(it.currentItemIndex_); - } -} - - -Value & -ValueInternalArray::unsafeDereference( const IteratorState &it ) -{ - return (*(it.currentPageIndex_))[it.currentItemIndex_]; -} - - -Value & -ValueInternalArray::dereference( const IteratorState &it ) -{ - JSON_ASSERT_MESSAGE( it.array_ && - (it.currentPageIndex_ - it.array_->pages_)*itemsPerPage + it.currentItemIndex_ - < it.array_->size_, - "ValueInternalArray::dereference(): dereferencing invalid iterator" ); - return unsafeDereference( it ); -} - -void -ValueInternalArray::makeBeginIterator( IteratorState &it ) const -{ - it.array_ = const_cast( this ); - it.currentItemIndex_ = 0; - it.currentPageIndex_ = pages_; -} - - -void -ValueInternalArray::makeIterator( IteratorState &it, ArrayIndex index ) const -{ - it.array_ = const_cast( this ); - it.currentItemIndex_ = index % itemsPerPage; - it.currentPageIndex_ = pages_ + index / itemsPerPage; -} - - -void -ValueInternalArray::makeEndIterator( IteratorState &it ) const -{ - makeIterator( it, size_ ); -} - - -ValueInternalArray::ValueInternalArray() - : pages_( 0 ) - , size_( 0 ) - , pageCount_( 0 ) -{ -} - - -ValueInternalArray::ValueInternalArray( const ValueInternalArray &other ) - : pages_( 0 ) - , pageCount_( 0 ) - , size_( other.size_ ) -{ - PageIndex minNewPages = other.size_ / itemsPerPage; - arrayAllocator()->reallocateArrayPageIndex( pages_, pageCount_, minNewPages ); - JSON_ASSERT_MESSAGE( pageCount_ >= minNewPages, - "ValueInternalArray::reserve(): bad reallocation" ); - IteratorState itOther; - other.makeBeginIterator( itOther ); - Value *value; - for ( ArrayIndex index = 0; index < size_; ++index, increment(itOther) ) - { - if ( index % itemsPerPage == 0 ) - { - PageIndex pageIndex = index / itemsPerPage; - value = arrayAllocator()->allocateArrayPage(); - pages_[pageIndex] = value; - } - new (value) Value( dereference( itOther ) ); - } -} - - -ValueInternalArray & -ValueInternalArray::operator =( const ValueInternalArray &other ) -{ - ValueInternalArray temp( other ); - swap( temp ); - return *this; -} - - -ValueInternalArray::~ValueInternalArray() -{ - // destroy all constructed items - IteratorState it; - IteratorState itEnd; - makeBeginIterator( it); - makeEndIterator( itEnd ); - for ( ; !equals(it,itEnd); increment(it) ) - { - Value *value = &dereference(it); - value->~Value(); - } - // release all pages - PageIndex lastPageIndex = size_ / itemsPerPage; - for ( PageIndex pageIndex = 0; pageIndex < lastPageIndex; ++pageIndex ) - arrayAllocator()->releaseArrayPage( pages_[pageIndex] ); - // release pages index - arrayAllocator()->releaseArrayPageIndex( pages_, pageCount_ ); -} - - -void -ValueInternalArray::swap( ValueInternalArray &other ) -{ - Value **tempPages = pages_; - pages_ = other.pages_; - other.pages_ = tempPages; - ArrayIndex tempSize = size_; - size_ = other.size_; - other.size_ = tempSize; - PageIndex tempPageCount = pageCount_; - pageCount_ = other.pageCount_; - other.pageCount_ = tempPageCount; -} - -void -ValueInternalArray::clear() -{ - ValueInternalArray dummy; - swap( dummy ); -} - - -void -ValueInternalArray::resize( ArrayIndex newSize ) -{ - if ( newSize == 0 ) - clear(); - else if ( newSize < size_ ) - { - IteratorState it; - IteratorState itEnd; - makeIterator( it, newSize ); - makeIterator( itEnd, size_ ); - for ( ; !equals(it,itEnd); increment(it) ) - { - Value *value = &dereference(it); - value->~Value(); - } - PageIndex pageIndex = (newSize + itemsPerPage - 1) / itemsPerPage; - PageIndex lastPageIndex = size_ / itemsPerPage; - for ( ; pageIndex < lastPageIndex; ++pageIndex ) - arrayAllocator()->releaseArrayPage( pages_[pageIndex] ); - size_ = newSize; - } - else if ( newSize > size_ ) - resolveReference( newSize ); -} - - -void -ValueInternalArray::makeIndexValid( ArrayIndex index ) -{ - // Need to enlarge page index ? - if ( index >= pageCount_ * itemsPerPage ) - { - PageIndex minNewPages = (index + 1) / itemsPerPage; - arrayAllocator()->reallocateArrayPageIndex( pages_, pageCount_, minNewPages ); - JSON_ASSERT_MESSAGE( pageCount_ >= minNewPages, "ValueInternalArray::reserve(): bad reallocation" ); - } - - // Need to allocate new pages ? - ArrayIndex nextPageIndex = - (size_ % itemsPerPage) != 0 ? size_ - (size_%itemsPerPage) + itemsPerPage - : size_; - if ( nextPageIndex <= index ) - { - PageIndex pageIndex = nextPageIndex / itemsPerPage; - PageIndex pageToAllocate = (index - nextPageIndex) / itemsPerPage + 1; - for ( ; pageToAllocate-- > 0; ++pageIndex ) - pages_[pageIndex] = arrayAllocator()->allocateArrayPage(); - } - - // Initialize all new entries - IteratorState it; - IteratorState itEnd; - makeIterator( it, size_ ); - size_ = index + 1; - makeIterator( itEnd, size_ ); - for ( ; !equals(it,itEnd); increment(it) ) - { - Value *value = &dereference(it); - new (value) Value(); // Construct a default value using placement new - } -} - -Value & -ValueInternalArray::resolveReference( ArrayIndex index ) -{ - if ( index >= size_ ) - makeIndexValid( index ); - return pages_[index/itemsPerPage][index%itemsPerPage]; -} - -Value * -ValueInternalArray::find( ArrayIndex index ) const -{ - if ( index >= size_ ) - return 0; - return &(pages_[index/itemsPerPage][index%itemsPerPage]); -} - -ValueInternalArray::ArrayIndex -ValueInternalArray::size() const -{ - return size_; -} - -int -ValueInternalArray::distance( const IteratorState &x, const IteratorState &y ) -{ - return indexOf(y) - indexOf(x); -} - - -ValueInternalArray::ArrayIndex -ValueInternalArray::indexOf( const IteratorState &iterator ) -{ - if ( !iterator.array_ ) - return ArrayIndex(-1); - return ArrayIndex( - (iterator.currentPageIndex_ - iterator.array_->pages_) * itemsPerPage - + iterator.currentItemIndex_ ); -} - - -int -ValueInternalArray::compare( const ValueInternalArray &other ) const -{ - int sizeDiff( size_ - other.size_ ); - if ( sizeDiff != 0 ) - return sizeDiff; - - for ( ArrayIndex index =0; index < size_; ++index ) - { - int diff = pages_[index/itemsPerPage][index%itemsPerPage].compare( - other.pages_[index/itemsPerPage][index%itemsPerPage] ); - if ( diff != 0 ) - return diff; - } - return 0; -} diff --git a/cordova-lib/spec-plugman/plugins/cordova.echo/src/blackberry10/native/public/json_internalmap.inl b/cordova-lib/spec-plugman/plugins/cordova.echo/src/blackberry10/native/public/json_internalmap.inl deleted file mode 100644 index ef37991c8..000000000 --- a/cordova-lib/spec-plugman/plugins/cordova.echo/src/blackberry10/native/public/json_internalmap.inl +++ /dev/null @@ -1,607 +0,0 @@ -// included by json_value.cpp -// everything is within Json namespace - -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// -// class ValueInternalMap -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// - -/** \internal MUST be safely initialized using memset( this, 0, sizeof(ValueInternalLink) ); - * This optimization is used by the fast allocator. - */ -ValueInternalLink::ValueInternalLink() - : previous_( 0 ) - , next_( 0 ) -{ -} - -ValueInternalLink::~ValueInternalLink() -{ - for ( int index =0; index < itemPerLink; ++index ) - { - if ( !items_[index].isItemAvailable() ) - { - if ( !items_[index].isMemberNameStatic() ) - free( keys_[index] ); - } - else - break; - } -} - - - -ValueMapAllocator::~ValueMapAllocator() -{ -} - -#ifdef JSON_USE_SIMPLE_INTERNAL_ALLOCATOR -class DefaultValueMapAllocator : public ValueMapAllocator -{ -public: // overridden from ValueMapAllocator - virtual ValueInternalMap *newMap() - { - return new ValueInternalMap(); - } - - virtual ValueInternalMap *newMapCopy( const ValueInternalMap &other ) - { - return new ValueInternalMap( other ); - } - - virtual void destructMap( ValueInternalMap *map ) - { - delete map; - } - - virtual ValueInternalLink *allocateMapBuckets( unsigned int size ) - { - return new ValueInternalLink[size]; - } - - virtual void releaseMapBuckets( ValueInternalLink *links ) - { - delete [] links; - } - - virtual ValueInternalLink *allocateMapLink() - { - return new ValueInternalLink(); - } - - virtual void releaseMapLink( ValueInternalLink *link ) - { - delete link; - } -}; -#else -/// @todo make this thread-safe (lock when accessign batch allocator) -class DefaultValueMapAllocator : public ValueMapAllocator -{ -public: // overridden from ValueMapAllocator - virtual ValueInternalMap *newMap() - { - ValueInternalMap *map = mapsAllocator_.allocate(); - new (map) ValueInternalMap(); // placement new - return map; - } - - virtual ValueInternalMap *newMapCopy( const ValueInternalMap &other ) - { - ValueInternalMap *map = mapsAllocator_.allocate(); - new (map) ValueInternalMap( other ); // placement new - return map; - } - - virtual void destructMap( ValueInternalMap *map ) - { - if ( map ) - { - map->~ValueInternalMap(); - mapsAllocator_.release( map ); - } - } - - virtual ValueInternalLink *allocateMapBuckets( unsigned int size ) - { - return new ValueInternalLink[size]; - } - - virtual void releaseMapBuckets( ValueInternalLink *links ) - { - delete [] links; - } - - virtual ValueInternalLink *allocateMapLink() - { - ValueInternalLink *link = linksAllocator_.allocate(); - memset( link, 0, sizeof(ValueInternalLink) ); - return link; - } - - virtual void releaseMapLink( ValueInternalLink *link ) - { - link->~ValueInternalLink(); - linksAllocator_.release( link ); - } -private: - BatchAllocator mapsAllocator_; - BatchAllocator linksAllocator_; -}; -#endif - -static ValueMapAllocator *&mapAllocator() -{ - static DefaultValueMapAllocator defaultAllocator; - static ValueMapAllocator *mapAllocator = &defaultAllocator; - return mapAllocator; -} - -static struct DummyMapAllocatorInitializer { - DummyMapAllocatorInitializer() - { - mapAllocator(); // ensure mapAllocator() statics are initialized before main(). - } -} dummyMapAllocatorInitializer; - - - -// h(K) = value * K >> w ; with w = 32 & K prime w.r.t. 2^32. - -/* -use linked list hash map. -buckets array is a container. -linked list element contains 6 key/values. (memory = (16+4) * 6 + 4 = 124) -value have extra state: valid, available, deleted -*/ - - -ValueInternalMap::ValueInternalMap() - : buckets_( 0 ) - , tailLink_( 0 ) - , bucketsSize_( 0 ) - , itemCount_( 0 ) -{ -} - - -ValueInternalMap::ValueInternalMap( const ValueInternalMap &other ) - : buckets_( 0 ) - , tailLink_( 0 ) - , bucketsSize_( 0 ) - , itemCount_( 0 ) -{ - reserve( other.itemCount_ ); - IteratorState it; - IteratorState itEnd; - other.makeBeginIterator( it ); - other.makeEndIterator( itEnd ); - for ( ; !equals(it,itEnd); increment(it) ) - { - bool isStatic; - const char *memberName = key( it, isStatic ); - const Value &aValue = value( it ); - resolveReference(memberName, isStatic) = aValue; - } -} - - -ValueInternalMap & -ValueInternalMap::operator =( const ValueInternalMap &other ) -{ - ValueInternalMap dummy( other ); - swap( dummy ); - return *this; -} - - -ValueInternalMap::~ValueInternalMap() -{ - if ( buckets_ ) - { - for ( BucketIndex bucketIndex =0; bucketIndex < bucketsSize_; ++bucketIndex ) - { - ValueInternalLink *link = buckets_[bucketIndex].next_; - while ( link ) - { - ValueInternalLink *linkToRelease = link; - link = link->next_; - mapAllocator()->releaseMapLink( linkToRelease ); - } - } - mapAllocator()->releaseMapBuckets( buckets_ ); - } -} - - -void -ValueInternalMap::swap( ValueInternalMap &other ) -{ - ValueInternalLink *tempBuckets = buckets_; - buckets_ = other.buckets_; - other.buckets_ = tempBuckets; - ValueInternalLink *tempTailLink = tailLink_; - tailLink_ = other.tailLink_; - other.tailLink_ = tempTailLink; - BucketIndex tempBucketsSize = bucketsSize_; - bucketsSize_ = other.bucketsSize_; - other.bucketsSize_ = tempBucketsSize; - BucketIndex tempItemCount = itemCount_; - itemCount_ = other.itemCount_; - other.itemCount_ = tempItemCount; -} - - -void -ValueInternalMap::clear() -{ - ValueInternalMap dummy; - swap( dummy ); -} - - -ValueInternalMap::BucketIndex -ValueInternalMap::size() const -{ - return itemCount_; -} - -bool -ValueInternalMap::reserveDelta( BucketIndex growth ) -{ - return reserve( itemCount_ + growth ); -} - -bool -ValueInternalMap::reserve( BucketIndex newItemCount ) -{ - if ( !buckets_ && newItemCount > 0 ) - { - buckets_ = mapAllocator()->allocateMapBuckets( 1 ); - bucketsSize_ = 1; - tailLink_ = &buckets_[0]; - } -// BucketIndex idealBucketCount = (newItemCount + ValueInternalLink::itemPerLink) / ValueInternalLink::itemPerLink; - return true; -} - - -const Value * -ValueInternalMap::find( const char *key ) const -{ - if ( !bucketsSize_ ) - return 0; - HashKey hashedKey = hash( key ); - BucketIndex bucketIndex = hashedKey % bucketsSize_; - for ( const ValueInternalLink *current = &buckets_[bucketIndex]; - current != 0; - current = current->next_ ) - { - for ( BucketIndex index=0; index < ValueInternalLink::itemPerLink; ++index ) - { - if ( current->items_[index].isItemAvailable() ) - return 0; - if ( strcmp( key, current->keys_[index] ) == 0 ) - return ¤t->items_[index]; - } - } - return 0; -} - - -Value * -ValueInternalMap::find( const char *key ) -{ - const ValueInternalMap *constThis = this; - return const_cast( constThis->find( key ) ); -} - - -Value & -ValueInternalMap::resolveReference( const char *key, - bool isStatic ) -{ - HashKey hashedKey = hash( key ); - if ( bucketsSize_ ) - { - BucketIndex bucketIndex = hashedKey % bucketsSize_; - ValueInternalLink **previous = 0; - BucketIndex index; - for ( ValueInternalLink *current = &buckets_[bucketIndex]; - current != 0; - previous = ¤t->next_, current = current->next_ ) - { - for ( index=0; index < ValueInternalLink::itemPerLink; ++index ) - { - if ( current->items_[index].isItemAvailable() ) - return setNewItem( key, isStatic, current, index ); - if ( strcmp( key, current->keys_[index] ) == 0 ) - return current->items_[index]; - } - } - } - - reserveDelta( 1 ); - return unsafeAdd( key, isStatic, hashedKey ); -} - - -void -ValueInternalMap::remove( const char *key ) -{ - HashKey hashedKey = hash( key ); - if ( !bucketsSize_ ) - return; - BucketIndex bucketIndex = hashedKey % bucketsSize_; - for ( ValueInternalLink *link = &buckets_[bucketIndex]; - link != 0; - link = link->next_ ) - { - BucketIndex index; - for ( index =0; index < ValueInternalLink::itemPerLink; ++index ) - { - if ( link->items_[index].isItemAvailable() ) - return; - if ( strcmp( key, link->keys_[index] ) == 0 ) - { - doActualRemove( link, index, bucketIndex ); - return; - } - } - } -} - -void -ValueInternalMap::doActualRemove( ValueInternalLink *link, - BucketIndex index, - BucketIndex bucketIndex ) -{ - // find last item of the bucket and swap it with the 'removed' one. - // set removed items flags to 'available'. - // if last page only contains 'available' items, then deallocate it (it's empty) - ValueInternalLink *&lastLink = getLastLinkInBucket( index ); - BucketIndex lastItemIndex = 1; // a link can never be empty, so start at 1 - for ( ; - lastItemIndex < ValueInternalLink::itemPerLink; - ++lastItemIndex ) // may be optimized with dicotomic search - { - if ( lastLink->items_[lastItemIndex].isItemAvailable() ) - break; - } - - BucketIndex lastUsedIndex = lastItemIndex - 1; - Value *valueToDelete = &link->items_[index]; - Value *valueToPreserve = &lastLink->items_[lastUsedIndex]; - if ( valueToDelete != valueToPreserve ) - valueToDelete->swap( *valueToPreserve ); - if ( lastUsedIndex == 0 ) // page is now empty - { // remove it from bucket linked list and delete it. - ValueInternalLink *linkPreviousToLast = lastLink->previous_; - if ( linkPreviousToLast != 0 ) // can not deleted bucket link. - { - mapAllocator()->releaseMapLink( lastLink ); - linkPreviousToLast->next_ = 0; - lastLink = linkPreviousToLast; - } - } - else - { - Value dummy; - valueToPreserve->swap( dummy ); // restore deleted to default Value. - valueToPreserve->setItemUsed( false ); - } - --itemCount_; -} - - -ValueInternalLink *& -ValueInternalMap::getLastLinkInBucket( BucketIndex bucketIndex ) -{ - if ( bucketIndex == bucketsSize_ - 1 ) - return tailLink_; - ValueInternalLink *&previous = buckets_[bucketIndex+1].previous_; - if ( !previous ) - previous = &buckets_[bucketIndex]; - return previous; -} - - -Value & -ValueInternalMap::setNewItem( const char *key, - bool isStatic, - ValueInternalLink *link, - BucketIndex index ) -{ - char *duplicatedKey = valueAllocator()->makeMemberName( key ); - ++itemCount_; - link->keys_[index] = duplicatedKey; - link->items_[index].setItemUsed(); - link->items_[index].setMemberNameIsStatic( isStatic ); - return link->items_[index]; // items already default constructed. -} - - -Value & -ValueInternalMap::unsafeAdd( const char *key, - bool isStatic, - HashKey hashedKey ) -{ - JSON_ASSERT_MESSAGE( bucketsSize_ > 0, "ValueInternalMap::unsafeAdd(): internal logic error." ); - BucketIndex bucketIndex = hashedKey % bucketsSize_; - ValueInternalLink *&previousLink = getLastLinkInBucket( bucketIndex ); - ValueInternalLink *link = previousLink; - BucketIndex index; - for ( index =0; index < ValueInternalLink::itemPerLink; ++index ) - { - if ( link->items_[index].isItemAvailable() ) - break; - } - if ( index == ValueInternalLink::itemPerLink ) // need to add a new page - { - ValueInternalLink *newLink = mapAllocator()->allocateMapLink(); - index = 0; - link->next_ = newLink; - previousLink = newLink; - link = newLink; - } - return setNewItem( key, isStatic, link, index ); -} - - -ValueInternalMap::HashKey -ValueInternalMap::hash( const char *key ) const -{ - HashKey hash = 0; - while ( *key ) - hash += *key++ * 37; - return hash; -} - - -int -ValueInternalMap::compare( const ValueInternalMap &other ) const -{ - int sizeDiff( itemCount_ - other.itemCount_ ); - if ( sizeDiff != 0 ) - return sizeDiff; - // Strict order guaranty is required. Compare all keys FIRST, then compare values. - IteratorState it; - IteratorState itEnd; - makeBeginIterator( it ); - makeEndIterator( itEnd ); - for ( ; !equals(it,itEnd); increment(it) ) - { - if ( !other.find( key( it ) ) ) - return 1; - } - - // All keys are equals, let's compare values - makeBeginIterator( it ); - for ( ; !equals(it,itEnd); increment(it) ) - { - const Value *otherValue = other.find( key( it ) ); - int valueDiff = value(it).compare( *otherValue ); - if ( valueDiff != 0 ) - return valueDiff; - } - return 0; -} - - -void -ValueInternalMap::makeBeginIterator( IteratorState &it ) const -{ - it.map_ = const_cast( this ); - it.bucketIndex_ = 0; - it.itemIndex_ = 0; - it.link_ = buckets_; -} - - -void -ValueInternalMap::makeEndIterator( IteratorState &it ) const -{ - it.map_ = const_cast( this ); - it.bucketIndex_ = bucketsSize_; - it.itemIndex_ = 0; - it.link_ = 0; -} - - -bool -ValueInternalMap::equals( const IteratorState &x, const IteratorState &other ) -{ - return x.map_ == other.map_ - && x.bucketIndex_ == other.bucketIndex_ - && x.link_ == other.link_ - && x.itemIndex_ == other.itemIndex_; -} - - -void -ValueInternalMap::incrementBucket( IteratorState &iterator ) -{ - ++iterator.bucketIndex_; - JSON_ASSERT_MESSAGE( iterator.bucketIndex_ <= iterator.map_->bucketsSize_, - "ValueInternalMap::increment(): attempting to iterate beyond end." ); - if ( iterator.bucketIndex_ == iterator.map_->bucketsSize_ ) - iterator.link_ = 0; - else - iterator.link_ = &(iterator.map_->buckets_[iterator.bucketIndex_]); - iterator.itemIndex_ = 0; -} - - -void -ValueInternalMap::increment( IteratorState &iterator ) -{ - JSON_ASSERT_MESSAGE( iterator.map_, "Attempting to iterator using invalid iterator." ); - ++iterator.itemIndex_; - if ( iterator.itemIndex_ == ValueInternalLink::itemPerLink ) - { - JSON_ASSERT_MESSAGE( iterator.link_ != 0, - "ValueInternalMap::increment(): attempting to iterate beyond end." ); - iterator.link_ = iterator.link_->next_; - if ( iterator.link_ == 0 ) - incrementBucket( iterator ); - } - else if ( iterator.link_->items_[iterator.itemIndex_].isItemAvailable() ) - { - incrementBucket( iterator ); - } -} - - -void -ValueInternalMap::decrement( IteratorState &iterator ) -{ - if ( iterator.itemIndex_ == 0 ) - { - JSON_ASSERT_MESSAGE( iterator.map_, "Attempting to iterate using invalid iterator." ); - if ( iterator.link_ == &iterator.map_->buckets_[iterator.bucketIndex_] ) - { - JSON_ASSERT_MESSAGE( iterator.bucketIndex_ > 0, "Attempting to iterate beyond beginning." ); - --(iterator.bucketIndex_); - } - iterator.link_ = iterator.link_->previous_; - iterator.itemIndex_ = ValueInternalLink::itemPerLink - 1; - } -} - - -const char * -ValueInternalMap::key( const IteratorState &iterator ) -{ - JSON_ASSERT_MESSAGE( iterator.link_, "Attempting to iterate using invalid iterator." ); - return iterator.link_->keys_[iterator.itemIndex_]; -} - -const char * -ValueInternalMap::key( const IteratorState &iterator, bool &isStatic ) -{ - JSON_ASSERT_MESSAGE( iterator.link_, "Attempting to iterate using invalid iterator." ); - isStatic = iterator.link_->items_[iterator.itemIndex_].isMemberNameStatic(); - return iterator.link_->keys_[iterator.itemIndex_]; -} - - -Value & -ValueInternalMap::value( const IteratorState &iterator ) -{ - JSON_ASSERT_MESSAGE( iterator.link_, "Attempting to iterate using invalid iterator." ); - return iterator.link_->items_[iterator.itemIndex_]; -} - - -int -ValueInternalMap::distance( const IteratorState &x, const IteratorState &y ) -{ - int offset = 0; - IteratorState it = x; - while ( !equals( it, y ) ) - increment( it ); - return offset; -} diff --git a/cordova-lib/spec-plugman/plugins/cordova.echo/src/blackberry10/native/public/json_reader.cpp b/cordova-lib/spec-plugman/plugins/cordova.echo/src/blackberry10/native/public/json_reader.cpp deleted file mode 100644 index 750088c65..000000000 --- a/cordova-lib/spec-plugman/plugins/cordova.echo/src/blackberry10/native/public/json_reader.cpp +++ /dev/null @@ -1,894 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include - -#if _MSC_VER >= 1400 // VC++ 8.0 -#pragma warning( disable : 4996 ) // disable warning about strdup being deprecated. -#endif - -namespace Json { - -// QNX is strict about declaring C symbols in the std namespace. -#ifdef __QNXNTO__ -using std::memcpy; -using std::sprintf; -using std::sscanf; -#endif - -// Implementation of class Features -// //////////////////////////////// - -Features::Features() - : allowComments_( true ) - , strictRoot_( false ) -{ -} - - -Features -Features::all() -{ - return Features(); -} - - -Features -Features::strictMode() -{ - Features features; - features.allowComments_ = false; - features.strictRoot_ = true; - return features; -} - -// Implementation of class Reader -// //////////////////////////////// - - -static inline bool -in( Reader::Char c, Reader::Char c1, Reader::Char c2, Reader::Char c3, Reader::Char c4 ) -{ - return c == c1 || c == c2 || c == c3 || c == c4; -} - -static inline bool -in( Reader::Char c, Reader::Char c1, Reader::Char c2, Reader::Char c3, Reader::Char c4, Reader::Char c5 ) -{ - return c == c1 || c == c2 || c == c3 || c == c4 || c == c5; -} - - -static bool -containsNewLine( Reader::Location begin, - Reader::Location end ) -{ - for ( ;begin < end; ++begin ) - if ( *begin == '\n' || *begin == '\r' ) - return true; - return false; -} - -static std::string codePointToUTF8(unsigned int cp) -{ - std::string result; - - // based on description from http://en.wikipedia.org/wiki/UTF-8 - - if (cp <= 0x7f) - { - result.resize(1); - result[0] = static_cast(cp); - } - else if (cp <= 0x7FF) - { - result.resize(2); - result[1] = static_cast(0x80 | (0x3f & cp)); - result[0] = static_cast(0xC0 | (0x1f & (cp >> 6))); - } - else if (cp <= 0xFFFF) - { - result.resize(3); - result[2] = static_cast(0x80 | (0x3f & cp)); - result[1] = 0x80 | static_cast((0x3f & (cp >> 6))); - result[0] = 0xE0 | static_cast((0xf & (cp >> 12))); - } - else if (cp <= 0x10FFFF) - { - result.resize(4); - result[3] = static_cast(0x80 | (0x3f & cp)); - result[2] = static_cast(0x80 | (0x3f & (cp >> 6))); - result[1] = static_cast(0x80 | (0x3f & (cp >> 12))); - result[0] = static_cast(0xF0 | (0x7 & (cp >> 18))); - } - - return result; -} - - -// Class Reader -// ////////////////////////////////////////////////////////////////// - -Reader::Reader() - : features_( Features::all() ) -{ -} - - -Reader::Reader( const Features &features ) - : features_( features ) -{ -} - - -bool -Reader::parse( const std::string &document, - Value &root, - bool collectComments ) -{ - document_ = document; - const char *begin = document_.c_str(); - const char *end = begin + document_.length(); - return parse( begin, end, root, collectComments ); -} - - -bool -Reader::parse( std::istream& sin, - Value &root, - bool collectComments ) -{ - //std::istream_iterator begin(sin); - //std::istream_iterator end; - // Those would allow streamed input from a file, if parse() were a - // template function. - - // Since std::string is reference-counted, this at least does not - // create an extra copy. - std::string doc; - std::getline(sin, doc, (char)EOF); - return parse( doc, root, collectComments ); -} - -bool -Reader::parse( const char *beginDoc, const char *endDoc, - Value &root, - bool collectComments ) -{ - if ( !features_.allowComments_ ) - { - collectComments = false; - } - - begin_ = beginDoc; - end_ = endDoc; - collectComments_ = collectComments; - current_ = begin_; - lastValueEnd_ = 0; - lastValue_ = 0; - commentsBefore_ = ""; - errors_.clear(); - while ( !nodes_.empty() ) - nodes_.pop(); - nodes_.push( &root ); - - bool successful = readValue(); - Token token; - skipCommentTokens( token ); - if ( collectComments_ && !commentsBefore_.empty() ) - root.setComment( commentsBefore_, commentAfter ); - if ( features_.strictRoot_ ) - { - if ( !root.isArray() && !root.isObject() ) - { - // Set error location to start of doc, ideally should be first token found in doc - token.type_ = tokenError; - token.start_ = beginDoc; - token.end_ = endDoc; - addError( "A valid JSON document must be either an array or an object value.", - token ); - return false; - } - } - return successful; -} - - -bool -Reader::readValue() -{ - Token token; - skipCommentTokens( token ); - bool successful = true; - - if ( collectComments_ && !commentsBefore_.empty() ) - { - currentValue().setComment( commentsBefore_, commentBefore ); - commentsBefore_ = ""; - } - - - switch ( token.type_ ) - { - case tokenObjectBegin: - successful = readObject( token ); - break; - case tokenArrayBegin: - successful = readArray( token ); - break; - case tokenNumber: - successful = decodeNumber( token ); - break; - case tokenString: - successful = decodeString( token ); - break; - case tokenTrue: - currentValue() = true; - break; - case tokenFalse: - currentValue() = false; - break; - case tokenNull: - currentValue() = Value(); - break; - default: - return addError( "Syntax error: value, object or array expected.", token ); - } - - if ( collectComments_ ) - { - lastValueEnd_ = current_; - lastValue_ = ¤tValue(); - } - - return successful; -} - - -void -Reader::skipCommentTokens( Token &token ) -{ - if ( features_.allowComments_ ) - { - do - { - readToken( token ); - } - while ( token.type_ == tokenComment ); - } - else - { - readToken( token ); - } -} - - -bool -Reader::expectToken( TokenType type, Token &token, const char *message ) -{ - readToken( token ); - if ( token.type_ != type ) - return addError( message, token ); - return true; -} - - -bool -Reader::readToken( Token &token ) -{ - skipSpaces(); - token.start_ = current_; - Char c = getNextChar(); - bool ok = true; - switch ( c ) - { - case '{': - token.type_ = tokenObjectBegin; - break; - case '}': - token.type_ = tokenObjectEnd; - break; - case '[': - token.type_ = tokenArrayBegin; - break; - case ']': - token.type_ = tokenArrayEnd; - break; - case '"': - token.type_ = tokenString; - ok = readString(); - break; - case '/': - token.type_ = tokenComment; - ok = readComment(); - break; - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - case '-': - token.type_ = tokenNumber; - readNumber(); - break; - case 't': - token.type_ = tokenTrue; - ok = match( "rue", 3 ); - break; - case 'f': - token.type_ = tokenFalse; - ok = match( "alse", 4 ); - break; - case 'n': - token.type_ = tokenNull; - ok = match( "ull", 3 ); - break; - case ',': - token.type_ = tokenArraySeparator; - break; - case ':': - token.type_ = tokenMemberSeparator; - break; - case 0: - token.type_ = tokenEndOfStream; - break; - default: - ok = false; - break; - } - if ( !ok ) - token.type_ = tokenError; - token.end_ = current_; - return true; -} - - -void -Reader::skipSpaces() -{ - while ( current_ != end_ ) - { - Char c = *current_; - if ( c == ' ' || c == '\t' || c == '\r' || c == '\n' ) - ++current_; - else - break; - } -} - - -bool -Reader::match( Location pattern, - int patternLength ) -{ - if ( end_ - current_ < patternLength ) - return false; - int index = patternLength; - while ( index-- ) - if ( current_[index] != pattern[index] ) - return false; - current_ += patternLength; - return true; -} - - -bool -Reader::readComment() -{ - Location commentBegin = current_ - 1; - Char c = getNextChar(); - bool successful = false; - if ( c == '*' ) - successful = readCStyleComment(); - else if ( c == '/' ) - successful = readCppStyleComment(); - if ( !successful ) - return false; - - if ( collectComments_ ) - { - CommentPlacement placement = commentBefore; - if ( lastValueEnd_ && !containsNewLine( lastValueEnd_, commentBegin ) ) - { - if ( c != '*' || !containsNewLine( commentBegin, current_ ) ) - placement = commentAfterOnSameLine; - } - - addComment( commentBegin, current_, placement ); - } - return true; -} - - -void -Reader::addComment( Location begin, - Location end, - CommentPlacement placement ) -{ - assert( collectComments_ ); - if ( placement == commentAfterOnSameLine ) - { - assert( lastValue_ != 0 ); - lastValue_->setComment( std::string( begin, end ), placement ); - } - else - { - if ( !commentsBefore_.empty() ) - commentsBefore_ += "\n"; - commentsBefore_ += std::string( begin, end ); - } -} - - -bool -Reader::readCStyleComment() -{ - while ( current_ != end_ ) - { - Char c = getNextChar(); - if ( c == '*' && *current_ == '/' ) - break; - } - return getNextChar() == '/'; -} - - -bool -Reader::readCppStyleComment() -{ - while ( current_ != end_ ) - { - Char c = getNextChar(); - if ( c == '\r' || c == '\n' ) - break; - } - return true; -} - - -void -Reader::readNumber() -{ - while ( current_ != end_ ) - { - if ( !(*current_ >= '0' && *current_ <= '9') && - !in( *current_, '.', 'e', 'E', '+', '-' ) ) - break; - ++current_; - } -} - -bool -Reader::readString() -{ - Char c = 0; - while ( current_ != end_ ) - { - c = getNextChar(); - if ( c == '\\' ) - getNextChar(); - else if ( c == '"' ) - break; - } - return c == '"'; -} - - -bool -Reader::readObject( Token &tokenStart ) -{ - Token tokenName; - Token something = tokenStart; - std::string name; - currentValue() = Value( objectValue ); - while ( readToken( tokenName ) ) - { - bool initialTokenOk = true; - while ( tokenName.type_ == tokenComment && initialTokenOk ) - initialTokenOk = readToken( tokenName ); - if ( !initialTokenOk ) - break; - if ( tokenName.type_ == tokenObjectEnd && name.empty() ) // empty object - return true; - if ( tokenName.type_ != tokenString ) - break; - - name = ""; - if ( !decodeString( tokenName, name ) ) - return recoverFromError( tokenObjectEnd ); - - Token colon; - if ( !readToken( colon ) || colon.type_ != tokenMemberSeparator ) - { - return addErrorAndRecover( "Missing ':' after object member name", - colon, - tokenObjectEnd ); - } - Value &value = currentValue()[ name ]; - nodes_.push( &value ); - bool ok = readValue(); - nodes_.pop(); - if ( !ok ) // error already set - return recoverFromError( tokenObjectEnd ); - - Token comma; - if ( !readToken( comma ) - || ( comma.type_ != tokenObjectEnd && - comma.type_ != tokenArraySeparator && - comma.type_ != tokenComment ) ) - { - return addErrorAndRecover( "Missing ',' or '}' in object declaration", - comma, - tokenObjectEnd ); - } - bool finalizeTokenOk = true; - while ( comma.type_ == tokenComment && - finalizeTokenOk ) - finalizeTokenOk = readToken( comma ); - if ( comma.type_ == tokenObjectEnd ) - return true; - } - return addErrorAndRecover( "Missing '}' or object member name", - tokenName, - tokenObjectEnd ); -} - - -bool -Reader::readArray( Token &tokenStart ) -{ - Token something = tokenStart; - currentValue() = Value( arrayValue ); - skipSpaces(); - if ( *current_ == ']' ) // empty array - { - Token endArray; - readToken( endArray ); - return true; - } - int index = 0; - while ( true ) - { - Value &value = currentValue()[ index++ ]; - nodes_.push( &value ); - bool ok = readValue(); - nodes_.pop(); - if ( !ok ) // error already set - return recoverFromError( tokenArrayEnd ); - - Token token; - // Accept Comment after last item in the array. - ok = readToken( token ); - while ( token.type_ == tokenComment && ok ) - { - ok = readToken( token ); - } - bool badTokenType = ( token.type_ == tokenArraySeparator && - token.type_ == tokenArrayEnd ); - if ( !ok || badTokenType ) - { - return addErrorAndRecover( "Missing ',' or ']' in array declaration", - token, - tokenArrayEnd ); - } - if ( token.type_ == tokenArrayEnd ) - break; - } - return true; -} - - -bool -Reader::decodeNumber( Token &token ) -{ - bool isDouble = false; - for ( Location inspect = token.start_; inspect != token.end_; ++inspect ) - { - isDouble = isDouble - || in( *inspect, '.', 'e', 'E', '+' ) - || ( *inspect == '-' && inspect != token.start_ ); - } - if ( isDouble ) - return decodeDouble( token ); - Location current = token.start_; - bool isNegative = *current == '-'; - if ( isNegative ) - ++current; - Value::UInt threshold = (isNegative ? Value::UInt(-Value::minInt) - : Value::maxUInt) / 10; - Value::UInt value = 0; - while ( current < token.end_ ) - { - Char c = *current++; - if ( c < '0' || c > '9' ) - return addError( "'" + std::string( token.start_, token.end_ ) + "' is not a number.", token ); - if ( value >= threshold ) - return decodeDouble( token ); - value = value * 10 + Value::UInt(c - '0'); - } - if ( isNegative ) - currentValue() = -Value::Int( value ); - else if ( value <= Value::UInt(Value::maxInt) ) - currentValue() = Value::Int( value ); - else - currentValue() = value; - return true; -} - - -bool -Reader::decodeDouble( Token &token ) -{ - double value = 0; - const int bufferSize = 32; - int count; - int length = int(token.end_ - token.start_); - if ( length <= bufferSize ) - { - Char buffer[bufferSize]; - memcpy( buffer, token.start_, length ); - buffer[length] = 0; - count = sscanf( buffer, "%lf", &value ); - } - else - { - std::string buffer( token.start_, token.end_ ); - count = sscanf( buffer.c_str(), "%lf", &value ); - } - - if ( count != 1 ) - return addError( "'" + std::string( token.start_, token.end_ ) + "' is not a number.", token ); - currentValue() = value; - return true; -} - - -bool -Reader::decodeString( Token &token ) -{ - std::string decoded; - if ( !decodeString( token, decoded ) ) - return false; - currentValue() = decoded; - return true; -} - - -bool -Reader::decodeString( Token &token, std::string &decoded ) -{ - decoded.reserve( token.end_ - token.start_ - 2 ); - Location current = token.start_ + 1; // skip '"' - Location end = token.end_ - 1; // do not include '"' - while ( current != end ) - { - Char c = *current++; - if ( c == '"' ) - break; - else if ( c == '\\' ) - { - if ( current == end ) - return addError( "Empty escape sequence in string", token, current ); - Char escape = *current++; - switch ( escape ) - { - case '"': decoded += '"'; break; - case '/': decoded += '/'; break; - case '\\': decoded += '\\'; break; - case 'b': decoded += '\b'; break; - case 'f': decoded += '\f'; break; - case 'n': decoded += '\n'; break; - case 'r': decoded += '\r'; break; - case 't': decoded += '\t'; break; - case 'u': - { - unsigned int unicode; - if ( !decodeUnicodeCodePoint( token, current, end, unicode ) ) - return false; - decoded += codePointToUTF8(unicode); - } - break; - default: - return addError( "Bad escape sequence in string", token, current ); - } - } - else - { - decoded += c; - } - } - return true; -} - -bool -Reader::decodeUnicodeCodePoint( Token &token, - Location ¤t, - Location end, - unsigned int &unicode ) -{ - - if ( !decodeUnicodeEscapeSequence( token, current, end, unicode ) ) - return false; - if (unicode >= 0xD800 && unicode <= 0xDBFF) - { - // surrogate pairs - if (end - current < 6) - return addError( "additional six characters expected to parse unicode surrogate pair.", token, current ); - unsigned int surrogatePair; - if (*(current++) == '\\' && *(current++)== 'u') - { - if (decodeUnicodeEscapeSequence( token, current, end, surrogatePair )) - { - unicode = 0x10000 + ((unicode & 0x3FF) << 10) + (surrogatePair & 0x3FF); - } - else - return false; - } - else - return addError( "expecting another \\u token to begin the second half of a unicode surrogate pair", token, current ); - } - return true; -} - -bool -Reader::decodeUnicodeEscapeSequence( Token &token, - Location ¤t, - Location end, - unsigned int &unicode ) -{ - if ( end - current < 4 ) - return addError( "Bad unicode escape sequence in string: four digits expected.", token, current ); - unicode = 0; - for ( int index =0; index < 4; ++index ) - { - Char c = *current++; - unicode *= 16; - if ( c >= '0' && c <= '9' ) - unicode += c - '0'; - else if ( c >= 'a' && c <= 'f' ) - unicode += c - 'a' + 10; - else if ( c >= 'A' && c <= 'F' ) - unicode += c - 'A' + 10; - else - return addError( "Bad unicode escape sequence in string: hexadecimal digit expected.", token, current ); - } - return true; -} - - -bool -Reader::addError( const std::string &message, - Token &token, - Location extra ) -{ - ErrorInfo info; - info.token_ = token; - info.message_ = message; - info.extra_ = extra; - errors_.push_back( info ); - return false; -} - - -bool -Reader::recoverFromError( TokenType skipUntilToken ) -{ - int errorCount = int(errors_.size()); - Token skip; - while ( true ) - { - if ( !readToken(skip) ) - errors_.resize( errorCount ); // discard errors caused by recovery - if ( skip.type_ == skipUntilToken || skip.type_ == tokenEndOfStream ) - break; - } - errors_.resize( errorCount ); - return false; -} - - -bool -Reader::addErrorAndRecover( const std::string &message, - Token &token, - TokenType skipUntilToken ) -{ - addError( message, token ); - return recoverFromError( skipUntilToken ); -} - - -Value & -Reader::currentValue() -{ - return *(nodes_.top()); -} - - -Reader::Char -Reader::getNextChar() -{ - if ( current_ == end_ ) - return 0; - return *current_++; -} - - -void -Reader::getLocationLineAndColumn( Location location, - int &line, - int &column ) const -{ - Location current = begin_; - Location lastLineStart = current; - line = 0; - while ( current < location && current != end_ ) - { - Char c = *current++; - if ( c == '\r' ) - { - if ( *current == '\n' ) - ++current; - lastLineStart = current; - ++line; - } - else if ( c == '\n' ) - { - lastLineStart = current; - ++line; - } - } - // column & line start at 1 - column = int(location - lastLineStart) + 1; - ++line; -} - - -std::string -Reader::getLocationLineAndColumn( Location location ) const -{ - int line, column; - getLocationLineAndColumn( location, line, column ); - char buffer[18+16+16+1]; - sprintf( buffer, "Line %d, Column %d", line, column ); - return buffer; -} - - -std::string -Reader::getFormatedErrorMessages() const -{ - std::string formattedMessage; - for ( Errors::const_iterator itError = errors_.begin(); - itError != errors_.end(); - ++itError ) - { - const ErrorInfo &error = *itError; - formattedMessage += "* " + getLocationLineAndColumn( error.token_.start_ ) + "\n"; - formattedMessage += " " + error.message_ + "\n"; - if ( error.extra_ ) - formattedMessage += "See " + getLocationLineAndColumn( error.extra_ ) + " for detail.\n"; - } - return formattedMessage; -} - - -std::istream& operator>>( std::istream &sin, Value &root ) -{ - Json::Reader reader; - bool ok = reader.parse(sin, root, true); - //JSON_ASSERT( ok ); - if (!ok) throw std::runtime_error(reader.getFormatedErrorMessages()); - return sin; -} - - -} // namespace Json diff --git a/cordova-lib/spec-plugman/plugins/cordova.echo/src/blackberry10/native/public/json_value.cpp b/cordova-lib/spec-plugman/plugins/cordova.echo/src/blackberry10/native/public/json_value.cpp deleted file mode 100644 index 67638ca15..000000000 --- a/cordova-lib/spec-plugman/plugins/cordova.echo/src/blackberry10/native/public/json_value.cpp +++ /dev/null @@ -1,1726 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#ifdef JSON_USE_CPPTL -# include -#endif -#include // size_t -#ifndef JSON_USE_SIMPLE_INTERNAL_ALLOCATOR -# include "json_batchallocator.h" -#endif // #ifndef JSON_USE_SIMPLE_INTERNAL_ALLOCATOR - -#define JSON_ASSERT_UNREACHABLE assert( false ) -#define JSON_ASSERT( condition ) assert( condition ); // @todo <= change this into an exception throw -#define JSON_ASSERT_MESSAGE( condition, message ) if (!( condition )) throw std::runtime_error( message ); - -namespace Json { - -// QNX is strict about declaring C symbols in the std namespace. -#ifdef __QNXNTO__ -using std::memcpy; -using std::strchr; -using std::strcmp; -using std::strlen; -#endif - -const Value Value::null; -const Int Value::minInt = Int( ~(UInt(-1)/2) ); -const Int Value::maxInt = Int( UInt(-1)/2 ); -const UInt Value::maxUInt = UInt(-1); - -// A "safe" implementation of strdup. Allow null pointer to be passed. -// Also avoid warning on msvc80. -// -//inline char *safeStringDup( const char *czstring ) -//{ -// if ( czstring ) -// { -// const size_t length = (unsigned int)( strlen(czstring) + 1 ); -// char *newString = static_cast( malloc( length ) ); -// memcpy( newString, czstring, length ); -// return newString; -// } -// return 0; -//} -// -//inline char *safeStringDup( const std::string &str ) -//{ -// if ( !str.empty() ) -// { -// const size_t length = str.length(); -// char *newString = static_cast( malloc( length + 1 ) ); -// memcpy( newString, str.c_str(), length ); -// newString[length] = 0; -// return newString; -// } -// return 0; -//} - -ValueAllocator::~ValueAllocator() -{ -} - -class DefaultValueAllocator : public ValueAllocator -{ -public: - virtual ~DefaultValueAllocator() - { - } - - virtual char *makeMemberName( const char *memberName ) - { - return duplicateStringValue( memberName ); - } - - virtual void releaseMemberName( char *memberName ) - { - releaseStringValue( memberName ); - } - - virtual char *duplicateStringValue( const char *value, - unsigned int length = unknown ) - { - //@todo investigate this old optimization - //if ( !value || value[0] == 0 ) - // return 0; - - if ( length == unknown ) - length = (unsigned int)strlen(value); - char *newString = static_cast( malloc( length + 1 ) ); - memcpy( newString, value, length ); - newString[length] = 0; - return newString; - } - - virtual void releaseStringValue( char *value ) - { - if ( value ) - free( value ); - } -}; - -static ValueAllocator *&valueAllocator() -{ - static DefaultValueAllocator defaultAllocator; - static ValueAllocator *valueAllocator = &defaultAllocator; - return valueAllocator; -} - -static struct DummyValueAllocatorInitializer { - DummyValueAllocatorInitializer() - { - valueAllocator(); // ensure valueAllocator() statics are initialized before main(). - } -} dummyValueAllocatorInitializer; - - - -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// -// ValueInternals... -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// -#ifdef JSON_VALUE_USE_INTERNAL_MAP -# include "json_internalarray.inl" -# include "json_internalmap.inl" -#endif // JSON_VALUE_USE_INTERNAL_MAP - -# include "json_valueiterator.inl" - - -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// -// class Value::CommentInfo -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// - - -Value::CommentInfo::CommentInfo() - : comment_( 0 ) -{ -} - -Value::CommentInfo::~CommentInfo() -{ - if ( comment_ ) - valueAllocator()->releaseStringValue( comment_ ); -} - - -void -Value::CommentInfo::setComment( const char *text ) -{ - if ( comment_ ) - valueAllocator()->releaseStringValue( comment_ ); - JSON_ASSERT( text ); - JSON_ASSERT_MESSAGE( text[0]=='\0' || text[0]=='/', "Comments must start with /"); - // It seems that /**/ style comments are acceptable as well. - comment_ = valueAllocator()->duplicateStringValue( text ); -} - - -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// -// class Value::CZString -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// -# ifndef JSON_VALUE_USE_INTERNAL_MAP - -// Notes: index_ indicates if the string was allocated when -// a string is stored. - -Value::CZString::CZString( int index ) - : cstr_( 0 ) - , index_( index ) -{ -} - -Value::CZString::CZString( const char *cstr, DuplicationPolicy allocate ) - : cstr_( allocate == duplicate ? valueAllocator()->makeMemberName(cstr) - : cstr ) - , index_( allocate ) -{ -} - -Value::CZString::CZString( const CZString &other ) -: cstr_( other.index_ != noDuplication && other.cstr_ != 0 - ? valueAllocator()->makeMemberName( other.cstr_ ) - : other.cstr_ ) - , index_( other.cstr_ ? (other.index_ == noDuplication ? noDuplication : duplicate) - : other.index_ ) -{ -} - -Value::CZString::~CZString() -{ - if ( cstr_ && index_ == duplicate ) - valueAllocator()->releaseMemberName( const_cast( cstr_ ) ); -} - -void -Value::CZString::swap( CZString &other ) -{ - std::swap( cstr_, other.cstr_ ); - std::swap( index_, other.index_ ); -} - -Value::CZString & -Value::CZString::operator =( const CZString &other ) -{ - CZString temp( other ); - swap( temp ); - return *this; -} - -bool -Value::CZString::operator<( const CZString &other ) const -{ - if ( cstr_ ) - return strcmp( cstr_, other.cstr_ ) < 0; - return index_ < other.index_; -} - -bool -Value::CZString::operator==( const CZString &other ) const -{ - if ( cstr_ ) - return strcmp( cstr_, other.cstr_ ) == 0; - return index_ == other.index_; -} - - -int -Value::CZString::index() const -{ - return index_; -} - - -const char * -Value::CZString::c_str() const -{ - return cstr_; -} - -bool -Value::CZString::isStaticString() const -{ - return index_ == noDuplication; -} - -#endif // ifndef JSON_VALUE_USE_INTERNAL_MAP - - -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// -// class Value::Value -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// - -/*! \internal Default constructor initialization must be equivalent to: - * memset( this, 0, sizeof(Value) ) - * This optimization is used in ValueInternalMap fast allocator. - */ -Value::Value( ValueType type ) - : type_( type ) - , allocated_( 0 ) - , comments_( 0 ) -# ifdef JSON_VALUE_USE_INTERNAL_MAP - , itemIsUsed_( 0 ) -#endif -{ - switch ( type ) - { - case nullValue: - break; - case intValue: - case uintValue: - value_.int_ = 0; - break; - case realValue: - value_.real_ = 0.0; - break; - case stringValue: - value_.string_ = 0; - break; -#ifndef JSON_VALUE_USE_INTERNAL_MAP - case arrayValue: - case objectValue: - value_.map_ = new ObjectValues(); - break; -#else - case arrayValue: - value_.array_ = arrayAllocator()->newArray(); - break; - case objectValue: - value_.map_ = mapAllocator()->newMap(); - break; -#endif - case booleanValue: - value_.bool_ = false; - break; - default: - JSON_ASSERT_UNREACHABLE; - } -} - - -Value::Value( Int value ) - : type_( intValue ) - , comments_( 0 ) -# ifdef JSON_VALUE_USE_INTERNAL_MAP - , itemIsUsed_( 0 ) -#endif -{ - value_.int_ = value; -} - - -Value::Value( UInt value ) - : type_( uintValue ) - , comments_( 0 ) -# ifdef JSON_VALUE_USE_INTERNAL_MAP - , itemIsUsed_( 0 ) -#endif -{ - value_.uint_ = value; -} - -Value::Value( double value ) - : type_( realValue ) - , comments_( 0 ) -# ifdef JSON_VALUE_USE_INTERNAL_MAP - , itemIsUsed_( 0 ) -#endif -{ - value_.real_ = value; -} - -Value::Value( const char *value ) - : type_( stringValue ) - , allocated_( true ) - , comments_( 0 ) -# ifdef JSON_VALUE_USE_INTERNAL_MAP - , itemIsUsed_( 0 ) -#endif -{ - value_.string_ = valueAllocator()->duplicateStringValue( value ); -} - - -Value::Value( const char *beginValue, - const char *endValue ) - : type_( stringValue ) - , allocated_( true ) - , comments_( 0 ) -# ifdef JSON_VALUE_USE_INTERNAL_MAP - , itemIsUsed_( 0 ) -#endif -{ - value_.string_ = valueAllocator()->duplicateStringValue( beginValue, - UInt(endValue - beginValue) ); -} - - -Value::Value( const std::string &value ) - : type_( stringValue ) - , allocated_( true ) - , comments_( 0 ) -# ifdef JSON_VALUE_USE_INTERNAL_MAP - , itemIsUsed_( 0 ) -#endif -{ - value_.string_ = valueAllocator()->duplicateStringValue( value.c_str(), - (unsigned int)value.length() ); - -} - -Value::Value( const StaticString &value ) - : type_( stringValue ) - , allocated_( false ) - , comments_( 0 ) -# ifdef JSON_VALUE_USE_INTERNAL_MAP - , itemIsUsed_( 0 ) -#endif -{ - value_.string_ = const_cast( value.c_str() ); -} - - -# ifdef JSON_USE_CPPTL -Value::Value( const CppTL::ConstString &value ) - : type_( stringValue ) - , allocated_( true ) - , comments_( 0 ) -# ifdef JSON_VALUE_USE_INTERNAL_MAP - , itemIsUsed_( 0 ) -#endif -{ - value_.string_ = valueAllocator()->duplicateStringValue( value, value.length() ); -} -# endif - -Value::Value( bool value ) - : type_( booleanValue ) - , comments_( 0 ) -# ifdef JSON_VALUE_USE_INTERNAL_MAP - , itemIsUsed_( 0 ) -#endif -{ - value_.bool_ = value; -} - - -Value::Value( const Value &other ) - : type_( other.type_ ) - , comments_( 0 ) -# ifdef JSON_VALUE_USE_INTERNAL_MAP - , itemIsUsed_( 0 ) -#endif -{ - switch ( type_ ) - { - case nullValue: - case intValue: - case uintValue: - case realValue: - case booleanValue: - value_ = other.value_; - break; - case stringValue: - if ( other.value_.string_ ) - { - value_.string_ = valueAllocator()->duplicateStringValue( other.value_.string_ ); - allocated_ = true; - } - else - value_.string_ = 0; - break; -#ifndef JSON_VALUE_USE_INTERNAL_MAP - case arrayValue: - case objectValue: - value_.map_ = new ObjectValues( *other.value_.map_ ); - break; -#else - case arrayValue: - value_.array_ = arrayAllocator()->newArrayCopy( *other.value_.array_ ); - break; - case objectValue: - value_.map_ = mapAllocator()->newMapCopy( *other.value_.map_ ); - break; -#endif - default: - JSON_ASSERT_UNREACHABLE; - } - if ( other.comments_ ) - { - comments_ = new CommentInfo[numberOfCommentPlacement]; - for ( int comment =0; comment < numberOfCommentPlacement; ++comment ) - { - const CommentInfo &otherComment = other.comments_[comment]; - if ( otherComment.comment_ ) - comments_[comment].setComment( otherComment.comment_ ); - } - } -} - - -Value::~Value() -{ - switch ( type_ ) - { - case nullValue: - case intValue: - case uintValue: - case realValue: - case booleanValue: - break; - case stringValue: - if ( allocated_ ) - valueAllocator()->releaseStringValue( value_.string_ ); - break; -#ifndef JSON_VALUE_USE_INTERNAL_MAP - case arrayValue: - case objectValue: - delete value_.map_; - break; -#else - case arrayValue: - arrayAllocator()->destructArray( value_.array_ ); - break; - case objectValue: - mapAllocator()->destructMap( value_.map_ ); - break; -#endif - default: - JSON_ASSERT_UNREACHABLE; - } - - if ( comments_ ) - delete[] comments_; -} - -Value & -Value::operator=( const Value &other ) -{ - Value temp( other ); - swap( temp ); - return *this; -} - -void -Value::swap( Value &other ) -{ - ValueType temp = type_; - type_ = other.type_; - other.type_ = temp; - std::swap( value_, other.value_ ); - int temp2 = allocated_; - allocated_ = other.allocated_; - other.allocated_ = temp2; -} - -ValueType -Value::type() const -{ - return type_; -} - - -int -Value::compare( const Value &other ) -{ - /* - int typeDelta = other.type_ - type_; - switch ( type_ ) - { - case nullValue: - - return other.type_ == type_; - case intValue: - if ( other.type_.isNumeric() - case uintValue: - case realValue: - case booleanValue: - break; - case stringValue, - break; - case arrayValue: - delete value_.array_; - break; - case objectValue: - delete value_.map_; - default: - JSON_ASSERT_UNREACHABLE; - } - */ - return 0; // unreachable -} - -bool -Value::operator <( const Value &other ) const -{ - int typeDelta = type_ - other.type_; - if ( typeDelta ) - return typeDelta < 0 ? true : false; - switch ( type_ ) - { - case nullValue: - return false; - case intValue: - return value_.int_ < other.value_.int_; - case uintValue: - return value_.uint_ < other.value_.uint_; - case realValue: - return value_.real_ < other.value_.real_; - case booleanValue: - return value_.bool_ < other.value_.bool_; - case stringValue: - return ( value_.string_ == 0 && other.value_.string_ ) - || ( other.value_.string_ - && value_.string_ - && strcmp( value_.string_, other.value_.string_ ) < 0 ); -#ifndef JSON_VALUE_USE_INTERNAL_MAP - case arrayValue: - case objectValue: - { - int delta = int( value_.map_->size() - other.value_.map_->size() ); - if ( delta ) - return delta < 0; - return (*value_.map_) < (*other.value_.map_); - } -#else - case arrayValue: - return value_.array_->compare( *(other.value_.array_) ) < 0; - case objectValue: - return value_.map_->compare( *(other.value_.map_) ) < 0; -#endif - default: - JSON_ASSERT_UNREACHABLE; - } - return 0; // unreachable -} - -bool -Value::operator <=( const Value &other ) const -{ - return !(other > *this); -} - -bool -Value::operator >=( const Value &other ) const -{ - return !(*this < other); -} - -bool -Value::operator >( const Value &other ) const -{ - return other < *this; -} - -bool -Value::operator ==( const Value &other ) const -{ - //if ( type_ != other.type_ ) - // GCC 2.95.3 says: - // attempt to take address of bit-field structure member `Json::Value::type_' - // Beats me, but a temp solves the problem. - int temp = other.type_; - if ( type_ != temp ) - return false; - switch ( type_ ) - { - case nullValue: - return true; - case intValue: - return value_.int_ == other.value_.int_; - case uintValue: - return value_.uint_ == other.value_.uint_; - case realValue: - return value_.real_ == other.value_.real_; - case booleanValue: - return value_.bool_ == other.value_.bool_; - case stringValue: - return ( value_.string_ == other.value_.string_ ) - || ( other.value_.string_ - && value_.string_ - && strcmp( value_.string_, other.value_.string_ ) == 0 ); -#ifndef JSON_VALUE_USE_INTERNAL_MAP - case arrayValue: - case objectValue: - return value_.map_->size() == other.value_.map_->size() - && (*value_.map_) == (*other.value_.map_); -#else - case arrayValue: - return value_.array_->compare( *(other.value_.array_) ) == 0; - case objectValue: - return value_.map_->compare( *(other.value_.map_) ) == 0; -#endif - default: - JSON_ASSERT_UNREACHABLE; - } - return 0; // unreachable -} - -bool -Value::operator !=( const Value &other ) const -{ - return !( *this == other ); -} - -const char * -Value::asCString() const -{ - JSON_ASSERT( type_ == stringValue ); - return value_.string_; -} - - -std::string -Value::asString() const -{ - switch ( type_ ) - { - case nullValue: - return ""; - case stringValue: - return value_.string_ ? value_.string_ : ""; - case booleanValue: - return value_.bool_ ? "true" : "false"; - case intValue: - case uintValue: - case realValue: - case arrayValue: - case objectValue: - JSON_ASSERT_MESSAGE( false, "Type is not convertible to string" ); - default: - JSON_ASSERT_UNREACHABLE; - } - return ""; // unreachable -} - -# ifdef JSON_USE_CPPTL -CppTL::ConstString -Value::asConstString() const -{ - return CppTL::ConstString( asString().c_str() ); -} -# endif - -Value::Int -Value::asInt() const -{ - switch ( type_ ) - { - case nullValue: - return 0; - case intValue: - return value_.int_; - case uintValue: - JSON_ASSERT_MESSAGE( value_.uint_ < (unsigned)maxInt, "integer out of signed integer range" ); - return value_.uint_; - case realValue: - JSON_ASSERT_MESSAGE( value_.real_ >= minInt && value_.real_ <= maxInt, "Real out of signed integer range" ); - return Int( value_.real_ ); - case booleanValue: - return value_.bool_ ? 1 : 0; - case stringValue: - case arrayValue: - case objectValue: - JSON_ASSERT_MESSAGE( false, "Type is not convertible to int" ); - default: - JSON_ASSERT_UNREACHABLE; - } - return 0; // unreachable; -} - -Value::UInt -Value::asUInt() const -{ - switch ( type_ ) - { - case nullValue: - return 0; - case intValue: - JSON_ASSERT_MESSAGE( value_.int_ >= 0, "Negative integer can not be converted to unsigned integer" ); - return value_.int_; - case uintValue: - return value_.uint_; - case realValue: - JSON_ASSERT_MESSAGE( value_.real_ >= 0 && value_.real_ <= maxUInt, "Real out of unsigned integer range" ); - return UInt( value_.real_ ); - case booleanValue: - return value_.bool_ ? 1 : 0; - case stringValue: - case arrayValue: - case objectValue: - JSON_ASSERT_MESSAGE( false, "Type is not convertible to uint" ); - default: - JSON_ASSERT_UNREACHABLE; - } - return 0; // unreachable; -} - -double -Value::asDouble() const -{ - switch ( type_ ) - { - case nullValue: - return 0.0; - case intValue: - return value_.int_; - case uintValue: - return value_.uint_; - case realValue: - return value_.real_; - case booleanValue: - return value_.bool_ ? 1.0 : 0.0; - case stringValue: - case arrayValue: - case objectValue: - JSON_ASSERT_MESSAGE( false, "Type is not convertible to double" ); - default: - JSON_ASSERT_UNREACHABLE; - } - return 0; // unreachable; -} - -bool -Value::asBool() const -{ - switch ( type_ ) - { - case nullValue: - return false; - case intValue: - case uintValue: - return value_.int_ != 0; - case realValue: - return value_.real_ != 0.0; - case booleanValue: - return value_.bool_; - case stringValue: - return value_.string_ && value_.string_[0] != 0; - case arrayValue: - case objectValue: - return value_.map_->size() != 0; - default: - JSON_ASSERT_UNREACHABLE; - } - return false; // unreachable; -} - - -bool -Value::isConvertibleTo( ValueType other ) const -{ - switch ( type_ ) - { - case nullValue: - return true; - case intValue: - return ( other == nullValue && value_.int_ == 0 ) - || other == intValue - || ( other == uintValue && value_.int_ >= 0 ) - || other == realValue - || other == stringValue - || other == booleanValue; - case uintValue: - return ( other == nullValue && value_.uint_ == 0 ) - || ( other == intValue && value_.uint_ <= (unsigned)maxInt ) - || other == uintValue - || other == realValue - || other == stringValue - || other == booleanValue; - case realValue: - return ( other == nullValue && value_.real_ == 0.0 ) - || ( other == intValue && value_.real_ >= minInt && value_.real_ <= maxInt ) - || ( other == uintValue && value_.real_ >= 0 && value_.real_ <= maxUInt ) - || other == realValue - || other == stringValue - || other == booleanValue; - case booleanValue: - return ( other == nullValue && value_.bool_ == false ) - || other == intValue - || other == uintValue - || other == realValue - || other == stringValue - || other == booleanValue; - case stringValue: - return other == stringValue - || ( other == nullValue && (!value_.string_ || value_.string_[0] == 0) ); - case arrayValue: - return other == arrayValue - || ( other == nullValue && value_.map_->size() == 0 ); - case objectValue: - return other == objectValue - || ( other == nullValue && value_.map_->size() == 0 ); - default: - JSON_ASSERT_UNREACHABLE; - } - return false; // unreachable; -} - - -/// Number of values in array or object -Value::UInt -Value::size() const -{ - switch ( type_ ) - { - case nullValue: - case intValue: - case uintValue: - case realValue: - case booleanValue: - case stringValue: - return 0; -#ifndef JSON_VALUE_USE_INTERNAL_MAP - case arrayValue: // size of the array is highest index + 1 - if ( !value_.map_->empty() ) - { - ObjectValues::const_iterator itLast = value_.map_->end(); - --itLast; - return (*itLast).first.index()+1; - } - return 0; - case objectValue: - return Int( value_.map_->size() ); -#else - case arrayValue: - return Int( value_.array_->size() ); - case objectValue: - return Int( value_.map_->size() ); -#endif - default: - JSON_ASSERT_UNREACHABLE; - } - return 0; // unreachable; -} - - -bool -Value::empty() const -{ - if ( isNull() || isArray() || isObject() ) - return size() == 0u; - else - return false; -} - - -bool -Value::operator!() const -{ - return isNull(); -} - - -void -Value::clear() -{ - JSON_ASSERT( type_ == nullValue || type_ == arrayValue || type_ == objectValue ); - - switch ( type_ ) - { -#ifndef JSON_VALUE_USE_INTERNAL_MAP - case arrayValue: - case objectValue: - value_.map_->clear(); - break; -#else - case arrayValue: - value_.array_->clear(); - break; - case objectValue: - value_.map_->clear(); - break; -#endif - default: - break; - } -} - -void -Value::resize( UInt newSize ) -{ - JSON_ASSERT( type_ == nullValue || type_ == arrayValue ); - if ( type_ == nullValue ) - *this = Value( arrayValue ); -#ifndef JSON_VALUE_USE_INTERNAL_MAP - UInt oldSize = size(); - if ( newSize == 0 ) - clear(); - else if ( newSize > oldSize ) - (*this)[ newSize - 1 ]; - else - { - for ( UInt index = newSize; index < oldSize; ++index ) - value_.map_->erase( index ); - assert( size() == newSize ); - } -#else - value_.array_->resize( newSize ); -#endif -} - - -Value & -Value::operator[]( UInt index ) -{ - JSON_ASSERT( type_ == nullValue || type_ == arrayValue ); - if ( type_ == nullValue ) - *this = Value( arrayValue ); -#ifndef JSON_VALUE_USE_INTERNAL_MAP - CZString key( index ); - ObjectValues::iterator it = value_.map_->lower_bound( key ); - if ( it != value_.map_->end() && (*it).first == key ) - return (*it).second; - - ObjectValues::value_type defaultValue( key, null ); - it = value_.map_->insert( it, defaultValue ); - return (*it).second; -#else - return value_.array_->resolveReference( index ); -#endif -} - - -const Value & -Value::operator[]( UInt index ) const -{ - JSON_ASSERT( type_ == nullValue || type_ == arrayValue ); - if ( type_ == nullValue ) - return null; -#ifndef JSON_VALUE_USE_INTERNAL_MAP - CZString key( index ); - ObjectValues::const_iterator it = value_.map_->find( key ); - if ( it == value_.map_->end() ) - return null; - return (*it).second; -#else - Value *value = value_.array_->find( index ); - return value ? *value : null; -#endif -} - - -Value & -Value::operator[]( const char *key ) -{ - return resolveReference( key, false ); -} - - -Value & -Value::resolveReference( const char *key, - bool isStatic ) -{ - JSON_ASSERT( type_ == nullValue || type_ == objectValue ); - if ( type_ == nullValue ) - *this = Value( objectValue ); -#ifndef JSON_VALUE_USE_INTERNAL_MAP - CZString actualKey( key, isStatic ? CZString::noDuplication - : CZString::duplicateOnCopy ); - ObjectValues::iterator it = value_.map_->lower_bound( actualKey ); - if ( it != value_.map_->end() && (*it).first == actualKey ) - return (*it).second; - - ObjectValues::value_type defaultValue( actualKey, null ); - it = value_.map_->insert( it, defaultValue ); - Value &value = (*it).second; - return value; -#else - return value_.map_->resolveReference( key, isStatic ); -#endif -} - - -Value -Value::get( UInt index, - const Value &defaultValue ) const -{ - const Value *value = &((*this)[index]); - return value == &null ? defaultValue : *value; -} - - -bool -Value::isValidIndex( UInt index ) const -{ - return index < size(); -} - - - -const Value & -Value::operator[]( const char *key ) const -{ - JSON_ASSERT( type_ == nullValue || type_ == objectValue ); - if ( type_ == nullValue ) - return null; -#ifndef JSON_VALUE_USE_INTERNAL_MAP - CZString actualKey( key, CZString::noDuplication ); - ObjectValues::const_iterator it = value_.map_->find( actualKey ); - if ( it == value_.map_->end() ) - return null; - return (*it).second; -#else - const Value *value = value_.map_->find( key ); - return value ? *value : null; -#endif -} - - -Value & -Value::operator[]( const std::string &key ) -{ - return (*this)[ key.c_str() ]; -} - - -const Value & -Value::operator[]( const std::string &key ) const -{ - return (*this)[ key.c_str() ]; -} - -Value & -Value::operator[]( const StaticString &key ) -{ - return resolveReference( key, true ); -} - - -# ifdef JSON_USE_CPPTL -Value & -Value::operator[]( const CppTL::ConstString &key ) -{ - return (*this)[ key.c_str() ]; -} - - -const Value & -Value::operator[]( const CppTL::ConstString &key ) const -{ - return (*this)[ key.c_str() ]; -} -# endif - - -Value & -Value::append( const Value &value ) -{ - return (*this)[size()] = value; -} - - -Value -Value::get( const char *key, - const Value &defaultValue ) const -{ - const Value *value = &((*this)[key]); - return value == &null ? defaultValue : *value; -} - - -Value -Value::get( const std::string &key, - const Value &defaultValue ) const -{ - return get( key.c_str(), defaultValue ); -} - -Value -Value::removeMember( const char* key ) -{ - JSON_ASSERT( type_ == nullValue || type_ == objectValue ); - if ( type_ == nullValue ) - return null; -#ifndef JSON_VALUE_USE_INTERNAL_MAP - CZString actualKey( key, CZString::noDuplication ); - ObjectValues::iterator it = value_.map_->find( actualKey ); - if ( it == value_.map_->end() ) - return null; - Value old(it->second); - value_.map_->erase(it); - return old; -#else - Value *value = value_.map_->find( key ); - if (value){ - Value old(*value); - value_.map_.remove( key ); - return old; - } else { - return null; - } -#endif -} - -Value -Value::removeMember( const std::string &key ) -{ - return removeMember( key.c_str() ); -} - -# ifdef JSON_USE_CPPTL -Value -Value::get( const CppTL::ConstString &key, - const Value &defaultValue ) const -{ - return get( key.c_str(), defaultValue ); -} -# endif - -bool -Value::isMember( const char *key ) const -{ - const Value *value = &((*this)[key]); - return value != &null; -} - - -bool -Value::isMember( const std::string &key ) const -{ - return isMember( key.c_str() ); -} - - -# ifdef JSON_USE_CPPTL -bool -Value::isMember( const CppTL::ConstString &key ) const -{ - return isMember( key.c_str() ); -} -#endif - -Value::Members -Value::getMemberNames() const -{ - JSON_ASSERT( type_ == nullValue || type_ == objectValue ); - if ( type_ == nullValue ) - return Value::Members(); - Members members; - members.reserve( value_.map_->size() ); -#ifndef JSON_VALUE_USE_INTERNAL_MAP - ObjectValues::const_iterator it = value_.map_->begin(); - ObjectValues::const_iterator itEnd = value_.map_->end(); - for ( ; it != itEnd; ++it ) - members.push_back( std::string( (*it).first.c_str() ) ); -#else - ValueInternalMap::IteratorState it; - ValueInternalMap::IteratorState itEnd; - value_.map_->makeBeginIterator( it ); - value_.map_->makeEndIterator( itEnd ); - for ( ; !ValueInternalMap::equals( it, itEnd ); ValueInternalMap::increment(it) ) - members.push_back( std::string( ValueInternalMap::key( it ) ) ); -#endif - return members; -} -// -//# ifdef JSON_USE_CPPTL -//EnumMemberNames -//Value::enumMemberNames() const -//{ -// if ( type_ == objectValue ) -// { -// return CppTL::Enum::any( CppTL::Enum::transform( -// CppTL::Enum::keys( *(value_.map_), CppTL::Type() ), -// MemberNamesTransform() ) ); -// } -// return EnumMemberNames(); -//} -// -// -//EnumValues -//Value::enumValues() const -//{ -// if ( type_ == objectValue || type_ == arrayValue ) -// return CppTL::Enum::anyValues( *(value_.map_), -// CppTL::Type() ); -// return EnumValues(); -//} -// -//# endif - - -bool -Value::isNull() const -{ - return type_ == nullValue; -} - - -bool -Value::isBool() const -{ - return type_ == booleanValue; -} - - -bool -Value::isInt() const -{ - return type_ == intValue; -} - - -bool -Value::isUInt() const -{ - return type_ == uintValue; -} - - -bool -Value::isIntegral() const -{ - return type_ == intValue - || type_ == uintValue - || type_ == booleanValue; -} - - -bool -Value::isDouble() const -{ - return type_ == realValue; -} - - -bool -Value::isNumeric() const -{ - return isIntegral() || isDouble(); -} - - -bool -Value::isString() const -{ - return type_ == stringValue; -} - - -bool -Value::isArray() const -{ - return type_ == nullValue || type_ == arrayValue; -} - - -bool -Value::isObject() const -{ - return type_ == nullValue || type_ == objectValue; -} - - -void -Value::setComment( const char *comment, - CommentPlacement placement ) -{ - if ( !comments_ ) - comments_ = new CommentInfo[numberOfCommentPlacement]; - comments_[placement].setComment( comment ); -} - - -void -Value::setComment( const std::string &comment, - CommentPlacement placement ) -{ - setComment( comment.c_str(), placement ); -} - - -bool -Value::hasComment( CommentPlacement placement ) const -{ - return comments_ != 0 && comments_[placement].comment_ != 0; -} - -std::string -Value::getComment( CommentPlacement placement ) const -{ - if ( hasComment(placement) ) - return comments_[placement].comment_; - return ""; -} - - -std::string -Value::toStyledString() const -{ - StyledWriter writer; - return writer.write( *this ); -} - - -Value::const_iterator -Value::begin() const -{ - switch ( type_ ) - { -#ifdef JSON_VALUE_USE_INTERNAL_MAP - case arrayValue: - if ( value_.array_ ) - { - ValueInternalArray::IteratorState it; - value_.array_->makeBeginIterator( it ); - return const_iterator( it ); - } - break; - case objectValue: - if ( value_.map_ ) - { - ValueInternalMap::IteratorState it; - value_.map_->makeBeginIterator( it ); - return const_iterator( it ); - } - break; -#else - case arrayValue: - case objectValue: - if ( value_.map_ ) - return const_iterator( value_.map_->begin() ); - break; -#endif - default: - break; - } - return const_iterator(); -} - -Value::const_iterator -Value::end() const -{ - switch ( type_ ) - { -#ifdef JSON_VALUE_USE_INTERNAL_MAP - case arrayValue: - if ( value_.array_ ) - { - ValueInternalArray::IteratorState it; - value_.array_->makeEndIterator( it ); - return const_iterator( it ); - } - break; - case objectValue: - if ( value_.map_ ) - { - ValueInternalMap::IteratorState it; - value_.map_->makeEndIterator( it ); - return const_iterator( it ); - } - break; -#else - case arrayValue: - case objectValue: - if ( value_.map_ ) - return const_iterator( value_.map_->end() ); - break; -#endif - default: - break; - } - return const_iterator(); -} - - -Value::iterator -Value::begin() -{ - switch ( type_ ) - { -#ifdef JSON_VALUE_USE_INTERNAL_MAP - case arrayValue: - if ( value_.array_ ) - { - ValueInternalArray::IteratorState it; - value_.array_->makeBeginIterator( it ); - return iterator( it ); - } - break; - case objectValue: - if ( value_.map_ ) - { - ValueInternalMap::IteratorState it; - value_.map_->makeBeginIterator( it ); - return iterator( it ); - } - break; -#else - case arrayValue: - case objectValue: - if ( value_.map_ ) - return iterator( value_.map_->begin() ); - break; -#endif - default: - break; - } - return iterator(); -} - -Value::iterator -Value::end() -{ - switch ( type_ ) - { -#ifdef JSON_VALUE_USE_INTERNAL_MAP - case arrayValue: - if ( value_.array_ ) - { - ValueInternalArray::IteratorState it; - value_.array_->makeEndIterator( it ); - return iterator( it ); - } - break; - case objectValue: - if ( value_.map_ ) - { - ValueInternalMap::IteratorState it; - value_.map_->makeEndIterator( it ); - return iterator( it ); - } - break; -#else - case arrayValue: - case objectValue: - if ( value_.map_ ) - return iterator( value_.map_->end() ); - break; -#endif - default: - break; - } - return iterator(); -} - - -// class PathArgument -// ////////////////////////////////////////////////////////////////// - -PathArgument::PathArgument() - : kind_( kindNone ) -{ -} - - -PathArgument::PathArgument( Value::UInt index ) - : index_( index ) - , kind_( kindIndex ) -{ -} - - -PathArgument::PathArgument( const char *key ) - : key_( key ) - , kind_( kindKey ) -{ -} - - -PathArgument::PathArgument( const std::string &key ) - : key_( key.c_str() ) - , kind_( kindKey ) -{ -} - -// class Path -// ////////////////////////////////////////////////////////////////// - -Path::Path( const std::string &path, - const PathArgument &a1, - const PathArgument &a2, - const PathArgument &a3, - const PathArgument &a4, - const PathArgument &a5 ) -{ - InArgs in; - in.push_back( &a1 ); - in.push_back( &a2 ); - in.push_back( &a3 ); - in.push_back( &a4 ); - in.push_back( &a5 ); - makePath( path, in ); -} - - -void -Path::makePath( const std::string &path, - const InArgs &in ) -{ - const char *current = path.c_str(); - const char *end = current + path.length(); - InArgs::const_iterator itInArg = in.begin(); - while ( current != end ) - { - if ( *current == '[' ) - { - ++current; - if ( *current == '%' ) - addPathInArg( path, in, itInArg, PathArgument::kindIndex ); - else - { - Value::UInt index = 0; - for ( ; current != end && *current >= '0' && *current <= '9'; ++current ) - index = index * 10 + Value::UInt(*current - '0'); - args_.push_back( index ); - } - if ( current == end || *current++ != ']' ) - invalidPath( path, int(current - path.c_str()) ); - } - else if ( *current == '%' ) - { - addPathInArg( path, in, itInArg, PathArgument::kindKey ); - ++current; - } - else if ( *current == '.' ) - { - ++current; - } - else - { - const char *beginName = current; - while ( current != end && !strchr( "[.", *current ) ) - ++current; - args_.push_back( std::string( beginName, current ) ); - } - } -} - - -void -Path::addPathInArg( const std::string &path, - const InArgs &in, - InArgs::const_iterator &itInArg, - PathArgument::Kind kind ) -{ - if ( itInArg == in.end() ) - { - // Error: missing argument %d - } - else if ( (*itInArg)->kind_ != kind ) - { - // Error: bad argument type - } - else - { - args_.push_back( **itInArg ); - } -} - - -void -Path::invalidPath( const std::string &path, - int location ) -{ - // Error: invalid path. -} - - -const Value & -Path::resolve( const Value &root ) const -{ - const Value *node = &root; - for ( Args::const_iterator it = args_.begin(); it != args_.end(); ++it ) - { - const PathArgument &arg = *it; - if ( arg.kind_ == PathArgument::kindIndex ) - { - if ( !node->isArray() || node->isValidIndex( arg.index_ ) ) - { - // Error: unable to resolve path (array value expected at position... - } - node = &((*node)[arg.index_]); - } - else if ( arg.kind_ == PathArgument::kindKey ) - { - if ( !node->isObject() ) - { - // Error: unable to resolve path (object value expected at position...) - } - node = &((*node)[arg.key_]); - if ( node == &Value::null ) - { - // Error: unable to resolve path (object has no member named '' at position...) - } - } - } - return *node; -} - - -Value -Path::resolve( const Value &root, - const Value &defaultValue ) const -{ - const Value *node = &root; - for ( Args::const_iterator it = args_.begin(); it != args_.end(); ++it ) - { - const PathArgument &arg = *it; - if ( arg.kind_ == PathArgument::kindIndex ) - { - if ( !node->isArray() || node->isValidIndex( arg.index_ ) ) - return defaultValue; - node = &((*node)[arg.index_]); - } - else if ( arg.kind_ == PathArgument::kindKey ) - { - if ( !node->isObject() ) - return defaultValue; - node = &((*node)[arg.key_]); - if ( node == &Value::null ) - return defaultValue; - } - } - return *node; -} - - -Value & -Path::make( Value &root ) const -{ - Value *node = &root; - for ( Args::const_iterator it = args_.begin(); it != args_.end(); ++it ) - { - const PathArgument &arg = *it; - if ( arg.kind_ == PathArgument::kindIndex ) - { - if ( !node->isArray() ) - { - // Error: node is not an array at position ... - } - node = &((*node)[arg.index_]); - } - else if ( arg.kind_ == PathArgument::kindKey ) - { - if ( !node->isObject() ) - { - // Error: node is not an object at position... - } - node = &((*node)[arg.key_]); - } - } - return *node; -} - - -} // namespace Json diff --git a/cordova-lib/spec-plugman/plugins/cordova.echo/src/blackberry10/native/public/json_valueiterator.inl b/cordova-lib/spec-plugman/plugins/cordova.echo/src/blackberry10/native/public/json_valueiterator.inl deleted file mode 100644 index 736e260ea..000000000 --- a/cordova-lib/spec-plugman/plugins/cordova.echo/src/blackberry10/native/public/json_valueiterator.inl +++ /dev/null @@ -1,292 +0,0 @@ -// included by json_value.cpp -// everything is within Json namespace - - -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// -// class ValueIteratorBase -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// - -ValueIteratorBase::ValueIteratorBase() -#ifndef JSON_VALUE_USE_INTERNAL_MAP - : current_() - , isNull_( true ) -{ -} -#else - : isArray_( true ) - , isNull_( true ) -{ - iterator_.array_ = ValueInternalArray::IteratorState(); -} -#endif - - -#ifndef JSON_VALUE_USE_INTERNAL_MAP -ValueIteratorBase::ValueIteratorBase( const Value::ObjectValues::iterator ¤t ) - : current_( current ) - , isNull_( false ) -{ -} -#else -ValueIteratorBase::ValueIteratorBase( const ValueInternalArray::IteratorState &state ) - : isArray_( true ) -{ - iterator_.array_ = state; -} - - -ValueIteratorBase::ValueIteratorBase( const ValueInternalMap::IteratorState &state ) - : isArray_( false ) -{ - iterator_.map_ = state; -} -#endif - -Value & -ValueIteratorBase::deref() const -{ -#ifndef JSON_VALUE_USE_INTERNAL_MAP - return current_->second; -#else - if ( isArray_ ) - return ValueInternalArray::dereference( iterator_.array_ ); - return ValueInternalMap::value( iterator_.map_ ); -#endif -} - - -void -ValueIteratorBase::increment() -{ -#ifndef JSON_VALUE_USE_INTERNAL_MAP - ++current_; -#else - if ( isArray_ ) - ValueInternalArray::increment( iterator_.array_ ); - ValueInternalMap::increment( iterator_.map_ ); -#endif -} - - -void -ValueIteratorBase::decrement() -{ -#ifndef JSON_VALUE_USE_INTERNAL_MAP - --current_; -#else - if ( isArray_ ) - ValueInternalArray::decrement( iterator_.array_ ); - ValueInternalMap::decrement( iterator_.map_ ); -#endif -} - - -ValueIteratorBase::difference_type -ValueIteratorBase::computeDistance( const SelfType &other ) const -{ -#ifndef JSON_VALUE_USE_INTERNAL_MAP -# ifdef JSON_USE_CPPTL_SMALLMAP - return current_ - other.current_; -# else - // Iterator for null value are initialized using the default - // constructor, which initialize current_ to the default - // std::map::iterator. As begin() and end() are two instance - // of the default std::map::iterator, they can not be compared. - // To allow this, we handle this comparison specifically. - if ( isNull_ && other.isNull_ ) - { - return 0; - } - - - // Usage of std::distance is not portable (does not compile with Sun Studio 12 RogueWave STL, - // which is the one used by default). - // Using a portable hand-made version for non random iterator instead: - // return difference_type( std::distance( current_, other.current_ ) ); - difference_type myDistance = 0; - for ( Value::ObjectValues::iterator it = current_; it != other.current_; ++it ) - { - ++myDistance; - } - return myDistance; -# endif -#else - if ( isArray_ ) - return ValueInternalArray::distance( iterator_.array_, other.iterator_.array_ ); - return ValueInternalMap::distance( iterator_.map_, other.iterator_.map_ ); -#endif -} - - -bool -ValueIteratorBase::isEqual( const SelfType &other ) const -{ -#ifndef JSON_VALUE_USE_INTERNAL_MAP - if ( isNull_ ) - { - return other.isNull_; - } - return current_ == other.current_; -#else - if ( isArray_ ) - return ValueInternalArray::equals( iterator_.array_, other.iterator_.array_ ); - return ValueInternalMap::equals( iterator_.map_, other.iterator_.map_ ); -#endif -} - - -void -ValueIteratorBase::copy( const SelfType &other ) -{ -#ifndef JSON_VALUE_USE_INTERNAL_MAP - current_ = other.current_; -#else - if ( isArray_ ) - iterator_.array_ = other.iterator_.array_; - iterator_.map_ = other.iterator_.map_; -#endif -} - - -Value -ValueIteratorBase::key() const -{ -#ifndef JSON_VALUE_USE_INTERNAL_MAP - const Value::CZString czstring = (*current_).first; - if ( czstring.c_str() ) - { - if ( czstring.isStaticString() ) - return Value( StaticString( czstring.c_str() ) ); - return Value( czstring.c_str() ); - } - return Value( czstring.index() ); -#else - if ( isArray_ ) - return Value( ValueInternalArray::indexOf( iterator_.array_ ) ); - bool isStatic; - const char *memberName = ValueInternalMap::key( iterator_.map_, isStatic ); - if ( isStatic ) - return Value( StaticString( memberName ) ); - return Value( memberName ); -#endif -} - - -UInt -ValueIteratorBase::index() const -{ -#ifndef JSON_VALUE_USE_INTERNAL_MAP - const Value::CZString czstring = (*current_).first; - if ( !czstring.c_str() ) - return czstring.index(); - return Value::UInt( -1 ); -#else - if ( isArray_ ) - return Value::UInt( ValueInternalArray::indexOf( iterator_.array_ ) ); - return Value::UInt( -1 ); -#endif -} - - -const char * -ValueIteratorBase::memberName() const -{ -#ifndef JSON_VALUE_USE_INTERNAL_MAP - const char *name = (*current_).first.c_str(); - return name ? name : ""; -#else - if ( !isArray_ ) - return ValueInternalMap::key( iterator_.map_ ); - return ""; -#endif -} - - -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// -// class ValueConstIterator -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// - -ValueConstIterator::ValueConstIterator() -{ -} - - -#ifndef JSON_VALUE_USE_INTERNAL_MAP -ValueConstIterator::ValueConstIterator( const Value::ObjectValues::iterator ¤t ) - : ValueIteratorBase( current ) -{ -} -#else -ValueConstIterator::ValueConstIterator( const ValueInternalArray::IteratorState &state ) - : ValueIteratorBase( state ) -{ -} - -ValueConstIterator::ValueConstIterator( const ValueInternalMap::IteratorState &state ) - : ValueIteratorBase( state ) -{ -} -#endif - -ValueConstIterator & -ValueConstIterator::operator =( const ValueIteratorBase &other ) -{ - copy( other ); - return *this; -} - - -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// -// class ValueIterator -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// - -ValueIterator::ValueIterator() -{ -} - - -#ifndef JSON_VALUE_USE_INTERNAL_MAP -ValueIterator::ValueIterator( const Value::ObjectValues::iterator ¤t ) - : ValueIteratorBase( current ) -{ -} -#else -ValueIterator::ValueIterator( const ValueInternalArray::IteratorState &state ) - : ValueIteratorBase( state ) -{ -} - -ValueIterator::ValueIterator( const ValueInternalMap::IteratorState &state ) - : ValueIteratorBase( state ) -{ -} -#endif - -ValueIterator::ValueIterator( const ValueConstIterator &other ) - : ValueIteratorBase( other ) -{ -} - -ValueIterator::ValueIterator( const ValueIterator &other ) - : ValueIteratorBase( other ) -{ -} - -ValueIterator & -ValueIterator::operator =( const SelfType &other ) -{ - copy( other ); - return *this; -} diff --git a/cordova-lib/spec-plugman/plugins/cordova.echo/src/blackberry10/native/public/json_writer.cpp b/cordova-lib/spec-plugman/plugins/cordova.echo/src/blackberry10/native/public/json_writer.cpp deleted file mode 100644 index a522ef6b0..000000000 --- a/cordova-lib/spec-plugman/plugins/cordova.echo/src/blackberry10/native/public/json_writer.cpp +++ /dev/null @@ -1,829 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include - -#if _MSC_VER >= 1400 // VC++ 8.0 -#pragma warning( disable : 4996 ) // disable warning about strdup being deprecated. -#endif - -namespace Json { - -static bool isControlCharacter(char ch) -{ - return ch > 0 && ch <= 0x1F; -} - -static bool containsControlCharacter( const char* str ) -{ - while ( *str ) - { - if ( isControlCharacter( *(str++) ) ) - return true; - } - return false; -} -static void uintToString( unsigned int value, - char *¤t ) -{ - *--current = 0; - do - { - *--current = (value % 10) + '0'; - value /= 10; - } - while ( value != 0 ); -} - -std::string valueToString( Int value ) -{ - char buffer[32]; - char *current = buffer + sizeof(buffer); - bool isNegative = value < 0; - if ( isNegative ) - value = -value; - uintToString( UInt(value), current ); - if ( isNegative ) - *--current = '-'; - assert( current >= buffer ); - return current; -} - - -std::string valueToString( UInt value ) -{ - char buffer[32]; - char *current = buffer + sizeof(buffer); - uintToString( value, current ); - assert( current >= buffer ); - return current; -} - -std::string valueToString( double value ) -{ - char buffer[32]; -#if defined(_MSC_VER) && defined(__STDC_SECURE_LIB__) // Use secure version with visual studio 2005 to avoid warning. - sprintf_s(buffer, sizeof(buffer), "%#.16g", value); -#else - sprintf(buffer, "%#.16g", value); -#endif - char* ch = buffer + strlen(buffer) - 1; - if (*ch != '0') return buffer; // nothing to truncate, so save time - while(ch > buffer && *ch == '0'){ - --ch; - } - char* last_nonzero = ch; - while(ch >= buffer){ - switch(*ch){ - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - --ch; - continue; - case '.': - // Truncate zeroes to save bytes in output, but keep one. - *(last_nonzero+2) = '\0'; - return buffer; - default: - return buffer; - } - } - return buffer; -} - - -std::string valueToString( bool value ) -{ - return value ? "true" : "false"; -} - -std::string valueToQuotedString( const char *value ) -{ - // Not sure how to handle unicode... - if (strpbrk(value, "\"\\\b\f\n\r\t") == NULL && !containsControlCharacter( value )) - return std::string("\"") + value + "\""; - // We have to walk value and escape any special characters. - // Appending to std::string is not efficient, but this should be rare. - // (Note: forward slashes are *not* rare, but I am not escaping them.) - unsigned maxsize = strlen(value)*2 + 3; // allescaped+quotes+NULL - std::string result; - result.reserve(maxsize); // to avoid lots of mallocs - result += "\""; - for (const char* c=value; *c != 0; ++c) - { - switch(*c) - { - case '\"': - result += "\\\""; - break; - case '\\': - result += "\\\\"; - break; - case '\b': - result += "\\b"; - break; - case '\f': - result += "\\f"; - break; - case '\n': - result += "\\n"; - break; - case '\r': - result += "\\r"; - break; - case '\t': - result += "\\t"; - break; - //case '/': - // Even though \/ is considered a legal escape in JSON, a bare - // slash is also legal, so I see no reason to escape it. - // (I hope I am not misunderstanding something. - // blep notes: actually escaping \/ may be useful in javascript to avoid (*c); - result += oss.str(); - } - else - { - result += *c; - } - break; - } - } - result += "\""; - return result; -} - -// Class Writer -// ////////////////////////////////////////////////////////////////// -Writer::~Writer() -{ -} - - -// Class FastWriter -// ////////////////////////////////////////////////////////////////// - -FastWriter::FastWriter() - : yamlCompatibilityEnabled_( false ) -{ -} - - -void -FastWriter::enableYAMLCompatibility() -{ - yamlCompatibilityEnabled_ = true; -} - - -std::string -FastWriter::write( const Value &root ) -{ - document_ = ""; - writeValue( root ); - document_ += "\n"; - return document_; -} - - -void -FastWriter::writeValue( const Value &value ) -{ - switch ( value.type() ) - { - case nullValue: - document_ += "null"; - break; - case intValue: - document_ += valueToString( value.asInt() ); - break; - case uintValue: - document_ += valueToString( value.asUInt() ); - break; - case realValue: - document_ += valueToString( value.asDouble() ); - break; - case stringValue: - document_ += valueToQuotedString( value.asCString() ); - break; - case booleanValue: - document_ += valueToString( value.asBool() ); - break; - case arrayValue: - { - document_ += "["; - int size = value.size(); - for ( int index =0; index < size; ++index ) - { - if ( index > 0 ) - document_ += ","; - writeValue( value[index] ); - } - document_ += "]"; - } - break; - case objectValue: - { - Value::Members members( value.getMemberNames() ); - document_ += "{"; - for ( Value::Members::iterator it = members.begin(); - it != members.end(); - ++it ) - { - const std::string &name = *it; - if ( it != members.begin() ) - document_ += ","; - document_ += valueToQuotedString( name.c_str() ); - document_ += yamlCompatibilityEnabled_ ? ": " - : ":"; - writeValue( value[name] ); - } - document_ += "}"; - } - break; - } -} - - -// Class StyledWriter -// ////////////////////////////////////////////////////////////////// - -StyledWriter::StyledWriter() - : rightMargin_( 74 ) - , indentSize_( 3 ) -{ -} - - -std::string -StyledWriter::write( const Value &root ) -{ - document_ = ""; - addChildValues_ = false; - indentString_ = ""; - writeCommentBeforeValue( root ); - writeValue( root ); - writeCommentAfterValueOnSameLine( root ); - document_ += "\n"; - return document_; -} - - -void -StyledWriter::writeValue( const Value &value ) -{ - switch ( value.type() ) - { - case nullValue: - pushValue( "null" ); - break; - case intValue: - pushValue( valueToString( value.asInt() ) ); - break; - case uintValue: - pushValue( valueToString( value.asUInt() ) ); - break; - case realValue: - pushValue( valueToString( value.asDouble() ) ); - break; - case stringValue: - pushValue( valueToQuotedString( value.asCString() ) ); - break; - case booleanValue: - pushValue( valueToString( value.asBool() ) ); - break; - case arrayValue: - writeArrayValue( value); - break; - case objectValue: - { - Value::Members members( value.getMemberNames() ); - if ( members.empty() ) - pushValue( "{}" ); - else - { - writeWithIndent( "{" ); - indent(); - Value::Members::iterator it = members.begin(); - while ( true ) - { - const std::string &name = *it; - const Value &childValue = value[name]; - writeCommentBeforeValue( childValue ); - writeWithIndent( valueToQuotedString( name.c_str() ) ); - document_ += " : "; - writeValue( childValue ); - if ( ++it == members.end() ) - { - writeCommentAfterValueOnSameLine( childValue ); - break; - } - document_ += ","; - writeCommentAfterValueOnSameLine( childValue ); - } - unindent(); - writeWithIndent( "}" ); - } - } - break; - } -} - - -void -StyledWriter::writeArrayValue( const Value &value ) -{ - unsigned size = value.size(); - if ( size == 0 ) - pushValue( "[]" ); - else - { - bool isArrayMultiLine = isMultineArray( value ); - if ( isArrayMultiLine ) - { - writeWithIndent( "[" ); - indent(); - bool hasChildValue = !childValues_.empty(); - unsigned index =0; - while ( true ) - { - const Value &childValue = value[index]; - writeCommentBeforeValue( childValue ); - if ( hasChildValue ) - writeWithIndent( childValues_[index] ); - else - { - writeIndent(); - writeValue( childValue ); - } - if ( ++index == size ) - { - writeCommentAfterValueOnSameLine( childValue ); - break; - } - document_ += ","; - writeCommentAfterValueOnSameLine( childValue ); - } - unindent(); - writeWithIndent( "]" ); - } - else // output on a single line - { - assert( childValues_.size() == size ); - document_ += "[ "; - for ( unsigned index =0; index < size; ++index ) - { - if ( index > 0 ) - document_ += ", "; - document_ += childValues_[index]; - } - document_ += " ]"; - } - } -} - - -bool -StyledWriter::isMultineArray( const Value &value ) -{ - int size = value.size(); - bool isMultiLine = size*3 >= rightMargin_ ; - childValues_.clear(); - for ( int index =0; index < size && !isMultiLine; ++index ) - { - const Value &childValue = value[index]; - isMultiLine = isMultiLine || - ( (childValue.isArray() || childValue.isObject()) && - childValue.size() > 0 ); - } - if ( !isMultiLine ) // check if line length > max line length - { - childValues_.reserve( size ); - addChildValues_ = true; - int lineLength = 4 + (size-1)*2; // '[ ' + ', '*n + ' ]' - for ( int index =0; index < size && !isMultiLine; ++index ) - { - writeValue( value[index] ); - lineLength += int( childValues_[index].length() ); - isMultiLine = isMultiLine && hasCommentForValue( value[index] ); - } - addChildValues_ = false; - isMultiLine = isMultiLine || lineLength >= rightMargin_; - } - return isMultiLine; -} - - -void -StyledWriter::pushValue( const std::string &value ) -{ - if ( addChildValues_ ) - childValues_.push_back( value ); - else - document_ += value; -} - - -void -StyledWriter::writeIndent() -{ - if ( !document_.empty() ) - { - char last = document_[document_.length()-1]; - if ( last == ' ' ) // already indented - return; - if ( last != '\n' ) // Comments may add new-line - document_ += '\n'; - } - document_ += indentString_; -} - - -void -StyledWriter::writeWithIndent( const std::string &value ) -{ - writeIndent(); - document_ += value; -} - - -void -StyledWriter::indent() -{ - indentString_ += std::string( indentSize_, ' ' ); -} - - -void -StyledWriter::unindent() -{ - assert( int(indentString_.size()) >= indentSize_ ); - indentString_.resize( indentString_.size() - indentSize_ ); -} - - -void -StyledWriter::writeCommentBeforeValue( const Value &root ) -{ - if ( !root.hasComment( commentBefore ) ) - return; - document_ += normalizeEOL( root.getComment( commentBefore ) ); - document_ += "\n"; -} - - -void -StyledWriter::writeCommentAfterValueOnSameLine( const Value &root ) -{ - if ( root.hasComment( commentAfterOnSameLine ) ) - document_ += " " + normalizeEOL( root.getComment( commentAfterOnSameLine ) ); - - if ( root.hasComment( commentAfter ) ) - { - document_ += "\n"; - document_ += normalizeEOL( root.getComment( commentAfter ) ); - document_ += "\n"; - } -} - - -bool -StyledWriter::hasCommentForValue( const Value &value ) -{ - return value.hasComment( commentBefore ) - || value.hasComment( commentAfterOnSameLine ) - || value.hasComment( commentAfter ); -} - - -std::string -StyledWriter::normalizeEOL( const std::string &text ) -{ - std::string normalized; - normalized.reserve( text.length() ); - const char *begin = text.c_str(); - const char *end = begin + text.length(); - const char *current = begin; - while ( current != end ) - { - char c = *current++; - if ( c == '\r' ) // mac or dos EOL - { - if ( *current == '\n' ) // convert dos EOL - ++current; - normalized += '\n'; - } - else // handle unix EOL & other char - normalized += c; - } - return normalized; -} - - -// Class StyledStreamWriter -// ////////////////////////////////////////////////////////////////// - -StyledStreamWriter::StyledStreamWriter( std::string indentation ) - : document_(NULL) - , rightMargin_( 74 ) - , indentation_( indentation ) -{ -} - - -void -StyledStreamWriter::write( std::ostream &out, const Value &root ) -{ - document_ = &out; - addChildValues_ = false; - indentString_ = ""; - writeCommentBeforeValue( root ); - writeValue( root ); - writeCommentAfterValueOnSameLine( root ); - *document_ << "\n"; - document_ = NULL; // Forget the stream, for safety. -} - - -void -StyledStreamWriter::writeValue( const Value &value ) -{ - switch ( value.type() ) - { - case nullValue: - pushValue( "null" ); - break; - case intValue: - pushValue( valueToString( value.asInt() ) ); - break; - case uintValue: - pushValue( valueToString( value.asUInt() ) ); - break; - case realValue: - pushValue( valueToString( value.asDouble() ) ); - break; - case stringValue: - pushValue( valueToQuotedString( value.asCString() ) ); - break; - case booleanValue: - pushValue( valueToString( value.asBool() ) ); - break; - case arrayValue: - writeArrayValue( value); - break; - case objectValue: - { - Value::Members members( value.getMemberNames() ); - if ( members.empty() ) - pushValue( "{}" ); - else - { - writeWithIndent( "{" ); - indent(); - Value::Members::iterator it = members.begin(); - while ( true ) - { - const std::string &name = *it; - const Value &childValue = value[name]; - writeCommentBeforeValue( childValue ); - writeWithIndent( valueToQuotedString( name.c_str() ) ); - *document_ << " : "; - writeValue( childValue ); - if ( ++it == members.end() ) - { - writeCommentAfterValueOnSameLine( childValue ); - break; - } - *document_ << ","; - writeCommentAfterValueOnSameLine( childValue ); - } - unindent(); - writeWithIndent( "}" ); - } - } - break; - } -} - - -void -StyledStreamWriter::writeArrayValue( const Value &value ) -{ - unsigned size = value.size(); - if ( size == 0 ) - pushValue( "[]" ); - else - { - bool isArrayMultiLine = isMultineArray( value ); - if ( isArrayMultiLine ) - { - writeWithIndent( "[" ); - indent(); - bool hasChildValue = !childValues_.empty(); - unsigned index =0; - while ( true ) - { - const Value &childValue = value[index]; - writeCommentBeforeValue( childValue ); - if ( hasChildValue ) - writeWithIndent( childValues_[index] ); - else - { - writeIndent(); - writeValue( childValue ); - } - if ( ++index == size ) - { - writeCommentAfterValueOnSameLine( childValue ); - break; - } - *document_ << ","; - writeCommentAfterValueOnSameLine( childValue ); - } - unindent(); - writeWithIndent( "]" ); - } - else // output on a single line - { - assert( childValues_.size() == size ); - *document_ << "[ "; - for ( unsigned index =0; index < size; ++index ) - { - if ( index > 0 ) - *document_ << ", "; - *document_ << childValues_[index]; - } - *document_ << " ]"; - } - } -} - - -bool -StyledStreamWriter::isMultineArray( const Value &value ) -{ - int size = value.size(); - bool isMultiLine = size*3 >= rightMargin_ ; - childValues_.clear(); - for ( int index =0; index < size && !isMultiLine; ++index ) - { - const Value &childValue = value[index]; - isMultiLine = isMultiLine || - ( (childValue.isArray() || childValue.isObject()) && - childValue.size() > 0 ); - } - if ( !isMultiLine ) // check if line length > max line length - { - childValues_.reserve( size ); - addChildValues_ = true; - int lineLength = 4 + (size-1)*2; // '[ ' + ', '*n + ' ]' - for ( int index =0; index < size && !isMultiLine; ++index ) - { - writeValue( value[index] ); - lineLength += int( childValues_[index].length() ); - isMultiLine = isMultiLine && hasCommentForValue( value[index] ); - } - addChildValues_ = false; - isMultiLine = isMultiLine || lineLength >= rightMargin_; - } - return isMultiLine; -} - - -void -StyledStreamWriter::pushValue( const std::string &value ) -{ - if ( addChildValues_ ) - childValues_.push_back( value ); - else - *document_ << value; -} - - -void -StyledStreamWriter::writeIndent() -{ - /* - Some comments in this method would have been nice. ;-) - - if ( !document_.empty() ) - { - char last = document_[document_.length()-1]; - if ( last == ' ' ) // already indented - return; - if ( last != '\n' ) // Comments may add new-line - *document_ << '\n'; - } - */ - *document_ << '\n' << indentString_; -} - - -void -StyledStreamWriter::writeWithIndent( const std::string &value ) -{ - writeIndent(); - *document_ << value; -} - - -void -StyledStreamWriter::indent() -{ - indentString_ += indentation_; -} - - -void -StyledStreamWriter::unindent() -{ - assert( indentString_.size() >= indentation_.size() ); - indentString_.resize( indentString_.size() - indentation_.size() ); -} - - -void -StyledStreamWriter::writeCommentBeforeValue( const Value &root ) -{ - if ( !root.hasComment( commentBefore ) ) - return; - *document_ << normalizeEOL( root.getComment( commentBefore ) ); - *document_ << "\n"; -} - - -void -StyledStreamWriter::writeCommentAfterValueOnSameLine( const Value &root ) -{ - if ( root.hasComment( commentAfterOnSameLine ) ) - *document_ << " " + normalizeEOL( root.getComment( commentAfterOnSameLine ) ); - - if ( root.hasComment( commentAfter ) ) - { - *document_ << "\n"; - *document_ << normalizeEOL( root.getComment( commentAfter ) ); - *document_ << "\n"; - } -} - - -bool -StyledStreamWriter::hasCommentForValue( const Value &value ) -{ - return value.hasComment( commentBefore ) - || value.hasComment( commentAfterOnSameLine ) - || value.hasComment( commentAfter ); -} - - -std::string -StyledStreamWriter::normalizeEOL( const std::string &text ) -{ - std::string normalized; - normalized.reserve( text.length() ); - const char *begin = text.c_str(); - const char *end = begin + text.length(); - const char *current = begin; - while ( current != end ) - { - char c = *current++; - if ( c == '\r' ) // mac or dos EOL - { - if ( *current == '\n' ) // convert dos EOL - ++current; - normalized += '\n'; - } - else // handle unix EOL & other char - normalized += c; - } - return normalized; -} - - -std::ostream& operator<<( std::ostream &sout, const Value &root ) -{ - Json::StyledStreamWriter writer; - writer.write(sout, root); - return sout; -} - - -} // namespace Json diff --git a/cordova-lib/spec-plugman/plugins/cordova.echo/src/blackberry10/native/public/plugin.cpp b/cordova-lib/spec-plugman/plugins/cordova.echo/src/blackberry10/native/public/plugin.cpp deleted file mode 100644 index 387fceaf1..000000000 --- a/cordova-lib/spec-plugman/plugins/cordova.echo/src/blackberry10/native/public/plugin.cpp +++ /dev/null @@ -1,320 +0,0 @@ -#include "plugin.h" -#include "tokenizer.h" - -#ifdef _WINDOWS -#include -BOOL APIENTRY DllMain( HANDLE hModule, - DWORD ul_reason_for_call, - LPVOID lpReserved ) -{ - return TRUE; -} -#else -#include -#include - -extern int errno; -#endif - -SendPluginEv SendPluginEvent; - -string g_GetSysErrMsg( void ) -{ - string strError = "Unknown"; - // Problem loading -#ifdef _WINDOWS - int nErrorCode = GetLastError(); - LPTSTR s; - if ( ::FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, - NULL, nErrorCode, 0, ( LPTSTR ) &s, 0, NULL ) ) - { - strError = s; - } - else - { - char szBuf[ 20 ]; - _snprintf_s( szBuf, _countof(szBuf), 19, "%d", nErrorCode ); - strError = szBuf; - } -#else - char szError[80]; - if ( strerror_r( errno, szError, sizeof(szError) ) ) - { - strError = "no description found"; - } - else - { - strError = szError; - } -#endif - return strError; -} - -void g_sleep( unsigned int mseconds ) -{ -#ifdef _WINDOWS - Sleep( mseconds ); -#else - usleep( mseconds * 1000 ); -#endif -} - -string& g_trim( string& str ) -{ - // Whitespace characters - char whspc[] = " \t\r\n\v\f"; - - // Whack off first part - size_t pos = str.find_first_not_of( whspc ); - - if ( pos != string::npos ) - str.replace( 0, pos, "" ); - - // Whack off trailing stuff - pos = str.find_last_not_of( whspc ); - - if ( pos != string::npos ) - str.replace( pos + 1, str.length() - pos, "" ); - - return str; -} - -void g_tokenize( const string& str, const string& delimiters, vector& tokens ) -{ - tokenize( str, tokens, delimiters ); -} - -char* SetEventFunc( SendPluginEv funcPtr ) -{ - static char * szObjList = onGetObjList(); - SendPluginEvent = funcPtr; - return szObjList; -} - - -const int nMAXSIZE = 512; -char* g_pszRetVal = NULL; - -//----------------------------------------------------------- -// Map from an object Id to an object instance -//----------------------------------------------------------- -typedef std::map StringToJExt_T; - -//----------------------------------------------------------- -// Map from a browser context to an id mapping -//----------------------------------------------------------- -typedef std::map VoidToMap_T; - -VoidToMap_T g_context2Map; - -class GlobalSharedModule -{ - -public: - GlobalSharedModule( void ) - { - g_pszRetVal = new char[ nMAXSIZE ]; - } - - ~GlobalSharedModule() - { - delete [] g_pszRetVal; - - VoidToMap_T::iterator posMaps; - - for ( posMaps = g_context2Map.begin(); posMaps != g_context2Map.end(); ++posMaps ) - { - StringToJExt_T& id2Obj = *posMaps->second; - StringToJExt_T::iterator posMap; - - for ( posMap = id2Obj.begin(); posMap != id2Obj.end(); ++posMap ) - { - JSExt* pJSExt = posMap->second; - - if ( pJSExt->CanDelete() ) - { - delete pJSExt; - } - } - - id2Obj.erase( id2Obj.begin(), id2Obj.end() ); - } - - g_context2Map.erase( g_context2Map.begin(), g_context2Map.end() ); - } -}; - -GlobalSharedModule g_sharedModule; - -char* g_str2global( const string& strRetVal ) -{ - int nLen = strRetVal.size(); - - if ( nLen >= nMAXSIZE ) - { - delete [] g_pszRetVal; - g_pszRetVal = new char[ nLen + 1 ]; - } - - else - { - // To minimize the number of memory reallocations, the assumption - // is that in most times this will be the case - delete [] g_pszRetVal; - g_pszRetVal = new char[ nMAXSIZE ]; - } - - strcpy( g_pszRetVal, strRetVal.c_str() ); - return g_pszRetVal; -} - -bool g_unregisterObject( const string& strObjId, void* pContext ) -{ - // Called by the plugin extension implementation - // if the extension handles the deletion of its object - - StringToJExt_T * pID2Obj = NULL; - - VoidToMap_T::iterator iter = g_context2Map.find( pContext ); - - if ( iter != g_context2Map.end() ) - { - pID2Obj = iter->second; - } - else - { - return false; - } - - StringToJExt_T& mapID2Obj = *pID2Obj; - - StringToJExt_T::iterator r = mapID2Obj.find( strObjId ); - - if ( r == mapID2Obj.end() ) - { - return false; - } - - mapID2Obj.erase( strObjId ); - return true; -} - -char* InvokeFunction( const char* szCommand, void* pContext ) -{ - StringToJExt_T * pID2Obj = NULL; - - VoidToMap_T::iterator iter = g_context2Map.find( pContext ); - - if ( iter != g_context2Map.end() ) - { - pID2Obj = iter->second; - } - else - { - pID2Obj = new StringToJExt_T; - g_context2Map[ pContext ] = pID2Obj; - } - - StringToJExt_T& mapID2Obj = *pID2Obj; - - string strFullCommand = szCommand; - vector arParams; - g_tokenize( strFullCommand, " ", arParams ); - string strCommand = arParams[ 0 ]; - string strRetVal = szERROR; - - if ( strCommand == szCREATE ) - { - string strClassName = arParams[ 1 ]; - string strObjId = arParams[ 2 ]; - - StringToJExt_T::iterator r = mapID2Obj.find( strObjId ); - - if ( r != mapID2Obj.end() ) - { - strRetVal += strObjId; - strRetVal += " :Object already exists."; - return g_str2global( strRetVal ); - } - - JSExt* pJSExt = onCreateObject( strClassName, strObjId ); - - if ( pJSExt == NULL ) - { - strRetVal += strObjId; - strRetVal += " :Unknown object type "; - strRetVal += strClassName; - return g_str2global( strRetVal ); - } - - pJSExt->m_pContext = pContext; - mapID2Obj[ strObjId ] = pJSExt; - - strRetVal = szOK; - strRetVal += strObjId; - return g_str2global( strRetVal ); - } - else - if ( strCommand == szINVOKE ) - { - string strObjId = arParams[ 1 ]; - string strMethod = arParams[ 2 ]; - - StringToJExt_T::iterator r = mapID2Obj.find( strObjId ); - - if ( r == mapID2Obj.end() ) - { - strRetVal += strObjId; - strRetVal += " :No object found for id."; - return g_str2global( strRetVal ); - } - - JSExt* pJSExt = r->second; - - size_t nLoc = strFullCommand.find( strObjId ); - - if ( nLoc == string::npos ) - { - strRetVal += strObjId; - strRetVal += " :Internal InvokeMethod error."; - return g_str2global( strRetVal ); - } - - if ( strMethod == szDISPOSE ) - { - StringToJExt_T::iterator r = mapID2Obj.find( strObjId ); - - if ( r == mapID2Obj.end() ) - { - strRetVal = szERROR; - strRetVal += strObjId; - return g_str2global( strRetVal ); - } - - JSExt * pJSExt = mapID2Obj[ strObjId ]; - - if ( pJSExt->CanDelete() ) - { - delete pJSExt; - } - - mapID2Obj.erase( strObjId ); - strRetVal = szOK; - strRetVal += strObjId; - return g_str2global( strRetVal ); - } - - size_t nSuffixLoc = nLoc + strObjId.size(); - string strInvoke = strFullCommand.substr( nSuffixLoc ); - strInvoke = g_trim( strInvoke ); - strRetVal = pJSExt->InvokeMethod( strInvoke ); - return g_str2global( strRetVal ); - } - - strRetVal += " :Unknown command "; - strRetVal += strCommand; - return g_str2global( strRetVal ); -} - -//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - diff --git a/cordova-lib/spec-plugman/plugins/cordova.echo/src/blackberry10/native/public/plugin.h b/cordova-lib/spec-plugman/plugins/cordova.echo/src/blackberry10/native/public/plugin.h deleted file mode 100644 index 4ef711691..000000000 --- a/cordova-lib/spec-plugman/plugins/cordova.echo/src/blackberry10/native/public/plugin.h +++ /dev/null @@ -1,70 +0,0 @@ -#ifndef _PLUGIN_H -#define _PLUGIN_H - -#include -#include -#include -#include -//#include "tokenizer.h" - -using namespace std; - -//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -//%% Functions exported by this DLL -//%% Should always be only SetEventFunc and InvokeFunction -//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -// g++ requires extern "C" otherwise the names of SetEventFunc and InvokeFunction -// are mangled C++ style. MS Visual Studio doesn't seem to care though. -extern "C" -{ - typedef void (*SendPluginEv)( const char* szEvent, void* pContext ); - char* SetEventFunc(SendPluginEv funcPtr); - char* InvokeFunction( const char* szCommand, void* pContext ); -} - -// JNEXT Framework function of the form: -// typedef void (*SendPluginEv)( const char* szEvent ); -// used to notify JavaScript of an asynchronous event -extern SendPluginEv SendPluginEvent; - -///////////////////////////////////////////////////////////////////////// -// Constants and methods common to all JNEXT extensions types -///////////////////////////////////////////////////////////////////////// -#define szERROR "Error " -#define szOK "Ok " - -#define szDISPOSE "Dispose" -#define szINVOKE "InvokeMethod" -#define szCREATE "CreateObj" - -///////////////////////////////////////////////////////////////////////// -// Utility functions -///////////////////////////////////////////////////////////////////////// -string& g_trim( string& str ); -void g_tokenize(const string& str,const string& delimiters, vector& tokens); -char* g_str2static( const string& strRetVal ); -void g_sleep( unsigned int mseconds ); -bool g_unregisterObject( const string& strObjId, void* pContext ); - - -///////////////////////////////////////////////////////////////////////// -// Abstract extension object -///////////////////////////////////////////////////////////////////////// -class JSExt -{ -public: - virtual ~JSExt() {}; - virtual string InvokeMethod( const string& strCommand ) = 0; - virtual bool CanDelete( void ) = 0; - virtual void TryDelete( void ) {} -public: - void* m_pContext; -}; - -///////////////////////////////////////////////////////////////////////// -// Callback functions to be implemented by the plugin implementation -///////////////////////////////////////////////////////////////////////// -extern char* onGetObjList( void ); -extern JSExt* onCreateObject( const string& strClassName, const string& strObjId ); - -#endif diff --git a/cordova-lib/spec-plugman/plugins/cordova.echo/src/blackberry10/native/public/tokenizer.cpp b/cordova-lib/spec-plugman/plugins/cordova.echo/src/blackberry10/native/public/tokenizer.cpp deleted file mode 100644 index 4a39573b9..000000000 --- a/cordova-lib/spec-plugman/plugins/cordova.echo/src/blackberry10/native/public/tokenizer.cpp +++ /dev/null @@ -1,222 +0,0 @@ -/************************************************************************ -The zlib/libpng License - -Copyright (c) 2006 Joerg Wiedenmann - -This software is provided 'as-is', without any express or implied warranty. -In no event will the authors be held liable for any damages arising from -the use of this software. - -Permission is granted to anyone to use this software for any purpose, -including commercial applications, and to alter it and redistribute it -freely, subject to the following restrictions: - -1. The origin of this software must not be misrepresented; -you must not claim that you wrote the original software. -If you use this software in a product, an acknowledgment -in the product documentation would be appreciated but is -not required. - -2. Altered source versions must be plainly marked as such, -and must not be misrepresented as being the original software. - -3. This notice may not be removed or altered from any source distribution. - -***********************************************************************/ - -/******************************************************************** - created: 2006-01-28 - filename: tokenizer.cpp - author: Jörg Wiedenmann - - purpose: A tokenizer function which provides a very - customizable way of breaking up strings. - - history: 2006-01-28, Original version - 2006-03-04, Fixed a small parsing bug, thanks Elias. -*********************************************************************/ - -#include "tokenizer.h" - -using namespace std; - -void tokenize ( const string& str, vector& result, - const string& delimiters, const string& delimiters_preserve, - const string& quote, const string& esc ) -{ - // clear the vector - if ( false == result.empty() ) - { - result.clear(); - } - - string::size_type pos = 0; // the current position (char) in the string - char ch = 0; // buffer for the current character - char delimiter = 0; // the buffer for the delimiter char which - // will be added to the tokens if the delimiter - // is preserved - char current_quote = 0; // the char of the current open quote - bool quoted = false; // indicator if there is an open quote - string token; // string buffer for the token - bool token_complete = false; // indicates if the current token is - // read to be added to the result vector - string::size_type len = str.length(); // length of the input-string - - // for every char in the input-string - while ( len > pos ) - { - // get the character of the string and reset the delimiter buffer - ch = str.at(pos); - delimiter = 0; - - // assume ch isn't a delimiter - bool add_char = true; - - // check ... - - // ... if the delimiter is an escaped character - bool escaped = false; // indicates if the next char is protected - if ( false == esc.empty() ) // check if esc-chars are provided - { - if ( string::npos != esc.find_first_of(ch) ) - { - // get the escaped char - ++pos; - if ( pos < len ) // if there are more chars left - { - // get the next one - ch = str.at(pos); - - // add the escaped character to the token - add_char = true; - } - else // cannot get any more characters - { - // don't add the esc-char - add_char = false; - } - - // ignore the remaining delimiter checks - escaped = true; - } - } - - // ... if the delimiter is a quote - if ( false == quote.empty() && false == escaped ) - { - // if quote chars are provided and the char isn't protected - if ( string::npos != quote.find_first_of(ch) ) - { - // if not quoted, set state to open quote and set - // the quote character - if ( false == quoted ) - { - quoted = true; - current_quote = ch; - - // don't add the quote-char to the token - add_char = false; - } - else // if quote is open already - { - // check if it is the matching character to close it - if ( current_quote == ch ) - { - // close quote and reset the quote character - quoted = false; - current_quote = 0; - - // don't add the quote-char to the token - add_char = false; - } - } // else - } - } - - // ... if the delimiter isn't preserved - if ( false == delimiters.empty() && false == escaped && - false == quoted ) - { - // if a delimiter is provided and the char isn't protected by - // quote or escape char - if ( string::npos != delimiters.find_first_of(ch) ) - { - // if ch is a delimiter and the token string isn't empty - // the token is complete - if ( false == token.empty() ) // BUGFIX: 2006-03-04 - { - token_complete = true; - } - - // don't add the delimiter to the token - add_char = false; - } - } - - // ... if the delimiter is preserved - add it as a token - bool add_delimiter = false; - if ( false == delimiters_preserve.empty() && false == escaped && - false == quoted ) - { - // if a delimiter which will be preserved is provided and the - // char isn't protected by quote or escape char - if ( string::npos != delimiters_preserve.find_first_of(ch) ) - { - // if ch is a delimiter and the token string isn't empty - // the token is complete - if ( false == token.empty() ) // BUGFIX: 2006-03-04 - { - token_complete = true; - } - - // don't add the delimiter to the token - add_char = false; - - // add the delimiter - delimiter = ch; - add_delimiter = true; - } - } - - - // add the character to the token - if ( true == add_char ) - { - // add the current char - token.push_back( ch ); - } - - // add the token if it is complete - if ( true == token_complete && false == token.empty() ) - { - // add the token string - result.push_back( token ); - - // clear the contents - token.clear(); - - // build the next token - token_complete = false; - } - - // add the delimiter - if ( true == add_delimiter ) - { - // the next token is the delimiter - string delim_token; - delim_token.push_back( delimiter ); - result.push_back( delim_token ); - - // REMOVED: 2006-03-04, Bugfix - } - - // repeat for the next character - ++pos; - } // while - - // add the final token - if ( false == token.empty() ) - { - result.push_back( token ); - } -} diff --git a/cordova-lib/spec-plugman/plugins/cordova.echo/src/blackberry10/native/public/tokenizer.h b/cordova-lib/spec-plugman/plugins/cordova.echo/src/blackberry10/native/public/tokenizer.h deleted file mode 100644 index 75f567ceb..000000000 --- a/cordova-lib/spec-plugman/plugins/cordova.echo/src/blackberry10/native/public/tokenizer.h +++ /dev/null @@ -1,55 +0,0 @@ -/************************************************************************ -The zlib/libpng License - -Copyright (c) 2006 Joerg Wiedenmann - -This software is provided 'as-is', without any express or implied warranty. -In no event will the authors be held liable for any damages arising from -the use of this software. - -Permission is granted to anyone to use this software for any purpose, -including commercial applications, and to alter it and redistribute it -freely, subject to the following restrictions: - -1. The origin of this software must not be misrepresented; - you must not claim that you wrote the original software. - If you use this software in a product, an acknowledgment - in the product documentation would be appreciated but is - not required. - -2. Altered source versions must be plainly marked as such, - and must not be misrepresented as being the original software. - -3. This notice may not be removed or altered from any source distribution. - -***********************************************************************/ - -/******************************************************************** - created: 2006-01-28 - filename: tokenizer.cpp - author: Jörg Wiedenmann - - purpose: A tokenizer function which provides a very - customizable way of breaking up strings. -*********************************************************************/ - -#include -#include -using namespace std; - -// Function to break up a string into tokens -// -// Parameters: -//----------- -// str = the input string that will be tokenized -// result = the tokens for str -// delimiters = the delimiter characters -// delimiters preserve = same as above, but the delimiter characters -// will be put into the result as a token -// quote = characters to protect the enclosed characters -// esc = characters to protect a single character -// - -void tokenize ( const string& str, vector& result, - const string& delimiters, const string& delimiters_preserve = "", - const string& quote = "\"", const string& esc = "\\" ); diff --git a/cordova-lib/spec-plugman/plugins/cordova.echo/src/blackberry10/native/simulator/echoJnext.so b/cordova-lib/spec-plugman/plugins/cordova.echo/src/blackberry10/native/simulator/echoJnext.so deleted file mode 100644 index 2b3c5f5486d29871ad41fce91cbdcdf5c9347bec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 231778 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 z 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 KM{=zB2>c(tnf}B8 diff --git a/cordova-lib/spec-plugman/plugins/cordova.echo/src/blackberry10/native/src/echo.cpp b/cordova-lib/spec-plugman/plugins/cordova.echo/src/blackberry10/native/src/echo.cpp deleted file mode 100644 index 0d5cc2f85..000000000 --- a/cordova-lib/spec-plugman/plugins/cordova.echo/src/blackberry10/native/src/echo.cpp +++ /dev/null @@ -1,121 +0,0 @@ -/* - * - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - * -*/ - - -#include <../public/json/reader.h> -#include -#include -#include -#include -#include -#include -#include "echo.hpp" - -using namespace std; - -/** - * Default constructor. - */ -Echo::Echo(const std::string& id) : m_id(id) { -} - -/** - * Memory destructor. - */ -Echo::~Echo() { -} - -/** - * This method returns the list of objects implemented by this native - * extension. - */ -char* onGetObjList() { - static char name[] = "Echo"; - return name; -} - -/** - * This method is used by JNext to instantiate the Memory object when - * an object is created on the JavaScript server side. - */ -JSExt* onCreateObject(const string& className, const string& id) { - if (className == "Echo") { - return new Echo(id); - } - - return NULL; -} - -/** - * Method used by JNext to determine if the object can be deleted. - */ -bool Echo::CanDelete() { - return true; -} - -/** - * It will be called from JNext JavaScript side with passed string. - * This method implements the interface for the JavaScript to native binding - * for invoking native code. This method is triggered when JNext.invoke is - * called on the JavaScript side with this native objects id. - */ -string Echo::InvokeMethod(const string& command) { - int index = command.find_first_of(" "); - std::string method = command.substr(0, index); - - // read in arguments - Json::Value obj; - if (static_cast(command.length()) > index && index != -1) { - std::string jsonObject = command.substr(index + 1, command.length()); - Json::Reader reader; - - bool parse = reader.parse(jsonObject, obj); - if (!parse) { - fprintf(stderr, "%s", "error parsing\n"); - return "Cannot parse JSON object"; - } - } - - // Determine which function should be executed - if (method == "doEcho") { - std::string message = obj["message"].asString(); - if(message.length() > 0) { - return doEcho(message); - }else{ - return doEcho("Nothing to echo."); - } - }else{ - return doEcho("Unsupported Method"); - } -} - -/** - * Method that sends off Event message - */ -string Echo::doEcho(const std::string& message) { - std::string eventString = m_id; - eventString.append(" "); - eventString.append("cordova.echo.callback"); - eventString.append(" "); - eventString.append(message); - SendPluginEvent(eventString.c_str(), m_pContext); - return eventString; -} diff --git a/cordova-lib/spec-plugman/plugins/cordova.echo/src/blackberry10/native/src/echo.hpp b/cordova-lib/spec-plugman/plugins/cordova.echo/src/blackberry10/native/src/echo.hpp deleted file mode 100644 index 408be6964..000000000 --- a/cordova-lib/spec-plugman/plugins/cordova.echo/src/blackberry10/native/src/echo.hpp +++ /dev/null @@ -1,45 +0,0 @@ -/* - * - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - * -*/ - -#ifndef ECHO_HPP_ -#define ECHO_HPP_ - -#include -#include -#include "../public/plugin.h" - -class Echo: public JSExt { - -public: - explicit Echo(const std::string& id); - virtual ~Echo(); - -// Interfaces of JSExt - virtual bool CanDelete(); - virtual std::string InvokeMethod(const std::string& command); - -private: - std::string doEcho(const std::string& message); - - std::string m_id; -}; - -#endif /* ECHO_HPP_ */ diff --git a/cordova-lib/spec-plugman/plugins/cordova.echo/www/client.js b/cordova-lib/spec-plugman/plugins/cordova.echo/www/client.js deleted file mode 100644 index 4e7a1b3ce..000000000 --- a/cordova-lib/spec-plugman/plugins/cordova.echo/www/client.js +++ /dev/null @@ -1,53 +0,0 @@ -/* - * - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - * -*/ - -var _self = {}, - _ID = require("./manifest.json").namespace, - win = null, - fail = null; - -function handleCallback(result) { - if (result) { - if(win){ - win(result); - } - } else { - if(fail){ - fail(result); - } - } - win = null; - fail = null; -} - -_self.doEcho = function (args, theWin, theFail) { - var data = { "message" : args.message || "" }; - - win = theWin; - fail = theFail; - - window.webworks.event.add(_ID, "echoCallback", handleCallback); - - return window.webworks.execSync(_ID, "doEcho", data); -}; - - -module.exports = _self; diff --git a/cordova-lib/spec-plugman/plugins/dependencies/A/plugin.xml b/cordova-lib/spec-plugman/plugins/dependencies/A/plugin.xml deleted file mode 100644 index ec83e8c2f..000000000 --- a/cordova-lib/spec-plugman/plugins/dependencies/A/plugin.xml +++ /dev/null @@ -1,60 +0,0 @@ - - - - - - Plugin A - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/cordova-lib/spec-plugman/plugins/dependencies/A/src/android/A.java b/cordova-lib/spec-plugman/plugins/dependencies/A/src/android/A.java deleted file mode 100644 index e69de29bb..000000000 diff --git a/cordova-lib/spec-plugman/plugins/dependencies/A/src/ios/APluginCommand.h b/cordova-lib/spec-plugman/plugins/dependencies/A/src/ios/APluginCommand.h deleted file mode 100644 index e69de29bb..000000000 diff --git a/cordova-lib/spec-plugman/plugins/dependencies/A/src/ios/APluginCommand.m b/cordova-lib/spec-plugman/plugins/dependencies/A/src/ios/APluginCommand.m deleted file mode 100644 index e69de29bb..000000000 diff --git a/cordova-lib/spec-plugman/plugins/dependencies/A/www/plugin-a.js b/cordova-lib/spec-plugman/plugins/dependencies/A/www/plugin-a.js deleted file mode 100644 index e69de29bb..000000000 diff --git a/cordova-lib/spec-plugman/plugins/dependencies/B/plugin.xml b/cordova-lib/spec-plugman/plugins/dependencies/B/plugin.xml deleted file mode 100644 index ee32e2d46..000000000 --- a/cordova-lib/spec-plugman/plugins/dependencies/B/plugin.xml +++ /dev/null @@ -1,60 +0,0 @@ - - - - - - Plugin B - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/cordova-lib/spec-plugman/plugins/dependencies/B/src/android/B.java b/cordova-lib/spec-plugman/plugins/dependencies/B/src/android/B.java deleted file mode 100644 index e69de29bb..000000000 diff --git a/cordova-lib/spec-plugman/plugins/dependencies/B/src/ios/BPluginCommand.h b/cordova-lib/spec-plugman/plugins/dependencies/B/src/ios/BPluginCommand.h deleted file mode 100644 index e69de29bb..000000000 diff --git a/cordova-lib/spec-plugman/plugins/dependencies/B/src/ios/BPluginCommand.m b/cordova-lib/spec-plugman/plugins/dependencies/B/src/ios/BPluginCommand.m deleted file mode 100644 index e69de29bb..000000000 diff --git a/cordova-lib/spec-plugman/plugins/dependencies/B/www/plugin-b.js b/cordova-lib/spec-plugman/plugins/dependencies/B/www/plugin-b.js deleted file mode 100644 index e69de29bb..000000000 diff --git a/cordova-lib/spec-plugman/plugins/dependencies/C/plugin.xml b/cordova-lib/spec-plugman/plugins/dependencies/C/plugin.xml deleted file mode 100644 index 88c2d2cdb..000000000 --- a/cordova-lib/spec-plugman/plugins/dependencies/C/plugin.xml +++ /dev/null @@ -1,57 +0,0 @@ - - - - - - Plugin C - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/cordova-lib/spec-plugman/plugins/dependencies/C/src/android/C.java b/cordova-lib/spec-plugman/plugins/dependencies/C/src/android/C.java deleted file mode 100644 index e69de29bb..000000000 diff --git a/cordova-lib/spec-plugman/plugins/dependencies/C/src/ios/CPluginCommand.h b/cordova-lib/spec-plugman/plugins/dependencies/C/src/ios/CPluginCommand.h deleted file mode 100644 index e69de29bb..000000000 diff --git a/cordova-lib/spec-plugman/plugins/dependencies/C/src/ios/CPluginCommand.m b/cordova-lib/spec-plugman/plugins/dependencies/C/src/ios/CPluginCommand.m deleted file mode 100644 index e69de29bb..000000000 diff --git a/cordova-lib/spec-plugman/plugins/dependencies/C/www/plugin-c.js b/cordova-lib/spec-plugman/plugins/dependencies/C/www/plugin-c.js deleted file mode 100644 index e69de29bb..000000000 diff --git a/cordova-lib/spec-plugman/plugins/dependencies/D/plugin.xml b/cordova-lib/spec-plugman/plugins/dependencies/D/plugin.xml deleted file mode 100644 index f07b06377..000000000 --- a/cordova-lib/spec-plugman/plugins/dependencies/D/plugin.xml +++ /dev/null @@ -1,57 +0,0 @@ - - - - - - Plugin D - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/cordova-lib/spec-plugman/plugins/dependencies/D/src/android/D.java b/cordova-lib/spec-plugman/plugins/dependencies/D/src/android/D.java deleted file mode 100644 index e69de29bb..000000000 diff --git a/cordova-lib/spec-plugman/plugins/dependencies/D/src/ios/DPluginCommand.h b/cordova-lib/spec-plugman/plugins/dependencies/D/src/ios/DPluginCommand.h deleted file mode 100644 index e69de29bb..000000000 diff --git a/cordova-lib/spec-plugman/plugins/dependencies/D/src/ios/DPluginCommand.m b/cordova-lib/spec-plugman/plugins/dependencies/D/src/ios/DPluginCommand.m deleted file mode 100644 index e69de29bb..000000000 diff --git a/cordova-lib/spec-plugman/plugins/dependencies/D/www/plugin-d.js b/cordova-lib/spec-plugman/plugins/dependencies/D/www/plugin-d.js deleted file mode 100644 index e69de29bb..000000000 diff --git a/cordova-lib/spec-plugman/plugins/dependencies/E/plugin.xml b/cordova-lib/spec-plugman/plugins/dependencies/E/plugin.xml deleted file mode 100644 index bb28fa12d..000000000 --- a/cordova-lib/spec-plugman/plugins/dependencies/E/plugin.xml +++ /dev/null @@ -1,59 +0,0 @@ - - - - - - Plugin E - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/cordova-lib/spec-plugman/plugins/dependencies/E/src/android/E.java b/cordova-lib/spec-plugman/plugins/dependencies/E/src/android/E.java deleted file mode 100644 index e69de29bb..000000000 diff --git a/cordova-lib/spec-plugman/plugins/dependencies/E/src/ios/EPluginCommand.h b/cordova-lib/spec-plugman/plugins/dependencies/E/src/ios/EPluginCommand.h deleted file mode 100644 index e69de29bb..000000000 diff --git a/cordova-lib/spec-plugman/plugins/dependencies/E/src/ios/EPluginCommand.m b/cordova-lib/spec-plugman/plugins/dependencies/E/src/ios/EPluginCommand.m deleted file mode 100644 index e69de29bb..000000000 diff --git a/cordova-lib/spec-plugman/plugins/dependencies/E/www/plugin-d.js b/cordova-lib/spec-plugman/plugins/dependencies/E/www/plugin-d.js deleted file mode 100644 index e69de29bb..000000000 diff --git a/cordova-lib/spec-plugman/plugins/dependencies/F/plugin.xml b/cordova-lib/spec-plugman/plugins/dependencies/F/plugin.xml deleted file mode 100644 index 86869bab4..000000000 --- a/cordova-lib/spec-plugman/plugins/dependencies/F/plugin.xml +++ /dev/null @@ -1,60 +0,0 @@ - - - - - - Plugin F - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/cordova-lib/spec-plugman/plugins/dependencies/F/src/android/F.java b/cordova-lib/spec-plugman/plugins/dependencies/F/src/android/F.java deleted file mode 100644 index e69de29bb..000000000 diff --git a/cordova-lib/spec-plugman/plugins/dependencies/F/src/ios/FPluginCommand.h b/cordova-lib/spec-plugman/plugins/dependencies/F/src/ios/FPluginCommand.h deleted file mode 100644 index e69de29bb..000000000 diff --git a/cordova-lib/spec-plugman/plugins/dependencies/F/src/ios/FPluginCommand.m b/cordova-lib/spec-plugman/plugins/dependencies/F/src/ios/FPluginCommand.m deleted file mode 100644 index e69de29bb..000000000 diff --git a/cordova-lib/spec-plugman/plugins/dependencies/F/www/plugin-f.js b/cordova-lib/spec-plugman/plugins/dependencies/F/www/plugin-f.js deleted file mode 100644 index e69de29bb..000000000 diff --git a/cordova-lib/spec-plugman/plugins/dependencies/G/plugin.xml b/cordova-lib/spec-plugman/plugins/dependencies/G/plugin.xml deleted file mode 100644 index 0e365daf6..000000000 --- a/cordova-lib/spec-plugman/plugins/dependencies/G/plugin.xml +++ /dev/null @@ -1,59 +0,0 @@ - - - - - - Plugin G - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/cordova-lib/spec-plugman/plugins/dependencies/G/src/android/G.java b/cordova-lib/spec-plugman/plugins/dependencies/G/src/android/G.java deleted file mode 100644 index e69de29bb..000000000 diff --git a/cordova-lib/spec-plugman/plugins/dependencies/G/src/ios/EPluginCommand.m b/cordova-lib/spec-plugman/plugins/dependencies/G/src/ios/EPluginCommand.m deleted file mode 100644 index e69de29bb..000000000 diff --git a/cordova-lib/spec-plugman/plugins/dependencies/G/src/ios/GPluginCommand.h b/cordova-lib/spec-plugman/plugins/dependencies/G/src/ios/GPluginCommand.h deleted file mode 100644 index e69de29bb..000000000 diff --git a/cordova-lib/spec-plugman/plugins/dependencies/G/www/plugin-g.js b/cordova-lib/spec-plugman/plugins/dependencies/G/www/plugin-g.js deleted file mode 100644 index e69de29bb..000000000 diff --git a/cordova-lib/spec-plugman/plugins/dependencies/H/plugin.xml b/cordova-lib/spec-plugman/plugins/dependencies/H/plugin.xml deleted file mode 100644 index e72a19a06..000000000 --- a/cordova-lib/spec-plugman/plugins/dependencies/H/plugin.xml +++ /dev/null @@ -1,59 +0,0 @@ - - - - - - Plugin H - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/cordova-lib/spec-plugman/plugins/dependencies/H/src/android/H.java b/cordova-lib/spec-plugman/plugins/dependencies/H/src/android/H.java deleted file mode 100644 index e69de29bb..000000000 diff --git a/cordova-lib/spec-plugman/plugins/dependencies/H/src/ios/HPluginCommand.h b/cordova-lib/spec-plugman/plugins/dependencies/H/src/ios/HPluginCommand.h deleted file mode 100644 index e69de29bb..000000000 diff --git a/cordova-lib/spec-plugman/plugins/dependencies/H/src/ios/HPluginCommand.m b/cordova-lib/spec-plugman/plugins/dependencies/H/src/ios/HPluginCommand.m deleted file mode 100644 index e69de29bb..000000000 diff --git a/cordova-lib/spec-plugman/plugins/dependencies/H/www/plugin-h.js b/cordova-lib/spec-plugman/plugins/dependencies/H/www/plugin-h.js deleted file mode 100644 index e69de29bb..000000000 diff --git a/cordova-lib/spec-plugman/plugins/dependencies/README.md b/cordova-lib/spec-plugman/plugins/dependencies/README.md deleted file mode 100644 index 0955be526..000000000 --- a/cordova-lib/spec-plugman/plugins/dependencies/README.md +++ /dev/null @@ -1,10 +0,0 @@ -Here's a general overview of how the plugins in this directory are dependent on each other: - - F - / \ - A \ B - / \ \ / \ - C '---D--' E - - - G <-> H diff --git a/cordova-lib/spec-plugman/plugins/dependencies/meta/D/plugin.xml b/cordova-lib/spec-plugman/plugins/dependencies/meta/D/plugin.xml deleted file mode 100644 index 941bd5755..000000000 --- a/cordova-lib/spec-plugman/plugins/dependencies/meta/D/plugin.xml +++ /dev/null @@ -1,61 +0,0 @@ - - - - - - Plugin D - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/cordova-lib/spec-plugman/plugins/dependencies/meta/D/src/android/D.java b/cordova-lib/spec-plugman/plugins/dependencies/meta/D/src/android/D.java deleted file mode 100644 index e69de29bb..000000000 diff --git a/cordova-lib/spec-plugman/plugins/dependencies/meta/D/src/ios/DPluginCommand.h b/cordova-lib/spec-plugman/plugins/dependencies/meta/D/src/ios/DPluginCommand.h deleted file mode 100644 index e69de29bb..000000000 diff --git a/cordova-lib/spec-plugman/plugins/dependencies/meta/D/src/ios/DPluginCommand.m b/cordova-lib/spec-plugman/plugins/dependencies/meta/D/src/ios/DPluginCommand.m deleted file mode 100644 index e69de29bb..000000000 diff --git a/cordova-lib/spec-plugman/plugins/dependencies/meta/D/www/plugin-d.js b/cordova-lib/spec-plugman/plugins/dependencies/meta/D/www/plugin-d.js deleted file mode 100644 index e69de29bb..000000000 diff --git a/cordova-lib/spec-plugman/plugins/dependencies/meta/subdir/E/plugin.xml b/cordova-lib/spec-plugman/plugins/dependencies/meta/subdir/E/plugin.xml deleted file mode 100644 index 57d96d9ed..000000000 --- a/cordova-lib/spec-plugman/plugins/dependencies/meta/subdir/E/plugin.xml +++ /dev/null @@ -1,57 +0,0 @@ - - - - - - Plugin E - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/cordova-lib/spec-plugman/plugins/dependencies/meta/subdir/E/src/android/E.java b/cordova-lib/spec-plugman/plugins/dependencies/meta/subdir/E/src/android/E.java deleted file mode 100644 index e69de29bb..000000000 diff --git a/cordova-lib/spec-plugman/plugins/dependencies/meta/subdir/E/src/ios/EPluginCommand.h b/cordova-lib/spec-plugman/plugins/dependencies/meta/subdir/E/src/ios/EPluginCommand.h deleted file mode 100644 index e69de29bb..000000000 diff --git a/cordova-lib/spec-plugman/plugins/dependencies/meta/subdir/E/src/ios/EPluginCommand.m b/cordova-lib/spec-plugman/plugins/dependencies/meta/subdir/E/src/ios/EPluginCommand.m deleted file mode 100644 index e69de29bb..000000000 diff --git a/cordova-lib/spec-plugman/plugins/dependencies/meta/subdir/E/www/plugin-e.js b/cordova-lib/spec-plugman/plugins/dependencies/meta/subdir/E/www/plugin-e.js deleted file mode 100644 index e69de29bb..000000000 diff --git a/cordova-lib/spec-plugman/plugins/dependencies/subdir/E/plugin.xml b/cordova-lib/spec-plugman/plugins/dependencies/subdir/E/plugin.xml deleted file mode 100644 index 57d96d9ed..000000000 --- a/cordova-lib/spec-plugman/plugins/dependencies/subdir/E/plugin.xml +++ /dev/null @@ -1,57 +0,0 @@ - - - - - - Plugin E - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/cordova-lib/spec-plugman/plugins/dependencies/subdir/E/src/android/E.java b/cordova-lib/spec-plugman/plugins/dependencies/subdir/E/src/android/E.java deleted file mode 100644 index e69de29bb..000000000 diff --git a/cordova-lib/spec-plugman/plugins/dependencies/subdir/E/src/ios/EPluginCommand.h b/cordova-lib/spec-plugman/plugins/dependencies/subdir/E/src/ios/EPluginCommand.h deleted file mode 100644 index e69de29bb..000000000 diff --git a/cordova-lib/spec-plugman/plugins/dependencies/subdir/E/src/ios/EPluginCommand.m b/cordova-lib/spec-plugman/plugins/dependencies/subdir/E/src/ios/EPluginCommand.m deleted file mode 100644 index e69de29bb..000000000 diff --git a/cordova-lib/spec-plugman/plugins/dependencies/subdir/E/www/plugin-e.js b/cordova-lib/spec-plugman/plugins/dependencies/subdir/E/www/plugin-e.js deleted file mode 100644 index e69de29bb..000000000 diff --git a/cordova-lib/spec-plugman/plugins/multiple-children/plugin.xml b/cordova-lib/spec-plugman/plugins/multiple-children/plugin.xml deleted file mode 100644 index fd10a04d5..000000000 --- a/cordova-lib/spec-plugman/plugins/multiple-children/plugin.xml +++ /dev/null @@ -1,108 +0,0 @@ - - - - - - Pushwoosh - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/cordova-lib/spec-plugman/plugins/shared-deps-multi-child/plugin.xml b/cordova-lib/spec-plugman/plugins/shared-deps-multi-child/plugin.xml deleted file mode 100644 index 6c1747693..000000000 --- a/cordova-lib/spec-plugman/plugins/shared-deps-multi-child/plugin.xml +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - Sharing Dependencies with the Multi-Child Plugin, woo - - - - - - - - diff --git a/cordova-lib/spec-plugman/projects/.gitkeep b/cordova-lib/spec-plugman/projects/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/cordova-lib/spec-plugman/projects/android_install/AndroidManifest.xml b/cordova-lib/spec-plugman/projects/android_install/AndroidManifest.xml deleted file mode 100644 index b5fea9d1b..000000000 --- a/cordova-lib/spec-plugman/projects/android_install/AndroidManifest.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - - - - - - - - - diff --git a/cordova-lib/spec-plugman/projects/android_install/cordova/android_sdk_version b/cordova-lib/spec-plugman/projects/android_install/cordova/android_sdk_version deleted file mode 100644 index 0ab155ceb..000000000 --- a/cordova-lib/spec-plugman/projects/android_install/cordova/android_sdk_version +++ /dev/null @@ -1 +0,0 @@ -echo 18.0.9 \ No newline at end of file diff --git a/cordova-lib/spec-plugman/projects/android_install/cordova/version b/cordova-lib/spec-plugman/projects/android_install/cordova/version deleted file mode 100644 index 01f68fd29..000000000 --- a/cordova-lib/spec-plugman/projects/android_install/cordova/version +++ /dev/null @@ -1 +0,0 @@ -echo 9.0.0 \ No newline at end of file diff --git a/cordova-lib/spec-plugman/projects/android_install/cordova/version.bat b/cordova-lib/spec-plugman/projects/android_install/cordova/version.bat deleted file mode 100644 index c637d7ca5..000000000 --- a/cordova-lib/spec-plugman/projects/android_install/cordova/version.bat +++ /dev/null @@ -1,2 +0,0 @@ -@ECHO OFF -echo 9.0.0 \ No newline at end of file diff --git a/cordova-lib/spec-plugman/projects/android_one/AndroidManifest.xml b/cordova-lib/spec-plugman/projects/android_one/AndroidManifest.xml deleted file mode 100644 index 0979b026d..000000000 --- a/cordova-lib/spec-plugman/projects/android_one/AndroidManifest.xml +++ /dev/null @@ -1,71 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/cordova-lib/spec-plugman/projects/android_one/assets/www/.gitkeep b/cordova-lib/spec-plugman/projects/android_one/assets/www/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/cordova-lib/spec-plugman/projects/android_one/assets/www/cordova.js b/cordova-lib/spec-plugman/projects/android_one/assets/www/cordova.js deleted file mode 100644 index 000791b61..000000000 --- a/cordova-lib/spec-plugman/projects/android_one/assets/www/cordova.js +++ /dev/null @@ -1,6848 +0,0 @@ -// Platform: android -// 2.7.0rc1-12-ga86559a -/* - Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.0 (the - "License"); you may not use this file except in compliance - with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, - software distributed under the License is distributed on an - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - KIND, either express or implied. See the License for the - specific language governing permissions and limitations - under the License. -*/ -;(function() { -var CORDOVA_JS_BUILD_LABEL = '2.7.0rc1-12-ga86559a'; -// file: lib/scripts/require.js - -var require, - define; - -(function () { - var modules = {}; - // Stack of moduleIds currently being built. - var requireStack = []; - // Map of module ID -> index into requireStack of modules currently being built. - var inProgressModules = {}; - - function build(module) { - var factory = module.factory; - module.exports = {}; - delete module.factory; - factory(require, module.exports, module); - return module.exports; - } - - require = function (id) { - if (!modules[id]) { - throw "module " + id + " not found"; - } else if (id in inProgressModules) { - var cycle = requireStack.slice(inProgressModules[id]).join('->') + '->' + id; - throw "Cycle in require graph: " + cycle; - } - if (modules[id].factory) { - try { - inProgressModules[id] = requireStack.length; - requireStack.push(id); - return build(modules[id]); - } finally { - delete inProgressModules[id]; - requireStack.pop(); - } - } - return modules[id].exports; - }; - - define = function (id, factory) { - if (modules[id]) { - throw "module " + id + " already defined"; - } - - modules[id] = { - id: id, - factory: factory - }; - }; - - define.remove = function (id) { - delete modules[id]; - }; - - define.moduleMap = modules; -})(); - -//Export for use in node -if (typeof module === "object" && typeof require === "function") { - module.exports.require = require; - module.exports.define = define; -} - -// file: lib/cordova.js -define("cordova", function(require, exports, module) { - - -var channel = require('cordova/channel'); - -/** - * Listen for DOMContentLoaded and notify our channel subscribers. - */ -document.addEventListener('DOMContentLoaded', function() { - channel.onDOMContentLoaded.fire(); -}, false); -if (document.readyState == 'complete' || document.readyState == 'interactive') { - channel.onDOMContentLoaded.fire(); -} - -/** - * Intercept calls to addEventListener + removeEventListener and handle deviceready, - * resume, and pause events. - */ -var m_document_addEventListener = document.addEventListener; -var m_document_removeEventListener = document.removeEventListener; -var m_window_addEventListener = window.addEventListener; -var m_window_removeEventListener = window.removeEventListener; - -/** - * Houses custom event handlers to intercept on document + window event listeners. - */ -var documentEventHandlers = {}, - windowEventHandlers = {}; - -document.addEventListener = function(evt, handler, capture) { - var e = evt.toLowerCase(); - if (typeof documentEventHandlers[e] != 'undefined') { - documentEventHandlers[e].subscribe(handler); - } else { - m_document_addEventListener.call(document, evt, handler, capture); - } -}; - -window.addEventListener = function(evt, handler, capture) { - var e = evt.toLowerCase(); - if (typeof windowEventHandlers[e] != 'undefined') { - windowEventHandlers[e].subscribe(handler); - } else { - m_window_addEventListener.call(window, evt, handler, capture); - } -}; - -document.removeEventListener = function(evt, handler, capture) { - var e = evt.toLowerCase(); - // If unsubscribing from an event that is handled by a plugin - if (typeof documentEventHandlers[e] != "undefined") { - documentEventHandlers[e].unsubscribe(handler); - } else { - m_document_removeEventListener.call(document, evt, handler, capture); - } -}; - -window.removeEventListener = function(evt, handler, capture) { - var e = evt.toLowerCase(); - // If unsubscribing from an event that is handled by a plugin - if (typeof windowEventHandlers[e] != "undefined") { - windowEventHandlers[e].unsubscribe(handler); - } else { - m_window_removeEventListener.call(window, evt, handler, capture); - } -}; - -function createEvent(type, data) { - var event = document.createEvent('Events'); - event.initEvent(type, false, false); - if (data) { - for (var i in data) { - if (data.hasOwnProperty(i)) { - event[i] = data[i]; - } - } - } - return event; -} - -if(typeof window.console === "undefined") { - window.console = { - log:function(){} - }; -} - -var cordova = { - define:define, - require:require, - /** - * Methods to add/remove your own addEventListener hijacking on document + window. - */ - addWindowEventHandler:function(event) { - return (windowEventHandlers[event] = channel.create(event)); - }, - addStickyDocumentEventHandler:function(event) { - return (documentEventHandlers[event] = channel.createSticky(event)); - }, - addDocumentEventHandler:function(event) { - return (documentEventHandlers[event] = channel.create(event)); - }, - removeWindowEventHandler:function(event) { - delete windowEventHandlers[event]; - }, - removeDocumentEventHandler:function(event) { - delete documentEventHandlers[event]; - }, - /** - * Retrieve original event handlers that were replaced by Cordova - * - * @return object - */ - getOriginalHandlers: function() { - return {'document': {'addEventListener': m_document_addEventListener, 'removeEventListener': m_document_removeEventListener}, - 'window': {'addEventListener': m_window_addEventListener, 'removeEventListener': m_window_removeEventListener}}; - }, - /** - * Method to fire event from native code - * bNoDetach is required for events which cause an exception which needs to be caught in native code - */ - fireDocumentEvent: function(type, data, bNoDetach) { - var evt = createEvent(type, data); - if (typeof documentEventHandlers[type] != 'undefined') { - if( bNoDetach ) { - documentEventHandlers[type].fire(evt); - } - else { - setTimeout(function() { - // Fire deviceready on listeners that were registered before cordova.js was loaded. - if (type == 'deviceready') { - document.dispatchEvent(evt); - } - documentEventHandlers[type].fire(evt); - }, 0); - } - } else { - document.dispatchEvent(evt); - } - }, - fireWindowEvent: function(type, data) { - var evt = createEvent(type,data); - if (typeof windowEventHandlers[type] != 'undefined') { - setTimeout(function() { - windowEventHandlers[type].fire(evt); - }, 0); - } else { - window.dispatchEvent(evt); - } - }, - - /** - * Plugin callback mechanism. - */ - // Randomize the starting callbackId to avoid collisions after refreshing or navigating. - // This way, it's very unlikely that any new callback would get the same callbackId as an old callback. - callbackId: Math.floor(Math.random() * 2000000000), - callbacks: {}, - callbackStatus: { - NO_RESULT: 0, - OK: 1, - CLASS_NOT_FOUND_EXCEPTION: 2, - ILLEGAL_ACCESS_EXCEPTION: 3, - INSTANTIATION_EXCEPTION: 4, - MALFORMED_URL_EXCEPTION: 5, - IO_EXCEPTION: 6, - INVALID_ACTION: 7, - JSON_EXCEPTION: 8, - ERROR: 9 - }, - - /** - * Called by native code when returning successful result from an action. - */ - callbackSuccess: function(callbackId, args) { - try { - cordova.callbackFromNative(callbackId, true, args.status, [args.message], args.keepCallback); - } catch (e) { - console.log("Error in error callback: " + callbackId + " = "+e); - } - }, - - /** - * Called by native code when returning error result from an action. - */ - callbackError: function(callbackId, args) { - // TODO: Deprecate callbackSuccess and callbackError in favour of callbackFromNative. - // Derive success from status. - try { - cordova.callbackFromNative(callbackId, false, args.status, [args.message], args.keepCallback); - } catch (e) { - console.log("Error in error callback: " + callbackId + " = "+e); - } - }, - - /** - * Called by native code when returning the result from an action. - */ - callbackFromNative: function(callbackId, success, status, args, keepCallback) { - var callback = cordova.callbacks[callbackId]; - if (callback) { - if (success && status == cordova.callbackStatus.OK) { - callback.success && callback.success.apply(null, args); - } else if (!success) { - callback.fail && callback.fail.apply(null, args); - } - - // Clear callback if not expecting any more results - if (!keepCallback) { - delete cordova.callbacks[callbackId]; - } - } - }, - addConstructor: function(func) { - channel.onCordovaReady.subscribe(function() { - try { - func(); - } catch(e) { - console.log("Failed to run constructor: " + e); - } - }); - } -}; - -// Register pause, resume and deviceready channels as events on document. -channel.onPause = cordova.addDocumentEventHandler('pause'); -channel.onResume = cordova.addDocumentEventHandler('resume'); -channel.onDeviceReady = cordova.addStickyDocumentEventHandler('deviceready'); - -module.exports = cordova; - -}); - -// file: lib/common/argscheck.js -define("cordova/argscheck", function(require, exports, module) { - -var exec = require('cordova/exec'); -var utils = require('cordova/utils'); - -var moduleExports = module.exports; - -var typeMap = { - 'A': 'Array', - 'D': 'Date', - 'N': 'Number', - 'S': 'String', - 'F': 'Function', - 'O': 'Object' -}; - -function extractParamName(callee, argIndex) { - return (/.*?\((.*?)\)/).exec(callee)[1].split(', ')[argIndex]; -} - -function checkArgs(spec, functionName, args, opt_callee) { - if (!moduleExports.enableChecks) { - return; - } - var errMsg = null; - var typeName; - for (var i = 0; i < spec.length; ++i) { - var c = spec.charAt(i), - cUpper = c.toUpperCase(), - arg = args[i]; - // Asterix means allow anything. - if (c == '*') { - continue; - } - typeName = utils.typeName(arg); - if ((arg === null || arg === undefined) && c == cUpper) { - continue; - } - if (typeName != typeMap[cUpper]) { - errMsg = 'Expected ' + typeMap[cUpper]; - break; - } - } - if (errMsg) { - errMsg += ', but got ' + typeName + '.'; - errMsg = 'Wrong type for parameter "' + extractParamName(opt_callee || args.callee, i) + '" of ' + functionName + ': ' + errMsg; - // Don't log when running jake test. - if (typeof jasmine == 'undefined') { - console.error(errMsg); - } - throw TypeError(errMsg); - } -} - -function getValue(value, defaultValue) { - return value === undefined ? defaultValue : value; -} - -moduleExports.checkArgs = checkArgs; -moduleExports.getValue = getValue; -moduleExports.enableChecks = true; - - -}); - -// file: lib/common/builder.js -define("cordova/builder", function(require, exports, module) { - -var utils = require('cordova/utils'); - -function each(objects, func, context) { - for (var prop in objects) { - if (objects.hasOwnProperty(prop)) { - func.apply(context, [objects[prop], prop]); - } - } -} - -function clobber(obj, key, value) { - exports.replaceHookForTesting(obj, key); - obj[key] = value; - // Getters can only be overridden by getters. - if (obj[key] !== value) { - utils.defineGetter(obj, key, function() { - return value; - }); - } -} - -function assignOrWrapInDeprecateGetter(obj, key, value, message) { - if (message) { - utils.defineGetter(obj, key, function() { - console.log(message); - delete obj[key]; - clobber(obj, key, value); - return value; - }); - } else { - clobber(obj, key, value); - } -} - -function include(parent, objects, clobber, merge) { - each(objects, function (obj, key) { - try { - var result = obj.path ? require(obj.path) : {}; - - if (clobber) { - // Clobber if it doesn't exist. - if (typeof parent[key] === 'undefined') { - assignOrWrapInDeprecateGetter(parent, key, result, obj.deprecated); - } else if (typeof obj.path !== 'undefined') { - // If merging, merge properties onto parent, otherwise, clobber. - if (merge) { - recursiveMerge(parent[key], result); - } else { - assignOrWrapInDeprecateGetter(parent, key, result, obj.deprecated); - } - } - result = parent[key]; - } else { - // Overwrite if not currently defined. - if (typeof parent[key] == 'undefined') { - assignOrWrapInDeprecateGetter(parent, key, result, obj.deprecated); - } else { - // Set result to what already exists, so we can build children into it if they exist. - result = parent[key]; - } - } - - if (obj.children) { - include(result, obj.children, clobber, merge); - } - } catch(e) { - utils.alert('Exception building cordova JS globals: ' + e + ' for key "' + key + '"'); - } - }); -} - -/** - * Merge properties from one object onto another recursively. Properties from - * the src object will overwrite existing target property. - * - * @param target Object to merge properties into. - * @param src Object to merge properties from. - */ -function recursiveMerge(target, src) { - for (var prop in src) { - if (src.hasOwnProperty(prop)) { - if (target.prototype && target.prototype.constructor === target) { - // If the target object is a constructor override off prototype. - clobber(target.prototype, prop, src[prop]); - } else { - if (typeof src[prop] === 'object' && typeof target[prop] === 'object') { - recursiveMerge(target[prop], src[prop]); - } else { - clobber(target, prop, src[prop]); - } - } - } - } -} - -exports.buildIntoButDoNotClobber = function(objects, target) { - include(target, objects, false, false); -}; -exports.buildIntoAndClobber = function(objects, target) { - include(target, objects, true, false); -}; -exports.buildIntoAndMerge = function(objects, target) { - include(target, objects, true, true); -}; -exports.recursiveMerge = recursiveMerge; -exports.assignOrWrapInDeprecateGetter = assignOrWrapInDeprecateGetter; -exports.replaceHookForTesting = function() {}; - -}); - -// file: lib/common/channel.js -define("cordova/channel", function(require, exports, module) { - -var utils = require('cordova/utils'), - nextGuid = 1; - -/** - * Custom pub-sub "channel" that can have functions subscribed to it - * This object is used to define and control firing of events for - * cordova initialization, as well as for custom events thereafter. - * - * The order of events during page load and Cordova startup is as follows: - * - * onDOMContentLoaded* Internal event that is received when the web page is loaded and parsed. - * onNativeReady* Internal event that indicates the Cordova native side is ready. - * onCordovaReady* Internal event fired when all Cordova JavaScript objects have been created. - * onCordovaInfoReady* Internal event fired when device properties are available. - * onCordovaConnectionReady* Internal event fired when the connection property has been set. - * onDeviceReady* User event fired to indicate that Cordova is ready - * onResume User event fired to indicate a start/resume lifecycle event - * onPause User event fired to indicate a pause lifecycle event - * onDestroy* Internal event fired when app is being destroyed (User should use window.onunload event, not this one). - * - * The events marked with an * are sticky. Once they have fired, they will stay in the fired state. - * All listeners that subscribe after the event is fired will be executed right away. - * - * The only Cordova events that user code should register for are: - * deviceready Cordova native code is initialized and Cordova APIs can be called from JavaScript - * pause App has moved to background - * resume App has returned to foreground - * - * Listeners can be registered as: - * document.addEventListener("deviceready", myDeviceReadyListener, false); - * document.addEventListener("resume", myResumeListener, false); - * document.addEventListener("pause", myPauseListener, false); - * - * The DOM lifecycle events should be used for saving and restoring state - * window.onload - * window.onunload - * - */ - -/** - * Channel - * @constructor - * @param type String the channel name - */ -var Channel = function(type, sticky) { - this.type = type; - // Map of guid -> function. - this.handlers = {}; - // 0 = Non-sticky, 1 = Sticky non-fired, 2 = Sticky fired. - this.state = sticky ? 1 : 0; - // Used in sticky mode to remember args passed to fire(). - this.fireArgs = null; - // Used by onHasSubscribersChange to know if there are any listeners. - this.numHandlers = 0; - // Function that is called when the first listener is subscribed, or when - // the last listener is unsubscribed. - this.onHasSubscribersChange = null; -}, - channel = { - /** - * Calls the provided function only after all of the channels specified - * have been fired. All channels must be sticky channels. - */ - join: function(h, c) { - var len = c.length, - i = len, - f = function() { - if (!(--i)) h(); - }; - for (var j=0; jNative bridge. - POLLING: 0, - // For LOAD_URL to be viable, it would need to have a work-around for - // the bug where the soft-keyboard gets dismissed when a message is sent. - LOAD_URL: 1, - // For the ONLINE_EVENT to be viable, it would need to intercept all event - // listeners (both through addEventListener and window.ononline) as well - // as set the navigator property itself. - ONLINE_EVENT: 2, - // Uses reflection to access private APIs of the WebView that can send JS - // to be executed. - // Requires Android 3.2.4 or above. - PRIVATE_API: 3 - }, - jsToNativeBridgeMode, // Set lazily. - nativeToJsBridgeMode = nativeToJsModes.ONLINE_EVENT, - pollEnabled = false, - messagesFromNative = []; - -function androidExec(success, fail, service, action, args) { - // Set default bridge modes if they have not already been set. - // By default, we use the failsafe, since addJavascriptInterface breaks too often - if (jsToNativeBridgeMode === undefined) { - androidExec.setJsToNativeBridgeMode(jsToNativeModes.JS_OBJECT); - } - - // Process any ArrayBuffers in the args into a string. - for (var i = 0; i < args.length; i++) { - if (utils.typeName(args[i]) == 'ArrayBuffer') { - args[i] = window.btoa(String.fromCharCode.apply(null, new Uint8Array(args[i]))); - } - } - - var callbackId = service + cordova.callbackId++, - argsJson = JSON.stringify(args); - - if (success || fail) { - cordova.callbacks[callbackId] = {success:success, fail:fail}; - } - - if (jsToNativeBridgeMode == jsToNativeModes.LOCATION_CHANGE) { - window.location = 'http://cdv_exec/' + service + '#' + action + '#' + callbackId + '#' + argsJson; - } else { - var messages = nativeApiProvider.get().exec(service, action, callbackId, argsJson); - // If argsJson was received by Java as null, try again with the PROMPT bridge mode. - // This happens in rare circumstances, such as when certain Unicode characters are passed over the bridge on a Galaxy S2. See CB-2666. - if (jsToNativeBridgeMode == jsToNativeModes.JS_OBJECT && messages === "@Null arguments.") { - androidExec.setJsToNativeBridgeMode(jsToNativeModes.PROMPT); - androidExec(success, fail, service, action, args); - androidExec.setJsToNativeBridgeMode(jsToNativeModes.JS_OBJECT); - return; - } else { - androidExec.processMessages(messages); - } - } -} - -function pollOnce() { - var msg = nativeApiProvider.get().retrieveJsMessages(); - androidExec.processMessages(msg); -} - -function pollingTimerFunc() { - if (pollEnabled) { - pollOnce(); - setTimeout(pollingTimerFunc, 50); - } -} - -function hookOnlineApis() { - function proxyEvent(e) { - cordova.fireWindowEvent(e.type); - } - // The network module takes care of firing online and offline events. - // It currently fires them only on document though, so we bridge them - // to window here (while first listening for exec()-related online/offline - // events). - window.addEventListener('online', pollOnce, false); - window.addEventListener('offline', pollOnce, false); - cordova.addWindowEventHandler('online'); - cordova.addWindowEventHandler('offline'); - document.addEventListener('online', proxyEvent, false); - document.addEventListener('offline', proxyEvent, false); -} - -hookOnlineApis(); - -androidExec.jsToNativeModes = jsToNativeModes; -androidExec.nativeToJsModes = nativeToJsModes; - -androidExec.setJsToNativeBridgeMode = function(mode) { - if (mode == jsToNativeModes.JS_OBJECT && !window._cordovaNative) { - console.log('Falling back on PROMPT mode since _cordovaNative is missing. Expected for Android 3.2 and lower only.'); - mode = jsToNativeModes.PROMPT; - } - nativeApiProvider.setPreferPrompt(mode == jsToNativeModes.PROMPT); - jsToNativeBridgeMode = mode; -}; - -androidExec.setNativeToJsBridgeMode = function(mode) { - if (mode == nativeToJsBridgeMode) { - return; - } - if (nativeToJsBridgeMode == nativeToJsModes.POLLING) { - pollEnabled = false; - } - - nativeToJsBridgeMode = mode; - // Tell the native side to switch modes. - nativeApiProvider.get().setNativeToJsBridgeMode(mode); - - if (mode == nativeToJsModes.POLLING) { - pollEnabled = true; - setTimeout(pollingTimerFunc, 1); - } -}; - -// Processes a single message, as encoded by NativeToJsMessageQueue.java. -function processMessage(message) { - try { - var firstChar = message.charAt(0); - if (firstChar == 'J') { - eval(message.slice(1)); - } else if (firstChar == 'S' || firstChar == 'F') { - var success = firstChar == 'S'; - var keepCallback = message.charAt(1) == '1'; - var spaceIdx = message.indexOf(' ', 2); - var status = +message.slice(2, spaceIdx); - var nextSpaceIdx = message.indexOf(' ', spaceIdx + 1); - var callbackId = message.slice(spaceIdx + 1, nextSpaceIdx); - var payloadKind = message.charAt(nextSpaceIdx + 1); - var payload; - if (payloadKind == 's') { - payload = message.slice(nextSpaceIdx + 2); - } else if (payloadKind == 't') { - payload = true; - } else if (payloadKind == 'f') { - payload = false; - } else if (payloadKind == 'N') { - payload = null; - } else if (payloadKind == 'n') { - payload = +message.slice(nextSpaceIdx + 2); - } else if (payloadKind == 'A') { - var data = message.slice(nextSpaceIdx + 2); - var bytes = window.atob(data); - var arraybuffer = new Uint8Array(bytes.length); - for (var i = 0; i < bytes.length; i++) { - arraybuffer[i] = bytes.charCodeAt(i); - } - payload = arraybuffer.buffer; - } else if (payloadKind == 'S') { - payload = window.atob(message.slice(nextSpaceIdx + 2)); - } else { - payload = JSON.parse(message.slice(nextSpaceIdx + 1)); - } - cordova.callbackFromNative(callbackId, success, status, [payload], keepCallback); - } else { - console.log("processMessage failed: invalid message:" + message); - } - } catch (e) { - console.log("processMessage failed: Message: " + message); - console.log("processMessage failed: Error: " + e); - console.log("processMessage failed: Stack: " + e.stack); - } -} - -// This is called from the NativeToJsMessageQueue.java. -androidExec.processMessages = function(messages) { - if (messages) { - messagesFromNative.push(messages); - // Check for the reentrant case, and enqueue the message if that's the case. - if (messagesFromNative.length > 1) { - return; - } - while (messagesFromNative.length) { - // Don't unshift until the end so that reentrancy can be detected. - messages = messagesFromNative[0]; - // The Java side can send a * message to indicate that it - // still has messages waiting to be retrieved. - if (messages == '*') { - messagesFromNative.shift(); - window.setTimeout(pollOnce, 0); - return; - } - - var spaceIdx = messages.indexOf(' '); - var msgLen = +messages.slice(0, spaceIdx); - var message = messages.substr(spaceIdx + 1, msgLen); - messages = messages.slice(spaceIdx + msgLen + 1); - processMessage(message); - if (messages) { - messagesFromNative[0] = messages; - } else { - messagesFromNative.shift(); - } - } - } -}; - -module.exports = androidExec; - -}); - -// file: lib/common/modulemapper.js -define("cordova/modulemapper", function(require, exports, module) { - -var builder = require('cordova/builder'), - moduleMap = define.moduleMap, - symbolList, - deprecationMap; - -exports.reset = function() { - symbolList = []; - deprecationMap = {}; -}; - -function addEntry(strategy, moduleName, symbolPath, opt_deprecationMessage) { - if (!(moduleName in moduleMap)) { - throw new Error('Module ' + moduleName + ' does not exist.'); - } - symbolList.push(strategy, moduleName, symbolPath); - if (opt_deprecationMessage) { - deprecationMap[symbolPath] = opt_deprecationMessage; - } -} - -// Note: Android 2.3 does have Function.bind(). -exports.clobbers = function(moduleName, symbolPath, opt_deprecationMessage) { - addEntry('c', moduleName, symbolPath, opt_deprecationMessage); -}; - -exports.merges = function(moduleName, symbolPath, opt_deprecationMessage) { - addEntry('m', moduleName, symbolPath, opt_deprecationMessage); -}; - -exports.defaults = function(moduleName, symbolPath, opt_deprecationMessage) { - addEntry('d', moduleName, symbolPath, opt_deprecationMessage); -}; - -function prepareNamespace(symbolPath, context) { - if (!symbolPath) { - return context; - } - var parts = symbolPath.split('.'); - var cur = context; - for (var i = 0, part; part = parts[i]; ++i) { - cur = cur[part] = cur[part] || {}; - } - return cur; -} - -exports.mapModules = function(context) { - var origSymbols = {}; - context.CDV_origSymbols = origSymbols; - for (var i = 0, len = symbolList.length; i < len; i += 3) { - var strategy = symbolList[i]; - var moduleName = symbolList[i + 1]; - var symbolPath = symbolList[i + 2]; - var lastDot = symbolPath.lastIndexOf('.'); - var namespace = symbolPath.substr(0, lastDot); - var lastName = symbolPath.substr(lastDot + 1); - - var module = require(moduleName); - var deprecationMsg = symbolPath in deprecationMap ? 'Access made to deprecated symbol: ' + symbolPath + '. ' + deprecationMsg : null; - var parentObj = prepareNamespace(namespace, context); - var target = parentObj[lastName]; - - if (strategy == 'm' && target) { - builder.recursiveMerge(target, module); - } else if ((strategy == 'd' && !target) || (strategy != 'd')) { - if (!(symbolPath in origSymbols)) { - origSymbols[symbolPath] = target; - } - builder.assignOrWrapInDeprecateGetter(parentObj, lastName, module, deprecationMsg); - } - } -}; - -exports.getOriginalSymbol = function(context, symbolPath) { - var origSymbols = context.CDV_origSymbols; - if (origSymbols && (symbolPath in origSymbols)) { - return origSymbols[symbolPath]; - } - var parts = symbolPath.split('.'); - var obj = context; - for (var i = 0; i < parts.length; ++i) { - obj = obj && obj[parts[i]]; - } - return obj; -}; - -exports.loadMatchingModules = function(matchingRegExp) { - for (var k in moduleMap) { - if (matchingRegExp.exec(k)) { - require(k); - } - } -}; - -exports.reset(); - - -}); - -// file: lib/android/platform.js -define("cordova/platform", function(require, exports, module) { - -module.exports = { - id: "android", - initialize:function() { - var channel = require("cordova/channel"), - cordova = require('cordova'), - exec = require('cordova/exec'), - modulemapper = require('cordova/modulemapper'); - - modulemapper.loadMatchingModules(/cordova.*\/symbols$/); - modulemapper.clobbers('cordova/plugin/android/app', 'navigator.app'); - - modulemapper.mapModules(window); - - // Inject a listener for the backbutton on the document. - var backButtonChannel = cordova.addDocumentEventHandler('backbutton'); - backButtonChannel.onHasSubscribersChange = function() { - // If we just attached the first handler or detached the last handler, - // let native know we need to override the back button. - exec(null, null, "App", "overrideBackbutton", [this.numHandlers == 1]); - }; - - // Add hardware MENU and SEARCH button handlers - cordova.addDocumentEventHandler('menubutton'); - cordova.addDocumentEventHandler('searchbutton'); - - // Let native code know we are all done on the JS side. - // Native code will then un-hide the WebView. - channel.join(function() { - exec(null, null, "App", "show", []); - }, [channel.onCordovaReady]); - } -}; - -}); - -// file: lib/common/plugin/Acceleration.js -define("cordova/plugin/Acceleration", function(require, exports, module) { - -var Acceleration = function(x, y, z, timestamp) { - this.x = x; - this.y = y; - this.z = z; - this.timestamp = timestamp || (new Date()).getTime(); -}; - -module.exports = Acceleration; - -}); - -// file: lib/common/plugin/Camera.js -define("cordova/plugin/Camera", function(require, exports, module) { - -var argscheck = require('cordova/argscheck'), - exec = require('cordova/exec'), - Camera = require('cordova/plugin/CameraConstants'), - CameraPopoverHandle = require('cordova/plugin/CameraPopoverHandle'); - -var cameraExport = {}; - -// Tack on the Camera Constants to the base camera plugin. -for (var key in Camera) { - cameraExport[key] = Camera[key]; -} - -/** - * Gets a picture from source defined by "options.sourceType", and returns the - * image as defined by the "options.destinationType" option. - - * The defaults are sourceType=CAMERA and destinationType=FILE_URI. - * - * @param {Function} successCallback - * @param {Function} errorCallback - * @param {Object} options - */ -cameraExport.getPicture = function(successCallback, errorCallback, options) { - argscheck.checkArgs('fFO', 'Camera.getPicture', arguments); - options = options || {}; - var getValue = argscheck.getValue; - - var quality = getValue(options.quality, 50); - var destinationType = getValue(options.destinationType, Camera.DestinationType.FILE_URI); - var sourceType = getValue(options.sourceType, Camera.PictureSourceType.CAMERA); - var targetWidth = getValue(options.targetWidth, -1); - var targetHeight = getValue(options.targetHeight, -1); - var encodingType = getValue(options.encodingType, Camera.EncodingType.JPEG); - var mediaType = getValue(options.mediaType, Camera.MediaType.PICTURE); - var allowEdit = !!options.allowEdit; - var correctOrientation = !!options.correctOrientation; - var saveToPhotoAlbum = !!options.saveToPhotoAlbum; - var popoverOptions = getValue(options.popoverOptions, null); - var cameraDirection = getValue(options.cameraDirection, Camera.Direction.BACK); - - var args = [quality, destinationType, sourceType, targetWidth, targetHeight, encodingType, - mediaType, allowEdit, correctOrientation, saveToPhotoAlbum, popoverOptions, cameraDirection]; - - exec(successCallback, errorCallback, "Camera", "takePicture", args); - return new CameraPopoverHandle(); -}; - -cameraExport.cleanup = function(successCallback, errorCallback) { - exec(successCallback, errorCallback, "Camera", "cleanup", []); -}; - -module.exports = cameraExport; - -}); - -// file: lib/common/plugin/CameraConstants.js -define("cordova/plugin/CameraConstants", function(require, exports, module) { - -module.exports = { - DestinationType:{ - DATA_URL: 0, // Return base64 encoded string - FILE_URI: 1, // Return file uri (content://media/external/images/media/2 for Android) - NATIVE_URI: 2 // Return native uri (eg. asset-library://... for iOS) - }, - EncodingType:{ - JPEG: 0, // Return JPEG encoded image - PNG: 1 // Return PNG encoded image - }, - MediaType:{ - PICTURE: 0, // allow selection of still pictures only. DEFAULT. Will return format specified via DestinationType - VIDEO: 1, // allow selection of video only, ONLY RETURNS URL - ALLMEDIA : 2 // allow selection from all media types - }, - PictureSourceType:{ - PHOTOLIBRARY : 0, // Choose image from picture library (same as SAVEDPHOTOALBUM for Android) - CAMERA : 1, // Take picture from camera - SAVEDPHOTOALBUM : 2 // Choose image from picture library (same as PHOTOLIBRARY for Android) - }, - PopoverArrowDirection:{ - ARROW_UP : 1, // matches iOS UIPopoverArrowDirection constants to specify arrow location on popover - ARROW_DOWN : 2, - ARROW_LEFT : 4, - ARROW_RIGHT : 8, - ARROW_ANY : 15 - }, - Direction:{ - BACK: 0, - FRONT: 1 - } -}; - -}); - -// file: lib/common/plugin/CameraPopoverHandle.js -define("cordova/plugin/CameraPopoverHandle", function(require, exports, module) { - -var exec = require('cordova/exec'); - -/** - * A handle to an image picker popover. - */ -var CameraPopoverHandle = function() { - this.setPosition = function(popoverOptions) { - console.log('CameraPopoverHandle.setPosition is only supported on iOS.'); - }; -}; - -module.exports = CameraPopoverHandle; - -}); - -// file: lib/common/plugin/CameraPopoverOptions.js -define("cordova/plugin/CameraPopoverOptions", function(require, exports, module) { - -var Camera = require('cordova/plugin/CameraConstants'); - -/** - * Encapsulates options for iOS Popover image picker - */ -var CameraPopoverOptions = function(x,y,width,height,arrowDir){ - // information of rectangle that popover should be anchored to - this.x = x || 0; - this.y = y || 32; - this.width = width || 320; - this.height = height || 480; - // The direction of the popover arrow - this.arrowDir = arrowDir || Camera.PopoverArrowDirection.ARROW_ANY; -}; - -module.exports = CameraPopoverOptions; - -}); - -// file: lib/common/plugin/CaptureAudioOptions.js -define("cordova/plugin/CaptureAudioOptions", function(require, exports, module) { - -/** - * Encapsulates all audio capture operation configuration options. - */ -var CaptureAudioOptions = function(){ - // Upper limit of sound clips user can record. Value must be equal or greater than 1. - this.limit = 1; - // Maximum duration of a single sound clip in seconds. - this.duration = 0; -}; - -module.exports = CaptureAudioOptions; - -}); - -// file: lib/common/plugin/CaptureError.js -define("cordova/plugin/CaptureError", function(require, exports, module) { - -/** - * The CaptureError interface encapsulates all errors in the Capture API. - */ -var CaptureError = function(c) { - this.code = c || null; -}; - -// Camera or microphone failed to capture image or sound. -CaptureError.CAPTURE_INTERNAL_ERR = 0; -// Camera application or audio capture application is currently serving other capture request. -CaptureError.CAPTURE_APPLICATION_BUSY = 1; -// Invalid use of the API (e.g. limit parameter has value less than one). -CaptureError.CAPTURE_INVALID_ARGUMENT = 2; -// User exited camera application or audio capture application before capturing anything. -CaptureError.CAPTURE_NO_MEDIA_FILES = 3; -// The requested capture operation is not supported. -CaptureError.CAPTURE_NOT_SUPPORTED = 20; - -module.exports = CaptureError; - -}); - -// file: lib/common/plugin/CaptureImageOptions.js -define("cordova/plugin/CaptureImageOptions", function(require, exports, module) { - -/** - * Encapsulates all image capture operation configuration options. - */ -var CaptureImageOptions = function(){ - // Upper limit of images user can take. Value must be equal or greater than 1. - this.limit = 1; -}; - -module.exports = CaptureImageOptions; - -}); - -// file: lib/common/plugin/CaptureVideoOptions.js -define("cordova/plugin/CaptureVideoOptions", function(require, exports, module) { - -/** - * Encapsulates all video capture operation configuration options. - */ -var CaptureVideoOptions = function(){ - // Upper limit of videos user can record. Value must be equal or greater than 1. - this.limit = 1; - // Maximum duration of a single video clip in seconds. - this.duration = 0; -}; - -module.exports = CaptureVideoOptions; - -}); - -// file: lib/common/plugin/CompassError.js -define("cordova/plugin/CompassError", function(require, exports, module) { - -/** - * CompassError. - * An error code assigned by an implementation when an error has occurred - * @constructor - */ -var CompassError = function(err) { - this.code = (err !== undefined ? err : null); -}; - -CompassError.COMPASS_INTERNAL_ERR = 0; -CompassError.COMPASS_NOT_SUPPORTED = 20; - -module.exports = CompassError; - -}); - -// file: lib/common/plugin/CompassHeading.js -define("cordova/plugin/CompassHeading", function(require, exports, module) { - -var CompassHeading = function(magneticHeading, trueHeading, headingAccuracy, timestamp) { - this.magneticHeading = magneticHeading; - this.trueHeading = trueHeading; - this.headingAccuracy = headingAccuracy; - this.timestamp = timestamp || new Date().getTime(); -}; - -module.exports = CompassHeading; - -}); - -// file: lib/common/plugin/ConfigurationData.js -define("cordova/plugin/ConfigurationData", function(require, exports, module) { - -/** - * Encapsulates a set of parameters that the capture device supports. - */ -function ConfigurationData() { - // The ASCII-encoded string in lower case representing the media type. - this.type = null; - // The height attribute represents height of the image or video in pixels. - // In the case of a sound clip this attribute has value 0. - this.height = 0; - // The width attribute represents width of the image or video in pixels. - // In the case of a sound clip this attribute has value 0 - this.width = 0; -} - -module.exports = ConfigurationData; - -}); - -// file: lib/common/plugin/Connection.js -define("cordova/plugin/Connection", function(require, exports, module) { - -/** - * Network status - */ -module.exports = { - UNKNOWN: "unknown", - ETHERNET: "ethernet", - WIFI: "wifi", - CELL_2G: "2g", - CELL_3G: "3g", - CELL_4G: "4g", - CELL:"cellular", - NONE: "none" -}; - -}); - -// file: lib/common/plugin/Contact.js -define("cordova/plugin/Contact", function(require, exports, module) { - -var argscheck = require('cordova/argscheck'), - exec = require('cordova/exec'), - ContactError = require('cordova/plugin/ContactError'), - utils = require('cordova/utils'); - -/** -* Converts primitives into Complex Object -* Currently only used for Date fields -*/ -function convertIn(contact) { - var value = contact.birthday; - try { - contact.birthday = new Date(parseFloat(value)); - } catch (exception){ - console.log("Cordova Contact convertIn error: exception creating date."); - } - return contact; -} - -/** -* Converts Complex objects into primitives -* Only conversion at present is for Dates. -**/ - -function convertOut(contact) { - var value = contact.birthday; - if (value !== null) { - // try to make it a Date object if it is not already - if (!utils.isDate(value)){ - try { - value = new Date(value); - } catch(exception){ - value = null; - } - } - if (utils.isDate(value)){ - value = value.valueOf(); // convert to milliseconds - } - contact.birthday = value; - } - return contact; -} - -/** -* Contains information about a single contact. -* @constructor -* @param {DOMString} id unique identifier -* @param {DOMString} displayName -* @param {ContactName} name -* @param {DOMString} nickname -* @param {Array.} phoneNumbers array of phone numbers -* @param {Array.} emails array of email addresses -* @param {Array.} addresses array of addresses -* @param {Array.} ims instant messaging user ids -* @param {Array.} organizations -* @param {DOMString} birthday contact's birthday -* @param {DOMString} note user notes about contact -* @param {Array.} photos -* @param {Array.} categories -* @param {Array.} urls contact's web sites -*/ -var Contact = function (id, displayName, name, nickname, phoneNumbers, emails, addresses, - ims, organizations, birthday, note, photos, categories, urls) { - this.id = id || null; - this.rawId = null; - this.displayName = displayName || null; - this.name = name || null; // ContactName - this.nickname = nickname || null; - this.phoneNumbers = phoneNumbers || null; // ContactField[] - this.emails = emails || null; // ContactField[] - this.addresses = addresses || null; // ContactAddress[] - this.ims = ims || null; // ContactField[] - this.organizations = organizations || null; // ContactOrganization[] - this.birthday = birthday || null; - this.note = note || null; - this.photos = photos || null; // ContactField[] - this.categories = categories || null; // ContactField[] - this.urls = urls || null; // ContactField[] -}; - -/** -* Removes contact from device storage. -* @param successCB success callback -* @param errorCB error callback -*/ -Contact.prototype.remove = function(successCB, errorCB) { - argscheck.checkArgs('FF', 'Contact.remove', arguments); - var fail = errorCB && function(code) { - errorCB(new ContactError(code)); - }; - if (this.id === null) { - fail(ContactError.UNKNOWN_ERROR); - } - else { - exec(successCB, fail, "Contacts", "remove", [this.id]); - } -}; - -/** -* Creates a deep copy of this Contact. -* With the contact ID set to null. -* @return copy of this Contact -*/ -Contact.prototype.clone = function() { - var clonedContact = utils.clone(this); - clonedContact.id = null; - clonedContact.rawId = null; - - function nullIds(arr) { - if (arr) { - for (var i = 0; i < arr.length; ++i) { - arr[i].id = null; - } - } - } - - // Loop through and clear out any id's in phones, emails, etc. - nullIds(clonedContact.phoneNumbers); - nullIds(clonedContact.emails); - nullIds(clonedContact.addresses); - nullIds(clonedContact.ims); - nullIds(clonedContact.organizations); - nullIds(clonedContact.categories); - nullIds(clonedContact.photos); - nullIds(clonedContact.urls); - return clonedContact; -}; - -/** -* Persists contact to device storage. -* @param successCB success callback -* @param errorCB error callback -*/ -Contact.prototype.save = function(successCB, errorCB) { - argscheck.checkArgs('FFO', 'Contact.save', arguments); - var fail = errorCB && function(code) { - errorCB(new ContactError(code)); - }; - var success = function(result) { - if (result) { - if (successCB) { - var fullContact = require('cordova/plugin/contacts').create(result); - successCB(convertIn(fullContact)); - } - } - else { - // no Entry object returned - fail(ContactError.UNKNOWN_ERROR); - } - }; - var dupContact = convertOut(utils.clone(this)); - exec(success, fail, "Contacts", "save", [dupContact]); -}; - - -module.exports = Contact; - -}); - -// file: lib/common/plugin/ContactAddress.js -define("cordova/plugin/ContactAddress", function(require, exports, module) { - -/** -* Contact address. -* @constructor -* @param {DOMString} id unique identifier, should only be set by native code -* @param formatted // NOTE: not a W3C standard -* @param streetAddress -* @param locality -* @param region -* @param postalCode -* @param country -*/ - -var ContactAddress = function(pref, type, formatted, streetAddress, locality, region, postalCode, country) { - this.id = null; - this.pref = (typeof pref != 'undefined' ? pref : false); - this.type = type || null; - this.formatted = formatted || null; - this.streetAddress = streetAddress || null; - this.locality = locality || null; - this.region = region || null; - this.postalCode = postalCode || null; - this.country = country || null; -}; - -module.exports = ContactAddress; - -}); - -// file: lib/common/plugin/ContactError.js -define("cordova/plugin/ContactError", function(require, exports, module) { - -/** - * ContactError. - * An error code assigned by an implementation when an error has occurred - * @constructor - */ -var ContactError = function(err) { - this.code = (typeof err != 'undefined' ? err : null); -}; - -/** - * Error codes - */ -ContactError.UNKNOWN_ERROR = 0; -ContactError.INVALID_ARGUMENT_ERROR = 1; -ContactError.TIMEOUT_ERROR = 2; -ContactError.PENDING_OPERATION_ERROR = 3; -ContactError.IO_ERROR = 4; -ContactError.NOT_SUPPORTED_ERROR = 5; -ContactError.PERMISSION_DENIED_ERROR = 20; - -module.exports = ContactError; - -}); - -// file: lib/common/plugin/ContactField.js -define("cordova/plugin/ContactField", function(require, exports, module) { - -/** -* Generic contact field. -* @constructor -* @param {DOMString} id unique identifier, should only be set by native code // NOTE: not a W3C standard -* @param type -* @param value -* @param pref -*/ -var ContactField = function(type, value, pref) { - this.id = null; - this.type = (type && type.toString()) || null; - this.value = (value && value.toString()) || null; - this.pref = (typeof pref != 'undefined' ? pref : false); -}; - -module.exports = ContactField; - -}); - -// file: lib/common/plugin/ContactFindOptions.js -define("cordova/plugin/ContactFindOptions", function(require, exports, module) { - -/** - * ContactFindOptions. - * @constructor - * @param filter used to match contacts against - * @param multiple boolean used to determine if more than one contact should be returned - */ - -var ContactFindOptions = function(filter, multiple) { - this.filter = filter || ''; - this.multiple = (typeof multiple != 'undefined' ? multiple : false); -}; - -module.exports = ContactFindOptions; - -}); - -// file: lib/common/plugin/ContactName.js -define("cordova/plugin/ContactName", function(require, exports, module) { - -/** -* Contact name. -* @constructor -* @param formatted // NOTE: not part of W3C standard -* @param familyName -* @param givenName -* @param middle -* @param prefix -* @param suffix -*/ -var ContactName = function(formatted, familyName, givenName, middle, prefix, suffix) { - this.formatted = formatted || null; - this.familyName = familyName || null; - this.givenName = givenName || null; - this.middleName = middle || null; - this.honorificPrefix = prefix || null; - this.honorificSuffix = suffix || null; -}; - -module.exports = ContactName; - -}); - -// file: lib/common/plugin/ContactOrganization.js -define("cordova/plugin/ContactOrganization", function(require, exports, module) { - -/** -* Contact organization. -* @constructor -* @param {DOMString} id unique identifier, should only be set by native code // NOTE: not a W3C standard -* @param name -* @param dept -* @param title -* @param startDate -* @param endDate -* @param location -* @param desc -*/ - -var ContactOrganization = function(pref, type, name, dept, title) { - this.id = null; - this.pref = (typeof pref != 'undefined' ? pref : false); - this.type = type || null; - this.name = name || null; - this.department = dept || null; - this.title = title || null; -}; - -module.exports = ContactOrganization; - -}); - -// file: lib/common/plugin/Coordinates.js -define("cordova/plugin/Coordinates", function(require, exports, module) { - -/** - * This class contains position information. - * @param {Object} lat - * @param {Object} lng - * @param {Object} alt - * @param {Object} acc - * @param {Object} head - * @param {Object} vel - * @param {Object} altacc - * @constructor - */ -var Coordinates = function(lat, lng, alt, acc, head, vel, altacc) { - /** - * The latitude of the position. - */ - this.latitude = lat; - /** - * The longitude of the position, - */ - this.longitude = lng; - /** - * The accuracy of the position. - */ - this.accuracy = acc; - /** - * The altitude of the position. - */ - this.altitude = (alt !== undefined ? alt : null); - /** - * The direction the device is moving at the position. - */ - this.heading = (head !== undefined ? head : null); - /** - * The velocity with which the device is moving at the position. - */ - this.speed = (vel !== undefined ? vel : null); - - if (this.speed === 0 || this.speed === null) { - this.heading = NaN; - } - - /** - * The altitude accuracy of the position. - */ - this.altitudeAccuracy = (altacc !== undefined) ? altacc : null; -}; - -module.exports = Coordinates; - -}); - -// file: lib/common/plugin/DirectoryEntry.js -define("cordova/plugin/DirectoryEntry", function(require, exports, module) { - -var argscheck = require('cordova/argscheck'), - utils = require('cordova/utils'), - exec = require('cordova/exec'), - Entry = require('cordova/plugin/Entry'), - FileError = require('cordova/plugin/FileError'), - DirectoryReader = require('cordova/plugin/DirectoryReader'); - -/** - * An interface representing a directory on the file system. - * - * {boolean} isFile always false (readonly) - * {boolean} isDirectory always true (readonly) - * {DOMString} name of the directory, excluding the path leading to it (readonly) - * {DOMString} fullPath the absolute full path to the directory (readonly) - * TODO: implement this!!! {FileSystem} filesystem on which the directory resides (readonly) - */ -var DirectoryEntry = function(name, fullPath) { - DirectoryEntry.__super__.constructor.call(this, false, true, name, fullPath); -}; - -utils.extend(DirectoryEntry, Entry); - -/** - * Creates a new DirectoryReader to read entries from this directory - */ -DirectoryEntry.prototype.createReader = function() { - return new DirectoryReader(this.fullPath); -}; - -/** - * Creates or looks up a directory - * - * @param {DOMString} path either a relative or absolute path from this directory in which to look up or create a directory - * @param {Flags} options to create or exclusively create the directory - * @param {Function} successCallback is called with the new entry - * @param {Function} errorCallback is called with a FileError - */ -DirectoryEntry.prototype.getDirectory = function(path, options, successCallback, errorCallback) { - argscheck.checkArgs('sOFF', 'DirectoryEntry.getDirectory', arguments); - var win = successCallback && function(result) { - var entry = new DirectoryEntry(result.name, result.fullPath); - successCallback(entry); - }; - var fail = errorCallback && function(code) { - errorCallback(new FileError(code)); - }; - exec(win, fail, "File", "getDirectory", [this.fullPath, path, options]); -}; - -/** - * Deletes a directory and all of it's contents - * - * @param {Function} successCallback is called with no parameters - * @param {Function} errorCallback is called with a FileError - */ -DirectoryEntry.prototype.removeRecursively = function(successCallback, errorCallback) { - argscheck.checkArgs('FF', 'DirectoryEntry.removeRecursively', arguments); - var fail = errorCallback && function(code) { - errorCallback(new FileError(code)); - }; - exec(successCallback, fail, "File", "removeRecursively", [this.fullPath]); -}; - -/** - * Creates or looks up a file - * - * @param {DOMString} path either a relative or absolute path from this directory in which to look up or create a file - * @param {Flags} options to create or exclusively create the file - * @param {Function} successCallback is called with the new entry - * @param {Function} errorCallback is called with a FileError - */ -DirectoryEntry.prototype.getFile = function(path, options, successCallback, errorCallback) { - argscheck.checkArgs('sOFF', 'DirectoryEntry.getFile', arguments); - var win = successCallback && function(result) { - var FileEntry = require('cordova/plugin/FileEntry'); - var entry = new FileEntry(result.name, result.fullPath); - successCallback(entry); - }; - var fail = errorCallback && function(code) { - errorCallback(new FileError(code)); - }; - exec(win, fail, "File", "getFile", [this.fullPath, path, options]); -}; - -module.exports = DirectoryEntry; - -}); - -// file: lib/common/plugin/DirectoryReader.js -define("cordova/plugin/DirectoryReader", function(require, exports, module) { - -var exec = require('cordova/exec'), - FileError = require('cordova/plugin/FileError') ; - -/** - * An interface that lists the files and directories in a directory. - */ -function DirectoryReader(path) { - this.path = path || null; -} - -/** - * Returns a list of entries from a directory. - * - * @param {Function} successCallback is called with a list of entries - * @param {Function} errorCallback is called with a FileError - */ -DirectoryReader.prototype.readEntries = function(successCallback, errorCallback) { - var win = typeof successCallback !== 'function' ? null : function(result) { - var retVal = []; - for (var i=0; i= 2) { - if (end < 0) { - newEnd = Math.max(size + end, 0); - } else { - newEnd = Math.min(end, size); - } - } - - var newFile = new File(this.name, this.fullPath, this.type, this.lastModifiedData, this.size); - newFile.start = this.start + newStart; - newFile.end = this.start + newEnd; - return newFile; -}; - - -module.exports = File; - -}); - -// file: lib/common/plugin/FileEntry.js -define("cordova/plugin/FileEntry", function(require, exports, module) { - -var utils = require('cordova/utils'), - exec = require('cordova/exec'), - Entry = require('cordova/plugin/Entry'), - FileWriter = require('cordova/plugin/FileWriter'), - File = require('cordova/plugin/File'), - FileError = require('cordova/plugin/FileError'); - -/** - * An interface representing a file on the file system. - * - * {boolean} isFile always true (readonly) - * {boolean} isDirectory always false (readonly) - * {DOMString} name of the file, excluding the path leading to it (readonly) - * {DOMString} fullPath the absolute full path to the file (readonly) - * {FileSystem} filesystem on which the file resides (readonly) - */ -var FileEntry = function(name, fullPath) { - FileEntry.__super__.constructor.apply(this, [true, false, name, fullPath]); -}; - -utils.extend(FileEntry, Entry); - -/** - * Creates a new FileWriter associated with the file that this FileEntry represents. - * - * @param {Function} successCallback is called with the new FileWriter - * @param {Function} errorCallback is called with a FileError - */ -FileEntry.prototype.createWriter = function(successCallback, errorCallback) { - this.file(function(filePointer) { - var writer = new FileWriter(filePointer); - - if (writer.fileName === null || writer.fileName === "") { - errorCallback && errorCallback(new FileError(FileError.INVALID_STATE_ERR)); - } else { - successCallback && successCallback(writer); - } - }, errorCallback); -}; - -/** - * Returns a File that represents the current state of the file that this FileEntry represents. - * - * @param {Function} successCallback is called with the new File object - * @param {Function} errorCallback is called with a FileError - */ -FileEntry.prototype.file = function(successCallback, errorCallback) { - var win = successCallback && function(f) { - var file = new File(f.name, f.fullPath, f.type, f.lastModifiedDate, f.size); - successCallback(file); - }; - var fail = errorCallback && function(code) { - errorCallback(new FileError(code)); - }; - exec(win, fail, "File", "getFileMetadata", [this.fullPath]); -}; - - -module.exports = FileEntry; - -}); - -// file: lib/common/plugin/FileError.js -define("cordova/plugin/FileError", function(require, exports, module) { - -/** - * FileError - */ -function FileError(error) { - this.code = error || null; -} - -// File error codes -// Found in DOMException -FileError.NOT_FOUND_ERR = 1; -FileError.SECURITY_ERR = 2; -FileError.ABORT_ERR = 3; - -// Added by File API specification -FileError.NOT_READABLE_ERR = 4; -FileError.ENCODING_ERR = 5; -FileError.NO_MODIFICATION_ALLOWED_ERR = 6; -FileError.INVALID_STATE_ERR = 7; -FileError.SYNTAX_ERR = 8; -FileError.INVALID_MODIFICATION_ERR = 9; -FileError.QUOTA_EXCEEDED_ERR = 10; -FileError.TYPE_MISMATCH_ERR = 11; -FileError.PATH_EXISTS_ERR = 12; - -module.exports = FileError; - -}); - -// file: lib/common/plugin/FileReader.js -define("cordova/plugin/FileReader", function(require, exports, module) { - -var exec = require('cordova/exec'), - modulemapper = require('cordova/modulemapper'), - utils = require('cordova/utils'), - File = require('cordova/plugin/File'), - FileError = require('cordova/plugin/FileError'), - ProgressEvent = require('cordova/plugin/ProgressEvent'), - origFileReader = modulemapper.getOriginalSymbol(this, 'FileReader'); - -/** - * This class reads the mobile device file system. - * - * For Android: - * The root directory is the root of the file system. - * To read from the SD card, the file name is "sdcard/my_file.txt" - * @constructor - */ -var FileReader = function() { - this._readyState = 0; - this._error = null; - this._result = null; - this._fileName = ''; - this._realReader = origFileReader ? new origFileReader() : {}; -}; - -// States -FileReader.EMPTY = 0; -FileReader.LOADING = 1; -FileReader.DONE = 2; - -utils.defineGetter(FileReader.prototype, 'readyState', function() { - return this._fileName ? this._readyState : this._realReader.readyState; -}); - -utils.defineGetter(FileReader.prototype, 'error', function() { - return this._fileName ? this._error: this._realReader.error; -}); - -utils.defineGetter(FileReader.prototype, 'result', function() { - return this._fileName ? this._result: this._realReader.result; -}); - -function defineEvent(eventName) { - utils.defineGetterSetter(FileReader.prototype, eventName, function() { - return this._realReader[eventName] || null; - }, function(value) { - this._realReader[eventName] = value; - }); -} -defineEvent('onloadstart'); // When the read starts. -defineEvent('onprogress'); // While reading (and decoding) file or fileBlob data, and reporting partial file data (progress.loaded/progress.total) -defineEvent('onload'); // When the read has successfully completed. -defineEvent('onerror'); // When the read has failed (see errors). -defineEvent('onloadend'); // When the request has completed (either in success or failure). -defineEvent('onabort'); // When the read has been aborted. For instance, by invoking the abort() method. - -function initRead(reader, file) { - // Already loading something - if (reader.readyState == FileReader.LOADING) { - throw new FileError(FileError.INVALID_STATE_ERR); - } - - reader._result = null; - reader._error = null; - reader._readyState = FileReader.LOADING; - - if (typeof file == 'string') { - // Deprecated in Cordova 2.4. - console.warn('Using a string argument with FileReader.readAs functions is deprecated.'); - reader._fileName = file; - } else if (typeof file.fullPath == 'string') { - reader._fileName = file.fullPath; - } else { - reader._fileName = ''; - return true; - } - - reader.onloadstart && reader.onloadstart(new ProgressEvent("loadstart", {target:reader})); -} - -/** - * Abort reading file. - */ -FileReader.prototype.abort = function() { - if (origFileReader && !this._fileName) { - return this._realReader.abort(); - } - this._result = null; - - if (this._readyState == FileReader.DONE || this._readyState == FileReader.EMPTY) { - return; - } - - this._readyState = FileReader.DONE; - - // If abort callback - if (typeof this.onabort === 'function') { - this.onabort(new ProgressEvent('abort', {target:this})); - } - // If load end callback - if (typeof this.onloadend === 'function') { - this.onloadend(new ProgressEvent('loadend', {target:this})); - } -}; - -/** - * Read text file. - * - * @param file {File} File object containing file properties - * @param encoding [Optional] (see http://www.iana.org/assignments/character-sets) - */ -FileReader.prototype.readAsText = function(file, encoding) { - if (initRead(this, file)) { - return this._realReader.readAsText(file, encoding); - } - - // Default encoding is UTF-8 - var enc = encoding ? encoding : "UTF-8"; - var me = this; - var execArgs = [this._fileName, enc, file.start, file.end]; - - // Read file - exec( - // Success callback - function(r) { - // If DONE (cancelled), then don't do anything - if (me._readyState === FileReader.DONE) { - return; - } - - // Save result - me._result = r; - - // If onload callback - if (typeof me.onload === "function") { - me.onload(new ProgressEvent("load", {target:me})); - } - - // DONE state - me._readyState = FileReader.DONE; - - // If onloadend callback - if (typeof me.onloadend === "function") { - me.onloadend(new ProgressEvent("loadend", {target:me})); - } - }, - // Error callback - function(e) { - // If DONE (cancelled), then don't do anything - if (me._readyState === FileReader.DONE) { - return; - } - - // DONE state - me._readyState = FileReader.DONE; - - // null result - me._result = null; - - // Save error - me._error = new FileError(e); - - // If onerror callback - if (typeof me.onerror === "function") { - me.onerror(new ProgressEvent("error", {target:me})); - } - - // If onloadend callback - if (typeof me.onloadend === "function") { - me.onloadend(new ProgressEvent("loadend", {target:me})); - } - }, "File", "readAsText", execArgs); -}; - - -/** - * Read file and return data as a base64 encoded data url. - * A data url is of the form: - * data:[][;base64], - * - * @param file {File} File object containing file properties - */ -FileReader.prototype.readAsDataURL = function(file) { - if (initRead(this, file)) { - return this._realReader.readAsDataURL(file); - } - - var me = this; - var execArgs = [this._fileName, file.start, file.end]; - - // Read file - exec( - // Success callback - function(r) { - // If DONE (cancelled), then don't do anything - if (me._readyState === FileReader.DONE) { - return; - } - - // DONE state - me._readyState = FileReader.DONE; - - // Save result - me._result = r; - - // If onload callback - if (typeof me.onload === "function") { - me.onload(new ProgressEvent("load", {target:me})); - } - - // If onloadend callback - if (typeof me.onloadend === "function") { - me.onloadend(new ProgressEvent("loadend", {target:me})); - } - }, - // Error callback - function(e) { - // If DONE (cancelled), then don't do anything - if (me._readyState === FileReader.DONE) { - return; - } - - // DONE state - me._readyState = FileReader.DONE; - - me._result = null; - - // Save error - me._error = new FileError(e); - - // If onerror callback - if (typeof me.onerror === "function") { - me.onerror(new ProgressEvent("error", {target:me})); - } - - // If onloadend callback - if (typeof me.onloadend === "function") { - me.onloadend(new ProgressEvent("loadend", {target:me})); - } - }, "File", "readAsDataURL", execArgs); -}; - -/** - * Read file and return data as a binary data. - * - * @param file {File} File object containing file properties - */ -FileReader.prototype.readAsBinaryString = function(file) { - if (initRead(this, file)) { - return this._realReader.readAsBinaryString(file); - } - - var me = this; - var execArgs = [this._fileName, file.start, file.end]; - - // Read file - exec( - // Success callback - function(r) { - // If DONE (cancelled), then don't do anything - if (me._readyState === FileReader.DONE) { - return; - } - - // DONE state - me._readyState = FileReader.DONE; - - me._result = r; - - // If onload callback - if (typeof me.onload === "function") { - me.onload(new ProgressEvent("load", {target:me})); - } - - // If onloadend callback - if (typeof me.onloadend === "function") { - me.onloadend(new ProgressEvent("loadend", {target:me})); - } - }, - // Error callback - function(e) { - // If DONE (cancelled), then don't do anything - if (me._readyState === FileReader.DONE) { - return; - } - - // DONE state - me._readyState = FileReader.DONE; - - me._result = null; - - // Save error - me._error = new FileError(e); - - // If onerror callback - if (typeof me.onerror === "function") { - me.onerror(new ProgressEvent("error", {target:me})); - } - - // If onloadend callback - if (typeof me.onloadend === "function") { - me.onloadend(new ProgressEvent("loadend", {target:me})); - } - }, "File", "readAsBinaryString", execArgs); -}; - -/** - * Read file and return data as a binary data. - * - * @param file {File} File object containing file properties - */ -FileReader.prototype.readAsArrayBuffer = function(file) { - if (initRead(this, file)) { - return this._realReader.readAsArrayBuffer(file); - } - - var me = this; - var execArgs = [this._fileName, file.start, file.end]; - - // Read file - exec( - // Success callback - function(r) { - // If DONE (cancelled), then don't do anything - if (me._readyState === FileReader.DONE) { - return; - } - - // DONE state - me._readyState = FileReader.DONE; - - me._result = r; - - // If onload callback - if (typeof me.onload === "function") { - me.onload(new ProgressEvent("load", {target:me})); - } - - // If onloadend callback - if (typeof me.onloadend === "function") { - me.onloadend(new ProgressEvent("loadend", {target:me})); - } - }, - // Error callback - function(e) { - // If DONE (cancelled), then don't do anything - if (me._readyState === FileReader.DONE) { - return; - } - - // DONE state - me._readyState = FileReader.DONE; - - me._result = null; - - // Save error - me._error = new FileError(e); - - // If onerror callback - if (typeof me.onerror === "function") { - me.onerror(new ProgressEvent("error", {target:me})); - } - - // If onloadend callback - if (typeof me.onloadend === "function") { - me.onloadend(new ProgressEvent("loadend", {target:me})); - } - }, "File", "readAsArrayBuffer", execArgs); -}; - -module.exports = FileReader; - -}); - -// file: lib/common/plugin/FileSystem.js -define("cordova/plugin/FileSystem", function(require, exports, module) { - -var DirectoryEntry = require('cordova/plugin/DirectoryEntry'); - -/** - * An interface representing a file system - * - * @constructor - * {DOMString} name the unique name of the file system (readonly) - * {DirectoryEntry} root directory of the file system (readonly) - */ -var FileSystem = function(name, root) { - this.name = name || null; - if (root) { - this.root = new DirectoryEntry(root.name, root.fullPath); - } -}; - -module.exports = FileSystem; - -}); - -// file: lib/common/plugin/FileTransfer.js -define("cordova/plugin/FileTransfer", function(require, exports, module) { - -var argscheck = require('cordova/argscheck'), - exec = require('cordova/exec'), - FileTransferError = require('cordova/plugin/FileTransferError'), - ProgressEvent = require('cordova/plugin/ProgressEvent'); - -function newProgressEvent(result) { - var pe = new ProgressEvent(); - pe.lengthComputable = result.lengthComputable; - pe.loaded = result.loaded; - pe.total = result.total; - return pe; -} - -function getBasicAuthHeader(urlString) { - var header = null; - - if (window.btoa) { - // parse the url using the Location object - var url = document.createElement('a'); - url.href = urlString; - - var credentials = null; - var protocol = url.protocol + "//"; - var origin = protocol + url.host; - - // check whether there are the username:password credentials in the url - if (url.href.indexOf(origin) !== 0) { // credentials found - var atIndex = url.href.indexOf("@"); - credentials = url.href.substring(protocol.length, atIndex); - } - - if (credentials) { - var authHeader = "Authorization"; - var authHeaderValue = "Basic " + window.btoa(credentials); - - header = { - name : authHeader, - value : authHeaderValue - }; - } - } - - return header; -} - -var idCounter = 0; - -/** - * FileTransfer uploads a file to a remote server. - * @constructor - */ -var FileTransfer = function() { - this._id = ++idCounter; - this.onprogress = null; // optional callback -}; - -/** -* Given an absolute file path, uploads a file on the device to a remote server -* using a multipart HTTP request. -* @param filePath {String} Full path of the file on the device -* @param server {String} URL of the server to receive the file -* @param successCallback (Function} Callback to be invoked when upload has completed -* @param errorCallback {Function} Callback to be invoked upon error -* @param options {FileUploadOptions} Optional parameters such as file name and mimetype -* @param trustAllHosts {Boolean} Optional trust all hosts (e.g. for self-signed certs), defaults to false -*/ -FileTransfer.prototype.upload = function(filePath, server, successCallback, errorCallback, options, trustAllHosts) { - argscheck.checkArgs('ssFFO*', 'FileTransfer.upload', arguments); - // check for options - var fileKey = null; - var fileName = null; - var mimeType = null; - var params = null; - var chunkedMode = true; - var headers = null; - var httpMethod = null; - var basicAuthHeader = getBasicAuthHeader(server); - if (basicAuthHeader) { - options = options || {}; - options.headers = options.headers || {}; - options.headers[basicAuthHeader.name] = basicAuthHeader.value; - } - - if (options) { - fileKey = options.fileKey; - fileName = options.fileName; - mimeType = options.mimeType; - headers = options.headers; - httpMethod = options.httpMethod || "POST"; - if (httpMethod.toUpperCase() == "PUT"){ - httpMethod = "PUT"; - } else { - httpMethod = "POST"; - } - if (options.chunkedMode !== null || typeof options.chunkedMode != "undefined") { - chunkedMode = options.chunkedMode; - } - if (options.params) { - params = options.params; - } - else { - params = {}; - } - } - - var fail = errorCallback && function(e) { - var error = new FileTransferError(e.code, e.source, e.target, e.http_status, e.body); - errorCallback(error); - }; - - var self = this; - var win = function(result) { - if (typeof result.lengthComputable != "undefined") { - if (self.onprogress) { - self.onprogress(newProgressEvent(result)); - } - } else { - successCallback && successCallback(result); - } - }; - exec(win, fail, 'FileTransfer', 'upload', [filePath, server, fileKey, fileName, mimeType, params, trustAllHosts, chunkedMode, headers, this._id, httpMethod]); -}; - -/** - * Downloads a file form a given URL and saves it to the specified directory. - * @param source {String} URL of the server to receive the file - * @param target {String} Full path of the file on the device - * @param successCallback (Function} Callback to be invoked when upload has completed - * @param errorCallback {Function} Callback to be invoked upon error - * @param trustAllHosts {Boolean} Optional trust all hosts (e.g. for self-signed certs), defaults to false - * @param options {FileDownloadOptions} Optional parameters such as headers - */ -FileTransfer.prototype.download = function(source, target, successCallback, errorCallback, trustAllHosts, options) { - argscheck.checkArgs('ssFF*', 'FileTransfer.download', arguments); - var self = this; - - var basicAuthHeader = getBasicAuthHeader(source); - if (basicAuthHeader) { - options = options || {}; - options.headers = options.headers || {}; - options.headers[basicAuthHeader.name] = basicAuthHeader.value; - } - - var headers = null; - if (options) { - headers = options.headers || null; - } - - var win = function(result) { - if (typeof result.lengthComputable != "undefined") { - if (self.onprogress) { - return self.onprogress(newProgressEvent(result)); - } - } else if (successCallback) { - var entry = null; - if (result.isDirectory) { - entry = new (require('cordova/plugin/DirectoryEntry'))(); - } - else if (result.isFile) { - entry = new (require('cordova/plugin/FileEntry'))(); - } - entry.isDirectory = result.isDirectory; - entry.isFile = result.isFile; - entry.name = result.name; - entry.fullPath = result.fullPath; - successCallback(entry); - } - }; - - var fail = errorCallback && function(e) { - var error = new FileTransferError(e.code, e.source, e.target, e.http_status, e.body); - errorCallback(error); - }; - - exec(win, fail, 'FileTransfer', 'download', [source, target, trustAllHosts, this._id, headers]); -}; - -/** - * Aborts the ongoing file transfer on this object. The original error - * callback for the file transfer will be called if necessary. - */ -FileTransfer.prototype.abort = function() { - exec(null, null, 'FileTransfer', 'abort', [this._id]); -}; - -module.exports = FileTransfer; - -}); - -// file: lib/common/plugin/FileTransferError.js -define("cordova/plugin/FileTransferError", function(require, exports, module) { - -/** - * FileTransferError - * @constructor - */ -var FileTransferError = function(code, source, target, status, body) { - this.code = code || null; - this.source = source || null; - this.target = target || null; - this.http_status = status || null; - this.body = body || null; -}; - -FileTransferError.FILE_NOT_FOUND_ERR = 1; -FileTransferError.INVALID_URL_ERR = 2; -FileTransferError.CONNECTION_ERR = 3; -FileTransferError.ABORT_ERR = 4; - -module.exports = FileTransferError; - -}); - -// file: lib/common/plugin/FileUploadOptions.js -define("cordova/plugin/FileUploadOptions", function(require, exports, module) { - -/** - * Options to customize the HTTP request used to upload files. - * @constructor - * @param fileKey {String} Name of file request parameter. - * @param fileName {String} Filename to be used by the server. Defaults to image.jpg. - * @param mimeType {String} Mimetype of the uploaded file. Defaults to image/jpeg. - * @param params {Object} Object with key: value params to send to the server. - * @param headers {Object} Keys are header names, values are header values. Multiple - * headers of the same name are not supported. - */ -var FileUploadOptions = function(fileKey, fileName, mimeType, params, headers, httpMethod) { - this.fileKey = fileKey || null; - this.fileName = fileName || null; - this.mimeType = mimeType || null; - this.params = params || null; - this.headers = headers || null; - this.httpMethod = httpMethod || null; -}; - -module.exports = FileUploadOptions; - -}); - -// file: lib/common/plugin/FileUploadResult.js -define("cordova/plugin/FileUploadResult", function(require, exports, module) { - -/** - * FileUploadResult - * @constructor - */ -var FileUploadResult = function() { - this.bytesSent = 0; - this.responseCode = null; - this.response = null; -}; - -module.exports = FileUploadResult; - -}); - -// file: lib/common/plugin/FileWriter.js -define("cordova/plugin/FileWriter", function(require, exports, module) { - -var exec = require('cordova/exec'), - FileError = require('cordova/plugin/FileError'), - ProgressEvent = require('cordova/plugin/ProgressEvent'); - -/** - * This class writes to the mobile device file system. - * - * For Android: - * The root directory is the root of the file system. - * To write to the SD card, the file name is "sdcard/my_file.txt" - * - * @constructor - * @param file {File} File object containing file properties - * @param append if true write to the end of the file, otherwise overwrite the file - */ -var FileWriter = function(file) { - this.fileName = ""; - this.length = 0; - if (file) { - this.fileName = file.fullPath || file; - this.length = file.size || 0; - } - // default is to write at the beginning of the file - this.position = 0; - - this.readyState = 0; // EMPTY - - this.result = null; - - // Error - this.error = null; - - // Event handlers - this.onwritestart = null; // When writing starts - this.onprogress = null; // While writing the file, and reporting partial file data - this.onwrite = null; // When the write has successfully completed. - this.onwriteend = null; // When the request has completed (either in success or failure). - this.onabort = null; // When the write has been aborted. For instance, by invoking the abort() method. - this.onerror = null; // When the write has failed (see errors). -}; - -// States -FileWriter.INIT = 0; -FileWriter.WRITING = 1; -FileWriter.DONE = 2; - -/** - * Abort writing file. - */ -FileWriter.prototype.abort = function() { - // check for invalid state - if (this.readyState === FileWriter.DONE || this.readyState === FileWriter.INIT) { - throw new FileError(FileError.INVALID_STATE_ERR); - } - - // set error - this.error = new FileError(FileError.ABORT_ERR); - - this.readyState = FileWriter.DONE; - - // If abort callback - if (typeof this.onabort === "function") { - this.onabort(new ProgressEvent("abort", {"target":this})); - } - - // If write end callback - if (typeof this.onwriteend === "function") { - this.onwriteend(new ProgressEvent("writeend", {"target":this})); - } -}; - -/** - * Writes data to the file - * - * @param text to be written - */ -FileWriter.prototype.write = function(text) { - // Throw an exception if we are already writing a file - if (this.readyState === FileWriter.WRITING) { - throw new FileError(FileError.INVALID_STATE_ERR); - } - - // WRITING state - this.readyState = FileWriter.WRITING; - - var me = this; - - // If onwritestart callback - if (typeof me.onwritestart === "function") { - me.onwritestart(new ProgressEvent("writestart", {"target":me})); - } - - // Write file - exec( - // Success callback - function(r) { - // If DONE (cancelled), then don't do anything - if (me.readyState === FileWriter.DONE) { - return; - } - - // position always increases by bytes written because file would be extended - me.position += r; - // The length of the file is now where we are done writing. - - me.length = me.position; - - // DONE state - me.readyState = FileWriter.DONE; - - // If onwrite callback - if (typeof me.onwrite === "function") { - me.onwrite(new ProgressEvent("write", {"target":me})); - } - - // If onwriteend callback - if (typeof me.onwriteend === "function") { - me.onwriteend(new ProgressEvent("writeend", {"target":me})); - } - }, - // Error callback - function(e) { - // If DONE (cancelled), then don't do anything - if (me.readyState === FileWriter.DONE) { - return; - } - - // DONE state - me.readyState = FileWriter.DONE; - - // Save error - me.error = new FileError(e); - - // If onerror callback - if (typeof me.onerror === "function") { - me.onerror(new ProgressEvent("error", {"target":me})); - } - - // If onwriteend callback - if (typeof me.onwriteend === "function") { - me.onwriteend(new ProgressEvent("writeend", {"target":me})); - } - }, "File", "write", [this.fileName, text, this.position]); -}; - -/** - * Moves the file pointer to the location specified. - * - * If the offset is a negative number the position of the file - * pointer is rewound. If the offset is greater than the file - * size the position is set to the end of the file. - * - * @param offset is the location to move the file pointer to. - */ -FileWriter.prototype.seek = function(offset) { - // Throw an exception if we are already writing a file - if (this.readyState === FileWriter.WRITING) { - throw new FileError(FileError.INVALID_STATE_ERR); - } - - if (!offset && offset !== 0) { - return; - } - - // See back from end of file. - if (offset < 0) { - this.position = Math.max(offset + this.length, 0); - } - // Offset is bigger than file size so set position - // to the end of the file. - else if (offset > this.length) { - this.position = this.length; - } - // Offset is between 0 and file size so set the position - // to start writing. - else { - this.position = offset; - } -}; - -/** - * Truncates the file to the size specified. - * - * @param size to chop the file at. - */ -FileWriter.prototype.truncate = function(size) { - // Throw an exception if we are already writing a file - if (this.readyState === FileWriter.WRITING) { - throw new FileError(FileError.INVALID_STATE_ERR); - } - - // WRITING state - this.readyState = FileWriter.WRITING; - - var me = this; - - // If onwritestart callback - if (typeof me.onwritestart === "function") { - me.onwritestart(new ProgressEvent("writestart", {"target":this})); - } - - // Write file - exec( - // Success callback - function(r) { - // If DONE (cancelled), then don't do anything - if (me.readyState === FileWriter.DONE) { - return; - } - - // DONE state - me.readyState = FileWriter.DONE; - - // Update the length of the file - me.length = r; - me.position = Math.min(me.position, r); - - // If onwrite callback - if (typeof me.onwrite === "function") { - me.onwrite(new ProgressEvent("write", {"target":me})); - } - - // If onwriteend callback - if (typeof me.onwriteend === "function") { - me.onwriteend(new ProgressEvent("writeend", {"target":me})); - } - }, - // Error callback - function(e) { - // If DONE (cancelled), then don't do anything - if (me.readyState === FileWriter.DONE) { - return; - } - - // DONE state - me.readyState = FileWriter.DONE; - - // Save error - me.error = new FileError(e); - - // If onerror callback - if (typeof me.onerror === "function") { - me.onerror(new ProgressEvent("error", {"target":me})); - } - - // If onwriteend callback - if (typeof me.onwriteend === "function") { - me.onwriteend(new ProgressEvent("writeend", {"target":me})); - } - }, "File", "truncate", [this.fileName, size]); -}; - -module.exports = FileWriter; - -}); - -// file: lib/common/plugin/Flags.js -define("cordova/plugin/Flags", function(require, exports, module) { - -/** - * Supplies arguments to methods that lookup or create files and directories. - * - * @param create - * {boolean} file or directory if it doesn't exist - * @param exclusive - * {boolean} used with create; if true the command will fail if - * target path exists - */ -function Flags(create, exclusive) { - this.create = create || false; - this.exclusive = exclusive || false; -} - -module.exports = Flags; - -}); - -// file: lib/common/plugin/GlobalizationError.js -define("cordova/plugin/GlobalizationError", function(require, exports, module) { - - -/** - * Globalization error object - * - * @constructor - * @param code - * @param message - */ -var GlobalizationError = function(code, message) { - this.code = code || null; - this.message = message || ''; -}; - -// Globalization error codes -GlobalizationError.UNKNOWN_ERROR = 0; -GlobalizationError.FORMATTING_ERROR = 1; -GlobalizationError.PARSING_ERROR = 2; -GlobalizationError.PATTERN_ERROR = 3; - -module.exports = GlobalizationError; - -}); - -// file: lib/common/plugin/InAppBrowser.js -define("cordova/plugin/InAppBrowser", function(require, exports, module) { - -var exec = require('cordova/exec'); -var channel = require('cordova/channel'); -var modulemapper = require('cordova/modulemapper'); - -function InAppBrowser() { - this.channels = { - 'loadstart': channel.create('loadstart'), - 'loadstop' : channel.create('loadstop'), - 'loaderror' : channel.create('loaderror'), - 'exit' : channel.create('exit') - }; -} - -InAppBrowser.prototype = { - _eventHandler: function (event) { - if (event.type in this.channels) { - this.channels[event.type].fire(event); - } - }, - close: function (eventname) { - exec(null, null, "InAppBrowser", "close", []); - }, - addEventListener: function (eventname,f) { - if (eventname in this.channels) { - this.channels[eventname].subscribe(f); - } - }, - removeEventListener: function(eventname, f) { - if (eventname in this.channels) { - this.channels[eventname].unsubscribe(f); - } - }, - - executeScript: function(injectDetails, cb) { - if (injectDetails.code) { - exec(cb, null, "InAppBrowser", "injectScriptCode", [injectDetails.code, !!cb]); - } else if (injectDetails.file) { - exec(cb, null, "InAppBrowser", "injectScriptFile", [injectDetails.file, !!cb]); - } else { - throw new Error('executeScript requires exactly one of code or file to be specified'); - } - }, - - insertCSS: function(injectDetails, cb) { - if (injectDetails.code) { - exec(cb, null, "InAppBrowser", "injectStyleCode", [injectDetails.code, !!cb]); - } else if (injectDetails.file) { - exec(cb, null, "InAppBrowser", "injectStyleFile", [injectDetails.file, !!cb]); - } else { - throw new Error('insertCSS requires exactly one of code or file to be specified'); - } - } -}; - -module.exports = function(strUrl, strWindowName, strWindowFeatures) { - var iab = new InAppBrowser(); - var cb = function(eventname) { - iab._eventHandler(eventname); - }; - - // Don't catch calls that write to existing frames (e.g. named iframes). - if (window.frames && window.frames[strWindowName]) { - var origOpenFunc = modulemapper.getOriginalSymbol(window, 'open'); - return origOpenFunc.apply(window, arguments); - } - - exec(cb, cb, "InAppBrowser", "open", [strUrl, strWindowName, strWindowFeatures]); - return iab; -}; - - -}); - -// file: lib/common/plugin/LocalFileSystem.js -define("cordova/plugin/LocalFileSystem", function(require, exports, module) { - -var exec = require('cordova/exec'); - -/** - * Represents a local file system. - */ -var LocalFileSystem = function() { - -}; - -LocalFileSystem.TEMPORARY = 0; //temporary, with no guarantee of persistence -LocalFileSystem.PERSISTENT = 1; //persistent - -module.exports = LocalFileSystem; - -}); - -// file: lib/common/plugin/Media.js -define("cordova/plugin/Media", function(require, exports, module) { - -var argscheck = require('cordova/argscheck'), - utils = require('cordova/utils'), - exec = require('cordova/exec'); - -var mediaObjects = {}; - -/** - * This class provides access to the device media, interfaces to both sound and video - * - * @constructor - * @param src The file name or url to play - * @param successCallback The callback to be called when the file is done playing or recording. - * successCallback() - * @param errorCallback The callback to be called if there is an error. - * errorCallback(int errorCode) - OPTIONAL - * @param statusCallback The callback to be called when media status has changed. - * statusCallback(int statusCode) - OPTIONAL - */ -var Media = function(src, successCallback, errorCallback, statusCallback) { - argscheck.checkArgs('SFFF', 'Media', arguments); - this.id = utils.createUUID(); - mediaObjects[this.id] = this; - this.src = src; - this.successCallback = successCallback; - this.errorCallback = errorCallback; - this.statusCallback = statusCallback; - this._duration = -1; - this._position = -1; - exec(null, this.errorCallback, "Media", "create", [this.id, this.src]); -}; - -// Media messages -Media.MEDIA_STATE = 1; -Media.MEDIA_DURATION = 2; -Media.MEDIA_POSITION = 3; -Media.MEDIA_ERROR = 9; - -// Media states -Media.MEDIA_NONE = 0; -Media.MEDIA_STARTING = 1; -Media.MEDIA_RUNNING = 2; -Media.MEDIA_PAUSED = 3; -Media.MEDIA_STOPPED = 4; -Media.MEDIA_MSG = ["None", "Starting", "Running", "Paused", "Stopped"]; - -// "static" function to return existing objs. -Media.get = function(id) { - return mediaObjects[id]; -}; - -/** - * Start or resume playing audio file. - */ -Media.prototype.play = function(options) { - exec(null, null, "Media", "startPlayingAudio", [this.id, this.src, options]); -}; - -/** - * Stop playing audio file. - */ -Media.prototype.stop = function() { - var me = this; - exec(function() { - me._position = 0; - }, this.errorCallback, "Media", "stopPlayingAudio", [this.id]); -}; - -/** - * Seek or jump to a new time in the track.. - */ -Media.prototype.seekTo = function(milliseconds) { - var me = this; - exec(function(p) { - me._position = p; - }, this.errorCallback, "Media", "seekToAudio", [this.id, milliseconds]); -}; - -/** - * Pause playing audio file. - */ -Media.prototype.pause = function() { - exec(null, this.errorCallback, "Media", "pausePlayingAudio", [this.id]); -}; - -/** - * Get duration of an audio file. - * The duration is only set for audio that is playing, paused or stopped. - * - * @return duration or -1 if not known. - */ -Media.prototype.getDuration = function() { - return this._duration; -}; - -/** - * Get position of audio. - */ -Media.prototype.getCurrentPosition = function(success, fail) { - var me = this; - exec(function(p) { - me._position = p; - success(p); - }, fail, "Media", "getCurrentPositionAudio", [this.id]); -}; - -/** - * Start recording audio file. - */ -Media.prototype.startRecord = function() { - exec(null, this.errorCallback, "Media", "startRecordingAudio", [this.id, this.src]); -}; - -/** - * Stop recording audio file. - */ -Media.prototype.stopRecord = function() { - exec(null, this.errorCallback, "Media", "stopRecordingAudio", [this.id]); -}; - -/** - * Release the resources. - */ -Media.prototype.release = function() { - exec(null, this.errorCallback, "Media", "release", [this.id]); -}; - -/** - * Adjust the volume. - */ -Media.prototype.setVolume = function(volume) { - exec(null, null, "Media", "setVolume", [this.id, volume]); -}; - -/** - * Audio has status update. - * PRIVATE - * - * @param id The media object id (string) - * @param msgType The 'type' of update this is - * @param value Use of value is determined by the msgType - */ -Media.onStatus = function(id, msgType, value) { - - var media = mediaObjects[id]; - - if(media) { - switch(msgType) { - case Media.MEDIA_STATE : - media.statusCallback && media.statusCallback(value); - if(value == Media.MEDIA_STOPPED) { - media.successCallback && media.successCallback(); - } - break; - case Media.MEDIA_DURATION : - media._duration = value; - break; - case Media.MEDIA_ERROR : - media.errorCallback && media.errorCallback(value); - break; - case Media.MEDIA_POSITION : - media._position = Number(value); - break; - default : - console.error && console.error("Unhandled Media.onStatus :: " + msgType); - break; - } - } - else { - console.error && console.error("Received Media.onStatus callback for unknown media :: " + id); - } - -}; - -module.exports = Media; - -}); - -// file: lib/common/plugin/MediaError.js -define("cordova/plugin/MediaError", function(require, exports, module) { - -/** - * This class contains information about any Media errors. -*/ -/* - According to :: http://dev.w3.org/html5/spec-author-view/video.html#mediaerror - We should never be creating these objects, we should just implement the interface - which has 1 property for an instance, 'code' - - instead of doing : - errorCallbackFunction( new MediaError(3,'msg') ); -we should simply use a literal : - errorCallbackFunction( {'code':3} ); - */ - - var _MediaError = window.MediaError; - - -if(!_MediaError) { - window.MediaError = _MediaError = function(code, msg) { - this.code = (typeof code != 'undefined') ? code : null; - this.message = msg || ""; // message is NON-standard! do not use! - }; -} - -_MediaError.MEDIA_ERR_NONE_ACTIVE = _MediaError.MEDIA_ERR_NONE_ACTIVE || 0; -_MediaError.MEDIA_ERR_ABORTED = _MediaError.MEDIA_ERR_ABORTED || 1; -_MediaError.MEDIA_ERR_NETWORK = _MediaError.MEDIA_ERR_NETWORK || 2; -_MediaError.MEDIA_ERR_DECODE = _MediaError.MEDIA_ERR_DECODE || 3; -_MediaError.MEDIA_ERR_NONE_SUPPORTED = _MediaError.MEDIA_ERR_NONE_SUPPORTED || 4; -// TODO: MediaError.MEDIA_ERR_NONE_SUPPORTED is legacy, the W3 spec now defines it as below. -// as defined by http://dev.w3.org/html5/spec-author-view/video.html#error-codes -_MediaError.MEDIA_ERR_SRC_NOT_SUPPORTED = _MediaError.MEDIA_ERR_SRC_NOT_SUPPORTED || 4; - -module.exports = _MediaError; - -}); - -// file: lib/common/plugin/MediaFile.js -define("cordova/plugin/MediaFile", function(require, exports, module) { - -var utils = require('cordova/utils'), - exec = require('cordova/exec'), - File = require('cordova/plugin/File'), - CaptureError = require('cordova/plugin/CaptureError'); -/** - * Represents a single file. - * - * name {DOMString} name of the file, without path information - * fullPath {DOMString} the full path of the file, including the name - * type {DOMString} mime type - * lastModifiedDate {Date} last modified date - * size {Number} size of the file in bytes - */ -var MediaFile = function(name, fullPath, type, lastModifiedDate, size){ - MediaFile.__super__.constructor.apply(this, arguments); -}; - -utils.extend(MediaFile, File); - -/** - * Request capture format data for a specific file and type - * - * @param {Function} successCB - * @param {Function} errorCB - */ -MediaFile.prototype.getFormatData = function(successCallback, errorCallback) { - if (typeof this.fullPath === "undefined" || this.fullPath === null) { - errorCallback(new CaptureError(CaptureError.CAPTURE_INVALID_ARGUMENT)); - } else { - exec(successCallback, errorCallback, "Capture", "getFormatData", [this.fullPath, this.type]); - } -}; - -module.exports = MediaFile; - -}); - -// file: lib/common/plugin/MediaFileData.js -define("cordova/plugin/MediaFileData", function(require, exports, module) { - -/** - * MediaFileData encapsulates format information of a media file. - * - * @param {DOMString} codecs - * @param {long} bitrate - * @param {long} height - * @param {long} width - * @param {float} duration - */ -var MediaFileData = function(codecs, bitrate, height, width, duration){ - this.codecs = codecs || null; - this.bitrate = bitrate || 0; - this.height = height || 0; - this.width = width || 0; - this.duration = duration || 0; -}; - -module.exports = MediaFileData; - -}); - -// file: lib/common/plugin/Metadata.js -define("cordova/plugin/Metadata", function(require, exports, module) { - -/** - * Information about the state of the file or directory - * - * {Date} modificationTime (readonly) - */ -var Metadata = function(time) { - this.modificationTime = (typeof time != 'undefined'?new Date(time):null); -}; - -module.exports = Metadata; - -}); - -// file: lib/common/plugin/Position.js -define("cordova/plugin/Position", function(require, exports, module) { - -var Coordinates = require('cordova/plugin/Coordinates'); - -var Position = function(coords, timestamp) { - if (coords) { - this.coords = new Coordinates(coords.latitude, coords.longitude, coords.altitude, coords.accuracy, coords.heading, coords.velocity, coords.altitudeAccuracy); - } else { - this.coords = new Coordinates(); - } - this.timestamp = (timestamp !== undefined) ? timestamp : new Date(); -}; - -module.exports = Position; - -}); - -// file: lib/common/plugin/PositionError.js -define("cordova/plugin/PositionError", function(require, exports, module) { - -/** - * Position error object - * - * @constructor - * @param code - * @param message - */ -var PositionError = function(code, message) { - this.code = code || null; - this.message = message || ''; -}; - -PositionError.PERMISSION_DENIED = 1; -PositionError.POSITION_UNAVAILABLE = 2; -PositionError.TIMEOUT = 3; - -module.exports = PositionError; - -}); - -// file: lib/common/plugin/ProgressEvent.js -define("cordova/plugin/ProgressEvent", function(require, exports, module) { - -// If ProgressEvent exists in global context, use it already, otherwise use our own polyfill -// Feature test: See if we can instantiate a native ProgressEvent; -// if so, use that approach, -// otherwise fill-in with our own implementation. -// -// NOTE: right now we always fill in with our own. Down the road would be nice if we can use whatever is native in the webview. -var ProgressEvent = (function() { - /* - var createEvent = function(data) { - var event = document.createEvent('Events'); - event.initEvent('ProgressEvent', false, false); - if (data) { - for (var i in data) { - if (data.hasOwnProperty(i)) { - event[i] = data[i]; - } - } - if (data.target) { - // TODO: cannot call .dispatchEvent - // need to first figure out how to implement EventTarget - } - } - return event; - }; - try { - var ev = createEvent({type:"abort",target:document}); - return function ProgressEvent(type, data) { - data.type = type; - return createEvent(data); - }; - } catch(e){ - */ - return function ProgressEvent(type, dict) { - this.type = type; - this.bubbles = false; - this.cancelBubble = false; - this.cancelable = false; - this.lengthComputable = false; - this.loaded = dict && dict.loaded ? dict.loaded : 0; - this.total = dict && dict.total ? dict.total : 0; - this.target = dict && dict.target ? dict.target : null; - }; - //} -})(); - -module.exports = ProgressEvent; - -}); - -// file: lib/common/plugin/accelerometer.js -define("cordova/plugin/accelerometer", function(require, exports, module) { - -/** - * This class provides access to device accelerometer data. - * @constructor - */ -var argscheck = require('cordova/argscheck'), - utils = require("cordova/utils"), - exec = require("cordova/exec"), - Acceleration = require('cordova/plugin/Acceleration'); - -// Is the accel sensor running? -var running = false; - -// Keeps reference to watchAcceleration calls. -var timers = {}; - -// Array of listeners; used to keep track of when we should call start and stop. -var listeners = []; - -// Last returned acceleration object from native -var accel = null; - -// Tells native to start. -function start() { - exec(function(a) { - var tempListeners = listeners.slice(0); - accel = new Acceleration(a.x, a.y, a.z, a.timestamp); - for (var i = 0, l = tempListeners.length; i < l; i++) { - tempListeners[i].win(accel); - } - }, function(e) { - var tempListeners = listeners.slice(0); - for (var i = 0, l = tempListeners.length; i < l; i++) { - tempListeners[i].fail(e); - } - }, "Accelerometer", "start", []); - running = true; -} - -// Tells native to stop. -function stop() { - exec(null, null, "Accelerometer", "stop", []); - running = false; -} - -// Adds a callback pair to the listeners array -function createCallbackPair(win, fail) { - return {win:win, fail:fail}; -} - -// Removes a win/fail listener pair from the listeners array -function removeListeners(l) { - var idx = listeners.indexOf(l); - if (idx > -1) { - listeners.splice(idx, 1); - if (listeners.length === 0) { - stop(); - } - } -} - -var accelerometer = { - /** - * Asynchronously acquires the current acceleration. - * - * @param {Function} successCallback The function to call when the acceleration data is available - * @param {Function} errorCallback The function to call when there is an error getting the acceleration data. (OPTIONAL) - * @param {AccelerationOptions} options The options for getting the accelerometer data such as timeout. (OPTIONAL) - */ - getCurrentAcceleration: function(successCallback, errorCallback, options) { - argscheck.checkArgs('fFO', 'accelerometer.getCurrentAcceleration', arguments); - - var p; - var win = function(a) { - removeListeners(p); - successCallback(a); - }; - var fail = function(e) { - removeListeners(p); - errorCallback && errorCallback(e); - }; - - p = createCallbackPair(win, fail); - listeners.push(p); - - if (!running) { - start(); - } - }, - - /** - * Asynchronously acquires the acceleration repeatedly at a given interval. - * - * @param {Function} successCallback The function to call each time the acceleration data is available - * @param {Function} errorCallback The function to call when there is an error getting the acceleration data. (OPTIONAL) - * @param {AccelerationOptions} options The options for getting the accelerometer data such as timeout. (OPTIONAL) - * @return String The watch id that must be passed to #clearWatch to stop watching. - */ - watchAcceleration: function(successCallback, errorCallback, options) { - argscheck.checkArgs('fFO', 'accelerometer.watchAcceleration', arguments); - // Default interval (10 sec) - var frequency = (options && options.frequency && typeof options.frequency == 'number') ? options.frequency : 10000; - - // Keep reference to watch id, and report accel readings as often as defined in frequency - var id = utils.createUUID(); - - var p = createCallbackPair(function(){}, function(e) { - removeListeners(p); - errorCallback && errorCallback(e); - }); - listeners.push(p); - - timers[id] = { - timer:window.setInterval(function() { - if (accel) { - successCallback(accel); - } - }, frequency), - listeners:p - }; - - if (running) { - // If we're already running then immediately invoke the success callback - // but only if we have retrieved a value, sample code does not check for null ... - if (accel) { - successCallback(accel); - } - } else { - start(); - } - - return id; - }, - - /** - * Clears the specified accelerometer watch. - * - * @param {String} id The id of the watch returned from #watchAcceleration. - */ - clearWatch: function(id) { - // Stop javascript timer & remove from timer list - if (id && timers[id]) { - window.clearInterval(timers[id].timer); - removeListeners(timers[id].listeners); - delete timers[id]; - } - } -}; - -module.exports = accelerometer; - -}); - -// file: lib/common/plugin/accelerometer/symbols.js -define("cordova/plugin/accelerometer/symbols", function(require, exports, module) { - - -var modulemapper = require('cordova/modulemapper'); - -modulemapper.defaults('cordova/plugin/Acceleration', 'Acceleration'); -modulemapper.defaults('cordova/plugin/accelerometer', 'navigator.accelerometer'); - -}); - -// file: lib/android/plugin/android/app.js -define("cordova/plugin/android/app", function(require, exports, module) { - -var exec = require('cordova/exec'); - -module.exports = { - /** - * Clear the resource cache. - */ - clearCache:function() { - exec(null, null, "App", "clearCache", []); - }, - - /** - * Load the url into the webview or into new browser instance. - * - * @param url The URL to load - * @param props Properties that can be passed in to the activity: - * wait: int => wait msec before loading URL - * loadingDialog: "Title,Message" => display a native loading dialog - * loadUrlTimeoutValue: int => time in msec to wait before triggering a timeout error - * clearHistory: boolean => clear webview history (default=false) - * openExternal: boolean => open in a new browser (default=false) - * - * Example: - * navigator.app.loadUrl("http://server/myapp/index.html", {wait:2000, loadingDialog:"Wait,Loading App", loadUrlTimeoutValue: 60000}); - */ - loadUrl:function(url, props) { - exec(null, null, "App", "loadUrl", [url, props]); - }, - - /** - * Cancel loadUrl that is waiting to be loaded. - */ - cancelLoadUrl:function() { - exec(null, null, "App", "cancelLoadUrl", []); - }, - - /** - * Clear web history in this web view. - * Instead of BACK button loading the previous web page, it will exit the app. - */ - clearHistory:function() { - exec(null, null, "App", "clearHistory", []); - }, - - /** - * Go to previous page displayed. - * This is the same as pressing the backbutton on Android device. - */ - backHistory:function() { - exec(null, null, "App", "backHistory", []); - }, - - /** - * Override the default behavior of the Android back button. - * If overridden, when the back button is pressed, the "backKeyDown" JavaScript event will be fired. - * - * Note: The user should not have to call this method. Instead, when the user - * registers for the "backbutton" event, this is automatically done. - * - * @param override T=override, F=cancel override - */ - overrideBackbutton:function(override) { - exec(null, null, "App", "overrideBackbutton", [override]); - }, - - /** - * Exit and terminate the application. - */ - exitApp:function() { - return exec(null, null, "App", "exitApp", []); - } -}; - -}); - -// file: lib/android/plugin/android/device.js -define("cordova/plugin/android/device", function(require, exports, module) { - -var channel = require('cordova/channel'), - utils = require('cordova/utils'), - exec = require('cordova/exec'), - app = require('cordova/plugin/android/app'); - -module.exports = { - /* - * DEPRECATED - * This is only for Android. - * - * You must explicitly override the back button. - */ - overrideBackButton:function() { - console.log("Device.overrideBackButton() is deprecated. Use App.overrideBackbutton(true)."); - app.overrideBackbutton(true); - }, - - /* - * DEPRECATED - * This is only for Android. - * - * This resets the back button to the default behavior - */ - resetBackButton:function() { - console.log("Device.resetBackButton() is deprecated. Use App.overrideBackbutton(false)."); - app.overrideBackbutton(false); - }, - - /* - * DEPRECATED - * This is only for Android. - * - * This terminates the activity! - */ - exitApp:function() { - console.log("Device.exitApp() is deprecated. Use App.exitApp()."); - app.exitApp(); - } -}; - -}); - -// file: lib/android/plugin/android/nativeapiprovider.js -define("cordova/plugin/android/nativeapiprovider", function(require, exports, module) { - -var nativeApi = this._cordovaNative || require('cordova/plugin/android/promptbasednativeapi'); -var currentApi = nativeApi; - -module.exports = { - get: function() { return currentApi; }, - setPreferPrompt: function(value) { - currentApi = value ? require('cordova/plugin/android/promptbasednativeapi') : nativeApi; - }, - // Used only by tests. - set: function(value) { - currentApi = value; - } -}; - -}); - -// file: lib/android/plugin/android/notification.js -define("cordova/plugin/android/notification", function(require, exports, module) { - -var exec = require('cordova/exec'); - -/** - * Provides Android enhanced notification API. - */ -module.exports = { - activityStart : function(title, message) { - // If title and message not specified then mimic Android behavior of - // using default strings. - if (typeof title === "undefined" && typeof message == "undefined") { - title = "Busy"; - message = 'Please wait...'; - } - - exec(null, null, 'Notification', 'activityStart', [ title, message ]); - }, - - /** - * Close an activity dialog - */ - activityStop : function() { - exec(null, null, 'Notification', 'activityStop', []); - }, - - /** - * Display a progress dialog with progress bar that goes from 0 to 100. - * - * @param {String} - * title Title of the progress dialog. - * @param {String} - * message Message to display in the dialog. - */ - progressStart : function(title, message) { - exec(null, null, 'Notification', 'progressStart', [ title, message ]); - }, - - /** - * Close the progress dialog. - */ - progressStop : function() { - exec(null, null, 'Notification', 'progressStop', []); - }, - - /** - * Set the progress dialog value. - * - * @param {Number} - * value 0-100 - */ - progressValue : function(value) { - exec(null, null, 'Notification', 'progressValue', [ value ]); - } -}; - -}); - -// file: lib/android/plugin/android/promptbasednativeapi.js -define("cordova/plugin/android/promptbasednativeapi", function(require, exports, module) { - -module.exports = { - exec: function(service, action, callbackId, argsJson) { - return prompt(argsJson, 'gap:'+JSON.stringify([service, action, callbackId])); - }, - setNativeToJsBridgeMode: function(value) { - prompt(value, 'gap_bridge_mode:'); - }, - retrieveJsMessages: function() { - return prompt('', 'gap_poll:'); - } -}; - -}); - -// file: lib/android/plugin/android/storage.js -define("cordova/plugin/android/storage", function(require, exports, module) { - -var utils = require('cordova/utils'), - exec = require('cordova/exec'), - channel = require('cordova/channel'); - -var queryQueue = {}; - -/** - * SQL result set object - * PRIVATE METHOD - * @constructor - */ -var DroidDB_Rows = function() { - this.resultSet = []; // results array - this.length = 0; // number of rows -}; - -/** - * Get item from SQL result set - * - * @param row The row number to return - * @return The row object - */ -DroidDB_Rows.prototype.item = function(row) { - return this.resultSet[row]; -}; - -/** - * SQL result set that is returned to user. - * PRIVATE METHOD - * @constructor - */ -var DroidDB_Result = function() { - this.rows = new DroidDB_Rows(); -}; - -/** - * Callback from native code when query is complete. - * PRIVATE METHOD - * - * @param id Query id - */ -function completeQuery(id, data) { - var query = queryQueue[id]; - if (query) { - try { - delete queryQueue[id]; - - // Get transaction - var tx = query.tx; - - // If transaction hasn't failed - // Note: We ignore all query results if previous query - // in the same transaction failed. - if (tx && tx.queryList[id]) { - - // Save query results - var r = new DroidDB_Result(); - r.rows.resultSet = data; - r.rows.length = data.length; - try { - if (typeof query.successCallback === 'function') { - query.successCallback(query.tx, r); - } - } catch (ex) { - console.log("executeSql error calling user success callback: "+ex); - } - - tx.queryComplete(id); - } - } catch (e) { - console.log("executeSql error: "+e); - } - } -} - -/** - * Callback from native code when query fails - * PRIVATE METHOD - * - * @param reason Error message - * @param id Query id - */ -function failQuery(reason, id) { - var query = queryQueue[id]; - if (query) { - try { - delete queryQueue[id]; - - // Get transaction - var tx = query.tx; - - // If transaction hasn't failed - // Note: We ignore all query results if previous query - // in the same transaction failed. - if (tx && tx.queryList[id]) { - tx.queryList = {}; - - try { - if (typeof query.errorCallback === 'function') { - query.errorCallback(query.tx, reason); - } - } catch (ex) { - console.log("executeSql error calling user error callback: "+ex); - } - - tx.queryFailed(id, reason); - } - - } catch (e) { - console.log("executeSql error: "+e); - } - } -} - -/** - * SQL query object - * PRIVATE METHOD - * - * @constructor - * @param tx The transaction object that this query belongs to - */ -var DroidDB_Query = function(tx) { - - // Set the id of the query - this.id = utils.createUUID(); - - // Add this query to the queue - queryQueue[this.id] = this; - - // Init result - this.resultSet = []; - - // Set transaction that this query belongs to - this.tx = tx; - - // Add this query to transaction list - this.tx.queryList[this.id] = this; - - // Callbacks - this.successCallback = null; - this.errorCallback = null; - -}; - -/** - * Transaction object - * PRIVATE METHOD - * @constructor - */ -var DroidDB_Tx = function() { - - // Set the id of the transaction - this.id = utils.createUUID(); - - // Callbacks - this.successCallback = null; - this.errorCallback = null; - - // Query list - this.queryList = {}; -}; - -/** - * Mark query in transaction as complete. - * If all queries are complete, call the user's transaction success callback. - * - * @param id Query id - */ -DroidDB_Tx.prototype.queryComplete = function(id) { - delete this.queryList[id]; - - // If no more outstanding queries, then fire transaction success - if (this.successCallback) { - var count = 0; - var i; - for (i in this.queryList) { - if (this.queryList.hasOwnProperty(i)) { - count++; - } - } - if (count === 0) { - try { - this.successCallback(); - } catch(e) { - console.log("Transaction error calling user success callback: " + e); - } - } - } -}; - -/** - * Mark query in transaction as failed. - * - * @param id Query id - * @param reason Error message - */ -DroidDB_Tx.prototype.queryFailed = function(id, reason) { - - // The sql queries in this transaction have already been run, since - // we really don't have a real transaction implemented in native code. - // However, the user callbacks for the remaining sql queries in transaction - // will not be called. - this.queryList = {}; - - if (this.errorCallback) { - try { - this.errorCallback(reason); - } catch(e) { - console.log("Transaction error calling user error callback: " + e); - } - } -}; - -/** - * Execute SQL statement - * - * @param sql SQL statement to execute - * @param params Statement parameters - * @param successCallback Success callback - * @param errorCallback Error callback - */ -DroidDB_Tx.prototype.executeSql = function(sql, params, successCallback, errorCallback) { - - // Init params array - if (typeof params === 'undefined') { - params = []; - } - - // Create query and add to queue - var query = new DroidDB_Query(this); - queryQueue[query.id] = query; - - // Save callbacks - query.successCallback = successCallback; - query.errorCallback = errorCallback; - - // Call native code - exec(null, null, "Storage", "executeSql", [sql, params, query.id]); -}; - -var DatabaseShell = function() { -}; - -/** - * Start a transaction. - * Does not support rollback in event of failure. - * - * @param process {Function} The transaction function - * @param successCallback {Function} - * @param errorCallback {Function} - */ -DatabaseShell.prototype.transaction = function(process, errorCallback, successCallback) { - var tx = new DroidDB_Tx(); - tx.successCallback = successCallback; - tx.errorCallback = errorCallback; - try { - process(tx); - } catch (e) { - console.log("Transaction error: "+e); - if (tx.errorCallback) { - try { - tx.errorCallback(e); - } catch (ex) { - console.log("Transaction error calling user error callback: "+e); - } - } - } -}; - -/** - * Open database - * - * @param name Database name - * @param version Database version - * @param display_name Database display name - * @param size Database size in bytes - * @return Database object - */ -var DroidDB_openDatabase = function(name, version, display_name, size) { - exec(null, null, "Storage", "openDatabase", [name, version, display_name, size]); - var db = new DatabaseShell(); - return db; -}; - - -module.exports = { - openDatabase:DroidDB_openDatabase, - failQuery:failQuery, - completeQuery:completeQuery -}; - -}); - -// file: lib/android/plugin/android/storage/openDatabase.js -define("cordova/plugin/android/storage/openDatabase", function(require, exports, module) { - - -var modulemapper = require('cordova/modulemapper'), - storage = require('cordova/plugin/android/storage'); - -var originalOpenDatabase = modulemapper.getOriginalSymbol(window, 'openDatabase'); - -module.exports = function(name, version, desc, size) { - // First patch WebSQL if necessary - if (!originalOpenDatabase) { - // Not defined, create an openDatabase function for all to use! - return storage.openDatabase.apply(this, arguments); - } - - // Defined, but some Android devices will throw a SECURITY_ERR - - // so we wrap the whole thing in a try-catch and shim in our own - // if the device has Android bug 16175. - try { - return originalOpenDatabase(name, version, desc, size); - } catch (ex) { - if (ex.code !== 18) { - throw ex; - } - } - return storage.openDatabase(name, version, desc, size); -}; - - - -}); - -// file: lib/android/plugin/android/storage/symbols.js -define("cordova/plugin/android/storage/symbols", function(require, exports, module) { - - -var modulemapper = require('cordova/modulemapper'); - -modulemapper.clobbers('cordova/plugin/android/storage/openDatabase', 'openDatabase'); - - -}); - -// file: lib/common/plugin/battery.js -define("cordova/plugin/battery", function(require, exports, module) { - -/** - * This class contains information about the current battery status. - * @constructor - */ -var cordova = require('cordova'), - exec = require('cordova/exec'); - -function handlers() { - return battery.channels.batterystatus.numHandlers + - battery.channels.batterylow.numHandlers + - battery.channels.batterycritical.numHandlers; -} - -var Battery = function() { - this._level = null; - this._isPlugged = null; - // Create new event handlers on the window (returns a channel instance) - this.channels = { - batterystatus:cordova.addWindowEventHandler("batterystatus"), - batterylow:cordova.addWindowEventHandler("batterylow"), - batterycritical:cordova.addWindowEventHandler("batterycritical") - }; - for (var key in this.channels) { - this.channels[key].onHasSubscribersChange = Battery.onHasSubscribersChange; - } -}; -/** - * Event handlers for when callbacks get registered for the battery. - * Keep track of how many handlers we have so we can start and stop the native battery listener - * appropriately (and hopefully save on battery life!). - */ -Battery.onHasSubscribersChange = function() { - // If we just registered the first handler, make sure native listener is started. - if (this.numHandlers === 1 && handlers() === 1) { - exec(battery._status, battery._error, "Battery", "start", []); - } else if (handlers() === 0) { - exec(null, null, "Battery", "stop", []); - } -}; - -/** - * Callback for battery status - * - * @param {Object} info keys: level, isPlugged - */ -Battery.prototype._status = function(info) { - if (info) { - var me = battery; - var level = info.level; - if (me._level !== level || me._isPlugged !== info.isPlugged) { - // Fire batterystatus event - cordova.fireWindowEvent("batterystatus", info); - - // Fire low battery event - if (level === 20 || level === 5) { - if (level === 20) { - cordova.fireWindowEvent("batterylow", info); - } - else { - cordova.fireWindowEvent("batterycritical", info); - } - } - } - me._level = level; - me._isPlugged = info.isPlugged; - } -}; - -/** - * Error callback for battery start - */ -Battery.prototype._error = function(e) { - console.log("Error initializing Battery: " + e); -}; - -var battery = new Battery(); - -module.exports = battery; - -}); - -// file: lib/common/plugin/battery/symbols.js -define("cordova/plugin/battery/symbols", function(require, exports, module) { - - -var modulemapper = require('cordova/modulemapper'); - -modulemapper.defaults('cordova/plugin/battery', 'navigator.battery'); - -}); - -// file: lib/common/plugin/camera/symbols.js -define("cordova/plugin/camera/symbols", function(require, exports, module) { - - -var modulemapper = require('cordova/modulemapper'); - -modulemapper.defaults('cordova/plugin/Camera', 'navigator.camera'); -modulemapper.defaults('cordova/plugin/CameraConstants', 'Camera'); -modulemapper.defaults('cordova/plugin/CameraPopoverOptions', 'CameraPopoverOptions'); - -}); - -// file: lib/common/plugin/capture.js -define("cordova/plugin/capture", function(require, exports, module) { - -var exec = require('cordova/exec'), - MediaFile = require('cordova/plugin/MediaFile'); - -/** - * Launches a capture of different types. - * - * @param (DOMString} type - * @param {Function} successCB - * @param {Function} errorCB - * @param {CaptureVideoOptions} options - */ -function _capture(type, successCallback, errorCallback, options) { - var win = function(pluginResult) { - var mediaFiles = []; - var i; - for (i = 0; i < pluginResult.length; i++) { - var mediaFile = new MediaFile(); - mediaFile.name = pluginResult[i].name; - mediaFile.fullPath = pluginResult[i].fullPath; - mediaFile.type = pluginResult[i].type; - mediaFile.lastModifiedDate = pluginResult[i].lastModifiedDate; - mediaFile.size = pluginResult[i].size; - mediaFiles.push(mediaFile); - } - successCallback(mediaFiles); - }; - exec(win, errorCallback, "Capture", type, [options]); -} -/** - * The Capture interface exposes an interface to the camera and microphone of the hosting device. - */ -function Capture() { - this.supportedAudioModes = []; - this.supportedImageModes = []; - this.supportedVideoModes = []; -} - -/** - * Launch audio recorder application for recording audio clip(s). - * - * @param {Function} successCB - * @param {Function} errorCB - * @param {CaptureAudioOptions} options - */ -Capture.prototype.captureAudio = function(successCallback, errorCallback, options){ - _capture("captureAudio", successCallback, errorCallback, options); -}; - -/** - * Launch camera application for taking image(s). - * - * @param {Function} successCB - * @param {Function} errorCB - * @param {CaptureImageOptions} options - */ -Capture.prototype.captureImage = function(successCallback, errorCallback, options){ - _capture("captureImage", successCallback, errorCallback, options); -}; - -/** - * Launch device camera application for recording video(s). - * - * @param {Function} successCB - * @param {Function} errorCB - * @param {CaptureVideoOptions} options - */ -Capture.prototype.captureVideo = function(successCallback, errorCallback, options){ - _capture("captureVideo", successCallback, errorCallback, options); -}; - - -module.exports = new Capture(); - -}); - -// file: lib/common/plugin/capture/symbols.js -define("cordova/plugin/capture/symbols", function(require, exports, module) { - -var modulemapper = require('cordova/modulemapper'); - -modulemapper.clobbers('cordova/plugin/CaptureError', 'CaptureError'); -modulemapper.clobbers('cordova/plugin/CaptureAudioOptions', 'CaptureAudioOptions'); -modulemapper.clobbers('cordova/plugin/CaptureImageOptions', 'CaptureImageOptions'); -modulemapper.clobbers('cordova/plugin/CaptureVideoOptions', 'CaptureVideoOptions'); -modulemapper.clobbers('cordova/plugin/ConfigurationData', 'ConfigurationData'); -modulemapper.clobbers('cordova/plugin/MediaFile', 'MediaFile'); -modulemapper.clobbers('cordova/plugin/MediaFileData', 'MediaFileData'); -modulemapper.clobbers('cordova/plugin/capture', 'navigator.device.capture'); - -}); - -// file: lib/common/plugin/compass.js -define("cordova/plugin/compass", function(require, exports, module) { - -var argscheck = require('cordova/argscheck'), - exec = require('cordova/exec'), - utils = require('cordova/utils'), - CompassHeading = require('cordova/plugin/CompassHeading'), - CompassError = require('cordova/plugin/CompassError'), - timers = {}, - compass = { - /** - * Asynchronously acquires the current heading. - * @param {Function} successCallback The function to call when the heading - * data is available - * @param {Function} errorCallback The function to call when there is an error - * getting the heading data. - * @param {CompassOptions} options The options for getting the heading data (not used). - */ - getCurrentHeading:function(successCallback, errorCallback, options) { - argscheck.checkArgs('fFO', 'compass.getCurrentHeading', arguments); - - var win = function(result) { - var ch = new CompassHeading(result.magneticHeading, result.trueHeading, result.headingAccuracy, result.timestamp); - successCallback(ch); - }; - var fail = errorCallback && function(code) { - var ce = new CompassError(code); - errorCallback(ce); - }; - - // Get heading - exec(win, fail, "Compass", "getHeading", [options]); - }, - - /** - * Asynchronously acquires the heading repeatedly at a given interval. - * @param {Function} successCallback The function to call each time the heading - * data is available - * @param {Function} errorCallback The function to call when there is an error - * getting the heading data. - * @param {HeadingOptions} options The options for getting the heading data - * such as timeout and the frequency of the watch. For iOS, filter parameter - * specifies to watch via a distance filter rather than time. - */ - watchHeading:function(successCallback, errorCallback, options) { - argscheck.checkArgs('fFO', 'compass.watchHeading', arguments); - // Default interval (100 msec) - var frequency = (options !== undefined && options.frequency !== undefined) ? options.frequency : 100; - var filter = (options !== undefined && options.filter !== undefined) ? options.filter : 0; - - var id = utils.createUUID(); - if (filter > 0) { - // is an iOS request for watch by filter, no timer needed - timers[id] = "iOS"; - compass.getCurrentHeading(successCallback, errorCallback, options); - } else { - // Start watch timer to get headings - timers[id] = window.setInterval(function() { - compass.getCurrentHeading(successCallback, errorCallback); - }, frequency); - } - - return id; - }, - - /** - * Clears the specified heading watch. - * @param {String} watchId The ID of the watch returned from #watchHeading. - */ - clearWatch:function(id) { - // Stop javascript timer & remove from timer list - if (id && timers[id]) { - if (timers[id] != "iOS") { - clearInterval(timers[id]); - } else { - // is iOS watch by filter so call into device to stop - exec(null, null, "Compass", "stopHeading", []); - } - delete timers[id]; - } - } - }; - -module.exports = compass; - -}); - -// file: lib/common/plugin/compass/symbols.js -define("cordova/plugin/compass/symbols", function(require, exports, module) { - - -var modulemapper = require('cordova/modulemapper'); - -modulemapper.clobbers('cordova/plugin/CompassHeading', 'CompassHeading'); -modulemapper.clobbers('cordova/plugin/CompassError', 'CompassError'); -modulemapper.clobbers('cordova/plugin/compass', 'navigator.compass'); - -}); - -// file: lib/common/plugin/console-via-logger.js -define("cordova/plugin/console-via-logger", function(require, exports, module) { - -//------------------------------------------------------------------------------ - -var logger = require("cordova/plugin/logger"); -var utils = require("cordova/utils"); - -//------------------------------------------------------------------------------ -// object that we're exporting -//------------------------------------------------------------------------------ -var console = module.exports; - -//------------------------------------------------------------------------------ -// copy of the original console object -//------------------------------------------------------------------------------ -var WinConsole = window.console; - -//------------------------------------------------------------------------------ -// whether to use the logger -//------------------------------------------------------------------------------ -var UseLogger = false; - -//------------------------------------------------------------------------------ -// Timers -//------------------------------------------------------------------------------ -var Timers = {}; - -//------------------------------------------------------------------------------ -// used for unimplemented methods -//------------------------------------------------------------------------------ -function noop() {} - -//------------------------------------------------------------------------------ -// used for unimplemented methods -//------------------------------------------------------------------------------ -console.useLogger = function (value) { - if (arguments.length) UseLogger = !!value; - - if (UseLogger) { - if (logger.useConsole()) { - throw new Error("console and logger are too intertwingly"); - } - } - - return UseLogger; -}; - -//------------------------------------------------------------------------------ -console.log = function() { - if (logger.useConsole()) return; - logger.log.apply(logger, [].slice.call(arguments)); -}; - -//------------------------------------------------------------------------------ -console.error = function() { - if (logger.useConsole()) return; - logger.error.apply(logger, [].slice.call(arguments)); -}; - -//------------------------------------------------------------------------------ -console.warn = function() { - if (logger.useConsole()) return; - logger.warn.apply(logger, [].slice.call(arguments)); -}; - -//------------------------------------------------------------------------------ -console.info = function() { - if (logger.useConsole()) return; - logger.info.apply(logger, [].slice.call(arguments)); -}; - -//------------------------------------------------------------------------------ -console.debug = function() { - if (logger.useConsole()) return; - logger.debug.apply(logger, [].slice.call(arguments)); -}; - -//------------------------------------------------------------------------------ -console.assert = function(expression) { - if (expression) return; - - var message = logger.format.apply(logger.format, [].slice.call(arguments, 1)); - console.log("ASSERT: " + message); -}; - -//------------------------------------------------------------------------------ -console.clear = function() {}; - -//------------------------------------------------------------------------------ -console.dir = function(object) { - console.log("%o", object); -}; - -//------------------------------------------------------------------------------ -console.dirxml = function(node) { - console.log(node.innerHTML); -}; - -//------------------------------------------------------------------------------ -console.trace = noop; - -//------------------------------------------------------------------------------ -console.group = console.log; - -//------------------------------------------------------------------------------ -console.groupCollapsed = console.log; - -//------------------------------------------------------------------------------ -console.groupEnd = noop; - -//------------------------------------------------------------------------------ -console.time = function(name) { - Timers[name] = new Date().valueOf(); -}; - -//------------------------------------------------------------------------------ -console.timeEnd = function(name) { - var timeStart = Timers[name]; - if (!timeStart) { - console.warn("unknown timer: " + name); - return; - } - - var timeElapsed = new Date().valueOf() - timeStart; - console.log(name + ": " + timeElapsed + "ms"); -}; - -//------------------------------------------------------------------------------ -console.timeStamp = noop; - -//------------------------------------------------------------------------------ -console.profile = noop; - -//------------------------------------------------------------------------------ -console.profileEnd = noop; - -//------------------------------------------------------------------------------ -console.count = noop; - -//------------------------------------------------------------------------------ -console.exception = console.log; - -//------------------------------------------------------------------------------ -console.table = function(data, columns) { - console.log("%o", data); -}; - -//------------------------------------------------------------------------------ -// return a new function that calls both functions passed as args -//------------------------------------------------------------------------------ -function wrappedOrigCall(orgFunc, newFunc) { - return function() { - var args = [].slice.call(arguments); - try { orgFunc.apply(WinConsole, args); } catch (e) {} - try { newFunc.apply(console, args); } catch (e) {} - }; -} - -//------------------------------------------------------------------------------ -// For every function that exists in the original console object, that -// also exists in the new console object, wrap the new console method -// with one that calls both -//------------------------------------------------------------------------------ -for (var key in console) { - if (typeof WinConsole[key] == "function") { - console[key] = wrappedOrigCall(WinConsole[key], console[key]); - } -} - -}); - -// file: lib/common/plugin/contacts.js -define("cordova/plugin/contacts", function(require, exports, module) { - -var argscheck = require('cordova/argscheck'), - exec = require('cordova/exec'), - ContactError = require('cordova/plugin/ContactError'), - utils = require('cordova/utils'), - Contact = require('cordova/plugin/Contact'); - -/** -* Represents a group of Contacts. -* @constructor -*/ -var contacts = { - /** - * Returns an array of Contacts matching the search criteria. - * @param fields that should be searched - * @param successCB success callback - * @param errorCB error callback - * @param {ContactFindOptions} options that can be applied to contact searching - * @return array of Contacts matching search criteria - */ - find:function(fields, successCB, errorCB, options) { - argscheck.checkArgs('afFO', 'contacts.find', arguments); - if (!fields.length) { - errorCB && errorCB(new ContactError(ContactError.INVALID_ARGUMENT_ERROR)); - } else { - var win = function(result) { - var cs = []; - for (var i = 0, l = result.length; i < l; i++) { - cs.push(contacts.create(result[i])); - } - successCB(cs); - }; - exec(win, errorCB, "Contacts", "search", [fields, options]); - } - }, - - /** - * This function creates a new contact, but it does not persist the contact - * to device storage. To persist the contact to device storage, invoke - * contact.save(). - * @param properties an object whose properties will be examined to create a new Contact - * @returns new Contact object - */ - create:function(properties) { - argscheck.checkArgs('O', 'contacts.create', arguments); - var contact = new Contact(); - for (var i in properties) { - if (typeof contact[i] !== 'undefined' && properties.hasOwnProperty(i)) { - contact[i] = properties[i]; - } - } - return contact; - } -}; - -module.exports = contacts; - -}); - -// file: lib/common/plugin/contacts/symbols.js -define("cordova/plugin/contacts/symbols", function(require, exports, module) { - - -var modulemapper = require('cordova/modulemapper'); - -modulemapper.clobbers('cordova/plugin/contacts', 'navigator.contacts'); -modulemapper.clobbers('cordova/plugin/Contact', 'Contact'); -modulemapper.clobbers('cordova/plugin/ContactAddress', 'ContactAddress'); -modulemapper.clobbers('cordova/plugin/ContactError', 'ContactError'); -modulemapper.clobbers('cordova/plugin/ContactField', 'ContactField'); -modulemapper.clobbers('cordova/plugin/ContactFindOptions', 'ContactFindOptions'); -modulemapper.clobbers('cordova/plugin/ContactName', 'ContactName'); -modulemapper.clobbers('cordova/plugin/ContactOrganization', 'ContactOrganization'); - -}); - -// file: lib/common/plugin/device.js -define("cordova/plugin/device", function(require, exports, module) { - -var argscheck = require('cordova/argscheck'), - channel = require('cordova/channel'), - utils = require('cordova/utils'), - exec = require('cordova/exec'); - -// Tell cordova channel to wait on the CordovaInfoReady event -channel.waitForInitialization('onCordovaInfoReady'); - -/** - * This represents the mobile device, and provides properties for inspecting the model, version, UUID of the - * phone, etc. - * @constructor - */ -function Device() { - this.available = false; - this.platform = null; - this.version = null; - this.name = null; - this.uuid = null; - this.cordova = null; - this.model = null; - - var me = this; - - channel.onCordovaReady.subscribe(function() { - me.getInfo(function(info) { - var buildLabel = info.cordova; - if (buildLabel != CORDOVA_JS_BUILD_LABEL) { - buildLabel += ' JS=' + CORDOVA_JS_BUILD_LABEL; - } - me.available = true; - me.platform = info.platform; - me.version = info.version; - me.name = info.name; - me.uuid = info.uuid; - me.cordova = buildLabel; - me.model = info.model; - channel.onCordovaInfoReady.fire(); - },function(e) { - me.available = false; - utils.alert("[ERROR] Error initializing Cordova: " + e); - }); - }); -} - -/** - * Get device info - * - * @param {Function} successCallback The function to call when the heading data is available - * @param {Function} errorCallback The function to call when there is an error getting the heading data. (OPTIONAL) - */ -Device.prototype.getInfo = function(successCallback, errorCallback) { - argscheck.checkArgs('fF', 'Device.getInfo', arguments); - exec(successCallback, errorCallback, "Device", "getDeviceInfo", []); -}; - -module.exports = new Device(); - -}); - -// file: lib/android/plugin/device/symbols.js -define("cordova/plugin/device/symbols", function(require, exports, module) { - - -var modulemapper = require('cordova/modulemapper'); - -modulemapper.clobbers('cordova/plugin/device', 'device'); -modulemapper.merges('cordova/plugin/android/device', 'device'); - -}); - -// file: lib/common/plugin/echo.js -define("cordova/plugin/echo", function(require, exports, module) { - -var exec = require('cordova/exec'), - utils = require('cordova/utils'); - -/** - * Sends the given message through exec() to the Echo plugin, which sends it back to the successCallback. - * @param successCallback invoked with a FileSystem object - * @param errorCallback invoked if error occurs retrieving file system - * @param message The string to be echoed. - * @param forceAsync Whether to force an async return value (for testing native->js bridge). - */ -module.exports = function(successCallback, errorCallback, message, forceAsync) { - var action = 'echo'; - var messageIsMultipart = (utils.typeName(message) == "Array"); - var args = messageIsMultipart ? message : [message]; - - if (utils.typeName(message) == 'ArrayBuffer') { - if (forceAsync) { - console.warn('Cannot echo ArrayBuffer with forced async, falling back to sync.'); - } - action += 'ArrayBuffer'; - } else if (messageIsMultipart) { - if (forceAsync) { - console.warn('Cannot echo MultiPart Array with forced async, falling back to sync.'); - } - action += 'MultiPart'; - } else if (forceAsync) { - action += 'Async'; - } - - exec(successCallback, errorCallback, "Echo", action, args); -}; - - -}); - -// file: lib/android/plugin/file/symbols.js -define("cordova/plugin/file/symbols", function(require, exports, module) { - - -var modulemapper = require('cordova/modulemapper'), - symbolshelper = require('cordova/plugin/file/symbolshelper'); - -symbolshelper(modulemapper.clobbers); - -}); - -// file: lib/common/plugin/file/symbolshelper.js -define("cordova/plugin/file/symbolshelper", function(require, exports, module) { - -module.exports = function(exportFunc) { - exportFunc('cordova/plugin/DirectoryEntry', 'DirectoryEntry'); - exportFunc('cordova/plugin/DirectoryReader', 'DirectoryReader'); - exportFunc('cordova/plugin/Entry', 'Entry'); - exportFunc('cordova/plugin/File', 'File'); - exportFunc('cordova/plugin/FileEntry', 'FileEntry'); - exportFunc('cordova/plugin/FileError', 'FileError'); - exportFunc('cordova/plugin/FileReader', 'FileReader'); - exportFunc('cordova/plugin/FileSystem', 'FileSystem'); - exportFunc('cordova/plugin/FileUploadOptions', 'FileUploadOptions'); - exportFunc('cordova/plugin/FileUploadResult', 'FileUploadResult'); - exportFunc('cordova/plugin/FileWriter', 'FileWriter'); - exportFunc('cordova/plugin/Flags', 'Flags'); - exportFunc('cordova/plugin/LocalFileSystem', 'LocalFileSystem'); - exportFunc('cordova/plugin/Metadata', 'Metadata'); - exportFunc('cordova/plugin/ProgressEvent', 'ProgressEvent'); - exportFunc('cordova/plugin/requestFileSystem', 'requestFileSystem'); - exportFunc('cordova/plugin/resolveLocalFileSystemURI', 'resolveLocalFileSystemURI'); -}; - -}); - -// file: lib/common/plugin/filetransfer/symbols.js -define("cordova/plugin/filetransfer/symbols", function(require, exports, module) { - - -var modulemapper = require('cordova/modulemapper'); - -modulemapper.clobbers('cordova/plugin/FileTransfer', 'FileTransfer'); -modulemapper.clobbers('cordova/plugin/FileTransferError', 'FileTransferError'); - -}); - -// file: lib/common/plugin/geolocation.js -define("cordova/plugin/geolocation", function(require, exports, module) { - -var argscheck = require('cordova/argscheck'), - utils = require('cordova/utils'), - exec = require('cordova/exec'), - PositionError = require('cordova/plugin/PositionError'), - Position = require('cordova/plugin/Position'); - -var timers = {}; // list of timers in use - -// Returns default params, overrides if provided with values -function parseParameters(options) { - var opt = { - maximumAge: 0, - enableHighAccuracy: false, - timeout: Infinity - }; - - if (options) { - if (options.maximumAge !== undefined && !isNaN(options.maximumAge) && options.maximumAge > 0) { - opt.maximumAge = options.maximumAge; - } - if (options.enableHighAccuracy !== undefined) { - opt.enableHighAccuracy = options.enableHighAccuracy; - } - if (options.timeout !== undefined && !isNaN(options.timeout)) { - if (options.timeout < 0) { - opt.timeout = 0; - } else { - opt.timeout = options.timeout; - } - } - } - - return opt; -} - -// Returns a timeout failure, closed over a specified timeout value and error callback. -function createTimeout(errorCallback, timeout) { - var t = setTimeout(function() { - clearTimeout(t); - t = null; - errorCallback({ - code:PositionError.TIMEOUT, - message:"Position retrieval timed out." - }); - }, timeout); - return t; -} - -var geolocation = { - lastPosition:null, // reference to last known (cached) position returned - /** - * Asynchronously acquires the current position. - * - * @param {Function} successCallback The function to call when the position data is available - * @param {Function} errorCallback The function to call when there is an error getting the heading position. (OPTIONAL) - * @param {PositionOptions} options The options for getting the position data. (OPTIONAL) - */ - getCurrentPosition:function(successCallback, errorCallback, options) { - argscheck.checkArgs('fFO', 'geolocation.getCurrentPosition', arguments); - options = parseParameters(options); - - // Timer var that will fire an error callback if no position is retrieved from native - // before the "timeout" param provided expires - var timeoutTimer = {timer:null}; - - var win = function(p) { - clearTimeout(timeoutTimer.timer); - if (!(timeoutTimer.timer)) { - // Timeout already happened, or native fired error callback for - // this geo request. - // Don't continue with success callback. - return; - } - var pos = new Position( - { - latitude:p.latitude, - longitude:p.longitude, - altitude:p.altitude, - accuracy:p.accuracy, - heading:p.heading, - velocity:p.velocity, - altitudeAccuracy:p.altitudeAccuracy - }, - (p.timestamp === undefined ? new Date() : ((p.timestamp instanceof Date) ? p.timestamp : new Date(p.timestamp))) - ); - geolocation.lastPosition = pos; - successCallback(pos); - }; - var fail = function(e) { - clearTimeout(timeoutTimer.timer); - timeoutTimer.timer = null; - var err = new PositionError(e.code, e.message); - if (errorCallback) { - errorCallback(err); - } - }; - - // Check our cached position, if its timestamp difference with current time is less than the maximumAge, then just - // fire the success callback with the cached position. - if (geolocation.lastPosition && options.maximumAge && (((new Date()).getTime() - geolocation.lastPosition.timestamp.getTime()) <= options.maximumAge)) { - successCallback(geolocation.lastPosition); - // If the cached position check failed and the timeout was set to 0, error out with a TIMEOUT error object. - } else if (options.timeout === 0) { - fail({ - code:PositionError.TIMEOUT, - message:"timeout value in PositionOptions set to 0 and no cached Position object available, or cached Position object's age exceeds provided PositionOptions' maximumAge parameter." - }); - // Otherwise we have to call into native to retrieve a position. - } else { - if (options.timeout !== Infinity) { - // If the timeout value was not set to Infinity (default), then - // set up a timeout function that will fire the error callback - // if no successful position was retrieved before timeout expired. - timeoutTimer.timer = createTimeout(fail, options.timeout); - } else { - // This is here so the check in the win function doesn't mess stuff up - // may seem weird but this guarantees timeoutTimer is - // always truthy before we call into native - timeoutTimer.timer = true; - } - exec(win, fail, "Geolocation", "getLocation", [options.enableHighAccuracy, options.maximumAge]); - } - return timeoutTimer; - }, - /** - * Asynchronously watches the geolocation for changes to geolocation. When a change occurs, - * the successCallback is called with the new location. - * - * @param {Function} successCallback The function to call each time the location data is available - * @param {Function} errorCallback The function to call when there is an error getting the location data. (OPTIONAL) - * @param {PositionOptions} options The options for getting the location data such as frequency. (OPTIONAL) - * @return String The watch id that must be passed to #clearWatch to stop watching. - */ - watchPosition:function(successCallback, errorCallback, options) { - argscheck.checkArgs('fFO', 'geolocation.getCurrentPosition', arguments); - options = parseParameters(options); - - var id = utils.createUUID(); - - // Tell device to get a position ASAP, and also retrieve a reference to the timeout timer generated in getCurrentPosition - timers[id] = geolocation.getCurrentPosition(successCallback, errorCallback, options); - - var fail = function(e) { - clearTimeout(timers[id].timer); - var err = new PositionError(e.code, e.message); - if (errorCallback) { - errorCallback(err); - } - }; - - var win = function(p) { - clearTimeout(timers[id].timer); - if (options.timeout !== Infinity) { - timers[id].timer = createTimeout(fail, options.timeout); - } - var pos = new Position( - { - latitude:p.latitude, - longitude:p.longitude, - altitude:p.altitude, - accuracy:p.accuracy, - heading:p.heading, - velocity:p.velocity, - altitudeAccuracy:p.altitudeAccuracy - }, - (p.timestamp === undefined ? new Date() : ((p.timestamp instanceof Date) ? p.timestamp : new Date(p.timestamp))) - ); - geolocation.lastPosition = pos; - successCallback(pos); - }; - - exec(win, fail, "Geolocation", "addWatch", [id, options.enableHighAccuracy]); - - return id; - }, - /** - * Clears the specified heading watch. - * - * @param {String} id The ID of the watch returned from #watchPosition - */ - clearWatch:function(id) { - if (id && timers[id] !== undefined) { - clearTimeout(timers[id].timer); - timers[id].timer = false; - exec(null, null, "Geolocation", "clearWatch", [id]); - } - } -}; - -module.exports = geolocation; - -}); - -// file: lib/common/plugin/geolocation/symbols.js -define("cordova/plugin/geolocation/symbols", function(require, exports, module) { - - -var modulemapper = require('cordova/modulemapper'); - -modulemapper.defaults('cordova/plugin/geolocation', 'navigator.geolocation'); -modulemapper.clobbers('cordova/plugin/PositionError', 'PositionError'); -modulemapper.clobbers('cordova/plugin/Position', 'Position'); -modulemapper.clobbers('cordova/plugin/Coordinates', 'Coordinates'); - -}); - -// file: lib/common/plugin/globalization.js -define("cordova/plugin/globalization", function(require, exports, module) { - -var argscheck = require('cordova/argscheck'), - exec = require('cordova/exec'), - GlobalizationError = require('cordova/plugin/GlobalizationError'); - -var globalization = { - -/** -* Returns the string identifier for the client's current language. -* It returns the language identifier string to the successCB callback with a -* properties object as a parameter. If there is an error getting the language, -* then the errorCB callback is invoked. -* -* @param {Function} successCB -* @param {Function} errorCB -* -* @return Object.value {String}: The language identifier -* -* @error GlobalizationError.UNKNOWN_ERROR -* -* Example -* globalization.getPreferredLanguage(function (language) {alert('language:' + language.value + '\n');}, -* function () {}); -*/ -getPreferredLanguage:function(successCB, failureCB) { - argscheck.checkArgs('fF', 'Globalization.getPreferredLanguage', arguments); - exec(successCB, failureCB, "Globalization","getPreferredLanguage", []); -}, - -/** -* Returns the string identifier for the client's current locale setting. -* It returns the locale identifier string to the successCB callback with a -* properties object as a parameter. If there is an error getting the locale, -* then the errorCB callback is invoked. -* -* @param {Function} successCB -* @param {Function} errorCB -* -* @return Object.value {String}: The locale identifier -* -* @error GlobalizationError.UNKNOWN_ERROR -* -* Example -* globalization.getLocaleName(function (locale) {alert('locale:' + locale.value + '\n');}, -* function () {}); -*/ -getLocaleName:function(successCB, failureCB) { - argscheck.checkArgs('fF', 'Globalization.getLocaleName', arguments); - exec(successCB, failureCB, "Globalization","getLocaleName", []); -}, - - -/** -* Returns a date formatted as a string according to the client's user preferences and -* calendar using the time zone of the client. It returns the formatted date string to the -* successCB callback with a properties object as a parameter. If there is an error -* formatting the date, then the errorCB callback is invoked. -* -* The defaults are: formatLength="short" and selector="date and time" -* -* @param {Date} date -* @param {Function} successCB -* @param {Function} errorCB -* @param {Object} options {optional} -* formatLength {String}: 'short', 'medium', 'long', or 'full' -* selector {String}: 'date', 'time', or 'date and time' -* -* @return Object.value {String}: The localized date string -* -* @error GlobalizationError.FORMATTING_ERROR -* -* Example -* globalization.dateToString(new Date(), -* function (date) {alert('date:' + date.value + '\n');}, -* function (errorCode) {alert(errorCode);}, -* {formatLength:'short'}); -*/ -dateToString:function(date, successCB, failureCB, options) { - argscheck.checkArgs('dfFO', 'Globalization.dateToString', arguments); - var dateValue = date.valueOf(); - exec(successCB, failureCB, "Globalization", "dateToString", [{"date": dateValue, "options": options}]); -}, - - -/** -* Parses a date formatted as a string according to the client's user -* preferences and calendar using the time zone of the client and returns -* the corresponding date object. It returns the date to the successCB -* callback with a properties object as a parameter. If there is an error -* parsing the date string, then the errorCB callback is invoked. -* -* The defaults are: formatLength="short" and selector="date and time" -* -* @param {String} dateString -* @param {Function} successCB -* @param {Function} errorCB -* @param {Object} options {optional} -* formatLength {String}: 'short', 'medium', 'long', or 'full' -* selector {String}: 'date', 'time', or 'date and time' -* -* @return Object.year {Number}: The four digit year -* Object.month {Number}: The month from (0 - 11) -* Object.day {Number}: The day from (1 - 31) -* Object.hour {Number}: The hour from (0 - 23) -* Object.minute {Number}: The minute from (0 - 59) -* Object.second {Number}: The second from (0 - 59) -* Object.millisecond {Number}: The milliseconds (from 0 - 999), -* not available on all platforms -* -* @error GlobalizationError.PARSING_ERROR -* -* Example -* globalization.stringToDate('4/11/2011', -* function (date) { alert('Month:' + date.month + '\n' + -* 'Day:' + date.day + '\n' + -* 'Year:' + date.year + '\n');}, -* function (errorCode) {alert(errorCode);}, -* {selector:'date'}); -*/ -stringToDate:function(dateString, successCB, failureCB, options) { - argscheck.checkArgs('sfFO', 'Globalization.stringToDate', arguments); - exec(successCB, failureCB, "Globalization", "stringToDate", [{"dateString": dateString, "options": options}]); -}, - - -/** -* Returns a pattern string for formatting and parsing dates according to the client's -* user preferences. It returns the pattern to the successCB callback with a -* properties object as a parameter. If there is an error obtaining the pattern, -* then the errorCB callback is invoked. -* -* The defaults are: formatLength="short" and selector="date and time" -* -* @param {Function} successCB -* @param {Function} errorCB -* @param {Object} options {optional} -* formatLength {String}: 'short', 'medium', 'long', or 'full' -* selector {String}: 'date', 'time', or 'date and time' -* -* @return Object.pattern {String}: The date and time pattern for formatting and parsing dates. -* The patterns follow Unicode Technical Standard #35 -* http://unicode.org/reports/tr35/tr35-4.html -* Object.timezone {String}: The abbreviated name of the time zone on the client -* Object.utc_offset {Number}: The current difference in seconds between the client's -* time zone and coordinated universal time. -* Object.dst_offset {Number}: The current daylight saving time offset in seconds -* between the client's non-daylight saving's time zone -* and the client's daylight saving's time zone. -* -* @error GlobalizationError.PATTERN_ERROR -* -* Example -* globalization.getDatePattern( -* function (date) {alert('pattern:' + date.pattern + '\n');}, -* function () {}, -* {formatLength:'short'}); -*/ -getDatePattern:function(successCB, failureCB, options) { - argscheck.checkArgs('fFO', 'Globalization.getDatePattern', arguments); - exec(successCB, failureCB, "Globalization", "getDatePattern", [{"options": options}]); -}, - - -/** -* Returns an array of either the names of the months or days of the week -* according to the client's user preferences and calendar. It returns the array of names to the -* successCB callback with a properties object as a parameter. If there is an error obtaining the -* names, then the errorCB callback is invoked. -* -* The defaults are: type="wide" and item="months" -* -* @param {Function} successCB -* @param {Function} errorCB -* @param {Object} options {optional} -* type {String}: 'narrow' or 'wide' -* item {String}: 'months', or 'days' -* -* @return Object.value {Array{String}}: The array of names starting from either -* the first month in the year or the -* first day of the week. -* @error GlobalizationError.UNKNOWN_ERROR -* -* Example -* globalization.getDateNames(function (names) { -* for(var i = 0; i < names.value.length; i++) { -* alert('Month:' + names.value[i] + '\n');}}, -* function () {}); -*/ -getDateNames:function(successCB, failureCB, options) { - argscheck.checkArgs('fFO', 'Globalization.getDateNames', arguments); - exec(successCB, failureCB, "Globalization", "getDateNames", [{"options": options}]); -}, - -/** -* Returns whether daylight savings time is in effect for a given date using the client's -* time zone and calendar. It returns whether or not daylight savings time is in effect -* to the successCB callback with a properties object as a parameter. If there is an error -* reading the date, then the errorCB callback is invoked. -* -* @param {Date} date -* @param {Function} successCB -* @param {Function} errorCB -* -* @return Object.dst {Boolean}: The value "true" indicates that daylight savings time is -* in effect for the given date and "false" indicate that it is not. -* -* @error GlobalizationError.UNKNOWN_ERROR -* -* Example -* globalization.isDayLightSavingsTime(new Date(), -* function (date) {alert('dst:' + date.dst + '\n');} -* function () {}); -*/ -isDayLightSavingsTime:function(date, successCB, failureCB) { - argscheck.checkArgs('dfF', 'Globalization.isDayLightSavingsTime', arguments); - var dateValue = date.valueOf(); - exec(successCB, failureCB, "Globalization", "isDayLightSavingsTime", [{"date": dateValue}]); -}, - -/** -* Returns the first day of the week according to the client's user preferences and calendar. -* The days of the week are numbered starting from 1 where 1 is considered to be Sunday. -* It returns the day to the successCB callback with a properties object as a parameter. -* If there is an error obtaining the pattern, then the errorCB callback is invoked. -* -* @param {Function} successCB -* @param {Function} errorCB -* -* @return Object.value {Number}: The number of the first day of the week. -* -* @error GlobalizationError.UNKNOWN_ERROR -* -* Example -* globalization.getFirstDayOfWeek(function (day) -* { alert('Day:' + day.value + '\n');}, -* function () {}); -*/ -getFirstDayOfWeek:function(successCB, failureCB) { - argscheck.checkArgs('fF', 'Globalization.getFirstDayOfWeek', arguments); - exec(successCB, failureCB, "Globalization", "getFirstDayOfWeek", []); -}, - - -/** -* Returns a number formatted as a string according to the client's user preferences. -* It returns the formatted number string to the successCB callback with a properties object as a -* parameter. If there is an error formatting the number, then the errorCB callback is invoked. -* -* The defaults are: type="decimal" -* -* @param {Number} number -* @param {Function} successCB -* @param {Function} errorCB -* @param {Object} options {optional} -* type {String}: 'decimal', "percent", or 'currency' -* -* @return Object.value {String}: The formatted number string. -* -* @error GlobalizationError.FORMATTING_ERROR -* -* Example -* globalization.numberToString(3.25, -* function (number) {alert('number:' + number.value + '\n');}, -* function () {}, -* {type:'decimal'}); -*/ -numberToString:function(number, successCB, failureCB, options) { - argscheck.checkArgs('nfFO', 'Globalization.numberToString', arguments); - exec(successCB, failureCB, "Globalization", "numberToString", [{"number": number, "options": options}]); -}, - -/** -* Parses a number formatted as a string according to the client's user preferences and -* returns the corresponding number. It returns the number to the successCB callback with a -* properties object as a parameter. If there is an error parsing the number string, then -* the errorCB callback is invoked. -* -* The defaults are: type="decimal" -* -* @param {String} numberString -* @param {Function} successCB -* @param {Function} errorCB -* @param {Object} options {optional} -* type {String}: 'decimal', "percent", or 'currency' -* -* @return Object.value {Number}: The parsed number. -* -* @error GlobalizationError.PARSING_ERROR -* -* Example -* globalization.stringToNumber('1234.56', -* function (number) {alert('Number:' + number.value + '\n');}, -* function () { alert('Error parsing number');}); -*/ -stringToNumber:function(numberString, successCB, failureCB, options) { - argscheck.checkArgs('sfFO', 'Globalization.stringToNumber', arguments); - exec(successCB, failureCB, "Globalization", "stringToNumber", [{"numberString": numberString, "options": options}]); -}, - -/** -* Returns a pattern string for formatting and parsing numbers according to the client's user -* preferences. It returns the pattern to the successCB callback with a properties object as a -* parameter. If there is an error obtaining the pattern, then the errorCB callback is invoked. -* -* The defaults are: type="decimal" -* -* @param {Function} successCB -* @param {Function} errorCB -* @param {Object} options {optional} -* type {String}: 'decimal', "percent", or 'currency' -* -* @return Object.pattern {String}: The number pattern for formatting and parsing numbers. -* The patterns follow Unicode Technical Standard #35. -* http://unicode.org/reports/tr35/tr35-4.html -* Object.symbol {String}: The symbol to be used when formatting and parsing -* e.g., percent or currency symbol. -* Object.fraction {Number}: The number of fractional digits to use when parsing and -* formatting numbers. -* Object.rounding {Number}: The rounding increment to use when parsing and formatting. -* Object.positive {String}: The symbol to use for positive numbers when parsing and formatting. -* Object.negative: {String}: The symbol to use for negative numbers when parsing and formatting. -* Object.decimal: {String}: The decimal symbol to use for parsing and formatting. -* Object.grouping: {String}: The grouping symbol to use for parsing and formatting. -* -* @error GlobalizationError.PATTERN_ERROR -* -* Example -* globalization.getNumberPattern( -* function (pattern) {alert('Pattern:' + pattern.pattern + '\n');}, -* function () {}); -*/ -getNumberPattern:function(successCB, failureCB, options) { - argscheck.checkArgs('fFO', 'Globalization.getNumberPattern', arguments); - exec(successCB, failureCB, "Globalization", "getNumberPattern", [{"options": options}]); -}, - -/** -* Returns a pattern string for formatting and parsing currency values according to the client's -* user preferences and ISO 4217 currency code. It returns the pattern to the successCB callback with a -* properties object as a parameter. If there is an error obtaining the pattern, then the errorCB -* callback is invoked. -* -* @param {String} currencyCode -* @param {Function} successCB -* @param {Function} errorCB -* -* @return Object.pattern {String}: The currency pattern for formatting and parsing currency values. -* The patterns follow Unicode Technical Standard #35 -* http://unicode.org/reports/tr35/tr35-4.html -* Object.code {String}: The ISO 4217 currency code for the pattern. -* Object.fraction {Number}: The number of fractional digits to use when parsing and -* formatting currency. -* Object.rounding {Number}: The rounding increment to use when parsing and formatting. -* Object.decimal: {String}: The decimal symbol to use for parsing and formatting. -* Object.grouping: {String}: The grouping symbol to use for parsing and formatting. -* -* @error GlobalizationError.FORMATTING_ERROR -* -* Example -* globalization.getCurrencyPattern('EUR', -* function (currency) {alert('Pattern:' + currency.pattern + '\n');} -* function () {}); -*/ -getCurrencyPattern:function(currencyCode, successCB, failureCB) { - argscheck.checkArgs('sfF', 'Globalization.getCurrencyPattern', arguments); - exec(successCB, failureCB, "Globalization", "getCurrencyPattern", [{"currencyCode": currencyCode}]); -} - -}; - -module.exports = globalization; - -}); - -// file: lib/common/plugin/globalization/symbols.js -define("cordova/plugin/globalization/symbols", function(require, exports, module) { - - -var modulemapper = require('cordova/modulemapper'); - -modulemapper.clobbers('cordova/plugin/globalization', 'navigator.globalization'); -modulemapper.clobbers('cordova/plugin/GlobalizationError', 'GlobalizationError'); - -}); - -// file: lib/android/plugin/inappbrowser/symbols.js -define("cordova/plugin/inappbrowser/symbols", function(require, exports, module) { - - -var modulemapper = require('cordova/modulemapper'); - -modulemapper.clobbers('cordova/plugin/InAppBrowser', 'open'); - -}); - -// file: lib/common/plugin/logger.js -define("cordova/plugin/logger", function(require, exports, module) { - -//------------------------------------------------------------------------------ -// The logger module exports the following properties/functions: -// -// LOG - constant for the level LOG -// ERROR - constant for the level ERROR -// WARN - constant for the level WARN -// INFO - constant for the level INFO -// DEBUG - constant for the level DEBUG -// logLevel() - returns current log level -// logLevel(value) - sets and returns a new log level -// useConsole() - returns whether logger is using console -// useConsole(value) - sets and returns whether logger is using console -// log(message,...) - logs a message at level LOG -// error(message,...) - logs a message at level ERROR -// warn(message,...) - logs a message at level WARN -// info(message,...) - logs a message at level INFO -// debug(message,...) - logs a message at level DEBUG -// logLevel(level,message,...) - logs a message specified level -// -//------------------------------------------------------------------------------ - -var logger = exports; - -var exec = require('cordova/exec'); -var utils = require('cordova/utils'); - -var UseConsole = true; -var UseLogger = true; -var Queued = []; -var DeviceReady = false; -var CurrentLevel; - -var originalConsole = console; - -/** - * Logging levels - */ - -var Levels = [ - "LOG", - "ERROR", - "WARN", - "INFO", - "DEBUG" -]; - -/* - * add the logging levels to the logger object and - * to a separate levelsMap object for testing - */ - -var LevelsMap = {}; -for (var i=0; i CurrentLevel) return; - - // queue the message if not yet at deviceready - if (!DeviceReady && !UseConsole) { - Queued.push([level, message]); - return; - } - - // Log using the native logger if that is enabled - if (UseLogger) { - exec(null, null, "Logger", "logLevel", [level, message]); - } - - // Log using the console if that is enabled - if (UseConsole) { - // make sure console is not using logger - if (console.__usingCordovaLogger) { - throw new Error("console and logger are too intertwingly"); - } - - // log to the console - switch (level) { - case logger.LOG: originalConsole.log(message); break; - case logger.ERROR: originalConsole.log("ERROR: " + message); break; - case logger.WARN: originalConsole.log("WARN: " + message); break; - case logger.INFO: originalConsole.log("INFO: " + message); break; - case logger.DEBUG: originalConsole.log("DEBUG: " + message); break; - } - } -}; - - -/** - * Formats a string and arguments following it ala console.log() - * - * Any remaining arguments will be appended to the formatted string. - * - * for rationale, see FireBug's Console API: - * http://getfirebug.com/wiki/index.php/Console_API - */ -logger.format = function(formatString, args) { - return __format(arguments[0], [].slice.call(arguments,1)).join(' '); -}; - - -//------------------------------------------------------------------------------ -/** - * Formats a string and arguments following it ala vsprintf() - * - * format chars: - * %j - format arg as JSON - * %o - format arg as JSON - * %c - format arg as '' - * %% - replace with '%' - * any other char following % will format it's - * arg via toString(). - * - * Returns an array containing the formatted string and any remaining - * arguments. - */ -function __format(formatString, args) { - if (formatString === null || formatString === undefined) return [""]; - if (arguments.length == 1) return [formatString.toString()]; - - if (typeof formatString != "string") - formatString = formatString.toString(); - - var pattern = /(.*?)%(.)(.*)/; - var rest = formatString; - var result = []; - - while (args.length) { - var match = pattern.exec(rest); - if (!match) break; - - var arg = args.shift(); - rest = match[3]; - result.push(match[1]); - - if (match[2] == '%') { - result.push('%'); - args.unshift(arg); - continue; - } - - result.push(__formatted(arg, match[2])); - } - - result.push(rest); - - var remainingArgs = [].slice.call(args); - remainingArgs.unshift(result.join('')); - return remainingArgs; -} - -function __formatted(object, formatChar) { - - try { - switch(formatChar) { - case 'j': - case 'o': return JSON.stringify(object); - case 'c': return ''; - } - } - catch (e) { - return "error JSON.stringify()ing argument: " + e; - } - - if ((object === null) || (object === undefined)) { - return Object.prototype.toString.call(object); - } - - return object.toString(); -} - - -//------------------------------------------------------------------------------ -// when deviceready fires, log queued messages -logger.__onDeviceReady = function() { - if (DeviceReady) return; - - DeviceReady = true; - - for (var i=0; i 3) { - fail(FileError.SYNTAX_ERR); - } else { - // if successful, return a FileSystem object - var success = function(file_system) { - if (file_system) { - if (successCallback) { - // grab the name and root from the file system object - var result = new FileSystem(file_system.name, file_system.root); - successCallback(result); - } - } - else { - // no FileSystem object returned - fail(FileError.NOT_FOUND_ERR); - } - }; - exec(success, fail, "File", "requestFileSystem", [type, size]); - } -}; - -module.exports = requestFileSystem; - -}); - -// file: lib/common/plugin/resolveLocalFileSystemURI.js -define("cordova/plugin/resolveLocalFileSystemURI", function(require, exports, module) { - -var argscheck = require('cordova/argscheck'), - DirectoryEntry = require('cordova/plugin/DirectoryEntry'), - FileEntry = require('cordova/plugin/FileEntry'), - FileError = require('cordova/plugin/FileError'), - exec = require('cordova/exec'); - -/** - * Look up file system Entry referred to by local URI. - * @param {DOMString} uri URI referring to a local file or directory - * @param successCallback invoked with Entry object corresponding to URI - * @param errorCallback invoked if error occurs retrieving file system entry - */ -module.exports = function(uri, successCallback, errorCallback) { - argscheck.checkArgs('sFF', 'resolveLocalFileSystemURI', arguments); - // error callback - var fail = function(error) { - errorCallback && errorCallback(new FileError(error)); - }; - // sanity check for 'not:valid:filename' - if(!uri || uri.split(":").length > 2) { - setTimeout( function() { - fail(FileError.ENCODING_ERR); - },0); - return; - } - // if successful, return either a file or directory entry - var success = function(entry) { - var result; - if (entry) { - if (successCallback) { - // create appropriate Entry object - result = (entry.isDirectory) ? new DirectoryEntry(entry.name, entry.fullPath) : new FileEntry(entry.name, entry.fullPath); - successCallback(result); - } - } - else { - // no Entry object returned - fail(FileError.NOT_FOUND_ERR); - } - }; - - exec(success, fail, "File", "resolveLocalFileSystemURI", [uri]); -}; - -}); - -// file: lib/common/plugin/splashscreen.js -define("cordova/plugin/splashscreen", function(require, exports, module) { - -var exec = require('cordova/exec'); - -var splashscreen = { - show:function() { - exec(null, null, "SplashScreen", "show", []); - }, - hide:function() { - exec(null, null, "SplashScreen", "hide", []); - } -}; - -module.exports = splashscreen; - -}); - -// file: lib/common/plugin/splashscreen/symbols.js -define("cordova/plugin/splashscreen/symbols", function(require, exports, module) { - - -var modulemapper = require('cordova/modulemapper'); - -modulemapper.clobbers('cordova/plugin/splashscreen', 'navigator.splashscreen'); - -}); - -// file: lib/common/symbols.js -define("cordova/symbols", function(require, exports, module) { - -var modulemapper = require('cordova/modulemapper'); - -// Use merges here in case others symbols files depend on this running first, -// but fail to declare the dependency with a require(). -modulemapper.merges('cordova', 'cordova'); -modulemapper.clobbers('cordova/exec', 'cordova.exec'); -modulemapper.clobbers('cordova/exec', 'Cordova.exec'); - -}); - -// file: lib/common/utils.js -define("cordova/utils", function(require, exports, module) { - -var utils = exports; - -/** - * Defines a property getter / setter for obj[key]. - */ -utils.defineGetterSetter = function(obj, key, getFunc, opt_setFunc) { - if (Object.defineProperty) { - var desc = { - get: getFunc, - configurable: true - }; - if (opt_setFunc) { - desc.set = opt_setFunc; - } - Object.defineProperty(obj, key, desc); - } else { - obj.__defineGetter__(key, getFunc); - if (opt_setFunc) { - obj.__defineSetter__(key, opt_setFunc); - } - } -}; - -/** - * Defines a property getter for obj[key]. - */ -utils.defineGetter = utils.defineGetterSetter; - -utils.arrayIndexOf = function(a, item) { - if (a.indexOf) { - return a.indexOf(item); - } - var len = a.length; - for (var i = 0; i < len; ++i) { - if (a[i] == item) { - return i; - } - } - return -1; -}; - -/** - * Returns whether the item was found in the array. - */ -utils.arrayRemove = function(a, item) { - var index = utils.arrayIndexOf(a, item); - if (index != -1) { - a.splice(index, 1); - } - return index != -1; -}; - -utils.typeName = function(val) { - return Object.prototype.toString.call(val).slice(8, -1); -}; - -/** - * Returns an indication of whether the argument is an array or not - */ -utils.isArray = function(a) { - return utils.typeName(a) == 'Array'; -}; - -/** - * Returns an indication of whether the argument is a Date or not - */ -utils.isDate = function(d) { - return utils.typeName(d) == 'Date'; -}; - -/** - * Does a deep clone of the object. - */ -utils.clone = function(obj) { - if(!obj || typeof obj == 'function' || utils.isDate(obj) || typeof obj != 'object') { - return obj; - } - - var retVal, i; - - if(utils.isArray(obj)){ - retVal = []; - for(i = 0; i < obj.length; ++i){ - retVal.push(utils.clone(obj[i])); - } - return retVal; - } - - retVal = {}; - for(i in obj){ - if(!(i in retVal) || retVal[i] != obj[i]) { - retVal[i] = utils.clone(obj[i]); - } - } - return retVal; -}; - -/** - * Returns a wrapped version of the function - */ -utils.close = function(context, func, params) { - if (typeof params == 'undefined') { - return function() { - return func.apply(context, arguments); - }; - } else { - return function() { - return func.apply(context, params); - }; - } -}; - -/** - * Create a UUID - */ -utils.createUUID = function() { - return UUIDcreatePart(4) + '-' + - UUIDcreatePart(2) + '-' + - UUIDcreatePart(2) + '-' + - UUIDcreatePart(2) + '-' + - UUIDcreatePart(6); -}; - -/** - * Extends a child object from a parent object using classical inheritance - * pattern. - */ -utils.extend = (function() { - // proxy used to establish prototype chain - var F = function() {}; - // extend Child from Parent - return function(Child, Parent) { - F.prototype = Parent.prototype; - Child.prototype = new F(); - Child.__super__ = Parent.prototype; - Child.prototype.constructor = Child; - }; -}()); - -/** - * Alerts a message in any available way: alert or console.log. - */ -utils.alert = function(msg) { - if (window.alert) { - window.alert(msg); - } else if (console && console.log) { - console.log(msg); - } -}; - - -//------------------------------------------------------------------------------ -function UUIDcreatePart(length) { - var uuidpart = ""; - for (var i=0; i tag. - function injectScript(path) { - scriptCounter++; - var script = document.createElement("script"); - script.onload = scriptLoadedCallback; - script.src = path; - document.head.appendChild(script); - } - - // Called when: - // * There are plugins defined and all plugins are finished loading. - // * There are no plugins to load. - function finishPluginLoading() { - context.cordova.require('cordova/channel').onPluginsReady.fire(); - } - - // Handler for the cordova_plugins.json content. - // See plugman's plugin_loader.js for the details of this object. - // This function is only called if the really is a plugins array that isn't empty. - // Otherwise the XHR response handler will just call finishPluginLoading(). - function handlePluginsObject(modules) { - // First create the callback for when all plugins are loaded. - var mapper = context.cordova.require('cordova/modulemapper'); - onScriptLoadingComplete = function() { - // Loop through all the plugins and then through their clobbers and merges. - for (var i = 0; i < modules.length; i++) { - var module = modules[i]; - if (!module) continue; - - if (module.clobbers && module.clobbers.length) { - for (var j = 0; j < module.clobbers.length; j++) { - mapper.clobbers(module.id, module.clobbers[j]); - } - } - - if (module.merges && module.merges.length) { - for (var k = 0; k < module.merges.length; k++) { - mapper.merges(module.id, module.merges[k]); - } - } - - // Finally, if runs is truthy we want to simply require() the module. - // This can be skipped if it had any merges or clobbers, though, - // since the mapper will already have required the module. - if (module.runs && !(module.clobbers && module.clobbers.length) && !(module.merges && module.merges.length)) { - context.cordova.require(module.id); - } - } - - finishPluginLoading(); - }; - - // Now inject the scripts. - for (var i = 0; i < modules.length; i++) { - injectScript(modules[i].file); - } - } - - - // Try to XHR the cordova_plugins.json file asynchronously. - var xhr = new XMLHttpRequest(); - xhr.onload = function() { - // If the response is a JSON string which composes an array, call handlePluginsObject. - // If the request fails, or the response is not a JSON array, just call finishPluginLoading. - var obj; - try { - obj = this.status == 200 && this.responseText && JSON.parse(this.responseText); - } catch (err) { - // obj will be undefined. - } - if (Array.isArray(obj) && obj.length > 0) { - handlePluginsObject(obj); - } else { - finishPluginLoading(); - } - }; - xhr.onerror = function() { - finishPluginLoading(); - }; - try { // we commented we were going to try, so let us actually try and catch - xhr.open('GET', 'cordova_plugins.json', true); // Async - xhr.send(); - } catch(err){ - finishPluginLoading(); - } -}(window)); - - -})(); \ No newline at end of file diff --git a/cordova-lib/spec-plugman/projects/android_one/cordova/appinfo.jar b/cordova-lib/spec-plugman/projects/android_one/cordova/appinfo.jar deleted file mode 100644 index 583776d7f1d000113b583338b086e63d20f28d6d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1574 zcmWIWW@Zs#-~htl;&o08NPv@pg~8V~#8KDN&rSc|DFy~+h5&DN4v-2asImZ@nni#r z;F^6M{XE@VgG2Ou-9G!CIql=Et9OytTUYDcne&^246YbIcv__A<*VcAd$DvC3+IfN zl1FAsXk}Q4i9A`NRq;&qb>^p{pK58(URpg@5fhKrY)~vEGWpyOinDx%+K@8OUu_w&PgmT?hSn%F6}Dv-#2b|&bGET z_XQEUp;;U%-CMRfZJ3(g+t$FAy>W%kNr7o)dz=KL&LeoUPBt#y1&K2ZTw{SuH ziA_z6cP4IJG@)Dn=#z;(>sxBpJdj=E^<$QzS?Y|o^7)E$=oFH+%whsB!Lgxe$^|L`qT;>NTOA+EB# zZF;9yX71ju9d$J;<8$e~2Wp1FU&XF_2ImVf2Dh@#{$%%{uQNA`wrVG`#;uf!Commo-YdK-_w4Iq(YSb5)?+<^t?MJ}IZpAh` zM&BDdQljV8{mGge!2XffTU%%DrDf-q7auc!75Yw~dVbT>Rcws64^Qi=t?|FTHO9}n ze1&D#@<;4{Rw(ICP(QcyKhM`NfwnKMRmEXP#aG(6ZE(1`eNJuLj+5ow%U-`sYvn69 zv5ncYCU>5q=dtHvl5KjAn|s**mkT?aL?oWrqW$L4OD{`9)#G>Heqq^mZ13cot9N-V zJ-^E`PC;KQcm6kxD{b!uo1$|CV*&z8Hd%jrbneai7h8ow-=s=Rd9hBM_d8RwuO*ei^>m$!nz2KPsMa6p^*(M!+yG!p}?K_iQH+Ao7eonVr zKIz2&>HBoQ-&pq4q@>H@V%yu7&o1p+{B~~1Rz~ez?K7^v3{rhFZQibvUBV0cgHKJD zJ^ifDT~zjR?(Es2ZEu$Ly(x7(HLtX&ao6SC1&I@Wl`uULXA_p~KNfAW+iy}8@1mLF z3FlunKeUxfZu}%AQdk@v9m!+#Rpo%a%Ldtq}U#4#I z{UWy@_{2Wu6Hal}emj&S7Js`Vd_rn(fK${Lr&gvD+&iQ`bUt9S>d0@3Sl02}caeds z$~6PGYm#e{SwerUOB9Jd5%gS6S>N);g$EaJ&r;N9?)c+8+gZp><<>Ek6nU=`7vsAp zd^X%uKWASlmz 0) { print }}' | grep 'device' | grep -v 'emulator'` - device_list=($devices) - if [[ ${#device_list[@]} > 0 ]] ; then - for i in ${devices[@]} - do - # remove space and 'device' - echo ${i/[^a-zA-Z0-9._]device/} - done - else - echo "No devices found." - exit 2 - fi -} - -function list_started_emulators { - IFS=$'\n' - devices=`adb devices | awk '/List of devices attached/ { while(getline > 0) { print }}' | grep 'device' | grep 'emulator'` - emulator_list=($devices) - if [[ ${#emulator_list[@]} > 0 ]] ; then - for i in ${emulator_list[@]} - do - # remove space and 'device' - echo ${i/[^a-zA-Z0-9._]device/} - done - else - echo "No started emulators found, you can start an emulator by using the command" - echo " 'cordova/lib/start-emulator'" - exit 2 - fi -} - -function list_emulator_images { - emulator_images=`android list avds | grep "Name:" | cut -f 2 -d ":"` - emulator_list=($emulator_images) - if [[ ${#emulator_list[@]} > 0 ]] ; then - for i in ${emulator_list[@]} - do - echo ${i/[^a-zA-Z0-9._]/} - done - else - echo "No emulators found, if you would like to create an emulator follow the instructions" - echo " provided here : http://developer.android.com/tools/devices/index.html" - echo " Or run 'android create avd --name --target ' in on the command line." - exit 2 - fi -} - -function start_emulator { - emulator_images=`android list avds | grep "Name:" | cut -f 2 -d ":"` - # if target emulator is provided - if [[ "$#" -eq 1 ]] ; then - # check that it exists - if [[ $emulator_images =~ $1 ]] ; then - #xterm -e emulator -avd $1 & - emulator -avd $1 1> /dev/null 2>&1 & - else - echo "Could not find the provided emulator, make sure the emulator exists" - echo " by checking 'cordova/lib/list-emulator-images'" - exit 2 - fi - else - # start first emulator - emulator_list=($emulator_images) - if [[ ${#emulator_list[@]} > 0 ]] ; then - #xterm -e emulator -avd ${emulator_list[0]} & - emulator -avd ${emulator_list[0]/[^a-zA-Z0-9._]/} 1> /dev/null 2>&1 & - else - echo "No emulators found, if you would like to create an emulator follow the instructions" - echo " provided here : http://developer.android.com/tools/devices/index.html" - echo " Or run 'android create avd --name --target ' in on the command line." - exit 2 - fi - fi -} - -function install_device { - IFS=$'\n' - devices=`adb devices | awk '/List of devices attached/ { while(getline > 0) { print }}' | grep 'device' | grep -v 'emulator'` - device_list=($devices) - if [[ ${#device_list[@]} > 0 ]] ; then - apks=`find $PROJECT_PATH/bin -type f -maxdepth 1 | egrep '\.apk$'` - apk_list=($apks) - if [[ ${#apk_list[@]} > 0 ]] ; then - local target - # handle target emulator - if [[ "$#" -eq 1 ]] ; then - # deploy to given target - target=${1/--target=/} - else - # delete trailing space and 'device' after device ID - target=${device_list[0]/[^a-zA-Z0-9._]device/} - fi - echo "Installing ${apk_list[0]} onto device $target..." - adb -s $target install -r ${apk_list[0]}; - echo "Launching application..." - local launch_str=$(java -jar "$PROJECT_PATH"/cordova/appinfo.jar "$PROJECT_PATH"/AndroidManifest.xml) - adb -s $target shell am start -W -a android.intent.action.MAIN -n $launch_str - else - echo "Application package not found, could not install to device" - echo " make sure your application is built before deploying." - exit 2 - fi - else - echo "No devices found to deploy to. Please make sure your device is connected" - echo " and you can view it using the 'cordova/lib/list-devices' command." - exit 2 - fi -} - -function install_emulator { - IFS=$'\n' - # check that there is an emulator to deploy to - emulator_string=`adb devices | awk '/List of devices attached/ { while(getline > 0) { print }}' | grep 'emulator'` - emulator_list=($emulator_string) - if [[ ${#emulator_list[@]} > 0 ]] ; then - apks=`find $PROJECT_PATH/bin -type f -maxdepth 1 | egrep '\.apk$'` - apk_list=($apks) - if [[ ${#apk_list[@]} > 0 ]] ; then - local target - # handle target emulator - if [[ "$#" -eq 1 ]] ; then - # deploy to given target - target=${1/--target=/} - else - # delete trailing space and 'device' after emulator ID - target=${emulator_list[0]/[^a-zA-Z0-9._]device/} - fi - echo "Installing ${apk_list[0]} onto $target..." - adb -s $target install -r ${apk_list[0]}; - echo "Launching application..." - local launch_str=$(java -jar "$PROJECT_PATH"/cordova/appinfo.jar "$PROJECT_PATH"/AndroidManifest.xml) - adb -s $target shell am start -W -a android.intent.action.MAIN -n $launch_str - - else - echo "Application package not found, could not install to device" - echo " make sure your application is built before deploying." - exit 2 - fi - else - echo "No emulators found to deploy to. Please make sure your emulator is started" - echo " and you can view it using the 'cordova/lib/list-started-emulators' command." - exit 2 - fi -} - -# cleans the project -function clean { - echo "Cleaning project..." - ant clean -} - -# has to be used independently and not in conjunction with other commands -function log { - # filter out nativeGetEnabledTags spam from latest sdk bug. - adb logcat | grep -v nativeGetEnabledTags -} - - -function build { - if [[ "$#" -eq 1 ]] ; then - if [[ $1 == "--debug" ]] ; then - clean - ant debug -f "$PROJECT_PATH"/build.xml - elif [[ $1 == "--release" ]] ; then - clean - ant release -f "$PROJECT_PATH"/build.xml - elif [[ $1 == "--nobuild" ]] ; then - echo "Skipping build..." - else - echo "Error : Build command '$1' not recognized." - exit 2 - fi - else - echo "Warning : [ --debug | --release | --nobuild ] not specified, defaulting to --debug" - clean - ant debug -f "$PROJECT_PATH"/build.xml - fi -} - - -function wait_for_emulator { - emulator_string=`adb devices | awk '/List of devices attached/ { while(getline > 0) { print }}' | grep 'device' | grep 'emulator'` - old_started=($emulator_string) - local new_started - local new_emulator_name - local i="0" - echo -n "Waiting for emulator..." - while [ $i -lt 300 ] - do - emulator_string=`adb devices | awk '/List of devices attached/ { while(getline > 0) { print }}' | grep 'device' | grep 'emulator'` - new_started=($emulator_string) - if [[ ${#new_started[@]} > ${#old_started[@]} && -z "$new_emulator_name" ]] ; then - # get the name of the started emulator - local count="0" - if [[ ${#old_started[@]} == 0 ]] ; then - new_emulator_name=${new_started[$count]/[^a-zA-Z0-9._]device/} - else - for count in {0...${#old_started[@]}} - do - if [[ ! ${new_started[$count]} == ${old_started[$count]} ]] ; then - new_emulator_name=${new_started[$count]/[^a-zA-Z0-9._]device/} - fi - done - if [[ -z "$new_emulator_name" ]] ; then - count=$[count+1] - new_emulator_name=${new_started[$count]/[^a-zA-Z0-9._]device/} - fi - fi - elif [[ "$new_emulator_name" ]] ; then - boot_anim=`adb -s $new_emulator_name shell getprop init.svc.bootanim` - if [[ $boot_anim =~ "stopped" ]] ; then - break - else - sleep 1 - i=$[i+1] - echo -n "." - fi - else - sleep 1 - i=$[i+1] - echo -n "." - fi - done - # Device timeout: emulator has not started in time - if [ $i -eq 300 ] - then - echo "emulator timeout!" - exit 69 - else - echo "connected!" - fi -} - -function run { - IFS=$'\n' - if [[ "$#" -eq 2 ]] ; then - build $2 - if [[ $1 == "--device" ]] ; then - install_device - elif [[ $1 == "--emulator" ]] ; then - install_emulator - elif [[ $1 =~ "--target=" ]]; then - install_device $1 - else - echo "Error : '$1' is not recognized as an install option" - fi - elif [[ "$#" -eq 1 ]] ; then - if [[ $1 == "--debug" || $1 == "--release" || $1 == "--nobuild" ]] ; then - build $1 - elif [[ $1 == "--device" ]] ; then - install_device - elif [[ $1 == "--emulator" ]] ; then - install_emulator - elif [[ $1 =~ "--target=" ]]; then - install_device $1 - else - echo "Error : '$1' is not recognized as an install option" - fi - else - echo "Warning : [ --device | --emulate | --target= ] not specified, using defaults." - build - devices=`adb devices | awk '/List of devices attached/ { while(getline > 0) { print }}' | grep 'device' | grep -v 'emulator'` - device_list=($devices) - emulator_string=`adb devices | awk '/List of devices attached/ { while(getline > 0) { print }}' | grep 'device' | grep 'emulator'` - emulator_list=($emulator_string) - if [[ ${#device_list[@]} > 0 ]] ; then - install_device - elif [[ ${#emulator_list[@]} > 0 ]] ; then - install_emulator - else - emulator_images=`android list avds | grep "Name:" | cut -f 2 -d ":"` - echo $emulator_images - emulator_image_list=($emulator_images) - if [[ ${#emulator_image_list[@]} > 0 ]] ; then - echo "Starting emulator : ${emulator_image_list[0]}" - emulator -avd ${emulator_image_list[0]/[^.\w]/} 1> /dev/null 2>&1 & - wait_for_emulator - install_emulator - else - # TODO : look for emulator images and start one if it's available - echo "Error : there are no available devices or emulators to deploy to." - echo " create an emulator or connect your device to run this command." - echo "If you would like to create an emulator follow the instructions" - echo " provided here : http://developer.android.com/tools/devices/index.html" - echo " Or run 'android create avd --name --target ' in on the command line." - exit 2 - fi - fi - fi -} - -# parse command line arguments - -if [[ $# > 3 ]] ; then - echo "Error : too many arguments." - exit 2 -elif [[ $# == 3 ]] ; then - if [[ $1 == "run" ]] ; then - run $2 $3 - else - echo "Error : too many arguments for '$1'" - exit 2 - fi -elif [[ $# == 2 ]] ; then - if [[ $1 == "run" ]] ; then - if [[ $2 == "--emulator" || $2 == "--device" || $2 =~ "--target=" ]] ; then - run $2 '' - elif [[ $2 == "--debug" || $2 == "--release" || $2 == "--nobuild" ]] ; then - run '' $2 - else - echo "Error : '$2' is not recognized as a run option." - exit 2 - fi - elif [[ $1 == "build" ]] ; then - build $2 - elif [[ $1 == "start-emulator" ]] ; then - start_emulator $2 - elif [[ $1 == "install-device" ]] ; then - if [[ $2 =~ "--target=" ]] ; then - install_device $2 - else - echo "Error : '$2' is not recognized as an install option" - exit 2 - fi - elif [[ $1 == "install-emulator" ]] ; then - if [[ $2 =~ "--target=" ]] ; then - install_emulator $2 - else - echo "Error : '$2' is not recognized as an install option" - exit 2 - fi - else - echo "Error : '$1' is not recognized as an option that takes arguments" - exit 2 - fi -elif [[ $# == 1 ]] ; then - if [[ $1 == "run" ]] ; then - run - elif [[ $1 == "build" ]]; then - build - elif [[ $1 == "clean" ]]; then - clean - elif [[ $1 == "log" ]]; then - log - elif [[ $1 == "list-devices" ]]; then - list_devices - elif [[ $1 == "list-emulator-images" ]]; then - list_emulator_images - elif [[ $1 == "list-started-emulators" ]]; then - list_started_emulators - elif [[ $1 == "install-device" ]]; then - install_device - elif [[ $1 == "install-emulator" ]]; then - install_emulator - elif [[ $1 == "start-emulator" ]]; then - start_emulator - else - echo "Error : '$1' is not recognized as a tooling command." - exit 2 - fi -else - echo "Error : No command received, exiting..." - exit 2 -fi \ No newline at end of file diff --git a/cordova-lib/spec-plugman/projects/android_one/cordova/lib/install-device b/cordova-lib/spec-plugman/projects/android_one/cordova/lib/install-device deleted file mode 100755 index 604b5ae0c..000000000 --- a/cordova-lib/spec-plugman/projects/android_one/cordova/lib/install-device +++ /dev/null @@ -1,23 +0,0 @@ -#!/bin/bash -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. - -set -e - -CORDOVA_LIB_PATH=$( cd "$( dirname "$0" )" && pwd ) - -bash "$CORDOVA_LIB_PATH"/cordova install-device "$@" \ No newline at end of file diff --git a/cordova-lib/spec-plugman/projects/android_one/cordova/lib/install-emulator b/cordova-lib/spec-plugman/projects/android_one/cordova/lib/install-emulator deleted file mode 100755 index 105e2ee30..000000000 --- a/cordova-lib/spec-plugman/projects/android_one/cordova/lib/install-emulator +++ /dev/null @@ -1,23 +0,0 @@ -#!/bin/bash -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. - -set -e - -CORDOVA_LIB_PATH=$( cd "$( dirname "$0" )" && pwd ) - -bash "$CORDOVA_LIB_PATH"/cordova install-emulator "$@" \ No newline at end of file diff --git a/cordova-lib/spec-plugman/projects/android_one/cordova/lib/list-devices b/cordova-lib/spec-plugman/projects/android_one/cordova/lib/list-devices deleted file mode 100755 index 7a5b2f5c4..000000000 --- a/cordova-lib/spec-plugman/projects/android_one/cordova/lib/list-devices +++ /dev/null @@ -1,23 +0,0 @@ -#!/bin/bash -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. - -set -e - -CORDOVA_LIB_PATH=$( cd "$( dirname "$0" )" && pwd ) - -bash "$CORDOVA_LIB_PATH"/cordova list-devices \ No newline at end of file diff --git a/cordova-lib/spec-plugman/projects/android_one/cordova/lib/list-emulator-images b/cordova-lib/spec-plugman/projects/android_one/cordova/lib/list-emulator-images deleted file mode 100755 index db8e5630d..000000000 --- a/cordova-lib/spec-plugman/projects/android_one/cordova/lib/list-emulator-images +++ /dev/null @@ -1,23 +0,0 @@ -#!/bin/bash -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. - -set -e - -CORDOVA_LIB_PATH=$( cd "$( dirname "$0" )" && pwd ) - -bash "$CORDOVA_LIB_PATH"/cordova list-emulator-images \ No newline at end of file diff --git a/cordova-lib/spec-plugman/projects/android_one/cordova/lib/list-started-emulators b/cordova-lib/spec-plugman/projects/android_one/cordova/lib/list-started-emulators deleted file mode 100755 index 79117638c..000000000 --- a/cordova-lib/spec-plugman/projects/android_one/cordova/lib/list-started-emulators +++ /dev/null @@ -1,23 +0,0 @@ -#!/bin/bash -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. - -set -e - -CORDOVA_LIB_PATH=$( cd "$( dirname "$0" )" && pwd ) - -bash "$CORDOVA_LIB_PATH"/cordova list-started-emulators \ No newline at end of file diff --git a/cordova-lib/spec-plugman/projects/android_one/cordova/lib/start-emulator b/cordova-lib/spec-plugman/projects/android_one/cordova/lib/start-emulator deleted file mode 100755 index 8e8964da6..000000000 --- a/cordova-lib/spec-plugman/projects/android_one/cordova/lib/start-emulator +++ /dev/null @@ -1,23 +0,0 @@ -#!/bin/bash -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. - -set -e - -CORDOVA_LIB_PATH=$( cd "$( dirname "$0" )" && pwd ) - -bash "$CORDOVA_LIB_PATH"/cordova start-emulator "$@" \ No newline at end of file diff --git a/cordova-lib/spec-plugman/projects/android_one/cordova/log b/cordova-lib/spec-plugman/projects/android_one/cordova/log deleted file mode 100755 index 01fe10759..000000000 --- a/cordova-lib/spec-plugman/projects/android_one/cordova/log +++ /dev/null @@ -1,23 +0,0 @@ -#!/bin/bash -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. - -set -e - -CORDOVA_PATH=$( cd "$( dirname "$0" )/.." && pwd ) - -bash "$CORDOVA_PATH"/cordova/lib/cordova log "$@" diff --git a/cordova-lib/spec-plugman/projects/android_one/cordova/run b/cordova-lib/spec-plugman/projects/android_one/cordova/run deleted file mode 100755 index ec352b0ee..000000000 --- a/cordova-lib/spec-plugman/projects/android_one/cordova/run +++ /dev/null @@ -1,23 +0,0 @@ -#!/bin/bash -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. - -set -e - -CORDOVA_PATH=$( cd "$( dirname "$0" )" && pwd ) - -bash "$CORDOVA_PATH"/lib/cordova run "$@" diff --git a/cordova-lib/spec-plugman/projects/android_one/cordova/version b/cordova-lib/spec-plugman/projects/android_one/cordova/version deleted file mode 100755 index 5760e95a0..000000000 --- a/cordova-lib/spec-plugman/projects/android_one/cordova/version +++ /dev/null @@ -1,32 +0,0 @@ -#!/bin/bash -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. - -set -e - -CORDOVA_PATH=$( cd "$( dirname "$0" )" && pwd -P) -PROJECT_PATH="$(dirname "$CORDOVA_PATH")" - -VERSION_FILE_PATH="$PROJECT_PATH/assets/www/cordova.js" - -if [ -f "$VERSION_FILE_PATH" ]; then - JSVersion=$(sed -n '2,2p' $VERSION_FILE_PATH) - echo $JSVersion | sed -e 's/\/\/ //'| cut -f 1 -d '-' -else - echo "The file \"$VERSION_FILE_PATH\" does not exist." - exit 1 -fi diff --git a/cordova-lib/spec-plugman/projects/android_one/res/xml/plugins.xml b/cordova-lib/spec-plugman/projects/android_one/res/xml/plugins.xml deleted file mode 100644 index 9cee85e44..000000000 --- a/cordova-lib/spec-plugman/projects/android_one/res/xml/plugins.xml +++ /dev/null @@ -1,38 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - diff --git a/cordova-lib/spec-plugman/projects/android_one/src/.gitkeep b/cordova-lib/spec-plugman/projects/android_one/src/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/cordova-lib/spec-plugman/projects/android_two/AndroidManifest.xml b/cordova-lib/spec-plugman/projects/android_two/AndroidManifest.xml deleted file mode 100644 index 0c528031c..000000000 --- a/cordova-lib/spec-plugman/projects/android_two/AndroidManifest.xml +++ /dev/null @@ -1,69 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/cordova-lib/spec-plugman/projects/android_two/assets/www/.gitkeep b/cordova-lib/spec-plugman/projects/android_two/assets/www/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/cordova-lib/spec-plugman/projects/android_two/res/xml/config.xml b/cordova-lib/spec-plugman/projects/android_two/res/xml/config.xml deleted file mode 100644 index d37aba5cd..000000000 --- a/cordova-lib/spec-plugman/projects/android_two/res/xml/config.xml +++ /dev/null @@ -1,54 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/cordova-lib/spec-plugman/projects/android_two/src/.gitkeep b/cordova-lib/spec-plugman/projects/android_two/src/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/cordova-lib/spec-plugman/projects/android_two_no_perms/AndroidManifest.xml b/cordova-lib/spec-plugman/projects/android_two_no_perms/AndroidManifest.xml deleted file mode 100644 index 6e4b480ea..000000000 --- a/cordova-lib/spec-plugman/projects/android_two_no_perms/AndroidManifest.xml +++ /dev/null @@ -1,49 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - diff --git a/cordova-lib/spec-plugman/projects/android_two_no_perms/assets/www/.gitkeep b/cordova-lib/spec-plugman/projects/android_two_no_perms/assets/www/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/cordova-lib/spec-plugman/projects/android_two_no_perms/res/xml/config.xml b/cordova-lib/spec-plugman/projects/android_two_no_perms/res/xml/config.xml deleted file mode 100644 index d37aba5cd..000000000 --- a/cordova-lib/spec-plugman/projects/android_two_no_perms/res/xml/config.xml +++ /dev/null @@ -1,54 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/cordova-lib/spec-plugman/projects/android_two_no_perms/src/.gitkeep b/cordova-lib/spec-plugman/projects/android_two_no_perms/src/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/cordova-lib/spec-plugman/projects/android_uninstall/AndroidManifest.xml b/cordova-lib/spec-plugman/projects/android_uninstall/AndroidManifest.xml deleted file mode 100644 index b5fea9d1b..000000000 --- a/cordova-lib/spec-plugman/projects/android_uninstall/AndroidManifest.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - - - - - - - - - diff --git a/cordova-lib/spec-plugman/projects/android_uninstall/cordova/version b/cordova-lib/spec-plugman/projects/android_uninstall/cordova/version deleted file mode 100644 index 01f68fd29..000000000 --- a/cordova-lib/spec-plugman/projects/android_uninstall/cordova/version +++ /dev/null @@ -1 +0,0 @@ -echo 9.0.0 \ No newline at end of file diff --git a/cordova-lib/spec-plugman/projects/android_uninstall/cordova/version.bat b/cordova-lib/spec-plugman/projects/android_uninstall/cordova/version.bat deleted file mode 100644 index c637d7ca5..000000000 --- a/cordova-lib/spec-plugman/projects/android_uninstall/cordova/version.bat +++ /dev/null @@ -1,2 +0,0 @@ -@ECHO OFF -echo 9.0.0 \ No newline at end of file diff --git a/cordova-lib/spec-plugman/projects/blackberry10/native/device/chrome/.gitkeep b/cordova-lib/spec-plugman/projects/blackberry10/native/device/chrome/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/cordova-lib/spec-plugman/projects/blackberry10/native/device/plugins/jnext/auth.txt b/cordova-lib/spec-plugman/projects/blackberry10/native/device/plugins/jnext/auth.txt deleted file mode 100644 index 0983f4fcf..000000000 --- a/cordova-lib/spec-plugman/projects/blackberry10/native/device/plugins/jnext/auth.txt +++ /dev/null @@ -1,3 +0,0 @@ -local:/// * -file:// * -http:// * \ No newline at end of file diff --git a/cordova-lib/spec-plugman/projects/blackberry10/native/simulator/chrome/.gitkeep b/cordova-lib/spec-plugman/projects/blackberry10/native/simulator/chrome/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/cordova-lib/spec-plugman/projects/blackberry10/native/simulator/plugins/jnext/auth.txt b/cordova-lib/spec-plugman/projects/blackberry10/native/simulator/plugins/jnext/auth.txt deleted file mode 100644 index 0983f4fcf..000000000 --- a/cordova-lib/spec-plugman/projects/blackberry10/native/simulator/plugins/jnext/auth.txt +++ /dev/null @@ -1,3 +0,0 @@ -local:/// * -file:// * -http:// * \ No newline at end of file diff --git a/cordova-lib/spec-plugman/projects/blackberry10/www/config.xml b/cordova-lib/spec-plugman/projects/blackberry10/www/config.xml deleted file mode 100644 index 1dc8fe885..000000000 --- a/cordova-lib/spec-plugman/projects/blackberry10/www/config.xml +++ /dev/null @@ -1,97 +0,0 @@ - - - - - - - cordovaExample - - Your Name Here - - - A sample Apache Cordova application that responds to the deviceready event. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - use_camera - read_device_identifying_information - access_shared - read_geolocation - record_audio - access_pimdomain_contacts - - - diff --git a/cordova-lib/spec-plugman/projects/ios-config-xml/CordovaLib/CordovaLib.xcodeproj/project.pbxproj b/cordova-lib/spec-plugman/projects/ios-config-xml/CordovaLib/CordovaLib.xcodeproj/project.pbxproj deleted file mode 100644 index 5d0d46199..000000000 --- a/cordova-lib/spec-plugman/projects/ios-config-xml/CordovaLib/CordovaLib.xcodeproj/project.pbxproj +++ /dev/null @@ -1,636 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 46; - objects = { - -/* Begin PBXBuildFile section */ - 1F2BECC013F9785B00A93BF6 /* CDVBattery.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F2BECBE13F9785B00A93BF6 /* CDVBattery.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 1F2BECC113F9785B00A93BF6 /* CDVBattery.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F2BECBF13F9785B00A93BF6 /* CDVBattery.m */; }; - 1F3C04CE12BC247D004F9E10 /* CDVContact.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F3C04CC12BC247D004F9E10 /* CDVContact.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 1F3C04CF12BC247D004F9E10 /* CDVContact.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F3C04CD12BC247D004F9E10 /* CDVContact.m */; }; - 1F584B9B1385A28A00ED25E8 /* CDVCapture.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F584B991385A28900ED25E8 /* CDVCapture.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 1F584B9C1385A28A00ED25E8 /* CDVCapture.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F584B9A1385A28900ED25E8 /* CDVCapture.m */; }; - 1F92F4A01314023E0046367C /* CDVPluginResult.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F92F49E1314023E0046367C /* CDVPluginResult.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 1F92F4A11314023E0046367C /* CDVPluginResult.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F92F49F1314023E0046367C /* CDVPluginResult.m */; }; - 301F2F2A14F3C9CA003FE9FC /* CDV.h in Headers */ = {isa = PBXBuildFile; fileRef = 301F2F2914F3C9CA003FE9FC /* CDV.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 302965BC13A94E9D007046C5 /* CDVDebug.h in Headers */ = {isa = PBXBuildFile; fileRef = 302965BB13A94E9D007046C5 /* CDVDebug.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 3034979C1513D56A0090E688 /* CDVLocalStorage.h in Headers */ = {isa = PBXBuildFile; fileRef = 3034979A1513D56A0090E688 /* CDVLocalStorage.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 3034979E1513D56A0090E688 /* CDVLocalStorage.m in Sources */ = {isa = PBXBuildFile; fileRef = 3034979B1513D56A0090E688 /* CDVLocalStorage.m */; }; - 30392E4E14F4FCAB00B9E0B8 /* CDVAvailability.h in Headers */ = {isa = PBXBuildFile; fileRef = 30392E4D14F4FCAB00B9E0B8 /* CDVAvailability.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 3062D120151D0EDB000D9128 /* UIDevice+Extensions.h in Headers */ = {isa = PBXBuildFile; fileRef = 3062D11E151D0EDB000D9128 /* UIDevice+Extensions.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 3062D122151D0EDB000D9128 /* UIDevice+Extensions.m in Sources */ = {isa = PBXBuildFile; fileRef = 3062D11F151D0EDB000D9128 /* UIDevice+Extensions.m */; }; - 307A8F9E1385A2EC00E43782 /* CDVConnection.h in Headers */ = {isa = PBXBuildFile; fileRef = 307A8F9C1385A2EC00E43782 /* CDVConnection.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 307A8F9F1385A2EC00E43782 /* CDVConnection.m in Sources */ = {isa = PBXBuildFile; fileRef = 307A8F9D1385A2EC00E43782 /* CDVConnection.m */; }; - 30A90B9114588697006178D3 /* JSONKit.h in Headers */ = {isa = PBXBuildFile; fileRef = 30A90B8F14588697006178D3 /* JSONKit.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 30A90B9314588697006178D3 /* JSONKit.m in Sources */ = {isa = PBXBuildFile; fileRef = 30A90B9014588697006178D3 /* JSONKit.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; - 30B39EBE13D0268B0009682A /* CDVSplashScreen.h in Headers */ = {isa = PBXBuildFile; fileRef = 30B39EBC13D0268B0009682A /* CDVSplashScreen.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 30B39EBF13D0268B0009682A /* CDVSplashScreen.m in Sources */ = {isa = PBXBuildFile; fileRef = 30B39EBD13D0268B0009682A /* CDVSplashScreen.m */; }; - 30C5F1DF15AF9E950052A00D /* CDVDevice.h in Headers */ = {isa = PBXBuildFile; fileRef = 30C5F1DD15AF9E950052A00D /* CDVDevice.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 30C5F1E015AF9E950052A00D /* CDVDevice.m in Sources */ = {isa = PBXBuildFile; fileRef = 30C5F1DE15AF9E950052A00D /* CDVDevice.m */; }; - 30C684801406CB38004C1A8E /* CDVWhitelist.h in Headers */ = {isa = PBXBuildFile; fileRef = 30C6847E1406CB38004C1A8E /* CDVWhitelist.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 30C684821406CB38004C1A8E /* CDVWhitelist.m in Sources */ = {isa = PBXBuildFile; fileRef = 30C6847F1406CB38004C1A8E /* CDVWhitelist.m */; }; - 30C684941407044B004C1A8E /* CDVURLProtocol.h in Headers */ = {isa = PBXBuildFile; fileRef = 30C684921407044A004C1A8E /* CDVURLProtocol.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 30C684961407044B004C1A8E /* CDVURLProtocol.m in Sources */ = {isa = PBXBuildFile; fileRef = 30C684931407044A004C1A8E /* CDVURLProtocol.m */; }; - 30E33AF213A7E24B00594D64 /* CDVPlugin.h in Headers */ = {isa = PBXBuildFile; fileRef = 30E33AF013A7E24B00594D64 /* CDVPlugin.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 30E33AF313A7E24B00594D64 /* CDVPlugin.m in Sources */ = {isa = PBXBuildFile; fileRef = 30E33AF113A7E24B00594D64 /* CDVPlugin.m */; }; - 30E563CF13E217EC00C949AA /* NSMutableArray+QueueAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = 30E563CD13E217EC00C949AA /* NSMutableArray+QueueAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 30E563D013E217EC00C949AA /* NSMutableArray+QueueAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 30E563CE13E217EC00C949AA /* NSMutableArray+QueueAdditions.m */; }; - 30F5EBAB14CA26E700987760 /* CDVCommandDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = 30F5EBA914CA26E700987760 /* CDVCommandDelegate.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 3E76876D156A90EE00EB6FA3 /* CDVLogger.m in Sources */ = {isa = PBXBuildFile; fileRef = 3E76876B156A90EE00EB6FA3 /* CDVLogger.m */; }; - 3E76876F156A90EE00EB6FA3 /* CDVLogger.h in Headers */ = {isa = PBXBuildFile; fileRef = 3E76876C156A90EE00EB6FA3 /* CDVLogger.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 8852C43A14B65FD800F0E735 /* CDVViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 8852C43614B65FD800F0E735 /* CDVViewController.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 8852C43C14B65FD800F0E735 /* CDVViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 8852C43714B65FD800F0E735 /* CDVViewController.m */; }; - 8852C43F14B65FD800F0E735 /* CDVCordovaView.h in Headers */ = {isa = PBXBuildFile; fileRef = 8852C43814B65FD800F0E735 /* CDVCordovaView.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 8852C44114B65FD800F0E735 /* CDVCordovaView.m in Sources */ = {isa = PBXBuildFile; fileRef = 8852C43914B65FD800F0E735 /* CDVCordovaView.m */; }; - 8887FD661090FBE7009987E8 /* CDVCamera.h in Headers */ = {isa = PBXBuildFile; fileRef = 8887FD261090FBE7009987E8 /* CDVCamera.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 8887FD671090FBE7009987E8 /* CDVCamera.m in Sources */ = {isa = PBXBuildFile; fileRef = 8887FD271090FBE7009987E8 /* CDVCamera.m */; }; - 8887FD681090FBE7009987E8 /* NSDictionary+Extensions.h in Headers */ = {isa = PBXBuildFile; fileRef = 8887FD281090FBE7009987E8 /* NSDictionary+Extensions.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 8887FD691090FBE7009987E8 /* NSDictionary+Extensions.m in Sources */ = {isa = PBXBuildFile; fileRef = 8887FD291090FBE7009987E8 /* NSDictionary+Extensions.m */; }; - 8887FD6A1090FBE7009987E8 /* CDVContacts.h in Headers */ = {isa = PBXBuildFile; fileRef = 8887FD2A1090FBE7009987E8 /* CDVContacts.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 8887FD6B1090FBE7009987E8 /* CDVContacts.m in Sources */ = {isa = PBXBuildFile; fileRef = 8887FD2B1090FBE7009987E8 /* CDVContacts.m */; }; - 8887FD6C1090FBE7009987E8 /* CDVDebugConsole.h in Headers */ = {isa = PBXBuildFile; fileRef = 8887FD2C1090FBE7009987E8 /* CDVDebugConsole.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 8887FD6D1090FBE7009987E8 /* CDVDebugConsole.m in Sources */ = {isa = PBXBuildFile; fileRef = 8887FD2D1090FBE7009987E8 /* CDVDebugConsole.m */; }; - 8887FD701090FBE7009987E8 /* CDVFile.h in Headers */ = {isa = PBXBuildFile; fileRef = 8887FD301090FBE7009987E8 /* CDVFile.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 8887FD711090FBE7009987E8 /* CDVFile.m in Sources */ = {isa = PBXBuildFile; fileRef = 8887FD311090FBE7009987E8 /* CDVFile.m */; }; - 8887FD741090FBE7009987E8 /* CDVInvokedUrlCommand.h in Headers */ = {isa = PBXBuildFile; fileRef = 8887FD341090FBE7009987E8 /* CDVInvokedUrlCommand.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 8887FD751090FBE7009987E8 /* CDVInvokedUrlCommand.m in Sources */ = {isa = PBXBuildFile; fileRef = 8887FD351090FBE7009987E8 /* CDVInvokedUrlCommand.m */; }; - 8887FD851090FBE7009987E8 /* CDVLocation.h in Headers */ = {isa = PBXBuildFile; fileRef = 8887FD461090FBE7009987E8 /* CDVLocation.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 8887FD861090FBE7009987E8 /* CDVLocation.m in Sources */ = {isa = PBXBuildFile; fileRef = 8887FD471090FBE7009987E8 /* CDVLocation.m */; }; - 8887FD8D1090FBE7009987E8 /* CDVNotification.h in Headers */ = {isa = PBXBuildFile; fileRef = 8887FD4E1090FBE7009987E8 /* CDVNotification.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 8887FD8E1090FBE7009987E8 /* CDVNotification.m in Sources */ = {isa = PBXBuildFile; fileRef = 8887FD4F1090FBE7009987E8 /* CDVNotification.m */; }; - 8887FD8F1090FBE7009987E8 /* NSData+Base64.h in Headers */ = {isa = PBXBuildFile; fileRef = 8887FD501090FBE7009987E8 /* NSData+Base64.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 8887FD901090FBE7009987E8 /* NSData+Base64.m in Sources */ = {isa = PBXBuildFile; fileRef = 8887FD511090FBE7009987E8 /* NSData+Base64.m */; }; - 8887FD9D1090FBE7009987E8 /* CDVReachability.h in Headers */ = {isa = PBXBuildFile; fileRef = 8887FD5E1090FBE7009987E8 /* CDVReachability.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 8887FD9E1090FBE7009987E8 /* CDVReachability.m in Sources */ = {isa = PBXBuildFile; fileRef = 8887FD5F1090FBE7009987E8 /* CDVReachability.m */; }; - 8887FD9F1090FBE7009987E8 /* CDVSound.h in Headers */ = {isa = PBXBuildFile; fileRef = 8887FD601090FBE7009987E8 /* CDVSound.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 8887FDA01090FBE7009987E8 /* CDVSound.m in Sources */ = {isa = PBXBuildFile; fileRef = 8887FD611090FBE7009987E8 /* CDVSound.m */; }; - 88BA573D109BB46F00FB5E78 /* CDVAccelerometer.h in Headers */ = {isa = PBXBuildFile; fileRef = 88BA573B109BB46F00FB5E78 /* CDVAccelerometer.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 88BA573E109BB46F00FB5E78 /* CDVAccelerometer.m in Sources */ = {isa = PBXBuildFile; fileRef = 88BA573C109BB46F00FB5E78 /* CDVAccelerometer.m */; }; - 9D76CF3C1625A4C50008A0F6 /* CDVGlobalization.h in Headers */ = {isa = PBXBuildFile; fileRef = 9D76CF3A1625A4C50008A0F6 /* CDVGlobalization.h */; }; - 9D76CF3D1625A4C50008A0F6 /* CDVGlobalization.m in Sources */ = {isa = PBXBuildFile; fileRef = 9D76CF3B1625A4C50008A0F6 /* CDVGlobalization.m */; }; - C937A4561337599E002C4C79 /* CDVFileTransfer.h in Headers */ = {isa = PBXBuildFile; fileRef = C937A4541337599E002C4C79 /* CDVFileTransfer.h */; settings = {ATTRIBUTES = (Public, ); }; }; - C937A4571337599E002C4C79 /* CDVFileTransfer.m in Sources */ = {isa = PBXBuildFile; fileRef = C937A4551337599E002C4C79 /* CDVFileTransfer.m */; }; - EB3B3547161CB44D003DBE7D /* CDVCommandQueue.h in Headers */ = {isa = PBXBuildFile; fileRef = EB3B3545161CB44D003DBE7D /* CDVCommandQueue.h */; }; - EB3B3548161CB44D003DBE7D /* CDVCommandQueue.m in Sources */ = {isa = PBXBuildFile; fileRef = EB3B3546161CB44D003DBE7D /* CDVCommandQueue.m */; }; - EB3B357C161F2A45003DBE7D /* CDVCommandDelegateImpl.h in Headers */ = {isa = PBXBuildFile; fileRef = EB3B357A161F2A44003DBE7D /* CDVCommandDelegateImpl.h */; }; - EB3B357D161F2A45003DBE7D /* CDVCommandDelegateImpl.m in Sources */ = {isa = PBXBuildFile; fileRef = EB3B357B161F2A45003DBE7D /* CDVCommandDelegateImpl.m */; }; - EB80C2AC15DEA63D004D9E7B /* CDVEcho.h in Headers */ = {isa = PBXBuildFile; fileRef = EB80C2AA15DEA63D004D9E7B /* CDVEcho.h */; }; - EB80C2AD15DEA63D004D9E7B /* CDVEcho.m in Sources */ = {isa = PBXBuildFile; fileRef = EB80C2AB15DEA63D004D9E7B /* CDVEcho.m */; }; - EBA3557315ABD38C00F4DE24 /* NSArray+Comparisons.h in Headers */ = {isa = PBXBuildFile; fileRef = EBA3557115ABD38C00F4DE24 /* NSArray+Comparisons.h */; settings = {ATTRIBUTES = (Public, ); }; }; - EBA3557515ABD38C00F4DE24 /* NSArray+Comparisons.m in Sources */ = {isa = PBXBuildFile; fileRef = EBA3557215ABD38C00F4DE24 /* NSArray+Comparisons.m */; }; -/* End PBXBuildFile section */ - -/* Begin PBXFileReference section */ - 1F2BECBE13F9785B00A93BF6 /* CDVBattery.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDVBattery.h; path = Classes/CDVBattery.h; sourceTree = ""; }; - 1F2BECBF13F9785B00A93BF6 /* CDVBattery.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CDVBattery.m; path = Classes/CDVBattery.m; sourceTree = ""; }; - 1F3C04CC12BC247D004F9E10 /* CDVContact.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDVContact.h; path = Classes/CDVContact.h; sourceTree = ""; }; - 1F3C04CD12BC247D004F9E10 /* CDVContact.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CDVContact.m; path = Classes/CDVContact.m; sourceTree = ""; }; - 1F584B991385A28900ED25E8 /* CDVCapture.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDVCapture.h; path = Classes/CDVCapture.h; sourceTree = ""; }; - 1F584B9A1385A28900ED25E8 /* CDVCapture.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CDVCapture.m; path = Classes/CDVCapture.m; sourceTree = ""; }; - 1F92F49E1314023E0046367C /* CDVPluginResult.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDVPluginResult.h; path = Classes/CDVPluginResult.h; sourceTree = ""; }; - 1F92F49F1314023E0046367C /* CDVPluginResult.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CDVPluginResult.m; path = Classes/CDVPluginResult.m; sourceTree = ""; }; - 301F2F2914F3C9CA003FE9FC /* CDV.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDV.h; path = Classes/CDV.h; sourceTree = ""; }; - 302965BB13A94E9D007046C5 /* CDVDebug.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDVDebug.h; path = Classes/CDVDebug.h; sourceTree = ""; }; - 30325A0B136B343700982B63 /* VERSION */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = VERSION; sourceTree = ""; }; - 3034979A1513D56A0090E688 /* CDVLocalStorage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDVLocalStorage.h; path = Classes/CDVLocalStorage.h; sourceTree = ""; }; - 3034979B1513D56A0090E688 /* CDVLocalStorage.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CDVLocalStorage.m; path = Classes/CDVLocalStorage.m; sourceTree = ""; }; - 30392E4D14F4FCAB00B9E0B8 /* CDVAvailability.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDVAvailability.h; path = Classes/CDVAvailability.h; sourceTree = ""; }; - 3062D11E151D0EDB000D9128 /* UIDevice+Extensions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "UIDevice+Extensions.h"; path = "Classes/UIDevice+Extensions.h"; sourceTree = ""; }; - 3062D11F151D0EDB000D9128 /* UIDevice+Extensions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "UIDevice+Extensions.m"; path = "Classes/UIDevice+Extensions.m"; sourceTree = ""; }; - 307A8F9C1385A2EC00E43782 /* CDVConnection.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDVConnection.h; path = Classes/CDVConnection.h; sourceTree = ""; }; - 307A8F9D1385A2EC00E43782 /* CDVConnection.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CDVConnection.m; path = Classes/CDVConnection.m; sourceTree = ""; }; - 30A90B8F14588697006178D3 /* JSONKit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSONKit.h; sourceTree = ""; }; - 30A90B9014588697006178D3 /* JSONKit.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSONKit.m; sourceTree = ""; }; - 30B39EBC13D0268B0009682A /* CDVSplashScreen.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDVSplashScreen.h; path = Classes/CDVSplashScreen.h; sourceTree = ""; }; - 30B39EBD13D0268B0009682A /* CDVSplashScreen.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CDVSplashScreen.m; path = Classes/CDVSplashScreen.m; sourceTree = ""; }; - 30C5F1DD15AF9E950052A00D /* CDVDevice.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDVDevice.h; path = Classes/CDVDevice.h; sourceTree = ""; }; - 30C5F1DE15AF9E950052A00D /* CDVDevice.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CDVDevice.m; path = Classes/CDVDevice.m; sourceTree = ""; }; - 30C6847E1406CB38004C1A8E /* CDVWhitelist.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDVWhitelist.h; path = Classes/CDVWhitelist.h; sourceTree = ""; }; - 30C6847F1406CB38004C1A8E /* CDVWhitelist.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CDVWhitelist.m; path = Classes/CDVWhitelist.m; sourceTree = ""; }; - 30C684921407044A004C1A8E /* CDVURLProtocol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDVURLProtocol.h; path = Classes/CDVURLProtocol.h; sourceTree = ""; }; - 30C684931407044A004C1A8E /* CDVURLProtocol.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CDVURLProtocol.m; path = Classes/CDVURLProtocol.m; sourceTree = ""; }; - 30E33AF013A7E24B00594D64 /* CDVPlugin.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDVPlugin.h; path = Classes/CDVPlugin.h; sourceTree = ""; }; - 30E33AF113A7E24B00594D64 /* CDVPlugin.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CDVPlugin.m; path = Classes/CDVPlugin.m; sourceTree = ""; }; - 30E563CD13E217EC00C949AA /* NSMutableArray+QueueAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "NSMutableArray+QueueAdditions.h"; path = "Classes/NSMutableArray+QueueAdditions.h"; sourceTree = ""; }; - 30E563CE13E217EC00C949AA /* NSMutableArray+QueueAdditions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "NSMutableArray+QueueAdditions.m"; path = "Classes/NSMutableArray+QueueAdditions.m"; sourceTree = ""; }; - 30F5EBA914CA26E700987760 /* CDVCommandDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDVCommandDelegate.h; path = Classes/CDVCommandDelegate.h; sourceTree = ""; }; - 3E76876B156A90EE00EB6FA3 /* CDVLogger.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CDVLogger.m; path = Classes/CDVLogger.m; sourceTree = ""; }; - 3E76876C156A90EE00EB6FA3 /* CDVLogger.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDVLogger.h; path = Classes/CDVLogger.h; sourceTree = ""; }; - 686357AA141002F100DF4CF2 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; - 686357AC141002F100DF4CF2 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; - 686357AE141002F100DF4CF2 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; - 686357CC14100AAD00DF4CF2 /* AddressBookUI.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AddressBookUI.framework; path = System/Library/Frameworks/AddressBookUI.framework; sourceTree = SDKROOT; }; - 686357CE14100ADA00DF4CF2 /* AudioToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = System/Library/Frameworks/AudioToolbox.framework; sourceTree = SDKROOT; }; - 686357CF14100ADB00DF4CF2 /* AVFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVFoundation.framework; path = System/Library/Frameworks/AVFoundation.framework; sourceTree = SDKROOT; }; - 686357D014100ADE00DF4CF2 /* CoreLocation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreLocation.framework; path = System/Library/Frameworks/CoreLocation.framework; sourceTree = SDKROOT; }; - 686357D214100AE700DF4CF2 /* MobileCoreServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MobileCoreServices.framework; path = System/Library/Frameworks/MobileCoreServices.framework; sourceTree = SDKROOT; }; - 686357D414100AF200DF4CF2 /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = System/Library/Frameworks/SystemConfiguration.framework; sourceTree = SDKROOT; }; - 686357DC14100B1600DF4CF2 /* CoreMedia.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMedia.framework; path = System/Library/Frameworks/CoreMedia.framework; sourceTree = SDKROOT; }; - 68A32D7114102E1C006B237C /* libCordova.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libCordova.a; sourceTree = BUILT_PRODUCTS_DIR; }; - 68A32D7414103017006B237C /* AddressBook.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AddressBook.framework; path = System/Library/Frameworks/AddressBook.framework; sourceTree = SDKROOT; }; - 8852C43614B65FD800F0E735 /* CDVViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDVViewController.h; path = Classes/CDVViewController.h; sourceTree = ""; }; - 8852C43714B65FD800F0E735 /* CDVViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CDVViewController.m; path = Classes/CDVViewController.m; sourceTree = ""; }; - 8852C43814B65FD800F0E735 /* CDVCordovaView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDVCordovaView.h; path = Classes/CDVCordovaView.h; sourceTree = ""; }; - 8852C43914B65FD800F0E735 /* CDVCordovaView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CDVCordovaView.m; path = Classes/CDVCordovaView.m; sourceTree = ""; }; - 8887FD261090FBE7009987E8 /* CDVCamera.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDVCamera.h; path = Classes/CDVCamera.h; sourceTree = ""; }; - 8887FD271090FBE7009987E8 /* CDVCamera.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CDVCamera.m; path = Classes/CDVCamera.m; sourceTree = ""; }; - 8887FD281090FBE7009987E8 /* NSDictionary+Extensions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "NSDictionary+Extensions.h"; path = "Classes/NSDictionary+Extensions.h"; sourceTree = ""; }; - 8887FD291090FBE7009987E8 /* NSDictionary+Extensions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "NSDictionary+Extensions.m"; path = "Classes/NSDictionary+Extensions.m"; sourceTree = ""; }; - 8887FD2A1090FBE7009987E8 /* CDVContacts.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDVContacts.h; path = Classes/CDVContacts.h; sourceTree = ""; }; - 8887FD2B1090FBE7009987E8 /* CDVContacts.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CDVContacts.m; path = Classes/CDVContacts.m; sourceTree = ""; }; - 8887FD2C1090FBE7009987E8 /* CDVDebugConsole.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDVDebugConsole.h; path = Classes/CDVDebugConsole.h; sourceTree = ""; }; - 8887FD2D1090FBE7009987E8 /* CDVDebugConsole.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CDVDebugConsole.m; path = Classes/CDVDebugConsole.m; sourceTree = ""; }; - 8887FD301090FBE7009987E8 /* CDVFile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDVFile.h; path = Classes/CDVFile.h; sourceTree = ""; }; - 8887FD311090FBE7009987E8 /* CDVFile.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CDVFile.m; path = Classes/CDVFile.m; sourceTree = ""; }; - 8887FD341090FBE7009987E8 /* CDVInvokedUrlCommand.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDVInvokedUrlCommand.h; path = Classes/CDVInvokedUrlCommand.h; sourceTree = ""; }; - 8887FD351090FBE7009987E8 /* CDVInvokedUrlCommand.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CDVInvokedUrlCommand.m; path = Classes/CDVInvokedUrlCommand.m; sourceTree = ""; }; - 8887FD461090FBE7009987E8 /* CDVLocation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDVLocation.h; path = Classes/CDVLocation.h; sourceTree = ""; }; - 8887FD471090FBE7009987E8 /* CDVLocation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CDVLocation.m; path = Classes/CDVLocation.m; sourceTree = ""; }; - 8887FD4E1090FBE7009987E8 /* CDVNotification.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDVNotification.h; path = Classes/CDVNotification.h; sourceTree = ""; }; - 8887FD4F1090FBE7009987E8 /* CDVNotification.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CDVNotification.m; path = Classes/CDVNotification.m; sourceTree = ""; }; - 8887FD501090FBE7009987E8 /* NSData+Base64.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "NSData+Base64.h"; path = "Classes/NSData+Base64.h"; sourceTree = ""; }; - 8887FD511090FBE7009987E8 /* NSData+Base64.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "NSData+Base64.m"; path = "Classes/NSData+Base64.m"; sourceTree = ""; }; - 8887FD5E1090FBE7009987E8 /* CDVReachability.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDVReachability.h; path = Classes/CDVReachability.h; sourceTree = ""; }; - 8887FD5F1090FBE7009987E8 /* CDVReachability.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CDVReachability.m; path = Classes/CDVReachability.m; sourceTree = ""; }; - 8887FD601090FBE7009987E8 /* CDVSound.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDVSound.h; path = Classes/CDVSound.h; sourceTree = ""; }; - 8887FD611090FBE7009987E8 /* CDVSound.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CDVSound.m; path = Classes/CDVSound.m; sourceTree = ""; }; - 88BA573B109BB46F00FB5E78 /* CDVAccelerometer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDVAccelerometer.h; path = Classes/CDVAccelerometer.h; sourceTree = ""; }; - 88BA573C109BB46F00FB5E78 /* CDVAccelerometer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CDVAccelerometer.m; path = Classes/CDVAccelerometer.m; sourceTree = ""; }; - 9D76CF3A1625A4C50008A0F6 /* CDVGlobalization.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDVGlobalization.h; path = Classes/CDVGlobalization.h; sourceTree = ""; }; - 9D76CF3B1625A4C50008A0F6 /* CDVGlobalization.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CDVGlobalization.m; path = Classes/CDVGlobalization.m; sourceTree = ""; }; - AA747D9E0F9514B9006C5449 /* CordovaLib_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CordovaLib_Prefix.pch; sourceTree = SOURCE_ROOT; }; - C937A4541337599E002C4C79 /* CDVFileTransfer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDVFileTransfer.h; path = Classes/CDVFileTransfer.h; sourceTree = ""; }; - C937A4551337599E002C4C79 /* CDVFileTransfer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CDVFileTransfer.m; path = Classes/CDVFileTransfer.m; sourceTree = ""; }; - EB3B3545161CB44D003DBE7D /* CDVCommandQueue.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDVCommandQueue.h; path = Classes/CDVCommandQueue.h; sourceTree = ""; }; - EB3B3546161CB44D003DBE7D /* CDVCommandQueue.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CDVCommandQueue.m; path = Classes/CDVCommandQueue.m; sourceTree = ""; }; - EB3B357A161F2A44003DBE7D /* CDVCommandDelegateImpl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDVCommandDelegateImpl.h; path = Classes/CDVCommandDelegateImpl.h; sourceTree = ""; }; - EB3B357B161F2A45003DBE7D /* CDVCommandDelegateImpl.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CDVCommandDelegateImpl.m; path = Classes/CDVCommandDelegateImpl.m; sourceTree = ""; }; - EB80C2AA15DEA63D004D9E7B /* CDVEcho.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDVEcho.h; path = Classes/CDVEcho.h; sourceTree = ""; }; - EB80C2AB15DEA63D004D9E7B /* CDVEcho.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CDVEcho.m; path = Classes/CDVEcho.m; sourceTree = ""; }; - EBA3557115ABD38C00F4DE24 /* NSArray+Comparisons.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "NSArray+Comparisons.h"; path = "Classes/NSArray+Comparisons.h"; sourceTree = ""; }; - EBA3557215ABD38C00F4DE24 /* NSArray+Comparisons.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "NSArray+Comparisons.m"; path = "Classes/NSArray+Comparisons.m"; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - D2AAC07C0554694100DB518D /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 034768DFFF38A50411DB9C8B /* Products */ = { - isa = PBXGroup; - children = ( - 68A32D7114102E1C006B237C /* libCordova.a */, - ); - name = Products; - sourceTree = CORDOVALIB; - }; - 0867D691FE84028FC02AAC07 /* CordovaLib */ = { - isa = PBXGroup; - children = ( - 8887FD101090FB43009987E8 /* Classes */, - 32C88DFF0371C24200C91783 /* Other Sources */, - 0867D69AFE84028FC02AAC07 /* Frameworks */, - 034768DFFF38A50411DB9C8B /* Products */, - 30325A0B136B343700982B63 /* VERSION */, - ); - name = CordovaLib; - sourceTree = ""; - }; - 0867D69AFE84028FC02AAC07 /* Frameworks */ = { - isa = PBXGroup; - children = ( - 68A32D7414103017006B237C /* AddressBook.framework */, - 686357DC14100B1600DF4CF2 /* CoreMedia.framework */, - 686357CE14100ADA00DF4CF2 /* AudioToolbox.framework */, - 686357CF14100ADB00DF4CF2 /* AVFoundation.framework */, - 686357D014100ADE00DF4CF2 /* CoreLocation.framework */, - 686357D214100AE700DF4CF2 /* MobileCoreServices.framework */, - 686357D414100AF200DF4CF2 /* SystemConfiguration.framework */, - 686357CC14100AAD00DF4CF2 /* AddressBookUI.framework */, - 686357AA141002F100DF4CF2 /* UIKit.framework */, - 686357AC141002F100DF4CF2 /* Foundation.framework */, - 686357AE141002F100DF4CF2 /* CoreGraphics.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; - 3054098714B77FF3009841CA /* Cleaver */ = { - isa = PBXGroup; - children = ( - 8852C43614B65FD800F0E735 /* CDVViewController.h */, - 8852C43714B65FD800F0E735 /* CDVViewController.m */, - 8852C43814B65FD800F0E735 /* CDVCordovaView.h */, - 8852C43914B65FD800F0E735 /* CDVCordovaView.m */, - EB3B3545161CB44D003DBE7D /* CDVCommandQueue.h */, - EB3B3546161CB44D003DBE7D /* CDVCommandQueue.m */, - ); - name = Cleaver; - sourceTree = ""; - }; - 32C88DFF0371C24200C91783 /* Other Sources */ = { - isa = PBXGroup; - children = ( - AA747D9E0F9514B9006C5449 /* CordovaLib_Prefix.pch */, - ); - name = "Other Sources"; - sourceTree = ""; - }; - 888700D710922F56009987E8 /* Commands */ = { - isa = PBXGroup; - children = ( - 30C5F1DD15AF9E950052A00D /* CDVDevice.h */, - 30C5F1DE15AF9E950052A00D /* CDVDevice.m */, - 301F2F2914F3C9CA003FE9FC /* CDV.h */, - 3034979A1513D56A0090E688 /* CDVLocalStorage.h */, - 3034979B1513D56A0090E688 /* CDVLocalStorage.m */, - 30392E4D14F4FCAB00B9E0B8 /* CDVAvailability.h */, - 30F5EBA914CA26E700987760 /* CDVCommandDelegate.h */, - EB3B357A161F2A44003DBE7D /* CDVCommandDelegateImpl.h */, - EB3B357B161F2A45003DBE7D /* CDVCommandDelegateImpl.m */, - 30C684921407044A004C1A8E /* CDVURLProtocol.h */, - 30C684931407044A004C1A8E /* CDVURLProtocol.m */, - 30C6847E1406CB38004C1A8E /* CDVWhitelist.h */, - 30C6847F1406CB38004C1A8E /* CDVWhitelist.m */, - 1F2BECBE13F9785B00A93BF6 /* CDVBattery.h */, - 1F2BECBF13F9785B00A93BF6 /* CDVBattery.m */, - 30B39EBC13D0268B0009682A /* CDVSplashScreen.h */, - 30B39EBD13D0268B0009682A /* CDVSplashScreen.m */, - 30E33AF013A7E24B00594D64 /* CDVPlugin.h */, - 30E33AF113A7E24B00594D64 /* CDVPlugin.m */, - 307A8F9C1385A2EC00E43782 /* CDVConnection.h */, - 307A8F9D1385A2EC00E43782 /* CDVConnection.m */, - 1F92F49E1314023E0046367C /* CDVPluginResult.h */, - 1F92F49F1314023E0046367C /* CDVPluginResult.m */, - 88BA573B109BB46F00FB5E78 /* CDVAccelerometer.h */, - 88BA573C109BB46F00FB5E78 /* CDVAccelerometer.m */, - 8887FD261090FBE7009987E8 /* CDVCamera.h */, - 8887FD271090FBE7009987E8 /* CDVCamera.m */, - 1F584B991385A28900ED25E8 /* CDVCapture.h */, - 1F584B9A1385A28900ED25E8 /* CDVCapture.m */, - 1F3C04CC12BC247D004F9E10 /* CDVContact.h */, - 1F3C04CD12BC247D004F9E10 /* CDVContact.m */, - 8887FD2A1090FBE7009987E8 /* CDVContacts.h */, - 8887FD2B1090FBE7009987E8 /* CDVContacts.m */, - 8887FD2C1090FBE7009987E8 /* CDVDebugConsole.h */, - 8887FD2D1090FBE7009987E8 /* CDVDebugConsole.m */, - EB80C2AA15DEA63D004D9E7B /* CDVEcho.h */, - EB80C2AB15DEA63D004D9E7B /* CDVEcho.m */, - 8887FD301090FBE7009987E8 /* CDVFile.h */, - 8887FD311090FBE7009987E8 /* CDVFile.m */, - 8887FD341090FBE7009987E8 /* CDVInvokedUrlCommand.h */, - 8887FD351090FBE7009987E8 /* CDVInvokedUrlCommand.m */, - C937A4541337599E002C4C79 /* CDVFileTransfer.h */, - C937A4551337599E002C4C79 /* CDVFileTransfer.m */, - 8887FD461090FBE7009987E8 /* CDVLocation.h */, - 8887FD471090FBE7009987E8 /* CDVLocation.m */, - 8887FD4E1090FBE7009987E8 /* CDVNotification.h */, - 8887FD4F1090FBE7009987E8 /* CDVNotification.m */, - 8887FD5E1090FBE7009987E8 /* CDVReachability.h */, - 8887FD5F1090FBE7009987E8 /* CDVReachability.m */, - 8887FD601090FBE7009987E8 /* CDVSound.h */, - 8887FD611090FBE7009987E8 /* CDVSound.m */, - 3E76876B156A90EE00EB6FA3 /* CDVLogger.m */, - 3E76876C156A90EE00EB6FA3 /* CDVLogger.h */, - 9D76CF3A1625A4C50008A0F6 /* CDVGlobalization.h */, - 9D76CF3B1625A4C50008A0F6 /* CDVGlobalization.m */, - ); - name = Commands; - sourceTree = ""; - }; - 888700D910923009009987E8 /* Util */ = { - isa = PBXGroup; - children = ( - 3062D11E151D0EDB000D9128 /* UIDevice+Extensions.h */, - 3062D11F151D0EDB000D9128 /* UIDevice+Extensions.m */, - EBA3557115ABD38C00F4DE24 /* NSArray+Comparisons.h */, - EBA3557215ABD38C00F4DE24 /* NSArray+Comparisons.m */, - 8887FD281090FBE7009987E8 /* NSDictionary+Extensions.h */, - 8887FD291090FBE7009987E8 /* NSDictionary+Extensions.m */, - 302965BB13A94E9D007046C5 /* CDVDebug.h */, - 30E563CD13E217EC00C949AA /* NSMutableArray+QueueAdditions.h */, - 30E563CE13E217EC00C949AA /* NSMutableArray+QueueAdditions.m */, - 8887FD501090FBE7009987E8 /* NSData+Base64.h */, - 8887FD511090FBE7009987E8 /* NSData+Base64.m */, - ); - name = Util; - sourceTree = ""; - }; - 8887FD101090FB43009987E8 /* Classes */ = { - isa = PBXGroup; - children = ( - 3054098714B77FF3009841CA /* Cleaver */, - 888700D710922F56009987E8 /* Commands */, - 8887FD361090FBE7009987E8 /* JSON */, - 888700D910923009009987E8 /* Util */, - ); - name = Classes; - sourceTree = ""; - }; - 8887FD361090FBE7009987E8 /* JSON */ = { - isa = PBXGroup; - children = ( - 30A90B8F14588697006178D3 /* JSONKit.h */, - 30A90B9014588697006178D3 /* JSONKit.m */, - ); - name = JSON; - path = Classes/JSON; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXHeadersBuildPhase section */ - D2AAC07A0554694100DB518D /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - 8887FD661090FBE7009987E8 /* CDVCamera.h in Headers */, - 8887FD681090FBE7009987E8 /* NSDictionary+Extensions.h in Headers */, - 8887FD6A1090FBE7009987E8 /* CDVContacts.h in Headers */, - 8887FD6C1090FBE7009987E8 /* CDVDebugConsole.h in Headers */, - 8887FD701090FBE7009987E8 /* CDVFile.h in Headers */, - 8887FD741090FBE7009987E8 /* CDVInvokedUrlCommand.h in Headers */, - 8887FD851090FBE7009987E8 /* CDVLocation.h in Headers */, - 8887FD8D1090FBE7009987E8 /* CDVNotification.h in Headers */, - 8887FD8F1090FBE7009987E8 /* NSData+Base64.h in Headers */, - 8887FD9D1090FBE7009987E8 /* CDVReachability.h in Headers */, - 8887FD9F1090FBE7009987E8 /* CDVSound.h in Headers */, - 88BA573D109BB46F00FB5E78 /* CDVAccelerometer.h in Headers */, - 1F3C04CE12BC247D004F9E10 /* CDVContact.h in Headers */, - 1F92F4A01314023E0046367C /* CDVPluginResult.h in Headers */, - C937A4561337599E002C4C79 /* CDVFileTransfer.h in Headers */, - 307A8F9E1385A2EC00E43782 /* CDVConnection.h in Headers */, - 1F584B9B1385A28A00ED25E8 /* CDVCapture.h in Headers */, - 30E33AF213A7E24B00594D64 /* CDVPlugin.h in Headers */, - 302965BC13A94E9D007046C5 /* CDVDebug.h in Headers */, - 30B39EBE13D0268B0009682A /* CDVSplashScreen.h in Headers */, - 30E563CF13E217EC00C949AA /* NSMutableArray+QueueAdditions.h in Headers */, - 1F2BECC013F9785B00A93BF6 /* CDVBattery.h in Headers */, - 30C684801406CB38004C1A8E /* CDVWhitelist.h in Headers */, - 30C684941407044B004C1A8E /* CDVURLProtocol.h in Headers */, - 30A90B9114588697006178D3 /* JSONKit.h in Headers */, - 8852C43A14B65FD800F0E735 /* CDVViewController.h in Headers */, - 8852C43F14B65FD800F0E735 /* CDVCordovaView.h in Headers */, - 30F5EBAB14CA26E700987760 /* CDVCommandDelegate.h in Headers */, - 301F2F2A14F3C9CA003FE9FC /* CDV.h in Headers */, - 30392E4E14F4FCAB00B9E0B8 /* CDVAvailability.h in Headers */, - 3034979C1513D56A0090E688 /* CDVLocalStorage.h in Headers */, - 3062D120151D0EDB000D9128 /* UIDevice+Extensions.h in Headers */, - 3E76876F156A90EE00EB6FA3 /* CDVLogger.h in Headers */, - EBA3557315ABD38C00F4DE24 /* NSArray+Comparisons.h in Headers */, - 30C5F1DF15AF9E950052A00D /* CDVDevice.h in Headers */, - EB80C2AC15DEA63D004D9E7B /* CDVEcho.h in Headers */, - EB3B3547161CB44D003DBE7D /* CDVCommandQueue.h in Headers */, - EB3B357C161F2A45003DBE7D /* CDVCommandDelegateImpl.h in Headers */, - 9D76CF3C1625A4C50008A0F6 /* CDVGlobalization.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXHeadersBuildPhase section */ - -/* Begin PBXNativeTarget section */ - D2AAC07D0554694100DB518D /* CordovaLib */ = { - isa = PBXNativeTarget; - buildConfigurationList = 1DEB921E08733DC00010E9CD /* Build configuration list for PBXNativeTarget "CordovaLib" */; - buildPhases = ( - D2AAC07A0554694100DB518D /* Headers */, - D2AAC07B0554694100DB518D /* Sources */, - D2AAC07C0554694100DB518D /* Frameworks */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = CordovaLib; - productName = CordovaLib; - productReference = 68A32D7114102E1C006B237C /* libCordova.a */; - productType = "com.apple.product-type.library.static"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 0867D690FE84028FC02AAC07 /* Project object */ = { - isa = PBXProject; - attributes = { - LastUpgradeCheck = 0430; - }; - buildConfigurationList = 1DEB922208733DC00010E9CD /* Build configuration list for PBXProject "CordovaLib" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; - hasScannedForEncodings = 1; - knownRegions = ( - English, - Japanese, - French, - German, - en, - ); - mainGroup = 0867D691FE84028FC02AAC07 /* CordovaLib */; - productRefGroup = 034768DFFF38A50411DB9C8B /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - D2AAC07D0554694100DB518D /* CordovaLib */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXSourcesBuildPhase section */ - D2AAC07B0554694100DB518D /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 8887FD671090FBE7009987E8 /* CDVCamera.m in Sources */, - 8887FD691090FBE7009987E8 /* NSDictionary+Extensions.m in Sources */, - 8887FD6B1090FBE7009987E8 /* CDVContacts.m in Sources */, - 8887FD6D1090FBE7009987E8 /* CDVDebugConsole.m in Sources */, - 8887FD711090FBE7009987E8 /* CDVFile.m in Sources */, - 8887FD751090FBE7009987E8 /* CDVInvokedUrlCommand.m in Sources */, - 8887FD861090FBE7009987E8 /* CDVLocation.m in Sources */, - 8887FD8E1090FBE7009987E8 /* CDVNotification.m in Sources */, - 8887FD901090FBE7009987E8 /* NSData+Base64.m in Sources */, - 8887FD9E1090FBE7009987E8 /* CDVReachability.m in Sources */, - 8887FDA01090FBE7009987E8 /* CDVSound.m in Sources */, - 88BA573E109BB46F00FB5E78 /* CDVAccelerometer.m in Sources */, - 1F3C04CF12BC247D004F9E10 /* CDVContact.m in Sources */, - 1F92F4A11314023E0046367C /* CDVPluginResult.m in Sources */, - C937A4571337599E002C4C79 /* CDVFileTransfer.m in Sources */, - 307A8F9F1385A2EC00E43782 /* CDVConnection.m in Sources */, - 1F584B9C1385A28A00ED25E8 /* CDVCapture.m in Sources */, - 30E33AF313A7E24B00594D64 /* CDVPlugin.m in Sources */, - 30B39EBF13D0268B0009682A /* CDVSplashScreen.m in Sources */, - 30E563D013E217EC00C949AA /* NSMutableArray+QueueAdditions.m in Sources */, - 1F2BECC113F9785B00A93BF6 /* CDVBattery.m in Sources */, - 30C684821406CB38004C1A8E /* CDVWhitelist.m in Sources */, - 30C684961407044B004C1A8E /* CDVURLProtocol.m in Sources */, - 30A90B9314588697006178D3 /* JSONKit.m in Sources */, - 8852C43C14B65FD800F0E735 /* CDVViewController.m in Sources */, - 8852C44114B65FD800F0E735 /* CDVCordovaView.m in Sources */, - 3034979E1513D56A0090E688 /* CDVLocalStorage.m in Sources */, - 3062D122151D0EDB000D9128 /* UIDevice+Extensions.m in Sources */, - 3E76876D156A90EE00EB6FA3 /* CDVLogger.m in Sources */, - EBA3557515ABD38C00F4DE24 /* NSArray+Comparisons.m in Sources */, - 30C5F1E015AF9E950052A00D /* CDVDevice.m in Sources */, - EB80C2AD15DEA63D004D9E7B /* CDVEcho.m in Sources */, - EB3B3548161CB44D003DBE7D /* CDVCommandQueue.m in Sources */, - EB3B357D161F2A45003DBE7D /* CDVCommandDelegateImpl.m in Sources */, - 9D76CF3D1625A4C50008A0F6 /* CDVGlobalization.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin XCBuildConfiguration section */ - 1DEB921F08733DC00010E9CD /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - "ARCHS[sdk=iphoneos*]" = ( - armv6, - armv7, - ); - "ARCHS[sdk=iphoneos6.*]" = ( - armv7, - armv7s, - ); - "ARCHS[sdk=iphonesimulator*]" = i386; - CLANG_ENABLE_OBJC_ARC = YES; - COPY_PHASE_STRIP = NO; - DSTROOT = "/tmp/$(PROJECT_NAME).dst"; - GCC_DYNAMIC_NO_PIC = NO; - GCC_MODEL_TUNING = G5; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = CordovaLib_Prefix.pch; - GCC_PREPROCESSOR_DEFINITIONS = ""; - GCC_THUMB_SUPPORT = NO; - GCC_VERSION = com.apple.compilers.llvm.clang.1_0; - INSTALL_PATH = /usr/local/lib; - IPHONEOS_DEPLOYMENT_TARGET = 4.2; - PRODUCT_NAME = Cordova; - PUBLIC_HEADERS_FOLDER_PATH = include/Cordova; - SKIP_INSTALL = YES; - }; - name = Debug; - }; - 1DEB922008733DC00010E9CD /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - "ARCHS[sdk=iphoneos*]" = ( - armv6, - armv7, - ); - "ARCHS[sdk=iphoneos6.*]" = ( - armv7, - armv7s, - ); - "ARCHS[sdk=iphonesimulator*]" = i386; - CLANG_ENABLE_OBJC_ARC = YES; - DSTROOT = "/tmp/$(PROJECT_NAME).dst"; - GCC_MODEL_TUNING = G5; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = CordovaLib_Prefix.pch; - GCC_PREPROCESSOR_DEFINITIONS = ""; - GCC_THUMB_SUPPORT = NO; - GCC_VERSION = com.apple.compilers.llvm.clang.1_0; - INSTALL_PATH = /usr/local/lib; - IPHONEOS_DEPLOYMENT_TARGET = 4.2; - PRODUCT_NAME = Cordova; - PUBLIC_HEADERS_FOLDER_PATH = include/Cordova; - SKIP_INSTALL = YES; - }; - name = Release; - }; - 1DEB922308733DC00010E9CD /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - "ARCHS[sdk=iphoneos*]" = ( - armv6, - armv7, - ); - "ARCHS[sdk=iphoneos6.*]" = ( - armv7, - armv7s, - ); - "ARCHS[sdk=iphonesimulator*]" = i386; - GCC_C_LANGUAGE_STANDARD = c99; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ""; - GCC_THUMB_SUPPORT = NO; - GCC_VERSION = com.apple.compilers.llvm.clang.1_0; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 4.2; - ONLY_ACTIVE_ARCH = NO; - OTHER_CFLAGS = "-DDEBUG"; - PUBLIC_HEADERS_FOLDER_PATH = include/Cordova; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - TARGETED_DEVICE_FAMILY = "1,2"; - USER_HEADER_SEARCH_PATHS = ""; - VALID_ARCHS = "i386 armv6 armv7 armv7s"; - }; - name = Debug; - }; - 1DEB922408733DC00010E9CD /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - "ARCHS[sdk=iphoneos*]" = ( - armv6, - armv7, - ); - "ARCHS[sdk=iphoneos6.*]" = ( - armv7, - armv7s, - ); - "ARCHS[sdk=iphonesimulator*]" = i386; - GCC_C_LANGUAGE_STANDARD = c99; - GCC_PREPROCESSOR_DEFINITIONS = ""; - GCC_THUMB_SUPPORT = NO; - GCC_VERSION = com.apple.compilers.llvm.clang.1_0; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 4.2; - ONLY_ACTIVE_ARCH = NO; - PUBLIC_HEADERS_FOLDER_PATH = include/Cordova; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - TARGETED_DEVICE_FAMILY = "1,2"; - VALID_ARCHS = "i386 armv6 armv7 armv7s"; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 1DEB921E08733DC00010E9CD /* Build configuration list for PBXNativeTarget "CordovaLib" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 1DEB921F08733DC00010E9CD /* Debug */, - 1DEB922008733DC00010E9CD /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 1DEB922208733DC00010E9CD /* Build configuration list for PBXProject "CordovaLib" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 1DEB922308733DC00010E9CD /* Debug */, - 1DEB922408733DC00010E9CD /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 0867D690FE84028FC02AAC07 /* Project object */; -} diff --git a/cordova-lib/spec-plugman/projects/ios-config-xml/SampleApp.xcodeproj/project.orig.pbxproj b/cordova-lib/spec-plugman/projects/ios-config-xml/SampleApp.xcodeproj/project.orig.pbxproj deleted file mode 100644 index a4d87f9b4..000000000 --- a/cordova-lib/spec-plugman/projects/ios-config-xml/SampleApp.xcodeproj/project.orig.pbxproj +++ /dev/null @@ -1,498 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 46; - objects = { - -/* Begin PBXBuildFile section */ - 571A464014DB0A1B007FEAC7 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 571A463F14DB0A1B007FEAC7 /* Foundation.framework */; }; - 571A464214DB0A1B007FEAC7 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 571A464114DB0A1B007FEAC7 /* UIKit.framework */; }; - 571A464414DB0A1B007FEAC7 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 571A464314DB0A1B007FEAC7 /* CoreGraphics.framework */; }; - 571A464614DB0A1B007FEAC7 /* AddressBook.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 571A464514DB0A1B007FEAC7 /* AddressBook.framework */; }; - 571A464814DB0A1B007FEAC7 /* AddressBookUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 571A464714DB0A1B007FEAC7 /* AddressBookUI.framework */; }; - 571A464A14DB0A1B007FEAC7 /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 571A464914DB0A1B007FEAC7 /* AudioToolbox.framework */; }; - 571A464C14DB0A1B007FEAC7 /* AVFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 571A464B14DB0A1B007FEAC7 /* AVFoundation.framework */; }; - 571A464E14DB0A1B007FEAC7 /* CoreLocation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 571A464D14DB0A1B007FEAC7 /* CoreLocation.framework */; }; - 571A465014DB0A1B007FEAC7 /* MediaPlayer.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 571A464F14DB0A1B007FEAC7 /* MediaPlayer.framework */; }; - 571A465214DB0A1B007FEAC7 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 571A465114DB0A1B007FEAC7 /* QuartzCore.framework */; }; - 571A465414DB0A1B007FEAC7 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 571A465314DB0A1B007FEAC7 /* SystemConfiguration.framework */; }; - 571A465614DB0A1B007FEAC7 /* MobileCoreServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 571A465514DB0A1B007FEAC7 /* MobileCoreServices.framework */; }; - 571A465814DB0A1B007FEAC7 /* CoreMedia.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 571A465714DB0A1B007FEAC7 /* CoreMedia.framework */; }; - 571A465E14DB0A1B007FEAC7 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 571A465C14DB0A1B007FEAC7 /* InfoPlist.strings */; }; - 571A466014DB0A1B007FEAC7 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 571A465F14DB0A1B007FEAC7 /* main.m */; }; - 571A466314DB0A1B007FEAC7 /* PhoneGap.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 571A466214DB0A1B007FEAC7 /* PhoneGap.framework */; }; - 571A466814DB0A1B007FEAC7 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 571A466614DB0A1B007FEAC7 /* Localizable.strings */; }; - 571A466C14DB0A1B007FEAC7 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 571A466A14DB0A1B007FEAC7 /* Localizable.strings */; }; - 571A466F14DB0A1B007FEAC7 /* icon.png in Resources */ = {isa = PBXBuildFile; fileRef = 571A466E14DB0A1B007FEAC7 /* icon.png */; }; - 571A467114DB0A1B007FEAC7 /* icon@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 571A467014DB0A1B007FEAC7 /* icon@2x.png */; }; - 571A467314DB0A1B007FEAC7 /* icon-72.png in Resources */ = {isa = PBXBuildFile; fileRef = 571A467214DB0A1B007FEAC7 /* icon-72.png */; }; - 571A467614DB0A1B007FEAC7 /* Default.png in Resources */ = {isa = PBXBuildFile; fileRef = 571A467514DB0A1B007FEAC7 /* Default.png */; }; - 571A467814DB0A1B007FEAC7 /* Default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 571A467714DB0A1B007FEAC7 /* Default@2x.png */; }; - 571A467A14DB0A1B007FEAC7 /* Capture.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 571A467914DB0A1B007FEAC7 /* Capture.bundle */; }; - 571A467C14DB0A1B007FEAC7 /* PhoneGap.plist in Resources */ = {isa = PBXBuildFile; fileRef = 571A467B14DB0A1B007FEAC7 /* PhoneGap.plist */; }; - 571A468014DB0A1B007FEAC7 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 571A467F14DB0A1B007FEAC7 /* AppDelegate.m */; }; - 571A468314DB0A1B007FEAC7 /* MainViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 571A468214DB0A1B007FEAC7 /* MainViewController.m */; }; - 571A468514DB0A1B007FEAC7 /* MainViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 571A468414DB0A1B007FEAC7 /* MainViewController.xib */; }; - 577FC36614DB0B620082BA7B /* www in Resources */ = {isa = PBXBuildFile; fileRef = 577FC36514DB0B620082BA7B /* www */; }; -/* End PBXBuildFile section */ - -/* Begin PBXFileReference section */ - 571A463B14DB0A1B007FEAC7 /* ChildApp.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = ChildApp.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 571A463F14DB0A1B007FEAC7 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; - 571A464114DB0A1B007FEAC7 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; - 571A464314DB0A1B007FEAC7 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; - 571A464514DB0A1B007FEAC7 /* AddressBook.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AddressBook.framework; path = System/Library/Frameworks/AddressBook.framework; sourceTree = SDKROOT; }; - 571A464714DB0A1B007FEAC7 /* AddressBookUI.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AddressBookUI.framework; path = System/Library/Frameworks/AddressBookUI.framework; sourceTree = SDKROOT; }; - 571A464914DB0A1B007FEAC7 /* AudioToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = System/Library/Frameworks/AudioToolbox.framework; sourceTree = SDKROOT; }; - 571A464B14DB0A1B007FEAC7 /* AVFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVFoundation.framework; path = System/Library/Frameworks/AVFoundation.framework; sourceTree = SDKROOT; }; - 571A464D14DB0A1B007FEAC7 /* CoreLocation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreLocation.framework; path = System/Library/Frameworks/CoreLocation.framework; sourceTree = SDKROOT; }; - 571A464F14DB0A1B007FEAC7 /* MediaPlayer.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MediaPlayer.framework; path = System/Library/Frameworks/MediaPlayer.framework; sourceTree = SDKROOT; }; - 571A465114DB0A1B007FEAC7 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; - 571A465314DB0A1B007FEAC7 /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = System/Library/Frameworks/SystemConfiguration.framework; sourceTree = SDKROOT; }; - 571A465514DB0A1B007FEAC7 /* MobileCoreServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MobileCoreServices.framework; path = System/Library/Frameworks/MobileCoreServices.framework; sourceTree = SDKROOT; }; - 571A465714DB0A1B007FEAC7 /* CoreMedia.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMedia.framework; path = System/Library/Frameworks/CoreMedia.framework; sourceTree = SDKROOT; }; - 571A465B14DB0A1B007FEAC7 /* ChildApp-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "ChildApp-Info.plist"; sourceTree = ""; }; - 571A465D14DB0A1B007FEAC7 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; - 571A465F14DB0A1B007FEAC7 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; - 571A466114DB0A1B007FEAC7 /* ChildApp-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "ChildApp-Prefix.pch"; sourceTree = ""; }; - 571A466214DB0A1B007FEAC7 /* PhoneGap.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = PhoneGap.framework; path = /Users/Shared/PhoneGap/Frameworks/PhoneGap.framework; sourceTree = ""; }; - 571A466714DB0A1B007FEAC7 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = Resources/en.lproj/Localizable.strings; sourceTree = ""; }; - 571A466B14DB0A1B007FEAC7 /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = Resources/es.lproj/Localizable.strings; sourceTree = ""; }; - 571A466E14DB0A1B007FEAC7 /* icon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = icon.png; path = Resources/icons/icon.png; sourceTree = ""; }; - 571A467014DB0A1B007FEAC7 /* icon@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "icon@2x.png"; path = "Resources/icons/icon@2x.png"; sourceTree = ""; }; - 571A467214DB0A1B007FEAC7 /* icon-72.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "icon-72.png"; path = "Resources/icons/icon-72.png"; sourceTree = ""; }; - 571A467514DB0A1B007FEAC7 /* Default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Default.png; path = Resources/splash/Default.png; sourceTree = ""; }; - 571A467714DB0A1B007FEAC7 /* Default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Default@2x.png"; path = "Resources/splash/Default@2x.png"; sourceTree = ""; }; - 571A467914DB0A1B007FEAC7 /* Capture.bundle */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.plug-in"; name = Capture.bundle; path = Resources/Capture.bundle; sourceTree = ""; }; - 571A467B14DB0A1B007FEAC7 /* PhoneGap.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = PhoneGap.plist; sourceTree = ""; }; - 571A467E14DB0A1B007FEAC7 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = AppDelegate.h; path = Classes/AppDelegate.h; sourceTree = ""; }; - 571A467F14DB0A1B007FEAC7 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = AppDelegate.m; path = Classes/AppDelegate.m; sourceTree = ""; }; - 571A468114DB0A1B007FEAC7 /* MainViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = MainViewController.h; path = Classes/MainViewController.h; sourceTree = ""; }; - 571A468214DB0A1B007FEAC7 /* MainViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = MainViewController.m; path = Classes/MainViewController.m; sourceTree = ""; }; - 571A468414DB0A1B007FEAC7 /* MainViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = MainViewController.xib; path = Classes/MainViewController.xib; sourceTree = ""; }; - 571A468714DB0A1B007FEAC7 /* README */ = {isa = PBXFileReference; lastKnownFileType = text; name = README; path = Plugins/README; sourceTree = ""; }; - 577FC36514DB0B620082BA7B /* www */ = {isa = PBXFileReference; lastKnownFileType = folder; path = www; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 571A463514DB0A1B007FEAC7 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 571A464014DB0A1B007FEAC7 /* Foundation.framework in Frameworks */, - 571A464214DB0A1B007FEAC7 /* UIKit.framework in Frameworks */, - 571A464414DB0A1B007FEAC7 /* CoreGraphics.framework in Frameworks */, - 571A464614DB0A1B007FEAC7 /* AddressBook.framework in Frameworks */, - 571A464814DB0A1B007FEAC7 /* AddressBookUI.framework in Frameworks */, - 571A464A14DB0A1B007FEAC7 /* AudioToolbox.framework in Frameworks */, - 571A464C14DB0A1B007FEAC7 /* AVFoundation.framework in Frameworks */, - 571A464E14DB0A1B007FEAC7 /* CoreLocation.framework in Frameworks */, - 571A465014DB0A1B007FEAC7 /* MediaPlayer.framework in Frameworks */, - 571A465214DB0A1B007FEAC7 /* QuartzCore.framework in Frameworks */, - 571A465414DB0A1B007FEAC7 /* SystemConfiguration.framework in Frameworks */, - 571A465614DB0A1B007FEAC7 /* MobileCoreServices.framework in Frameworks */, - 571A465814DB0A1B007FEAC7 /* CoreMedia.framework in Frameworks */, - 571A466314DB0A1B007FEAC7 /* PhoneGap.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 571A463814DB0A1B007FEAC7 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 571A462D14DB0A1A007FEAC7 = { - isa = PBXGroup; - children = ( - 577FC36514DB0B620082BA7B /* www */, - 571A465914DB0A1B007FEAC7 /* ChildApp */, - 571A463E14DB0A1B007FEAC7 /* Frameworks */, - 571A463C14DB0A1B007FEAC7 /* Products */, - ); - sourceTree = ""; - }; - 571A463C14DB0A1B007FEAC7 /* Products */ = { - isa = PBXGroup; - children = ( - 571A463B14DB0A1B007FEAC7 /* ChildApp.app */, - ); - name = Products; - sourceTree = ""; - }; - 571A463E14DB0A1B007FEAC7 /* Frameworks */ = { - isa = PBXGroup; - children = ( - 571A463F14DB0A1B007FEAC7 /* Foundation.framework */, - 571A464114DB0A1B007FEAC7 /* UIKit.framework */, - 571A464314DB0A1B007FEAC7 /* CoreGraphics.framework */, - 571A464514DB0A1B007FEAC7 /* AddressBook.framework */, - 571A464714DB0A1B007FEAC7 /* AddressBookUI.framework */, - 571A464914DB0A1B007FEAC7 /* AudioToolbox.framework */, - 571A464B14DB0A1B007FEAC7 /* AVFoundation.framework */, - 571A464D14DB0A1B007FEAC7 /* CoreLocation.framework */, - 571A464F14DB0A1B007FEAC7 /* MediaPlayer.framework */, - 571A465114DB0A1B007FEAC7 /* QuartzCore.framework */, - 571A465314DB0A1B007FEAC7 /* SystemConfiguration.framework */, - 571A465514DB0A1B007FEAC7 /* MobileCoreServices.framework */, - 571A465714DB0A1B007FEAC7 /* CoreMedia.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; - 571A465914DB0A1B007FEAC7 /* ChildApp */ = { - isa = PBXGroup; - children = ( - 571A466214DB0A1B007FEAC7 /* PhoneGap.framework */, - 571A466414DB0A1B007FEAC7 /* Resources */, - 571A467D14DB0A1B007FEAC7 /* Classes */, - 571A468614DB0A1B007FEAC7 /* Plugins */, - 571A465A14DB0A1B007FEAC7 /* Supporting Files */, - ); - path = ChildApp; - sourceTree = ""; - }; - 571A465A14DB0A1B007FEAC7 /* Supporting Files */ = { - isa = PBXGroup; - children = ( - 571A465B14DB0A1B007FEAC7 /* ChildApp-Info.plist */, - 571A465C14DB0A1B007FEAC7 /* InfoPlist.strings */, - 571A465F14DB0A1B007FEAC7 /* main.m */, - 571A466114DB0A1B007FEAC7 /* ChildApp-Prefix.pch */, - 571A467B14DB0A1B007FEAC7 /* PhoneGap.plist */, - 571A468414DB0A1B007FEAC7 /* MainViewController.xib */, - ); - name = "Supporting Files"; - sourceTree = ""; - }; - 571A466414DB0A1B007FEAC7 /* Resources */ = { - isa = PBXGroup; - children = ( - 571A467914DB0A1B007FEAC7 /* Capture.bundle */, - 571A466514DB0A1B007FEAC7 /* en.lproj */, - 571A466914DB0A1B007FEAC7 /* es.lproj */, - 571A466D14DB0A1B007FEAC7 /* icons */, - 571A467414DB0A1B007FEAC7 /* splash */, - ); - name = Resources; - sourceTree = ""; - }; - 571A466514DB0A1B007FEAC7 /* en.lproj */ = { - isa = PBXGroup; - children = ( - 571A466614DB0A1B007FEAC7 /* Localizable.strings */, - ); - name = en.lproj; - sourceTree = ""; - }; - 571A466914DB0A1B007FEAC7 /* es.lproj */ = { - isa = PBXGroup; - children = ( - 571A466A14DB0A1B007FEAC7 /* Localizable.strings */, - ); - name = es.lproj; - sourceTree = ""; - }; - 571A466D14DB0A1B007FEAC7 /* icons */ = { - isa = PBXGroup; - children = ( - 571A466E14DB0A1B007FEAC7 /* icon.png */, - 571A467014DB0A1B007FEAC7 /* icon@2x.png */, - 571A467214DB0A1B007FEAC7 /* icon-72.png */, - ); - name = icons; - sourceTree = ""; - }; - 571A467414DB0A1B007FEAC7 /* splash */ = { - isa = PBXGroup; - children = ( - 571A467514DB0A1B007FEAC7 /* Default.png */, - 571A467714DB0A1B007FEAC7 /* Default@2x.png */, - ); - name = splash; - sourceTree = ""; - }; - 571A467D14DB0A1B007FEAC7 /* Classes */ = { - isa = PBXGroup; - children = ( - 571A467E14DB0A1B007FEAC7 /* AppDelegate.h */, - 571A467F14DB0A1B007FEAC7 /* AppDelegate.m */, - 571A468114DB0A1B007FEAC7 /* MainViewController.h */, - 571A468214DB0A1B007FEAC7 /* MainViewController.m */, - ); - name = Classes; - sourceTree = ""; - }; - 571A468614DB0A1B007FEAC7 /* Plugins */ = { - isa = PBXGroup; - children = ( - 571A468714DB0A1B007FEAC7 /* README */, - ); - name = Plugins; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 571A463A14DB0A1B007FEAC7 /* ChildApp */ = { - isa = PBXNativeTarget; - buildConfigurationList = 571A468A14DB0A1B007FEAC7 /* Build configuration list for PBXNativeTarget "ChildApp" */; - buildPhases = ( - 571A463414DB0A1B007FEAC7 /* Sources */, - 571A463514DB0A1B007FEAC7 /* Frameworks */, - 571A463614DB0A1B007FEAC7 /* Resources */, - 571A463714DB0A1B007FEAC7 /* Sources */, - 571A463814DB0A1B007FEAC7 /* Frameworks */, - 571A463914DB0A1B007FEAC7 /* ShellScript */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = ChildApp; - productName = ChildApp; - productReference = 571A463B14DB0A1B007FEAC7 /* ChildApp.app */; - productType = "com.apple.product-type.application"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 571A462F14DB0A1A007FEAC7 /* Project object */ = { - isa = PBXProject; - attributes = { - LastUpgradeCheck = 0420; - }; - buildConfigurationList = 571A463214DB0A1A007FEAC7 /* Build configuration list for PBXProject "ChildApp" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; - hasScannedForEncodings = 0; - knownRegions = ( - en, - es, - ); - mainGroup = 571A462D14DB0A1A007FEAC7; - productRefGroup = 571A463C14DB0A1B007FEAC7 /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 571A463A14DB0A1B007FEAC7 /* ChildApp */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 571A463614DB0A1B007FEAC7 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 571A465E14DB0A1B007FEAC7 /* InfoPlist.strings in Resources */, - 571A466814DB0A1B007FEAC7 /* Localizable.strings in Resources */, - 571A466C14DB0A1B007FEAC7 /* Localizable.strings in Resources */, - 571A466F14DB0A1B007FEAC7 /* icon.png in Resources */, - 571A467114DB0A1B007FEAC7 /* icon@2x.png in Resources */, - 571A467314DB0A1B007FEAC7 /* icon-72.png in Resources */, - 571A467614DB0A1B007FEAC7 /* Default.png in Resources */, - 571A467814DB0A1B007FEAC7 /* Default@2x.png in Resources */, - 571A467A14DB0A1B007FEAC7 /* Capture.bundle in Resources */, - 571A467C14DB0A1B007FEAC7 /* PhoneGap.plist in Resources */, - 571A468514DB0A1B007FEAC7 /* MainViewController.xib in Resources */, - 577FC36614DB0B620082BA7B /* www in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXShellScriptBuildPhase section */ - 571A463914DB0A1B007FEAC7 /* ShellScript */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/bash; - shellScript = "\n\t\t\t\t\t\t\t\tif [ ! -d \"$PROJECT_DIR/www\" ] ; then\n\t\t\t\t\t\t\t\t\tcp -R /Users/Shared/PhoneGap/Frameworks/PhoneGap.framework/www \"$PROJECT_DIR\"\n\t\t\t\t\t\t\t\tfi\n\t\t\t\t\t\t\t\t# detect www folder reference in project, if missing, print warning\n\t\t\t\t\t\t\t\tgrep \"{isa = PBXFileReference; lastKnownFileType = folder; path = www; sourceTree = \\\"\\\"; };\" \"$PROJECT_DIR/$PROJECT_NAME.xcodeproj/project.pbxproj\"\n\t\t\t\t\t\t\t\trc=$? \n\t\t\t\t\t\t\t\tif [ $rc != 0 ] ; then\n\t\t\t\t\t\t\t\techo -e \"warning: Missing - Add $PROJECT_DIR/www as a folder reference in your project. Just drag and drop the folder into your project, into the Project Navigator of Xcode 4. Make sure you select the second radio-button: 'Create folder references for any added folders' (which will create a blue folder)\" 1>&2\n\t\t\t\t\t\t\t\tfi\t\t\t\t\t\t\t"; - }; -/* End PBXShellScriptBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 571A463414DB0A1B007FEAC7 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 571A466014DB0A1B007FEAC7 /* main.m in Sources */, - 571A468014DB0A1B007FEAC7 /* AppDelegate.m in Sources */, - 571A468314DB0A1B007FEAC7 /* MainViewController.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 571A463714DB0A1B007FEAC7 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin PBXVariantGroup section */ - 571A465C14DB0A1B007FEAC7 /* InfoPlist.strings */ = { - isa = PBXVariantGroup; - children = ( - 571A465D14DB0A1B007FEAC7 /* en */, - ); - name = InfoPlist.strings; - sourceTree = ""; - }; - 571A466614DB0A1B007FEAC7 /* Localizable.strings */ = { - isa = PBXVariantGroup; - children = ( - 571A466714DB0A1B007FEAC7 /* en */, - ); - name = Localizable.strings; - sourceTree = ""; - }; - 571A466A14DB0A1B007FEAC7 /* Localizable.strings */ = { - isa = PBXVariantGroup; - children = ( - 571A466B14DB0A1B007FEAC7 /* es */, - ); - name = Localizable.strings; - sourceTree = ""; - }; -/* End PBXVariantGroup section */ - -/* Begin XCBuildConfiguration section */ - 571A468814DB0A1B007FEAC7 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = "$(ARCHS_STANDARD_32_BIT)"; - CLANG_ENABLE_OBJC_ARC = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - COPY_PHASE_STRIP = NO; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_DYNAMIC_NO_PIC = NO; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_SYMBOLS_PRIVATE_EXTERN = NO; - GCC_VERSION = com.apple.compilers.llvmgcc42; - GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 3.0; - SDKROOT = iphoneos; - }; - name = Debug; - }; - 571A468914DB0A1B007FEAC7 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = "$(ARCHS_STANDARD_32_BIT)"; - CLANG_ENABLE_OBJC_ARC = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - COPY_PHASE_STRIP = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_VERSION = com.apple.compilers.llvmgcc42; - GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 3.0; - SDKROOT = iphoneos; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - 571A468B14DB0A1B007FEAC7 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = YES; - COPY_PHASE_STRIP = NO; - FRAMEWORK_SEARCH_PATHS = /Users/Shared/PhoneGap/Frameworks; - GCC_DYNAMIC_NO_PIC = NO; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = "ChildApp/ChildApp-Prefix.pch"; - GCC_PREPROCESSOR_DEFINITIONS = "PHONEGAP_FRAMEWORK=YES"; - INFOPLIST_FILE = "ChildApp/ChildApp-Info.plist"; - OTHER_LDFLAGS = ( - "-weak_framework", - UIKit, - "-weak_framework", - AVFoundation, - "-weak_framework", - CoreMedia, - "-weak_library", - /usr/lib/libSystem.B.dylib, - ); - PRODUCT_NAME = "$(TARGET_NAME)"; - TARGETED_DEVICE_FAMILY = "1,2"; - WRAPPER_EXTENSION = app; - }; - name = Debug; - }; - 571A468C14DB0A1B007FEAC7 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = YES; - COPY_PHASE_STRIP = YES; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - FRAMEWORK_SEARCH_PATHS = /Users/Shared/PhoneGap/Frameworks; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = "ChildApp/ChildApp-Prefix.pch"; - GCC_PREPROCESSOR_DEFINITIONS = "PHONEGAP_FRAMEWORK=YES"; - INFOPLIST_FILE = "ChildApp/ChildApp-Info.plist"; - OTHER_LDFLAGS = ( - "-weak_framework", - UIKit, - "-weak_framework", - AVFoundation, - "-weak_framework", - CoreMedia, - "-weak_library", - /usr/lib/libSystem.B.dylib, - ); - PRODUCT_NAME = "$(TARGET_NAME)"; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - WRAPPER_EXTENSION = app; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 571A463214DB0A1A007FEAC7 /* Build configuration list for PBXProject "ChildApp" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 571A468814DB0A1B007FEAC7 /* Debug */, - 571A468914DB0A1B007FEAC7 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 571A468A14DB0A1B007FEAC7 /* Build configuration list for PBXNativeTarget "ChildApp" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 571A468B14DB0A1B007FEAC7 /* Debug */, - 571A468C14DB0A1B007FEAC7 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 571A462F14DB0A1A007FEAC7 /* Project object */; -} diff --git a/cordova-lib/spec-plugman/projects/ios-config-xml/SampleApp.xcodeproj/project.pbxproj b/cordova-lib/spec-plugman/projects/ios-config-xml/SampleApp.xcodeproj/project.pbxproj deleted file mode 100644 index 60f478f92..000000000 --- a/cordova-lib/spec-plugman/projects/ios-config-xml/SampleApp.xcodeproj/project.pbxproj +++ /dev/null @@ -1,496 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 46; - objects = { - -/* Begin PBXBuildFile section */ - 571A464014DB0A1B007FEAC7 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 571A463F14DB0A1B007FEAC7 /* Foundation.framework */; }; - 571A464214DB0A1B007FEAC7 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 571A464114DB0A1B007FEAC7 /* UIKit.framework */; }; - 571A464414DB0A1B007FEAC7 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 571A464314DB0A1B007FEAC7 /* CoreGraphics.framework */; }; - 571A464614DB0A1B007FEAC7 /* AddressBook.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 571A464514DB0A1B007FEAC7 /* AddressBook.framework */; }; - 571A464814DB0A1B007FEAC7 /* AddressBookUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 571A464714DB0A1B007FEAC7 /* AddressBookUI.framework */; }; - 571A464A14DB0A1B007FEAC7 /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 571A464914DB0A1B007FEAC7 /* AudioToolbox.framework */; }; - 571A464C14DB0A1B007FEAC7 /* AVFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 571A464B14DB0A1B007FEAC7 /* AVFoundation.framework */; }; - 571A464E14DB0A1B007FEAC7 /* CoreLocation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 571A464D14DB0A1B007FEAC7 /* CoreLocation.framework */; }; - 571A465014DB0A1B007FEAC7 /* MediaPlayer.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 571A464F14DB0A1B007FEAC7 /* MediaPlayer.framework */; }; - 571A465214DB0A1B007FEAC7 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 571A465114DB0A1B007FEAC7 /* QuartzCore.framework */; }; - 571A465414DB0A1B007FEAC7 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 571A465314DB0A1B007FEAC7 /* SystemConfiguration.framework */; }; - 571A465614DB0A1B007FEAC7 /* MobileCoreServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 571A465514DB0A1B007FEAC7 /* MobileCoreServices.framework */; }; - 571A465814DB0A1B007FEAC7 /* CoreMedia.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 571A465714DB0A1B007FEAC7 /* CoreMedia.framework */; }; - 571A465E14DB0A1B007FEAC7 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 571A465C14DB0A1B007FEAC7 /* InfoPlist.strings */; }; - 571A466014DB0A1B007FEAC7 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 571A465F14DB0A1B007FEAC7 /* main.m */; }; - 571A466314DB0A1B007FEAC7 /* PhoneGap.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 571A466214DB0A1B007FEAC7 /* PhoneGap.framework */; }; - 571A466814DB0A1B007FEAC7 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 571A466614DB0A1B007FEAC7 /* Localizable.strings */; }; - 571A466C14DB0A1B007FEAC7 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 571A466A14DB0A1B007FEAC7 /* Localizable.strings */; }; - 571A466F14DB0A1B007FEAC7 /* icon.png in Resources */ = {isa = PBXBuildFile; fileRef = 571A466E14DB0A1B007FEAC7 /* icon.png */; }; - 571A467114DB0A1B007FEAC7 /* icon@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 571A467014DB0A1B007FEAC7 /* icon@2x.png */; }; - 571A467314DB0A1B007FEAC7 /* icon-72.png in Resources */ = {isa = PBXBuildFile; fileRef = 571A467214DB0A1B007FEAC7 /* icon-72.png */; }; - 571A467614DB0A1B007FEAC7 /* Default.png in Resources */ = {isa = PBXBuildFile; fileRef = 571A467514DB0A1B007FEAC7 /* Default.png */; }; - 571A467814DB0A1B007FEAC7 /* Default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 571A467714DB0A1B007FEAC7 /* Default@2x.png */; }; - 571A467A14DB0A1B007FEAC7 /* Capture.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 571A467914DB0A1B007FEAC7 /* Capture.bundle */; }; - 571A467C14DB0A1B007FEAC7 /* PhoneGap.plist in Resources */ = {isa = PBXBuildFile; fileRef = 571A467B14DB0A1B007FEAC7 /* PhoneGap.plist */; }; - 571A468014DB0A1B007FEAC7 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 571A467F14DB0A1B007FEAC7 /* AppDelegate.m */; }; - 571A468314DB0A1B007FEAC7 /* MainViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 571A468214DB0A1B007FEAC7 /* MainViewController.m */; }; - 571A468514DB0A1B007FEAC7 /* MainViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 571A468414DB0A1B007FEAC7 /* MainViewController.xib */; }; - 577FC36614DB0B620082BA7B /* www in Resources */ = {isa = PBXBuildFile; fileRef = 577FC36514DB0B620082BA7B /* www */; }; -/* End PBXBuildFile section */ - -/* Begin PBXFileReference section */ - 571A463B14DB0A1B007FEAC7 /* ChildApp.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = ChildApp.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 571A463F14DB0A1B007FEAC7 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; - 571A464114DB0A1B007FEAC7 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; - 571A464314DB0A1B007FEAC7 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; - 571A464514DB0A1B007FEAC7 /* AddressBook.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AddressBook.framework; path = System/Library/Frameworks/AddressBook.framework; sourceTree = SDKROOT; }; - 571A464714DB0A1B007FEAC7 /* AddressBookUI.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AddressBookUI.framework; path = System/Library/Frameworks/AddressBookUI.framework; sourceTree = SDKROOT; }; - 571A464914DB0A1B007FEAC7 /* AudioToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = System/Library/Frameworks/AudioToolbox.framework; sourceTree = SDKROOT; }; - 571A464B14DB0A1B007FEAC7 /* AVFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVFoundation.framework; path = System/Library/Frameworks/AVFoundation.framework; sourceTree = SDKROOT; }; - 571A464D14DB0A1B007FEAC7 /* CoreLocation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreLocation.framework; path = System/Library/Frameworks/CoreLocation.framework; sourceTree = SDKROOT; }; - 571A464F14DB0A1B007FEAC7 /* MediaPlayer.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MediaPlayer.framework; path = System/Library/Frameworks/MediaPlayer.framework; sourceTree = SDKROOT; }; - 571A465114DB0A1B007FEAC7 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; - 571A465314DB0A1B007FEAC7 /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = System/Library/Frameworks/SystemConfiguration.framework; sourceTree = SDKROOT; }; - 571A465514DB0A1B007FEAC7 /* MobileCoreServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MobileCoreServices.framework; path = System/Library/Frameworks/MobileCoreServices.framework; sourceTree = SDKROOT; }; - 571A465714DB0A1B007FEAC7 /* CoreMedia.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMedia.framework; path = System/Library/Frameworks/CoreMedia.framework; sourceTree = SDKROOT; }; - 571A465B14DB0A1B007FEAC7 /* ChildApp-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "ChildApp-Info.plist"; sourceTree = ""; }; - 571A465D14DB0A1B007FEAC7 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; - 571A465F14DB0A1B007FEAC7 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; - 571A466114DB0A1B007FEAC7 /* ChildApp-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "ChildApp-Prefix.pch"; sourceTree = ""; }; - 571A466214DB0A1B007FEAC7 /* PhoneGap.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = PhoneGap.framework; path = /Users/Shared/PhoneGap/Frameworks/PhoneGap.framework; sourceTree = ""; }; - 571A466714DB0A1B007FEAC7 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = Resources/en.lproj/Localizable.strings; sourceTree = ""; }; - 571A466B14DB0A1B007FEAC7 /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = Resources/es.lproj/Localizable.strings; sourceTree = ""; }; - 571A466E14DB0A1B007FEAC7 /* icon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = icon.png; path = Resources/icons/icon.png; sourceTree = ""; }; - 571A467014DB0A1B007FEAC7 /* icon@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "icon@2x.png"; path = "Resources/icons/icon@2x.png"; sourceTree = ""; }; - 571A467214DB0A1B007FEAC7 /* icon-72.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "icon-72.png"; path = "Resources/icons/icon-72.png"; sourceTree = ""; }; - 571A467514DB0A1B007FEAC7 /* Default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Default.png; path = Resources/splash/Default.png; sourceTree = ""; }; - 571A467714DB0A1B007FEAC7 /* Default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Default@2x.png"; path = "Resources/splash/Default@2x.png"; sourceTree = ""; }; - 571A467914DB0A1B007FEAC7 /* Capture.bundle */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.plug-in"; name = Capture.bundle; path = Resources/Capture.bundle; sourceTree = ""; }; - 571A467B14DB0A1B007FEAC7 /* PhoneGap.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = PhoneGap.plist; sourceTree = ""; }; - 571A467E14DB0A1B007FEAC7 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = AppDelegate.h; path = Classes/AppDelegate.h; sourceTree = ""; }; - 571A467F14DB0A1B007FEAC7 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = AppDelegate.m; path = Classes/AppDelegate.m; sourceTree = ""; }; - 571A468114DB0A1B007FEAC7 /* MainViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = MainViewController.h; path = Classes/MainViewController.h; sourceTree = ""; }; - 571A468214DB0A1B007FEAC7 /* MainViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = MainViewController.m; path = Classes/MainViewController.m; sourceTree = ""; }; - 571A468414DB0A1B007FEAC7 /* MainViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = MainViewController.xib; path = Classes/MainViewController.xib; sourceTree = ""; }; - 571A468714DB0A1B007FEAC7 /* README */ = {isa = PBXFileReference; lastKnownFileType = text; name = README; path = Plugins/README; sourceTree = ""; }; - 577FC36514DB0B620082BA7B /* www */ = {isa = PBXFileReference; lastKnownFileType = folder; path = www; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 571A463514DB0A1B007FEAC7 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 571A464014DB0A1B007FEAC7 /* Foundation.framework in Frameworks */, - 571A464214DB0A1B007FEAC7 /* UIKit.framework in Frameworks */, - 571A464414DB0A1B007FEAC7 /* CoreGraphics.framework in Frameworks */, - 571A464614DB0A1B007FEAC7 /* AddressBook.framework in Frameworks */, - 571A464814DB0A1B007FEAC7 /* AddressBookUI.framework in Frameworks */, - 571A464A14DB0A1B007FEAC7 /* AudioToolbox.framework in Frameworks */, - 571A464C14DB0A1B007FEAC7 /* AVFoundation.framework in Frameworks */, - 571A464E14DB0A1B007FEAC7 /* CoreLocation.framework in Frameworks */, - 571A465014DB0A1B007FEAC7 /* MediaPlayer.framework in Frameworks */, - 571A465214DB0A1B007FEAC7 /* QuartzCore.framework in Frameworks */, - 571A465414DB0A1B007FEAC7 /* SystemConfiguration.framework in Frameworks */, - 571A465614DB0A1B007FEAC7 /* MobileCoreServices.framework in Frameworks */, - 571A465814DB0A1B007FEAC7 /* CoreMedia.framework in Frameworks */, - 571A466314DB0A1B007FEAC7 /* PhoneGap.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 571A463814DB0A1B007FEAC7 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 571A462D14DB0A1A007FEAC7 = { - isa = PBXGroup; - children = ( - 577FC36514DB0B620082BA7B /* www */, - 571A465914DB0A1B007FEAC7 /* ChildApp */, - 571A463E14DB0A1B007FEAC7 /* Frameworks */, - 571A463C14DB0A1B007FEAC7 /* Products */, - ); - sourceTree = ""; - }; - 571A463C14DB0A1B007FEAC7 /* Products */ = { - isa = PBXGroup; - children = ( - 571A463B14DB0A1B007FEAC7 /* ChildApp.app */, - ); - name = Products; - sourceTree = ""; - }; - 571A463E14DB0A1B007FEAC7 /* Frameworks */ = { - isa = PBXGroup; - children = ( - 571A463F14DB0A1B007FEAC7 /* Foundation.framework */, - 571A464114DB0A1B007FEAC7 /* UIKit.framework */, - 571A464314DB0A1B007FEAC7 /* CoreGraphics.framework */, - 571A464514DB0A1B007FEAC7 /* AddressBook.framework */, - 571A464714DB0A1B007FEAC7 /* AddressBookUI.framework */, - 571A464914DB0A1B007FEAC7 /* AudioToolbox.framework */, - 571A464B14DB0A1B007FEAC7 /* AVFoundation.framework */, - 571A464D14DB0A1B007FEAC7 /* CoreLocation.framework */, - 571A464F14DB0A1B007FEAC7 /* MediaPlayer.framework */, - 571A465114DB0A1B007FEAC7 /* QuartzCore.framework */, - 571A465314DB0A1B007FEAC7 /* SystemConfiguration.framework */, - 571A465514DB0A1B007FEAC7 /* MobileCoreServices.framework */, - 571A465714DB0A1B007FEAC7 /* CoreMedia.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; - 571A465914DB0A1B007FEAC7 /* ChildApp */ = { - isa = PBXGroup; - children = ( - 571A466214DB0A1B007FEAC7 /* PhoneGap.framework */, - 571A466414DB0A1B007FEAC7 /* Resources */, - 571A467D14DB0A1B007FEAC7 /* Classes */, - 571A468614DB0A1B007FEAC7 /* Plugins */, - 571A465A14DB0A1B007FEAC7 /* Supporting Files */, - ); - path = ChildApp; - sourceTree = ""; - }; - 571A465A14DB0A1B007FEAC7 /* Supporting Files */ = { - isa = PBXGroup; - children = ( - 571A465B14DB0A1B007FEAC7 /* ChildApp-Info.plist */, - 571A465C14DB0A1B007FEAC7 /* InfoPlist.strings */, - 571A465F14DB0A1B007FEAC7 /* main.m */, - 571A466114DB0A1B007FEAC7 /* ChildApp-Prefix.pch */, - 571A467B14DB0A1B007FEAC7 /* PhoneGap.plist */, - 571A468414DB0A1B007FEAC7 /* MainViewController.xib */, - ); - name = "Supporting Files"; - sourceTree = ""; - }; - 571A466414DB0A1B007FEAC7 /* Resources */ = { - isa = PBXGroup; - children = ( - 571A467914DB0A1B007FEAC7 /* Capture.bundle */, - 571A466514DB0A1B007FEAC7 /* en.lproj */, - 571A466914DB0A1B007FEAC7 /* es.lproj */, - 571A466D14DB0A1B007FEAC7 /* icons */, - 571A467414DB0A1B007FEAC7 /* splash */, - ); - name = Resources; - sourceTree = ""; - }; - 571A466514DB0A1B007FEAC7 /* en.lproj */ = { - isa = PBXGroup; - children = ( - 571A466614DB0A1B007FEAC7 /* Localizable.strings */, - ); - name = en.lproj; - sourceTree = ""; - }; - 571A466914DB0A1B007FEAC7 /* es.lproj */ = { - isa = PBXGroup; - children = ( - 571A466A14DB0A1B007FEAC7 /* Localizable.strings */, - ); - name = es.lproj; - sourceTree = ""; - }; - 571A466D14DB0A1B007FEAC7 /* icons */ = { - isa = PBXGroup; - children = ( - 571A466E14DB0A1B007FEAC7 /* icon.png */, - 571A467014DB0A1B007FEAC7 /* icon@2x.png */, - 571A467214DB0A1B007FEAC7 /* icon-72.png */, - ); - name = icons; - sourceTree = ""; - }; - 571A467414DB0A1B007FEAC7 /* splash */ = { - isa = PBXGroup; - children = ( - 571A467514DB0A1B007FEAC7 /* Default.png */, - 571A467714DB0A1B007FEAC7 /* Default@2x.png */, - ); - name = splash; - sourceTree = ""; - }; - 571A467D14DB0A1B007FEAC7 /* Classes */ = { - isa = PBXGroup; - children = ( - 571A467E14DB0A1B007FEAC7 /* AppDelegate.h */, - 571A467F14DB0A1B007FEAC7 /* AppDelegate.m */, - 571A468114DB0A1B007FEAC7 /* MainViewController.h */, - 571A468214DB0A1B007FEAC7 /* MainViewController.m */, - ); - name = Classes; - sourceTree = ""; - }; - 571A468614DB0A1B007FEAC7 /* Plugins */ = { - isa = PBXGroup; - children = ( - 571A468714DB0A1B007FEAC7 /* README */, - ); - name = Plugins; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 571A463A14DB0A1B007FEAC7 /* ChildApp */ = { - isa = PBXNativeTarget; - buildConfigurationList = 571A468A14DB0A1B007FEAC7 /* Build configuration list for PBXNativeTarget "ChildApp" */; - buildPhases = ( - 571A463414DB0A1B007FEAC7 /* Sources */, - 571A463514DB0A1B007FEAC7 /* Frameworks */, - 571A463614DB0A1B007FEAC7 /* Resources */, - 571A463714DB0A1B007FEAC7 /* Sources */, - 571A463814DB0A1B007FEAC7 /* Frameworks */, - 571A463914DB0A1B007FEAC7 /* ShellScript */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = ChildApp; - productName = ChildApp; - productReference = 571A463B14DB0A1B007FEAC7 /* ChildApp.app */; - productType = "com.apple.product-type.application"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 571A462F14DB0A1A007FEAC7 /* Project object */ = { - isa = PBXProject; - attributes = { - LastUpgradeCheck = 0420; - }; - buildConfigurationList = 571A463214DB0A1A007FEAC7 /* Build configuration list for PBXProject "ChildApp" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; - hasScannedForEncodings = 0; - knownRegions = ( - en, - es, - ); - mainGroup = 571A462D14DB0A1A007FEAC7; - productRefGroup = 571A463C14DB0A1B007FEAC7 /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 571A463A14DB0A1B007FEAC7 /* ChildApp */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 571A463614DB0A1B007FEAC7 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 571A465E14DB0A1B007FEAC7 /* InfoPlist.strings in Resources */, - 571A466814DB0A1B007FEAC7 /* Localizable.strings in Resources */, - 571A466C14DB0A1B007FEAC7 /* Localizable.strings in Resources */, - 571A466F14DB0A1B007FEAC7 /* icon.png in Resources */, - 571A467114DB0A1B007FEAC7 /* icon@2x.png in Resources */, - 571A467314DB0A1B007FEAC7 /* icon-72.png in Resources */, - 571A467614DB0A1B007FEAC7 /* Default.png in Resources */, - 571A467814DB0A1B007FEAC7 /* Default@2x.png in Resources */, - 571A467A14DB0A1B007FEAC7 /* Capture.bundle in Resources */, - 571A467C14DB0A1B007FEAC7 /* PhoneGap.plist in Resources */, - 571A468514DB0A1B007FEAC7 /* MainViewController.xib in Resources */, - 577FC36614DB0B620082BA7B /* www in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXShellScriptBuildPhase section */ - 571A463914DB0A1B007FEAC7 /* ShellScript */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/bash; - shellScript = "\n\t\t\t\t\t\t\t\tif [ ! -d \"$PROJECT_DIR/www\" ] ; then\n\t\t\t\t\t\t\t\t\tcp -R /Users/Shared/PhoneGap/Frameworks/PhoneGap.framework/www \"$PROJECT_DIR\"\n\t\t\t\t\t\t\t\tfi\n\t\t\t\t\t\t\t\t# detect www folder reference in project, if missing, print warning\n\t\t\t\t\t\t\t\tgrep \"{isa = PBXFileReference; lastKnownFileType = folder; path = www; sourceTree = \\\"\\\"; };\" \"$PROJECT_DIR/$PROJECT_NAME.xcodeproj/project.pbxproj\"\n\t\t\t\t\t\t\t\trc=$? \n\t\t\t\t\t\t\t\tif [ $rc != 0 ] ; then\n\t\t\t\t\t\t\t\techo -e \"warning: Missing - Add $PROJECT_DIR/www as a folder reference in your project. Just drag and drop the folder into your project, into the Project Navigator of Xcode 4. Make sure you select the second radio-button: 'Create folder references for any added folders' (which will create a blue folder)\" 1>&2\n\t\t\t\t\t\t\t\tfi\t\t\t\t\t\t\t"; - }; -/* End PBXShellScriptBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 571A463414DB0A1B007FEAC7 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 571A466014DB0A1B007FEAC7 /* main.m in Sources */, - 571A468014DB0A1B007FEAC7 /* AppDelegate.m in Sources */, - 571A468314DB0A1B007FEAC7 /* MainViewController.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 571A463714DB0A1B007FEAC7 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin PBXVariantGroup section */ - 571A465C14DB0A1B007FEAC7 /* InfoPlist.strings */ = { - isa = PBXVariantGroup; - children = ( - 571A465D14DB0A1B007FEAC7 /* en */, - ); - name = InfoPlist.strings; - sourceTree = ""; - }; - 571A466614DB0A1B007FEAC7 /* Localizable.strings */ = { - isa = PBXVariantGroup; - children = ( - 571A466714DB0A1B007FEAC7 /* en */, - ); - name = Localizable.strings; - sourceTree = ""; - }; - 571A466A14DB0A1B007FEAC7 /* Localizable.strings */ = { - isa = PBXVariantGroup; - children = ( - 571A466B14DB0A1B007FEAC7 /* es */, - ); - name = Localizable.strings; - sourceTree = ""; - }; -/* End PBXVariantGroup section */ - -/* Begin XCBuildConfiguration section */ - 571A468814DB0A1B007FEAC7 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = "$(ARCHS_STANDARD_32_BIT)"; - CLANG_ENABLE_OBJC_ARC = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - COPY_PHASE_STRIP = NO; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_DYNAMIC_NO_PIC = NO; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_SYMBOLS_PRIVATE_EXTERN = NO; - GCC_VERSION = com.apple.compilers.llvmgcc42; - GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 3.0; - SDKROOT = iphoneos; - }; - name = Debug; - }; - 571A468914DB0A1B007FEAC7 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = "$(ARCHS_STANDARD_32_BIT)"; - CLANG_ENABLE_OBJC_ARC = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - COPY_PHASE_STRIP = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_VERSION = com.apple.compilers.llvmgcc42; - GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 3.0; - SDKROOT = iphoneos; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - 571A468B14DB0A1B007FEAC7 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = YES; - COPY_PHASE_STRIP = NO; - GCC_DYNAMIC_NO_PIC = NO; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = "ChildApp/ChildApp-Prefix.pch"; - GCC_PREPROCESSOR_DEFINITIONS = "PHONEGAP_FRAMEWORK=YES"; - INFOPLIST_FILE = "ChildApp/ChildApp-Info.plist"; - OTHER_LDFLAGS = ( - "-weak_framework", - UIKit, - "-weak_framework", - AVFoundation, - "-weak_framework", - CoreMedia, - "-weak_library", - /usr/lib/libSystem.B.dylib, - ); - PRODUCT_NAME = "$(TARGET_NAME)"; - TARGETED_DEVICE_FAMILY = "1,2"; - WRAPPER_EXTENSION = app; - }; - name = Debug; - }; - 571A468C14DB0A1B007FEAC7 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = YES; - COPY_PHASE_STRIP = YES; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = "ChildApp/ChildApp-Prefix.pch"; - GCC_PREPROCESSOR_DEFINITIONS = "PHONEGAP_FRAMEWORK=YES"; - INFOPLIST_FILE = "ChildApp/ChildApp-Info.plist"; - OTHER_LDFLAGS = ( - "-weak_framework", - UIKit, - "-weak_framework", - AVFoundation, - "-weak_framework", - CoreMedia, - "-weak_library", - /usr/lib/libSystem.B.dylib, - ); - PRODUCT_NAME = "$(TARGET_NAME)"; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - WRAPPER_EXTENSION = app; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 571A463214DB0A1A007FEAC7 /* Build configuration list for PBXProject "ChildApp" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 571A468814DB0A1B007FEAC7 /* Debug */, - 571A468914DB0A1B007FEAC7 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 571A468A14DB0A1B007FEAC7 /* Build configuration list for PBXNativeTarget "ChildApp" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 571A468B14DB0A1B007FEAC7 /* Debug */, - 571A468C14DB0A1B007FEAC7 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 571A462F14DB0A1A007FEAC7 /* Project object */; -} diff --git a/cordova-lib/spec-plugman/projects/ios-config-xml/SampleApp/SampleApp-Info.plist b/cordova-lib/spec-plugman/projects/ios-config-xml/SampleApp/SampleApp-Info.plist deleted file mode 100644 index 6010b6150..000000000 --- a/cordova-lib/spec-plugman/projects/ios-config-xml/SampleApp/SampleApp-Info.plist +++ /dev/null @@ -1,78 +0,0 @@ - - - - - - CFBundleIcons - - CFBundlePrimaryIcon - - CFBundleIconFiles - - icon.png - icon@2x.png - icon-72.png - icon-72@2x.png - - UIPrerenderedIcon - - - - UISupportedInterfaceOrientations~ipad - - UIInterfaceOrientationPortrait - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationPortraitUpsideDown - UIInterfaceOrientationLandscapeRight - - UISupportedInterfaceOrientations - - UIInterfaceOrientationPortrait - - CFBundleDevelopmentRegion - English - CFBundleDisplayName - ${PRODUCT_NAME} - CFBundleExecutable - ${EXECUTABLE_NAME} - CFBundleIconFile - icon.png - CFBundleIdentifier - com.example.friendstring - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - ${PRODUCT_NAME} - CFBundlePackageType - APPL - CFBundleSignature - ???? - CFBundleVersion - 1.0 - LSRequiresIPhoneOS - - NSMainNibFile - - NSMainNibFile~ipad - - - diff --git a/cordova-lib/spec-plugman/projects/ios-config-xml/SampleApp/config.xml b/cordova-lib/spec-plugman/projects/ios-config-xml/SampleApp/config.xml deleted file mode 100644 index 2858c2803..000000000 --- a/cordova-lib/spec-plugman/projects/ios-config-xml/SampleApp/config.xml +++ /dev/null @@ -1,59 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/cordova-lib/spec-plugman/projects/ios-config-xml/www/.gitkeep b/cordova-lib/spec-plugman/projects/ios-config-xml/www/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/cordova-lib/spec-plugman/projects/ios-plist/CordovaLib/CordovaLib.xcodeproj/project.pbxproj b/cordova-lib/spec-plugman/projects/ios-plist/CordovaLib/CordovaLib.xcodeproj/project.pbxproj deleted file mode 100644 index 5d0d46199..000000000 --- a/cordova-lib/spec-plugman/projects/ios-plist/CordovaLib/CordovaLib.xcodeproj/project.pbxproj +++ /dev/null @@ -1,636 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 46; - objects = { - -/* Begin PBXBuildFile section */ - 1F2BECC013F9785B00A93BF6 /* CDVBattery.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F2BECBE13F9785B00A93BF6 /* CDVBattery.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 1F2BECC113F9785B00A93BF6 /* CDVBattery.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F2BECBF13F9785B00A93BF6 /* CDVBattery.m */; }; - 1F3C04CE12BC247D004F9E10 /* CDVContact.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F3C04CC12BC247D004F9E10 /* CDVContact.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 1F3C04CF12BC247D004F9E10 /* CDVContact.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F3C04CD12BC247D004F9E10 /* CDVContact.m */; }; - 1F584B9B1385A28A00ED25E8 /* CDVCapture.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F584B991385A28900ED25E8 /* CDVCapture.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 1F584B9C1385A28A00ED25E8 /* CDVCapture.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F584B9A1385A28900ED25E8 /* CDVCapture.m */; }; - 1F92F4A01314023E0046367C /* CDVPluginResult.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F92F49E1314023E0046367C /* CDVPluginResult.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 1F92F4A11314023E0046367C /* CDVPluginResult.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F92F49F1314023E0046367C /* CDVPluginResult.m */; }; - 301F2F2A14F3C9CA003FE9FC /* CDV.h in Headers */ = {isa = PBXBuildFile; fileRef = 301F2F2914F3C9CA003FE9FC /* CDV.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 302965BC13A94E9D007046C5 /* CDVDebug.h in Headers */ = {isa = PBXBuildFile; fileRef = 302965BB13A94E9D007046C5 /* CDVDebug.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 3034979C1513D56A0090E688 /* CDVLocalStorage.h in Headers */ = {isa = PBXBuildFile; fileRef = 3034979A1513D56A0090E688 /* CDVLocalStorage.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 3034979E1513D56A0090E688 /* CDVLocalStorage.m in Sources */ = {isa = PBXBuildFile; fileRef = 3034979B1513D56A0090E688 /* CDVLocalStorage.m */; }; - 30392E4E14F4FCAB00B9E0B8 /* CDVAvailability.h in Headers */ = {isa = PBXBuildFile; fileRef = 30392E4D14F4FCAB00B9E0B8 /* CDVAvailability.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 3062D120151D0EDB000D9128 /* UIDevice+Extensions.h in Headers */ = {isa = PBXBuildFile; fileRef = 3062D11E151D0EDB000D9128 /* UIDevice+Extensions.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 3062D122151D0EDB000D9128 /* UIDevice+Extensions.m in Sources */ = {isa = PBXBuildFile; fileRef = 3062D11F151D0EDB000D9128 /* UIDevice+Extensions.m */; }; - 307A8F9E1385A2EC00E43782 /* CDVConnection.h in Headers */ = {isa = PBXBuildFile; fileRef = 307A8F9C1385A2EC00E43782 /* CDVConnection.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 307A8F9F1385A2EC00E43782 /* CDVConnection.m in Sources */ = {isa = PBXBuildFile; fileRef = 307A8F9D1385A2EC00E43782 /* CDVConnection.m */; }; - 30A90B9114588697006178D3 /* JSONKit.h in Headers */ = {isa = PBXBuildFile; fileRef = 30A90B8F14588697006178D3 /* JSONKit.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 30A90B9314588697006178D3 /* JSONKit.m in Sources */ = {isa = PBXBuildFile; fileRef = 30A90B9014588697006178D3 /* JSONKit.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; - 30B39EBE13D0268B0009682A /* CDVSplashScreen.h in Headers */ = {isa = PBXBuildFile; fileRef = 30B39EBC13D0268B0009682A /* CDVSplashScreen.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 30B39EBF13D0268B0009682A /* CDVSplashScreen.m in Sources */ = {isa = PBXBuildFile; fileRef = 30B39EBD13D0268B0009682A /* CDVSplashScreen.m */; }; - 30C5F1DF15AF9E950052A00D /* CDVDevice.h in Headers */ = {isa = PBXBuildFile; fileRef = 30C5F1DD15AF9E950052A00D /* CDVDevice.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 30C5F1E015AF9E950052A00D /* CDVDevice.m in Sources */ = {isa = PBXBuildFile; fileRef = 30C5F1DE15AF9E950052A00D /* CDVDevice.m */; }; - 30C684801406CB38004C1A8E /* CDVWhitelist.h in Headers */ = {isa = PBXBuildFile; fileRef = 30C6847E1406CB38004C1A8E /* CDVWhitelist.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 30C684821406CB38004C1A8E /* CDVWhitelist.m in Sources */ = {isa = PBXBuildFile; fileRef = 30C6847F1406CB38004C1A8E /* CDVWhitelist.m */; }; - 30C684941407044B004C1A8E /* CDVURLProtocol.h in Headers */ = {isa = PBXBuildFile; fileRef = 30C684921407044A004C1A8E /* CDVURLProtocol.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 30C684961407044B004C1A8E /* CDVURLProtocol.m in Sources */ = {isa = PBXBuildFile; fileRef = 30C684931407044A004C1A8E /* CDVURLProtocol.m */; }; - 30E33AF213A7E24B00594D64 /* CDVPlugin.h in Headers */ = {isa = PBXBuildFile; fileRef = 30E33AF013A7E24B00594D64 /* CDVPlugin.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 30E33AF313A7E24B00594D64 /* CDVPlugin.m in Sources */ = {isa = PBXBuildFile; fileRef = 30E33AF113A7E24B00594D64 /* CDVPlugin.m */; }; - 30E563CF13E217EC00C949AA /* NSMutableArray+QueueAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = 30E563CD13E217EC00C949AA /* NSMutableArray+QueueAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 30E563D013E217EC00C949AA /* NSMutableArray+QueueAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 30E563CE13E217EC00C949AA /* NSMutableArray+QueueAdditions.m */; }; - 30F5EBAB14CA26E700987760 /* CDVCommandDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = 30F5EBA914CA26E700987760 /* CDVCommandDelegate.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 3E76876D156A90EE00EB6FA3 /* CDVLogger.m in Sources */ = {isa = PBXBuildFile; fileRef = 3E76876B156A90EE00EB6FA3 /* CDVLogger.m */; }; - 3E76876F156A90EE00EB6FA3 /* CDVLogger.h in Headers */ = {isa = PBXBuildFile; fileRef = 3E76876C156A90EE00EB6FA3 /* CDVLogger.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 8852C43A14B65FD800F0E735 /* CDVViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 8852C43614B65FD800F0E735 /* CDVViewController.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 8852C43C14B65FD800F0E735 /* CDVViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 8852C43714B65FD800F0E735 /* CDVViewController.m */; }; - 8852C43F14B65FD800F0E735 /* CDVCordovaView.h in Headers */ = {isa = PBXBuildFile; fileRef = 8852C43814B65FD800F0E735 /* CDVCordovaView.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 8852C44114B65FD800F0E735 /* CDVCordovaView.m in Sources */ = {isa = PBXBuildFile; fileRef = 8852C43914B65FD800F0E735 /* CDVCordovaView.m */; }; - 8887FD661090FBE7009987E8 /* CDVCamera.h in Headers */ = {isa = PBXBuildFile; fileRef = 8887FD261090FBE7009987E8 /* CDVCamera.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 8887FD671090FBE7009987E8 /* CDVCamera.m in Sources */ = {isa = PBXBuildFile; fileRef = 8887FD271090FBE7009987E8 /* CDVCamera.m */; }; - 8887FD681090FBE7009987E8 /* NSDictionary+Extensions.h in Headers */ = {isa = PBXBuildFile; fileRef = 8887FD281090FBE7009987E8 /* NSDictionary+Extensions.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 8887FD691090FBE7009987E8 /* NSDictionary+Extensions.m in Sources */ = {isa = PBXBuildFile; fileRef = 8887FD291090FBE7009987E8 /* NSDictionary+Extensions.m */; }; - 8887FD6A1090FBE7009987E8 /* CDVContacts.h in Headers */ = {isa = PBXBuildFile; fileRef = 8887FD2A1090FBE7009987E8 /* CDVContacts.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 8887FD6B1090FBE7009987E8 /* CDVContacts.m in Sources */ = {isa = PBXBuildFile; fileRef = 8887FD2B1090FBE7009987E8 /* CDVContacts.m */; }; - 8887FD6C1090FBE7009987E8 /* CDVDebugConsole.h in Headers */ = {isa = PBXBuildFile; fileRef = 8887FD2C1090FBE7009987E8 /* CDVDebugConsole.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 8887FD6D1090FBE7009987E8 /* CDVDebugConsole.m in Sources */ = {isa = PBXBuildFile; fileRef = 8887FD2D1090FBE7009987E8 /* CDVDebugConsole.m */; }; - 8887FD701090FBE7009987E8 /* CDVFile.h in Headers */ = {isa = PBXBuildFile; fileRef = 8887FD301090FBE7009987E8 /* CDVFile.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 8887FD711090FBE7009987E8 /* CDVFile.m in Sources */ = {isa = PBXBuildFile; fileRef = 8887FD311090FBE7009987E8 /* CDVFile.m */; }; - 8887FD741090FBE7009987E8 /* CDVInvokedUrlCommand.h in Headers */ = {isa = PBXBuildFile; fileRef = 8887FD341090FBE7009987E8 /* CDVInvokedUrlCommand.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 8887FD751090FBE7009987E8 /* CDVInvokedUrlCommand.m in Sources */ = {isa = PBXBuildFile; fileRef = 8887FD351090FBE7009987E8 /* CDVInvokedUrlCommand.m */; }; - 8887FD851090FBE7009987E8 /* CDVLocation.h in Headers */ = {isa = PBXBuildFile; fileRef = 8887FD461090FBE7009987E8 /* CDVLocation.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 8887FD861090FBE7009987E8 /* CDVLocation.m in Sources */ = {isa = PBXBuildFile; fileRef = 8887FD471090FBE7009987E8 /* CDVLocation.m */; }; - 8887FD8D1090FBE7009987E8 /* CDVNotification.h in Headers */ = {isa = PBXBuildFile; fileRef = 8887FD4E1090FBE7009987E8 /* CDVNotification.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 8887FD8E1090FBE7009987E8 /* CDVNotification.m in Sources */ = {isa = PBXBuildFile; fileRef = 8887FD4F1090FBE7009987E8 /* CDVNotification.m */; }; - 8887FD8F1090FBE7009987E8 /* NSData+Base64.h in Headers */ = {isa = PBXBuildFile; fileRef = 8887FD501090FBE7009987E8 /* NSData+Base64.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 8887FD901090FBE7009987E8 /* NSData+Base64.m in Sources */ = {isa = PBXBuildFile; fileRef = 8887FD511090FBE7009987E8 /* NSData+Base64.m */; }; - 8887FD9D1090FBE7009987E8 /* CDVReachability.h in Headers */ = {isa = PBXBuildFile; fileRef = 8887FD5E1090FBE7009987E8 /* CDVReachability.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 8887FD9E1090FBE7009987E8 /* CDVReachability.m in Sources */ = {isa = PBXBuildFile; fileRef = 8887FD5F1090FBE7009987E8 /* CDVReachability.m */; }; - 8887FD9F1090FBE7009987E8 /* CDVSound.h in Headers */ = {isa = PBXBuildFile; fileRef = 8887FD601090FBE7009987E8 /* CDVSound.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 8887FDA01090FBE7009987E8 /* CDVSound.m in Sources */ = {isa = PBXBuildFile; fileRef = 8887FD611090FBE7009987E8 /* CDVSound.m */; }; - 88BA573D109BB46F00FB5E78 /* CDVAccelerometer.h in Headers */ = {isa = PBXBuildFile; fileRef = 88BA573B109BB46F00FB5E78 /* CDVAccelerometer.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 88BA573E109BB46F00FB5E78 /* CDVAccelerometer.m in Sources */ = {isa = PBXBuildFile; fileRef = 88BA573C109BB46F00FB5E78 /* CDVAccelerometer.m */; }; - 9D76CF3C1625A4C50008A0F6 /* CDVGlobalization.h in Headers */ = {isa = PBXBuildFile; fileRef = 9D76CF3A1625A4C50008A0F6 /* CDVGlobalization.h */; }; - 9D76CF3D1625A4C50008A0F6 /* CDVGlobalization.m in Sources */ = {isa = PBXBuildFile; fileRef = 9D76CF3B1625A4C50008A0F6 /* CDVGlobalization.m */; }; - C937A4561337599E002C4C79 /* CDVFileTransfer.h in Headers */ = {isa = PBXBuildFile; fileRef = C937A4541337599E002C4C79 /* CDVFileTransfer.h */; settings = {ATTRIBUTES = (Public, ); }; }; - C937A4571337599E002C4C79 /* CDVFileTransfer.m in Sources */ = {isa = PBXBuildFile; fileRef = C937A4551337599E002C4C79 /* CDVFileTransfer.m */; }; - EB3B3547161CB44D003DBE7D /* CDVCommandQueue.h in Headers */ = {isa = PBXBuildFile; fileRef = EB3B3545161CB44D003DBE7D /* CDVCommandQueue.h */; }; - EB3B3548161CB44D003DBE7D /* CDVCommandQueue.m in Sources */ = {isa = PBXBuildFile; fileRef = EB3B3546161CB44D003DBE7D /* CDVCommandQueue.m */; }; - EB3B357C161F2A45003DBE7D /* CDVCommandDelegateImpl.h in Headers */ = {isa = PBXBuildFile; fileRef = EB3B357A161F2A44003DBE7D /* CDVCommandDelegateImpl.h */; }; - EB3B357D161F2A45003DBE7D /* CDVCommandDelegateImpl.m in Sources */ = {isa = PBXBuildFile; fileRef = EB3B357B161F2A45003DBE7D /* CDVCommandDelegateImpl.m */; }; - EB80C2AC15DEA63D004D9E7B /* CDVEcho.h in Headers */ = {isa = PBXBuildFile; fileRef = EB80C2AA15DEA63D004D9E7B /* CDVEcho.h */; }; - EB80C2AD15DEA63D004D9E7B /* CDVEcho.m in Sources */ = {isa = PBXBuildFile; fileRef = EB80C2AB15DEA63D004D9E7B /* CDVEcho.m */; }; - EBA3557315ABD38C00F4DE24 /* NSArray+Comparisons.h in Headers */ = {isa = PBXBuildFile; fileRef = EBA3557115ABD38C00F4DE24 /* NSArray+Comparisons.h */; settings = {ATTRIBUTES = (Public, ); }; }; - EBA3557515ABD38C00F4DE24 /* NSArray+Comparisons.m in Sources */ = {isa = PBXBuildFile; fileRef = EBA3557215ABD38C00F4DE24 /* NSArray+Comparisons.m */; }; -/* End PBXBuildFile section */ - -/* Begin PBXFileReference section */ - 1F2BECBE13F9785B00A93BF6 /* CDVBattery.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDVBattery.h; path = Classes/CDVBattery.h; sourceTree = ""; }; - 1F2BECBF13F9785B00A93BF6 /* CDVBattery.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CDVBattery.m; path = Classes/CDVBattery.m; sourceTree = ""; }; - 1F3C04CC12BC247D004F9E10 /* CDVContact.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDVContact.h; path = Classes/CDVContact.h; sourceTree = ""; }; - 1F3C04CD12BC247D004F9E10 /* CDVContact.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CDVContact.m; path = Classes/CDVContact.m; sourceTree = ""; }; - 1F584B991385A28900ED25E8 /* CDVCapture.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDVCapture.h; path = Classes/CDVCapture.h; sourceTree = ""; }; - 1F584B9A1385A28900ED25E8 /* CDVCapture.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CDVCapture.m; path = Classes/CDVCapture.m; sourceTree = ""; }; - 1F92F49E1314023E0046367C /* CDVPluginResult.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDVPluginResult.h; path = Classes/CDVPluginResult.h; sourceTree = ""; }; - 1F92F49F1314023E0046367C /* CDVPluginResult.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CDVPluginResult.m; path = Classes/CDVPluginResult.m; sourceTree = ""; }; - 301F2F2914F3C9CA003FE9FC /* CDV.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDV.h; path = Classes/CDV.h; sourceTree = ""; }; - 302965BB13A94E9D007046C5 /* CDVDebug.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDVDebug.h; path = Classes/CDVDebug.h; sourceTree = ""; }; - 30325A0B136B343700982B63 /* VERSION */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = VERSION; sourceTree = ""; }; - 3034979A1513D56A0090E688 /* CDVLocalStorage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDVLocalStorage.h; path = Classes/CDVLocalStorage.h; sourceTree = ""; }; - 3034979B1513D56A0090E688 /* CDVLocalStorage.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CDVLocalStorage.m; path = Classes/CDVLocalStorage.m; sourceTree = ""; }; - 30392E4D14F4FCAB00B9E0B8 /* CDVAvailability.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDVAvailability.h; path = Classes/CDVAvailability.h; sourceTree = ""; }; - 3062D11E151D0EDB000D9128 /* UIDevice+Extensions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "UIDevice+Extensions.h"; path = "Classes/UIDevice+Extensions.h"; sourceTree = ""; }; - 3062D11F151D0EDB000D9128 /* UIDevice+Extensions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "UIDevice+Extensions.m"; path = "Classes/UIDevice+Extensions.m"; sourceTree = ""; }; - 307A8F9C1385A2EC00E43782 /* CDVConnection.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDVConnection.h; path = Classes/CDVConnection.h; sourceTree = ""; }; - 307A8F9D1385A2EC00E43782 /* CDVConnection.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CDVConnection.m; path = Classes/CDVConnection.m; sourceTree = ""; }; - 30A90B8F14588697006178D3 /* JSONKit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSONKit.h; sourceTree = ""; }; - 30A90B9014588697006178D3 /* JSONKit.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSONKit.m; sourceTree = ""; }; - 30B39EBC13D0268B0009682A /* CDVSplashScreen.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDVSplashScreen.h; path = Classes/CDVSplashScreen.h; sourceTree = ""; }; - 30B39EBD13D0268B0009682A /* CDVSplashScreen.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CDVSplashScreen.m; path = Classes/CDVSplashScreen.m; sourceTree = ""; }; - 30C5F1DD15AF9E950052A00D /* CDVDevice.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDVDevice.h; path = Classes/CDVDevice.h; sourceTree = ""; }; - 30C5F1DE15AF9E950052A00D /* CDVDevice.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CDVDevice.m; path = Classes/CDVDevice.m; sourceTree = ""; }; - 30C6847E1406CB38004C1A8E /* CDVWhitelist.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDVWhitelist.h; path = Classes/CDVWhitelist.h; sourceTree = ""; }; - 30C6847F1406CB38004C1A8E /* CDVWhitelist.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CDVWhitelist.m; path = Classes/CDVWhitelist.m; sourceTree = ""; }; - 30C684921407044A004C1A8E /* CDVURLProtocol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDVURLProtocol.h; path = Classes/CDVURLProtocol.h; sourceTree = ""; }; - 30C684931407044A004C1A8E /* CDVURLProtocol.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CDVURLProtocol.m; path = Classes/CDVURLProtocol.m; sourceTree = ""; }; - 30E33AF013A7E24B00594D64 /* CDVPlugin.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDVPlugin.h; path = Classes/CDVPlugin.h; sourceTree = ""; }; - 30E33AF113A7E24B00594D64 /* CDVPlugin.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CDVPlugin.m; path = Classes/CDVPlugin.m; sourceTree = ""; }; - 30E563CD13E217EC00C949AA /* NSMutableArray+QueueAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "NSMutableArray+QueueAdditions.h"; path = "Classes/NSMutableArray+QueueAdditions.h"; sourceTree = ""; }; - 30E563CE13E217EC00C949AA /* NSMutableArray+QueueAdditions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "NSMutableArray+QueueAdditions.m"; path = "Classes/NSMutableArray+QueueAdditions.m"; sourceTree = ""; }; - 30F5EBA914CA26E700987760 /* CDVCommandDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDVCommandDelegate.h; path = Classes/CDVCommandDelegate.h; sourceTree = ""; }; - 3E76876B156A90EE00EB6FA3 /* CDVLogger.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CDVLogger.m; path = Classes/CDVLogger.m; sourceTree = ""; }; - 3E76876C156A90EE00EB6FA3 /* CDVLogger.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDVLogger.h; path = Classes/CDVLogger.h; sourceTree = ""; }; - 686357AA141002F100DF4CF2 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; - 686357AC141002F100DF4CF2 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; - 686357AE141002F100DF4CF2 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; - 686357CC14100AAD00DF4CF2 /* AddressBookUI.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AddressBookUI.framework; path = System/Library/Frameworks/AddressBookUI.framework; sourceTree = SDKROOT; }; - 686357CE14100ADA00DF4CF2 /* AudioToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = System/Library/Frameworks/AudioToolbox.framework; sourceTree = SDKROOT; }; - 686357CF14100ADB00DF4CF2 /* AVFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVFoundation.framework; path = System/Library/Frameworks/AVFoundation.framework; sourceTree = SDKROOT; }; - 686357D014100ADE00DF4CF2 /* CoreLocation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreLocation.framework; path = System/Library/Frameworks/CoreLocation.framework; sourceTree = SDKROOT; }; - 686357D214100AE700DF4CF2 /* MobileCoreServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MobileCoreServices.framework; path = System/Library/Frameworks/MobileCoreServices.framework; sourceTree = SDKROOT; }; - 686357D414100AF200DF4CF2 /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = System/Library/Frameworks/SystemConfiguration.framework; sourceTree = SDKROOT; }; - 686357DC14100B1600DF4CF2 /* CoreMedia.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMedia.framework; path = System/Library/Frameworks/CoreMedia.framework; sourceTree = SDKROOT; }; - 68A32D7114102E1C006B237C /* libCordova.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libCordova.a; sourceTree = BUILT_PRODUCTS_DIR; }; - 68A32D7414103017006B237C /* AddressBook.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AddressBook.framework; path = System/Library/Frameworks/AddressBook.framework; sourceTree = SDKROOT; }; - 8852C43614B65FD800F0E735 /* CDVViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDVViewController.h; path = Classes/CDVViewController.h; sourceTree = ""; }; - 8852C43714B65FD800F0E735 /* CDVViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CDVViewController.m; path = Classes/CDVViewController.m; sourceTree = ""; }; - 8852C43814B65FD800F0E735 /* CDVCordovaView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDVCordovaView.h; path = Classes/CDVCordovaView.h; sourceTree = ""; }; - 8852C43914B65FD800F0E735 /* CDVCordovaView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CDVCordovaView.m; path = Classes/CDVCordovaView.m; sourceTree = ""; }; - 8887FD261090FBE7009987E8 /* CDVCamera.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDVCamera.h; path = Classes/CDVCamera.h; sourceTree = ""; }; - 8887FD271090FBE7009987E8 /* CDVCamera.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CDVCamera.m; path = Classes/CDVCamera.m; sourceTree = ""; }; - 8887FD281090FBE7009987E8 /* NSDictionary+Extensions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "NSDictionary+Extensions.h"; path = "Classes/NSDictionary+Extensions.h"; sourceTree = ""; }; - 8887FD291090FBE7009987E8 /* NSDictionary+Extensions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "NSDictionary+Extensions.m"; path = "Classes/NSDictionary+Extensions.m"; sourceTree = ""; }; - 8887FD2A1090FBE7009987E8 /* CDVContacts.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDVContacts.h; path = Classes/CDVContacts.h; sourceTree = ""; }; - 8887FD2B1090FBE7009987E8 /* CDVContacts.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CDVContacts.m; path = Classes/CDVContacts.m; sourceTree = ""; }; - 8887FD2C1090FBE7009987E8 /* CDVDebugConsole.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDVDebugConsole.h; path = Classes/CDVDebugConsole.h; sourceTree = ""; }; - 8887FD2D1090FBE7009987E8 /* CDVDebugConsole.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CDVDebugConsole.m; path = Classes/CDVDebugConsole.m; sourceTree = ""; }; - 8887FD301090FBE7009987E8 /* CDVFile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDVFile.h; path = Classes/CDVFile.h; sourceTree = ""; }; - 8887FD311090FBE7009987E8 /* CDVFile.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CDVFile.m; path = Classes/CDVFile.m; sourceTree = ""; }; - 8887FD341090FBE7009987E8 /* CDVInvokedUrlCommand.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDVInvokedUrlCommand.h; path = Classes/CDVInvokedUrlCommand.h; sourceTree = ""; }; - 8887FD351090FBE7009987E8 /* CDVInvokedUrlCommand.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CDVInvokedUrlCommand.m; path = Classes/CDVInvokedUrlCommand.m; sourceTree = ""; }; - 8887FD461090FBE7009987E8 /* CDVLocation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDVLocation.h; path = Classes/CDVLocation.h; sourceTree = ""; }; - 8887FD471090FBE7009987E8 /* CDVLocation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CDVLocation.m; path = Classes/CDVLocation.m; sourceTree = ""; }; - 8887FD4E1090FBE7009987E8 /* CDVNotification.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDVNotification.h; path = Classes/CDVNotification.h; sourceTree = ""; }; - 8887FD4F1090FBE7009987E8 /* CDVNotification.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CDVNotification.m; path = Classes/CDVNotification.m; sourceTree = ""; }; - 8887FD501090FBE7009987E8 /* NSData+Base64.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "NSData+Base64.h"; path = "Classes/NSData+Base64.h"; sourceTree = ""; }; - 8887FD511090FBE7009987E8 /* NSData+Base64.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "NSData+Base64.m"; path = "Classes/NSData+Base64.m"; sourceTree = ""; }; - 8887FD5E1090FBE7009987E8 /* CDVReachability.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDVReachability.h; path = Classes/CDVReachability.h; sourceTree = ""; }; - 8887FD5F1090FBE7009987E8 /* CDVReachability.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CDVReachability.m; path = Classes/CDVReachability.m; sourceTree = ""; }; - 8887FD601090FBE7009987E8 /* CDVSound.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDVSound.h; path = Classes/CDVSound.h; sourceTree = ""; }; - 8887FD611090FBE7009987E8 /* CDVSound.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CDVSound.m; path = Classes/CDVSound.m; sourceTree = ""; }; - 88BA573B109BB46F00FB5E78 /* CDVAccelerometer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDVAccelerometer.h; path = Classes/CDVAccelerometer.h; sourceTree = ""; }; - 88BA573C109BB46F00FB5E78 /* CDVAccelerometer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CDVAccelerometer.m; path = Classes/CDVAccelerometer.m; sourceTree = ""; }; - 9D76CF3A1625A4C50008A0F6 /* CDVGlobalization.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDVGlobalization.h; path = Classes/CDVGlobalization.h; sourceTree = ""; }; - 9D76CF3B1625A4C50008A0F6 /* CDVGlobalization.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CDVGlobalization.m; path = Classes/CDVGlobalization.m; sourceTree = ""; }; - AA747D9E0F9514B9006C5449 /* CordovaLib_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CordovaLib_Prefix.pch; sourceTree = SOURCE_ROOT; }; - C937A4541337599E002C4C79 /* CDVFileTransfer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDVFileTransfer.h; path = Classes/CDVFileTransfer.h; sourceTree = ""; }; - C937A4551337599E002C4C79 /* CDVFileTransfer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CDVFileTransfer.m; path = Classes/CDVFileTransfer.m; sourceTree = ""; }; - EB3B3545161CB44D003DBE7D /* CDVCommandQueue.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDVCommandQueue.h; path = Classes/CDVCommandQueue.h; sourceTree = ""; }; - EB3B3546161CB44D003DBE7D /* CDVCommandQueue.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CDVCommandQueue.m; path = Classes/CDVCommandQueue.m; sourceTree = ""; }; - EB3B357A161F2A44003DBE7D /* CDVCommandDelegateImpl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDVCommandDelegateImpl.h; path = Classes/CDVCommandDelegateImpl.h; sourceTree = ""; }; - EB3B357B161F2A45003DBE7D /* CDVCommandDelegateImpl.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CDVCommandDelegateImpl.m; path = Classes/CDVCommandDelegateImpl.m; sourceTree = ""; }; - EB80C2AA15DEA63D004D9E7B /* CDVEcho.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDVEcho.h; path = Classes/CDVEcho.h; sourceTree = ""; }; - EB80C2AB15DEA63D004D9E7B /* CDVEcho.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CDVEcho.m; path = Classes/CDVEcho.m; sourceTree = ""; }; - EBA3557115ABD38C00F4DE24 /* NSArray+Comparisons.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "NSArray+Comparisons.h"; path = "Classes/NSArray+Comparisons.h"; sourceTree = ""; }; - EBA3557215ABD38C00F4DE24 /* NSArray+Comparisons.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "NSArray+Comparisons.m"; path = "Classes/NSArray+Comparisons.m"; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - D2AAC07C0554694100DB518D /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 034768DFFF38A50411DB9C8B /* Products */ = { - isa = PBXGroup; - children = ( - 68A32D7114102E1C006B237C /* libCordova.a */, - ); - name = Products; - sourceTree = CORDOVALIB; - }; - 0867D691FE84028FC02AAC07 /* CordovaLib */ = { - isa = PBXGroup; - children = ( - 8887FD101090FB43009987E8 /* Classes */, - 32C88DFF0371C24200C91783 /* Other Sources */, - 0867D69AFE84028FC02AAC07 /* Frameworks */, - 034768DFFF38A50411DB9C8B /* Products */, - 30325A0B136B343700982B63 /* VERSION */, - ); - name = CordovaLib; - sourceTree = ""; - }; - 0867D69AFE84028FC02AAC07 /* Frameworks */ = { - isa = PBXGroup; - children = ( - 68A32D7414103017006B237C /* AddressBook.framework */, - 686357DC14100B1600DF4CF2 /* CoreMedia.framework */, - 686357CE14100ADA00DF4CF2 /* AudioToolbox.framework */, - 686357CF14100ADB00DF4CF2 /* AVFoundation.framework */, - 686357D014100ADE00DF4CF2 /* CoreLocation.framework */, - 686357D214100AE700DF4CF2 /* MobileCoreServices.framework */, - 686357D414100AF200DF4CF2 /* SystemConfiguration.framework */, - 686357CC14100AAD00DF4CF2 /* AddressBookUI.framework */, - 686357AA141002F100DF4CF2 /* UIKit.framework */, - 686357AC141002F100DF4CF2 /* Foundation.framework */, - 686357AE141002F100DF4CF2 /* CoreGraphics.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; - 3054098714B77FF3009841CA /* Cleaver */ = { - isa = PBXGroup; - children = ( - 8852C43614B65FD800F0E735 /* CDVViewController.h */, - 8852C43714B65FD800F0E735 /* CDVViewController.m */, - 8852C43814B65FD800F0E735 /* CDVCordovaView.h */, - 8852C43914B65FD800F0E735 /* CDVCordovaView.m */, - EB3B3545161CB44D003DBE7D /* CDVCommandQueue.h */, - EB3B3546161CB44D003DBE7D /* CDVCommandQueue.m */, - ); - name = Cleaver; - sourceTree = ""; - }; - 32C88DFF0371C24200C91783 /* Other Sources */ = { - isa = PBXGroup; - children = ( - AA747D9E0F9514B9006C5449 /* CordovaLib_Prefix.pch */, - ); - name = "Other Sources"; - sourceTree = ""; - }; - 888700D710922F56009987E8 /* Commands */ = { - isa = PBXGroup; - children = ( - 30C5F1DD15AF9E950052A00D /* CDVDevice.h */, - 30C5F1DE15AF9E950052A00D /* CDVDevice.m */, - 301F2F2914F3C9CA003FE9FC /* CDV.h */, - 3034979A1513D56A0090E688 /* CDVLocalStorage.h */, - 3034979B1513D56A0090E688 /* CDVLocalStorage.m */, - 30392E4D14F4FCAB00B9E0B8 /* CDVAvailability.h */, - 30F5EBA914CA26E700987760 /* CDVCommandDelegate.h */, - EB3B357A161F2A44003DBE7D /* CDVCommandDelegateImpl.h */, - EB3B357B161F2A45003DBE7D /* CDVCommandDelegateImpl.m */, - 30C684921407044A004C1A8E /* CDVURLProtocol.h */, - 30C684931407044A004C1A8E /* CDVURLProtocol.m */, - 30C6847E1406CB38004C1A8E /* CDVWhitelist.h */, - 30C6847F1406CB38004C1A8E /* CDVWhitelist.m */, - 1F2BECBE13F9785B00A93BF6 /* CDVBattery.h */, - 1F2BECBF13F9785B00A93BF6 /* CDVBattery.m */, - 30B39EBC13D0268B0009682A /* CDVSplashScreen.h */, - 30B39EBD13D0268B0009682A /* CDVSplashScreen.m */, - 30E33AF013A7E24B00594D64 /* CDVPlugin.h */, - 30E33AF113A7E24B00594D64 /* CDVPlugin.m */, - 307A8F9C1385A2EC00E43782 /* CDVConnection.h */, - 307A8F9D1385A2EC00E43782 /* CDVConnection.m */, - 1F92F49E1314023E0046367C /* CDVPluginResult.h */, - 1F92F49F1314023E0046367C /* CDVPluginResult.m */, - 88BA573B109BB46F00FB5E78 /* CDVAccelerometer.h */, - 88BA573C109BB46F00FB5E78 /* CDVAccelerometer.m */, - 8887FD261090FBE7009987E8 /* CDVCamera.h */, - 8887FD271090FBE7009987E8 /* CDVCamera.m */, - 1F584B991385A28900ED25E8 /* CDVCapture.h */, - 1F584B9A1385A28900ED25E8 /* CDVCapture.m */, - 1F3C04CC12BC247D004F9E10 /* CDVContact.h */, - 1F3C04CD12BC247D004F9E10 /* CDVContact.m */, - 8887FD2A1090FBE7009987E8 /* CDVContacts.h */, - 8887FD2B1090FBE7009987E8 /* CDVContacts.m */, - 8887FD2C1090FBE7009987E8 /* CDVDebugConsole.h */, - 8887FD2D1090FBE7009987E8 /* CDVDebugConsole.m */, - EB80C2AA15DEA63D004D9E7B /* CDVEcho.h */, - EB80C2AB15DEA63D004D9E7B /* CDVEcho.m */, - 8887FD301090FBE7009987E8 /* CDVFile.h */, - 8887FD311090FBE7009987E8 /* CDVFile.m */, - 8887FD341090FBE7009987E8 /* CDVInvokedUrlCommand.h */, - 8887FD351090FBE7009987E8 /* CDVInvokedUrlCommand.m */, - C937A4541337599E002C4C79 /* CDVFileTransfer.h */, - C937A4551337599E002C4C79 /* CDVFileTransfer.m */, - 8887FD461090FBE7009987E8 /* CDVLocation.h */, - 8887FD471090FBE7009987E8 /* CDVLocation.m */, - 8887FD4E1090FBE7009987E8 /* CDVNotification.h */, - 8887FD4F1090FBE7009987E8 /* CDVNotification.m */, - 8887FD5E1090FBE7009987E8 /* CDVReachability.h */, - 8887FD5F1090FBE7009987E8 /* CDVReachability.m */, - 8887FD601090FBE7009987E8 /* CDVSound.h */, - 8887FD611090FBE7009987E8 /* CDVSound.m */, - 3E76876B156A90EE00EB6FA3 /* CDVLogger.m */, - 3E76876C156A90EE00EB6FA3 /* CDVLogger.h */, - 9D76CF3A1625A4C50008A0F6 /* CDVGlobalization.h */, - 9D76CF3B1625A4C50008A0F6 /* CDVGlobalization.m */, - ); - name = Commands; - sourceTree = ""; - }; - 888700D910923009009987E8 /* Util */ = { - isa = PBXGroup; - children = ( - 3062D11E151D0EDB000D9128 /* UIDevice+Extensions.h */, - 3062D11F151D0EDB000D9128 /* UIDevice+Extensions.m */, - EBA3557115ABD38C00F4DE24 /* NSArray+Comparisons.h */, - EBA3557215ABD38C00F4DE24 /* NSArray+Comparisons.m */, - 8887FD281090FBE7009987E8 /* NSDictionary+Extensions.h */, - 8887FD291090FBE7009987E8 /* NSDictionary+Extensions.m */, - 302965BB13A94E9D007046C5 /* CDVDebug.h */, - 30E563CD13E217EC00C949AA /* NSMutableArray+QueueAdditions.h */, - 30E563CE13E217EC00C949AA /* NSMutableArray+QueueAdditions.m */, - 8887FD501090FBE7009987E8 /* NSData+Base64.h */, - 8887FD511090FBE7009987E8 /* NSData+Base64.m */, - ); - name = Util; - sourceTree = ""; - }; - 8887FD101090FB43009987E8 /* Classes */ = { - isa = PBXGroup; - children = ( - 3054098714B77FF3009841CA /* Cleaver */, - 888700D710922F56009987E8 /* Commands */, - 8887FD361090FBE7009987E8 /* JSON */, - 888700D910923009009987E8 /* Util */, - ); - name = Classes; - sourceTree = ""; - }; - 8887FD361090FBE7009987E8 /* JSON */ = { - isa = PBXGroup; - children = ( - 30A90B8F14588697006178D3 /* JSONKit.h */, - 30A90B9014588697006178D3 /* JSONKit.m */, - ); - name = JSON; - path = Classes/JSON; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXHeadersBuildPhase section */ - D2AAC07A0554694100DB518D /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - 8887FD661090FBE7009987E8 /* CDVCamera.h in Headers */, - 8887FD681090FBE7009987E8 /* NSDictionary+Extensions.h in Headers */, - 8887FD6A1090FBE7009987E8 /* CDVContacts.h in Headers */, - 8887FD6C1090FBE7009987E8 /* CDVDebugConsole.h in Headers */, - 8887FD701090FBE7009987E8 /* CDVFile.h in Headers */, - 8887FD741090FBE7009987E8 /* CDVInvokedUrlCommand.h in Headers */, - 8887FD851090FBE7009987E8 /* CDVLocation.h in Headers */, - 8887FD8D1090FBE7009987E8 /* CDVNotification.h in Headers */, - 8887FD8F1090FBE7009987E8 /* NSData+Base64.h in Headers */, - 8887FD9D1090FBE7009987E8 /* CDVReachability.h in Headers */, - 8887FD9F1090FBE7009987E8 /* CDVSound.h in Headers */, - 88BA573D109BB46F00FB5E78 /* CDVAccelerometer.h in Headers */, - 1F3C04CE12BC247D004F9E10 /* CDVContact.h in Headers */, - 1F92F4A01314023E0046367C /* CDVPluginResult.h in Headers */, - C937A4561337599E002C4C79 /* CDVFileTransfer.h in Headers */, - 307A8F9E1385A2EC00E43782 /* CDVConnection.h in Headers */, - 1F584B9B1385A28A00ED25E8 /* CDVCapture.h in Headers */, - 30E33AF213A7E24B00594D64 /* CDVPlugin.h in Headers */, - 302965BC13A94E9D007046C5 /* CDVDebug.h in Headers */, - 30B39EBE13D0268B0009682A /* CDVSplashScreen.h in Headers */, - 30E563CF13E217EC00C949AA /* NSMutableArray+QueueAdditions.h in Headers */, - 1F2BECC013F9785B00A93BF6 /* CDVBattery.h in Headers */, - 30C684801406CB38004C1A8E /* CDVWhitelist.h in Headers */, - 30C684941407044B004C1A8E /* CDVURLProtocol.h in Headers */, - 30A90B9114588697006178D3 /* JSONKit.h in Headers */, - 8852C43A14B65FD800F0E735 /* CDVViewController.h in Headers */, - 8852C43F14B65FD800F0E735 /* CDVCordovaView.h in Headers */, - 30F5EBAB14CA26E700987760 /* CDVCommandDelegate.h in Headers */, - 301F2F2A14F3C9CA003FE9FC /* CDV.h in Headers */, - 30392E4E14F4FCAB00B9E0B8 /* CDVAvailability.h in Headers */, - 3034979C1513D56A0090E688 /* CDVLocalStorage.h in Headers */, - 3062D120151D0EDB000D9128 /* UIDevice+Extensions.h in Headers */, - 3E76876F156A90EE00EB6FA3 /* CDVLogger.h in Headers */, - EBA3557315ABD38C00F4DE24 /* NSArray+Comparisons.h in Headers */, - 30C5F1DF15AF9E950052A00D /* CDVDevice.h in Headers */, - EB80C2AC15DEA63D004D9E7B /* CDVEcho.h in Headers */, - EB3B3547161CB44D003DBE7D /* CDVCommandQueue.h in Headers */, - EB3B357C161F2A45003DBE7D /* CDVCommandDelegateImpl.h in Headers */, - 9D76CF3C1625A4C50008A0F6 /* CDVGlobalization.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXHeadersBuildPhase section */ - -/* Begin PBXNativeTarget section */ - D2AAC07D0554694100DB518D /* CordovaLib */ = { - isa = PBXNativeTarget; - buildConfigurationList = 1DEB921E08733DC00010E9CD /* Build configuration list for PBXNativeTarget "CordovaLib" */; - buildPhases = ( - D2AAC07A0554694100DB518D /* Headers */, - D2AAC07B0554694100DB518D /* Sources */, - D2AAC07C0554694100DB518D /* Frameworks */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = CordovaLib; - productName = CordovaLib; - productReference = 68A32D7114102E1C006B237C /* libCordova.a */; - productType = "com.apple.product-type.library.static"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 0867D690FE84028FC02AAC07 /* Project object */ = { - isa = PBXProject; - attributes = { - LastUpgradeCheck = 0430; - }; - buildConfigurationList = 1DEB922208733DC00010E9CD /* Build configuration list for PBXProject "CordovaLib" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; - hasScannedForEncodings = 1; - knownRegions = ( - English, - Japanese, - French, - German, - en, - ); - mainGroup = 0867D691FE84028FC02AAC07 /* CordovaLib */; - productRefGroup = 034768DFFF38A50411DB9C8B /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - D2AAC07D0554694100DB518D /* CordovaLib */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXSourcesBuildPhase section */ - D2AAC07B0554694100DB518D /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 8887FD671090FBE7009987E8 /* CDVCamera.m in Sources */, - 8887FD691090FBE7009987E8 /* NSDictionary+Extensions.m in Sources */, - 8887FD6B1090FBE7009987E8 /* CDVContacts.m in Sources */, - 8887FD6D1090FBE7009987E8 /* CDVDebugConsole.m in Sources */, - 8887FD711090FBE7009987E8 /* CDVFile.m in Sources */, - 8887FD751090FBE7009987E8 /* CDVInvokedUrlCommand.m in Sources */, - 8887FD861090FBE7009987E8 /* CDVLocation.m in Sources */, - 8887FD8E1090FBE7009987E8 /* CDVNotification.m in Sources */, - 8887FD901090FBE7009987E8 /* NSData+Base64.m in Sources */, - 8887FD9E1090FBE7009987E8 /* CDVReachability.m in Sources */, - 8887FDA01090FBE7009987E8 /* CDVSound.m in Sources */, - 88BA573E109BB46F00FB5E78 /* CDVAccelerometer.m in Sources */, - 1F3C04CF12BC247D004F9E10 /* CDVContact.m in Sources */, - 1F92F4A11314023E0046367C /* CDVPluginResult.m in Sources */, - C937A4571337599E002C4C79 /* CDVFileTransfer.m in Sources */, - 307A8F9F1385A2EC00E43782 /* CDVConnection.m in Sources */, - 1F584B9C1385A28A00ED25E8 /* CDVCapture.m in Sources */, - 30E33AF313A7E24B00594D64 /* CDVPlugin.m in Sources */, - 30B39EBF13D0268B0009682A /* CDVSplashScreen.m in Sources */, - 30E563D013E217EC00C949AA /* NSMutableArray+QueueAdditions.m in Sources */, - 1F2BECC113F9785B00A93BF6 /* CDVBattery.m in Sources */, - 30C684821406CB38004C1A8E /* CDVWhitelist.m in Sources */, - 30C684961407044B004C1A8E /* CDVURLProtocol.m in Sources */, - 30A90B9314588697006178D3 /* JSONKit.m in Sources */, - 8852C43C14B65FD800F0E735 /* CDVViewController.m in Sources */, - 8852C44114B65FD800F0E735 /* CDVCordovaView.m in Sources */, - 3034979E1513D56A0090E688 /* CDVLocalStorage.m in Sources */, - 3062D122151D0EDB000D9128 /* UIDevice+Extensions.m in Sources */, - 3E76876D156A90EE00EB6FA3 /* CDVLogger.m in Sources */, - EBA3557515ABD38C00F4DE24 /* NSArray+Comparisons.m in Sources */, - 30C5F1E015AF9E950052A00D /* CDVDevice.m in Sources */, - EB80C2AD15DEA63D004D9E7B /* CDVEcho.m in Sources */, - EB3B3548161CB44D003DBE7D /* CDVCommandQueue.m in Sources */, - EB3B357D161F2A45003DBE7D /* CDVCommandDelegateImpl.m in Sources */, - 9D76CF3D1625A4C50008A0F6 /* CDVGlobalization.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin XCBuildConfiguration section */ - 1DEB921F08733DC00010E9CD /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - "ARCHS[sdk=iphoneos*]" = ( - armv6, - armv7, - ); - "ARCHS[sdk=iphoneos6.*]" = ( - armv7, - armv7s, - ); - "ARCHS[sdk=iphonesimulator*]" = i386; - CLANG_ENABLE_OBJC_ARC = YES; - COPY_PHASE_STRIP = NO; - DSTROOT = "/tmp/$(PROJECT_NAME).dst"; - GCC_DYNAMIC_NO_PIC = NO; - GCC_MODEL_TUNING = G5; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = CordovaLib_Prefix.pch; - GCC_PREPROCESSOR_DEFINITIONS = ""; - GCC_THUMB_SUPPORT = NO; - GCC_VERSION = com.apple.compilers.llvm.clang.1_0; - INSTALL_PATH = /usr/local/lib; - IPHONEOS_DEPLOYMENT_TARGET = 4.2; - PRODUCT_NAME = Cordova; - PUBLIC_HEADERS_FOLDER_PATH = include/Cordova; - SKIP_INSTALL = YES; - }; - name = Debug; - }; - 1DEB922008733DC00010E9CD /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - "ARCHS[sdk=iphoneos*]" = ( - armv6, - armv7, - ); - "ARCHS[sdk=iphoneos6.*]" = ( - armv7, - armv7s, - ); - "ARCHS[sdk=iphonesimulator*]" = i386; - CLANG_ENABLE_OBJC_ARC = YES; - DSTROOT = "/tmp/$(PROJECT_NAME).dst"; - GCC_MODEL_TUNING = G5; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = CordovaLib_Prefix.pch; - GCC_PREPROCESSOR_DEFINITIONS = ""; - GCC_THUMB_SUPPORT = NO; - GCC_VERSION = com.apple.compilers.llvm.clang.1_0; - INSTALL_PATH = /usr/local/lib; - IPHONEOS_DEPLOYMENT_TARGET = 4.2; - PRODUCT_NAME = Cordova; - PUBLIC_HEADERS_FOLDER_PATH = include/Cordova; - SKIP_INSTALL = YES; - }; - name = Release; - }; - 1DEB922308733DC00010E9CD /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - "ARCHS[sdk=iphoneos*]" = ( - armv6, - armv7, - ); - "ARCHS[sdk=iphoneos6.*]" = ( - armv7, - armv7s, - ); - "ARCHS[sdk=iphonesimulator*]" = i386; - GCC_C_LANGUAGE_STANDARD = c99; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ""; - GCC_THUMB_SUPPORT = NO; - GCC_VERSION = com.apple.compilers.llvm.clang.1_0; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 4.2; - ONLY_ACTIVE_ARCH = NO; - OTHER_CFLAGS = "-DDEBUG"; - PUBLIC_HEADERS_FOLDER_PATH = include/Cordova; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - TARGETED_DEVICE_FAMILY = "1,2"; - USER_HEADER_SEARCH_PATHS = ""; - VALID_ARCHS = "i386 armv6 armv7 armv7s"; - }; - name = Debug; - }; - 1DEB922408733DC00010E9CD /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - "ARCHS[sdk=iphoneos*]" = ( - armv6, - armv7, - ); - "ARCHS[sdk=iphoneos6.*]" = ( - armv7, - armv7s, - ); - "ARCHS[sdk=iphonesimulator*]" = i386; - GCC_C_LANGUAGE_STANDARD = c99; - GCC_PREPROCESSOR_DEFINITIONS = ""; - GCC_THUMB_SUPPORT = NO; - GCC_VERSION = com.apple.compilers.llvm.clang.1_0; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 4.2; - ONLY_ACTIVE_ARCH = NO; - PUBLIC_HEADERS_FOLDER_PATH = include/Cordova; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - TARGETED_DEVICE_FAMILY = "1,2"; - VALID_ARCHS = "i386 armv6 armv7 armv7s"; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 1DEB921E08733DC00010E9CD /* Build configuration list for PBXNativeTarget "CordovaLib" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 1DEB921F08733DC00010E9CD /* Debug */, - 1DEB922008733DC00010E9CD /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 1DEB922208733DC00010E9CD /* Build configuration list for PBXProject "CordovaLib" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 1DEB922308733DC00010E9CD /* Debug */, - 1DEB922408733DC00010E9CD /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 0867D690FE84028FC02AAC07 /* Project object */; -} diff --git a/cordova-lib/spec-plugman/projects/ios-plist/SampleApp.xcodeproj/project.orig.pbxproj b/cordova-lib/spec-plugman/projects/ios-plist/SampleApp.xcodeproj/project.orig.pbxproj deleted file mode 100644 index a4d87f9b4..000000000 --- a/cordova-lib/spec-plugman/projects/ios-plist/SampleApp.xcodeproj/project.orig.pbxproj +++ /dev/null @@ -1,498 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 46; - objects = { - -/* Begin PBXBuildFile section */ - 571A464014DB0A1B007FEAC7 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 571A463F14DB0A1B007FEAC7 /* Foundation.framework */; }; - 571A464214DB0A1B007FEAC7 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 571A464114DB0A1B007FEAC7 /* UIKit.framework */; }; - 571A464414DB0A1B007FEAC7 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 571A464314DB0A1B007FEAC7 /* CoreGraphics.framework */; }; - 571A464614DB0A1B007FEAC7 /* AddressBook.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 571A464514DB0A1B007FEAC7 /* AddressBook.framework */; }; - 571A464814DB0A1B007FEAC7 /* AddressBookUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 571A464714DB0A1B007FEAC7 /* AddressBookUI.framework */; }; - 571A464A14DB0A1B007FEAC7 /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 571A464914DB0A1B007FEAC7 /* AudioToolbox.framework */; }; - 571A464C14DB0A1B007FEAC7 /* AVFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 571A464B14DB0A1B007FEAC7 /* AVFoundation.framework */; }; - 571A464E14DB0A1B007FEAC7 /* CoreLocation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 571A464D14DB0A1B007FEAC7 /* CoreLocation.framework */; }; - 571A465014DB0A1B007FEAC7 /* MediaPlayer.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 571A464F14DB0A1B007FEAC7 /* MediaPlayer.framework */; }; - 571A465214DB0A1B007FEAC7 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 571A465114DB0A1B007FEAC7 /* QuartzCore.framework */; }; - 571A465414DB0A1B007FEAC7 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 571A465314DB0A1B007FEAC7 /* SystemConfiguration.framework */; }; - 571A465614DB0A1B007FEAC7 /* MobileCoreServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 571A465514DB0A1B007FEAC7 /* MobileCoreServices.framework */; }; - 571A465814DB0A1B007FEAC7 /* CoreMedia.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 571A465714DB0A1B007FEAC7 /* CoreMedia.framework */; }; - 571A465E14DB0A1B007FEAC7 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 571A465C14DB0A1B007FEAC7 /* InfoPlist.strings */; }; - 571A466014DB0A1B007FEAC7 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 571A465F14DB0A1B007FEAC7 /* main.m */; }; - 571A466314DB0A1B007FEAC7 /* PhoneGap.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 571A466214DB0A1B007FEAC7 /* PhoneGap.framework */; }; - 571A466814DB0A1B007FEAC7 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 571A466614DB0A1B007FEAC7 /* Localizable.strings */; }; - 571A466C14DB0A1B007FEAC7 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 571A466A14DB0A1B007FEAC7 /* Localizable.strings */; }; - 571A466F14DB0A1B007FEAC7 /* icon.png in Resources */ = {isa = PBXBuildFile; fileRef = 571A466E14DB0A1B007FEAC7 /* icon.png */; }; - 571A467114DB0A1B007FEAC7 /* icon@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 571A467014DB0A1B007FEAC7 /* icon@2x.png */; }; - 571A467314DB0A1B007FEAC7 /* icon-72.png in Resources */ = {isa = PBXBuildFile; fileRef = 571A467214DB0A1B007FEAC7 /* icon-72.png */; }; - 571A467614DB0A1B007FEAC7 /* Default.png in Resources */ = {isa = PBXBuildFile; fileRef = 571A467514DB0A1B007FEAC7 /* Default.png */; }; - 571A467814DB0A1B007FEAC7 /* Default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 571A467714DB0A1B007FEAC7 /* Default@2x.png */; }; - 571A467A14DB0A1B007FEAC7 /* Capture.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 571A467914DB0A1B007FEAC7 /* Capture.bundle */; }; - 571A467C14DB0A1B007FEAC7 /* PhoneGap.plist in Resources */ = {isa = PBXBuildFile; fileRef = 571A467B14DB0A1B007FEAC7 /* PhoneGap.plist */; }; - 571A468014DB0A1B007FEAC7 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 571A467F14DB0A1B007FEAC7 /* AppDelegate.m */; }; - 571A468314DB0A1B007FEAC7 /* MainViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 571A468214DB0A1B007FEAC7 /* MainViewController.m */; }; - 571A468514DB0A1B007FEAC7 /* MainViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 571A468414DB0A1B007FEAC7 /* MainViewController.xib */; }; - 577FC36614DB0B620082BA7B /* www in Resources */ = {isa = PBXBuildFile; fileRef = 577FC36514DB0B620082BA7B /* www */; }; -/* End PBXBuildFile section */ - -/* Begin PBXFileReference section */ - 571A463B14DB0A1B007FEAC7 /* ChildApp.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = ChildApp.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 571A463F14DB0A1B007FEAC7 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; - 571A464114DB0A1B007FEAC7 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; - 571A464314DB0A1B007FEAC7 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; - 571A464514DB0A1B007FEAC7 /* AddressBook.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AddressBook.framework; path = System/Library/Frameworks/AddressBook.framework; sourceTree = SDKROOT; }; - 571A464714DB0A1B007FEAC7 /* AddressBookUI.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AddressBookUI.framework; path = System/Library/Frameworks/AddressBookUI.framework; sourceTree = SDKROOT; }; - 571A464914DB0A1B007FEAC7 /* AudioToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = System/Library/Frameworks/AudioToolbox.framework; sourceTree = SDKROOT; }; - 571A464B14DB0A1B007FEAC7 /* AVFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVFoundation.framework; path = System/Library/Frameworks/AVFoundation.framework; sourceTree = SDKROOT; }; - 571A464D14DB0A1B007FEAC7 /* CoreLocation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreLocation.framework; path = System/Library/Frameworks/CoreLocation.framework; sourceTree = SDKROOT; }; - 571A464F14DB0A1B007FEAC7 /* MediaPlayer.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MediaPlayer.framework; path = System/Library/Frameworks/MediaPlayer.framework; sourceTree = SDKROOT; }; - 571A465114DB0A1B007FEAC7 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; - 571A465314DB0A1B007FEAC7 /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = System/Library/Frameworks/SystemConfiguration.framework; sourceTree = SDKROOT; }; - 571A465514DB0A1B007FEAC7 /* MobileCoreServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MobileCoreServices.framework; path = System/Library/Frameworks/MobileCoreServices.framework; sourceTree = SDKROOT; }; - 571A465714DB0A1B007FEAC7 /* CoreMedia.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMedia.framework; path = System/Library/Frameworks/CoreMedia.framework; sourceTree = SDKROOT; }; - 571A465B14DB0A1B007FEAC7 /* ChildApp-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "ChildApp-Info.plist"; sourceTree = ""; }; - 571A465D14DB0A1B007FEAC7 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; - 571A465F14DB0A1B007FEAC7 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; - 571A466114DB0A1B007FEAC7 /* ChildApp-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "ChildApp-Prefix.pch"; sourceTree = ""; }; - 571A466214DB0A1B007FEAC7 /* PhoneGap.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = PhoneGap.framework; path = /Users/Shared/PhoneGap/Frameworks/PhoneGap.framework; sourceTree = ""; }; - 571A466714DB0A1B007FEAC7 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = Resources/en.lproj/Localizable.strings; sourceTree = ""; }; - 571A466B14DB0A1B007FEAC7 /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = Resources/es.lproj/Localizable.strings; sourceTree = ""; }; - 571A466E14DB0A1B007FEAC7 /* icon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = icon.png; path = Resources/icons/icon.png; sourceTree = ""; }; - 571A467014DB0A1B007FEAC7 /* icon@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "icon@2x.png"; path = "Resources/icons/icon@2x.png"; sourceTree = ""; }; - 571A467214DB0A1B007FEAC7 /* icon-72.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "icon-72.png"; path = "Resources/icons/icon-72.png"; sourceTree = ""; }; - 571A467514DB0A1B007FEAC7 /* Default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Default.png; path = Resources/splash/Default.png; sourceTree = ""; }; - 571A467714DB0A1B007FEAC7 /* Default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Default@2x.png"; path = "Resources/splash/Default@2x.png"; sourceTree = ""; }; - 571A467914DB0A1B007FEAC7 /* Capture.bundle */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.plug-in"; name = Capture.bundle; path = Resources/Capture.bundle; sourceTree = ""; }; - 571A467B14DB0A1B007FEAC7 /* PhoneGap.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = PhoneGap.plist; sourceTree = ""; }; - 571A467E14DB0A1B007FEAC7 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = AppDelegate.h; path = Classes/AppDelegate.h; sourceTree = ""; }; - 571A467F14DB0A1B007FEAC7 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = AppDelegate.m; path = Classes/AppDelegate.m; sourceTree = ""; }; - 571A468114DB0A1B007FEAC7 /* MainViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = MainViewController.h; path = Classes/MainViewController.h; sourceTree = ""; }; - 571A468214DB0A1B007FEAC7 /* MainViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = MainViewController.m; path = Classes/MainViewController.m; sourceTree = ""; }; - 571A468414DB0A1B007FEAC7 /* MainViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = MainViewController.xib; path = Classes/MainViewController.xib; sourceTree = ""; }; - 571A468714DB0A1B007FEAC7 /* README */ = {isa = PBXFileReference; lastKnownFileType = text; name = README; path = Plugins/README; sourceTree = ""; }; - 577FC36514DB0B620082BA7B /* www */ = {isa = PBXFileReference; lastKnownFileType = folder; path = www; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 571A463514DB0A1B007FEAC7 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 571A464014DB0A1B007FEAC7 /* Foundation.framework in Frameworks */, - 571A464214DB0A1B007FEAC7 /* UIKit.framework in Frameworks */, - 571A464414DB0A1B007FEAC7 /* CoreGraphics.framework in Frameworks */, - 571A464614DB0A1B007FEAC7 /* AddressBook.framework in Frameworks */, - 571A464814DB0A1B007FEAC7 /* AddressBookUI.framework in Frameworks */, - 571A464A14DB0A1B007FEAC7 /* AudioToolbox.framework in Frameworks */, - 571A464C14DB0A1B007FEAC7 /* AVFoundation.framework in Frameworks */, - 571A464E14DB0A1B007FEAC7 /* CoreLocation.framework in Frameworks */, - 571A465014DB0A1B007FEAC7 /* MediaPlayer.framework in Frameworks */, - 571A465214DB0A1B007FEAC7 /* QuartzCore.framework in Frameworks */, - 571A465414DB0A1B007FEAC7 /* SystemConfiguration.framework in Frameworks */, - 571A465614DB0A1B007FEAC7 /* MobileCoreServices.framework in Frameworks */, - 571A465814DB0A1B007FEAC7 /* CoreMedia.framework in Frameworks */, - 571A466314DB0A1B007FEAC7 /* PhoneGap.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 571A463814DB0A1B007FEAC7 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 571A462D14DB0A1A007FEAC7 = { - isa = PBXGroup; - children = ( - 577FC36514DB0B620082BA7B /* www */, - 571A465914DB0A1B007FEAC7 /* ChildApp */, - 571A463E14DB0A1B007FEAC7 /* Frameworks */, - 571A463C14DB0A1B007FEAC7 /* Products */, - ); - sourceTree = ""; - }; - 571A463C14DB0A1B007FEAC7 /* Products */ = { - isa = PBXGroup; - children = ( - 571A463B14DB0A1B007FEAC7 /* ChildApp.app */, - ); - name = Products; - sourceTree = ""; - }; - 571A463E14DB0A1B007FEAC7 /* Frameworks */ = { - isa = PBXGroup; - children = ( - 571A463F14DB0A1B007FEAC7 /* Foundation.framework */, - 571A464114DB0A1B007FEAC7 /* UIKit.framework */, - 571A464314DB0A1B007FEAC7 /* CoreGraphics.framework */, - 571A464514DB0A1B007FEAC7 /* AddressBook.framework */, - 571A464714DB0A1B007FEAC7 /* AddressBookUI.framework */, - 571A464914DB0A1B007FEAC7 /* AudioToolbox.framework */, - 571A464B14DB0A1B007FEAC7 /* AVFoundation.framework */, - 571A464D14DB0A1B007FEAC7 /* CoreLocation.framework */, - 571A464F14DB0A1B007FEAC7 /* MediaPlayer.framework */, - 571A465114DB0A1B007FEAC7 /* QuartzCore.framework */, - 571A465314DB0A1B007FEAC7 /* SystemConfiguration.framework */, - 571A465514DB0A1B007FEAC7 /* MobileCoreServices.framework */, - 571A465714DB0A1B007FEAC7 /* CoreMedia.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; - 571A465914DB0A1B007FEAC7 /* ChildApp */ = { - isa = PBXGroup; - children = ( - 571A466214DB0A1B007FEAC7 /* PhoneGap.framework */, - 571A466414DB0A1B007FEAC7 /* Resources */, - 571A467D14DB0A1B007FEAC7 /* Classes */, - 571A468614DB0A1B007FEAC7 /* Plugins */, - 571A465A14DB0A1B007FEAC7 /* Supporting Files */, - ); - path = ChildApp; - sourceTree = ""; - }; - 571A465A14DB0A1B007FEAC7 /* Supporting Files */ = { - isa = PBXGroup; - children = ( - 571A465B14DB0A1B007FEAC7 /* ChildApp-Info.plist */, - 571A465C14DB0A1B007FEAC7 /* InfoPlist.strings */, - 571A465F14DB0A1B007FEAC7 /* main.m */, - 571A466114DB0A1B007FEAC7 /* ChildApp-Prefix.pch */, - 571A467B14DB0A1B007FEAC7 /* PhoneGap.plist */, - 571A468414DB0A1B007FEAC7 /* MainViewController.xib */, - ); - name = "Supporting Files"; - sourceTree = ""; - }; - 571A466414DB0A1B007FEAC7 /* Resources */ = { - isa = PBXGroup; - children = ( - 571A467914DB0A1B007FEAC7 /* Capture.bundle */, - 571A466514DB0A1B007FEAC7 /* en.lproj */, - 571A466914DB0A1B007FEAC7 /* es.lproj */, - 571A466D14DB0A1B007FEAC7 /* icons */, - 571A467414DB0A1B007FEAC7 /* splash */, - ); - name = Resources; - sourceTree = ""; - }; - 571A466514DB0A1B007FEAC7 /* en.lproj */ = { - isa = PBXGroup; - children = ( - 571A466614DB0A1B007FEAC7 /* Localizable.strings */, - ); - name = en.lproj; - sourceTree = ""; - }; - 571A466914DB0A1B007FEAC7 /* es.lproj */ = { - isa = PBXGroup; - children = ( - 571A466A14DB0A1B007FEAC7 /* Localizable.strings */, - ); - name = es.lproj; - sourceTree = ""; - }; - 571A466D14DB0A1B007FEAC7 /* icons */ = { - isa = PBXGroup; - children = ( - 571A466E14DB0A1B007FEAC7 /* icon.png */, - 571A467014DB0A1B007FEAC7 /* icon@2x.png */, - 571A467214DB0A1B007FEAC7 /* icon-72.png */, - ); - name = icons; - sourceTree = ""; - }; - 571A467414DB0A1B007FEAC7 /* splash */ = { - isa = PBXGroup; - children = ( - 571A467514DB0A1B007FEAC7 /* Default.png */, - 571A467714DB0A1B007FEAC7 /* Default@2x.png */, - ); - name = splash; - sourceTree = ""; - }; - 571A467D14DB0A1B007FEAC7 /* Classes */ = { - isa = PBXGroup; - children = ( - 571A467E14DB0A1B007FEAC7 /* AppDelegate.h */, - 571A467F14DB0A1B007FEAC7 /* AppDelegate.m */, - 571A468114DB0A1B007FEAC7 /* MainViewController.h */, - 571A468214DB0A1B007FEAC7 /* MainViewController.m */, - ); - name = Classes; - sourceTree = ""; - }; - 571A468614DB0A1B007FEAC7 /* Plugins */ = { - isa = PBXGroup; - children = ( - 571A468714DB0A1B007FEAC7 /* README */, - ); - name = Plugins; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 571A463A14DB0A1B007FEAC7 /* ChildApp */ = { - isa = PBXNativeTarget; - buildConfigurationList = 571A468A14DB0A1B007FEAC7 /* Build configuration list for PBXNativeTarget "ChildApp" */; - buildPhases = ( - 571A463414DB0A1B007FEAC7 /* Sources */, - 571A463514DB0A1B007FEAC7 /* Frameworks */, - 571A463614DB0A1B007FEAC7 /* Resources */, - 571A463714DB0A1B007FEAC7 /* Sources */, - 571A463814DB0A1B007FEAC7 /* Frameworks */, - 571A463914DB0A1B007FEAC7 /* ShellScript */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = ChildApp; - productName = ChildApp; - productReference = 571A463B14DB0A1B007FEAC7 /* ChildApp.app */; - productType = "com.apple.product-type.application"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 571A462F14DB0A1A007FEAC7 /* Project object */ = { - isa = PBXProject; - attributes = { - LastUpgradeCheck = 0420; - }; - buildConfigurationList = 571A463214DB0A1A007FEAC7 /* Build configuration list for PBXProject "ChildApp" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; - hasScannedForEncodings = 0; - knownRegions = ( - en, - es, - ); - mainGroup = 571A462D14DB0A1A007FEAC7; - productRefGroup = 571A463C14DB0A1B007FEAC7 /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 571A463A14DB0A1B007FEAC7 /* ChildApp */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 571A463614DB0A1B007FEAC7 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 571A465E14DB0A1B007FEAC7 /* InfoPlist.strings in Resources */, - 571A466814DB0A1B007FEAC7 /* Localizable.strings in Resources */, - 571A466C14DB0A1B007FEAC7 /* Localizable.strings in Resources */, - 571A466F14DB0A1B007FEAC7 /* icon.png in Resources */, - 571A467114DB0A1B007FEAC7 /* icon@2x.png in Resources */, - 571A467314DB0A1B007FEAC7 /* icon-72.png in Resources */, - 571A467614DB0A1B007FEAC7 /* Default.png in Resources */, - 571A467814DB0A1B007FEAC7 /* Default@2x.png in Resources */, - 571A467A14DB0A1B007FEAC7 /* Capture.bundle in Resources */, - 571A467C14DB0A1B007FEAC7 /* PhoneGap.plist in Resources */, - 571A468514DB0A1B007FEAC7 /* MainViewController.xib in Resources */, - 577FC36614DB0B620082BA7B /* www in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXShellScriptBuildPhase section */ - 571A463914DB0A1B007FEAC7 /* ShellScript */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/bash; - shellScript = "\n\t\t\t\t\t\t\t\tif [ ! -d \"$PROJECT_DIR/www\" ] ; then\n\t\t\t\t\t\t\t\t\tcp -R /Users/Shared/PhoneGap/Frameworks/PhoneGap.framework/www \"$PROJECT_DIR\"\n\t\t\t\t\t\t\t\tfi\n\t\t\t\t\t\t\t\t# detect www folder reference in project, if missing, print warning\n\t\t\t\t\t\t\t\tgrep \"{isa = PBXFileReference; lastKnownFileType = folder; path = www; sourceTree = \\\"\\\"; };\" \"$PROJECT_DIR/$PROJECT_NAME.xcodeproj/project.pbxproj\"\n\t\t\t\t\t\t\t\trc=$? \n\t\t\t\t\t\t\t\tif [ $rc != 0 ] ; then\n\t\t\t\t\t\t\t\techo -e \"warning: Missing - Add $PROJECT_DIR/www as a folder reference in your project. Just drag and drop the folder into your project, into the Project Navigator of Xcode 4. Make sure you select the second radio-button: 'Create folder references for any added folders' (which will create a blue folder)\" 1>&2\n\t\t\t\t\t\t\t\tfi\t\t\t\t\t\t\t"; - }; -/* End PBXShellScriptBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 571A463414DB0A1B007FEAC7 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 571A466014DB0A1B007FEAC7 /* main.m in Sources */, - 571A468014DB0A1B007FEAC7 /* AppDelegate.m in Sources */, - 571A468314DB0A1B007FEAC7 /* MainViewController.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 571A463714DB0A1B007FEAC7 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin PBXVariantGroup section */ - 571A465C14DB0A1B007FEAC7 /* InfoPlist.strings */ = { - isa = PBXVariantGroup; - children = ( - 571A465D14DB0A1B007FEAC7 /* en */, - ); - name = InfoPlist.strings; - sourceTree = ""; - }; - 571A466614DB0A1B007FEAC7 /* Localizable.strings */ = { - isa = PBXVariantGroup; - children = ( - 571A466714DB0A1B007FEAC7 /* en */, - ); - name = Localizable.strings; - sourceTree = ""; - }; - 571A466A14DB0A1B007FEAC7 /* Localizable.strings */ = { - isa = PBXVariantGroup; - children = ( - 571A466B14DB0A1B007FEAC7 /* es */, - ); - name = Localizable.strings; - sourceTree = ""; - }; -/* End PBXVariantGroup section */ - -/* Begin XCBuildConfiguration section */ - 571A468814DB0A1B007FEAC7 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = "$(ARCHS_STANDARD_32_BIT)"; - CLANG_ENABLE_OBJC_ARC = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - COPY_PHASE_STRIP = NO; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_DYNAMIC_NO_PIC = NO; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_SYMBOLS_PRIVATE_EXTERN = NO; - GCC_VERSION = com.apple.compilers.llvmgcc42; - GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 3.0; - SDKROOT = iphoneos; - }; - name = Debug; - }; - 571A468914DB0A1B007FEAC7 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = "$(ARCHS_STANDARD_32_BIT)"; - CLANG_ENABLE_OBJC_ARC = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - COPY_PHASE_STRIP = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_VERSION = com.apple.compilers.llvmgcc42; - GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 3.0; - SDKROOT = iphoneos; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - 571A468B14DB0A1B007FEAC7 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = YES; - COPY_PHASE_STRIP = NO; - FRAMEWORK_SEARCH_PATHS = /Users/Shared/PhoneGap/Frameworks; - GCC_DYNAMIC_NO_PIC = NO; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = "ChildApp/ChildApp-Prefix.pch"; - GCC_PREPROCESSOR_DEFINITIONS = "PHONEGAP_FRAMEWORK=YES"; - INFOPLIST_FILE = "ChildApp/ChildApp-Info.plist"; - OTHER_LDFLAGS = ( - "-weak_framework", - UIKit, - "-weak_framework", - AVFoundation, - "-weak_framework", - CoreMedia, - "-weak_library", - /usr/lib/libSystem.B.dylib, - ); - PRODUCT_NAME = "$(TARGET_NAME)"; - TARGETED_DEVICE_FAMILY = "1,2"; - WRAPPER_EXTENSION = app; - }; - name = Debug; - }; - 571A468C14DB0A1B007FEAC7 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = YES; - COPY_PHASE_STRIP = YES; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - FRAMEWORK_SEARCH_PATHS = /Users/Shared/PhoneGap/Frameworks; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = "ChildApp/ChildApp-Prefix.pch"; - GCC_PREPROCESSOR_DEFINITIONS = "PHONEGAP_FRAMEWORK=YES"; - INFOPLIST_FILE = "ChildApp/ChildApp-Info.plist"; - OTHER_LDFLAGS = ( - "-weak_framework", - UIKit, - "-weak_framework", - AVFoundation, - "-weak_framework", - CoreMedia, - "-weak_library", - /usr/lib/libSystem.B.dylib, - ); - PRODUCT_NAME = "$(TARGET_NAME)"; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - WRAPPER_EXTENSION = app; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 571A463214DB0A1A007FEAC7 /* Build configuration list for PBXProject "ChildApp" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 571A468814DB0A1B007FEAC7 /* Debug */, - 571A468914DB0A1B007FEAC7 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 571A468A14DB0A1B007FEAC7 /* Build configuration list for PBXNativeTarget "ChildApp" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 571A468B14DB0A1B007FEAC7 /* Debug */, - 571A468C14DB0A1B007FEAC7 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 571A462F14DB0A1A007FEAC7 /* Project object */; -} diff --git a/cordova-lib/spec-plugman/projects/ios-plist/SampleApp.xcodeproj/project.pbxproj b/cordova-lib/spec-plugman/projects/ios-plist/SampleApp.xcodeproj/project.pbxproj deleted file mode 100644 index a4d87f9b4..000000000 --- a/cordova-lib/spec-plugman/projects/ios-plist/SampleApp.xcodeproj/project.pbxproj +++ /dev/null @@ -1,498 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 46; - objects = { - -/* Begin PBXBuildFile section */ - 571A464014DB0A1B007FEAC7 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 571A463F14DB0A1B007FEAC7 /* Foundation.framework */; }; - 571A464214DB0A1B007FEAC7 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 571A464114DB0A1B007FEAC7 /* UIKit.framework */; }; - 571A464414DB0A1B007FEAC7 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 571A464314DB0A1B007FEAC7 /* CoreGraphics.framework */; }; - 571A464614DB0A1B007FEAC7 /* AddressBook.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 571A464514DB0A1B007FEAC7 /* AddressBook.framework */; }; - 571A464814DB0A1B007FEAC7 /* AddressBookUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 571A464714DB0A1B007FEAC7 /* AddressBookUI.framework */; }; - 571A464A14DB0A1B007FEAC7 /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 571A464914DB0A1B007FEAC7 /* AudioToolbox.framework */; }; - 571A464C14DB0A1B007FEAC7 /* AVFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 571A464B14DB0A1B007FEAC7 /* AVFoundation.framework */; }; - 571A464E14DB0A1B007FEAC7 /* CoreLocation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 571A464D14DB0A1B007FEAC7 /* CoreLocation.framework */; }; - 571A465014DB0A1B007FEAC7 /* MediaPlayer.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 571A464F14DB0A1B007FEAC7 /* MediaPlayer.framework */; }; - 571A465214DB0A1B007FEAC7 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 571A465114DB0A1B007FEAC7 /* QuartzCore.framework */; }; - 571A465414DB0A1B007FEAC7 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 571A465314DB0A1B007FEAC7 /* SystemConfiguration.framework */; }; - 571A465614DB0A1B007FEAC7 /* MobileCoreServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 571A465514DB0A1B007FEAC7 /* MobileCoreServices.framework */; }; - 571A465814DB0A1B007FEAC7 /* CoreMedia.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 571A465714DB0A1B007FEAC7 /* CoreMedia.framework */; }; - 571A465E14DB0A1B007FEAC7 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 571A465C14DB0A1B007FEAC7 /* InfoPlist.strings */; }; - 571A466014DB0A1B007FEAC7 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 571A465F14DB0A1B007FEAC7 /* main.m */; }; - 571A466314DB0A1B007FEAC7 /* PhoneGap.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 571A466214DB0A1B007FEAC7 /* PhoneGap.framework */; }; - 571A466814DB0A1B007FEAC7 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 571A466614DB0A1B007FEAC7 /* Localizable.strings */; }; - 571A466C14DB0A1B007FEAC7 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 571A466A14DB0A1B007FEAC7 /* Localizable.strings */; }; - 571A466F14DB0A1B007FEAC7 /* icon.png in Resources */ = {isa = PBXBuildFile; fileRef = 571A466E14DB0A1B007FEAC7 /* icon.png */; }; - 571A467114DB0A1B007FEAC7 /* icon@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 571A467014DB0A1B007FEAC7 /* icon@2x.png */; }; - 571A467314DB0A1B007FEAC7 /* icon-72.png in Resources */ = {isa = PBXBuildFile; fileRef = 571A467214DB0A1B007FEAC7 /* icon-72.png */; }; - 571A467614DB0A1B007FEAC7 /* Default.png in Resources */ = {isa = PBXBuildFile; fileRef = 571A467514DB0A1B007FEAC7 /* Default.png */; }; - 571A467814DB0A1B007FEAC7 /* Default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 571A467714DB0A1B007FEAC7 /* Default@2x.png */; }; - 571A467A14DB0A1B007FEAC7 /* Capture.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 571A467914DB0A1B007FEAC7 /* Capture.bundle */; }; - 571A467C14DB0A1B007FEAC7 /* PhoneGap.plist in Resources */ = {isa = PBXBuildFile; fileRef = 571A467B14DB0A1B007FEAC7 /* PhoneGap.plist */; }; - 571A468014DB0A1B007FEAC7 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 571A467F14DB0A1B007FEAC7 /* AppDelegate.m */; }; - 571A468314DB0A1B007FEAC7 /* MainViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 571A468214DB0A1B007FEAC7 /* MainViewController.m */; }; - 571A468514DB0A1B007FEAC7 /* MainViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 571A468414DB0A1B007FEAC7 /* MainViewController.xib */; }; - 577FC36614DB0B620082BA7B /* www in Resources */ = {isa = PBXBuildFile; fileRef = 577FC36514DB0B620082BA7B /* www */; }; -/* End PBXBuildFile section */ - -/* Begin PBXFileReference section */ - 571A463B14DB0A1B007FEAC7 /* ChildApp.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = ChildApp.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 571A463F14DB0A1B007FEAC7 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; - 571A464114DB0A1B007FEAC7 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; - 571A464314DB0A1B007FEAC7 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; - 571A464514DB0A1B007FEAC7 /* AddressBook.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AddressBook.framework; path = System/Library/Frameworks/AddressBook.framework; sourceTree = SDKROOT; }; - 571A464714DB0A1B007FEAC7 /* AddressBookUI.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AddressBookUI.framework; path = System/Library/Frameworks/AddressBookUI.framework; sourceTree = SDKROOT; }; - 571A464914DB0A1B007FEAC7 /* AudioToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = System/Library/Frameworks/AudioToolbox.framework; sourceTree = SDKROOT; }; - 571A464B14DB0A1B007FEAC7 /* AVFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVFoundation.framework; path = System/Library/Frameworks/AVFoundation.framework; sourceTree = SDKROOT; }; - 571A464D14DB0A1B007FEAC7 /* CoreLocation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreLocation.framework; path = System/Library/Frameworks/CoreLocation.framework; sourceTree = SDKROOT; }; - 571A464F14DB0A1B007FEAC7 /* MediaPlayer.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MediaPlayer.framework; path = System/Library/Frameworks/MediaPlayer.framework; sourceTree = SDKROOT; }; - 571A465114DB0A1B007FEAC7 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; - 571A465314DB0A1B007FEAC7 /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = System/Library/Frameworks/SystemConfiguration.framework; sourceTree = SDKROOT; }; - 571A465514DB0A1B007FEAC7 /* MobileCoreServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MobileCoreServices.framework; path = System/Library/Frameworks/MobileCoreServices.framework; sourceTree = SDKROOT; }; - 571A465714DB0A1B007FEAC7 /* CoreMedia.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMedia.framework; path = System/Library/Frameworks/CoreMedia.framework; sourceTree = SDKROOT; }; - 571A465B14DB0A1B007FEAC7 /* ChildApp-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "ChildApp-Info.plist"; sourceTree = ""; }; - 571A465D14DB0A1B007FEAC7 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; - 571A465F14DB0A1B007FEAC7 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; - 571A466114DB0A1B007FEAC7 /* ChildApp-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "ChildApp-Prefix.pch"; sourceTree = ""; }; - 571A466214DB0A1B007FEAC7 /* PhoneGap.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = PhoneGap.framework; path = /Users/Shared/PhoneGap/Frameworks/PhoneGap.framework; sourceTree = ""; }; - 571A466714DB0A1B007FEAC7 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = Resources/en.lproj/Localizable.strings; sourceTree = ""; }; - 571A466B14DB0A1B007FEAC7 /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = Resources/es.lproj/Localizable.strings; sourceTree = ""; }; - 571A466E14DB0A1B007FEAC7 /* icon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = icon.png; path = Resources/icons/icon.png; sourceTree = ""; }; - 571A467014DB0A1B007FEAC7 /* icon@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "icon@2x.png"; path = "Resources/icons/icon@2x.png"; sourceTree = ""; }; - 571A467214DB0A1B007FEAC7 /* icon-72.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "icon-72.png"; path = "Resources/icons/icon-72.png"; sourceTree = ""; }; - 571A467514DB0A1B007FEAC7 /* Default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Default.png; path = Resources/splash/Default.png; sourceTree = ""; }; - 571A467714DB0A1B007FEAC7 /* Default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Default@2x.png"; path = "Resources/splash/Default@2x.png"; sourceTree = ""; }; - 571A467914DB0A1B007FEAC7 /* Capture.bundle */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.plug-in"; name = Capture.bundle; path = Resources/Capture.bundle; sourceTree = ""; }; - 571A467B14DB0A1B007FEAC7 /* PhoneGap.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = PhoneGap.plist; sourceTree = ""; }; - 571A467E14DB0A1B007FEAC7 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = AppDelegate.h; path = Classes/AppDelegate.h; sourceTree = ""; }; - 571A467F14DB0A1B007FEAC7 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = AppDelegate.m; path = Classes/AppDelegate.m; sourceTree = ""; }; - 571A468114DB0A1B007FEAC7 /* MainViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = MainViewController.h; path = Classes/MainViewController.h; sourceTree = ""; }; - 571A468214DB0A1B007FEAC7 /* MainViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = MainViewController.m; path = Classes/MainViewController.m; sourceTree = ""; }; - 571A468414DB0A1B007FEAC7 /* MainViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = MainViewController.xib; path = Classes/MainViewController.xib; sourceTree = ""; }; - 571A468714DB0A1B007FEAC7 /* README */ = {isa = PBXFileReference; lastKnownFileType = text; name = README; path = Plugins/README; sourceTree = ""; }; - 577FC36514DB0B620082BA7B /* www */ = {isa = PBXFileReference; lastKnownFileType = folder; path = www; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 571A463514DB0A1B007FEAC7 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 571A464014DB0A1B007FEAC7 /* Foundation.framework in Frameworks */, - 571A464214DB0A1B007FEAC7 /* UIKit.framework in Frameworks */, - 571A464414DB0A1B007FEAC7 /* CoreGraphics.framework in Frameworks */, - 571A464614DB0A1B007FEAC7 /* AddressBook.framework in Frameworks */, - 571A464814DB0A1B007FEAC7 /* AddressBookUI.framework in Frameworks */, - 571A464A14DB0A1B007FEAC7 /* AudioToolbox.framework in Frameworks */, - 571A464C14DB0A1B007FEAC7 /* AVFoundation.framework in Frameworks */, - 571A464E14DB0A1B007FEAC7 /* CoreLocation.framework in Frameworks */, - 571A465014DB0A1B007FEAC7 /* MediaPlayer.framework in Frameworks */, - 571A465214DB0A1B007FEAC7 /* QuartzCore.framework in Frameworks */, - 571A465414DB0A1B007FEAC7 /* SystemConfiguration.framework in Frameworks */, - 571A465614DB0A1B007FEAC7 /* MobileCoreServices.framework in Frameworks */, - 571A465814DB0A1B007FEAC7 /* CoreMedia.framework in Frameworks */, - 571A466314DB0A1B007FEAC7 /* PhoneGap.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 571A463814DB0A1B007FEAC7 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 571A462D14DB0A1A007FEAC7 = { - isa = PBXGroup; - children = ( - 577FC36514DB0B620082BA7B /* www */, - 571A465914DB0A1B007FEAC7 /* ChildApp */, - 571A463E14DB0A1B007FEAC7 /* Frameworks */, - 571A463C14DB0A1B007FEAC7 /* Products */, - ); - sourceTree = ""; - }; - 571A463C14DB0A1B007FEAC7 /* Products */ = { - isa = PBXGroup; - children = ( - 571A463B14DB0A1B007FEAC7 /* ChildApp.app */, - ); - name = Products; - sourceTree = ""; - }; - 571A463E14DB0A1B007FEAC7 /* Frameworks */ = { - isa = PBXGroup; - children = ( - 571A463F14DB0A1B007FEAC7 /* Foundation.framework */, - 571A464114DB0A1B007FEAC7 /* UIKit.framework */, - 571A464314DB0A1B007FEAC7 /* CoreGraphics.framework */, - 571A464514DB0A1B007FEAC7 /* AddressBook.framework */, - 571A464714DB0A1B007FEAC7 /* AddressBookUI.framework */, - 571A464914DB0A1B007FEAC7 /* AudioToolbox.framework */, - 571A464B14DB0A1B007FEAC7 /* AVFoundation.framework */, - 571A464D14DB0A1B007FEAC7 /* CoreLocation.framework */, - 571A464F14DB0A1B007FEAC7 /* MediaPlayer.framework */, - 571A465114DB0A1B007FEAC7 /* QuartzCore.framework */, - 571A465314DB0A1B007FEAC7 /* SystemConfiguration.framework */, - 571A465514DB0A1B007FEAC7 /* MobileCoreServices.framework */, - 571A465714DB0A1B007FEAC7 /* CoreMedia.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; - 571A465914DB0A1B007FEAC7 /* ChildApp */ = { - isa = PBXGroup; - children = ( - 571A466214DB0A1B007FEAC7 /* PhoneGap.framework */, - 571A466414DB0A1B007FEAC7 /* Resources */, - 571A467D14DB0A1B007FEAC7 /* Classes */, - 571A468614DB0A1B007FEAC7 /* Plugins */, - 571A465A14DB0A1B007FEAC7 /* Supporting Files */, - ); - path = ChildApp; - sourceTree = ""; - }; - 571A465A14DB0A1B007FEAC7 /* Supporting Files */ = { - isa = PBXGroup; - children = ( - 571A465B14DB0A1B007FEAC7 /* ChildApp-Info.plist */, - 571A465C14DB0A1B007FEAC7 /* InfoPlist.strings */, - 571A465F14DB0A1B007FEAC7 /* main.m */, - 571A466114DB0A1B007FEAC7 /* ChildApp-Prefix.pch */, - 571A467B14DB0A1B007FEAC7 /* PhoneGap.plist */, - 571A468414DB0A1B007FEAC7 /* MainViewController.xib */, - ); - name = "Supporting Files"; - sourceTree = ""; - }; - 571A466414DB0A1B007FEAC7 /* Resources */ = { - isa = PBXGroup; - children = ( - 571A467914DB0A1B007FEAC7 /* Capture.bundle */, - 571A466514DB0A1B007FEAC7 /* en.lproj */, - 571A466914DB0A1B007FEAC7 /* es.lproj */, - 571A466D14DB0A1B007FEAC7 /* icons */, - 571A467414DB0A1B007FEAC7 /* splash */, - ); - name = Resources; - sourceTree = ""; - }; - 571A466514DB0A1B007FEAC7 /* en.lproj */ = { - isa = PBXGroup; - children = ( - 571A466614DB0A1B007FEAC7 /* Localizable.strings */, - ); - name = en.lproj; - sourceTree = ""; - }; - 571A466914DB0A1B007FEAC7 /* es.lproj */ = { - isa = PBXGroup; - children = ( - 571A466A14DB0A1B007FEAC7 /* Localizable.strings */, - ); - name = es.lproj; - sourceTree = ""; - }; - 571A466D14DB0A1B007FEAC7 /* icons */ = { - isa = PBXGroup; - children = ( - 571A466E14DB0A1B007FEAC7 /* icon.png */, - 571A467014DB0A1B007FEAC7 /* icon@2x.png */, - 571A467214DB0A1B007FEAC7 /* icon-72.png */, - ); - name = icons; - sourceTree = ""; - }; - 571A467414DB0A1B007FEAC7 /* splash */ = { - isa = PBXGroup; - children = ( - 571A467514DB0A1B007FEAC7 /* Default.png */, - 571A467714DB0A1B007FEAC7 /* Default@2x.png */, - ); - name = splash; - sourceTree = ""; - }; - 571A467D14DB0A1B007FEAC7 /* Classes */ = { - isa = PBXGroup; - children = ( - 571A467E14DB0A1B007FEAC7 /* AppDelegate.h */, - 571A467F14DB0A1B007FEAC7 /* AppDelegate.m */, - 571A468114DB0A1B007FEAC7 /* MainViewController.h */, - 571A468214DB0A1B007FEAC7 /* MainViewController.m */, - ); - name = Classes; - sourceTree = ""; - }; - 571A468614DB0A1B007FEAC7 /* Plugins */ = { - isa = PBXGroup; - children = ( - 571A468714DB0A1B007FEAC7 /* README */, - ); - name = Plugins; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 571A463A14DB0A1B007FEAC7 /* ChildApp */ = { - isa = PBXNativeTarget; - buildConfigurationList = 571A468A14DB0A1B007FEAC7 /* Build configuration list for PBXNativeTarget "ChildApp" */; - buildPhases = ( - 571A463414DB0A1B007FEAC7 /* Sources */, - 571A463514DB0A1B007FEAC7 /* Frameworks */, - 571A463614DB0A1B007FEAC7 /* Resources */, - 571A463714DB0A1B007FEAC7 /* Sources */, - 571A463814DB0A1B007FEAC7 /* Frameworks */, - 571A463914DB0A1B007FEAC7 /* ShellScript */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = ChildApp; - productName = ChildApp; - productReference = 571A463B14DB0A1B007FEAC7 /* ChildApp.app */; - productType = "com.apple.product-type.application"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 571A462F14DB0A1A007FEAC7 /* Project object */ = { - isa = PBXProject; - attributes = { - LastUpgradeCheck = 0420; - }; - buildConfigurationList = 571A463214DB0A1A007FEAC7 /* Build configuration list for PBXProject "ChildApp" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; - hasScannedForEncodings = 0; - knownRegions = ( - en, - es, - ); - mainGroup = 571A462D14DB0A1A007FEAC7; - productRefGroup = 571A463C14DB0A1B007FEAC7 /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 571A463A14DB0A1B007FEAC7 /* ChildApp */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 571A463614DB0A1B007FEAC7 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 571A465E14DB0A1B007FEAC7 /* InfoPlist.strings in Resources */, - 571A466814DB0A1B007FEAC7 /* Localizable.strings in Resources */, - 571A466C14DB0A1B007FEAC7 /* Localizable.strings in Resources */, - 571A466F14DB0A1B007FEAC7 /* icon.png in Resources */, - 571A467114DB0A1B007FEAC7 /* icon@2x.png in Resources */, - 571A467314DB0A1B007FEAC7 /* icon-72.png in Resources */, - 571A467614DB0A1B007FEAC7 /* Default.png in Resources */, - 571A467814DB0A1B007FEAC7 /* Default@2x.png in Resources */, - 571A467A14DB0A1B007FEAC7 /* Capture.bundle in Resources */, - 571A467C14DB0A1B007FEAC7 /* PhoneGap.plist in Resources */, - 571A468514DB0A1B007FEAC7 /* MainViewController.xib in Resources */, - 577FC36614DB0B620082BA7B /* www in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXShellScriptBuildPhase section */ - 571A463914DB0A1B007FEAC7 /* ShellScript */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/bash; - shellScript = "\n\t\t\t\t\t\t\t\tif [ ! -d \"$PROJECT_DIR/www\" ] ; then\n\t\t\t\t\t\t\t\t\tcp -R /Users/Shared/PhoneGap/Frameworks/PhoneGap.framework/www \"$PROJECT_DIR\"\n\t\t\t\t\t\t\t\tfi\n\t\t\t\t\t\t\t\t# detect www folder reference in project, if missing, print warning\n\t\t\t\t\t\t\t\tgrep \"{isa = PBXFileReference; lastKnownFileType = folder; path = www; sourceTree = \\\"\\\"; };\" \"$PROJECT_DIR/$PROJECT_NAME.xcodeproj/project.pbxproj\"\n\t\t\t\t\t\t\t\trc=$? \n\t\t\t\t\t\t\t\tif [ $rc != 0 ] ; then\n\t\t\t\t\t\t\t\techo -e \"warning: Missing - Add $PROJECT_DIR/www as a folder reference in your project. Just drag and drop the folder into your project, into the Project Navigator of Xcode 4. Make sure you select the second radio-button: 'Create folder references for any added folders' (which will create a blue folder)\" 1>&2\n\t\t\t\t\t\t\t\tfi\t\t\t\t\t\t\t"; - }; -/* End PBXShellScriptBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 571A463414DB0A1B007FEAC7 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 571A466014DB0A1B007FEAC7 /* main.m in Sources */, - 571A468014DB0A1B007FEAC7 /* AppDelegate.m in Sources */, - 571A468314DB0A1B007FEAC7 /* MainViewController.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 571A463714DB0A1B007FEAC7 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin PBXVariantGroup section */ - 571A465C14DB0A1B007FEAC7 /* InfoPlist.strings */ = { - isa = PBXVariantGroup; - children = ( - 571A465D14DB0A1B007FEAC7 /* en */, - ); - name = InfoPlist.strings; - sourceTree = ""; - }; - 571A466614DB0A1B007FEAC7 /* Localizable.strings */ = { - isa = PBXVariantGroup; - children = ( - 571A466714DB0A1B007FEAC7 /* en */, - ); - name = Localizable.strings; - sourceTree = ""; - }; - 571A466A14DB0A1B007FEAC7 /* Localizable.strings */ = { - isa = PBXVariantGroup; - children = ( - 571A466B14DB0A1B007FEAC7 /* es */, - ); - name = Localizable.strings; - sourceTree = ""; - }; -/* End PBXVariantGroup section */ - -/* Begin XCBuildConfiguration section */ - 571A468814DB0A1B007FEAC7 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = "$(ARCHS_STANDARD_32_BIT)"; - CLANG_ENABLE_OBJC_ARC = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - COPY_PHASE_STRIP = NO; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_DYNAMIC_NO_PIC = NO; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_SYMBOLS_PRIVATE_EXTERN = NO; - GCC_VERSION = com.apple.compilers.llvmgcc42; - GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 3.0; - SDKROOT = iphoneos; - }; - name = Debug; - }; - 571A468914DB0A1B007FEAC7 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = "$(ARCHS_STANDARD_32_BIT)"; - CLANG_ENABLE_OBJC_ARC = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - COPY_PHASE_STRIP = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_VERSION = com.apple.compilers.llvmgcc42; - GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 3.0; - SDKROOT = iphoneos; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - 571A468B14DB0A1B007FEAC7 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = YES; - COPY_PHASE_STRIP = NO; - FRAMEWORK_SEARCH_PATHS = /Users/Shared/PhoneGap/Frameworks; - GCC_DYNAMIC_NO_PIC = NO; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = "ChildApp/ChildApp-Prefix.pch"; - GCC_PREPROCESSOR_DEFINITIONS = "PHONEGAP_FRAMEWORK=YES"; - INFOPLIST_FILE = "ChildApp/ChildApp-Info.plist"; - OTHER_LDFLAGS = ( - "-weak_framework", - UIKit, - "-weak_framework", - AVFoundation, - "-weak_framework", - CoreMedia, - "-weak_library", - /usr/lib/libSystem.B.dylib, - ); - PRODUCT_NAME = "$(TARGET_NAME)"; - TARGETED_DEVICE_FAMILY = "1,2"; - WRAPPER_EXTENSION = app; - }; - name = Debug; - }; - 571A468C14DB0A1B007FEAC7 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = YES; - COPY_PHASE_STRIP = YES; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - FRAMEWORK_SEARCH_PATHS = /Users/Shared/PhoneGap/Frameworks; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = "ChildApp/ChildApp-Prefix.pch"; - GCC_PREPROCESSOR_DEFINITIONS = "PHONEGAP_FRAMEWORK=YES"; - INFOPLIST_FILE = "ChildApp/ChildApp-Info.plist"; - OTHER_LDFLAGS = ( - "-weak_framework", - UIKit, - "-weak_framework", - AVFoundation, - "-weak_framework", - CoreMedia, - "-weak_library", - /usr/lib/libSystem.B.dylib, - ); - PRODUCT_NAME = "$(TARGET_NAME)"; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - WRAPPER_EXTENSION = app; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 571A463214DB0A1A007FEAC7 /* Build configuration list for PBXProject "ChildApp" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 571A468814DB0A1B007FEAC7 /* Debug */, - 571A468914DB0A1B007FEAC7 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 571A468A14DB0A1B007FEAC7 /* Build configuration list for PBXNativeTarget "ChildApp" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 571A468B14DB0A1B007FEAC7 /* Debug */, - 571A468C14DB0A1B007FEAC7 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 571A462F14DB0A1A007FEAC7 /* Project object */; -} diff --git a/cordova-lib/spec-plugman/projects/ios-plist/SampleApp/PhoneGap.plist b/cordova-lib/spec-plugman/projects/ios-plist/SampleApp/PhoneGap.plist deleted file mode 100644 index 5ffe25ee2..000000000 --- a/cordova-lib/spec-plugman/projects/ios-plist/SampleApp/PhoneGap.plist +++ /dev/null @@ -1,53 +0,0 @@ - - - - - TopActivityIndicator - gray - EnableLocation - - EnableViewportScale - - AutoHideSplashScreen - - ShowSplashScreenSpinner - - MediaPlaybackRequiresUserAction - - AllowInlineMediaPlayback - - OpenAllWhitelistURLsInWebView - - ExternalHosts - - Plugins - - com.phonegap.accelerometer - PGAccelerometer - com.phonegap.camera - PGCamera - com.phonegap.connection - PGConnection - com.phonegap.contacts - PGContacts - com.phonegap.debugconsole - PGDebugConsole - com.phonegap.file - PGFile - com.phonegap.filetransfer - PGFileTransfer - com.phonegap.geolocation - PGLocation - com.phonegap.notification - PGNotification - com.phonegap.media - PGSound - com.phonegap.mediacapture - PGCapture - com.phonegap.splashscreen - PGSplashScreen - com.phonegap.battery - PGBattery - - - diff --git a/cordova-lib/spec-plugman/projects/ios-plist/SampleApp/SampleApp-Info.plist b/cordova-lib/spec-plugman/projects/ios-plist/SampleApp/SampleApp-Info.plist deleted file mode 100644 index 08b9ee3be..000000000 --- a/cordova-lib/spec-plugman/projects/ios-plist/SampleApp/SampleApp-Info.plist +++ /dev/null @@ -1,80 +0,0 @@ - - - - - - CFBundleIcons - - CFBundlePrimaryIcon - - CFBundleIconFiles - - icon.png - icon@2x.png - icon-72.png - icon-72@2x.png - - UIPrerenderedIcon - - - - UISupportedInterfaceOrientations~ipad - - UIInterfaceOrientationPortrait - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationPortraitUpsideDown - UIInterfaceOrientationLandscapeRight - - UISupportedInterfaceOrientations - - UIInterfaceOrientationPortrait - - CFBundleDevelopmentRegion - English - CFBundleDisplayName - ${PRODUCT_NAME} - CFBundleExecutable - ${EXECUTABLE_NAME} - CFBundleIconFile - icon.png - CFBundleIdentifier - com.example.friendstring - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - ${PRODUCT_NAME} - CFBundlePackageType - APPL - CFBundleSignature - ???? - CFBundleVersion - 1.0 - LSRequiresIPhoneOS - - NSMainNibFile - - NSMainNibFile~ipad - - AppId - $APP_ID - - diff --git a/cordova-lib/spec-plugman/projects/ios-plist/www/.gitkeep b/cordova-lib/spec-plugman/projects/ios-plist/www/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/cordova-lib/spec-plugman/projects/multiple-children/AndroidManifest.xml b/cordova-lib/spec-plugman/projects/multiple-children/AndroidManifest.xml deleted file mode 100644 index 0c528031c..000000000 --- a/cordova-lib/spec-plugman/projects/multiple-children/AndroidManifest.xml +++ /dev/null @@ -1,69 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/cordova-lib/spec-plugman/projects/multiple-children/res/xml/plugins.xml b/cordova-lib/spec-plugman/projects/multiple-children/res/xml/plugins.xml deleted file mode 100644 index 9cee85e44..000000000 --- a/cordova-lib/spec-plugman/projects/multiple-children/res/xml/plugins.xml +++ /dev/null @@ -1,38 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - diff --git a/cordova-lib/spec-plugman/projects/tizen/www/config.xml b/cordova-lib/spec-plugman/projects/tizen/www/config.xml deleted file mode 100644 index 788f6d404..000000000 --- a/cordova-lib/spec-plugman/projects/tizen/www/config.xml +++ /dev/null @@ -1,2 +0,0 @@ - - diff --git a/cordova-lib/spec-plugman/projects/windows8/CordovaApp_TemporaryKey.pfx b/cordova-lib/spec-plugman/projects/windows8/CordovaApp_TemporaryKey.pfx deleted file mode 100644 index 4df1e37a739be1e6b179a8c0b1bca386ac7196b0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2504 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 UETW_c$X6Qy%&v;x{{6xJ15?FqLjV8( diff --git a/cordova-lib/spec-plugman/projects/windows8/TestApp.jsproj b/cordova-lib/spec-plugman/projects/windows8/TestApp.jsproj deleted file mode 100644 index d508c3fb9..000000000 --- a/cordova-lib/spec-plugman/projects/windows8/TestApp.jsproj +++ /dev/null @@ -1,81 +0,0 @@ - - - - - Debug - AnyCPU - - - Debug - ARM - - - Debug - x64 - - - Debug - x86 - - - Release - AnyCPU - - - Release - ARM - - - Release - x64 - - - Release - x86 - - - - efffab2f-bfc5-4eda-b545-45ef4995f55a - - - 11.0 - - - - - - Windows - 8.0 - en-US - CordovaApp_TemporaryKey.pfx - - - - Designer - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/cordova-lib/spec-plugman/projects/windows8/TestApp.sln b/cordova-lib/spec-plugman/projects/windows8/TestApp.sln deleted file mode 100644 index 6c1ea33b9..000000000 --- a/cordova-lib/spec-plugman/projects/windows8/TestApp.sln +++ /dev/null @@ -1,46 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 2012 -Project("{262852C6-CD72-467D-83FE-5EEB1973A190}") = "TestApp", "TestApp.jsproj", "{EFFFAB2F-BFC5-4EDA-B545-45EF4995F55A}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Debug|ARM = Debug|ARM - Debug|x64 = Debug|x64 - Debug|x86 = Debug|x86 - Release|Any CPU = Release|Any CPU - Release|ARM = Release|ARM - Release|x64 = Release|x64 - Release|x86 = Release|x86 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {EFFFAB2F-BFC5-4EDA-B545-45EF4995F55A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {EFFFAB2F-BFC5-4EDA-B545-45EF4995F55A}.Debug|Any CPU.Build.0 = Debug|Any CPU - {EFFFAB2F-BFC5-4EDA-B545-45EF4995F55A}.Debug|Any CPU.Deploy.0 = Debug|Any CPU - {EFFFAB2F-BFC5-4EDA-B545-45EF4995F55A}.Debug|ARM.ActiveCfg = Debug|ARM - {EFFFAB2F-BFC5-4EDA-B545-45EF4995F55A}.Debug|ARM.Build.0 = Debug|ARM - {EFFFAB2F-BFC5-4EDA-B545-45EF4995F55A}.Debug|ARM.Deploy.0 = Debug|ARM - {EFFFAB2F-BFC5-4EDA-B545-45EF4995F55A}.Debug|x64.ActiveCfg = Debug|x64 - {EFFFAB2F-BFC5-4EDA-B545-45EF4995F55A}.Debug|x64.Build.0 = Debug|x64 - {EFFFAB2F-BFC5-4EDA-B545-45EF4995F55A}.Debug|x64.Deploy.0 = Debug|x64 - {EFFFAB2F-BFC5-4EDA-B545-45EF4995F55A}.Debug|x86.ActiveCfg = Debug|x86 - {EFFFAB2F-BFC5-4EDA-B545-45EF4995F55A}.Debug|x86.Build.0 = Debug|x86 - {EFFFAB2F-BFC5-4EDA-B545-45EF4995F55A}.Debug|x86.Deploy.0 = Debug|x86 - {EFFFAB2F-BFC5-4EDA-B545-45EF4995F55A}.Release|Any CPU.ActiveCfg = Release|Any CPU - {EFFFAB2F-BFC5-4EDA-B545-45EF4995F55A}.Release|Any CPU.Build.0 = Release|Any CPU - {EFFFAB2F-BFC5-4EDA-B545-45EF4995F55A}.Release|Any CPU.Deploy.0 = Release|Any CPU - {EFFFAB2F-BFC5-4EDA-B545-45EF4995F55A}.Release|ARM.ActiveCfg = Release|ARM - {EFFFAB2F-BFC5-4EDA-B545-45EF4995F55A}.Release|ARM.Build.0 = Release|ARM - {EFFFAB2F-BFC5-4EDA-B545-45EF4995F55A}.Release|ARM.Deploy.0 = Release|ARM - {EFFFAB2F-BFC5-4EDA-B545-45EF4995F55A}.Release|x64.ActiveCfg = Release|x64 - {EFFFAB2F-BFC5-4EDA-B545-45EF4995F55A}.Release|x64.Build.0 = Release|x64 - {EFFFAB2F-BFC5-4EDA-B545-45EF4995F55A}.Release|x64.Deploy.0 = Release|x64 - {EFFFAB2F-BFC5-4EDA-B545-45EF4995F55A}.Release|x86.ActiveCfg = Release|x86 - {EFFFAB2F-BFC5-4EDA-B545-45EF4995F55A}.Release|x86.Build.0 = Release|x86 - {EFFFAB2F-BFC5-4EDA-B545-45EF4995F55A}.Release|x86.Deploy.0 = Release|x86 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/cordova-lib/spec-plugman/projects/windows8/package.appxmanifest b/cordova-lib/spec-plugman/projects/windows8/package.appxmanifest deleted file mode 100644 index 62c8f28c5..000000000 --- a/cordova-lib/spec-plugman/projects/windows8/package.appxmanifest +++ /dev/null @@ -1,27 +0,0 @@ - - - - - CordovaApp - Jesse - images\storelogo.png - - - 6.2.1 - 6.2.1 - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/cordova-lib/spec-plugman/projects/windows8/www/cordova-2.6.0.js b/cordova-lib/spec-plugman/projects/windows8/www/cordova-2.6.0.js deleted file mode 100644 index 2fedaa6db..000000000 --- a/cordova-lib/spec-plugman/projects/windows8/www/cordova-2.6.0.js +++ /dev/null @@ -1,8075 +0,0 @@ -// Platform: windows8 - -// commit 125dca530923a44a8f44f68f5e1970cbdd4e7faf - -// File generated at :: Wed Apr 03 2013 13:20:16 GMT-0700 (Pacific Daylight Time) - -/* - Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.0 (the - "License"); you may not use this file except in compliance - with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, - software distributed under the License is distributed on an - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - KIND, either express or implied. See the License for the - specific language governing permissions and limitations - under the License. -*/ - -;(function() { - -// file: lib\scripts\require.js - -var require, - define; - -(function () { - var modules = {}; - // Stack of moduleIds currently being built. - var requireStack = []; - // Map of module ID -> index into requireStack of modules currently being built. - var inProgressModules = {}; - - function build(module) { - var factory = module.factory; - module.exports = {}; - delete module.factory; - factory(require, module.exports, module); - return module.exports; - } - - require = function (id) { - if (!modules[id]) { - throw "module " + id + " not found"; - } else if (id in inProgressModules) { - var cycle = requireStack.slice(inProgressModules[id]).join('->') + '->' + id; - throw "Cycle in require graph: " + cycle; - } - if (modules[id].factory) { - try { - inProgressModules[id] = requireStack.length; - requireStack.push(id); - return build(modules[id]); - } finally { - delete inProgressModules[id]; - requireStack.pop(); - } - } - return modules[id].exports; - }; - - define = function (id, factory) { - if (modules[id]) { - throw "module " + id + " already defined"; - } - - modules[id] = { - id: id, - factory: factory - }; - }; - - define.remove = function (id) { - delete modules[id]; - }; - - define.moduleMap = modules; -})(); - -//Export for use in node -if (typeof module === "object" && typeof require === "function") { - module.exports.require = require; - module.exports.define = define; -} - -// file: lib/cordova.js -define("cordova", function(require, exports, module) { - - -var channel = require('cordova/channel'); - -/** - * Listen for DOMContentLoaded and notify our channel subscribers. - */ -document.addEventListener('DOMContentLoaded', function() { - channel.onDOMContentLoaded.fire(); -}, false); -if (document.readyState == 'complete' || document.readyState == 'interactive') { - channel.onDOMContentLoaded.fire(); -} - -/** - * Intercept calls to addEventListener + removeEventListener and handle deviceready, - * resume, and pause events. - */ -var m_document_addEventListener = document.addEventListener; -var m_document_removeEventListener = document.removeEventListener; -var m_window_addEventListener = window.addEventListener; -var m_window_removeEventListener = window.removeEventListener; - -/** - * Houses custom event handlers to intercept on document + window event listeners. - */ -var documentEventHandlers = {}, - windowEventHandlers = {}; - -document.addEventListener = function(evt, handler, capture) { - var e = evt.toLowerCase(); - if (typeof documentEventHandlers[e] != 'undefined') { - documentEventHandlers[e].subscribe(handler); - } else { - m_document_addEventListener.call(document, evt, handler, capture); - } -}; - -window.addEventListener = function(evt, handler, capture) { - var e = evt.toLowerCase(); - if (typeof windowEventHandlers[e] != 'undefined') { - windowEventHandlers[e].subscribe(handler); - } else { - m_window_addEventListener.call(window, evt, handler, capture); - } -}; - -document.removeEventListener = function(evt, handler, capture) { - var e = evt.toLowerCase(); - // If unsubscribing from an event that is handled by a plugin - if (typeof documentEventHandlers[e] != "undefined") { - documentEventHandlers[e].unsubscribe(handler); - } else { - m_document_removeEventListener.call(document, evt, handler, capture); - } -}; - -window.removeEventListener = function(evt, handler, capture) { - var e = evt.toLowerCase(); - // If unsubscribing from an event that is handled by a plugin - if (typeof windowEventHandlers[e] != "undefined") { - windowEventHandlers[e].unsubscribe(handler); - } else { - m_window_removeEventListener.call(window, evt, handler, capture); - } -}; - -function createEvent(type, data) { - var event = document.createEvent('Events'); - event.initEvent(type, false, false); - if (data) { - for (var i in data) { - if (data.hasOwnProperty(i)) { - event[i] = data[i]; - } - } - } - return event; -} - -if(typeof window.console === "undefined") { - window.console = { - log:function(){} - }; -} - -var cordova = { - define:define, - require:require, - /** - * Methods to add/remove your own addEventListener hijacking on document + window. - */ - addWindowEventHandler:function(event) { - return (windowEventHandlers[event] = channel.create(event)); - }, - addStickyDocumentEventHandler:function(event) { - return (documentEventHandlers[event] = channel.createSticky(event)); - }, - addDocumentEventHandler:function(event) { - return (documentEventHandlers[event] = channel.create(event)); - }, - removeWindowEventHandler:function(event) { - delete windowEventHandlers[event]; - }, - removeDocumentEventHandler:function(event) { - delete documentEventHandlers[event]; - }, - /** - * Retrieve original event handlers that were replaced by Cordova - * - * @return object - */ - getOriginalHandlers: function() { - return {'document': {'addEventListener': m_document_addEventListener, 'removeEventListener': m_document_removeEventListener}, - 'window': {'addEventListener': m_window_addEventListener, 'removeEventListener': m_window_removeEventListener}}; - }, - /** - * Method to fire event from native code - * bNoDetach is required for events which cause an exception which needs to be caught in native code - */ - fireDocumentEvent: function(type, data, bNoDetach) { - var evt = createEvent(type, data); - if (typeof documentEventHandlers[type] != 'undefined') { - if( bNoDetach ) { - documentEventHandlers[type].fire(evt); - } - else { - setTimeout(function() { - documentEventHandlers[type].fire(evt); - }, 0); - } - } else { - document.dispatchEvent(evt); - } - }, - fireWindowEvent: function(type, data) { - var evt = createEvent(type,data); - if (typeof windowEventHandlers[type] != 'undefined') { - setTimeout(function() { - windowEventHandlers[type].fire(evt); - }, 0); - } else { - window.dispatchEvent(evt); - } - }, - - /** - * Plugin callback mechanism. - */ - // Randomize the starting callbackId to avoid collisions after refreshing or navigating. - // This way, it's very unlikely that any new callback would get the same callbackId as an old callback. - callbackId: Math.floor(Math.random() * 2000000000), - callbacks: {}, - callbackStatus: { - NO_RESULT: 0, - OK: 1, - CLASS_NOT_FOUND_EXCEPTION: 2, - ILLEGAL_ACCESS_EXCEPTION: 3, - INSTANTIATION_EXCEPTION: 4, - MALFORMED_URL_EXCEPTION: 5, - IO_EXCEPTION: 6, - INVALID_ACTION: 7, - JSON_EXCEPTION: 8, - ERROR: 9 - }, - - /** - * Called by native code when returning successful result from an action. - */ - callbackSuccess: function(callbackId, args) { - try { - cordova.callbackFromNative(callbackId, true, args.status, [args.message], args.keepCallback); - } catch (e) { - console.log("Error in error callback: " + callbackId + " = "+e); - } - }, - - /** - * Called by native code when returning error result from an action. - */ - callbackError: function(callbackId, args) { - // TODO: Deprecate callbackSuccess and callbackError in favour of callbackFromNative. - // Derive success from status. - try { - cordova.callbackFromNative(callbackId, false, args.status, [args.message], args.keepCallback); - } catch (e) { - console.log("Error in error callback: " + callbackId + " = "+e); - } - }, - - /** - * Called by native code when returning the result from an action. - */ - callbackFromNative: function(callbackId, success, status, args, keepCallback) { - var callback = cordova.callbacks[callbackId]; - if (callback) { - if (success && status == cordova.callbackStatus.OK) { - callback.success && callback.success.apply(null, args); - } else if (!success) { - callback.fail && callback.fail.apply(null, args); - } - - // Clear callback if not expecting any more results - if (!keepCallback) { - delete cordova.callbacks[callbackId]; - } - } - }, - addConstructor: function(func) { - channel.onCordovaReady.subscribe(function() { - try { - func(); - } catch(e) { - console.log("Failed to run constructor: " + e); - } - }); - } -}; - -// Register pause, resume and deviceready channels as events on document. -channel.onPause = cordova.addDocumentEventHandler('pause'); -channel.onResume = cordova.addDocumentEventHandler('resume'); -channel.onDeviceReady = cordova.addStickyDocumentEventHandler('deviceready'); - -module.exports = cordova; - -}); - -// file: lib\common\argscheck.js -define("cordova/argscheck", function(require, exports, module) { - -var exec = require('cordova/exec'); -var utils = require('cordova/utils'); - -var moduleExports = module.exports; - -var typeMap = { - 'A': 'Array', - 'D': 'Date', - 'N': 'Number', - 'S': 'String', - 'F': 'Function', - 'O': 'Object' -}; - -function extractParamName(callee, argIndex) { - return (/.*?\((.*?)\)/).exec(callee)[1].split(', ')[argIndex]; -} - -function checkArgs(spec, functionName, args, opt_callee) { - if (!moduleExports.enableChecks) { - return; - } - var errMsg = null; - var typeName; - for (var i = 0; i < spec.length; ++i) { - var c = spec.charAt(i), - cUpper = c.toUpperCase(), - arg = args[i]; - // Asterix means allow anything. - if (c == '*') { - continue; - } - typeName = utils.typeName(arg); - if ((arg === null || arg === undefined) && c == cUpper) { - continue; - } - if (typeName != typeMap[cUpper]) { - errMsg = 'Expected ' + typeMap[cUpper]; - break; - } - } - if (errMsg) { - errMsg += ', but got ' + typeName + '.'; - errMsg = 'Wrong type for parameter "' + extractParamName(opt_callee || args.callee, i) + '" of ' + functionName + ': ' + errMsg; - // Don't log when running jake test. - if (typeof jasmine == 'undefined') { - console.error(errMsg); - } - throw TypeError(errMsg); - } -} - -function getValue(value, defaultValue) { - return value === undefined ? defaultValue : value; -} - -moduleExports.checkArgs = checkArgs; -moduleExports.getValue = getValue; -moduleExports.enableChecks = true; - - -}); - -// file: lib\common\builder.js -define("cordova/builder", function(require, exports, module) { - -var utils = require('cordova/utils'); - -function each(objects, func, context) { - for (var prop in objects) { - if (objects.hasOwnProperty(prop)) { - func.apply(context, [objects[prop], prop]); - } - } -} - -function clobber(obj, key, value) { - exports.replaceHookForTesting(obj, key); - obj[key] = value; - // Getters can only be overridden by getters. - if (obj[key] !== value) { - utils.defineGetter(obj, key, function() { - return value; - }); - } -} - -function assignOrWrapInDeprecateGetter(obj, key, value, message) { - if (message) { - utils.defineGetter(obj, key, function() { - console.log(message); - delete obj[key]; - clobber(obj, key, value); - return value; - }); - } else { - clobber(obj, key, value); - } -} - -function include(parent, objects, clobber, merge) { - each(objects, function (obj, key) { - try { - var result = obj.path ? require(obj.path) : {}; - - if (clobber) { - // Clobber if it doesn't exist. - if (typeof parent[key] === 'undefined') { - assignOrWrapInDeprecateGetter(parent, key, result, obj.deprecated); - } else if (typeof obj.path !== 'undefined') { - // If merging, merge properties onto parent, otherwise, clobber. - if (merge) { - recursiveMerge(parent[key], result); - } else { - assignOrWrapInDeprecateGetter(parent, key, result, obj.deprecated); - } - } - result = parent[key]; - } else { - // Overwrite if not currently defined. - if (typeof parent[key] == 'undefined') { - assignOrWrapInDeprecateGetter(parent, key, result, obj.deprecated); - } else { - // Set result to what already exists, so we can build children into it if they exist. - result = parent[key]; - } - } - - if (obj.children) { - include(result, obj.children, clobber, merge); - } - } catch(e) { - utils.alert('Exception building cordova JS globals: ' + e + ' for key "' + key + '"'); - } - }); -} - -/** - * Merge properties from one object onto another recursively. Properties from - * the src object will overwrite existing target property. - * - * @param target Object to merge properties into. - * @param src Object to merge properties from. - */ -function recursiveMerge(target, src) { - for (var prop in src) { - if (src.hasOwnProperty(prop)) { - if (target.prototype && target.prototype.constructor === target) { - // If the target object is a constructor override off prototype. - clobber(target.prototype, prop, src[prop]); - } else { - if (typeof src[prop] === 'object' && typeof target[prop] === 'object') { - recursiveMerge(target[prop], src[prop]); - } else { - clobber(target, prop, src[prop]); - } - } - } - } -} - -exports.buildIntoButDoNotClobber = function(objects, target) { - include(target, objects, false, false); -}; -exports.buildIntoAndClobber = function(objects, target) { - include(target, objects, true, false); -}; -exports.buildIntoAndMerge = function(objects, target) { - include(target, objects, true, true); -}; -exports.recursiveMerge = recursiveMerge; -exports.assignOrWrapInDeprecateGetter = assignOrWrapInDeprecateGetter; -exports.replaceHookForTesting = function() {}; - -}); - -// file: lib\common\channel.js -define("cordova/channel", function(require, exports, module) { - -var utils = require('cordova/utils'), - nextGuid = 1; - -/** - * Custom pub-sub "channel" that can have functions subscribed to it - * This object is used to define and control firing of events for - * cordova initialization, as well as for custom events thereafter. - * - * The order of events during page load and Cordova startup is as follows: - * - * onDOMContentLoaded* Internal event that is received when the web page is loaded and parsed. - * onNativeReady* Internal event that indicates the Cordova native side is ready. - * onCordovaReady* Internal event fired when all Cordova JavaScript objects have been created. - * onCordovaInfoReady* Internal event fired when device properties are available. - * onCordovaConnectionReady* Internal event fired when the connection property has been set. - * onDeviceReady* User event fired to indicate that Cordova is ready - * onResume User event fired to indicate a start/resume lifecycle event - * onPause User event fired to indicate a pause lifecycle event - * onDestroy* Internal event fired when app is being destroyed (User should use window.onunload event, not this one). - * - * The events marked with an * are sticky. Once they have fired, they will stay in the fired state. - * All listeners that subscribe after the event is fired will be executed right away. - * - * The only Cordova events that user code should register for are: - * deviceready Cordova native code is initialized and Cordova APIs can be called from JavaScript - * pause App has moved to background - * resume App has returned to foreground - * - * Listeners can be registered as: - * document.addEventListener("deviceready", myDeviceReadyListener, false); - * document.addEventListener("resume", myResumeListener, false); - * document.addEventListener("pause", myPauseListener, false); - * - * The DOM lifecycle events should be used for saving and restoring state - * window.onload - * window.onunload - * - */ - -/** - * Channel - * @constructor - * @param type String the channel name - */ -var Channel = function(type, sticky) { - this.type = type; - // Map of guid -> function. - this.handlers = {}; - // 0 = Non-sticky, 1 = Sticky non-fired, 2 = Sticky fired. - this.state = sticky ? 1 : 0; - // Used in sticky mode to remember args passed to fire(). - this.fireArgs = null; - // Used by onHasSubscribersChange to know if there are any listeners. - this.numHandlers = 0; - // Function that is called when the first listener is subscribed, or when - // the last listener is unsubscribed. - this.onHasSubscribersChange = null; -}, - channel = { - /** - * Calls the provided function only after all of the channels specified - * have been fired. All channels must be sticky channels. - */ - join: function(h, c) { - var len = c.length, - i = len, - f = function() { - if (!(--i)) h(); - }; - for (var j=0; j - var scriptElem = document.createElement("script"); - scriptElem.src = "//Microsoft.WinJS.1.0/js/base.js"; - scriptElem.addEventListener("load", onWinJSReady); - document.head.appendChild(scriptElem); - - console.log("added WinJS ... "); - } - else { - onWinJSReady(); - } - }, - clobbers: { - cordova: { - path: 'cordova', - children: { - commandProxy: { - path: 'cordova/commandProxy' - } - } - }, - navigator: { - children: { - console: { - path: "cordova/plugin/windows8/console" - } - } - } - } -}; - -}); - -// file: lib\common\plugin\Acceleration.js -define("cordova/plugin/Acceleration", function(require, exports, module) { - -var Acceleration = function(x, y, z, timestamp) { - this.x = x; - this.y = y; - this.z = z; - this.timestamp = timestamp || (new Date()).getTime(); -}; - -module.exports = Acceleration; - -}); - -// file: lib\common\plugin\Camera.js -define("cordova/plugin/Camera", function(require, exports, module) { - -var argscheck = require('cordova/argscheck'), - exec = require('cordova/exec'), - Camera = require('cordova/plugin/CameraConstants'), - CameraPopoverHandle = require('cordova/plugin/CameraPopoverHandle'); - -var cameraExport = {}; - -// Tack on the Camera Constants to the base camera plugin. -for (var key in Camera) { - cameraExport[key] = Camera[key]; -} - -/** - * Gets a picture from source defined by "options.sourceType", and returns the - * image as defined by the "options.destinationType" option. - - * The defaults are sourceType=CAMERA and destinationType=FILE_URI. - * - * @param {Function} successCallback - * @param {Function} errorCallback - * @param {Object} options - */ -cameraExport.getPicture = function(successCallback, errorCallback, options) { - argscheck.checkArgs('fFO', 'Camera.getPicture', arguments); - options = options || {}; - var getValue = argscheck.getValue; - - var quality = getValue(options.quality, 50); - var destinationType = getValue(options.destinationType, Camera.DestinationType.FILE_URI); - var sourceType = getValue(options.sourceType, Camera.PictureSourceType.CAMERA); - var targetWidth = getValue(options.targetWidth, -1); - var targetHeight = getValue(options.targetHeight, -1); - var encodingType = getValue(options.encodingType, Camera.EncodingType.JPEG); - var mediaType = getValue(options.mediaType, Camera.MediaType.PICTURE); - var allowEdit = !!options.allowEdit; - var correctOrientation = !!options.correctOrientation; - var saveToPhotoAlbum = !!options.saveToPhotoAlbum; - var popoverOptions = getValue(options.popoverOptions, null); - var cameraDirection = getValue(options.cameraDirection, Camera.Direction.BACK); - - var args = [quality, destinationType, sourceType, targetWidth, targetHeight, encodingType, - mediaType, allowEdit, correctOrientation, saveToPhotoAlbum, popoverOptions, cameraDirection]; - - exec(successCallback, errorCallback, "Camera", "takePicture", args); - return new CameraPopoverHandle(); -}; - -cameraExport.cleanup = function(successCallback, errorCallback) { - exec(successCallback, errorCallback, "Camera", "cleanup", []); -}; - -module.exports = cameraExport; - -}); - -// file: lib\common\plugin\CameraConstants.js -define("cordova/plugin/CameraConstants", function(require, exports, module) { - -module.exports = { - DestinationType:{ - DATA_URL: 0, // Return base64 encoded string - FILE_URI: 1, // Return file uri (content://media/external/images/media/2 for Android) - NATIVE_URI: 2 // Return native uri (eg. asset-library://... for iOS) - }, - EncodingType:{ - JPEG: 0, // Return JPEG encoded image - PNG: 1 // Return PNG encoded image - }, - MediaType:{ - PICTURE: 0, // allow selection of still pictures only. DEFAULT. Will return format specified via DestinationType - VIDEO: 1, // allow selection of video only, ONLY RETURNS URL - ALLMEDIA : 2 // allow selection from all media types - }, - PictureSourceType:{ - PHOTOLIBRARY : 0, // Choose image from picture library (same as SAVEDPHOTOALBUM for Android) - CAMERA : 1, // Take picture from camera - SAVEDPHOTOALBUM : 2 // Choose image from picture library (same as PHOTOLIBRARY for Android) - }, - PopoverArrowDirection:{ - ARROW_UP : 1, // matches iOS UIPopoverArrowDirection constants to specify arrow location on popover - ARROW_DOWN : 2, - ARROW_LEFT : 4, - ARROW_RIGHT : 8, - ARROW_ANY : 15 - }, - Direction:{ - BACK: 0, - FRONT: 1 - } -}; - -}); - -// file: lib\common\plugin\CameraPopoverHandle.js -define("cordova/plugin/CameraPopoverHandle", function(require, exports, module) { - -var exec = require('cordova/exec'); - -/** - * A handle to an image picker popover. - */ -var CameraPopoverHandle = function() { - this.setPosition = function(popoverOptions) { - console.log('CameraPopoverHandle.setPosition is only supported on iOS.'); - }; -}; - -module.exports = CameraPopoverHandle; - -}); - -// file: lib\common\plugin\CameraPopoverOptions.js -define("cordova/plugin/CameraPopoverOptions", function(require, exports, module) { - -var Camera = require('cordova/plugin/CameraConstants'); - -/** - * Encapsulates options for iOS Popover image picker - */ -var CameraPopoverOptions = function(x,y,width,height,arrowDir){ - // information of rectangle that popover should be anchored to - this.x = x || 0; - this.y = y || 32; - this.width = width || 320; - this.height = height || 480; - // The direction of the popover arrow - this.arrowDir = arrowDir || Camera.PopoverArrowDirection.ARROW_ANY; -}; - -module.exports = CameraPopoverOptions; - -}); - -// file: lib\common\plugin\CaptureAudioOptions.js -define("cordova/plugin/CaptureAudioOptions", function(require, exports, module) { - -/** - * Encapsulates all audio capture operation configuration options. - */ -var CaptureAudioOptions = function(){ - // Upper limit of sound clips user can record. Value must be equal or greater than 1. - this.limit = 1; - // Maximum duration of a single sound clip in seconds. - this.duration = 0; - // The selected audio mode. Must match with one of the elements in supportedAudioModes array. - this.mode = null; -}; - -module.exports = CaptureAudioOptions; - -}); - -// file: lib\common\plugin\CaptureError.js -define("cordova/plugin/CaptureError", function(require, exports, module) { - -/** - * The CaptureError interface encapsulates all errors in the Capture API. - */ -var CaptureError = function(c) { - this.code = c || null; -}; - -// Camera or microphone failed to capture image or sound. -CaptureError.CAPTURE_INTERNAL_ERR = 0; -// Camera application or audio capture application is currently serving other capture request. -CaptureError.CAPTURE_APPLICATION_BUSY = 1; -// Invalid use of the API (e.g. limit parameter has value less than one). -CaptureError.CAPTURE_INVALID_ARGUMENT = 2; -// User exited camera application or audio capture application before capturing anything. -CaptureError.CAPTURE_NO_MEDIA_FILES = 3; -// The requested capture operation is not supported. -CaptureError.CAPTURE_NOT_SUPPORTED = 20; - -module.exports = CaptureError; - -}); - -// file: lib\common\plugin\CaptureImageOptions.js -define("cordova/plugin/CaptureImageOptions", function(require, exports, module) { - -/** - * Encapsulates all image capture operation configuration options. - */ -var CaptureImageOptions = function(){ - // Upper limit of images user can take. Value must be equal or greater than 1. - this.limit = 1; - // The selected image mode. Must match with one of the elements in supportedImageModes array. - this.mode = null; -}; - -module.exports = CaptureImageOptions; - -}); - -// file: lib\common\plugin\CaptureVideoOptions.js -define("cordova/plugin/CaptureVideoOptions", function(require, exports, module) { - -/** - * Encapsulates all video capture operation configuration options. - */ -var CaptureVideoOptions = function(){ - // Upper limit of videos user can record. Value must be equal or greater than 1. - this.limit = 1; - // Maximum duration of a single video clip in seconds. - this.duration = 0; - // The selected video mode. Must match with one of the elements in supportedVideoModes array. - this.mode = null; -}; - -module.exports = CaptureVideoOptions; - -}); - -// file: lib\common\plugin\CompassError.js -define("cordova/plugin/CompassError", function(require, exports, module) { - -/** - * CompassError. - * An error code assigned by an implementation when an error has occurred - * @constructor - */ -var CompassError = function(err) { - this.code = (err !== undefined ? err : null); -}; - -CompassError.COMPASS_INTERNAL_ERR = 0; -CompassError.COMPASS_NOT_SUPPORTED = 20; - -module.exports = CompassError; - -}); - -// file: lib\common\plugin\CompassHeading.js -define("cordova/plugin/CompassHeading", function(require, exports, module) { - -var CompassHeading = function(magneticHeading, trueHeading, headingAccuracy, timestamp) { - this.magneticHeading = magneticHeading; - this.trueHeading = trueHeading; - this.headingAccuracy = headingAccuracy; - this.timestamp = timestamp || new Date().getTime(); -}; - -module.exports = CompassHeading; - -}); - -// file: lib\common\plugin\ConfigurationData.js -define("cordova/plugin/ConfigurationData", function(require, exports, module) { - -/** - * Encapsulates a set of parameters that the capture device supports. - */ -function ConfigurationData() { - // The ASCII-encoded string in lower case representing the media type. - this.type = null; - // The height attribute represents height of the image or video in pixels. - // In the case of a sound clip this attribute has value 0. - this.height = 0; - // The width attribute represents width of the image or video in pixels. - // In the case of a sound clip this attribute has value 0 - this.width = 0; -} - -module.exports = ConfigurationData; - -}); - -// file: lib\common\plugin\Connection.js -define("cordova/plugin/Connection", function(require, exports, module) { - -/** - * Network status - */ -module.exports = { - UNKNOWN: "unknown", - ETHERNET: "ethernet", - WIFI: "wifi", - CELL_2G: "2g", - CELL_3G: "3g", - CELL_4G: "4g", - CELL:"cellular", - NONE: "none" -}; - -}); - -// file: lib\common\plugin\Contact.js -define("cordova/plugin/Contact", function(require, exports, module) { - -var argscheck = require('cordova/argscheck'), - exec = require('cordova/exec'), - ContactError = require('cordova/plugin/ContactError'), - utils = require('cordova/utils'); - -/** -* Converts primitives into Complex Object -* Currently only used for Date fields -*/ -function convertIn(contact) { - var value = contact.birthday; - try { - contact.birthday = new Date(parseFloat(value)); - } catch (exception){ - console.log("Cordova Contact convertIn error: exception creating date."); - } - return contact; -} - -/** -* Converts Complex objects into primitives -* Only conversion at present is for Dates. -**/ - -function convertOut(contact) { - var value = contact.birthday; - if (value !== null) { - // try to make it a Date object if it is not already - if (!utils.isDate(value)){ - try { - value = new Date(value); - } catch(exception){ - value = null; - } - } - if (utils.isDate(value)){ - value = value.valueOf(); // convert to milliseconds - } - contact.birthday = value; - } - return contact; -} - -/** -* Contains information about a single contact. -* @constructor -* @param {DOMString} id unique identifier -* @param {DOMString} displayName -* @param {ContactName} name -* @param {DOMString} nickname -* @param {Array.} phoneNumbers array of phone numbers -* @param {Array.} emails array of email addresses -* @param {Array.} addresses array of addresses -* @param {Array.} ims instant messaging user ids -* @param {Array.} organizations -* @param {DOMString} birthday contact's birthday -* @param {DOMString} note user notes about contact -* @param {Array.} photos -* @param {Array.} categories -* @param {Array.} urls contact's web sites -*/ -var Contact = function (id, displayName, name, nickname, phoneNumbers, emails, addresses, - ims, organizations, birthday, note, photos, categories, urls) { - this.id = id || null; - this.rawId = null; - this.displayName = displayName || null; - this.name = name || null; // ContactName - this.nickname = nickname || null; - this.phoneNumbers = phoneNumbers || null; // ContactField[] - this.emails = emails || null; // ContactField[] - this.addresses = addresses || null; // ContactAddress[] - this.ims = ims || null; // ContactField[] - this.organizations = organizations || null; // ContactOrganization[] - this.birthday = birthday || null; - this.note = note || null; - this.photos = photos || null; // ContactField[] - this.categories = categories || null; // ContactField[] - this.urls = urls || null; // ContactField[] -}; - -/** -* Removes contact from device storage. -* @param successCB success callback -* @param errorCB error callback -*/ -Contact.prototype.remove = function(successCB, errorCB) { - argscheck.checkArgs('FF', 'Contact.remove', arguments); - var fail = errorCB && function(code) { - errorCB(new ContactError(code)); - }; - if (this.id === null) { - fail(ContactError.UNKNOWN_ERROR); - } - else { - exec(successCB, fail, "Contacts", "remove", [this.id]); - } -}; - -/** -* Creates a deep copy of this Contact. -* With the contact ID set to null. -* @return copy of this Contact -*/ -Contact.prototype.clone = function() { - var clonedContact = utils.clone(this); - clonedContact.id = null; - clonedContact.rawId = null; - - function nullIds(arr) { - if (arr) { - for (var i = 0; i < arr.length; ++i) { - arr[i].id = null; - } - } - } - - // Loop through and clear out any id's in phones, emails, etc. - nullIds(clonedContact.phoneNumbers); - nullIds(clonedContact.emails); - nullIds(clonedContact.addresses); - nullIds(clonedContact.ims); - nullIds(clonedContact.organizations); - nullIds(clonedContact.categories); - nullIds(clonedContact.photos); - nullIds(clonedContact.urls); - return clonedContact; -}; - -/** -* Persists contact to device storage. -* @param successCB success callback -* @param errorCB error callback -*/ -Contact.prototype.save = function(successCB, errorCB) { - argscheck.checkArgs('FFO', 'Contact.save', arguments); - var fail = errorCB && function(code) { - errorCB(new ContactError(code)); - }; - var success = function(result) { - if (result) { - if (successCB) { - var fullContact = require('cordova/plugin/contacts').create(result); - successCB(convertIn(fullContact)); - } - } - else { - // no Entry object returned - fail(ContactError.UNKNOWN_ERROR); - } - }; - var dupContact = convertOut(utils.clone(this)); - exec(success, fail, "Contacts", "save", [dupContact]); -}; - - -module.exports = Contact; - -}); - -// file: lib\common\plugin\ContactAddress.js -define("cordova/plugin/ContactAddress", function(require, exports, module) { - -/** -* Contact address. -* @constructor -* @param {DOMString} id unique identifier, should only be set by native code -* @param formatted // NOTE: not a W3C standard -* @param streetAddress -* @param locality -* @param region -* @param postalCode -* @param country -*/ - -var ContactAddress = function(pref, type, formatted, streetAddress, locality, region, postalCode, country) { - this.id = null; - this.pref = (typeof pref != 'undefined' ? pref : false); - this.type = type || null; - this.formatted = formatted || null; - this.streetAddress = streetAddress || null; - this.locality = locality || null; - this.region = region || null; - this.postalCode = postalCode || null; - this.country = country || null; -}; - -module.exports = ContactAddress; - -}); - -// file: lib\common\plugin\ContactError.js -define("cordova/plugin/ContactError", function(require, exports, module) { - -/** - * ContactError. - * An error code assigned by an implementation when an error has occurred - * @constructor - */ -var ContactError = function(err) { - this.code = (typeof err != 'undefined' ? err : null); -}; - -/** - * Error codes - */ -ContactError.UNKNOWN_ERROR = 0; -ContactError.INVALID_ARGUMENT_ERROR = 1; -ContactError.TIMEOUT_ERROR = 2; -ContactError.PENDING_OPERATION_ERROR = 3; -ContactError.IO_ERROR = 4; -ContactError.NOT_SUPPORTED_ERROR = 5; -ContactError.PERMISSION_DENIED_ERROR = 20; - -module.exports = ContactError; - -}); - -// file: lib\common\plugin\ContactField.js -define("cordova/plugin/ContactField", function(require, exports, module) { - -/** -* Generic contact field. -* @constructor -* @param {DOMString} id unique identifier, should only be set by native code // NOTE: not a W3C standard -* @param type -* @param value -* @param pref -*/ -var ContactField = function(type, value, pref) { - this.id = null; - this.type = (type && type.toString()) || null; - this.value = (value && value.toString()) || null; - this.pref = (typeof pref != 'undefined' ? pref : false); -}; - -module.exports = ContactField; - -}); - -// file: lib\common\plugin\ContactFindOptions.js -define("cordova/plugin/ContactFindOptions", function(require, exports, module) { - -/** - * ContactFindOptions. - * @constructor - * @param filter used to match contacts against - * @param multiple boolean used to determine if more than one contact should be returned - */ - -var ContactFindOptions = function(filter, multiple) { - this.filter = filter || ''; - this.multiple = (typeof multiple != 'undefined' ? multiple : false); -}; - -module.exports = ContactFindOptions; - -}); - -// file: lib\common\plugin\ContactName.js -define("cordova/plugin/ContactName", function(require, exports, module) { - -/** -* Contact name. -* @constructor -* @param formatted // NOTE: not part of W3C standard -* @param familyName -* @param givenName -* @param middle -* @param prefix -* @param suffix -*/ -var ContactName = function(formatted, familyName, givenName, middle, prefix, suffix) { - this.formatted = formatted || null; - this.familyName = familyName || null; - this.givenName = givenName || null; - this.middleName = middle || null; - this.honorificPrefix = prefix || null; - this.honorificSuffix = suffix || null; -}; - -module.exports = ContactName; - -}); - -// file: lib\common\plugin\ContactOrganization.js -define("cordova/plugin/ContactOrganization", function(require, exports, module) { - -/** -* Contact organization. -* @constructor -* @param {DOMString} id unique identifier, should only be set by native code // NOTE: not a W3C standard -* @param name -* @param dept -* @param title -* @param startDate -* @param endDate -* @param location -* @param desc -*/ - -var ContactOrganization = function(pref, type, name, dept, title) { - this.id = null; - this.pref = (typeof pref != 'undefined' ? pref : false); - this.type = type || null; - this.name = name || null; - this.department = dept || null; - this.title = title || null; -}; - -module.exports = ContactOrganization; - -}); - -// file: lib\common\plugin\Coordinates.js -define("cordova/plugin/Coordinates", function(require, exports, module) { - -/** - * This class contains position information. - * @param {Object} lat - * @param {Object} lng - * @param {Object} alt - * @param {Object} acc - * @param {Object} head - * @param {Object} vel - * @param {Object} altacc - * @constructor - */ -var Coordinates = function(lat, lng, alt, acc, head, vel, altacc) { - /** - * The latitude of the position. - */ - this.latitude = lat; - /** - * The longitude of the position, - */ - this.longitude = lng; - /** - * The accuracy of the position. - */ - this.accuracy = acc; - /** - * The altitude of the position. - */ - this.altitude = (alt !== undefined ? alt : null); - /** - * The direction the device is moving at the position. - */ - this.heading = (head !== undefined ? head : null); - /** - * The velocity with which the device is moving at the position. - */ - this.speed = (vel !== undefined ? vel : null); - - if (this.speed === 0 || this.speed === null) { - this.heading = NaN; - } - - /** - * The altitude accuracy of the position. - */ - this.altitudeAccuracy = (altacc !== undefined) ? altacc : null; -}; - -module.exports = Coordinates; - -}); - -// file: lib\common\plugin\DirectoryEntry.js -define("cordova/plugin/DirectoryEntry", function(require, exports, module) { - -var argscheck = require('cordova/argscheck'), - utils = require('cordova/utils'), - exec = require('cordova/exec'), - Entry = require('cordova/plugin/Entry'), - FileError = require('cordova/plugin/FileError'), - DirectoryReader = require('cordova/plugin/DirectoryReader'); - -/** - * An interface representing a directory on the file system. - * - * {boolean} isFile always false (readonly) - * {boolean} isDirectory always true (readonly) - * {DOMString} name of the directory, excluding the path leading to it (readonly) - * {DOMString} fullPath the absolute full path to the directory (readonly) - * TODO: implement this!!! {FileSystem} filesystem on which the directory resides (readonly) - */ -var DirectoryEntry = function(name, fullPath) { - DirectoryEntry.__super__.constructor.call(this, false, true, name, fullPath); -}; - -utils.extend(DirectoryEntry, Entry); - -/** - * Creates a new DirectoryReader to read entries from this directory - */ -DirectoryEntry.prototype.createReader = function() { - return new DirectoryReader(this.fullPath); -}; - -/** - * Creates or looks up a directory - * - * @param {DOMString} path either a relative or absolute path from this directory in which to look up or create a directory - * @param {Flags} options to create or exclusively create the directory - * @param {Function} successCallback is called with the new entry - * @param {Function} errorCallback is called with a FileError - */ -DirectoryEntry.prototype.getDirectory = function(path, options, successCallback, errorCallback) { - argscheck.checkArgs('sOFF', 'DirectoryEntry.getDirectory', arguments); - var win = successCallback && function(result) { - var entry = new DirectoryEntry(result.name, result.fullPath); - successCallback(entry); - }; - var fail = errorCallback && function(code) { - errorCallback(new FileError(code)); - }; - exec(win, fail, "File", "getDirectory", [this.fullPath, path, options]); -}; - -/** - * Deletes a directory and all of it's contents - * - * @param {Function} successCallback is called with no parameters - * @param {Function} errorCallback is called with a FileError - */ -DirectoryEntry.prototype.removeRecursively = function(successCallback, errorCallback) { - argscheck.checkArgs('FF', 'DirectoryEntry.removeRecursively', arguments); - var fail = errorCallback && function(code) { - errorCallback(new FileError(code)); - }; - exec(successCallback, fail, "File", "removeRecursively", [this.fullPath]); -}; - -/** - * Creates or looks up a file - * - * @param {DOMString} path either a relative or absolute path from this directory in which to look up or create a file - * @param {Flags} options to create or exclusively create the file - * @param {Function} successCallback is called with the new entry - * @param {Function} errorCallback is called with a FileError - */ -DirectoryEntry.prototype.getFile = function(path, options, successCallback, errorCallback) { - argscheck.checkArgs('sOFF', 'DirectoryEntry.getFile', arguments); - var win = successCallback && function(result) { - var FileEntry = require('cordova/plugin/FileEntry'); - var entry = new FileEntry(result.name, result.fullPath); - successCallback(entry); - }; - var fail = errorCallback && function(code) { - errorCallback(new FileError(code)); - }; - exec(win, fail, "File", "getFile", [this.fullPath, path, options]); -}; - -module.exports = DirectoryEntry; - -}); - -// file: lib\common\plugin\DirectoryReader.js -define("cordova/plugin/DirectoryReader", function(require, exports, module) { - -var exec = require('cordova/exec'), - FileError = require('cordova/plugin/FileError') ; - -/** - * An interface that lists the files and directories in a directory. - */ -function DirectoryReader(path) { - this.path = path || null; -} - -/** - * Returns a list of entries from a directory. - * - * @param {Function} successCallback is called with a list of entries - * @param {Function} errorCallback is called with a FileError - */ -DirectoryReader.prototype.readEntries = function(successCallback, errorCallback) { - var win = typeof successCallback !== 'function' ? null : function(result) { - var retVal = []; - for (var i=0; i= 2) { - if (end < 0) { - newEnd = Math.max(size + end, 0); - } else { - newEnd = Math.min(end, size); - } - } - - var newFile = new File(this.name, this.fullPath, this.type, this.lastModifiedData, this.size); - newFile.start = this.start + newStart; - newFile.end = this.start + newEnd; - return newFile; -}; - - -module.exports = File; - -}); - -// file: lib\common\plugin\FileEntry.js -define("cordova/plugin/FileEntry", function(require, exports, module) { - -var utils = require('cordova/utils'), - exec = require('cordova/exec'), - Entry = require('cordova/plugin/Entry'), - FileWriter = require('cordova/plugin/FileWriter'), - File = require('cordova/plugin/File'), - FileError = require('cordova/plugin/FileError'); - -/** - * An interface representing a file on the file system. - * - * {boolean} isFile always true (readonly) - * {boolean} isDirectory always false (readonly) - * {DOMString} name of the file, excluding the path leading to it (readonly) - * {DOMString} fullPath the absolute full path to the file (readonly) - * {FileSystem} filesystem on which the file resides (readonly) - */ -var FileEntry = function(name, fullPath) { - FileEntry.__super__.constructor.apply(this, [true, false, name, fullPath]); -}; - -utils.extend(FileEntry, Entry); - -/** - * Creates a new FileWriter associated with the file that this FileEntry represents. - * - * @param {Function} successCallback is called with the new FileWriter - * @param {Function} errorCallback is called with a FileError - */ -FileEntry.prototype.createWriter = function(successCallback, errorCallback) { - this.file(function(filePointer) { - var writer = new FileWriter(filePointer); - - if (writer.fileName === null || writer.fileName === "") { - errorCallback && errorCallback(new FileError(FileError.INVALID_STATE_ERR)); - } else { - successCallback && successCallback(writer); - } - }, errorCallback); -}; - -/** - * Returns a File that represents the current state of the file that this FileEntry represents. - * - * @param {Function} successCallback is called with the new File object - * @param {Function} errorCallback is called with a FileError - */ -FileEntry.prototype.file = function(successCallback, errorCallback) { - var win = successCallback && function(f) { - var file = new File(f.name, f.fullPath, f.type, f.lastModifiedDate, f.size); - successCallback(file); - }; - var fail = errorCallback && function(code) { - errorCallback(new FileError(code)); - }; - exec(win, fail, "File", "getFileMetadata", [this.fullPath]); -}; - - -module.exports = FileEntry; - -}); - -// file: lib\common\plugin\FileError.js -define("cordova/plugin/FileError", function(require, exports, module) { - -/** - * FileError - */ -function FileError(error) { - this.code = error || null; -} - -// File error codes -// Found in DOMException -FileError.NOT_FOUND_ERR = 1; -FileError.SECURITY_ERR = 2; -FileError.ABORT_ERR = 3; - -// Added by File API specification -FileError.NOT_READABLE_ERR = 4; -FileError.ENCODING_ERR = 5; -FileError.NO_MODIFICATION_ALLOWED_ERR = 6; -FileError.INVALID_STATE_ERR = 7; -FileError.SYNTAX_ERR = 8; -FileError.INVALID_MODIFICATION_ERR = 9; -FileError.QUOTA_EXCEEDED_ERR = 10; -FileError.TYPE_MISMATCH_ERR = 11; -FileError.PATH_EXISTS_ERR = 12; - -module.exports = FileError; - -}); - -// file: lib\common\plugin\FileReader.js -define("cordova/plugin/FileReader", function(require, exports, module) { - -var exec = require('cordova/exec'), - modulemapper = require('cordova/modulemapper'), - utils = require('cordova/utils'), - File = require('cordova/plugin/File'), - FileError = require('cordova/plugin/FileError'), - ProgressEvent = require('cordova/plugin/ProgressEvent'), - origFileReader = modulemapper.getOriginalSymbol(this, 'FileReader'); - -/** - * This class reads the mobile device file system. - * - * For Android: - * The root directory is the root of the file system. - * To read from the SD card, the file name is "sdcard/my_file.txt" - * @constructor - */ -var FileReader = function() { - this._readyState = 0; - this._error = null; - this._result = null; - this._fileName = ''; - this._realReader = origFileReader ? new origFileReader() : {}; -}; - -// States -FileReader.EMPTY = 0; -FileReader.LOADING = 1; -FileReader.DONE = 2; - -utils.defineGetter(FileReader.prototype, 'readyState', function() { - return this._fileName ? this._readyState : this._realReader.readyState; -}); - -utils.defineGetter(FileReader.prototype, 'error', function() { - return this._fileName ? this._error: this._realReader.error; -}); - -utils.defineGetter(FileReader.prototype, 'result', function() { - return this._fileName ? this._result: this._realReader.result; -}); - -function defineEvent(eventName) { - utils.defineGetterSetter(FileReader.prototype, eventName, function() { - return this._realReader[eventName] || null; - }, function(value) { - this._realReader[eventName] = value; - }); -} -defineEvent('onloadstart'); // When the read starts. -defineEvent('onprogress'); // While reading (and decoding) file or fileBlob data, and reporting partial file data (progress.loaded/progress.total) -defineEvent('onload'); // When the read has successfully completed. -defineEvent('onerror'); // When the read has failed (see errors). -defineEvent('onloadend'); // When the request has completed (either in success or failure). -defineEvent('onabort'); // When the read has been aborted. For instance, by invoking the abort() method. - -function initRead(reader, file) { - // Already loading something - if (reader.readyState == FileReader.LOADING) { - throw new FileError(FileError.INVALID_STATE_ERR); - } - - reader._result = null; - reader._error = null; - reader._readyState = FileReader.LOADING; - - if (typeof file == 'string') { - // Deprecated in Cordova 2.4. - console.warning('Using a string argument with FileReader.readAs functions is deprecated.'); - reader._fileName = file; - } else if (typeof file.fullPath == 'string') { - reader._fileName = file.fullPath; - } else { - reader._fileName = ''; - return true; - } - - reader.onloadstart && reader.onloadstart(new ProgressEvent("loadstart", {target:reader})); -} - -/** - * Abort reading file. - */ -FileReader.prototype.abort = function() { - if (origFileReader && !this._fileName) { - return this._realReader.abort(); - } - this._result = null; - - if (this._readyState == FileReader.DONE || this._readyState == FileReader.EMPTY) { - return; - } - - this._readyState = FileReader.DONE; - - // If abort callback - if (typeof this.onabort === 'function') { - this.onabort(new ProgressEvent('abort', {target:this})); - } - // If load end callback - if (typeof this.onloadend === 'function') { - this.onloadend(new ProgressEvent('loadend', {target:this})); - } -}; - -/** - * Read text file. - * - * @param file {File} File object containing file properties - * @param encoding [Optional] (see http://www.iana.org/assignments/character-sets) - */ -FileReader.prototype.readAsText = function(file, encoding) { - if (initRead(this, file)) { - return this._realReader.readAsText(file, encoding); - } - - // Default encoding is UTF-8 - var enc = encoding ? encoding : "UTF-8"; - var me = this; - var execArgs = [this._fileName, enc, file.start, file.end]; - - // Read file - exec( - // Success callback - function(r) { - // If DONE (cancelled), then don't do anything - if (me._readyState === FileReader.DONE) { - return; - } - - // Save result - me._result = r; - - // If onload callback - if (typeof me.onload === "function") { - me.onload(new ProgressEvent("load", {target:me})); - } - - // DONE state - me._readyState = FileReader.DONE; - - // If onloadend callback - if (typeof me.onloadend === "function") { - me.onloadend(new ProgressEvent("loadend", {target:me})); - } - }, - // Error callback - function(e) { - // If DONE (cancelled), then don't do anything - if (me._readyState === FileReader.DONE) { - return; - } - - // DONE state - me._readyState = FileReader.DONE; - - // null result - me._result = null; - - // Save error - me._error = new FileError(e); - - // If onerror callback - if (typeof me.onerror === "function") { - me.onerror(new ProgressEvent("error", {target:me})); - } - - // If onloadend callback - if (typeof me.onloadend === "function") { - me.onloadend(new ProgressEvent("loadend", {target:me})); - } - }, "File", "readAsText", execArgs); -}; - - -/** - * Read file and return data as a base64 encoded data url. - * A data url is of the form: - * data:[][;base64], - * - * @param file {File} File object containing file properties - */ -FileReader.prototype.readAsDataURL = function(file) { - if (initRead(this, file)) { - return this._realReader.readAsDataURL(file); - } - - var me = this; - var execArgs = [this._fileName, file.start, file.end]; - - // Read file - exec( - // Success callback - function(r) { - // If DONE (cancelled), then don't do anything - if (me._readyState === FileReader.DONE) { - return; - } - - // DONE state - me._readyState = FileReader.DONE; - - // Save result - me._result = r; - - // If onload callback - if (typeof me.onload === "function") { - me.onload(new ProgressEvent("load", {target:me})); - } - - // If onloadend callback - if (typeof me.onloadend === "function") { - me.onloadend(new ProgressEvent("loadend", {target:me})); - } - }, - // Error callback - function(e) { - // If DONE (cancelled), then don't do anything - if (me._readyState === FileReader.DONE) { - return; - } - - // DONE state - me._readyState = FileReader.DONE; - - me._result = null; - - // Save error - me._error = new FileError(e); - - // If onerror callback - if (typeof me.onerror === "function") { - me.onerror(new ProgressEvent("error", {target:me})); - } - - // If onloadend callback - if (typeof me.onloadend === "function") { - me.onloadend(new ProgressEvent("loadend", {target:me})); - } - }, "File", "readAsDataURL", execArgs); -}; - -/** - * Read file and return data as a binary data. - * - * @param file {File} File object containing file properties - */ -FileReader.prototype.readAsBinaryString = function(file) { - if (initRead(this, file)) { - return this._realReader.readAsBinaryString(file); - } - - var me = this; - var execArgs = [this._fileName, file.start, file.end]; - - // Read file - exec( - // Success callback - function(r) { - // If DONE (cancelled), then don't do anything - if (me._readyState === FileReader.DONE) { - return; - } - - // DONE state - me._readyState = FileReader.DONE; - - me._result = r; - - // If onload callback - if (typeof me.onload === "function") { - me.onload(new ProgressEvent("load", {target:me})); - } - - // If onloadend callback - if (typeof me.onloadend === "function") { - me.onloadend(new ProgressEvent("loadend", {target:me})); - } - }, - // Error callback - function(e) { - // If DONE (cancelled), then don't do anything - if (me._readyState === FileReader.DONE) { - return; - } - - // DONE state - me._readyState = FileReader.DONE; - - me._result = null; - - // Save error - me._error = new FileError(e); - - // If onerror callback - if (typeof me.onerror === "function") { - me.onerror(new ProgressEvent("error", {target:me})); - } - - // If onloadend callback - if (typeof me.onloadend === "function") { - me.onloadend(new ProgressEvent("loadend", {target:me})); - } - }, "File", "readAsBinaryString", execArgs); -}; - -/** - * Read file and return data as a binary data. - * - * @param file {File} File object containing file properties - */ -FileReader.prototype.readAsArrayBuffer = function(file) { - if (initRead(this, file)) { - return this._realReader.readAsArrayBuffer(file); - } - - var me = this; - var execArgs = [this._fileName, file.start, file.end]; - - // Read file - exec( - // Success callback - function(r) { - // If DONE (cancelled), then don't do anything - if (me._readyState === FileReader.DONE) { - return; - } - - // DONE state - me._readyState = FileReader.DONE; - - me._result = r; - - // If onload callback - if (typeof me.onload === "function") { - me.onload(new ProgressEvent("load", {target:me})); - } - - // If onloadend callback - if (typeof me.onloadend === "function") { - me.onloadend(new ProgressEvent("loadend", {target:me})); - } - }, - // Error callback - function(e) { - // If DONE (cancelled), then don't do anything - if (me._readyState === FileReader.DONE) { - return; - } - - // DONE state - me._readyState = FileReader.DONE; - - me._result = null; - - // Save error - me._error = new FileError(e); - - // If onerror callback - if (typeof me.onerror === "function") { - me.onerror(new ProgressEvent("error", {target:me})); - } - - // If onloadend callback - if (typeof me.onloadend === "function") { - me.onloadend(new ProgressEvent("loadend", {target:me})); - } - }, "File", "readAsArrayBuffer", execArgs); -}; - -module.exports = FileReader; - -}); - -// file: lib\common\plugin\FileSystem.js -define("cordova/plugin/FileSystem", function(require, exports, module) { - -var DirectoryEntry = require('cordova/plugin/DirectoryEntry'); - -/** - * An interface representing a file system - * - * @constructor - * {DOMString} name the unique name of the file system (readonly) - * {DirectoryEntry} root directory of the file system (readonly) - */ -var FileSystem = function(name, root) { - this.name = name || null; - if (root) { - this.root = new DirectoryEntry(root.name, root.fullPath); - } -}; - -module.exports = FileSystem; - -}); - -// file: lib\common\plugin\FileTransfer.js -define("cordova/plugin/FileTransfer", function(require, exports, module) { - -var argscheck = require('cordova/argscheck'), - exec = require('cordova/exec'), - FileTransferError = require('cordova/plugin/FileTransferError'), - ProgressEvent = require('cordova/plugin/ProgressEvent'); - -function newProgressEvent(result) { - var pe = new ProgressEvent(); - pe.lengthComputable = result.lengthComputable; - pe.loaded = result.loaded; - pe.total = result.total; - return pe; -} - -function getBasicAuthHeader(urlString) { - var header = null; - - if (window.btoa) { - // parse the url using the Location object - var url = document.createElement('a'); - url.href = urlString; - - var credentials = null; - var protocol = url.protocol + "//"; - var origin = protocol + url.host; - - // check whether there are the username:password credentials in the url - if (url.href.indexOf(origin) != 0) { // credentials found - var atIndex = url.href.indexOf("@"); - credentials = url.href.substring(protocol.length, atIndex); - } - - if (credentials) { - var authHeader = "Authorization"; - var authHeaderValue = "Basic " + window.btoa(credentials); - - header = { - name : authHeader, - value : authHeaderValue - }; - } - } - - return header; -} - -var idCounter = 0; - -/** - * FileTransfer uploads a file to a remote server. - * @constructor - */ -var FileTransfer = function() { - this._id = ++idCounter; - this.onprogress = null; // optional callback -}; - -/** -* Given an absolute file path, uploads a file on the device to a remote server -* using a multipart HTTP request. -* @param filePath {String} Full path of the file on the device -* @param server {String} URL of the server to receive the file -* @param successCallback (Function} Callback to be invoked when upload has completed -* @param errorCallback {Function} Callback to be invoked upon error -* @param options {FileUploadOptions} Optional parameters such as file name and mimetype -* @param trustAllHosts {Boolean} Optional trust all hosts (e.g. for self-signed certs), defaults to false -*/ -FileTransfer.prototype.upload = function(filePath, server, successCallback, errorCallback, options, trustAllHosts) { - argscheck.checkArgs('ssFFO*', 'FileTransfer.upload', arguments); - // check for options - var fileKey = null; - var fileName = null; - var mimeType = null; - var params = null; - var chunkedMode = true; - var headers = null; - - var basicAuthHeader = getBasicAuthHeader(server); - if (basicAuthHeader) { - if (!options) { - options = new FileUploadOptions(); - } - if (!options.headers) { - options.headers = {}; - } - options.headers[basicAuthHeader.name] = basicAuthHeader.value; - } - - if (options) { - fileKey = options.fileKey; - fileName = options.fileName; - mimeType = options.mimeType; - headers = options.headers; - if (options.chunkedMode !== null || typeof options.chunkedMode != "undefined") { - chunkedMode = options.chunkedMode; - } - if (options.params) { - params = options.params; - } - else { - params = {}; - } - } - - var fail = errorCallback && function(e) { - var error = new FileTransferError(e.code, e.source, e.target, e.http_status, e.body); - errorCallback(error); - }; - - var self = this; - var win = function(result) { - if (typeof result.lengthComputable != "undefined") { - if (self.onprogress) { - self.onprogress(newProgressEvent(result)); - } - } else { - successCallback && successCallback(result); - } - }; - exec(win, fail, 'FileTransfer', 'upload', [filePath, server, fileKey, fileName, mimeType, params, trustAllHosts, chunkedMode, headers, this._id]); -}; - -/** - * Downloads a file form a given URL and saves it to the specified directory. - * @param source {String} URL of the server to receive the file - * @param target {String} Full path of the file on the device - * @param successCallback (Function} Callback to be invoked when upload has completed - * @param errorCallback {Function} Callback to be invoked upon error - * @param trustAllHosts {Boolean} Optional trust all hosts (e.g. for self-signed certs), defaults to false - * @param options {FileDownloadOptions} Optional parameters such as headers - */ -FileTransfer.prototype.download = function(source, target, successCallback, errorCallback, trustAllHosts, options) { - argscheck.checkArgs('ssFF*', 'FileTransfer.download', arguments); - var self = this; - - var basicAuthHeader = getBasicAuthHeader(source); - if (basicAuthHeader) { - if (!options) { - options = {}; - } - if (!options.headers) { - options.headers = {}; - } - options.headers[basicAuthHeader.name] = basicAuthHeader.value; - } - - var headers = null; - if (options) { - headers = options.headers || null; - } - - var win = function(result) { - if (typeof result.lengthComputable != "undefined") { - if (self.onprogress) { - return self.onprogress(newProgressEvent(result)); - } - } else if (successCallback) { - var entry = null; - if (result.isDirectory) { - entry = new (require('cordova/plugin/DirectoryEntry'))(); - } - else if (result.isFile) { - entry = new (require('cordova/plugin/FileEntry'))(); - } - entry.isDirectory = result.isDirectory; - entry.isFile = result.isFile; - entry.name = result.name; - entry.fullPath = result.fullPath; - successCallback(entry); - } - }; - - var fail = errorCallback && function(e) { - var error = new FileTransferError(e.code, e.source, e.target, e.http_status, e.body); - errorCallback(error); - }; - - exec(win, fail, 'FileTransfer', 'download', [source, target, trustAllHosts, this._id, headers]); -}; - -/** - * Aborts the ongoing file transfer on this object - * @param successCallback {Function} Callback to be invoked upon success - * @param errorCallback {Function} Callback to be invoked upon error - */ -FileTransfer.prototype.abort = function(successCallback, errorCallback) { - exec(successCallback, errorCallback, 'FileTransfer', 'abort', [this._id]); -}; - -module.exports = FileTransfer; - -}); - -// file: lib\common\plugin\FileTransferError.js -define("cordova/plugin/FileTransferError", function(require, exports, module) { - -/** - * FileTransferError - * @constructor - */ -var FileTransferError = function(code, source, target, status, body) { - this.code = code || null; - this.source = source || null; - this.target = target || null; - this.http_status = status || null; - this.body = body || null; -}; - -FileTransferError.FILE_NOT_FOUND_ERR = 1; -FileTransferError.INVALID_URL_ERR = 2; -FileTransferError.CONNECTION_ERR = 3; -FileTransferError.ABORT_ERR = 4; - -module.exports = FileTransferError; - -}); - -// file: lib\common\plugin\FileUploadOptions.js -define("cordova/plugin/FileUploadOptions", function(require, exports, module) { - -/** - * Options to customize the HTTP request used to upload files. - * @constructor - * @param fileKey {String} Name of file request parameter. - * @param fileName {String} Filename to be used by the server. Defaults to image.jpg. - * @param mimeType {String} Mimetype of the uploaded file. Defaults to image/jpeg. - * @param params {Object} Object with key: value params to send to the server. - * @param headers {Object} Keys are header names, values are header values. Multiple - * headers of the same name are not supported. - */ -var FileUploadOptions = function(fileKey, fileName, mimeType, params, headers) { - this.fileKey = fileKey || null; - this.fileName = fileName || null; - this.mimeType = mimeType || null; - this.params = params || null; - this.headers = headers || null; -}; - -module.exports = FileUploadOptions; - -}); - -// file: lib\common\plugin\FileUploadResult.js -define("cordova/plugin/FileUploadResult", function(require, exports, module) { - -/** - * FileUploadResult - * @constructor - */ -var FileUploadResult = function() { - this.bytesSent = 0; - this.responseCode = null; - this.response = null; -}; - -module.exports = FileUploadResult; - -}); - -// file: lib\common\plugin\FileWriter.js -define("cordova/plugin/FileWriter", function(require, exports, module) { - -var exec = require('cordova/exec'), - FileError = require('cordova/plugin/FileError'), - ProgressEvent = require('cordova/plugin/ProgressEvent'); - -/** - * This class writes to the mobile device file system. - * - * For Android: - * The root directory is the root of the file system. - * To write to the SD card, the file name is "sdcard/my_file.txt" - * - * @constructor - * @param file {File} File object containing file properties - * @param append if true write to the end of the file, otherwise overwrite the file - */ -var FileWriter = function(file) { - this.fileName = ""; - this.length = 0; - if (file) { - this.fileName = file.fullPath || file; - this.length = file.size || 0; - } - // default is to write at the beginning of the file - this.position = 0; - - this.readyState = 0; // EMPTY - - this.result = null; - - // Error - this.error = null; - - // Event handlers - this.onwritestart = null; // When writing starts - this.onprogress = null; // While writing the file, and reporting partial file data - this.onwrite = null; // When the write has successfully completed. - this.onwriteend = null; // When the request has completed (either in success or failure). - this.onabort = null; // When the write has been aborted. For instance, by invoking the abort() method. - this.onerror = null; // When the write has failed (see errors). -}; - -// States -FileWriter.INIT = 0; -FileWriter.WRITING = 1; -FileWriter.DONE = 2; - -/** - * Abort writing file. - */ -FileWriter.prototype.abort = function() { - // check for invalid state - if (this.readyState === FileWriter.DONE || this.readyState === FileWriter.INIT) { - throw new FileError(FileError.INVALID_STATE_ERR); - } - - // set error - this.error = new FileError(FileError.ABORT_ERR); - - this.readyState = FileWriter.DONE; - - // If abort callback - if (typeof this.onabort === "function") { - this.onabort(new ProgressEvent("abort", {"target":this})); - } - - // If write end callback - if (typeof this.onwriteend === "function") { - this.onwriteend(new ProgressEvent("writeend", {"target":this})); - } -}; - -/** - * Writes data to the file - * - * @param text to be written - */ -FileWriter.prototype.write = function(text) { - // Throw an exception if we are already writing a file - if (this.readyState === FileWriter.WRITING) { - throw new FileError(FileError.INVALID_STATE_ERR); - } - - // WRITING state - this.readyState = FileWriter.WRITING; - - var me = this; - - // If onwritestart callback - if (typeof me.onwritestart === "function") { - me.onwritestart(new ProgressEvent("writestart", {"target":me})); - } - - // Write file - exec( - // Success callback - function(r) { - // If DONE (cancelled), then don't do anything - if (me.readyState === FileWriter.DONE) { - return; - } - - // position always increases by bytes written because file would be extended - me.position += r; - // The length of the file is now where we are done writing. - - me.length = me.position; - - // DONE state - me.readyState = FileWriter.DONE; - - // If onwrite callback - if (typeof me.onwrite === "function") { - me.onwrite(new ProgressEvent("write", {"target":me})); - } - - // If onwriteend callback - if (typeof me.onwriteend === "function") { - me.onwriteend(new ProgressEvent("writeend", {"target":me})); - } - }, - // Error callback - function(e) { - // If DONE (cancelled), then don't do anything - if (me.readyState === FileWriter.DONE) { - return; - } - - // DONE state - me.readyState = FileWriter.DONE; - - // Save error - me.error = new FileError(e); - - // If onerror callback - if (typeof me.onerror === "function") { - me.onerror(new ProgressEvent("error", {"target":me})); - } - - // If onwriteend callback - if (typeof me.onwriteend === "function") { - me.onwriteend(new ProgressEvent("writeend", {"target":me})); - } - }, "File", "write", [this.fileName, text, this.position]); -}; - -/** - * Moves the file pointer to the location specified. - * - * If the offset is a negative number the position of the file - * pointer is rewound. If the offset is greater than the file - * size the position is set to the end of the file. - * - * @param offset is the location to move the file pointer to. - */ -FileWriter.prototype.seek = function(offset) { - // Throw an exception if we are already writing a file - if (this.readyState === FileWriter.WRITING) { - throw new FileError(FileError.INVALID_STATE_ERR); - } - - if (!offset && offset !== 0) { - return; - } - - // See back from end of file. - if (offset < 0) { - this.position = Math.max(offset + this.length, 0); - } - // Offset is bigger than file size so set position - // to the end of the file. - else if (offset > this.length) { - this.position = this.length; - } - // Offset is between 0 and file size so set the position - // to start writing. - else { - this.position = offset; - } -}; - -/** - * Truncates the file to the size specified. - * - * @param size to chop the file at. - */ -FileWriter.prototype.truncate = function(size) { - // Throw an exception if we are already writing a file - if (this.readyState === FileWriter.WRITING) { - throw new FileError(FileError.INVALID_STATE_ERR); - } - - // WRITING state - this.readyState = FileWriter.WRITING; - - var me = this; - - // If onwritestart callback - if (typeof me.onwritestart === "function") { - me.onwritestart(new ProgressEvent("writestart", {"target":this})); - } - - // Write file - exec( - // Success callback - function(r) { - // If DONE (cancelled), then don't do anything - if (me.readyState === FileWriter.DONE) { - return; - } - - // DONE state - me.readyState = FileWriter.DONE; - - // Update the length of the file - me.length = r; - me.position = Math.min(me.position, r); - - // If onwrite callback - if (typeof me.onwrite === "function") { - me.onwrite(new ProgressEvent("write", {"target":me})); - } - - // If onwriteend callback - if (typeof me.onwriteend === "function") { - me.onwriteend(new ProgressEvent("writeend", {"target":me})); - } - }, - // Error callback - function(e) { - // If DONE (cancelled), then don't do anything - if (me.readyState === FileWriter.DONE) { - return; - } - - // DONE state - me.readyState = FileWriter.DONE; - - // Save error - me.error = new FileError(e); - - // If onerror callback - if (typeof me.onerror === "function") { - me.onerror(new ProgressEvent("error", {"target":me})); - } - - // If onwriteend callback - if (typeof me.onwriteend === "function") { - me.onwriteend(new ProgressEvent("writeend", {"target":me})); - } - }, "File", "truncate", [this.fileName, size]); -}; - -module.exports = FileWriter; - -}); - -// file: lib\common\plugin\Flags.js -define("cordova/plugin/Flags", function(require, exports, module) { - -/** - * Supplies arguments to methods that lookup or create files and directories. - * - * @param create - * {boolean} file or directory if it doesn't exist - * @param exclusive - * {boolean} used with create; if true the command will fail if - * target path exists - */ -function Flags(create, exclusive) { - this.create = create || false; - this.exclusive = exclusive || false; -} - -module.exports = Flags; - -}); - -// file: lib\common\plugin\GlobalizationError.js -define("cordova/plugin/GlobalizationError", function(require, exports, module) { - - -/** - * Globalization error object - * - * @constructor - * @param code - * @param message - */ -var GlobalizationError = function(code, message) { - this.code = code || null; - this.message = message || ''; -}; - -// Globalization error codes -GlobalizationError.UNKNOWN_ERROR = 0; -GlobalizationError.FORMATTING_ERROR = 1; -GlobalizationError.PARSING_ERROR = 2; -GlobalizationError.PATTERN_ERROR = 3; - -module.exports = GlobalizationError; - -}); - -// file: lib\common\plugin\InAppBrowser.js -define("cordova/plugin/InAppBrowser", function(require, exports, module) { - -var exec = require('cordova/exec'); -var channel = require('cordova/channel'); - -function InAppBrowser() { - this.channels = { - 'loadstart': channel.create('loadstart'), - 'loadstop' : channel.create('loadstop'), - 'loaderror' : channel.create('loaderror'), - 'exit' : channel.create('exit') - }; -} - -InAppBrowser.prototype = { - _eventHandler: function (event) { - if (event.type in this.channels) { - this.channels[event.type].fire(event); - } - }, - close: function (eventname) { - exec(null, null, "InAppBrowser", "close", []); - }, - addEventListener: function (eventname,f) { - if (eventname in this.channels) { - this.channels[eventname].subscribe(f); - } - }, - removeEventListener: function(eventname, f) { - if (eventname in this.channels) { - this.channels[eventname].unsubscribe(f); - } - } -}; - -module.exports = function(strUrl, strWindowName, strWindowFeatures) { - var iab = new InAppBrowser(); - var cb = function(eventname) { - iab._eventHandler(eventname); - }; - exec(cb, cb, "InAppBrowser", "open", [strUrl, strWindowName, strWindowFeatures]); - return iab; -}; - - -}); - -// file: lib\common\plugin\LocalFileSystem.js -define("cordova/plugin/LocalFileSystem", function(require, exports, module) { - -var exec = require('cordova/exec'); - -/** - * Represents a local file system. - */ -var LocalFileSystem = function() { - -}; - -LocalFileSystem.TEMPORARY = 0; //temporary, with no guarantee of persistence -LocalFileSystem.PERSISTENT = 1; //persistent - -module.exports = LocalFileSystem; - -}); - -// file: lib\common\plugin\Media.js -define("cordova/plugin/Media", function(require, exports, module) { - -var argscheck = require('cordova/argscheck'), - utils = require('cordova/utils'), - exec = require('cordova/exec'); - -var mediaObjects = {}; - -/** - * This class provides access to the device media, interfaces to both sound and video - * - * @constructor - * @param src The file name or url to play - * @param successCallback The callback to be called when the file is done playing or recording. - * successCallback() - * @param errorCallback The callback to be called if there is an error. - * errorCallback(int errorCode) - OPTIONAL - * @param statusCallback The callback to be called when media status has changed. - * statusCallback(int statusCode) - OPTIONAL - */ -var Media = function(src, successCallback, errorCallback, statusCallback) { - argscheck.checkArgs('SFFF', 'Media', arguments); - this.id = utils.createUUID(); - mediaObjects[this.id] = this; - this.src = src; - this.successCallback = successCallback; - this.errorCallback = errorCallback; - this.statusCallback = statusCallback; - this._duration = -1; - this._position = -1; - exec(null, this.errorCallback, "Media", "create", [this.id, this.src]); -}; - -// Media messages -Media.MEDIA_STATE = 1; -Media.MEDIA_DURATION = 2; -Media.MEDIA_POSITION = 3; -Media.MEDIA_ERROR = 9; - -// Media states -Media.MEDIA_NONE = 0; -Media.MEDIA_STARTING = 1; -Media.MEDIA_RUNNING = 2; -Media.MEDIA_PAUSED = 3; -Media.MEDIA_STOPPED = 4; -Media.MEDIA_MSG = ["None", "Starting", "Running", "Paused", "Stopped"]; - -// "static" function to return existing objs. -Media.get = function(id) { - return mediaObjects[id]; -}; - -/** - * Start or resume playing audio file. - */ -Media.prototype.play = function(options) { - exec(null, null, "Media", "startPlayingAudio", [this.id, this.src, options]); -}; - -/** - * Stop playing audio file. - */ -Media.prototype.stop = function() { - var me = this; - exec(function() { - me._position = 0; - }, this.errorCallback, "Media", "stopPlayingAudio", [this.id]); -}; - -/** - * Seek or jump to a new time in the track.. - */ -Media.prototype.seekTo = function(milliseconds) { - var me = this; - exec(function(p) { - me._position = p; - }, this.errorCallback, "Media", "seekToAudio", [this.id, milliseconds]); -}; - -/** - * Pause playing audio file. - */ -Media.prototype.pause = function() { - exec(null, this.errorCallback, "Media", "pausePlayingAudio", [this.id]); -}; - -/** - * Get duration of an audio file. - * The duration is only set for audio that is playing, paused or stopped. - * - * @return duration or -1 if not known. - */ -Media.prototype.getDuration = function() { - return this._duration; -}; - -/** - * Get position of audio. - */ -Media.prototype.getCurrentPosition = function(success, fail) { - var me = this; - exec(function(p) { - me._position = p; - success(p); - }, fail, "Media", "getCurrentPositionAudio", [this.id]); -}; - -/** - * Start recording audio file. - */ -Media.prototype.startRecord = function() { - exec(null, this.errorCallback, "Media", "startRecordingAudio", [this.id, this.src]); -}; - -/** - * Stop recording audio file. - */ -Media.prototype.stopRecord = function() { - exec(null, this.errorCallback, "Media", "stopRecordingAudio", [this.id]); -}; - -/** - * Release the resources. - */ -Media.prototype.release = function() { - exec(null, this.errorCallback, "Media", "release", [this.id]); -}; - -/** - * Adjust the volume. - */ -Media.prototype.setVolume = function(volume) { - exec(null, null, "Media", "setVolume", [this.id, volume]); -}; - -/** - * Audio has status update. - * PRIVATE - * - * @param id The media object id (string) - * @param msgType The 'type' of update this is - * @param value Use of value is determined by the msgType - */ -Media.onStatus = function(id, msgType, value) { - - var media = mediaObjects[id]; - - if(media) { - switch(msgType) { - case Media.MEDIA_STATE : - media.statusCallback && media.statusCallback(value); - if(value == Media.MEDIA_STOPPED) { - media.successCallback && media.successCallback(); - } - break; - case Media.MEDIA_DURATION : - media._duration = value; - break; - case Media.MEDIA_ERROR : - media.errorCallback && media.errorCallback(value); - break; - case Media.MEDIA_POSITION : - media._position = Number(value); - break; - default : - console.error && console.error("Unhandled Media.onStatus :: " + msgType); - break; - } - } - else { - console.error && console.error("Received Media.onStatus callback for unknown media :: " + id); - } - -}; - -module.exports = Media; - -}); - -// file: lib\common\plugin\MediaError.js -define("cordova/plugin/MediaError", function(require, exports, module) { - -/** - * This class contains information about any Media errors. -*/ -/* - According to :: http://dev.w3.org/html5/spec-author-view/video.html#mediaerror - We should never be creating these objects, we should just implement the interface - which has 1 property for an instance, 'code' - - instead of doing : - errorCallbackFunction( new MediaError(3,'msg') ); -we should simply use a literal : - errorCallbackFunction( {'code':3} ); - */ - - var _MediaError = window.MediaError; - - -if(!_MediaError) { - window.MediaError = _MediaError = function(code, msg) { - this.code = (typeof code != 'undefined') ? code : null; - this.message = msg || ""; // message is NON-standard! do not use! - }; -} - -_MediaError.MEDIA_ERR_NONE_ACTIVE = _MediaError.MEDIA_ERR_NONE_ACTIVE || 0; -_MediaError.MEDIA_ERR_ABORTED = _MediaError.MEDIA_ERR_ABORTED || 1; -_MediaError.MEDIA_ERR_NETWORK = _MediaError.MEDIA_ERR_NETWORK || 2; -_MediaError.MEDIA_ERR_DECODE = _MediaError.MEDIA_ERR_DECODE || 3; -_MediaError.MEDIA_ERR_NONE_SUPPORTED = _MediaError.MEDIA_ERR_NONE_SUPPORTED || 4; -// TODO: MediaError.MEDIA_ERR_NONE_SUPPORTED is legacy, the W3 spec now defines it as below. -// as defined by http://dev.w3.org/html5/spec-author-view/video.html#error-codes -_MediaError.MEDIA_ERR_SRC_NOT_SUPPORTED = _MediaError.MEDIA_ERR_SRC_NOT_SUPPORTED || 4; - -module.exports = _MediaError; - -}); - -// file: lib\common\plugin\MediaFile.js -define("cordova/plugin/MediaFile", function(require, exports, module) { - -var utils = require('cordova/utils'), - exec = require('cordova/exec'), - File = require('cordova/plugin/File'), - CaptureError = require('cordova/plugin/CaptureError'); -/** - * Represents a single file. - * - * name {DOMString} name of the file, without path information - * fullPath {DOMString} the full path of the file, including the name - * type {DOMString} mime type - * lastModifiedDate {Date} last modified date - * size {Number} size of the file in bytes - */ -var MediaFile = function(name, fullPath, type, lastModifiedDate, size){ - MediaFile.__super__.constructor.apply(this, arguments); -}; - -utils.extend(MediaFile, File); - -/** - * Request capture format data for a specific file and type - * - * @param {Function} successCB - * @param {Function} errorCB - */ -MediaFile.prototype.getFormatData = function(successCallback, errorCallback) { - if (typeof this.fullPath === "undefined" || this.fullPath === null) { - errorCallback(new CaptureError(CaptureError.CAPTURE_INVALID_ARGUMENT)); - } else { - exec(successCallback, errorCallback, "Capture", "getFormatData", [this.fullPath, this.type]); - } -}; - -module.exports = MediaFile; - -}); - -// file: lib\common\plugin\MediaFileData.js -define("cordova/plugin/MediaFileData", function(require, exports, module) { - -/** - * MediaFileData encapsulates format information of a media file. - * - * @param {DOMString} codecs - * @param {long} bitrate - * @param {long} height - * @param {long} width - * @param {float} duration - */ -var MediaFileData = function(codecs, bitrate, height, width, duration){ - this.codecs = codecs || null; - this.bitrate = bitrate || 0; - this.height = height || 0; - this.width = width || 0; - this.duration = duration || 0; -}; - -module.exports = MediaFileData; - -}); - -// file: lib\common\plugin\Metadata.js -define("cordova/plugin/Metadata", function(require, exports, module) { - -/** - * Information about the state of the file or directory - * - * {Date} modificationTime (readonly) - */ -var Metadata = function(time) { - this.modificationTime = (typeof time != 'undefined'?new Date(time):null); -}; - -module.exports = Metadata; - -}); - -// file: lib\common\plugin\Position.js -define("cordova/plugin/Position", function(require, exports, module) { - -var Coordinates = require('cordova/plugin/Coordinates'); - -var Position = function(coords, timestamp) { - if (coords) { - this.coords = new Coordinates(coords.latitude, coords.longitude, coords.altitude, coords.accuracy, coords.heading, coords.velocity, coords.altitudeAccuracy); - } else { - this.coords = new Coordinates(); - } - this.timestamp = (timestamp !== undefined) ? timestamp : new Date(); -}; - -module.exports = Position; - -}); - -// file: lib\common\plugin\PositionError.js -define("cordova/plugin/PositionError", function(require, exports, module) { - -/** - * Position error object - * - * @constructor - * @param code - * @param message - */ -var PositionError = function(code, message) { - this.code = code || null; - this.message = message || ''; -}; - -PositionError.PERMISSION_DENIED = 1; -PositionError.POSITION_UNAVAILABLE = 2; -PositionError.TIMEOUT = 3; - -module.exports = PositionError; - -}); - -// file: lib\common\plugin\ProgressEvent.js -define("cordova/plugin/ProgressEvent", function(require, exports, module) { - -// If ProgressEvent exists in global context, use it already, otherwise use our own polyfill -// Feature test: See if we can instantiate a native ProgressEvent; -// if so, use that approach, -// otherwise fill-in with our own implementation. -// -// NOTE: right now we always fill in with our own. Down the road would be nice if we can use whatever is native in the webview. -var ProgressEvent = (function() { - /* - var createEvent = function(data) { - var event = document.createEvent('Events'); - event.initEvent('ProgressEvent', false, false); - if (data) { - for (var i in data) { - if (data.hasOwnProperty(i)) { - event[i] = data[i]; - } - } - if (data.target) { - // TODO: cannot call .dispatchEvent - // need to first figure out how to implement EventTarget - } - } - return event; - }; - try { - var ev = createEvent({type:"abort",target:document}); - return function ProgressEvent(type, data) { - data.type = type; - return createEvent(data); - }; - } catch(e){ - */ - return function ProgressEvent(type, dict) { - this.type = type; - this.bubbles = false; - this.cancelBubble = false; - this.cancelable = false; - this.lengthComputable = false; - this.loaded = dict && dict.loaded ? dict.loaded : 0; - this.total = dict && dict.total ? dict.total : 0; - this.target = dict && dict.target ? dict.target : null; - }; - //} -})(); - -module.exports = ProgressEvent; - -}); - -// file: lib\common\plugin\accelerometer.js -define("cordova/plugin/accelerometer", function(require, exports, module) { - -/** - * This class provides access to device accelerometer data. - * @constructor - */ -var argscheck = require('cordova/argscheck'), - utils = require("cordova/utils"), - exec = require("cordova/exec"), - Acceleration = require('cordova/plugin/Acceleration'); - -// Is the accel sensor running? -var running = false; - -// Keeps reference to watchAcceleration calls. -var timers = {}; - -// Array of listeners; used to keep track of when we should call start and stop. -var listeners = []; - -// Last returned acceleration object from native -var accel = null; - -// Tells native to start. -function start() { - exec(function(a) { - var tempListeners = listeners.slice(0); - accel = new Acceleration(a.x, a.y, a.z, a.timestamp); - for (var i = 0, l = tempListeners.length; i < l; i++) { - tempListeners[i].win(accel); - } - }, function(e) { - var tempListeners = listeners.slice(0); - for (var i = 0, l = tempListeners.length; i < l; i++) { - tempListeners[i].fail(e); - } - }, "Accelerometer", "start", []); - running = true; -} - -// Tells native to stop. -function stop() { - exec(null, null, "Accelerometer", "stop", []); - running = false; -} - -// Adds a callback pair to the listeners array -function createCallbackPair(win, fail) { - return {win:win, fail:fail}; -} - -// Removes a win/fail listener pair from the listeners array -function removeListeners(l) { - var idx = listeners.indexOf(l); - if (idx > -1) { - listeners.splice(idx, 1); - if (listeners.length === 0) { - stop(); - } - } -} - -var accelerometer = { - /** - * Asynchronously acquires the current acceleration. - * - * @param {Function} successCallback The function to call when the acceleration data is available - * @param {Function} errorCallback The function to call when there is an error getting the acceleration data. (OPTIONAL) - * @param {AccelerationOptions} options The options for getting the accelerometer data such as timeout. (OPTIONAL) - */ - getCurrentAcceleration: function(successCallback, errorCallback, options) { - argscheck.checkArgs('fFO', 'accelerometer.getCurrentAcceleration', arguments); - - var p; - var win = function(a) { - removeListeners(p); - successCallback(a); - }; - var fail = function(e) { - removeListeners(p); - errorCallback && errorCallback(e); - }; - - p = createCallbackPair(win, fail); - listeners.push(p); - - if (!running) { - start(); - } - }, - - /** - * Asynchronously acquires the acceleration repeatedly at a given interval. - * - * @param {Function} successCallback The function to call each time the acceleration data is available - * @param {Function} errorCallback The function to call when there is an error getting the acceleration data. (OPTIONAL) - * @param {AccelerationOptions} options The options for getting the accelerometer data such as timeout. (OPTIONAL) - * @return String The watch id that must be passed to #clearWatch to stop watching. - */ - watchAcceleration: function(successCallback, errorCallback, options) { - argscheck.checkArgs('fFO', 'accelerometer.watchAcceleration', arguments); - // Default interval (10 sec) - var frequency = (options && options.frequency && typeof options.frequency == 'number') ? options.frequency : 10000; - - // Keep reference to watch id, and report accel readings as often as defined in frequency - var id = utils.createUUID(); - - var p = createCallbackPair(function(){}, function(e) { - removeListeners(p); - errorCallback && errorCallback(e); - }); - listeners.push(p); - - timers[id] = { - timer:window.setInterval(function() { - if (accel) { - successCallback(accel); - } - }, frequency), - listeners:p - }; - - if (running) { - // If we're already running then immediately invoke the success callback - // but only if we have retrieved a value, sample code does not check for null ... - if (accel) { - successCallback(accel); - } - } else { - start(); - } - - return id; - }, - - /** - * Clears the specified accelerometer watch. - * - * @param {String} id The id of the watch returned from #watchAcceleration. - */ - clearWatch: function(id) { - // Stop javascript timer & remove from timer list - if (id && timers[id]) { - window.clearInterval(timers[id].timer); - removeListeners(timers[id].listeners); - delete timers[id]; - } - } -}; - -module.exports = accelerometer; - -}); - -// file: lib\common\plugin\accelerometer\symbols.js -define("cordova/plugin/accelerometer/symbols", function(require, exports, module) { - - -var modulemapper = require('cordova/modulemapper'); - -modulemapper.defaults('cordova/plugin/Acceleration', 'Acceleration'); -modulemapper.defaults('cordova/plugin/accelerometer', 'navigator.accelerometer'); - -}); - -// file: lib\common\plugin\battery.js -define("cordova/plugin/battery", function(require, exports, module) { - -/** - * This class contains information about the current battery status. - * @constructor - */ -var cordova = require('cordova'), - exec = require('cordova/exec'); - -function handlers() { - return battery.channels.batterystatus.numHandlers + - battery.channels.batterylow.numHandlers + - battery.channels.batterycritical.numHandlers; -} - -var Battery = function() { - this._level = null; - this._isPlugged = null; - // Create new event handlers on the window (returns a channel instance) - this.channels = { - batterystatus:cordova.addWindowEventHandler("batterystatus"), - batterylow:cordova.addWindowEventHandler("batterylow"), - batterycritical:cordova.addWindowEventHandler("batterycritical") - }; - for (var key in this.channels) { - this.channels[key].onHasSubscribersChange = Battery.onHasSubscribersChange; - } -}; -/** - * Event handlers for when callbacks get registered for the battery. - * Keep track of how many handlers we have so we can start and stop the native battery listener - * appropriately (and hopefully save on battery life!). - */ -Battery.onHasSubscribersChange = function() { - // If we just registered the first handler, make sure native listener is started. - if (this.numHandlers === 1 && handlers() === 1) { - exec(battery._status, battery._error, "Battery", "start", []); - } else if (handlers() === 0) { - exec(null, null, "Battery", "stop", []); - } -}; - -/** - * Callback for battery status - * - * @param {Object} info keys: level, isPlugged - */ -Battery.prototype._status = function(info) { - if (info) { - var me = battery; - var level = info.level; - if (me._level !== level || me._isPlugged !== info.isPlugged) { - // Fire batterystatus event - cordova.fireWindowEvent("batterystatus", info); - - // Fire low battery event - if (level === 20 || level === 5) { - if (level === 20) { - cordova.fireWindowEvent("batterylow", info); - } - else { - cordova.fireWindowEvent("batterycritical", info); - } - } - } - me._level = level; - me._isPlugged = info.isPlugged; - } -}; - -/** - * Error callback for battery start - */ -Battery.prototype._error = function(e) { - console.log("Error initializing Battery: " + e); -}; - -var battery = new Battery(); - -module.exports = battery; - -}); - -// file: lib\common\plugin\battery\symbols.js -define("cordova/plugin/battery/symbols", function(require, exports, module) { - - -var modulemapper = require('cordova/modulemapper'); - -modulemapper.defaults('cordova/plugin/battery', 'navigator.battery'); - -}); - -// file: lib\common\plugin\camera\symbols.js -define("cordova/plugin/camera/symbols", function(require, exports, module) { - - -var modulemapper = require('cordova/modulemapper'); - -modulemapper.defaults('cordova/plugin/Camera', 'navigator.camera'); -modulemapper.defaults('cordova/plugin/CameraConstants', 'Camera'); -modulemapper.defaults('cordova/plugin/CameraPopoverOptions', 'CameraPopoverOptions'); - -}); - -// file: lib\common\plugin\capture.js -define("cordova/plugin/capture", function(require, exports, module) { - -var exec = require('cordova/exec'), - MediaFile = require('cordova/plugin/MediaFile'); - -/** - * Launches a capture of different types. - * - * @param (DOMString} type - * @param {Function} successCB - * @param {Function} errorCB - * @param {CaptureVideoOptions} options - */ -function _capture(type, successCallback, errorCallback, options) { - var win = function(pluginResult) { - var mediaFiles = []; - var i; - for (i = 0; i < pluginResult.length; i++) { - var mediaFile = new MediaFile(); - mediaFile.name = pluginResult[i].name; - mediaFile.fullPath = pluginResult[i].fullPath; - mediaFile.type = pluginResult[i].type; - mediaFile.lastModifiedDate = pluginResult[i].lastModifiedDate; - mediaFile.size = pluginResult[i].size; - mediaFiles.push(mediaFile); - } - successCallback(mediaFiles); - }; - exec(win, errorCallback, "Capture", type, [options]); -} -/** - * The Capture interface exposes an interface to the camera and microphone of the hosting device. - */ -function Capture() { - this.supportedAudioModes = []; - this.supportedImageModes = []; - this.supportedVideoModes = []; -} - -/** - * Launch audio recorder application for recording audio clip(s). - * - * @param {Function} successCB - * @param {Function} errorCB - * @param {CaptureAudioOptions} options - */ -Capture.prototype.captureAudio = function(successCallback, errorCallback, options){ - _capture("captureAudio", successCallback, errorCallback, options); -}; - -/** - * Launch camera application for taking image(s). - * - * @param {Function} successCB - * @param {Function} errorCB - * @param {CaptureImageOptions} options - */ -Capture.prototype.captureImage = function(successCallback, errorCallback, options){ - _capture("captureImage", successCallback, errorCallback, options); -}; - -/** - * Launch device camera application for recording video(s). - * - * @param {Function} successCB - * @param {Function} errorCB - * @param {CaptureVideoOptions} options - */ -Capture.prototype.captureVideo = function(successCallback, errorCallback, options){ - _capture("captureVideo", successCallback, errorCallback, options); -}; - - -module.exports = new Capture(); - -}); - -// file: lib\windows8\plugin\capture\symbols.js -define("cordova/plugin/capture/symbols", function(require, exports, module) { - -var modulemapper = require('cordova/modulemapper'); - -modulemapper.clobbers('cordova/plugin/CaptureError', 'CaptureError'); -modulemapper.clobbers('cordova/plugin/CaptureAudioOptions', 'CaptureAudioOptions'); -modulemapper.clobbers('cordova/plugin/CaptureImageOptions', 'CaptureImageOptions'); -modulemapper.clobbers('cordova/plugin/CaptureVideoOptions', 'CaptureVideoOptions'); -modulemapper.clobbers('cordova/plugin/MediaFile', 'MediaFile'); -modulemapper.clobbers('cordova/plugin/MediaFileData', 'MediaFileData'); -modulemapper.clobbers('cordova/plugin/capture', 'navigator.device.capture'); - -modulemapper.merges('cordova/plugin/windows8/MediaFile', 'MediaFile'); - -}); - -// file: lib\common\plugin\compass.js -define("cordova/plugin/compass", function(require, exports, module) { - -var argscheck = require('cordova/argscheck'), - exec = require('cordova/exec'), - utils = require('cordova/utils'), - CompassHeading = require('cordova/plugin/CompassHeading'), - CompassError = require('cordova/plugin/CompassError'), - timers = {}, - compass = { - /** - * Asynchronously acquires the current heading. - * @param {Function} successCallback The function to call when the heading - * data is available - * @param {Function} errorCallback The function to call when there is an error - * getting the heading data. - * @param {CompassOptions} options The options for getting the heading data (not used). - */ - getCurrentHeading:function(successCallback, errorCallback, options) { - argscheck.checkArgs('fFO', 'compass.getCurrentHeading', arguments); - - var win = function(result) { - var ch = new CompassHeading(result.magneticHeading, result.trueHeading, result.headingAccuracy, result.timestamp); - successCallback(ch); - }; - var fail = errorCallback && function(code) { - var ce = new CompassError(code); - errorCallback(ce); - }; - - // Get heading - exec(win, fail, "Compass", "getHeading", [options]); - }, - - /** - * Asynchronously acquires the heading repeatedly at a given interval. - * @param {Function} successCallback The function to call each time the heading - * data is available - * @param {Function} errorCallback The function to call when there is an error - * getting the heading data. - * @param {HeadingOptions} options The options for getting the heading data - * such as timeout and the frequency of the watch. For iOS, filter parameter - * specifies to watch via a distance filter rather than time. - */ - watchHeading:function(successCallback, errorCallback, options) { - argscheck.checkArgs('fFO', 'compass.watchHeading', arguments); - // Default interval (100 msec) - var frequency = (options !== undefined && options.frequency !== undefined) ? options.frequency : 100; - var filter = (options !== undefined && options.filter !== undefined) ? options.filter : 0; - - var id = utils.createUUID(); - if (filter > 0) { - // is an iOS request for watch by filter, no timer needed - timers[id] = "iOS"; - compass.getCurrentHeading(successCallback, errorCallback, options); - } else { - // Start watch timer to get headings - timers[id] = window.setInterval(function() { - compass.getCurrentHeading(successCallback, errorCallback); - }, frequency); - } - - return id; - }, - - /** - * Clears the specified heading watch. - * @param {String} watchId The ID of the watch returned from #watchHeading. - */ - clearWatch:function(id) { - // Stop javascript timer & remove from timer list - if (id && timers[id]) { - if (timers[id] != "iOS") { - clearInterval(timers[id]); - } else { - // is iOS watch by filter so call into device to stop - exec(null, null, "Compass", "stopHeading", []); - } - delete timers[id]; - } - } - }; - -module.exports = compass; - -}); - -// file: lib\common\plugin\compass\symbols.js -define("cordova/plugin/compass/symbols", function(require, exports, module) { - - -var modulemapper = require('cordova/modulemapper'); - -modulemapper.clobbers('cordova/plugin/CompassHeading', 'CompassHeading'); -modulemapper.clobbers('cordova/plugin/CompassError', 'CompassError'); -modulemapper.clobbers('cordova/plugin/compass', 'navigator.compass'); - -}); - -// file: lib\common\plugin\console-via-logger.js -define("cordova/plugin/console-via-logger", function(require, exports, module) { - -//------------------------------------------------------------------------------ - -var logger = require("cordova/plugin/logger"); -var utils = require("cordova/utils"); - -//------------------------------------------------------------------------------ -// object that we're exporting -//------------------------------------------------------------------------------ -var console = module.exports; - -//------------------------------------------------------------------------------ -// copy of the original console object -//------------------------------------------------------------------------------ -var WinConsole = window.console; - -//------------------------------------------------------------------------------ -// whether to use the logger -//------------------------------------------------------------------------------ -var UseLogger = false; - -//------------------------------------------------------------------------------ -// Timers -//------------------------------------------------------------------------------ -var Timers = {}; - -//------------------------------------------------------------------------------ -// used for unimplemented methods -//------------------------------------------------------------------------------ -function noop() {} - -//------------------------------------------------------------------------------ -// used for unimplemented methods -//------------------------------------------------------------------------------ -console.useLogger = function (value) { - if (arguments.length) UseLogger = !!value; - - if (UseLogger) { - if (logger.useConsole()) { - throw new Error("console and logger are too intertwingly"); - } - } - - return UseLogger; -}; - -//------------------------------------------------------------------------------ -console.log = function() { - if (logger.useConsole()) return; - logger.log.apply(logger, [].slice.call(arguments)); -}; - -//------------------------------------------------------------------------------ -console.error = function() { - if (logger.useConsole()) return; - logger.error.apply(logger, [].slice.call(arguments)); -}; - -//------------------------------------------------------------------------------ -console.warn = function() { - if (logger.useConsole()) return; - logger.warn.apply(logger, [].slice.call(arguments)); -}; - -//------------------------------------------------------------------------------ -console.info = function() { - if (logger.useConsole()) return; - logger.info.apply(logger, [].slice.call(arguments)); -}; - -//------------------------------------------------------------------------------ -console.debug = function() { - if (logger.useConsole()) return; - logger.debug.apply(logger, [].slice.call(arguments)); -}; - -//------------------------------------------------------------------------------ -console.assert = function(expression) { - if (expression) return; - - var message = utils.vformat(arguments[1], [].slice.call(arguments, 2)); - console.log("ASSERT: " + message); -}; - -//------------------------------------------------------------------------------ -console.clear = function() {}; - -//------------------------------------------------------------------------------ -console.dir = function(object) { - console.log("%o", object); -}; - -//------------------------------------------------------------------------------ -console.dirxml = function(node) { - console.log(node.innerHTML); -}; - -//------------------------------------------------------------------------------ -console.trace = noop; - -//------------------------------------------------------------------------------ -console.group = console.log; - -//------------------------------------------------------------------------------ -console.groupCollapsed = console.log; - -//------------------------------------------------------------------------------ -console.groupEnd = noop; - -//------------------------------------------------------------------------------ -console.time = function(name) { - Timers[name] = new Date().valueOf(); -}; - -//------------------------------------------------------------------------------ -console.timeEnd = function(name) { - var timeStart = Timers[name]; - if (!timeStart) { - console.warn("unknown timer: " + name); - return; - } - - var timeElapsed = new Date().valueOf() - timeStart; - console.log(name + ": " + timeElapsed + "ms"); -}; - -//------------------------------------------------------------------------------ -console.timeStamp = noop; - -//------------------------------------------------------------------------------ -console.profile = noop; - -//------------------------------------------------------------------------------ -console.profileEnd = noop; - -//------------------------------------------------------------------------------ -console.count = noop; - -//------------------------------------------------------------------------------ -console.exception = console.log; - -//------------------------------------------------------------------------------ -console.table = function(data, columns) { - console.log("%o", data); -}; - -//------------------------------------------------------------------------------ -// return a new function that calls both functions passed as args -//------------------------------------------------------------------------------ -function wrappedOrigCall(orgFunc, newFunc) { - return function() { - var args = [].slice.call(arguments); - try { orgFunc.apply(WinConsole, args); } catch (e) {} - try { newFunc.apply(console, args); } catch (e) {} - }; -} - -//------------------------------------------------------------------------------ -// For every function that exists in the original console object, that -// also exists in the new console object, wrap the new console method -// with one that calls both -//------------------------------------------------------------------------------ -for (var key in console) { - if (typeof WinConsole[key] == "function") { - console[key] = wrappedOrigCall(WinConsole[key], console[key]); - } -} - -}); - -// file: lib\common\plugin\contacts.js -define("cordova/plugin/contacts", function(require, exports, module) { - -var argscheck = require('cordova/argscheck'), - exec = require('cordova/exec'), - ContactError = require('cordova/plugin/ContactError'), - utils = require('cordova/utils'), - Contact = require('cordova/plugin/Contact'); - -/** -* Represents a group of Contacts. -* @constructor -*/ -var contacts = { - /** - * Returns an array of Contacts matching the search criteria. - * @param fields that should be searched - * @param successCB success callback - * @param errorCB error callback - * @param {ContactFindOptions} options that can be applied to contact searching - * @return array of Contacts matching search criteria - */ - find:function(fields, successCB, errorCB, options) { - argscheck.checkArgs('afFO', 'contacts.find', arguments); - if (!fields.length) { - errorCB && errorCB(new ContactError(ContactError.INVALID_ARGUMENT_ERROR)); - } else { - var win = function(result) { - var cs = []; - for (var i = 0, l = result.length; i < l; i++) { - cs.push(contacts.create(result[i])); - } - successCB(cs); - }; - exec(win, errorCB, "Contacts", "search", [fields, options]); - } - }, - - /** - * This function creates a new contact, but it does not persist the contact - * to device storage. To persist the contact to device storage, invoke - * contact.save(). - * @param properties an object whose properties will be examined to create a new Contact - * @returns new Contact object - */ - create:function(properties) { - argscheck.checkArgs('O', 'contacts.create', arguments); - var contact = new Contact(); - for (var i in properties) { - if (typeof contact[i] !== 'undefined' && properties.hasOwnProperty(i)) { - contact[i] = properties[i]; - } - } - return contact; - } -}; - -module.exports = contacts; - -}); - -// file: lib\common\plugin\contacts\symbols.js -define("cordova/plugin/contacts/symbols", function(require, exports, module) { - - -var modulemapper = require('cordova/modulemapper'); - -modulemapper.clobbers('cordova/plugin/contacts', 'navigator.contacts'); -modulemapper.clobbers('cordova/plugin/Contact', 'Contact'); -modulemapper.clobbers('cordova/plugin/ContactAddress', 'ContactAddress'); -modulemapper.clobbers('cordova/plugin/ContactError', 'ContactError'); -modulemapper.clobbers('cordova/plugin/ContactField', 'ContactField'); -modulemapper.clobbers('cordova/plugin/ContactFindOptions', 'ContactFindOptions'); -modulemapper.clobbers('cordova/plugin/ContactName', 'ContactName'); -modulemapper.clobbers('cordova/plugin/ContactOrganization', 'ContactOrganization'); - -}); - -// file: lib\common\plugin\device.js -define("cordova/plugin/device", function(require, exports, module) { - -var argscheck = require('cordova/argscheck'), - channel = require('cordova/channel'), - utils = require('cordova/utils'), - exec = require('cordova/exec'); - -// Tell cordova channel to wait on the CordovaInfoReady event -channel.waitForInitialization('onCordovaInfoReady'); - -/** - * This represents the mobile device, and provides properties for inspecting the model, version, UUID of the - * phone, etc. - * @constructor - */ -function Device() { - this.available = false; - this.platform = null; - this.version = null; - this.name = null; - this.uuid = null; - this.cordova = null; - this.model = null; - - var me = this; - - channel.onCordovaReady.subscribe(function() { - me.getInfo(function(info) { - me.available = true; - me.platform = info.platform; - me.version = info.version; - me.name = info.name; - me.uuid = info.uuid; - me.cordova = info.cordova; - me.model = info.model; - channel.onCordovaInfoReady.fire(); - },function(e) { - me.available = false; - utils.alert("[ERROR] Error initializing Cordova: " + e); - }); - }); -} - -/** - * Get device info - * - * @param {Function} successCallback The function to call when the heading data is available - * @param {Function} errorCallback The function to call when there is an error getting the heading data. (OPTIONAL) - */ -Device.prototype.getInfo = function(successCallback, errorCallback) { - argscheck.checkArgs('fF', 'Device.getInfo', arguments); - exec(successCallback, errorCallback, "Device", "getDeviceInfo", []); -}; - -module.exports = new Device(); - -}); - -// file: lib\common\plugin\device\symbols.js -define("cordova/plugin/device/symbols", function(require, exports, module) { - - -var modulemapper = require('cordova/modulemapper'); - -modulemapper.clobbers('cordova/plugin/device', 'device'); - -}); - -// file: lib\common\plugin\echo.js -define("cordova/plugin/echo", function(require, exports, module) { - -var exec = require('cordova/exec'), - utils = require('cordova/utils'); - -/** - * Sends the given message through exec() to the Echo plugin, which sends it back to the successCallback. - * @param successCallback invoked with a FileSystem object - * @param errorCallback invoked if error occurs retrieving file system - * @param message The string to be echoed. - * @param forceAsync Whether to force an async return value (for testing native->js bridge). - */ -module.exports = function(successCallback, errorCallback, message, forceAsync) { - var action = 'echo'; - var messageIsMultipart = (utils.typeName(message) == "Array"); - var args = messageIsMultipart ? message : [message]; - - if (utils.typeName(message) == 'ArrayBuffer') { - if (forceAsync) { - console.warn('Cannot echo ArrayBuffer with forced async, falling back to sync.'); - } - action += 'ArrayBuffer'; - } else if (messageIsMultipart) { - if (forceAsync) { - console.warn('Cannot echo MultiPart Array with forced async, falling back to sync.'); - } - action += 'MultiPart'; - } else if (forceAsync) { - action += 'Async'; - } - - exec(successCallback, errorCallback, "Echo", action, args); -}; - - -}); - -// file: lib\windows8\plugin\file\symbols.js -define("cordova/plugin/file/symbols", function(require, exports, module) { - - -var modulemapper = require('cordova/modulemapper'), - symbolshelper = require('cordova/plugin/file/symbolshelper'); - -symbolshelper(modulemapper.defaults); -modulemapper.clobbers('cordova/plugin/File', 'File'); -modulemapper.clobbers('cordova/plugin/FileReader', 'FileReader'); - -}); - -// file: lib\common\plugin\file\symbolshelper.js -define("cordova/plugin/file/symbolshelper", function(require, exports, module) { - -module.exports = function(exportFunc) { - exportFunc('cordova/plugin/DirectoryEntry', 'DirectoryEntry'); - exportFunc('cordova/plugin/DirectoryReader', 'DirectoryReader'); - exportFunc('cordova/plugin/Entry', 'Entry'); - exportFunc('cordova/plugin/File', 'File'); - exportFunc('cordova/plugin/FileEntry', 'FileEntry'); - exportFunc('cordova/plugin/FileError', 'FileError'); - exportFunc('cordova/plugin/FileReader', 'FileReader'); - exportFunc('cordova/plugin/FileSystem', 'FileSystem'); - exportFunc('cordova/plugin/FileUploadOptions', 'FileUploadOptions'); - exportFunc('cordova/plugin/FileUploadResult', 'FileUploadResult'); - exportFunc('cordova/plugin/FileWriter', 'FileWriter'); - exportFunc('cordova/plugin/Flags', 'Flags'); - exportFunc('cordova/plugin/LocalFileSystem', 'LocalFileSystem'); - exportFunc('cordova/plugin/Metadata', 'Metadata'); - exportFunc('cordova/plugin/ProgressEvent', 'ProgressEvent'); - exportFunc('cordova/plugin/requestFileSystem', 'requestFileSystem'); - exportFunc('cordova/plugin/resolveLocalFileSystemURI', 'resolveLocalFileSystemURI'); -}; - -}); - -// file: lib\common\plugin\filetransfer\symbols.js -define("cordova/plugin/filetransfer/symbols", function(require, exports, module) { - - -var modulemapper = require('cordova/modulemapper'); - -modulemapper.clobbers('cordova/plugin/FileTransfer', 'FileTransfer'); -modulemapper.clobbers('cordova/plugin/FileTransferError', 'FileTransferError'); - -}); - -// file: lib\common\plugin\geolocation.js -define("cordova/plugin/geolocation", function(require, exports, module) { - -var argscheck = require('cordova/argscheck'), - utils = require('cordova/utils'), - exec = require('cordova/exec'), - PositionError = require('cordova/plugin/PositionError'), - Position = require('cordova/plugin/Position'); - -var timers = {}; // list of timers in use - -// Returns default params, overrides if provided with values -function parseParameters(options) { - var opt = { - maximumAge: 0, - enableHighAccuracy: false, - timeout: Infinity - }; - - if (options) { - if (options.maximumAge !== undefined && !isNaN(options.maximumAge) && options.maximumAge > 0) { - opt.maximumAge = options.maximumAge; - } - if (options.enableHighAccuracy !== undefined) { - opt.enableHighAccuracy = options.enableHighAccuracy; - } - if (options.timeout !== undefined && !isNaN(options.timeout)) { - if (options.timeout < 0) { - opt.timeout = 0; - } else { - opt.timeout = options.timeout; - } - } - } - - return opt; -} - -// Returns a timeout failure, closed over a specified timeout value and error callback. -function createTimeout(errorCallback, timeout) { - var t = setTimeout(function() { - clearTimeout(t); - t = null; - errorCallback({ - code:PositionError.TIMEOUT, - message:"Position retrieval timed out." - }); - }, timeout); - return t; -} - -var geolocation = { - lastPosition:null, // reference to last known (cached) position returned - /** - * Asynchronously acquires the current position. - * - * @param {Function} successCallback The function to call when the position data is available - * @param {Function} errorCallback The function to call when there is an error getting the heading position. (OPTIONAL) - * @param {PositionOptions} options The options for getting the position data. (OPTIONAL) - */ - getCurrentPosition:function(successCallback, errorCallback, options) { - argscheck.checkArgs('fFO', 'geolocation.getCurrentPosition', arguments); - options = parseParameters(options); - - // Timer var that will fire an error callback if no position is retrieved from native - // before the "timeout" param provided expires - var timeoutTimer = {timer:null}; - - var win = function(p) { - clearTimeout(timeoutTimer.timer); - if (!(timeoutTimer.timer)) { - // Timeout already happened, or native fired error callback for - // this geo request. - // Don't continue with success callback. - return; - } - var pos = new Position( - { - latitude:p.latitude, - longitude:p.longitude, - altitude:p.altitude, - accuracy:p.accuracy, - heading:p.heading, - velocity:p.velocity, - altitudeAccuracy:p.altitudeAccuracy - }, - (p.timestamp === undefined ? new Date() : ((p.timestamp instanceof Date) ? p.timestamp : new Date(p.timestamp))) - ); - geolocation.lastPosition = pos; - successCallback(pos); - }; - var fail = function(e) { - clearTimeout(timeoutTimer.timer); - timeoutTimer.timer = null; - var err = new PositionError(e.code, e.message); - if (errorCallback) { - errorCallback(err); - } - }; - - // Check our cached position, if its timestamp difference with current time is less than the maximumAge, then just - // fire the success callback with the cached position. - if (geolocation.lastPosition && options.maximumAge && (((new Date()).getTime() - geolocation.lastPosition.timestamp.getTime()) <= options.maximumAge)) { - successCallback(geolocation.lastPosition); - // If the cached position check failed and the timeout was set to 0, error out with a TIMEOUT error object. - } else if (options.timeout === 0) { - fail({ - code:PositionError.TIMEOUT, - message:"timeout value in PositionOptions set to 0 and no cached Position object available, or cached Position object's age exceeds provided PositionOptions' maximumAge parameter." - }); - // Otherwise we have to call into native to retrieve a position. - } else { - if (options.timeout !== Infinity) { - // If the timeout value was not set to Infinity (default), then - // set up a timeout function that will fire the error callback - // if no successful position was retrieved before timeout expired. - timeoutTimer.timer = createTimeout(fail, options.timeout); - } else { - // This is here so the check in the win function doesn't mess stuff up - // may seem weird but this guarantees timeoutTimer is - // always truthy before we call into native - timeoutTimer.timer = true; - } - exec(win, fail, "Geolocation", "getLocation", [options.enableHighAccuracy, options.maximumAge]); - } - return timeoutTimer; - }, - /** - * Asynchronously watches the geolocation for changes to geolocation. When a change occurs, - * the successCallback is called with the new location. - * - * @param {Function} successCallback The function to call each time the location data is available - * @param {Function} errorCallback The function to call when there is an error getting the location data. (OPTIONAL) - * @param {PositionOptions} options The options for getting the location data such as frequency. (OPTIONAL) - * @return String The watch id that must be passed to #clearWatch to stop watching. - */ - watchPosition:function(successCallback, errorCallback, options) { - argscheck.checkArgs('fFO', 'geolocation.getCurrentPosition', arguments); - options = parseParameters(options); - - var id = utils.createUUID(); - - // Tell device to get a position ASAP, and also retrieve a reference to the timeout timer generated in getCurrentPosition - timers[id] = geolocation.getCurrentPosition(successCallback, errorCallback, options); - - var fail = function(e) { - clearTimeout(timers[id].timer); - var err = new PositionError(e.code, e.message); - if (errorCallback) { - errorCallback(err); - } - }; - - var win = function(p) { - clearTimeout(timers[id].timer); - if (options.timeout !== Infinity) { - timers[id].timer = createTimeout(fail, options.timeout); - } - var pos = new Position( - { - latitude:p.latitude, - longitude:p.longitude, - altitude:p.altitude, - accuracy:p.accuracy, - heading:p.heading, - velocity:p.velocity, - altitudeAccuracy:p.altitudeAccuracy - }, - (p.timestamp === undefined ? new Date() : ((p.timestamp instanceof Date) ? p.timestamp : new Date(p.timestamp))) - ); - geolocation.lastPosition = pos; - successCallback(pos); - }; - - exec(win, fail, "Geolocation", "addWatch", [id, options.enableHighAccuracy]); - - return id; - }, - /** - * Clears the specified heading watch. - * - * @param {String} id The ID of the watch returned from #watchPosition - */ - clearWatch:function(id) { - if (id && timers[id] !== undefined) { - clearTimeout(timers[id].timer); - timers[id].timer = false; - exec(null, null, "Geolocation", "clearWatch", [id]); - } - } -}; - -module.exports = geolocation; - -}); - -// file: lib\common\plugin\geolocation\symbols.js -define("cordova/plugin/geolocation/symbols", function(require, exports, module) { - - -var modulemapper = require('cordova/modulemapper'); - -modulemapper.defaults('cordova/plugin/geolocation', 'navigator.geolocation'); -modulemapper.clobbers('cordova/plugin/PositionError', 'PositionError'); -modulemapper.clobbers('cordova/plugin/Position', 'Position'); -modulemapper.clobbers('cordova/plugin/Coordinates', 'Coordinates'); - -}); - -// file: lib\common\plugin\globalization.js -define("cordova/plugin/globalization", function(require, exports, module) { - -var argscheck = require('cordova/argscheck'), - exec = require('cordova/exec'), - GlobalizationError = require('cordova/plugin/GlobalizationError'); - -var globalization = { - -/** -* Returns the string identifier for the client's current language. -* It returns the language identifier string to the successCB callback with a -* properties object as a parameter. If there is an error getting the language, -* then the errorCB callback is invoked. -* -* @param {Function} successCB -* @param {Function} errorCB -* -* @return Object.value {String}: The language identifier -* -* @error GlobalizationError.UNKNOWN_ERROR -* -* Example -* globalization.getPreferredLanguage(function (language) {alert('language:' + language.value + '\n');}, -* function () {}); -*/ -getPreferredLanguage:function(successCB, failureCB) { - argscheck.checkArgs('fF', 'Globalization.getPreferredLanguage', arguments); - exec(successCB, failureCB, "Globalization","getPreferredLanguage", []); -}, - -/** -* Returns the string identifier for the client's current locale setting. -* It returns the locale identifier string to the successCB callback with a -* properties object as a parameter. If there is an error getting the locale, -* then the errorCB callback is invoked. -* -* @param {Function} successCB -* @param {Function} errorCB -* -* @return Object.value {String}: The locale identifier -* -* @error GlobalizationError.UNKNOWN_ERROR -* -* Example -* globalization.getLocaleName(function (locale) {alert('locale:' + locale.value + '\n');}, -* function () {}); -*/ -getLocaleName:function(successCB, failureCB) { - argscheck.checkArgs('fF', 'Globalization.getLocaleName', arguments); - exec(successCB, failureCB, "Globalization","getLocaleName", []); -}, - - -/** -* Returns a date formatted as a string according to the client's user preferences and -* calendar using the time zone of the client. It returns the formatted date string to the -* successCB callback with a properties object as a parameter. If there is an error -* formatting the date, then the errorCB callback is invoked. -* -* The defaults are: formatLength="short" and selector="date and time" -* -* @param {Date} date -* @param {Function} successCB -* @param {Function} errorCB -* @param {Object} options {optional} -* formatLength {String}: 'short', 'medium', 'long', or 'full' -* selector {String}: 'date', 'time', or 'date and time' -* -* @return Object.value {String}: The localized date string -* -* @error GlobalizationError.FORMATTING_ERROR -* -* Example -* globalization.dateToString(new Date(), -* function (date) {alert('date:' + date.value + '\n');}, -* function (errorCode) {alert(errorCode);}, -* {formatLength:'short'}); -*/ -dateToString:function(date, successCB, failureCB, options) { - argscheck.checkArgs('dfFO', 'Globalization.dateToString', arguments); - var dateValue = date.valueOf(); - exec(successCB, failureCB, "Globalization", "dateToString", [{"date": dateValue, "options": options}]); -}, - - -/** -* Parses a date formatted as a string according to the client's user -* preferences and calendar using the time zone of the client and returns -* the corresponding date object. It returns the date to the successCB -* callback with a properties object as a parameter. If there is an error -* parsing the date string, then the errorCB callback is invoked. -* -* The defaults are: formatLength="short" and selector="date and time" -* -* @param {String} dateString -* @param {Function} successCB -* @param {Function} errorCB -* @param {Object} options {optional} -* formatLength {String}: 'short', 'medium', 'long', or 'full' -* selector {String}: 'date', 'time', or 'date and time' -* -* @return Object.year {Number}: The four digit year -* Object.month {Number}: The month from (0 - 11) -* Object.day {Number}: The day from (1 - 31) -* Object.hour {Number}: The hour from (0 - 23) -* Object.minute {Number}: The minute from (0 - 59) -* Object.second {Number}: The second from (0 - 59) -* Object.millisecond {Number}: The milliseconds (from 0 - 999), -* not available on all platforms -* -* @error GlobalizationError.PARSING_ERROR -* -* Example -* globalization.stringToDate('4/11/2011', -* function (date) { alert('Month:' + date.month + '\n' + -* 'Day:' + date.day + '\n' + -* 'Year:' + date.year + '\n');}, -* function (errorCode) {alert(errorCode);}, -* {selector:'date'}); -*/ -stringToDate:function(dateString, successCB, failureCB, options) { - argscheck.checkArgs('sfFO', 'Globalization.stringToDate', arguments); - exec(successCB, failureCB, "Globalization", "stringToDate", [{"dateString": dateString, "options": options}]); -}, - - -/** -* Returns a pattern string for formatting and parsing dates according to the client's -* user preferences. It returns the pattern to the successCB callback with a -* properties object as a parameter. If there is an error obtaining the pattern, -* then the errorCB callback is invoked. -* -* The defaults are: formatLength="short" and selector="date and time" -* -* @param {Function} successCB -* @param {Function} errorCB -* @param {Object} options {optional} -* formatLength {String}: 'short', 'medium', 'long', or 'full' -* selector {String}: 'date', 'time', or 'date and time' -* -* @return Object.pattern {String}: The date and time pattern for formatting and parsing dates. -* The patterns follow Unicode Technical Standard #35 -* http://unicode.org/reports/tr35/tr35-4.html -* Object.timezone {String}: The abbreviated name of the time zone on the client -* Object.utc_offset {Number}: The current difference in seconds between the client's -* time zone and coordinated universal time. -* Object.dst_offset {Number}: The current daylight saving time offset in seconds -* between the client's non-daylight saving's time zone -* and the client's daylight saving's time zone. -* -* @error GlobalizationError.PATTERN_ERROR -* -* Example -* globalization.getDatePattern( -* function (date) {alert('pattern:' + date.pattern + '\n');}, -* function () {}, -* {formatLength:'short'}); -*/ -getDatePattern:function(successCB, failureCB, options) { - argscheck.checkArgs('fFO', 'Globalization.getDatePattern', arguments); - exec(successCB, failureCB, "Globalization", "getDatePattern", [{"options": options}]); -}, - - -/** -* Returns an array of either the names of the months or days of the week -* according to the client's user preferences and calendar. It returns the array of names to the -* successCB callback with a properties object as a parameter. If there is an error obtaining the -* names, then the errorCB callback is invoked. -* -* The defaults are: type="wide" and item="months" -* -* @param {Function} successCB -* @param {Function} errorCB -* @param {Object} options {optional} -* type {String}: 'narrow' or 'wide' -* item {String}: 'months', or 'days' -* -* @return Object.value {Array{String}}: The array of names starting from either -* the first month in the year or the -* first day of the week. -* @error GlobalizationError.UNKNOWN_ERROR -* -* Example -* globalization.getDateNames(function (names) { -* for(var i = 0; i < names.value.length; i++) { -* alert('Month:' + names.value[i] + '\n');}}, -* function () {}); -*/ -getDateNames:function(successCB, failureCB, options) { - argscheck.checkArgs('fFO', 'Globalization.getDateNames', arguments); - exec(successCB, failureCB, "Globalization", "getDateNames", [{"options": options}]); -}, - -/** -* Returns whether daylight savings time is in effect for a given date using the client's -* time zone and calendar. It returns whether or not daylight savings time is in effect -* to the successCB callback with a properties object as a parameter. If there is an error -* reading the date, then the errorCB callback is invoked. -* -* @param {Date} date -* @param {Function} successCB -* @param {Function} errorCB -* -* @return Object.dst {Boolean}: The value "true" indicates that daylight savings time is -* in effect for the given date and "false" indicate that it is not. -* -* @error GlobalizationError.UNKNOWN_ERROR -* -* Example -* globalization.isDayLightSavingsTime(new Date(), -* function (date) {alert('dst:' + date.dst + '\n');} -* function () {}); -*/ -isDayLightSavingsTime:function(date, successCB, failureCB) { - argscheck.checkArgs('dfF', 'Globalization.isDayLightSavingsTime', arguments); - var dateValue = date.valueOf(); - exec(successCB, failureCB, "Globalization", "isDayLightSavingsTime", [{"date": dateValue}]); -}, - -/** -* Returns the first day of the week according to the client's user preferences and calendar. -* The days of the week are numbered starting from 1 where 1 is considered to be Sunday. -* It returns the day to the successCB callback with a properties object as a parameter. -* If there is an error obtaining the pattern, then the errorCB callback is invoked. -* -* @param {Function} successCB -* @param {Function} errorCB -* -* @return Object.value {Number}: The number of the first day of the week. -* -* @error GlobalizationError.UNKNOWN_ERROR -* -* Example -* globalization.getFirstDayOfWeek(function (day) -* { alert('Day:' + day.value + '\n');}, -* function () {}); -*/ -getFirstDayOfWeek:function(successCB, failureCB) { - argscheck.checkArgs('fF', 'Globalization.getFirstDayOfWeek', arguments); - exec(successCB, failureCB, "Globalization", "getFirstDayOfWeek", []); -}, - - -/** -* Returns a number formatted as a string according to the client's user preferences. -* It returns the formatted number string to the successCB callback with a properties object as a -* parameter. If there is an error formatting the number, then the errorCB callback is invoked. -* -* The defaults are: type="decimal" -* -* @param {Number} number -* @param {Function} successCB -* @param {Function} errorCB -* @param {Object} options {optional} -* type {String}: 'decimal', "percent", or 'currency' -* -* @return Object.value {String}: The formatted number string. -* -* @error GlobalizationError.FORMATTING_ERROR -* -* Example -* globalization.numberToString(3.25, -* function (number) {alert('number:' + number.value + '\n');}, -* function () {}, -* {type:'decimal'}); -*/ -numberToString:function(number, successCB, failureCB, options) { - argscheck.checkArgs('nfFO', 'Globalization.numberToString', arguments); - exec(successCB, failureCB, "Globalization", "numberToString", [{"number": number, "options": options}]); -}, - -/** -* Parses a number formatted as a string according to the client's user preferences and -* returns the corresponding number. It returns the number to the successCB callback with a -* properties object as a parameter. If there is an error parsing the number string, then -* the errorCB callback is invoked. -* -* The defaults are: type="decimal" -* -* @param {String} numberString -* @param {Function} successCB -* @param {Function} errorCB -* @param {Object} options {optional} -* type {String}: 'decimal', "percent", or 'currency' -* -* @return Object.value {Number}: The parsed number. -* -* @error GlobalizationError.PARSING_ERROR -* -* Example -* globalization.stringToNumber('1234.56', -* function (number) {alert('Number:' + number.value + '\n');}, -* function () { alert('Error parsing number');}); -*/ -stringToNumber:function(numberString, successCB, failureCB, options) { - argscheck.checkArgs('sfFO', 'Globalization.stringToNumber', arguments); - exec(successCB, failureCB, "Globalization", "stringToNumber", [{"numberString": numberString, "options": options}]); -}, - -/** -* Returns a pattern string for formatting and parsing numbers according to the client's user -* preferences. It returns the pattern to the successCB callback with a properties object as a -* parameter. If there is an error obtaining the pattern, then the errorCB callback is invoked. -* -* The defaults are: type="decimal" -* -* @param {Function} successCB -* @param {Function} errorCB -* @param {Object} options {optional} -* type {String}: 'decimal', "percent", or 'currency' -* -* @return Object.pattern {String}: The number pattern for formatting and parsing numbers. -* The patterns follow Unicode Technical Standard #35. -* http://unicode.org/reports/tr35/tr35-4.html -* Object.symbol {String}: The symbol to be used when formatting and parsing -* e.g., percent or currency symbol. -* Object.fraction {Number}: The number of fractional digits to use when parsing and -* formatting numbers. -* Object.rounding {Number}: The rounding increment to use when parsing and formatting. -* Object.positive {String}: The symbol to use for positive numbers when parsing and formatting. -* Object.negative: {String}: The symbol to use for negative numbers when parsing and formatting. -* Object.decimal: {String}: The decimal symbol to use for parsing and formatting. -* Object.grouping: {String}: The grouping symbol to use for parsing and formatting. -* -* @error GlobalizationError.PATTERN_ERROR -* -* Example -* globalization.getNumberPattern( -* function (pattern) {alert('Pattern:' + pattern.pattern + '\n');}, -* function () {}); -*/ -getNumberPattern:function(successCB, failureCB, options) { - argscheck.checkArgs('fFO', 'Globalization.getNumberPattern', arguments); - exec(successCB, failureCB, "Globalization", "getNumberPattern", [{"options": options}]); -}, - -/** -* Returns a pattern string for formatting and parsing currency values according to the client's -* user preferences and ISO 4217 currency code. It returns the pattern to the successCB callback with a -* properties object as a parameter. If there is an error obtaining the pattern, then the errorCB -* callback is invoked. -* -* @param {String} currencyCode -* @param {Function} successCB -* @param {Function} errorCB -* -* @return Object.pattern {String}: The currency pattern for formatting and parsing currency values. -* The patterns follow Unicode Technical Standard #35 -* http://unicode.org/reports/tr35/tr35-4.html -* Object.code {String}: The ISO 4217 currency code for the pattern. -* Object.fraction {Number}: The number of fractional digits to use when parsing and -* formatting currency. -* Object.rounding {Number}: The rounding increment to use when parsing and formatting. -* Object.decimal: {String}: The decimal symbol to use for parsing and formatting. -* Object.grouping: {String}: The grouping symbol to use for parsing and formatting. -* -* @error GlobalizationError.FORMATTING_ERROR -* -* Example -* globalization.getCurrencyPattern('EUR', -* function (currency) {alert('Pattern:' + currency.pattern + '\n');} -* function () {}); -*/ -getCurrencyPattern:function(currencyCode, successCB, failureCB) { - argscheck.checkArgs('sfF', 'Globalization.getCurrencyPattern', arguments); - exec(successCB, failureCB, "Globalization", "getCurrencyPattern", [{"currencyCode": currencyCode}]); -} - -}; - -module.exports = globalization; - -}); - -// file: lib\common\plugin\globalization\symbols.js -define("cordova/plugin/globalization/symbols", function(require, exports, module) { - - -var modulemapper = require('cordova/modulemapper'); - -modulemapper.clobbers('cordova/plugin/globalization', 'navigator.globalization'); -modulemapper.clobbers('cordova/plugin/GlobalizationError', 'GlobalizationError'); - -}); - -// file: lib\common\plugin\logger.js -define("cordova/plugin/logger", function(require, exports, module) { - -//------------------------------------------------------------------------------ -// The logger module exports the following properties/functions: -// -// LOG - constant for the level LOG -// ERROR - constant for the level ERROR -// WARN - constant for the level WARN -// INFO - constant for the level INFO -// DEBUG - constant for the level DEBUG -// logLevel() - returns current log level -// logLevel(value) - sets and returns a new log level -// useConsole() - returns whether logger is using console -// useConsole(value) - sets and returns whether logger is using console -// log(message,...) - logs a message at level LOG -// error(message,...) - logs a message at level ERROR -// warn(message,...) - logs a message at level WARN -// info(message,...) - logs a message at level INFO -// debug(message,...) - logs a message at level DEBUG -// logLevel(level,message,...) - logs a message specified level -// -//------------------------------------------------------------------------------ - -var logger = exports; - -var exec = require('cordova/exec'); -var utils = require('cordova/utils'); - -var UseConsole = true; -var Queued = []; -var DeviceReady = false; -var CurrentLevel; - -/** - * Logging levels - */ - -var Levels = [ - "LOG", - "ERROR", - "WARN", - "INFO", - "DEBUG" -]; - -/* - * add the logging levels to the logger object and - * to a separate levelsMap object for testing - */ - -var LevelsMap = {}; -for (var i=0; i CurrentLevel) return; - - // queue the message if not yet at deviceready - if (!DeviceReady && !UseConsole) { - Queued.push([level, message]); - return; - } - - // if not using the console, use the native logger - if (!UseConsole) { - exec(null, null, "Logger", "logLevel", [level, message]); - return; - } - - // make sure console is not using logger - if (console.__usingCordovaLogger) { - throw new Error("console and logger are too intertwingly"); - } - - // log to the console - switch (level) { - case logger.LOG: console.log(message); break; - case logger.ERROR: console.log("ERROR: " + message); break; - case logger.WARN: console.log("WARN: " + message); break; - case logger.INFO: console.log("INFO: " + message); break; - case logger.DEBUG: console.log("DEBUG: " + message); break; - } -}; - -// when deviceready fires, log queued messages -logger.__onDeviceReady = function() { - if (DeviceReady) return; - - DeviceReady = true; - - for (var i=0; i 3) { - fail(FileError.SYNTAX_ERR); - } else { - // if successful, return a FileSystem object - var success = function(file_system) { - if (file_system) { - if (successCallback) { - // grab the name and root from the file system object - var result = new FileSystem(file_system.name, file_system.root); - successCallback(result); - } - } - else { - // no FileSystem object returned - fail(FileError.NOT_FOUND_ERR); - } - }; - exec(success, fail, "File", "requestFileSystem", [type, size]); - } -}; - -module.exports = requestFileSystem; - -}); - -// file: lib\common\plugin\resolveLocalFileSystemURI.js -define("cordova/plugin/resolveLocalFileSystemURI", function(require, exports, module) { - -var argscheck = require('cordova/argscheck'), - DirectoryEntry = require('cordova/plugin/DirectoryEntry'), - FileEntry = require('cordova/plugin/FileEntry'), - FileError = require('cordova/plugin/FileError'), - exec = require('cordova/exec'); - -/** - * Look up file system Entry referred to by local URI. - * @param {DOMString} uri URI referring to a local file or directory - * @param successCallback invoked with Entry object corresponding to URI - * @param errorCallback invoked if error occurs retrieving file system entry - */ -module.exports = function(uri, successCallback, errorCallback) { - argscheck.checkArgs('sFF', 'resolveLocalFileSystemURI', arguments); - // error callback - var fail = function(error) { - errorCallback && errorCallback(new FileError(error)); - }; - // sanity check for 'not:valid:filename' - if(!uri || uri.split(":").length > 2) { - setTimeout( function() { - fail(FileError.ENCODING_ERR); - },0); - return; - } - // if successful, return either a file or directory entry - var success = function(entry) { - var result; - if (entry) { - if (successCallback) { - // create appropriate Entry object - result = (entry.isDirectory) ? new DirectoryEntry(entry.name, entry.fullPath) : new FileEntry(entry.name, entry.fullPath); - successCallback(result); - } - } - else { - // no Entry object returned - fail(FileError.NOT_FOUND_ERR); - } - }; - - exec(success, fail, "File", "resolveLocalFileSystemURI", [uri]); -}; - -}); - -// file: lib\common\plugin\splashscreen.js -define("cordova/plugin/splashscreen", function(require, exports, module) { - -var exec = require('cordova/exec'); - -var splashscreen = { - show:function() { - exec(null, null, "SplashScreen", "show", []); - }, - hide:function() { - exec(null, null, "SplashScreen", "hide", []); - } -}; - -module.exports = splashscreen; - -}); - -// file: lib\common\plugin\splashscreen\symbols.js -define("cordova/plugin/splashscreen/symbols", function(require, exports, module) { - - -var modulemapper = require('cordova/modulemapper'); - -modulemapper.clobbers('cordova/plugin/splashscreen', 'navigator.splashscreen'); - -}); - -// file: lib\windows8\plugin\windows8\AccelerometerProxy.js -define("cordova/plugin/windows8/AccelerometerProxy", function(require, exports, module) { - -/*global Windows:true */ - -var cordova = require('cordova'), - Acceleration = require('cordova/plugin/Acceleration'); - -/* This is the actual implementation part that returns the result on Windows 8 -*/ - -module.exports = { - onDataChanged:null, - start:function(win,lose){ - - var accel = Windows.Devices.Sensors.Accelerometer.getDefault(); - if(!accel) { - lose && lose("No accelerometer found"); - } - else { - var self = this; - accel.reportInterval = Math.max(16,accel.minimumReportInterval); - - // store our bound function - this.onDataChanged = function(e) { - var a = e.reading; - win(new Acceleration(a.accelerationX,a.accelerationY,a.accelerationZ)); - }; - accel.addEventListener("readingchanged",this.onDataChanged); - - setTimeout(function(){ - var a = accel.getCurrentReading(); - win(new Acceleration(a.accelerationX,a.accelerationY,a.accelerationZ)); - },0); // async do later - } - }, - stop:function(win,lose){ - win = win || function(){}; - var accel = Windows.Devices.Sensors.Accelerometer.getDefault(); - if(!accel) { - lose && lose("No accelerometer found"); - } - else { - accel.removeEventListener("readingchanged",this.onDataChanged); - this.onDataChanged = null; - accel.reportInterval = 0; // back to the default - win(); - } - } -}; - -require("cordova/commandProxy").add("Accelerometer",module.exports); -}); - -// file: lib\windows8\plugin\windows8\CameraProxy.js -define("cordova/plugin/windows8/CameraProxy", function(require, exports, module) { - -/*global Windows:true, URL:true */ - - -var cordova = require('cordova'), - Camera = require('cordova/plugin/CameraConstants'), - FileEntry = require('cordova/plugin/FileEntry'), - FileError = require('cordova/plugin/FileError'), - FileReader = require('cordova/plugin/FileReader'); - -module.exports = { - - // args will contain : - // ... it is an array, so be careful - // 0 quality:50, - // 1 destinationType:Camera.DestinationType.FILE_URI, - // 2 sourceType:Camera.PictureSourceType.CAMERA, - // 3 targetWidth:-1, - // 4 targetHeight:-1, - // 5 encodingType:Camera.EncodingType.JPEG, - // 6 mediaType:Camera.MediaType.PICTURE, - // 7 allowEdit:false, - // 8 correctOrientation:false, - // 9 saveToPhotoAlbum:false, - // 10 popoverOptions:null - - takePicture: function (successCallback, errorCallback, args) { - var encodingType = args[5]; - var targetWidth = args[3]; - var targetHeight = args[4]; - var sourceType = args[2]; - var destinationType = args[1]; - var mediaType = args[6]; - var saveToPhotoAlbum = args[9]; - - var pkg = Windows.ApplicationModel.Package.current; - var packageId = pkg.installedLocation; - - var fail = function (fileError) { - errorCallback("FileError, code:" + fileError.code); - }; - - // resize method :) - var resizeImage = function (file) { - var tempPhotoFileName = ""; - if (encodingType == Camera.EncodingType.PNG) { - tempPhotoFileName = "camera_cordova_temp_return.png"; - } else { - tempPhotoFileName = "camera_cordova_temp_return.jpg"; - } - var imgObj = new Image(); - var success = function (fileEntry) { - var successCB = function (filePhoto) { - var fileType = file.contentType, - reader = new FileReader(); - reader.onloadend = function () { - var image = new Image(); - image.src = reader.result; - image.onload = function () { - var imageWidth = targetWidth, - imageHeight = targetHeight; - var canvas = document.createElement('canvas'); - - canvas.width = imageWidth; - canvas.height = imageHeight; - - var ctx = canvas.getContext("2d"); - ctx.drawImage(this, 0, 0, imageWidth, imageHeight); - - // The resized file ready for upload - var _blob = canvas.msToBlob(); - var _stream = _blob.msDetachStream(); - Windows.Storage.StorageFolder.getFolderFromPathAsync(packageId.path).done(function (storageFolder) { - storageFolder.createFileAsync(tempPhotoFileName, Windows.Storage.CreationCollisionOption.generateUniqueName).done(function (file) { - file.openAsync(Windows.Storage.FileAccessMode.readWrite).done(function (fileStream) { - Windows.Storage.Streams.RandomAccessStream.copyAndCloseAsync(_stream, fileStream).done(function () { - var _imageUrl = URL.createObjectURL(file); - successCallback(_imageUrl); - }, function () { errorCallback("Resize picture error."); }); - }, function () { errorCallback("Resize picture error."); }); - }, function () { errorCallback("Resize picture error."); }); - }); - }; - }; - - reader.readAsDataURL(filePhoto); - }; - - var failCB = function () { - errorCallback("File not found."); - }; - fileEntry.file(successCB, failCB); - }; - - Windows.Storage.StorageFolder.getFolderFromPathAsync(packageId.path).done(function (storageFolder) { - file.copyAsync(storageFolder, file.name, Windows.Storage.NameCollisionOption.replaceExisting).then(function (storageFile) { - success(new FileEntry(storageFile.name, storageFile.path)); - }, function () { - fail(FileError.INVALID_MODIFICATION_ERR); - }, function () { - errorCallback("Folder not access."); - }); - }); - - }; - - // because of asynchronous method, so let the successCallback be called in it. - var resizeImageBase64 = function (file) { - var imgObj = new Image(); - var success = function (fileEntry) { - var successCB = function (filePhoto) { - var fileType = file.contentType, - reader = new FileReader(); - reader.onloadend = function () { - var image = new Image(); - image.src = reader.result; - - image.onload = function () { - var imageWidth = targetWidth, - imageHeight = targetHeight; - var canvas = document.createElement('canvas'); - - canvas.width = imageWidth; - canvas.height = imageHeight; - - var ctx = canvas.getContext("2d"); - ctx.drawImage(this, 0, 0, imageWidth, imageHeight); - - // The resized file ready for upload - var finalFile = canvas.toDataURL(fileType); - - // Remove the prefix such as "data:" + contentType + ";base64," , in order to meet the Cordova API. - var arr = finalFile.split(","); - var newStr = finalFile.substr(arr[0].length + 1); - successCallback(newStr); - }; - }; - - reader.readAsDataURL(filePhoto); - - }; - var failCB = function () { - errorCallback("File not found."); - }; - fileEntry.file(successCB, failCB); - }; - - Windows.Storage.StorageFolder.getFolderFromPathAsync(packageId.path).done(function (storageFolder) { - file.copyAsync(storageFolder, file.name, Windows.Storage.NameCollisionOption.replaceExisting).then(function (storageFile) { - success(new FileEntry(storageFile.name, storageFile.path)); - }, function () { - fail(FileError.INVALID_MODIFICATION_ERR); - }, function () { - errorCallback("Folder not access."); - }); - }); - - }; - - if (sourceType != Camera.PictureSourceType.CAMERA) { - var fileOpenPicker = new Windows.Storage.Pickers.FileOpenPicker(); - fileOpenPicker.suggestedStartLocation = Windows.Storage.Pickers.PickerLocationId.picturesLibrary; - if (mediaType == Camera.MediaType.PICTURE) { - fileOpenPicker.fileTypeFilter.replaceAll([".png", ".jpg", ".jpeg"]); - } else if (mediaType == Camera.MediaType.VIDEO) { - fileOpenPicker.fileTypeFilter.replaceAll([".avi", ".flv", ".asx", ".asf", ".mov", ".mp4", ".mpg", ".rm", ".srt", ".swf", ".wmv", ".vob"]); - } else { - fileOpenPicker.fileTypeFilter.replaceAll(["*"]); - } - - fileOpenPicker.pickSingleFileAsync().then(function (file) { - if (file) { - if (destinationType == Camera.DestinationType.FILE_URI) { - if (targetHeight > 0 && targetWidth > 0) { - resizeImage(file); - } else { - Windows.Storage.StorageFolder.getFolderFromPathAsync(packageId.path).done(function (storageFolder) { - file.copyAsync(storageFolder, file.name, Windows.Storage.NameCollisionOption.replaceExisting).then(function (storageFile) { - var _imageUrl = URL.createObjectURL(storageFile); - successCallback(_imageUrl); - }, function () { - fail(FileError.INVALID_MODIFICATION_ERR); - }, function () { - errorCallback("Folder not access."); - }); - }); - - } - } - else { - if (targetHeight > 0 && targetWidth > 0) { - resizeImageBase64(file); - } else { - Windows.Storage.FileIO.readBufferAsync(file).done(function (buffer) { - var strBase64 = Windows.Security.Cryptography.CryptographicBuffer.encodeToBase64String(buffer); - successCallback(strBase64); - }); - } - - } - - } else { - errorCallback("User didn't choose a file."); - } - }, function () { - errorCallback("User didn't choose a file."); - }); - } - else { - - var cameraCaptureUI = new Windows.Media.Capture.CameraCaptureUI(); - cameraCaptureUI.photoSettings.allowCropping = true; - var allowCrop = !!args[7]; - if (!allowCrop) { - cameraCaptureUI.photoSettings.allowCropping = false; - } - - if (encodingType == Camera.EncodingType.PNG) { - cameraCaptureUI.photoSettings.format = Windows.Media.Capture.CameraCaptureUIPhotoFormat.png; - } else { - cameraCaptureUI.photoSettings.format = Windows.Media.Capture.CameraCaptureUIPhotoFormat.jpeg; - } - // decide which max pixels should be supported by targetWidth or targetHeight. - if (targetWidth >= 1280 || targetHeight >= 960) { - cameraCaptureUI.photoSettings.maxResolution = Windows.Media.Capture.CameraCaptureUIMaxPhotoResolution.large3M; - } else if (targetWidth >= 1024 || targetHeight >= 768) { - cameraCaptureUI.photoSettings.maxResolution = Windows.Media.Capture.CameraCaptureUIMaxPhotoResolution.mediumXga; - } else if (targetWidth >= 800 || targetHeight >= 600) { - cameraCaptureUI.photoSettings.maxResolution = Windows.Media.Capture.CameraCaptureUIMaxPhotoResolution.mediumXga; - } else if (targetWidth >= 640 || targetHeight >= 480) { - cameraCaptureUI.photoSettings.maxResolution = Windows.Media.Capture.CameraCaptureUIMaxPhotoResolution.smallVga; - } else if (targetWidth >= 320 || targetHeight >= 240) { - cameraCaptureUI.photoSettings.maxResolution = Windows.Media.Capture.CameraCaptureUIMaxPhotoResolution.verySmallQvga; - } else { - cameraCaptureUI.photoSettings.maxResolution = Windows.Media.Capture.CameraCaptureUIMaxPhotoResolution.highestAvailable; - } - - cameraCaptureUI.captureFileAsync(Windows.Media.Capture.CameraCaptureUIMode.photo).then(function (picture) { - if (picture) { - // save to photo album successCallback - var success = function (fileEntry) { - if (destinationType == Camera.DestinationType.FILE_URI) { - if (targetHeight > 0 && targetWidth > 0) { - resizeImage(picture); - } else { - Windows.Storage.StorageFolder.getFolderFromPathAsync(packageId.path).done(function (storageFolder) { - picture.copyAsync(storageFolder, picture.name, Windows.Storage.NameCollisionOption.replaceExisting).then(function (storageFile) { - var _imageUrl = URL.createObjectURL(storageFile); - successCallback(_imageUrl); - }, function () { - fail(FileError.INVALID_MODIFICATION_ERR); - }, function () { - errorCallback("Folder not access."); - }); - }); - } - } else { - if (targetHeight > 0 && targetWidth > 0) { - resizeImageBase64(picture); - } else { - Windows.Storage.FileIO.readBufferAsync(picture).done(function (buffer) { - var strBase64 = Windows.Security.Cryptography.CryptographicBuffer.encodeToBase64String(buffer); - successCallback(strBase64); - }); - } - } - }; - // save to photo album errorCallback - var fail = function () { - //errorCallback("FileError, code:" + fileError.code); - errorCallback("Save fail."); - }; - - if (saveToPhotoAlbum) { - Windows.Storage.StorageFile.getFileFromPathAsync(picture.path).then(function (storageFile) { - storageFile.copyAsync(Windows.Storage.KnownFolders.picturesLibrary, picture.name, Windows.Storage.NameCollisionOption.generateUniqueName).then(function (storageFile) { - success(storageFile); - }, function () { - fail(); - }); - }); - //var directory = new DirectoryEntry("Pictures", parentPath); - //new FileEntry(picture.name, picture.path).copyTo(directory, null, success, fail); - } else { - if (destinationType == Camera.DestinationType.FILE_URI) { - if (targetHeight > 0 && targetWidth > 0) { - resizeImage(picture); - } else { - Windows.Storage.StorageFolder.getFolderFromPathAsync(packageId.path).done(function (storageFolder) { - picture.copyAsync(storageFolder, picture.name, Windows.Storage.NameCollisionOption.replaceExisting).then(function (storageFile) { - var _imageUrl = URL.createObjectURL(storageFile); - successCallback(_imageUrl); - }, function () { - fail(FileError.INVALID_MODIFICATION_ERR); - }, function () { - errorCallback("Folder not access."); - }); - }); - } - } else { - if (targetHeight > 0 && targetWidth > 0) { - resizeImageBase64(picture); - } else { - Windows.Storage.FileIO.readBufferAsync(picture).done(function (buffer) { - var strBase64 = Windows.Security.Cryptography.CryptographicBuffer.encodeToBase64String(buffer); - successCallback(strBase64); - }); - } - } - } - } else { - errorCallback("User didn't capture a photo."); - } - }, function () { - errorCallback("Fail to capture a photo."); - }); - } - } -}; - -require("cordova/commandProxy").add("Camera",module.exports); - -}); - -// file: lib\windows8\plugin\windows8\CaptureProxy.js -define("cordova/plugin/windows8/CaptureProxy", function(require, exports, module) { - -/*global Windows:true */ - -var MediaFile = require('cordova/plugin/MediaFile'); -var CaptureError = require('cordova/plugin/CaptureError'); -var CaptureAudioOptions = require('cordova/plugin/CaptureAudioOptions'); -var CaptureImageOptions = require('cordova/plugin/CaptureImageOptions'); -var CaptureVideoOptions = require('cordova/plugin/CaptureVideoOptions'); -var MediaFileData = require('cordova/plugin/MediaFileData'); - -module.exports = { - - captureAudio:function(successCallback, errorCallback, args) { - var options = args[0]; - - var audioOptions = new CaptureAudioOptions(); - if (typeof(options.duration) == 'undefined') { - audioOptions.duration = 3600; // Arbitrary amount, need to change later - } else if (options.duration > 0) { - audioOptions.duration = options.duration; - } else { - errorCallback(new CaptureError(CaptureError.CAPTURE_INVALID_ARGUMENT)); - return; - } - - var cameraCaptureAudioDuration = audioOptions.duration; - var mediaCaptureSettings; - var initCaptureSettings = function () { - mediaCaptureSettings = null; - mediaCaptureSettings = new Windows.Media.Capture.MediaCaptureInitializationSettings(); - mediaCaptureSettings.streamingCaptureMode = Windows.Media.Capture.StreamingCaptureMode.audio; - }; - - initCaptureSettings(); - var mediaCapture = new Windows.Media.Capture.MediaCapture(); - mediaCapture.initializeAsync(mediaCaptureSettings).done(function () { - Windows.Storage.KnownFolders.musicLibrary.createFileAsync("captureAudio.mp3", Windows.Storage.NameCollisionOption.generateUniqueName).then(function (storageFile) { - var mediaEncodingProfile = new Windows.Media.MediaProperties.MediaEncodingProfile.createMp3(Windows.Media.MediaProperties.AudioEncodingQuality.auto); - var stopRecord = function () { - mediaCapture.stopRecordAsync().then(function (result) { - storageFile.getBasicPropertiesAsync().then(function (basicProperties) { - var results = []; - results.push(new MediaFile(storageFile.name, storageFile.path, storageFile.contentType, basicProperties.dateModified, basicProperties.size)); - successCallback(results); - }, function () { - errorCallback(new CaptureError(CaptureError.CAPTURE_NO_MEDIA_FILES)); - }); - }, function () { errorCallback(new CaptureError(CaptureError.CAPTURE_NO_MEDIA_FILES)); }); - }; - mediaCapture.startRecordToStorageFileAsync(mediaEncodingProfile, storageFile).then(function () { - setTimeout(stopRecord, cameraCaptureAudioDuration * 1000); - }, function () { errorCallback(new CaptureError(CaptureError.CAPTURE_NO_MEDIA_FILES)); }); - }, function () { errorCallback(new CaptureError(CaptureError.CAPTURE_NO_MEDIA_FILES)); }); - }); - }, - - captureImage:function (successCallback, errorCallback, args) { - var options = args[0]; - var imageOptions = new CaptureImageOptions(); - var cameraCaptureUI = new Windows.Media.Capture.CameraCaptureUI(); - cameraCaptureUI.photoSettings.allowCropping = true; - cameraCaptureUI.photoSettings.maxResolution = Windows.Media.Capture.CameraCaptureUIMaxPhotoResolution.highestAvailable; - cameraCaptureUI.photoSettings.format = Windows.Media.Capture.CameraCaptureUIPhotoFormat.jpeg; - cameraCaptureUI.captureFileAsync(Windows.Media.Capture.CameraCaptureUIMode.photo).then(function (file) { - file.moveAsync(Windows.Storage.KnownFolders.picturesLibrary, "cameraCaptureImage.jpg", Windows.Storage.NameCollisionOption.generateUniqueName).then(function () { - file.getBasicPropertiesAsync().then(function (basicProperties) { - var results = []; - results.push(new MediaFile(file.name, file.path, file.contentType, basicProperties.dateModified, basicProperties.size)); - successCallback(results); - }, function () { - errorCallback(new CaptureError(CaptureError.CAPTURE_NO_MEDIA_FILES)); - }); - }, function () { - errorCallback(new CaptureError(CaptureError.CAPTURE_NO_MEDIA_FILES)); - }); - }, function () { errorCallback(new CaptureError(CaptureError.CAPTURE_NO_MEDIA_FILES)); }); - }, - - captureVideo:function (successCallback, errorCallback, args) { - var options = args[0]; - var videoOptions = new CaptureVideoOptions(); - if (options.duration && options.duration > 0) { - videoOptions.duration = options.duration; - } - if (options.limit > 1) { - videoOptions.limit = options.limit; - } - var cameraCaptureUI = new Windows.Media.Capture.CameraCaptureUI(); - cameraCaptureUI.videoSettings.allowTrimming = true; - cameraCaptureUI.videoSettings.format = Windows.Media.Capture.CameraCaptureUIVideoFormat.mp4; - cameraCaptureUI.videoSettings.maxDurationInSeconds = videoOptions.duration; - cameraCaptureUI.captureFileAsync(Windows.Media.Capture.CameraCaptureUIMode.video).then(function (file) { - file.moveAsync(Windows.Storage.KnownFolders.videosLibrary, "cameraCaptureVideo.mp4", Windows.Storage.NameCollisionOption.generateUniqueName).then(function () { - file.getBasicPropertiesAsync().then(function (basicProperties) { - var results = []; - results.push(new MediaFile(file.name, file.path, file.contentType, basicProperties.dateModified, basicProperties.size)); - successCallback(results); - }, function () { - errorCallback(new CaptureError(CaptureError.CAPTURE_NO_MEDIA_FILES)); - }); - }, function () { - errorCallback(new CaptureError(CaptureError.CAPTURE_NO_MEDIA_FILES)); - }); - }, function () { errorCallback(new CaptureError(CaptureError.CAPTURE_NO_MEDIA_FILES)); }); - - }, - - getFormatData: function (successCallback, errorCallback, args) { - Windows.Storage.StorageFile.getFileFromPathAsync(args[0]).then( - function (storageFile) { - var mediaTypeFlag = String(storageFile.contentType).split("/")[0].toLowerCase(); - if (mediaTypeFlag === "audio") { - storageFile.properties.getMusicPropertiesAsync().then(function (audioProperties) { - successCallback(new MediaFileData(null, audioProperties.bitrate, 0, 0, audioProperties.duration / 1000)); - }, function () { - errorCallback(new CaptureError(CaptureError.CAPTURE_INVALID_ARGUMENT)); - }); - } - else if (mediaTypeFlag === "video") { - storageFile.properties.getVideoPropertiesAsync().then(function (videoProperties) { - successCallback(new MediaFileData(null, videoProperties.bitrate, videoProperties.height, videoProperties.width, videoProperties.duration / 1000)); - }, function () { - errorCallback(new CaptureError(CaptureError.CAPTURE_INVALID_ARGUMENT)); - }); - } - else if (mediaTypeFlag === "image") { - storageFile.properties.getImagePropertiesAsync().then(function (imageProperties) { - successCallback(new MediaFileData(null, 0, imageProperties.height, imageProperties.width, 0)); - }, function () { - errorCallback(new CaptureError(CaptureError.CAPTURE_INVALID_ARGUMENT)); - }); - } - else { errorCallback(new CaptureError(CaptureError.CAPTURE_INVALID_ARGUMENT)); } - }, function () { - errorCallback(new CaptureError(CaptureError.CAPTURE_INVALID_ARGUMENT)); - } - ); - } -}; - -require("cordova/commandProxy").add("Capture",module.exports); -}); - -// file: lib\windows8\plugin\windows8\CompassProxy.js -define("cordova/plugin/windows8/CompassProxy", function(require, exports, module) { - -/*global Windows:true */ - -var cordova = require('cordova'), - CompassHeading = require('cordova/plugin/CompassHeading'); - - -module.exports = { - - onReadingChanged:null, - getHeading:function(win,lose) { - var deviceCompass = Windows.Devices.Sensors.Compass.getDefault(); - if(!deviceCompass) { - setTimeout(function(){lose("Compass not available");},0); - } - else { - - deviceCompass.reportInterval = Math.max(16,deviceCompass.minimumReportInterval); - - this.onReadingChanged = function(e) { - var reading = e.reading; - var heading = new CompassHeading(reading.headingMagneticNorth, reading.headingTrueNorth); - win(heading); - }; - deviceCompass.addEventListener("readingchanged",this.onReadingChanged); - } - - }, - stopHeading:function(win,lose) { - var deviceCompass = Windows.Devices.Sensors.Compass.getDefault(); - if(!deviceCompass) { - setTimeout(function(){lose("Compass not available");},0); - } - else { - - deviceCompass.removeEventListener("readingchanged",this.onReadingChanged); - this.onReadingChanged = null; - deviceCompass.reportInterval = 0; - win(); - } - - } -}; - -require("cordova/commandProxy").add("Compass",module.exports); -}); - -// file: lib\windows8\plugin\windows8\ContactsProxy.js -define("cordova/plugin/windows8/ContactsProxy", function(require, exports, module) { - -var cordova = require('cordova'); - -module.exports = { - search: function (win, fail, args) { - var fields = args[0]; - var options = args[1]; - var picker = Windows.ApplicationModel.Contacts.ContactPicker(); - picker.commitButtonText = "Select"; - picker.selectionMode = Windows.ApplicationModel.Contacts.ContactSelectionMode.contacts; - - picker.desiredFields.push.apply(picker.desiredFields, fields); - - if (options.multiple) { - picker.pickMultipleContactsAsync().then(function (contacts) { - win(contacts); - }); - } - else { - picker.pickSingleContactAsync().then(function (contact) { - win([contact]); - }); - } - } - -}; - -require("cordova/commandProxy").add("Contacts",module.exports); -}); - -// file: lib\windows8\plugin\windows8\DeviceProxy.js -define("cordova/plugin/windows8/DeviceProxy", function(require, exports, module) { - -var cordova = require('cordova'); -var utils = require('cordova/utils'); -var FileError = require('cordova/plugin/FileError'); - - -module.exports = { - - getDeviceInfo:function(win,fail,args) { - //console.log("NativeProxy::getDeviceInfo"); - var hostNames = Windows.Networking.Connectivity.NetworkInformation.getHostNames(); - - var name = "unknown"; - hostNames.some(function (nm) { - if (nm.displayName.indexOf(".local") > -1) { - name = nm.displayName.split(".local")[0]; - return true; - } - }); - - // deviceId aka uuid, stored in Windows.Storage.ApplicationData.current.localSettings.values.deviceId - var deviceId; - var localSettings = Windows.Storage.ApplicationData.current.localSettings; - - if (localSettings.values.deviceId) { - deviceId = localSettings.values.deviceId; - } - else { - deviceId = localSettings.values.deviceId = utils.createUUID(); - } - - setTimeout(function () { - win({ platform: "windows8", version: "8", name: name, uuid: deviceId, cordova: "2.6.0" }); - }, 0); - } - -}; - -require("cordova/commandProxy").add("Device",module.exports); - -}); - -// file: lib\windows8\plugin\windows8\FileProxy.js -define("cordova/plugin/windows8/FileProxy", function(require, exports, module) { - -var cordova = require('cordova'); -var Entry = require('cordova/plugin/Entry'), - File = require('cordova/plugin/File'), - FileEntry = require('cordova/plugin/FileEntry'), - FileError = require('cordova/plugin/FileError'), - DirectoryEntry = require('cordova/plugin/DirectoryEntry'), - Flags = require('cordova/plugin/Flags'), - FileSystem = require('cordova/plugin/FileSystem'), - LocalFileSystem = require('cordova/plugin/LocalFileSystem'); - -module.exports = { - - getFileMetadata:function(win,fail,args) { - var fullPath = args[0]; - - Windows.Storage.StorageFile.getFileFromPathAsync(fullPath).done( - function (storageFile) { - storageFile.getBasicPropertiesAsync().then( - function (basicProperties) { - win(new File(storageFile.name, storageFile.path, storageFile.fileType, basicProperties.dateModified, basicProperties.size)); - }, function () { - fail && fail(FileError.NOT_READABLE_ERR); - } - ); - }, function () { - fail && fail(FileError.NOT_FOUND_ERR); - } - ); - }, - - getMetadata:function(success,fail,args) { - var fullPath = args[0]; - - var dealFile = function (sFile) { - Windows.Storage.StorageFile.getFileFromPathAsync(fullPath).then( - function (storageFile) { - return storageFile.getBasicPropertiesAsync(); - }, - function () { - fail && fail(FileError.NOT_READABLE_ERR); - } - // get the basic properties of the file. - ).then( - function (basicProperties) { - success(basicProperties.dateModified); - }, - function () { - fail && fail(FileError.NOT_READABLE_ERR); - } - ); - }; - - var dealFolder = function (sFolder) { - Windows.Storage.StorageFolder.getFolderFromPathAsync(fullPath).then( - function (storageFolder) { - return storageFolder.getBasicPropertiesAsync(); - }, - function () { - fail && fail(FileError.NOT_READABLE_ERR); - } - // get the basic properties of the folder. - ).then( - function (basicProperties) { - success(basicProperties.dateModified); - }, - function () { - fail && fail(FileError.NOT_FOUND_ERR); - } - ); - }; - - Windows.Storage.StorageFile.getFileFromPathAsync(fullPath).then( - // the path is file. - function (sFile) { - dealFile(sFile); - }, - // the path is folder - function () { - Windows.Storage.StorageFolder.getFolderFromPathAsync(fullPath).then( - function (sFolder) { - dealFolder(sFolder); - }, function () { - fail && fail(FileError.NOT_FOUND_ERR); - } - ); - } - ); - }, - - getParent:function(win,fail,args) { // ["fullPath"] - var fullPath = args[0]; - - var storageFolderPer = Windows.Storage.ApplicationData.current.localFolder; - var storageFolderTem = Windows.Storage.ApplicationData.current.temporaryFolder; - - if (fullPath == storageFolderPer.path) { - win(new DirectoryEntry(storageFolderPer.name, storageFolderPer.path)); - return; - } else if (fullPath == storageFolderTem.path) { - win(new DirectoryEntry(storageFolderTem.name, storageFolderTem.path)); - return; - } - var splitArr = fullPath.split(new RegExp(/\/|\\/g)); - - var popItem = splitArr.pop(); - - var result = new DirectoryEntry(popItem, fullPath.substr(0, fullPath.length - popItem.length - 1)); - Windows.Storage.StorageFolder.getFolderFromPathAsync(result.fullPath).done( - function () { win(result); }, - function () { fail && fail(FileError.INVALID_STATE_ERR); } - ); - }, - - readAsText:function(win,fail,args) { - var fileName = args[0]; - var enc = args[1]; - - Windows.Storage.StorageFile.getFileFromPathAsync(fileName).done( - function (storageFile) { - var value = Windows.Storage.Streams.UnicodeEncoding.utf8; - if (enc == 'Utf16LE' || enc == 'utf16LE') { - value = Windows.Storage.Streams.UnicodeEncoding.utf16LE; - }else if (enc == 'Utf16BE' || enc == 'utf16BE') { - value = Windows.Storage.Streams.UnicodeEncoding.utf16BE; - } - Windows.Storage.FileIO.readTextAsync(storageFile, value).done( - function (fileContent) { - win(fileContent); - }, - function () { - fail && fail(FileError.ENCODING_ERR); - } - ); - }, function () { - fail && fail(FileError.NOT_FOUND_ERR); - } - ); - }, - - readAsDataURL:function(win,fail,args) { - var fileName = args[0]; - - - Windows.Storage.StorageFile.getFileFromPathAsync(fileName).then( - function (storageFile) { - Windows.Storage.FileIO.readBufferAsync(storageFile).done( - function (buffer) { - var strBase64 = Windows.Security.Cryptography.CryptographicBuffer.encodeToBase64String(buffer); - //the method encodeToBase64String will add "77u/" as a prefix, so we should remove it - if(String(strBase64).substr(0,4) == "77u/") { - strBase64 = strBase64.substr(4); - } - var mediaType = storageFile.contentType; - var result = "data:" + mediaType + ";base64," + strBase64; - win(result); - } - ); - }, function () { - fail && fail(FileError.NOT_FOUND_ERR); - } - ); - }, - - getDirectory:function(win,fail,args) { - var fullPath = args[0]; - var path = args[1]; - var options = args[2]; - - var flag = ""; - if (options !== null) { - flag = new Flags(options.create, options.exclusive); - } else { - flag = new Flags(false, false); - } - - Windows.Storage.StorageFolder.getFolderFromPathAsync(fullPath).then( - function (storageFolder) { - if (flag.create === true && flag.exclusive === true) { - storageFolder.createFolderAsync(path, Windows.Storage.CreationCollisionOption.failIfExists).done( - function (storageFolder) { - win(new DirectoryEntry(storageFolder.name, storageFolder.path)); - }, function () { - fail && fail(FileError.PATH_EXISTS_ERR); - } - ); - } else if (flag.create === true && flag.exclusive === false) { - storageFolder.createFolderAsync(path, Windows.Storage.CreationCollisionOption.openIfExists).done( - function (storageFolder) { - win(new DirectoryEntry(storageFolder.name, storageFolder.path)); - }, function () { - fail && fail(FileError.INVALID_MODIFICATION_ERR); - } - ); - } else if (flag.create === false) { - if (/\?|\\|\*|\||\"|<|>|\:|\//g.test(path)) { - fail && fail(FileError.ENCODING_ERR); - return; - } - - storageFolder.getFolderAsync(path).done( - function (storageFolder) { - win(new DirectoryEntry(storageFolder.name, storageFolder.path)); - }, function () { - fail && fail(FileError.NOT_FOUND_ERR); - } - ); - } - }, function () { - fail && fail(FileError.NOT_FOUND_ERR); - } - ); - }, - - remove:function(win,fail,args) { - var fullPath = args[0]; - - Windows.Storage.StorageFile.getFileFromPathAsync(fullPath).then( - function (sFile) { - Windows.Storage.StorageFile.getFileFromPathAsync(fullPath).done(function (storageFile) { - storageFile.deleteAsync().done(win, function () { - fail && fail(FileError.INVALID_MODIFICATION_ERR); - - }); - }); - }, - function () { - Windows.Storage.StorageFolder.getFolderFromPathAsync(fullPath).then( - function (sFolder) { - var removeEntry = function () { - var storageFolderTop = null; - - Windows.Storage.StorageFolder.getFolderFromPathAsync(fullPath).then( - function (storageFolder) { - // FileSystem root can't be removed! - var storageFolderPer = Windows.Storage.ApplicationData.current.localFolder; - var storageFolderTem = Windows.Storage.ApplicationData.current.temporaryFolder; - if (fullPath == storageFolderPer.path || fullPath == storageFolderTem.path) { - fail && fail(FileError.NO_MODIFICATION_ALLOWED_ERR); - return; - } - storageFolderTop = storageFolder; - return storageFolder.createFileQuery().getFilesAsync(); - }, function () { - fail && fail(FileError.INVALID_MODIFICATION_ERR); - - } - // check sub-files. - ).then(function (fileList) { - if (fileList) { - if (fileList.length === 0) { - return storageFolderTop.createFolderQuery().getFoldersAsync(); - } else { - fail && fail(FileError.INVALID_MODIFICATION_ERR); - } - } - // check sub-folders. - }).then(function (folderList) { - if (folderList) { - if (folderList.length === 0) { - storageFolderTop.deleteAsync().done(win, function () { - fail && fail(FileError.INVALID_MODIFICATION_ERR); - - }); - } else { - fail && fail(FileError.INVALID_MODIFICATION_ERR); - } - } - - }); - }; - removeEntry(); - }, function () { - fail && fail(FileError.NOT_FOUND_ERR); - } - ); - } - ); - }, - - removeRecursively:function(successCallback,fail,args) { - var fullPath = args[0]; - - Windows.Storage.StorageFolder.getFolderFromPathAsync(fullPath).done(function (storageFolder) { - var storageFolderPer = Windows.Storage.ApplicationData.current.localFolder; - var storageFolderTem = Windows.Storage.ApplicationData.current.temporaryFolder; - - if (storageFolder.path == storageFolderPer.path || storageFolder.path == storageFolderTem.path) { - fail && fail(FileError.NO_MODIFICATION_ALLOWED_ERR); - return; - } - - var removeFolders = function (path) { - return new WinJS.Promise(function (complete) { - var filePromiseArr = []; - var storageFolderTop = null; - Windows.Storage.StorageFolder.getFolderFromPathAsync(path).then( - function (storageFolder) { - var fileListPromise = storageFolder.createFileQuery().getFilesAsync(); - - storageFolderTop = storageFolder; - return fileListPromise; - } - // remove all the files directly under the folder. - ).then(function (fileList) { - if (fileList !== null) { - for (var i = 0; i < fileList.length; i++) { - var filePromise = fileList[i].deleteAsync(); - filePromiseArr.push(filePromise); - } - } - WinJS.Promise.join(filePromiseArr).then(function () { - var folderListPromise = storageFolderTop.createFolderQuery().getFoldersAsync(); - return folderListPromise; - // remove empty folders. - }).then(function (folderList) { - var folderPromiseArr = []; - if (folderList.length !== 0) { - for (var j = 0; j < folderList.length; j++) { - - folderPromiseArr.push(removeFolders(folderList[j].path)); - } - WinJS.Promise.join(folderPromiseArr).then(function () { - storageFolderTop.deleteAsync().then(complete); - }); - } else { - storageFolderTop.deleteAsync().then(complete); - } - }, function () { }); - }, function () { }); - }); - }; - removeFolders(storageFolder.path).then(function () { - Windows.Storage.StorageFolder.getFolderFromPathAsync(storageFolder.path).then( - function () {}, - function () { - if (typeof successCallback !== 'undefined' && successCallback !== null) { successCallback(); } - }); - }); - }); - }, - - getFile:function(win,fail,args) { - var fullPath = args[0]; - var path = args[1]; - var options = args[2]; - - var flag = ""; - if (options !== null) { - flag = new Flags(options.create, options.exclusive); - } else { - flag = new Flags(false, false); - } - - Windows.Storage.StorageFolder.getFolderFromPathAsync(fullPath).then( - function (storageFolder) { - if (flag.create === true && flag.exclusive === true) { - storageFolder.createFileAsync(path, Windows.Storage.CreationCollisionOption.failIfExists).done( - function (storageFile) { - win(new FileEntry(storageFile.name, storageFile.path)); - }, function () { - fail && fail(FileError.PATH_EXISTS_ERR); - } - ); - } else if (flag.create === true && flag.exclusive === false) { - storageFolder.createFileAsync(path, Windows.Storage.CreationCollisionOption.openIfExists).done( - function (storageFile) { - win(new FileEntry(storageFile.name, storageFile.path)); - }, function () { - fail && fail(FileError.INVALID_MODIFICATION_ERR); - } - ); - } else if (flag.create === false) { - if (/\?|\\|\*|\||\"|<|>|\:|\//g.test(path)) { - fail && fail(FileError.ENCODING_ERR); - return; - } - storageFolder.getFileAsync(path).done( - function (storageFile) { - win(new FileEntry(storageFile.name, storageFile.path)); - }, function () { - fail && fail(FileError.NOT_FOUND_ERR); - } - ); - } - }, function () { - fail && fail(FileError.NOT_FOUND_ERR); - } - ); - }, - - readEntries:function(win,fail,args) { // ["fullPath"] - var path = args[0]; - - var result = []; - - Windows.Storage.StorageFolder.getFolderFromPathAsync(path).then(function (storageFolder) { - var promiseArr = []; - var index = 0; - promiseArr[index++] = storageFolder.createFileQuery().getFilesAsync().then(function (fileList) { - if (fileList !== null) { - for (var i = 0; i < fileList.length; i++) { - result.push(new FileEntry(fileList[i].name, fileList[i].path)); - } - } - }); - promiseArr[index++] = storageFolder.createFolderQuery().getFoldersAsync().then(function (folderList) { - if (folderList !== null) { - for (var j = 0; j < folderList.length; j++) { - result.push(new FileEntry(folderList[j].name, folderList[j].path)); - } - } - }); - WinJS.Promise.join(promiseArr).then(function () { - win(result); - }); - - }, function () { fail && fail(FileError.NOT_FOUND_ERR); }); - }, - - write:function(win,fail,args) { - var fileName = args[0]; - var text = args[1]; - var position = args[2]; - - Windows.Storage.StorageFile.getFileFromPathAsync(fileName).done( - function (storageFile) { - Windows.Storage.FileIO.writeTextAsync(storageFile,text,Windows.Storage.Streams.UnicodeEncoding.utf8).done( - function() { - win(String(text).length); - }, function () { - fail && fail(FileError.INVALID_MODIFICATION_ERR); - } - ); - }, function() { - fail && fail(FileError.NOT_FOUND_ERR); - } - ); - }, - - truncate:function(win,fail,args) { // ["fileName","size"] - var fileName = args[0]; - var size = args[1]; - - Windows.Storage.StorageFile.getFileFromPathAsync(fileName).done(function(storageFile){ - //the current length of the file. - var leng = 0; - - storageFile.getBasicPropertiesAsync().then(function (basicProperties) { - leng = basicProperties.size; - if (Number(size) >= leng) { - win(this.length); - return; - } - if (Number(size) >= 0) { - Windows.Storage.FileIO.readTextAsync(storageFile, Windows.Storage.Streams.UnicodeEncoding.utf8).then(function (fileContent) { - fileContent = fileContent.substr(0, size); - var fullPath = storageFile.path; - var name = storageFile.name; - var entry = new Entry(true, false, name, fullPath); - var parentPath = ""; - var successCallBack = function (entry) { - parentPath = entry.fullPath; - storageFile.deleteAsync().then(function () { - return Windows.Storage.StorageFolder.getFolderFromPathAsync(parentPath); - }).then(function (storageFolder) { - storageFolder.createFileAsync(name).then(function (newStorageFile) { - Windows.Storage.FileIO.writeTextAsync(newStorageFile, fileContent).done(function () { - win(String(fileContent).length); - }, function () { - fail && fail(FileError.NO_MODIFICATION_ALLOWED_ERR); - }); - }); - }); - }; - entry.getParent(successCallBack, null); - }, function () { fail && fail(FileError.NOT_FOUND_ERR); }); - } - }); - }, function () { fail && fail(FileError.NOT_FOUND_ERR); }); - }, - - copyTo:function(success,fail,args) { // ["fullPath","parent", "newName"] - var srcPath = args[0]; - var parentFullPath = args[1]; - var name = args[2]; - - //name can't be invalid - if (/\?|\\|\*|\||\"|<|>|\:|\//g.test(name)) { - fail && fail(FileError.ENCODING_ERR); - return; - } - // copy - var copyFiles = ""; - Windows.Storage.StorageFile.getFileFromPathAsync(srcPath).then( - function (sFile) { - copyFiles = function (srcPath, parentPath) { - var storageFileTop = null; - Windows.Storage.StorageFile.getFileFromPathAsync(srcPath).then(function (storageFile) { - storageFileTop = storageFile; - return Windows.Storage.StorageFolder.getFolderFromPathAsync(parentPath); - }, function () { - - fail && fail(FileError.NOT_FOUND_ERR); - }).then(function (storageFolder) { - storageFileTop.copyAsync(storageFolder, name, Windows.Storage.NameCollisionOption.failIfExists).then(function (storageFile) { - - success(new FileEntry(storageFile.name, storageFile.path)); - }, function () { - - fail && fail(FileError.INVALID_MODIFICATION_ERR); - }); - }, function () { - - fail && fail(FileError.NOT_FOUND_ERR); - }); - }; - var copyFinish = function (srcPath, parentPath) { - copyFiles(srcPath, parentPath); - }; - copyFinish(srcPath, parentFullPath); - }, - function () { - Windows.Storage.StorageFolder.getFolderFromPathAsync(srcPath).then( - function (sFolder) { - copyFiles = function (srcPath, parentPath) { - var coreCopy = function (storageFolderTop, complete) { - storageFolderTop.createFolderQuery().getFoldersAsync().then(function (folderList) { - var folderPromiseArr = []; - if (folderList.length === 0) { complete(); } - else { - Windows.Storage.StorageFolder.getFolderFromPathAsync(parentPath).then(function (storageFolderTarget) { - var tempPromiseArr = []; - var index = 0; - for (var j = 0; j < folderList.length; j++) { - tempPromiseArr[index++] = storageFolderTarget.createFolderAsync(folderList[j].name).then(function (targetFolder) { - folderPromiseArr.push(copyFiles(folderList[j].path, targetFolder.path)); - }); - } - WinJS.Promise.join(tempPromiseArr).then(function () { - WinJS.Promise.join(folderPromiseArr).then(complete); - }); - }); - } - }); - }; - - return new WinJS.Promise(function (complete) { - var storageFolderTop = null; - var filePromiseArr = []; - var fileListTop = null; - Windows.Storage.StorageFolder.getFolderFromPathAsync(srcPath).then(function (storageFolder) { - storageFolderTop = storageFolder; - return storageFolder.createFileQuery().getFilesAsync(); - }).then(function (fileList) { - fileListTop = fileList; - if (fileList) { - return Windows.Storage.StorageFolder.getFolderFromPathAsync(parentPath); - } - }).then(function (targetStorageFolder) { - for (var i = 0; i < fileListTop.length; i++) { - filePromiseArr.push(fileListTop[i].copyAsync(targetStorageFolder)); - } - WinJS.Promise.join(filePromiseArr).then(function () { - coreCopy(storageFolderTop, complete); - }); - }); - }); - }; - var copyFinish = function (srcPath, parentPath) { - Windows.Storage.StorageFolder.getFolderFromPathAsync(parentPath).then(function (storageFolder) { - storageFolder.createFolderAsync(name, Windows.Storage.CreationCollisionOption.openIfExists).then(function (newStorageFolder) { - //can't copy onto itself - if (srcPath == newStorageFolder.path) { - fail && fail(FileError.INVALID_MODIFICATION_ERR); - return; - } - //can't copy into itself - if (srcPath == parentPath) { - fail && fail(FileError.INVALID_MODIFICATION_ERR); - return; - } - copyFiles(srcPath, newStorageFolder.path).then(function () { - Windows.Storage.StorageFolder.getFolderFromPathAsync(newStorageFolder.path).done( - function (storageFolder) { - success(new DirectoryEntry(storageFolder.name, storageFolder.path)); - }, - function () { fail && fail(FileError.NOT_FOUND_ERR); } - ); - }); - }, function () { fail && fail(FileError.INVALID_MODIFICATION_ERR); }); - }, function () { fail && fail(FileError.INVALID_MODIFICATION_ERR); }); - }; - copyFinish(srcPath, parentFullPath); - }, function () { - fail && fail(FileError.NOT_FOUND_ERR); - } - ); - } - ); - }, - - moveTo:function(success,fail,args) { - var srcPath = args[0]; - var parentFullPath = args[1]; - var name = args[2]; - - - //name can't be invalid - if (/\?|\\|\*|\||\"|<|>|\:|\//g.test(name)) { - fail && fail(FileError.ENCODING_ERR); - return; - } - - var moveFiles = ""; - Windows.Storage.StorageFile.getFileFromPathAsync(srcPath).then( - function (sFile) { - moveFiles = function (srcPath, parentPath) { - var storageFileTop = null; - Windows.Storage.StorageFile.getFileFromPathAsync(srcPath).then(function (storageFile) { - storageFileTop = storageFile; - return Windows.Storage.StorageFolder.getFolderFromPathAsync(parentPath); - }, function () { - fail && fail(FileError.NOT_FOUND_ERR); - }).then(function (storageFolder) { - storageFileTop.moveAsync(storageFolder, name, Windows.Storage.NameCollisionOption.replaceExisting).then(function () { - success(new FileEntry(name, storageFileTop.path)); - }, function () { - fail && fail(FileError.INVALID_MODIFICATION_ERR); - }); - }, function () { - fail && fail(FileError.NOT_FOUND_ERR); - }); - }; - var moveFinish = function (srcPath, parentPath) { - //can't copy onto itself - if (srcPath == parentPath + "\\" + name) { - fail && fail(FileError.INVALID_MODIFICATION_ERR); - return; - } - moveFiles(srcPath, parentFullPath); - }; - moveFinish(srcPath, parentFullPath); - }, - function () { - Windows.Storage.StorageFolder.getFolderFromPathAsync(srcPath).then( - function (sFolder) { - moveFiles = function (srcPath, parentPath) { - var coreMove = function (storageFolderTop, complete) { - storageFolderTop.createFolderQuery().getFoldersAsync().then(function (folderList) { - var folderPromiseArr = []; - if (folderList.length === 0) { - // If failed, we must cancel the deletion of folders & files.So here wo can't delete the folder. - complete(); - } - else { - Windows.Storage.StorageFolder.getFolderFromPathAsync(parentPath).then(function (storageFolderTarget) { - var tempPromiseArr = []; - var index = 0; - for (var j = 0; j < folderList.length; j++) { - tempPromiseArr[index++] = storageFolderTarget.createFolderAsync(folderList[j].name).then(function (targetFolder) { - folderPromiseArr.push(moveFiles(folderList[j].path, targetFolder.path)); - }); - } - WinJS.Promise.join(tempPromiseArr).then(function () { - WinJS.Promise.join(folderPromiseArr).then(complete); - }); - }); - } - }); - }; - return new WinJS.Promise(function (complete) { - var storageFolderTop = null; - Windows.Storage.StorageFolder.getFolderFromPathAsync(srcPath).then(function (storageFolder) { - storageFolderTop = storageFolder; - return storageFolder.createFileQuery().getFilesAsync(); - }).then(function (fileList) { - var filePromiseArr = []; - Windows.Storage.StorageFolder.getFolderFromPathAsync(parentPath).then(function (dstStorageFolder) { - if (fileList) { - for (var i = 0; i < fileList.length; i++) { - filePromiseArr.push(fileList[i].moveAsync(dstStorageFolder)); - } - } - WinJS.Promise.join(filePromiseArr).then(function () { - coreMove(storageFolderTop, complete); - }, function () { }); - }); - }); - }); - }; - var moveFinish = function (srcPath, parentPath) { - var originFolderTop = null; - Windows.Storage.StorageFolder.getFolderFromPathAsync(srcPath).then(function (originFolder) { - originFolderTop = originFolder; - return Windows.Storage.StorageFolder.getFolderFromPathAsync(parentPath); - }, function () { - fail && fail(FileError.INVALID_MODIFICATION_ERR); - }).then(function (storageFolder) { - return storageFolder.createFolderAsync(name, Windows.Storage.CreationCollisionOption.openIfExists); - }, function () { - fail && fail(FileError.INVALID_MODIFICATION_ERR); - }).then(function (newStorageFolder) { - //can't move onto directory that is not empty - newStorageFolder.createFileQuery().getFilesAsync().then(function (fileList) { - newStorageFolder.createFolderQuery().getFoldersAsync().then(function (folderList) { - if (fileList.length !== 0 || folderList.length !== 0) { - fail && fail(FileError.INVALID_MODIFICATION_ERR); - return; - } - //can't copy onto itself - if (srcPath == newStorageFolder.path) { - fail && fail(FileError.INVALID_MODIFICATION_ERR); - return; - } - //can't copy into itself - if (srcPath == parentPath) { - fail && fail(FileError.INVALID_MODIFICATION_ERR); - return; - } - moveFiles(srcPath, newStorageFolder.path).then(function () { - var successCallback = function () { - success(new DirectoryEntry(name, newStorageFolder.path)); - }; - var temp = new DirectoryEntry(originFolderTop.name, originFolderTop.path).removeRecursively(successCallback, fail); - - }, function () { console.log("error!"); }); - }); - }); - }, function () { fail && fail(FileError.INVALID_MODIFICATION_ERR); }); - - }; - moveFinish(srcPath, parentFullPath); - }, function () { - fail && fail(FileError.NOT_FOUND_ERR); - } - ); - } - ); - }, - tempFileSystem:null, - - persistentFileSystem:null, - - requestFileSystem:function(win,fail,args) { - var type = args[0]; - var size = args[1]; - - var filePath = ""; - var result = null; - var fsTypeName = ""; - - switch (type) { - case LocalFileSystem.TEMPORARY: - filePath = Windows.Storage.ApplicationData.current.temporaryFolder.path; - fsTypeName = "temporary"; - break; - case LocalFileSystem.PERSISTENT: - filePath = Windows.Storage.ApplicationData.current.localFolder.path; - fsTypeName = "persistent"; - break; - } - - var MAX_SIZE = 10000000000; - if (size > MAX_SIZE) { - fail && fail(FileError.QUOTA_EXCEEDED_ERR); - return; - } - - var fileSystem = new FileSystem(fsTypeName, new DirectoryEntry(fsTypeName, filePath)); - result = fileSystem; - win(result); - }, - - resolveLocalFileSystemURI:function(success,fail,args) { - var uri = args[0]; - - var path = uri; - - // support for file name with parameters - if (/\?/g.test(path)) { - path = String(path).split("?")[0]; - } - - // support for encodeURI - if (/\%5/g.test(path)) { - path = decodeURI(path); - } - - // support for special path start with file:/// - if (path.substr(0, 8) == "file:///") { - path = Windows.Storage.ApplicationData.current.localFolder.path + "\\" + String(path).substr(8).split("/").join("\\"); - Windows.Storage.StorageFile.getFileFromPathAsync(path).then( - function (storageFile) { - success(new FileEntry(storageFile.name, storageFile.path)); - }, function () { - Windows.Storage.StorageFolder.getFolderFromPathAsync(path).then( - function (storageFolder) { - success(new DirectoryEntry(storageFolder.name, storageFolder.path)); - }, function () { - fail && fail(FileError.NOT_FOUND_ERR); - } - ); - } - ); - } else { - Windows.Storage.StorageFile.getFileFromPathAsync(path).then( - function (storageFile) { - success(new FileEntry(storageFile.name, storageFile.path)); - }, function () { - Windows.Storage.StorageFolder.getFolderFromPathAsync(path).then( - function (storageFolder) { - success(new DirectoryEntry(storageFolder.name, storageFolder.path)); - }, function () { - fail && fail(FileError.ENCODING_ERR); - } - ); - } - ); - } - } - -}; - -require("cordova/commandProxy").add("File",module.exports); - -}); - -// file: lib\windows8\plugin\windows8\FileTransferProxy.js -define("cordova/plugin/windows8/FileTransferProxy", function(require, exports, module) { - - -var FileTransferError = require('cordova/plugin/FileTransferError'), - FileUploadResult = require('cordova/plugin/FileUploadResult'), - FileEntry = require('cordova/plugin/FileEntry'); - -module.exports = { - - upload:function(successCallback, error, options) { - var filePath = options[0]; - var server = options[1]; - - - var win = function (fileUploadResult) { - successCallback(fileUploadResult); - }; - - if (filePath === null || typeof filePath === 'undefined') { - error(FileTransferError.FILE_NOT_FOUND_ERR); - return; - } - - if (String(filePath).substr(0, 8) == "file:///") { - filePath = Windows.Storage.ApplicationData.current.localFolder.path + String(filePath).substr(8).split("/").join("\\"); - } - - Windows.Storage.StorageFile.getFileFromPathAsync(filePath).then(function (storageFile) { - storageFile.openAsync(Windows.Storage.FileAccessMode.read).then(function (stream) { - var blob = MSApp.createBlobFromRandomAccessStream(storageFile.contentType, stream); - var formData = new FormData(); - formData.append("source\";filename=\"" + storageFile.name + "\"", blob); - WinJS.xhr({ type: "POST", url: server, data: formData }).then(function (response) { - var code = response.status; - storageFile.getBasicPropertiesAsync().done(function (basicProperties) { - - Windows.Storage.FileIO.readBufferAsync(storageFile).done(function (buffer) { - var dataReader = Windows.Storage.Streams.DataReader.fromBuffer(buffer); - var fileContent = dataReader.readString(buffer.length); - dataReader.close(); - win(new FileUploadResult(basicProperties.size, code, fileContent)); - - }); - - }); - }, function () { - error(FileTransferError.INVALID_URL_ERR); - }); - }); - - },function(){error(FileTransferError.FILE_NOT_FOUND_ERR);}); - }, - - download:function(win, error, options) { - var source = options[0]; - var target = options[1]; - - - if (target === null || typeof target === undefined) { - error(FileTransferError.FILE_NOT_FOUND_ERR); - return; - } - if (String(target).substr(0, 8) == "file:///") { - target = Windows.Storage.ApplicationData.current.localFolder.path + String(target).substr(8).split("/").join("\\"); - } - var path = target.substr(0, String(target).lastIndexOf("\\")); - var fileName = target.substr(String(target).lastIndexOf("\\") + 1); - if (path === null || fileName === null) { - error(FileTransferError.FILE_NOT_FOUND_ERR); - return; - } - - var download = null; - - - Windows.Storage.StorageFolder.getFolderFromPathAsync(path).then(function (storageFolder) { - storageFolder.createFileAsync(fileName, Windows.Storage.CreationCollisionOption.generateUniqueName).then(function (storageFile) { - var uri = Windows.Foundation.Uri(source); - var downloader = new Windows.Networking.BackgroundTransfer.BackgroundDownloader(); - download = downloader.createDownload(uri, storageFile); - download.startAsync().then(function () { - win(new FileEntry(storageFile.name, storageFile.path)); - }, function () { - error(FileTransferError.INVALID_URL_ERR); - }); - }); - }); - } -}; - -require("cordova/commandProxy").add("FileTransfer",module.exports); -}); - -// file: lib\windows8\plugin\windows8\MediaFile.js -define("cordova/plugin/windows8/MediaFile", function(require, exports, module) { - -/*global Windows:true */ - -var MediaFileData = require('cordova/plugin/MediaFileData'); -var CaptureError = require('cordova/plugin/CaptureError'); - -module.exports = { - - getFormatData: function (successCallback, errorCallback, args) { - Windows.Storage.StorageFile.getFileFromPathAsync(this.fullPath).then( - function (storageFile) { - var mediaTypeFlag = String(storageFile.contentType).split("/")[0].toLowerCase(); - if (mediaTypeFlag === "audio") { - storageFile.properties.getMusicPropertiesAsync().then( - function (audioProperties) { - successCallback(new MediaFileData(null, audioProperties.bitrate, 0, 0, audioProperties.duration / 1000)); - }, function () { - errorCallback(new CaptureError(CaptureError.CAPTURE_INVALID_ARGUMENT)); - } - ); - } else if (mediaTypeFlag === "video") { - storageFile.properties.getVideoPropertiesAsync().then( - function (videoProperties) { - successCallback(new MediaFileData(null, videoProperties.bitrate, videoProperties.height, videoProperties.width, videoProperties.duration / 1000)); - }, function () { - errorCallback(new CaptureError(CaptureError.CAPTURE_INVALID_ARGUMENT)); - } - ); - } else if (mediaTypeFlag === "image") { - storageFile.properties.getImagePropertiesAsync().then( - function (imageProperties) { - successCallback(new MediaFileData(null, 0, imageProperties.height, imageProperties.width, 0)); - }, function () { - errorCallback(new CaptureError(CaptureError.CAPTURE_INVALID_ARGUMENT)); - } - ); - } else { - errorCallback(new CaptureError(CaptureError.CAPTURE_INVALID_ARGUMENT)); - } - }, function () { - errorCallback(new CaptureError(CaptureError.CAPTURE_INVALID_ARGUMENT)); - } - ); - } -}; - -}); - -// file: lib\windows8\plugin\windows8\MediaProxy.js -define("cordova/plugin/windows8/MediaProxy", function(require, exports, module) { - -/*global Windows:true */ - -var cordova = require('cordova'), - Media = require('cordova/plugin/Media'); - -var MediaError = require('cordova/plugin/MediaError'); - -module.exports = { - mediaCaptureMrg:null, - - // Initiates the audio file - create:function(win, lose, args) { - var id = args[0]; - var src = args[1]; - var thisM = Media.get(id); - Media.onStatus(id, Media.MEDIA_STATE, Media.MEDIA_STARTING); - - Media.prototype.node = null; - - var fn = src.split('.').pop(); // gets the file extension - if (thisM.node === null) { - if (fn === 'mp3' || fn === 'wma' || fn === 'wma' || - fn === 'cda' || fn === 'adx' || fn === 'wm' || - fn === 'm3u' || fn === 'wmx') { - thisM.node = new Audio(src); - thisM.node.load(); - var dur = thisM.node.duration; - if (isNaN(dur)) { - dur = -1; - } - Media.onStatus(id, Media.MEDIA_DURATION, dur); - } - else { - lose && lose({code:MediaError.MEDIA_ERR_ABORTED}); - } - } - }, - - // Start playing the audio - startPlayingAudio:function(win, lose, args) { - var id = args[0]; - //var src = args[1]; - //var options = args[2]; - Media.onStatus(id, Media.MEDIA_STATE, Media.MEDIA_RUNNING); - - (Media.get(id)).node.play(); - }, - - // Stops the playing audio - stopPlayingAudio:function(win, lose, args) { - var id = args[0]; - try { - (Media.get(id)).node.pause(); - (Media.get(id)).node.currentTime = 0; - Media.onStatus(id, Media.MEDIA_STATE, Media.MEDIA_STOPPED); - win(); - } catch (err) { - lose("Failed to stop: "+err); - } - }, - - // Seeks to the position in the audio - seekToAudio:function(win, lose, args) { - var id = args[0]; - var milliseconds = args[1]; - try { - (Media.get(id)).node.currentTime = milliseconds / 1000; - win(); - } catch (err) { - lose("Failed to seek: "+err); - } - }, - - // Pauses the playing audio - pausePlayingAudio:function(win, lose, args) { - var id = args[0]; - var thisM = Media.get(id); - try { - thisM.node.pause(); - Media.onStatus(id, Media.MEDIA_STATE, Media.MEDIA_PAUSED); - } catch (err) { - lose("Failed to pause: "+err); - } - }, - - // Gets current position in the audio - getCurrentPositionAudio:function(win, lose, args) { - var id = args[0]; - try { - var p = (Media.get(id)).node.currentTime; - Media.onStatus(id, Media.MEDIA_POSITION, p); - win(p); - } catch (err) { - lose(err); - } - }, - - // Start recording audio - startRecordingAudio:function(win, lose, args) { - var id = args[0]; - var src = args[1]; - // Initialize device - Media.prototype.mediaCaptureMgr = null; - var thisM = (Media.get(id)); - var captureInitSettings = new Windows.Media.Capture.MediaCaptureInitializationSettings(); - captureInitSettings.streamingCaptureMode = Windows.Media.Capture.StreamingCaptureMode.audio; - thisM.mediaCaptureMgr = new Windows.Media.Capture.MediaCapture(); - thisM.mediaCaptureMgr.addEventListener("failed", lose); - - thisM.mediaCaptureMgr.initializeAsync(captureInitSettings).done(function (result) { - thisM.mediaCaptureMgr.addEventListener("recordlimitationexceeded", lose); - thisM.mediaCaptureMgr.addEventListener("failed", lose); - }, lose); - // Start recording - Windows.Storage.KnownFolders.musicLibrary.createFileAsync(src, Windows.Storage.CreationCollisionOption.replaceExisting).done(function (newFile) { - var storageFile = newFile; - var fileType = this.src.split('.').pop(); - var encodingProfile = null; - switch (fileType) { - case 'm4a': - encodingProfile = Windows.Media.MediaProperties.MediaEncodingProfile.createM4a(Windows.Media.MediaProperties.AudioEncodingQuality.auto); - break; - case 'mp3': - encodingProfile = Windows.Media.MediaProperties.MediaEncodingProfile.createMp3(Windows.Media.MediaProperties.AudioEncodingQuality.auto); - break; - case 'wma': - encodingProfile = Windows.Media.MediaProperties.MediaEncodingProfile.createWma(Windows.Media.MediaProperties.AudioEncodingQuality.auto); - break; - default: - lose("Invalid file type for record"); - break; - } - thisM.mediaCaptureMgr.startRecordToStorageFileAsync(encodingProfile, storageFile).done(win, lose); - }, lose); - }, - - // Stop recording audio - stopRecordingAudio:function(win, lose, args) { - var id = args[0]; - var thisM = Media.get(id); - thisM.mediaCaptureMgr.stopRecordAsync().done(win, lose); - }, - - // Release the media object - release:function(win, lose, args) { - var id = args[0]; - var thisM = Media.get(id); - try { - delete thisM.node; - } catch (err) { - lose("Failed to release: "+err); - } - }, - setVolume:function(win, lose, args) { - var id = args[0]; - var volume = args[1]; - var thisM = Media.get(id); - thisM.volume = volume; - } -}; - -require("cordova/commandProxy").add("Media",module.exports); -}); - -// file: lib\windows8\plugin\windows8\NetworkStatusProxy.js -define("cordova/plugin/windows8/NetworkStatusProxy", function(require, exports, module) { - -/*global Windows:true */ - -var cordova = require('cordova'); -var Connection = require('cordova/plugin/Connection'); - -module.exports = { - - getConnectionInfo:function(win,fail,args) - { - console.log("NetworkStatusProxy::getConnectionInfo"); - var winNetConn = Windows.Networking.Connectivity; - var networkInfo = winNetConn.NetworkInformation; - var networkCostInfo = winNetConn.NetworkCostType; - var networkConnectivityInfo = winNetConn.NetworkConnectivityLevel; - var networkAuthenticationInfo = winNetConn.NetworkAuthenticationType; - var networkEncryptionInfo = winNetConn.NetworkEncryptionType; - - var connectionType; - - var profile = Windows.Networking.Connectivity.NetworkInformation.getInternetConnectionProfile(); - if(profile) { - var conLevel = profile.getNetworkConnectivityLevel(); - var interfaceType = profile.networkAdapter.ianaInterfaceType; - - if (conLevel == Windows.Networking.Connectivity.NetworkConnectivityLevel.none) { - connectionType = Connection.NONE; - } - else { - switch (interfaceType) { - case 71: - connectionType = Connection.WIFI; - break; - case 6: - connectionType = Connection.ETHERNET; - break; - default: - connectionType = Connection.UNKNOWN; - break; - } - } - } - // FYI - //Connection.UNKNOWN 'Unknown connection'; - //Connection.ETHERNET 'Ethernet connection'; - //Connection.WIFI 'WiFi connection'; - //Connection.CELL_2G 'Cell 2G connection'; - //Connection.CELL_3G 'Cell 3G connection'; - //Connection.CELL_4G 'Cell 4G connection'; - //Connection.NONE 'No network connection'; - - setTimeout(function () { - if (connectionType) { - win(connectionType); - } else { - win(Connection.NONE); - } - },0); - } - -}; - -require("cordova/commandProxy").add("NetworkStatus",module.exports); -}); - -// file: lib\windows8\plugin\windows8\NotificationProxy.js -define("cordova/plugin/windows8/NotificationProxy", function(require, exports, module) { - -/*global Windows:true */ - -var cordova = require('cordova'); - -var isAlertShowing = false; -var alertStack = []; - -module.exports = { - alert:function(win, loseX, args) { - - if (isAlertShowing) { - var later = function () { - module.exports.alert(win, loseX, args); - }; - alertStack.push(later); - return; - } - isAlertShowing = true; - - var message = args[0]; - var _title = args[1]; - var _buttonLabel = args[2]; - - var md = new Windows.UI.Popups.MessageDialog(message, _title); - md.commands.append(new Windows.UI.Popups.UICommand(_buttonLabel)); - md.showAsync().then(function() { - isAlertShowing = false; - win && win(); - - if (alertStack.length) { - setTimeout(alertStack.shift(), 0); - } - - }); - }, - - confirm:function(win, loseX, args) { - - if (isAlertShowing) { - var later = function () { - module.exports.confirm(win, loseX, args); - }; - alertStack.push(later); - return; - } - - isAlertShowing = true; - - var message = args[0]; - var _title = args[1]; - var _buttonLabels = args[2]; - - var btnList = []; - function commandHandler (command) { - win && win(btnList[command.label]); - } - - var md = new Windows.UI.Popups.MessageDialog(message, _title); - var button = _buttonLabels.split(','); - - for (var i = 0; i tag. - function injectScript(path) { - scriptCounter++; - var script = document.createElement("script"); - script.onload = scriptLoadedCallback; - script.src = path; - document.head.appendChild(script); - } - - // Called when: - // * There are plugins defined and all plugins are finished loading. - // * There are no plugins to load. - function finishPluginLoading() { - context.cordova.require('cordova/channel').onPluginsReady.fire(); - } - - // Handler for the cordova_plugins.json content. - // See plugman's plugin_loader.js for the details of this object. - // This function is only called if the really is a plugins array that isn't empty. - // Otherwise the XHR response handler will just call finishPluginLoading(). - function handlePluginsObject(modules) { - // First create the callback for when all plugins are loaded. - var mapper = context.cordova.require('cordova/modulemapper'); - onScriptLoadingComplete = function() { - // Loop through all the plugins and then through their clobbers and merges. - for (var i = 0; i < modules.length; i++) { - var module = modules[i]; - if (!module) continue; - - if (module.clobbers && module.clobbers.length) { - for (var j = 0; j < module.clobbers.length; j++) { - mapper.clobbers(module.id, module.clobbers[j]); - } - } - - if (module.merges && module.merges.length) { - for (var k = 0; k < module.merges.length; k++) { - mapper.merges(module.id, module.merges[k]); - } - } - - // Finally, if runs is truthy we want to simply require() the module. - // This can be skipped if it had any merges or clobbers, though, - // since the mapper will already have required the module. - if (module.runs && !(module.clobbers && module.clobbers.length) && !(module.merges && module.merges.length)) { - context.cordova.require(module.id); - } - } - - finishPluginLoading(); - }; - - // Now inject the scripts. - for (var i = 0; i < modules.length; i++) { - injectScript(modules[i].file); - } - } - - // Try to XHR the cordova_plugins.json file asynchronously. - try { // we commented we were going to try, so let us actually try and catch - var xhr = new context.XMLHttpRequest(); - xhr.onreadystatechange = function() { - if (this.readyState != 4) { // not DONE - return; - } - - // If the response is a JSON string which composes an array, call handlePluginsObject. - // If the request fails, or the response is not a JSON array, just call finishPluginLoading. - if (this.status == 200) { - var obj = JSON.parse(this.responseText); - if (obj && obj instanceof Array && obj.length > 0) { - handlePluginsObject(obj); - } else { - finishPluginLoading(); - } - } else { - finishPluginLoading(); - } - }; - xhr.open('GET', 'cordova_plugins.json', true); // Async - xhr.send(); - } - catch(err) { - finishPluginLoading(); - } -}(window)); - - - -})(); \ No newline at end of file diff --git a/cordova-lib/spec-plugman/projects/windows8/www/css/index.css b/cordova-lib/spec-plugman/projects/windows8/www/css/index.css deleted file mode 100644 index 51daa797c..000000000 --- a/cordova-lib/spec-plugman/projects/windows8/www/css/index.css +++ /dev/null @@ -1,115 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -* { - -webkit-tap-highlight-color: rgba(0,0,0,0); /* make transparent link selection, adjust last value opacity 0 to 1.0 */ -} - -body { - -webkit-touch-callout: none; /* prevent callout to copy image, etc when tap to hold */ - -webkit-text-size-adjust: none; /* prevent webkit from resizing text to fit */ - -webkit-user-select: none; /* prevent copy paste, to allow, change 'none' to 'text' */ - background-color:#E4E4E4; - background-image:linear-gradient(top, #A7A7A7 0%, #E4E4E4 51%); - background-image:-webkit-linear-gradient(top, #A7A7A7 0%, #E4E4E4 51%); - background-image:-ms-linear-gradient(top, #A7A7A7 0%, #E4E4E4 51%); - background-image:-webkit-gradient( - linear, - left top, - left bottom, - color-stop(0, #A7A7A7), - color-stop(0.51, #E4E4E4) - ); - background-attachment:fixed; - font-family:'HelveticaNeue-Light', 'HelveticaNeue', Helvetica, Arial, sans-serif; - font-size:12px; - height:100%; - margin:0px; - padding:0px; - text-transform:uppercase; - width:100%; -} - -/* Portrait layout (default) */ -.app { - background:url(../img/logo.png) no-repeat center top; /* 170px x 200px */ - position:absolute; /* position in the center of the screen */ - left:50%; - top:50%; - height:50px; /* text area height */ - width:225px; /* text area width */ - text-align:center; - padding:180px 0px 0px 0px; /* image height is 200px (bottom 20px are overlapped with text) */ - margin:-115px 0px 0px -112px; /* offset vertical: half of image height and text area height */ - /* offset horizontal: half of text area width */ -} - -/* Landscape layout (with min-width) */ -@media screen and (min-aspect-ratio: 1/1) and (min-width:400px) { - .app { - background-position:left center; - padding:75px 0px 75px 170px; /* padding-top + padding-bottom + text area = image height */ - margin:-90px 0px 0px -198px; /* offset vertical: half of image height */ - /* offset horizontal: half of image width and text area width */ - } -} - -h1 { - font-size:24px; - font-weight:normal; - margin:0px; - overflow:visible; - padding:0px; - text-align:center; -} - -.event { - border-radius:4px; - -webkit-border-radius:4px; - color:#FFFFFF; - font-size:12px; - margin:0px 30px; - padding:2px 0px; -} - -.event.listening { - background-color:#333333; - display:block; -} - -.event.received { - background-color:#4B946A; - display:none; -} - -@keyframes fade { - from { opacity: 1.0; } - 50% { opacity: 0.4; } - to { opacity: 1.0; } -} - -@-webkit-keyframes fade { - from { opacity: 1.0; } - 50% { opacity: 0.4; } - to { opacity: 1.0; } -} - -.blink { - animation:fade 3000ms infinite; - -webkit-animation:fade 3000ms infinite; -} diff --git a/cordova-lib/spec-plugman/projects/windows8/www/img/logo.png b/cordova-lib/spec-plugman/projects/windows8/www/img/logo.png deleted file mode 100644 index 86a48a83d2ef518548b0f3c1e7745105315cc162..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11600 zcmaKSbyOVRvhLsx!3hKcgS!vG-F>jZJ-E9DhakZ%!7a!T28ZCDV1sM05Zv7YJbvfi zbKd>q-Pfz7y4F|Uu3fuU_g=N?qlTJ14kkG!006*IRFDC`JTv~e&{1FRA_#83UmmYL zWg(tgF7G{k%-yX4l2$Gj*3^nl<~G(~YjZ0Egs;{tt%3 z*U9z8`h`Z^*VWw8!P=AB!rI2pSrmBE)&-=tvl0dB@vCyFx=LHy+9~+ETWk5NXJoUA>~sePRsojrtnMS=g~6?&2XQF8*R{{``M5C#61QxH`RYH1gD zYifQDUUo|^Zfm9}XX04i|SDPHsU#!GAb-c-UVM>>hs3p60&n&K|V?W{|P= zuynU`^|W(wrv8V~+``4nQxy2(>3>bZ$@M?9&L00Ark8+m`kK3Pa&vI~Go^n6RaO80 zP$#GVpglan*8kVv|0l7Bwx6ptC)nD<#mn9DW#Qh_{xg)TkhHtCxu=V}wu_77zoV#O z>*DF+Ve8^bEv*HjW>Ph`v~&JP!Tc`^RaGHHXAe(vXG?2E8ByR12Zx=V)k{1DWCY%U zf!AZ|(e&@9r;&{ic})1^_VkD#}P|`z{>@`9bN1{MPhD=i9Dx|A39Ef5a%? zCmp@}WG5_v$P_}WU)(#B|O`2$lYF3`0;yy|M#lkN6M~~ zDwaXPXvx=UCZr(1Tmg0nKNFG}&M*KHu1l7N07JC~KqX%T95nu~&`qB9Uz!);AAknx zi-3m;GnyBTe|QvGJrRek)OXhGo;839EaSP)Dw^uAcRIY^@2v9&twncqbcpvJ80mFQ z*0^tvX6G4K`CF`p6eNFGyJ$BZLsTJ%@#M0~%|wH&gn`tP*FK3C=Y{41Dq6+42&zm`g+cds!3u>u1RU_zpbR4| zNS8kWU53Z#$q6euG`lW0IBi`CNiB2zUKIM_0;w2NQRk{95WD8?let4WSnp9IPWGf? z$o@SL0v+-f(KUT9@|am{>(h6`pqg zTJQaw@mI{YE$FG(DsvIYzcwiI%*fco(5E=z3N&ZRG`+s!eX2=zxe~%&T>Z>G$B9R$ ztC80oaI2)dNsKa&wqVGX+w3KP5cfNT)sF%`cROouK)@CmKGnP@bmVPlWs|j7DBB}@ zBc|c$uTdgj^DKujK9qJcRl)a|I0~tMJ+x8$?*k@P!Rcp$Kk1&4{YsgUO#2EE+IPN z^S!AEuFdiDE52Ik`jQkJZR9YyVua@d!?h?I(_5NR71h`P{GHq27S;7l0-0dne90AY z+uk3iTz?R`gn}b+T8g`KmCu3KOl{Z`s#+vnyVo*AVHMs+%4A@c9}#TM@@UgpXBpH0?NLc z1zGZrCNUv!3@_hvLO%EtQ3eu?J`BNvnbmg|uPYu$Mts)4o{SgWlf^>UO5nE)<;u+( zy)VK1=uoLCr+9a$7~k4?(iu=@?&*o_1X?=}XA9<3X=5cR-`o4?*5Y|36m}qJi;Z&= zR`|TFsR%6w%uToAbf*mlye^%+pTkA0G8Y_gz?~6J^J?GV<<o9vcj}<4@6T;}V&P31!^(tzM3p(Rc>#Z4`dD zpP@MIUhF2UoIfz9$4lIwm`EzO`c);w!voxBT9U5(l#n1voNzOEik>6tA>Ocbv>sfb zMO=US)bKF55xM@I6yg4o7v5KGc)=yeO$DQ02|f6`;@F-qpppw-$1Is;i~qE~Jj(CI zxN`eL3+t8!H>#TUCmsC8%py=F#LUTw*xUQ&&s{7-%x+{-6(%#9xJaf$mohaOd8Krt z!N*+|6vprRRBH~Uo{ILW34IUs9_0l2;o`R)@Xgh+Q+jUEsT|Y}^3>Z=bFXXjGl=eZ zrHbEmE9v?`=9*MGFO>%7?jrtMVv1ez?`J9QNqNAX$zam1osCY-hRGiewBf?%)MwLJ zV(Dn|GLg5J>6!8$qf!aRI^DHSCn^6UZH+|C5gvr%%$ zF>?YSGlKjxc-}qFuef~!zZg4YXHWvVY(C0BYq3)lp|X*SPwL=h7?s7G>7w5+02 zgITwXA1IZICQ}JC42ro>3s&Jlonl*W$wnV)DSxm3MYb~i zP-MI>AJxsJr^91<5KIMJG}x^rxH`T4Dvt8?Bo`mdidU0SM1q&Fyx-gp9N+(#r%;tn zyn*rQ6P;fe+xEDR65`xht^|%7jdcrl4YHZphBvw#y-G_;n#f<_c3gy%u*F-rc@Mvr z-R#d&?mn#Cj$FjTNvVubnG7?BIl~LZvXFkr2cnT&1RMXddPlA zar&PZq2ajuCD_<_*nFRuu@OB)ncg^g*m+#MGG$BS*^l=6mU=vlPZVldF1{(lwTj>c zvDwrFj;j<$-{$U^1qUNAAlJ-ZwG2paG~HuBdvkQ^8VsVEOPz@K>eMRwq4vG+eFji8 z<97(Cs1ir;nR7k&2rM)UInrz;qf*~*c^~>iebZhF6 zTRPcr?g-JKQ#t9gP5zHxnX0eN$c*n`7c@UDPGqzhT}pB-Gzfm7cgfIYe?t0JfP%k+ zPv48K2;9t8skALCG({ujogBdCgfkjC5Om({tc6ELqVxDt$6Dx6wyVMR}_!&w9cWg-e@`MIFpU1m>0)c$*nE!FD{Xk4#*z zfi#K7yzJ!f4pyjszU%6uSTN|w&OhM(bz@hmRv&dun)}@Fw)>vQ_GiFKK$tj=BWsGT ziedy=85pS(^dL8Iq%!-ykd>yczom>^`ivnmBSlB@JFfAXxf`=hdewJ2oafB~lehH5 zd*5$<@kZ{Saz@U4p0S8A4m;>Fug)R*ILnK#oVPBV`K`c-pCA^sj4z2&jC;L*({t2< zTOJs;m!0=HHulLPnX!VA-j+qf2Qea7c5K8ERb&CjH^y#G!#zc)gzOJJeWU%ANrK_w za#p_yQk6}Pj+tQx$`_{UsC333K*`C%2r}hQaBd2~<_vOkERig!Yq&>@mPKgkn1#*9 ze#xP^9;j9&&x*%vLFJ-hf9?t|FMa&&z<_KP*;{yZB~Q2P&k)gkm#R$UJx<9_B312M z*HZ-TUT(U`;i7OH1;uoCC=VCP!BK34C^31VrO6N8iV`tS%&~F}Jno%NG@{w!AgV-k z&2PPYM(R$Vf|tXowUIh8A8rvTO_m8&f+h0oH;BKXkL-3{HvCB?V%^L>Hb<1dt;t58{+A zX=PVLU@DP_*f#b1*w3;+q1Aoca~Uxd?nj?H*Iv&P37(dV=P0QLxRrDe6VwA7zI*{L zJlcFXr^^w&plN^d#+DG8P?;#ropuC0uPoNvJX;!c5%nm+>E`b5@1p~_H?b>{guMBz zDOHM%CBx}1C;2J;$KS9FbnhqCX?UG2?7qIQGN=d>14u7|CtFjb=S$w-E>~_!;;fw` zm!n(3yKV`*Arz&~?0{D?>wgGxjA;F7DH0;pl*;|KXp?KT&}f zS_tnye0a8b1sPH&wvg_OXW2{bNP^&2_5GMg(g;<}PRM3rww?gxYZD`NS@0nSX|tNR zQkpLDi^+tTi`?d+R#G$UMFX~2h=+31|Ld`{NMHH66Rm| zvy-tzRz~XOG;mt6)umxWZ{0|mZ6ve;XkaDArJ7jxKi-4GiAIbd?MTWaBVhqr-k$}5 zjF@H=ar6;QSs*cRKqp8D{SPGw7KHdUk`y(~`t767RtsX4O$?)ShTPhWgN|*Jae1vh z2{|DGITA^tw$ZOLcc8qfpIt$P1Or+xxqfkBLO&8P-BD$D`g^bk)e?I{_5Kx?9~X4V z<@U1`wq*5UMXvNwb{1|3;%F;-Zfk5r*yNvE$wDzJ5$ph~@UQ=uxmx3cL z$;PRO%FPlM!EcKYwsyIG!EA3O+gv;IR1M1ki7mADW~+HxMHF)}2;J7in{pvo-FM6j zX#8DVr4~?jDiv)M0V&D1!Kzg55MhiyycT!iN?!9{|#HNDl%BI7I+H)Q9r7B`9?+N zdb~cU@u|TKIvY&2QRqIWxH9UFKSZYZj3K=@AA026^d8&lDuc)dr{rT|<#>Av* zN$NDRvX!in;lW91W5%4kBnm_1)KXwm-_HKJC$$oQv=UVaF)u|3v?aQ>DJ%R$X}Y-d z3Kt=1qpE(U7WX&J#h4clpPa7THNot?0;Th>&(R5Es$^0R8YO(G(aU6EbJF5iCm%LU zL#G}4XrHgtyIb$Yd>_zKoDz{}$6{@p4PW+r4Eth;S{)JebTdDbA$8&J13bAU(^7;A zkEau6#@9^(zp?gMqPo3VpJiDR^;&pZ;Ot$h3Bs1!aqgQ@<_uML2^hgTVw6W1+2Ll9 zY!33=q`*#BTr17CCz)u%)L~PUP19Z7rGo~YYn^6Ct0RqBUu>$2pnipO0@fDGCP{(M zag4By_cXfCv~Q`Rf1YWX?=s;PxC7V|<$olCEyk|TEoh~23fq|ye@)`}#$is1@@tr9 z7*Jl9sY`E?e!zWV4u0%yeOMn%NbG&5$ZmkDZZf17YA#5j`m5|WcUz?vKkB}npS5a) z>wcpFnTt#@)|}Y6X3I@xFx3-!O$g>IvFDL40L9t|z~EeFkN5)Pdmdwz0Xkj7_|-xc z15Dy8fQB{`gXdLCRqx1(f0SmYfcFB|5~FR~L=x1VUs6eb#%#S#3#?7t1kVYTm#4f{ zy@Tn&gULRhbi~QmTH5x4*zGt5OZVZ90Oa>>o!q?&c^LS{l2HgG~Jm|IM#iZ`EK6twrEizRuZQ#BdOob|KZl^dR3<`Oesw6GY!w8bK$aOc}@t17W+~^97a=SWPFG ziwZ~VpLS0BLh%(?Y2T#JdGJM(jNwg|qx>lsWVg;!$GY|BsJ^GEwe2Z5fWXsH(vDxx zP53h6jmR37Y-{r?S}*9F2Z1;LDwLjKMl&qEYt$+>4hf%$!C1CpbA!8Z)mS|BPzSCr z9Ub*U6Mh4&?N7n}Tbc@Bqi-C4abQV(mAZo1V%_kFc+zeH-$Jv%f=3`0O{NUyW{(b~ zc^5ga!R$s9^rni}7AG-;^>pK>RhR;~934ZZod1py&Tvyv`}Il(5=739z9jl>=@EKH zP6$7Ud?c{sX!w@w_KHR@C3+_Xa_M+kr1|daiZ`KXFTuX+^#YQzf7B(ah%T~5Q_zg9 zSC2J+L4rw+JnzWv87~sVzxPeWyYl4z%043RC>2Lki$3z(ey7hNBv<9?4M?Y4ZEr4N zad5&#w<|;9v=~;0Dp+GZ(v>~?XIdcH`-Dm|dX6P&%O#K8BDt@BWJPqX(~UMN)@3jH z2LC8Ogi^SaQBRasVX_(b#XDxZZK4Wn^`t)~ah2f=`{j0c z%IoLMrb^aD_dS7FEG5NNJy~bYr@Fs=CY23Mj7g!LVrL3j`H|kMTu*bb>p*Ewyq3fT z-vCfj$Mf#i=QnRj^-IuF`sylr!}gPI!u$3~VH}LAPPwQo%YD-eBA@MJW&qZ>T&QQv zk=o!KXJ2K#e4#~Y9ohY|qE`OPZYm|r%tLCP)t})W5E0mDv7m~VIv3_v2&@{^>}?hh zAnz!z7$BmZdkfHzG&@L8q4sgj|0<_+5oi(0z){$gl|@$X4ne{37QJnE1v^4VlzuNT zMHgwEV&mbU&{ZsFT+s9<*zv#P%UNBz=qspUm7mG-*-)%W9r;^9&A5^`IAsT`di4p( zf#M(x=PUlOk+SipNuXGwtWQvBU^V9(b?wMBcFAy^3Q>>%Xr#QouHTlyZP{nrIOCwn z%rlu@jEGC|anh>x4-UQ{ggAu;EKm}R3~Ok=*65i0tCu$UbJIKkb7jhrORBNbH95&Q z_^Y0+Vj{*UBbv9j_khu1e|^PXm$bapSg>?g;+2FAeD7wN>T^h}!?YY$=_Tc&4&MXz zqJ9-0zRO@3njp??XL(O>MK6Q*wGMRJ8c-?#h;(OyN*j^jAYq|-+7o7=1fAHMC5h-( zW2kDseqd@cVy+KV1XJ-XbE$YMT~Grell+MTzNIC*vHS`~o*SHNLa#+HGbWpN=98 z%}?A;hbZDm>^q^)s&wc^>pB>d{f>oR(xe#FYO+gN_#yHg_lO-%C9&OQ{V6$_K(ZAbCc@t8v+}w<%BsEN!@uDdx>q-L)C#OY@Wvq;GEW?y07DnomdJ z@SY^h8n0B1KIc|?N!1<~nS^VK(wJ;l+dYpUZ7BEN-30wWJ-}*zAF6{L{_9X zK8R6?ILbw8$sW%xWD4g(u9(VI|JJ+Bd8WKG5^WtDZq8Bvf#n-!t;d9`I6sI*LIMZ- z{?oY1 z$V-$!B#*(IbK3pzD#3905E{g)T^S9ki>h%Cs-Pg>FF_6GF}8^8KHpq@Qz3;H8cE>r zA((14QocXCq3P&+ibsWg4MF|&F+uzveW47u;AENp!QQuD-2(Z}mzvaoyxl#TE2_pF z*m^a;B5I!ZkzmnnJDkRmdlVkN&}_-~4zwN`PFfTbSaKdY-pm!4S~%89UE4!NW|s+U zH<=Dq9$whtDLbzU`itbzxnh%BrQA_GLqC7$AuP6RFOO}NFh0fg-k2GPJKcB3dLj!O zz|X~U39s)6t%R|6%2S^OnSO#L&z}`_&ARQ|4)cEfRISaT_{PMHM-ZV|ZuIZOk`r0* zwf?Poc~9Q2ZLX(|6G^849I~Yl6}30L4SQNwve`39Lkvo5dleyl_71Jby5sDY`E#9_ zFZGMyMF@~AA%CaNu}Wnap>*a?e}x$nnKw)8%|`rBTu-GcS2g5@`iTb$xjoqRuZzu{~(Z>f%?!zTe|V5q5We0k_S8vjasivbv_gBZ$h+NpE5>=*TY**}h;L=8 zlSBOxY(4#66Z19b`0!&Y1ccN%8bKT?PgE}DZ|K6lO5)rM`uV z691FjyiW<09F{PL<)@G75S}0g5?;3Yy0$nFiXzmF$4GN(B8iLJwSGV5QgiLbQl(Wa zU;9T+bFpWJD+@o>+r=EdJWhzX&<_r?BwDcN&KxwRgZYRgv5-U{L~kkXkMe#`t)J^7;f?#5hkX2Kp^YBlw=KK+H=oU~A&Ss2 zlS2Ox`8dQ%+L8@_V2)%6kfREmDh(xg?>?#J@a_~DmwnB{&%`X>OL$UIQ%AvrgAnc& zLPe*@>TUu8fs_K~2U|1MuwevL$L@Jd0U7v8;MlT+5_9#j3@n_VT6d_?=|U4k)Mcm_ zqS7!k1}<;gUZv)v{;c8m$|?;Y9v)<$jAdQ<^73dVT3SXVNYfp0noX9T5hEpSpC6H^ zG`U-Q{d^kb@v_Hc9|UMyrM6pDeC~>o7RZT)0n2X-dNsFw=%-Z06O5Bq9sH<#}*PSnYGb6dZ{EZ zOj(C4e_iDGjr|keiJFf$G6*F2mM~=RAO5GY)$=2N)ZjtI8F%u2)wbO3n`7rMKWIbc zeke*(+VxPB3+!8XTNS3XA*HeC;cm`7;II+Li|JY2_u_IWk7nxh2_Xw?XCmiY=hKam zsrFqIM_o~X+2HA$@`nBSlWe1egyvMb`b%=l0s#U5<=3Y>=V3pZ5?fePv_ISkP(@aE zkf^A~JJ|6G382(2opdS`@^| z22I37wk(6}f}CmDp|A2O;(WXfroK9b;rG#KP{+J&4$S;I#t5fD6?g7JgCY0tE$R%~ zlZFtCb63t(UHL!$0gSNijOSVkjTmZ6m4?G-l+V%`E)^ey%Q|$1dOeC9WT+eijr+{L zJ1NXW-+QKRjFo?slQ7JUr>KM&@+MPwD#*l1Z~{uN$Hbp*H;F>tuRUEiKkT0ib)-Qm z?F))j;8ojh7bgw&!p);MsUlOrd0w~{vv3m#Myb4{_I(X%(=5xHvP;3+dcvE3hb@fX z4c^*_e*0)i7+0PU@;td~C zv&b$0CO@>ogTBeykz1EaYD(;-6rt~qp4{vQ<56fR5~yb=GkiT;ga ztaE@`a(Jox!CB)tvw&P;yncXMF4mj2mZ^B-Cu9Dv>5$D!LZex+FeOE{o!&?+kGIda zL&kwE_I46KZNZJm+C%XkGz7d;$j+oMG~G<0Fk)GR*X`%S z>ffMHXaq1AZDeLGshxvPel37V>v#m^u zKleG^ZE55jUH-1E*&b_)zoY;x4gSjP)@(k-=w5^`L=0(cVgi<>RxVdhU@5D(ZSv(y zu}W-gpgv1Xl`i>ETJ%tzCYj%DHJe)e@ak&b*W+|CfqC5>J6tw@j=E+h%LaywSr6X3 zTE1E6>tnrmF~x&6>7820@ES-$uugX(q^qn%P2WT@K@&P_U+cU6QX`%^KK`_-nSOM1 z^d5h34K)iGGK|FYD8y9#`998dYxpoMIH#Nb{mJy36rK>UwWa0e_qn%mC4Z}bKuC3KYgIG0+2jdj76A{ALGgSMB;^<7j}1p?)j#@gi1; zELCA=fiH#x^RnlLgXzOk3Iddmf1z<^zcj)6IPT+;Ae*f4jD6fs1gL%ME0Lj~n+~5$ z6|U6&skO^?x6XF+%=TKL<=XJ@@a_G5`{i~UqV|j4iECQ33R_u$GZDMBx`@s_gQF{9 zbSHx1f@qA+r>mN^emMh9LXo*d&EixR?DsghhgBUb#`7>rmIb%!_9<>04Lb=IiXmyU zMp(V@VQy{qN0BtjnMxxwWn&N||?8W$wb!KxB1z z_#=*pPn~W}s3!%>*nPn3Pn^e6EB&*PISnu zfoutr>6b4DT)#^D-GeIRV=H?^?CWA8coLP(bl7gjboF$dH9aPY{y^nDWDgGyji!Hx zk4~wp)r3!|;Q_3VH!*hHeuK3?yDyfAsb@m+4mxgD+kA+!F2A?8AO1dR90rt`z9dpW zK%3L5%PwV6u57rIop#D}adKU=%UYiDE^ppcqC87&$|`^tCwv4ocVtALUXia9^Jj>u zDeaTef*vuU(aVc@S8D3dA~K;K21T&rZE5KMit%H%J^jZZIHGp4$^`JmH3x?( zYb4^?W#zc#BX5V)Z6lp*oE4%v2h*UdSy3#rmdQka(>iDREG_V3ZCVi9$4&pObUk!P zUP8T6DOrPM=UZ%^0s-=)D%onStRA-dmmViwg3NSzlpPcm6N!p0dRSH@23`@WAw@IO zX3s@ib497~mwugEWE><7d%*h-yQm7Sg0(?UfA4ex!$14YXie2pLpNh!s{ zyjG-|v^6EtA1P*igvSP3>l^sguhVz@jeSs?dcc@>i_OVGvjqEaqD(eRVL6lnp+I|E z+ub*a{WKhC6h?s-)#Y8xN3zQ#L%Uj!E9LWx4leDr2_S7{vGBYW5`uBgj?1Zpu`$)z zk8E)S6B6B1{DjZ8siJ0^WVl-+i#Btd>9AS-H@Xa*NA7` z-rzY5t<^;hH3W$@-Qcms3oGxb=M}KTA(W!u4GIx=z7E)TeQ50F3Yu$xf7hkJ$iMei zt-5b~b5w7E5%wjem9w^%XkriN&>`RGK^x$~-`%*i=2SfuHOg$$T>K)jh%5TmqFf{85%?Qlc0P0tgVl-)6E>I@Z_*c>oXvED#5> z->NF%s;tW6krTf&-}o{A+$geCx5j<76~#&|7Rv$DRKxE~o)maA)`TDbi5@zG)8cRE z;y&_~qi3`-d?d}}8;zd`PD#@5>@OJECWu?EhwiHv?TVcUWwC!ft%?@`JHr9|9|v&N zCv02t{*YXencc5}h)a~YwcJ}tt`vHC zj3%wwm!BADb;u%ZJ6+{4sV9x$rz1lM^MI%{`}fyVDrmV53oc~|1MJj0D`ff|JgW$Y z*~Om_Vk!}MC~fa;=n*vT`4P@{NGSzArkA`FQWljp6Z6b>14yX%BrbU+thFZPQK57d z)<~I_9}{%gx$Bh>vmEUj**3(^Lzv;=Z|8hkBOkZrh8P#kn)VIG&j=;bnX5k`Li~CL z2zogfLRel)uzWTc0i!P$r$E@Ek(H6i)B)M~z;uxjACK@#>=g|nh#h5C+Q~S0ro`zj zt63VUj?a)HF^OiXot&7uhLhs{_^)wf9ksd^&h9WG!y!djG$i)y2oj==til%RAiUqp zE5+hRpRL%i6#pU5toe?)iSi9S>|7zT!OekfAXRy391(9sLv*O(H0Nf_!#5=f=;s@D zlz}`q6ClcFMyx69M|)u1A%uDjjZ4+8`|-2g#G2eTWqhPG503)kSBf|SFkbRwq~wc6 z5X(dO-oEPi`>YsIR{-_gjju@^^T#llCK4`=+f5#_`6uk$_NDVNoacYEK>p8ONS=Q; mMg9x$Pj{p{(bh8-7eIGmt7D)Ux9OiAXGK{xnQu~NVgCoO%C}Ph diff --git a/cordova-lib/spec-plugman/projects/windows8/www/img/smalllogo.png b/cordova-lib/spec-plugman/projects/windows8/www/img/smalllogo.png deleted file mode 100644 index 0e648ef38d5e98bd5033f1ddb7b2059e13e6f858..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2831 zcmaJ@c|6p4A0Iig>qr(w*fArEFlI2!Fga!r8tk~nij0|&i8;)Sj43Hs&RR;6n>^Gy zRzp~3ODRb?*UBST$l1Dc^NhCI=Z~l7`}+NU-|zSHdcWVF^N(M=v!kulw@Tjv001ew z6BwLeSKWKX#ROkd{qh3ArpUI&vt8)^>`(%e46r28{m4K&D&Y(nM<$TMf?LRD0D!PM z#TC!SV^1Q9bgCX<52MGSG6ZY@z|5S(AP@t|Y@i?c426aQ&DB2y0VyOD$ioP$k7c0A z0hAM5CfSAS=t|@U5)mYj`Ej5b2PqJslGy|xhZ;mk9~oFI(vHSr6KF)T9R>vwXy{QWBtbomF~%mw22eE25DK-1nb<&05O5=e z6~e^Y0Bwx<%*D`&AyhJr{h3Sphimv%?%ps^83NB3GLv$SOtN9pslbm(BPm~x1^QLJ zPh8U1V}X5@3lRhZ*=y~8wfeJ3Fh6_8FM}(%d>MT*O)&3F!C(U}#CZb%`!CyJEL}PO zzTpuVcWPYmVp~=Q!hpx>6RZIx55;A$&lL6^R2u!?wWFkq3)~Is0%x~G=^yK zQs92`LED36HvvK9Jjii(b(f zU18<7%@Kb1hz3L!D!~ANH2I6RZ^Fp7E*-ah`m*ReHbY_>=|Snm!ZW2_Kj4kLpP$!f zdro-w*o)32$C`ftjb}iF=qWXFuRRELrxvj?2h-h#belS>gJ@Qm-7~1X!NyZ znO;llF%li?$eT0gm`64OmBJa=HAue z9s1z;f&IIj3GebSVPc`;n8Y!Y<*o|G@Pci}RFz_i&n>Rc`2D#-$u-j(!cj@6V5V5g z36Upv@4(cv?MDVyof>D)5q^SCNY+X-HU|gdnhW+tqa)V9s$pxk&;6T!t*TNVG`H|} z!i@(OxFC#VruE0=##JMRyJpR#Rn`q+3&f)Dr1qZsB??y-OS8SCi+>=BlEKsu6kPF6 zOHE|;&cEe3joi&eUBy+#m1}j{WM5i^F6Z8p;~r-2jsr`m{U$p*Ra|(IOc3`6!~^9c z3;CL<@ghgBlFWqieVlf>f8*%HvXPgE_&bMm6mF&{svLz_f$X?Dl88cyLy=|f4(z#u zzPTqy7>8LNOiho#Tellxh)Ruq4C6#u)oU|QRZWHSe9GhA!H}08s-Ge8w{h`@A zenl-sMq>IUD{<5mO?cC6vn;*jrJ0s8a{f{v^ALnE5I3BIk?gZLFz{NYv?t^aB><#4 zV=#m}lF8w}^g_pQeLXyvz4GvK(8md`Zu@2=-C_qr>dGIR^}dil{E~V_O_!;<{A-iz zB#BEa_5f$HmIxr*l?8NqLtzJ`pzadPn$b3N{(N;_}}(zo~}i)+ZR>!``Uy z0iX9OG43z1M_s>A!`vxzF^GF6d!kR{r$4e24nVItCmoVJFt;c+Zy{V~mAF_wI*VIr zZ6p1-H+q^c@o@>*9(bmsOV|uRmrRVsEVn=vG4U$*vZSQ+dl2)2t#}zo% z59AkL#r%=4L#;X);gNqdtlO})ikAK&{v9aeWFEdWkGS&anKA&>D> zBT}+$zH&|J$n9V8bNzIF%=nnaMs)WO+(D#`4yY(ATYm&k*0fj2EVyB`UcI1WsPtz* zDcY$Lot*4q>9kP_a#wG{k-A-eY)#U3yp^mW42xcG~KwCz_zZasPLl-m{{SoBkwR@Y?o zhuQCna8u`Ftn%k7$66jDv)klz`!2Xg*KQuE;px0B?MF^mhnNIq;Aqa|iF=ISRP$~O zpWxoYo>56$Cs*g6(3W~)QRbdmM7))eQAhJ~mG0y@NV3vH3s3hydgzq%?9J@#R#Ov) z(LTsG4QgF`H%OIyljZnmia;4F8_Gzr7~`JV1+X zfg_Vw&St%o=A~)W1$RtpgX?O0I&DikT1-Ztr+_Ph`X9V6w=YWdr6lKU&zIV@ns#@0 zhau|pgZQuZV?vaq#H#!HTCEXlPP-FhPoJpqAKfUkAy#S>LL)YoDR;flZHE`*;Xemz z>EG3z(zLU`37gGE7W&wiS~>>p{5TSRtc~5ktBM1-H-y(>r=<4<=7^xa3A5i96{ZMy zz1ZBS5L=sb<-wV%(d5-C?DwK(76V6?T8hI(CzBs}&mC$0Znqab#}X0)w3ke1e#2)= Q@BO0MSvz9Nt$ZW@1Ft6QBme*a diff --git a/cordova-lib/spec-plugman/projects/windows8/www/img/splashscreen.png b/cordova-lib/spec-plugman/projects/windows8/www/img/splashscreen.png deleted file mode 100644 index d1e6c982818b3546fb5070c75623959ce479d271..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24855 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≶T$HebG{9eWP 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

K$uoL~Sr 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 Ap#T5? diff --git a/cordova-lib/spec-plugman/projects/windows8/www/img/storelogo.png b/cordova-lib/spec-plugman/projects/windows8/www/img/storelogo.png deleted file mode 100644 index dd004780cc33c1d7250b1b6059dca603da264b6b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4052 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 - - - - - - - - Hello World - - -

- - - - - diff --git a/cordova-lib/spec-plugman/projects/windows8/www/js/index.js b/cordova-lib/spec-plugman/projects/windows8/www/js/index.js deleted file mode 100644 index 87b56604d..000000000 --- a/cordova-lib/spec-plugman/projects/windows8/www/js/index.js +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -var app = { - // Application Constructor - initialize: function() { - this.bindEvents(); - }, - // Bind Event Listeners - // - // Bind any events that are required on startup. Common events are: - // 'load', 'deviceready', 'offline', and 'online'. - bindEvents: function() { - document.addEventListener('deviceready', this.onDeviceReady, false); - }, - // deviceready Event Handler - // - // The scope of 'this' is the event. In order to call the 'receivedEvent' - // function, we must explicitly call 'app.receivedEvent(...);' - onDeviceReady: function() { - app.receivedEvent('deviceready'); - }, - // Update DOM on a Received Event - receivedEvent: function(id) { - var parentElement = document.getElementById(id); - var listeningElement = parentElement.querySelector('.listening'); - var receivedElement = parentElement.querySelector('.received'); - - listeningElement.setAttribute('style', 'display:none;'); - receivedElement.setAttribute('style', 'display:block;'); - - console.log('Received Event: ' + id); - } -}; diff --git a/cordova-lib/spec-plugman/projects/wp8/CordovaAppProj.csproj b/cordova-lib/spec-plugman/projects/wp8/CordovaAppProj.csproj deleted file mode 100644 index bc229e59d..000000000 --- a/cordova-lib/spec-plugman/projects/wp8/CordovaAppProj.csproj +++ /dev/null @@ -1,136 +0,0 @@ - - - - Debug - AnyCPU - 10.0.20506 - 2.0 - {3677C1B7-D68B-4CF9-BF8A-E869D437A6DF} - {C089C8C0-30E0-4E22-80C0-CE093F111A43};{fae04ec0-301f-11d3-bf4b-00c04f79efbc} - Library - Properties - my.test.project - my.test.project - v8.0 - - - - - WindowsPhone - true - en-US - true - true - CordovaAppProj_$(Configuration)_$(Platform).xap - Properties\AppManifest.xml - my.test.project.App - true - true - 11.0 - - - - true - full - false - Bin\Debug - TRACE;DEBUG;SILVERLIGHT;WINDOWS_PHONE;WP8 - true - true - prompt - 4 - false - - - pdbonly - true - Bin\Release - TRACE;SILVERLIGHT;WINDOWS_PHONE;WP8 - true - true - prompt - 4 - false - - - true - Bin\x86\Debug - DEBUG;TRACE;SILVERLIGHT;WINDOWS_PHONE - true - full - - - prompt - ManagedMinimumRules.ruleset - false - - - Bin\x86\Release - TRACE;SILVERLIGHT;WINDOWS_PHONE - true - true - pdbonly - - - prompt - ManagedMinimumRules.ruleset - false - - - true - Bin\ARM\Debug - DEBUG;TRACE;SILVERLIGHT;WINDOWS_PHONE - true - full - - - prompt - ManagedMinimumRules.ruleset - false - false - - - Bin\ARM\Release - TRACE;SILVERLIGHT;WINDOWS_PHONE - true - true - pdbonly - - - prompt - ManagedMinimumRules.ruleset - false - - - - App.xaml - - - MainPage.xaml - - - - Designer - MSBuild:Compile - - - - - - - - PageTest.xaml - - - - - lib\LibraryTest.dll - - - - - - - - - diff --git a/cordova-lib/spec-plugman/projects/wp8/Properties/WMAppManifest.xml b/cordova-lib/spec-plugman/projects/wp8/Properties/WMAppManifest.xml deleted file mode 100644 index 5b37a958b..000000000 --- a/cordova-lib/spec-plugman/projects/wp8/Properties/WMAppManifest.xml +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - - - ApplicationIcon.png - - - - - - - - - - Background.png - 0 - Background.png - An App - - - - - - - - false - - - - - - - - - - \ No newline at end of file diff --git a/cordova-lib/spec-plugman/projects/www-only/.gitkeep b/cordova-lib/spec-plugman/projects/www-only/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/cordova-lib/spec-plugman/registry/registry.spec.js b/cordova-lib/spec-plugman/registry/registry.spec.js index d134f9973..8ac01dc00 100644 --- a/cordova-lib/spec-plugman/registry/registry.spec.js +++ b/cordova-lib/spec-plugman/registry/registry.spec.js @@ -44,7 +44,7 @@ describe('registry', function() { describe('manifest', function() { var pluginDir, packageJson, tmp_plugin, tmp_plugin_xml, tmp_package_json; beforeEach(function() { - pluginDir = __dirname + '/../plugins/EnginePlugin'; + pluginDir = __dirname + '/../../fixtures-plugman/plugins/EnginePlugin'; tmp_plugin = path.join(os.tmpdir(), 'plugin'); tmp_plugin_xml = path.join(tmp_plugin, 'plugin.xml'); tmp_package_json = path.join(tmp_plugin, 'package.json'); diff --git a/cordova-lib/spec-plugman/util/config-changes.spec.js b/cordova-lib/spec-plugman/util/config-changes.spec.js index c7137eef9..2d967b533 100644 --- a/cordova-lib/spec-plugman/util/config-changes.spec.js +++ b/cordova-lib/spec-plugman/util/config-changes.spec.js @@ -32,16 +32,16 @@ var configChanges = require('../../src/plugman/util/config-changes'), shell = require('shelljs'), xcode = require('xcode'), temp = path.join(os.tmpdir(), 'plugman'), - dummyplugin = path.join(__dirname, '..', 'plugins', 'DummyPlugin'), - cbplugin = path.join(__dirname, '..', 'plugins', 'ChildBrowser'), - childrenplugin = path.join(__dirname, '..', 'plugins', 'multiple-children'), - shareddepsplugin = path.join(__dirname, '..', 'plugins', 'shared-deps-multi-child'), - configplugin = path.join(__dirname, '..', 'plugins', 'ConfigTestPlugin'), - varplugin = path.join(__dirname, '..', 'plugins', 'VariablePlugin'), - android_two_project = path.join(__dirname, '..', 'projects', 'android_two', '*'), - android_two_no_perms_project = path.join(__dirname, '..', 'projects', 'android_two_no_perms', '*'), - ios_plist_project = path.join(__dirname, '..', 'projects', 'ios-plist', '*'), - ios_config_xml = path.join(__dirname, '..', 'projects', 'ios-config-xml', '*'), + dummyplugin = path.join(__dirname, '..', '..', 'fixtures-plugman', 'plugins', 'DummyPlugin'), + cbplugin = path.join(__dirname, '..', '..', 'fixtures-plugman', 'plugins', 'ChildBrowser'), + childrenplugin = path.join(__dirname, '..', '..', 'fixtures-plugman', 'plugins', 'multiple-children'), + shareddepsplugin = path.join(__dirname, '..', '..', 'fixtures-plugman', 'plugins', 'shared-deps-multi-child'), + configplugin = path.join(__dirname, '..', '..', 'fixtures-plugman', 'plugins', 'ConfigTestPlugin'), + varplugin = path.join(__dirname, '..', '..', 'fixtures-plugman', 'plugins', 'VariablePlugin'), + android_two_project = path.join(__dirname, '..', '..', 'fixtures-plugman', 'projects', 'android_two', '*'), + android_two_no_perms_project = path.join(__dirname, '..', '..', 'fixtures-plugman', 'projects', 'android_two_no_perms', '*'), + ios_plist_project = path.join(__dirname, '..', '..', 'fixtures-plugman', 'projects', 'ios-plist', '*'), + ios_config_xml = path.join(__dirname, '..', '..', 'fixtures-plugman', 'projects', 'ios-config-xml', '*'), plugins_dir = path.join(temp, 'cordova', 'plugins'); // TODO: dont do fs so much diff --git a/cordova-lib/spec-plugman/util/csproj.spec.js b/cordova-lib/spec-plugman/util/csproj.spec.js index 236f631d1..4ab1b536f 100644 --- a/cordova-lib/spec-plugman/util/csproj.spec.js +++ b/cordova-lib/spec-plugman/util/csproj.spec.js @@ -23,10 +23,10 @@ var csproj = require('../../src/util/windows/csproj'), fs = require('fs'), xml_helpers = require('../../src/util/xml-helpers'); -var wp8_project = path.join(__dirname, '..', 'projects', 'wp8'), +var wp8_project = path.join(__dirname, '..', '..', 'fixtures-plugman', 'projects', 'wp8'), temp = path.join(os.tmpdir(), 'plugman'), example_csproj = path.join(wp8_project, 'CordovaAppProj.csproj'), - wpcsproj = path.join(__dirname, '..', 'plugins', 'WPcsproj'); + wpcsproj = path.join(__dirname, '..', '..', 'fixtures-plugman', 'plugins', 'WPcsproj'); describe('csproj', function() { it('should throw if passed in an invalid xml file path ref', function() { diff --git a/cordova-lib/spec-plugman/util/dependencies.spec.js b/cordova-lib/spec-plugman/util/dependencies.spec.js index d8e6ef2ea..eec77faf3 100644 --- a/cordova-lib/spec-plugman/util/dependencies.spec.js +++ b/cordova-lib/spec-plugman/util/dependencies.spec.js @@ -51,7 +51,7 @@ describe('dependency module', function() { installed_plugins:tlps, dependent_plugins:[] }); - var obj = dependencies.generate_dependency_info(path.join(__dirname, '..', 'plugins', 'dependencies'), 'android'); + var obj = dependencies.generate_dependency_info(path.join(__dirname, '..', '..', 'fixtures-plugman', 'plugins', 'dependencies'), 'android'); expect(obj.graph.getChain('A')).toEqual(['C','D']); expect(obj.graph.getChain('B')).toEqual(['D', 'E']); }); diff --git a/cordova-lib/spec-plugman/util/xml-helpers.spec.js b/cordova-lib/spec-plugman/util/xml-helpers.spec.js index edcdedbe3..d47978151 100644 --- a/cordova-lib/spec-plugman/util/xml-helpers.spec.js +++ b/cordova-lib/spec-plugman/util/xml-helpers.spec.js @@ -76,7 +76,7 @@ describe('xml-helpers', function(){ var config_xml; beforeEach(function() { - config_xml = xml_helpers.parseElementtreeSync(path.join(__dirname, '..', 'projects', 'android_two', 'res', 'xml', 'config.xml')); + config_xml = xml_helpers.parseElementtreeSync(path.join(__dirname, '..', '..', 'fixtures-plugman', 'projects', 'android_two', 'res', 'xml', 'config.xml')); }); it('should remove any children that match the specified selector', function() { @@ -105,8 +105,8 @@ describe('xml-helpers', function(){ var config_xml, plugin_xml; beforeEach(function() { - config_xml = xml_helpers.parseElementtreeSync(path.join(__dirname, '..', 'projects', 'android_two', 'res', 'xml', 'config.xml')); - plugin_xml = xml_helpers.parseElementtreeSync(path.join(__dirname, '..', 'plugins', 'ChildBrowser', 'plugin.xml')); + config_xml = xml_helpers.parseElementtreeSync(path.join(__dirname, '..', '..', 'fixtures-plugman', 'projects', 'android_two', 'res', 'xml', 'config.xml')); + plugin_xml = xml_helpers.parseElementtreeSync(path.join(__dirname, '..', '..', 'fixtures-plugman', 'plugins', 'ChildBrowser', 'plugin.xml')); }); it('should add children to the specified selector', function() { From 034aacb74550fdc3abe8d58b4bf9d4fa3cf73757 Mon Sep 17 00:00:00 2001 From: Suraj Pindoria Date: Thu, 17 Jul 2014 12:12:48 -0700 Subject: [PATCH 16/16] Create separate package.json files for cordova/ and plugman/ --- cordova-lib/package.json | 9 +- cordova-lib/spec-plugman-create/fetch.spec.js | 2 +- .../spec-plugman-prepare/prepare.spec.js | 2 +- .../platforms/amazon-fireos.spec.js | 2 +- .../spec-plugman/platforms/android.spec.js | 2 +- .../platforms/blackberry10.spec.js | 2 +- .../spec-plugman/platforms/common.spec.js | 2 +- .../spec-plugman/platforms/ios.spec.js | 2 +- .../spec-plugman/platforms/tizen.spec.js | 2 +- .../spec-plugman/platforms/windows8.spec.js | 2 +- .../spec-plugman/platforms/wp8.spec.js | 2 +- .../spec-plugman/util/config-changes.spec.js | 2 +- cordova-lib/spec-plugman/util/csproj.spec.js | 2 +- cordova-lib/spec-plugman/util/plugins.spec.js | 2 +- cordova-lib/src/cordova/package.json | 151 ++++++++++++++++++ cordova-lib/src/plugman/package.json | 148 +++++++++++++++++ 16 files changed, 314 insertions(+), 20 deletions(-) create mode 100644 cordova-lib/src/cordova/package.json create mode 100644 cordova-lib/src/plugman/package.json diff --git a/cordova-lib/package.json b/cordova-lib/package.json index 808ad397f..9398e7193 100644 --- a/cordova-lib/package.json +++ b/cordova-lib/package.json @@ -21,10 +21,8 @@ "dep-graph": "1.1.0", "elementtree": "0.1.5", "glob": "3.2.x", - "mime": "~1.2.11", "npm": "1.3.4", "npmconf": "0.1.x", - "osenv": "0.0.x", "plist-with-patches": "0.5.x", "properties-parser": "~0.2.3", "q": "~0.9", @@ -32,11 +30,8 @@ "request": "2.22.0", "semver": "2.0.x", "shelljs": "0.1.x", - "tar": "0.1.x", "underscore": "1.4.4", - "xcode": "0.6.6", - "cordova-js": "3.x.x", - "unorm": ">=1.3" + "xcode": "0.6.6" }, "devDependencies": { "temp": "0.6.x", @@ -164,4 +159,4 @@ "name": "Jesse MacFadyen" } ] -} +} \ No newline at end of file diff --git a/cordova-lib/spec-plugman-create/fetch.spec.js b/cordova-lib/spec-plugman-create/fetch.spec.js index 07655f4c4..291094986 100644 --- a/cordova-lib/spec-plugman-create/fetch.spec.js +++ b/cordova-lib/spec-plugman-create/fetch.spec.js @@ -18,7 +18,7 @@ */ var fetch = require('../src/plugman/create/fetch'), fs = require('fs'), - os = require('osenv'), + os = require('../src/plugman/node_modules/osenv'), path = require('path'), shell = require('shelljs'), realrm = shell.rm, diff --git a/cordova-lib/spec-plugman-prepare/prepare.spec.js b/cordova-lib/spec-plugman-prepare/prepare.spec.js index e9bedeba3..1cfa8b43a 100644 --- a/cordova-lib/spec-plugman-prepare/prepare.spec.js +++ b/cordova-lib/spec-plugman-prepare/prepare.spec.js @@ -20,7 +20,7 @@ var platforms = require('../src/plugman/platforms'), prepare = require('../src/plugman/prepare/prepare'), common = require('../src/plugman/platforms/common'); fs = require('fs'), - os = require('osenv'), + os = require('../src/plugman/node_modules/osenv'), path = require('path'), shell = require('shelljs'), config_changes = require('../src/plugman/util/config-changes'), diff --git a/cordova-lib/spec-plugman/platforms/amazon-fireos.spec.js b/cordova-lib/spec-plugman/platforms/amazon-fireos.spec.js index 9d0d73d9e..d6ead7f2b 100644 --- a/cordova-lib/spec-plugman/platforms/amazon-fireos.spec.js +++ b/cordova-lib/spec-plugman/platforms/amazon-fireos.spec.js @@ -23,7 +23,7 @@ var amazon_fireos = require('../../src/plugman/platforms/amazon-fireos'), fs = require('fs'), shell = require('shelljs'), et = require('elementtree'), - os = require('osenv'), + os = require('../../src/plugman/node_modules/osenv'), temp = path.join(os.tmpdir(), 'plugman'), plugins_dir = path.join(temp, 'cordova', 'plugins'), xml_helpers = require('../../src/util/xml-helpers'), diff --git a/cordova-lib/spec-plugman/platforms/android.spec.js b/cordova-lib/spec-plugman/platforms/android.spec.js index d82832c9e..4044232b5 100644 --- a/cordova-lib/spec-plugman/platforms/android.spec.js +++ b/cordova-lib/spec-plugman/platforms/android.spec.js @@ -24,7 +24,7 @@ var android = require('../../src/plugman/platforms/android'), fs = require('fs'), shell = require('shelljs'), et = require('elementtree'), - os = require('osenv'), + os = require('../../src/plugman/node_modules/osenv'), _ = require('underscore'), temp = path.join(os.tmpdir(), 'plugman'), plugins_dir = path.join(temp, 'cordova', 'plugins'), diff --git a/cordova-lib/spec-plugman/platforms/blackberry10.spec.js b/cordova-lib/spec-plugman/platforms/blackberry10.spec.js index ab7e41f42..79c8e7f3d 100644 --- a/cordova-lib/spec-plugman/platforms/blackberry10.spec.js +++ b/cordova-lib/spec-plugman/platforms/blackberry10.spec.js @@ -23,7 +23,7 @@ var blackberry10 = require('../../src/plugman/platforms/blackberry10'), fs = require('fs'), shell = require('shelljs'), et = require('elementtree'), - os = require('osenv'), + os = require('../../src/plugman/node_modules/osenv'), temp = path.join(os.tmpdir(), 'plugman'), plugins_dir = path.join(temp, 'cordova', 'plugins'), xml_helpers = require('../../src/util/xml-helpers'), diff --git a/cordova-lib/spec-plugman/platforms/common.spec.js b/cordova-lib/spec-plugman/platforms/common.spec.js index 6f8647f58..b18df599e 100644 --- a/cordova-lib/spec-plugman/platforms/common.spec.js +++ b/cordova-lib/spec-plugman/platforms/common.spec.js @@ -18,7 +18,7 @@ var common = require('../../src/plugman/platforms/common') , path = require('path') , fs = require('fs') - , osenv = require('osenv') + , osenv = require('../../src/plugman/node_modules/osenv') , shell = require('shelljs') , test_dir = path.join(osenv.tmpdir(), 'test_plugman') , project_dir = path.join(test_dir, 'project') diff --git a/cordova-lib/spec-plugman/platforms/ios.spec.js b/cordova-lib/spec-plugman/platforms/ios.spec.js index 03317386a..69900995e 100644 --- a/cordova-lib/spec-plugman/platforms/ios.spec.js +++ b/cordova-lib/spec-plugman/platforms/ios.spec.js @@ -22,7 +22,7 @@ var ios = require('../../src/plugman/platforms/ios'), fs = require('fs'), et = require('elementtree'), shell = require('shelljs'), - os = require('osenv'), + os = require('../../src/plugman/node_modules/osenv'), plist = require('plist-with-patches'), bplist = require('bplist-parser'), temp = path.join(os.tmpdir(), 'plugman'), diff --git a/cordova-lib/spec-plugman/platforms/tizen.spec.js b/cordova-lib/spec-plugman/platforms/tizen.spec.js index 0512c78ac..36849a916 100644 --- a/cordova-lib/spec-plugman/platforms/tizen.spec.js +++ b/cordova-lib/spec-plugman/platforms/tizen.spec.js @@ -18,7 +18,7 @@ var tizen = require('../../src/plugman/platforms/tizen'), common = require('../../src/plugman/platforms/common'), temp = require('temp'), - os = require('osenv'), + os = require('../../src/plugman/node_modules/osenv'), fs = require('fs'), et = require('elementtree'), path = require('path'), diff --git a/cordova-lib/spec-plugman/platforms/windows8.spec.js b/cordova-lib/spec-plugman/platforms/windows8.spec.js index 55a95d96c..681f11b36 100644 --- a/cordova-lib/spec-plugman/platforms/windows8.spec.js +++ b/cordova-lib/spec-plugman/platforms/windows8.spec.js @@ -23,7 +23,7 @@ var windows8 = require('../../src/plugman/platforms/windows'), fs = require('fs'), shell = require('shelljs'), et = require('elementtree'), - os = require('osenv'), + os = require('../../src/plugman/node_modules/osenv'), temp = path.join(os.tmpdir(), 'plugman'), plugins_dir = path.join(temp, 'cordova', 'plugins'), xml_helpers = require('../../src/util/xml-helpers'), diff --git a/cordova-lib/spec-plugman/platforms/wp8.spec.js b/cordova-lib/spec-plugman/platforms/wp8.spec.js index 28bbfb94b..3f617aa17 100644 --- a/cordova-lib/spec-plugman/platforms/wp8.spec.js +++ b/cordova-lib/spec-plugman/platforms/wp8.spec.js @@ -23,7 +23,7 @@ var wp8 = require('../../src/plugman/platforms/wp8'), fs = require('fs'), shell = require('shelljs'), et = require('elementtree'), - os = require('osenv'), + os = require('../../src/plugman/node_modules/osenv'), temp = path.join(os.tmpdir(), 'plugman'), plugins_dir = path.join(temp, 'cordova', 'plugins'), xml_helpers = require('../../src/util/xml-helpers'), diff --git a/cordova-lib/spec-plugman/util/config-changes.spec.js b/cordova-lib/spec-plugman/util/config-changes.spec.js index 2d967b533..e526feab8 100644 --- a/cordova-lib/spec-plugman/util/config-changes.spec.js +++ b/cordova-lib/spec-plugman/util/config-changes.spec.js @@ -23,7 +23,7 @@ var configChanges = require('../../src/plugman/util/config-changes'), xml_helpers = require('../../src/util/xml-helpers'), ios_parser = require('../../src/plugman/platforms/ios'), fs = require('fs'), - os = require('osenv'), + os = require('../../src/plugman/node_modules/osenv'), plugman = require('../../src/plugman/plugman'), events = require('../../src/events'), et = require('elementtree'), diff --git a/cordova-lib/spec-plugman/util/csproj.spec.js b/cordova-lib/spec-plugman/util/csproj.spec.js index 4ab1b536f..455d49367 100644 --- a/cordova-lib/spec-plugman/util/csproj.spec.js +++ b/cordova-lib/spec-plugman/util/csproj.spec.js @@ -18,7 +18,7 @@ */ var csproj = require('../../src/util/windows/csproj'), path = require('path'), - os = require('osenv'), + os = require('../../src/plugman/node_modules/osenv'), et = require('elementtree'), fs = require('fs'), xml_helpers = require('../../src/util/xml-helpers'); diff --git a/cordova-lib/spec-plugman/util/plugins.spec.js b/cordova-lib/spec-plugman/util/plugins.spec.js index 98366ed69..358e6f5be 100644 --- a/cordova-lib/spec-plugman/util/plugins.spec.js +++ b/cordova-lib/spec-plugman/util/plugins.spec.js @@ -18,7 +18,7 @@ */ var http = require('http'), - osenv = require('osenv'), + osenv = require('../../src/plugman/node_modules/osenv'), path = require('path'), fs = require('fs'), temp = path.join(osenv.tmpdir(), 'plugman'), diff --git a/cordova-lib/src/cordova/package.json b/cordova-lib/src/cordova/package.json new file mode 100644 index 000000000..cebcafb0b --- /dev/null +++ b/cordova-lib/src/cordova/package.json @@ -0,0 +1,151 @@ +{ + "author": "Apache Software Foundation", + "name": "cordova-lib", + "description": "Apache Cordova tools core lib and API", + "version": "0.21.7-dev", + "repository": { + "type": "git", + "url": "git://git-wip-us.apache.org/repos/asf/cordova-lib.git" + }, + "bugs": { + "url": "https://issues.apache.org/jira/browse/CB", + "email": "dev@cordova.apache.org" + }, + "main": "cordova-lib.js", + "engines": { + "node": ">=0.9.9" + }, + "engineStrict": true, + "dependencies": { + "mime": "~1.2.11", + "tar": "0.1.x", + "cordova-js": "3.x.x", + "unorm": ">=1.3" + }, + "devDependencies": { + "temp": "0.6.x", + "jshint": "2.5.x", + "jasmine-node": "~1" + }, + "scripts": { + "test": "npm run jasmine && npm run jshint", + "jshint": "node node_modules/jshint/bin/jshint ../../src", + "jasmine": "jasmine-node --captureExceptions --color ../../spec-cordova*" + }, + "contributors": [ + { + "name": "Brian LeRoux", + "email": "b@brian.io" + }, + { + "name": "Fil Maj", + "email": "maj.fil@gmail.com" + }, + { + "name": "Mike Reinstein", + "email": "reinstein.mike@gmail.com" + }, + { + "name": "Darry Pogue", + "email": "darryl@dpogue.ca" + }, + { + "name": "Michael Brooks", + "email": "michael@michaelbrooks.ca" + }, + { + "name": "Braden Shepherdson", + "email": "braden@chromium.org" + }, + { + "name": "Gord Tanner", + "email": "gtanner@gmail.com" + }, + { + "name": "Tim Kim", + "email": "timk@adobe.com" + }, + { + "name": "Benn Mapes", + "email": "Benn.Mapes@gmail.com" + }, + { + "name": "Michael Wolf", + "email": "Michael.Wolf@Cynergy.com" + }, + { + "name": "Andrew Grieve", + "email": "agrieve@chromium.org" + }, + { + "name": "Bryan Higgins", + "email": "bhiggins@blackberry.com" + }, + { + "name": "Don Coleman", + "email": "dcoleman@chariotsolutions.com" + }, + { + "name": "Germano Gabbianelli", + "email": "tyron.mx@gmail.com" + }, + { + "name": "Ian Clelland", + "email": "iclelland@chromium.org" + }, + { + "name": "Lucas Holmqust", + "email": "lholmqui@redhat.com" + }, + { + "name": "Matt LeGrand", + "email": "mlegrand@gmail.com" + }, + { + "name": "Michal Mocny", + "email": "mmocny@gmail.com" + }, + { + "name": "Sam Breed", + "email": "sam@quickleft.com" + }, + { + "name": "Tommy-Carlos Williams", + "email": "tommy@devgeeks.org" + }, + { + "name": "Rubén Norte", + "email": "rubennorte@gmail.com" + }, + { + "name": "Germano Gabbianelli", + "email": "tyrion.mx@gmail.com" + }, + { + "name": "Steven Gill", + "email": "stevengill97@gmail.com" + }, + { + "name": "Jesse", + "email": "purplecabbage@gmail.com" + }, + { + "name": "Anis Kadri" + }, + { + "name": "Ryan Willoughby" + }, + { + "name": "Brett Rudd" + }, + { + "name": "Shazron Abdullah" + }, + { + "name": "Steve Gill" + }, + { + "name": "Jesse MacFadyen" + } + ] +} \ No newline at end of file diff --git a/cordova-lib/src/plugman/package.json b/cordova-lib/src/plugman/package.json new file mode 100644 index 000000000..68b7037fc --- /dev/null +++ b/cordova-lib/src/plugman/package.json @@ -0,0 +1,148 @@ +{ + "author": "Apache Software Foundation", + "name": "cordova-lib", + "description": "Apache Cordova tools core lib and API", + "version": "0.21.7-dev", + "repository": { + "type": "git", + "url": "git://git-wip-us.apache.org/repos/asf/cordova-lib.git" + }, + "bugs": { + "url": "https://issues.apache.org/jira/browse/CB", + "email": "dev@cordova.apache.org" + }, + "main": "cordova-lib.js", + "engines": { + "node": ">=0.9.9" + }, + "engineStrict": true, + "dependencies": { + "osenv": "0.0.x" + }, + "devDependencies": { + "temp": "0.6.x", + "jshint": "2.5.x", + "jasmine-node": "~1" + }, + "scripts": { + "test": "npm run jasmine && npm run jshint", + "jshint": "node node_modules/jshint/bin/jshint ../../src", + "jasmine": "jasmine-node --captureExceptions --color ../../spec-plugman*" + }, + "contributors": [ + { + "name": "Brian LeRoux", + "email": "b@brian.io" + }, + { + "name": "Fil Maj", + "email": "maj.fil@gmail.com" + }, + { + "name": "Mike Reinstein", + "email": "reinstein.mike@gmail.com" + }, + { + "name": "Darry Pogue", + "email": "darryl@dpogue.ca" + }, + { + "name": "Michael Brooks", + "email": "michael@michaelbrooks.ca" + }, + { + "name": "Braden Shepherdson", + "email": "braden@chromium.org" + }, + { + "name": "Gord Tanner", + "email": "gtanner@gmail.com" + }, + { + "name": "Tim Kim", + "email": "timk@adobe.com" + }, + { + "name": "Benn Mapes", + "email": "Benn.Mapes@gmail.com" + }, + { + "name": "Michael Wolf", + "email": "Michael.Wolf@Cynergy.com" + }, + { + "name": "Andrew Grieve", + "email": "agrieve@chromium.org" + }, + { + "name": "Bryan Higgins", + "email": "bhiggins@blackberry.com" + }, + { + "name": "Don Coleman", + "email": "dcoleman@chariotsolutions.com" + }, + { + "name": "Germano Gabbianelli", + "email": "tyron.mx@gmail.com" + }, + { + "name": "Ian Clelland", + "email": "iclelland@chromium.org" + }, + { + "name": "Lucas Holmqust", + "email": "lholmqui@redhat.com" + }, + { + "name": "Matt LeGrand", + "email": "mlegrand@gmail.com" + }, + { + "name": "Michal Mocny", + "email": "mmocny@gmail.com" + }, + { + "name": "Sam Breed", + "email": "sam@quickleft.com" + }, + { + "name": "Tommy-Carlos Williams", + "email": "tommy@devgeeks.org" + }, + { + "name": "Rubén Norte", + "email": "rubennorte@gmail.com" + }, + { + "name": "Germano Gabbianelli", + "email": "tyrion.mx@gmail.com" + }, + { + "name": "Steven Gill", + "email": "stevengill97@gmail.com" + }, + { + "name": "Jesse", + "email": "purplecabbage@gmail.com" + }, + { + "name": "Anis Kadri" + }, + { + "name": "Ryan Willoughby" + }, + { + "name": "Brett Rudd" + }, + { + "name": "Shazron Abdullah" + }, + { + "name": "Steve Gill" + }, + { + "name": "Jesse MacFadyen" + } + ] +} \ No newline at end of file

&8fdCii3J}k{(9p2XUDsNW_`_AutORT5ci1U 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 u(5 zm|arbh5Djz(>F0ZeAAukz7dKR96P)Il&;k|FdYkylQ45Z@W6gPvtEv3%Z82 z#^GNB?#(fN-02Y6*|lb#KCWfm$gi7rM2|!8a!eEovH11!x|T*l@*MtO!Sx=9l*$oe zr`aZX&6$n^A^DD|Ed)JcBI{!)W$|0&P3LIYdaYl#z~PSp_q-UtnzuoD;vlA)j(K|W zIgnK7D6fNRTTH3S-1)X^Uj2HJxFSdNGz9O)L_g<&y-bTSd=$8Ep5A~Xhx5(fq3}q# z?%}JXpI?en$K~Y}hZtUo{EC|>aGCbl=TSWLp#W_F?VVKNI{IbNWKEK!&l~J-J zLhx1_lYWL<@D4kLuaXCgwckp#H}SJwh`&|NyV{t~;bPlt>&=6zv^?WRt7dHaHGWH! zY-f{KnF2IznYTp>uYWk9dExXYI0Sms-FcEu9bsDJ`4)p=4PINIh6qfil3yM)QGMPm zw#Xby(J3*8u0MO%7}H!RyR4pXqk@?N%Df0IQ1x2Z?7TZ({vmF*MPDP-o%|T7ucEQ( z?PN=oY-f{KnIX14v(%n0|3Q0BB;k6Z&LghKnBPP6p_mE7WP0&S15}?k*A|%{s4bv4 zz_1NiV@z$Kl-UN{35IDNp~QAp#n^N|YD$#6%1DEjdDb_+r8M#lXW_1~g^zrkT__mF zT*U8{KnYo6xkwFs@6g_}0SZlPmY^uGwT zfJRyitBBYAk}Xk^R{@h;YaToti#8>B6mXq6;&hiX*PD;8=luIrJDR+b6Pj@6o~Z@S zj}1~@>xL<>TN@tIB|i(u8gcNm*)`%3AXsYgCYYtQ2KS$wj0LM=$FZ{&XfvPMMW zbOWE{+ectL>tXf-GOJLB18;(U)T1b6H1mME-ZWDLJxfS_w#?gLzBqyaY=ZB70n~15 zyi(9Nn(x*kbGlIms*OgkA|-!;&6nXb%`o?U{A@4_n-Y{x^u2DtDKOY#8Ju}41Q(lq zph&|F=6cY=f6GDpz@l{;1=^+NDTlVvJip229a-5%({wxe%L467Ve>X@Rv~E@@E~kD z)9#JNvZ<)XrXr9YvdJdc7zD~d<-lKHv%s>kN^gqUSm~Prva%b^B%Z8GZ!!mtP^0Ff zO$XSN(ZOqg_U(*!lV$VR?Z!)QHOi>%B`<)r!JNde@OA;`g8MAh0n6KrG8Wg_bP~9` z!FvtZ2(I~M)G51-GI6KeZt`uOPLUk@v&pO^DdK~`D==7VG*JC6pbiF{mnmg#G8K<$ zz@A3NE77nm(J-wr%_xw0o&o*=i`nEa2C_z6{A_8~9BmV`;jTgMUqkj5Ai+I%Oo&|U z+LrrXulB}!l>Diqq#!$OMzR#NzsD(z|D4;D`l)P z3m6}3jpk6lJ%s}Rr<+n?%jcd%#w*c`8npZ{3dH(e;4RosCBF#B8ga2L?`acix#nMg z71^7C1ozyQi(Kr!2kLh)-UH+x2eL+_uI0i}ed9&GHx!)TlmAl=&RU}d&Hs|Z8cd;1 zno?m~ZmC1YE79^6v_%XK+?Vn?a_`b*Fzp7y2|(6}i*3t4Z9;9)V(5>ib{3G}p4%3Y zi`{DA5m;VI{#qbwMC#fi9M$gzz656{`FnD3Dvj1u)xQID>S(+dsXqX?UR28UqSn&2 z<{VZ5|8okz2b^w7F-t0fs4#yZ)1Xnx8v;y)+hI?5UMnDLL_|ZqN~5qv_0xe$aE_yX zDBvV2R#*SDMFb63aGD zdFz4CK%WJA1>iJR3XP|4Fq8 z!tV~vDS&e!OPA~3Vk#jI12-UOGWqj>tP!bmZ{eu^0PqqxtH@uMgR|B=Drs9Nd_a|U zX0p<5GHW&)ujn$n7pO2I6Pu<@Ql8)0c(0OwAIKWfA}(uo+XOGlO#clZ*k)#6*rG=M z-zm;}I^?YsgF&Pf<`aI!uorMFOxse~4agc1sSRt*^#e&APvKa=>8BJ^i5B~!&&HGS zO0L29B^&vvFk;XLhKqp(Fujoc8X#-L#cDdlCKM!f9YoR1WbX$O+;eR$@};nQ2Dk&3 z`^movWQ|Cjp4wpfACmnEaGaDPkUQ^u^jw~@hAh!`tHOv_%zgykhha0eCOv?x5eGZn zePI)t?zA!U2U1%CBsk~lC~~nId_>A?(#3dX|Y41(o8gL$_{$s!mD5W&{Y&1`EQLN}k09?DbOG*-J+^73Om|tVii_O;g@eC^Z5e zi-D{W?^Jfrimb^epUUngRcupLq*~h4_7zM+I@}TYZs12)Y@v#PQG(w|>jHu1-nB-D zJN_Q(o(7z;t-`s+7O@zmo29%yU5)n#@*e|PBT{E<;i$eXPzsKDjxz=z#;G(qC{q1s zUbCV_U(fwb4}WMa|FCs?wxYq7$P^qa!3yUI)Ab^)#v%RHrTnQ3pvCAUy^& z=w`e%Al(@uhJ70J;ZH#yE`(6WN>4ykzj?|V4&k#9eSHYwMx%(dD3zyE9%k{4=495w zqI8~4NZgX9^QHzcIT2U|quS4Nu^-6wsz8I9dCrTZfzF%;L$ndt2jQs@Ek1-W(4by5 z4eBQ}&|%ajnCu08VtOFuwPSk zFcPMeCI-IOPO8!r)u!LToDJ0MVZ47)TKmP&Y7us&=>(#XDuBTtb_D6@pFFVl;+EeZ$)c61-uT{$X9K@#+%%&U zD`PVpufq6bHu0gs$AAfNA3%Nxz~siS?7ZE)EiSE}0HZ-F?X3sv7W28vj#R!J*iYH@ z;BPVQ$&CiKnvLA1km+n6ddf~$Lux@Hs;d7F`f4M!+Y$@0q_1fyn|f8JIDpRgIvHn$VtJYyiAZwBWXI4 zBxNa3j-+dlwBG2wTbYyeQ~@U2Y-Y@x?qvqMtQ=qkL?Y;)pZ4}Z^paDr%*zZv)sBBc z-OH%&Mg3M&b3B$CsS_p_>TWZYS91DV%YPfPF9Fw&N}1$xQKI*+R2VTIey;D$20lPo zz5QI_0e6jy_XhMW_qtHr4{!{X!ZGxKMuicD)O`tP+S_<%k)Hyv-Q`!4?KYz) z)iM`(3n;h-NN~Byb^k>w_Db}qT7?nyez=V+NPA=8csu!hK-P!>dS%TeHc{r?YV@F6 z=F-ui?g7?-et^2;e-#dFt1DWpH-~dGPv%n9uwtz@v;Sqh%w;Fq?DX~K4sPblT(0%r z&raK7&V|{nz*g5|R|b>lZLY_za@lfJ)}FsaPtx3K^n6@qt<>mKnD(AQm1%H)pt>r< zH=BiX=7FgiKRYB)<+?{~c5tA|^-h(Oc9=okc^2GEpU(i;WKR?IitQ3TO&7@3V|JS8_~{%I;mU-n5ntwo3a{_FnQoaCc#t-$ULSWt&J9xCE+fmnx}j z)ruWv9J*{Z%f#guPQg)IjV8#G%)99b7v2&cB3)*S)Y+|;P^JR6@-UkSn4#l0-1+etmrXFrog)?q3$3in5nq8XanwelO+GXa?^)k(kv%z94 z>jdec#>{l~v1#vJpy^S@`xTu2c8H)IW_5S2r;6$9kf}_eXC5;P%t46Ht;ZmPLG9Ow zMu8ktplRDP=<5Z>O;NK6{J1wSv(O#_+imRU@Hhh=RrYP`nI%CDLu04WlarZC&19;F z)@N`cW)UI|R2Rc;cs4kLz^O88xG67lc_6UN>b@$}y~?@X6`@78m}j8tZ|RnK&|Pm| zX{|{|^7WuuW{Vk4{pw;yB=WyO_UK>dG*iL)MmNm2Sg~^b8{I%>_*=K$0frT@%?e0m zx8t?jvF&d2%H3>r;b`(wgDwKu>!ffK4dG43-`WS~b!GcOwvzW~gGLHak` z3kBq8P>wJ?hno4F5nh*u_$9bKz#CT`w{(kn4V>1(k(>QKDNs+FW3X?@J z=>K|-KyimPiRAxF)IGlxXI;-GG!yZDW2tzC~V+19r4 zRhPvute3 zdissw&h+IP*4wJ>XGd1K$){gLR%Pn&ELLVF9Rx>WWB`eL-z=OvB9(*wJ0pjpfA!Sv&OH?~$&F!2`@oD*Pdq~IeS1<9Q2 zXPALyprE%V2L)?Z+-_E((6_*E5msf2)w^c|99PK{vk`4wa+=@Aj^P_wn!*|M5jAR& zuLiAb!OTRX>im{77a%bdSTn;$E%H^zqDiAx#ztP^Uv1aM7x0dIMxw$}U)Qlx**7TA zN2W3t+RjU5U!!1EO{88F6dYK7yV;NY8qL$*CU{qw-fZ+Tm-r8n@w3Be!X_)o7O(Q1 zgTE7botfcIKi zXKC`i!OHS&nBf*2J)@nu*%#NnZ7^m(;(sXrSe^5#kn_#H>QdR26j+`&`ybc>4bT^? zDC+}TBOlo1Cfsd7fyTr^@N5s>8uZ{s3ca2()k7MZw?`ej!!)+Vmn)ok(AT`1%C1p= zheK4)i|;ggG(7X7uQp6*m-ddO9r?fGhyuvzb}b0jLNEHN(}KYKFQeD5Ie5xnjvzYoY7k&4$&qet>HCMC12>X7!DAH($@ zDtrIFn(5^9Hf%E~)ye4tTl%SfwqP#>C-KlqCY5p%)4iBvskPLDXH%S)nts(7LpR2No`-eM}D`3F#CHmjzd{VEUf zV3kP^CSO10Vqq4zoknj3$h1sJ#BiVjF;61Gd#jol4nl1+IYpq#p8HsjX_d;ec|tm? zM(aQg&h8S8`Lm>SN=d?bzzay}09oHdq@a;r8j$IkDh2OWfKQBiXM#8N=WzA@fXuO} z9pFvCxc$Ig0iOSMsJ&90)=b}M#@3|i$J#FNvy(R(qb@lvRRDsYov_i2=Lw}u|5Qzz zAGgKa56?5;8LTP;0?N`Vvrn`==BP< z>iS)&84M)0?zv;NDU~`%cuj{1=yq2x~oYFfQQrQDRytc%C*(#O&9XiK*;a5hr26L5Z}lsm-y14?c) zx-Bffj{hjdzX6{I6b%^o;1j(3?!r}1RZz~CN{>EuVx^oj-r^^>=lF$gOIs!V@^!=f>!!cxvww@J;l zW|;c;Ig-Bt5}iQX9-?Fnw*%}2cA@d-D^@m?N6U(n>gE6Q(_mlwds{McDj(5OW z-g*m$+Gv`$$6?-2Uto`*%OJdzF5BIW3z$HojQDH>dU^4d> z0awEAbMoH;StEMK?tA6{Kkp!qz5c_)=#T@EAOLPi98s`rK+zDN10 zvS&LQyp^UWefc9JNNt`8^*dDmXG9&1qHShD4X)0g>iM^3g-P41smEhNWpKkL2vZ%>)AZ#PNR5aw_Z>G@m8uob%*)Fj;ww}BlY_D z>rYatMi#+Cy`zHd+gwJ{sJULfzWxB(KoGyhe1=LsDpi>x!iswR{a2c)W&)e4+d1_e z;D3NtthF8^OU)}ek)KLap&r>tj{tQC(*I~R3aH*A^En}^eXJjxkV2?8-N^(`0Yf01 z1JTlm(E6C`^FQFL&wz9gSP9|{Al(unD&^)ry-K{&=*{86{2q81>?f#yHNv(7$+4XX zqL3Q&OnYB|_$f#Qe+m^35!ahnpXIQ;mujph{nJX(M*I_IjT(!6uj3%&wWs>1h&b}3 zwPs>l=mt|W5pb>_tT5IfPZ=2mClc{++;T548HP*9Ujt-~i0!&E$|kg~{9R0MBKtUy z!&DbEYd7})*jg8)bu}}{AVJ)|c!6uWFLH?q3BM=*4UjeBWF_pdiOE@WpG{1_oPK-H zYq`z$1^}-?Rp$e)i32~|y{9F*_Z|GggQz)Bc!KeUKs4)T2<=E6?5iposbkZB!YW)G zVWdoE-aP;eg2z)J{TCx;y}hrp-r>&2I58LRdQC*dd8}7bN@9cA22(9j{n~L~4@?jH z@V~>ftI+H*yk*+W$q1NMnxB|i#Be#V7p8r|E(3DRL{Po^HqKDL4kmj}bW6Zr3{;s( zPg3)JP{Yu#G#xSh7hO_b1C{RGhVM9%*p zs`XK*Ofa&Dq2<|p&_Y#=>n)}^_zweBX5eMiJn#3@+@B>z{`DB%rSd|MXKl4nU!~D| zStaBEFabeb;B;IhNGUfm^-job=H;~A5S~u)RKWSI-4JG!cT6kHAkt#kpcfYhVR|X~ z^+48$lChgL6Kq0@tX?cD#4mvTAm2^RtAMk+ZK|#|xaFBoyr@MsgswEruEe~M)$E=2 z@=s#?L-u_{8jgQt=pDU6>IMt|vHr(gKn0wPpq09PXjF4G^BjKbzvTA=V=&;FsT515 z$SO<+exJFNn;(J2Fq}qS?*Ypi5ova6m)0w~wwV+8t^b3+isA~u@lpz2qNp$n`R##X zLxH>Dbq{&H!HYW|`E|VX)~!3t8{*Z#_`jz74}fE)6wE|YVIJpqIE-cjAHnQL^7)^L znTW(}tU_Z2QYrdF{4308e$!KYuL;oiWbS_< zzY)k95xM>t(UR0ovJV1|hf*fJA6lOO7jZWeE7x{xg)`){`@^+h$@6}?>Sr6h*z(|n)LCxU*4Es5V z^qIqtyOV}olJ73Jar23d{Fmpu$e)W;4?_PDP-W~AzbfC|mSX4h%^gr~s_#7lT#1Zx z;s0=T8BEQmvvSpbz*m($-gtHu`3HR`gX4{++Y@5~bJ`e3{{RwLdfAb6;3;@1`#}Qz(1F}Z=>YhsT zAPeD`fkYTUw^NNbkotLm8!XkfOCN{3o?sFC*gih1d;crVQ7GJCj_>scX2NJSOl~}c z5fjoi%aOf{n)?Cg5O%+V!ot_6-LFvzkNxD|1hPi>Zhxm&p*NlGd+z{mg7XD6`fiI; z*m7bC++qe$e=ksFZC_`)`#c_P#=#4((qL)9FXOo<#K!|p6{YZRajY;c`IRp31GR@3 zZvy$5K-P%J`S;)9;x8h5Dd2c01rL2>rNRjR1L%JOPJzdE@^=7PBO=E`Uug0FgX~K{ zf=5PquVjN|BqHx9T^CM!%VG2>`5%F-5v3g)&)9_SH+^^wMVY^F*B{_GDiw@6zH6vg z&v_-@TB#^5;<^%e5Y8uoSpsB@IM_(DkxfjdpY`Hr*w{{&7M zIFbEbaAHT*;ttsLD&PAOXn&gV_Co)9#3OdP(>1E@^;H$cnrqFUipYLUS>~@{+w4~F zCcE*fJ50ql88evu%`gpm_ollFa{v-G@j2jJq;>-D6d-HF%o^}ZCn;-wvWfXva=WCB z1+5ftmQ*TtW7%c9>?me0z`Rr6w6_rf*OK1=WR2+6)s?134eoBEelYL~IQLNV7~ssO zlncT7!Libu+lg(d25~aVdj;%e; zN)UxK8u$pruR!wu7Fs1@TWQYd&fy>ClL?y-GhS1WI!B1nBwA?}g1D!YNd+hY@nn$Z zS4YID_fr2GAegq_jl+MwG-@sOB)^-Em={Wh_en{g>2IrH#8fS(|2@FibB z1e}v8t(cH=Ey-!a3hgYCxKLB32p zJ$R~nTKD6Q1bA+Q-@)oU<1LM zLeRh9)a|RVsez3M0<4W*2yDa+FLv2|Ay{^GZun|@Zog$S{|@jjjE2BuR&_?48(K!o z62=}0p@@7!h(;sW|3I|;X9(?NcBZeYXfmrboBDE!!pN*o2aJUJajO6FGt@R{nG^&q z+*B~7^=8Zh`Mhn*nsQPDdOWDM}PybyQtP{E^`*o!NKnLq+tI(DA@U* z!U3j|Z3lU$YV0u6rj{d?mV~*CjCsJr5Vxm#L_}-@X50C;6R+LL)(7Hs=GQh+%7S*? z5}A7^zl4m_p)3PjbCn|86T1p?Cco0q@6RCzg03fj6Oc6`LIx&Vv6R$qvU>r?Ln(MP zWKOFv!cRlr9OyXOc(0TH1HhwC{5l>ti^u0={|O{`WR&+xj{3N2TJB@%1I*tS?}5KL9o2x*gaA=f&i&2C_yRY{+<; zO=yPMx0E%Jh2wtUHIQ$k<|V-Sl5Kjz_+KH$8eeZH)Yz#s`V9JBi1!19r*r=c#Qxty z21>a_)%M=D8)>`k`jyMn^#dUm;YYwAh+Ba^rd4}+H*#U9ad9d3zz=4~&DsMG$X_7$}wOm3r3%z48ypDviGSC&G__ z3Wy&9{oQ{@d~HCy&UCO`)GI3#m;V`xydT0|v2l5@3piTEVdO8yFVG>qj_1lh!rD@I zG{CiAYHX)`ZxcF6(WM_OUV~X5^w|TMbI)Y{1N~9Jb&XOqZp?bO&6wx{w=;K`!d}F{ zdY@t4hI+NiR&(!dT!NhW1o-xj;3fmOfCAWHxo&p_%UkXBn!0ngTAaz!TDp}y%g@;K z%Sv9vPrLM+O1i*$dm*QYLsH&QpdZ?OLsk06P&=hufcF~ZmF7vXcQ4`DEuakSHq`ez z6uZ*=2}Cvc8elhw!$CSHLQDkKdDv(b+{E=Dh>Jj4^>c`wINX`eeLib|#$&kt2h#Hq zqEaY|gN-(7krkA9)SH^ZUQd`!Od6s~*&qv7)rl*RuH8(b}{Zkrocw++K; zo|?UoafFz*z-riZg~hOlO|_Y5TQCzL{@qnP+lf(DoxmwQbTgoNHKGev!#I9%K`Qaf ztENO&q_td>p^rdWqT{$1g5FTPAp)=}_`_0Nd(-Whrov60 znq+#?X3;zW^cc(h2hGTzp>y#|(B?3H5u%M>T(td6Uv5Ak(!K+j4X^X5UK8=Ewj-IB z|LdbgEhTmkWNI6;dZzDfhj14}UsNY#KOiM)mj=;wxREUlLP<8VpTlE0Jc1x|VNkkSOXN+sj3omYg1oPg)r;^Ur=e_B?5RMXc+Vius2%1@g9yG)zPk`L7YpiRd~%b6 zz)Bbohv_*H>J-p zDY{8zSAk+LmA;pfNN!i=hPctltTH2b%%IMnEM+RY{t`E$>wFLra_gSmw0sy8=pOdR zhCuRBP_TxAp;@k~e;gE4tk`2#!g>{YR+-NqV>f2(*O+0i+toK&v9`R0Ew?wCGBEU= zP&M=*a1o7t2nNsPHrCCYgFqCLKa>#w;z5x9`g4e%-hw$mnhbmfVo{otT)@o=O0m?A zbF)I7W6TOB10t9$rYZOXfI$7@%p6-Y9Y54pGb)Wfgeay@3}f$jHt&Cd)sqq9pkFGu zW~-YS>TC-7Wz7ouMMEztS-m2Ei@69!TVWJfdY84My*XA>K%J@}kMv5@U?tNLxSs$M z5d1bm^?qvCqF~k4ld^gR^)}O#U-rT#k4t`li`11enZx+?O7w>75;3SSU+^ooHHLGc z6V`n}I1R`ek=ux{rcG$^y5n|63y8CU{UA@HW((l-P%2^B!RG6#z_M+@KLrRZdy3Kf zu{8?461^n6(&&ZiV!8@Qk7s6t)yvfxYsdJ@We~na%~ybHm{Rc;*CwYFZpFNd;!Im08TBX*vN`Og_+Fn9<+E0*aO?muyYxH$&|1q+!0@0_i z9W%Q=WKOg%@z8_5+4KzK6_#cWB0oQ@m zwmRE_tqx{sQOt1-G*f{w&|LscGy{ibaT9O3*RaKQPFm|fRztD6Fu6iWJpIN=+zkS( zfqpZkcSdrf<8%83ox|FTa%@`ld;@@VrFns0(e571J3*j-hr0a2P;aGhJg#7R)UN`n zjE6I4+yO z``-VcfEXqtfM164*D%&goDzRUi8Kmy z0fwVQ;~I%!8Ho%dfIy-Pc#03YY!m^A)Vh$A=_>6c&HZxxlsV!7o6&^Z^^y_UzN{( zjg;R)_!Zy=YRE)jV2+?*h=7vlmsUD@;dWua}8@*Xh;+vwU6LmQgOOfTD=9rUurK~1m~aC>53*%Jr2B^V8hRBcKmdYJ(6Cy^fkWR39Mlz0xIkm@%Bd%>AS&6R-jtRT9= z4%%GS8ERBz&mi?FtV*K~ZHsc~XwI*p-bwXeBWfE$F*bv+^+rF4l((2&(3}WOaGrNd zct>Awo_AZ2x8d`pXgD0)?Lgbf7_l}lIRSDs|L;f@O8zj4g5^37Y#fAU*vx`^Ka zCct1Q#8V>%_QpSKvCcT{zST}|3W?(<853d7jP5ELn^uhmNQ6dqrelO3l9ul$+3kFl5{a*dB zU{F52p)Z?@Z;vy$lW>ahdc%7n;4BsN28U7)g3}S4z}kBQYcox8y9?G9{Tg5ZJeELz zU&NzYv^_YEwugX!p5`rm&XZ6ow}P3HQI=`9lqJ8wl6C>ohe?aG^#DNSPkMy(lz+{8E7T!18N@ ztPVE8g_=G#q0{=O*@%c@4Dbn5H&AmQ;LK|W9i)LH_6|&=D-inlkpBdj9|2BB8@@+6 zHU^=(j^ZpyOM#YCi4^N`odd`kak4tTY!m2sz$SD#M;~0$}?V7zo9|$;+N)f?| zM}=w4uQ=ZTjD!2R?cPL#gO?&G*Q7CHi_-i9VE7VZ`8G7`_9%p!U}{UNMm6 zB?>|NU$qIXkNQB75WO+LG|oRk91ggyvBr+OW?-(Pk7n3&{S;2>0&Q4`H`VI1v_JrqZGDB=WiXv(`1XgrXc}gt zxW&~Hw}?q@+~UK&BXDTk;=SMAyio%GrR9Dr_eBRWXyroyMlGEs~dtSVRM2ho*_=;~jc?@lg*h>pDY zpr?!9)|$IEGwRAITM4+qW-tFUXlGC&>2CscXR;qAzXQk`;cL)xU4AQfDpCJEFa(^( zsCfr)Bc$3z{hL)|qbhe%|0|X(5jH5{fEnT+sIGBXNF2swNIB{jZv6nMFYqvkZ9(cC zA%-gwp^(Ce4dz8m*ALW@z!#vGgNmVg+K_`pFPm6rRBpS>B?vXebc6X3`q9wd0d$;Y zymu-6x3SB!LF_U+j9tQl>0#^=7EI1xXMX7ddfHTn0AvpWUIQj0l1);Mf@*rs5W z9T=^$8_Y3{*`q+z?JSO!AzTL0zl}0Jt*%{I5NQ_{B(+;>Ue>&SEu8NGa+Wc7SBMsZ zYIlW5j~?hW9(WDCUL^k^kTv3CC*qAZ!9sqkO(@vV=ldo=u@Wep&HZ20G(S8vL$wvH zceJ8yFpDvRh@JojLAVkkJ3cfnbH_(KbKw6uGsn-25Am_%L-Pbr&Ea|y@jkE=G25uV z8^{fYyt~YAmT)apk5I4dO0WgyM__Fd4Plam&E0zr)m+k&kn~V~b^a|BNyBm>wJy=^Wnho%^Sc zV2PYxz^jza*u%NFp6Y)Q>X>OZz55HL=iBri()XE5TJsEC_k52Q}HQmM~Kopgm#-;p}9sZ!|^*?SNb+-K^MdYx0u`%H6EpUzOKGpWOA z_I;)wDRa6~C#&ofrOqJr)R9U}B6WOirAkTNJz1#>Nex+})H+gka@KgC*-on8ElS-* z>eenwJwoc@84Iaj zAgA-@%q#c&*qwPXo+V!wj=3x9Z%_zlZ0Ma&>eKYU@Rq_E>MYIaKvOv?m&*| ze7QcC z%)CYxvtQB2V!q^fn;YW!XNt|p%RsGRlm6499d#OdWEz;W#iQs^X?c!{B=}k7Cb(R> z=vCz=x?Ew=@0B~(CA6~TLaQYcEeLr}6YqtpfOpY)`A)g3D|BsIuke;L{Y(^FJ_<>&5uftb6*yN=B_vO^D@^UDO z+VblJbBn8I#W|W(I&V9H5%WPG4e)2yv!t}V9A^G~vQ6uWpx4+#(iDD6LkIc&mr+u4 z0r&4I5xLVEGPd9Ac!i&0;nn_0dxbdN^G{X+#F}MO$ekklq}r_H%wY_vXA*R$BW9(4 z+8+YC5doc7I39*I{n6j5Vu|OUp+qD(KQEBX#PBAzp6ripK~c?_+)1Z|MHJ8OA!317 z*pMDy>5o56h)d9FLL}=RSk(0=O|v!AxYarwHN5F<=4wid^b#(A_DtD`@%-H{u-F`z z!(bQ76VDTMrqC~aIKrP7x{}48?{aC+AB$1_vUT7!807mGpOBA$7P9>Ekl;nS(O)sm zHaT6?7w7O-y1KzN7tbv7{7Yqfzs-=Me_|&8GFdd$<~37uX4w?azg*@a>ld9W%~r_> zsW$hfivA?zD`Wt&DAG>VS3XTXGuXf3f=G|`IeKge^zi&TQgY*P@Cv8VhC=`5ouV0q zxlsm)GcfUipq{M|;coYw}I@s*5_>eEsvtkCPFOwD}(7 zo6qz7PQIwmR_%UKyZjR6#~)Akx%@5UQS&!aQ|4^iLYzkUcFK^7HOKSnK9EKgqUI=B zVuY_*;9JU^S|hC326JKDL|rt>Hsg5ZZ8Jt&MV66oQGPbzFVK9>^rfDEoh95%h3B>W zOgir4{lJ{I0*_F-1d)vvFIY&ql5YvIPFfDzbert+l+#k^Z=6GqQh$0;sO3{u%U-2u z*+m}wl&`wc%HJj}pSD_EL%vB%Ji~w1f0>zYukt6$QJ?cQ!@aJ2kxcTuuSxVv@~wtR z)t7uJlFA-j+^VW2hHY#t4T2*CR^)zLNTfNR?FKh!+(ikTQi2&mKozyRYPGA87$RTc|_i0w2pZ zTzfgpD)Fg$X9<;FhhL+;`Nj@1iQ5cppyJ$6rujxPpA=t-G2h5X-yqv@@sv`}d?%^e zV6-*$v?kqYl^2(TPWiWB)XXaH8*%y)(q>lsl#%*%=gTYAfV3U1-ITX2$TMofaPmjm zCghu-4b5#E3XK|Z9@So(f%u0>8zY%@S&mjy+BOpirb2@Eim`1%+SpM_{&3rdv~B%| z;?#74Jnfs59Zcf%`DE^eDB~V)CiG?(t)s2qq~swzDRYDC+mr^^DCKQ4ze`El`Q#6u zGu`vQPf6IdWIHWd!oc`P>Uyeq6+{z-5B?7+MGUu7?WUq1Q!?nL3z!i~XD}!H)8-!} z-^7>y{bchmD!)iZ`3V*&X`)X!d8;yNo|CBHN_e<}Ia+vVi<$TwQp0OS@SDV+0L z+WcPfonHfKB5iF_OVZA?70(N?pYmhUr{YE*l5cgT7>!N4E*b81{sO`c5H_E~r=~2~ z-z|TUU2F4g7Q)7ot+8Y$koP**?a$^&bfrwpRTi;S6@LFu9 z_yAyOjwF%+*PBoug?1#U<~!D753j}Y4zW3@Lm7?XIlODsPeY|K2NLv zUJ<{p=0U0dzT+lNKRRwJBW~|oZtq3h{$#m*9dY}>aw{me+_s6^TaKGJrKeckUWvH9 zWw|v0+v)bU< z+p7FjY0}mXxUZDA1FoGNa6=a1dv=6%up{g$@|}CoOY7OpHd!pfCoSPlDw^o^qyAGi z{}%a9T8aIqjSV4qe_C^PBK|W*KHhLK=zn;INa$IcKa#xHc{Ge)g0bA@6FV;ZQ|{P& zY7}~Kmzd@9nWZ{MR9$w{-cNvh+S**PfZx^DULhH)&WEU*Rp}n`;@sVGeoC~h%aG`r zG1%g~CmP#~lWo2>0k)HWic!?WTUD2}TCHi}RAb|&?14*~WHr`?Sgswww+fzSRXC5V zYvxd!-=q8pkq@)z2g$dnONcZaXwpo4w%Ce)QPI6j=GLQul@t(LqOeI)q1BBW|&TX0+GKOk=V!zcoVf zI6!Fy@x|aBK4U4ng1ar=31Zm8tkQb@h*L+XI&YaoRfa>EW*b~(F{*Rsq`A2g~$MmBqe}p{M9p?CBn$vQ7nB$jpW^&ga zOouuCS&Tz+?l8xnax7@!VU9ohYMXP1IsUv~+MGMg@t1sHbHQPbKk`VjiNhQ}ILz_S z77u&y;pZIY_&J9;e$HWzpL3YwPqG138y)8O)9!+u4s-mR!yJF6%A>;^X==CCI?VCU zdqXPd%*QWPGTH;H2^LLZuyShk77 z9NgEdrw*;B6mjzX_V+|G`DuUomHhqxIm`iV^)H0>-#NhndEF~QKJ?foQ`5h>4s(z_ zs|k0R?ySb&u8Q!i#=mtcI)-O8{tlPRIjiw^Nl2ZvoU491_fVu*VYKhU=+qqeHn8jU zH!YR4(XEY}8!F!PZOrU7dWV5!MjJ`e*m?tCg1QBY!xSl+(Mq;tJU5=|nKOhofD8)o z)ll#7zWj*9o5N*r%HJU0s%-bc zTrO{xGSiL{@0Y}TmnzVDiJir)*3!5Xc$TUL%xBFt0h$rE`G2F#wRwbXb9x0^Bzv4N z%E%#Flkec{Z)9lgZCaSgV!qD|K#~|Q1IB`QhL~HE%(2WCQP$B4n`?!wCJ*&KQ9sJp zh`4DB%1yw{)NGHa%PsYz5%pqA{R(-f+7heUdydT*=}O2loo<<^5T z??}^Ao%w{t7N%zKlc;f8UuQ9=3DYz6OuO2}nN;l~YS%Mon6deFSsnaiOse*=nd35s zdp}bgo!0J8IG#>Zn#qLac^xTlT8qK$Q{KO(a0`@lD7`FkVJ(nEaawV|8ok(?6?HQM zYlcPrYfdi~S&cmJwBkO9$S8sD#zcxeKaE$67mSDs|X(O&~INce}F;9Y8YJyhb^u>XF4omaAJNWcSV`mZuY-}^9 zTa%IjE$(%O2%+1HS^7>#j(wsck{5GRVpwHj%LfOI#F56sC5|Lacb3;4^9lA zqjB~+BxUC|K^Z&hwkl(&1uer;p4UD$ta_<~F{jz?>ez~2>JIji_=#0U)t!nxc}eHM zYL-Kn&?G|W8fKg&x?#6MQFM_9w=7vh8kmX#|z zIViLGH>G<|36Wg4oErIJp7a?K+rah0X^{q&!?a*<4~>fhy)|fu5$aeU9Nyjz`4N$? z*?D7RLn9fZiX-=jRwbj8eb1MuioI}rc-|QiwpH-V9Kp^aV{Do18roV+$40{{Eam!h z4z;tuS%sb`8$&WKl4bQhyD6=3W*DDC7`om$t~4Ckk~$$mRELI$6WcQ@pBoQDO`4M; zOe`Dw?c}%zTn|nOj02X_Wok?q*+RNU?6 zd9x#w&~fDea{}dY0;l|WanHJfx$%f=X6Kz!k*H}}D$b9&o>n|O(=1_^dC4j@B6P+1 z)hk@9%aX-0_660(r8x0Hk3es1oXOP6)XX?bFN}CN7jm}aS;8JxXAP%C@v5OtT^u)0 z23rzkt@AF8_&KAApU^I}<_xFn}Mbjjrrn^+fT zxfMAzPOP+CX&U0imzsvbigB4aRwKu{!{sI>ay=KyS(T`bM4pp> zU4kHPx9%nG#w1tI)Hj3jWxEQK=O$}(@(EvfC%Rkig8U5@zh%btz&eZVqNnxL^b9z; z+6~n9v|KhOq`0~pBT7lxWb4&OA?KSyxptbaq&^JXtUY3dZ#EgC$ofQ+n@zl8i0Kw9 zLQGv#wkBArejAiyi8r^4F7RoU-(t&Uj9WtvG~VM=g))_<;84jOAxB%kGn5~gY8SOm zaut-R+I?!qTJJX9FmqVKVZ5c4Ybf^8&D4EZTBOaLHbtZVZMYl{Y{KO@&PvDORh|p4 z^5c1(U^!ay?1&FTWpr26S``%hEaK~I7pGfYKKvIoiHq|i%dJy%YyYZ z%ea}Oei)94tT@cL*sMWrB-}8b^N4q&X^~!)r4EZdLj_{j*v0XOBQ1*B6!`{y?54~k z0SpY%yZtn5UH2%G4$* z%7e}|sBIW#wTmjURqK0(n}c3qgx1?dXnm5Q)=`n~+VH1u z+?Dd(qvN?xTK2Q@tq&&5a?H;JU5Ow%z$A)}gRcG&Un})^*RC+8B5IDKusB+Fo#-qv zD3?OYoe&wvy0gPOF)l=p(9cd%Xf`+=!dk^ojxaHJ?0cug9pifPR0^yG!q99;Oc*rP ziFQ$R(pauMH;j%Y4Xef{uHhTz!Hn(tS2b$!h(HzEtIir3M{1)Y@3QtC9We+UR}OM| zvae-=GvWf*)-z)Pu3$_Q+YqNog|Q+DBe^)zMx)$S_^eoi+yG`=^$KUCvy;VfBsV^q zvO-Vil|t3ZWF2DiI8K=u86#N0&kdSIN4sX_gyp%4PmUCE5?!zo_sx|5qTchSMt&ZM zcJaFQ_z0IIH&aay2>=7vP&xe?K#n3k|QrgT2B zM77dTd~?Ij)C}#TwHQ-ZdkG`oS~hLmjq(z63-(>wvkB`J`oz{hAJyfAj9Hc z8U;<4RSQ}!S3a03r1GjL7`h?~Nv`~VAxSXlSY!TQ8)4y>s~ ztZx|Q934hE{aloDOft$jHnzDMb6h+vE9*}4k}I`J-DzI3G(62q>cDYc9MOdN-}UT`zoNv`=}zlvsXWD(aj4)J6KET`lKET=}8m^)sO5~q2tQ%;LlJ7@IV z03^1%3qX<$cEWSRk66-(SOME1am~n|sZrxb1*!zTJ~|FqPLCYL1}tYp43Yth!V%ft zlFRSM#09Rc3P;ocFkC@N^?>Cpk%R$DPVkYt?&ky`YFQX;$ESh_iJKf83p&{`_JnG| zi9(Z!)yl+#lfpP)ndHt)C&wpFQ-ZFyA_*(vR>`c>qO2Wd@!6jyfB0hD- zUv9EYh~rKga?Uzyqqyn15CiX!oa;k5K|Xonrt`Myp`1H$Q}7*jk3Ds>Q=VeK^@(=q z(aq{dO`N@9sQ9Sq#!w&HInaisn{0`4?(pd*^6v1d(xz}0#>CHGtBuF_|M7=UT29@h zQa_q|?8IFh&&Y~q8pIA0uQLt9W1vP#9CGZWRoz~84X+X&9xtPZ9zEp>2q)>Laj_kq z;clo|T%Me~tDi@?X`L&wYMg6l%kW%Ha~}s!?gFtpWNV#!$kryX0ZvJH7ftr~i01if z0iM|Lj6!_6)*-fFctz5MchSV{2JMlyDM4Yp4t0tnLoVUQnuNT%L>553&@73N&lM8y z#dtXu%sGOJ#l}Za!D7?%5PG$=S7Z%0Ny{K{3>dEU!t4{6*m~7bvAuPXmk}kxqhkvM zDvGdQ82BC&2DI^6lmxi$jIZcQ5m(kfjA+Bv==iX}vUe-gfa)Rcz!1rG@1SS_v1{=O zaSyoQD-j5aAavLu64cZbv_->Ua2VX490s?ixZpMs`&sp!OAM)I^U#gC*dN}^Aqx#n zM#jV9g;8}b*0U30podCF*ltUfa@tf)n0kaqR@4GrD;yp1wLN&c!ww@|&YE%yB;`zX z7(tynP?vI(Yfb2>B?^Sk$_<3a#Wr?*bT$Q6S;cvZ6J5-f)ZZB_4%%e(*qh@Ex~@0k znu(ECagB5jkCYhXn)fEfk?rKjA*>;$L<~Z2S4U3`nqbML@wB+WwP||LCcDze)-&RX z*B!;p6iFD_CStehfm9-J%RP#lQ*Cgn)jXk*yoD%nCD%=Tr8&(B9q#1Jf{nC9m85cdpOcA-N<+WoH6)p*v9u zG>S*2yG|Q!`N9^)5gTf#FdWG7m0I<$Ll<{3fP6i^(t2rj=ZpV zb<83Nv#*X>;19`NNN{b}_KR(B$RxP18&-tHiOad_fjBT%FRYElBpVmfCa>%sLVJC5 z5xl})q|PQTQr}=)j50i`N^5S{VBG>ACk^Kh86_V^F*<2{S8AE~yBc{FH6xM$f%-tAd_ zX;X9~UzH1!vdsU98yI)fV(mEmRa5JP7t!m67t!kltB$pl-MqL}CAw}dvIgO5lIsR({WG{pG;$_P@{PBLSZN{IGuL0g9^FB zGztLhgxE1|o1!DPb%|`|{5m+Njw8g*v0|E3-Nq#{hPo-f+N0u`!-Z>o!vf2}l^q?Hxt&74AZsnD zTLO-W)_NPK92>it^N_@zCAoEQr`L9J4%Af(j}NyFJU!;_&m8Es4xCXZHv=cQIOD`P zT!)FQc2d$o*@`4L4JSv~R?}0g!PGTLgPr;_n}+H;6fKLV#hZqq5nmfC4~sYcZeJ2M zGW5LQ1UmE?sU2@iP=S*)qzolNNYa)JrTai=yDk zCiX3^U{X8-xPa5%n;LE_rbJC=DCNeDQniREy;_cC5CWvlAD@BcrpKiJU*!m~aU^n7$>>O zU<*fGrXxZH4Q`ZQ5Rc;IZY6R2jNH&JoIg9Jwk!5~S0^?E*Br9vO5TTBee5LmEJ?LoS4;N4*|&tga9zBg3L2_=QA5X$ZLND! zqjJ~%$!53%^Dx-G!Nl>ub~L#WzmCdX#DB=XC641ag5)B2caN$Y7K$LTiikl5zH}q6>zDG`=l} z=Ivf2(A4fk0?A3*T~=nOT@{qPv4FCk#Z3vN-3_W}#PD&qr#eGM`wz<9{v*&J$loQK z*yY95-<`;NUbOqLT;1M7u5(|A#q6N{NAB+D7qmThcfdY`2`s+G@j%d)aCh(^dAB=w z$fg)4yd~BqWn{Ad#SS4kW&gj&(bOUTgO8&{s}XUvdiU^nL04q0Ek^X%9uK9t!JeGF zo4O*pDJMwyz#1fItdxu|Xt=h-lXLa`LR@p`r44cF6L*qyKPrxLb@y%15iZnpmpGzu zB3x+uC2bgsJ0`cgJuklU5q6v89~Z_jlHNbeIDd*CVGH7y0ZCELY6H>?114W z@dQf}Ig|^6-F1(kFjhIf?vb=A+l|=KxivSAp+XsM%Mnb&&Wm!di8$X<3*$XU=!7ag zEoxV28kG(WH+k+}7|Y*!hAQJdh!{Crj0iW4Bje4T3#3Pd1=fdL+327QKXms;ogN~& zVDXG-NZC*=yx#@%Lv|h_2;E_9xW(h@h~|{DqQPND=D6h6?d)iaWkno%WkfA?x74b$ zLgTQPh_`7IBOaFjxjCi`N6{p0xhBVBR?+j67&8ocB`&=BK|7tDboIkZ4;$__3rU5X zSGikS!fuM)D!!-1H9$3zG%Gp4Ja2ZqpZeeP6kB+96q}jtLm0PN$C2h-6NyK_e`^;J z?+wax_XdlixyN=tx2ojC-JzY_HIiVo#*XGLk>r{?e3C5~i{cRaWnxQV+Y-7)u%`&Z zg|IZmg>>mA8EVytcAI9z@jUJh{r!i`|!F*j!CP_*z9 zn+rF|#q4w^O=O=0ncGyv$NkrtINZP9ro#wTdxqTLUr(~Rm{oVwBz&6%OS1xkz{AR0wTwyr=dY&!BiQDNeUc^|=Yi|?xgxnp$_F-qpAup-3-7q9t zTovkui%Dy39^yN+ZV%cZ+uafI3-@hz%9;T$UBu8G@WQ+c%s8-D$=$RsE(x{}#D!s~ ze=ky9sDGbL;i&Ek#;L_5rC08SfcnP1b0VH`{_TBCK|E%AkoN<}??osG59|wb*RY~s z0)#?wZjJCbKU16_u9-W#*9wEe+F?*wCyXxZHq=+GFhM{&Qqrf zt6>-q3(59d4Ha|$Qq;xyTnb3^I9Vc1t#H6Lp~tn2J+56ilG+Ej!3gV+$U-X54#FPENnF;7^XEa-mb;9(29Po3Jc$E0~v%I7SeF==Y=?&VV! z%$iX?iLxG(j+xZEU*GN*%v;*G`=W&ly3d(6t#r}!8QrIqm2t0L_k|0lb>~mnqN$~G zrUeCF_pu9SELhmRe9rlE=bYbt-t@U$d-mwoquViEm&{)pSN)SJnw&A--Q=0{9nL@R(GHFKhKAI)#opq$;-j%i?Y&1 zv*yg}Hk+>UW=xwsznd&epDiq(GHtF97R;D3eZ~S1c(K*eh2;z8%;SAnst;4sXI!vo zhKiP+KjZxQ3of+DMdfo!=akztvdUp{zRG!#*rFMZ*Ub3~mP}bNePNKBF{OObf*C<> z+Whm&=9JD@FlpAjMbz^`qO#H{#8ST0Wvr5DHg(EEt2@mtckIe9EVF7L6dt8>raC&jDc~?~#uCYzCPY`ac*eBy z`MlYiJpm0=8v;R6QpGbD&6`$^f9ci3y!m4a?;ArCtYT#^nl}eYj>>kyY}W<-r!JaP zTHbZeJiWh*e|i2J6L@O=PreyH%+F&yQSyaKzVyx9Sz$?oiIn`qHzOjP9x7RxGIQ?= zaVDr_b;_KV4NF$3g!fJceA0Ykz~8O1qs>r{cO2(`z^~t*;KvwS`AJae*9=Pv&jtNh zGt{!QI89a3hmr=uNx^b5ueVIKHRB4q&uFz_=w0G`oPJvIlgi)9Z@Pc}j8@kVd!k48 z(zCOw%HNvbv-_A-QTed$^B!6B;meC`;Ugm8J^1LvPr6%v_rhW03yx7u?2-I2y@!X%)ZB5YM%_}g`lk->mQ9uJ0eR?AsiL7%dk;^|ooTCvQgwFW zhMC~+sf*cRjMQQ74gGdodsKxLn2%wp#uR>qGi`!)Q!Gl3(w5Pl6NQ}$yjlA*F5 z)ykyHaFsnNt@kbB!fc@RUX}ikHsceL-%;6bD05zxE`mBeg|g>7EM;w{qNXbP!82zE zjjKUfKb1XeLNv)8t)gdqii$#^r7HTJZ_d6UHo zd+!4u)m7$==gtk63#2VV+M;%CNU6mFnF-J?Y9>%crI~@!iZ+u{OJ*WnI*S(v|h)EvUG%D^yf=7h81M-R|!D{XXZOx%Zx# zxdE&1&;9HVYjX2_o^#G~{y*oO=Q-yNU}r{JxM&`&wZUoW>l?(?zW8o(9*g^Y+sL=c zwmR$)ZF};0DLNMNWs89S*tOE^1lGIPr`_?d@oVeHH*4w1c64Yqmgc6#i0xl0ECl5c zA=SN$*r8#e$~i{t7nN2ne>gu=NsgcP%lM(YRAMk#JnPyJ;BciXy?DN{Oc=LO2ck3! zvIz7E%gQDFYFI(+`&CwR&P^8D&q0DO`z?}%eUjL^;Z}Plna?!3{TUrIiJdtR{|@y$ zn9Ou5S)8Q&W`9*RSL3WqW&+K=x*cKGN7rxzdHSlXP9(a}&*L_HR@ULiuo^~>hlMH~ z{^>Zi_=##KO2B5rsT8{7RX%I)2%|lOUY+-Q-0Q>+4#P{T-Kk8*O`b@rLSn&fTmo94 z;E3%c_M~OCc!f#qfWgPKP7*WHs#;n|E1t<54kbmBnG`WIDT7a{h}d_Ap%ooj-xsW& z=4BxKW0iFa%f;!!Pm4up>(RO~*fGfaL)3kiY^o?(incC5rgW4{yQ{2RYEV@(C!}z5 zeaIg5WU?=xOs4FPrmGhw^Y(oW$;4-3Hv0h!s|qgwnz@=l>>6vX>Mi8r8}}v`->(mI zEh6%H%StP0{Q8H`GNv*rzP@e$DQe7Xgv9t7w;vU!ioHaB!ZA_iQZn&*OfaPbHO=P> z?aTDkzZhE*u?mcJza!=Px1nZgCEe4`e@~QXsJWeYEM7r%j9M7AIsEbzVw5LTF~vZ* zUN>M*_xeHNN@K%d25ciy%PYAG~8rF24@ zRo_}!WyDIMrBIz(Zv|XXZBz$SNpzWPS z3yo)eeQ!F!pJLt~uNpk{J3~PgozGBF1v8XX!KmVjn(B2H#%Cz1!e^?gmWA9YL2_ri)xk9KzJYFOOX}PE=y^jKJSDM;Z3VdGxTgCZ^bZv&&_IFA=pXq z=M_lmX{7)X+(Gc4S!UE&W1`&Jo&rt!S&!~T&VhihliE|PZMpR`lc~9>R3?4P72R`h zNU34b$+;J&=B~YU-VO41FULR5GkUtNcQ09)ntN+|YVM6;2APe7YgnB#&AsI5d0v!- zD2h4ersmImNTQLEm}7S#o%UPi%~f;mB61|&!=Lu4`lv0+NR!1&Yk4^ z!U(Gc6TYu9oh14nn3KHunw(WDfvtlk9nf)S5c}o`E4N+E-IQk$v9CbgvPZo7gFavJ z*+=}(Am^aMI9D6`FdN>lA8@0WaCI#VwZQ>C-nS_^IPr-Qg&9?HUV&MyL*L}w?0uNh%A=!~#ONq<8fLX&7X>oOYEOzm z6hcQ9w;TlQL8rs-2>lH8YZozXF9>^zSpRUuG`Rb)pllKUy|ieSNXH)`A1@ELa#_E= zHxLWxne0+Ki2cH{GC9BN9VGT^r8;`rpbS(&ZLnfBc>c<&JGCH)D}+fY>jGW0g0uE!%>% zTrkX1ybQ+uL2uNpTqXE_P}?0X`g?sGr7eS6xi{h_>Svy^aJ&C$o)bt~Hco1^@X)wDi?`{7tRBbldUM7zs z%)O?Hm4nzmVuOW6J)xt7{*90<>It1C^k`_EU)=?0x|K-=*0eK-{U=@#&HAhJg~Yy6 zWvxseIjoYEHb(R@){>{FFqK0Ddu?l>3eBc)iV#G`R#W}>n_0w8m-F$rc8|YazMGu& z2|q8(y1^V4d>tWQa8|+=LJ41RX&}V@6@njDNfUdW*eQ%g8PyGljq3sSJq{0&`~ZH& z+Fp)b%(;vuypi<4+Ja$r5&Ok(Yn3;XF{j4_tFrK(P-Tom5gx;1-jE+ZJLA?OU=Ntw zvAzWJ34R;}x7#Z?COhQ1hfL;)OY!Q96<@ql#h{nr9S^Rf)MjWUYkm%)hb^nq4a_C$2=2u0l~*S$%dNytj+!tdr3=l@@5c5qGS9m5o_GI?0Q z<)0iD;KN^adM7Zz0&C7POVPjq1o($qj;f{Rxh_Eq#}`;t2A89Y@4kDvcSNH^Ev#>U zvsG&0qzX&a|K2NBF8}^}txhTN>`3J?rMTi>dLKh_j&ZdD)$UWsf)2Pv&T?V zrVih8=O46Z-MRC6<~HSi)t_41pK`0myQ|vNhTyBF7XIVT z;K%Cic@6f|I(u$|J*{qTcelOefe!m&lNUjg7eSL3K@%g$#I72{^0pil=`;5?+gH76|AqCc zJH|Tz9m*{!zH{UWStp*TX_c&zxhCjU%+e+-4qpbG80{;-PPhb(a+h3tnJ^}3S z!+hq}0@bku`M9y0J)`y@s3@!>_)5%5d3pu0EyP~NZbfdl&v=I5F@kEPNydhaz@THc zc>7$$T8XXY!CgQdSxpdUzWT(Fj2np=Deoj^rd;_cfJVw`Vn)g*o38$=6$E*5AE z6Al+a)3-l8I5Rt#&2E2Y5aIVcz5T@_wMVl1^Z8V}cP=YBn(S71BUpWYmRq|U4BPX& zQ&$Ra?wok-=N_mL31mZ+3ScFF$Qd%)wY|ThVO72_l^buLxWCK(jJ2&Wd2HHVs+>*} zEiR`SPydfCryXBK*4Gb5%h_EhyNa(7L%#^97!!ycM7QwHwl75UY9NN?KrS%*cq=A#2ww#+10oflr31UjuM=l(bwh#*sQ+o&*!_*OpFE~tb zYMZeOoNu$T>-}kb5uxWRtv1-|v~0Jp+IGh6dF70|QYq&y)mGaLHu7n1{*_mxu?n%$ zWt+9-Tc5m52g^xs>zOj|*j*&^0HJ`)WIIkQU>?QUyiYN zzSJIX6eq3J5e#v2Q=8Z?gS4=BvS_jG;`MFHUJYTM;&38^$s}#Q0F= z{r+HH@jRg4VVP5uH+a5O%7ly2nj3Gdw{t$U`TxYs>5Xm+id|WHFKX;rs3K_VF-Mk& zg#nr-nb1zUQ}MpWd_I#)yE%7e+D*8t! zQ^a<~teZ}{$)B@Fze{q*^SnxK1L*0ezR{0++qV$rM?5-c3TPq+h#Dy#CuXGRe*64W z9AKED6i*U8i7|j8a|0npBZru5e8>vpkMXDF)H&bvWncImgz2UAm0t#{i9Hm?HWB+1 z>P!AGxr^9SVeAmGO=0XbvH#L0j*H#efXX#v0JO8EX=_MZ=f}m7V-vAaFoN^WI9Rv) zh#hxv#PhT}9x95cCfUGl`_Vx#d>V)Rr5M=o&g=(6;E;h>)r-Ia2bN4}BC+!<;Y|!< zl<*#6MhPD!W|Z(*Vnzv99{^^QaDrHw67D3eObPELEl|SD<56N!rFrHhFhrGR)px;Q zl;#9tMrqC>HpqHw96z{9_VMidFy{_*G-y6quCU-X*=g+6@_Q7t=I6jcwQ zKvY~N_Y=b)v@oCn?IX6y*KF7ltN#|5uQyOPnMLSf+nT5P2%!ap{tu3-*%RgbZLxI1 zX6I?u3E9*(lF1nNb`mQZ_b&S$&=TX`8sh(nwN}8Sdn2*ehg)51Pe_uU`hVn1wk5m2 zF+13q9c)j!PrtT*citWQf?JzS?{>%jEc_<}+8=(|u5;^l=k0Gi&}Dz8Vq0vqK8372 zj3m}`i5KY7H3T<7d&*^#soJ<(E2-0vC?;x=%oNUB?W%$7%Gcani@VZYxxcWFLao(P+*P``tF0)*m4Wv(c<3_!~7EX8r$}VMEQ2A?ARojjSX3T^b&3 zo(Yo={AZ7FYx4Q=cD}1SxjnhPZ<^W#Vvb-*gyp4^%=x|I>K6|P7HdTXL0u3mPz(a_Vt&& zTn=fT!7Pb61Mq&j^ zdltqvBH=WT5(=kzhLDlw=$`^J(o7ID(o7R8q)91SiA34$Q?PYpy24uJ_V~K)Az~Y` zE;z9{dSPIXtb5U08?a#*mPV9eNK+Ux?L9e!pls(S$u!n#_9x`(pLwEtK2gk0E3xww zogx@EE!4)+KbPn;X}_7|2!*R`4I!h-HWBmfZW#Xnp@4ym=k36B&XRP66-=l47l6X) zOeSQcGly6>oeo09=}-jIxQLixnnQ86Foyj&$&=%czq z!FRzi0xa79f}h&y0^j(gpTw%W+dH&pG&A{851ST=IIgjed>I%$XS( zZPDE(Tny+X_%JJ^lHSOb^xFvfpwREb^g*GWis^$QwkwSAB+kvZs{x&u>4QSd^g$tJ z`kN3dU>lSb0oY+BP+ifcmSBed>W5m9U zu++koc?(ZeY{yfOXkk&piiq&ObM$c`Z`j9$NRf{V!6F|Qf>Ay$q#HgiR6DCLL9WKY zUTCvANhUUj*d<)L$|8^h?jk}sg@BumQk)5HB!~^Q0?5hj0KqQHs*9@#sd=3whT*y; zpYpV)GH@h;%AAU7F^my zlao;vQnIubqXzlmT*h`Xl|NE2Z;%svhVOhc!oQC2aTQEVraYG<(sy}u&sdAl5ke2r z=xco@#ydR3VD_@N0EG#cpPT7Ke#V{D%(s+dlq5*>EOc|_!qnwt1H^qK{s&AYwAU0v zyiTxdI7Czy5j>pMUQ?vceygGfL|jDZ8MxpKstP3A24ZlS?`l`pR$b2a#$>=#Q#ulk z#_fB17uh3fVqUOfA5?rmu2E(d;Qg~G1< z1I08~Ige4Q350$z!uqJ^07Ps)v0ovyV3slBAa4GDHZ(m09jCDt|4TEdiN zL+K|XEDXB66%e_q-v+KfhN(p$?VTV-N7V&4Il@`gBqy#)Uu9C$0Sf5LFys7=$! zd5q|>#oawpx0)B6ytOzu{b7IX4ih7!T;*30=e%M`$7;+`ACqnjMCyleQB2Hp~n1 zUIh^BA^2sQl6fH48(Rq0co$D_$Isq|AC(Pls%es?vR1LEmPup+k$o5$q$R0+LI&k_ z-7toC5Plp*CigDQ?MHBg(0}L%7%YaXE@Z&qVeww-&!a76Jjq1FOH(#gJ0OVUlw!DWSra^E@Y5?i zCuMi`PEP)*T_skt_TB2&g)CL8(f(lFD*UtG(qXS^voEY$7@IJziA7?GZJyd7mR(|} zXHnyv#yPc*W&1LHsT4B!Y**fWzQFnha%YrE{))V6TU`Ur6%v1!Gnjdb*;I;`<)p|E z6Z06W%gJn4{LeW@x@))FcX!#NYgF6ra_sB?Ol=$Od6Lgn@Fr?sZdbM0**3rn-M?(k zX4FK)US>J=lxF+GHCZ0kSz@1qZ1G!oHqXqak}oFH`%_mYkM-GiN%yp?rQO&UHQRaB zg0?xk`%qiQBo5S;{oyC?v&VJV7j?w0yfl;9olVQ(1AU!ioMbAe@CUzaxx~VfZqCN- z-D&Ywe8NKrKV$q+DfK}*%xT z`RsSDaHlnU_32Y2i=OGY)6%1=)+ZyNeczMrv=`l_nH(cx3CX#sS3+#xl~Mvud}$`> znSm2P+u+Z5Z9bhzwe!|;1cMO_r)^D=xxVp*yX{gB-C`OZ2b>$Yw(qwyoyG?dUv+8iKI+^_25~&B) zXP#GQbBtnN!M|ig*Ukz?cU_n zepo4GX?ip72}1RdoSYfJ(@q>L@i=W13xc)wN0(I8Ft21URZBgH5OPi zu}{K$bXigf%VFN88B9!UVK|+`e4amZ+aGfCvJ!DzCTMp!FXp{D#Q6jO<;E>0|HIgz zL{oqnN@8WQT(FP7a5(?JBq%Ogb0&BNOTlJc4Z%KRS+{KVwBBlf%LrZyL&iQ;g~WCd zdxv$);Q-$$V%QldfQ+$b62PC(3_qFcaeLe=>M5h>eU`HId)4XbJe;>zblIa=cu@Y7 zP_o)%2_Be?DE45P;MokYHciudVyDUX60Y6ymOaEwR}?ls(=v~kdG!FXaZ?Z<_DOWQ z#2SeGGgjT&;hCUmz(=guoj{`G)fa&)Hi)${N|=d!)Z4QnR^(zpaHtC*$Yb8uL2Mlp z_%+IJ(0*%!-Bz<-&K{i(=e~^ch_{zFb;DzKuHB8kb{|zP)zPlZtF`OJC`-c)gplb5atScQ z4TKdo|2DL1{{lfm<^_Vp%3L5wQp5#S3mD~cKjFYNXc3Qae|5XsvLIM-Ex^mwtb&#>2DPGRU6SW0a$w@f5t(fL z5p}CdStVkcxH%?X>KtwNklr9OAZ97H7a3ElI5%C;pmtu!H~SBTFEpQpIOR$qavt$G zJs~(ApCwd{Nt5dowQh?!<3BuJH6(Jh&HxAYN$SNMOO{)ggIC`|icdO+H9MF4LH4L1 z-i{tqK1u{OS{Y7}G0E&O=|#*ICb;ThE!miujbuAe*?{mUDNOYB2?3W=zJF&LJfpI zRqy~J)J*8nQC8+@RdVBi^$urb?*|sq;(;YzqKZtQ7R%TXu7l#quNc8KzM#7w#ZUp2j>oFk2rKlkDN=_1nG?63I8@*#Zxf*UX`7@+{EccN%w9&*i{sIpaUnsAed#^pd4kkK}6G z%Hcvb#vQLp(c_0P+%RXnAL_IUB1T__c)DT`L+!>jIPHCzmhAdm-|n8Al1N4p zvTeuVLvk?1|9JzC%qi~yX%o&W)M}HfWY6N&d46+u%F`4%6I8wzoH+f%y|zhhfJb}< z@xQ?c@53yiLxlgzpA5))ir5<7NTv1@nVPNk2bfvzQ|Gbt5r07PZ=DT(ntHo=&(Ma2 zcbX`i;&7>~oG=lqdLJ;ldv*KMOoG_|0fwmIqtBd)Qixl*WUgSiMdbM=+^d$R_NU_8 zv1i-j{$)zG$DqF37xYdXF9*EL(K0*?00SSj!!FTrVQX`wwVf7K+8p5f$@eA4IFQ@s zAIOpEB$+-p+;VG{#jYBwPV*?xBOd_%RoVvnLT)9t!^hZS_YuR|xeaQ6Rzzgz#2lbF z-3^9L6ARdjlP^aMQUFB$HtW z`DQ>p%%xnCdT+y>D>L7c-*(17xTrQ0 zyO2XR*=MJ~{^AJBZCK)tmmP5#FZ_#JhEv57ixwG{)iykP{s^u+M>uM!$P>3={2|I1 zcZ>4zE3$6wW*J=VPL3CWGrnPzO0(i%NvPbcQ3O(l6CCbb!JqQ>0B&oa=_b>SZoFGu z=&{@+i=_?`GtK~x1wPniPww!xpP0La^N_n|VUry1!G)6DnMb?Vs?nZwKl;1z;Q(3|mvS#UX7? znaDX`eJ9n#d8#9$cyL5RCMtiWj5?i*(@i{M=_lC5A0bJvxq(C6n0>^ z<=aZ^H&~c3zSbKN_ML^>(+I62)IZW%i=tPy7T=Ic=yG~IdjN8sB-cYhF84uU!_7tk zwq-Yg?UN&|$JACn+lw5pd6OPnz3uXB+3s#k*(=?qjo9{-NtuZ>d=R0hW0+77%gMYg zkCM%Q%){Hr1Y0a^EWtPr5c?7q zW1dk3vE#(P7{*>F_SsQz8e+MK7H7GIJ`HWAKBcq=R`a?AV1`}YDo^{Mgj-JcJrq?fp*he7-D$aGNT=*fdV?p1XYe}W%O66mZMb3ES zSkYF0*v@=u92_rfx5e)4=uS>o`w}dTEgwcKU$?Dx4n%55^lTVpTY~DLcj+SY*;!>5g^bjpH4+b1H~+HOu7U?UQsl z3#GtFlD!)_1k{s|TkR&*LO{*{EJudXL(!NxRvm^BpS=+H3&r?Z;seC*D~M-3hfg(wa{j>mvHZ!ybUDYbWF1#Fy0zO= z>^^cVNTllvBcO|jh^J^d=x^S z{yi6R<82Ufqsw(cuD!4_;7V=5?VzBe%V-nW+Nq?%A;(j^Imc~0tPVtFPiR1sI2a8k zvh$?ONQ#l53 z?0Wa}gSD!aQSuFoA^9hHScSmeb#_d?QnqH*R=p*94`UyW8{g+<-LZq-&J^d;y={mA z?+)qRM#g%C*k%j`yWzaHSz=}!vfWk5=q;}HL|vmMHurG18}~d+7-eOS!D0WV)ID|Y zg)HctZhgTP`FhCr1uV3d`76ZELA64>s|i*U-U?AN+74bA(soQ`^6K6`3L&+_)vYp& zk|{zeK}r)>@g)Z(0ROZ})d3Q(CB4~;6n3ZrMMhp_#T44%OS+vLLQ7B*$-!jV_~P!& zTkrr+;dF4;GGyhLWj$FRXink0sD*G*X8eY9ZUV>43oQANLJ4Nw6ICqrSVMD`L)2f` zR?eHQi7g`bE9?>YTLhhips5D84K@(_G}={QD`6Y4ALBr+-aEr#e8&i$uu&X&Wg^JY zu;wm+e+`>$?_`wN9Ab?jXa%AF91+mSz9Sh6t6E3N^=)+gmmhb>t1@TKEhm{_>j_SXS= z5WTi9nM|(YfE#n9i%Na-hqpADz|YXq1p7lhZgSS<#;lun)kcr#2bhkqJjt&;L!3FZ z#W+pbC~>$M=D3NqF1$N4xDaxH_c?akpM9Wr6~DGC^HUZv?!3fyh-An2nM=1{+c_v~UeMCjUo?2n!D6tBWy%=7!wi0{NUr@?0Kn#Yf!40OZ#BisL>Y}nE z#2&&&fMkP-E)hq`^A=c)yWWIPaB?TWX@$6`nVskL@GOVs|E~6|sto;IH!A z_wf23;h*(}y}W{MUGO%Fex^tJBB8ztPFeUCrz}OIPZl29@e#Ui-G)~i>)MwuBgMOC zIe3+_@_a%&(EeNaD%``Yy|ah~0);PH_Fn)h_+)|K@W~n$^2x$q@V$~7l9hXwdJG8P z+8K>0dhS{D)Y5)wfD3MHDx`ANl5f7%2^TJWYp*wa>eqnqS#WwoEP;nPQHI6-T1Adn z^v*IJvC2ILWIA1u&vd#XR?6wBgtHU-|G7FlkvHt@M5M^siC~el6Tv8FC(;dPCyAW5 z;=aKvlNryEXE8Wo^Ui$BXyTWFe?c6gFjSU&N>d$pFp_m1b71J)O6bp_^%b5oqSw|@ zqI-RBC1S4=`xX{)-e^p$`YXU-OBKW>6T=aJa+H-@qR!p7fL45lZvoxDIyp4M-9qVm zO4WlQynXd^b;=T7so;*Aj#s+&lMlE}b9-Q?)zV{+=}6yqYkK|-_^%o7aj=ZAyiL!R z6|qe3a|CO4K6jOSX-m5CzFS-7-`bqpz8~uC)Aq>Y_R21MWXH33qGhmq9ZXX0dp1qw zIQZV5GuD2C}&Dj(e zUx>p|zh#9cx`^oUZO##Q?8lz5FLK*(S91HiRJLV8R2u^=xm#6E@Y8laz@JayhuSj{ zRc08oI-K!}eT8g8j-*mB5+-+Qf^BkAyO(6Ln-@0YnN!+&CNeuRslmR5nbe8CTT}6+ zsrZsq-hNZZEibwErE0UaDe5Mc!#UYTBGB55Z zl~j+QYQRhGYr@*(eB5q_aXU+7n9@f0IlQjTu}3|Zwnw-P`Q1ubmVo7CA*_Apz|?8> z1vRqNP)CGZ=~a@$ZgcW41dAb=N@eq#2j`&_>^C>ZJ2UxY#(lK0zyFnIB|@n%{*d4j zn>g9X@(3%gD^Eb_8nJCp{Dn;SLjIRoa%(c1bf01rpGP>Q{fQ6EFp+T^Bcq0j#nlA0 ze32z%P*b0%;`4Ig?2f~gz+J1>4I+`~_H~{^MiBW3BDQ3MBZkJcXT`I2Rcs0`VmVC zE66MM?1?{{ai4mx1SF{39r&e|x(qU$e=3tZevROdk#){h_~nfQvVN%I*9D=3*;7=)5)pq$9KtUmk3cSgDvt|+RfA(O z=muvnSOv+j1rkN8-4l10p*A+oe7Y~Qzi~DGT*}tzwQd=1`9n#F1$%$|)>KMZyk;Ra z(&X$}nn4$>-QiiE6OA=FyH!gcaPTslUDaUcYf>1C?R#s~Du~D3mUHud`31L|`~ax; z(Z5EJqDb;;S;d02)rk{}i~9)cx9?s9Ptb;I=Gpgj{Sm&Ju2~2l5+j~;UiC}(Kc()U zdV{^HYwE4;m6`mq4uesWA8>Aw-%LYx8NA&guC46tavo+q$?qaj`u?Ea?rgYr9=g(M zd^KIW(4F4lIqXW~m4QL}j+1&Uvwc~Spxq?|otEian(14T*=}FlmO1>9vJpO>-@c^H z$k57eujrg){%{t)Y4cn#b|bs76@Zd)pUZ{feWU{&*+44!I&U>Of{ z;=(2LLd%l|U+JLPA&x>&38hKp@cZ%%P+~T6Qky?439=rfB02Lc&-UFaep_lb@b`9{ zcxN`hJ9{tOz8;Jx*TggM0kJP>OZ{Ndl}Y!K!1twr?;t)d)zjYcbbHJC_Llui2bQKY zI49mLN{IJ-!t^A(n5Uzqz>)cETRxM|)V8ED&#;#aXJHTj34R1RoZ6OPZAck#J5LzU z(ePW9uJy7evxDqu+1%2yFdo>rWbdlv7y&&Q+*R5}l>PtUUN;y?zg62~6rjv4R1y(7#edylHZAWdd{x(}JO zKc*TK0*!IUq}X8@^{jAw)r{{7kF#=&W50B_II#@JYZLJL$7>%0Rn2a%=d?m?a}G6F zXu735&`Iz0=$;x)Xa}J|Y+ZS8N)bCs42C>7N0&2rVih}q;mP(pQyKWsdHW_L%qIcI zKyW=)+*Geu5c~w}d(?>m`T7Zc6SAqdF$f(Zq^>HEZ4zEVaEcfd^Je9rOK9|073AsV zJT;n32$oe+^l;Xd;Pgl?cG4kgI_VHIopfmEU^>pw5vY|(1zw&YwwhSrod{wZi3J~& zAh?rY@U}RD2MGqAqab#MSm2g-VwZglSl||QN?q*6!{V4h&cMB*#99rECAp4R@F53A zY5F2C>0@Mk4vsrnH_L9LG*#0oN?@9VHgL zsg&Ruf`$MM`->y&Ar^2cW7w_4VAfD@DI<7*U@#Tl^kDes5HkI9xI=IF=P=WTe-0tj zKZjTu{~VGc{BuYi%0GvBD&?O;c@3upLdThX-)TY49bN?FzYD@vdKn>J+~GZ2!U8d! zeJGsi>_fg;5|-2ba2~r8Y9R=|Z z<_MCY$&zQDN^A?U!0RN`()JMZZw;r7;vqtOuq2>0ogo&ua-GqQ{ywn4mFvVN6Z?%W zCuZn_KS1cfLjc515(`}7POS2Wz)D==PFk9@5|_A>wt=+3CGOOx%xm(=w}X7;E_Nrw zz)>)iyV#wh#jziOA#iaov9rVi7rPTPJeLTW&P2paZzhhwrZ*F@a^6g&4dro6p6b7Y zh{n{nkeD%-ZXp(MEn-;HwTW1iYZK{1xi&HHrfU8dJ_o+9yuqLCKk@1@*&sO9AxSz zQ#gmkOlQa>S@f2x3_1A(KqHGC#Lg>=RJ%&PgTuVLuOPZ`-X{q zvQjqZwSJihs2sfv6L=1UsU9Qd-^R{HRP_r${&OINY6wL=2f|D(B2)OKI>Ors2d>B` zc7RyK3PN*FLp7qptBfL z7}E2MOorzf6EOXinLv>@8pE32Xk;w%Mq`YoHyW|u2X8dVZIOdD(K9U2Qm{^ReZKp0>|(uE>?Pf}B!367m(l+`*Dw~_L1F;~j_I8uW~Ar-6R?Q%){$SrqzZ`CL z!0aR0l6J>qf4;%q^+3%TDJwZw=Pc+=fVC&O^Y#9&73>k7$fx`MHJ`VyYOrsqd3wjc zuCvFyYTr|nbg$ZPU;i?;?{S-7_iK1gTUL`ya^0&)GUOT0j2$7$jJef*&PKlm(8yVW zn31ziVu76TSYRVDSlBeHV*#dofRLBjEHj&8E@NU4YBQIfeXHbB@~^BoW=?D&vB29C z#5#!;-k#t%{0NaoZ;M_OKF&zt9eVN|AzygBuKZU(5f8I4!8PRJ(-!I=QjVTkYXuWp z#=VV9crk*t>EI5q!Vdds68PqYXV%ZrzTw}1`TmG(&kG2hi$5a68~%(8f6o4l3~%@| zN+#Dr8G6MEJg0TNWCgb$tNz7A&e@-ljdsBBXC!9&Gg6o#{Tazro%)sMiN^YpWfGZokf{eu z-T^8jJ4y_DsV%s2S{f-CEB^yvxItb<2;~9wt$w^RCFpWK{?_jCg?5qf2i{F&rqpgg z?BfItv8(=*SZT54JeNc9Y%=*nF$L@-#GJTe{Z-%&g3OA(t(w&_q$fFM4i{WhhCZkvDZdfFik>#mG&-$L)e%ujt~nhco^kr9i{8-DKO521;&$jzFk%; z-_V!7GhV}Snnh{e+()*uUa=$^Ua?a251*q~EUU!yie&_y6#3^B*1h_UekQbwV4&%x zE)VFWXG!!|BaCD;y0JI&=x+W*DNpz(-(CTm{h7ZL-;Lk1*Lec3>U`*)#dqHm?`Xes zY5Se=<%^b1sZZ1;>fSkJ)m?Wly=TR3cPx(Iy!iH;`NzE5I@(t*eqU$D;^p_W-?e;N zd`15DW$kyw<(-~4?6(oW=iYmK*8(^wyz$q03eE|rQtbr6Pwn}DZ}IE6d+}|H@E(un z>TyrUZFelK0L_DQ#+y8g7Jn?inDlo4wH(jmgOO{W4t|H8)?pA8!h3_qrv~2LDfoMU zTYIMr3;9;?uf?}@O zz5|{v6g=Rbg1>%0-sUk~Lg=etx`Yrb@GrP!(D_>vAYO8Hh$|b`V_z3!*_nnw|0n`Z|#Vs z+c-?$xLM11SBIoh@9GeLBk$@keAK%-q#N(*5GsCGhiLd+9U{f=>JaUG3-Va%T^$mO z-qj%(^{x)-#=AO%Hcr8O`){t*165WOaDuku;^)*)8(uns}< zVI5-TYd6G7IuhvM1at8}Q0Sa>nVEz)5gsqeiu~92ug@tHM+zEp>5uodNXBGeh(FZ65U!d?#$}^U-%XX7 z8UJ7R{;(;RRi}qV5hV_9aG&q1RsWMHJ%@4q7z}*}{Kr%DU+z;asZ~k)&Mv;rGP2`` zl2x9dSaY0SXJYz>j%+I9W|M1HKATCVGRfFOv5Ql+-v2VSsf=A!lS7 zEm(%n?1|s$d1K&Nphm`zcA}i@l)FglWxJI#!mAEE4DMU$zLcu<&Gs$lju&dTFAYN< zc%c^l1GSPQn*;pG_|xUJ!QSH_+;4%MJa3J+ZhPU1c_@aAy7usWdu#KzHsg4fB-mM}=@I!E1((dE`Sl+ki{aE1Nr zzHBP*hfrr&3?X5)=g&35D`6#v)+YfdUm@ig#}JUKUMj-=V8fTE+E=Lt1CN`zu%4fW zrxWJ(!lA)_QyY9P?YV7yw#dB_?sO8jZhHJ9*`94o)xJi_9#YQ~l}S!nauqV^bp%8K zR}P7_!Wb$S<z&%3E5S=;Tgs>Um~n#Z=i>TFMO(89~uFWV!Y^k@xERzO_XA`pT6n-5Z*5cAKBMIsb$0?&a~Bs%85zNqN)}7XtPwr6lAcM5jrt}B~ z_B>y_d#>aRs6ewZv#6?!2x#BeJURIdd*qXEb;s{_SadKdUltLELmsYsDQtZS*)O6w?W;$`4?@KGxPWD~_h4eSLc8}>7n`RR= zpI0DezSzJbJj((bYo)xqX}CdF-HOt|i+b9(La;ipZJ}+cyGKs!WGBsFWE$pQK_y+=JpJ;KH8JX#xt3|*G_obi7d0dB<{!Yxp#embTwk=SIx0E^Tb?Q$y7k_ zGVyMSkG*e<)JoPf~=XKFLE_>Qh$Jh@Rn!uT>{Hl(`cNX(0>A z93L)Qgc72?k?8L4UXPP?S!Hbf_-5ShC4GpJ9AMaRK^`X*uqPy2#WlbJ_JmCKGGhM{ zqmNix-PBF==+NmhU*=9bhov=)aDRoBZ`u8!TGfCE4-keqw12BO(aF~WJ&2a!^$JE> z_HKE;4`IGZ!CN$EGm=*-EV|};)1WM29IsuHr-wXnQfyjkFo}zrx<$b$JXOpPqyG>g zj+Kv6%zjuQJGI=*N8NbGzq{urjn){x+N zyhg#CPndz+ebvR__*x?t_mW3hyikYI3S&H;+@5pO=`(wtJ>oWg&W-mc)rIQp0oCt9 z3<1jtV$+EQj>4GId}80MgzaI*jc44$vC(>fu6Q>nzrsa0N<9*>2t6{4GrRYE8_{({ zab0Z|%Wr=i-AVK>a8^80X=h4nDu}O*Qz@5eu}SO{gNHkMWdk6iqt_5KI(mcf1v@$; z+_(hQ8?b~Twv$-k9FW)ngO54vXN<>VRwi(cev*7fgRNqFQwYalLKX4U4v7s)EBTsH7#Q8cdmGgQqv7S|kD{%Q7OJc~w zcn%xq@?-%ctD?dlC_>iOBNRkBk2^Npdt@2nt>xqKO!?l^a~+~Ede0VOf!@PzeXizK z!|w!eg%Q z&Q(2q52}9RtXJDaU5qU3o7Y=IbJo;=l%XGP%!Wbg9xHs^&RZV}&mx|32>ZgbY- z7p@zU-5%%9@rPYM+rGIj0lOatzj?oXX+wSCk9uEA+I2n3adTKHK1S>@V1YONDw}{| zZQ7R0D!+PGLMy>1XdilE+u>Di&gDjiGVORblXaT9oGXh##~#sjqOgA4n<|#zB(d-e zRh0(x*Mlh!yCI`KQW_Q9wKIR%gTAcjBYuZ z7`mm`5+wVC0^QPEK$Bz|S`k}A_9zQIGHnYd!xhs(LcRqZGjftp&;W+u#2Wwx%<353 z9AaVPqgFy|V^%8AQdSci^i7^w=$nW=&INFbYQb#L(yi+7VrUGLzi9Yt8)orn8{o8L#K>$fx*ZqJBfu?-Wv#o zSKd1a87uFj#9p8kqMvNV0$^NFXY$$XZht|&ka)Obb`UZ;<}uY>^!5!^67wMzwuD{= zjk4(^(=Iakja+JqP`LG-A!N3`=^p}Uw7vzz{MN@543jdZu#8+$)^MzbZDhioIC#=4 z&~A?q{j_DZX8aY^Sz^XWSp8vO@WL+KH^6jf5cG{d3C$<854Lb@>zprQ-@y+oL!I>j zwSODA0+q;+2Zt+uP&Q>#nVv7H?mE$FlsQ#TBp-EBuGx42{3}>yEpYx3y;(S4BmB z`KtEiiL*RR$sW};*eF%izPf3XudPqL zAH?{a>Gs&R#N>MW&bD|uJvBb%>ak$8JL+!l!81Pg-F5bYHv8~ucVO(4_>_18|G!~w zIu)OSxaX#FsjU64cAGr{mxk5ZBbxZLs%esaah-ifo&5)O_R>0jtDlSNZnQ6W(q7qQ zkF2xDw@pseADN4*LT_qXZgYw_6eR(i-(y=`^V z#dGIQN++h+Rc-I6wASSMQ4ANfT|9T*`)`<(K$-w?c-oYj67L4()nQGzzihI7PaPw+ zSJvT4_-Xd?I{VT(T%2}|eQ#Z28eWZruys?W)lW{?AFaD~j{Vjq`Mm1-Z71Zmr|M~msYrHYql)I?Z&nj>@iQ;3+k{^YJ2J?``vX&B-L%-(Uy(J zCr_Sg_diev`lP9AyX{jIO$qy*U1Q^KLazLu1D$p4ST((Bzr6`BvD>#bwZnC%2hpbH zET2@Lu)lPF)7DS65ndag zJN4?gY;N7iD5c=1QMP&Ylj`c=&S5Ia0o!d0^>i64sw`Ffa z&D#sxQubHvrfPds)1~jYcG5eRrzano|GBl3>Zhh|S_~C*+SSwFF>P}FlxxSKcBfCi zdR`(icj{B#{l-EajL$srHn;W$9>M0Np3$^M z)zzb6H(kqI-0;3>i8RECao6(uun#OV{uG7^e3Tt6;=lDls$#|6Q|`&HSaH|g9T;;U zUST})#-Cgc;}5nfFP>CCH_P(9uWkt{4J~L&8dY#DzR@Vwqftz%??)p!SzZzmE_GcUIwpsci<;!58m|#H*^TUOP3;&__SV~b?{A7f7*9`1OhtEoThnfoeEf5} zZ^}-opMvtX?|qK#p&CO6ink3x(4=4Po{u0)a8*hhVbDjkfn_enq;K8-s{LK7&VKg( zxoW13NCWc$^vN~tP@#uwZN7A|Ukqo(@A{Auy2b8n1Ki;MScMHL3@|H413BDVU% zstYQ{aRkS|LknXSm*Mwy7gj!OU3cN=>n<2Bf0K3^v|6FLpR^v1U3cL)QY#8{+GxHd zNSDw)JpuaUAl(SR5cG)=blP@CrN0&QS;6o|`X@oJDM8nHcX41kM(BRtHSIFc5(bUs z#DA?f$13LI_jMOmv0Qp=uVgfR2k5Or_sY$XYjksIxvCL{{}Q0{Th+-0!*#r~ftN~G z%e(<}eh2Ha27mM4Hqc&2w?P$C=CyWD<#iYCjY);-_<8Wm@9QosEjJICa}o5dx5O%X zgF@n0HrRlb2bGRlYN0a5wm*#KM}it13y&zra|5xU>z zwfsEjD^>qGED!z4h2`mARNi?MSV}IPHjf3D1m!mJ&9lMhgkES{6WO-3Y&;xP&ix-Xww7*7+;Jgqxw&};bhULtFZ6$rUCXu?bS0aLpNd>5ov?aj zMMdR3y6*fw!+1#JlP>%Y_H#`ur%N(ilrBknlrBj+|Aq8|KzkxRN|z)(N|z*^K0~VB z!($N3oOJs8l+wL4osK`P;4M`@3{PjDng}{yoS7a$rx(x+p@-{Nr%#8VIT7LM5L6RE zuf8i*aT?xVf&SR3bvMdClr}t z={8zUe`ENa2tQTAhx?!oOS8CA<2A!ptt`LRA$QEg9;Mfj9;MfjUP`aidFCa5jZ&t?a`VboHGhTc zQs*m5-(tG`2>-IgT`2Da`-2YO*%_-?5T?ugSObjV4}iW#=z+EahNd8lxtNEl@eq9DpIwNI>(iurF zr!$fkr8ANqr8AOVPG=;I7a-O|lr1k!ET>yB{0=j`F-{!>J*4{>bUsA*wQ$)NbRWjQ z3v^?y3Dpg6ubLs@19dYID;i`<*A1`7!k=a5BVH;Q)qZ#xR;lpBC?hY%>Xi8+Aj5q2 zkbn#imd=Nkk!E?Jax&)hayp`xfj4`pIkTF38V}iPD|?1rccGM}?qjsLRdYu17;zM| zP(2&2=Pi6!mxy1- z!OK|Gd=@IZ1V*NbIuG=ucw31$G@bXfygx`c@>p&iq-EeOCQ61t8#4L;FEdg7C){tf z3{iV6EQdJ=-xHM4h@U3dp*CoYD^Y7}#$Rr2U246y@6z(?HPXth*GMb3UL!4Py+(S} zdX04c3yl+jdL%t+y+(S}dX4m`^%&_<>oL-!)?=hct;a}@T91()wH_lqYCR_DZ_wjV zL4T7HWE&-YHR$Emd!+9Jy#~DISfIn7K^xsD^g{eAw0_I*kE|;lo^g`C4fKN&KG4r( z=Be~u#k_{b zomtF}<~fCQb|B5r9&VuDQkG4B9IH4YJcV>-1moy~(YEy?l1A00Amhv@h)cRHN96)+2=uzpf2ECk~ z#PA!32)`5bDETWt6)k@nbfq7bmVX84QSv_mdX)TIK_3X0Zz4E8toU?kx~~6HYr7i6 z$FiC689nv{`n)lA9E{-6Y2-HPJv(0y)AipAS}rWVq@ZOu3wpUWsCnjpR*we(Ii(c* z@r$n>EtGTuJjS@f$Iqh5x*zmbiKEb#MOK}cs54ELCmk!x=~SfC88eDL3-nTLr3O(m z{6f&rhW}5lRdpWA>4mzk%k6J5?Wp}N(#xG&irlwF*G<&^ z7Q;vFZ;>9gzeRef{ViQ4QF~Mj8>Od`-h(=MMCz?{yBhsetl}dwZx-kUU7g`qd@fe; zc!}`3PTbFHJ-WF6)qqy2&DS74#@zsVtHd2>Q{EU*$bXqQbo%Ai_EI)w!s@sW4M9H* zdPsi_=M)!R2nm$9y*O3UyarQD!x{_9&{U;06M?TvpDHrpeg;%U+e4g&w&=Dd+Zt_-J>Pa z)p4HzEmZf0URnM1Sj8fdIWXpU`|6at6LckafiCli&hr+~1AAXm^E&N4pp|M@l!tL2 z0lihyE*^7q{4;jx^!;+v;TM6HmOanVI%7U(LLHuO9F>!gj~$hgPs`7TkN91#U-J>9 za{CI*A0I^OjR+rgCc^Mhd%~p8dT@w#gY={1kFvvI{N-$ybooTtJ~8|uq+e=HqwBBY z`SSIr(xpNaOW7OFQ!$+NskY4U=gtVx=DbmaBO=;QE zdt((ph_MY9`fnn*ZkYJjrQ3)u-`Sumy}h`P>NK{2=k|zpK6+oQ;z^+wWROv)&__Wp z+ebl*n)^8=62oJ@QTFQ9`-Y3OwK zfp$q)HxAYF(ZOi?nf-chF1e(T%#82zpdqZ2~>2uJ@Fo>vB0-NWZwQ&PLFx z4`{jlaJtMApheYHXBoPdX>UZ_M?s6Kk25bt)2qH4T^|!b56#U+ear%Vb%}njW#0q3 z*{?P2P$BN(GCMs)yvq)jkGBUjvu*3T=m#xoe`p`*rF1|obM@cqxm0A9($KV7pjAs* z_%xmF0?=khj4>NQC$FjF)BxlBvJ>>7#{bK{S9<){@~r`#-$A`t$G;J@WtF4_=9gw{ zN~17z9x4w<%UA>Y78x6g^*|j*)LAFCf%I}V0=gW_opUlQ zpLa0JSm(W*O|GU#*&;LUa<Nm=Efq96sT_C;Y z$K~6(&dWORq@|q&+Nx+%ep@|sOxHu{dFB-8jL+bX^<;-CWaaTB);r9dFdRJ=lMA?myUe0br$M2qqF29MO4^@6Uz!Oz|2S6`Ze&y^oD0`IM2I*%JZ$j!e+y-^s zOngQ6vEn{73pAF2*=}^XECiixs2qK@8Q#-dblMw1FJ+TXxwnB9CHGO#O`S%|b;eBB z(91{vG+OQi=%IWYa;HHz<<@y>19s&B=%wV=@t3oS(e(7sjj}ezl^p2h>Um9>usZHdphx9x z0Q9~wH;qJO?w11b6urr zTR{tqJ<^l77GjzQK^u*4weC=UyTp$HpDuW~o^{!r1LG9Qu)_qItTP}b+M=rwz!@)mZ0gnI1q}{uM0jSbFI`xvCc|aYc91b zW(Da+yK4oVa+_n0&Pylg3|4 zxC`yCu$RR=^97tmCFo2~>KF7iLJ#TT9F8QfKvxKK~x$?D}ni6y^KcBvtEp%Ug zP2&SNrRFE5%cpSOQzBlScRq@fj-c~hoEbtdl#SH54$miY=0t?&6FD^z^hKa69jkP? z@add=;q+VeemV2U7jou@=^^>}IL^X|^!YAMO$42fKy$rVVEugnX)OlrX>9W%4PXK*GMEG4pgg*lMyb|Gcx$K25s>UII zeAQ{62CdW>slzs$idB3<;w}z50NPHW6~+&-q|kA%{zvUcR-n%cj&GI!1RdUDKPu4Y z2kABctnHw~ZL9`q%J>L+kDSQ|=B9rCUK8>heKi(2H(mBx>9wlP|3tiFQLgM75Vkp- z|4^UY06NQ})Ht!D5Z23^H$LgSxo2>vgPFI}7K=yXWZriCi$3!&l%K?+%YW8cUH+xh z7yx~8CFKj0-w{=QT8=ZX!jbV_>- zq_Z_#7B$04_eEVND?tCEq~qm9a_ZM99)~G=zRj{+4f={;c*%vbNhSRh=o5#i)9O*s z8-}RU6&KhQ8zrx$>(sqSkKy4u(fMouUG@ECRaI(U@-K!C@n(`93#>vRw3rRr46x@fFj(QnGytJ;m`8OnEnbsOb7Kzcdf z0bM7}7|Wvc*?!O|kGa0lGV)EI3bXwu!u_nAy|a#EDE|fKgD=2ziX4T$D)WYpBg)rb z=atXJykFw*+LzZhG`*Z%v`%9U!f%uCfp%fUG5PIU7b)F_7l6J;;wa=pV$d>-zA8HW z4A3c0x%y}Z9oviH@mosDA5UgoZRoPb*t-mLHUAf642`|JK%ZJd2AzjfW$2Wfby+hB zNpPI@t&x$Aj-y_X`DuQr4yE}hbVs-hL5s+BR$IBp7e23O3SZx2)<}v zD`i-$L-ApImP5HZ9?Hi+(#PEtrOHpI&llfS`4p#L&i_D%EqBiX(=B%=hpyLkNcU}0 z_u;ms<1XbVq{EiG6GMkBcOM7k;;Ue)yuj6G& z)hTsa$aiS`Is!U|xNyG}&DWpDU!Q7Mz)T~|bj4z&t&*0J5|yTT%+}-LfZ(< z2^H5y&(U*0XFE2>3oTy`^aVk>F=y=o{UbrTF&|v^hkC3C_Z=PoY|xiQgx@hl_#>d# zM1(&JdQRx2%cpfl^q$uq(4*o%3VKLaGxFc_&eD5|y3Y-O&hOxwPSf}pRyo>P&{&4S zaJo#Z-(^>PI3mx>Krgi)rNi^}s&`3vug<(W*K!>Ky~ape)6Rf4*{4ZJ^0KYgyt}-< zr^A=?!;$a}`Yfe%TWT1B-VAyu-)3EbuJ$JjZG}EeH3iu~=XbEob>5DG)?<+tvdQSA zHml1u$|jxp<8xV^62F%}(VWyBKctuQ2OurV-kM8oyK?sEUhe)S zowsr}_zYVyv-F;~E?YimI6ES58$mCn`xL@w4Lcd5Y@+-NC|{J10O?V-aio{Cjnnd# zv;WidJ;>kki2P5URdk*uIn?2ML2s4tg)t*UKMi_KFn(jq8GW5yaUe+d`n-<+DCk{5 zx>vr8llgCbk6p1v=%H~ZwC1XOuN}S**N|Za=(h*c@aVdI9Ri)-!EsN^$ESSu2(6I+ zP}*B(8|!8x?bD!_v$JCUs@|v9LjGDq%as6ax*=B${${vEpt&+02iDs&!g~vRZcT*` z&vQC&{h(u6iF_CGCZ(^_I0?Ec`vM)iFjd3XAYCovBOlQDE0%w237U?3A81N13dnD) zDH3?IuAFT_I)aufLDPATvZrOamb+_8hmW%DWB4fBKGMtC_UZC0XGhGi-{saRbB3Vv z0i;s%n3iiD=o2J=%FCDg=ts!MAXKSeAE_cV9E|+q5urcmkJ%$gdNbT>#Mct3a z@KN`pY5B_8BWn33&M!YV%>qsBs}$-*B-HiR3VMY(Mp*V}){RjH zCqY;9cR_~G{J88UyW($x;pNr@zYH5b7@dC9J#H-Ha(0Kh42HUAjd7H_Pea#H)IDnq zzX*9KHIM4>+d!v0X5ZFzd;oOw>|fK4m!Ro*UkB|GiMLSpGLGr6>lWztQ9KrH10Ad zzi~H5>u!~>6FnZ5L0Z2K--___g&v+KG<^r?EYouJeh_rC4s_U4Wx{HDRdeaMHGMMZ zs!f)bt)onM%FFWK0D94xC(ik*hHtbq&*_%(`l068aEtBTC01yo1sziJ%w9M&&sp%y zkFhKR`pZemGftYYv4^^%m z*5h1vq1V2&+#43#6_d?2Xy~we+lt3;9sUStSDWFbh56%SWlq}@7RoQAtMq_ATH+|s zMM|Bt&Jgq! zpf3r^=haaSFt(SYpf7MJf1wTr*rs-&UbGB}m3GB{2IKJ7!MgkstIF$?t)Q8@n-0gf zxXaP_zPGu4)bbn!O^sbu4_j;fcbRm&lRJy!)nTLVWM+BHN7&GQlBZMXxKCnS9m-ap zyd6u++uD;>&eoo^QnvP#pR_1@deZr?7XL4_$3UMXJ<6V*^e7v3(xYtDNsqEoCq2qW zo%ARhb<(43)Jc!BQJ3`LYcWI0r_kP|gmn2v-M7i`QTJ_P+F>)@eo2G77^hfL{Ph!L2I|= z%IbPH?MD5`mP%dSU0YeQv|8<6Wo6!~%I>VpbY|8|m`02>9?h&79H3Yfpa210Fd!BM zVL%XOLw^_$AQrRu4*>!M2tq6Z9H0OJ=JET!?|kQ;`#LwXIEt;`R)4b z8-U4qXVdHZz|AX+8@4T8zW;kuY)In-}-yi zhIec>V;|`|p8T%%6qxTPWbI3U%lG5!)8}6YoW7UGS3fO)e^BuL&vKsEv;E57r|XaV zShWAO44AI_6~MCiLErl(;7J*z&%Os(mi$t@m+k;(Um~11cwZ9VNZ*74O_Nsu zyW-+BaVD<-9?K~tc=h5rEXM6R4AtK#}2z&9BWG5^5EaEOkdd|C6x*|>ZK@I2Z331nv$oqrYIq<6oK zXWs>_rhKi$c|Y{8`sKh&-@m`~OWsEu54z9p?`P1|OcXDmwR~uQ6PHDLMr*I+)65QF zS-w2I_hrDO4%)6QhTmWPLAL(TGo1cIKl}>dS-Mf5Zvft6d6516pZ|IP`#%LdCJzih zD{hy5fLK9}ywTsh`VYcKx-TJl z41m+F~nw)?|3$j@1OkR{`fHMT?6Pyct7dyJ@OaRYtel?4p}xZdWE0X zH9qh!V-Im2TyoFw{9D?eWB16<>-vg%VrZYfo*07rdSVEk*RP^`c%i^f`!3*OCuN`G zYX#5$qyYYNz_aK~&*xLXg^nV*qHBNTU(2>J6~De-9DV;1-r>BT&tG9LWWe;@uK@Ne z(}qJ^#s=2sv+Do#`492D;78*x*zwi04{4VXTusqYJKSJKLniC;`&Vb{m%e< zoMCA{LVvULw%Se38W}?pC#P?`ir-|NpYGvpz!Q2lrsqokhJTNb0PeGu&jY@}`^cux z9|FF^aLa=++we2M*W&Ql`kwqZRZpAuoBb<}UIu&>W?7=ncFmPlKmWJ#<0|@|oxcp9 z1HG@Y7yw%o(lbH0_Vvo>dp`WPGy1v=UFezQ^{puU2mg*ACm#UrlL>jfExJZuf1Cd1 zGkoLuQUV`|eQf-@+3V1EbOA4V$9p;NP+WWr_zS!aOFv8j3V-rlKYjlY@T})`jlTr^ zyZnBK$BZ1&Z?yis>~E-?`3c~T410)ZPhlSbmXrbd-cNJhtMK#xe)e}2{xaZMyszK> zG2nlK_ZG=+g}nz@a$O3`>-!-d@b&!=Jg@JEV7|T|g8TY@2=43qA-J#ahv0dAKLpF` z`%#?a^&!x+9|4y>ek}b5e)uDR%Q)3Q`k=d%j3OY07mPuKAy2{ z^x01V7r7Fho5CLYPt!1Z7p?aUU=quU*_Lb*>GMDT&(iBs*vEh+zpL~x^`Gb0fYG;C zbKv^!R{>AHTVZ)K^Xa{B;kmpS?F4`K13&!3|3c3wTSj~acua;T&LXeZiofl-dxhY> zUMzz9da($e*Ndfi%j==0XCMAA{j%x#0{D*rkHx_ZUX&huy;$`9qFyZeOPL`tBbA z7NcplOe5d%9l+_gR{kX59{?UZ`viRI!~1jZ1fsRQ3i$8F_s-O#bo-V6I)Cjmfce(G z3b=3WJAnJv{zJfD@$CI8|4p_{p=z9E0@b z5-ooDzxVI^s|E1K0r%mh0r;bQE)iaI@4h>kXl;2t|BCaxSrPQCub-0OdGiMJ-C4b& z)7S?+`vdH0hxe4Wz4bSr;y1qe_Vk{|KhCxh^&Kw&{xN?iX0O=!_4JM>{|CSRegSZw zo%#~sS?8x`^drDGc@5e2!I%G9{tPi%-wy%Lieo9BKLlLtSf-Dd9DLw^jQLLt({)V) zcEw#+LjN`Zf0E(Z`sGc)r`_j`45xpib-xGr_ZgnXy{>)Zll0nkeJ=q<@5<95ZvZa# zZ#G_i{eiSTUwLaAz`1%M5UerfOzwzC}NAOR9PuhF(ymh}1{ZCqd@8ElhG*o1F{1CsP-zVRp zIDIP#Ptg3&0gvgp1pE`geQW&k|6IJrSMVF(8h@OGC)V&T;J!6}1i07%mTwEAc5d3|7 zUuq>REpUuO<qIF%{dB6!5dA#;~@_9qY`t3u&{}?}?{`L<5dn)7I z`t19FCv~2#YwG{Zj?3t?F99z3?MPqhvu^@+DdW2e|0Uq7E2pA6M!Hvsz! z?z1N6q3g=)%cXPl_2m*guP>KizP?<7`}%STp4XR4FkfFT!F_$X1o!pjDqiyX@ag$a zfYZFQ{L25WG?LA~R{)>m^N86eoT1TgAL2KU@^8|#@&;f&yYFZA*=*kX1aK#Q7o(M_ zUnO`eL1$kDTzt?p@2pyw*>~dE0pRCy_VgBDg3s(Ve*n0H54QLeS5yB_{(c?->?QuD zSyO`cUk6-db$UM^0T%PO&3=@x9{7J%SH$CKC=mdWYcoF`J)1$8c6Ts=u zCZ^BStgxxlRO#^qOwa2IU_!^1H)D3)A>c88&hVH%|5L!}&z9B_eDprxvaUG2Oye2a z*DnFTz|Y6{gr^ATH)g&xl{>qZ-r<|EK=7=2pZ5FTzt4Q%v9}U?^!38i`+dFe1o!pA z6Z{bS6C4;EneXcw-?s4lHGYQQ`25y~?wc}wLh)}Xj!Wptdxy`#(m{-d-T_?fDtVq9 zqzCZ(P{iDPy1oz$HMDV;joCub8hZDiF?r_p?`tE9?XMJ}j5j^kCBz?c{ zUL<V%ai^e&f3riQv9_kqDl5FA~A>?nNS)?_MN=`|d>|xbI#hg8S}8 zB6!}tNTe4D{@OQG{zo>Co{R5JBzo3&ClbMZcOntocPA3TeRm=e+;=Au!F_ik5!`nt z62X0UA`#qoClbN)?nEM(?@lCw=iP}!FyEa>1kbw@iD14vkqGX)6N%ticOogh`0gR1 zXY=k7B3RyCLIisa_CuC$NU(PRlN_719oT}=H9dU)RI;X#;Y$Alz_W66^zL`opjdl0{ueY@vGkkUhktdI`24) zzvKA_)b@|BQ{VAA;F70w-jP_x%-=X=YL?AAjBTXn@ZE=|OfHJgfuRcf5U@MEPloZi zD~?|Ho2E*CjbY}!43+w2+W+bwn<|~>Gj!I*7?5}^{pOXwS-%}$n||XHz_Vg&3SWA7 zDqa)t6-2ckir)V&;0Gk?oe>Dgqw_WkHC6I$cTUzsX>nA}HK&Pm_X_*Xz0$ET-CgXFh(YSSxU(r^9b z@0cq6IQgwEma`L`&+~sLaF_m#&7IJ<-iL0ZcUu22!H4g(v+tYIb$s$WQ)W(>v!As% zjlcYN>2Iw3nW10k89#yxfF#b6O(Uy-XXRp*hFgFy@E#&Lqp%+V_I3p0IG=v^`9C?8 z?Ac=KRrtGruQLDIb^nlVn^O1=WE9Yy!kyygVO&=A5yKtayd9^9qMji-BVW%D!F@eL z1oz#eLvY_cIt2IKqoaHE^#CZoeD_e$ck=GR(C0q`t1_g8vNg ztTpHwKLniil858Za-P@yXWet6`}6g0>2HeqCuk3OcOmH>eE09r^Lh83=<|8^IVs$C zR};P8cfSw8A1+UsyPB+AVJcJ{z5}?NK_t)g+wTK*-g7<=&rX#-V7PrZYZra~mw?ls z^Un8yvs3Xni{T+%TVCG+?P~_lX7QhXd$j<*1GwZNj2t7*wUjGWg zd_5ur&ztM7_{^&Vqi3H7uDgtDM=vJi@FR`;jGYv>3H1H%;T>5y5_Q|7PlgPip#t@>ih^o^JBjjN1<`2O_ycLCpY;R!xGvyd+%@@n`LcUkwo z=y$K+y^m*nSK%)M{sV?v`4Y3K9$L(PUca4Jdq_C()jbeA@7@?)o3C$)o`1i2UyA?r z*+*dD3-}c?JL~!5TEdi`TteGg)c4b&A89M0(dO< zX}+(t_Y=UE`1_IkSN!DF)atXJ;MqKRGj-lCZ>9l{;l=RsG}c16KM#13ym{?b!nRG| z_9uYTS}pF)H*|mR6+Hh2)*$htIPP`-ALIF??$mcbaQi+Z6S8I5YkRSIC=^2yu3WE;U|FS)ngL;Bf!O$wKN&iCl6fC=11Mb z9N?0ZcJ`34p$7QPmEVlf{VVr_6qIk@UePtgd0yck0xmqC4WD{SW2klyF?sv~;4d&O zTKG#8{m}QnbIt$#j{*06|AAHi_jdq~(Q!g1z6`ie=6w~sCOP#qf4_-m^Yp>b3ckCP z!^0{&);!bz6$Rm+-v!r%Vql6?JcK=6qY9{W;(cy~LjV z7_hAR5`FihHxqa@@>t*fB;fRCx3);1eE~4~bMjmj{@vue6Fl-d;D3pq&&K)cn&yTq zJmwF)0r+{(_dftUws*6)X*@$`^2ndcpt~m#=YBlO0lbdiNRA}i{+LpKKIW*;Ta;MD^7TY&rGCLbifZ{Dx;Q`%7c zM0BmN=K*u*mY>vp4FID*=h4=OkT>#dw*K(lnM7y*L%d&fWV9~*_S=AE@w%@2gZR2* z{PrneF`7&0&AF%j{I&sj9>4i&-DpoOJo`A~EWM{U0gL%BiF112t}9Jrp8=M27K)FD zzpeO+o>kZqV9puGaJ2^5bG%;5-!Yl{Cg5N7(7?|D|8t(_XP!yyIl))Y11|4Rulpsy z9_M#QxYRwp1DMc9^qkVpXJ<6GYxl%o)n{M&##CV~-2?dUtM9>%!*?FWpY`vb;qUYw zS~I~PdRFq6R~~%ykG}Nh@B731|6uBs-}wFC{QhtK-j`qg?eF~!d}j2!H}E@}5qpVp z#oxd0_wIjr>gt1d5xtw>4?HJpzVaY=>E-*FFX-Q2#lJt!&rSc)m;Ug+Ke+#uso(#N z@BilS{npE0e(J$De*4mcKmKiA5B>HRe@0@Q{0+Ku;(N$9nD?J~Ug}8odtLnf3}BZY zocg0LU3u^;`n%T?zxxn>r`#R?4g(nNzW*%Z(8yt4dho01eP4ZWP2cy)3sa>p<9Yr2 zr-{G+%KUvAzo9)$)gY_+y|KGtt~~hm{q`L%H{_lA%n$JQAL02c?%lahJ^20<{!RBg z6AGPSA1?!)7H1py_Z@x~=aRtLPXU_-OxOMa{_ei>Lj%7=XZAg*XP`Zlwj>99B|7V; z9{lld@O#{PO?vNVe+Buy9m!MDTIuhNDf}JjPyFr?qK#MV z#WI&3oY8lk*%cnTO6QF8(|>Q_-yh;{$lCSazl(n-KGHquzrTimr*lmH`x}XW51zYG z9n1$So&M%Zv$D9?ZVop0wkoA&f2BPr0eY=ESPE7<^=5mkvlKiL4(gp&tFm9Bf2*}Z z`bo96vWB-T2OGUG4BDN>N_9}44K{Xb-C)qGH3$8b8*@+fJMH;z*IIkw(&gu>gI=?} zU8&9n)xlgV?DtoyXM+mfgTHob&ECp2{2kCrWp#6=QmM=bH#&{5Qdw+-{XwsDR9UND z2};3}wO(VZ)@+r+@9foDL9f={#)2+AeKn}AJV$$Ynl{ng!ZTrQ*X(A#fnSGaMGNa; ztr7N?E4^N)w}LJ5BIv_&{pO1y?ekiAR5EBOVY#&Mpg9P8wLzzMzP?lIotf?r8t2Z@ zAI*08pD&nyueDmhl>Yd_^o7zcHeAC>X{YD;S;n0HF+$sULfW}=jJ0#;6m4gwoqskT zAslA^I=u}3B7eKyY4->2+j2gFMW318stE|=6uGLF}-Jl=VlRsK$*FZf775oAuTVJb}_`o*s3jL{&+?vY; zX+i_9WpT-TJpla@C0^Ov-96%0^6w1o&dzOz17gNOv(sK}w!@3<#^p|HZ?{b=Dg~8R z2-3e19`wR~so5R`U2LKoY#s&uZmo_bUfXKZOCbh)%dAx^>({Dt;5z#00?~9Ulz+s( z{b|tOpjXnuWewdEzo%4MRR6~jLK_>F2%USyd5^Ci5cQtE}9 z&33~OwXo^AbCypp2x|LF^%{2392^mXoJ|O-^Vxg3+vx^dy-s@|4+`qbv(*9cSQj>r zFn^;{hXfgfrLAtKA7E2gI&$dp%~_ITEEwXfv4R(s%Z^|GNkPcfE0u1y(!>sHIH}#; zP$aEAfTFdZ4ciS_wMz%{-C7TLTdy|Pfl?8*l}(7Q+wIOlyF_nq?qls+{V=@E>+a77 z8_mX1W%HK#YaJ)bltyBnSfDiMR0l_`up!$cHrWBG69!l_cqwL~w;66X+XlbY!RT0O zVLPM=1j|@0^vl?FOL;DSXuG?XlvFJ)Y}Oi^%|Qja1*m7$N0fdZ+;jn1;r@Whx6*E4 zrO#Zd)o+)=eH^Mm8j)pxu@`n*V7JPxTi8te$!7~4mL~aGtKNHLghy~yVWcZ-ASyD;Cd>8hh%%R~K zYsaC@?kYGqxTwlKV1hW7YMm%%7lM_3yVB8m;@C1e z(^6Hoidz6Jk~MV;`cZaUUQmgtrc}PHvT=I)~?0%K=y)Q$U=<4(5l=j zk-1gUzeBQ9IHfneB&=$ktFY_MLn{x1Fco zaz2>WgVXeN5-}%cgqLR;p+z_u;EmNkmVQV7}nu=B~puACio zNSd|6_V!?h>CokJzhSf9bQFVeU(RA35QxvYUoMx8iY4nF0x=wzzl(JQdt^|9(bQuG zwup3>?s^?%Y;t7-d;;+Vp~`jrAjx!6NV3>_s$#f zqtb!+ggxU0!(9EjEf~d>I*F~rfP`uZxY%P2S?$LyE{BHA&ftYMOZcyrS(KjK+0Gsr zH*7vn2DN63>(xcxNZKrh5!QuUPj1#NkaZn&{&c%Z|8p7tzea3B3xw&kq&qhR*k5S2 z`(bZzjB|01dE4@cs6TZ9mm8fR<=`pPh;S><_QKuHet1139wn2t4~4RN^U}rDAONQa zD?wP_={#2Nb|;GDIf_;IG<~ywvDd4K3t2U!L>YZIRU`b)Q z^48jZ3&IA4yU?Xtqrr|SA9c#!ynaNUHWTZ_P^kjKwd-a52bE>(omLL&B`7@c z)y;}V_rkUZju&RR4VG5Dv`_Ioi*iNaQomknBMvyI^zoy}=1X|OBFc#V)~lpfneUe1 zlJ3HAs`IgmLAui3hoOHx9PD)9d`(bF$%<4+xkp~MXO8H~I>Zx9yVU6?9FY>!NS}ft zpe498@b`DU5ks-$NWtk@EUF%%ny}!A?K9I7^aM-dj~qdye}IV` z{pEMWB#nsW7Dvq{rn!?o{2cUX9gN#?LcflsvPeN=ap;NYPRw#%gy4W|=p#r&;cGV9 zZN%F(TAdJi8HRGgzY(tE_)HKq+d+M&w_PF;8I%s{gU;^eM44nhxXh|L5%G^4%Ia0# z+x%12$|3RqF83PUC>nM`md4!%opzh#*wYgGYLpOvQ4GZ#S=@?Cp3Z=R5;yi*Ed*N| z;UPcMN3?+CW$^7wD;rg^Z(uQ)uwP^a$KRV!QE*fsLH6o{K%=#j!QWDFY43>KjI`b> z&x&DorL#wR(N%n(1rQ(Q#!$`EajJfsqN z=Y3w_2F0?PPMLc@R_IPzf5&>D8u8WD94#Tl1bZm5JpeK$HL>|L_-qI6*` z99XMj;Y`>>D7QKX6z1vd!GVt1co`8Bk^DG0<4`z)>nzBfgt-8leMk!!gM%hS;zkFt z8qQjgMPyP`kuf*#?h}V`A}Mp{WaFrZRA4*3*^is)6AG>%W*;T#E&eBF5vr`dQN0u_ zscB2BxMU^MkbI=}#8yZ(0?bHmHiy-^$k}9!eNsgbR+wKSGcpRgl~zp_IL7VCq6^nv zVTy2Q8%mj!AX&~vT>Wt+n#ouj>?uO$N_@3Y{)CZ8xlgzrszL0-=^sPFZ9VY`l^iKE?337|%Xdr_2WKHTj}g~HX{!EUX8Teg8uR$+m~@f=sE z>IBT&)I5#^+eJ|dv>3~ti*2@WT*{n9os<(ntw7Fq!zv}VaH=u8eI2jBp{?J-ir`05 z1rw$H#Wp7e9v(=LnLg{}u<@9&N+b2=L`o5N5)_XTDTm{Q)A6Om%Ulzt5=kux*vp*& zL2Xj+l>;JTa;+|IA)axwU4{8hMKKXUWN7<&_SA&?g=#W>bQa-D{z-KZekVU$xrse& zu51JwGrGJlA2dt3!DsX=$2<9i9-ZLb|+*5 zmFXc+QsPBRK^~!+7)omlJrS2>j%AU%jZ#DKM^yPVr1=fZB^bo2GGe*e0A*sqqzeYewR zWqJK*haAWJU?HP?Qm(wU>rf$pkj*oZ&)YAbB`+}8YW7g6*x4c~=HqZkG?BHzFBEM; z=k-cVu!wikpMw^l;;XGzr-lf@N*n+F3<*yB<=TK#E9vCcZ1^3VqDI1924es_87plf z2E2ueoT!NQ9w`S+60FwEnj8ufz;KRds+z_+Q4W2VXBhMBj#o+uRX01RSBAne*1%0D zM%J*wmFAW)aMTyz$}2?jnv_y^iVHcj^tG>DDB)-!JTxI5&*zJM19y-J;GQkrRZr-i zEZWt@OLAdiQYBdJb*SRamq~RMRF1{w6qgRI%UrbyO$8U-7QBo6aRfcdArSLkYtRf( zl}UB%4FoYo^)cHG>3_ni(jt6R<+utGY6@W|Q-qJ~@)ldzlEQ~lS|on~_G@G#^veq@ zcc~_l5`ZLnA$U=2@?uA9u!(7<#b6CfL9s^C3y%^LrN&;j)kL8*>Uf*2kmLr=adO6$ zib63vvaJnLGHx|h8PQ%^T)U%&EIfSpXIyl8TXH@|K#75%z5uKQO@5T7i>;tKAn3`zI3a)=Nh0vThymZ++`n zXyZe2%&Dbj-_*YtOG@&8%NxBTRDy*Nr|il&s(b;(qnv~#-$?wq7w=L9-&64D@G7#cTt`pcHc#=ZKsbdvkT7FS3I0! zY8!lEft(%-sT~J#qF9>;|>>#+v!BA5t5PerVPdLj zF_h9mvn?v`z-1YaV>SB zbcfTfz!@35lhHUfV&9FNmyRcPUoJh~A1~uRyvnc2QCP%+~DOe9tQ$i_O)dcE3VeEirGf{@2RVR}=6w{j% zuaptqv1z3xlyru@c1@V7$RmoGM>iegJ7Gp;#J*H+i_Eok&|0HFeF8zZ*X;Dr@-JvJ zeJo_@A;rV-e=gO1+BE0UVl|^Pi()5}egpoU0VUam8K3K zE$V5_kf$XPgjmkMbcfNAdcP9gnvH#c;xw(;K_--*AX_+biV4<|N;`HY zjGA=pljT|;ZZ(BL0h9U<`70``ZQ&zg%gAv#;dz#J==CTeeBSKUZI)po4u_lG0K1lF zqt$4R_71FMGgb({nCD_%Zg)f!r(L=uaSF!m#Kd8+8g6;h2zKH_P|}t*uHv~AB@|TP zm=v-Mkuf1KB&VSW0vm9~aoIoTMdRSGVA@f;AyzrHtPDd~QQ5cFF94?tKqT6&lXg~| zsnxo&6&W(igAnh^m|4>ikZjeA$(yLgNXv&I!|R8&00GWJ6nX{0{$R5eKwOKbiSkBn zCWtz%m@C|dMfnGn>j#y2yqW4)Ib=(el}u@N#>{K_}V zG;l~_{UnJfcuQ?a%|R0>BSiAMX!=GN>Q3+s_o&Ags9y$w2_+@gU5P~-k$r>);9U^C z?+xnBwFSsmNuF7G}vjz zt=O3AbGp@4S11Evgvi5Xdhc`|(BCbbkj!sa_x=c1Rdq!ybx8)>Owt^IA91&|=2GEIK! zwDvLB-f)7BpRnLleEuwHAVO2kCx)Xt*lfZmHHdJ`XD1ZUKH zFE`t!OBcWArb**V!&yqOjzPXAf)g>NJ?e!e#z?!)v8eYf**Y-$IO2oo(*eW~nzv2Vjy@z;0jBe}!}4P!4WTr+9)FGth8;l^fsEsvXP*B$;n47c+Oj6}Kd0 zWAkC{w1-4VgtQzB@xvlR-rqr8Gzn?F29w)-0G@+8ej#fX!=$W)rC`0dToPG$bQ?vp zx0vfGPqWbI(EmW>)6ATNYPrWVj66a)-0q1BXC0n&DkG}~ki#*}O%!xWx4pz?nlv;t zGxH!s9}nq|ME^>SNfknVvvx9!Zp_P6B`~aX6k+wzpd`q(4n~VmuNRvQLv~gaJ4fbq zlSyH?oq|&B8>~a28QRY0NI6 zYo*pZ3byvzDAnk+T?wC)_;CN(Iu&ds$G@Vi*ta2HByxI#Y1^F!K|}qZhXV?~$$6R7 z`fRgN<8Y%m`L4&ZOaT;*r(}66CcMvbpo(#k8`OIWD*!1SL$BrwbHvkP5jnAx`K{(* zh$e_{K8^W*{cj@va=W?v&35DVH_9`Q%{;dJje}0_HV--f<}=~uGxV1mTr7#XL?J3c zJMFXIyb|s=>)|)9pc`P@M)PHNDL2+ggS9&6b2&{eQmKe$Y%wHaVkYHl>{eqtncZ4L zkS|)GAd^~wnbk?6n&HOKYr$kf9Q-avS;!D=IvSp$D20%)E9KsW99dFtkx2&26aF2d zSywwfG`j=Wl#ITP30AnifMX-hcM$v$D~<~Y;#;8sW3-j4G+hSM=V^`3qp=Vrc9j#M zDE&3>=`%@B@^o$)Ct z78^o{b?q7wo{W8(RK;`DqnZ|-T%A~vm7ImV&B?}qxKvV5wH5RRzdH_bpaeF)zjc~b|tI#(W-^7-3+4d%U@rb?%mN3Dbbiikh91a~UOSCbxrjM!t z;}iv}@RAHkF|U(k??ELt_fnhUWxODZpbXD1ve}r~5kO|E9CKXFcn&Pr2pv=Xh>53m z8rN{zM?>&rKw_3xl0nKdJE$Cxp$V9!pP3tKbn57cpaFwH(CBx99Z5yAm@(Asv(F)c z=$;AWxp{7dJfX6br+ok>t|5Co9UXBu+y<9<006g6vC=|K1Il5Xgere9Duf@6`w?#P zh9ILrs4Y*G_F#6#hq+w`%PY^tTYgBBnts0F>D9Jea6@|RT#76dJJ27>9u_)18wp#! z2S*ChFb++_|AvF5BE#u0ktD$JhGkP|589$7W;v1qWe&pd@HNtn2@q09zzVnm3M-bkv_tp$}^ zJl``qo`Z^%wb2Km2>Ixu-dxl5fq#u0Z!bOPgw*M15>yc@Zjl?3NY!u9fI*=?!{cxe z>if538@b6nm~@bN_>s9Di`owkVaCv#VkqMJ2a^JUNEw)GoA@`TLSY7ETp-f)tyz(O zBmreUCsxBp{$!_x)$yLJp*WfpL5v4E5S$MF8}6_*p{uxzN9GlZgn5d^|y1jx@F5q$a~U?i33MF%ywa+=-wk|eZYy*R9ySSCz#2nvq)?NVLbx%J@_b@!E%|-R{0R!dN?3ptxg*4L z3o~I?)~YfBhC@}8PbWnq%9Ex>RGNk%^!N|-%~HU0Jx3aI`Espohf!FkQM-2cZN)&! zP*3r!ziS?ZY~!EowzI`y>|e5w5}0-C35XIMw9k?EgD0hc$56Be9AKg$drD!~=zH+c zp+0ekWmJ-jzrjj`IS5M;_6Oz%(BEg|W$K2TyHpS?5-VIK%ruLC8PNgV$>WphRwtT| z;FiTmy(CQmr};Y6SUYRWe7^Aw{uYhWkX$DO7VG!~iCH-Yv8BSRVr3rh`n-wE!ppq4 zx_a|+aQ$NS8oeD3vy)C>DQ;hvr|I+?*6`I$e?!EoZQweNU?PW!3w1az=$(99!WolOOGP(B+&!>PR1XfqZw_! zz%qG_ALbmW#?J_#%yD1Te4M+(wJxncGG)*wV=Lx!^GWa-y z9q3$1X$mqeD}Gy_3#;oAqm?NZ$#<#;DU)}JGmRC8G#|Q|cv2<#pA$X4sLn%5CE23j zh}2zT9XCw&aW!$BFNrK*nAFYA;G~!^aKkFD<`p|OY3th47S^@i0!R%~P$CCVs>hu^ zMz4qA=w80+;Of>bNi|PQ(pt@@G@W%#w_Z7%8@emcgErmC;bfAKj-YrY@6b=)=>l#F zzM`th244-?4sA3zqxa0JGv+{Wn3rn^IP1Wfq|YgWWso%V{?4N86v~IMhDW*sW1#|Y zx6@7Ts3f_+4aX6?)^3Pn8K%+>1HwDhQ}+Z~UN9HI8c-KX+q-P-=vX+eL6iFvDDpL2 zW+&Y#$#eQ??f$%)%h$N@Tyq)_1u5Ix1UhhcFvoy6qQW0=P*|RciaAB+V+*RD+zSX1 zHi{Y4;z~`*PFe_7brLhvt?RGZyf+HN%;*Y?vZnO+2D*CaK5WBNb{n?;n=av`Sfi9` z%h-$({07WArhZq>$B5vgF)^5wQWQ4r$%T1Wd!1dbAQ9SI#svV#W+HQoq_V|kWkCw^ z7<0}ci}-b`+_*6i*Vv-BZk=eb-MM1sd&0e;II6MtDCSOO@>I73Wdus)BCq2I>5)lj?xsVIfNm4L!TDgE?xbkQ=4M6Y*83Q* z5Y|JG3>pz^t$r#P;Dm#SY6VF__lG~ zNE8{ru3UC5rc+&`z_Tc{!N0}5{!~;`0stdQMLW5v?}P@Dse@%Ik>Cq^unM%=aT%bY zreXD=-UZTZ!?UpCYUu`AkS(TR2A3{gxq0;})39TzS-VGi#Y8zda7cABZ*0J=gyIg2 zF0d0+FKT@YW-<4}WWc1xjTt4$(DtdLX`d&>6=2#l#*Us3h)NH68oaIW#}35lgalhz zr;-9-mv^Z}X0{R|5s=`vVbHF5W@5_CRTGo4U6NWVE7yTooe9h+&nc5EP)zWkUrF42 zyxD9tVF6K$95odhI+B}@k71^qnT8nG=DcG(Z+rQU@vL0KOzxH#`A&O{40&=&mW(c# zBfS6@2h=6eY93}GE+%CTVpFq9w{Ue&G@}}E3`tXP8#WDU-$k_oY#C}?rIdsm1WI+O zQa4Gl<+*qZ4i<5T!^i zHyt@QaQ#GJUq52so*s>9q-A(i+qiNC_iYhVK^U9Nb(8P;6u*&-#fb3YRUSHFjQqQL zY?|&JlRh+;g3?~0ToZ%r%VnoD5V0oE5*Z*gLg=0`LY_gahZ1FRv0a{lh&O(#nN*ik zk}E^pSV=KKI4Vvw--L5CCO8zI8p!QcnHn_5_yC3YXwqB(0gKDjce|;m#b#eRiy$aC zaE9x(Gk#W{8+3TwxEbWaBnzS%*5@}O4OEy{V*~qMirm?7Pmm?2P!zaZ0(-5S!;8efvSh!Wvq6@*tV zws=g^^-T=AK>?>Q@Px2JVRK~deVIb{GQEkeg)bLC@UXI(bcv&)1mg%kElG41ZPuP& z-0pN5d>uxcuF4_nu0G&P=V3qa=uLZE>f5nJAd>Iixi8F2;0Cc_XdD!q3=M0P%=XP0 z4Ic;}a3EZUGtKhTRE`2nOWtWx3~A~K@g0l@L##1ui+On$T?S;RMAF|NVpwm9JFP0W zj363Xx@BJ~0m>ZJD{R>osR{A=9L1sAVTySPqDh+7`!0%2em$XPS#C}Ykn znv{s>1lNBmBOqHx=TOfEtx+R26D)J_fGv`8)sb~P%X4viS6=S^6dgpSzn?Lksx>6) zF z1Vpx{CuClvCX&K4H2I(y;@U{BtdC1$uJ5q4~}BtmMnBR;9fgr|$4kr#4& zEoeY`As)7Q-Hl#T8h0lp;I(TG;+@+Bkc>tvD;IQa(DXlEkJtLL!5R|EQI8#}Y2zcY zp&1v2qCFEq(OXLIT`A#M&DqAE8cIl} zv%1g-6Yj6vgQL!Ov{bt#CN8U{LWC(v;P1My$Ctg%sKQ3Z(Aa5StldfG zok%5v%hOK1(pm>M6Pp`NlzX%Hkx>&T4)0`K1C(~c2(*qjkUW|1SU*&gi2Ge#17ffc2i-Cmh3^p$9HCx6pQEyIEhBc+#Y7;ZZUOJ@NhRF!o z##}!g2+IUIDZIyP2q*Owbad2^cu%lc6dBbXthl9`SG_WdV6d0DvS!TlV~|VWVS^^R zjee34S0FM!lAaK`4n4u4@61@l-AOO%W^t$DiQSL1n_P9hf@vU7+5Jkzs2-BaDVTK< z*;YWQ+qe0iY#TL+-lBr#sYomNE z{KbqTepWKmA`^=DBL1~h!DPKqqH7Y0htJnN5+m@gk7#UXtuIO#RCm2V9Ss1aWFMgL zTQsSSqM`*<=9V1!Un@#3^K~Sr3LkbNwV5x8C|?@(m;eyiEyuGi0daTGURguD*@~F` zjbLL2C6*fqJ#I*1GlLSf)FW@HpnnP{uosRjgF|8THONsT(D12^fMzT~+u@5?<07VI zv@uDig?ZV?=UVY)O1~%!T6`4oX>Tb$a*7=^*J1FeQIZIQnro$E1u$(To#3ejXdshV4xV@YHdVO%+VLKxgmJ)2JUqiLGw5^&<`64#d^`$nh@;D(qvWv0 zjGx%>a(Gw|yHuD3i*HYqb6P|?c7EZ}LON2rJ+?Tf#gYL!Vz+VEvMOAX)l8dOPmwyx zj2xQe9+_O+5GEqR0S9A=#gkATVzYtZn`TB0bB>QF+>#|@Lfy3(O_^exl)mfN8tIIK zIUD1U46=&?-{bl;Nnlb7J)Jw)L3J+r@J-ZRPKBmvcXoqX9Ty*AOr?Q2 zwSsqzh;)4Au3s6iD7@>}QIX+ljV?S~X|LeFO(`s@^J};e%3jl%W>m+NEtcmP9U%8@ ziws74%AnUdLPt{{;l5ULmvGNqHuQKt>BOzEJQJu{4bWU~EB9I``ZlSptq3?zvB5D)O z+$an|8ik=roauIWP@*fqk?_hUu!Z1hGE0fK4QIqEg-+FCCR@f!7V=KQAao68HOlqI z#6;?%-L=S~h7>bhJQ+a0>vt17ZkTQz=Dk>`t#5o4W0obdTqwrDy|mUAfPpqnPnnEt z2-+beX?J*G!6i0g#}vObp1C!C->4%NUc`*&n3r38{2=7v+JMeD_DVUygi3DnLS z6ZxKm4oKn0UJ0NmhvEP0zaRKrxHx5iOECF=sooOvz)4!OVUEZaoF%GQf?LS2@^T{J zK#b!J01(M#5>(xola%VeOa(C1jxt`9jYY^LSZKT}oJbUmTpP$VI!4Esrao{EVwCRe za~#>4_TnPn0~-t0`Hr;l_=Wd|Cx!&KoD;O2X@R2O$1zR4WKa&`1yt1?AX! z7daz^(XV3Ag$S2+*`UTAW+L%OVJt~E7?FJah%T>Z(d=9#g5N|piQo;x1j7oWeaw3~ zCKrt*2 zH8(zbtOH{#S|ghmGjshJ9A|kp?kSDaN*!0gPh<=_ zeJxa3WqcxyFc#4F`UcV!w(iwOM3RB?$_&aC@{+jf5|`T}=V*jLJfS%zxj8|LmzXNc ze2Yd~Fx-bQ?j_*YuxyNZ5}ACj`FZ2qUO(cS<*1hi15ZtCkmtfnGB$I4N+YuTVmE~Y zH(IdE;SB7YMW@Mh4Ut(ZAhA3l$hS?Jg4eX;rR7*AELbhOV<}!`Tl$I^<)N^jp5w^Pv@{FiQ zGpl&zxahH`vq)r_a&sOiQf|pZcvSiqAos?ygM`Ez*K3{8zqqZ-i=L6VWsbQ8jjS|Y ziMR!=uvF}ZW^m;eCp@i_Qkar_WwGNWHAC6=IJcac-m10wA^0Y0qXn6>cud4B`62_D ziinfoKXR{zpUcL5=*gaSsYH2-NpD;NDU(xj)W40xF?|X&CQIup zX!07m3KY3)Yh*k15eu3h!Ji0)J}b(-bB){)GLm2 zvc{yBL<6~U<~;l8MwN`;JHHU~&-q(E@A@PH1{cWFb`2!8RxgmekddZ7-7pf*FCYog z>hyeyh{Fnz8<=rKr!Ju1!qo#bRLn~C6pg(!qYZ~fF2os^XBve(z+B|_iNd=JMTBW; zJcL9;zZ}gZl>-$roXte3wiVb69HoKgp-FB~$}lt#&R!=ILn(?}XLew*YBJZfHgycf zTNFrE?KoZKF=Z;w{l&gy9{W`1@JkV<~S8gBk)uHfeuNuk`s_p;fp66w*)Q9 z#r0nMW~7be883cwc-+LFT!r>H<)7BLR}c-*TPZlyk3NqjCNl+j-qhRbA4^e;vjY5LdD)A+(* zHs&y$tdpBRPd4)Z!N6Ay0~dzX#xK8bV4N_dmur@)nW(%>5#j97w3B7+UqhZqdEZ<> zZ~><0CI*`pBka`Z^c$UwPGoz4O$_b`ws2b+bqWh&@47_KNVGA$hi*oJqlr3QRL}E# z2`~r;X+6G=wHAg6wiqjp&BY^u)xvk%wHU@p+i#Ul_m8-3WU!>6F9Co~*l|@yLnKuNXK= zQHtt5F{PKZ#n^Dx)W^_ed8eMO@oYI}K6-Hv-O-Rg(Y&OqwXboUE#LAV`x>NXYF(;_$5qy2%dhN^-4he8NH?2n498Yu;_fCQ zmVIYJUv=2%s3pr`0xU`&vCyZK;ZLHrF*83@@S(AjBXe_%XQhxopCd*>X*7lSR07v} z#+oB{M=Pk=^)de*p~&wL@tGABz>k|!qLbvrVsRz>NOYpC=ZfaS9Og)0aLYpOJkjcG z)>>7ZL)gGwe0#0225R+6GuSuLk+SvfvpY`hONXvKG4pW~c6kQ94d!ATDZx6)k7E|) z0Xmxa=17!kNww72gzrkf-ArGj87uZZ$`Py}3A13^rk-kYjNd*R~Ezv^q?sZIDjp7_gz!pxA9JXZ z40~evqc2jH0TmXFMl0Mh6Yfr`>wt#JCk=T|KJHYh`a&F~Z8UJS2e>nw_;6)kEb>%6`P7q{(WIT=r-&TGEFa8=9e0RnUgz;9OUF&5-TaR!+_r9) zn}RTD#_=eVl(JIAlKc9x%aCAwx6?oI&&IUqiEUQJAleX7(zxuS612PIoVB9R19AQHN{)??v2YvWjdB$=G(Zh8*$FUAF zECo-j-n?{iH3<59o54!ZZS8G0+h#Vh$AKA%4@|lHI+b(vUliljZ%~dK$Mz~~Lhc%? z5jK~jl&eO#9UeJNw`$<}%(SRLxE>IZD~(b$go+5;gRAJZB8LR79UPLAJ<|oNs<42= zt=?|I_eUbxc-U3(pd}ezvN^Sk{g$yJ^FnD?8eEXgT_eFZIR{oKV?y4!8=oGwrSnv@ zM9Gx=DBWlrYn^i%>T=pyJ7}CcM~tX4i<$B`Wn`ao)^akToTR5^n=el?N^08x-AaIo z%Bsk7rTHK2)ed4*oP)rHK^Yd%sVeiSGCHYz;Wcg(Hp5M*^`JLvy9F~CN0Oq*{nidW z;Z0;(Xz-)x>QgglaQwKInn7w?pC~aclEnr4J$2HFgpt#}QB2RV-swcK$z>i&?_rmb zsMK2LcD8VCz@~WFQFwfq4v{&atzptVxgQ;AGj`ILQiKTN&1R$7!|i*RWPvI73Ue+P zKh6D*JQ5&%k>4p2M@Ax&8r*L^&Eo$Qfg>aEcg$dl@raM4CA%10mmDRhx%2Ilkz|xB zaOJ&He`Zq9m|u6Y#!&W^1dj6JAgP8;Ptr`wnL_9+?M`QJ5OlWW;*wJP`o(9fE6kum3m88IbBJ0Rhsb6$HlnUgvOi9jwnZf_xiYlL+aSL4*PS*T5%cjxUr-?G}4Sj zSSUckNY;kxiHI(EHkS9+ka6$OT0C|>^6`CPN2iUqW7RsNI;?9}gLtQnI>(83tCyXe z*2RfU=lm@-$L{IjYC7=29Qj1V5P5|j_VL8X0STZ)^GPfXRyHeIs{#VjRgMxTa6Gm# zOtLhWuI0GX6Zuw#*Ex~zuya;kN*9#FMC`APwRAYy5P<54=#HmU4M=28O=RCiHpkfI zYb;$i$}qgs+$j@)4GDhE`MH=U^%QwhJRStMQ|*SkbUW34^H%8&Tq`v)RX`Fy$<@<| zQPP+U-yDc=JB==l99_y0%FH#V_fn_4)O3Q6e6S2{bBe%WEh<9bcw?MVsn>~S$&#T} z$u_Nrjm;Jnz2QG68}-asPeG7(+*&&)m=HO~Rh@=0s_pA!;iBs!aqi9SophEm3SOM- z0hrmyIQT*5Ha=Y)v<546++$iM-Y}ImxY!x~aJ^F5gf85~?a&)D!3N!rzC`vNo;7n! zL?4dqBxE8=hc^2n-B#TuypGHls=GngE(P1+Adu!gl!>5NuQSeygJ|hPgb~J1&o`vQ zuGVPu!hRp~b;df}EXlDle2)zrKjn^eSQ%g0CsK}Z5~oSpv#p@ zQn#q#PN!>QJlvzGcgcA?Z~i>^GEO(1(;vHj)dtJpQma-clj#^?(M;mVtzdI(LyjKs zsd15O2C+<5sNV~BQE4#Q5c(;ircH1=IsHiyCE+%u$zq0at0L8^F3bWIzg8D8+;#HK zEIp*`y1Yd{Gmd)&^YvC(>!EORJLvXbG#64)!Nqu_>K991pL8((q|>=vZ9}>sJExYY z4>~*6+F?tGfw3pR2k_u$0-HlUPU_BK$E^I_t;+sJP`whYBNk8{%r4{?_flZ#dN|nW zG|(!GX3JH~G%CsPFKV`=a$sUyj}9Nng0qdWGGcRFuT4+P#Zf0qP?E#^M_V{IkX0%P zTA@1gVY|OhmA@UQd?f_gb&k|RI=#FTUTcmWppA=(7X8S~%(?dTRL`YTEsyo>1|j(|5df&GtMLlsS%jvswx1 zEQTr3v73uO>3X1*Sh>b!D%TKaRI4&P@tI-2lp3H<3z!Y?A#=S~#R@;Cu&r>EZt>?G zBYcR#_R+LmX@SNa4{HB7;l#-riC>KHB7)QIMoz>2%{t|ICl>afK!GU&>~4waY2-A0 zv2QXU7_Y)Rjh`ahj5JlQ-xNnzQ48d_g?%zb9)5?emo&Nl;?Tsnm!o>!=?pN}4001( zOi7cDM%FG_6*-YA;GE*YiF_-g#%?0t;ZijB4$%S|ZU|#O3i0Vd@)e?62+*xbQP|i5 zX^B=&p$V~5(XHr+pg|yZ8Z;h-joTPhDzG`!RFJDY5EXTBEwixpPvom&Of|EjzcN979PQy z&Te5k6>UB%*=A&Xg)-x2)4Ve4iG)A%?-O(?cdG0?Z*-oj91emFs%51c3jD%r2)iw+ zTub@`#e<~o_Voop{_&sb9^A7l`^lJUEaq>O(wy+O(WfYZLj~g$UGZ)P&JVyJt zmoY~(1jaf>EIA*Lk}{`hU7e%O^|wO_-l1`JYMl&Wosh-(MA+uO5h=5|tar?eqaGyX zh@-})LcaL=HB{O-HzY|++OI&y&Exsk1x1P#{ZjZ3jO42)eqB)3?G#)HHT(&Ugt1gw zXvyS-aAcL$%^8%an`laP)jh;<)(o$-`(bZT*-VxqMWzRiVv%d)C!bdIQ{zbXMyx^d z1l3s5jGD;sInDUqs9ucUm~0P9lb6?u2{M)pjipuH>ro~fj&hS_D!ABc$&qSwV7;AF{%7s;$t{Q_&GFAtHQUkcWXFP`ropoE<5kdlm>IGs#=*HizQ zs_l4@g2d){ z(aX01!Hw?Tpwtfs z{XuOI3NL4UAl1!YLH9@-_fg%3zltUE)3Pr7g{mCz-&o$US{!*9omM|@x9P>;3AEiK z*OUgWKkahpAXiqp)v94dZ();&fmslZQQP=iVi7l2kz?+35VfVy z<8WV@-`)fTQt7M)_0eN~{fKE&PIf-H+21I(kKTanr(3Q3D)yST~&R$_i6ri!BZijqTK%?X6BJ082Pop2qx6+>Kp%(4<~?zqmocn z36vBJST?1US(%8r5!RcKO+mNQ#6=YlWL45U{DkruUrUEIj;;{urM<0I=YUxkEWXvM zZSzo*3@KBdYxb}2wFb?0c(K>39VO%qK3<-Mf+U@dJL$Veq?s0on_LBh(g+9|)JH(k z^+|`*P?!Lk33pDcV>%3)!WNPHY4_{37ADC+)>w9@D<4YDc2L`|HI;@642b!IW+QA@ z^aAQ*G7i+{-T=dF&XW4XfcIx=%ocIG!`@!OYGc`oN?_rbpRFteYyH|j$@1rJWSqxx zcdx%A(jF4bIkjcv9QVSF&Y#-r48n$_kSeVCS)&=8#cY-=Q7Q`IEaWa%vOs|%k#ax= zR6;SrN)VGQWr@fu7W-j%8&qD&keg7kkiwn*=1Q}&9Ng@N?Ohr~L)x>?@-AcJWzly` zgt~u6^WC{x>krh{TZ8tiwL&V=!7_!_=cTO{*#!L~SS5PSFaxoWm^!}` zT;CgnkV99Y8Dzn89kD3-JDr2wTKkBe$AtL3ei&?#o(AQ)$_|G};b6=oG$;wGU1&P} zX56AE&#-XHz%H#d9FWPBBm+Ta7A2uMksk|hWA~NTEvlL7^!xRa(eSR7kfG;YFuAy~ zo7~hQ9QGXCwwmKBp?NllDr@z6oPe(y5egE*S)APo4_zAsSQ5JsWQyYupkbG1nuDE{HpJmT*jaVQ?_d>d69)ukO-J_(sHvBv zA}f@PGQdp=pkmQHxf8&Egrq~l z&~Jx_5Y$kSm%^=1FJz5rjnVIxaNz{FC$3N|yX4ulB*%#u2j6_*+i)(0^|Rg<48 zb~vPv7|Y~-ZZ%si^S3=50G&(;XVApaZT0P{&!3+zpnqTt_aim?)DhilSk6qDsJkm< zqOOo34`+N(YqtBB@xQ%J>oS zk%ryvVx}o3X+k39Ko5vKp+B+BlyO*RXN%4yX=sAUQp7zkoCd7$0hX7ICE8@CzHxkm zlq?aQ^EadzI_x9p(1vp0R@&U7DKKMLy)KB_cLGnC)_`38rnzS*g$Kyd!HcAQfF$et z&XKf<$tK8m)l^iWob)p2d9ZEj?NW7J4j`Sj$QHp;5>wbSMC_Sq$|9xz8!^C(jaz$t z2tqQgx)ee&3)jd3A`-LB2DY;g=B?To5x@#d+JTf!1Ju&K>O3*jeL$KBfqnBgZ51JJxXH9`>`= z!u#pSw#nlq7AEzJ!5uc%1GH@f^))a9*?Wt@<^2JR-Zj#Xqab2FM#(WT?XmWjtwkyk zt7^vtsNjQ`?sDfGisXIdSltK@>NGx^bqU$Htocw*%Lo`Yss)t5hM~~bD44J$k>kf0 zesuQbLC}I&&>|t^IECRX$2wulA?yz`%7xc(t=hrsNygXrHx2%WbW!G+1$6*GdFYTE zI8LTu0UgMf>EKG&u&5 zdpNub5mX*i$cccze$>p+vPH7N2~Mz_9hPp^T)N4{XSvLl3AsfQc)J0gq6QIs5r!>^ zVpr@!6G7~v;tE0zajm%Em9!C|iRAI|;@X+9)JBP8J#qlUbF7Ttr2`)68IT`jF!?PM zhroHo1A-jKfO>?J56O&>883@$KOP*g0(~qCJthXS!}S;vRfCZ>I3%v;=n+0X=&7m$ z!rdrH`D`kj`b4|i3n?ii$5S?}(!q&>{_x+B~Qb zQb}dPJjazPCHM{DYS`YU2*wC}Hy@JchL2P7KyG3ljOsf-v-<8a+IYu@T z1`xGh40}lF+zsF5<&(@X4A57BY{gKyRtvj^-zsKkh7(j?+Nr^bV%PL)M;z0*+ry%W z9o7aO7lFj85c_19SnHG`NV9?qVwl~GKUh~<6jCQ+k8H5n^VT04Mv21 z#Xe7c(_^lQM?sC85csjszgk9P!rHO&RO+gh7!6$<% zascAS2h@EVkc%cc*l9L^#TrlpaYfP%eh)HS zxiQKnqV0L{NfeZl$_|8PS0qCD1bbizkv36P0-d-AgscPGP4GA5FyiZy+lw+3l3!!R znV@wK=8DNY?t;>Nx(B!?2kavVE#PPoOwfCrI;E$`Wv0Kw;t}ONf_;Fj4V$MiPWJ3B zsyW4Dbb9s99w=cDwp#GeFBz9Do)sDUVhv1)FpBe^QOFYkHLO}a#TgcZ%$CG&U7A(XY;Wh%j`y&NlNEmiS7#csF7VJcY%CpcZTeTKE zT`BdVTo^6G-PmHUAx47GWoMpgi*|Yy;cm!6d}WlQU68ERXk-ps#n_kp94QbAiz7x9 z##2L(3+lOR2n$Xh0(~Z3Nm>>>DuO)1_^ew9l=4`fSiO1a;%X4|_cnu-AX&@8HboRA zC!!O!laG*vPo^{iTIL$EWH$fTzg)}|QrgfVFz8LEnBPa0Yg|(+9phKIIHDdiy%0tn zg@ibu#&-G$cJq=JJ%EDtAevd5=1{lBAML*AaSAu9{Z5%H^P%e|x%|YR?p;2Q}Okm#Y*V>JK&=0$Ys8Ds9k?Jk9qLwswu>zrvpgu`F z3J##^qR5Am2RIAxjH%*9+1d*8-tjS(8B$@t&IE`c5&JNo)x$xm!BUA3XMu&q*}S!? zdY~!ux=lr!bOt{AX7()0>9pRDJBSe>OEFoME@m?Y&Op%!?)6!`icb2OohB>~hp0f_ zrs9Z-fmn}OH>240U_T@!SjDIjY&vW7m}$#a2GSy>;LJ_)iBkIOSXHHT7-RmfRiISb zT<&z6dV|)G=S9+uB0qI2;jHka0=)r6>@!3U1zyt9Co?Zu-=_czr9Op_QjFGJHL2@S z_`vmC$siqtNL`&Rdm9c}<+9_&VNX4}_wPEI7+?dyZcWx-lO}fc)#&O>>!*${MNtcd zRgl7g9JeQ1hZ}PX|3`)ZtqP?nRvg8ok%!Zfr=!Xwpn)TYf`9u3Lp!iHG#XgyQx2Iu z*L-hr)-ClX@#_nI80k!br5&8aC=@V9C4EBK!|s>dp6!_1le>*kt0pLhgS7Q18(0u* zVhd^znBa<=jW-0xg^`qrk4(9KiIT@S3@QpL1r;(}f$Cs?FbHsU71xjO_7+5=YxXME z#E`I|V7=obS;mJ1<728JGSoHN?H0sBwM#m@4~FBshAGJ#!7!hTx-y16;$zjqYVc#$ z_4S4{3n*0Ed=WczDzi^Dqy$AHV`PjP5$~k6VBqnL8hvLS=GmM9~lZ>>On{NaSra=^hO#GLv3B&iHWBA!>rXreT(&7?z3dc8ZXT)ApO^O8B7%aU>z8=$3RdKUBH41Xfy92!&yf=ownbIk!3=8WAo9h_p@xnc2E_rZw~|6 z{aUK>EfpOw5pF~5!xscCh=m}U891^_o98Y<`gimf!0Ds>Zso9R5-v_U18N^%t>PDP zS!%1L&oBMXP|FbXUYknwlJ6M;8{(ue)n5$>x!woakQt0dg5&> zH`zP}>CcDX*{ijDH!X@*mA3w+%XoycfJ7@W&t%v*X2`((#b0UYEUuVA<~o`Omz+#h zp~-NYsJE>Il+2NnPPgfz?8{KdT5Yg{o}E4Fn&I!zyD=sd7}c91jX$}83C8+I=jIri zS8(neXR6Pg(+yzIN%YS~B++ipJO3R0+IM$44;FFX7CjdG2oF7Eg2127ozsaIXQubs zedda3E=WQG3TM+f3VJov)S1afvM3i5I-opqA>DPverZNl==rdyBUDjFZZ>eHZLJJ_ z)HJ*+cFNI3LUg;3UaxzF&lgOgb=d`{nl%Z}UDG0Zg`Qpk8I*R9^z5D4f@v(7S_6#Y z&myMEA}ZN>ICP4_ffjFvM?uM4TA7bcDt{yVuC%F>jMPVYPJ)rpuBI=7l>gHfMyR6hmp|~pNSrN zlrF4C4Hob-$o(>Ygpxj-N$qxcoy)mypeDj75IuSC7v|h6(e#NNBfkMdv ziN|KyZ0W3n9xLvkN6OzJ4NhgvKvR^#&lbsE>Rki1^Zb?-v^zR=9QUNCzEDCQMCx5x zoXn9Jz|{5IA^m|v`NSwn4J+-(zm(Ge4fN=-*5T{sA4!$I(n$TfuwX5iP>>n;Tc2C<*t-xnPCv+u3C$K|f&O?z+NTw*1GZ)oCV#QTgrW7>B zBeP6)X0aO$yK69Cv#_ktYh}~=WH%IHne2*3IO@}bXMDg*uNlvSz$*TE=iKy7eMxd&5A+)g481Ee98whVkaeDq;IZ z#Mc7irW`h{!Z##mEB1op7pZnxuXM`5U>3@ZqRbVf z1s}ygzowM7+6V~QT|n<~-`FMdn}{GE*FG$crud_*15Bx;>+B_6cARNmFva7PO)_xK z>v5>f`_jmk@T1WCk`_1gB)wfb^EeuZlzT$>ZPrjE)+Tw8nXIr^Lt;2CWw^P7{4i^Q zR7A4I1T65wJgt#KxRih+@k0r*481X=9=8L*8hg9DM{#9F<1?ifh>Jb%f)!dEx1j8n zcEIKdkCCV>5rG(T%Lu)}a=|EQ9`SVy&tsRfk9aU=E~1YdabUUQx>;2nn|TXJjp~P- za5$w0jwhGoy63wf21&tksuP|k3CO(IJls>Vx9HvkmQF(_B6v`zgoz~AB9dHfp>_98|E1bjx#yk1zsc;W@QYP-}eS>uqPH|oVhE{x|#fu z(syVy%BNTil3NUTKI7aq1m%(Ib6X$sxVS*CnOB^Mfdmrc)Hn`ElH*BzQa}uGQc6DT z)n5xeO|28^$eI{ZLM2=vsrQVYEm(2%+1M8gp9(pfNNNRH7tUKb1kME!l%Fcyi7Sax zD?Du0JKMcl7agv+S)oohUi573(!Es1#N=#KO~wZ2tHtk;@Y1<+@hy-xjd?$yz-4<^ z`p^k`7#f z`4V?Ek8%Ze0Vbe(IX5}9FhLg*rx`WUsxv^{Qaj@;80Y)fq$n{(`B^D4p;Qs-!@4$^ zb$u`$GF1UCYiNWuNvVew8X|0r&LK?^_1TA39a>4IiYk{-GMB6240eXaW-6cUVUkpH zHw;2l<@cOX%!1H_c~o9X>kgCIj%d#NZJP=Mx)2$g3rf4q{%&nh-%(aQRVgQ0+?!S@ zcM}y6r=F~T8*BI?2;?F8IcA$d;$-MDFLQ8AiRQ-kIvs6AJtm8jCNR}b$5zPksvMM2 zG&;LMtzJhNvNfaVrYTRbaE#%`ZVM9~sIqXx!C z=)5~ITMGQlGm1-`!IFjOH>+>8Y|J}juR;;pnHVM^J+$!yZBbn>`-2`|45a7(3a4Dc_qp)Ek7SP1s4KGJ^36X<5@!=wo`5$wFRn5(A!K(CZV~<0z@YI|d+sk; z#z!t{!N+aWRI|O0OR>0z4jsGD%ViW(YB!zNPx2m=*!iy4U$7upJC`+K?o`e=wb@z6 zmJnX)pV(sfq1f23R;05|@-dtiPk#=_mHx*ICComx*V|o-avq$itzZ~ubWb;;ov8#` z0p^^-aj&r;;gI8*GcuZzVlr;_B)!$l{il^o`oWAk;uDGVYF+ZNC6byhc!82w!FffM z%{c6+pU;=Xa&Aec20!1O$WccASfwj$(AQstk%7K)j(_9&WweiK+FL>$hAUYXSwC5# zTX$WEoU%yxlXv}Es#G_xzUy~M26^ZM*E)|iE_FaU5-DL^Pq7GY8l}%;3D=#~>U0gK z>DrK@XB@L>F@)$CR|k1|PC%-W+(WN^&CoT~2Po?vcExwwaCtnThkKD2)5n$#azUa* zvVEp&K}tR%G%sT3f=hcx6g$vn{Mmak-mF$*-0r!6n;>?(vn4i6bVR4hTQ63$7D9Uj zJe>rZdO*aU7&Fq-RB+R2q2R{7gqzaLx>&t~TBPGW+D^^!n4xeQ>tS+jJnu==s^kC& zHw>>WUC#j^s=9QW5X^sm46 z^OU&OL;b#cv{Z$yd?=61B3Zf#kqw08ND&0f=NU-a(_wA zGfxgv`Zz5x_?!z2;2fRJsVkgdST^moxzpV^_PWwuL4*&zZ!3dYQEEf!B?xPZcyUFG zZHWVK%tX${1oxHQzXlvHY&J3F7$aDkoi-{r)l#C2J#TIZD};W>j4aK0bL~BBlLH?F zaqQG=b_cJM`ijaT?qrV3@UAA7eB@i&Nv%*MFp){f5jkj}Sc9;k`4Nyd^TQ1?BY#SE zn6KIs?Fqvo!|G2#V1}XQ#if+^nc|vGPs+$M3|q#jHRbZ;u@T1co{6D%6029RhI6!$*QaloiyKOrwAl@nHqVOhlO~JgxcV-eE6_m z9?plxk-{gDY~4zp@h2lCqZa5=tv8W`TyB_AK)soe82C`Y==5UI^={Xq(ca~A%xr_EURUC zJeg1mqtR$JJVrw_8kWKsfsi!7YJ@C=V0nmO9*-x>gix4Zf(Z}fF(Cvi3c)fVn4$>A z7-KA}D59c>qNoTVgb<2QL`6{~zwh@e-J=VL8Sd_m-&B^Gp3moZemb|iPoMsKyZe4i z+v;{A+;pn5&5@q|oBR6sy_y;uIGz2xe)sg4uLTQd^zUr1yxvQdz4FZk_5OPcep$_4 z%Z|WxefYV)v6hP+bK%K8JJ=d|vhTYdQ|KNz-Z7;vh&Qgk?>9=}MnSzo>Ma{P-VcB` z*o-j?Iq%!GeRJ-;nQ!^Pw|%w!zSEsOjrdvh@Vhbajy`m!@7h1IuZ0?2WsF%IITP2l z8mv9|#&zUw{NLgU%Ue&x?BLvPjIjgtPwWL8_|G0N8aZRpiTk_mKYnw8{044X$#-+a zUCi(^GsayibNJKh>l*C=Q(Jw8H(uZU*9}_M z+8VUh?hVA7!|+%Lx}dGWKm9#>kJ(?`6kgXjd^|O;vTn7#jN{MoZ$E9U-@v!N;!Uq3 zd)v2G9=`WWrByROMvti^dJVtZU@a3(dY0X|{Wnm(-$LjIsM2qqWBx z)fD38UXpGPC zyUn~6Y>dy+9)0X}M32m5&x_u(`|%}!*xHX(@7qSN4xD?LK4+o7erY}@IecH;`)?Wa z44S>Vd!7BR$!EVB?m+Ks$hU7V!t3brZ-U`Q#NmCO3vpya_qJ7kjOpf`9>W)M>PA0g zIda(WW}}YzNh9aSV@>|sE9%B|^t`t%{@#pvH$7;7onRjJX}v_{|B{l-Y%a;W^q-&o^~z9jHQ9(Q`btqF$@ zE5B4m~;CG&S`Mmsl7{X&mPq`!okky z^#VsEZ(Y2jCbPi~Ao5z(b)DI^wRKxsn)PcHqh4D#)?(C(!efIsw}G$CdY)T8``p)G zC^oY4k2=)FA?m1GsqH&5>yY+aYPCEDsmAMMaOBO+QFcYh>2byO^Obgj^_4vXvc!Inirs(Au0B>L$?f!c975?k zC2U&W_9&hezt?$R9%nQ5Q*j$=`CDr?veBEj+$Ej6Q5$}|uB6U>?|t-5A)^~O_jG8? zgVonYGqMrk4|lOW->(I*1sXmq9er6mcPwvQ4u9XP9qLil=F$o~8emPXD!I{xuHubvj+CIMKoc$TAk;_rTw>|yFC-=AA4sRZojMX0KMXw*A*zsh8ot6#%026MC&pkEC z?T4dINZxTNCAUtt@8Us-+6`;?tB?A6uXKamC;XN#6Pv@;C>-d%WykvVQSdZ)<0ig& zqkhxK4;O#em21>PSYurucvs6}Zx*f;RBYJz%XPNR`>d|TuKDun&98O!iB~~B`<0zs z=Q|KB>yOz?(QI~BR-gV)4)B|w8#x76?jANc&y|ItM z{%?#!f-z6J-uw`pCgxnTe)CUkJm2*a)vtFPq_6XNV)h>EakvFN-xZNhU14QeZP%Ub z_yZTTQ}uPLTQ=EOHaLBF>mGEBt;+C^WsY&l6F0V4uNwZ)u_pNKAD!Dg?^k#DhOm*B z$G&YV`K>F0O*g)PwtI{D1$5m;dpgk0P%GCAQZ1giah^2isazi&4+*5KD!?ed@9OZ^FNvf}Q4^v?zUAh(GlXBlH`J#a>6%`(PS zhcUa!JFY+Ear!)J|N4I0Z0uP><&n!?Yg%jYWaVp@28T}-ic^~!?R~7Zya>f>r*FGp zGRAk6;eAB!w?U7-h0<>EYY@_iVfAIL-JCWQmj2th9^T*HD z)uuLX_`0rTEgmNy^<2vsy?xA`=W9eR>k=py^sjqK!=45n^Ga~`(CkyL5pQ2w z-#T}CfPeHA%CV}vajmks?yEI+KZPA}e%ZJgcYrUg{G$4cx|USUx|ZQ9F}B07?{KPH zn>VJK>`vF}jkr)&`Ej+~SXTAX;>Fb;e_m1b$+D{KCwy!Nwf5aes%~uyFRAfkZTFx3 zgD+a_w;{{yQg8KFjhjZsTVn4ow(nEc)YSp`!A8#p|_u~yeZfx1Gy7}w6)ivvWV*K%@#$PsW z*xZQXAOFS1Ek&~nXBRTrv~JB$8rId==hy^&QT=7bFFvg(tuCwl=rjAhs87E5^0QA; zEnhd;>(OohQ#~g;(P)}ersg@E zuG&9boy>RReP8Cj|+o8F(!8y@rLm7je2^NQ+EmVIm& zZa)3IqWa^HzWjN4l^q+g*Kh*nRNGAmYjB{V_A34S%aX-*HZ$Cq=x)s$8mdd|?L&44 z4`%4|Kfo>N)`P6W+V8(>My;(su3lQUWaMMYmVC4NU%ny2|Q`&#S6G{cOqNPd@v^)~?c=mE!f)wX$xb z{cv%1iu4_fEy89y6A2yIE}%7GL1h2#BQ;S@Q(N+j>W@C=qWJ8iFaE&h-%dyytA~FF zGIy25c)zYoZCu@IGl9*6E!m&Vv9l^$|8WtBJ&7BS)bN^|yD)z7*=Ng2Q#HS8soPlH zP*;yRu!Z-Dt&N|TRa=Ms_z!UVi7oliHeckXH*aXJ&DK?yv32X`mG((o+_sEu4s2OA z*V%K$wn2e#EgJrVkF5i~ZKkU2fvie9oNL~&dAKizRc7>7tBlj9WsN)5vj1rdgV;7S zKd~mMU-uQZOFvO_|JZc)8vC&ZdtEkq_UO;7T)l4NsMW=~Xi*C7Z@)dir3HO*c-ql? zA6siThec|KPWYj~k9k_5sj9BRMirae=G-3I+|sg6Te%dJOMdC6l~rGUv^Zy@XbH9K zFRZcc?FrU?b|_ZYXj^KoB-YJRKd<;Q{c+kh%d>wrvJFbruG_e#d7V9xvD%tH)mq=w z`m<`SX4Td9QxvsZh9iCmPlRkH?T3u8>9YoT%jTx=?Zw!x+R`q?%57^jyb_xLZZk1r zEphF|IHHlVYP*NNWka=XnTOX*bmBVO@uh0(zP6VnSEFlJ*Eg)T&F)Am*iDC{)*;(d zT5oII^mVmnP<@L_Qw!R*lK7>KuW^?SdN+2KpH_UC-AH0rlbwp;`S|kF3am%gaW`4> z;So=};@x83%vZ0oTXIp3pGB(uY1a6+Ec;ouY;M+mZ=`+jx%1|Zv=FxXwqdd9!-%l` z7+x%P@QAyPtF0lbwf0&Uw0i7*Xd(61;rX*gYVA?qsGVHO&VV+mk7id#+x*!=wRXb| zrlXstzInB6KC-Kf$(UAL!LYp^BO zgbq(0wl1S9Xj9!#Vmr2xoy?aXmsH#B_Fvm_(t%6PMAmJoTeB(mGpcMotgO>#*p9ur zX-#V5+I6=5y0zlN)NLC+Otq1H@(8>m_uv!yW}h1Vhxn=Tavat{{L!*n8^qdYlR9)YFw&Cy7oL|mpkSuT&kMe+nZKo9eT z_@MISA$bHImV59tJxm+oPUXoixd+eK@S{}Qr4Jz||2%@tmp&YsQY?)MEgf=++<}#H z53Z$$F(O{CJlP<3V58iFJ@ily6L87~EN$?#JO(@EX|RZE{O0t?bmDV*^||CNxd(5{ z(_m>emv*)u;xd-Ck>zp+E|Pn&o*t%it;Oq=CmZArY?OO&Cq2~LW$|w1$#%H|JLDcb zO%L@DcPdYI$sKq`o`ARMp~v)Dd`EfmuH1qB@&tTI5A_hgQl3n$;xdUyx&P2uKo8T2 zc#`sDB6r|qxd&&{L%l+a=O|Ckl{;{r+=Gkgq26MPE0iaf$URsoPlIRap}!#RR-Qa3 zci?%s2k+9u_z?FiPY%c(I4Jkz>fEhLWbrtbwUJI9f#c;KoJtL%jnQ zA5@+^BzNFpc^Z6056drAW9^H?>Cm+aT@S!{nPFlm|o;~_VES}7=HgbwQ2B*q1;3;~T&eIlmDo=LFJ$Oc*0jJb* zeA)R!Je6f_WLoaPY4QZTOAqTi;(q1H0l5PQUKA?woLHtm8@{v3S zAImdf>)PD;+hXxnmbH=FMDNm->V?Np(DNjB$9-@ckhxoAa({;;)lwUkK_^fSnk2` zzvS}E9>vENPheRa>E#ZbC{Msc^e{fehm|Lf$Q^i8o`7fQq25`GyOk%;$sKrJ?!g=M zQSD;!P36fRxdVIU33#6##`nPDhsu+W*Wc!haTD!@m}T0eR2oxmwWIuJ&X@=r}AW%JOaRqzQCtu1P_)6}naJkKpum|@&vp@ z5ABKgvhw5=xdVIYo88E7m{a z`=DJ${&62P9GGX17e`;Y`o6Cup?xdV-sBRw11seT*g_9|1aYhK7loT?mpgEg+=E-_p&sI` z%9GpVF}PixfL-)3e~8a0Po9-Kuv_lIA$k}e;up%3FXaw=CHG*mDYsp)&QIccZ^vZD zL>_~aZLq66Llms2c9mynq%-m=%n#w}3Fde*=i1Juj8o(eoGSO=0(xjs#Kp>!3*`8!Q5UU_n@JOj1Tcu<;iRE7`!e|z{m7Z?{`;S+J4YiU7pzTe5&P3K9fh_bGZj+Z_e%4g%;0Y zSsOW5?!b9+4<4n5{+aL9jAQmW$Mw17H}V)fAuj}5w{SWOM>f1$EZ)j8JNq_nlgHq8 zc^bSy58D^SH5+CpJb`7lT{3!k3{I36g2(8av+araxboyT@)$fJ zPlJ!>p*;~lR-Sw!_ux}`A=vVVx$RkHS5%hj>dNn~4vqfK)vmbYb9D&q+sZa>Be%#M zxK*Bj2k4=nAwH-)c}VWS!}0{|q=$N47N1d`JS%r#x7>q0^sqi4?p2<=C3oO$xd&6* z*k7_&T^O^>u38%-c?^z|XTWZHxEg%U;`7Rr7vwQ`QJw}}Tkd*jUBv<;haH1Iy$dTtyG}VGX}JSC&s- z0eDcJ0k6DmPvvQ_;g53H zc*Kn?Ya^TF4s4cta5p_nXS>B6%9DHK4%{pE;Bk7W_l?CTlqXNh9e7Ia!K?I8@0!Ke zl_zh=Bk-o&gD>cz-b;&LDNm+$aUFJ~+<$0H=%F6s$;y*c0!AKSUjjac~9=Z`|<=#{+P=>d))}}WR}^P zv2lvL0Guk%fJ^9MJAt@Td9q3#flK8c+(8fXS8LZ8>vg^Hd$~S~@$c01kh|m#+$~SQ z^YqZ37c9Q0Jb6j(z{~Ok?4yTzi0>#*-jzGBU+%#t^w2JdpDIs2lSkllc>+$^oxA+< zy^jH(GnJoZ-}f5RatBV6d$5cirnB7QMaq+lJ#q)`m3#06 zJ&f<9#ix`fPs<(HDNn%1^spTAz25!AKIf@EmwYDo;B$Ezoc$-c+s{Ia=djGq9F243 z4xA_VU>QBkU%uaGm)qwo(&v(kHNOG7yI3J z0&Q=-yL4p#g5%GTf9BcmQp~g4_J5Y&3H!%j64Hw`^((YXTL#5yq#rjm-4E|n+XBYIdCXsi2bJMw`%1|P~3F!@h8rP=i# z@nn|Sv7K>>ya1ePgH7orO8Y@h>7{I&VhSE>ipVE&4?dNr!6Sc#V@!`!M0}KGc2}42 zm^=oL%ZtF4J*-zWQV($}%k27%af{r8TWvs_{s_|bS2?9Sel$|^hjRaJzQ<`;G#xge z&wzX64%{pE;0b!@-6t(Rr963B?!ZoY0`}5FU%O@TZRN>6xdZRW(_r-1a{C(MaV)d% z@QqIH!13|~oJ|ko%l8|vLi?OK`do6Z+=KJv8L*u`>NwQm4&})`atH2}d+-~2Xivl^ zlqXNhWAKzb4L+lX<1NI`l_!VfG5A8B1{WO4U6T+Ov#gC=D0g6q+=Hv=VLB1lC{NbP z9at~-;5K@whj_d4lfa5}SlUBv5I)dT5tp79Urh{6-#wC*&D0^{2V>m+x~Z z{2YFkeS=|)ERq_~IDo=yE=wS)w`=m|2S5$s?Z^IA! z-iCbdHOTi$6Z-3J^>or;2%re`P z8C&Er*ecI}U5qj9OAU>)*c}(uW<8lvn)5G}k{buf*ea?A(E_p%jz>9JZ_R_=nZdrU= zd9qLLz&mmeKBk9yPb_|_Jo!xSz~^!gPW*<;FZ&&LfyI+pX5Z);6S)H?%RM-U9>zD< z;(5xGMREtumwT{^9_k@psyw+&9)Zi{9^6I`^$>4Yp4=gK;7+**57I-uLlz%ao;)IV z;8D2;&(cFZ#NEo1=j0ANFZbY0dZ^c9aj){^Ex7}4%RTsz9_l@^__6Zj6S)JQ$~`#Y zZ{;pOZ}CKy+4^oQkUMaa+=H{}VSI%a&rzP7D|g^Lxd)ffLp{Wm%9B-c2QHO+a6LWL zYp}Rcd9q3Fz-GAz+v%Ym;tu7>J#q)`m3#0mJ=8 zWp=l+F(dcjOdEJ40y*-xUpo>(!BHDc!RPWcSk#$2 zrHJRV%+3Xj3*;Uwwt-U$>H0gbO(_b_*nlYo&&p%4Tb>3}-MM3A%rZNgG)8gS6bc<&wPiEv1I8*My1@ur4ak28`LU{z1$P=)h9~g8|7*696cNp zB0jG?c|q>Li*gU%p@-?bYjMBwnv$~`zp z5B2U@d|!F;f!u))M;pDo@UmJ8-t#gXid> zUcPtq=6gq4zW0Y=y3cDq$P01@UX*+A7Cp>gzR#EE`#yqv-+zGVzODHn`{WM1BTv9r z^sq*x{+{(847P^=BY6Qh&IYa#kj0l?TO;zlw>sY^==1$%{rkQb_=obu_xF9r0Xk5H z4d`j$5_t?($_v36{{y#Z*(^<;gC&1JB4kIN=JXGrQ&W7EffE9iJNuXI9PvkN9RGtP;{e8|~_IUZU#hol`BfI1dJR|qu zb$S@z4U2CoPxiWp%f zZdrU=d9qI)fp_E{d`u7Zo>=@;dGeXufzRb0oOdmExffYHpJjGTXj~w7V6ohT+v#C^ zJ1pL*Jh@9AfxG1%JWLPuj#zwDdGeS%0*}iR@CrSw?})D|PhOM9;B|Q#yz>up*T1_K z_p_{x9FWK0pgavey`Ed|nZ?gp)|D;6$RlvF+=H{}VSI%a&rzP7 zD|g^Lxd&V6q23mYw<=F=lRI#`+=CbCq248nFDp-8kw@TFxd-piL%q8e_bX2h$YXF& zo(7-(7jovw75ihvQ!>}W%4w5fgbiNh%YKnUXn-PWw{4?>0vr=S$tc0vQHj?cjO*? zOb_**So~CZ@|ipapUcx=Lr-pdB5q`vJ)vN1l1E^(+=DymVSKwR-mN^@E|0(txd)HZ zL%m}bA6K6IM()59at~gihkA&wDo*4yhkA$)D^DJgJMgI7gJnU2K;S5pSiHj)(IOhKCo2&t3Or5Ak#5$sxH1U)aEP39{;cdaY-p zpvDHYC|E0ZV7=Uf+vs78h_@?G?vNLNJ8j^)1WEtTuZ{8henJxyFwF+cAvj&`!5Q)l z*iH}U|A;%3C-=xbxK~~X-WtGXhimSLZ?nwapKa`uJMfO&gOBK;MG-$%o_r#A;8VE= z~Z@R@ZlqWOt2%IVR;CyYzC%4EQxK-}K{q#`pfW-%uClARzcvzkWd+1@m zi?~;L@|HXXZ_Cr*;z2Hl>~#^u6)dysTE-=E4_3-E;8}X;XNbF%C(p?}cwSxzrtanT zGsY~lE4Ic+?!a+!4<_``E{G>9Pfn3LaH`ycMf6Y)@qFdU1@Z#0SY8BPq=)t4lEs&m zC$GpIcvbGfJM=KVyB7B=PY%cy?EUIcd1Lx1VA_>A)8 zS-Atd0x|`=O|Ckl{;{r zJOLNeLwh2wP@Y^OkHAW~2UpU=_*Pk5qdZwFkHC6)0=Cn`_z-s}PwtUN;9hwG-lB(k zh;J)T_Q_-Ljyw%sdXT$5y`98^w&#B;N*>R6? ziQIveau2Shhkk~5z4By(JOUf#9^6h3^>$diQ+aZi+=0909y~%1^$;Ibo;)UZ;BmPJ zuhK)kYZhNup1dJ<;7xe~KBtG}Fl6xy<;jcp%BDn{f=wbc}{(`MLHlRJh@A_L(Blm)$-pD_5H_Ef;7o(r{ z-(}<2Jv=@TzXgSQ;JbbkD&IHxVt$)7|743i0$b%C+(QrTf_Sg;?w5P;1U=L{ zY4IuL$tf%S3^ZlQ;HLcCRZa+^E?x63_vfF9~0KBzo-NFITQ&Lt5aRGvH}kHN$8G&n>L^$@>Mo_s0y;466=-14t+I@2TjBg9)- zX78mnZj(E3yWE54=%HN@pI4r|Aa~$Jxd;2`p&sHp%9D5H5!f&H;FQU^?TL6Q%j`Qv zV_F`8)8rnULl5JdYw zLp{U?l_w9$WALyI_HE4oW!V%2n+HZZS_%crZNQNcxI!L-E9D7zk{((H@hRoW({cxP z$~_qU8@W9O@i>;*ce_R>ci?!r2dC4+93q~fJeiTl;7oZMTtW|PAmU2p$tt-6m&!f3 zmmbEq&*J^clLzDuJSg|zMS7@r$>Ph(lUL*pyedz?iBs7w*`v+^izl(n_OixA?!d`% z50=ow_)0AU2)r-%VCvt@?Jta3X5WGsBe?^|$rErUJ&bRb#j}+s3*`|wNAAH=dYC`N zWy+J~atAJwdvGm1)I+>pd9p$7z(%7gFtQ_7R4i2El?<-F}kVoJ{xd&7K)@$nnVwTzZV2tDuI8N@t3_VOI;+e{m zv*ZytTkgS9dZ>rEOnI_g9)XMG9$ZBa^$^!6Pu9vESTFbBPI{=f%i`V2lkIW`cE~+= zoF3|ZWAO>)$&+#io|1bonwHz1h{v(a_D4o1ci?!r2dC4+_z=%fp3KM{I8*MybM#OT z@p=W-7&c!Vn=p&sI5mf8E3j0@!vSR(h}ReGp*&Eo6IlQ-lsc+&aJ&t?#|4u9zgV*;TN4G- zY(PzLy4-;?{5;j`5h?7NCD9=(ho51P9~}9F%)- z%KweO31dV&m1TB>ZcNJ^I8E-s1@uraWBq6*`;vVdX`CgGz}a#SE~AHf_?%*WF1b)1 zgC+6=JU|cIL&OJ_ClARZ@UYy2UGy+M#AlQz&&nOxEl)uAjO~&=-aCvV6-c+&=((!LKN&t7s$`?7ro1Y50FxvpqYHC}^|+ zHNhsi1DoX;(0{O( zP)w@%RSg>gVj9w0VMs;vF6F_GDN{N8&DIR zE_dJzxd$8Rp>3KhZdRUbkvp(eo(3n4%VdVzvTHlSs|MDD@KHgLUwH2n*# z8P*FFG~0lhV2j*=t?~@${zbM;cD+D6o@KVRF~)KSPLO+W0X?)0;$r2=g>na$$UWFV z5A_f?Do-}a9oQ`Q;68e&hj_p8(@56V4wmLBRM?pB^WC->lac>)%Bwo7&^jCelF z>{%}30=Wl^ZQyzVdC6dNST9iU$_6Y6F!e9dJ!#JM;zN^$iCl(Zy+A>u4X6n=$sO1% z_uzSYn8yniUsRsFBzNFtc^a(wmpPBw^`h3|dX}}3YvmqXZ-Y(gz7HUgeL-l~X7*** z;2+96S#b=o+y=BLxI*s0m2wXrqlXqnd|Y|*8@U5d$US(89_k^!tUP%|?!l|_Lh#ab zE{VdCEmXem_{;a5vl#znPJ`W1V!R@c!K*gdlD|YL`ggeGFO5uSs%n$nOKSsK6#TBg zdx#I3Zv*Oq3*-(gmM7qLdf1kx|J05KZ9qM6y8K(;4!FZUXQw`w+$HzmZg~REn!zQJ zUGJ+bUdl3?KjSia3@(=^p#OJs>lIl%pJg_G#szW*7Rx=jj2?On;^oSdE94$rX#&;Uaij8NlRO5SKCe7^LGHkdat}VF zhw(kK__6Zj6S)JQ$~`#s-(!o0Z>B7s#xh&-#_4ho&alB+rjK%C7F#BqccI{>4QLs# zNAAF0xd)%n!<44bw}$%~7!CI|aGdvS_s!4wzPTjd z-`vA=Pv*4S@sn|i+<{Z&9$Y{V?TNTpd2*pV0!!o`TuBf0&Rwwk&uzf+1HbE=Qu2Mn zYGT{5$-~<;@VowY>?)h?8qEh;E04f>xd+?nVgB-cGi$!Td71BT++w;rG#}(1c?|BA zr@<4m*{`$575TpLySCNt6SM)#9b7B_*5825_cv}&+H{}dwA&es@wD85opKLer-$Wt z!{VFDlRa_|_R2Hh!k@5Rvd7vzU)lZOHemk1Tk;6JE%)F9dKe!*r-YwnTY6)u+<|3s z53Zz#daEq1QJ$=o$6&n;+_ymb7;FxEc@*5S0aFUzm3y$?2CLaac{zvM-f;a11+Q#C zO)&K{x+l%8=C#y^CO3YMHN#f>cWo>%k249W3AkQ^>Pnhpoj4xzNkETN$$YQau436hkA(nl_v+}4jhzw zaOa=PZO>g6?`ByW*)Dfrhuni#>0x}=EWWNhc|#t7H{~82poe;h2bCx9$s_Q-+=D~( zP!I77<;j=w2z({?V8Q&{`9nO3Wp+)?n8;&rvOEFT(?kDku((lqvPtg1W_bc0q=$Nk zEIzC}c|`8Oqw)morH6XAEWWKg*(Z;{J8};`qlb1u{9Ji*NFISNna$$UV4} z9_lT#c)9ZA3b_MU%00M~9_sC~c(?LoyF3Ov)T zeBUXN@4F%LeKTvmZy^1?-zBp6SN0r_4d`d!5_tqx%01XY4{JoezpRV?dPn`2yeoHL zzdQk7(ZiPafW5Ee;PAUk!0-AS@%g^0ljR=7yGllXL!bH&Y#V{W#s@}n2ab~`U?n|F zXO+cEl_!_U9k^VcfQRUz9^%8wlSkwZJSz9#d3xwCRd&R^R7c?CGPwhn%M-AX9>$0B z?1##ekK{4t)Xz z5szb;-34THatDr=d$5rn)`upGo0TV9fN&Vw(?}3JOb~?J@|+o>LGrt zJo!W(gHPpY@MLN3{2@NYGQ0j}JS}%%r`&^&>0x|NEPkpy`AqJ>=W-8@|AgbqF8A2t z2`sbir_swJaH8CUh4e5!#B-D<=gK2+p4@}A^iU6Rz4GK*xd+$Fi@=65PG`}`fgR#T zmf82f#wNJ~o8<|3j2_kp#K)Bg<8|(;l-v^LAKj#tX zj_miqDA;QQ_7LDcc?9m4d+-E3w9HA1Pbp8HmPcTx+=G|tq23jXuPRSolY8*GJOdV% zvqiI4UJ=h>nLWX4oGXvOd2$afqKEM;FP!;=4@ya^`Xx3+!XZ{*o!%X7DuFWD~lV23;d zUZRIROTKUNacy?5pbc2=U@Z6G1bGI;na${Hk|!-br963B?!ZpD2d~jX|3rLUdGdzb zgEwv9_W}@{qSzfHJtLd6)UpOU7PA3U3a*elaHZUXr|4mf-}gImuw*W4Ns(9NF?dy; z0ZTv4-NGO)W0_r*G?vR9xJd57E_#?h#AlQz&&ngPTb_Ue^swe49#o#ZCy&7U@&uf) zh|`%pM)MX=WSJfN7z^YPI7#lone;H7vn-yiJXt7r;2gOJ%juyW;zi1ni{%cikbAI} z9_k^kSDsueci?)t2Y1s$y>^Q`lqdJdBXF9;vv+;;k&R zZ!nD8m3y#WUI?!G582PMSC$diu*}YrjJ0wH*2_J( zn;xdK-Qo`A$vtuh?v*Ft1A3TF#1EAxAIW3zu{;f~ugqN^8Z2&PnH`@So8%5`mKTEa zzhJ%W@>^hWG0W@;6yrj<154x{tf7bbyI}p`qWT4SN$$YQ@&v^DZLGg!`&qv4yD8so z@8z)p>jSu0UI13e3&Gv=&_CNP?ogiGBX{6lxd%_s!~C7J_>}VGX}JSC_1`u%bserHA>uV)J`d^G{xr$KZ7vcx(V!@#SmB1}Io*1NZR8RdNs3 z$cw;lmU2r`G_r?Be1c_d$PsuZ2@{8Op4C2WwvptJ(irj%y(lT2FJ@2@Buyam{s;UHTqn#R_?%hxd*%GVSI?sC{Lc1JFr{s!5(_3hqzaH@|HXT zZ_7RSkRIwiviPy`@c((Fnq1=IU zgVo&k0p!4+XU%Z!2L%UhKuz$FJO&Tjz?zWK6|dDqL75Gx36{%aaFGqH33cK%WSJ*bn+M+ zFVBFx=wbhac(?LoyF3Ovog0n;0D`w`-4EVDa9jML=~oFVsM89hvMxy6f=Cl|{dSRwadBR$k>vbb4!vPJH| zR(S&6p@(_BYjMBw z$>KRIvwFt4@(7$KPrz05Fr|oVlqYND5m+zx;4XS-8N|DlC)?!_*dh1eNqVS<_>}VG zX?X;8$~}0O9_k_PSDqY@$Kaqm0cUN=?J;9Pnb2jY3klST3foGd%!7~CpPz$^5y?jXLZJb6v-!0U1kPH)L=PsB4=X78afX5DfeJ0J+vp{ zGUdr~xdRu;J-CG)>LK2$Jh@FCgWKf^*hLTXhxm;0t z!F%*jukXLHExrwyPVlZg2K(g+m^qWXEkZn#Wp;JVI7{xp*>VrI)5G`>cPLNpkvnj& z+=D0Sp&sH>%9E$%4(ybB@Gd>nL)@=CIUtX~LAeKC&_lhK7Qa%SO#QcPqllFI4~+%% zP!I7W<;g@Ifs^GPoJ9}y5YJYgER;KNj@*Og^ic2ne(%i|+tzQ@wx8T4ci?up2hY*N zbRs^lJb6Lxz>9JZ_R&K<%r^jPm4J zxdXf99=t;j_3m2SuRJ**ci^DhgRkhJUh1s%D-5>&fsx#S`J`tK5Uf=%F6s z+=EBxVg3*wRh~R1ci?fk2QSb=J;WE4Cojnzcv*R2T#$%{GGPAQ+cvW9)V}%9=uKu^=?>vQ+cvS?!aET2UFW~+l4X9Y};;(0x|B7QaxQd?|O}E4c^f?#OKy#Pe9zMi$8(IA89;dU_b&T8q~!Pd3Os*eK6{ zee|$BLwrYh@~+&0{c;bc|5EOBBA&)FyFz1}E_dJzxd$8QVLA~vDo-}aBd}TS!CmxF z5Akm0$#!`JcE~+=gdXZ4KB_!7-@nO!3=I(Y<+mnUEmJ@jkD z^OYwT$YZcro`4K9CoH59MjFY!~M*d%dgN z;zca8{gH98+<_Hx5ALRi_H4JfLwRzKJOcO1J$Q~D>f!k5v5u$6Cvpcqm3wf)-^pDL z_?!#+T=Jsa?h>)9^70J0V>jz%_tV}!XCgn#?!Gb>$Q?LI?!j5~FrE0Eo&2mea+f>? zcgqv7=}$PmZ2v^u%rbi`n6X9f!B%-8I6x0ij36FVp1db_;C*=lE@{slAL2@u*{|yw ztK<>5RPMpG^e}&j*DFsp$Rn^(?!le(P;ZyTyOk%~?F2AnN|kK`VF zYy)dTGW%bviGrCnpe8s=?!npeB5=oF&7D@nJ6UGypmCSnfxG1%Ty}uLKn_p6rr)@Qe+%1TRtiVJ^W- z*=3Kd<7{m$$wIjU=g2*{iXO&@51MELmONM>_uwQOY>a)Bvwxjq?8}Z31>H8FCU{Qn z!SnJ$@az$`Y2ipk#N8~jdd72d2cDOE@HRb6X`jV+lqc`XJ=kx9P3ZvTz)?==z{m(w zC^%>XrW8CRkHN$840x9wjtmj^D^Cu{9XKfW;J82K9A<)BeEcf69c_A1d z%WWCN6If<cPlJc(VSI=WD^DJgJMgI7gBR$b#~{9_Jb6j(z{_$EKA?wsh#x9XK9W1|vD}0H z)N4!L;)yJ?C2uT{$KWJ+0xqP7C6Bm7d9qXsMZr89u;jraxd-Rl zU^P#E0BQf*ta&VZ?+Xe#Y(PzLkKBWM<%M8DC+9JH?1Xp{%j~TM#zY>0ljR9GlOE=A zmc_G`Cky2R}Po9%I@VwlEJ@ilyaj){^Ex7}4%RTsv9_k@}t~@y;kH8ml4^HW3 zKg%9zBc94K+glscatBV6d$5Qe#+UCqqVYNN^||B%c?1^A6L1whtbd4WlqYND5m+xz zz;=45hqyy|a*y1Dd*vB$fFAa``MzxwpEIb>CGW{Scwe3Y8~!erL-q(AaU;v@=^ta0 z+=0z<5ALRi<c4$(uuM*Ko~@})cmU&+&8`T5*-LA;1%b`9OQSnj|Ic>?aDhvkQO zxAJ7Wya4R5!S?Vyl%BuGJ$%o|!CeXky*6ME58je{@U}byuD!@9&8|s^*R!mRY><1f z(FPmiHOj!>=NQ8|Yrb!K#s>}BfGGv<$vt>qo(A_^&27_s--L|M*~`ze_hT6M$zyQ8 zJPqEZhjkutzw+dO+<}8~4?d@dzLxJBl=FS7|B#LUg{FsmDfi$jc^a(x2f6Kucqz;5 zjNG_P?!e`84>r=n{54tJtUTEw_h73$4c?%K_C$PBd9p|Dz+Slr@6*Hh9$5TPdGe7w z1|Q24u>2b5FBw@S5HDhxt%JtJ@))d;r@?*nFrA3^D^DJf$KXME0zRRKbrCCQyh#OgE`!ZvbJO-QPY49vPOef-Q<;ipM2s|(M;9YuXPsIJolLPVy z9F%+T89mfP{9Ji*NFIYP^M`o1@?^W*fgN%W zo}`EAM0`ql^0YhxJLMj{P7n2NSbS4?vPT|)y>buUqlbFGduR6lKi`?1?>ku0f9|V4 zkq_h!d?@$eD|+Z>sefea6$aaHf|1;T7m~D{Z8Z*cpWJ?D%qp1?A@CSvq*2TqiGFhdXHLp)P? za+chKv*j6ZA3e+;;{D2#2jmVsDEHt~dKlj`i=Qh`4#{Kig**Yz{bSBwc0Y~yJj?9O zAI1yv7`!M?z@;~H>n*c*Im_%jUE>OQ46c-?!ISi`UqO6IdGfS820P_x@CiNCL;O^E z@|ipapUczW{eQyg%%00Vu=pX%>|1izNMe|ijjU&NaktmjpKq=^_x+sbIp_WV|9j7q zkS9r}@y%OwM@*B^VPRMhlQ}PnizFrON=j1o8l`fE%N>`CjnD);WX`htexKp}7 zeoeYWe#5li&iY|rmEZW9bb6APju;CBN~gbe{ZBIweo}U0b5% zBX$aVs+Hl*0JuUrPo5^7lINQC(>V|JeEE&5q$|h^0K5CA=)WGV2^L%hxF*Qgr1RuA zrBm{4(|(M@uS6LUuaE*El#be?=%x=6lc+OPR8v~x!7 z8lROekk3h%$d?Cgxs;Ffy|AxX8Q#r-`=krxH>6AC8^1TU-Vp4YR)%LH;9JrO`L=XQ z9yRUfkM=|PjUP!T+TPN?UV5K@+U#BxSiaM28RHlVE=m{3 z)1^z~HKzTsp7vV#jT@y4|@(I(v9_^Fz8+S@4N+;w+(kXeFX=p7G*Gnhl2I-XCWZKuG{j&VV8>JKSCh3&C-?XpS z2K#{g#s{Sn@*(MzT)a7UJgp}kgq<3{NMd7X3>dBn88*P(r1e&Ywy3HdGQlsx&?*!56=J;loKYy+H1C*-Np zDS3`*zg#L|&z0YJo^(Qu(zy4@%li#>mx<#i8H%aHoFH5K7eWrcAr_E~ew0R1jHaqFlW>Inmw{$|@Bb}0uoA&iiz&wNU>}g*_@H!wd`P-P9y0Cg(Y`6a@h#~*`L=YCJo!&-I?MOB1=v%p z4CfVaDxD`!l`fJ?rv3d9?OF00&z4TebEJ#p^`?D2+8g9IZjvsLUzRSBPnq`fNBgw= z#$D10`HXZ*?lbMzAMH2fH}03NAYYZPCO6z2yM3;Ny~@h)&L6y5I!}I4x=7w>+RtAL z>|OF3@0L!;d!$oxhiN~Zw2#Ygd_p=QpOj9?=S=&0UoSZ^x-s47H6O+oq*L6F}Q+AkN{ugPzGN;)B*mM)TeP5b$yeMNrbKIw$~ zhIEm9)3mR53-)dKjfbTR17}a$yZGKdVR3p zkl(mpIwfBP>@6Tg>tEWtrvbMjtY9w+d2S)^lP-|=OP9z4ru`f~Z8oB>bp}UH_jS#O z@t|~pd_%fKPDaOWF|;RJ8IDZgf^?odMLH$VH0{?!3HB`cjb}?I&mjT@yC@;d1vx!JToGSS{Hzwr*~Jb9;dO5SVQk8dCB{qh^P zNhjn3(kb~()4tvS?CbIy4@&3BH>8Wke`V{Td@qoPJ;}=O%oUtS7s!*POXL>Qe*2`o zOMc_s(s}Y8=_2`*X}?@(pO)XaOFAK+kxt3?O#As8fqh?o;|J0S`7P-pdGW)s^GAD$ zmErf5;2P;X`8nw#xxuub&XurN$#1+`Iw8L(T_WEx?U&2nXFmGe|1UEiF%wdQGTj)j zl+Ke^NvGr%(|)_Yi|yy0wkP8e={)(qbdg;A>#^H4?devAXY}A1(g}H{bV`2Cv>#tB z?4|M>*GX59mq}NWn@#&?OtiPlZ@fb~Pu?kABzKth`w{Kq@*AI!PRJ*vQ}RXAemXC~ zzAV3SuXKTYMY=@3YufLBwC~ApJR+SZ-f)mM)TKoA&cZ zdyf3ZmC||gTmEX8gIw7x< zE|T|}_S;MG1DGCw_YdS5(g}H{bV^=q+K+D^+S#vmjoYO2h^ za<6ord__7X51RJ%zSbGwIKN9Y|Hd`adGd48DS54FKb_qdkVz5X{E;t6C*;?qQ}Q*_ zzTVeM#9V4WE7gUC*f3jODvs%iDN| zbVA-KT_T?|?YFaT*yrUpz95~FUzaYC-!kp%jlzB?zwsmKg#1`KB~O`X+e`U6D}_DP z%JAe3Tp^v1r%9K{2Tl9&SzjN&r1Q!|a9+AVo+Mo)_n7wE8SRVm8()%6$X8AKd@+wI zaBc>8tR?5Z&2(ZcolXSLGVS-B*|6uxZ(J#zkmpLLuylcxQ;WE(cu?few8S7<>)|2s8={$LxbV}Z5 z+OI#_`{g%olg^V5NT=kJrhUCm*ssZNd`db`J}sS+`%U|Lw6DrPr`@bSr&)@YNI2F@yUjlGnB^RX&vh3C zV`a!60X{38kk3h{9__308())7$Ztxg>6AQR+Sj9fU4G+1={)&{bV{BveeC+9J=4n2Hx#%eohQ$dPRR>Q z`|&M=y-0rJYUzahtaM7=X4=W;~mlod8c$rzGT|hqkUO^<6h|k`HFOr{K&N5 z|7bs!-#GVf+jbIT>2xBv*0diV?WOV?*GVVjWzs2my=h;s{R8>jVSw8w`G|C$d{jCm zziHanJBW4;sa@lC=>qvMfH#>#CRWd|H6F}L+SjA~vi!yyr4#Zd>6F}N+Sj9f zKz`$c(s}YB>6F}Q+Sh9?;YbK@za{UGPRKi@Q*yg$U+)&|+wvO^OXtaVq*HS4JEHYK z+sd#WzmI#1p%osxS^`{|^8MSkNx={)%j z>6BcVAA5&Sd#;tC*L(0h={$M9bV_bE?Z-!ZyZpvGq!aQ^>6E;9(%A7WUyHjwfZGeX zUOFK+NT=i`(|&wxXNk3iH|^jW=>qvV=_2`xX}|yV!G1%2<9_Lcd{sInulUBX(^(I@ z!OGAh19+u$LS7|ZNj_!TuRq$S#;ZN$Gaw5V0bDZVYUu*` zS-{Sn6p!9vHHXSIS@0NOO>%Cs>C_k+HAiz3A=VVE=4iPl3)TXxNp6%*$m^t2@)6U1 zZO}d{zj23jN~qE~(s}YO z=_2`tXvzO&wcrIqVfy zhV2_%FP)Mb09%U`t>0=(X2^}u3ihIqONP8pIw9|uE|Tw<_H%d__C5KHN2C+-ed!{( zx?=1SrTwgxp`T0eV(EmuM7l`sHSO0u?JM#d_em$@H>8W?dEYj6e6;6V8NRCmS4pSj z1pt=JzyyljMO!ihCre#yo95J!x{Z@0hyo6Y=7GOmDLbQO6Cb6%clJtZiKx_e&fy3dGZ$NlziN@uXh6WN%@UC zrSs(1q$|m5zRTvX{5FX8S}Vi42RBL=$m;+s(IFGPX1qF7UZO0x0&t0v`=krxHvrUZ zn@CYH&(=lTL|2vP^_O*?H{K|nkT*%EWcCgoKA~Yl(*TZh@zw9c9WcN-B(IT9$ZMrja))WZ_GurN-}r=dLOv;-l6y@1dbBUfZ+uBQC0~}V zBKOR;EAT3}2A{UC)SBhYzqG`IK}*J}sS+ubB4r zc-(oY4f}PIwe=kx4j~D^H4j9aA>@?Pnb++o^}kM?o-jZa9Y=rq83Ge=u~qvOU^OYK-*3+?{Wi*iX93P5d9idtULsv2?=mrlqH(kXd^XU}4e(5~WZs$&XF@ zdb#hz{zzat$$9C7JV`nw&oJ%l(Vi*4aY;HQ&yp^YTTJ`q!uh?S`8OVtPRKW8 z$ZtrelbLmv4iXxA98p z0(q5mi9D;?)?dlpmOX8MRc9L~=FS0}KXSKpLOw5@k_S!u`J;V9e&ZqOgnUyvHGYY0 z`+85?ztYq8AJw=7cOL-fkGx(wA#ac_k=bu0rn9^}XJh%!v1N>0jo?b@lss3unq2X$ zt%qv29%xUqGF)MUi_!^sx^zljXxc9q+Kc2ju9i;7&q^1`^`?XE1$Kk{#w(=@#@*6+@_Ff$eAl#}&Zq6EjP2Z0yT&8ZdGdYf)OfM2`SKI0 zJnTtUhAU-oBAt*YOQ+J;} zx!ts%PTGg%H$EbrkdI0i$!ARadS_vuli#>oIw7BzPRV_y{ru5>Lw@6a>4bb$x=6ll z+K;an%jt@in{l6XLViO!B`^4)vD@`R*o&+TZ@|IT(gpIf(pBW94_dwQ6X~it{FVmb z@rArlI!|6CosyTC_Vd^IDxNF@tVcd2ohP4`PRWC&eLar9b#Y}0=J_F;baYyOSfq*L+%>1y)sAGY;ZK9kYjV`X?h2X2*4$a|$z@(I&^ ze6&x>Z`>)JkYAH7l6y@1`Fq;lPk6<4Q&(`tx1qwtbR~JR)2{d%B%Q-0%H(kc12bTzs0xv}e=_Bt!W6%%;9bVA-BoswHj z`|;7mC=bS3$WX@5RC3;Ue>#@*5d@_Fe>@=epe-YwX-mB> zfGf1tXDGUV%&yQ{@$)(jEI1Eviy>c-PROrIr{p2ieoATIl;8N4bV9x@ofmDObQQVLw7;^Wy-t4P_0k3M1^{!|GJ&G!AK4tXlz$kbFrx zAzzkG$-}1o9MZlczwuq^gnUmrB~M;Hb`A@$r&t-*Jvfyvkf%ylk(*5WIi&rv{Kgxl z6Y?hMl)T%tpHA9)s4d?&uV&%7fUDPCDJLm-n6eryFq^A zmC||gD(RHG&a|(0?MLth2f*!xJRqGXUzbkFcTM|xwC~ApJR)5n-6D!N@v+;d*;a;oGH_lxB~OyBCbyXO zefQDcCBN}*>4dyTIwg0Q_R~rGxctT^qzmMe(v{?^ru}lc2K!C`7LJBMdl^E|4cnm&o%>`|;79FTZh>bV6Prosw6W_VZT{yFq^AmC^}$m2{E3 z)3iV5?!)@ruk~x(CY_KENT+0OAK^7&3)d`>OoL*QE30H>Hc@+ot{ahGE~4-}tU{LcS+mBG37WvFooA_FOB&?~=ju zq!aRd=_0w#v>zYsW%3&@m(G({NEgYCrhPry>*P0HFP)G#NT=i-ru}lEy;FYU7U_h% zOFAVVG41QoJ}SR)hjf8_T)ISFRzG&REQh_q%JBPAaJ_Va+#p>^?lA3pYN35xe&Z9; z3HhXSN**-rr<3*#`HhF96Y@>zB6<4rHl5|C^fO@3v@*Q)0GFgw@+`pK|56+=BX}3j zf};SByyOn)gnV4ONUmxaJ4V_ItPFR7;Dyo!@*?Rf@;=l4j7xjJ{Kjq4Dfs|kQ%X^I z!LBKKvTLTC6-+@Pr<9yZC*-NpMRJvCzpc?;AiwcK={$LnbV^=n+OG@RtK>IcEuD~G zlrEB+P5bfD-Y&oK4(WuvQ#vIdFzv^85cVPYjoYOY@?q(eeA=|H*9H5G{KjXc6Y@Ff zlsstK*Q0$ye&ZqOgnUyvCFfS!nlE2Xnr&q`mx1%rdGaLbB6*Ezzg%dqmEX8gI!|6F zoszeh_S3l)_BQ#Ao23)-cIlMdX4==|FIsQvm~MPaIw9YdPRVbX_Vv~;!xLnH+Znk@ zIw8L-os##M_Vqaa1DYP=gVK5OA?YHy+q7RUw9m_Ld_g)Pzb>7UubcMc8-#sBe&ZqO zJo%<{k$m5@AKwGmZ^>^wDxHuYN|(qBK4j~?e2!lTdy$plc@el;Iw3zRT_mqG?Z-!Z zmHfu5rSs$$rHkZ^rhUDq?FEJHY*M?%o2B#QEz(8uDbs#@v`@=#+$Eim&q$}_H%bV5EOos#=a z`{|^8Res}Z(gpIH(k1fz50BkGt6(p%GMtgX3#AkCBIzReMbm!%*1%pXzj32X)}Ih zNTULnkb43DZJ^0#V?h&~loG%u$n$`p2F-;4XN-J7y8M8ReohWrB+)$~w-Wzt@ZRU? z?Es$1{nUhGoe&H)18jp2ZtzXL=)A2E9RNne+TD`)Z^LH%-wMD>>M*(5jb=h_H41E4 zgZ~}CgxrU`_e18wzgmFfo|vmT<|cST?!%1i0wD3@&{9_0sgYb1(l^1$JLz2$R=qk;Z zahG%w`fE{!c_h&t%p=XS0GAfISGq**18@b}@eYa+Jg|e&`3~1EYhD7-E{XoAU3s4; z-39PN)E&ntplGZ)Mu9K$X)HhXrR_Gb<}iS5XEwq(3T`Maau6<7M?XCUvL>Ot0YC8W zqIZ|K6S~Rn?+4fO7l4C}79q8Gfke0*FE&y!nbQ*8j}nA|R% zCwEJicV))@djNCbM$MulR`fhc-UjDo1B2$RzYBUG8G8Gz=y`e{Nrv7&D{AoGF)a_6 z_XY1Q&+-L$o;+TTDEAGTWpZ9RPo5`To@K_q4`snDvnaKq=SlLeb(2l+4D&XS)ZUIA z&P}@t;Nm7PmYz*cu-{|%?{~3QxdRT2oYZZye6(g$Dtey8+QGI+?;5MnK$5q->C;

&8fdCii3J}k{(9p2XUDsNW_`_AutORT5ci1U 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 u(5 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

&8fdCii3J}k{(9p2XUDsNW_`_AutORT5ci1U zT?WE|rUmh@OMeb=&qeWJ&$a_e&*wkmy&ED~3t&S8iUyjW`2n~k*-6~qC_W@{1I@|& zxYUwVU%)F-5SNn>srfn1%T_zF}Z=});~Sd2ms^D zF}Z=}+DftDU6p<|fM+wH?4@h%}d8ubCtuN=q?G&NX;ThJ%~kCp?ufu>40 zWX%Qed>K%t2Wg-w^($IC&?tlpM_f(>e>mFl{TEuUd zV^{JGuanH^wuG6J(`=NUeVy?lbg<9Q!CX+e_BOzNHK?OV`lVkDI$y%C2E`e!2Bl(d z<1!d&Y<*!|6YG1J@F%0V`a5vi3npc41}h)amltlC=Lr6L2K7BoevQXsPAS{PoOP57 zp%RoEentG4t{3C(tj8=V%(HCe4q6!9Ael0?f~j0*4=Q0{q+-tDavsvy`og#-*4K;h zo1!>Zm>2O!g}GWkkRL(F_zY^L0Hq6~ER+wSFv?9{;uSPf!sI0y;p{w0H?#V0m#~E^ zvq(*xs9EC&KzotK)>~#GkO`^utf3F~+C{4Dm8EBm{{arpf6!*7w$V=V!qudinKioE zyxc>?{YYc$%`!uOd@S2b)r3y=OJ%{f`Tv!2Z&`ntHL9{3y-+ogHEYOF?PraxF2>Iq z%B7z*mV@!LhK@-5tRYi#IBSU6oW&;mT%@t}g>ffYUr)lXjpD+?1-Cps;Vrh^#F=}z z+%M1}qKjsYcUSN_Zp9aKnUx*yW{v0AQ#Y2zE5xl*yvsm1Ydk>wuaw4oO5E2`d^k+I zS!2U1o+Ma;{Tqo$-12k`@s^}1amPmSA&HwcMv+sSlk)*wQV!&1jk8|%Og94*j$D=2URF&_i?G6QN(jYYFYjd%PlH~^qB zJC4$Ma?8^tXxI_@2mmK!K%U9X8ZQxUK^<}QC)gPM(#GTNF3b+_&Z@oZ~=2vAo&CgmEGRAm98lHir!vo5Mz# zD17tNYjwlsCoWU{MIM4c8e3l&x7GTNA^h|xu9VH;tN*a(`+wK2xJW2l;*iTXzngg* zljZ6MVo*6Q-~1+E39wufKuj&i<(uDB>@FXx4wiygnL#z9-m;qCK7S`Z0r6D^)gx+t zb}Rf}H|J_X{Qeu>l$@-Y?X{%>-o@EluN$KIjc262(C#-g&F?rszWHT#q8l>eh<fmG$sSIi+&P?#dcJ9(fUY<@>t|r>TXa0{_br!?q)|niFy{;REsM|#_bpN} zdkFXqX>5IATodc70pM`N#nrzRr@ch`mbtt>)tp9fyA0}1oNkw*lqrn68_w`#!W&BZsmTebjClnwcep*q;Vj}{|9ji0$qGC(wMgBR_O33IGYL6gxF&v zgg;vtWy~5HLxs+>*u?9A#>8sGlxK4h(B2W;eSYhHUaNpHxWdI1v7dm9TjUT>T4ejI zi6wydFq(CR9+zRT@Vp6&o(pn$2CZjS-4Xd{V^;G*s0!CjMG^9(h1=D=E3+l0+7+Ic z*a=5U&M`*yl}J{J{Xo!BoL1(4yTb%0>)4X9tgF$N?b_orrWvP`$0Locw|-{=sl-ft zJK{P;@v6ja%2CQzqS#GeVsDQSz7ijBm6)s*d!E_}YtiDlSBqm^EhZ0%wb0Am zs74F@2e7v@P+MAY zH>f)?c}HAzeAXKmVRtz(XZ@Lq&5fVc`dryzaz3^G+VPx!1FPF5iH(}NuTS?EnK7@C z(psdk_13?KKz>zt)15)xi<3*I`fb1$0D{*5jg?OQ@A2l0xfQ;9<9{Qjeu?6pR*&Se zTY}&bi$mjtjF!Uc+skAn(!*Rf6NcW&;`2Se6WFUWc%|a-QUY%#g3nL3!TfCbhk||V zzu+5|fWIL*_B?h&aG9sUzL>$=O!qJrbxZQMFc)>aL`oKDXIy3gV;;Dw}X1x4rJL1y8W`cb_gI6})uWmeaeDbjIKCkP5eVu{YyJasT zs&5IFwJGlBT25vIOU3m!4% z;(?I8kX%lM+l?*5t>b(R?0dpznzn1sq0&pq1$}+(Fl0ETpHZmv&qyg#O}1sD*O|xDJnja*Ww(yN9RwKu0 z&P3~(jHYd-q-61*C$D%s%3}qG-vD-72A^rLD6Li(_%?YxZA&~1a}}LZ&MIC4g=F`I z5Wgq++bK~Zl^p&wuoqhCtVUI*bVWuX)5JQ zDLLC%XPd<13eYX$84P=sJ1_D6*$Np=9>#hd@6=+>`jvoxT^I4WNravHyeH z&MWozl5vk5nfOkADK}!VKQ_vq&kNO9~U`*Y@}~ z!G8K*@OGAXGEw(tHa}$0`~udz8Rgt&+Rr636Tgl2tPMdNn?W5C<~p29<|g{h^n@LN zbCaT9hVSf6k z`l1f!l2;OU-{x7r1A8EYS2jz{B`XuBgn6yEnspB1Z*Elk7GG*ES(9*WrZeb#X}C61 zU)812+D#XJR{79@2ZMVsgDp3!Y)PETUC=yZW&ndIme~g8d#p7uG!mr z9pdB3JDI9fSz4hw{Iy{3%-}P39VI&;=O(*#iV{gUrO7DF&M1Y6SbWXoas8u2k`DhC z*v%PysYL8Z+aTGP5m`LsEXOJRjzUGcwl9foWMsMq? zYs*;EGMN|_rBu;r-hkHK8O=OHsa9dQl1^9a6B4!2=?xzGg}b14y5BaMYH^`GI&qDt{~N5pN|T?CEFAnbbT zF&^m`crTQeQkVVrbC=b(D@mJ z{XpSJ!^g&W-_u-MgipzV$p><41oOq1XiS13II-YuHd|^&w8@x-KP>1|T z-jtketn@)D;KlalkkO*TI_DnBm~n3bREFS{UPZY1JPaS37S z|AQ;}QGDVS8)P0L=!p!%=ck$w18siJlIFq)k;#uD@)B=yP04wm>Z56*y7F^BX9Q(# z_i>rqeKf0oA&kl4S_^4xz4gc8BzuZa9O4iy2|6W%2yb^wLF(E3ttD-9F_1nHtjz6h zbSTEF@OE4HFhL8s*xRk3yu<{&DLLC%C-3Q{AO&VN*O;Dse;Ik)G`z&Q3~%!#pwLX` znz%C-oPr#9m50Ice}SZplwt*gf+vi*iHO*ZD>%SXmIdvCoJQY1>>Yl1VxJHOI@uid ztbhW=c;$bQ+17x^OZvou-N*poJ%CR!{{ay1Yve&|iqXrE@Lys51B2AGMigZ>mm+h0 zLzZh-#)9LKxez>H2`;?=g?r3mAj)Bp83io-_c^e27S`%wV57`Z2b*HvDzbj3HgJk* zGz0(rKKK2hc?X&?N(rgMKKGD!m0e3Su?)>bpL$4B5YZGEHHla=bk9Ouoy%pWnu(Am z4oTtR?RKD2Y7m7+=?tPq-#{(`auxpDk+cy@te}6|9A_QRTLVji>~>gSTGjK=kULRq>WTnYYwCM_Q-2sJ|N~_r7*=tty1wrkiB4jCBEW& zJaJ;1l3Ye)DYeD|qrMtzMBpii%bQ$b$!|Fm4@O{6zT{O25cLw|csfNd{I?)!BNkio zqpU+ES3i#p!&`u4v6n8n)J3-sxdF(HI)*KD~n|> zT^6Z}?hT~cN)`k7M+P?m#kx8P;9<~_;-M{Ux){j0N2_W z1cxIo8*;g9oCtNXsmfKzW07}3wE18U}-$)h8#d|JUSc7>h+&&UYpNpLJyZ-zsY7yF3Dd;BY>uFiOEH~ z12Wy5@iDk79seLTRUMd!d;oG9%gt{guk=Cr0@(zv3o|y&=&*x>kyt~pME=U@pDOg%aZWNmV|Rj(*EqVbaI3VF@mxaGVfN32 z^=njrMqF0pV&SCU`4k$lDlfZ`$`}V~eaLIDk+hMLE6~2jm@KOX#}Rxc;#lN@MK2pE zG}2H$#~|%s>4pDVgbAOkV>xspEQbYm67VpR#WL00`>Y{O!9hwdmMJvS7TY3Z7>o<> z{~bvi5x|%>BdlX!Fw^MeEfre}x(<0B_{YTUKwR^c%MD|C!^%vfSGiP73A-KH3BJ-t zoYWu=Z_B1!&op|kOT{jN{f;!lj&KUF^9}~pOI|8oA=t=aah{Q){{veRL47XzOg3Mh zA*5nr1-(j4E#Oxn)6FS-wx!|#9Y4eh`jwdD3G9Q+GB*thD&AJ@QHA$aCF#97GmTyv zQ*ne+TY@}JiW}hkp=^qDTbtqt#i;vvb-hfc;$u=>hpa`t#%50YkkZxQ)gMz#mbzZe zQ}IcuF1aTj#4smZ3}8^C?#tV2w&~cEUtHRms^WC}^Ra?_WnXXYskl_i9q)|?XF)I# zW0ktsG=&e2#-;nZ1YqZ>((1^D*h|Dgn*lnEEeCo z|E1utbxT`puOi!E9EZOcNgEN^*4@WC)VlTdoQk^z-GVg0VzHdK4-j{oY+ljvw`sRx z>}}FpbY_?Wt`+|bz9sZOh|8H=lus{zDKwwp5%oT#JM?uv34*3b+DJ*|n`ZR>n2Jdg zv?lyQB#Y)L*L{;l;b94-FTQ%iUIX`Bdu=`FfEzFu^WDlAj)oyn#`8kkX5Bs10x; z9*69Qyg6~FBWWWBOa32EKF8ESrD9Vf>;k0q|FJm)dne*Q9)?p$e?b3^bff_p7;GyF^OzlNlZl%Q4{7R%(|Jp#T$vRJZL zTZKk?>);7SFsQ&4Y~chDNgJt(Yo@tGT+@YUbRX*hP%S|8L0pM!=3)h1CY!6e^SHuv z*OfZXHba{7$wu?;ViWWSY?ARe25Szgw4IAWDr?%V9Hc}w!`$1MWR?Z@J|m7$)IL!Mt% zo~PRP%T#zZ1)AF~w)U`(LpqZ}Lo`oE(ndTsg&i)1wAo`F{YmO|CG~pH5nz7Vq||UL zyslsd5?c!KiGMG0KWW@26(ns$VAHtNI#i17qFxuwCg5cxtAa}3QxWWg@RX79;AKcR z;r|>-8>zZ``oV>8y)VQK$WNg56Ibu^@SfUw2kM593hyh%HqtKSd#1^e`X~KR-Hfzi z&vzz(Tg$5ZnXSSnieYA(Z6-F=z`vs@b-u;EdQr2Nt&ExG7?ExhVbf9Z;95v0ptdL? zl}nSh&(pT&EGd&$ck<*px`|__^!p=I;n)aj_g``BRE#Z`?#E1Xm(+ij>KJ4r>NWqx z(1*CD9%cdP6N2s+>`A2ZI^Kf??85TUIp#${d4B`A*N}E#`+>W=Ja(F?aWUB1CU}U* zWr(}Wa+#;hYBEXW%1+ppjq6!&D<&C#)%L8^vR=M>DcE+eWRQ9VccD>gD@pyS`&mDc zgPr)RZB?sKQg-K?wvK+Y&3x|Cd@~#GmOeCA#>|tHt+pm;ipH5pschL5b6Ycvae{+LUqjMH z%9eMub%^&)@m|LFLkal?DbIVEc`V=`Lm<%!IL|wvK*jQ)C@|N$q!~Hq->)6H;MYnbhpv z!pN~KO33Ax_)lUI zP8($?^+(`U*Do>KA7Bw9JyT#I`6Xr-K@Dus3>(A&;DcoTJq88*6~9!fN`sD4V#X2Oi|F}g9zh4LQnBWkQOZgp zCcUjlcXW?L?{A2k6YSU=E9l`CbU+mqE9f@cY;MXZ zdNHNb4_T%1L$)tUOD?w`{@5zKc?k+lVglcf>_?%&SM+(LRH6MU7O0}^MCwZSwNh*o z8-w!i57C0wQ)3|h84>st`})$gi76^pK=Yb_&USPbnt~5$;wfL6er~?|5E%D*2KTze zi~+XBLUS8X@XI~4KgGATY}V6%TF02lp zxtn5&$|~JSBDgIk<@U%d2+jo2>#qoIizzCLpr;7#ib?reE72kA_T$ARrqHpQ?>%!?^1E6Y1Y@Jvj~XFNi?f?xoMDdh-C%PUIF%1S+b5L<{~id!8o$Lj_lsdSfLQxJ}L$&>CZ8( zM7}8|;vJ8%I)=R7H|+2c*ZOVyh!>>qn{9T}#~rhx$>t!JO)a|Sn9gGQAtsiVk2Br{m zyoip7i=mtJ20+%LO|9lJ6Ag|g{)0nM4KkXgAXBV2W)sb zvap-S{ZLh6t`#vlj$9g$cXZ^ZQ-V3BI>T6n+v6f$H<>y1eYOt3zAQ`Lr^M_4Qv$}3 z{o=^lLRMnVAb0?>&|DX1j2IcO&phRfW_EZG*xvpGZ<)tE$DE*apNK2XmPIUjNVo2{ zEP9Zv+pqC;j=5Oa>2cxOAtS(^2d?|Uumgpi8*dM85wZ;IZQ!OxSU;0c^IeFagt+nu zLFJs`D#x{~M@9CJxQJ>@)#S4(&_{6i8R`BR zSDGIp8%cK}EYC*ih7IHySF%6j+7f7ponuBYZ&%1kY(_6#!hRH6{W|n|ejn!9>ZU3tAmg{lcxpS~E?6V3{q@9XoB zL|C5--C50{iCf@c;o`TZVzeEuMvzkW{2JvqReIxuGQS0BPXQh!_9LWJrRV!fZ=7%q zx(^RB=sq?{2x`sebJ1Um_zWDL*kWV)la^K|Z4&eBBBzC_`>2Fc%b6Yz?j^-P0XF`j zOp45C_BJ2oQ&e>qN%w?AMf7rK&`i)h8@+n(9-4|fl7^PdLiL^^7%Fe=iBx8=*E`m;pQ&8@WH2*LN z_JBBKciBSwjCV>XDvO|UPY5nf^g($n(g%W5LG*|S%H-hUgrY2g_IqeI=$NO6^c`Q^OuqXhJ(OO=z@lLVma# zMQb z4+-UDFw%?M3@73dq||t)RmNIj_a=sbn~LaA>}hZ-4u;(+>>r6I!M%p80s8^C?FYkF zz7%XCxf0wqB>0$O?qPS1l*>aaVXGv!gKIE{B|O;Uz@2k2Y-eF>CmVswLk5Dq0$jg? zVQ&_;VX`f_LCAct4}eP_3_D)fW=Y{DAzQ&d2X5uTunUAeI#~p6HByfgn$N)PIv94X zuqP(hfZL0716%1ACViw_J*3o%PEYOww_q-(17J@D*EhoYzRS+bT5L{Fx=EUO>)wEQ z>Wt(cozyJ*a9?i_*SX0>@N7g@!Ziw>C1tsofh^a#Nk!45Jy$!=6?MHwMc66139@SQ zIKP8%BN{(OgqfYK%}ggxpegMI>0X?yfnFcvM9zPz?d2vTr79sz{NgC_Ip$;O_DV`` z4bl(Y&gk7yS~p%Wj&vO~M`) zY{On)M<<0_f_wt@6>w`0hCN5vc}d}#Kh0j5?d;d!_C{EL$HaT3uxpdT6(OC$9`c_c zXok2-h_KVl;a7m&oeWMPvMu7)!1j?Q*1S>?#jA*pqV4TJvHN6vN(RFqn|X zkSvC$+?r!=(p$f!DykjG%g{Y7Kaw_5hAwSJS%)l*`QrT}8N5r#*GLxcVz+es!?sGY zDGqVgSinXXUbBw}x{$PyvgQ5QI>dXwcoR863jiskJZ~aL;i27FL?UjBwBmf}D*U%2 zX(I+}oj%DrWCH(XAmmkZg3*M0jW}|-IQe*nSDz8N3*TaM%}GIpYB@hTck7@+^_;!V zeR5EtM$T`}eM(TFW=`;{#h;2%EGLP3o_W^XG=Q-wX9uZ~&lY$1%%=1r#DiUUoD@Qp z;FN_}YbZr?h=w9*qpZdX+NaF~>u8%c#W>;xuilq7^Q>zHt{1FpDXxE5*AiTBTh}7G z!w$N`0`oEcSOK%e95e5B>Y+)FQXBUSr%R+biPTQrA2vZ-CGmn?Bc`}&X_BM3c)^Yl z&)C8>%{j~Zw~v@@f@bP$dYYy}vmCeJ-#22Bxqbjkfg^mt$om$WIPWH`&^+g@D@C+t z#1c~v#fH%M9pLdfYKQTH-$w+q&54%uyrWP#*K>@a2m2+?c~t2f^PWm^VU9{rdolYN zO3??p1&HfNwiN8ceIYK)Q52oqm7z<{v)0R+&1S7@&Qj~|HO1sKCEbg1YBF+QbnYp8et%NY{c?&eVYd>~4xJsyLbJa)F*oPPyh@=sz>8Y%Z%Tcz@S%Ue2tgQlm z?(bn)eb&19tc~+o>*ANE4|zXkvKDaEfx~C@;Y?Or5mSvAm(@oySv`Y@ZO9^HvpOM1 z>DrB6l)+KT;Orb_F5t1-Wn}O=KpV?uFs!@TIf`PRRARcLvn7+EIXODqv~|~$&`%JT zp}Cn1^(Anzjj$P-pYu^xhV(@xTWtkqI1M=VEpdrI!f{3}#u+`bUuBZ1gfB?x1>~s} zTnfz=!0WH#k@Bl!!S@uRC4jRLo`|tYa00g1I`VnM?#$-UcP924#0_JXKI`ZLN~w$P z2BZbn!h7&PfTWF7H9-`ce;>!HiTL}GtH4YrW-;QrkX+7c{~nnvFyBl;Zxw+bBQ9OJ zN?T-Jn4$8#K=_yv9uh|;LA(!t?0^!Nz7j7m*WQn-CV__`j!rI~L(xaN3ytuy=-i9E z3&%P5J0NKzC0Bq|a43EflCu>&F}ESE0CKqk=$qZe<_pk8AeSO}peGPNEkfJG9c`=8 zJoW-;Ju(>JazLvO23#nKNSXeTHsh@$pF=>6_(kTEN}NQKem*h*6@KgG z-n^yg$@XU}m2(xypf}lefy%ipt(Qj*+o9AGnQnHy#vZ1cTg?uldX%cY7MVXu zM`?^hR+G-dVLFNq(@|hnIupZmZboTDRyuAFRyxN4v6ljK!lM-NDf~+iS4j=OP?Ib) zPjFSjTag1Kz83!`ByEJ(db`*haXinq)0Jvdcc*RRIGC6}kTTt=z`QkvbaIWptQMvt zmmeUizG7P8bCOq8p3Mh4M-KbCI->syaemVj#0}k!fC;qi#@Jk8WP@M>DWO$rNr!|*qk+%z5{34tpswcfur=G%^;Zbq8Te zCKXD{@=VF(2J6T25-}BVKyNSSgJn?Vn-zXlY%#GVjf{WuSOAP#8n z7P+QP<&C0o18RUAzn!50&?OO2E>||pZJNQMKDXCXI$9!UIs5jq@9p#9-N22?;3 zkrIGY0L_npK7CCQ`Z%~i`;ZR-t^$;sD3ei^QN8&*fx3{0E5tfN19)rZ=pvHtH2DrkK~OmiMq&ANM9rB88X&x`40Qt^Tn1ibeqg-^u< zju$M&67(cAi=bI(#y&&T1r}?U>Zv8RUi77OrPJ>?Cy$p>j%HDvl z&}om3zXA8el?k;eS7pWK5(**Gt#8JI-4H*CW+LaW3Na@t1dmrY)56`1;Eq2ZvtP3= z=(5lRJhxPJnfJF{XqNQEzuf!VFEsm_<6q(ZY()yp&LVPj2uU_U+)c9!3hs+C(vro4 z77?vDJUzTKhQ;Hthyh+sjHwV-jm;w(?w63c|1slL4n14&E;>)5v(Qee zxqle@8JdEA3(eL4q}$}g9J0UKd+P_V#*vvV$VSp=2!E?6jjR#iSNgO-dy&dtv#0}f zX#|W$fMTO>KlL5VuilV$0B;5KNCfn`X8ckc%v~B&lm_C|qmy+r+Hg~2GYDIRxZ1R< zO6snFkRJTxZz-bZ2v*}?kED(8?q-~$4aUFlev3GDxfo+v@4zAaK1$HzEgsv0qjE(P z)JD=qN{-{~o8dTuz_XAnj?(j%w8Sz1*$Gn*{8u4qBUQ~?1?Jl;VY(IXP{c9GMQ++& zuiOYf5dC#XvmMNF_-7$$BPExcomau}9NslZ7DwsaNJ}hVA-!SRhJP25Hd0k?ip}-c zVgw<+;~Ji#1CvvUnICb(h0U0qSp1Dql)W(z^-)8ad^HcSp*ay*i*|dWFO9V2Vg~3N zq^_l8#b(*9jMpG{Be8F=kr7`Iq3tcnPD@cXE!iiiw<9R?9Kzm4T$%mOMZX=cQZKgQ za6Ke={))&$WljRC~6Awv#iQiOK6^MzvrOguS$WNQUTZa})A5$!8EJf}>t05Y# z5LYQtv5Jj8=poP+WC6hTfUb>za%l#1>yF%qZp3fb$Ajk4_aER=Z1m|CY41U{!7vug z6Xh5H?w|n*bk15P+?^ba0(vb1%H^v11)6lRX>|*8D9ABLchH{^zpFgD*ytkw0?kLp z1I($ybb+{{%9T}u!lUuq66lKnDSZ&2*ywW((q42#y<#28!0J^Z4&>0Wtyo@ajTqf zVvi7Bgg7#}Ad^a=8OF7na)*2Z*>e2^jFyckmyGu#yO<`~jg7ISH^>S#10%g;~Cs=>Deam&0aFMA|2p0#uo zn@;QrUj?uod6|T3RWrfih$~!VawsBjYqQQT0Z)ptz3_$ML!=$ET&A-7FXYa7G0`fssk2!081TynuB zjY9JzSM{y~$hB~7#=i|o8!0)ifED>PQ-^Ey$|km-@SN%)nOu-brO@o)8obSjgG`0& zNFq-_(nd;pXT)X5&itqg+6dJ=WFzW*@ee@KMtG-wggWPNybmEx-F8mY z1%2{*zD9yn{yqq1<9`N88{ws1Z1idS6~u2v+JSkCn6HphEfO<_H6?ryb9;F8-X0jm zW|&*JGQj+SMx`2I`f^bPqA4`HxV9z#J&|D~(2~g3NZLrrmEo*ADZ{x0c12tnOZzVq?rp-OXP9b?#2HY zk~Y$$KGNoL>kwnr;V_oqU4=MCx%h3At(ZP<;d#!EY*nxP>Rt_O7od^q%B9eVRjEuw z){@d!_+zz{k{E5ZJZ&9R%Zt{bYT5e`D-|?;LSnnwx1wgdzn{h?iC5m-=`H41SwymwS4$W`t zM=?kN?6!f$4B$g+(}xjvDow6=jdGWFpB+bR|1QrdAae@aVsbbcSOCpp!3TJumZs{Tz>Q zQ;gR8)rWec0ac_Wf8?i4e&5;prA`OuGpIO<&D{@Ttbn=beNLre-%V(fI%UdC!xMYe zi#$6y7JKCH0nz!?iAZX1;o%@0Q3 zxC=9lyD~TIDG;wBeL?jBbxV}<$ktb6dJbmE1!yDkB)|eor_E-iJh?SBrZxd8Hu)IE zHUZm%Yy!H3=+7cfx!g`g#?=~Qw^`+ZZtE3#d01o`EY`kOWL8rYkyZPc)6HMF1NEY! zObCloWKN?u*8tH9X%Fh;3~E-0DmDR)>sS!$KjBaaR98@MAXyzM%gA}ZdYoEDU2PmO(^cAv< zT>X&Adr_G8BGZ5p?f?<{lqUi~9a=xChiMtqZW?0(L}#SMUUrwDrnpgUq;DpAZP)w2 zx&V0`xeC~I8Q9P)*aC8v2C^8L1ni+qnh%9(<|Ve< z>Uv)S%xN#9^BOw7r`+gc=)6qAjIL{l`}{KoPB?qRm;Nix;tc0TbUsAKb56_Vd~gUu zJ8}CEJ@&E~zI73&T(0$NnOkjodkSdx>BkLKhIZkVVy(}qag@IWUaMhP$TG?gd*w-{ zw`J+iTDjp9S}V8a%3AqoG*3m`oGTY|r05DwJ+4b$i3O{XuSlo|{;LpP`oq<&b8{z= zw_EWJMI47*aEzL)`C9lj=x;+B?_;RNKMTSB#no}N6vuOTS0Py(_2myz4_YEAZHFXy zmE%H){*8YRg87T9o%mn14lOcQqY{fZV!MJkM!Ec!Ik%0`2cm*hwIXFvEMjee==qnk zL0*KUjTkI*HS5rlLf>L<32+6n8gM^i9zclD_XBSMOFkVLh9^i{R`-ovcN6?dr-J8Lu0{svaxsQ{r5uw_|McjP#r($y#3FHrt1@n>D&^ryC^CP{`{0?wAz&FT6 z?l9i62k>e@0}cjk!0p?d$D$26p5vbaK9(l9@-S*i}e19z0or{(mBl zOlE9r>zZ(_jm$Kno^!hqk)tVO$PLaNbGL$O&q4HUO*2GRlcI!#TGkCbZbtP(Zl z=I)KXT%?=8D$%m-jS0%Sw!}0?|6XLFU5)1M^T#Xw7(;ZX(I#;#CUML;Tp3dDMQt47 z1|GQ>4zK4=p}B?YBUHsKWCR(ShyOVwZKULe!>eu}7c23uLmY=(aJ+w`#w+2ULjN^n z864l@{{=}KDLIZ|;z%5Bf~ z*jP`zw;_&EuFQ~Xzss7+2UcjrBG%YemKT5U{0sh>NZN?OGGAjI>V(JK###hm8o3Ja zE5v+)xSQk;60rIBA$5x~Vtel}6s1(>-z+;&+=EiQSs6u5c)7iGcaGr7-Dv=#1>(ve z7d0z2-hsxo9%RQO??QM!{)>^ck&>&~ihm>dtMJ~8I1ahs7~V%k7yd-_J0m#NuK?JNEP3sp?lMi((P$1Y|JG$AU~Dy#6I*{?juTn@_I8cmlBAHdY&euK+j%@k1*| zPnx%)yYnz9xVv+7Uq*S9h9O^}_&7>4%PDgIFS{C(k=T*Oe{%l;t&M>Gd`6@ETluW+ z0Bu8h0^APh=Ys(Uk@R*zwZ5Q`0IPB!+yyC{XFsSM?JS8Wq( zN9;w2YoBsKCY3^SBG+7qS|9@mz7_x72yZ^%>e~3Mr)UUc@s=QtLoV!mw$@KNm-rwx zV4fPJbX&sJ8JP>;-|??U(nbWfsTWv>hKsp3vnT*K1Nj{APGWvV+|BhzXKF6>SiTFi z2dQIBa7YWDB1Xyq-((ySsMVJ|-vjU*K=(wz%mCz@%e`&@ikgcXkTT6hs?kYjv8i+m zJq+eS$XM8?68&^pb~Tqq1DHYqRs4#v9pLMLsvZ^Q*JmTsTyk$xPs=nHmn_ZY5jeIZ zQFCz_B-dDoTd+I4g%xyv)-j}U6#PA-G%_bXDr%KA-oB0z=1-b3{_74`ntf?26S;9S z%p9(?yIWxxin!Y>7fnU9g{BWz6{s0YnUx1Gw9|FFTn0pY{lEP!o@L*Um((@;(`Ayh4-N@^;k!o@7 zKhgh;l@y{uf1*^T4vpNDvwv8ydLQQ!KWzij|ludV^eES<$C*5 zxqKAcACJKRr5(r!6l))Cf+G-@?ZtoiXI6_%x1(tlfCl&DbOvA>Ko3U1ObRl^Re30W zooxl2(Pz23Hm=Izm_9nPJHlQs`1kEIsOn_!-3gz#u0r00??br0jQFw+ zbmn2O%?H%+8&(}j9t8x{=a@1HGj>?}^G0uFX6$fT@P0Bj(PpggpJZf{56$N_S~k=^ zR<+rOl0EWQa1T!ikYqlRN3w%SG94u=SGFDFqG7ge2dUGkVoruJ)<|&#G8p9-fUk;_ zqrw%KqLJurAm$sy-AKE+nCc8xn^l3_GU<+lYZkH?zWA{W0!Z3O*LLYG)}a^Q-%^F` zFukXpcXM8P_#cC0>7E8xMR+D4jdR$` zitDdVU#j~<5e8LzC=&YV!1hoi^s57}9mm=W(yd5Oh(CaM4^pZ*p=izU)8dNCdQx%l zBDMeHX#a?B|F~%X?n%Xy@Ptn)o`#!KVl+}a!V8@MLZw~#TM9?|mw~z+p%ZYmHF}73 z@XTTp>(ER3KcG5t(P)aSMr$fD(U&eK8F_WKViPJd`#}rY7dZgh91nWL&VwHl^z?>& z#tC~&5c(M>>@h*lxYS{vWJVvR#>PWu?z|u|njxGd79poqFhNsrmm;nz{S*0pC)u}B zS^NGlfa8#b_Hps56O4PRv7cJ*-#9)M(K=)RWVb?eZ$uWg++t%MVTTN;`z{tX04D*; zJt0ihj|X(iDS33b9eyOBTiT=0(BET2~ougFx>7u+{SOGAH)h0 zv(3uP`0}mSqQhFFe}Osg8Bk48ZI8HiAy?EcI^hZ1#YMRJj0_sCUA%~^(9|Tf2Splz ze6I52e+Wq%(b{%#jCIg1PPY!dQL;r2EAeKrsRTTSxRg6F6qNd1N1+kZNSJ3Jbt>|N z82%5Cw2><8w6T+OS$+_|47mtQ;zVynPAAoCwS1{|T1z|LXl1*aY|k*Ca%HvB5bRNi z%Ya-gFho#jDs%0R32Uqb+79@;A-n{etCDV$xMZri0YNa3HgAhk17i3Z?G(EYF zgJ>4=8f1m|ry*%0C6N`Fb1^)`7U6vZaU60*tK_XD6QrtQ94a)@eG0DC$X@uqz`qws z8xh!AUv3=(IfIjdv&dXZHLakE_8`YsV$XUKo$Epjd9v!A++Z~Z2xilh!*7;Pw#Q{P z$2prH=67|n(91i@H*u0vbDUI|pPsje^fez6ryX^amtvE|9^At%wMD+8B z>u7Q@CGe86ePC*UneL2obH~uoR3|}dFbqYeh^&jF15yId4`|wRg08GSye022uQbWH zJZUF9S%$O&fa|mlYgDeVMz>y1e2{u%scKZ5Z881H1o$CooC>fb!Xl6uTcefmYB5*D zlT|!h*O4DLBh@OKU>PyCE@i6w>$>!Yys$2v_pjcekn9R_W@;BPrdcB6B9x6)CogKLY9kqBDi~_*f3TsHc-ByoiGe zj}mhysx=$=8fVv|MIe5`8E@U#RP!(+LR!f)u9X~SCRu;JGnm;-6q|w)_$0IKtA`U zxJ-QR?9N&cf3_C-%&BVb&v9wHQ`OCO6xFYVa(|Dj7Wg^eLT85h!&~;-E-|}7J&evm z^Vk}YmAs9zqklBJviG+SN=(aN<2x2=a5jXmRm7RK zVcyF=SfGhW5y19Ac0JfXS$09H}AkLpeWRtLR` zxh9x{&ZbB&v(dIT@sHxsM%x}egnn&_ipjuwNOmG^A^IMYLr)8LEzFa&}VP|k}8vTROsm^TF)hb#fu3($>afvS^Ru;~djAK3wL6rkx5 z(3%Ld>SR8)NLMF@1f;VDXG?;tS?~BdiELHAPMlvwI-d-PWE;{8qS)zt zGz@W_DU$(LC-=GxOfoJfvXWjxP+mfY!Xh(<;bA*OwSJ&EK(+)TJ3NRndU(SQ4^p$k zgEXVzK{&?wzZ@Q%aVs-CC;>b2oq(gj)M4C-y@7KJ;^sxUqEUQ1oj*ubS*}t1MIvgG z&r^^!zh@n?9u2-4J2$|4k)Rr8CxE9Tu9kdt%NjFv8CFR^Paztv;VQW z^COe9@^$g25kJRWmGL_AibrVo=*J~hKW3n4Tyk1{mY5Sk9YJc*xa67&uM1NP$gP}k z{(Q!z`9IPV$YeAwxhO^tO3{*vPzg38^C?AdIMY!nd_`o2q>s5Xc1S7#ztoc2oYpe0 z+Zagm5;`j=GVjsI#9HHLwm2{!dX{fw`gTs~Mz+0|Z)DPp8kunat&usCSf-IF0o%xw ze?C{mU5Xt|*tv*nWO7A~>^kCu)cBXw$Qlr#e4dEZt8RjP{C6Upg>$uy>=f%zBYW#+ zo+t)51nCC&QDUBy*l%+AaZZh_KHLHoA>#lp1N1=zl&e%D`-A}7$R?tfn#pCFdGiXM z^L*XJepKAqVL9x}JL;?aXVA>;xojtdgG3{M|DbnOb;{0vcsv1c zCxE{pS$TKUrEj$|Lu$H=nysvj?(KH=6z%7@a^c=?*D<@{>X!2Jv#8-Zy%qN@G5Nqg zC&{Sgx{07|)NyTmj3v_3g z{aiV#TTSpr#3d~kyDM=p>T?xyW27_eKjQxlNgFBAA<6zm%u}&L*jqP8PQHdlQGZtW zn{;cOs;`LfF=lBuh3y>Vei*wDcXhTRKMBNZ`+8&RP+zY#gr}#_=!3kB)=*+5Bd(2Q zp2lf3gAz@258+7f7V;*YA;?eYJ%`TckzN_o*;H>jn`}>}t4$S<3Jg-`v3+in&__* z@c?umm)HSLE}Dq5GEK%4S`(hc9i(o2nai!=rO+th&153>E5Ax0Bd_592uT~!+Ug!^ z9as|{unsMERy@q9F&ZP0jcENy%-LisLc$DbRLSzF3fXH07T2tCMmQ}4D$ zB=6SHT=ht)PIbnkBe&CggVa!NOQBJsyUD~k`#HWPBVECbLDEJE+Kl|@GQ!U$tb@K> z2>=_wv^mr|03U803Fdnl6!H?zeHN$%c zdTYkl(zOY>dqYCbtg(SKc9BUL@nVP4QQK2>k)7+W%^KeF)+$7H@ktX%+%pGnFgY*y|;L*T*4-eyzNKMB7gIscoT86gPH&M9{UoF@hIpxStDJ?S$n=0+ z%-xV}u`Bkg8co@*9{M?Zlr1vy>+EebrW28>i8ZK0njQGPAL8o6 z+5o9qZ#t>$O(&X(FXv&XU5q33eq&HV@obd(Mv8K|0e%mdTrlMa_%$#TnMYJI;@ctP z;hBl1tuC!}%ULYl-bIGR7tw2v&Jbi3djHARvpZ{TdVIgw>hyT~i7KR;_eNGe=~^qF zb~v0r^kF!Hb_TK^>N*$D8xdD0a=D_7BtDIlFWMb26qy}lQ5>s~)^$1TK+_gYyU%h( zb9;Xkt!7Ogn?z?9ax;1xv-KjQL0B|zGYE_3y!}E0rgU{Inv#W}$h3!Aw6Whg@q@Zj zN1vt3$ZG9bx`5oK)eLfEy&9dzb|5Sb*Y@Jt}aK^)g2KdlJDxyk44#cb?4W% zIfh9>q=`RRJ45^(#JQcrs<4Kl?5^%i5;_%8=P5FW*P*=ODXfX$}q*)_U2vy(0U-2KNKq;U|o%J zccKdrJHIF;$5O^vyDRQ8k!f$fd{KLI`*QWe+0}qdPvF%L*X4Kvs zQKr2`3HkQss!Cs%mD(Kh(@kI2&y&`XeE zXp8`Do2pW?O;wJlsk%I5W+ms(kD99UYgQV?C@s>h$ny{vLA*T5iZwT7H&thX(5%#` zDF@bU^B+NWqPPL2{gI+vZs_h${79ty(ETV3#bzvzABkfT(yXBg>UYK9iMYDRJbt9X zt=dHQ)RFcVrw(R+(E;F9h}*2l<+uKonqPQVK!bZ1RG|@{3ivzHn>2>wpNQ}kbgq<- zuYX#HeyRO0RA!jHT-o5yBlrcxB_J0aOsc%>gR2N@{mJi-Al-<63&I;oxk5@N*9;+( zd+;VN;(nFh;M=WteMN*Dd}-H)?L=fPjK>kzHd~PgU>$YZ{AnF(8r2WMn1@DhB-V(B zU(v9w)Ezb3ddnO{x-)0#oq=8-bjBlRq4%-VJ1G#vjxt&M@*~~8oZ&#Ny4sNfGnJH> z8_>QVnQq=m6LHj|)Vj*pp;+hQ@b;EjP!=l2_I0)e)*W$y4Aixy>^*f$T$SQ!R06H%MhR2WG${V{i|hyZ93Z>f)Y>;%8b@cO zeuxhb%H4V zy|H@BXOUS*hUcUCJ#sVJJumUYnayySMfNwz(o6Wz&sc6}-q6nqC){nZA|!<+G@G5s zEK+!p6r!=a?4tE+Hy*ODv5QvkjW%=AExno3JXU0y)@F$Ze}ey?kVgIPS?iIqtH<4L zc@U=Iy7f~vdp5e`a^!z;}?ba z-A>Uj3h`%FK~Io^*ast>N#T2?AX9}h9Idm;6sP7mR~!ZeRaxi_ck@0rdIm$BtPjFM zeL|8$NbXhSev%w`X?Buf>HKWAC+U;&3$M^0F1$iN4@bGW!$3Y3;^z_fh;j7;$%2?4 zmWoXcHbY8yGx9Qtk0WNSmi4TpemGA}l#K_iOY$WPF0fZ~V0qM7b# zXf$;X<@pnIjyH**RZ|}9>*33;HW)24%Cyj$<6H~%+p5qT^;JKghkaF?wy(N&+J_`h zB)P%JwIun5lGHlaCaK;ghp+B$l8!7~(1iX>Z*%dbdfOCI*vAB3`?gpxl@xv_1=rh{ z4$AGnE;!uQDI;8EW`}%+LA_#bBYJf%W0XVOy$Hwc@WExpM6*MYS*4m}06G3a4jc~W z;WeU3^dxJq!O_|}ykYrBH-=DwZUS>-InR#nwhPtl$qUnJk=d;}gSZ3I4)Ql0xw9>V z#%ez<0k2Vq5g6z?WEk-7J^fv^16pXDuy<8YKKT*YTlB(CkB(?y4|4BcEei7mphcyR|VKL-Z4{r1;CL1e=--|SB#^D7F z_7-a?ZEvw0;VpIzGrGmDuX2l<+G;9yi~kSueGpfRC4%0N&v)cQgDlR|d}rVme*?S* z&@}Qm@KbyJ|8(50zPI>s(tE?Y@!oKpyhxm-Z}Ayfw>Zp;+ef`%Hr}l_@;=9*DYBL< z-GTZP)1eEm0)H)hxjGMLw$JkS3znMCTf_n*osCHB2y7EipeV6lPN~i!_~g30ZENQk zex85h1B4rM>OW4vb8ip&voSB46FF?*X~q#dUNexjw~Jb&y;;aJ@fVu3vC{!`Qvt#LnedjVf4fs^c=3$kj+;9ppM1 z*D8Kqu>Ai~b{^nSRBIpKvpXA-U6KtYk);O0hJZ*9(mRCSH`LI3??pmK5CQ3efJ#RN z6j8BYK}Bp>P_G4hy*6y9sHlAZ|9j5N>=Lf`etDjmoO9mac~7r%W>(dQsVTO{A5^Vj zx_bys-C=6Knx=6u9mFG@2i0tt8tkHJ8BDvY)3hF@d0S|@4W^0pXgUbfzfor%R1d*) zm89}Dn9?TE?E{!DU^DnZ)vgu3Kh}-)d}db^RQVq(c#&_5kXH|>C3LCqEXvF8D?6Po zYw42F`%5e-d>P`hgDw@zzD}3QaCuNA9Kx6GPWK#U+YEi@Sw$R{7OhYM#x1YHdmQ0T?aV1h1 z-qAIIR?C;9s4Bd+awqr*D&#$`fVPqG7+{?^Rfn*t3s7h9VL&#uUMS38JcC@S8dL+A z&TuxYfKD|X!bJ`cU^v*=P@^k@*!U#y9LDAr5c?b|C~AtTd_tR^LOn~Tx5ojzK&Y`K zz(9|on8KT18)2YN0eoKw;?JjrZ@!4aln5juD?_-nCPe4)#gK2g5!uajs%*$=#>z*c zOu}0mZ#RLohpd|`PgZ+tL%wZY8x)`#N`cN*rVWd~U6Wa8H!I)Q5QVmry;VgkNg<^w zO2b=KJ0@xufIH}4Y@SrLlfqk+WaZ-!yyyr`Ru)qe(9?(UC8MJ7|Gpy*G9mbQUd4&5 zJ$EW!i4K!yc*65orAoeV6}%i&KZ8!IjqWOZ-8ecwPv=7_Nb_~5q~XJAB{IHbz40*L ztyl;pA0d8^#6GRh0+@F_glb#T8-($G)maiOL6t7StQPg9OXk9uejZZ?m3{<;pb~yW zLsdHv&{bAA#q0kV4eS#BLdd`+D0P)^PkY>x;asYCBd^Cw?&wRgP}`3{=i#9w|llJD<{;!pDbR0bLAUk3M}|0~>!`nxqn z2k9x&YXU6E1APM#Lb%rexD7spsG$j^y;Kpll1pbJC68SPV~G!tl5lzx7>85^j&>DJ zz6Q3T+Lq`k-2oj+_2d!0@azcOM>E>c6yAtHlE(~2DS0!ChFjkX+gR->{eB4HHx3Zo4uzhw($ucG7RORkI9^@4OpYH{ z!0*un>q`r(kNghS197FB2Ac>t;-5hA>?yxI7YAut3%-yz6Dv1Qd4C6pIx{cSW{Oxn zJQdWT?r@&ro6{U$+SmqJkoVy0C|Zvv17nBBTc#-Wh1WO6*I+Br$eev{FKiKQQx(^A#VaQkskt74fn6Y&kV%16q#<0gEdN-vt;$~iaMZlY-Xdj&;Gask9>Zs4 zmADlD(r&mKp7u$LxR?mzgG_Q2t8$`M;}i}vwuZRe6177sy=pi{@TU;p#BysDD_rP} zv5>D->tIHTLk;?QX{87iFtlWsNIw^=pFyuinAIr$1=rOK3*}FZ@U;iF?AFM$a`^Ne z%vC23!UV3|Zq*R-5DzHBtYBtHb2f^VYVh4C8Ws_W9j-(<9|kw7;|}Xu1_@7Qi|E4YV|M&DhD)J=R6F1)gg7 z(c7tN$e*I>^bYL#b>03PzVi4393O%BNnC*jw0UZ(U)MlhvpgvECfxr`+2kJ~3wA@u zLDmLPv(UgxR{jk`i~18pGE^6$YN;7xM|w)O!ls?4pa{rHq;xo*?0a@0>VK;GaI3Lv zCG@vRV)XhwiBoB#TOPyuff4El@eq0|kmwavYhQ+Z+HKp7d@f{*V&yMB0r}8#Cye|S z$acE&+UhqXJnc}Ut$25<60%-B0^yScUcJcl*HK$hZPJ>mHAvdoVkF*!^wU`4(w!h0 zsJi#tI{t>#kJy_?)=>)4ORKAUeTSk-OwC<~0CW0744ta};BMnRsr_{~VEL|9gi<@z zVHoOn>Hr-Os|2E}NKthhO+K|ppHBFs4U?D&sv5}#^yq1z)%2l1pK1X?XID*YIC^SJ z2bugROb*KNsn6M$m|5wRY@4+QuC*wo0eGYBXTW^T1V59-4qqh z`dd8?L5*1$^3)eFHBztc=QPgy464B~*4+>2@ll%4$lqvy61t>*f?N8{m<_A!3$@^q z=(U1yX|RkgpCSoXk~f_$-TTnx1I*2>fH#{it(w#2GcrMMBf9*CB&zJkS@u{T!X^6* zLkVf=C3flQ_`wt0cdzDs?>gQK1|vr4ZL87T^f}%ybjDiCH#U#v)zGHW>!Y7nX-^IH zcrt2DMN#-Z>j8&^<_mG>%Z81ulLs5p*gcPw{8&f_uuE z1aHYs9Wd=$o6r_*r=)CIuS;M%g3=nu808zx82V~X=RLxCefljlH&wUn_IN5TIolAH zX6j??l~ydEN7WJu3$hL9c~$xs?7PxO+{$Eqyc>7l8wGIjJ%C21vR^=!q&$!?06u;7 z(C?^(N@%XCGJ2-wV@DvrTht%iVT32C&vg)@^7>lrMdFkCN+a{BmI_c(>#gX#)O`r} z30wiO1?d6ZPZ$YKYTs{y$3qA8Hh>Qu$kR&v_ofe@`Wfz+`>S53gaj z?+;*gs?wXGPgCi6W9gEU&-+E>xk|qWy{<}sjXkojFUm)yAKHR@!uqRm_hW{go_roA zk1srp!qt6o_dUCT_w{VJ#`Jusc5Xq$Dij#d)dqT0W33=uWMu8dyV4#-hRAqrr-2e zS^0dm$ML?r16_JmKI)hC{p$kWk*tfjNBx=8`J?LG-JLE!wt9 zAJ~-Ul~~>>Uj;wz35V~8d#zLth8-HcbMJiw4%u)BhzXVT<7~M24x-g5-#OG6<*WJx z%^{M_R2fVUi)@e@I}+Zcqwq9S&+mit7I7|coZGAHEf~EH?#Boxq8+v<_}K~6we~9K zIOO;CK;I(rN8{xk)CE?Mi)zq=*b_#TSML*`NpASzr_5IY{HZ=fl|Au1fWHaQBy%GG zBVNJYRzp<{QK)bXKqh7o9XBBnXO93X{Q;uULEVXO2p6m2&BI*1$;W_35W)wAJe*f{ zZ|FXj{;WO83^{4k3ubkoh zQ_%FKJLa^fktQp|jBBrow!?6G!-kGtJl8;(RVxlHe1Jn+NA5j~feH8#6)i|x%FI#fCCVAniqAZxO8aGkZS-n%=>nZWkm{!nq z2Q+ozk-RJTlX!@i_Np6dZi#Xo8hZ8e@Qm$^OI2Am1*yQ(Sq{w^C#b6d`UBzqu#;daW4 zpnj{tw)}Qz3sMPk{xBv(={J9dOgpSM+8pWq!hhVSCQFUp)7s;%z8#;avJi3k0hjO@sWg6a+lTa zAQhvEzlEfxTPhb@TBE@ZoO|yy@sQ-w7L=Q8YIIO{w1A(F{Xxtk>8yUEKelb!I`T=W>%}o4SGTu; zKYv1Bv}W;F3xjJ%KJpWPeB|fQIy_oY;oD*SDpCL3R0P!>UL=PkX3P|n!8oiRN|bv9 zO`CN{&9xcU5#3JdjtCq<$SBq{^r}*N|^7 zbUQxWreo*p+qI=wk8!4b^;IU);ybQbT{ZE|#x7QAJ3l;vdaH)VX}Lo4WpmU1+N-}d zBg@Ji9`2DPtXggR<>;WZM5g4O)M9kg#aAYr>46Zq1u4bH3f|FdGfhm2O%gmTreI+46NhfP4MYsD>)7CbqIF*iu zCxOnq+uF!EZblEjs9Y+zjuVs~w?lEMYqDpUYFXOj>2+sqxJ6~|%XLty zlAWX$B2@Q4;W1nRqG-`tn5%{AB}m?JqV94ho+ zT}8^mcXgnR^Ac_ubA75Y?5c%pAV+Ll(eU!at}QkE*)rEwGW-@4+hnP5-@UG_Y`Aw1 z+Gc|AW@dz$%N2Ue6IwgWdRlwC>g zw)RCHRwF>%xQd;1UF<$=B_U%g^dMT<^6$J2uX1viQTf{UyPp580qS5m>_u>TYURtu zX!h+`HduqDYIRZ%PlROzMmoUBWzhi<58jKLr@tCG)nkoS-LXEBCEzubQ)J60%^wU%^4;!X6MKm_fq4FkKk#epUQ8nek-Ai26E0 znAh^h$^WzKA$^n$|Jd^e{!eME zai1@_ro*kAD{QE^E7$OANYpiS z79%shF>HA+K~?@u46;Nn*L`XCUxjhL14pAW>YaQHYLY+WA(}?tV$~BSGBT9Y;K|=4 zO8PITh-kL}%G7CXgF934WQ-jphESZ=xG$zxLzmGwmafBYr19ip7>94BaalbWN3!as zO&SX0sBKVQRMpIbze(?-e(Zxr<;j2}uE2KqQ9W;5Y=PHx;Z+a z5_9&`Upol95D=R!D-hc-xKDCq!9(<1Q$5Z&uR1>%o|i(n$px4?nG7KwCrGVJ#^5fI zJq+q$m*hZVLz|z-G0lp_R*4V`~5%2}u@u`gCWOl^8o7PHCSbtPN9-lO6Wu^xi+;HdQkrPSPWpH%xEs(B^UAJ$6NpCMD4 zqGIRabJei-+R+J?e07$VOpkY{`d2m_`id8?N`c4HxB}Fmf(*>9p3c686K}@_5jzQu z@_da`SQ(>2aFu8sM6}ALj8I3=k>!wMw6a-0Q^u<^2xHibcfouhfq+uO2e+EzNm-x3 zeQeAOyuC^yr&DfCmTaYh5~#pu35 zCD0tC`36;#<_FP1q}2943q7goBuYKyMtsc$$r+l7Usk{s5F2J}B3!41Y9S=69BJ@4 zeAxbP*2peM54*&v7~)nD!z^8>vLLcu%7iGox_ZaVF;puMU0uqA zI0@68lwRJZ=zByL&zR0|DHEbleZ9Nt7>d8Jxi_A2t0(eA_zB(%`wjm%*jHTMt(^uf z@E$=*B?A08#$V!5Tj64F-`0i-RYCdVGUe}9DWhDrCl__Aia`&0!&kuFS$yj(DF$l@N3tupKUH@`+Q^ln1=)>Kp19h|}>@Ts{f^oOkj-!+!zx zg3HI|lc4|dzOdV%#V{U}!)0>76uMAny`?ajk!W5EqPFbC{PmzVVOhLj1q%~u7p zES-K}_qeD@zfik;y~o+<2XQu@3JN+%j=ZGY;VT05>IWbf91Nii!89r5u~)&Gqp?jqrTxq4Bry$(Er58RWb4Tov#WyA*q-1;Opiq`HZb+;wfm=#y}*V zj=;mI|K!O|PO7yIQxoAo0(qYEviKjHQva4~KJYY6TUfM&G@U^TF z3k=^D?2s$*g;H{@)%h0V={k5=_n$o3DQRkrvFT0E-6(db1^3y+;~V+d&+- zOqHP?vVQ1fbUg{;rOR{;Qh&^XuBWZ~s}b6#kbdv#F?IfNPWGR(K87CFQk7H_vo~B$ z*8IK_z)MyD!-xRYAgmn=aQ7V-(6nRcD$Z{%vi!3&d$i-;XEs5Rj|BNra;B ztw$^q(gk3D6V=5yNR>Sa;AiWJ{m@gg7A8TsVnfPR6_F7se_O9$ds_Ac8-Zv^%C1Y? zu}ks!uL_$m20%E~0fJl?#`K4SywSX#t3)vM|K%>5U|NE8XI9jyZcXJ8Z8l63G8+kEfitlNBU=@I}!e2urFMJN45z% z&cC(2K|cfbi;Koac=cgKc(Q-tc7uk{L^E)iY>17ppfmj?u#}JpGy>M$MGHk(_+|bx z)eJul?7S=Rh_Ik5{ZFH#6V>b}_Pc0ogf}B=Q*QD18?;dK<9l(ydXrTxT|Fr*abX1bS(_r7f0*?p_`n=!5a!k+*z!K{@c@Z1oA94}l zm;FE6b+{6+x-J?UVL{*U7r_`PTDt%n?xKYvEc_?_SM5eOAM8z6;1OX#zw~!N6BgBX z0DIU)VsHZqST{w9{=WCPP?Qy2WN zjW<+f5RF{QQD{$xMC)Jvhu0atH`p2fiI=Xz?k~h=VnThSlFz}^P4KnN^~nshE1`GV-o?? zOK5WdTL(i~hSvDB<{t&V!N47iO6i!t5i_~upJ!S!)iL|=%l z3BG`yMtIdUNavE!<7VMQTwMmYoFnJQ{z2r)W2=Z*-1CfDPeNTDw;rR`X&TuKBC;j#)D ziiTgKte3W>hEG6u#opRhGVEOgTU6Uhg;P%L-4VPB}5)&8!mso;rtXS$4QIb&k-ss^ODN?P#5%>ft}=Z;ZCp z3cpF&SZ%8p{+Y6I+SVXEaTsjlwXI2bUS-%OXj_Z$Q zY7N;`ZR;HVV-IZ8w5@x%odw%;ZR;IgfKv~v#+NbonMFLYW4_4JYy=ZTL-->!oy5{KV#_|qi-|bL|k+qJfx)Ie?dpAK}_KhXY+gvMv1js2y zdNT}pRG85Z8k!{5dZh{IpU|Ns&ga1bM97zTdLXO|1_MBhe2LoWTFkNRr|)^~44YM3roeP;mvsrcY5CppiJ`K-kU& zm?Ji|s5?|PSpgR{0K^!FGP}P;Rqo9on%%h%zX8m^7K7N}P%#JUi>e=&foxF~>mepd z9Rzihvl;MjAY{$NHVmgjOvJE#-BWefYn@ty9if6te%bs(F3s} zIR;N2tr2S;;u*E}0?pG#-ZQ4+W+gRT&=Nz_k4O_AsreeCLa1JRyCW$}QN%`)R_Zgv zpedD&?>P$(Op^wE4rQ6maVEbr?B|YY--+XxhShweDUFH8bCTAuCgVVkuf1A>>2uPE zBgM^A&&Ei8@Nf9V!`v_DLp1i!*$BNmocrJktV8guq`ziDHZ_QmCiEa&ra(5^mDf~V zZ-e~0%ngvOhWkcWHc_pEYtnpaOpLNu-3{q+hcHcQl47!wmM}!GQm;Y&fy3z6LmFsg zB@w*;0jUSc*KrJ{Azt?TA2(JVj?ET0_!JNG#1cqLMKs8yd*4TcSjN;f0nwAxjkE=+ zTpv4O9->R(8!kzoiEuQqNe*huz7W|`xUY3&!MqsHUkk7o!XqwlGs3Yo{2;(H5WX7^ z1W5(YBG)|E>WG{dRQ(9f+ro)7TaLy|e18?}DiGJWlqicu*R@9!ewUJI1+1HcI^7%} zUnO0tW0|}f17e0lN$fDQeSILHfVyRf>Ednzv6<8^<|u$m0|127t(YbrqSHMP9(Mp; zxVefiyeAb?a1W^P^bznM5lU2X!ph~HqwqbLY zA$CyL;X_?XrPXI>9`dqE4xDY8n<7bN)g7aZY^cub3W~YtQ-g3Hhs)FuHc8JEwTW3% zS1Zr>RE4FJv2;hP3UoG>G38UV|f$>5g4m2dOxKpNRhPm43}cD-VVP+x`OMH+#&UWnEVH#` z+^~_OJ%I&J>Trh7oaPBEG#2gz2Nr2dTGD2`s*=l>SJHBBf^j%sFLOo($Kc5$l1E`4 z-!jYNdu2E~f_pw+AXCLJHfe*wfv2=E45*IZLBhjS?&%GlC6*!Q8$^?>yW>1Wj;CP$ zU$Cd&Q3_TS7KJ1>Tb3iXGH|cr$n-G)Oy4r$ zxp4qX#}DCGwE&Py=xeIO7|{)rs+0~ZXQ0cbdNueD^Q%wMk2}yEoC}l378DrKMO}zmODWqutHO)O+%4nJk z;QB(E1X|dBC!S+4^|t}I%Y`l?$B;UCP_VMkOj86;19-)SSfc@POh~!uggqpD3E*cJ zGMYFfq--q$O)?@RLw^{TNu7ast|jHxS$PJk1E5(UXeyxt-;^*=9{|G(L3?)tIy4dy zl;8>g+)xPm9i^IbZSpl5ir!F-b zo+sf7h|QLLE4HO@U+c)^C?3jB+SyNShNF2wrtZM)9zye}4svN{7cODO+l2DxaC;?I zF74>g){x&oA74WDJ>@zAxw@Ts)%hDS--EkK!gMzcmj-mr&eaVmNlgnFH8nxhcPLCy zq@{(_5mX^j(;dQr4q&U1rk1YOG%#vrfml+AlD1Y>rD5tJx^{rLgOsG%)+LRtk~%-a z=z0po%Y}4FL#l$GDm1#j1o3krT|!->`eotK7Be9QSydXB3GpTvkw$56b<|hOOYbn&_(HOOu^r*Fo4p}f}pzFb>f|`}+gvDNZ4>Zso9I8+; z@j(NA7%JS7BBfq{k2e`BvFi1BQ8gBGh;X})>^1230DdJDrXNpT{h6aqe!p2m2H|XE zh}A71BUS~tSp74XJ5%VLl6c=Sv2chAG zACd$8mb!{gy-Ku((_`}OBz#rJmsTIWa(MRR7@^a6rZGHcCgPUHBaPv?^I%L;{H|8` zA--&-QV`A3xB_AeGAJ8(Se$A?*w_VrM%--R5dpeGIM4<7;UpV4F2Ga>=eq#Erep(; z3a|mf+gyN!Z3B-9a36#x;{kj3MUwKIQ15{F+@U9V#elYU=N2 z{i`R&FSQrKBQ8Ks=m1Y)3KD*6{cJp&fL%Qg;8j9TQ77aaw!-f`v(bzrUqSYZBiEr6 zRUDDRXJ5zsPe!B^=q!y(E3qMtNa1(?NHtJh0L=?Q900@by|LIp{O$1(g&_Gd*#}du zHqd+kD+@s!l*1qL$6BPm z1#sTcge-ccCgh*Jc9U6s7R7#230zJVHXQ@`m#2oK>qJFY)gh}JE3df*@~=j1$9fR; zTy=)5SFC(zKghq%nuk;}k`o}C9xD%&f&81wqfJUzL$)ziKBhn9=f;&b@RkWG)3A3{|P|9lVXpvYH4wlP+It{CLM z9NJ{$hakHzR^Hcw{MSk;Mt&Ny*JI^;g(Cdh7c-6gTgZNM~(AG|B8_M^mmV$4#1g9!DEqjcNJRaezP#44yyFgQrMs{+f3M=>>+#1@jN?yGGg z$5*)qkcw%CCJ9;U)76HW31YEJNf&RZY!yO2NfNe$I6z8zG~LA;s+wvt%;BbFJU9GQbbp0E|c~@5~)j*YPZgeI0LTYfC*vptq6M7Ber#!l!9V4Rwb z0#MB$=tiL%=^zFqegIRjiRujuIcg*jP9hB^*&tZ18pGB%S)I50z;(cO5Y?G$sCSlu znyOAsFg^7#5Kk4NDxi}MPgk#RGSqt@K6NPM0FUH_XR5y@;%pGp_7{W}%0vfdj^u@B zskhLU1t`s973MY(y!%iOCZp5NJDs$1ObuYZ+@tIK6;*>Hf!ie=8oi#_JcFsSE?h!Ah z`LKR9FQ&Z!7uk7(>FF!*y=&D&=bo43yz(l|C5z_8{t zp2X;1Vt7Xy-M7!|SI(Zj0S_Gz2{j$Jg}4IU0jeOCU@VsR(xxB95~U%bt+?%VA?n2B zOTTh9fc_qa@B{&|*|Gw${R{3NJF?(VdbVFV8(RjRe}%9}AKP<~NzzaB?N`qFW6mIv z%>Y&1C386mG|=XG$Qps#0?3Pp;$JyChx($%gD7w*33RlMTD6wQxZ7vugIW*b)_4j5 z>Q~MJaFo6XIPP-OX=13-7-&FTlOfJyoT9R<%XpJPL{b}|yLR3r4TpCFZA}Uxrqx96 z6e&sn(!e5VOkP@ZROLuInKZr}7Af^SGrta6OC-!%llIga7)#fH(RX+S0!dP}G1Z7v zU{Go+qH#N}fY?yIMOImC_rv{!BMUMJd~XBa8uvt+y2FxWB&-fWP zZ&v6zIOMRxu&5Ke-|X>ZHToLO0$-N*&R~Pdx~d1I4OCVaSn87Zs=c^BfGa?&3ciec zkd;<{a*OKZ+gmgs0)rrqT5sTIc>V&y3ogLO$5+r0MsA60Dnw;* z>0siZ&0QuLCbuia(ER`o z6Ot^va^aOn`l1%^5$iRudD?--i1jHQl0?RPR2-t#A9Q9d$S8(V_hmI7H5jGN8pKi$ zKQjuIuzL_4r8m&n#&BnFyvXV|kS!sRFKlNGTMfB4(`On3>HZ;A}LF6r=1GwGiLR4fofjLFE5_t~7 zR|tsBmKBKYGr0fY$b!k>o#rtDD_7-*I)3&;dk!-4aW#M4n-xuDYeLl6CFA<hk z$@6LCk|S#hClfMr%9_fSATy_|X`^Z6%qeU7G#F=$LgccR)k9_S&e%K}=IaL`0p1x^ zSHZlT&!N0C_R+k86D@BVzX_0aFP9inC$k=G17kgIhg(^Xy*vUb&BmO8DV1|nS$&jF zoyVJ`NM${{0&;cja6AOW6%ZS$o5g%qTKG&&vAXj&V4HhfGj&04yZ5 zhUy^a^Q^3|J8s5@yD8ra+3m4%KF`Yf{y1`JD}6i!*%OrO2h?#HxRl>7z2LYj>d{WL4ftA^fWw3LUingiHRpty^hm88Bxrpwk)8xY+| zNm_!pA%0kFa~n6Sq}o*4P~$-Gb6T;~Al0fdsIVHBjySJ|bR!9!ra`LN)etsRGe<&r zCj>`aVIy^zCEr8!FN^&NruY=`My8NgS+`ECWy@ZTk@eUM+3pWe#kIe0V`MjS;5;z&W*nOn zor&lN^O3i3PZ?l4W@-*D*k7EP5+kCLi=$k6B6H-BnC4 zRtv&wV*$Q5la=DV^H!V}WDq?d>>CRtV}#8r;Y~sHpGjaEgmYto61xGE@>a{ifnWj~ zA>0-V@PhzZ<-DGim@hJ;?uYOM0bMCOqR3FBLN)UiWSBBP3*sA>Vkrg<%6I3p@F|Pd z2K8f9Du&A_BnpK>b@jc!(NI@|XcA8aW6^wHFx6yZ9UDJYS#y2&mNbz%0pV!}2uetXTH@=x%~Z}W zK>S2Xs<%xQ!MA_1R{2ieX<}V;JRbevil=xSDr=)}O?eYy9T3e(>D)IV3boZ&sgen? zFNhI^bbY}FeyeXM20dw23qaghNS9E%eFew|XT@`F8wNQ*1f*RZUa$#0>1x<%cPIJjCr9e>lxpBTiLDWK-|(r zq|>P*?|fyw=6e&fH<>f3fj}m@nCwuo4Cqbm7cNtbZW=&>>_OU3zp~=j*5%oceUMHqNzU_XpsFiSeaf zM;+V?Y=AX%DLQnd+^Z@A$tI>dK0^$#_8zo}){u5|6d~r%EQgMf*0CD&KNOOQj(<-UWUa6^*Rz9v3c}}|0FX68thU~) zY7;!U{0#}+xz|xgmO#gP>tC3}>qI6XHn>DhO=Lq_lZ4hWQY~P&w%z)i zyEm#GBt0GfIvsV?^esT{v0lB)PRB$ba~&nR8P-w9y8wIDdLV3Ln}BS0v>`=8d};Na zWfR9BebXUyIXl%$N?gDAu3zNK`o-FJJ)?OJUVe7Gxw}TO+eciYM6D7i`#g5n*ioR7 zU3hjAjKF)GWX4E{7&(MYH3r(j-6n)6bVG-4UG z)HYa_Jh(HIp6y#Hf6L@btl#Cm`Z zG)Bdt=MEocN#V)9FQ#Mly?PhcF#CLWAe#_9U$68m*bn%)TI0Jt+58}6c)E|-lD%>W z%rkr^pf6P|sSL|3QKHIV#aRhgfGYW|VG+*JLe&tGwvIITEf@^Xa=>SSZ+&+&T^bBx zJgE!R5%kUwN>2DJ^*x_#sOv$jFGTThV)zDM=1$CA5jk}b#DkYnBh>hjb3Ngkd?}cq zvDK(EAl`N;L}?)UmGF8WzyCE3d8B@V@b_3?8~TRuCf_=Y^KwjxUpOd@OUD`A&nT38 zc#Cfm1`Pi48pc0Jo4CYCH3-cke2ecA9_o5kFG%`Rs`G86n#mY!_x%q4UNsexIj*#h zN@kYd>Z`g)C)2AoLdxSNv3XWUZO1%1e7o-(^b%5x>JcEPF2m-?XLG~5e1D<|c-1=; zODuHGquQ{Tqt;Il%6Hz*OzXRwwPb$*`zOFM-$tjfOGryG>KJI%7d7x{} zV?O?tYO3N77>1t^TJ?ZSUt9tD#n13+;Ykttl$rujfg`r74PO=tzu+5c;bZgkb~A|G zF4Z4yC`m4o!>4@;t-2QUUDb16B8s`oI$ulwF^W~fg@h`3@ZVimsz0|R`irXV`FRB>uDIhSO$ zLhIguVAOCBlU*vdm{P5ZnB)qz62#^!Q&(9XuQegw1LBxN*@2a_2JJAws}R2B0;ZTU zt$po0p5=_qISR`$_ADl5Zd6JoY88QFo_1i2@L-z`G)AmUTb9v}{eP*<`EY2#-(@OQ zl?lSn5+y1A(od-@N>m@*2H^^b4L_sPpRy_|h)#Cg&8i;yv*8x8R^pyl4~-yyFhePk z`#K!VLo1%J(O(npase{+FhnPC1;nbyJ2EoN(BR1!DN6dE!<0AYCZICc;O1(H!P{Up zTlEy1Ct2rd)K9X0r}5-su){6PLu1Z!T;XfNm6qe_Dm1FDm}K|I6$ro&9zs9~rV#pQ z$M$8|vWHAf$8DhtQN6uiKPQd;HbJ1 z7r&Rka;J&xMNmZ`*1^O1yN!z-#3?|9qR#XB_vts>GR2c_$)E@VK|wC8LSj?FhfeY&xPs&oOOZm&?o?Z zHNmYAZq2|a0iYu)_lR`~KJ&B#jS(vq-trhq#Ns_F4pFNLof&5SR9!o%-qcPSb?w|! zoWHWr2lhd@0%Fy1AR}>*Xhkfl%3xgaw6$*m>S%QUF?F;7tfr1qY%1mm8VjE;;`(F@ zJg76cy^kv}6QBwX!riHY^M+$sA@nP5-gyo*nUMXobrJnt1z~vtVzXrhVyg@H=8i15 zoSy9}xNtB$_l9t!3o!C=wQJosOH5=JfV$Bo;~pnn)6PJ90NfuB#aF>G$Vl}(h_fyw zf%5l$oX1HGF(pvngSZ$^IaP2H%37*mNq8%ROJ^Yx&z~(Tu~-t{5bkYpITcXnkZy=h z={g2fq1DLisNC_R2k@Dv9caYM?R1z8B4Y6#6^E#`fzGTZJ!i9igoY~rd{hwoOYXfk z48dqUNj-z=iVB0TSaaV$G*T$9;%6N`!WEz=6=WTDTY(&Tp_9`b92Z1l3%vE5k1)NV z8EQGhqzfyhd`3I8K<#Ci@)_;WB2^It&n^sA=LaDIbHs~RMd3UYSAZJ+e-Q}6N6)2* zK*`W@)dn-u9J(+9*%x{vh?^B_d9R~sFt4z7i_G%M$FxIhRRwfuy@suZ>;~&`ktKS2 zmE8dQN@FjoKc^kK(b!Y<=d(kr)N1hZ`RvddNtb-mI&_mtSOE94&p^ipbsqU9pU)0$ zQGe6SDPd@1pC==SI*sI8=v_m`8N+e1?r5(Cet)-ct(hlubn`!2! zv_pH;c9>IDsajCFPg1XTLh}J!0p zcPLDrcpf%X#`|Xnk7pEtp8QwhujfNT!<`B@Op+8X>ig+`SB+<|f z!aP@l-sBHe^M1J=-~M0_Qy`q}YA`@eZv$k&0s`wH+#0KaoBW}AUQbJ-;V6U;$7&Fu zp||6$M#Jk6o^>_oGxnio-skRs`X3rzdDwIQnW3tw|a{S9^Z*1<$XfI$$Bj0N~IK`832)y1rQ7ecr^7U1KAP=D`Q z>`51AcI<@kfD6c{G(&^E3sIF?QGNol(~exHM?<5$1)K1)BB9R#{76WOO+)&Od}yL~ zDN-V;f*6&q!lhFaN6qmr+F^9n2GNvMoUT5V5$&bkYik;+4~Rhyg{mgN4c?pvCa^gW zE+k-QU7sG%u*UoT45Q%|2zSP5Ah5w(0%au8eFVZMT@8a&PsU-3_bDuB)mspJ>iE_z zYmlnC8^l5H5$4J7kb0Kd=|Jn`CqqMzdH=@fsL~;*|2{u{(IUBr#|NR^Bjgg)}|Gy=Z= z24=U*Npxai{(MWQy7d#^?TI2bkSCxXef`hn|1^GBz-1Nb5;amr8DQb0xzdR0`QELE=e~2sZ z5o-b+h-K_TMwcv_{1M7z^l(qnrgX$OFB9sb#k#_~OmmACXHSx(o<(CWT9UN7A3BcX z3WyEgcM(}wZ0ZaI?>oZa7w~`?9{Zi5<)>k2mJ=Jl0{Dy2x6}tYd$yvP2T)v_;H=W& zTn?9!U#DhFp5iH*y?!f>5zsv2iY{Z zFQ82P2FZKosVNNL+8a=R)ke5%a{w$WP9fT{Mo3y|$g37y03cNe01ducOgE&Zh+1JiH?#AeG1#8wUN^&MGo zGdBeaxf6r~U4W_6gNXf7#ZatNC9*R?Ep|z^aYXh+GSa;HOGH+nZ2%6&L-EU= znYSX)6ClpGlmse2h-t69SE655Ux4^2o#-e+Kc8&^QAx>AynI7qZ27FA_1u2^}$whDE0 zKY*AzdK6YuM=3TH^8*^)+Gro-Y>2L-*p1ND3AaAD0^b8v!MAaDs^Fl}I95z(3T_21 z^c5j{<^2c!t%qtN!b&9jRes2qSA@lbpfoO}?0wg%DLr6f@P#<8>VesnXau^?u~Q%)5;hPjAT!J7bV zCL~#i#Md6jmA54RKDa-D%c+1S>e3LM(sc}|LJ3G?RPGV$Gx*HY4m3urU+BPJX2x+) z+@sMMc{gP>-i!g zz?Jt=3^_S;VFc`zH!F_4@-EBZaOTxsdGo_n_R70~$lR5;w!15DZFg7R3E=IOH`8UW zycf~kth^^ezrFIFL$g_V?@v4;#7HAl)Dy;3CqqJF9I`Iu+6-@r3>fZfCVE z*j6BSUjfshI;(AAPl9{ZWuIoeoYnU0w;)|#KzhL?WKt=kM5>BiZ6~kAlRsQK`IoP@ z%T>l%6XsGqAT1m$DB(G)?RPN8dJcu6`hytiQ0{8`=M0S01m;1wguokA>aMnL@EZ*~ zAl&0>a8}#*uQwVVgYcxQ!C7r{Zu=2~_yEGsT@B7^dpv5{w*)Rhn1H#ViG%*V2duU; zu-Fm}84&Vk^GuB}Ktu1DeMUn|2-~|FoYnR~#6b;$V4UMy_p;7vdmBq;5v1$miJ*+G z&T9KxlqOq@Itc72QJr7TYWoAMMg%ww;p?%0S#39nm}&1h2!D8iMSK~4f63p#0oYnU7{zh$Eusz~=ceOpXi=oDYD2S(mRE^~D$Rk$U!)hY% z4M1*jFbK_R`@zu=-UGpLM;K&xZ*zXQl_ul8HbcQdn17o{S&U|Ff@+GNz+QS}ZLeyi3+eusjv0=I>vhrek z2kxIcvfz2}m~Z}jDm+)~dzws<{Zf%EWPi?ggqi*t~{fSzg zPu&aQv#!2FDA!;Jto}YoZPjf8_{qM2mUT|rG*+?#}N3#7bs zF4mTJLXxLe&$LxkhA_tgf-FY;wnS}JfMh05AChgO-GJpeD55`N1b`VsvF)j&GX=ug zvB0D%0A?;4Zv*Qg+!_m1=mucc9#aNBbriyfU7$eiWfh*i2kG{yS0H%P71ma74}@^e zrkS?-A0WIC3*@t=&V8}14HUy3PdQw%`BhsDK?jw5UH2h2buEb2g{ZGlos#F>*2|{y zL5wX#y_E~9px%6&S_)$Am8tnJ?6j#nK|B&q1=CRO$m3U;gazeF+vpp>K8i;{ZB7NX zux3Y_`U6B7rXVp14VGa=lJc#nRqtWuFFh5pJ=KJVj{nWmyFK7(MWlr7X#_l6=X#P> zCRLUpA!Z|&fxj^cA?iA^3G7anXB7vv5iw6*RVvM<9s%*HOSxKwFHn5XHTkA_nC|%0 z7vRo0ER=nO7LmMm3F;o(qE8h;vrNI|w1H#S0a&*HRg33Qd@38lnl4bF9&QF;{VMc= zKGhb20TfE3)frfYS;-qh6L!;4q=TKDPt63oIG#tFT#E=MZ(f99$)~nJdYFW?Nv%=J zWi}Lo?TjHTdFxx(k$oE6D=y2N#qW~ejc#%UJ0SI;BXiH&e25Mo@4rHl$Bq`?FG%8e z5rE%3ElWYNqZZ>EwHR{L;z$~`c-klbs}K|yzxWVv=jdq}d5dh~zZqm61o^lEV!iBh zx}4s|pGu`3IhD$(PyDxc{|k&bb91QQ_Y$F!ssZvP=NhQvy0whz_Z<2PiP4vE`<^ip zt2@H}LqyzVdfbPC<09+H;Nmhd6h4k!pq$4|z-f7P@C3I4htb5mHZXohF`}ej5e-%0 zYB^D!OaFT`Vk|F@@++gE@=Sp2bA~ea0+L;*P-X63%1&u0!bNV98j4pjLmf{+t9lAP zp2rmsn=R`uwh!RW*^ZV4PlLCCr~sEBOuf|sWU}-YDgDA`Xh6TtUe9hosw${jBtK!G zkn@Gj(8#Sw=@!a6K-N80&eMvaacy$Fo^$ju7P2Xn>uBm1HbYZNB6}9o|4PUy}Zetk5w?B?1=$$0>m3PJq%Xz0ez zkgpP*QkWuC#-)>MYvQ*@L+ge#Hkz6O=s-x)WJ5f+8`}JQTcc?hfJuck3AFuI1h<;0 zUjbmF3rRugv*)4x?;?w(2o3>w$c5w}q5jZs=-|^$_2**L836CQkkP~w$DxN`Y-gZf z0eDd=CUpkNuMFt%Q_T!i20)cU5WjO6I{ip%1GNCqxe&z9Du&LaBgbV9G!nqnLJ&Wz z7+c!<{nxCi*aJsDc^-4P&Wc z3WNm?pqq?7vmDA&Z{e7OsJR)$tqz5VNIS2t8UheC4?_5~1K4V$q1ROpA}~?I51oHi zh?17xQ2o@z=<*@rAzV7uwk~Pv%~c6BKGDTz=Q*S#Wi}TCd@#8A> z$NmY z&uU?S-*Er|-);gn13aI#ngO2Tm;s&#(aZqf9x;v?;F$n3z*hrg26!F}HUm7*kJ$tK z0ccfw;Nvb_0kPS#?qYia?k_sB;9>AK5EbAf2!C{e!UO!r9lf5V090Tfp8DVlJj6hq z0X`p{_#DcsK~_6ft_S#!TX{WC(?>_hdQh&TX%FzV+j~93=zkn!vmCi@K=uItGIh{g63weF(> zb3bA|PNR0ELk5q{V9*_U7uqYGV+P&lfto>=5_`~PJG2K~IpJvrT{+=t238AtxH60`Q3Vi&b!{7^0V0`uV z9~+Ms63Mj%Ho)~ox1ijfVj#IHiaA(PfB*KjhMx&`mCG{}&C?TjwGR9cf78*1-v{9M zKk#KRTTdG0U)~z0p%Fp#FR&lGyhJ)z2{qn-(T>GM5Je9;X?@O)H6rjl28X06{>1~0 z!Yp8QT+}EOYNr3AwI-UKLFBtstimZBq3}9?eg&g&Hn62G%AbTputF{LzmC%2-m&#He-HM+aQ+eUXB;NTz&wkT>NW++?(;v0 z{FX7!o9fj%zXJOQdADZk+H8Az*nigulR4g0pY~M#ZtVZzGM?OAl8OzVJz2A#_D8ZE zpO*I77rrLBJ};}{@cB1tP10$9qw$VUzxKHSzV7%ZpWK>A`j`LyEK`@fsR`QWY502E z^(nO!AqoG1zuyKYq#~OC6KwK5PU_tH3Qwol0>1H&MAf1mT~ausEk0uUZ4{7MGP)fw)XWVJ0Odyu93rOF-*> z4D9p&flo3U!+b%R2z zTD1V2kjgLtz zFGIu*>#A`${0vl;2V2eMCDLXf*=1c^YP7Zi5p}7?cC77zWWO~A-GnHd3~Zi@8ig{D z9JE3hxFuPeLF{*_ScNh~9I-Z3G73)sJME$@AA2Bqz{;;`6n+8XPnU8lK2_TT$#HA; zWTQ3xK5YHrG9|`n#tkGV{*S%)fU>g4`n{ie&gsMii!%_M}pXrRG?8Y4u)45bCywObR0$<2Oab4%sA#59q0S~tDbZk=l$Nh?p^EN zb=O7r=?Xj5u3c5T>PhK7p{^%@HX%lhtZDIc7Lpgz&Sw^aeYGf@&zvB0$xqx`5iBWh zI^=EO-5cW`vZTC|K8jwj_YUp{EoVvjC~cP%9pm}t6KcPS809W0pQkr26Hd* u(5 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

&8fdCii3J}k{(9p2XUDsNW_`_AutORT5ci1U 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 u(5 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