From dfb124de8ffc69c9d5c5124948ea9733b7087d4b Mon Sep 17 00:00:00 2001 From: Nikita Kosilo Date: Wed, 2 Oct 2019 18:25:19 +0300 Subject: [PATCH] Close old existing sockets on reopen by destination ports. Removed iOS trash sources --- .gitignore | 6 + README.md | 13 +- plugin.xml | 4 +- .../socketsforcordova/SocketPlugin.java | 486 ++--- src/ios/CordovaLib/Classes/CDV.h | 41 - src/ios/CordovaLib/Classes/CDVAvailability.h | 100 - .../CordovaLib/Classes/CDVCommandDelegate.h | 50 - .../Classes/CDVCommandDelegateImpl.h | 36 - .../Classes/CDVCommandDelegateImpl.m | 184 -- src/ios/CordovaLib/Classes/CDVCommandQueue.h | 40 - src/ios/CordovaLib/Classes/CDVCommandQueue.m | 210 -- src/ios/CordovaLib/Classes/CDVConfigParser.h | 31 - src/ios/CordovaLib/Classes/CDVConfigParser.m | 88 - src/ios/CordovaLib/Classes/CDVDebug.h | 25 - .../CordovaLib/Classes/CDVInvokedUrlCommand.h | 52 - .../CordovaLib/Classes/CDVInvokedUrlCommand.m | 117 -- src/ios/CordovaLib/Classes/CDVJSON.h | 30 - src/ios/CordovaLib/Classes/CDVJSON.m | 77 - src/ios/CordovaLib/Classes/CDVLocalStorage.h | 50 - src/ios/CordovaLib/Classes/CDVLocalStorage.m | 491 ----- src/ios/CordovaLib/Classes/CDVPlugin.h | 67 - src/ios/CordovaLib/Classes/CDVPlugin.m | 154 -- src/ios/CordovaLib/Classes/CDVPluginResult.h | 71 - src/ios/CordovaLib/Classes/CDVPluginResult.m | 224 --- .../Classes/CDVScreenOrientationDelegate.h | 28 - src/ios/CordovaLib/Classes/CDVShared.h | 22 - src/ios/CordovaLib/Classes/CDVTimer.h | 27 - src/ios/CordovaLib/Classes/CDVTimer.m | 123 -- src/ios/CordovaLib/Classes/CDVURLProtocol.h | 29 - src/ios/CordovaLib/Classes/CDVURLProtocol.m | 243 --- src/ios/CordovaLib/Classes/CDVUserAgentUtil.h | 27 - src/ios/CordovaLib/Classes/CDVUserAgentUtil.m | 122 -- .../CordovaLib/Classes/CDVViewController.h | 72 - .../CordovaLib/Classes/CDVViewController.m | 997 --------- .../CordovaLib/Classes/CDVWebViewDelegate.h | 42 - .../CordovaLib/Classes/CDVWebViewDelegate.m | 402 ---- src/ios/CordovaLib/Classes/CDVWhitelist.h | 34 - src/ios/CordovaLib/Classes/CDVWhitelist.m | 285 --- .../CordovaLib/Classes/NSArray+Comparisons.h | 26 - .../CordovaLib/Classes/NSArray+Comparisons.m | 41 - src/ios/CordovaLib/Classes/NSData+Base64.h | 42 - src/ios/CordovaLib/Classes/NSData+Base64.m | 298 --- .../Classes/NSDictionary+Extensions.h | 35 - .../Classes/NSDictionary+Extensions.m | 159 -- .../Classes/NSMutableArray+QueueAdditions.h | 29 - .../Classes/NSMutableArray+QueueAdditions.m | 58 - .../CordovaLib/Classes/UIDevice+Extensions.h | 31 - .../CordovaLib/Classes/UIDevice+Extensions.m | 47 - .../CordovaLib.xcodeproj/project.pbxproj | 489 ----- .../xcschemes/CordovaLib.xcscheme | 59 - .../xcschemes/xcschememanagement.plist | 22 - src/ios/CordovaLib/CordovaLib_Prefix.pch | 22 - src/ios/CordovaLib/VERSION | 1 - src/ios/CordovaLib/cordova.js | 1776 ----------------- .../project.pbxproj | 656 ------ .../contents.xcworkspacedata | 7 - .../xcshareddata/SocketsForCordova.xccheckout | 41 - .../UserInterfaceState.xcuserstate | Bin 25834 -> 0 bytes .../xcdebugger/Breakpoints_v2.xcbkptlist | 23 - .../xcschemes/SocketsForCordova.xcscheme | 86 - .../xcschemes/xcschememanagement.plist | 22 - src/ios/SocketsForCordova/.gitignore | 5 - .../SocketsForCordova/Classes/AppDelegate.h | 42 - .../SocketsForCordova/Classes/AppDelegate.m | 152 -- .../Classes/MainViewController.h | 41 - .../Classes/MainViewController.m | 214 -- .../Classes/MainViewController.xib | 138 -- .../SocketsForCordova/Classes/SocketPlugin.h | 5 +- .../SocketsForCordova/Classes/SocketPlugin.m | 45 +- src/ios/SocketsForCordova/Plugins/README | 20 - .../Resources/de.lproj/Localizable.strings | 28 - .../Resources/en.lproj/Localizable.strings | 27 - .../Resources/es.lproj/Localizable.strings | 27 - .../Resources/icons/icon-40.png | Bin 4082 -> 0 bytes .../Resources/icons/icon-40@2x.png | Bin 7411 -> 0 bytes .../Resources/icons/icon-50.png | Bin 4874 -> 0 bytes .../Resources/icons/icon-50@2x.png | Bin 9611 -> 0 bytes .../Resources/icons/icon-60.png | Bin 5811 -> 0 bytes .../Resources/icons/icon-60@2x.png | Bin 11924 -> 0 bytes .../Resources/icons/icon-72.png | Bin 4944 -> 0 bytes .../Resources/icons/icon-72@2x.png | Bin 11706 -> 0 bytes .../Resources/icons/icon-76.png | Bin 7025 -> 0 bytes .../Resources/icons/icon-76@2x.png | Bin 15262 -> 0 bytes .../Resources/icons/icon-small.png | Bin 3294 -> 0 bytes .../Resources/icons/icon-small@2x.png | Bin 5608 -> 0 bytes .../Resources/icons/icon.png | Bin 3902 -> 0 bytes .../Resources/icons/icon@2x.png | Bin 7869 -> 0 bytes .../Resources/se.lproj/Localizable.strings | 28 - .../splash/Default-568h@2x~iphone.png | Bin 34225 -> 0 bytes .../splash/Default-Landscape@2x~ipad.png | Bin 212234 -> 0 bytes .../splash/Default-Landscape~ipad.png | Bin 91810 -> 0 bytes .../splash/Default-Portrait@2x~ipad.png | Bin 212860 -> 0 bytes .../splash/Default-Portrait~ipad.png | Bin 91713 -> 0 bytes .../Resources/splash/Default@2x~iphone.png | Bin 29475 -> 0 bytes .../Resources/splash/Default~iphone.png | Bin 10394 -> 0 bytes .../SocketsForCordova-Info.plist | 83 - .../SocketsForCordova-Prefix.pch | 26 - src/ios/SocketsForCordova/config.xml | 31 - src/ios/SocketsForCordova/main.m | 35 - src/ios/cordova/apple_ios_version | 24 - src/ios/cordova/apple_osx_version | 24 - src/ios/cordova/apple_xcode_version | 24 - src/ios/cordova/build | 56 - src/ios/cordova/build.xcconfig | 5 - src/ios/cordova/check_reqs | 34 - src/ios/cordova/clean | 40 - src/ios/cordova/defaults.xml | 45 - src/ios/cordova/emulate | 59 - src/ios/cordova/lib/copy-www-build-step.sh | 87 - src/ios/cordova/lib/install-device | 58 - src/ios/cordova/lib/install-emulator | 126 -- src/ios/cordova/lib/list-devices | 22 - src/ios/cordova/lib/list-emulator-images | 40 - src/ios/cordova/lib/list-started-emulators | 36 - src/ios/cordova/lib/sim.applescript | 31 - src/ios/cordova/lib/start-emulator | 35 - src/ios/cordova/log | 23 - src/ios/cordova/run | 159 -- src/ios/cordova/version | 29 - src/ios/platform_www/cordova.js | 1776 ----------------- src/ios/www/cordova.js | 1776 ----------------- src/ios/www/cordova_plugins.js | 7 - src/ios/www/css/index.css | 115 -- src/ios/www/img/logo.png | Bin 21814 -> 0 bytes src/ios/www/index.html | 41 - src/ios/www/js/index.js | 51 - 126 files changed, 312 insertions(+), 14428 deletions(-) create mode 100644 .gitignore delete mode 100644 src/ios/CordovaLib/Classes/CDV.h delete mode 100644 src/ios/CordovaLib/Classes/CDVAvailability.h delete mode 100644 src/ios/CordovaLib/Classes/CDVCommandDelegate.h delete mode 100644 src/ios/CordovaLib/Classes/CDVCommandDelegateImpl.h delete mode 100644 src/ios/CordovaLib/Classes/CDVCommandDelegateImpl.m delete mode 100644 src/ios/CordovaLib/Classes/CDVCommandQueue.h delete mode 100644 src/ios/CordovaLib/Classes/CDVCommandQueue.m delete mode 100644 src/ios/CordovaLib/Classes/CDVConfigParser.h delete mode 100644 src/ios/CordovaLib/Classes/CDVConfigParser.m delete mode 100644 src/ios/CordovaLib/Classes/CDVDebug.h delete mode 100644 src/ios/CordovaLib/Classes/CDVInvokedUrlCommand.h delete mode 100644 src/ios/CordovaLib/Classes/CDVInvokedUrlCommand.m delete mode 100644 src/ios/CordovaLib/Classes/CDVJSON.h delete mode 100644 src/ios/CordovaLib/Classes/CDVJSON.m delete mode 100644 src/ios/CordovaLib/Classes/CDVLocalStorage.h delete mode 100644 src/ios/CordovaLib/Classes/CDVLocalStorage.m delete mode 100644 src/ios/CordovaLib/Classes/CDVPlugin.h delete mode 100644 src/ios/CordovaLib/Classes/CDVPlugin.m delete mode 100644 src/ios/CordovaLib/Classes/CDVPluginResult.h delete mode 100644 src/ios/CordovaLib/Classes/CDVPluginResult.m delete mode 100644 src/ios/CordovaLib/Classes/CDVScreenOrientationDelegate.h delete mode 100644 src/ios/CordovaLib/Classes/CDVShared.h delete mode 100644 src/ios/CordovaLib/Classes/CDVTimer.h delete mode 100644 src/ios/CordovaLib/Classes/CDVTimer.m delete mode 100644 src/ios/CordovaLib/Classes/CDVURLProtocol.h delete mode 100644 src/ios/CordovaLib/Classes/CDVURLProtocol.m delete mode 100644 src/ios/CordovaLib/Classes/CDVUserAgentUtil.h delete mode 100644 src/ios/CordovaLib/Classes/CDVUserAgentUtil.m delete mode 100644 src/ios/CordovaLib/Classes/CDVViewController.h delete mode 100644 src/ios/CordovaLib/Classes/CDVViewController.m delete mode 100644 src/ios/CordovaLib/Classes/CDVWebViewDelegate.h delete mode 100644 src/ios/CordovaLib/Classes/CDVWebViewDelegate.m delete mode 100644 src/ios/CordovaLib/Classes/CDVWhitelist.h delete mode 100644 src/ios/CordovaLib/Classes/CDVWhitelist.m delete mode 100644 src/ios/CordovaLib/Classes/NSArray+Comparisons.h delete mode 100644 src/ios/CordovaLib/Classes/NSArray+Comparisons.m delete mode 100644 src/ios/CordovaLib/Classes/NSData+Base64.h delete mode 100644 src/ios/CordovaLib/Classes/NSData+Base64.m delete mode 100644 src/ios/CordovaLib/Classes/NSDictionary+Extensions.h delete mode 100644 src/ios/CordovaLib/Classes/NSDictionary+Extensions.m delete mode 100644 src/ios/CordovaLib/Classes/NSMutableArray+QueueAdditions.h delete mode 100644 src/ios/CordovaLib/Classes/NSMutableArray+QueueAdditions.m delete mode 100644 src/ios/CordovaLib/Classes/UIDevice+Extensions.h delete mode 100644 src/ios/CordovaLib/Classes/UIDevice+Extensions.m delete mode 100644 src/ios/CordovaLib/CordovaLib.xcodeproj/project.pbxproj delete mode 100644 src/ios/CordovaLib/CordovaLib.xcodeproj/xcuserdata/aaa.xcuserdatad/xcschemes/CordovaLib.xcscheme delete mode 100644 src/ios/CordovaLib/CordovaLib.xcodeproj/xcuserdata/aaa.xcuserdatad/xcschemes/xcschememanagement.plist delete mode 100644 src/ios/CordovaLib/CordovaLib_Prefix.pch delete mode 100644 src/ios/CordovaLib/VERSION delete mode 100644 src/ios/CordovaLib/cordova.js delete mode 100644 src/ios/SocketsForCordova.xcodeproj/project.pbxproj delete mode 100644 src/ios/SocketsForCordova.xcodeproj/project.xcworkspace/contents.xcworkspacedata delete mode 100644 src/ios/SocketsForCordova.xcodeproj/project.xcworkspace/xcshareddata/SocketsForCordova.xccheckout delete mode 100644 src/ios/SocketsForCordova.xcodeproj/project.xcworkspace/xcuserdata/aaa.xcuserdatad/UserInterfaceState.xcuserstate delete mode 100644 src/ios/SocketsForCordova.xcodeproj/xcuserdata/aaa.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist delete mode 100644 src/ios/SocketsForCordova.xcodeproj/xcuserdata/aaa.xcuserdatad/xcschemes/SocketsForCordova.xcscheme delete mode 100644 src/ios/SocketsForCordova.xcodeproj/xcuserdata/aaa.xcuserdatad/xcschemes/xcschememanagement.plist delete mode 100644 src/ios/SocketsForCordova/.gitignore delete mode 100644 src/ios/SocketsForCordova/Classes/AppDelegate.h delete mode 100644 src/ios/SocketsForCordova/Classes/AppDelegate.m delete mode 100644 src/ios/SocketsForCordova/Classes/MainViewController.h delete mode 100644 src/ios/SocketsForCordova/Classes/MainViewController.m delete mode 100644 src/ios/SocketsForCordova/Classes/MainViewController.xib delete mode 100644 src/ios/SocketsForCordova/Plugins/README delete mode 100644 src/ios/SocketsForCordova/Resources/de.lproj/Localizable.strings delete mode 100644 src/ios/SocketsForCordova/Resources/en.lproj/Localizable.strings delete mode 100644 src/ios/SocketsForCordova/Resources/es.lproj/Localizable.strings delete mode 100644 src/ios/SocketsForCordova/Resources/icons/icon-40.png delete mode 100644 src/ios/SocketsForCordova/Resources/icons/icon-40@2x.png delete mode 100644 src/ios/SocketsForCordova/Resources/icons/icon-50.png delete mode 100644 src/ios/SocketsForCordova/Resources/icons/icon-50@2x.png delete mode 100644 src/ios/SocketsForCordova/Resources/icons/icon-60.png delete mode 100644 src/ios/SocketsForCordova/Resources/icons/icon-60@2x.png delete mode 100644 src/ios/SocketsForCordova/Resources/icons/icon-72.png delete mode 100644 src/ios/SocketsForCordova/Resources/icons/icon-72@2x.png delete mode 100644 src/ios/SocketsForCordova/Resources/icons/icon-76.png delete mode 100644 src/ios/SocketsForCordova/Resources/icons/icon-76@2x.png delete mode 100644 src/ios/SocketsForCordova/Resources/icons/icon-small.png delete mode 100644 src/ios/SocketsForCordova/Resources/icons/icon-small@2x.png delete mode 100644 src/ios/SocketsForCordova/Resources/icons/icon.png delete mode 100644 src/ios/SocketsForCordova/Resources/icons/icon@2x.png delete mode 100644 src/ios/SocketsForCordova/Resources/se.lproj/Localizable.strings delete mode 100644 src/ios/SocketsForCordova/Resources/splash/Default-568h@2x~iphone.png delete mode 100644 src/ios/SocketsForCordova/Resources/splash/Default-Landscape@2x~ipad.png delete mode 100644 src/ios/SocketsForCordova/Resources/splash/Default-Landscape~ipad.png delete mode 100644 src/ios/SocketsForCordova/Resources/splash/Default-Portrait@2x~ipad.png delete mode 100644 src/ios/SocketsForCordova/Resources/splash/Default-Portrait~ipad.png delete mode 100644 src/ios/SocketsForCordova/Resources/splash/Default@2x~iphone.png delete mode 100644 src/ios/SocketsForCordova/Resources/splash/Default~iphone.png delete mode 100644 src/ios/SocketsForCordova/SocketsForCordova-Info.plist delete mode 100644 src/ios/SocketsForCordova/SocketsForCordova-Prefix.pch delete mode 100644 src/ios/SocketsForCordova/config.xml delete mode 100644 src/ios/SocketsForCordova/main.m delete mode 100755 src/ios/cordova/apple_ios_version delete mode 100755 src/ios/cordova/apple_osx_version delete mode 100755 src/ios/cordova/apple_xcode_version delete mode 100755 src/ios/cordova/build delete mode 100644 src/ios/cordova/build.xcconfig delete mode 100755 src/ios/cordova/check_reqs delete mode 100755 src/ios/cordova/clean delete mode 100644 src/ios/cordova/defaults.xml delete mode 100755 src/ios/cordova/emulate delete mode 100755 src/ios/cordova/lib/copy-www-build-step.sh delete mode 100755 src/ios/cordova/lib/install-device delete mode 100755 src/ios/cordova/lib/install-emulator delete mode 100755 src/ios/cordova/lib/list-devices delete mode 100755 src/ios/cordova/lib/list-emulator-images delete mode 100755 src/ios/cordova/lib/list-started-emulators delete mode 100755 src/ios/cordova/lib/sim.applescript delete mode 100755 src/ios/cordova/lib/start-emulator delete mode 100755 src/ios/cordova/log delete mode 100755 src/ios/cordova/run delete mode 100755 src/ios/cordova/version delete mode 100644 src/ios/platform_www/cordova.js delete mode 100644 src/ios/www/cordova.js delete mode 100644 src/ios/www/cordova_plugins.js delete mode 100644 src/ios/www/css/index.css delete mode 100644 src/ios/www/img/logo.png delete mode 100644 src/ios/www/index.html delete mode 100644 src/ios/www/js/index.js diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1b3d53a --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +# Specifies intentionally untracked files to ignore when using Git +# http://git-scm.com/docs/gitignore + +.idea/ +.DS_Store +Thumbs.db diff --git a/README.md b/README.md index 6e34e87..a5b9b23 100644 --- a/README.md +++ b/README.md @@ -158,9 +158,10 @@ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ## What's new - - 1.2.3 - fixed iOS socket closing crashes - - 1.5.0 - added iOS open and write timeouts, changed js errors format - - 1.5.1 - fixed cordova js bridge implementation - - 1.5.2 - fixed iOS open timeout - - 1.5.3 - added Android open and write timeouts - - 1.5.4 - fixed iOS closing sockets on open timeout \ No newline at end of file + - 1.2.3 - fixed iOS socket closing crashes [iOS] + - 1.5.0 - added iOS open and write timeouts, changed js errors format [iOS] + - 1.5.1 - fixed cordova js bridge implementation [js] + - 1.5.2 - fixed iOS open timeout [iOS] + - 1.5.3 - added Android open and write timeouts [Android] + - 1.5.4 - fixed iOS closing sockets on open timeout [iOS] + - 1.6.0 - close old existing sockets on reopen by destination ports. Removed iOS trash sources [iOS, Android] \ No newline at end of file diff --git a/plugin.xml b/plugin.xml index 7737aad..26a4e1a 100644 --- a/plugin.xml +++ b/plugin.xml @@ -1,6 +1,6 @@ - + SocketsForCordova This Cordova plugin provides JavaScript API, that allows you to communicate with server through TCP protocol. @@ -45,8 +45,6 @@ - - diff --git a/src/android/src/cz/blocshop/socketsforcordova/SocketPlugin.java b/src/android/src/cz/blocshop/socketsforcordova/SocketPlugin.java index 12bf2d9..9939ab9 100644 --- a/src/android/src/cz/blocshop/socketsforcordova/SocketPlugin.java +++ b/src/android/src/cz/blocshop/socketsforcordova/SocketPlugin.java @@ -1,7 +1,7 @@ /** * Copyright (c) 2015, Blocshop s.r.o. * All rights reserved. - * + *

