You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cordova.apache.org by bh...@apache.org on 2013/08/12 17:34:51 UTC

[1/2] webworks commit: [CB-4342] Detect USB connected device

Updated Branches:
  refs/heads/master 0dbdf3084 -> b09416501


[CB-4342] Detect USB connected device

- Use 'os' module find IP address of USB connected device
- Add new target to blackberry10.json as Model-PIN


Project: http://git-wip-us.apache.org/repos/asf/cordova-blackberry/repo
Commit: http://git-wip-us.apache.org/repos/asf/cordova-blackberry/commit/9a766e00
Tree: http://git-wip-us.apache.org/repos/asf/cordova-blackberry/tree/9a766e00
Diff: http://git-wip-us.apache.org/repos/asf/cordova-blackberry/diff/9a766e00

Branch: refs/heads/master
Commit: 9a766e00ac21905f325eed0746547efa7ade21cd
Parents: 0dbdf30
Author: Bryan Higgins <br...@bryanhiggins.net>
Authored: Tue Jul 23 12:58:38 2013 -0400
Committer: Bryan Higgins <bh...@blackberry.com>
Committed: Mon Aug 12 11:16:23 2013 -0400

----------------------------------------------------------------------
 .../bin/templates/project/cordova/lib/run       | 37 +++++++++-
 .../project/cordova/lib/target-utils.js         | 78 +++++++++++++++++++-
 2 files changed, 107 insertions(+), 8 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cordova-blackberry/blob/9a766e00/blackberry10/bin/templates/project/cordova/lib/run
