diff --git a/.DS_Store b/.DS_Store
new file mode 100644
index 0000000..30a4ce5
Binary files /dev/null and b/.DS_Store differ
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..2ea406f
--- /dev/null
+++ b/README.md
@@ -0,0 +1,217 @@
+# PhoneGap Toast plugin
+
+for Android, iOS and WP8, by [Eddy Verbruggen](http://www.x-services.nl/phonegap-toast-plugin/796)
+
+
+
+
+ |
+ For a quick demo app and easy code samples, check out the plugin page at the Verified Plugins Marketplace: http://plugins.telerik.com/plugin/toast |
+
+
+
+## 0. Index
+
+1. [Description](#1-description)
+2. [Screenshots](#2-screenshots)
+3. [Installation](#3-installation)
+ 3. [Automatically (CLI / Plugman)](#automatically-cli--plugman)
+ 3. [Manually](#manually)
+ 3. [PhoneGap Build](#phonegap-build)
+4. [Usage](#4-usage)
+5. [Credits](#5-credits)
+6. [Changelog](#6-changelog)
+7. [License](#7-license)
+
+## 1. Description
+
+This plugin allows you to show a native Toast (a little text popup) on iOS, Android and WP8.
+It's great for showing a non intrusive native notification which is guaranteed always in the viewport of the browser.
+* You can choose where to show the Toast: at the top, center or bottom of the screen.
+* You can choose two durations: short (approx. 2 seconds), or long (approx. 5 seconds), after which the Toast automatically disappears.
+* Compatible with [Cordova Plugman](https://github.com/apache/cordova-plugman).
+* Officially supported by [PhoneGap Build](https://build.phonegap.com/plugins).
+* Minimum iOS version is [6](https://github.com/EddyVerbruggen/Toast-PhoneGap-Plugin/issues/7).
+
+Example usages:
+* "There were validation errors"
+* "Account created successfully"
+* "The record was deleted"
+* "Login successful"
+* "The battery is almost dead"
+* "You are now logged out"
+* "Connection failure, please try again later"
+
+## 2. Screenshots
+
+iOS
+
+![ScreenShot](screenshots/screenshot-ios-toast.png)
+
+Android
+
+![ScreenShot](screenshots/screenshot-android-toast.png)
+
+Windows Phone 8
+
+![ScreenShot](screenshots/screenshot-wp8.jpg)
+
+## 3. Installation
+
+### Automatically (CLI / Plugman)
+Toast is compatible with [Cordova Plugman](https://github.com/apache/cordova-plugman), compatible with [PhoneGap 3.0 CLI](http://docs.phonegap.com/en/3.0.0/guide_cli_index.md.html#The%20Command-line%20Interface_add_features), here's how it works with the CLI (backup your project first!):
+
+Using the Cordova CLI and the [Cordova Plugin Registry](http://plugins.cordova.io)
+```
+$ cordova plugin add cordova-plugin-x-toast
+$ cordova prepare
+```
+
+Or using the phonegap CLI
+```
+$ phonegap local plugin add cordova-plugin-x-toast
+```
+
+Toast.js is brought in automatically. There is no need to change or add anything in your html.
+
+### Manually
+You'd better use the CLI, but here goes:
+
+1\. Add the following xml to your `config.xml` in the root directory of your `www` folder:
+```xml
+
+
+
+
+```
+```xml
+
+
+
+
+```
+```xml
+
+
+
+
+```
+
+For iOS, you'll need to add the `QuartzCore.framework` to your project (it's for automatically removing the Toast after a few seconds).
+Click your project, Build Phases, Link Binary With Libraries, search for and add `QuartzCore.framework`.
+
+2\. Grab a copy of Toast.js, add it to your project and reference it in `index.html`:
+```html
+
+```
+
+3\. Download the source files and copy them to your project.
+
+iOS: Copy the two `.h` and two `.m` files to `platforms/ios//Plugins`
+
+Android: Copy `Toast.java` to `platforms/android/src/nl/xservices/plugins` (create the folders)
+
+WP8: Copy `Toast.cs` to `platforms/wp8/Plugins/nl.x-services.plugins.toast` (create the folders)
+
+### PhoneGap Build
+
+Toast works with PhoneGap build too, but only with PhoneGap 3.0 and up.
+
+Just add the following xml to your `config.xml` to always use the latest version of this plugin:
+```xml
+
+```
+
+Toast.js is brought in automatically. There is no need to change or add anything in your html.
+
+## 4. Usage
+
+### Showing a Toast
+You have two choices to make when showing a Toast: where to show it and for how long.
+* show(message, duration, position)
+* duration: 'short', 'long'
+* position: 'top', 'center', 'bottom'
+
+You can also use any of these convenience methods:
+* showShortTop(message)
+* showShortCenter(message)
+* showShortBottom(message)
+* showLongTop(message)
+* showLongCenter(message)
+* showLongBottom(message)
+
+You can copy-paste these lines of code for a quick test:
+```html
+
+
+
+```
+
+#### Tweaking the vertical position
+Since 2.1.0 you can add pixels to move the toast up or down.
+Note that `showWithOptions` can be used instead of the functions above, but it's not useful unless you want to pass `addPixelsY`.
+```js
+function showTop() {
+ window.plugins.toast.showWithOptions(
+ {
+ message: "hey there",
+ duration: "short",
+ position: "bottom",
+ addPixelsY: -40 // added a negative value to move it up a bit (default 0)
+ },
+ onSuccess, // optional
+ onError // optional
+ );
+}
+```
+
+### Hiding a Toast
+In case you want to hide a Toast manually, call this:
+```js
+function hide() {
+ // this function takes an optional success callback, but you can do without just as well
+ window.plugins.toast.hide();
+}
+```
+
+### WP8 quirks
+The WP8 implementation needs a little more work, but it's perfectly useable when you keep this in mind:
+* You can't show two Toasts simultaneously.
+* Wait until the first Toast is hidden before the second is shown, otherwise the second one will be hidden quickly.
+* The positioning of the bottom-aligned Toast is not perfect, but keep it down to 1 or 2 lines of text and you're fine.
+
+
+## 5. CREDITS
+
+This plugin was enhanced for Plugman / PhoneGap Build by [Eddy Verbruggen](http://www.x-services.nl).
+The Android code was entirely created by me.
+For iOS most credits go to this excellent [Toast for iOS project by Charles Scalesse] (https://github.com/scalessec/Toast).
+
+## 6. CHANGELOG
+2.0.1: iOS messages are hidden when another one is shown. [Thanks Richie Min!](https://github.com/EddyVerbruggen/Toast-PhoneGap-Plugin/pull/13)
+
+2.0: WP8 support
+
+1.0: initial version supporting Android and iOS
+
+## 7. License
+
+[The MIT License (MIT)](http://www.opensource.org/licenses/mit-license.html)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/package.json b/package.json
new file mode 100644
index 0000000..c51e34f
--- /dev/null
+++ b/package.json
@@ -0,0 +1,41 @@
+{
+ "name": "cordova-plugin-x-toast",
+ "version": "2.2.1",
+ "description": "This plugin allows you to show a Toast. A Toast is a little non intrusive buttonless popup which automatically disappears.",
+ "cordova": {
+ "id": "cordova-plugin-x-toast",
+ "platforms": [
+ "ios",
+ "android",
+ "wp8",
+ "blackberry10"
+ ]
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/EddyVerbruggen/Toast-PhoneGap-Plugin.git"
+ },
+ "keywords": [
+ "Toast",
+ "Notification",
+ "Message",
+ "Alert",
+ "ecosystem:cordova",
+ "cordova-ios",
+ "cordova-android",
+ "cordova-wp8",
+ "cordova-blackberry10"
+ ],
+ "engines": [
+ {
+ "name": "cordova",
+ "version": ">=3.0.0"
+ }
+ ],
+ "author": "Eddy Verbruggen (https://github.com/EddyVerbruggen)",
+ "license": "MIT",
+ "bugs": {
+ "url": "https://github.com/EddyVerbruggen/Toast-PhoneGap-Plugin/issues"
+ },
+ "homepage": "https://github.com/EddyVerbruggen/Toast-PhoneGap-Plugin#readme"
+}
diff --git a/plugin.xml b/plugin.xml
new file mode 100755
index 0000000..12b5f40
--- /dev/null
+++ b/plugin.xml
@@ -0,0 +1,84 @@
+
+
+
+ Toast
+
+
+ This plugin allows you to show a Toast.
+ A Toast is a little non intrusive buttonless popup which automatically disappears.
+
+
+ Eddy Verbruggen
+
+ MIT
+
+ Toast, Notification, Message, Alert
+
+ https://github.com/EddyVerbruggen/Toast-PhoneGap-Plugin.git
+
+ https://github.com/EddyVerbruggen/Toast-PhoneGap-Plugin/issues
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/screenshots/screenshot-android-toast.png b/screenshots/screenshot-android-toast.png
new file mode 100644
index 0000000..7692bff
Binary files /dev/null and b/screenshots/screenshot-android-toast.png differ
diff --git a/screenshots/screenshot-ios-toast.png b/screenshots/screenshot-ios-toast.png
new file mode 100644
index 0000000..894ea05
Binary files /dev/null and b/screenshots/screenshot-ios-toast.png differ
diff --git a/screenshots/screenshot-wp8.jpg b/screenshots/screenshot-wp8.jpg
new file mode 100644
index 0000000..4ff8164
Binary files /dev/null and b/screenshots/screenshot-wp8.jpg differ
diff --git a/src/android/nl/xservices/plugins/Toast.java b/src/android/nl/xservices/plugins/Toast.java
new file mode 100644
index 0000000..3e39e66
--- /dev/null
+++ b/src/android/nl/xservices/plugins/Toast.java
@@ -0,0 +1,95 @@
+package nl.xservices.plugins;
+
+import android.view.Gravity;
+import org.apache.cordova.CallbackContext;
+import org.apache.cordova.CordovaPlugin;
+import org.json.JSONArray;
+import org.json.JSONException;
+import org.json.JSONObject;
+
+/*
+ // TODO nice way for the Toast plugin to offer a longer delay than the default short and long options
+ // TODO also look at https://github.com/JohnPersano/Supertoasts
+ new CountDownTimer(6000, 1000) {
+ public void onTick(long millisUntilFinished) {toast.show();}
+ public void onFinish() {toast.show();}
+ }.start();
+
+ Also, check https://github.com/JohnPersano/SuperToasts
+ */
+public class Toast extends CordovaPlugin {
+
+ private static final String ACTION_SHOW_EVENT = "show";
+ private static final String ACTION_HIDE_EVENT = "hide";
+
+ private android.widget.Toast mostRecentToast;
+
+ // note that webView.isPaused() is not Xwalk compatible, so tracking it poor-man style
+ private boolean isPaused;
+
+ @Override
+ public boolean execute(String action, JSONArray args, final CallbackContext callbackContext) throws JSONException {
+ if (ACTION_HIDE_EVENT.equals(action)) {
+ if (mostRecentToast != null) {
+ mostRecentToast.cancel();
+ }
+ callbackContext.success();
+ return true;
+
+ } else if (ACTION_SHOW_EVENT.equals(action)) {
+
+ if (this.isPaused) {
+ return true;
+ }
+
+ final JSONObject options = args.getJSONObject(0);
+
+ final String message = options.getString("message");
+ final String duration = options.getString("duration");
+ final String position = options.getString("position");
+ final int addPixelsY = options.has("addPixelsY") ? options.getInt("addPixelsY") : 0;
+
+ cordova.getActivity().runOnUiThread(new Runnable() {
+ public void run() {
+ android.widget.Toast toast = android.widget.Toast.makeText(
+ cordova.getActivity().getApplicationContext(),
+ message,
+ "short".equals(duration) ? android.widget.Toast.LENGTH_SHORT : android.widget.Toast.LENGTH_LONG);
+
+ if ("top".equals(position)) {
+ toast.setGravity(Gravity.TOP|Gravity.CENTER_HORIZONTAL, 0, 20 + addPixelsY);
+ } else if ("bottom".equals(position)) {
+ toast.setGravity(Gravity.BOTTOM|Gravity.CENTER_HORIZONTAL, 0, 20 - addPixelsY);
+ } else if ("center".equals(position)) {
+ toast.setGravity(Gravity.CENTER_VERTICAL|Gravity.CENTER_HORIZONTAL, 0, addPixelsY);
+ } else {
+ callbackContext.error("invalid position. valid options are 'top', 'center' and 'bottom'");
+ return;
+ }
+
+ toast.show();
+ mostRecentToast = toast;
+ callbackContext.success();
+ }
+ });
+
+ return true;
+ } else {
+ callbackContext.error("toast." + action + " is not a supported function. Did you mean '" + ACTION_SHOW_EVENT + "'?");
+ return false;
+ }
+ }
+
+ @Override
+ public void onPause(boolean multitasking) {
+ if (mostRecentToast != null) {
+ mostRecentToast.cancel();
+ }
+ this.isPaused = true;
+ }
+
+ @Override
+ public void onResume(boolean multitasking) {
+ this.isPaused = false;
+ }
+}
diff --git a/src/blackberry10/index.js b/src/blackberry10/index.js
new file mode 100644
index 0000000..c6969ff
--- /dev/null
+++ b/src/blackberry10/index.js
@@ -0,0 +1,83 @@
+var toast,
+ resultObjs = {},
+ threadCallback = null,
+ _utils = require("../../lib/utils");
+
+module.exports = {
+
+ show: function (success, fail, args, env) {
+ var result = new PluginResult(args, env);
+ resultObjs[result.callbackId] = result;
+
+ var message = JSON.parse(decodeURIComponent(args[0])),
+ duration = JSON.parse(decodeURIComponent(args[1])),
+ position = JSON.parse(decodeURIComponent(args[2]));
+
+ toast.getInstance().show(result.callbackId, {message:message, duration:duration, position:position});
+ }
+};
+
+///////////////////////////////////////////////////////////////////
+// JavaScript wrapper for JNEXT plugin for connection
+///////////////////////////////////////////////////////////////////
+
+JNEXT.Toast = function () {
+ var self = this,
+ hasInstance = false;
+
+ self.getId = function () {
+ return self.m_id;
+ };
+
+ self.init = function () {
+ if (!JNEXT.require("libToast")) {
+ return false;
+ }
+
+ self.m_id = JNEXT.createObject("libToast.Toast_JS");
+
+ if (self.m_id === "") {
+ return false;
+ }
+
+ JNEXT.registerEvents(self);
+ };
+
+ // calls into InvokeMethod(string command) in Toast_JS.cpp
+ self.show = function (callbackId, input) {
+ return JNEXT.invoke(self.m_id, "show " + callbackId + " " + JSON.stringify(input));
+ };
+
+ // Fired by the Event framework (used by asynchronous callbacks)
+ self.onEvent = function (strData) {
+ var arData = strData.split(" "),
+ callbackId = arData[0],
+ result = resultObjs[callbackId],
+ data = arData.slice(1, arData.length).join(" ");
+
+ if (result) {
+ if (callbackId != threadCallback) {
+ result.callbackOk(data, false);
+ delete resultObjs[callbackId];
+ } else {
+ result.callbackOk(data, true);
+ }
+ }
+ };
+
+ // ************************
+ // End of methods to edit
+ // ************************
+ self.m_id = "";
+
+ self.getInstance = function () {
+ if (!hasInstance) {
+ hasInstance = true;
+ self.init();
+ }
+ return self;
+ };
+
+};
+
+toast = new JNEXT.Toast();
diff --git a/src/blackberry10/native/.cproject b/src/blackberry10/native/.cproject
new file mode 100644
index 0000000..34991e5
--- /dev/null
+++ b/src/blackberry10/native/.cproject
@@ -0,0 +1,717 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/blackberry10/native/.project b/src/blackberry10/native/.project
new file mode 100644
index 0000000..8e6b830
--- /dev/null
+++ b/src/blackberry10/native/.project
@@ -0,0 +1,76 @@
+
+
+ Toast
+
+
+
+
+
+ org.eclipse.cdt.managedbuilder.core.genmakebuilder
+ clean,full,incremental,
+
+
+ ?name?
+
+
+
+ org.eclipse.cdt.make.core.append_environment
+ true
+
+
+ org.eclipse.cdt.make.core.buildArguments
+
+
+
+ org.eclipse.cdt.make.core.buildCommand
+ make
+
+
+ org.eclipse.cdt.make.core.buildLocation
+ ${workspace_loc:/Toast/Device-Release}
+
+
+ org.eclipse.cdt.make.core.contents
+ org.eclipse.cdt.make.core.activeConfigSettings
+
+
+ org.eclipse.cdt.make.core.enableAutoBuild
+ false
+
+
+ org.eclipse.cdt.make.core.enableCleanBuild
+ true
+
+
+ org.eclipse.cdt.make.core.enableFullBuild
+ true
+
+
+ org.eclipse.cdt.make.core.stopOnError
+ true
+
+
+ org.eclipse.cdt.make.core.useDefaultBuildCmd
+ true
+
+
+
+
+ org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder
+ full,incremental,
+
+
+
+
+ com.qnx.tools.bbt.xml.core.bbtXMLValidationBuilder
+
+
+
+
+
+ org.eclipse.cdt.core.cnature
+ org.eclipse.cdt.managedbuilder.core.managedBuildNature
+ org.eclipse.cdt.managedbuilder.core.ScannerConfigNature
+ com.qnx.tools.ide.bbt.core.bbtnature
+
+
diff --git a/src/blackberry10/native/device/libToast.so b/src/blackberry10/native/device/libToast.so
new file mode 100644
index 0000000..4afb860
Binary files /dev/null and b/src/blackberry10/native/device/libToast.so differ
diff --git a/src/blackberry10/native/device/public/json_reader.o b/src/blackberry10/native/device/public/json_reader.o
new file mode 100644
index 0000000..e3667cc
Binary files /dev/null and b/src/blackberry10/native/device/public/json_reader.o differ
diff --git a/src/blackberry10/native/device/public/json_value.o b/src/blackberry10/native/device/public/json_value.o
new file mode 100644
index 0000000..6495cce
Binary files /dev/null and b/src/blackberry10/native/device/public/json_value.o differ
diff --git a/src/blackberry10/native/device/public/json_writer.o b/src/blackberry10/native/device/public/json_writer.o
new file mode 100644
index 0000000..f3fd809
Binary files /dev/null and b/src/blackberry10/native/device/public/json_writer.o differ
diff --git a/src/blackberry10/native/device/public/plugin.o b/src/blackberry10/native/device/public/plugin.o
new file mode 100644
index 0000000..bfceb06
Binary files /dev/null and b/src/blackberry10/native/device/public/plugin.o differ
diff --git a/src/blackberry10/native/device/public/tokenizer.o b/src/blackberry10/native/device/public/tokenizer.o
new file mode 100644
index 0000000..80246d1
Binary files /dev/null and b/src/blackberry10/native/device/public/tokenizer.o differ
diff --git a/src/blackberry10/native/device/src/Logger.o b/src/blackberry10/native/device/src/Logger.o
new file mode 100644
index 0000000..bfcaa3c
Binary files /dev/null and b/src/blackberry10/native/device/src/Logger.o differ
diff --git a/src/blackberry10/native/device/src/toast_js.o b/src/blackberry10/native/device/src/toast_js.o
new file mode 100644
index 0000000..d03c804
Binary files /dev/null and b/src/blackberry10/native/device/src/toast_js.o differ
diff --git a/src/blackberry10/native/device/src/toast_ndk.o b/src/blackberry10/native/device/src/toast_ndk.o
new file mode 100644
index 0000000..c67adce
Binary files /dev/null and b/src/blackberry10/native/device/src/toast_ndk.o differ
diff --git a/src/blackberry10/native/public/json/autolink.h b/src/blackberry10/native/public/json/autolink.h
new file mode 100644
index 0000000..37c9258
--- /dev/null
+++ b/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/src/blackberry10/native/public/json/config.h b/src/blackberry10/native/public/json/config.h
new file mode 100644
index 0000000..5d334cb
--- /dev/null
+++ b/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/src/blackberry10/native/public/json/features.h b/src/blackberry10/native/public/json/features.h
new file mode 100644
index 0000000..5a9adec
--- /dev/null
+++ b/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/src/blackberry10/native/public/json/forwards.h b/src/blackberry10/native/public/json/forwards.h
new file mode 100644
index 0000000..d0ce830
--- /dev/null
+++ b/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/src/blackberry10/native/public/json/json.h b/src/blackberry10/native/public/json/json.h
new file mode 100644
index 0000000..c71ed65
--- /dev/null
+++ b/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/src/blackberry10/native/public/json/reader.h b/src/blackberry10/native/public/json/reader.h
new file mode 100644
index 0000000..ee1d6a2
--- /dev/null
+++ b/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/src/blackberry10/native/public/json/value.h b/src/blackberry10/native/public/json/value.h
new file mode 100644
index 0000000..58bfd88
--- /dev/null
+++ b/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