* Redistribution and use in source and binary forms are permitted * provided that the above copyright notice and this paragraph are * duplicated in all such forms and that any documentation, @@ -31,230 +31,270 @@ import org.json.JSONException; import org.json.JSONObject; import android.annotation.SuppressLint; +import android.util.Log; public class SocketPlugin extends CordovaPlugin { - - Map socketAdapters = new HashMap(); - - @Override - public boolean execute(String action, CordovaArgs args, CallbackContext callbackContext) throws JSONException { - if (action.equals("open")) { - this.open(args, callbackContext); - } else if (action.equals("write")) { - this.write(args, callbackContext); - } else if (action.equals("shutdownWrite")) { - this.shutdownWrite(args, callbackContext); - } else if (action.equals("close")) { - this.close(args, callbackContext); - } else if (action.equals("setOptions")) { - this.setOptions(args, callbackContext); - } else { - callbackContext.error(String.format("SocketPlugin - invalid action:", action)); - return false; - } - return true; - } - - private void open(CordovaArgs args, CallbackContext callbackContext) throws JSONException { - String socketKey = args.getString(0); - String host = args.getString(1); - int port = args.getInt(2); - - SocketAdapter socketAdapter = new SocketAdapterImpl(); - socketAdapter.setCloseEventHandler(new CloseEventHandler(socketKey)); - socketAdapter.setDataConsumer(new DataConsumer(socketKey)); - socketAdapter.setErrorEventHandler(new ErrorEventHandler(socketKey)); - socketAdapter.setOpenErrorEventHandler(new OpenErrorEventHandler(callbackContext)); - socketAdapter.setOpenEventHandler(new OpenEventHandler(socketKey, socketAdapter, callbackContext)); - - socketAdapter.open(host, port); - } - - private void write(CordovaArgs args, CallbackContext callbackContext) throws JSONException { - String socketKey = args.getString(0); - JSONArray data = args.getJSONArray(1); - - byte[] dataBuffer = new byte[data.length()]; - for(int i = 0; i < dataBuffer.length; i++) { - dataBuffer[i] = (byte) data.getInt(i); - } - - SocketAdapter socket = this.getSocketAdapter(socketKey); - - try { - socket.write(dataBuffer); - callbackContext.success(); - } catch (IOException e) { - callbackContext.error(e.toString()); - } - } + Map socketAdapters = new HashMap(); + Map socketAdaptersPorts = new HashMap(); - private void shutdownWrite(CordovaArgs args, CallbackContext callbackContext) throws JSONException { - String socketKey = args.getString(0); - - SocketAdapter socket = this.getSocketAdapter(socketKey); - - try { - socket.shutdownWrite(); - callbackContext.success(); - } catch (IOException e) { - callbackContext.error(e.toString()); - } - } - - private void close(CordovaArgs args, CallbackContext callbackContext) throws JSONException { - String socketKey = args.getString(0); - - SocketAdapter socket = this.getSocketAdapter(socketKey); - - try { - socket.close(); - callbackContext.success(); - } catch (IOException e) { - callbackContext.error(e.toString()); - } - } - - private void setOptions(CordovaArgs args, CallbackContext callbackContext) throws JSONException { - - String socketKey = args.getString(0); - JSONObject optionsJSON = args.getJSONObject(1); - - SocketAdapter socket = this.getSocketAdapter(socketKey); - - SocketAdapterOptions options = new SocketAdapterOptions(); - options.setKeepAlive(getBooleanPropertyFromJSON(optionsJSON, "keepAlive")); - options.setOobInline(getBooleanPropertyFromJSON(optionsJSON, "oobInline")); - options.setReceiveBufferSize(getIntegerPropertyFromJSON(optionsJSON, "receiveBufferSize")); - options.setSendBufferSize(getIntegerPropertyFromJSON(optionsJSON, "sendBufferSize")); - options.setSoLinger(getIntegerPropertyFromJSON(optionsJSON, "soLinger")); - options.setSoTimeout(getIntegerPropertyFromJSON(optionsJSON, "soTimeout")); - options.setTrafficClass(getIntegerPropertyFromJSON(optionsJSON, "trafficClass")); - - try { - socket.close(); - callbackContext.success(); - } catch (IOException e) { - callbackContext.error(e.toString()); - } - } - - private Boolean getBooleanPropertyFromJSON(JSONObject jsonObject, String propertyName) throws JSONException { - return jsonObject.has(propertyName) ? jsonObject.getBoolean(propertyName) : null; - } - - private Integer getIntegerPropertyFromJSON(JSONObject jsonObject, String propertyName) throws JSONException { - return jsonObject.has(propertyName) ? jsonObject.getInt(propertyName) : null; - } - - private SocketAdapter getSocketAdapter(String socketKey) { - if (!this.socketAdapters.containsKey(socketKey)) { - throw new IllegalStateException("Socket isn't connected."); - } - return this.socketAdapters.get(socketKey); - } - - private void dispatchEvent(JSONObject jsonEventObject) { - this.webView.sendJavascript(String.format("window.Socket.dispatchEvent(%s);", jsonEventObject.toString())); - } - - private class CloseEventHandler implements Consumer { - private String socketKey; - public CloseEventHandler(String socketKey) { - this.socketKey = socketKey; - } - @Override - public void accept(Boolean hasError) { - socketAdapters.remove(this.socketKey); - - try { - JSONObject event = new JSONObject(); - event.put("type", "Close"); - event.put("hasError", hasError.booleanValue()); - event.put("socketKey", this.socketKey); - - dispatchEvent(event); - } catch (JSONException e) { - e.printStackTrace(); - } - } - } - - private class DataConsumer implements Consumer { - private String socketKey; - public DataConsumer(String socketKey) { - this.socketKey = socketKey; - } - @SuppressLint("NewApi") - @Override - public void accept(byte[] data) { - try { - JSONObject event = new JSONObject(); - event.put("type", "DataReceived"); - //event.put("data", new JSONArray(data)); NOT SUPPORTED IN API LEVEL LESS THAN 19 - event.put("data", new JSONArray(this.toByteList(data))); - event.put("socketKey", socketKey); - - dispatchEvent(event); - } catch (JSONException e) { - e.printStackTrace(); - } - } - - private List toByteList(byte[] array) { - List byteList = new ArrayList(array.length); - for (int i = 0; i < array.length; i++) { - byteList.add(array[i]); - } - return byteList; - } - } - - private class ErrorEventHandler implements Consumer { - private String socketKey; - public ErrorEventHandler(String socketKey) { - this.socketKey = socketKey; - } - @Override - public void accept(String errorMessage) { - try { - JSONObject event = new JSONObject(); - event.put("type", "Error"); - event.put("errorMessage", errorMessage); - event.put("socketKey", socketKey); - - dispatchEvent(event); - } catch (JSONException e) { - e.printStackTrace(); - } - } - } - - private class OpenErrorEventHandler implements Consumer { - private CallbackContext openCallbackContext; - public OpenErrorEventHandler(CallbackContext openCallbackContext) { - this.openCallbackContext = openCallbackContext; - } - @Override - public void accept(String errorMessage) { - this.openCallbackContext.error(errorMessage); - } - } - - private class OpenEventHandler implements Consumer { - private String socketKey; - private SocketAdapter socketAdapter; - private CallbackContext openCallbackContext; - public OpenEventHandler(String socketKey, SocketAdapter socketAdapter, CallbackContext openCallbackContext) { - this.socketKey = socketKey; - this.socketAdapter = socketAdapter; - this.openCallbackContext = openCallbackContext; - } - @Override - public void accept(Void voidObject) { - socketAdapters.put(socketKey, socketAdapter); - this.openCallbackContext.success(); - } - } + @Override + public boolean execute(String action, CordovaArgs args, CallbackContext callbackContext) throws JSONException { + + if (action.equals("open")) { + this.open(args, callbackContext); + } else if (action.equals("write")) { + this.write(args, callbackContext); + } else if (action.equals("shutdownWrite")) { + this.shutdownWrite(args, callbackContext); + } else if (action.equals("close")) { + this.close(args, callbackContext); + } else if (action.equals("setOptions")) { + this.setOptions(args, callbackContext); + } else { + callbackContext.error(String.format("SocketPlugin - invalid action:", action)); + return false; + } + return true; + } + + private void open(CordovaArgs args, CallbackContext callbackContext) throws JSONException { + String socketKey = args.getString(0); + String host = args.getString(1); + int port = args.getInt(2); + + Log.d("SocketPlugin", "Open socket plugin"); + + SocketAdapter socketAdapter = new SocketAdapterImpl(); + socketAdapter.setCloseEventHandler(new CloseEventHandler(socketKey)); + socketAdapter.setDataConsumer(new DataConsumer(socketKey)); + socketAdapter.setErrorEventHandler(new ErrorEventHandler(socketKey)); + socketAdapter.setOpenErrorEventHandler(new OpenErrorEventHandler(callbackContext)); + socketAdapter.setOpenEventHandler(new OpenEventHandler(socketKey, socketAdapter, callbackContext)); + + String portString = String.valueOf(port); + if (this.socketAdaptersPorts.containsKey(portString)) { + String existsSocketKey = this.socketAdaptersPorts.get(portString); + SocketAdapter existsSocket = this.getSocketAdapter(existsSocketKey); + try { + if (existsSocket != null) { + existsSocket.close(); + Log.d("SocketPlugin", "Old socket exists. Closing."); + } else { + Log.d("SocketPlugin", "Old socket not exists."); + } + } catch (IOException e) { + Log.d("SocketPlugin", "Old socket closing error: " + e.getMessage()); + } + } + + socketAdapters.put(socketKey, socketAdapter); + socketAdaptersPorts.put(portString, socketKey); + + socketAdapter.open(host, port); + } + + private void write(CordovaArgs args, CallbackContext callbackContext) throws JSONException { + String socketKey = args.getString(0); + JSONArray data = args.getJSONArray(1); + + byte[] dataBuffer = new byte[data.length()]; + for (int i = 0; i < dataBuffer.length; i++) { + dataBuffer[i] = (byte) data.getInt(i); + } + + SocketAdapter socket = this.getSocketAdapter(socketKey); + + try { + if (socket != null) { + socket.write(dataBuffer); + } + callbackContext.success(); + } catch (IOException e) { + callbackContext.error(e.toString()); + } + } + + private void shutdownWrite(CordovaArgs args, CallbackContext callbackContext) throws JSONException { + String socketKey = args.getString(0); + + SocketAdapter socket = this.getSocketAdapter(socketKey); + + try { + if (socket != null) { + socket.shutdownWrite(); + } + callbackContext.success(); + } catch (IOException e) { + callbackContext.error(e.toString()); + } + } + + private void close(CordovaArgs args, CallbackContext callbackContext) throws JSONException { + String socketKey = args.getString(0); + + SocketAdapter socket = this.getSocketAdapter(socketKey); + + try { + if (socket != null) { + socket.close(); + } + callbackContext.success(); + } catch (IOException e) { + callbackContext.error(e.toString()); + } + } + + private void setOptions(CordovaArgs args, CallbackContext callbackContext) throws JSONException { + + String socketKey = args.getString(0); + JSONObject optionsJSON = args.getJSONObject(1); + + SocketAdapter socket = this.getSocketAdapter(socketKey); + if (socket != null) { + SocketAdapterOptions options = new SocketAdapterOptions(); + options.setKeepAlive(getBooleanPropertyFromJSON(optionsJSON, "keepAlive")); + options.setOobInline(getBooleanPropertyFromJSON(optionsJSON, "oobInline")); + options.setReceiveBufferSize(getIntegerPropertyFromJSON(optionsJSON, "receiveBufferSize")); + options.setSendBufferSize(getIntegerPropertyFromJSON(optionsJSON, "sendBufferSize")); + options.setSoLinger(getIntegerPropertyFromJSON(optionsJSON, "soLinger")); + options.setSoTimeout(getIntegerPropertyFromJSON(optionsJSON, "soTimeout")); + options.setTrafficClass(getIntegerPropertyFromJSON(optionsJSON, "trafficClass")); + + try { + socket.close(); + callbackContext.success(); + } catch (IOException e) { + callbackContext.error(e.toString()); + } + } + } + + private Boolean getBooleanPropertyFromJSON(JSONObject jsonObject, String propertyName) throws JSONException { + return jsonObject.has(propertyName) ? jsonObject.getBoolean(propertyName) : null; + } + + private Integer getIntegerPropertyFromJSON(JSONObject jsonObject, String propertyName) throws JSONException { + return jsonObject.has(propertyName) ? jsonObject.getInt(propertyName) : null; + } + + private SocketAdapter getSocketAdapter(String socketKey) { + if (!this.socketAdapters.containsKey(socketKey)) { + Log.d("SocketPlugin", "Adapter not exists"); + return null; + } + return this.socketAdapters.get(socketKey); + } + + private void dispatchEvent(JSONObject jsonEventObject) { + this.webView.sendJavascript(String.format("window.Socket.dispatchEvent(%s);", jsonEventObject.toString())); + } + + private class CloseEventHandler implements Consumer { + private String socketKey; + + public CloseEventHandler(String socketKey) { + this.socketKey = socketKey; + } + + @Override + public void accept(Boolean hasError) { + socketAdapters.remove(this.socketKey); + + try { + JSONObject event = new JSONObject(); + event.put("type", "Close"); + event.put("hasError", hasError.booleanValue()); + event.put("socketKey", this.socketKey); + + dispatchEvent(event); + } catch (JSONException e) { + e.printStackTrace(); + } + } + } + + private class DataConsumer implements Consumer { + private String socketKey; + + public DataConsumer(String socketKey) { + this.socketKey = socketKey; + } + + @SuppressLint("NewApi") + @Override + public void accept(byte[] data) { + try { + JSONObject event = new JSONObject(); + event.put("type", "DataReceived"); + //event.put("data", new JSONArray(data)); NOT SUPPORTED IN API LEVEL LESS THAN 19 + event.put("data", new JSONArray(this.toByteList(data))); + event.put("socketKey", socketKey); + + dispatchEvent(event); + } catch (JSONException e) { + e.printStackTrace(); + } + } + + private List toByteList(byte[] array) { + List byteList = new ArrayList(array.length); + for (int i = 0; i < array.length; i++) { + byteList.add(array[i]); + } + return byteList; + } + } + + private class ErrorEventHandler implements Consumer { + private String socketKey; + + public ErrorEventHandler(String socketKey) { + this.socketKey = socketKey; + } + + @Override + public void accept(String errorMessage) { + try { + JSONObject event = new JSONObject(); + event.put("type", "Error"); + event.put("errorMessage", errorMessage); + event.put("socketKey", socketKey); + + dispatchEvent(event); + } catch (JSONException e) { + e.printStackTrace(); + } + } + } + + private class OpenErrorEventHandler implements Consumer { + private CallbackContext openCallbackContext; + + public OpenErrorEventHandler(CallbackContext openCallbackContext) { + this.openCallbackContext = openCallbackContext; + } + + @Override + public void accept(String errorMessage) { + this.openCallbackContext.error(errorMessage); + } + } + + private class OpenEventHandler implements Consumer { + private String socketKey; + private SocketAdapter socketAdapter; + private CallbackContext openCallbackContext; + + public OpenEventHandler(String socketKey, SocketAdapter socketAdapter, CallbackContext openCallbackContext) { + this.socketKey = socketKey; + this.socketAdapter = socketAdapter; + this.openCallbackContext = openCallbackContext; + } + + @Override + public void accept(Void voidObject) { + this.openCallbackContext.success(); + } + } } diff --git a/src/ios/CordovaLib/Classes/CDV.h b/src/ios/CordovaLib/Classes/CDV.h deleted file mode 100644 index 6cf592a..0000000 --- a/src/ios/CordovaLib/Classes/CDV.h +++ /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. - */ - -#import "CDVAvailability.h" - -#import "CDVPlugin.h" -#import "CDVViewController.h" -#import "CDVCommandDelegate.h" -#import "CDVURLProtocol.h" -#import "CDVInvokedUrlCommand.h" - -#import "CDVDebug.h" -#import "CDVPluginResult.h" -#import "CDVWhitelist.h" -#import "CDVLocalStorage.h" -#import "CDVScreenOrientationDelegate.h" -#import "CDVTimer.h" - -#import "NSArray+Comparisons.h" -#import "NSData+Base64.h" -#import "NSDictionary+Extensions.h" -#import "NSMutableArray+QueueAdditions.h" -#import "UIDevice+Extensions.h" - -#import "CDVJSON.h" diff --git a/src/ios/CordovaLib/Classes/CDVAvailability.h b/src/ios/CordovaLib/Classes/CDVAvailability.h deleted file mode 100644 index 6c711c8..0000000 --- a/src/ios/CordovaLib/Classes/CDVAvailability.h +++ /dev/null @@ -1,100 +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 __CORDOVA_IOS__ - -#define __CORDOVA_0_9_6 906 -#define __CORDOVA_1_0_0 10000 -#define __CORDOVA_1_1_0 10100 -#define __CORDOVA_1_2_0 10200 -#define __CORDOVA_1_3_0 10300 -#define __CORDOVA_1_4_0 10400 -#define __CORDOVA_1_4_1 10401 -#define __CORDOVA_1_5_0 10500 -#define __CORDOVA_1_6_0 10600 -#define __CORDOVA_1_6_1 10601 -#define __CORDOVA_1_7_0 10700 -#define __CORDOVA_1_8_0 10800 -#define __CORDOVA_1_8_1 10801 -#define __CORDOVA_1_9_0 10900 -#define __CORDOVA_2_0_0 20000 -#define __CORDOVA_2_1_0 20100 -#define __CORDOVA_2_2_0 20200 -#define __CORDOVA_2_3_0 20300 -#define __CORDOVA_2_4_0 20400 -#define __CORDOVA_2_5_0 20500 -#define __CORDOVA_2_6_0 20600 -#define __CORDOVA_2_7_0 20700 -#define __CORDOVA_2_8_0 20800 -#define __CORDOVA_2_9_0 20900 -#define __CORDOVA_3_0_0 30000 -#define __CORDOVA_3_1_0 30100 -#define __CORDOVA_3_2_0 30200 -#define __CORDOVA_3_3_0 30300 -#define __CORDOVA_3_4_0 30400 -#define __CORDOVA_3_4_1 30401 -#define __CORDOVA_3_5_0 30500 -#define __CORDOVA_3_6_0 30600 -#define __CORDOVA_3_6_1 30601 -#define __CORDOVA_3_6_3 30603 -#define __CORDOVA_NA 99999 /* not available */ - -/* - #if CORDOVA_VERSION_MIN_REQUIRED >= __CORDOVA_1_7_0 - // do something when its at least 1.7.0 - #else - // do something else (non 1.7.0) - #endif - */ -#ifndef CORDOVA_VERSION_MIN_REQUIRED - #define CORDOVA_VERSION_MIN_REQUIRED __CORDOVA_3_6_3 -#endif - -/* - Returns YES if it is at least version specified as NSString(X) - Usage: - if (IsAtLeastiOSVersion(@"5.1")) { - // do something for iOS 5.1 or greater - } - */ -#define IsAtLeastiOSVersion(X) ([[[UIDevice currentDevice] systemVersion] compare:X options:NSNumericSearch] != NSOrderedAscending) - -#define CDV_IsIPad() ([[UIDevice currentDevice] respondsToSelector:@selector(userInterfaceIdiom)] && ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad)) - -#define CDV_IsIPhone5() ([[UIScreen mainScreen] bounds].size.height == 568 && [[UIScreen mainScreen] bounds].size.width == 320) - -/* Return the string version of the decimal version */ -#define CDV_VERSION [NSString stringWithFormat:@"%d.%d.%d", \ - (CORDOVA_VERSION_MIN_REQUIRED / 10000), \ - (CORDOVA_VERSION_MIN_REQUIRED % 10000) / 100, \ - (CORDOVA_VERSION_MIN_REQUIRED % 10000) % 100] - -#ifdef __clang__ - #define CDV_DEPRECATED(version, msg) __attribute__((deprecated("Deprecated in Cordova " #version ". " msg))) -#else - #define CDV_DEPRECATED(version, msg) __attribute__((deprecated())) -#endif - -// Enable this to log all exec() calls. -#define CDV_ENABLE_EXEC_LOGGING 0 -#if CDV_ENABLE_EXEC_LOGGING - #define CDV_EXEC_LOG NSLog -#else - #define CDV_EXEC_LOG(...) do {} while (NO) -#endif diff --git a/src/ios/CordovaLib/Classes/CDVCommandDelegate.h b/src/ios/CordovaLib/Classes/CDVCommandDelegate.h deleted file mode 100644 index 04df6bc..0000000 --- a/src/ios/CordovaLib/Classes/CDVCommandDelegate.h +++ /dev/null @@ -1,50 +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 "CDVAvailability.h" -#import "CDVInvokedUrlCommand.h" - -@class CDVPlugin; -@class CDVPluginResult; -@class CDVWhitelist; - -@protocol CDVCommandDelegate - -@property (nonatomic, readonly) NSDictionary* settings; - -- (NSString*)pathForResource:(NSString*)resourcepath; -- (id)getCommandInstance:(NSString*)pluginName; - -// Sends a plugin result to the JS. This is thread-safe. -- (void)sendPluginResult:(CDVPluginResult*)result callbackId:(NSString*)callbackId; -// Evaluates the given JS. This is thread-safe. -- (void)evalJs:(NSString*)js; -// Can be used to evaluate JS right away instead of scheduling it on the run-loop. -// This is required for dispatch resign and pause events, but should not be used -// without reason. Without the run-loop delay, alerts used in JS callbacks may result -// in dead-lock. This method must be called from the UI thread. -- (void)evalJs:(NSString*)js scheduledOnRunLoop:(BOOL)scheduledOnRunLoop; -// Runs the given block on a background thread using a shared thread-pool. -- (void)runInBackground:(void (^)())block; -// Returns the User-Agent of the associated UIWebView. -- (NSString*)userAgent; -// Returns whether the given URL passes the white-list. -- (BOOL)URLIsWhitelisted:(NSURL*)url; - -@end diff --git a/src/ios/CordovaLib/Classes/CDVCommandDelegateImpl.h b/src/ios/CordovaLib/Classes/CDVCommandDelegateImpl.h deleted file mode 100644 index 0531134..0000000 --- a/src/ios/CordovaLib/Classes/CDVCommandDelegateImpl.h +++ /dev/null @@ -1,36 +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 "CDVCommandDelegate.h" - -@class CDVViewController; -@class CDVCommandQueue; - -@interface CDVCommandDelegateImpl : NSObject { - @private - __weak CDVViewController* _viewController; - NSRegularExpression* _callbackIdPattern; - @protected - __weak CDVCommandQueue* _commandQueue; - BOOL _delayResponses; -} -- (id)initWithViewController:(CDVViewController*)viewController; -- (void)flushCommandQueueWithDelayedJs; -@end diff --git a/src/ios/CordovaLib/Classes/CDVCommandDelegateImpl.m b/src/ios/CordovaLib/Classes/CDVCommandDelegateImpl.m deleted file mode 100644 index 76f5ef4..0000000 --- a/src/ios/CordovaLib/Classes/CDVCommandDelegateImpl.m +++ /dev/null @@ -1,184 +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 "CDVCommandDelegateImpl.h" -#import "CDVJSON.h" -#import "CDVCommandQueue.h" -#import "CDVPluginResult.h" -#import "CDVViewController.h" - -@implementation CDVCommandDelegateImpl - -- (id)initWithViewController:(CDVViewController*)viewController -{ - self = [super init]; - if (self != nil) { - _viewController = viewController; - _commandQueue = _viewController.commandQueue; - _callbackIdPattern = nil; - } - return self; -} - -- (NSString*)pathForResource:(NSString*)resourcepath -{ - NSBundle* mainBundle = [NSBundle mainBundle]; - NSMutableArray* directoryParts = [NSMutableArray arrayWithArray:[resourcepath componentsSeparatedByString:@"/"]]; - NSString* filename = [directoryParts lastObject]; - - [directoryParts removeLastObject]; - - NSString* directoryPartsJoined = [directoryParts componentsJoinedByString:@"/"]; - NSString* directoryStr = _viewController.wwwFolderName; - - if ([directoryPartsJoined length] > 0) { - directoryStr = [NSString stringWithFormat:@"%@/%@", _viewController.wwwFolderName, [directoryParts componentsJoinedByString:@"/"]]; - } - - return [mainBundle pathForResource:filename ofType:@"" inDirectory:directoryStr]; -} - -- (void)flushCommandQueueWithDelayedJs -{ - _delayResponses = YES; - [_commandQueue executePending]; - _delayResponses = NO; -} - -- (void)evalJsHelper2:(NSString*)js -{ - CDV_EXEC_LOG(@"Exec: evalling: %@", [js substringToIndex:MIN([js length], 160)]); - NSString* commandsJSON = [_viewController.webView stringByEvaluatingJavaScriptFromString:js]; - if ([commandsJSON length] > 0) { - CDV_EXEC_LOG(@"Exec: Retrieved new exec messages by chaining."); - } - - [_commandQueue enqueueCommandBatch:commandsJSON]; - [_commandQueue executePending]; -} - -- (void)evalJsHelper:(NSString*)js -{ - // Cycle the run-loop before executing the JS. - // For _delayResponses - - // This ensures that we don't eval JS during the middle of an existing JS - // function (possible since UIWebViewDelegate callbacks can be synchronous). - // For !isMainThread - - // It's a hard error to eval on the non-UI thread. - // For !_commandQueue.currentlyExecuting - - // This works around a bug where sometimes alerts() within callbacks can cause - // dead-lock. - // If the commandQueue is currently executing, then we know that it is safe to - // execute the callback immediately. - // Using (dispatch_get_main_queue()) does *not* fix deadlocks for some reason, - // but performSelectorOnMainThread: does. - if (_delayResponses || ![NSThread isMainThread] || !_commandQueue.currentlyExecuting) { - [self performSelectorOnMainThread:@selector(evalJsHelper2:) withObject:js waitUntilDone:NO]; - } else { - [self evalJsHelper2:js]; - } -} - -- (BOOL)isValidCallbackId:(NSString*)callbackId -{ - NSError* err = nil; - - if (callbackId == nil) { - return NO; - } - - // Initialize on first use - if (_callbackIdPattern == nil) { - // Catch any invalid characters in the callback id. - _callbackIdPattern = [NSRegularExpression regularExpressionWithPattern:@"[^A-Za-z0-9._-]" options:0 error:&err]; - if (err != nil) { - // Couldn't initialize Regex; No is safer than Yes. - return NO; - } - } - // Disallow if too long or if any invalid characters were found. - if (([callbackId length] > 100) || [_callbackIdPattern firstMatchInString:callbackId options:0 range:NSMakeRange(0, [callbackId length])]) { - return NO; - } - return YES; -} - -- (void)sendPluginResult:(CDVPluginResult*)result callbackId:(NSString*)callbackId -{ - CDV_EXEC_LOG(@"Exec(%@): Sending result. Status=%@", callbackId, result.status); - // This occurs when there is are no win/fail callbacks for the call. - if ([@"INVALID" isEqualToString : callbackId]) { - return; - } - // This occurs when the callback id is malformed. - if (![self isValidCallbackId:callbackId]) { - NSLog(@"Invalid callback id received by sendPluginResult"); - return; - } - int status = [result.status intValue]; - BOOL keepCallback = [result.keepCallback boolValue]; - NSString* argumentsAsJSON = [result argumentsAsJSON]; - - NSString* js = [NSString stringWithFormat:@"cordova.require('cordova/exec').nativeCallback('%@',%d,%@,%d)", callbackId, status, argumentsAsJSON, keepCallback]; - - [self evalJsHelper:js]; -} - -- (void)evalJs:(NSString*)js -{ - [self evalJs:js scheduledOnRunLoop:YES]; -} - -- (void)evalJs:(NSString*)js scheduledOnRunLoop:(BOOL)scheduledOnRunLoop -{ - js = [NSString stringWithFormat:@"cordova.require('cordova/exec').nativeEvalAndFetch(function(){%@})", js]; - if (scheduledOnRunLoop) { - [self evalJsHelper:js]; - } else { - [self evalJsHelper2:js]; - } -} - -- (id)getCommandInstance:(NSString*)pluginName -{ - return [_viewController getCommandInstance:pluginName]; -} - -- (void)runInBackground:(void (^)())block -{ - dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), block); -} - -- (NSString*)userAgent -{ - return [_viewController userAgent]; -} - -- (BOOL)URLIsWhitelisted:(NSURL*)url -{ - return ![_viewController.whitelist schemeIsAllowed:[url scheme]] || - [_viewController.whitelist URLIsAllowed:url logFailure:NO]; -} - -- (NSDictionary*)settings -{ - return _viewController.settings; -} - -@end diff --git a/src/ios/CordovaLib/Classes/CDVCommandQueue.h b/src/ios/CordovaLib/Classes/CDVCommandQueue.h deleted file mode 100644 index 3329078..0000000 --- a/src/ios/CordovaLib/Classes/CDVCommandQueue.h +++ /dev/null @@ -1,40 +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 - -@class CDVInvokedUrlCommand; -@class CDVViewController; - -@interface CDVCommandQueue : NSObject - -@property (nonatomic, readonly) BOOL currentlyExecuting; - -- (id)initWithViewController:(CDVViewController*)viewController; -- (void)dispose; - -- (void)resetRequestId; -- (void)enqueueCommandBatch:(NSString*)batchJSON; - -- (void)processXhrExecBridgePoke:(NSNumber*)requestId; -- (void)fetchCommandsFromJs; -- (void)executePending; -- (BOOL)execute:(CDVInvokedUrlCommand*)command; - -@end diff --git a/src/ios/CordovaLib/Classes/CDVCommandQueue.m b/src/ios/CordovaLib/Classes/CDVCommandQueue.m deleted file mode 100644 index 1eddfe3..0000000 --- a/src/ios/CordovaLib/Classes/CDVCommandQueue.m +++ /dev/null @@ -1,210 +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 -#import "CDV.h" -#import "CDVCommandQueue.h" -#import "CDVViewController.h" -#import "CDVCommandDelegateImpl.h" - -// Parse JS on the main thread if it's shorter than this. -static const NSInteger JSON_SIZE_FOR_MAIN_THREAD = 4 * 1024; // Chosen arbitrarily. -// Execute multiple commands in one go until this many seconds have passed. -static const double MAX_EXECUTION_TIME = .008; // Half of a 60fps frame. - -@interface CDVCommandQueue () { - NSInteger _lastCommandQueueFlushRequestId; - __weak CDVViewController* _viewController; - NSMutableArray* _queue; - NSTimeInterval _startExecutionTime; -} -@end - -@implementation CDVCommandQueue - -- (BOOL)currentlyExecuting -{ - return _startExecutionTime > 0; -} - -- (id)initWithViewController:(CDVViewController*)viewController -{ - self = [super init]; - if (self != nil) { - _viewController = viewController; - _queue = [[NSMutableArray alloc] init]; - } - return self; -} - -- (void)dispose -{ - // TODO(agrieve): Make this a zeroing weak ref once we drop support for 4.3. - _viewController = nil; -} - -- (void)resetRequestId -{ - _lastCommandQueueFlushRequestId = 0; -} - -- (void)enqueueCommandBatch:(NSString*)batchJSON -{ - if ([batchJSON length] > 0) { - NSMutableArray* commandBatchHolder = [[NSMutableArray alloc] init]; - [_queue addObject:commandBatchHolder]; - if ([batchJSON length] < JSON_SIZE_FOR_MAIN_THREAD) { - [commandBatchHolder addObject:[batchJSON JSONObject]]; - } else { - dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^() { - NSMutableArray* result = [batchJSON JSONObject]; - @synchronized(commandBatchHolder) { - [commandBatchHolder addObject:result]; - } - [self performSelectorOnMainThread:@selector(executePending) withObject:nil waitUntilDone:NO]; - }); - } - } -} - -- (void)processXhrExecBridgePoke:(NSNumber*)requestId -{ - NSInteger rid = [requestId integerValue]; - - // An ID of 1 is a special case because that signifies the first request of - // the page. Since resetRequestId is called from webViewDidStartLoad, and the - // JS context at the time of webViewDidStartLoad is still that of the previous - // page, it's possible for requests from the previous page to come in after this - // point. We ignore these by enforcing that ID=1 be the first ID. - if ((_lastCommandQueueFlushRequestId == 0) && (rid != 1)) { - CDV_EXEC_LOG(@"Exec: Ignoring exec request from previous page."); - return; - } - - // Use the request ID to determine if we've already flushed for this request. - // This is required only because the NSURLProtocol enqueues the same request - // multiple times. - if (rid > _lastCommandQueueFlushRequestId) { - _lastCommandQueueFlushRequestId = [requestId integerValue]; - [self fetchCommandsFromJs]; - [self executePending]; - } -} - -- (void)fetchCommandsFromJs -{ - // Grab all the queued commands from the JS side. - NSString* queuedCommandsJSON = [_viewController.webView stringByEvaluatingJavaScriptFromString: - @"cordova.require('cordova/exec').nativeFetchMessages()"]; - - CDV_EXEC_LOG(@"Exec: Flushed JS->native queue (hadCommands=%d).", [queuedCommandsJSON length] > 0); - [self enqueueCommandBatch:queuedCommandsJSON]; -} - -- (void)executePending -{ - // Make us re-entrant-safe. - if (_startExecutionTime > 0) { - return; - } - @try { - _startExecutionTime = [NSDate timeIntervalSinceReferenceDate]; - - while ([_queue count] > 0) { - NSMutableArray* commandBatchHolder = _queue[0]; - NSMutableArray* commandBatch = nil; - @synchronized(commandBatchHolder) { - // If the next-up command is still being decoded, wait for it. - if ([commandBatchHolder count] == 0) { - break; - } - commandBatch = commandBatchHolder[0]; - } - - while ([commandBatch count] > 0) { - @autoreleasepool { - // Execute the commands one-at-a-time. - NSArray* jsonEntry = [commandBatch dequeue]; - if ([commandBatch count] == 0) { - [_queue removeObjectAtIndex:0]; - } - CDVInvokedUrlCommand* command = [CDVInvokedUrlCommand commandFromJson:jsonEntry]; - CDV_EXEC_LOG(@"Exec(%@): Calling %@.%@", command.callbackId, command.className, command.methodName); - - if (![self execute:command]) { -#ifdef DEBUG - NSString* commandJson = [jsonEntry JSONString]; - static NSUInteger maxLogLength = 1024; - NSString* commandString = ([commandJson length] > maxLogLength) ? - [NSString stringWithFormat:@"%@[...]", [commandJson substringToIndex:maxLogLength]] : - commandJson; - - DLog(@"FAILED pluginJSON = %@", commandString); -#endif - } - } - - // Yield if we're taking too long. - if (([_queue count] > 0) && ([NSDate timeIntervalSinceReferenceDate] - _startExecutionTime > MAX_EXECUTION_TIME)) { - [self performSelector:@selector(executePending) withObject:nil afterDelay:0]; - return; - } - } - } - } @finally - { - _startExecutionTime = 0; - } -} - -- (BOOL)execute:(CDVInvokedUrlCommand*)command -{ - if ((command.className == nil) || (command.methodName == nil)) { - NSLog(@"ERROR: Classname and/or methodName not found for command."); - return NO; - } - - // Fetch an instance of this class - CDVPlugin* obj = [_viewController.commandDelegate getCommandInstance:command.className]; - - if (!([obj isKindOfClass:[CDVPlugin class]])) { - NSLog(@"ERROR: Plugin '%@' not found, or is not a CDVPlugin. Check your plugin mapping in config.xml.", command.className); - return NO; - } - BOOL retVal = YES; - double started = [[NSDate date] timeIntervalSince1970] * 1000.0; - // Find the proper selector to call. - NSString* methodName = [NSString stringWithFormat:@"%@:", command.methodName]; - SEL normalSelector = NSSelectorFromString(methodName); - if ([obj respondsToSelector:normalSelector]) { - // [obj performSelector:normalSelector withObject:command]; - ((void (*)(id, SEL, id))objc_msgSend)(obj, normalSelector, command); - } else { - // There's no method to call, so throw an error. - NSLog(@"ERROR: Method '%@' not defined in Plugin '%@'", methodName, command.className); - retVal = NO; - } - double elapsed = [[NSDate date] timeIntervalSince1970] * 1000.0 - started; - if (elapsed > 10) { - NSLog(@"THREAD WARNING: ['%@'] took '%f' ms. Plugin should use a background thread.", command.className, elapsed); - } - return retVal; -} - -@end diff --git a/src/ios/CordovaLib/Classes/CDVConfigParser.h b/src/ios/CordovaLib/Classes/CDVConfigParser.h deleted file mode 100644 index 2e06c88..0000000 --- a/src/ios/CordovaLib/Classes/CDVConfigParser.h +++ /dev/null @@ -1,31 +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. - */ - -@interface CDVConfigParser : NSObject -{ - NSString* featureName; -} - -@property (nonatomic, readonly, strong) NSMutableDictionary* pluginsDict; -@property (nonatomic, readonly, strong) NSMutableDictionary* settings; -@property (nonatomic, readonly, strong) NSMutableArray* whitelistHosts; -@property (nonatomic, readonly, strong) NSMutableArray* startupPluginNames; -@property (nonatomic, readonly, strong) NSString* startPage; - -@end diff --git a/src/ios/CordovaLib/Classes/CDVConfigParser.m b/src/ios/CordovaLib/Classes/CDVConfigParser.m deleted file mode 100644 index 4b73b60..0000000 --- a/src/ios/CordovaLib/Classes/CDVConfigParser.m +++ /dev/null @@ -1,88 +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 "CDVConfigParser.h" - -@interface CDVConfigParser () - -@property (nonatomic, readwrite, strong) NSMutableDictionary* pluginsDict; -@property (nonatomic, readwrite, strong) NSMutableDictionary* settings; -@property (nonatomic, readwrite, strong) NSMutableArray* whitelistHosts; -@property (nonatomic, readwrite, strong) NSMutableArray* startupPluginNames; -@property (nonatomic, readwrite, strong) NSString* startPage; - -@end - -@implementation CDVConfigParser - -@synthesize pluginsDict, settings, whitelistHosts, startPage, startupPluginNames; - -- (id)init -{ - self = [super init]; - if (self != nil) { - self.pluginsDict = [[NSMutableDictionary alloc] initWithCapacity:30]; - self.settings = [[NSMutableDictionary alloc] initWithCapacity:30]; - self.whitelistHosts = [[NSMutableArray alloc] initWithCapacity:30]; - [self.whitelistHosts addObject:@"file:///*"]; - [self.whitelistHosts addObject:@"content:///*"]; - [self.whitelistHosts addObject:@"data:///*"]; - self.startupPluginNames = [[NSMutableArray alloc] initWithCapacity:8]; - featureName = nil; - } - return self; -} - -- (void)parser:(NSXMLParser*)parser didStartElement:(NSString*)elementName namespaceURI:(NSString*)namespaceURI qualifiedName:(NSString*)qualifiedName attributes:(NSDictionary*)attributeDict -{ - if ([elementName isEqualToString:@"preference"]) { - settings[[attributeDict[@"name"] lowercaseString]] = attributeDict[@"value"]; - } else if ([elementName isEqualToString:@"feature"]) { // store feature name to use with correct parameter set - featureName = [attributeDict[@"name"] lowercaseString]; - } else if ((featureName != nil) && [elementName isEqualToString:@"param"]) { - NSString* paramName = [attributeDict[@"name"] lowercaseString]; - id value = attributeDict[@"value"]; - if ([paramName isEqualToString:@"ios-package"]) { - pluginsDict[featureName] = value; - } - BOOL paramIsOnload = ([paramName isEqualToString:@"onload"] && [@"true" isEqualToString : value]); - BOOL attribIsOnload = [@"true" isEqualToString :[attributeDict[@"onload"] lowercaseString]]; - if (paramIsOnload || attribIsOnload) { - [self.startupPluginNames addObject:featureName]; - } - } else if ([elementName isEqualToString:@"access"]) { - [whitelistHosts addObject:attributeDict[@"origin"]]; - } else if ([elementName isEqualToString:@"content"]) { - self.startPage = attributeDict[@"src"]; - } -} - -- (void)parser:(NSXMLParser*)parser didEndElement:(NSString*)elementName namespaceURI:(NSString*)namespaceURI qualifiedName:(NSString*)qualifiedName -{ - if ([elementName isEqualToString:@"feature"]) { // no longer handling a feature so release - featureName = nil; - } -} - -- (void)parser:(NSXMLParser*)parser parseErrorOccurred:(NSError*)parseError -{ - NSAssert(NO, @"config.xml parse error line %ld col %ld", (long)[parser lineNumber], (long)[parser columnNumber]); -} - -@end diff --git a/src/ios/CordovaLib/Classes/CDVDebug.h b/src/ios/CordovaLib/Classes/CDVDebug.h deleted file mode 100644 index 4a0d9f9..0000000 --- a/src/ios/CordovaLib/Classes/CDVDebug.h +++ /dev/null @@ -1,25 +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. - */ - -#ifdef DEBUG - #define DLog(fmt, ...) NSLog((@"%s [Line %d] " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__) -#else - #define DLog(...) -#endif -#define ALog(fmt, ...) NSLog((@"%s [Line %d] " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__) diff --git a/src/ios/CordovaLib/Classes/CDVInvokedUrlCommand.h b/src/ios/CordovaLib/Classes/CDVInvokedUrlCommand.h deleted file mode 100644 index 993e0a2..0000000 --- a/src/ios/CordovaLib/Classes/CDVInvokedUrlCommand.h +++ /dev/null @@ -1,52 +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 - -@interface CDVInvokedUrlCommand : NSObject { - NSString* _callbackId; - NSString* _className; - NSString* _methodName; - NSArray* _arguments; -} - -@property (nonatomic, readonly) NSArray* arguments; -@property (nonatomic, readonly) NSString* callbackId; -@property (nonatomic, readonly) NSString* className; -@property (nonatomic, readonly) NSString* methodName; - -+ (CDVInvokedUrlCommand*)commandFromJson:(NSArray*)jsonEntry; - -- (id)initWithArguments:(NSArray*)arguments - callbackId:(NSString*)callbackId - className:(NSString*)className - methodName:(NSString*)methodName; - -- (id)initFromJson:(NSArray*)jsonEntry; - -// Returns the argument at the given index. -// If index >= the number of arguments, returns nil. -// If the argument at the given index is NSNull, returns nil. -- (id)argumentAtIndex:(NSUInteger)index; -// Same as above, but returns defaultValue instead of nil. -- (id)argumentAtIndex:(NSUInteger)index withDefault:(id)defaultValue; -// Same as above, but returns defaultValue instead of nil, and if the argument is not of the expected class, returns defaultValue -- (id)argumentAtIndex:(NSUInteger)index withDefault:(id)defaultValue andClass:(Class)aClass; - -@end diff --git a/src/ios/CordovaLib/Classes/CDVInvokedUrlCommand.m b/src/ios/CordovaLib/Classes/CDVInvokedUrlCommand.m deleted file mode 100644 index ff5f647..0000000 --- a/src/ios/CordovaLib/Classes/CDVInvokedUrlCommand.m +++ /dev/null @@ -1,117 +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 "CDVInvokedUrlCommand.h" -#import "CDVJSON.h" -#import "NSData+Base64.h" - -@implementation CDVInvokedUrlCommand - -@synthesize arguments = _arguments; -@synthesize callbackId = _callbackId; -@synthesize className = _className; -@synthesize methodName = _methodName; - -+ (CDVInvokedUrlCommand*)commandFromJson:(NSArray*)jsonEntry -{ - return [[CDVInvokedUrlCommand alloc] initFromJson:jsonEntry]; -} - -- (id)initFromJson:(NSArray*)jsonEntry -{ - id tmp = [jsonEntry objectAtIndex:0]; - NSString* callbackId = tmp == [NSNull null] ? nil : tmp; - NSString* className = [jsonEntry objectAtIndex:1]; - NSString* methodName = [jsonEntry objectAtIndex:2]; - NSMutableArray* arguments = [jsonEntry objectAtIndex:3]; - - return [self initWithArguments:arguments - callbackId:callbackId - className:className - methodName:methodName]; -} - -- (id)initWithArguments:(NSArray*)arguments - callbackId:(NSString*)callbackId - className:(NSString*)className - methodName:(NSString*)methodName -{ - self = [super init]; - if (self != nil) { - _arguments = arguments; - _callbackId = callbackId; - _className = className; - _methodName = methodName; - } - [self massageArguments]; - return self; -} - -- (void)massageArguments -{ - NSMutableArray* newArgs = nil; - - for (NSUInteger i = 0, count = [_arguments count]; i < count; ++i) { - id arg = [_arguments objectAtIndex:i]; - if (![arg isKindOfClass:[NSDictionary class]]) { - continue; - } - NSDictionary* dict = arg; - NSString* type = [dict objectForKey:@"CDVType"]; - if (!type || ![type isEqualToString:@"ArrayBuffer"]) { - continue; - } - NSString* data = [dict objectForKey:@"data"]; - if (!data) { - continue; - } - if (newArgs == nil) { - newArgs = [NSMutableArray arrayWithArray:_arguments]; - _arguments = newArgs; - } - [newArgs replaceObjectAtIndex:i withObject:[NSData dataFromBase64String:data]]; - } -} - -- (id)argumentAtIndex:(NSUInteger)index -{ - return [self argumentAtIndex:index withDefault:nil]; -} - -- (id)argumentAtIndex:(NSUInteger)index withDefault:(id)defaultValue -{ - return [self argumentAtIndex:index withDefault:defaultValue andClass:nil]; -} - -- (id)argumentAtIndex:(NSUInteger)index withDefault:(id)defaultValue andClass:(Class)aClass -{ - if (index >= [_arguments count]) { - return defaultValue; - } - id ret = [_arguments objectAtIndex:index]; - if (ret == [NSNull null]) { - ret = defaultValue; - } - if ((aClass != nil) && ![ret isKindOfClass:aClass]) { - ret = defaultValue; - } - return ret; -} - -@end diff --git a/src/ios/CordovaLib/Classes/CDVJSON.h b/src/ios/CordovaLib/Classes/CDVJSON.h deleted file mode 100644 index eaa895e..0000000 --- a/src/ios/CordovaLib/Classes/CDVJSON.h +++ /dev/null @@ -1,30 +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. - */ - -@interface NSArray (CDVJSONSerializing) -- (NSString*)JSONString; -@end - -@interface NSDictionary (CDVJSONSerializing) -- (NSString*)JSONString; -@end - -@interface NSString (CDVJSONSerializing) -- (id)JSONObject; -@end diff --git a/src/ios/CordovaLib/Classes/CDVJSON.m b/src/ios/CordovaLib/Classes/CDVJSON.m deleted file mode 100644 index f42dfae..0000000 --- a/src/ios/CordovaLib/Classes/CDVJSON.m +++ /dev/null @@ -1,77 +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 "CDVJSON.h" -#import - -@implementation NSArray (CDVJSONSerializing) - -- (NSString*)JSONString -{ - NSError* error = nil; - NSData* jsonData = [NSJSONSerialization dataWithJSONObject:self - options:NSJSONWritingPrettyPrinted - error:&error]; - - if (error != nil) { - NSLog(@"NSArray JSONString error: %@", [error localizedDescription]); - return nil; - } else { - return [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]; - } -} - -@end - -@implementation NSDictionary (CDVJSONSerializing) - -- (NSString*)JSONString -{ - NSError* error = nil; - NSData* jsonData = [NSJSONSerialization dataWithJSONObject:self - options:NSJSONWritingPrettyPrinted - error:&error]; - - if (error != nil) { - NSLog(@"NSDictionary JSONString error: %@", [error localizedDescription]); - return nil; - } else { - return [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]; - } -} - -@end - -@implementation NSString (CDVJSONSerializing) - -- (id)JSONObject -{ - NSError* error = nil; - id object = [NSJSONSerialization JSONObjectWithData:[self dataUsingEncoding:NSUTF8StringEncoding] - options:NSJSONReadingMutableContainers - error:&error]; - - if (error != nil) { - NSLog(@"NSString JSONObject error: %@", [error localizedDescription]); - } - - return object; -} - -@end diff --git a/src/ios/CordovaLib/Classes/CDVLocalStorage.h b/src/ios/CordovaLib/Classes/CDVLocalStorage.h deleted file mode 100644 index dec6ab3..0000000 --- a/src/ios/CordovaLib/Classes/CDVLocalStorage.h +++ /dev/null @@ -1,50 +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 "CDVPlugin.h" - -#define kCDVLocalStorageErrorDomain @"kCDVLocalStorageErrorDomain" -#define kCDVLocalStorageFileOperationError 1 - -@interface CDVLocalStorage : CDVPlugin - -@property (nonatomic, readonly, strong) NSMutableArray* backupInfo; - -- (BOOL)shouldBackup; -- (BOOL)shouldRestore; -- (void)backup:(CDVInvokedUrlCommand*)command; -- (void)restore:(CDVInvokedUrlCommand*)command; - -+ (void)__fixupDatabaseLocationsWithBackupType:(NSString*)backupType; -// Visible for testing. -+ (BOOL)__verifyAndFixDatabaseLocationsWithAppPlistDict:(NSMutableDictionary*)appPlistDict - bundlePath:(NSString*)bundlePath - fileManager:(NSFileManager*)fileManager; -@end - -@interface CDVBackupInfo : NSObject - -@property (nonatomic, copy) NSString* original; -@property (nonatomic, copy) NSString* backup; -@property (nonatomic, copy) NSString* label; - -- (BOOL)shouldBackup; -- (BOOL)shouldRestore; - -@end diff --git a/src/ios/CordovaLib/Classes/CDVLocalStorage.m b/src/ios/CordovaLib/Classes/CDVLocalStorage.m deleted file mode 100644 index 5e2f4bb..0000000 --- a/src/ios/CordovaLib/Classes/CDVLocalStorage.m +++ /dev/null @@ -1,491 +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 "CDVLocalStorage.h" -#import "CDV.h" - -@interface CDVLocalStorage () - -@property (nonatomic, readwrite, strong) NSMutableArray* backupInfo; // array of CDVBackupInfo objects -@property (nonatomic, readwrite, weak) id webviewDelegate; - -@end - -@implementation CDVLocalStorage - -@synthesize backupInfo, webviewDelegate; - -- (void)pluginInitialize -{ - [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onResignActive) - name:UIApplicationWillResignActiveNotification object:nil]; - BOOL cloudBackup = [@"cloud" isEqualToString : self.commandDelegate.settings[[@"BackupWebStorage" lowercaseString]]]; - - self.backupInfo = [[self class] createBackupInfoWithCloudBackup:cloudBackup]; -} - -#pragma mark - -#pragma mark Plugin interface methods - -+ (NSMutableArray*)createBackupInfoWithTargetDir:(NSString*)targetDir backupDir:(NSString*)backupDir targetDirNests:(BOOL)targetDirNests backupDirNests:(BOOL)backupDirNests rename:(BOOL)rename -{ - /* - This "helper" does so much work and has so many options it would probably be clearer to refactor the whole thing. - Basically, there are three database locations: - - 1. "Normal" dir -- LIB// - 2. "Caches" dir -- LIB/Caches/ - 3. "Backup" dir -- DOC/Backups/ - - And between these three, there are various migration paths, most of which only consider 2 of the 3, which is why this helper is based on 2 locations and has a notion of "direction". - */ - NSMutableArray* backupInfo = [NSMutableArray arrayWithCapacity:3]; - - NSString* original; - NSString* backup; - CDVBackupInfo* backupItem; - - // ////////// LOCALSTORAGE - - original = [targetDir stringByAppendingPathComponent:targetDirNests ? @"WebKit/LocalStorage/file__0.localstorage":@"file__0.localstorage"]; - backup = [backupDir stringByAppendingPathComponent:(backupDirNests ? @"WebKit/LocalStorage" : @"")]; - backup = [backup stringByAppendingPathComponent:(rename ? @"localstorage.appdata.db" : @"file__0.localstorage")]; - - backupItem = [[CDVBackupInfo alloc] init]; - backupItem.backup = backup; - backupItem.original = original; - backupItem.label = @"localStorage database"; - - [backupInfo addObject:backupItem]; - - // ////////// WEBSQL MAIN DB - - original = [targetDir stringByAppendingPathComponent:targetDirNests ? @"WebKit/LocalStorage/Databases.db":@"Databases.db"]; - backup = [backupDir stringByAppendingPathComponent:(backupDirNests ? @"WebKit/LocalStorage" : @"")]; - backup = [backup stringByAppendingPathComponent:(rename ? @"websqlmain.appdata.db" : @"Databases.db")]; - - backupItem = [[CDVBackupInfo alloc] init]; - backupItem.backup = backup; - backupItem.original = original; - backupItem.label = @"websql main database"; - - [backupInfo addObject:backupItem]; - - // ////////// WEBSQL DATABASES - - original = [targetDir stringByAppendingPathComponent:targetDirNests ? @"WebKit/LocalStorage/file__0":@"file__0"]; - backup = [backupDir stringByAppendingPathComponent:(backupDirNests ? @"WebKit/LocalStorage" : @"")]; - backup = [backup stringByAppendingPathComponent:(rename ? @"websqldbs.appdata.db" : @"file__0")]; - - backupItem = [[CDVBackupInfo alloc] init]; - backupItem.backup = backup; - backupItem.original = original; - backupItem.label = @"websql databases"; - - [backupInfo addObject:backupItem]; - - return backupInfo; -} - -+ (NSMutableArray*)createBackupInfoWithCloudBackup:(BOOL)cloudBackup -{ - // create backup info from backup folder to caches folder - NSString* appLibraryFolder = [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) objectAtIndex:0]; - NSString* appDocumentsFolder = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]; - NSString* cacheFolder = [appLibraryFolder stringByAppendingPathComponent:@"Caches"]; - NSString* backupsFolder = [appDocumentsFolder stringByAppendingPathComponent:@"Backups"]; - - // create the backups folder, if needed - [[NSFileManager defaultManager] createDirectoryAtPath:backupsFolder withIntermediateDirectories:YES attributes:nil error:nil]; - - [self addSkipBackupAttributeToItemAtURL:[NSURL fileURLWithPath:backupsFolder] skip:!cloudBackup]; - - return [self createBackupInfoWithTargetDir:cacheFolder backupDir:backupsFolder targetDirNests:NO backupDirNests:NO rename:YES]; -} - -+ (BOOL)addSkipBackupAttributeToItemAtURL:(NSURL*)URL skip:(BOOL)skip -{ - NSAssert(IsAtLeastiOSVersion(@"5.1"), @"Cannot mark files for NSURLIsExcludedFromBackupKey on iOS less than 5.1"); - - NSError* error = nil; - BOOL success = [URL setResourceValue:[NSNumber numberWithBool:skip] forKey:NSURLIsExcludedFromBackupKey error:&error]; - if (!success) { - NSLog(@"Error excluding %@ from backup %@", [URL lastPathComponent], error); - } - return success; -} - -+ (BOOL)copyFrom:(NSString*)src to:(NSString*)dest error:(NSError* __autoreleasing*)error -{ - NSFileManager* fileManager = [NSFileManager defaultManager]; - - if (![fileManager fileExistsAtPath:src]) { - NSString* errorString = [NSString stringWithFormat:@"%@ file does not exist.", src]; - if (error != NULL) { - (*error) = [NSError errorWithDomain:kCDVLocalStorageErrorDomain - code:kCDVLocalStorageFileOperationError - userInfo:[NSDictionary dictionaryWithObject:errorString - forKey:NSLocalizedDescriptionKey]]; - } - return NO; - } - - // generate unique filepath in temp directory - CFUUIDRef uuidRef = CFUUIDCreate(kCFAllocatorDefault); - CFStringRef uuidString = CFUUIDCreateString(kCFAllocatorDefault, uuidRef); - NSString* tempBackup = [[NSTemporaryDirectory() stringByAppendingPathComponent:(__bridge NSString*)uuidString] stringByAppendingPathExtension:@"bak"]; - CFRelease(uuidString); - CFRelease(uuidRef); - - BOOL destExists = [fileManager fileExistsAtPath:dest]; - - // backup the dest - if (destExists && ![fileManager copyItemAtPath:dest toPath:tempBackup error:error]) { - return NO; - } - - // remove the dest - if (destExists && ![fileManager removeItemAtPath:dest error:error]) { - return NO; - } - - // create path to dest - if (!destExists && ![fileManager createDirectoryAtPath:[dest stringByDeletingLastPathComponent] withIntermediateDirectories:YES attributes:nil error:error]) { - return NO; - } - - // copy src to dest - if ([fileManager copyItemAtPath:src toPath:dest error:error]) { - // success - cleanup - delete the backup to the dest - if ([fileManager fileExistsAtPath:tempBackup]) { - [fileManager removeItemAtPath:tempBackup error:error]; - } - return YES; - } else { - // failure - we restore the temp backup file to dest - [fileManager copyItemAtPath:tempBackup toPath:dest error:error]; - // cleanup - delete the backup to the dest - if ([fileManager fileExistsAtPath:tempBackup]) { - [fileManager removeItemAtPath:tempBackup error:error]; - } - return NO; - } -} - -- (BOOL)shouldBackup -{ - for (CDVBackupInfo* info in self.backupInfo) { - if ([info shouldBackup]) { - return YES; - } - } - - return NO; -} - -- (BOOL)shouldRestore -{ - for (CDVBackupInfo* info in self.backupInfo) { - if ([info shouldRestore]) { - return YES; - } - } - - return NO; -} - -/* copy from webkitDbLocation to persistentDbLocation */ -- (void)backup:(CDVInvokedUrlCommand*)command -{ - NSString* callbackId = command.callbackId; - - NSError* __autoreleasing error = nil; - CDVPluginResult* result = nil; - NSString* message = nil; - - for (CDVBackupInfo* info in self.backupInfo) { - if ([info shouldBackup]) { - [[self class] copyFrom:info.original to:info.backup error:&error]; - - if (callbackId) { - if (error == nil) { - message = [NSString stringWithFormat:@"Backed up: %@", info.label]; - NSLog(@"%@", message); - - result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsString:message]; - [self.commandDelegate sendPluginResult:result callbackId:callbackId]; - } else { - message = [NSString stringWithFormat:@"Error in CDVLocalStorage (%@) backup: %@", info.label, [error localizedDescription]]; - NSLog(@"%@", message); - - result = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsString:message]; - [self.commandDelegate sendPluginResult:result callbackId:callbackId]; - } - } - } - } -} - -/* copy from persistentDbLocation to webkitDbLocation */ -- (void)restore:(CDVInvokedUrlCommand*)command -{ - NSError* __autoreleasing error = nil; - CDVPluginResult* result = nil; - NSString* message = nil; - - for (CDVBackupInfo* info in self.backupInfo) { - if ([info shouldRestore]) { - [[self class] copyFrom:info.backup to:info.original error:&error]; - - if (error == nil) { - message = [NSString stringWithFormat:@"Restored: %@", info.label]; - NSLog(@"%@", message); - - result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsString:message]; - [self.commandDelegate sendPluginResult:result callbackId:command.callbackId]; - } else { - message = [NSString stringWithFormat:@"Error in CDVLocalStorage (%@) restore: %@", info.label, [error localizedDescription]]; - NSLog(@"%@", message); - - result = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsString:message]; - [self.commandDelegate sendPluginResult:result callbackId:command.callbackId]; - } - } - } -} - -+ (void)__fixupDatabaseLocationsWithBackupType:(NSString*)backupType -{ - [self __verifyAndFixDatabaseLocations]; - [self __restoreLegacyDatabaseLocationsWithBackupType:backupType]; -} - -+ (void)__verifyAndFixDatabaseLocations -{ - NSBundle* mainBundle = [NSBundle mainBundle]; - NSString* bundlePath = [[mainBundle bundlePath] stringByDeletingLastPathComponent]; - NSString* bundleIdentifier = [[mainBundle infoDictionary] objectForKey:@"CFBundleIdentifier"]; - NSString* appPlistPath = [bundlePath stringByAppendingPathComponent:[NSString stringWithFormat:@"Library/Preferences/%@.plist", bundleIdentifier]]; - - NSMutableDictionary* appPlistDict = [NSMutableDictionary dictionaryWithContentsOfFile:appPlistPath]; - BOOL modified = [[self class] __verifyAndFixDatabaseLocationsWithAppPlistDict:appPlistDict - bundlePath:bundlePath - fileManager:[NSFileManager defaultManager]]; - - if (modified) { - BOOL ok = [appPlistDict writeToFile:appPlistPath atomically:YES]; - [[NSUserDefaults standardUserDefaults] synchronize]; - NSLog(@"Fix applied for database locations?: %@", ok ? @"YES" : @"NO"); - } -} - -+ (BOOL)__verifyAndFixDatabaseLocationsWithAppPlistDict:(NSMutableDictionary*)appPlistDict - bundlePath:(NSString*)bundlePath - fileManager:(NSFileManager*)fileManager -{ - NSString* libraryCaches = @"Library/Caches"; - NSString* libraryWebKit = @"Library/WebKit"; - - NSArray* keysToCheck = [NSArray arrayWithObjects: - @"WebKitLocalStorageDatabasePathPreferenceKey", - @"WebDatabaseDirectory", - nil]; - - BOOL dirty = NO; - - for (NSString* key in keysToCheck) { - NSString* value = [appPlistDict objectForKey:key]; - // verify key exists, and path is in app bundle, if not - fix - if ((value != nil) && ![value hasPrefix:bundlePath]) { - // the pathSuffix to use may be wrong - OTA upgrades from < 5.1 to 5.1 do keep the old path Library/WebKit, - // while Xcode synced ones do change the storage location to Library/Caches - NSString* newBundlePath = [bundlePath stringByAppendingPathComponent:libraryCaches]; - if (![fileManager fileExistsAtPath:newBundlePath]) { - newBundlePath = [bundlePath stringByAppendingPathComponent:libraryWebKit]; - } - [appPlistDict setValue:newBundlePath forKey:key]; - dirty = YES; - } - } - - return dirty; -} - -+ (void)__restoreLegacyDatabaseLocationsWithBackupType:(NSString*)backupType -{ - // on iOS 6, if you toggle between cloud/local backup, you must move database locations. Default upgrade from iOS5.1 to iOS6 is like a toggle from local to cloud. - if (!IsAtLeastiOSVersion(@"6.0")) { - return; - } - - NSString* appLibraryFolder = [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) objectAtIndex:0]; - NSString* appDocumentsFolder = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]; - - NSMutableArray* backupInfo = [NSMutableArray arrayWithCapacity:0]; - - if ([backupType isEqualToString:@"cloud"]) { -#ifdef DEBUG - NSLog(@"\n\nStarted backup to iCloud! Please be careful." - "\nYour application might be rejected by Apple if you store too much data." - "\nFor more information please read \"iOS Data Storage Guidelines\" at:" - "\nhttps://developer.apple.com/icloud/documentation/data-storage/\n\n"); -#endif - // We would like to restore old backups/caches databases to the new destination (nested in lib folder) - [backupInfo addObjectsFromArray:[self createBackupInfoWithTargetDir:appLibraryFolder backupDir:[appDocumentsFolder stringByAppendingPathComponent:@"Backups"] targetDirNests:YES backupDirNests:NO rename:YES]]; - [backupInfo addObjectsFromArray:[self createBackupInfoWithTargetDir:appLibraryFolder backupDir:[appLibraryFolder stringByAppendingPathComponent:@"Caches"] targetDirNests:YES backupDirNests:NO rename:NO]]; - } else { - // For ios6 local backups we also want to restore from Backups dir -- but we don't need to do that here, since the plugin will do that itself. - [backupInfo addObjectsFromArray:[self createBackupInfoWithTargetDir:[appLibraryFolder stringByAppendingPathComponent:@"Caches"] backupDir:appLibraryFolder targetDirNests:NO backupDirNests:YES rename:NO]]; - } - - NSFileManager* manager = [NSFileManager defaultManager]; - - for (CDVBackupInfo* info in backupInfo) { - if ([manager fileExistsAtPath:info.backup]) { - if ([info shouldRestore]) { - NSLog(@"Restoring old webstorage backup. From: '%@' To: '%@'.", info.backup, info.original); - [self copyFrom:info.backup to:info.original error:nil]; - } - NSLog(@"Removing old webstorage backup: '%@'.", info.backup); - [manager removeItemAtPath:info.backup error:nil]; - } - } - - [[NSUserDefaults standardUserDefaults] setBool:[backupType isEqualToString:@"cloud"] forKey:@"WebKitStoreWebDataForBackup"]; -} - -#pragma mark - -#pragma mark Notification handlers - -- (void)onResignActive -{ - UIDevice* device = [UIDevice currentDevice]; - NSNumber* exitsOnSuspend = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"UIApplicationExitsOnSuspend"]; - - BOOL isMultitaskingSupported = [device respondsToSelector:@selector(isMultitaskingSupported)] && [device isMultitaskingSupported]; - - if (exitsOnSuspend == nil) { // if it's missing, it should be NO (i.e. multi-tasking on by default) - exitsOnSuspend = [NSNumber numberWithBool:NO]; - } - - if (exitsOnSuspend) { - [self backup:nil]; - } else if (isMultitaskingSupported) { - __block UIBackgroundTaskIdentifier backgroundTaskID = UIBackgroundTaskInvalid; - - backgroundTaskID = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{ - [[UIApplication sharedApplication] endBackgroundTask:backgroundTaskID]; - backgroundTaskID = UIBackgroundTaskInvalid; - NSLog(@"Background task to backup WebSQL/LocalStorage expired."); - }]; - CDVLocalStorage __weak* weakSelf = self; - [self.commandDelegate runInBackground:^{ - [weakSelf backup:nil]; - - [[UIApplication sharedApplication] endBackgroundTask:backgroundTaskID]; - backgroundTaskID = UIBackgroundTaskInvalid; - }]; - } -} - -- (void)onAppTerminate -{ - [self onResignActive]; -} - -- (void)onReset -{ - [self restore:nil]; -} - -@end - -#pragma mark - -#pragma mark CDVBackupInfo implementation - -@implementation CDVBackupInfo - -@synthesize original, backup, label; - -- (BOOL)file:(NSString*)aPath isNewerThanFile:(NSString*)bPath -{ - NSFileManager* fileManager = [NSFileManager defaultManager]; - NSError* __autoreleasing error = nil; - - NSDictionary* aPathAttribs = [fileManager attributesOfItemAtPath:aPath error:&error]; - NSDictionary* bPathAttribs = [fileManager attributesOfItemAtPath:bPath error:&error]; - - NSDate* aPathModDate = [aPathAttribs objectForKey:NSFileModificationDate]; - NSDate* bPathModDate = [bPathAttribs objectForKey:NSFileModificationDate]; - - if ((nil == aPathModDate) && (nil == bPathModDate)) { - return NO; - } - - return [aPathModDate compare:bPathModDate] == NSOrderedDescending || bPathModDate == nil; -} - -- (BOOL)item:(NSString*)aPath isNewerThanItem:(NSString*)bPath -{ - NSFileManager* fileManager = [NSFileManager defaultManager]; - - BOOL aPathIsDir = NO, bPathIsDir = NO; - BOOL aPathExists = [fileManager fileExistsAtPath:aPath isDirectory:&aPathIsDir]; - - [fileManager fileExistsAtPath:bPath isDirectory:&bPathIsDir]; - - if (!aPathExists) { - return NO; - } - - if (!(aPathIsDir && bPathIsDir)) { // just a file - return [self file:aPath isNewerThanFile:bPath]; - } - - // essentially we want rsync here, but have to settle for our poor man's implementation - // we get the files in aPath, and see if it is newer than the file in bPath - // (it is newer if it doesn't exist in bPath) if we encounter the FIRST file that is newer, - // we return YES - NSDirectoryEnumerator* directoryEnumerator = [fileManager enumeratorAtPath:aPath]; - NSString* path; - - while ((path = [directoryEnumerator nextObject])) { - NSString* aPathFile = [aPath stringByAppendingPathComponent:path]; - NSString* bPathFile = [bPath stringByAppendingPathComponent:path]; - - BOOL isNewer = [self file:aPathFile isNewerThanFile:bPathFile]; - if (isNewer) { - return YES; - } - } - - return NO; -} - -- (BOOL)shouldBackup -{ - return [self item:self.original isNewerThanItem:self.backup]; -} - -- (BOOL)shouldRestore -{ - return [self item:self.backup isNewerThanItem:self.original]; -} - -@end diff --git a/src/ios/CordovaLib/Classes/CDVPlugin.h b/src/ios/CordovaLib/Classes/CDVPlugin.h deleted file mode 100644 index 5e8b283..0000000 --- a/src/ios/CordovaLib/Classes/CDVPlugin.h +++ /dev/null @@ -1,67 +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 "CDVPluginResult.h" -#import "NSMutableArray+QueueAdditions.h" -#import "CDVCommandDelegate.h" - -extern NSString* const CDVPageDidLoadNotification; -extern NSString* const CDVPluginHandleOpenURLNotification; -extern NSString* const CDVPluginResetNotification; -extern NSString* const CDVLocalNotification; -extern NSString* const CDVRemoteNotification; -extern NSString* const CDVRemoteNotificationError; - -@interface CDVPlugin : NSObject {} - -@property (nonatomic, weak) UIWebView* webView; -@property (nonatomic, weak) UIViewController* viewController; -@property (nonatomic, weak) id commandDelegate; - -@property (readonly, assign) BOOL hasPendingOperation; - -- (CDVPlugin*)initWithWebView:(UIWebView*)theWebView; -- (void)pluginInitialize; - -- (void)handleOpenURL:(NSNotification*)notification; -- (void)onAppTerminate; -- (void)onMemoryWarning; -- (void)onReset; -- (void)dispose; - -/* - // see initWithWebView implementation - - (void) onPause {} - - (void) onResume {} - - (void) onOrientationWillChange {} - - (void) onOrientationDidChange {} - - (void)didReceiveLocalNotification:(NSNotification *)notification; - */ - -- (id)appDelegate; - -- (NSString*)writeJavascript:(NSString*)javascript CDV_DEPRECATED(3.6, "Use the CDVCommandDelegate equivalent of evalJs:. This will be removed in 4.0.0"); - -- (NSString*)success:(CDVPluginResult*)pluginResult callbackId:(NSString*)callbackId CDV_DEPRECATED(3.6, "Use the CDVCommandDelegate equivalent of sendPluginResult:callbackId. This will be removed in 4.0.0"); - -- (NSString*)error:(CDVPluginResult*)pluginResult callbackId:(NSString*)callbackId CDV_DEPRECATED(3.6, "Use the CDVCommandDelegate equivalent of sendPluginResult:callbackId. This will be removed in 4.0.0"); - -@end diff --git a/src/ios/CordovaLib/Classes/CDVPlugin.m b/src/ios/CordovaLib/Classes/CDVPlugin.m deleted file mode 100644 index ea81ddd..0000000 --- a/src/ios/CordovaLib/Classes/CDVPlugin.m +++ /dev/null @@ -1,154 +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 "CDVPlugin.h" - -NSString* const CDVPageDidLoadNotification = @"CDVPageDidLoadNotification"; -NSString* const CDVPluginHandleOpenURLNotification = @"CDVPluginHandleOpenURLNotification"; -NSString* const CDVPluginResetNotification = @"CDVPluginResetNotification"; -NSString* const CDVLocalNotification = @"CDVLocalNotification"; -NSString* const CDVRemoteNotification = @"CDVRemoteNotification"; -NSString* const CDVRemoteNotificationError = @"CDVRemoteNotificationError"; - -@interface CDVPlugin () - -@property (readwrite, assign) BOOL hasPendingOperation; - -@end - -@implementation CDVPlugin -@synthesize webView, viewController, commandDelegate, hasPendingOperation; - -// Do not override these methods. Use pluginInitialize instead. -- (CDVPlugin*)initWithWebView:(UIWebView*)theWebView settings:(NSDictionary*)classSettings -{ - return [self initWithWebView:theWebView]; -} - -- (CDVPlugin*)initWithWebView:(UIWebView*)theWebView -{ - self = [super init]; - if (self) { - [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onAppTerminate) name:UIApplicationWillTerminateNotification object:nil]; - [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onMemoryWarning) name:UIApplicationDidReceiveMemoryWarningNotification object:nil]; - [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleOpenURL:) name:CDVPluginHandleOpenURLNotification object:nil]; - [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onReset) name:CDVPluginResetNotification object:theWebView]; - - self.webView = theWebView; - } - return self; -} - -- (void)pluginInitialize -{ - // You can listen to more app notifications, see: - // http://developer.apple.com/library/ios/#DOCUMENTATION/UIKit/Reference/UIApplication_Class/Reference/Reference.html#//apple_ref/doc/uid/TP40006728-CH3-DontLinkElementID_4 - - // NOTE: if you want to use these, make sure you uncomment the corresponding notification handler - - // [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onPause) name:UIApplicationDidEnterBackgroundNotification object:nil]; - // [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onResume) name:UIApplicationWillEnterForegroundNotification object:nil]; - // [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onOrientationWillChange) name:UIApplicationWillChangeStatusBarOrientationNotification object:nil]; - // [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onOrientationDidChange) name:UIApplicationDidChangeStatusBarOrientationNotification object:nil]; - - // Added in 2.3.0 - // [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didReceiveLocalNotification:) name:CDVLocalNotification object:nil]; - - // Added in 2.5.0 - // [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(pageDidLoad:) name:CDVPageDidLoadNotification object:self.webView]; -} - -- (void)dispose -{ - viewController = nil; - commandDelegate = nil; - webView = nil; -} - -/* -// NOTE: for onPause and onResume, calls into JavaScript must not call or trigger any blocking UI, like alerts -- (void) onPause {} -- (void) onResume {} -- (void) onOrientationWillChange {} -- (void) onOrientationDidChange {} -*/ - -/* NOTE: calls into JavaScript must not call or trigger any blocking UI, like alerts */ -- (void)handleOpenURL:(NSNotification*)notification -{ - // override to handle urls sent to your app - // register your url schemes in your App-Info.plist - - NSURL* url = [notification object]; - - if ([url isKindOfClass:[NSURL class]]) { - /* Do your thing! */ - } -} - -/* NOTE: calls into JavaScript must not call or trigger any blocking UI, like alerts */ -- (void)onAppTerminate -{ - // override this if you need to do any cleanup on app exit -} - -- (void)onMemoryWarning -{ - // override to remove caches, etc -} - -- (void)onReset -{ - // Override to cancel any long-running requests when the WebView navigates or refreshes. -} - -- (void)dealloc -{ - [[NSNotificationCenter defaultCenter] removeObserver:self]; // this will remove all notification unless added using addObserverForName:object:queue:usingBlock: -} - -- (id)appDelegate -{ - return [[UIApplication sharedApplication] delegate]; -} - -- (NSString*)writeJavascript:(NSString*)javascript -{ - return [self.webView stringByEvaluatingJavaScriptFromString:javascript]; -} - -- (NSString*)success:(CDVPluginResult*)pluginResult callbackId:(NSString*)callbackId -{ - [self.commandDelegate evalJs:[pluginResult toSuccessCallbackString:callbackId]]; - return @""; -} - -- (NSString*)error:(CDVPluginResult*)pluginResult callbackId:(NSString*)callbackId -{ - [self.commandDelegate evalJs:[pluginResult toErrorCallbackString:callbackId]]; - return @""; -} - -// default implementation does nothing, ideally, we are not registered for notification if we aren't going to do anything. -// - (void)didReceiveLocalNotification:(NSNotification *)notification -// { -// // UILocalNotification* localNotification = [notification object]; // get the payload as a LocalNotification -// } - -@end diff --git a/src/ios/CordovaLib/Classes/CDVPluginResult.h b/src/ios/CordovaLib/Classes/CDVPluginResult.h deleted file mode 100644 index e624d4d..0000000 --- a/src/ios/CordovaLib/Classes/CDVPluginResult.h +++ /dev/null @@ -1,71 +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 "CDVAvailability.h" - -typedef enum { - CDVCommandStatus_NO_RESULT = 0, - CDVCommandStatus_OK, - CDVCommandStatus_CLASS_NOT_FOUND_EXCEPTION, - CDVCommandStatus_ILLEGAL_ACCESS_EXCEPTION, - CDVCommandStatus_INSTANTIATION_EXCEPTION, - CDVCommandStatus_MALFORMED_URL_EXCEPTION, - CDVCommandStatus_IO_EXCEPTION, - CDVCommandStatus_INVALID_ACTION, - CDVCommandStatus_JSON_EXCEPTION, - CDVCommandStatus_ERROR -} CDVCommandStatus; - -@interface CDVPluginResult : NSObject {} - -@property (nonatomic, strong, readonly) NSNumber* status; -@property (nonatomic, strong, readonly) id message; -@property (nonatomic, strong) NSNumber* keepCallback; -// This property can be used to scope the lifetime of another object. For example, -// Use it to store the associated NSData when `message` is created using initWithBytesNoCopy. -@property (nonatomic, strong) id associatedObject; - -- (CDVPluginResult*)init; -+ (CDVPluginResult*)resultWithStatus:(CDVCommandStatus)statusOrdinal; -+ (CDVPluginResult*)resultWithStatus:(CDVCommandStatus)statusOrdinal messageAsString:(NSString*)theMessage; -+ (CDVPluginResult*)resultWithStatus:(CDVCommandStatus)statusOrdinal messageAsArray:(NSArray*)theMessage; -+ (CDVPluginResult*)resultWithStatus:(CDVCommandStatus)statusOrdinal messageAsInt:(int)theMessage; -+ (CDVPluginResult*)resultWithStatus:(CDVCommandStatus)statusOrdinal messageAsDouble:(double)theMessage; -+ (CDVPluginResult*)resultWithStatus:(CDVCommandStatus)statusOrdinal messageAsBool:(BOOL)theMessage; -+ (CDVPluginResult*)resultWithStatus:(CDVCommandStatus)statusOrdinal messageAsDictionary:(NSDictionary*)theMessage; -+ (CDVPluginResult*)resultWithStatus:(CDVCommandStatus)statusOrdinal messageAsArrayBuffer:(NSData*)theMessage; -+ (CDVPluginResult*)resultWithStatus:(CDVCommandStatus)statusOrdinal messageAsMultipart:(NSArray*)theMessages; -+ (CDVPluginResult*)resultWithStatus:(CDVCommandStatus)statusOrdinal messageToErrorObject:(int)errorCode; - -+ (void)setVerbose:(BOOL)verbose; -+ (BOOL)isVerbose; - -- (void)setKeepCallbackAsBool:(BOOL)bKeepCallback; - -- (NSString*)argumentsAsJSON; - -// These methods are used by the legacy plugin return result method -- (NSString*)toJSONString CDV_DEPRECATED(3.6, "Only used by toSuccessCallbackString and toErrorCallbackString which are deprecated. This will be removed in 4.0.0"); - -- (NSString*)toSuccessCallbackString:(NSString*)callbackId CDV_DEPRECATED(3.6, "Use the CDVCommandDelegate method sendPluginResult:callbackId instead. This will be removed in 4.0.0"); - -- (NSString*)toErrorCallbackString:(NSString*)callbackId CDV_DEPRECATED(3.6, "Use the CDVCommandDelegate method sendPluginResult:callbackId instead. This will be removed in 4.0.0"); - -@end diff --git a/src/ios/CordovaLib/Classes/CDVPluginResult.m b/src/ios/CordovaLib/Classes/CDVPluginResult.m deleted file mode 100644 index 2eb46cd..0000000 --- a/src/ios/CordovaLib/Classes/CDVPluginResult.m +++ /dev/null @@ -1,224 +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 "CDVPluginResult.h" -#import "CDVJSON.h" -#import "CDVDebug.h" -#import "NSData+Base64.h" - -@interface CDVPluginResult () - -- (CDVPluginResult*)initWithStatus:(CDVCommandStatus)statusOrdinal message:(id)theMessage; - -@end - -@implementation CDVPluginResult -@synthesize status, message, keepCallback, associatedObject; - -static NSArray* org_apache_cordova_CommandStatusMsgs; - -id messageFromArrayBuffer(NSData* data) -{ - return @{ - @"CDVType" : @"ArrayBuffer", - @"data" :[data base64EncodedString] - }; -} - -id massageMessage(id message) -{ - if ([message isKindOfClass:[NSData class]]) { - return messageFromArrayBuffer(message); - } - return message; -} - -id messageFromMultipart(NSArray* theMessages) -{ - NSMutableArray* messages = [NSMutableArray arrayWithArray:theMessages]; - - for (NSUInteger i = 0; i < messages.count; ++i) { - [messages replaceObjectAtIndex:i withObject:massageMessage([messages objectAtIndex:i])]; - } - - return @{ - @"CDVType" : @"MultiPart", - @"messages" : messages - }; -} - -+ (void)initialize -{ - org_apache_cordova_CommandStatusMsgs = [[NSArray alloc] initWithObjects:@"No result", - @"OK", - @"Class not found", - @"Illegal access", - @"Instantiation error", - @"Malformed url", - @"IO error", - @"Invalid action", - @"JSON error", - @"Error", - nil]; -} - -- (CDVPluginResult*)init -{ - return [self initWithStatus:CDVCommandStatus_NO_RESULT message:nil]; -} - -- (CDVPluginResult*)initWithStatus:(CDVCommandStatus)statusOrdinal message:(id)theMessage -{ - self = [super init]; - if (self) { - status = [NSNumber numberWithInt:statusOrdinal]; - message = theMessage; - keepCallback = [NSNumber numberWithBool:NO]; - } - return self; -} - -+ (CDVPluginResult*)resultWithStatus:(CDVCommandStatus)statusOrdinal -{ - return [[self alloc] initWithStatus:statusOrdinal message:nil]; -} - -+ (CDVPluginResult*)resultWithStatus:(CDVCommandStatus)statusOrdinal messageAsString:(NSString*)theMessage -{ - return [[self alloc] initWithStatus:statusOrdinal message:theMessage]; -} - -+ (CDVPluginResult*)resultWithStatus:(CDVCommandStatus)statusOrdinal messageAsArray:(NSArray*)theMessage -{ - return [[self alloc] initWithStatus:statusOrdinal message:theMessage]; -} - -+ (CDVPluginResult*)resultWithStatus:(CDVCommandStatus)statusOrdinal messageAsInt:(int)theMessage -{ - return [[self alloc] initWithStatus:statusOrdinal message:[NSNumber numberWithInt:theMessage]]; -} - -+ (CDVPluginResult*)resultWithStatus:(CDVCommandStatus)statusOrdinal messageAsDouble:(double)theMessage -{ - return [[self alloc] initWithStatus:statusOrdinal message:[NSNumber numberWithDouble:theMessage]]; -} - -+ (CDVPluginResult*)resultWithStatus:(CDVCommandStatus)statusOrdinal messageAsBool:(BOOL)theMessage -{ - return [[self alloc] initWithStatus:statusOrdinal message:[NSNumber numberWithBool:theMessage]]; -} - -+ (CDVPluginResult*)resultWithStatus:(CDVCommandStatus)statusOrdinal messageAsDictionary:(NSDictionary*)theMessage -{ - return [[self alloc] initWithStatus:statusOrdinal message:theMessage]; -} - -+ (CDVPluginResult*)resultWithStatus:(CDVCommandStatus)statusOrdinal messageAsArrayBuffer:(NSData*)theMessage -{ - return [[self alloc] initWithStatus:statusOrdinal message:messageFromArrayBuffer(theMessage)]; -} - -+ (CDVPluginResult*)resultWithStatus:(CDVCommandStatus)statusOrdinal messageAsMultipart:(NSArray*)theMessages -{ - return [[self alloc] initWithStatus:statusOrdinal message:messageFromMultipart(theMessages)]; -} - -+ (CDVPluginResult*)resultWithStatus:(CDVCommandStatus)statusOrdinal messageToErrorObject:(int)errorCode -{ - NSDictionary* errDict = @{@"code" :[NSNumber numberWithInt:errorCode]}; - - return [[self alloc] initWithStatus:statusOrdinal message:errDict]; -} - -- (void)setKeepCallbackAsBool:(BOOL)bKeepCallback -{ - [self setKeepCallback:[NSNumber numberWithBool:bKeepCallback]]; -} - -- (NSString*)argumentsAsJSON -{ - id arguments = (self.message == nil ? [NSNull null] : self.message); - NSArray* argumentsWrappedInArray = [NSArray arrayWithObject:arguments]; - - NSString* argumentsJSON = [argumentsWrappedInArray JSONString]; - - argumentsJSON = [argumentsJSON substringWithRange:NSMakeRange(1, [argumentsJSON length] - 2)]; - - return argumentsJSON; -} - -// These methods are used by the legacy plugin return result method -- (NSString*)toJSONString -{ - NSDictionary* dict = [NSDictionary dictionaryWithObjectsAndKeys: - self.status, @"status", - self.message ? self. message:[NSNull null], @"message", - self.keepCallback, @"keepCallback", - nil]; - - NSError* error = nil; - NSData* jsonData = [NSJSONSerialization dataWithJSONObject:dict - options:NSJSONWritingPrettyPrinted - error:&error]; - NSString* resultString = nil; - - if (error != nil) { - NSLog(@"toJSONString error: %@", [error localizedDescription]); - } else { - resultString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]; - } - - if ([[self class] isVerbose]) { - NSLog(@"PluginResult:toJSONString - %@", resultString); - } - return resultString; -} - -- (NSString*)toSuccessCallbackString:(NSString*)callbackId -{ - NSString* successCB = [NSString stringWithFormat:@"cordova.callbackSuccess('%@',%@);", callbackId, [self toJSONString]]; - - if ([[self class] isVerbose]) { - NSLog(@"PluginResult toSuccessCallbackString: %@", successCB); - } - return successCB; -} - -- (NSString*)toErrorCallbackString:(NSString*)callbackId -{ - NSString* errorCB = [NSString stringWithFormat:@"cordova.callbackError('%@',%@);", callbackId, [self toJSONString]]; - - if ([[self class] isVerbose]) { - NSLog(@"PluginResult toErrorCallbackString: %@", errorCB); - } - return errorCB; -} - -static BOOL gIsVerbose = NO; -+ (void)setVerbose:(BOOL)verbose -{ - gIsVerbose = verbose; -} - -+ (BOOL)isVerbose -{ - return gIsVerbose; -} - -@end diff --git a/src/ios/CordovaLib/Classes/CDVScreenOrientationDelegate.h b/src/ios/CordovaLib/Classes/CDVScreenOrientationDelegate.h deleted file mode 100644 index 7226205..0000000 --- a/src/ios/CordovaLib/Classes/CDVScreenOrientationDelegate.h +++ /dev/null @@ -1,28 +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 - -@protocol CDVScreenOrientationDelegate - -- (NSUInteger)supportedInterfaceOrientations; -- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation; -- (BOOL)shouldAutorotate; - -@end diff --git a/src/ios/CordovaLib/Classes/CDVShared.h b/src/ios/CordovaLib/Classes/CDVShared.h deleted file mode 100644 index 68acc5c..0000000 --- a/src/ios/CordovaLib/Classes/CDVShared.h +++ /dev/null @@ -1,22 +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. - */ - -// This file was emptied out in 3.6.0 release (July 2014). -// It will be deleted in a future release. -#import diff --git a/src/ios/CordovaLib/Classes/CDVTimer.h b/src/ios/CordovaLib/Classes/CDVTimer.h deleted file mode 100644 index 6d31593..0000000 --- a/src/ios/CordovaLib/Classes/CDVTimer.h +++ /dev/null @@ -1,27 +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 - -@interface CDVTimer : NSObject - -+ (void)start:(NSString*)name; -+ (void)stop:(NSString*)name; - -@end diff --git a/src/ios/CordovaLib/Classes/CDVTimer.m b/src/ios/CordovaLib/Classes/CDVTimer.m deleted file mode 100644 index 784e94d..0000000 --- a/src/ios/CordovaLib/Classes/CDVTimer.m +++ /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. - */ - -#import "CDVTimer.h" - -#pragma mark CDVTimerItem - -@interface CDVTimerItem : NSObject - -@property (nonatomic, strong) NSString* name; -@property (nonatomic, strong) NSDate* started; -@property (nonatomic, strong) NSDate* ended; - -- (void)log; - -@end - -@implementation CDVTimerItem - -- (void)log -{ - NSLog(@"[CDVTimer][%@] %fms", self.name, [self.ended timeIntervalSinceDate:self.started] * 1000.0); -} - -@end - -#pragma mark CDVTimer - -@interface CDVTimer () - -@property (nonatomic, strong) NSMutableDictionary* items; - -@end - -@implementation CDVTimer - -#pragma mark object methods - -- (id)init -{ - if (self = [super init]) { - self.items = [NSMutableDictionary dictionaryWithCapacity:6]; - } - - return self; -} - -- (void)add:(NSString*)name -{ - if ([self.items objectForKey:[name lowercaseString]] == nil) { - CDVTimerItem* item = [CDVTimerItem new]; - item.name = name; - item.started = [NSDate new]; - [self.items setObject:item forKey:[name lowercaseString]]; - } else { - NSLog(@"Timer called '%@' already exists.", name); - } -} - -- (void)remove:(NSString*)name -{ - CDVTimerItem* item = [self.items objectForKey:[name lowercaseString]]; - - if (item != nil) { - item.ended = [NSDate new]; - [item log]; - [self.items removeObjectForKey:[name lowercaseString]]; - } else { - NSLog(@"Timer called '%@' does not exist.", name); - } -} - -- (void)removeAll -{ - [self.items removeAllObjects]; -} - -#pragma mark class methods - -+ (void)start:(NSString*)name -{ - [[CDVTimer sharedInstance] add:name]; -} - -+ (void)stop:(NSString*)name -{ - [[CDVTimer sharedInstance] remove:name]; -} - -+ (void)clearAll -{ - [[CDVTimer sharedInstance] removeAll]; -} - -+ (CDVTimer*)sharedInstance -{ - static dispatch_once_t pred = 0; - __strong static CDVTimer* _sharedObject = nil; - - dispatch_once(&pred, ^{ - _sharedObject = [[self alloc] init]; - }); - - return _sharedObject; -} - -@end diff --git a/src/ios/CordovaLib/Classes/CDVURLProtocol.h b/src/ios/CordovaLib/Classes/CDVURLProtocol.h deleted file mode 100644 index 5444f6d..0000000 --- a/src/ios/CordovaLib/Classes/CDVURLProtocol.h +++ /dev/null @@ -1,29 +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 "CDVAvailability.h" - -@class CDVViewController; - -@interface CDVURLProtocol : NSURLProtocol {} - -+ (void)registerViewController:(CDVViewController*)viewController; -+ (void)unregisterViewController:(CDVViewController*)viewController; -@end diff --git a/src/ios/CordovaLib/Classes/CDVURLProtocol.m b/src/ios/CordovaLib/Classes/CDVURLProtocol.m deleted file mode 100644 index 3ecb6a0..0000000 --- a/src/ios/CordovaLib/Classes/CDVURLProtocol.m +++ /dev/null @@ -1,243 +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 "CDVURLProtocol.h" -#import "CDVCommandQueue.h" -#import "CDVWhitelist.h" -#import "CDVViewController.h" - -@interface CDVHTTPURLResponse : NSHTTPURLResponse -#ifndef __IPHONE_8_0 - @property (nonatomic) NSInteger statusCode; -#endif -@end - -static CDVWhitelist* gWhitelist = nil; -// Contains a set of NSNumbers of addresses of controllers. It doesn't store -// the actual pointer to avoid retaining. -static NSMutableSet* gRegisteredControllers = nil; - -NSString* const kCDVAssetsLibraryPrefixes = @"assets-library://"; - -// Returns the registered view controller that sent the given request. -// If the user-agent is not from a UIWebView, or if it's from an unregistered one, -// then nil is returned. -static CDVViewController *viewControllerForRequest(NSURLRequest* request) -{ - // The exec bridge explicitly sets the VC address in a header. - // This works around the User-Agent not being set for file: URLs. - NSString* addrString = [request valueForHTTPHeaderField:@"vc"]; - - if (addrString == nil) { - NSString* userAgent = [request valueForHTTPHeaderField:@"User-Agent"]; - if (userAgent == nil) { - return nil; - } - NSUInteger bracketLocation = [userAgent rangeOfString:@"(" options:NSBackwardsSearch].location; - if (bracketLocation == NSNotFound) { - return nil; - } - addrString = [userAgent substringFromIndex:bracketLocation + 1]; - } - - long long viewControllerAddress = [addrString longLongValue]; - @synchronized(gRegisteredControllers) { - if (![gRegisteredControllers containsObject:[NSNumber numberWithLongLong:viewControllerAddress]]) { - return nil; - } - } - - return (__bridge CDVViewController*)(void*)viewControllerAddress; -} - -@implementation CDVURLProtocol - -+ (void)registerPGHttpURLProtocol {} - -+ (void)registerURLProtocol {} - -// Called to register the URLProtocol, and to make it away of an instance of -// a ViewController. -+ (void)registerViewController:(CDVViewController*)viewController -{ - if (gRegisteredControllers == nil) { - [NSURLProtocol registerClass:[CDVURLProtocol class]]; - gRegisteredControllers = [[NSMutableSet alloc] initWithCapacity:8]; - // The whitelist doesn't change, so grab the first one and store it. - gWhitelist = viewController.whitelist; - - // Note that we grab the whitelist from the first viewcontroller for now - but this will change - // when we allow a registered viewcontroller to have its own whitelist (e.g InAppBrowser) - // Differentiating the requests will be through the 'vc' http header below as used for the js->objc bridge. - // The 'vc' value is generated by casting the viewcontroller object to a (long long) value (see CDVViewController::webViewDidFinishLoad) - if (gWhitelist == nil) { - NSLog(@"WARNING: NO whitelist has been set in CDVURLProtocol."); - } - } - - @synchronized(gRegisteredControllers) { - [gRegisteredControllers addObject:[NSNumber numberWithLongLong:(long long)viewController]]; - } -} - -+ (void)unregisterViewController:(CDVViewController*)viewController -{ - @synchronized(gRegisteredControllers) { - [gRegisteredControllers removeObject:[NSNumber numberWithLongLong:(long long)viewController]]; - } -} - -+ (BOOL)canInitWithRequest:(NSURLRequest*)theRequest -{ - NSURL* theUrl = [theRequest URL]; - CDVViewController* viewController = viewControllerForRequest(theRequest); - - if ([[theUrl absoluteString] hasPrefix:kCDVAssetsLibraryPrefixes]) { - return YES; - } else if (viewController != nil) { - if ([[theUrl path] isEqualToString:@"/!gap_exec"]) { - NSString* queuedCommandsJSON = [theRequest valueForHTTPHeaderField:@"cmds"]; - NSString* requestId = [theRequest valueForHTTPHeaderField:@"rc"]; - if (requestId == nil) { - NSLog(@"!cordova request missing rc header"); - return NO; - } - BOOL hasCmds = [queuedCommandsJSON length] > 0; - if (hasCmds) { - SEL sel = @selector(enqueueCommandBatch:); - [viewController.commandQueue performSelectorOnMainThread:sel withObject:queuedCommandsJSON waitUntilDone:NO]; - [viewController.commandQueue performSelectorOnMainThread:@selector(executePending) withObject:nil waitUntilDone:NO]; - } else { - SEL sel = @selector(processXhrExecBridgePoke:); - [viewController.commandQueue performSelectorOnMainThread:sel withObject:[NSNumber numberWithInteger:[requestId integerValue]] waitUntilDone:NO]; - } - // Returning NO here would be 20% faster, but it spams WebInspector's console with failure messages. - // If JS->Native bridge speed is really important for an app, they should use the iframe bridge. - // Returning YES here causes the request to come through canInitWithRequest two more times. - // For this reason, we return NO when cmds exist. - return !hasCmds; - } - // we only care about http and https connections. - // CORS takes care of http: trying to access file: URLs. - if ([gWhitelist schemeIsAllowed:[theUrl scheme]]) { - // if it FAILS the whitelist, we return TRUE, so we can fail the connection later - return ![gWhitelist URLIsAllowed:theUrl]; - } - } - - return NO; -} - -+ (NSURLRequest*)canonicalRequestForRequest:(NSURLRequest*)request -{ - // NSLog(@"%@ received %@", self, NSStringFromSelector(_cmd)); - return request; -} - -- (void)startLoading -{ - // NSLog(@"%@ received %@ - start", self, NSStringFromSelector(_cmd)); - NSURL* url = [[self request] URL]; - - if ([[url path] isEqualToString:@"/!gap_exec"]) { - [self sendResponseWithResponseCode:200 data:nil mimeType:nil]; - return; - } else if ([[url absoluteString] hasPrefix:kCDVAssetsLibraryPrefixes]) { - ALAssetsLibraryAssetForURLResultBlock resultBlock = ^(ALAsset* asset) { - if (asset) { - // We have the asset! Get the data and send it along. - ALAssetRepresentation* assetRepresentation = [asset defaultRepresentation]; - NSString* MIMEType = (__bridge_transfer NSString*)UTTypeCopyPreferredTagWithClass((__bridge CFStringRef)[assetRepresentation UTI], kUTTagClassMIMEType); - Byte* buffer = (Byte*)malloc((unsigned long)[assetRepresentation size]); - NSUInteger bufferSize = [assetRepresentation getBytes:buffer fromOffset:0.0 length:(NSUInteger)[assetRepresentation size] error:nil]; - NSData* data = [NSData dataWithBytesNoCopy:buffer length:bufferSize freeWhenDone:YES]; - [self sendResponseWithResponseCode:200 data:data mimeType:MIMEType]; - } else { - // Retrieving the asset failed for some reason. Send an error. - [self sendResponseWithResponseCode:404 data:nil mimeType:nil]; - } - }; - ALAssetsLibraryAccessFailureBlock failureBlock = ^(NSError* error) { - // Retrieving the asset failed for some reason. Send an error. - [self sendResponseWithResponseCode:401 data:nil mimeType:nil]; - }; - - ALAssetsLibrary* assetsLibrary = [[ALAssetsLibrary alloc] init]; - [assetsLibrary assetForURL:url resultBlock:resultBlock failureBlock:failureBlock]; - return; - } - - NSString* body = [gWhitelist errorStringForURL:url]; - [self sendResponseWithResponseCode:401 data:[body dataUsingEncoding:NSASCIIStringEncoding] mimeType:nil]; -} - -- (void)stopLoading -{ - // do any cleanup here -} - -+ (BOOL)requestIsCacheEquivalent:(NSURLRequest*)requestA toRequest:(NSURLRequest*)requestB -{ - return NO; -} - -- (void)sendResponseWithResponseCode:(NSInteger)statusCode data:(NSData*)data mimeType:(NSString*)mimeType -{ - if (mimeType == nil) { - mimeType = @"text/plain"; - } - NSString* encodingName = [@"text/plain" isEqualToString : mimeType] ? @"UTF-8" : nil; - -#ifdef __IPHONE_8_0 - NSHTTPURLResponse* response = [NSHTTPURLResponse alloc]; -#else - CDVHTTPURLResponse* response = [CDVHTTPURLResponse alloc]; -#endif - - response = [response initWithURL:[[self request] URL] - MIMEType:mimeType - expectedContentLength:[data length] - textEncodingName:encodingName]; - -#ifndef __IPHONE_8_0 - response.statusCode = statusCode; -#endif - - [[self client] URLProtocol:self didReceiveResponse:response cacheStoragePolicy:NSURLCacheStorageNotAllowed]; - if (data != nil) { - [[self client] URLProtocol:self didLoadData:data]; - } - [[self client] URLProtocolDidFinishLoading:self]; -} - -@end - -@implementation CDVHTTPURLResponse -@synthesize statusCode; - -- (NSDictionary*)allHeaderFields -{ - return nil; -} - -@end diff --git a/src/ios/CordovaLib/Classes/CDVUserAgentUtil.h b/src/ios/CordovaLib/Classes/CDVUserAgentUtil.h deleted file mode 100644 index 4de382f..0000000 --- a/src/ios/CordovaLib/Classes/CDVUserAgentUtil.h +++ /dev/null @@ -1,27 +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 - -@interface CDVUserAgentUtil : NSObject -+ (NSString*)originalUserAgent; -+ (void)acquireLock:(void (^)(NSInteger lockToken))block; -+ (void)releaseLock:(NSInteger*)lockToken; -+ (void)setUserAgent:(NSString*)value lockToken:(NSInteger)lockToken; -@end diff --git a/src/ios/CordovaLib/Classes/CDVUserAgentUtil.m b/src/ios/CordovaLib/Classes/CDVUserAgentUtil.m deleted file mode 100644 index c3402d0..0000000 --- a/src/ios/CordovaLib/Classes/CDVUserAgentUtil.m +++ /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. - */ - -#import "CDVUserAgentUtil.h" - -#import - -// #define VerboseLog NSLog -#define VerboseLog(...) do {} while (0) - -static NSString* const kCdvUserAgentKey = @"Cordova-User-Agent"; -static NSString* const kCdvUserAgentVersionKey = @"Cordova-User-Agent-Version"; - -static NSString* gOriginalUserAgent = nil; -static NSInteger gNextLockToken = 0; -static NSInteger gCurrentLockToken = 0; -static NSMutableArray* gPendingSetUserAgentBlocks = nil; - -@implementation CDVUserAgentUtil - -+ (NSString*)originalUserAgent -{ - if (gOriginalUserAgent == nil) { - [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onAppLocaleDidChange:) - name:NSCurrentLocaleDidChangeNotification object:nil]; - - NSUserDefaults* userDefaults = [NSUserDefaults standardUserDefaults]; - NSString* systemVersion = [[UIDevice currentDevice] systemVersion]; - NSString* localeStr = [[NSLocale currentLocale] localeIdentifier]; - // Record the model since simulator can change it without re-install (CB-5420). - NSString* model = [UIDevice currentDevice].model; - NSString* systemAndLocale = [NSString stringWithFormat:@"%@ %@ %@", model, systemVersion, localeStr]; - - NSString* cordovaUserAgentVersion = [userDefaults stringForKey:kCdvUserAgentVersionKey]; - gOriginalUserAgent = [userDefaults stringForKey:kCdvUserAgentKey]; - BOOL cachedValueIsOld = ![systemAndLocale isEqualToString:cordovaUserAgentVersion]; - - if ((gOriginalUserAgent == nil) || cachedValueIsOld) { - UIWebView* sampleWebView = [[UIWebView alloc] initWithFrame:CGRectZero]; - gOriginalUserAgent = [sampleWebView stringByEvaluatingJavaScriptFromString:@"navigator.userAgent"]; - - [userDefaults setObject:gOriginalUserAgent forKey:kCdvUserAgentKey]; - [userDefaults setObject:systemAndLocale forKey:kCdvUserAgentVersionKey]; - - [userDefaults synchronize]; - } - } - return gOriginalUserAgent; -} - -+ (void)onAppLocaleDidChange:(NSNotification*)notification -{ - // TODO: We should figure out how to update the user-agent of existing UIWebViews when this happens. - // Maybe use the PDF bug (noted in setUserAgent:). - gOriginalUserAgent = nil; -} - -+ (void)acquireLock:(void (^)(NSInteger lockToken))block -{ - if (gCurrentLockToken == 0) { - gCurrentLockToken = ++gNextLockToken; - VerboseLog(@"Gave lock %d", gCurrentLockToken); - block(gCurrentLockToken); - } else { - if (gPendingSetUserAgentBlocks == nil) { - gPendingSetUserAgentBlocks = [[NSMutableArray alloc] initWithCapacity:4]; - } - VerboseLog(@"Waiting for lock"); - [gPendingSetUserAgentBlocks addObject:block]; - } -} - -+ (void)releaseLock:(NSInteger*)lockToken -{ - if (*lockToken == 0) { - return; - } - NSAssert(gCurrentLockToken == *lockToken, @"Got token %ld, expected %ld", (long)*lockToken, (long)gCurrentLockToken); - - VerboseLog(@"Released lock %d", *lockToken); - if ([gPendingSetUserAgentBlocks count] > 0) { - void (^block)() = [gPendingSetUserAgentBlocks objectAtIndex:0]; - [gPendingSetUserAgentBlocks removeObjectAtIndex:0]; - gCurrentLockToken = ++gNextLockToken; - NSLog(@"Gave lock %ld", (long)gCurrentLockToken); - block(gCurrentLockToken); - } else { - gCurrentLockToken = 0; - } - *lockToken = 0; -} - -+ (void)setUserAgent:(NSString*)value lockToken:(NSInteger)lockToken -{ - NSAssert(gCurrentLockToken == lockToken, @"Got token %ld, expected %ld", (long)lockToken, (long)gCurrentLockToken); - VerboseLog(@"User-Agent set to: %@", value); - - // Setting the UserAgent must occur before a UIWebView is instantiated. - // It is read per instantiation, so it does not affect previously created views. - // Except! When a PDF is loaded, all currently active UIWebViews reload their - // User-Agent from the NSUserDefaults some time after the DidFinishLoad of the PDF bah! - NSDictionary* dict = [[NSDictionary alloc] initWithObjectsAndKeys:value, @"UserAgent", nil]; - [[NSUserDefaults standardUserDefaults] registerDefaults:dict]; -} - -@end diff --git a/src/ios/CordovaLib/Classes/CDVViewController.h b/src/ios/CordovaLib/Classes/CDVViewController.h deleted file mode 100644 index 1015c50..0000000 --- a/src/ios/CordovaLib/Classes/CDVViewController.h +++ /dev/null @@ -1,72 +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 "CDVAvailability.h" -#import "CDVInvokedUrlCommand.h" -#import "CDVCommandDelegate.h" -#import "CDVCommandQueue.h" -#import "CDVWhitelist.h" -#import "CDVScreenOrientationDelegate.h" -#import "CDVPlugin.h" - -@interface CDVViewController : UIViewController { - @protected - id _commandDelegate; - @protected - CDVCommandQueue* _commandQueue; - NSString* _userAgent; -} - -@property (nonatomic, strong) IBOutlet UIWebView* webView; - -@property (nonatomic, readonly, strong) NSMutableDictionary* pluginObjects; -@property (nonatomic, readonly, strong) NSDictionary* pluginsMap; -@property (nonatomic, readonly, strong) NSMutableDictionary* settings; -@property (nonatomic, readonly, strong) NSXMLParser* configParser; -@property (nonatomic, readonly, strong) CDVWhitelist* whitelist; // readonly for public -@property (nonatomic, readonly, assign) BOOL loadFromString; - -@property (nonatomic, readwrite, copy) NSString* wwwFolderName; -@property (nonatomic, readwrite, copy) NSString* startPage; -@property (nonatomic, readonly, strong) CDVCommandQueue* commandQueue; -@property (nonatomic, readonly, strong) id commandDelegate; -@property (nonatomic, readonly) NSString* userAgent; - -+ (NSDictionary*)getBundlePlist:(NSString*)plistName; -+ (NSString*)applicationDocumentsDirectory; - -- (void)printMultitaskingInfo; -- (void)createGapView; -- (UIWebView*)newCordovaViewWithFrame:(CGRect)bounds; - -- (void)javascriptAlert:(NSString*)text; -- (NSString*)appURLScheme; - -- (NSArray*)parseInterfaceOrientations:(NSArray*)orientations; -- (BOOL)supportsOrientation:(UIInterfaceOrientation)orientation; - -- (id)getCommandInstance:(NSString*)pluginName; -- (void)registerPlugin:(CDVPlugin*)plugin withClassName:(NSString*)className; -- (void)registerPlugin:(CDVPlugin*)plugin withPluginName:(NSString*)pluginName; - -- (BOOL)URLisAllowed:(NSURL*)url; - -@end diff --git a/src/ios/CordovaLib/Classes/CDVViewController.m b/src/ios/CordovaLib/Classes/CDVViewController.m deleted file mode 100644 index 66c1850..0000000 --- a/src/ios/CordovaLib/Classes/CDVViewController.m +++ /dev/null @@ -1,997 +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 "CDV.h" -#import "CDVCommandDelegateImpl.h" -#import "CDVConfigParser.h" -#import "CDVUserAgentUtil.h" -#import "CDVWebViewDelegate.h" -#import - -#define degreesToRadian(x) (M_PI * (x) / 180.0) - -@interface CDVViewController () { - NSInteger _userAgentLockToken; - CDVWebViewDelegate* _webViewDelegate; -} - -@property (nonatomic, readwrite, strong) NSXMLParser* configParser; -@property (nonatomic, readwrite, strong) NSMutableDictionary* settings; -@property (nonatomic, readwrite, strong) CDVWhitelist* whitelist; -@property (nonatomic, readwrite, strong) NSMutableDictionary* pluginObjects; -@property (nonatomic, readwrite, strong) NSArray* startupPluginNames; -@property (nonatomic, readwrite, strong) NSDictionary* pluginsMap; -@property (nonatomic, readwrite, strong) NSArray* supportedOrientations; -@property (nonatomic, readwrite, assign) BOOL loadFromString; - -@property (readwrite, assign) BOOL initialized; - -@property (atomic, strong) NSURL* openURL; - -@end - -@implementation CDVViewController - -@synthesize webView, supportedOrientations; -@synthesize pluginObjects, pluginsMap, whitelist, startupPluginNames; -@synthesize configParser, settings, loadFromString; -@synthesize wwwFolderName, startPage, initialized, openURL; -@synthesize commandDelegate = _commandDelegate; -@synthesize commandQueue = _commandQueue; - -- (void)__init -{ - if ((self != nil) && !self.initialized) { - _commandQueue = [[CDVCommandQueue alloc] initWithViewController:self]; - _commandDelegate = [[CDVCommandDelegateImpl alloc] initWithViewController:self]; - [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onAppWillTerminate:) - name:UIApplicationWillTerminateNotification object:nil]; - [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onAppWillResignActive:) - name:UIApplicationWillResignActiveNotification object:nil]; - [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onAppDidBecomeActive:) - name:UIApplicationDidBecomeActiveNotification object:nil]; - - [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onAppWillEnterForeground:) - name:UIApplicationWillEnterForegroundNotification object:nil]; - [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onAppDidEnterBackground:) - name:UIApplicationDidEnterBackgroundNotification object:nil]; - [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleOpenURL:) name:CDVPluginHandleOpenURLNotification object:nil]; - - // read from UISupportedInterfaceOrientations (or UISupportedInterfaceOrientations~iPad, if its iPad) from -Info.plist - self.supportedOrientations = [self parseInterfaceOrientations: - [[[NSBundle mainBundle] infoDictionary] objectForKey:@"UISupportedInterfaceOrientations"]]; - - [self printVersion]; - [self printMultitaskingInfo]; - [self printPlatformVersionWarning]; - self.initialized = YES; - - // load config.xml settings - [self loadSettings]; - } -} - -- (id)initWithNibName:(NSString*)nibNameOrNil bundle:(NSBundle*)nibBundleOrNil -{ - self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; - [self __init]; - return self; -} - -- (id)initWithCoder:(NSCoder*)aDecoder -{ - self = [super initWithCoder:aDecoder]; - [self __init]; - return self; -} - -- (id)init -{ - self = [super init]; - [self __init]; - return self; -} - -- (void)viewWillAppear:(BOOL)animated -{ - [super viewWillAppear:animated]; -} - -- (void)viewWillDisappear:(BOOL)animated -{ - [super viewWillDisappear:animated]; -} - -- (void)printVersion -{ - NSLog(@"Apache Cordova native platform version %@ is starting.", CDV_VERSION); -} - -- (void)printPlatformVersionWarning -{ - if (!IsAtLeastiOSVersion(@"6.0")) { - NSLog(@"CRITICAL: For Cordova 3.5.0 and above, you will need to upgrade to at least iOS 6.0 or greater. Your current version of iOS is %@.", - [[UIDevice currentDevice] systemVersion] - ); - } -} - -- (void)printMultitaskingInfo -{ - UIDevice* device = [UIDevice currentDevice]; - BOOL backgroundSupported = NO; - - if ([device respondsToSelector:@selector(isMultitaskingSupported)]) { - backgroundSupported = device.multitaskingSupported; - } - - NSNumber* exitsOnSuspend = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"UIApplicationExitsOnSuspend"]; - if (exitsOnSuspend == nil) { // if it's missing, it should be NO (i.e. multi-tasking on by default) - exitsOnSuspend = [NSNumber numberWithBool:NO]; - } - - NSLog(@"Multi-tasking -> Device: %@, App: %@", (backgroundSupported ? @"YES" : @"NO"), (![exitsOnSuspend intValue]) ? @"YES" : @"NO"); -} - -- (BOOL)URLisAllowed:(NSURL*)url -{ - if (self.whitelist == nil) { - return YES; - } - - return [self.whitelist URLIsAllowed:url]; -} - -- (void)loadSettings -{ - CDVConfigParser* delegate = [[CDVConfigParser alloc] init]; - - // read from config.xml in the app bundle - NSString* path = [[NSBundle mainBundle] pathForResource:@"config" ofType:@"xml"]; - - if (![[NSFileManager defaultManager] fileExistsAtPath:path]) { - NSAssert(NO, @"ERROR: config.xml does not exist. Please run cordova-ios/bin/cordova_plist_to_config_xml path/to/project."); - return; - } - - NSURL* url = [NSURL fileURLWithPath:path]; - - configParser = [[NSXMLParser alloc] initWithContentsOfURL:url]; - if (configParser == nil) { - NSLog(@"Failed to initialize XML parser."); - return; - } - [configParser setDelegate:((id < NSXMLParserDelegate >)delegate)]; - [configParser parse]; - - // Get the plugin dictionary, whitelist and settings from the delegate. - self.pluginsMap = delegate.pluginsDict; - self.startupPluginNames = delegate.startupPluginNames; - self.whitelist = [[CDVWhitelist alloc] initWithArray:delegate.whitelistHosts]; - self.settings = delegate.settings; - - // And the start folder/page. - self.wwwFolderName = @"www"; - self.startPage = delegate.startPage; - if (self.startPage == nil) { - self.startPage = @"index.html"; - } - - // Initialize the plugin objects dict. - self.pluginObjects = [[NSMutableDictionary alloc] initWithCapacity:20]; -} - -// Implement viewDidLoad to do additional setup after loading the view, typically from a nib. -- (void)viewDidLoad -{ - [super viewDidLoad]; - - NSURL* appURL = nil; - NSString* loadErr = nil; - - if ([self.startPage rangeOfString:@"://"].location != NSNotFound) { - appURL = [NSURL URLWithString:self.startPage]; - } else if ([self.wwwFolderName rangeOfString:@"://"].location != NSNotFound) { - appURL = [NSURL URLWithString:[NSString stringWithFormat:@"%@/%@", self.wwwFolderName, self.startPage]]; - } else { - // CB-3005 strip parameters from start page to check if page exists in resources - NSURL* startURL = [NSURL URLWithString:self.startPage]; - NSString* startFilePath = [self.commandDelegate pathForResource:[startURL path]]; - - if (startFilePath == nil) { - loadErr = [NSString stringWithFormat:@"ERROR: Start Page at '%@/%@' was not found.", self.wwwFolderName, self.startPage]; - NSLog(@"%@", loadErr); - self.loadFromString = YES; - appURL = nil; - } else { - appURL = [NSURL fileURLWithPath:startFilePath]; - // CB-3005 Add on the query params or fragment. - NSString* startPageNoParentDirs = self.startPage; - NSRange r = [startPageNoParentDirs rangeOfCharacterFromSet:[NSCharacterSet characterSetWithCharactersInString:@"?#"] options:0]; - if (r.location != NSNotFound) { - NSString* queryAndOrFragment = [self.startPage substringFromIndex:r.location]; - appURL = [NSURL URLWithString:queryAndOrFragment relativeToURL:appURL]; - } - } - } - - // // Fix the iOS 5.1 SECURITY_ERR bug (CB-347), this must be before the webView is instantiated //// - - NSString* backupWebStorageType = @"cloud"; // default value - - id backupWebStorage = [self settingForKey:@"BackupWebStorage"]; - if ([backupWebStorage isKindOfClass:[NSString class]]) { - backupWebStorageType = backupWebStorage; - } - [self setSetting:backupWebStorageType forKey:@"BackupWebStorage"]; - - if (IsAtLeastiOSVersion(@"5.1")) { - [CDVLocalStorage __fixupDatabaseLocationsWithBackupType:backupWebStorageType]; - } - - // // Instantiate the WebView /////////////// - - if (!self.webView) { - [self createGapView]; - } - - // Configure WebView - _webViewDelegate = [[CDVWebViewDelegate alloc] initWithDelegate:self]; - self.webView.delegate = _webViewDelegate; - - // register this viewcontroller with the NSURLProtocol, only after the User-Agent is set - [CDVURLProtocol registerViewController:self]; - - // ///////////////// - - NSString* enableViewportScale = [self settingForKey:@"EnableViewportScale"]; - NSNumber* allowInlineMediaPlayback = [self settingForKey:@"AllowInlineMediaPlayback"]; - BOOL mediaPlaybackRequiresUserAction = YES; // default value - if ([self settingForKey:@"MediaPlaybackRequiresUserAction"]) { - mediaPlaybackRequiresUserAction = [(NSNumber*)[self settingForKey:@"MediaPlaybackRequiresUserAction"] boolValue]; - } - - self.webView.scalesPageToFit = [enableViewportScale boolValue]; - - /* - * Fire up CDVLocalStorage to work-around WebKit storage limitations: on all iOS 5.1+ versions for local-only backups, but only needed on iOS 5.1 for cloud backup. - */ - if (IsAtLeastiOSVersion(@"5.1") && (([backupWebStorageType isEqualToString:@"local"]) || - ([backupWebStorageType isEqualToString:@"cloud"] && !IsAtLeastiOSVersion(@"6.0")))) { - [self registerPlugin:[[CDVLocalStorage alloc] initWithWebView:self.webView] withClassName:NSStringFromClass([CDVLocalStorage class])]; - } - - /* - * This is for iOS 4.x, where you can allow inline