----------------------------------------------------------------------
diff --git a/blackberry10/bin/templates/project/cordova/lib/run b/blackberry10/bin/templates/project/cordova/lib/run
index e47e6c6..e604dd5 100755
--- a/blackberry10/bin/templates/project/cordova/lib/run
+++ b/blackberry10/bin/templates/project/cordova/lib/run
@@ -97,6 +97,10 @@ function execNativeDeploy(optionsArray, callback) {
 }
 
 function setTarget(callback) {
+    var props = utils.getProperties(),
+        targetName;
+
+
     target = program.args[0] ? program.args[0] : targets.defaultTarget;
     if (program["device"]) {
         targetUtils.getTargetList("device", true, function (targets) {
@@ -104,9 +108,33 @@ function setTarget(callback) {
                 target = targets[0].name;
                 callback();
             } else {
-                console.error("No connected device found");
-                console.error("Devices must first be configured using platforms/blackberry/cordova/target");
-                process.exit(1);
+                targetUtils.findConnectedDevice(function (ip) {
+                    if (!ip) {
+                        console.error("No connected device found");
+                        process.exit(1);
+                    } else {
+                        targetUtils.getDeviceInfo(ip, program["password"], function (device) {
+                            if (device.name) {
+                                targetName = device.name + "-" + device.pin;
+                                props.targets[targetName] = {
+                                    ip: ip,
+                                    pin: device.pin,
+                                    type: "device",
+                                    password: program["password"]
+                                };
+                                utils.writeToPropertiesFile(props);
+                                target = targetName;
+                                callback();
+                            } else {
+                                console.error("Unable to authenticate with device at " + ip);
+                                if (!program["password"]) {
+                                    console.error("Please provide device password using --password");
+                                }
+                                process.exit(1);
+                            }
+                        });
+                    }
+                });
             }
         });
     } else if (program["emulator"]) {
@@ -286,10 +314,11 @@ function postBuild() {
 
 function exec() {
     program
-        .usage('[--device] [--emulator] [--target=<id>] [-k | --keystorepass] [--no-launch] [--no-uninstall] [--no-build]')
+        .usage('[--device] [--emulator] [--password] [--target=<id>] [-k | --keystorepass] [--no-launch] [--no-uninstall] [--no-build]')
         .option('-k, --keystorepass <password>', 'the password of signing key; needed for creating debug token')
         .option('--device', 'run on connected device')
         .option('--emulator', 'run on BB10 simulator')
+        .option('--password <password>', 'device password')
         .option('--target', 'specifies the target to run the application')
         .option('--no-uninstall', 'does not uninstall application from device')
         .option('--no-launch', 'do not launch the application on device')

http://git-wip-us.apache.org/repos/asf/cordova-blackberry/blob/9a766e00/blackberry10/bin/templates/project/cordova/lib/target-utils.js
----------------------------------------------------------------------
diff --git a/blackberry10/bin/templates/project/cordova/lib/target-utils.js b/blackberry10/bin/templates/project/cordova/lib/target-utils.js
index f74b4f2..535a104 100644
--- a/blackberry10/bin/templates/project/cordova/lib/target-utils.js
+++ b/blackberry10/bin/templates/project/cordova/lib/target-utils.js
@@ -15,6 +15,7 @@
  */
 
 var _self,
+    os = require("os"),
     exec = require('child_process').exec,
     path = require('path'),
     bb10_utils = require('./utils'),
@@ -42,7 +43,9 @@ _self = {
                 if (count === Object.keys(targets).length) {
                     callback(targList);
                 }
-            };
+            },
+            t;
+
         if (targets) {
             for (t in targets) {
                 if (targets.hasOwnProperty(t) && targets[t].type === type) {
@@ -61,9 +64,76 @@ _self = {
         complete();
     },
 
+    getDeviceInfo: function(ip, password, callback) {
+        var cmd = path.join(process.env.CORDOVA_BBTOOLS, 'blackberry-deploy') + ' -listDeviceInfo ' + ip;
+        if (password) {
+            cmd += ' -password ' + password;
+        }
+        exec(cmd, function(error, stdout, stderr) {
+            var result = {},
+                name = /modelname::(.*?)\n/.exec(stdout),
+                pin = /devicepin::0x(.*?)\n/.exec(stdout);
+            if (name && name.length > 0) {
+                result.name = name[1];
+            }
+            if (pin && pin.length > 0) {
+                result.pin = pin[1];
+            }
+            callback(result);
+        });
+    },
+
+    findConnectedDevice: function(callback) {
+        var defaultIp = '169.254.0.1';
+        _self.discoverUsb(function (result) {
+           if (result) {
+                _self.checkConnection(result, 'device', function (connection) {
+                    if (connection)  {
+                        callback(result);
+                    } else {
+                        callback();
+                    }
+                });
+            } else {
+                _self.checkConnection(defaultIp, 'device', function (connection) {
+                    if (connection) {
+                        callback(defaultIp);
+                    } else {
+                        callback();
+                    }
+                });
+            }
+        });
+    },
+
+    discoverUsb: function(callback) {
+        var IPV4_TYPE = "IPv4",
+            IP_SPLIT_REGEXP = /(169\.254\.\d{1,3}\.)(\d{1,3})/,
+            networkInterfaces = os.networkInterfaces(),
+            result,
+            ni,
+            i;
+
+        for (ni in networkInterfaces) {
+            if (networkInterfaces.hasOwnProperty(ni)) {
+                for (i=0; i< networkInterfaces[ni].length; i++) {
+                    if (networkInterfaces[ni][i].family === IPV4_TYPE) {
+                        result = IP_SPLIT_REGEXP.exec(networkInterfaces[ni][i].address);
+                        if (result && result[1] && result[2]) {
+                            callback(result[1] + (result[2] -1));
+                            return;
+                        }
+                    }
+                }
+
+            }
+        }
+        //If we haven't found anything callback in defeat
+        callback();
+    },
+
     checkConnection: function(ip, type, callback) {
         var script = bb10_utils.inQuotes(path.join(process.env.CORDOVA_BBTOOLS, 'blackberry-deploy'));
-
         exec(script + ' -test ' + ip, function(error, stdout, stderr) {
             // error code 3 corresponds to a connected device, null corresponds to connected sim
             callback((type === 'simulator' && error === null) || (type == 'device' && error.code === 3));
@@ -72,8 +142,8 @@ _self = {
 
     listTargets : function(type, pruneDisconnected) {
         _self.getTargetList(type, pruneDisconnected, function (targets) {
-            for (t in targets) {
-                console.log(targets[t].name + ' ip: ' + targets[t].ip + (pruneDisconnected ? ' status: connected' : ''));
+            for (var t in targets) {
+                console.log(targets[t].name + ' ip: ' + targets[t].ip);
             }
         });
     }


[2/2] webworks commit: [CB-4344] Auto-detect started simulator

Posted by bh...@apache.org.
[CB-4344] Auto-detect started simulator

- check VMware dhcp.leases file for possible started simulator
- fix lint
- update device detection
- Fixed debugtoken-helper deploy method due to the missing target password in the properties file


Project: http://git-wip-us.apache.org/repos/asf/cordova-blackberry/repo
Commit: http://git-wip-us.apache.org/repos/asf/cordova-blackberry/commit/b0941650
Tree: http://git-wip-us.apache.org/repos/asf/cordova-blackberry/tree/b0941650
Diff: http://git-wip-us.apache.org/repos/asf/cordova-blackberry/diff/b0941650

Branch: refs/heads/master
Commit: b094165016eea43e710c1ad01a5964a874cfe1d9
Parents: 9a766e0
Author: Eric Li <el...@blackberry.com>
Authored: Thu Aug 8 14:01:46 2013 -0400
Committer: Bryan Higgins <bh...@blackberry.com>
Committed: Mon Aug 12 11:33:55 2013 -0400

----------------------------------------------------------------------
 blackberry10/bin/lib/utils.js                   |  36 ++++-
 .../project/cordova/lib/debugtoken-helper.js    | 104 +++-----------
 .../bin/templates/project/cordova/lib/run       | 136 +++++++++----------
 .../project/cordova/lib/signing-helper.js       |   2 +-
 .../project/cordova/lib/target-utils.js         | 116 +++++++++++++---
 5 files changed, 217 insertions(+), 177 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cordova-blackberry/blob/b0941650/blackberry10/bin/lib/utils.js
----------------------------------------------------------------------
diff --git a/blackberry10/bin/lib/utils.js b/blackberry10/bin/lib/utils.js
index 4f4a500..04fd6f3 100644
--- a/blackberry10/bin/lib/utils.js
+++ b/blackberry10/bin/lib/utils.js
@@ -94,6 +94,40 @@ _self = {
         return filteredFiles;
     },
 
+    readdirSyncRecursive: function (baseDir) {
+        var files = [],
+            curFiles = [],
+            nextDirs,
+            isDir = function (f) {
+                return fs.statSync(f).isDirectory();
+            },
+            isFile = function (f) {
+                return !isDir(f);
+            },
+            prependBaseDir = function (fname) {
+                return path.join(baseDir, fname);
+            };
+
+        try {
+            curFiles = fs.readdirSync(baseDir);
+
+            if (curFiles && curFiles.length > 0) {
+                curFiles = curFiles.map(prependBaseDir);
+                nextDirs = curFiles.filter(isDir);
+                curFiles = curFiles.filter(isFile);
+
+                files = files.concat(curFiles);
+
+                while (nextDirs.length) {
+                    files = files.concat(_self.readdirSyncRecursive(nextDirs.shift()));
+                }
+            }
+        } catch (e) {
+        }
+
+        return files;
+    },
+
     isWindows: function () {
         return os.type().toLowerCase().indexOf("windows") >= 0;
     },
@@ -213,7 +247,7 @@ _self = {
         fs.writeFileSync(propertiesFile, contents, 'utf-8');
     },
 
-    genBarName: function() {
+    genBarName: function () {
         return DEFAULT_BAR_NAME;
     }
 

http://git-wip-us.apache.org/repos/asf/cordova-blackberry/blob/b0941650/blackberry10/bin/templates/project/cordova/lib/debugtoken-helper.js
----------------------------------------------------------------------
diff --git a/blackberry10/bin/templates/project/cordova/lib/debugtoken-helper.js b/blackberry10/bin/templates/project/cordova/lib/debugtoken-helper.js
index 206bd58..af42fce 100755
--- a/blackberry10/bin/templates/project/cordova/lib/debugtoken-helper.js
+++ b/blackberry10/bin/templates/project/cordova/lib/debugtoken-helper.js
@@ -26,7 +26,6 @@ var childProcess = require("child_process"),
     debugTokenDir = path.normalize(path.join(utils.getCordovaDir(), "blackberry10debugtoken.bar")),
     properties,
     targets,
-    deployCallback,
     self = {};
 
 function isDebugTokenValid(pin, data) {
@@ -44,11 +43,11 @@ function isDebugTokenValid(pin, data) {
 
     manifests = data.toString().replace(/[\r]/g, '').split('\n');
 
-    for (i=0, l=manifests.length; i<l; i++) {
+    for (i = 0, l = manifests.length; i < l; i++) {
         if (manifests[i].indexOf("Debug-Token-Expiry-Date: ") >= 0) {
             // Parse the expiry date
             line = manifests[i].substring("Debug-Token-Expiry-Date: ".length);
-            expiry = new Date(line.substring(0, line.indexOf("T")) + " " + line.substring(line.indexOf("T") + 1, line.length -1) + " UTC");
+            expiry = new Date(line.substring(0, line.indexOf("T")) + " " + line.substring(line.indexOf("T") + 1, line.length - 1) + " UTC");
         } else if (manifests[i].indexOf("Debug-Token-Device-Id: ") >= 0) {
             line = manifests[i].substring("Debug-Token-Device-Id: ".length);
             devices = line.split(",");
@@ -56,7 +55,7 @@ function isDebugTokenValid(pin, data) {
     }
 
     if (expiry && expiry > now) {
-        for (i=0, l=devices.length; i<l; i++) {
+        for (i = 0, l = devices.length; i < l; i++) {
             if (parseInt(devices[i]) === parseInt(pin, 16)) {
                 return true; // The debug token is valid if not expired and device pin is included
             }
@@ -83,24 +82,26 @@ function generateCreateTokenOptions(pins, password) {
     return options;
 }
 
-function generateDeployTokenOptions(target) {
+function generateDeployTokenOptions(targetIp, targetPassword) {
     var options = [];
 
     options.push("-installDebugToken");
     options.push(debugTokenDir);
 
     options.push("-device");
-    options.push(properties.targets[target].ip);
+    options.push(targetIp);
 
-    options.push("-password");
-    options.push(properties.targets[target].password);
+    if (targetPassword) {
+        options.push("-password");
+        options.push(targetPassword);
+    }
 
     return options;
 }
 
 function execNativeScript(script, options, callback) {
-    var cp;
-        script = utils.inQuotes(path.join(process.env.CORDOVA_BBTOOLS, script));
+    var cp,
+        script = path.join(process.env.CORDOVA_BBTOOLS, script);
 
     if (pkgrUtils.isWindows()) {
         script += ".bat";
@@ -122,49 +123,6 @@ function execNativeScript(script, options, callback) {
     });
 }
 
-function checkTarget(target) {
-    if (!properties.targets[target]) {
-        logger.warn(localize.translate("WARN_TARGET_NOT_EXIST", target));
-        return false;
-    }
-
-    if (!properties.targets[target].ip) {
-        logger.warn(localize.translate("WARN_IP_NOT_DEFINED", target));
-        return false;
-    }
-
-    if (!properties.targets[target].password) {
-        logger.warn(localize.translate("WARN_PASSWORD_NOT_DEFINED", target));
-        return false;
-    }
-
-    return true;
-
-}
-
-// Deploy the debug token for each target in targets array recursively
-function deployTokenToTargetsRecursively() {
-    var target;
-
-    if (targets.length > 0) {
-        target = targets.pop();
-
-        logger.info(localize.translate("PROGRESS_DEPLOYING_DEBUG_TOKEN", target));
-        if (checkTarget(target)) {
-            execNativeScript("blackberry-deploy",
-                generateDeployTokenOptions(target),
-                deployTokenToTargetsRecursively
-            );
-        } else {
-            deployTokenToTargetsRecursively();
-        }
-    } else {
-        if (deployCallback && typeof deployCallback === "function") {
-            deployCallback();
-        }
-    }
-}
-
 self.createToken = function (projectProperties, target, keystorepass, callback) {
     var pins = [],
         key;
@@ -209,38 +167,12 @@ self.createToken = function (projectProperties, target, keystorepass, callback)
     }
 };
 
-self.deployToken = function (projectProperties, target, callback) {
-    var key;
-
-    // Store the global variable "properties"
-    properties = projectProperties;
-
-    // Initialize the global variable "targets"
-    targets = [];
-
-    // Store callback so it will be invoked after debug token is deployed to all target(s)
-    deployCallback = callback;
-
-    // Gather targets information from properties
-    // Gather PINs information from properties
-    if (target === "all") {
-        for (key in properties.targets) {
-            if (properties.targets.hasOwnProperty(key) && properties.targets[key].pin) {
-                targets.push(key);
-            }
-        }
-    } else {
-        if (!target) {
-            target = properties.defaultTarget;
-        }
-
-        if (properties.targets.hasOwnProperty(target) && properties.targets[target].pin) {
-            targets.push(target);
-        }
-    }
-
-    // Deploy debug token recursively
-    deployTokenToTargetsRecursively();
+self.deployToken = function (target, targetIp, targetPassword, callback) {
+    logger.info(localize.translate("PROGRESS_DEPLOYING_DEBUG_TOKEN", target));
+    execNativeScript("blackberry-deploy",
+        generateDeployTokenOptions(targetIp, targetPassword),
+        callback
+    );
 };
 
 self.checkDebugToken = function (pin, callback) {
@@ -260,7 +192,7 @@ self.checkDebugToken = function (pin, callback) {
         script += ".bat";
     }
 
-    nativePackager = childProcess.exec(path.normalize(script +" -listManifest " + debugTokenDir), {
+    nativePackager = childProcess.exec(path.normalize(script + " -listManifest " + debugTokenDir), {
         "cwd": workingDir,
         "env": process.env
     }, function (error, stdout, stderr) {

http://git-wip-us.apache.org/repos/asf/cordova-blackberry/blob/b0941650/blackberry10/bin/templates/project/cordova/lib/run
----------------------------------------------------------------------
diff --git a/blackberry10/bin/templates/project/cordova/lib/run b/blackberry10/bin/templates/project/cordova/lib/run
index e604dd5..3ec1b45 100755
--- a/blackberry10/bin/templates/project/cordova/lib/run
+++ b/blackberry10/bin/templates/project/cordova/lib/run
@@ -42,8 +42,8 @@ var childProcess = require("child_process"),
     workingdir = path.normalize(__dirname + "/..");
 
 function generateOptions(uninstall) {
-    var options = [];
-    barPath = pkgrUtils.escapeStringForShell(path.normalize(__dirname + "/../../build/" + targets.targets[target].type + "/" + utils.genBarName() + ".bar"));
+    var options = [],
+        barPath = pkgrUtils.escapeStringForShell(path.normalize(__dirname + "/../../build/" + targets.targets[target].type + "/" + utils.genBarName() + ".bar"));
 
     options.push("-device");
     options.push(ip);
@@ -73,14 +73,14 @@ function generateOptions(uninstall) {
 
 function execNativeDeploy(optionsArray, callback) {
     var script = utils.inQuotes(path.join(process.env.CORDOVA_BBTOOLS, "blackberry-deploy")),
-        nativeDeploy;
+        nativeDeploy,
         options = optionsArray.join(" ");
 
     if (pkgrUtils.isWindows()) {
         script += ".bat";
     }
 
-    nativeDeploy = childProcess.exec(path.normalize(script +" "+ options), {
+    nativeDeploy = childProcess.exec(path.normalize(script + " " + options), {
         "cwd": workingdir,
         "env": process.env
     });
@@ -96,56 +96,55 @@ function execNativeDeploy(optionsArray, callback) {
     });
 }
 
-function setTarget(callback) {
+function checkDeviceInfo(ip, deviceType, callback) {
     var props = utils.getProperties(),
         targetName;
 
+    targetUtils.getDeviceInfo(ip, program["devicepass"], function (device) {
+        if (device.name) {
+            targetName = device.name + "-" + device.pin;
+            props.targets[targetName] = {
+                ip: ip,
+                pin: device.pin,
+                type: deviceType
+            };
+            utils.writeToPropertiesFile(props);
+            target = targetName;
+            callback();
+        } else {
+            if (deviceType === "device") {
+                console.error("Unable to authenticate with device at " + ip);
+            } else {
+                console.error("Unable to authenticate with simulator at " + ip);
+            }
+
+            if (!program["devicepass"]) {
+                console.error("Please provide device password using --devicepass");
+            }
+
+            process.exit(1);
+        }
+    });
+}
 
+function setTarget(callback) {
     target = program.args[0] ? program.args[0] : targets.defaultTarget;
     if (program["device"]) {
-        targetUtils.getTargetList("device", true, function (targets) {
-            if (targets && targets.length > 0) {
-                target = targets[0].name;
-                callback();
+        targetUtils.findConnectedDevice(function (ip) {
+            if (!ip) {
+                console.error("No connected device found");
+                process.exit(1);
             } else {
-                targetUtils.findConnectedDevice(function (ip) {
-                    if (!ip) {
-                        console.error("No connected device found");
-                        process.exit(1);
-                    } else {
-                        targetUtils.getDeviceInfo(ip, program["password"], function (device) {
-                            if (device.name) {
-                                targetName = device.name + "-" + device.pin;
-                                props.targets[targetName] = {
-                                    ip: ip,
-                                    pin: device.pin,
-                                    type: "device",
-                                    password: program["password"]
-                                };
-                                utils.writeToPropertiesFile(props);
-                                target = targetName;
-                                callback();
-                            } else {
-                                console.error("Unable to authenticate with device at " + ip);
-                                if (!program["password"]) {
-                                    console.error("Please provide device password using --password");
-                                }
-                                process.exit(1);
-                            }
-                        });
-                    }
-                });
+                checkDeviceInfo(ip, "device", callback);
             }
         });
     } else if (program["emulator"]) {
-        targetUtils.getTargetList("simulator", true, function (targets) {
-            if (targets && targets.length > 0) {
-                target = targets[0].name;
-                callback();
-            } else {
-                console.error("No connected BB10 simulator found");
-                console.error("Simulators must first be configured using platforms/blackberry/cordova/target");
+        targetUtils.findConnectedSimulator(function (ip) {
+            if (!ip) {
+                console.error("No connected BlackBerry 10 simulator found");
                 process.exit(1);
+            } else {
+                checkDeviceInfo(ip, "simulator", callback);
             }
         });
     } else {
@@ -160,23 +159,36 @@ function checkTarget() {
         return false;
     }
     if (!targets.targets[target]) {
-        console.log("The target \""+target+"\" does not exist, to add that target please run target add "+target+" <ip> [-t | --type <device | simulator>] [-p <password>] [--pin <devicepin>]");
+        console.log("The target \"" + target + "\" does not exist, to add that target please run target add " + target + " <ip> [-t | --type <device | simulator>] [-p <password>] [--pin <devicepin>]");
         console.log(program.helpInformation());
         return false;
     }
     if (targets.targets[target].ip) {
-       ip = targets.targets[target].ip;
+        ip = targets.targets[target].ip;
     } else {
-        console.log("IP is not defined in target \""+target+"\"");
+        console.log("IP is not defined in target \"" + target + "\"");
         console.log(program.helpInformation());
         return false;
     }
     if (targets.targets[target].password) {
-       password = targets.targets[target].password;
+        password = targets.targets[target].password;
+    } else {
+        password = program["devicepass"];
     }
     return true;
 }
 
+function deploy() {
+    var options = generateOptions(false);
+    execNativeDeploy(options, function (code) {
+        if (code) {
+            process.exit(2);
+        } else {
+            process.exit(0);
+        }
+    });
+}
+
 function uninstall() {
     var script = utils.inQuotes(path.join(process.env.CORDOVA_BBTOOLS, "blackberry-deploy")),
         nativeDeploy;
@@ -185,18 +197,17 @@ function uninstall() {
         script += ".bat";
     }
 
-    nativeDeploy = childProcess.exec(script +" -listInstalledApps -device " +ip+ " -password " +password, {
+    nativeDeploy = childProcess.exec(script + " -listInstalledApps -device " + ip + " -password " + password, {
         "cwd": workingdir,
         "env": process.env
     }, function (error, stdout, stderr) {
         var parser = new xml2js.Parser();
-        fs.readFile(path.join(__dirname + "/../../www/", "config.xml"), function(err, data) {
+        fs.readFile(path.join(__dirname + "/../../www/", "config.xml"), function (err, data) {
             parser.parseString(data, function (err, result) {
-                if (stdout.indexOf(result['@'].id) != -1) {
+                if (stdout.indexOf(result['@'].id) !== -1) {
                     var options = generateOptions(true);
-                    execNativeDeploy(options,
-                        function(){
-                            deploy();
+                    execNativeDeploy(options, function () {
+                        deploy();
                     });
                 } else {
                     deploy();
@@ -206,17 +217,6 @@ function uninstall() {
     });
 }
 
-function deploy() {
-    options = generateOptions(false);
-    execNativeDeploy(options, function (code) {
-        if (code) {
-            process.exit(2);
-        } else {
-            process.exit(0);
-        }
-    });
-}
-
 function checkDebugtoken(previous, baton) {
     baton.take();
 
@@ -253,7 +253,7 @@ function createDebugToken(previous, baton) {
             baton.pass();
         });
     } else {
-            baton.pass();
+        baton.pass();
     }
 }
 
@@ -262,7 +262,7 @@ function deployDebugToken(previous, baton) {
 
     // If in debug build and debug token was created, deploy the debug token and wait until the deployment is finished
     if (needDeployDebugToken) {
-        debugTokenHelper.deployToken(targets, target, function () {
+        debugTokenHelper.deployToken(target, ip, password, function () {
             baton.pass();
         });
     } else {
@@ -314,11 +314,11 @@ function postBuild() {
 
 function exec() {
     program
-        .usage('[--device] [--emulator] [--password] [--target=<id>] [-k | --keystorepass] [--no-launch] [--no-uninstall] [--no-build]')
+        .usage('[--device] [--emulator] [--devicepass] [--target=<id>] [-k | --keystorepass] [--no-launch] [--no-uninstall] [--no-build]')
         .option('-k, --keystorepass <password>', 'the password of signing key; needed for creating debug token')
         .option('--device', 'run on connected device')
         .option('--emulator', 'run on BB10 simulator')
-        .option('--password <password>', 'device password')
+        .option('--devicepass <password>', 'device password')
         .option('--target', 'specifies the target to run the application')
         .option('--no-uninstall', 'does not uninstall application from device')
         .option('--no-launch', 'do not launch the application on device')

http://git-wip-us.apache.org/repos/asf/cordova-blackberry/blob/b0941650/blackberry10/bin/templates/project/cordova/lib/signing-helper.js
----------------------------------------------------------------------
diff --git a/blackberry10/bin/templates/project/cordova/lib/signing-helper.js b/blackberry10/bin/templates/project/cordova/lib/signing-helper.js
index 73b17df..2fce263 100644
--- a/blackberry10/bin/templates/project/cordova/lib/signing-helper.js
+++ b/blackberry10/bin/templates/project/cordova/lib/signing-helper.js
@@ -62,7 +62,7 @@ function getDefaultPath(file) {
 }
 
 function execSigner(session, target, callback) {
-    var script = utils.inQuotes(path.join(process.env.CORDOVA_BBTOOLS, "blackberry-signer")),
+    var script = path.join(process.env.CORDOVA_BBTOOLS, "blackberry-signer"),
         signer,
         params = session.getParams("blackberry-signer"),
         args = [];

http://git-wip-us.apache.org/repos/asf/cordova-blackberry/blob/b0941650/blackberry10/bin/templates/project/cordova/lib/target-utils.js
----------------------------------------------------------------------
diff --git a/blackberry10/bin/templates/project/cordova/lib/target-utils.js b/blackberry10/bin/templates/project/cordova/lib/target-utils.js
index 535a104..cd6829f 100644
--- a/blackberry10/bin/templates/project/cordova/lib/target-utils.js
+++ b/blackberry10/bin/templates/project/cordova/lib/target-utils.js
@@ -16,6 +16,7 @@
 
 var _self,
     os = require("os"),
+    fs = require('fs'),
     exec = require('child_process').exec,
     path = require('path'),
     bb10_utils = require('./utils'),
@@ -30,6 +31,11 @@ _self = {
                 targets[t].name = t;
                 targList.push(targets[t]);
             },
+            complete = function () {
+                if (count === Object.keys(targets).length) {
+                    callback(targList);
+                }
+            },
             checkConnection = function (name) {
                 _self.checkConnection(targets[name].ip, type, function (connected) {
                     count++;
@@ -39,11 +45,6 @@ _self = {
                     complete();
                 });
             },
-            complete = function () {
-                if (count === Object.keys(targets).length) {
-                    callback(targList);
-                }
-            },
             t;
 
         if (targets) {
@@ -64,29 +65,30 @@ _self = {
         complete();
     },
 
-    getDeviceInfo: function(ip, password, callback) {
+    getDeviceInfo: function (ip, password, callback) {
         var cmd = path.join(process.env.CORDOVA_BBTOOLS, 'blackberry-deploy') + ' -listDeviceInfo ' + ip;
         if (password) {
             cmd += ' -password ' + password;
         }
-        exec(cmd, function(error, stdout, stderr) {
+        exec(cmd, function (error, stdout, stderr) {
             var result = {},
-                name = /modelname::(.*?)\n/.exec(stdout),
-                pin = /devicepin::0x(.*?)\n/.exec(stdout);
+                name = /modelname::(.*?)(\r?)\n/.exec(stdout),
+                pin = /devicepin::0x(.*?)(\r?)\n/.exec(stdout);
             if (name && name.length > 0) {
                 result.name = name[1];
             }
             if (pin && pin.length > 0) {
                 result.pin = pin[1];
             }
+
             callback(result);
         });
     },
 
-    findConnectedDevice: function(callback) {
+    findConnectedDevice: function (callback) {
         var defaultIp = '169.254.0.1';
         _self.discoverUsb(function (result) {
-           if (result) {
+            if (result) {
                 _self.checkConnection(result, 'device', function (connection) {
                     if (connection)  {
                         callback(result);
@@ -106,7 +108,7 @@ _self = {
         });
     },
 
-    discoverUsb: function(callback) {
+    discoverUsb: function (callback) {
         var IPV4_TYPE = "IPv4",
             IP_SPLIT_REGEXP = /(169\.254\.\d{1,3}\.)(\d{1,3})/,
             networkInterfaces = os.networkInterfaces(),
@@ -116,11 +118,11 @@ _self = {
 
         for (ni in networkInterfaces) {
             if (networkInterfaces.hasOwnProperty(ni)) {
-                for (i=0; i< networkInterfaces[ni].length; i++) {
+                for (i = 0; i < networkInterfaces[ni].length; i++) {
                     if (networkInterfaces[ni][i].family === IPV4_TYPE) {
                         result = IP_SPLIT_REGEXP.exec(networkInterfaces[ni][i].address);
                         if (result && result[1] && result[2]) {
-                            callback(result[1] + (result[2] -1));
+                            callback(result[1] + (result[2] - 1));
                             return;
                         }
                     }
@@ -132,18 +134,90 @@ _self = {
         callback();
     },
 
-    checkConnection: function(ip, type, callback) {
-        var script = bb10_utils.inQuotes(path.join(process.env.CORDOVA_BBTOOLS, 'blackberry-deploy'));
-        exec(script + ' -test ' + ip, function(error, stdout, stderr) {
-            // error code 3 corresponds to a connected device, null corresponds to connected sim
-            callback((type === 'simulator' && error === null) || (type == 'device' && error.code === 3));
+    findConnectedSimulator: function (callback) {
+        var pathVmDhcpLeases,
+            pathUserProfile,
+            pathAllUserProfile,
+            vmDhcpLeasesFiles,
+            DHCP_LEASES_REGEX = /VMware\\vmnetdhcp.leases$/,
+            targets = blackberryProperties.targets,
+            ipsToTest = [],
+            dhcpIPs = [],
+            t;
+
+        // Firstly, check targets in the properties file
+        if (targets) {
+            for (t in targets) {
+                if (targets.hasOwnProperty(t) && targets[t].type === "simulator" && targets[t].ip) {
+                    ipsToTest.push(targets[t].ip);
+                }
+            }
+        }
+
+        // Secondly, check VMware dhcp.leases file
+        if (bb10_utils.isWindows()) {
+            pathUserProfile = process.env['USERPROFILE'];
+            pathAllUserProfile = pathUserProfile.substr(0, pathUserProfile.lastIndexOf("\\") + 1) + "All Users";
+            vmDhcpLeasesFiles = bb10_utils.readdirSyncRecursive(pathAllUserProfile).filter(function (file) {
+                return DHCP_LEASES_REGEX.test(file);
+            });
+            pathVmDhcpLeases = vmDhcpLeasesFiles[0];
+        } else {
+            pathVmDhcpLeases = "/private/var/db/vmware/vmnet-dhcpd-vmnet8.leases";
+        }
+
+        fs.readFile(pathVmDhcpLeases, 'utf8', function (err, data) {
+            if (!err) {
+                // Find all lines that start with "lease xxx.xxx.xxx.xxx "
+                dhcpIPs = data.match(/lease \d{1,3}.\d{1,3}.\d{1,3}.\d{1,3} /g);
+                dhcpIPs = dhcpIPs.map(function (result) {
+                    return result.substr(6, result.indexOf(' ', 7) - 6);
+                });
+            }
+
+            ipsToTest = ipsToTest.concat(dhcpIPs);
+            // Remove duplicated ip
+            ipsToTest = ipsToTest.filter(function (item, index, arr) {
+                return arr.indexOf(item) === index;
+            });
+
+            _self.checkConnectionRecursive(ipsToTest, 0, callback);
+        });
+    },
+
+    checkConnectionRecursive: function (ips, index, callback) {
+        var ip;
+
+        if (!ips || index === ips.length) {
+            callback();
+            return;
+        }
+
+        console.log("Searching for connected BlackBerry 10 Simulator (" + (index + 1) + "/" + ips.length + ")...");
+        ip = ips[index];
+        _self.checkConnection(ip, "simulator", function (connection) {
+            if (connection) {
+                callback(ip);
+            } else {
+                _self.checkConnectionRecursive(ips, index + 1, callback);
+            }
         });
     },
 
-    listTargets : function(type, pruneDisconnected) {
+    checkConnection: function (ip, type, callback) {
+        var script = path.join(process.env.CORDOVA_BBTOOLS, 'blackberry-deploy');
+        exec(script + ' -test ' + ip, function (error, stdout, stderr) {
+            // error code 3 corresponds to a connected device, null or "Error: null" in stderr corresponds to connected simulator
+            callback((type === 'simulator' && (error === null || stderr.length === 0 || stderr.indexOf('Error: null') >= 0 || stderr.indexOf('Error: Authentication failed') >= 0)) || (type === 'device' && error.code === 3));
+        });
+    },
+
+    listTargets : function (type, pruneDisconnected) {
         _self.getTargetList(type, pruneDisconnected, function (targets) {
             for (var t in targets) {
-                console.log(targets[t].name + ' ip: ' + targets[t].ip);
+                if (targets.hasOwnProperty(t)) {
+                    console.log(targets[t].name + ' ip: ' + targets[t].ip);
+                }
             }
         });
     }