From 0f565e270440779c90b3b513f9a02ff1c5c1c8d0 Mon Sep 17 00:00:00 2001 From: Ghislain Loaec Date: Thu, 19 Mar 2015 10:32:04 +0100 Subject: [PATCH] Remove builds + Add org.chromium.zip dependency - Fixes #6778 --- .gitignore | 8 +- platforms/android/.gitignore | 14 - platforms/android/.project | 71 - platforms/android/AndroidManifest.xml | 15 - platforms/android/CordovaLib/.project | 1 - .../android/CordovaLib/AndroidManifest.xml | 23 - .../ant-build/AndroidManifest.cordova.xml | 23 - .../ant-build/AndroidManifest.xml.d | 2 - .../android/CordovaLib/ant-build/build.prop | 10 - .../android/CordovaLib/ant-build/classes.jar | Bin 342622 -> 0 bytes .../classes/com/squareup/okhttp/Address.class | Bin 3356 -> 0 bytes .../com/squareup/okhttp/Connection.class | Bin 9543 -> 0 bytes .../squareup/okhttp/ConnectionPool$1.class | Bin 2542 -> 0 bytes .../squareup/okhttp/ConnectionPool$2.class | Bin 650 -> 0 bytes .../com/squareup/okhttp/ConnectionPool.class | Bin 6977 -> 0 bytes .../okhttp/Dispatcher$RealResponseBody.class | Bin 1457 -> 0 bytes .../com/squareup/okhttp/Dispatcher.class | Bin 2919 -> 0 bytes .../com/squareup/okhttp/Failure$1.class | Bin 212 -> 0 bytes .../com/squareup/okhttp/Failure$Builder.class | Bin 1303 -> 0 bytes .../classes/com/squareup/okhttp/Failure.class | Bin 1231 -> 0 bytes .../squareup/okhttp/HttpResponseCache$1.class | Bin 2433 -> 0 bytes .../squareup/okhttp/HttpResponseCache$2.class | Bin 1046 -> 0 bytes .../squareup/okhttp/HttpResponseCache$3.class | Bin 833 -> 0 bytes ...HttpResponseCache$CacheRequestImpl$1.class | Bin 2012 -> 0 bytes .../HttpResponseCache$CacheRequestImpl.class | Bin 2150 -> 0 bytes .../okhttp/HttpResponseCache$Entry.class | Bin 8443 -> 0 bytes ...HttpResponseCache$EntryCacheResponse.class | Bin 1808 -> 0 bytes ...sponseCache$EntrySecureCacheResponse.class | Bin 3237 -> 0 bytes .../squareup/okhttp/HttpResponseCache.class | Bin 9921 -> 0 bytes .../classes/com/squareup/okhttp/Job.class | Bin 8622 -> 0 bytes .../com/squareup/okhttp/MediaType.class | Bin 3176 -> 0 bytes .../okhttp/OkAuthenticator$Challenge.class | Bin 1279 -> 0 bytes .../okhttp/OkAuthenticator$Credential.class | Bin 1748 -> 0 bytes .../com/squareup/okhttp/OkAuthenticator.class | Bin 682 -> 0 bytes .../com/squareup/okhttp/OkHttpClient$1.class | Bin 1394 -> 0 bytes .../com/squareup/okhttp/OkHttpClient.class | Bin 9240 -> 0 bytes .../com/squareup/okhttp/OkResponseCache.class | Bin 773 -> 0 bytes .../com/squareup/okhttp/Request$1.class | Bin 212 -> 0 bytes .../com/squareup/okhttp/Request$Body$1.class | Bin 1112 -> 0 bytes .../com/squareup/okhttp/Request$Body$2.class | Bin 1669 -> 0 bytes .../com/squareup/okhttp/Request$Body.class | Bin 2314 -> 0 bytes .../com/squareup/okhttp/Request$Builder.class | Bin 4187 -> 0 bytes .../classes/com/squareup/okhttp/Request.class | Bin 3633 -> 0 bytes .../com/squareup/okhttp/Response$1.class | Bin 215 -> 0 bytes .../com/squareup/okhttp/Response$Body.class | Bin 2397 -> 0 bytes .../squareup/okhttp/Response$Builder.class | Bin 3083 -> 0 bytes .../squareup/okhttp/Response$Receiver.class | Bin 362 -> 0 bytes .../com/squareup/okhttp/Response.class | Bin 3357 -> 0 bytes .../com/squareup/okhttp/ResponseSource.class | Bin 1201 -> 0 bytes .../classes/com/squareup/okhttp/Route.class | Bin 1915 -> 0 bytes .../com/squareup/okhttp/RouteDatabase.class | Bin 1331 -> 0 bytes .../com/squareup/okhttp/TunnelRequest.class | Bin 1654 -> 0 bytes .../internal/AbstractOutputStream.class | Bin 793 -> 0 bytes .../com/squareup/okhttp/internal/Base64.class | Bin 2649 -> 0 bytes .../okhttp/internal/DiskLruCache$1.class | Bin 1322 -> 0 bytes .../okhttp/internal/DiskLruCache$2.class | Bin 574 -> 0 bytes ...Cache$Editor$FaultHidingOutputStream.class | Bin 1942 -> 0 bytes .../okhttp/internal/DiskLruCache$Editor.class | Bin 4964 -> 0 bytes .../okhttp/internal/DiskLruCache$Entry.class | Bin 4472 -> 0 bytes .../internal/DiskLruCache$Snapshot.class | Bin 2381 -> 0 bytes .../okhttp/internal/DiskLruCache.class | Bin 16738 -> 0 bytes .../com/squareup/okhttp/internal/Dns$1.class | Bin 652 -> 0 bytes .../com/squareup/okhttp/internal/Dns.class | Bin 492 -> 0 bytes .../FaultRecoveringOutputStream.class | Bin 2434 -> 0 bytes .../okhttp/internal/NamedRunnable.class | Bin 954 -> 0 bytes .../squareup/okhttp/internal/Platform$1.class | Bin 233 -> 0 bytes .../okhttp/internal/Platform$Android23.class | Bin 2840 -> 0 bytes .../okhttp/internal/Platform$Android41.class | Bin 2635 -> 0 bytes .../Platform$JdkWithJettyNpnPlatform.class | Bin 3757 -> 0 bytes .../internal/Platform$JettyNpnProvider.class | Bin 2439 -> 0 bytes .../squareup/okhttp/internal/Platform.class | Bin 6516 -> 0 bytes .../okhttp/internal/StrictLineReader$1.class | Bin 1242 -> 0 bytes .../okhttp/internal/StrictLineReader.class | Bin 3300 -> 0 bytes .../com/squareup/okhttp/internal/Util$1.class | Bin 935 -> 0 bytes .../com/squareup/okhttp/internal/Util.class | Bin 9234 -> 0 bytes .../http/AbstractHttpInputStream.class | Bin 1873 -> 0 bytes .../HeaderParser$CacheControlHandler.class | Bin 323 -> 0 bytes .../okhttp/internal/http/HeaderParser.class | Bin 2182 -> 0 bytes .../internal/http/HttpAuthenticator$1.class | Bin 3578 -> 0 bytes .../internal/http/HttpAuthenticator.class | Bin 3718 -> 0 bytes .../okhttp/internal/http/HttpDate$1.class | Bin 1128 -> 0 bytes .../okhttp/internal/http/HttpDate.class | Bin 2204 -> 0 bytes .../okhttp/internal/http/HttpEngine$1.class | Bin 1349 -> 0 bytes .../okhttp/internal/http/HttpEngine.class | Bin 16486 -> 0 bytes .../internal/http/HttpTransport$1.class | Bin 258 -> 0 bytes .../HttpTransport$ChunkedInputStream.class | Bin 3989 -> 0 bytes .../HttpTransport$ChunkedOutputStream.class | Bin 3069 -> 0 bytes ...HttpTransport$FixedLengthInputStream.class | Bin 2111 -> 0 bytes ...ttpTransport$FixedLengthOutputStream.class | Bin 2068 -> 0 bytes .../okhttp/internal/http/HttpTransport.class | Bin 6941 -> 0 bytes .../http/HttpURLConnectionImpl$Retry.class | Bin 1377 -> 0 bytes .../internal/http/HttpURLConnectionImpl.class | Bin 14518 -> 0 bytes .../okhttp/internal/http/HttpsEngine.class | Bin 2567 -> 0 bytes .../http/HttpsURLConnectionImpl$1.class | Bin 285 -> 0 bytes ...ectionImpl$HttpUrlConnectionDelegate.class | Bin 1894 -> 0 bytes .../http/HttpsURLConnectionImpl.class | Bin 10545 -> 0 bytes .../http/OkResponseCacheAdapter.class | Bin 2009 -> 0 bytes .../okhttp/internal/http/Policy.class | Bin 428 -> 0 bytes .../okhttp/internal/http/RawHeaders$1.class | Bin 1025 -> 0 bytes .../okhttp/internal/http/RawHeaders.class | Bin 11676 -> 0 bytes .../internal/http/RequestHeaders$1.class | Bin 1577 -> 0 bytes .../okhttp/internal/http/RequestHeaders.class | Bin 8453 -> 0 bytes .../internal/http/ResponseHeaders$1.class | Bin 1645 -> 0 bytes .../internal/http/ResponseHeaders.class | Bin 12477 -> 0 bytes .../internal/http/RetryableOutputStream.class | Bin 1938 -> 0 bytes .../okhttp/internal/http/RouteSelector.class | Bin 6924 -> 0 bytes .../okhttp/internal/http/SpdyTransport.class | Bin 5184 -> 0 bytes .../okhttp/internal/http/Transport.class | Bin 671 -> 0 bytes .../http/UnknownLengthHttpInputStream.class | Bin 1631 -> 0 bytes .../okhttp/internal/spdy/ErrorCode.class | Bin 2693 -> 0 bytes .../internal/spdy/FrameReader$Handler.class | Bin 799 -> 0 bytes .../okhttp/internal/spdy/FrameReader.class | Bin 438 -> 0 bytes .../okhttp/internal/spdy/FrameWriter.class | Bin 955 -> 0 bytes .../okhttp/internal/spdy/HeadersMode.class | Bin 1608 -> 0 bytes .../internal/spdy/Hpack$HeaderEntry.class | Bin 929 -> 0 bytes .../okhttp/internal/spdy/Hpack$Reader.class | Bin 5906 -> 0 bytes .../okhttp/internal/spdy/Hpack$Writer.class | Bin 1681 -> 0 bytes .../squareup/okhttp/internal/spdy/Hpack.class | Bin 3116 -> 0 bytes .../internal/spdy/Http20Draft06$Reader.class | Bin 7293 -> 0 bytes .../internal/spdy/Http20Draft06$Writer.class | Bin 4656 -> 0 bytes .../okhttp/internal/spdy/Http20Draft06.class | Bin 2075 -> 0 bytes .../spdy/IncomingStreamHandler$1.class | Bin 974 -> 0 bytes .../internal/spdy/IncomingStreamHandler.class | Bin 586 -> 0 bytes .../spdy/NameValueBlockReader$1.class | Bin 1495 -> 0 bytes .../spdy/NameValueBlockReader$2.class | Bin 1094 -> 0 bytes ...ckReader$FillableInflaterInputStream.class | Bin 816 -> 0 bytes .../internal/spdy/NameValueBlockReader.class | Bin 3557 -> 0 bytes .../squareup/okhttp/internal/spdy/Ping.class | Bin 1433 -> 0 bytes .../okhttp/internal/spdy/Settings.class | Bin 3491 -> 0 bytes .../okhttp/internal/spdy/Spdy3$Reader.class | Bin 7039 -> 0 bytes .../okhttp/internal/spdy/Spdy3$Writer.class | Bin 6511 -> 0 bytes .../squareup/okhttp/internal/spdy/Spdy3.class | Bin 3656 -> 0 bytes .../internal/spdy/SpdyConnection$1.class | Bin 1233 -> 0 bytes .../internal/spdy/SpdyConnection$2.class | Bin 1111 -> 0 bytes .../internal/spdy/SpdyConnection$3.class | Bin 1396 -> 0 bytes .../spdy/SpdyConnection$Builder.class | Bin 3526 -> 0 bytes .../spdy/SpdyConnection$Reader$1.class | Bin 1703 -> 0 bytes .../internal/spdy/SpdyConnection$Reader.class | Bin 8667 -> 0 bytes .../okhttp/internal/spdy/SpdyConnection.class | Bin 14356 -> 0 bytes .../okhttp/internal/spdy/SpdyStream$1.class | Bin 249 -> 0 bytes .../spdy/SpdyStream$SpdyDataInputStream.class | Bin 5723 -> 0 bytes .../SpdyStream$SpdyDataOutputStream.class | Bin 4927 -> 0 bytes .../okhttp/internal/spdy/SpdyStream.class | Bin 10328 -> 0 bytes .../okhttp/internal/spdy/Variant.class | Bin 654 -> 0 bytes .../tls/DistinguishedNameParser.class | Bin 5095 -> 0 bytes .../internal/tls/OkHostnameVerifier.class | Bin 5083 -> 0 bytes .../classes/org/apache/cordova/App$1.class | Bin 843 -> 0 bytes .../classes/org/apache/cordova/App$2.class | Bin 691 -> 0 bytes .../classes/org/apache/cordova/App$3.class | Bin 680 -> 0 bytes .../classes/org/apache/cordova/App$4.class | Bin 691 -> 0 bytes .../classes/org/apache/cordova/App$5.class | Bin 1755 -> 0 bytes .../classes/org/apache/cordova/App.class | Bin 6374 -> 0 bytes .../apache/cordova/AuthenticationToken.class | Bin 776 -> 0 bytes .../org/apache/cordova/BuildConfig.class | Bin 345 -> 0 bytes .../org/apache/cordova/CallbackContext.class | Bin 3216 -> 0 bytes .../classes/org/apache/cordova/Config.class | Bin 2668 -> 0 bytes .../org/apache/cordova/ConfigXmlParser.class | Bin 5852 -> 0 bytes .../apache/cordova/CordovaActivity$1.class | Bin 1008 -> 0 bytes .../apache/cordova/CordovaActivity$2.class | Bin 1049 -> 0 bytes .../apache/cordova/CordovaActivity$3.class | Bin 1416 -> 0 bytes .../apache/cordova/CordovaActivity$4$1.class | Bin 1063 -> 0 bytes .../apache/cordova/CordovaActivity$4.class | Bin 1971 -> 0 bytes .../apache/cordova/CordovaActivity$5$1.class | Bin 782 -> 0 bytes .../apache/cordova/CordovaActivity$5.class | Bin 2770 -> 0 bytes .../org/apache/cordova/CordovaActivity.class | Bin 21487 -> 0 bytes .../org/apache/cordova/CordovaArgs.class | Bin 2561 -> 0 bytes .../org/apache/cordova/CordovaBridge.class | Bin 5124 -> 0 bytes .../cordova/CordovaChromeClient$1.class | Bin 1110 -> 0 bytes .../cordova/CordovaChromeClient$2.class | Bin 1089 -> 0 bytes .../cordova/CordovaChromeClient$3.class | Bin 1189 -> 0 bytes .../cordova/CordovaChromeClient$4.class | Bin 1112 -> 0 bytes .../cordova/CordovaChromeClient$5.class | Bin 1111 -> 0 bytes .../cordova/CordovaChromeClient$6.class | Bin 1091 -> 0 bytes .../cordova/CordovaChromeClient$7.class | Bin 1190 -> 0 bytes .../cordova/CordovaChromeClient$8.class | Bin 1441 -> 0 bytes .../cordova/CordovaChromeClient$9.class | Bin 1149 -> 0 bytes .../apache/cordova/CordovaChromeClient.class | Bin 10293 -> 0 bytes .../org/apache/cordova/CordovaInterface.class | Bin 501 -> 0 bytes .../org/apache/cordova/CordovaPlugin.class | Bin 3427 -> 0 bytes .../apache/cordova/CordovaPreferences.class | Bin 5602 -> 0 bytes ...CordovaResourceApi$OpenForReadResult.class | Bin 905 -> 0 bytes .../apache/cordova/CordovaResourceApi.class | Bin 11534 -> 0 bytes .../org/apache/cordova/CordovaUriHelper.class | Bin 2841 -> 0 bytes .../org/apache/cordova/CordovaWebView$1.class | Bin 941 -> 0 bytes .../org/apache/cordova/CordovaWebView$2.class | Bin 1282 -> 0 bytes .../org/apache/cordova/CordovaWebView$3.class | Bin 1469 -> 0 bytes .../org/apache/cordova/CordovaWebView$4.class | Bin 1268 -> 0 bytes .../CordovaWebView$ActivityResult.class | Bin 757 -> 0 bytes .../cordova/CordovaWebView$Level16Apis.class | Bin 759 -> 0 bytes .../org/apache/cordova/CordovaWebView.class | Bin 24487 -> 0 bytes .../cordova/CordovaWebViewClient$1$1.class | Bin 984 -> 0 bytes .../cordova/CordovaWebViewClient$1.class | Bin 1260 -> 0 bytes .../apache/cordova/CordovaWebViewClient.class | Bin 7367 -> 0 bytes .../org/apache/cordova/DirectoryManager.class | Bin 2643 -> 0 bytes .../classes/org/apache/cordova/DroidGap.class | Bin 389 -> 0 bytes .../org/apache/cordova/ExifHelper.class | Bin 3465 -> 0 bytes .../org/apache/cordova/ExposedJsApi.class | Bin 1362 -> 0 bytes .../org/apache/cordova/FileHelper.class | Bin 4098 -> 0 bytes .../IceCreamCordovaWebViewClient.class | Bin 3878 -> 0 bytes .../org/apache/cordova/JSONUtils.class | Bin 1079 -> 0 bytes .../classes/org/apache/cordova/LOG.class | Bin 3248 -> 0 bytes .../LinearLayoutSoftKeyboardDetect.class | Bin 2210 -> 0 bytes .../cordova/NativeToJsMessageQueue$1.class | Bin 255 -> 0 bytes .../NativeToJsMessageQueue$BridgeMode.class | Bin 1089 -> 0 bytes .../NativeToJsMessageQueue$JsMessage.class | Bin 3122 -> 0 bytes ...ToJsMessageQueue$LoadUrlBridgeMode$1.class | Bin 1426 -> 0 bytes ...veToJsMessageQueue$LoadUrlBridgeMode.class | Bin 1562 -> 0 bytes ...essageQueue$OnlineEventsBridgeMode$1.class | Bin 1496 -> 0 bytes ...essageQueue$OnlineEventsBridgeMode$2.class | Bin 1266 -> 0 bytes ...sMessageQueue$OnlineEventsBridgeMode.class | Bin 2433 -> 0 bytes ...veToJsMessageQueue$PollingBridgeMode.class | Bin 1041 -> 0 bytes ...oJsMessageQueue$PrivateApiBridgeMode.class | Bin 3053 -> 0 bytes .../cordova/NativeToJsMessageQueue.class | Bin 7772 -> 0 bytes .../org/apache/cordova/PluginEntry.class | Bin 1899 -> 0 bytes .../org/apache/cordova/PluginManager.class | Bin 9922 -> 0 bytes .../apache/cordova/PluginResult$Status.class | Bin 1657 -> 0 bytes .../org/apache/cordova/PluginResult.class | Bin 4933 -> 0 bytes .../org/apache/cordova/ScrollEvent.class | Bin 835 -> 0 bytes .../apache/cordova/Whitelist$URLPattern.class | Bin 2995 -> 0 bytes .../org/apache/cordova/Whitelist.class | Bin 2831 -> 0 bytes .../android/CordovaLib/ant-build/proguard.txt | 0 platforms/android/CordovaLib/build.gradle | 54 - .../android/CordovaLib/project.properties | 16 - .../src/com/squareup/okhttp/Address.java | 140 - .../src/com/squareup/okhttp/Connection.java | 335 -- .../com/squareup/okhttp/ConnectionPool.java | 274 -- .../src/com/squareup/okhttp/Dispatcher.java | 86 - .../src/com/squareup/okhttp/Failure.java | 59 - .../squareup/okhttp/HttpResponseCache.java | 722 ---- .../src/com/squareup/okhttp/Job.java | 232 -- .../src/com/squareup/okhttp/MediaType.java | 120 - .../com/squareup/okhttp/OkAuthenticator.java | 123 - .../src/com/squareup/okhttp/OkHttpClient.java | 408 --- .../com/squareup/okhttp/OkResponseCache.java | 56 - .../src/com/squareup/okhttp/Request.java | 284 -- .../src/com/squareup/okhttp/Response.java | 290 -- .../com/squareup/okhttp/ResponseSource.java | 37 - .../src/com/squareup/okhttp/Route.java | 91 - .../com/squareup/okhttp/RouteDatabase.java | 57 - .../com/squareup/okhttp/TunnelRequest.java | 75 - .../okhttp/internal/AbstractOutputStream.java | 45 - .../com/squareup/okhttp/internal/Base64.java | 164 - .../okhttp/internal/DiskLruCache.java | 926 ----- .../src/com/squareup/okhttp/internal/Dns.java | 33 - .../internal/FaultRecoveringOutputStream.java | 163 - .../okhttp/internal/NamedRunnable.java | 40 - .../squareup/okhttp/internal/Platform.java | 370 -- .../okhttp/internal/StrictLineReader.java | 207 -- .../com/squareup/okhttp/internal/Util.java | 394 -- .../http/AbstractHttpInputStream.java | 107 - .../okhttp/internal/http/HeaderParser.java | 112 - .../internal/http/HttpAuthenticator.java | 166 - .../okhttp/internal/http/HttpDate.java | 88 - .../okhttp/internal/http/HttpEngine.java | 686 ---- .../okhttp/internal/http/HttpTransport.java | 497 --- .../internal/http/HttpURLConnectionImpl.java | 590 --- .../okhttp/internal/http/HttpsEngine.java | 72 - .../internal/http/HttpsURLConnectionImpl.java | 366 -- .../internal/http/OkResponseCacheAdapter.java | 57 - .../squareup/okhttp/internal/http/Policy.java | 49 - .../okhttp/internal/http/RawHeaders.java | 447 --- .../okhttp/internal/http/RequestHeaders.java | 317 -- .../okhttp/internal/http/ResponseHeaders.java | 512 --- .../internal/http/RetryableOutputStream.java | 75 - .../okhttp/internal/http/RouteSelector.java | 269 -- .../okhttp/internal/http/SpdyTransport.java | 103 - .../okhttp/internal/http/Transport.java | 64 - .../http/UnknownLengthHttpInputStream.java | 63 - .../okhttp/internal/spdy/ErrorCode.java | 83 - .../okhttp/internal/spdy/FrameReader.java | 55 - .../okhttp/internal/spdy/FrameWriter.java | 43 - .../okhttp/internal/spdy/HeadersMode.java | 49 - .../squareup/okhttp/internal/spdy/Hpack.java | 387 -- .../okhttp/internal/spdy/Http20Draft06.java | 385 -- .../internal/spdy/IncomingStreamHandler.java | 36 - .../internal/spdy/NameValueBlockReader.java | 139 - .../squareup/okhttp/internal/spdy/Ping.java | 71 - .../okhttp/internal/spdy/Settings.java | 187 - .../squareup/okhttp/internal/spdy/Spdy3.java | 463 --- .../okhttp/internal/spdy/SpdyConnection.java | 599 ---- .../okhttp/internal/spdy/SpdyStream.java | 684 ---- .../okhttp/internal/spdy/Variant.java | 37 - .../internal/tls/DistinguishedNameParser.java | 407 --- .../internal/tls/OkHostnameVerifier.java | 194 - .../src/org/apache/cordova/App.java | 301 -- .../apache/cordova/AuthenticationToken.java | 69 - .../org/apache/cordova/CallbackContext.java | 144 - .../src/org/apache/cordova/Config.java | 122 - .../org/apache/cordova/ConfigXmlParser.java | 181 - .../org/apache/cordova/CordovaActivity.java | 1063 ------ .../src/org/apache/cordova/CordovaArgs.java | 113 - .../src/org/apache/cordova/CordovaBridge.java | 183 - .../apache/cordova/CordovaChromeClient.java | 331 -- .../org/apache/cordova/CordovaInterface.java | 72 - .../src/org/apache/cordova/CordovaPlugin.java | 201 -- .../apache/cordova/CordovaPreferences.java | 175 - .../apache/cordova/CordovaResourceApi.java | 447 --- .../org/apache/cordova/CordovaUriHelper.java | 86 - .../org/apache/cordova/CordovaWebView.java | 934 ----- .../apache/cordova/CordovaWebViewClient.java | 365 -- .../org/apache/cordova/DirectoryManager.java | 162 - .../src/org/apache/cordova/DroidGap.java | 34 - .../src/org/apache/cordova/ExifHelper.java | 186 - .../src/org/apache/cordova/ExposedJsApi.java | 52 - .../src/org/apache/cordova/FileHelper.java | 163 - .../cordova/IceCreamCordovaWebViewClient.java | 107 - .../src/org/apache/cordova/JSONUtils.java | 43 - .../src/org/apache/cordova/LOG.java | 234 -- .../LinearLayoutSoftKeyboardDetect.java | 105 - .../cordova/NativeToJsMessageQueue.java | 531 --- .../src/org/apache/cordova/PluginEntry.java | 89 - .../src/org/apache/cordova/PluginManager.java | 356 -- .../src/org/apache/cordova/PluginResult.java | 179 - .../src/org/apache/cordova/ScrollEvent.java | 67 - .../src/org/apache/cordova/Whitelist.java | 170 - .../ant-build/AndroidManifest.cordova.xml | 15 - .../android/ant-build/AndroidManifest.xml.d | 2 - .../ant-build/CordovaApp-debug-unaligned.apk | Bin 4035171 -> 0 bytes .../CordovaApp-debug-unaligned.apk.d | 4 - .../android/ant-build/CordovaApp-debug.apk | Bin 4035285 -> 0 bytes .../ant-build/CordovaApp-release-unsigned.apk | Bin 4027520 -> 0 bytes .../CordovaApp-release-unsigned.apk.d | 4 - platforms/android/ant-build/CordovaApp.ap_ | Bin 3834051 -> 0 bytes platforms/android/ant-build/CordovaApp.ap_.d | 190 - platforms/android/ant-build/R.txt | 9 - platforms/android/ant-build/build.prop | 10 - platforms/android/ant-build/classes.dex | Bin 531260 -> 0 bytes platforms/android/ant-build/classes.dex.d | 81 - .../com/cadoles/momo/BuildConfig.class | Bin 341 -> 0 bytes .../classes/com/cadoles/momo/CordovaApp.class | Bin 596 -> 0 bytes .../classes/com/cadoles/momo/R$attr.class | Bin 334 -> 0 bytes .../classes/com/cadoles/momo/R$drawable.class | Bin 554 -> 0 bytes .../classes/com/cadoles/momo/R$string.class | Bin 466 -> 0 bytes .../classes/com/cadoles/momo/R$xml.class | Bin 381 -> 0 bytes .../classes/com/cadoles/momo/R.class | Bin 475 -> 0 bytes .../classes/org/apache/cordova/Zip$1.class | Bin 894 -> 0 bytes .../apache/cordova/Zip$ProgressEvent.class | Bin 1521 -> 0 bytes .../classes/org/apache/cordova/Zip.class | Bin 7173 -> 0 bytes .../cordova/file/ContentFilesystem.class | Bin 12167 -> 0 bytes .../cordova/file/DirectoryManager.class | Bin 2124 -> 0 bytes .../cordova/file/EncodingException.class | Bin 391 -> 0 bytes .../cordova/file/FileExistsException.class | Bin 393 -> 0 bytes .../org/apache/cordova/file/FileHelper.class | Bin 4024 -> 0 bytes .../org/apache/cordova/file/FileUtils$1.class | Bin 1315 -> 0 bytes .../apache/cordova/file/FileUtils$10.class | Bin 1597 -> 0 bytes .../apache/cordova/file/FileUtils$11.class | Bin 1126 -> 0 bytes .../apache/cordova/file/FileUtils$12.class | Bin 1136 -> 0 bytes .../apache/cordova/file/FileUtils$13.class | Bin 1723 -> 0 bytes .../apache/cordova/file/FileUtils$14.class | Bin 1270 -> 0 bytes .../apache/cordova/file/FileUtils$15.class | Bin 1318 -> 0 bytes .../apache/cordova/file/FileUtils$16.class | Bin 1270 -> 0 bytes .../apache/cordova/file/FileUtils$17.class | Bin 1686 -> 0 bytes .../apache/cordova/file/FileUtils$18.class | Bin 1686 -> 0 bytes .../apache/cordova/file/FileUtils$19.class | Bin 1393 -> 0 bytes .../org/apache/cordova/file/FileUtils$2.class | Bin 1312 -> 0 bytes .../apache/cordova/file/FileUtils$20.class | Bin 1384 -> 0 bytes .../apache/cordova/file/FileUtils$21.class | Bin 1655 -> 0 bytes .../apache/cordova/file/FileUtils$22.class | Bin 1655 -> 0 bytes .../apache/cordova/file/FileUtils$23.class | Bin 1320 -> 0 bytes .../apache/cordova/file/FileUtils$24.class | Bin 1271 -> 0 bytes .../apache/cordova/file/FileUtils$25.class | Bin 2060 -> 0 bytes .../apache/cordova/file/FileUtils$26.class | Bin 2993 -> 0 bytes .../org/apache/cordova/file/FileUtils$3.class | Bin 1403 -> 0 bytes .../org/apache/cordova/file/FileUtils$4.class | Bin 1403 -> 0 bytes .../org/apache/cordova/file/FileUtils$5.class | Bin 1261 -> 0 bytes .../org/apache/cordova/file/FileUtils$6.class | Bin 1201 -> 0 bytes .../org/apache/cordova/file/FileUtils$7.class | Bin 1202 -> 0 bytes .../org/apache/cordova/file/FileUtils$8.class | Bin 1202 -> 0 bytes .../org/apache/cordova/file/FileUtils$9.class | Bin 1771 -> 0 bytes .../cordova/file/FileUtils$FileOp.class | Bin 277 -> 0 bytes .../org/apache/cordova/file/FileUtils.class | Bin 25628 -> 0 bytes .../apache/cordova/file/Filesystem$1.class | Bin 1724 -> 0 bytes .../file/Filesystem$LimitedInputStream.class | Bin 1202 -> 0 bytes .../file/Filesystem$ReadFileCallback.class | Bin 346 -> 0 bytes .../org/apache/cordova/file/Filesystem.class | Bin 5777 -> 0 bytes .../file/InvalidModificationException.class | Bin 424 -> 0 bytes .../apache/cordova/file/LocalFilesystem.class | Bin 15746 -> 0 bytes .../cordova/file/LocalFilesystemURL.class | Bin 2223 -> 0 bytes .../file/NoModificationAllowedException.class | Bin 430 -> 0 bytes .../cordova/file/TypeMismatchException.class | Bin 403 -> 0 bytes .../filetransfer/FileProgressResult.class | Bin 1557 -> 0 bytes .../cordova/filetransfer/FileTransfer$1.class | Bin 11798 -> 0 bytes .../cordova/filetransfer/FileTransfer$2.class | Bin 687 -> 0 bytes .../cordova/filetransfer/FileTransfer$3.class | Bin 1058 -> 0 bytes .../cordova/filetransfer/FileTransfer$4.class | Bin 9999 -> 0 bytes .../cordova/filetransfer/FileTransfer$5.class | Bin 1995 -> 0 bytes .../FileTransfer$ExposedGZIPInputStream.class | Bin 750 -> 0 bytes .../FileTransfer$RequestContext.class | Bin 1151 -> 0 bytes ...leTransfer$SimpleTrackingInputStream.class | Bin 1206 -> 0 bytes ...FileTransfer$TrackingGZIPInputStream.class | Bin 1131 -> 0 bytes .../FileTransfer$TrackingInputStream.class | Bin 579 -> 0 bytes .../cordova/filetransfer/FileTransfer.class | Bin 16429 -> 0 bytes .../filetransfer/FileUploadResult.class | Bin 1873 -> 0 bytes .../cordova/inappbrowser/InAppBrowser$1.class | Bin 4738 -> 0 bytes .../cordova/inappbrowser/InAppBrowser$2.class | Bin 983 -> 0 bytes .../cordova/inappbrowser/InAppBrowser$3.class | Bin 1505 -> 0 bytes .../inappbrowser/InAppBrowser$4$1.class | Bin 1172 -> 0 bytes .../cordova/inappbrowser/InAppBrowser$4.class | Bin 1084 -> 0 bytes .../inappbrowser/InAppBrowser$5$1.class | Bin 1028 -> 0 bytes .../inappbrowser/InAppBrowser$5$2.class | Bin 1028 -> 0 bytes .../inappbrowser/InAppBrowser$5$3.class | Bin 1447 -> 0 bytes .../inappbrowser/InAppBrowser$5$4.class | Bin 977 -> 0 bytes .../cordova/inappbrowser/InAppBrowser$5.class | Bin 9861 -> 0 bytes .../InAppBrowser$InAppBrowserClient.class | Bin 5268 -> 0 bytes .../cordova/inappbrowser/InAppBrowser.class | Bin 13619 -> 0 bytes .../inappbrowser/InAppBrowserDialog.class | Bin 927 -> 0 bytes .../inappbrowser/InAppChromeClient.class | Bin 3747 -> 0 bytes ...asses-703f86d81f0ed180098d872ee1ccf45c.jar | Bin 150305 -> 0 bytes ...asses-cae0b40c92ff3af60f02e39bf3ee1661.jar | Bin 150305 -> 0 bytes ...asses-efbe2a183ccbe20c352ecba06f7a793d.jar | Bin 150305 -> 0 bytes platforms/android/ant-build/proguard.txt | 3 - .../res/drawable-hdpi/ic_action_next_item.png | Bin 275 -> 0 bytes .../drawable-hdpi/ic_action_previous_item.png | Bin 276 -> 0 bytes .../res/drawable-hdpi/ic_action_remove.png | Bin 231 -> 0 bytes .../ant-build/res/drawable-hdpi/icon.png | Bin 7604 -> 0 bytes .../res/drawable-land-hdpi/screen.png | Bin 216014 -> 0 bytes .../res/drawable-land-ldpi/screen.png | Bin 41538 -> 0 bytes .../res/drawable-land-mdpi/screen.png | Bin 90490 -> 0 bytes .../res/drawable-land-xhdpi/screen.png | Bin 488469 -> 0 bytes .../res/drawable-mdpi/ic_action_next_item.png | Bin 225 -> 0 bytes .../drawable-mdpi/ic_action_previous_item.png | Bin 226 -> 0 bytes .../res/drawable-mdpi/ic_action_remove.png | Bin 186 -> 0 bytes .../res/drawable-port-hdpi/screen.png | Bin 220338 -> 0 bytes .../res/drawable-port-ldpi/screen.png | Bin 41064 -> 0 bytes .../res/drawable-port-mdpi/screen.png | Bin 92429 -> 0 bytes .../res/drawable-port-xhdpi/screen.png | Bin 501006 -> 0 bytes .../drawable-xhdpi/ic_action_next_item.png | Bin 308 -> 0 bytes .../ic_action_previous_item.png | Bin 311 -> 0 bytes .../res/drawable-xhdpi/ic_action_remove.png | Bin 260 -> 0 bytes .../drawable-xxhdpi/ic_action_next_item.png | Bin 383 -> 0 bytes .../ic_action_previous_item.png | Bin 389 -> 0 bytes .../res/drawable-xxhdpi/ic_action_remove.png | Bin 338 -> 0 bytes .../android/ant-build/res/drawable/icon.png | Bin 6814 -> 0 bytes platforms/android/assets/_where-is-www.txt | 3 - platforms/android/assets/www/assets/dijon.jpg | Bin 82487 -> 0 bytes platforms/android/assets/www/assets/index.css | 6 - platforms/android/assets/www/assets/index.js | 1 - platforms/android/assets/www/cordova.js | 1938 ---------- .../android/assets/www/cordova_plugins.js | 187 - .../android/assets/www/css/animations.css | 1297 ------- .../android/assets/www/css/bootstrap.min.css | 7 - .../assets/www/css/font-awesome.min.css | 4 - platforms/android/assets/www/css/index.css | 203 -- .../android/assets/www/fonts/FontAwesome.otf | Bin 93888 -> 0 bytes .../assets/www/fonts/fontawesome-webfont.eot | Bin 60767 -> 0 bytes .../assets/www/fonts/fontawesome-webfont.svg | 565 --- .../assets/www/fonts/fontawesome-webfont.ttf | Bin 122092 -> 0 bytes .../assets/www/fonts/fontawesome-webfont.woff | Bin 71508 -> 0 bytes .../www/fonts/fontawesome-webfont.woff2 | Bin 56780 -> 0 bytes .../fonts/glyphicons-halflings-regular.eot | Bin 20127 -> 0 bytes .../fonts/glyphicons-halflings-regular.svg | 288 -- .../fonts/glyphicons-halflings-regular.ttf | Bin 45404 -> 0 bytes .../fonts/glyphicons-halflings-regular.woff | Bin 23424 -> 0 bytes .../fonts/glyphicons-halflings-regular.woff2 | Bin 18028 -> 0 bytes platforms/android/assets/www/icon.png | Bin 11401 -> 0 bytes platforms/android/assets/www/img/greyzz.png | Bin 6084 -> 0 bytes platforms/android/assets/www/index.html | 159 - platforms/android/assets/www/index.json | 72 - platforms/android/assets/www/js/fastclick.js | 841 ----- platforms/android/assets/www/js/index.js | 584 --- platforms/android/assets/www/js/tmpl.min.js | 1 - .../www/FileTransfer.js | 214 -- .../www/FileTransferError.js | 43 - .../www/DirectoryEntry.js | 119 - .../www/DirectoryReader.js | 75 - .../org.apache.cordova.file/www/Entry.js | 262 -- .../org.apache.cordova.file/www/File.js | 81 - .../org.apache.cordova.file/www/FileEntry.js | 83 - .../org.apache.cordova.file/www/FileError.js | 48 - .../org.apache.cordova.file/www/FileReader.js | 389 -- .../org.apache.cordova.file/www/FileSystem.js | 50 - .../www/FileUploadOptions.js | 43 - .../www/FileUploadResult.js | 31 - .../org.apache.cordova.file/www/FileWriter.js | 304 -- .../org.apache.cordova.file/www/Flags.js | 38 - .../www/LocalFileSystem.js | 25 - .../org.apache.cordova.file/www/Metadata.js | 42 - .../www/ProgressEvent.js | 69 - .../www/android/FileSystem.js | 35 - .../www/fileSystemPaths.js | 65 - .../www/fileSystems-roots.js | 46 - .../www/fileSystems.js | 27 - .../www/requestFileSystem.js | 67 - .../www/resolveLocalFileSystemURI.js | 77 - .../www/inappbrowser.js | 106 - .../www/plugins/org.chromium.zip/zip.js | 28 - platforms/android/assets/www/res/.pgbomit | 0 .../www/res/icon/android/icon-36-ldpi.png | Bin 3383 -> 0 bytes .../www/res/icon/android/icon-48-mdpi.png | Bin 4681 -> 0 bytes .../www/res/icon/android/icon-72-hdpi.png | Bin 7839 -> 0 bytes .../www/res/icon/android/icon-96-xhdpi.png | Bin 11483 -> 0 bytes .../www/res/icon/bada-wac/icon-48-type5.png | Bin 4766 -> 0 bytes .../www/res/icon/bada-wac/icon-50-type3.png | Bin 4998 -> 0 bytes .../www/res/icon/bada-wac/icon-80-type4.png | Bin 9217 -> 0 bytes .../assets/www/res/icon/bada/icon-128.png | Bin 16334 -> 0 bytes .../www/res/icon/blackberry/icon-80.png | Bin 9217 -> 0 bytes .../assets/www/res/icon/ios/icon-57-2x.png | Bin 14643 -> 0 bytes .../assets/www/res/icon/ios/icon-57.png | Bin 6177 -> 0 bytes .../assets/www/res/icon/ios/icon-72-2x.png | Bin 19336 -> 0 bytes .../assets/www/res/icon/ios/icon-72.png | Bin 7839 -> 0 bytes .../assets/www/res/icon/tizen/icon-128.png | Bin 11401 -> 0 bytes .../assets/www/res/icon/webos/icon-64.png | Bin 6690 -> 0 bytes .../res/icon/windows-phone/icon-173-tile.png | Bin 21147 -> 0 bytes .../www/res/icon/windows-phone/icon-48.png | Bin 4653 -> 0 bytes .../res/icon/windows-phone/icon-62-tile.png | Bin 6207 -> 0 bytes .../screen/android/screen-hdpi-landscape.png | Bin 45248 -> 0 bytes .../screen/android/screen-hdpi-portrait.png | Bin 46644 -> 0 bytes .../screen/android/screen-ldpi-landscape.png | Bin 15112 -> 0 bytes .../screen/android/screen-ldpi-portrait.png | Bin 14941 -> 0 bytes .../screen/android/screen-mdpi-landscape.png | Bin 28912 -> 0 bytes .../screen/android/screen-mdpi-portrait.png | Bin 29381 -> 0 bytes .../screen/android/screen-xhdpi-landscape.png | Bin 77189 -> 0 bytes .../screen/android/screen-xhdpi-portrait.png | Bin 78744 -> 0 bytes .../www/res/screen/bada-wac/screen-type3.png | Bin 29372 -> 0 bytes .../www/res/screen/bada-wac/screen-type4.png | Bin 46647 -> 0 bytes .../www/res/screen/bada-wac/screen-type5.png | Bin 18937 -> 0 bytes .../www/res/screen/bada/screen-portrait.png | Bin 46647 -> 0 bytes .../www/res/screen/blackberry/screen-225.png | Bin 29556 -> 0 bytes .../screen/ios/screen-ipad-landscape-2x.png | Bin 87242 -> 0 bytes .../res/screen/ios/screen-ipad-landscape.png | Bin 86796 -> 0 bytes .../screen/ios/screen-ipad-portrait-2x.png | Bin 85806 -> 0 bytes .../res/screen/ios/screen-ipad-portrait.png | Bin 68785 -> 0 bytes .../screen/ios/screen-iphone-landscape-2x.png | Bin 72319 -> 0 bytes .../screen/ios/screen-iphone-landscape.png | Bin 30210 -> 0 bytes .../screen/ios/screen-iphone-portrait-2x.png | Bin 70677 -> 0 bytes .../ios/screen-iphone-portrait-568h-2x.png | Bin 85308 -> 0 bytes .../res/screen/ios/screen-iphone-portrait.png | Bin 29372 -> 0 bytes .../assets/www/res/screen/tizen/README.md | 3 - .../assets/www/res/screen/webos/screen-64.png | Bin 6263 -> 0 bytes .../screen/windows-phone/screen-portrait.jpg | Bin 20813 -> 0 bytes platforms/android/assets/www/spec.html | 68 - platforms/android/assets/www/spec/helper.js | 33 - platforms/android/assets/www/spec/index.js | 67 - .../www/spec/lib/jasmine-1.2.0/MIT.LICENSE | 20 - .../spec/lib/jasmine-1.2.0/jasmine-html.js | 616 ---- .../www/spec/lib/jasmine-1.2.0/jasmine.css | 81 - .../www/spec/lib/jasmine-1.2.0/jasmine.js | 2529 ------------- platforms/android/build.gradle | 94 - platforms/android/cordova/android_sdk_version | 29 - platforms/android/cordova/build | 41 - platforms/android/cordova/build.bat | 26 - platforms/android/cordova/check_reqs | 31 - platforms/android/cordova/clean | 44 - platforms/android/cordova/clean.bat | 26 - platforms/android/cordova/defaults.xml | 26 - .../cordova/lib/android_sdk_version.js | 65 - platforms/android/cordova/lib/appinfo.js | 41 - platforms/android/cordova/lib/build.js | 385 -- platforms/android/cordova/lib/check_reqs.js | 184 - platforms/android/cordova/lib/device.js | 90 - platforms/android/cordova/lib/emulator.js | 328 -- platforms/android/cordova/lib/exec.js | 41 - platforms/android/cordova/lib/install-device | 42 - .../android/cordova/lib/install-device.bat | 26 - .../android/cordova/lib/install-emulator | 38 - .../android/cordova/lib/install-emulator.bat | 26 - platforms/android/cordova/lib/list-devices | 33 - .../android/cordova/lib/list-devices.bat | 26 - .../android/cordova/lib/list-emulator-images | 32 - .../cordova/lib/list-emulator-images.bat | 26 - .../cordova/lib/list-started-emulators | 32 - .../cordova/lib/list-started-emulators.bat | 26 - platforms/android/cordova/lib/log.js | 57 - platforms/android/cordova/lib/run.js | 139 - platforms/android/cordova/lib/spawn.js | 49 - platforms/android/cordova/lib/start-emulator | 39 - .../android/cordova/lib/start-emulator.bat | 26 - platforms/android/cordova/log | 36 - platforms/android/cordova/log.bat | 26 - .../cordova/node_modules/q/CONTRIBUTING.md | 40 - .../android/cordova/node_modules/q/LICENSE | 19 - .../android/cordova/node_modules/q/README.md | 813 ----- .../q/benchmark/compare-with-callbacks.js | 71 - .../node_modules/q/benchmark/scenarios.js | 36 - .../cordova/node_modules/q/package.json | 93 - platforms/android/cordova/node_modules/q/q.js | 1937 ---------- .../android/cordova/node_modules/q/queue.js | 35 - .../node_modules/shelljs/.documentup.json | 6 - .../cordova/node_modules/shelljs/.jshintrc | 7 - .../cordova/node_modules/shelljs/.npmignore | 2 - .../cordova/node_modules/shelljs/.travis.yml | 5 - .../cordova/node_modules/shelljs/LICENSE | 26 - .../cordova/node_modules/shelljs/README.md | 552 --- .../cordova/node_modules/shelljs/bin/shjs | 51 - .../cordova/node_modules/shelljs/global.js | 3 - .../cordova/node_modules/shelljs/make.js | 47 - .../cordova/node_modules/shelljs/package.json | 48 - .../shelljs/scripts/generate-docs.js | 21 - .../node_modules/shelljs/scripts/run-tests.js | 50 - .../cordova/node_modules/shelljs/shell.js | 153 - .../cordova/node_modules/shelljs/src/cat.js | 43 - .../cordova/node_modules/shelljs/src/cd.js | 19 - .../cordova/node_modules/shelljs/src/chmod.js | 208 -- .../node_modules/shelljs/src/common.js | 189 - .../cordova/node_modules/shelljs/src/cp.js | 200 -- .../cordova/node_modules/shelljs/src/dirs.js | 191 - .../cordova/node_modules/shelljs/src/echo.js | 20 - .../cordova/node_modules/shelljs/src/error.js | 10 - .../cordova/node_modules/shelljs/src/exec.js | 181 - .../cordova/node_modules/shelljs/src/find.js | 51 - .../cordova/node_modules/shelljs/src/grep.js | 52 - .../cordova/node_modules/shelljs/src/ls.js | 126 - .../cordova/node_modules/shelljs/src/mkdir.js | 68 - .../cordova/node_modules/shelljs/src/mv.js | 80 - .../cordova/node_modules/shelljs/src/popd.js | 1 - .../cordova/node_modules/shelljs/src/pushd.js | 1 - .../cordova/node_modules/shelljs/src/pwd.js | 11 - .../cordova/node_modules/shelljs/src/rm.js | 145 - .../cordova/node_modules/shelljs/src/sed.js | 43 - .../node_modules/shelljs/src/tempdir.js | 56 - .../cordova/node_modules/shelljs/src/test.js | 85 - .../cordova/node_modules/shelljs/src/to.js | 29 - .../cordova/node_modules/shelljs/src/toEnd.js | 29 - .../cordova/node_modules/shelljs/src/which.js | 79 - .../cordova/node_modules/which/LICENSE | 23 - .../cordova/node_modules/which/README.md | 5 - .../cordova/node_modules/which/bin/which | 14 - .../cordova/node_modules/which/package.json | 31 - .../cordova/node_modules/which/which.js | 104 - platforms/android/cordova/run | 37 - platforms/android/cordova/run.bat | 26 - platforms/android/cordova/version | 25 - platforms/android/cordova/version.bat | 26 - platforms/android/custom_rules.xml | 22 - platforms/android/platform_www/cordova.js | 1938 ---------- platforms/android/project.properties | 14 - .../res/drawable-hdpi/ic_action_next_item.png | Bin 593 -> 0 bytes .../drawable-hdpi/ic_action_previous_item.png | Bin 599 -> 0 bytes .../res/drawable-hdpi/ic_action_remove.png | Bin 438 -> 0 bytes platforms/android/res/drawable-hdpi/icon.png | Bin 7839 -> 0 bytes .../android/res/drawable-land-hdpi/screen.png | Bin 218302 -> 0 bytes .../android/res/drawable-land-ldpi/screen.png | Bin 42616 -> 0 bytes .../android/res/drawable-land-mdpi/screen.png | Bin 92347 -> 0 bytes .../res/drawable-land-xhdpi/screen.png | Bin 489604 -> 0 bytes .../res/drawable-mdpi/ic_action_next_item.png | Bin 427 -> 0 bytes .../drawable-mdpi/ic_action_previous_item.png | Bin 438 -> 0 bytes .../res/drawable-mdpi/ic_action_remove.png | Bin 328 -> 0 bytes .../android/res/drawable-port-hdpi/screen.png | Bin 222148 -> 0 bytes .../android/res/drawable-port-ldpi/screen.png | Bin 42034 -> 0 bytes .../android/res/drawable-port-mdpi/screen.png | Bin 90555 -> 0 bytes .../res/drawable-port-xhdpi/screen.png | Bin 504508 -> 0 bytes .../drawable-xhdpi/ic_action_next_item.png | Bin 727 -> 0 bytes .../ic_action_previous_item.png | Bin 744 -> 0 bytes .../res/drawable-xhdpi/ic_action_remove.png | Bin 536 -> 0 bytes .../drawable-xxhdpi/ic_action_next_item.png | Bin 1021 -> 0 bytes .../ic_action_previous_item.png | Bin 1038 -> 0 bytes .../res/drawable-xxhdpi/ic_action_remove.png | Bin 681 -> 0 bytes platforms/android/res/drawable/icon.png | Bin 7685 -> 0 bytes platforms/android/res/values/strings.xml | 6 - platforms/android/res/xml/config.xml | 70 - platforms/android/settings.gradle | 18 - .../src/com/cadoles/momo/CordovaApp.java | 35 - .../android/src/org/apache/cordova/Zip.java | 206 -- .../cordova/file/ContentFilesystem.java | 327 -- .../apache/cordova/file/DirectoryManager.java | 133 - .../cordova/file/EncodingException.java | 29 - .../cordova/file/FileExistsException.java | 29 - .../org/apache/cordova/file/FileHelper.java | 158 - .../org/apache/cordova/file/FileUtils.java | 1058 ------ .../org/apache/cordova/file/Filesystem.java | 207 -- .../file/InvalidModificationException.java | 30 - .../apache/cordova/file/LocalFilesystem.java | 657 ---- .../cordova/file/LocalFilesystemURL.java | 74 - .../file/NoModificationAllowedException.java | 29 - .../cordova/file/TypeMismatchException.java | 30 - .../filetransfer/FileProgressResult.java | 63 - .../cordova/filetransfer/FileTransfer.java | 987 ----- .../filetransfer/FileUploadResult.java | 73 - .../cordova/inappbrowser/InAppBrowser.java | 839 ----- .../inappbrowser/InAppBrowserDialog.java | 54 - .../inappbrowser/InAppChromeClient.java | 133 - .../.fetch.json | 1 - .../CONTRIBUTING.md | 37 - .../org.apache.cordova.file-transfer/LICENSE | 202 -- .../org.apache.cordova.file-transfer/NOTICE | 8 - .../README.md | 22 - .../RELEASENOTES.md | 158 - .../doc/de/index.md | 290 -- .../doc/es/index.md | 290 -- .../doc/fr/index.md | 290 -- .../doc/index.md | 296 -- .../doc/it/index.md | 290 -- .../doc/ja/index.md | 290 -- .../doc/ko/index.md | 290 -- .../doc/pl/index.md | 290 -- .../doc/ru/index.md | 290 -- .../doc/zh/index.md | 290 -- .../plugin.xml | 164 - .../src/amazon/FileTransfer.java | 888 ----- .../src/android/FileProgressResult.java | 63 - .../src/android/FileTransfer.java | 987 ----- .../src/android/FileUploadResult.java | 73 - .../src/ios/CDVFileTransfer.h | 87 - .../src/ios/CDVFileTransfer.m | 790 ---- .../src/ubuntu/file-transfer.cpp | 265 -- .../src/ubuntu/file-transfer.h | 103 - .../src/windows/FileTransferProxy.js | 405 --- .../src/wp/FileTransfer.cs | 866 ----- .../tests/plugin.xml | 30 - .../tests/tests.js | 952 ----- .../www/FileTransfer.js | 212 -- .../www/FileTransferError.js | 41 - .../www/blackberry10/FileTransfer.js | 188 - .../www/blackberry10/FileTransferProxy.js | 36 - .../www/blackberry10/xhrFileTransfer.js | 259 -- .../www/firefoxos/FileTransferProxy.js | 223 -- .../www/wp7/base64.js | 71 - plugins/org.apache.cordova.file/.fetch.json | 1 - .../org.apache.cordova.file/CONTRIBUTING.md | 37 - plugins/org.apache.cordova.file/LICENSE | 202 -- plugins/org.apache.cordova.file/NOTICE | 5 - plugins/org.apache.cordova.file/README.md | 22 - .../org.apache.cordova.file/RELEASENOTES.md | 295 -- .../org.apache.cordova.file/doc/de/index.md | 275 -- .../org.apache.cordova.file/doc/de/plugins.md | 124 - .../org.apache.cordova.file/doc/es/index.md | 275 -- .../org.apache.cordova.file/doc/es/plugins.md | 124 - .../org.apache.cordova.file/doc/fr/index.md | 275 -- .../org.apache.cordova.file/doc/fr/plugins.md | 124 - plugins/org.apache.cordova.file/doc/index.md | 371 -- .../org.apache.cordova.file/doc/it/index.md | 275 -- .../org.apache.cordova.file/doc/it/plugins.md | 124 - .../org.apache.cordova.file/doc/ja/index.md | 275 -- .../org.apache.cordova.file/doc/ja/plugins.md | 124 - .../org.apache.cordova.file/doc/ko/index.md | 275 -- .../org.apache.cordova.file/doc/ko/plugins.md | 124 - .../org.apache.cordova.file/doc/pl/index.md | 275 -- .../org.apache.cordova.file/doc/pl/plugins.md | 124 - .../org.apache.cordova.file/doc/plugins.md | 120 - .../org.apache.cordova.file/doc/ru/index.md | 275 -- .../org.apache.cordova.file/doc/ru/plugins.md | 124 - .../org.apache.cordova.file/doc/zh/index.md | 282 -- .../org.apache.cordova.file/doc/zh/plugins.md | 124 - plugins/org.apache.cordova.file/package.json | 27 - plugins/org.apache.cordova.file/plugin.xml | 345 -- .../src/android/ContentFilesystem.java | 327 -- .../src/android/DirectoryManager.java | 133 - .../src/android/EncodingException.java | 29 - .../src/android/FileExistsException.java | 29 - .../src/android/FileHelper.java | 158 - .../src/android/FileUtils.java | 1058 ------ .../src/android/Filesystem.java | 207 -- .../android/InvalidModificationException.java | 30 - .../src/android/LocalFilesystem.java | 657 ---- .../src/android/LocalFilesystemURL.java | 74 - .../NoModificationAllowedException.java | 29 - .../src/android/TypeMismatchException.java | 30 - .../src/blackberry10/index.js | 44 - .../src/firefoxos/FileProxy.js | 785 ---- .../src/ios/CDVAssetLibraryFilesystem.h | 30 - .../src/ios/CDVAssetLibraryFilesystem.m | 247 -- .../org.apache.cordova.file/src/ios/CDVFile.h | 156 - .../org.apache.cordova.file/src/ios/CDVFile.m | 1080 ------ .../src/ios/CDVLocalFilesystem.h | 32 - .../src/ios/CDVLocalFilesystem.m | 719 ---- .../src/ubuntu/file.cpp | 912 ----- .../org.apache.cordova.file/src/ubuntu/file.h | 81 - .../src/windows/FileProxy.js | 991 ----- .../org.apache.cordova.file/src/wp/File.cs | 1724 --------- .../org.apache.cordova.file/tests/plugin.xml | 32 - .../org.apache.cordova.file/tests/tests.js | 3187 ----------------- .../www/DirectoryEntry.js | 117 - .../www/DirectoryReader.js | 73 - plugins/org.apache.cordova.file/www/Entry.js | 260 -- plugins/org.apache.cordova.file/www/File.js | 79 - .../org.apache.cordova.file/www/FileEntry.js | 81 - .../org.apache.cordova.file/www/FileError.js | 46 - .../org.apache.cordova.file/www/FileReader.js | 387 -- .../org.apache.cordova.file/www/FileSystem.js | 48 - .../www/FileUploadOptions.js | 41 - .../www/FileUploadResult.js | 30 - .../org.apache.cordova.file/www/FileWriter.js | 302 -- plugins/org.apache.cordova.file/www/Flags.js | 36 - .../www/LocalFileSystem.js | 23 - .../org.apache.cordova.file/www/Metadata.js | 40 - .../www/ProgressEvent.js | 67 - .../www/android/FileSystem.js | 33 - .../www/blackberry10/FileProxy.js | 51 - .../www/blackberry10/FileSystem.js | 46 - .../www/blackberry10/copyTo.js | 141 - .../www/blackberry10/createEntryFromNative.js | 77 - .../www/blackberry10/getDirectory.js | 72 - .../www/blackberry10/getFile.js | 57 - .../www/blackberry10/getFileMetadata.js | 65 - .../www/blackberry10/getMetadata.js | 54 - .../www/blackberry10/getParent.js | 57 - .../www/blackberry10/info.js | 52 - .../www/blackberry10/moveTo.js | 39 - .../www/blackberry10/readAsArrayBuffer.js | 68 - .../www/blackberry10/readAsBinaryString.js | 68 - .../www/blackberry10/readAsDataURL.js | 65 - .../www/blackberry10/readAsText.js | 77 - .../www/blackberry10/readEntries.js | 71 - .../www/blackberry10/remove.js | 61 - .../www/blackberry10/removeRecursively.js | 62 - .../www/blackberry10/requestAllFileSystems.js | 42 - .../www/blackberry10/requestAnimationFrame.js | 38 - .../www/blackberry10/requestFileSystem.js | 53 - .../blackberry10/resolveLocalFileSystemURI.js | 172 - .../www/blackberry10/setMetadata.js | 33 - .../www/blackberry10/truncate.js | 74 - .../www/blackberry10/write.js | 73 - .../www/fileSystemPaths.js | 63 - .../www/fileSystems-roots.js | 44 - .../www/fileSystems.js | 25 - .../www/firefoxos/FileSystem.js | 29 - .../www/ios/FileSystem.js | 30 - .../www/requestFileSystem.js | 65 - .../www/resolveLocalFileSystemURI.js | 75 - .../www/ubuntu/FileSystem.js | 34 - .../www/ubuntu/FileWriter.js | 135 - .../www/ubuntu/fileSystems-roots.js | 53 - .../www/wp/FileUploadOptions.js | 49 - plugins/org.chromium.zip/.fetch.json | 1 - plugins/org.chromium.zip/CONTRIBUTING.md | 13 - plugins/org.chromium.zip/LICENSE.md | 28 - plugins/org.chromium.zip/README.md | 35 - plugins/org.chromium.zip/plugin.xml | 50 - plugins/org.chromium.zip/src/android/Zip.java | 206 -- .../org.chromium.zip/src/ios/SSZipArchive.h | 52 - .../org.chromium.zip/src/ios/SSZipArchive.m | 540 --- plugins/org.chromium.zip/src/ios/Zip.h | 14 - plugins/org.chromium.zip/src/ios/Zip.m | 64 - .../org.chromium.zip/src/ios/minizip/crypt.h | 131 - .../org.chromium.zip/src/ios/minizip/ioapi.c | 239 -- .../org.chromium.zip/src/ios/minizip/ioapi.h | 201 -- .../src/ios/minizip/mztools.c | 284 -- .../src/ios/minizip/mztools.h | 31 - .../org.chromium.zip/src/ios/minizip/unzip.c | 2153 ----------- .../org.chromium.zip/src/ios/minizip/unzip.h | 437 --- .../org.chromium.zip/src/ios/minizip/zip.c | 2022 ----------- .../org.chromium.zip/src/ios/minizip/zip.h | 362 -- plugins/org.chromium.zip/tests/plugin.xml | 28 - plugins/org.chromium.zip/tests/tests.js | 75 - plugins/org.chromium.zip/zip.js | 27 - 835 files changed, 4 insertions(+), 88285 deletions(-) delete mode 100644 platforms/android/.gitignore delete mode 100644 platforms/android/.project delete mode 100644 platforms/android/AndroidManifest.xml delete mode 100644 platforms/android/CordovaLib/.project delete mode 100755 platforms/android/CordovaLib/AndroidManifest.xml delete mode 100644 platforms/android/CordovaLib/ant-build/AndroidManifest.cordova.xml delete mode 100644 platforms/android/CordovaLib/ant-build/AndroidManifest.xml.d delete mode 100644 platforms/android/CordovaLib/ant-build/build.prop delete mode 100644 platforms/android/CordovaLib/ant-build/classes.jar delete mode 100644 platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/Address.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/Connection.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/ConnectionPool$1.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/ConnectionPool$2.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/ConnectionPool.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/Dispatcher$RealResponseBody.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/Dispatcher.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/Failure$1.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/Failure$Builder.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/Failure.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/HttpResponseCache$1.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/HttpResponseCache$2.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/HttpResponseCache$3.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/HttpResponseCache$CacheRequestImpl$1.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/HttpResponseCache$CacheRequestImpl.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/HttpResponseCache$Entry.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/HttpResponseCache$EntryCacheResponse.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/HttpResponseCache$EntrySecureCacheResponse.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/HttpResponseCache.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/Job.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/MediaType.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/OkAuthenticator$Challenge.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/OkAuthenticator$Credential.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/OkAuthenticator.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/OkHttpClient$1.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/OkHttpClient.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/OkResponseCache.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/Request$1.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/Request$Body$1.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/Request$Body$2.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/Request$Body.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/Request$Builder.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/Request.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/Response$1.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/Response$Body.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/Response$Builder.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/Response$Receiver.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/Response.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/ResponseSource.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/Route.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/RouteDatabase.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/TunnelRequest.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/AbstractOutputStream.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/Base64.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/DiskLruCache$1.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/DiskLruCache$2.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/DiskLruCache$Editor$FaultHidingOutputStream.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/DiskLruCache$Editor.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/DiskLruCache$Entry.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/DiskLruCache$Snapshot.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/DiskLruCache.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/Dns$1.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/Dns.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/FaultRecoveringOutputStream.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/NamedRunnable.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/Platform$1.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/Platform$Android23.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/Platform$Android41.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/Platform$JdkWithJettyNpnPlatform.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/Platform$JettyNpnProvider.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/Platform.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/StrictLineReader$1.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/StrictLineReader.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/Util$1.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/Util.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/http/AbstractHttpInputStream.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/http/HeaderParser$CacheControlHandler.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/http/HeaderParser.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/http/HttpAuthenticator$1.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/http/HttpAuthenticator.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/http/HttpDate$1.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/http/HttpDate.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/http/HttpEngine$1.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/http/HttpEngine.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/http/HttpTransport$1.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/http/HttpTransport$ChunkedInputStream.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/http/HttpTransport$ChunkedOutputStream.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/http/HttpTransport$FixedLengthInputStream.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/http/HttpTransport$FixedLengthOutputStream.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/http/HttpTransport.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/http/HttpURLConnectionImpl$Retry.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/http/HttpURLConnectionImpl.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/http/HttpsEngine.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/http/HttpsURLConnectionImpl$1.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/http/HttpsURLConnectionImpl$HttpUrlConnectionDelegate.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/http/HttpsURLConnectionImpl.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/http/OkResponseCacheAdapter.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/http/Policy.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/http/RawHeaders$1.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/http/RawHeaders.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/http/RequestHeaders$1.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/http/RequestHeaders.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/http/ResponseHeaders$1.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/http/ResponseHeaders.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/http/RetryableOutputStream.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/http/RouteSelector.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/http/SpdyTransport.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/http/Transport.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/http/UnknownLengthHttpInputStream.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/spdy/ErrorCode.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/spdy/FrameReader$Handler.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/spdy/FrameReader.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/spdy/FrameWriter.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/spdy/HeadersMode.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/spdy/Hpack$HeaderEntry.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/spdy/Hpack$Reader.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/spdy/Hpack$Writer.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/spdy/Hpack.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/spdy/Http20Draft06$Reader.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/spdy/Http20Draft06$Writer.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/spdy/Http20Draft06.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/spdy/IncomingStreamHandler$1.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/spdy/IncomingStreamHandler.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/spdy/NameValueBlockReader$1.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/spdy/NameValueBlockReader$2.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/spdy/NameValueBlockReader$FillableInflaterInputStream.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/spdy/NameValueBlockReader.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/spdy/Ping.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/spdy/Settings.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/spdy/Spdy3$Reader.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/spdy/Spdy3$Writer.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/spdy/Spdy3.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/spdy/SpdyConnection$1.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/spdy/SpdyConnection$2.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/spdy/SpdyConnection$3.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/spdy/SpdyConnection$Builder.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/spdy/SpdyConnection$Reader$1.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/spdy/SpdyConnection$Reader.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/spdy/SpdyConnection.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/spdy/SpdyStream$1.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/spdy/SpdyStream$SpdyDataInputStream.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/spdy/SpdyStream$SpdyDataOutputStream.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/spdy/SpdyStream.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/spdy/Variant.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/tls/DistinguishedNameParser.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/tls/OkHostnameVerifier.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/App$1.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/App$2.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/App$3.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/App$4.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/App$5.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/App.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/AuthenticationToken.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/BuildConfig.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/CallbackContext.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/Config.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/ConfigXmlParser.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/CordovaActivity$1.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/CordovaActivity$2.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/CordovaActivity$3.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/CordovaActivity$4$1.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/CordovaActivity$4.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/CordovaActivity$5$1.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/CordovaActivity$5.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/CordovaActivity.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/CordovaArgs.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/CordovaBridge.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/CordovaChromeClient$1.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/CordovaChromeClient$2.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/CordovaChromeClient$3.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/CordovaChromeClient$4.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/CordovaChromeClient$5.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/CordovaChromeClient$6.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/CordovaChromeClient$7.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/CordovaChromeClient$8.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/CordovaChromeClient$9.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/CordovaChromeClient.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/CordovaInterface.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/CordovaPlugin.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/CordovaPreferences.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/CordovaResourceApi$OpenForReadResult.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/CordovaResourceApi.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/CordovaUriHelper.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/CordovaWebView$1.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/CordovaWebView$2.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/CordovaWebView$3.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/CordovaWebView$4.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/CordovaWebView$ActivityResult.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/CordovaWebView$Level16Apis.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/CordovaWebView.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/CordovaWebViewClient$1$1.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/CordovaWebViewClient$1.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/CordovaWebViewClient.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/DirectoryManager.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/DroidGap.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/ExifHelper.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/ExposedJsApi.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/FileHelper.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/IceCreamCordovaWebViewClient.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/JSONUtils.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/LOG.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/LinearLayoutSoftKeyboardDetect.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/NativeToJsMessageQueue$1.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/NativeToJsMessageQueue$BridgeMode.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/NativeToJsMessageQueue$JsMessage.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/NativeToJsMessageQueue$LoadUrlBridgeMode$1.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/NativeToJsMessageQueue$LoadUrlBridgeMode.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/NativeToJsMessageQueue$OnlineEventsBridgeMode$1.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/NativeToJsMessageQueue$OnlineEventsBridgeMode$2.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/NativeToJsMessageQueue$OnlineEventsBridgeMode.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/NativeToJsMessageQueue$PollingBridgeMode.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/NativeToJsMessageQueue$PrivateApiBridgeMode.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/NativeToJsMessageQueue.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/PluginEntry.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/PluginManager.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/PluginResult$Status.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/PluginResult.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/ScrollEvent.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/Whitelist$URLPattern.class delete mode 100644 platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/Whitelist.class delete mode 100644 platforms/android/CordovaLib/ant-build/proguard.txt delete mode 100644 platforms/android/CordovaLib/build.gradle delete mode 100644 platforms/android/CordovaLib/project.properties delete mode 100755 platforms/android/CordovaLib/src/com/squareup/okhttp/Address.java delete mode 100755 platforms/android/CordovaLib/src/com/squareup/okhttp/Connection.java delete mode 100755 platforms/android/CordovaLib/src/com/squareup/okhttp/ConnectionPool.java delete mode 100755 platforms/android/CordovaLib/src/com/squareup/okhttp/Dispatcher.java delete mode 100755 platforms/android/CordovaLib/src/com/squareup/okhttp/Failure.java delete mode 100755 platforms/android/CordovaLib/src/com/squareup/okhttp/HttpResponseCache.java delete mode 100755 platforms/android/CordovaLib/src/com/squareup/okhttp/Job.java delete mode 100755 platforms/android/CordovaLib/src/com/squareup/okhttp/MediaType.java delete mode 100755 platforms/android/CordovaLib/src/com/squareup/okhttp/OkAuthenticator.java delete mode 100755 platforms/android/CordovaLib/src/com/squareup/okhttp/OkHttpClient.java delete mode 100755 platforms/android/CordovaLib/src/com/squareup/okhttp/OkResponseCache.java delete mode 100755 platforms/android/CordovaLib/src/com/squareup/okhttp/Request.java delete mode 100755 platforms/android/CordovaLib/src/com/squareup/okhttp/Response.java delete mode 100755 platforms/android/CordovaLib/src/com/squareup/okhttp/ResponseSource.java delete mode 100755 platforms/android/CordovaLib/src/com/squareup/okhttp/Route.java delete mode 100755 platforms/android/CordovaLib/src/com/squareup/okhttp/RouteDatabase.java delete mode 100755 platforms/android/CordovaLib/src/com/squareup/okhttp/TunnelRequest.java delete mode 100755 platforms/android/CordovaLib/src/com/squareup/okhttp/internal/AbstractOutputStream.java delete mode 100755 platforms/android/CordovaLib/src/com/squareup/okhttp/internal/Base64.java delete mode 100755 platforms/android/CordovaLib/src/com/squareup/okhttp/internal/DiskLruCache.java delete mode 100755 platforms/android/CordovaLib/src/com/squareup/okhttp/internal/Dns.java delete mode 100755 platforms/android/CordovaLib/src/com/squareup/okhttp/internal/FaultRecoveringOutputStream.java delete mode 100755 platforms/android/CordovaLib/src/com/squareup/okhttp/internal/NamedRunnable.java delete mode 100755 platforms/android/CordovaLib/src/com/squareup/okhttp/internal/Platform.java delete mode 100755 platforms/android/CordovaLib/src/com/squareup/okhttp/internal/StrictLineReader.java delete mode 100755 platforms/android/CordovaLib/src/com/squareup/okhttp/internal/Util.java delete mode 100755 platforms/android/CordovaLib/src/com/squareup/okhttp/internal/http/AbstractHttpInputStream.java delete mode 100755 platforms/android/CordovaLib/src/com/squareup/okhttp/internal/http/HeaderParser.java delete mode 100755 platforms/android/CordovaLib/src/com/squareup/okhttp/internal/http/HttpAuthenticator.java delete mode 100755 platforms/android/CordovaLib/src/com/squareup/okhttp/internal/http/HttpDate.java delete mode 100755 platforms/android/CordovaLib/src/com/squareup/okhttp/internal/http/HttpEngine.java delete mode 100755 platforms/android/CordovaLib/src/com/squareup/okhttp/internal/http/HttpTransport.java delete mode 100755 platforms/android/CordovaLib/src/com/squareup/okhttp/internal/http/HttpURLConnectionImpl.java delete mode 100755 platforms/android/CordovaLib/src/com/squareup/okhttp/internal/http/HttpsEngine.java delete mode 100755 platforms/android/CordovaLib/src/com/squareup/okhttp/internal/http/HttpsURLConnectionImpl.java delete mode 100755 platforms/android/CordovaLib/src/com/squareup/okhttp/internal/http/OkResponseCacheAdapter.java delete mode 100755 platforms/android/CordovaLib/src/com/squareup/okhttp/internal/http/Policy.java delete mode 100755 platforms/android/CordovaLib/src/com/squareup/okhttp/internal/http/RawHeaders.java delete mode 100755 platforms/android/CordovaLib/src/com/squareup/okhttp/internal/http/RequestHeaders.java delete mode 100755 platforms/android/CordovaLib/src/com/squareup/okhttp/internal/http/ResponseHeaders.java delete mode 100755 platforms/android/CordovaLib/src/com/squareup/okhttp/internal/http/RetryableOutputStream.java delete mode 100755 platforms/android/CordovaLib/src/com/squareup/okhttp/internal/http/RouteSelector.java delete mode 100755 platforms/android/CordovaLib/src/com/squareup/okhttp/internal/http/SpdyTransport.java delete mode 100755 platforms/android/CordovaLib/src/com/squareup/okhttp/internal/http/Transport.java delete mode 100755 platforms/android/CordovaLib/src/com/squareup/okhttp/internal/http/UnknownLengthHttpInputStream.java delete mode 100755 platforms/android/CordovaLib/src/com/squareup/okhttp/internal/spdy/ErrorCode.java delete mode 100755 platforms/android/CordovaLib/src/com/squareup/okhttp/internal/spdy/FrameReader.java delete mode 100755 platforms/android/CordovaLib/src/com/squareup/okhttp/internal/spdy/FrameWriter.java delete mode 100755 platforms/android/CordovaLib/src/com/squareup/okhttp/internal/spdy/HeadersMode.java delete mode 100755 platforms/android/CordovaLib/src/com/squareup/okhttp/internal/spdy/Hpack.java delete mode 100755 platforms/android/CordovaLib/src/com/squareup/okhttp/internal/spdy/Http20Draft06.java delete mode 100755 platforms/android/CordovaLib/src/com/squareup/okhttp/internal/spdy/IncomingStreamHandler.java delete mode 100755 platforms/android/CordovaLib/src/com/squareup/okhttp/internal/spdy/NameValueBlockReader.java delete mode 100755 platforms/android/CordovaLib/src/com/squareup/okhttp/internal/spdy/Ping.java delete mode 100755 platforms/android/CordovaLib/src/com/squareup/okhttp/internal/spdy/Settings.java delete mode 100755 platforms/android/CordovaLib/src/com/squareup/okhttp/internal/spdy/Spdy3.java delete mode 100755 platforms/android/CordovaLib/src/com/squareup/okhttp/internal/spdy/SpdyConnection.java delete mode 100755 platforms/android/CordovaLib/src/com/squareup/okhttp/internal/spdy/SpdyStream.java delete mode 100755 platforms/android/CordovaLib/src/com/squareup/okhttp/internal/spdy/Variant.java delete mode 100755 platforms/android/CordovaLib/src/com/squareup/okhttp/internal/tls/DistinguishedNameParser.java delete mode 100755 platforms/android/CordovaLib/src/com/squareup/okhttp/internal/tls/OkHostnameVerifier.java delete mode 100755 platforms/android/CordovaLib/src/org/apache/cordova/App.java delete mode 100644 platforms/android/CordovaLib/src/org/apache/cordova/AuthenticationToken.java delete mode 100644 platforms/android/CordovaLib/src/org/apache/cordova/CallbackContext.java delete mode 100644 platforms/android/CordovaLib/src/org/apache/cordova/Config.java delete mode 100644 platforms/android/CordovaLib/src/org/apache/cordova/ConfigXmlParser.java delete mode 100755 platforms/android/CordovaLib/src/org/apache/cordova/CordovaActivity.java delete mode 100644 platforms/android/CordovaLib/src/org/apache/cordova/CordovaArgs.java delete mode 100644 platforms/android/CordovaLib/src/org/apache/cordova/CordovaBridge.java delete mode 100755 platforms/android/CordovaLib/src/org/apache/cordova/CordovaChromeClient.java delete mode 100755 platforms/android/CordovaLib/src/org/apache/cordova/CordovaInterface.java delete mode 100644 platforms/android/CordovaLib/src/org/apache/cordova/CordovaPlugin.java delete mode 100644 platforms/android/CordovaLib/src/org/apache/cordova/CordovaPreferences.java delete mode 100644 platforms/android/CordovaLib/src/org/apache/cordova/CordovaResourceApi.java delete mode 100644 platforms/android/CordovaLib/src/org/apache/cordova/CordovaUriHelper.java delete mode 100755 platforms/android/CordovaLib/src/org/apache/cordova/CordovaWebView.java delete mode 100755 platforms/android/CordovaLib/src/org/apache/cordova/CordovaWebViewClient.java delete mode 100644 platforms/android/CordovaLib/src/org/apache/cordova/DirectoryManager.java delete mode 100644 platforms/android/CordovaLib/src/org/apache/cordova/DroidGap.java delete mode 100644 platforms/android/CordovaLib/src/org/apache/cordova/ExifHelper.java delete mode 100755 platforms/android/CordovaLib/src/org/apache/cordova/ExposedJsApi.java delete mode 100644 platforms/android/CordovaLib/src/org/apache/cordova/FileHelper.java delete mode 100644 platforms/android/CordovaLib/src/org/apache/cordova/IceCreamCordovaWebViewClient.java delete mode 100644 platforms/android/CordovaLib/src/org/apache/cordova/JSONUtils.java delete mode 100755 platforms/android/CordovaLib/src/org/apache/cordova/LOG.java delete mode 100755 platforms/android/CordovaLib/src/org/apache/cordova/LinearLayoutSoftKeyboardDetect.java delete mode 100755 platforms/android/CordovaLib/src/org/apache/cordova/NativeToJsMessageQueue.java delete mode 100755 platforms/android/CordovaLib/src/org/apache/cordova/PluginEntry.java delete mode 100755 platforms/android/CordovaLib/src/org/apache/cordova/PluginManager.java delete mode 100755 platforms/android/CordovaLib/src/org/apache/cordova/PluginResult.java delete mode 100644 platforms/android/CordovaLib/src/org/apache/cordova/ScrollEvent.java delete mode 100644 platforms/android/CordovaLib/src/org/apache/cordova/Whitelist.java delete mode 100644 platforms/android/ant-build/AndroidManifest.cordova.xml delete mode 100644 platforms/android/ant-build/AndroidManifest.xml.d delete mode 100644 platforms/android/ant-build/CordovaApp-debug-unaligned.apk delete mode 100644 platforms/android/ant-build/CordovaApp-debug-unaligned.apk.d delete mode 100644 platforms/android/ant-build/CordovaApp-debug.apk delete mode 100644 platforms/android/ant-build/CordovaApp-release-unsigned.apk delete mode 100644 platforms/android/ant-build/CordovaApp-release-unsigned.apk.d delete mode 100644 platforms/android/ant-build/CordovaApp.ap_ delete mode 100644 platforms/android/ant-build/CordovaApp.ap_.d delete mode 100644 platforms/android/ant-build/R.txt delete mode 100644 platforms/android/ant-build/build.prop delete mode 100644 platforms/android/ant-build/classes.dex delete mode 100644 platforms/android/ant-build/classes.dex.d delete mode 100644 platforms/android/ant-build/classes/com/cadoles/momo/BuildConfig.class delete mode 100644 platforms/android/ant-build/classes/com/cadoles/momo/CordovaApp.class delete mode 100644 platforms/android/ant-build/classes/com/cadoles/momo/R$attr.class delete mode 100644 platforms/android/ant-build/classes/com/cadoles/momo/R$drawable.class delete mode 100644 platforms/android/ant-build/classes/com/cadoles/momo/R$string.class delete mode 100644 platforms/android/ant-build/classes/com/cadoles/momo/R$xml.class delete mode 100644 platforms/android/ant-build/classes/com/cadoles/momo/R.class delete mode 100644 platforms/android/ant-build/classes/org/apache/cordova/Zip$1.class delete mode 100644 platforms/android/ant-build/classes/org/apache/cordova/Zip$ProgressEvent.class delete mode 100644 platforms/android/ant-build/classes/org/apache/cordova/Zip.class delete mode 100644 platforms/android/ant-build/classes/org/apache/cordova/file/ContentFilesystem.class delete mode 100644 platforms/android/ant-build/classes/org/apache/cordova/file/DirectoryManager.class delete mode 100644 platforms/android/ant-build/classes/org/apache/cordova/file/EncodingException.class delete mode 100644 platforms/android/ant-build/classes/org/apache/cordova/file/FileExistsException.class delete mode 100644 platforms/android/ant-build/classes/org/apache/cordova/file/FileHelper.class delete mode 100644 platforms/android/ant-build/classes/org/apache/cordova/file/FileUtils$1.class delete mode 100644 platforms/android/ant-build/classes/org/apache/cordova/file/FileUtils$10.class delete mode 100644 platforms/android/ant-build/classes/org/apache/cordova/file/FileUtils$11.class delete mode 100644 platforms/android/ant-build/classes/org/apache/cordova/file/FileUtils$12.class delete mode 100644 platforms/android/ant-build/classes/org/apache/cordova/file/FileUtils$13.class delete mode 100644 platforms/android/ant-build/classes/org/apache/cordova/file/FileUtils$14.class delete mode 100644 platforms/android/ant-build/classes/org/apache/cordova/file/FileUtils$15.class delete mode 100644 platforms/android/ant-build/classes/org/apache/cordova/file/FileUtils$16.class delete mode 100644 platforms/android/ant-build/classes/org/apache/cordova/file/FileUtils$17.class delete mode 100644 platforms/android/ant-build/classes/org/apache/cordova/file/FileUtils$18.class delete mode 100644 platforms/android/ant-build/classes/org/apache/cordova/file/FileUtils$19.class delete mode 100644 platforms/android/ant-build/classes/org/apache/cordova/file/FileUtils$2.class delete mode 100644 platforms/android/ant-build/classes/org/apache/cordova/file/FileUtils$20.class delete mode 100644 platforms/android/ant-build/classes/org/apache/cordova/file/FileUtils$21.class delete mode 100644 platforms/android/ant-build/classes/org/apache/cordova/file/FileUtils$22.class delete mode 100644 platforms/android/ant-build/classes/org/apache/cordova/file/FileUtils$23.class delete mode 100644 platforms/android/ant-build/classes/org/apache/cordova/file/FileUtils$24.class delete mode 100644 platforms/android/ant-build/classes/org/apache/cordova/file/FileUtils$25.class delete mode 100644 platforms/android/ant-build/classes/org/apache/cordova/file/FileUtils$26.class delete mode 100644 platforms/android/ant-build/classes/org/apache/cordova/file/FileUtils$3.class delete mode 100644 platforms/android/ant-build/classes/org/apache/cordova/file/FileUtils$4.class delete mode 100644 platforms/android/ant-build/classes/org/apache/cordova/file/FileUtils$5.class delete mode 100644 platforms/android/ant-build/classes/org/apache/cordova/file/FileUtils$6.class delete mode 100644 platforms/android/ant-build/classes/org/apache/cordova/file/FileUtils$7.class delete mode 100644 platforms/android/ant-build/classes/org/apache/cordova/file/FileUtils$8.class delete mode 100644 platforms/android/ant-build/classes/org/apache/cordova/file/FileUtils$9.class delete mode 100644 platforms/android/ant-build/classes/org/apache/cordova/file/FileUtils$FileOp.class delete mode 100644 platforms/android/ant-build/classes/org/apache/cordova/file/FileUtils.class delete mode 100644 platforms/android/ant-build/classes/org/apache/cordova/file/Filesystem$1.class delete mode 100644 platforms/android/ant-build/classes/org/apache/cordova/file/Filesystem$LimitedInputStream.class delete mode 100644 platforms/android/ant-build/classes/org/apache/cordova/file/Filesystem$ReadFileCallback.class delete mode 100644 platforms/android/ant-build/classes/org/apache/cordova/file/Filesystem.class delete mode 100644 platforms/android/ant-build/classes/org/apache/cordova/file/InvalidModificationException.class delete mode 100644 platforms/android/ant-build/classes/org/apache/cordova/file/LocalFilesystem.class delete mode 100644 platforms/android/ant-build/classes/org/apache/cordova/file/LocalFilesystemURL.class delete mode 100644 platforms/android/ant-build/classes/org/apache/cordova/file/NoModificationAllowedException.class delete mode 100644 platforms/android/ant-build/classes/org/apache/cordova/file/TypeMismatchException.class delete mode 100644 platforms/android/ant-build/classes/org/apache/cordova/filetransfer/FileProgressResult.class delete mode 100644 platforms/android/ant-build/classes/org/apache/cordova/filetransfer/FileTransfer$1.class delete mode 100644 platforms/android/ant-build/classes/org/apache/cordova/filetransfer/FileTransfer$2.class delete mode 100644 platforms/android/ant-build/classes/org/apache/cordova/filetransfer/FileTransfer$3.class delete mode 100644 platforms/android/ant-build/classes/org/apache/cordova/filetransfer/FileTransfer$4.class delete mode 100644 platforms/android/ant-build/classes/org/apache/cordova/filetransfer/FileTransfer$5.class delete mode 100644 platforms/android/ant-build/classes/org/apache/cordova/filetransfer/FileTransfer$ExposedGZIPInputStream.class delete mode 100644 platforms/android/ant-build/classes/org/apache/cordova/filetransfer/FileTransfer$RequestContext.class delete mode 100644 platforms/android/ant-build/classes/org/apache/cordova/filetransfer/FileTransfer$SimpleTrackingInputStream.class delete mode 100644 platforms/android/ant-build/classes/org/apache/cordova/filetransfer/FileTransfer$TrackingGZIPInputStream.class delete mode 100644 platforms/android/ant-build/classes/org/apache/cordova/filetransfer/FileTransfer$TrackingInputStream.class delete mode 100644 platforms/android/ant-build/classes/org/apache/cordova/filetransfer/FileTransfer.class delete mode 100644 platforms/android/ant-build/classes/org/apache/cordova/filetransfer/FileUploadResult.class delete mode 100644 platforms/android/ant-build/classes/org/apache/cordova/inappbrowser/InAppBrowser$1.class delete mode 100644 platforms/android/ant-build/classes/org/apache/cordova/inappbrowser/InAppBrowser$2.class delete mode 100644 platforms/android/ant-build/classes/org/apache/cordova/inappbrowser/InAppBrowser$3.class delete mode 100644 platforms/android/ant-build/classes/org/apache/cordova/inappbrowser/InAppBrowser$4$1.class delete mode 100644 platforms/android/ant-build/classes/org/apache/cordova/inappbrowser/InAppBrowser$4.class delete mode 100644 platforms/android/ant-build/classes/org/apache/cordova/inappbrowser/InAppBrowser$5$1.class delete mode 100644 platforms/android/ant-build/classes/org/apache/cordova/inappbrowser/InAppBrowser$5$2.class delete mode 100644 platforms/android/ant-build/classes/org/apache/cordova/inappbrowser/InAppBrowser$5$3.class delete mode 100644 platforms/android/ant-build/classes/org/apache/cordova/inappbrowser/InAppBrowser$5$4.class delete mode 100644 platforms/android/ant-build/classes/org/apache/cordova/inappbrowser/InAppBrowser$5.class delete mode 100644 platforms/android/ant-build/classes/org/apache/cordova/inappbrowser/InAppBrowser$InAppBrowserClient.class delete mode 100644 platforms/android/ant-build/classes/org/apache/cordova/inappbrowser/InAppBrowser.class delete mode 100644 platforms/android/ant-build/classes/org/apache/cordova/inappbrowser/InAppBrowserDialog.class delete mode 100644 platforms/android/ant-build/classes/org/apache/cordova/inappbrowser/InAppChromeClient.class delete mode 100644 platforms/android/ant-build/dexedLibs/classes-703f86d81f0ed180098d872ee1ccf45c.jar delete mode 100644 platforms/android/ant-build/dexedLibs/classes-cae0b40c92ff3af60f02e39bf3ee1661.jar delete mode 100644 platforms/android/ant-build/dexedLibs/classes-efbe2a183ccbe20c352ecba06f7a793d.jar delete mode 100644 platforms/android/ant-build/proguard.txt delete mode 100644 platforms/android/ant-build/res/drawable-hdpi/ic_action_next_item.png delete mode 100644 platforms/android/ant-build/res/drawable-hdpi/ic_action_previous_item.png delete mode 100644 platforms/android/ant-build/res/drawable-hdpi/ic_action_remove.png delete mode 100644 platforms/android/ant-build/res/drawable-hdpi/icon.png delete mode 100644 platforms/android/ant-build/res/drawable-land-hdpi/screen.png delete mode 100644 platforms/android/ant-build/res/drawable-land-ldpi/screen.png delete mode 100644 platforms/android/ant-build/res/drawable-land-mdpi/screen.png delete mode 100644 platforms/android/ant-build/res/drawable-land-xhdpi/screen.png delete mode 100644 platforms/android/ant-build/res/drawable-mdpi/ic_action_next_item.png delete mode 100644 platforms/android/ant-build/res/drawable-mdpi/ic_action_previous_item.png delete mode 100644 platforms/android/ant-build/res/drawable-mdpi/ic_action_remove.png delete mode 100644 platforms/android/ant-build/res/drawable-port-hdpi/screen.png delete mode 100644 platforms/android/ant-build/res/drawable-port-ldpi/screen.png delete mode 100644 platforms/android/ant-build/res/drawable-port-mdpi/screen.png delete mode 100644 platforms/android/ant-build/res/drawable-port-xhdpi/screen.png delete mode 100644 platforms/android/ant-build/res/drawable-xhdpi/ic_action_next_item.png delete mode 100644 platforms/android/ant-build/res/drawable-xhdpi/ic_action_previous_item.png delete mode 100644 platforms/android/ant-build/res/drawable-xhdpi/ic_action_remove.png delete mode 100644 platforms/android/ant-build/res/drawable-xxhdpi/ic_action_next_item.png delete mode 100644 platforms/android/ant-build/res/drawable-xxhdpi/ic_action_previous_item.png delete mode 100644 platforms/android/ant-build/res/drawable-xxhdpi/ic_action_remove.png delete mode 100644 platforms/android/ant-build/res/drawable/icon.png delete mode 100644 platforms/android/assets/_where-is-www.txt delete mode 100644 platforms/android/assets/www/assets/dijon.jpg delete mode 100644 platforms/android/assets/www/assets/index.css delete mode 100644 platforms/android/assets/www/assets/index.js delete mode 100644 platforms/android/assets/www/cordova.js delete mode 100644 platforms/android/assets/www/cordova_plugins.js delete mode 100644 platforms/android/assets/www/css/animations.css delete mode 100644 platforms/android/assets/www/css/bootstrap.min.css delete mode 100644 platforms/android/assets/www/css/font-awesome.min.css delete mode 100644 platforms/android/assets/www/css/index.css delete mode 100644 platforms/android/assets/www/fonts/FontAwesome.otf delete mode 100644 platforms/android/assets/www/fonts/fontawesome-webfont.eot delete mode 100644 platforms/android/assets/www/fonts/fontawesome-webfont.svg delete mode 100644 platforms/android/assets/www/fonts/fontawesome-webfont.ttf delete mode 100644 platforms/android/assets/www/fonts/fontawesome-webfont.woff delete mode 100644 platforms/android/assets/www/fonts/fontawesome-webfont.woff2 delete mode 100644 platforms/android/assets/www/fonts/glyphicons-halflings-regular.eot delete mode 100644 platforms/android/assets/www/fonts/glyphicons-halflings-regular.svg delete mode 100644 platforms/android/assets/www/fonts/glyphicons-halflings-regular.ttf delete mode 100644 platforms/android/assets/www/fonts/glyphicons-halflings-regular.woff delete mode 100644 platforms/android/assets/www/fonts/glyphicons-halflings-regular.woff2 delete mode 100644 platforms/android/assets/www/icon.png delete mode 100644 platforms/android/assets/www/img/greyzz.png delete mode 100644 platforms/android/assets/www/index.html delete mode 100644 platforms/android/assets/www/index.json delete mode 100644 platforms/android/assets/www/js/fastclick.js delete mode 100644 platforms/android/assets/www/js/index.js delete mode 100644 platforms/android/assets/www/js/tmpl.min.js delete mode 100644 platforms/android/assets/www/plugins/org.apache.cordova.file-transfer/www/FileTransfer.js delete mode 100644 platforms/android/assets/www/plugins/org.apache.cordova.file-transfer/www/FileTransferError.js delete mode 100644 platforms/android/assets/www/plugins/org.apache.cordova.file/www/DirectoryEntry.js delete mode 100644 platforms/android/assets/www/plugins/org.apache.cordova.file/www/DirectoryReader.js delete mode 100644 platforms/android/assets/www/plugins/org.apache.cordova.file/www/Entry.js delete mode 100644 platforms/android/assets/www/plugins/org.apache.cordova.file/www/File.js delete mode 100644 platforms/android/assets/www/plugins/org.apache.cordova.file/www/FileEntry.js delete mode 100644 platforms/android/assets/www/plugins/org.apache.cordova.file/www/FileError.js delete mode 100644 platforms/android/assets/www/plugins/org.apache.cordova.file/www/FileReader.js delete mode 100644 platforms/android/assets/www/plugins/org.apache.cordova.file/www/FileSystem.js delete mode 100644 platforms/android/assets/www/plugins/org.apache.cordova.file/www/FileUploadOptions.js delete mode 100644 platforms/android/assets/www/plugins/org.apache.cordova.file/www/FileUploadResult.js delete mode 100644 platforms/android/assets/www/plugins/org.apache.cordova.file/www/FileWriter.js delete mode 100644 platforms/android/assets/www/plugins/org.apache.cordova.file/www/Flags.js delete mode 100644 platforms/android/assets/www/plugins/org.apache.cordova.file/www/LocalFileSystem.js delete mode 100644 platforms/android/assets/www/plugins/org.apache.cordova.file/www/Metadata.js delete mode 100644 platforms/android/assets/www/plugins/org.apache.cordova.file/www/ProgressEvent.js delete mode 100644 platforms/android/assets/www/plugins/org.apache.cordova.file/www/android/FileSystem.js delete mode 100644 platforms/android/assets/www/plugins/org.apache.cordova.file/www/fileSystemPaths.js delete mode 100644 platforms/android/assets/www/plugins/org.apache.cordova.file/www/fileSystems-roots.js delete mode 100644 platforms/android/assets/www/plugins/org.apache.cordova.file/www/fileSystems.js delete mode 100644 platforms/android/assets/www/plugins/org.apache.cordova.file/www/requestFileSystem.js delete mode 100644 platforms/android/assets/www/plugins/org.apache.cordova.file/www/resolveLocalFileSystemURI.js delete mode 100644 platforms/android/assets/www/plugins/org.apache.cordova.inappbrowser/www/inappbrowser.js delete mode 100644 platforms/android/assets/www/plugins/org.chromium.zip/zip.js delete mode 100644 platforms/android/assets/www/res/.pgbomit delete mode 100644 platforms/android/assets/www/res/icon/android/icon-36-ldpi.png delete mode 100644 platforms/android/assets/www/res/icon/android/icon-48-mdpi.png delete mode 100644 platforms/android/assets/www/res/icon/android/icon-72-hdpi.png delete mode 100644 platforms/android/assets/www/res/icon/android/icon-96-xhdpi.png delete mode 100644 platforms/android/assets/www/res/icon/bada-wac/icon-48-type5.png delete mode 100644 platforms/android/assets/www/res/icon/bada-wac/icon-50-type3.png delete mode 100644 platforms/android/assets/www/res/icon/bada-wac/icon-80-type4.png delete mode 100644 platforms/android/assets/www/res/icon/bada/icon-128.png delete mode 100644 platforms/android/assets/www/res/icon/blackberry/icon-80.png delete mode 100644 platforms/android/assets/www/res/icon/ios/icon-57-2x.png delete mode 100644 platforms/android/assets/www/res/icon/ios/icon-57.png delete mode 100644 platforms/android/assets/www/res/icon/ios/icon-72-2x.png delete mode 100644 platforms/android/assets/www/res/icon/ios/icon-72.png delete mode 100644 platforms/android/assets/www/res/icon/tizen/icon-128.png delete mode 100644 platforms/android/assets/www/res/icon/webos/icon-64.png delete mode 100644 platforms/android/assets/www/res/icon/windows-phone/icon-173-tile.png delete mode 100644 platforms/android/assets/www/res/icon/windows-phone/icon-48.png delete mode 100644 platforms/android/assets/www/res/icon/windows-phone/icon-62-tile.png delete mode 100644 platforms/android/assets/www/res/screen/android/screen-hdpi-landscape.png delete mode 100644 platforms/android/assets/www/res/screen/android/screen-hdpi-portrait.png delete mode 100644 platforms/android/assets/www/res/screen/android/screen-ldpi-landscape.png delete mode 100644 platforms/android/assets/www/res/screen/android/screen-ldpi-portrait.png delete mode 100644 platforms/android/assets/www/res/screen/android/screen-mdpi-landscape.png delete mode 100644 platforms/android/assets/www/res/screen/android/screen-mdpi-portrait.png delete mode 100644 platforms/android/assets/www/res/screen/android/screen-xhdpi-landscape.png delete mode 100644 platforms/android/assets/www/res/screen/android/screen-xhdpi-portrait.png delete mode 100644 platforms/android/assets/www/res/screen/bada-wac/screen-type3.png delete mode 100644 platforms/android/assets/www/res/screen/bada-wac/screen-type4.png delete mode 100644 platforms/android/assets/www/res/screen/bada-wac/screen-type5.png delete mode 100644 platforms/android/assets/www/res/screen/bada/screen-portrait.png delete mode 100644 platforms/android/assets/www/res/screen/blackberry/screen-225.png delete mode 100644 platforms/android/assets/www/res/screen/ios/screen-ipad-landscape-2x.png delete mode 100644 platforms/android/assets/www/res/screen/ios/screen-ipad-landscape.png delete mode 100644 platforms/android/assets/www/res/screen/ios/screen-ipad-portrait-2x.png delete mode 100644 platforms/android/assets/www/res/screen/ios/screen-ipad-portrait.png delete mode 100644 platforms/android/assets/www/res/screen/ios/screen-iphone-landscape-2x.png delete mode 100644 platforms/android/assets/www/res/screen/ios/screen-iphone-landscape.png delete mode 100644 platforms/android/assets/www/res/screen/ios/screen-iphone-portrait-2x.png delete mode 100644 platforms/android/assets/www/res/screen/ios/screen-iphone-portrait-568h-2x.png delete mode 100644 platforms/android/assets/www/res/screen/ios/screen-iphone-portrait.png delete mode 100644 platforms/android/assets/www/res/screen/tizen/README.md delete mode 100644 platforms/android/assets/www/res/screen/webos/screen-64.png delete mode 100644 platforms/android/assets/www/res/screen/windows-phone/screen-portrait.jpg delete mode 100644 platforms/android/assets/www/spec.html delete mode 100644 platforms/android/assets/www/spec/helper.js delete mode 100644 platforms/android/assets/www/spec/index.js delete mode 100644 platforms/android/assets/www/spec/lib/jasmine-1.2.0/MIT.LICENSE delete mode 100644 platforms/android/assets/www/spec/lib/jasmine-1.2.0/jasmine-html.js delete mode 100644 platforms/android/assets/www/spec/lib/jasmine-1.2.0/jasmine.css delete mode 100644 platforms/android/assets/www/spec/lib/jasmine-1.2.0/jasmine.js delete mode 100644 platforms/android/build.gradle delete mode 100755 platforms/android/cordova/android_sdk_version delete mode 100755 platforms/android/cordova/build delete mode 100644 platforms/android/cordova/build.bat delete mode 100755 platforms/android/cordova/check_reqs delete mode 100755 platforms/android/cordova/clean delete mode 100644 platforms/android/cordova/clean.bat delete mode 100644 platforms/android/cordova/defaults.xml delete mode 100755 platforms/android/cordova/lib/android_sdk_version.js delete mode 100644 platforms/android/cordova/lib/appinfo.js delete mode 100644 platforms/android/cordova/lib/build.js delete mode 100644 platforms/android/cordova/lib/check_reqs.js delete mode 100644 platforms/android/cordova/lib/device.js delete mode 100644 platforms/android/cordova/lib/emulator.js delete mode 100644 platforms/android/cordova/lib/exec.js delete mode 100755 platforms/android/cordova/lib/install-device delete mode 100644 platforms/android/cordova/lib/install-device.bat delete mode 100755 platforms/android/cordova/lib/install-emulator delete mode 100644 platforms/android/cordova/lib/install-emulator.bat delete mode 100755 platforms/android/cordova/lib/list-devices delete mode 100644 platforms/android/cordova/lib/list-devices.bat delete mode 100755 platforms/android/cordova/lib/list-emulator-images delete mode 100644 platforms/android/cordova/lib/list-emulator-images.bat delete mode 100755 platforms/android/cordova/lib/list-started-emulators delete mode 100644 platforms/android/cordova/lib/list-started-emulators.bat delete mode 100644 platforms/android/cordova/lib/log.js delete mode 100644 platforms/android/cordova/lib/run.js delete mode 100644 platforms/android/cordova/lib/spawn.js delete mode 100755 platforms/android/cordova/lib/start-emulator delete mode 100644 platforms/android/cordova/lib/start-emulator.bat delete mode 100755 platforms/android/cordova/log delete mode 100644 platforms/android/cordova/log.bat delete mode 100644 platforms/android/cordova/node_modules/q/CONTRIBUTING.md delete mode 100644 platforms/android/cordova/node_modules/q/LICENSE delete mode 100644 platforms/android/cordova/node_modules/q/README.md delete mode 100644 platforms/android/cordova/node_modules/q/benchmark/compare-with-callbacks.js delete mode 100644 platforms/android/cordova/node_modules/q/benchmark/scenarios.js delete mode 100644 platforms/android/cordova/node_modules/q/package.json delete mode 100644 platforms/android/cordova/node_modules/q/q.js delete mode 100644 platforms/android/cordova/node_modules/q/queue.js delete mode 100644 platforms/android/cordova/node_modules/shelljs/.documentup.json delete mode 100644 platforms/android/cordova/node_modules/shelljs/.jshintrc delete mode 100644 platforms/android/cordova/node_modules/shelljs/.npmignore delete mode 100644 platforms/android/cordova/node_modules/shelljs/.travis.yml delete mode 100644 platforms/android/cordova/node_modules/shelljs/LICENSE delete mode 100644 platforms/android/cordova/node_modules/shelljs/README.md delete mode 100755 platforms/android/cordova/node_modules/shelljs/bin/shjs delete mode 100644 platforms/android/cordova/node_modules/shelljs/global.js delete mode 100644 platforms/android/cordova/node_modules/shelljs/make.js delete mode 100644 platforms/android/cordova/node_modules/shelljs/package.json delete mode 100755 platforms/android/cordova/node_modules/shelljs/scripts/generate-docs.js delete mode 100755 platforms/android/cordova/node_modules/shelljs/scripts/run-tests.js delete mode 100644 platforms/android/cordova/node_modules/shelljs/shell.js delete mode 100644 platforms/android/cordova/node_modules/shelljs/src/cat.js delete mode 100644 platforms/android/cordova/node_modules/shelljs/src/cd.js delete mode 100644 platforms/android/cordova/node_modules/shelljs/src/chmod.js delete mode 100644 platforms/android/cordova/node_modules/shelljs/src/common.js delete mode 100644 platforms/android/cordova/node_modules/shelljs/src/cp.js delete mode 100644 platforms/android/cordova/node_modules/shelljs/src/dirs.js delete mode 100644 platforms/android/cordova/node_modules/shelljs/src/echo.js delete mode 100644 platforms/android/cordova/node_modules/shelljs/src/error.js delete mode 100644 platforms/android/cordova/node_modules/shelljs/src/exec.js delete mode 100644 platforms/android/cordova/node_modules/shelljs/src/find.js delete mode 100644 platforms/android/cordova/node_modules/shelljs/src/grep.js delete mode 100644 platforms/android/cordova/node_modules/shelljs/src/ls.js delete mode 100644 platforms/android/cordova/node_modules/shelljs/src/mkdir.js delete mode 100644 platforms/android/cordova/node_modules/shelljs/src/mv.js delete mode 100644 platforms/android/cordova/node_modules/shelljs/src/popd.js delete mode 100644 platforms/android/cordova/node_modules/shelljs/src/pushd.js delete mode 100644 platforms/android/cordova/node_modules/shelljs/src/pwd.js delete mode 100644 platforms/android/cordova/node_modules/shelljs/src/rm.js delete mode 100644 platforms/android/cordova/node_modules/shelljs/src/sed.js delete mode 100644 platforms/android/cordova/node_modules/shelljs/src/tempdir.js delete mode 100644 platforms/android/cordova/node_modules/shelljs/src/test.js delete mode 100644 platforms/android/cordova/node_modules/shelljs/src/to.js delete mode 100644 platforms/android/cordova/node_modules/shelljs/src/toEnd.js delete mode 100644 platforms/android/cordova/node_modules/shelljs/src/which.js delete mode 100644 platforms/android/cordova/node_modules/which/LICENSE delete mode 100644 platforms/android/cordova/node_modules/which/README.md delete mode 100755 platforms/android/cordova/node_modules/which/bin/which delete mode 100644 platforms/android/cordova/node_modules/which/package.json delete mode 100644 platforms/android/cordova/node_modules/which/which.js delete mode 100755 platforms/android/cordova/run delete mode 100644 platforms/android/cordova/run.bat delete mode 100755 platforms/android/cordova/version delete mode 100644 platforms/android/cordova/version.bat delete mode 100644 platforms/android/custom_rules.xml delete mode 100644 platforms/android/platform_www/cordova.js delete mode 100644 platforms/android/project.properties delete mode 100644 platforms/android/res/drawable-hdpi/ic_action_next_item.png delete mode 100644 platforms/android/res/drawable-hdpi/ic_action_previous_item.png delete mode 100644 platforms/android/res/drawable-hdpi/ic_action_remove.png delete mode 100644 platforms/android/res/drawable-hdpi/icon.png delete mode 100644 platforms/android/res/drawable-land-hdpi/screen.png delete mode 100644 platforms/android/res/drawable-land-ldpi/screen.png delete mode 100644 platforms/android/res/drawable-land-mdpi/screen.png delete mode 100644 platforms/android/res/drawable-land-xhdpi/screen.png delete mode 100644 platforms/android/res/drawable-mdpi/ic_action_next_item.png delete mode 100644 platforms/android/res/drawable-mdpi/ic_action_previous_item.png delete mode 100644 platforms/android/res/drawable-mdpi/ic_action_remove.png delete mode 100644 platforms/android/res/drawable-port-hdpi/screen.png delete mode 100644 platforms/android/res/drawable-port-ldpi/screen.png delete mode 100644 platforms/android/res/drawable-port-mdpi/screen.png delete mode 100644 platforms/android/res/drawable-port-xhdpi/screen.png delete mode 100644 platforms/android/res/drawable-xhdpi/ic_action_next_item.png delete mode 100644 platforms/android/res/drawable-xhdpi/ic_action_previous_item.png delete mode 100644 platforms/android/res/drawable-xhdpi/ic_action_remove.png delete mode 100644 platforms/android/res/drawable-xxhdpi/ic_action_next_item.png delete mode 100644 platforms/android/res/drawable-xxhdpi/ic_action_previous_item.png delete mode 100644 platforms/android/res/drawable-xxhdpi/ic_action_remove.png delete mode 100644 platforms/android/res/drawable/icon.png delete mode 100644 platforms/android/res/values/strings.xml delete mode 100644 platforms/android/res/xml/config.xml delete mode 100644 platforms/android/settings.gradle delete mode 100644 platforms/android/src/com/cadoles/momo/CordovaApp.java delete mode 100644 platforms/android/src/org/apache/cordova/Zip.java delete mode 100644 platforms/android/src/org/apache/cordova/file/ContentFilesystem.java delete mode 100644 platforms/android/src/org/apache/cordova/file/DirectoryManager.java delete mode 100644 platforms/android/src/org/apache/cordova/file/EncodingException.java delete mode 100644 platforms/android/src/org/apache/cordova/file/FileExistsException.java delete mode 100644 platforms/android/src/org/apache/cordova/file/FileHelper.java delete mode 100644 platforms/android/src/org/apache/cordova/file/FileUtils.java delete mode 100644 platforms/android/src/org/apache/cordova/file/Filesystem.java delete mode 100644 platforms/android/src/org/apache/cordova/file/InvalidModificationException.java delete mode 100644 platforms/android/src/org/apache/cordova/file/LocalFilesystem.java delete mode 100644 platforms/android/src/org/apache/cordova/file/LocalFilesystemURL.java delete mode 100644 platforms/android/src/org/apache/cordova/file/NoModificationAllowedException.java delete mode 100644 platforms/android/src/org/apache/cordova/file/TypeMismatchException.java delete mode 100644 platforms/android/src/org/apache/cordova/filetransfer/FileProgressResult.java delete mode 100644 platforms/android/src/org/apache/cordova/filetransfer/FileTransfer.java delete mode 100644 platforms/android/src/org/apache/cordova/filetransfer/FileUploadResult.java delete mode 100644 platforms/android/src/org/apache/cordova/inappbrowser/InAppBrowser.java delete mode 100644 platforms/android/src/org/apache/cordova/inappbrowser/InAppBrowserDialog.java delete mode 100644 platforms/android/src/org/apache/cordova/inappbrowser/InAppChromeClient.java delete mode 100644 plugins/org.apache.cordova.file-transfer/.fetch.json delete mode 100644 plugins/org.apache.cordova.file-transfer/CONTRIBUTING.md delete mode 100644 plugins/org.apache.cordova.file-transfer/LICENSE delete mode 100644 plugins/org.apache.cordova.file-transfer/NOTICE delete mode 100644 plugins/org.apache.cordova.file-transfer/README.md delete mode 100644 plugins/org.apache.cordova.file-transfer/RELEASENOTES.md delete mode 100644 plugins/org.apache.cordova.file-transfer/doc/de/index.md delete mode 100644 plugins/org.apache.cordova.file-transfer/doc/es/index.md delete mode 100644 plugins/org.apache.cordova.file-transfer/doc/fr/index.md delete mode 100644 plugins/org.apache.cordova.file-transfer/doc/index.md delete mode 100644 plugins/org.apache.cordova.file-transfer/doc/it/index.md delete mode 100644 plugins/org.apache.cordova.file-transfer/doc/ja/index.md delete mode 100644 plugins/org.apache.cordova.file-transfer/doc/ko/index.md delete mode 100644 plugins/org.apache.cordova.file-transfer/doc/pl/index.md delete mode 100644 plugins/org.apache.cordova.file-transfer/doc/ru/index.md delete mode 100644 plugins/org.apache.cordova.file-transfer/doc/zh/index.md delete mode 100644 plugins/org.apache.cordova.file-transfer/plugin.xml delete mode 100644 plugins/org.apache.cordova.file-transfer/src/amazon/FileTransfer.java delete mode 100644 plugins/org.apache.cordova.file-transfer/src/android/FileProgressResult.java delete mode 100644 plugins/org.apache.cordova.file-transfer/src/android/FileTransfer.java delete mode 100644 plugins/org.apache.cordova.file-transfer/src/android/FileUploadResult.java delete mode 100644 plugins/org.apache.cordova.file-transfer/src/ios/CDVFileTransfer.h delete mode 100644 plugins/org.apache.cordova.file-transfer/src/ios/CDVFileTransfer.m delete mode 100644 plugins/org.apache.cordova.file-transfer/src/ubuntu/file-transfer.cpp delete mode 100644 plugins/org.apache.cordova.file-transfer/src/ubuntu/file-transfer.h delete mode 100644 plugins/org.apache.cordova.file-transfer/src/windows/FileTransferProxy.js delete mode 100644 plugins/org.apache.cordova.file-transfer/src/wp/FileTransfer.cs delete mode 100644 plugins/org.apache.cordova.file-transfer/tests/plugin.xml delete mode 100644 plugins/org.apache.cordova.file-transfer/tests/tests.js delete mode 100644 plugins/org.apache.cordova.file-transfer/www/FileTransfer.js delete mode 100644 plugins/org.apache.cordova.file-transfer/www/FileTransferError.js delete mode 100644 plugins/org.apache.cordova.file-transfer/www/blackberry10/FileTransfer.js delete mode 100644 plugins/org.apache.cordova.file-transfer/www/blackberry10/FileTransferProxy.js delete mode 100644 plugins/org.apache.cordova.file-transfer/www/blackberry10/xhrFileTransfer.js delete mode 100644 plugins/org.apache.cordova.file-transfer/www/firefoxos/FileTransferProxy.js delete mode 100644 plugins/org.apache.cordova.file-transfer/www/wp7/base64.js delete mode 100644 plugins/org.apache.cordova.file/.fetch.json delete mode 100644 plugins/org.apache.cordova.file/CONTRIBUTING.md delete mode 100644 plugins/org.apache.cordova.file/LICENSE delete mode 100644 plugins/org.apache.cordova.file/NOTICE delete mode 100644 plugins/org.apache.cordova.file/README.md delete mode 100644 plugins/org.apache.cordova.file/RELEASENOTES.md delete mode 100644 plugins/org.apache.cordova.file/doc/de/index.md delete mode 100644 plugins/org.apache.cordova.file/doc/de/plugins.md delete mode 100644 plugins/org.apache.cordova.file/doc/es/index.md delete mode 100644 plugins/org.apache.cordova.file/doc/es/plugins.md delete mode 100644 plugins/org.apache.cordova.file/doc/fr/index.md delete mode 100644 plugins/org.apache.cordova.file/doc/fr/plugins.md delete mode 100644 plugins/org.apache.cordova.file/doc/index.md delete mode 100644 plugins/org.apache.cordova.file/doc/it/index.md delete mode 100644 plugins/org.apache.cordova.file/doc/it/plugins.md delete mode 100644 plugins/org.apache.cordova.file/doc/ja/index.md delete mode 100644 plugins/org.apache.cordova.file/doc/ja/plugins.md delete mode 100644 plugins/org.apache.cordova.file/doc/ko/index.md delete mode 100644 plugins/org.apache.cordova.file/doc/ko/plugins.md delete mode 100644 plugins/org.apache.cordova.file/doc/pl/index.md delete mode 100644 plugins/org.apache.cordova.file/doc/pl/plugins.md delete mode 100644 plugins/org.apache.cordova.file/doc/plugins.md delete mode 100644 plugins/org.apache.cordova.file/doc/ru/index.md delete mode 100644 plugins/org.apache.cordova.file/doc/ru/plugins.md delete mode 100644 plugins/org.apache.cordova.file/doc/zh/index.md delete mode 100644 plugins/org.apache.cordova.file/doc/zh/plugins.md delete mode 100644 plugins/org.apache.cordova.file/package.json delete mode 100644 plugins/org.apache.cordova.file/plugin.xml delete mode 100644 plugins/org.apache.cordova.file/src/android/ContentFilesystem.java delete mode 100644 plugins/org.apache.cordova.file/src/android/DirectoryManager.java delete mode 100644 plugins/org.apache.cordova.file/src/android/EncodingException.java delete mode 100644 plugins/org.apache.cordova.file/src/android/FileExistsException.java delete mode 100644 plugins/org.apache.cordova.file/src/android/FileHelper.java delete mode 100644 plugins/org.apache.cordova.file/src/android/FileUtils.java delete mode 100644 plugins/org.apache.cordova.file/src/android/Filesystem.java delete mode 100644 plugins/org.apache.cordova.file/src/android/InvalidModificationException.java delete mode 100644 plugins/org.apache.cordova.file/src/android/LocalFilesystem.java delete mode 100644 plugins/org.apache.cordova.file/src/android/LocalFilesystemURL.java delete mode 100644 plugins/org.apache.cordova.file/src/android/NoModificationAllowedException.java delete mode 100644 plugins/org.apache.cordova.file/src/android/TypeMismatchException.java delete mode 100644 plugins/org.apache.cordova.file/src/blackberry10/index.js delete mode 100644 plugins/org.apache.cordova.file/src/firefoxos/FileProxy.js delete mode 100644 plugins/org.apache.cordova.file/src/ios/CDVAssetLibraryFilesystem.h delete mode 100644 plugins/org.apache.cordova.file/src/ios/CDVAssetLibraryFilesystem.m delete mode 100644 plugins/org.apache.cordova.file/src/ios/CDVFile.h delete mode 100644 plugins/org.apache.cordova.file/src/ios/CDVFile.m delete mode 100644 plugins/org.apache.cordova.file/src/ios/CDVLocalFilesystem.h delete mode 100644 plugins/org.apache.cordova.file/src/ios/CDVLocalFilesystem.m delete mode 100644 plugins/org.apache.cordova.file/src/ubuntu/file.cpp delete mode 100644 plugins/org.apache.cordova.file/src/ubuntu/file.h delete mode 100644 plugins/org.apache.cordova.file/src/windows/FileProxy.js delete mode 100644 plugins/org.apache.cordova.file/src/wp/File.cs delete mode 100644 plugins/org.apache.cordova.file/tests/plugin.xml delete mode 100644 plugins/org.apache.cordova.file/tests/tests.js delete mode 100644 plugins/org.apache.cordova.file/www/DirectoryEntry.js delete mode 100644 plugins/org.apache.cordova.file/www/DirectoryReader.js delete mode 100644 plugins/org.apache.cordova.file/www/Entry.js delete mode 100644 plugins/org.apache.cordova.file/www/File.js delete mode 100644 plugins/org.apache.cordova.file/www/FileEntry.js delete mode 100644 plugins/org.apache.cordova.file/www/FileError.js delete mode 100644 plugins/org.apache.cordova.file/www/FileReader.js delete mode 100644 plugins/org.apache.cordova.file/www/FileSystem.js delete mode 100644 plugins/org.apache.cordova.file/www/FileUploadOptions.js delete mode 100644 plugins/org.apache.cordova.file/www/FileUploadResult.js delete mode 100644 plugins/org.apache.cordova.file/www/FileWriter.js delete mode 100644 plugins/org.apache.cordova.file/www/Flags.js delete mode 100644 plugins/org.apache.cordova.file/www/LocalFileSystem.js delete mode 100644 plugins/org.apache.cordova.file/www/Metadata.js delete mode 100644 plugins/org.apache.cordova.file/www/ProgressEvent.js delete mode 100644 plugins/org.apache.cordova.file/www/android/FileSystem.js delete mode 100644 plugins/org.apache.cordova.file/www/blackberry10/FileProxy.js delete mode 100644 plugins/org.apache.cordova.file/www/blackberry10/FileSystem.js delete mode 100644 plugins/org.apache.cordova.file/www/blackberry10/copyTo.js delete mode 100644 plugins/org.apache.cordova.file/www/blackberry10/createEntryFromNative.js delete mode 100644 plugins/org.apache.cordova.file/www/blackberry10/getDirectory.js delete mode 100644 plugins/org.apache.cordova.file/www/blackberry10/getFile.js delete mode 100644 plugins/org.apache.cordova.file/www/blackberry10/getFileMetadata.js delete mode 100644 plugins/org.apache.cordova.file/www/blackberry10/getMetadata.js delete mode 100644 plugins/org.apache.cordova.file/www/blackberry10/getParent.js delete mode 100644 plugins/org.apache.cordova.file/www/blackberry10/info.js delete mode 100644 plugins/org.apache.cordova.file/www/blackberry10/moveTo.js delete mode 100644 plugins/org.apache.cordova.file/www/blackberry10/readAsArrayBuffer.js delete mode 100644 plugins/org.apache.cordova.file/www/blackberry10/readAsBinaryString.js delete mode 100644 plugins/org.apache.cordova.file/www/blackberry10/readAsDataURL.js delete mode 100644 plugins/org.apache.cordova.file/www/blackberry10/readAsText.js delete mode 100644 plugins/org.apache.cordova.file/www/blackberry10/readEntries.js delete mode 100644 plugins/org.apache.cordova.file/www/blackberry10/remove.js delete mode 100644 plugins/org.apache.cordova.file/www/blackberry10/removeRecursively.js delete mode 100644 plugins/org.apache.cordova.file/www/blackberry10/requestAllFileSystems.js delete mode 100644 plugins/org.apache.cordova.file/www/blackberry10/requestAnimationFrame.js delete mode 100644 plugins/org.apache.cordova.file/www/blackberry10/requestFileSystem.js delete mode 100644 plugins/org.apache.cordova.file/www/blackberry10/resolveLocalFileSystemURI.js delete mode 100644 plugins/org.apache.cordova.file/www/blackberry10/setMetadata.js delete mode 100644 plugins/org.apache.cordova.file/www/blackberry10/truncate.js delete mode 100644 plugins/org.apache.cordova.file/www/blackberry10/write.js delete mode 100644 plugins/org.apache.cordova.file/www/fileSystemPaths.js delete mode 100644 plugins/org.apache.cordova.file/www/fileSystems-roots.js delete mode 100644 plugins/org.apache.cordova.file/www/fileSystems.js delete mode 100644 plugins/org.apache.cordova.file/www/firefoxos/FileSystem.js delete mode 100644 plugins/org.apache.cordova.file/www/ios/FileSystem.js delete mode 100644 plugins/org.apache.cordova.file/www/requestFileSystem.js delete mode 100644 plugins/org.apache.cordova.file/www/resolveLocalFileSystemURI.js delete mode 100644 plugins/org.apache.cordova.file/www/ubuntu/FileSystem.js delete mode 100644 plugins/org.apache.cordova.file/www/ubuntu/FileWriter.js delete mode 100644 plugins/org.apache.cordova.file/www/ubuntu/fileSystems-roots.js delete mode 100644 plugins/org.apache.cordova.file/www/wp/FileUploadOptions.js delete mode 100644 plugins/org.chromium.zip/.fetch.json delete mode 100644 plugins/org.chromium.zip/CONTRIBUTING.md delete mode 100644 plugins/org.chromium.zip/LICENSE.md delete mode 100644 plugins/org.chromium.zip/README.md delete mode 100644 plugins/org.chromium.zip/plugin.xml delete mode 100644 plugins/org.chromium.zip/src/android/Zip.java delete mode 100644 plugins/org.chromium.zip/src/ios/SSZipArchive.h delete mode 100644 plugins/org.chromium.zip/src/ios/SSZipArchive.m delete mode 100644 plugins/org.chromium.zip/src/ios/Zip.h delete mode 100644 plugins/org.chromium.zip/src/ios/Zip.m delete mode 100755 plugins/org.chromium.zip/src/ios/minizip/crypt.h delete mode 100755 plugins/org.chromium.zip/src/ios/minizip/ioapi.c delete mode 100755 plugins/org.chromium.zip/src/ios/minizip/ioapi.h delete mode 100755 plugins/org.chromium.zip/src/ios/minizip/mztools.c delete mode 100755 plugins/org.chromium.zip/src/ios/minizip/mztools.h delete mode 100755 plugins/org.chromium.zip/src/ios/minizip/unzip.c delete mode 100755 plugins/org.chromium.zip/src/ios/minizip/unzip.h delete mode 100755 plugins/org.chromium.zip/src/ios/minizip/zip.c delete mode 100755 plugins/org.chromium.zip/src/ios/minizip/zip.h delete mode 100644 plugins/org.chromium.zip/tests/plugin.xml delete mode 100644 plugins/org.chromium.zip/tests/tests.js delete mode 100644 plugins/org.chromium.zip/zip.js diff --git a/.gitignore b/.gitignore index dce62c5..f7525af 100644 --- a/.gitignore +++ b/.gitignore @@ -4,7 +4,7 @@ .*.swn # Builds -#platforms/* -#!platforms/.gitkeep -#plugins/* -#!plugins/.gitkeep +platforms/* +!platforms/.gitkeep +plugins/* +!plugins/.gitkeep diff --git a/platforms/android/.gitignore b/platforms/android/.gitignore deleted file mode 100644 index a1c8ff7..0000000 --- a/platforms/android/.gitignore +++ /dev/null @@ -1,14 +0,0 @@ -# Non-project-specific build files: -build.xml -local.properties -/gradlew -/gradlew.bat -/gradle -# Ant builds -ant-built -ant-gen -# Eclipse builds -gen -out -# Gradle builds -/build diff --git a/platforms/android/.project b/platforms/android/.project deleted file mode 100644 index 2c889cb..0000000 --- a/platforms/android/.project +++ /dev/null @@ -1,71 +0,0 @@ - - - Momo - - - - - - com.android.ide.eclipse.adt.ResourceManagerBuilder - - - - - com.android.ide.eclipse.adt.PreCompilerBuilder - - - - - org.eclipse.jdt.core.javabuilder - - - - - com.android.ide.eclipse.adt.ApkBuilder - - - - - - com.android.ide.eclipse.adt.AndroidNature - org.eclipse.jdt.core.javanature - - - - config.xml - 1 - $%7BPARENT-2-PROJECT_LOC%7D/config.xml - - - www - 2 - $%7BPARENT-2-PROJECT_LOC%7D/www - - - merges - 2 - $%7BPARENT-2-PROJECT_LOC%7D/merges - - - - - 1390880034107 - - 30 - - org.eclipse.ui.ide.multiFilter - 1.0-projectRelativePath-matches-false-true-^(build.xml|ant-gen|ant-build|custom_rules.xml|CordovaLib|platform_www|cordova) - - - - 1390880034108 - - 30 - - org.eclipse.ui.ide.multiFilter - 1.0-projectRelativePath-matches-false-true-^(assets/www|res/xml/config.xml) - - - - - diff --git a/platforms/android/AndroidManifest.xml b/platforms/android/AndroidManifest.xml deleted file mode 100644 index 25b2565..0000000 --- a/platforms/android/AndroidManifest.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/platforms/android/CordovaLib/.project b/platforms/android/CordovaLib/.project deleted file mode 100644 index a6ec3ce..0000000 --- a/platforms/android/CordovaLib/.project +++ /dev/null @@ -1 +0,0 @@ -CordovaApp-CordovaLib \ No newline at end of file diff --git a/platforms/android/CordovaLib/AndroidManifest.xml b/platforms/android/CordovaLib/AndroidManifest.xml deleted file mode 100755 index 6fbe1b4..0000000 --- a/platforms/android/CordovaLib/AndroidManifest.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - diff --git a/platforms/android/CordovaLib/ant-build/AndroidManifest.cordova.xml b/platforms/android/CordovaLib/ant-build/AndroidManifest.cordova.xml deleted file mode 100644 index 6fbe1b4..0000000 --- a/platforms/android/CordovaLib/ant-build/AndroidManifest.cordova.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - diff --git a/platforms/android/CordovaLib/ant-build/AndroidManifest.xml.d b/platforms/android/CordovaLib/ant-build/AndroidManifest.xml.d deleted file mode 100644 index 51016ff..0000000 --- a/platforms/android/CordovaLib/ant-build/AndroidManifest.xml.d +++ /dev/null @@ -1,2 +0,0 @@ -/home/ghis/Workspace/momo2/platforms/android/CordovaLib/ant-build/AndroidManifest.xml : \ -/home/ghis/Workspace/momo2/platforms/android/CordovaLib/AndroidManifest.xml \ diff --git a/platforms/android/CordovaLib/ant-build/build.prop b/platforms/android/CordovaLib/ant-build/build.prop deleted file mode 100644 index 39214b9..0000000 --- a/platforms/android/CordovaLib/ant-build/build.prop +++ /dev/null @@ -1,10 +0,0 @@ -#Last build type -#Tue, 17 Mar 2015 14:45:10 +0100 - -build.last.target=debug - -build.last.is.instrumented=false - -build.last.is.packaging.debug=true - -build.last.is.signing.debug=true diff --git a/platforms/android/CordovaLib/ant-build/classes.jar b/platforms/android/CordovaLib/ant-build/classes.jar deleted file mode 100644 index eb9d39bef2275ea043da94a572dc2e7d5d88f0b5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 342622 zcma&NQ~mP$cQKl&`QXP(*H~X0LcF{6apasZ|L=zx~Jyf zaI?Py^~!%99#?>OdY zGIw_V-!mZo*W=G&4*9}B0RV9R-kI<}%n&d(b~JHvqBF8KaB`Ya)p9~nLHHr_%9vpy z%$k{r2bkjB0FY8vCI|olL57hqmLPE_Oq!|Z-q^@6p+k`O=VXwY`Dp-mJ*ER3_)=)7f{!H=+0E>xXWYV7)xs>k~r`kV<&b$NA>AIr&Zf*3Q5bjm8OXleGCePY#SlLEK3lF zN_9ign0>LZpdFSJMdS>K$Ye>qiB>f~AV1aQ(VyF?6WLrpP^)aK` zrqXkVJC|9S3#}BwPD68b92NC5FuMshNxPK8GUl^*Nt%s&TVH?=3G|_Eiqu4aaRs~5 zkgbT!2QAn#3AZc%tTi)fBF-OpiL)rV!IrDBg5x+^fo9#6lUXafoSj&Ei_K)4N@-e^ z)?iGvWxCmN!+9rD<+0P6yOc=3@7BFJBX9{MBDS*AG7s%;MZalac?rT@vvMvutX15D?dsj~)eRO7^tsRMFqYrkK0Gu(NqM7` zbNzBZj{_3sVvZ34ivbQYP?kk@m~fDHQ@R=PO>$eEq-tUnesqBB*e_Zrx_hPrUUEj^ zI|)gJf*_{$yw)ya<5-1MEXFgYEmzuE6ee=f+S{Fny0e%-3$(4EXgM-g)Zcy8emdJx zz~r0UgV!@TfYewXt=?*CA-c%IDYSAkQo~9)6ZW=6Dki4HxlzA8OF4jcE4h@?LnDjf zQ8t32dg$e2g5$FMHtl3ME?e-ex*bBw7QN6pArAzSAxXI(j!a4{JB;)zw2XkUwFtD;*XPhQjHBx;! z`O@z8&T5mB3WJJ?6~&2$jl*Hjv>25o;*G5*#GNYZ)XXe~b`Rtq|B9a&VtJM2n*u)& z&+|Ga0-}KnDaF8)biazpFR73dy-L=_f_L%;pIZ1p+BD-8g^R|M z%s}Y&bLbA!#2V$w*6o{Uk5NC(O+r>5kW6xj&~izt_M5OnH}b*RM>G)IN8B$Bl8(xU zOGOtkq+v)Q(lP25X&XjII1>|i@P$TjCftA*fJ6?MJc3M+Q$hteNK`{@aV7pBM%;D) zN>NXy9P&u7=?p_F`n0BS!6>3kbkq!fd-B-A_Ckz1=WEC&K+n2v`@k7 zLV@%}J{li`zrGEG0Mt)?fG+lkX0wRR-?%BlMf>kC!+$|*G=FngpeDISxIFRpi>TuMcJU5kjt8{4#vCuy7m|Mm=vuiX^)g$8) zMeh29w!nLgEx9NyA|w67kNsI)loz77^_n^&*Yzi9qP zH4=P5^3q50Ovp2yZxGH~`a`Z9F3%7%Z^7S3_LtsWv)2|&x3Q2jmlW`HV$R{u&Kvr_ zO2j`X%m>F;Q z{t6Jzpx*eM52kPaewgjoco5H5JHW32Io>x+UFv?lgHtTueE~vW%An3?YWN>0KU#S| z;;O!spfwYBA=y8&s&=MRlsB z^6>zkW~o98__p$4=`mhq2`U~)`K%DNMM|~mlzoq=m2s~?QHyP7ga5$lME#BoHqTi> zOf}l?qk@^{5t(OOO9WUJC}b_x-zNgWtya!SqTDQ&L?|t-Z9A(w3#%)u>#JK5;~Q)I zZ>38Hw>~VsLQktIch~aB9hqvJ!HG zLPaQS_z*a7%3-lpZOVQh3}x%5GcbD~L@%?26ggBaMPddB@J*Y*1Z&J%Xl+UUqC1NS z9ukc+c|tO$FIbO$fnz0m4MZI6Vxra?s5coN43Mw!Uvri198&KAT1J8qGwg~a7+hZ>ZXkBzXIlko^2AOLu;uTe1H=KQTZ~ldL#@b1wL-^B8*X3F2c)}VJ&t&06 zV<_TDL>S181*Ptjuuf3$un1<;1~|el&Ae>!sT1OuUo?5|-qqUFv~l0})o#%&x-l9e z(Bv?f|3yP%^RRUY*}u$~^hmj37Z~l}Icak1f`D1jv9H zE26;_tC2g@Nb$KPD9mQxH#YmZl};$Y-p^+92iThKz8etSzy9k2f$E+F(%u)T%A`1c zWl8;mNuoGg;W|B0OdU8|VsggXjLt79avB31*lJxm6pR@)?gfmdh?tj;w@~QRh{1kd zT;O!nhzCvXZMHVnbi#tynwi)d6qwM-iv-W~Gle0BBCN6@h>;mtt+YM19}(NPXNDTQ zHmG1+*|(V-EnGAPLu@)UH$DfSHz&cpdTbpJm-9t29a%P_ z5>T(y*yo*ZjO%4{nC)ss*2_h6obAGSPkZ@NjdNBk_Z?u4ExGAa&|AFhXN6diZq87h z+}O7}{}}b)pD2!s!_6;=Z`}Lnm?8xe zQ~XzQKI#+^@2kCxz{X&i92-`vHC;a=nH+-e=-4q~mpl{Vg;V1<9$Cjr#|ZE8!@zzY zK>9Q1y0<}}#!mdWGH<7kqiLO~Bh%qF`yzTA_z)JuS9gR{=dGByOLtZ66OU}-WnI2E z;XK(3l#I~2v&^GRi8Wb!myAReZ`R2tSrUt^__E%h|4PehHWtt?cU(7_QDmYqcoQfDBhX{i=5noI;OTw;B0nJAJt*> za4q1(anE$G-GqGBy{J(lF-|S*v=iKl<()%W3zJXEYX#1pgM zd_8?A>C9VeI-P)7M;;TN!xoewZ3@4`j1BV6?Pi@7R&JH0H%03`trxnH&%1S8NuFhQ z5<(p)sC1K}+7G zg^i)aN#nIu&0b|n6&boXC=Dp2FTVXgXUUb#x3Ft9ZP$-KWInW#f+2eHR6#mphjZi0MyJ8y{b>nd0#S0>cT5)OqabIsnIWQem2aGjqri3L}e-Q+ChYP%>>>$n3!6w z-RMes=44yh<7Of#=1i?k#T7NFdT-T|EzRW7`89HqvEI(8Py>kF$0o&>h1Xqb zce1FYa2X$b64#qKB^sW#tC$*JY}rP zBhj1wMf*7G<^o@xXq{F~inPkMDN|sczWeGHbpqT-Y!uskr1S^zgC|NAu zaSC%o-Q*fS0#rqBPmU}+uvgu9zPDp0PbabJxI{Q2**Y(=PkluvB6rEY9KQ=J`LHX| z?#pHAIC7$duN`clQO3W2gd4Z1+v$7o$0PmHU_r+zklS?BFAbX>?Kj<_>lcA5ffibb&d_ z$f?30`N)LQZ8wPIv6C;5Nni;_z=J|6aYr_1q=rQQ#wo)oDT?Y!bb%oV))c3j@N`DJ zEvFTBJ8sE(T+EpOwx@<@P~QhbIN+*Nyo*QtGyC|R0jZ0MBA(dA;Tw)s#`48u_oPA< z{hsd80iSNyTXm@0?HI5`&Jj&msJFi%jjEIi&|~O+ttMOOy9%>RN>WyTXQe}R8?J#X5Vm%A_JCj0Xgy$QF%GR$iqC$8ZXAhA zjz}zy&`i!q+hd3egD(8T@s6;u&-K!wt2OlXCOxyu-jNrdEH}R>a7z3k0YO33!cI3 z_Qme-I||v~_gYm%u;WSNT-Ok(b!=iN2E35^NyP64qi|EKFD7nGrmb=mqeVDx7Oo3R z793lDNsMam_<@Yc$g?&W^_+>xF-q>VV+Y6M!+UjFo@4U7rJinf@?k0RknH#55Utq=?-mYf~rBB|z zuYbxLq1R7b`i)ieF}e3?ne->?=%dqYXrI1ypYSi=lH`_5)W+a%&Wuyf_gkqqrnv8~ zS5#Llhn)PHNzmwHmRtp}4=QfmMSYvAjlw%9$b+;i&pSL7_}L;OlpN$-^-`qk%c}@G z`#@i0r@Kp*C>0Jguhsid&rNL8&GDp&LMwMHaCd6hZENstCk~^cu84g{4?44=Tf>`L z)*BypEM>bg)M3XmmgGa4GWh*-kL;!dTLX*^LRQPisk^&n&O$O%mse&?cfYjJ1DdcA z1(GX{oiQ-P%oK@;snLcquZ-$3`$ve$v4tAGko9QBs~MO&x5f2Z=k?lQ3~)Rds2Awi zM7#PF?PQV+6@2CRQMZJl*ENP*(ld55dl3edL??f0v_tiW4paVACIK%mm{^A zLtAp<+Xd~Tg>IITBW}qFwV7lD-vtGcD4Qvf^Y76s37;9IB?@x|tgI*;w!R5#GT5#x zUO9|(>W%MUT=GxlZ2Q$cxN_^jXTy8NN@2=(1p%q0^}NgaU+BAvS7mM_yRt4M$}`#y zVu4E8#kLlRVHL7_J&;>ezD{^;Esia{-xeVd;3ztKa_@G0yFUDe-_smG+bc%vyG*gU zH;p?cr}}q#dK!N)z?4g+F38m-;g^*+u`2Cz#sXM9m>)wEem%@ORP336mq?ebJs_yr z73B8k>kQ*|s5SoZyI41>+$~y87qF^JSve5b9CCHyd6@&#{EjC49mrh{=(g0V%zHvt z2f90uS5HS%y$9n#&OL?0=aX@qnEvb7{3cna=yCmO_joB=g3Eh^vcd~Pu(~7oGc9Ma zZ<^xSkszex5>rgr)ied^R=5Lyl0}z!vK%z3f^~*ARl1_X_A4VvTu*5ufx39@)5XoL zmc6fP^O&`(^RauO_Qu=JPOa?(_u|6U%c`rh=Y2J~N|JD;kk;j1AYVq>LIUfz-{s1t>j z1|%q@oFw7f@`+m;MxhF5N6IGaL>-ijItIG#C^i_wg%y^>&u7 zDUZp)8A}43C?}gkIUyBpxyl6RCp2Siuz6yGK}%AT-4wB~uB$Jy3Iom#&Vjmr`a&?Wob69cF)GH>yWTC7_Fh>TMZveztqOju8nC*dV0l0H=(STY4V*@EsfdN(R#RJTH zK_DU}S^Z&PWQ-;InE`RhM@G#S?Y4W!-j@38FLz9}CCeI|Q%#ih-yP@PI3DJW_TE5U zs;9{1;vsFED@A16)5kP#YSrHzTh{nwWXbe&n*=pidkp9+Edpw` zMw;qOwwG9eA{3T>oogU3(tZ@25(c=0fCi9#(`m`7%MEVU4Qd%xagS=I`MRBlRte)O z-5ln!-cY4orrAb5nda8ZRHV2OH7EJX?dUeAto~_0C9}@a4)3H}d5d;!R-7bZ5bIej z<^mwkcIAsv;9{|t=H3>w!i(#)S*<8+2J(_*Oob@PnxzP-d z=Cwo_=@S^yzoIMLh!m316NGv3tt<5kPbt$FHY;cmOIqNpMou54Y^g+fgY)#Fk?=9Z zVx3^xN*{qHRdh~?NmTZWA> zKpTC))^(uc*)cczM!dN*cjehvfBqc_^rOG)1tJIWMifcF)9`3~F>K(-LNw|CAY(3? z%-5P~(pFA8fp>q7I$8J@#kv^SQzhU)u=>NCCx0 zvJOlb2!=sXZ*v+LamlwG(7vJX)p)}92H@|ChBF!W92sGCwx2&%sxB&DZ$eRoF18VD;R#&e-+~#5-$yEk+#Ho|_d1<4RP^G{L)ucatPX zKVhn@zCo(>m@smCkzk5oD~25wEh6s%*?|SKLti}XCxkLSc<05T4FQ6D#1#wB?sHDempX3-aejEnG(@$z?>Iy+bNpSUn zk(Db*eQ*8)#`gnZ+|!REiD`v{?2MH@j3UZxfCbw44EgWxO?hcH!4d`lKmZ#6fZ~5t z)c*0-a?~N+l~+)IZjBQ&q;un?1sQ}10suA$tm#M*VUmi$$P6%nLR(AYCWv`5rlXnd z;?1jc>bthLpj5TimUGI3hm{rND^<0wEvstOt6VHrEZH|LKX%!@m;#o)cejqWns)z+ z`1Eq#_J4u^Qp1-V_eWVB-)eDcUG#BloA$lnjHli|H^P5dj}APy^oL^Lj`q2@Z5{Va zw+{SazY}l3*|skD0d14AHjRWe>bTmwhC;b<(__1=+cyJ{wo=2sF~)~@+t)%rtvUAk zX|&1D!Aj*L|Y?}0zsL%>h$8$fbj^&|2e^cQhZwf%D3W8|Sz zlM_$I=e{G!P29{IUy-wM*Sz?OhW+KV$6_%wcl-s-`K1WgmuTLX>X@5C^&@KQXEo-O zIP!?})y4CLC*;~q0E*jmD8l`-*Dv*Ew5)r1Jci?rS+{;iZowYo2V1v!7YYE9tlFms z-QjJ?Q5^zm+RU1}bga3yvvc)(xwCeAsl`GkZEAaKeWyW}zZoj~2aa+bNQNTn-2x$Tlw5twbY)75Y87TY#FwsFR_qSrSSVx&co+41mYd!UsIwZs`^ zo3@h}jDUDC=-qPAH)J_7mpR2-bYN_%xN4z z6KOd3MTDMLO5eOLS-_rc6*jU#H)}B|KpQDFR+Vhf>N)|ol39{fEidA?Y_!dkRJ-SJ z?kc;cti@A4Fy^eTXPDnRqG!o?GvZx%W+p0`dNOVF_~6;eSyJ@!E=8mWSchdY0WpYu z{Hi6*BJx8Pl&b8vFO~vHLHM9uu(nfA>;?QB2a>ms#Bjw(G zrpq2cJ2{yN7u*HV**qtUipk9t3YLm+iR&z|Q2kt0#)&@9>F zq|7gsWK>$I+fhj{Y2u;KWMlR+iPqeP@}0~ zQ7$2c1$Apg(%2Q#>GTth3iPRYp!h;*q4;9uDCQB2WsM&Io@dpc*{&fhEZdGS>YCWT zGzRqUO8HGhBPr%q_(Hi=b`chc8ojGGDIcq8bR@8M6z|x6s8GGc2FME@wz(P}sZzxQ z-B7KA)CBl{E2k@$Frp}a7E2(V+a(#bFNgL~zk&Z)4E3RCN53B6EM4L*u|nD$CE+E` zpU6`nDB8nup?+a^p?rb=Y1#Jy#n)FhK<77YimeMG3Knh&r^%|PBGR&TyvrrB9<)X7 zh_nyq$&yELNK7vbufS-D@D@RVC?kS8mJiOCkuEwYR7YGInTVu7WImWQE$5A-KrMri z#>Y0RBJQlyg1#>vqMs7UK%`(^&ZTfMS&3v4nMP?kV$eb~Dbz-E8rBw34)<`*O|J_F zRkW5!OmAVy=|&O|QI>G2dasvYr;!9{C9)Kzl~Utk!Mq7M0sKr!9-AjaqcTh=Z;BX+ zR3}P>n&!NBnd)D+MV>-w(9WK;Om-gXv^hnL0cCfhJL}N|e@qFPUz(=KPj_HXh|(l#Bu}B8 zbBNWzJ@iqQTx8f$Z^NP=R5@sj)? zHEL8&D1S7<9N0Pt%4(tng#3 zA0rgcSm*8&P~S>eXcbx~C#r%X1;5;JB*0P_kyZp2l-Z}Hzdx*E;7wVFAB6vU<8XH^ zN&tnG1s$O~d;$Grjp=0LAW~kD<6{+tm&hwJnngM}IXTUl`3A+U0C!r_P1EfOwwyj? z7B?rVVj?RoA&0j3@Ow23NT7Ge=ON34>83jFkKUSu z8=mMCps~H##Z)6ozYjbX@d&Y+Lk?>&IVjx|;GKu=j3nX_0IEs~o?kf)wLmJyPkXK#UNHrh6%AOFm7lKP}ir|mlV(6oE(~)J>IY7s6i6t8C_xULe zs%j*ygEU1?2bZ$XJBU&@)!ne_AdZfc@t@XA;+C**%P|%di{Brdv3ca9 zc)8k^mHFuhl15a*yvL_;yq42)0*m4zR1{QxAf$_Lm_rmT`WV&|txrM@ar$W6ET8lK z6E<9SmZs9Sj7NX6du7*AgMG6S>Bh9REhg#6WGP!X@d=Y^iAqK21{n+&vUziK|{HvRh6-k0n;xd6d9t{X&M+Ee2A5f17g7XQ)hBv^y_}qBsY~jj-Qi481#Ohmbq)<_^}lXD-jB z)9Ffxy)%Xld}Hbk^UN-8s7|({b8YEr6J7)(hmo+M*a~wfcA#e ziwzm2cx7UF!dlY41UL=()UPWj0z0d~TJoy;z+|HI<&N^Ll4+kAuDP-1rtuL8WPZ1* z=3RvM^14n430vf4=MNB}u{?IxM$TCk*vG9N!;NsaDyZytqVbwz?$gy@;0_h+7OzZ` zcm<=>E8x}@;ng)l^u{&2PwIxWYsBak5$l^-e1&`O&Z3BR5+}_eFH)4_kYwMcVE(3t zG}9KqIgdU*r&>!NKyjJTO)l2VYI);Sp%PcR58>^inO%bQuyfFu>k-bo2hDqZmnu}6=$X;9d z_3_)^!Wt5~h$gmahLgIYemq2lBcA?&L5D)w73$*syGQcKsD(nD#E;i+;i%4dcr0lb zm6-^C>aEx}W^$~E0jdLrXm{4|CnjCPr6Dnkc4qxo=}vC0qFqx4m9g}J-92nLvKG>C zDmS@^H)ow^w=rYuq8UM{Rju^aD01-RZ}-|J3y2x399o?1**Hh*Do!Zy$Ac^1Ba{Lc zmuH318HClFASaNU+3JTN^DcCg@ANT6W|=_Cu=!kn*%SmX>nv-~N)3Y|Py^H!t|&VP zVx!p+&CTH`bFyYoYu$H*hvGH*q9UG%>JNG;y-G zvvo2Nv@`bjXY-<@CATb(@FUwMm8MANr~(2avJI_>-fa}!C<%fl;U9mtY4B>?*4f;0 zjrA_lYaSR;em@|F|D`Z`ZsFEpv${9L$!tcqJI%iI^YeH}?$3kfTx?&0j8!^xSs829 zUP~M!U2eiUZJus&_8ff6)k>cWt&5gB$Dl{U*;V?db(UAbP3BaF6+(Nd5qN*2+jMem z^u8DrY@`u0G_vlU+g3BS!@BEPpZN}Cm(*-bXsR_(45sS*4}cwH=7y;}w5$d~NTEp- z`tvsKzRi6Omc~bvY{Xh?hgrz&dO4U%)Y-EQgsxSxy7QzL%xI$xbe;TRFFgg(ZsS;4 z>g_|mGV0Eg1c+gJaj9UrFxO+GfZt0m$yR?M04zIZrz9L>b5IR$8dip+nWm~bvPo1J zAv7VdMCa&rq(n4rm*D6PMk&RWq^5}-DRs8UEn(IM z!xlgL0~l8U_E}(o!E8T|twp=d9^4I9dl)3_E9NwFtmqIh(H2z&A}j7Sf6Op{)BE!Y z45@;q+s||!oRFLdNJ!BTzBSC*oB7x#UGU4L;~Y6>9$(J)t<4Lr>%#iB@TUM%bPF~X z*?F4mf?sX^uPrQ#@BIUDvUBGm@MhyhT}9zQW4jk@bv8EuQf?>zVY7_i3~ZpD55CttGaJ7F{lU#gHiIV2+sl!kp!j2d$sq=)C7 z8g(8-=W+97Svq`+CzPXy?IS`F7MP7ZB_`#r^2B#|60>q}h5%9| z_Q9lE9{<~3{STX6TBrUY`rmXngZ|GpyZ@c?|H$wjRShK+H4I)}XkHjtB3sN9kwd2b zv%i(bAW&hLVX`ntlEF%DF2w?)b4)ip-KSH+&989(u8>qY<# zoP<80@}_t9JJso?ZTkE0R?ipo4y#wL5P3}{dKmHN7>hBI5%o}lWzQ1{am!p7+_sW} zBw^U4BVFEsI>K~I_5hA7>kh6|c}wNq7Rkn4u6EaMP}ZBE=2!Am+>xT4AY!O@@=<6! z9@+6IFX|H2B$YI14QPQH)L_l;RBF1-5>QahoyK5h^#vWZb|}|y@WDIY%?yOuZVL#| zZDQt+?%ZeIrbJfjsXJUTb=?=$4MflLP#d*SOSErivg*&?JCXBDo#ffo^we!1@-#wSi zP4YSuvbTN|pdMVECgG8Ryyxgql6ZQb!3UYx~UJLQ8OvuSD2Y8p$ zv{8wHLC;Qf0plDKkehBW4lBtxuGOjw66e}N?4Ituo7VKGsIX4;D8-kW_0wh|=Z+(6 zrZQF^rPcD71FLsbjs>heu|xKOS% zQMDa$d;}y*uDe6y?)is+@GRdz@+{wAdPC>#Ln7%}y+i6)y@ACd`%>bHcD^`vla#l!2zguUcz%*<{Q~D=1RQQ$4*@ zw^@=?rcYtZKy^EAhsTPC?Y65C9cZKB%o=pK3g`67rGji?6X%#(+&uAJy_vb5 z=%%taV%Nt3HB`kLlB*bFMr4_x)H?D2i5r$uL)kjDf(Wp3Si;^T#jU_t_$7xNp$y43 z20@^K5lq7Y@@?18p_xBuEb80Tc&V>^G}42B^72XLv`_=C)_1wIojDLN%* zaGQO_=o91h@ijep!z-PEUcWWVBTR!>25I-8*L(zNG0Ims@Yi~seHSN3r2kyNMBdN4 zRm##2z$In#onr@dS;RX`LJn!66JT0Xv`b6>3*uwRQ^w%x?FU1WFNrV+W8?T z7+gTX5Uv?)hG3)!!a#3%gSB)C4I?BKa7@y1AFwiPtUsXt&LvVN`N#|Za){->gZMvi z2~h(JYZph8e|^dGiI#yHWIzcf*Nj;W+>Y8CY$-59fTkM`ArEJK8cSdPa_2zD>lcbZ z)cFi$AL{qoeRS~ypomwHk4z@uP1g^h!6t=lOk}50@34H2L6&CMq&URVxh}4oi7*so zKtCDWVzs9h8k_ET={4%>GZF9)->{^;)^s>6CLaIAQrcd-{YJ`6l}d zs(}<^SehZ4FE(ow`@!P<4EEo*=z#1<2>6#S{a5{<{J(5b(8a>q*u?Rls=V?at0jIM zpS2bl?4qibcbiqtHH)l)#RFdiRg`S$;KF>Py|}fjdiJK`E|Sh)R)I|Nckp*{NWap+ zs&vo<_nh21UUz!j(x&Qmcm06QjEZ8ZZY~=w2m676t;i{Z_cQBmeB%kE_i^VJ|Y7${3rJkW;a4aV< zsa`PAdP(X>P(Yj)@-1Zm+aoXMF)h_4C+3hm`s>+y3ykxAO0p&{Wr#Qwu$zRfkTj>y%2AbDpwj@Vd&*TbpvVO_?+BGpN%bqs!zLRHhu2?SHW4q1T zOsgfIO#HE%c9iUmQU%LEC0P3EDX!haYLU56p%h4BJ4b9G`9EnlA(V7D(%(Fq`}_U- zKmD-v&!h6M{Lzs^7C_-`(sAAFl%z#Ns8*(!hd0sEBjke^NN35Uc;M3^b2ZqY{Ve#R zks!gq{{sA>ILtW@gj{yjGrh^_INkEPx!T_K^ZfyuADJSOu0~A|>w$p21a)LDZlSCR zjVO&sjbH=DsBY_}AJmBxO9+?dF=NmpuXQ64Y!q}z4W}?If63lkj-5rqi!?R|ClBJl z`;9NUwh063a1(BD1;!^-;x^r9zj^p$_Nk8mrsuJXjAC@v-izI5XwEX)c-mw!h7gZ#ngk2=T0X1Y4`kS5qWOh;(4`cW)#VfoH^{Blq9?nH7~ z$H|rCY)*CdAs#YoW**N>y6AOLYl2FuOp%V7nG=hA-1w((uBcau3uw*CPrw$bbH|+a zV7ojBD(I?(kDygb=_93p8iO49BQXP7Jp{!iV`_M&!s0PYNR79C=`-#}8@8knZY>p- z6-xZ#{H8)>m;ND}`ypLBiB(PM9&hCA#F^?R)YSo+r$T{MQ8+dzScR72E0{%f#S4$p zxXPAN&OCviEX6TpQ^Y65*Z+aN)^0%5dB6Yw0e{UDwEqE^#Q**{_^;+o$lz~3_b(LA zQPr_S7DM4h?sDzk@n%7!w0ReoB8UaH7R={IM(T%MUzR8aDPIOJp72bjad4gS6+Ujb zP5I~t=0SlZaR-MK90va7j~~*`+@(7@m&=d z>=G88k!U9M;QQBc%zWzX1J4t39;JjYpvBC|40q21!8#>ppX`7C zS85Mh4M?vFE1J8FXZ3zv{Y5_#qdjftjwydAo*EBC@F_in-*&}#a_?S#`FI6|yGVO3 zjR-USkh~Km-s;71`^FVllO3GN)Z?c6^x{zd%pa4;OgjZZi)m(K)oRwP&j2YJKm2+{ zJzAqas5PM9O&zV0gBl%s@?z;sA#D7W!%T9_FNPf5YCJ-&Nx!s9+GWh5sO*W_)FfR< z8&i}7Y6g8A`_eb56Gl6&XV4Zv7{wo`QnMc_BWW~!lV(>taW>!+hJPY;AOJd zp3N^56`?0_^$r=}k~>I_$)LC-+e?kzo-HYi0!7^3!RepbS)VRm_)wu=J9O=p#FWba zCO|dk6t$q_V}v39Yk$YGUqZp#u0nQh+PQej{Mz05Yzp9^Ot{5`dEc|qG~*`UxJaVp z)VNCTEMgmC=;>tXylK+^{%%A(i%Bh&qyI2($rC+Y5P{D>9@`B(-YvLfo$0)z-9UK< z_@nP%T|0^e#t8BbRG=y-NC-i44%qn4u76lIXH9$`SsI~(@P{hg`wUHBeBt#?;5&CD zj-$}n*a2mX;>BH>QZ3Ztm>i4T;@B)(9!Shwx<;CqvQQikG9?tLA?Bzml?9IycBnwD zS|Ezm9780Q2#e=QlVpbQM=%(lv?Ivw$9!2rX%T7ui5H18sL6py6nYHgI}Y;o6a6DqcRSGt{9HBEY#D#f?b_X~`|y+j)j&JS zldQ=3Ccg{y2sETenLwz(h=y4R)-6CEi9~o*dzh5;k!eGSDpxmm5;+g>-zi8W0cqRI zUuOW?-_r3vKk5H82ju)!YW|jyA5*W5#aej*DtED{W@v|mx6py%$b@!tL)hCPS3|K@ z=1W}!y_gR_X=S8;6q1Y*f(X_Mp6Tfh-_tB7Q{SJDAK-qSYU%voOO<4YqDUyT=w|)H z(ikn6Sw8rzhy#ViwTc*#P)WD)1Scsn3Jz1iRWNJyAOJgJ~tBAHWd_7T^2NN`rkC=*SMjEVy_@W z$@D4isj#jhUx~M&#u+az{X@8TQbq7FBhB>ZaQfzPG;hJJ=tL3ClEVrOtOvHZ)lAc| z#WV6yf;kAz1tw?8?C?N{C5ZsmTVy>|O&kbuB^5hw&_A&QBrjQ$`Qp!(TE#xwO$|r+ zA+5mJtl)6k;IP`p>R3rELtl(qR5CI=BO9YkL%;vDWf`0l1JB9TPSkUtkz<7;+2LR8 zbSWugu^wYd&V3NJVtc%tncYlIjVME;zM*7W@$q-%w zTVE1eu9o4fa7N-6&Mr_Tn&cAEAA6)ZkhbZJuqsPrl4*g;NXv^-o+`Zm9~_nrunqj~ zZvqMYEf@du1Y-Ut4^iBdMOHx3Da&#F%_S)?5=a37yj01dP{e00J+3Y|G*8w%0FF0) z{uGRfbF$o#|7+jvt(t5UV-WmJVbo`m_8v*X^hNhF+h>aFb8PNb3;@rtBM`ehMPX1m zW4^hN-DR4>Q7U7T%hY9>nI>!7P2l1k+uPjJaaVfBlm~5NKH2Vz1vfK`2y>DGQ72<0 zSAX254MUQ?n;|^#iBza}XWeifhckbQkv&|Pd-FD`ee9DkN4kCSa33uWctj4)>40}A zx@!!+9rwX}&34N6OF{?>!w5MwB{I z_$ru3LU>S~*KXnb7LwjXy<46$^u2H7o6h&%KP%)~LdjF0+4M5cn+JDn# z3mgD|?|;lP{ukF!G;we-adMWhvHx!yXO4=L60!io4;Q3{hN_4F(OYW1hd(4mWFQog zBttlmAf#?8L;8v_`;}0SmgRf**+>(3Rks4Eq{lo}$9oZtS89H;V>qYutMu#i+V0cS z^w-<_F}1(!R{4l3PTD~*$~IN&zA-HkM@i#Z!a;K+^I1wPA1b$l>MVEJ0nZ023`IM? z{Ox&2c@}%Nd8R!}R#POU*}{^|ev0DicK2nf;tm8&jJ(v6xx`2KV*Tr3(FU`P?VEe{e)-S1dyI4L%X(PPt5(&V zHEUKL93sp>*To^0>A>xIR-4JFF6)QzU0TtACML6~&0rTF^+p$4Z9aG^8*9Gipxc7= zN`US>dleB$C`nrZQKTZcI$P9EMhN8^t4^vBZZ!-!>k!gWLj}8LP|5=>lRN)Jbh{Fx zq{P=%J*u1=opuKWBU&I^X$xY z3aqOA+;<8?(5tQ408s$cyPf0j4=W80vV@5|5dbr2_~9(`-|)v7D7t!zKfbhsaaSY4 z=c&%C}+x02&5GVwK-?KF=Z@Q0aNPdwHPOg#&LNp2`6Q5`{ z>2ftafRwp?tGCu6^MwYIXXsOu!7^OpDFbAeXYS~|9=$@hpUpBC$SPh@VqSlt_=W|& zLP+_ZKG&9uW@@mR{FFE^i{*K&EwoUZOO z0=sWOP_32yj|yVwBn2e!*3#|zuJHEs9E95lmH3S^zN{=G^I)St+kd_=;ERCeY6g8B zZSt<2?(P0>ljV$ww@O*xaclPNvcmiSJ8u6g12n5{e}e_2&k;wTaIUb#KhU!I;BfUb zcGJ+Tq>g|7LK`p^{e~spJ#f;Crk|k|667cIT}x&h&}Nx?`0z8~N3S;THo#xi)=FXH~ru8lDoxZkx80EDnsqTf(55 zN6O-@9vpskpVt&BtDa%OAUWe{N6qn=rlJCkWm^Cm+CWQ6Q*pW)F9pqVus^Sg3t_gV z{AZhC#=xCY=q;^BzU;$RamLPBdI2o9NyEv9`72sE7|t;`>@6 zK0_Phhi7VGPVMK{Q$Fxq)Z44|x{Z>SXR`-aRJS7OGq(YIoSv#?55@Llt-vbooHitlf!bU16q(i}%5nG?m>?S#+gxN%zdrBh;VY5c zbE8M%hEU-NS^PCYE_qUu-q83V-B;vV|4Eiie{k*Gl9)Md%B;4j;jspX+Vm$^G;r;7iv+uch zdcWD{5yM~cF{5;M(nwH@2pzg!1L3Fk{qY3!>cIU|<)K;=b@Vw``p$$maTKozS(~)d zjxY<)a6>fGHp1D7y!p!ml=)N4!Jnx%v-l(A5+1?$j28s6(gMVi0)`kLQLKDHaGyz#~a~~A58zpQ7>xe@;yrQzg&WfHJ~+g zmR&z*OwG2AZ{m0KqM_dG+`}-K}Z9Bi#5;+giv5wreRGHLsQshklO;; zC7)QO)>&OKTphK?!Xe368#c)zJBw<7WV-Xiw&<&p*z1;!tZp;yEO20O78boPJ>FNH zPg%}0A2V)Oyk8@Ls~;BR-p~+nDP}?$>+?R7`-gkva>nz01hoAW4uGHl^CC|*sGP(@ zMELjkaAuit0Kvps?&uLk@k>&;{2mKL4##yVc?ILiaIWOnk=}doeJ-0~cyE%e9^;L= z$K247$z|;g$NYPB*fWpjM^|_+Kp<(C;6{Glr@v1?`ilYLb1?|<%j_Q+s^7`irU=;Q z;1JJ^D40I;wW;D84S9ycvd9mHiJIE9XX+mE0RiLPvuAlM-@!=rVt?6;<=}sr4LAN{ z$D$0M+6cFF3_Z5HJkK=&UpKqn%nu>q9MBN);Uq;K@ltS3>6~JA44yJBaYVoL0#njB z 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 Z=hE#?&kf(%5KkxBz{1%n-qD2D{sGb!A#eZy diff --git a/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/Connection.class b/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/Connection.class deleted file mode 100644 index 7df0e4dece9d3be8aa7c351a88fd9de211a38bfc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9543 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 E0FRC0NB{r; diff --git a/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/ConnectionPool$1.class b/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/ConnectionPool$1.class deleted file mode 100644 index 57519362900a9ba2badc1aa4fc00b3efd7633fca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2542 zcmb7GU2has7=F%ncZbf7&=#naFAJ%#Z7oYHYAvNu*P_LxfIy*qPj|=mlzkcNI8HF!fuAJRJB#DE$OC-4^DR>Po%BRX`vqZl%3bySgu5;%tA zY9POk6YBI`wLO`@DV$cru#Pi0t5ed5hI1OuYq%f~55}e6vR9xblXWLk{62hpp>Qdu4H5%<#j!Ac~zJ6f$6N3 zSGnP9xJa9qIsDk@1QUnYwI}76V+I9}5lqu5Qgn|BIg@R`$=a?jow1`A0?7@sXg8QRjx%&Fve(VGI>DwaLPon_0z z04#-1VCTy61Zt9DH75tvq?_5S<+F3_W$)-+T`#B#HG9ETD_6?)4Hca$bk?yiuQR|D z%e*)2s>&1CLM@iTEi22$YQV~gKw{kVk9*dXbPFszBA*jjlV2ie((kwB6or<}>s02g zveg}7u1kNQ*b%6H@`!?ud)B0@AlEKeisH>&PGDoQD#c4R5#E#jAe%r%m9GDx3LUma zmf941M!7JgrTI^7U84XB)PY`T|$`5aA!t+uFZ?XuF5V zXWT`26Nr-s7{(5cM!43o6EAYdw*z*QiwKd;MAS%%e}$Tn*gZruH3!;0hZq_9R!#R2 zD^2r=&qM2pHbob(Mqm~v)T&nC8|Xc;rr10ZvuJ24u^aPvZWhgoWvxJaQ)~h2A~@5& zfI5NLC#au8y}DCBi}Gdi?DYae9Shi?)NkZsV^MqBbRUg#i@%Gz^hyJM!6SO<5q=Hln$VjQi~?{LwHQGH z=g4&)NnAh|F7o5y5>DeXcUNGsC3+aeb!2gayPFupZH(g%yW%}e-~k)s_iTGVvg`fC zruQ@Q_>Fz4+klu6)}!y(S~+JiLs?byUo)g?J+rCB3~4LFh@GD zM`ekKm!e&ZzmURSMm>Q)`T5jE8(*d^&EzWL?&HlOnpze4Um^di_Pa`=^Na diff --git a/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/ConnectionPool$2.class b/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/ConnectionPool$2.class deleted file mode 100644 index ec2700b00b2f6983617950d176406c0f53c5543e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 650 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 NU33lWC!>+S{{ecUF)IK7 diff --git a/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/Dispatcher$RealResponseBody.class b/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/Dispatcher$RealResponseBody.class deleted file mode 100644 index d7030e55ecca179acd810361ef27f8da19be4931..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1457 zcmbW0TTj$b5Xb+g+oek>EG{=iKv2}ZAa%hz#t5rKV37m}iM}0nPj;(ITidRYPvnax znur=7eDuK&Wt`LQ1*Fl$hn~xH<~K9{X@CCu_8mYGOFB}x)C&!>a=EPI3a;wNA}3FI z4Radi8PcBcUB~vt6Tz#(^BES)73aY8Up2WWny%@*tOtQ>T6Q2jn>WnxwtX^ai9xY! zhLQ3M{+gSXW3Jh5GuR0{!4K$V&wb0bf(Hy6+5dpYLUVfzYRRbzYN2e|;%W0>UwFHG zzd@Ev*{Sfx9``JHZyD8~Zc%%K+k!XR^{+V9Lk45bwuM(}aNif?QH-tek>$HQsMLiw z`zL`qOj4&3mB{9vGw6@sRD>H?q^pMO41E=cw4+Y>KMIr3>*gQPT}> z*G!VpvTJ1QZ(+*9t_Afl**YcLKMX`9HNzOO<7c4nI8Co2RxK$|y4%gXbT`nCqJduM z2Kr!VSTL}N8yapJxP{vW?qEv8T?RAm+vvhhNu%K&H5?bz9>Huh12x))I>m2wGz=T1 zaTnt-fBh~Q25KTG9T$JNEzn76C*#O~obb3dt}L z=g<}n)AUQH=s#DGkyE2nMh=elBt88Y01cT=&&VS|dpiFGEMGW+lAk+5;v<<94APo` zO6x;fmkG2&fhC+F%XAb*??>oHfG`aUPco502}UtSyG%1jH~CIc-^n#3_k@xh}t7L4_uFyV`{{-bT)N{I#@k)TBq(eLiA`9)Iz7I z_i;=RieVB{E%XBU$nsJVy61g|78SX5tjJW0#BhN`h}ttl9%)PQiEb%T@XoQ|?a7U0Q_{tB5tqqCutDbx5vcAk4&>2^G88{ha=U z{(^qCN99n?>FK9>PJcr`^@p^5?j#`rhPH6dWZw6_%k!>tfB);}UjV#@?_%i1O%3Bw zlIkzrf(cA&n2MnZH)9ClRttJ?TSGR67;Y+JTEm?f+Hg09dzfj(JDAmQU&FgGbm2Wk zzu$^o_&{lYsK}2LX|!SvIrYe^1F0-fc^4jNnAcFyUI z70Kxuw{u4Ep5d5^t}-KD!6f9qKp$64w`6#^f^_Ics|KlIQJ^_1bJARvj)0j6)SX(q zPMD)blUW-Ml*mdZ&E4^^QmvykN5d+%rkrn2;7FjwO+Ja(sdy0R4iv8eV1qc-=BRlS zII)AuR#;5?f;}e?50qC`5{Oa4y=Joz^Ypc)ygc8xxiTxIT6G4u$o^X^sO%V4P8J3B zCbl<~N?*u4DzK-)X2z3_!LBEUu&2OvZC7MRDfq1U1NNC)ka>Ya!8KRWDnGGlyX@rT zHB+@+N4<+qsgcsrj{)ZQe~y=iqK+k40*OEkw)vvWUn$zTMbnzUt;SG!uywo&M!UbR zRFS-HxCIWSj$=5^;~hpznJ8&^sN*Ue4XzFkWr6laYpy4-yUw`mIL3;aSEakG<6}J1 zv4Y1sKEbCtK0{f@=Xj#w3msqLD;;0MQS5Kj)#=LQ8>ajI0Kyyjn<-Xx~O^=OEOs*{m)S?y_3U{+F|1!F1K5u5sz5V7Qa=5d-1Ji(Vs^Pwe250*8VVUa1XE^B&R5 z`$mXY297`9y40M5>&E9M5aBQP4>^N;o8#p}@HaWI3Nf&b&}?UOXY(F}e?oK}O|z@e zR?++%Ej){nYJCpGdD(Te z%?=DEPp+bUC^GO2dh!K2*3cQkuh=ydjYnUidmUY~(N*joiq-_;(KYM|VBk81U8lrtVpJ$cDoCm*i3#U$-bbFr z>v)4XRJ;qgNV{zq!w`o3NY66LHxZ?NCDL9-m&PS>4&yCcu15Nd`s((VR@evEu-}ht zBKZ=Lr^z+E!h6ukHN*vez(Kwo5DdJ{PlX@P!I>Zb{<9v_0UzsWwDWSg8)u05ERmff zqVs+%=jiJcYgxf~fJm-jl(^}CBfd0O`54i)lXHy`gf=3ma4wP4hqsxdN^dNaRu+2v z2wvb&tvnOS-_V+5Ox-L%9b>yMeSufci|8g2mE*pOg$)cnK0-m6wk;Sc9EBl-3^hZz V!AhzgQ>c0vQ8Qy-z?r6&e*i=9{ow!r diff --git a/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/Failure$1.class b/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/Failure$1.class deleted file mode 100644 index 6d547df6bfd66217d141aaaa836b343f4fb32742..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 212 zcmaKmO$x#=5QSf~TCD}U7r}*VL(d=9w)Rp+l+=Uk_421|?kL)cJoG7*Y`j)8x^W{)*9OS=5feJllK zpx_7aLy7mLDb+O#CGhThdH0-m&b@j0{pZIo09|ZUQNaT>tQyeqP{*2q5}G>Jbvz>I zp*&4w6cZXfCpfXA(?oO~s!a~pW<(uTBFT;J6NT~M$M|cM!bk#b0S&9d4#EM=d zu6HOyg8AC_Ww`5!D3ZLfo-1%qxLy*97je`v(xEZD*mFpe9o~&f_BDSW8$tNW;=QPohHujtnofbLPzeos(ogL+ElqF z3|uiWkE#h1R|(4n=ctr6VXYu#+(|-hBIRxWSURx|ivYr_*}N1Q?ry6uv{59ai&efi zI^QFWA2yiI*e%Bj%V4)WUgMR`k(Hrron!86nzoQ70d3THZjKVLh#R~jrd#4sfuE=J zfNpJkhh}}@R~i)D;0SD@%>0VtX1dlh3I?Q_)X4_#<&e=7*%Kz)x`a#_Q)IVrJ0siT zKZUYo{6y)4Mdv6_#Hj)RPyg{|jD*$ZaR+xZhDl+*LAwb4zc9I>wvK%y$* zfe+xL5VN+^ATVuSc4v0yoS8Fw`T6Vn4*(XP>d>&Eql}gg1Dh3cx1{w*T5Sy-4P6aA z1~3>eJx>ICE)PQyYIw|`J&zstSOjDR;w%=bapd?OLw#_;6qicg0kIFxJ*wSjMQ_lO6M^s~icG;+fK6`RphA=+>%aC5Fg7}naI+{jr2 zmMJ1%_KW${=JHQlVkON`CVd8FVo^QUL^J4b{W!42fg_t`WIWrlLIX7{%HfHDZI}jb zVZlHjmVqj6Gpy#FbVk5Xor!!sJQ23M8&?2YRP4r8`i&G4 zyY6VFoR;L=otJZ_b9RT(r1w*%H>ObgsBL7`WYcIaCTolIpze_Ojy#3tdiMfKxAzT& za}?!VI*0m&HWbuptPu>jPh*2#=L3SSVTo3jQZSaWLLSlJF76REqok`@3N!J6Quiy0 zpD8G%RB0JlPiTz9E@d=yc9bfu?@zG$H+bt`a8=gY$iVxQsz6E9ZtntYrY23jlAxPu l#H9k2)JX+|B8^RAQ1CD*dL1`tu8}W4CsfPS2@N+<`3=&)9jgEU diff --git a/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/HttpResponseCache$1.class b/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/HttpResponseCache$1.class deleted file mode 100644 index 55f632a56d2b82aedeb4ef0b1a24d515a17058b6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2433 zcmb7GU2hvj6g^{`I9_i)XhkScpiq}4PFp7}w17iOF=_4MBvL|)!~@c1JxaE5cHRA` z=p*k)Jn#SyAb|w$AVC}Pzz^U@AZ6GV9GzRyvmBe#kT1j)x3v+;mV*_a}E!D zzgKH=*pXh(u|3%^%mZ1c%bI0d{<=VQaYCP^`vQfA(~$ymZOfKh!O@;{KQ;Ec+&R^D zOrv|>a4oftHw%iE00i`wZA-V&H9SvpXKAvKl~oeW?@M2xwb*`OJThvw^lSHaTJ>nv zHSGP`uJ2m*e!LU-R=2ik^y*6k`%rRUzd{ULOJH_jpa2DCT=_7Np1&#m1E-@Tg%Q&+ z=oK3^rO}ZtrOZWENnC-2;Z!{C_0w@@*mP|iKV{IiJU_!?y}nMW+Qyfr?D-Z8TEvDx zY1i7f4L@*MiLah9QyD=fqj6G(djV^9Gm}YF!FI!8N0>@NMybL&D4k|vC2%I9HSRA^ zJ~AHf$sKv*JYojU$8pn@OZ&F!s+FgLUdQlhej`P5xK##D>IB`}86r)H)1=q2lm??4 zdNwV}PVpRu6F7SkB0YWAFb|oTanSst;ye=?^jn$7J^SqT4R)QtHD#pM3+Dor%%eBr z!OTa#w=H$J7sf7-E9z*l`8RB{>v%kV(V;2gwhkRLI%ct|<3*g&aRG1XxPzvS7Vhf! z1amst*d+OhuByta!2IAKZtp!{*RaM}&fAB59bw{GpwQ8BYOU?$#0Xr-@*R`N92ll4 zJ>IJ;yjkyNr+Uooe{ZJ#&9(IT0C`m*fAMU{3TL>lPHHOEHGLgdRkZ%%np$j496Bpy z{bVO?hI4#%X}s>s5cBh@5%@+c@;8e)?#^@eHgfy|T6OtPi0V`1e&;HO=Q&Q%2KXAM zIO^eC!)YvVB~&XRA0kK;_yx+Je@s;G>wGFE(<)KND2_(>iT&|&7$K_obW-uF zxE5pFBDzvs3X^?|=~0khFpXbBkcG%FNkxeb_YPt5xK4l^Zs1)$3;g>8yuhDo))Jrm F{0HT3Tj~G+ diff --git a/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/HttpResponseCache$2.class b/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/HttpResponseCache$2.class deleted file mode 100644 index 64cd3be0f370a13ba742339d340e1da391f08acf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1046 zcmbVLT~8B16g{*3*wU_0K??Yd7HJD{vGJ`26D!8XRTFD?AGQ-avYlD?1M$_U|Hnin z@xdS9k22mVR7tw>;KS~ob7$tC&}20V^M%y8H9^~jCiq&yO7=<5Apl7y~QiHH;r+=nvW z_oB4R{h_E&L^=$`ds4|{o55>%ulWIYrFMHNOp|^R2|nulk7{$5A>Y*l!7%4ZC7z|D zJrTX+djUn}J?-;gmq*g@lVCm>N~!@2&CG<4sg@Ta4z-HKaS3hmZXIqhEN0qfDENVn zDPOK(?38y7eGw*-1Z>^=WeCc|2m)RZS0h!Srf z=)t>FRv4Z%GUsr%lTPy=vsli)TV^oLESH&Sutk4Lk$xIht(yK5vgmPej;_rtq5H&h z^sTfuzk;B4G=caCscNf~zPKnx|L^bc!ZS-ZlG312{+4xW)!`pV^)#d z%G}X$SI0cVirIY^q@KUYho&bF&E##yW04I_dElq%(A*NqP)3R9$}IK-LvE+VP_7UOPZ+>pw4zAFPRNr)Bn;K_ z7M=dS@KT1w3&}Ce|1EF)%j4k}k9e4=MpnJCa(BV!&ZnQ1}>AoLhJ+bgn;MYz>a@Z zz99EmJ^8QDw9ZFp8zWjIS~#aV(c*}HqVh7X(Y6*)!vdDbTX>A8bjTu3v5A95O>mSwe+$Dh1>^K>AX3xF%oU_04yXXFP_uv2i{0qPU?zUq; zhNSscnsX`+;Cwrh7*^SgNOM8OMHFOUR7Dpq$-K)duHdSIF$LEM>WWcKc@@)5qu@FrJ`v0bTG6tEGhQ`Z zSGa`1P(;)6gku@i+;!7^QgZwNHMIr7;PHUZfPx7^XAqke%f4{EVy#{!jD%t~u}uB{ zNr^maTBdiI@JD*DAf+FS6(eWbxf$Q9``(=A2%}bL4J|zFv)#ztBgDq-MM3B&nU=We z*A|3x$5^Pcr>kU_jp{waG3C19jLGg1K)Bc%tENV!2Dnv`r!0t`@ZA#H%2nHC2GO)6 zs7^dBi@ImBLKIAL^hd|^II5%{UMm)5Mts3vS`rS!K4j6w?WHAGcmyi)qAIM%UWHNS zY~Lx1NmFjEr|CS;%EogSCM;Rov>s0juVOE1=)-p!deEz(1DzTU;;{5hX(-C&4ScVm zglPpgHO%0ah7?X}xGl{rPAHhukVb}O)spr@nnmc_)&z5BWq+y+1$PMfFzC-6JK=oT zBTYSNVnaBz&80ZAb1H;KE$V%b3hhmY3ne)E?XQb!l*__(Q^R>yR-r{gO*<@P9D`(m`4NKNV$DKEDx53SOqP4p_StrCpU|f|A!NdMgo*^m`7?fi z{{hj?PN{i-N0xms@{1rNeD~o9e*}*5>;@ue^{=fAPXy-t59qKB>s9Yk?U`d<_#yp0Caf{k1v@^AzpwiFi zrsqh~3mm7H$kHpEqu01VZ*Y~~2GljV4U9FYpW=CpJ*WBR7rjA!o_#TnB$z=Wd-T{k zwB0_aoCNxXi~Sk^>RYKhy+}YuHYk!nKhu?+O5iNdqS!4LMUMRu-o!vaA&EhB^Q@1v Ux-gDId}c}hKYzii{p{!KBb;g$LjV8( diff --git a/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/HttpResponseCache$CacheRequestImpl.class b/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/HttpResponseCache$CacheRequestImpl.class deleted file mode 100644 index 58db9fa6ce19949578ea00666416c172f12a7e0e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2150 zcmbVNU2hvj6g}5*vWdGiA8p-~LP@Dh>`llf0n#K+3$2?{gWJ#+iW>2!|A15wPytmD;(2L5s=BIf z*Hsu5*J@RPS@b*=6sk@bs!#wykE*zl9~ij6crlIz)1|V%W{0=yPN3>F+rPCMMK#;? zA{BT})jscrw@N`hhR-zje00*P|g~2k`>=m0$FCb z;#WRk&1lsPGn0bRjx{f`@KqJod@odSJ%aQsxSkuG5xkS#<(`gdJGPU%PKE`)LbClO z*Hf44Ybz>v(^;u&Nlf|PPweYFmq~>g6DUsUOUws zk1uhD5RdVu1q*w|TW$hQ5%8K{56bF-t7T5NsWzc)W#R~)H1QOkHgOE2CJrEN;#FKU zaTvoqfll6SgKFz4Go|5*CXQm*z-uO6N6Ek?6PK}M;yH{84*cutEz%2S_EwKa8N+!h zvbUPSz#D?ePMA9xmNxa&`&*A&a3ov&Unl&q=fmpkt=+jk-!W~czVh1rCp)RpcA}5% zI5#;fuy)yDK35bR?^L11>#fMucW1fkhw4h*RZ*1}S328LqM#S_RS>hy?TEGY?!+W7 z@P6L--5Am?W|Yt#jz^k29%)BlU_kpl&J?=z8Rm`f&Evm77e~t)Yan55pvxL>AZd*! ze?fNxJ=Sk9ZdlgO=ouT|KyL$m>&#BzIG<@&g?xlQ`561<6C9RLk(1BxY`m7xs5pTP zM;&Q)37lk{g-O=O7kw2!sCsL_#8x diff --git a/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/HttpResponseCache$Entry.class b/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/HttpResponseCache$Entry.class deleted file mode 100644 index f748fc43e717269ecd264a0a4d96c1e6ba6c434b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8443 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 NZgkRRoWMJ1{U5_!RHgs` diff --git a/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/HttpResponseCache.class b/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/HttpResponseCache.class deleted file mode 100644 index ccd4220bef796090439711ce721b2b12ae013e7c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9921 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 IKZ7OT0ks$XZU6uP diff --git a/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/Job.class b/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/Job.class deleted file mode 100644 index f414b6832a8d461f378d3082f824630a1d8036d6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8622 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

e!`9Om$eB(9>X%eoptehFTZ=( z4>0;PW?IN_EgJCicngJCh86e){31sb!dF#DU)D&S(JD`pk9w|sfzLSy+sXHJhddeT zy28=$i|C9pY8G|XMr*HN&NLQ}G)1Sdp{A#wo1ns+&gJh;G$fJB78nk_Q#KF3J$?=*WXJ8@i14^-*IA zon4V=lg#6dLHg_P>r7)2HAT@(FB9VZG+h{<&9_nb?mdExBSTc>9RNpnO_VU=Vew|F==1Uz-U4`}T*RSuqG>u(!>|0(S zc~7M)$S%lm1D^^P;9+{$N13%B!A>e@2#>kyX!qDDhUUG#APw}=-@u1RX#v&!VN$6n z6DdTB4|^ho>ZqOu`lq_Wt%vBBn_onuc6sd1W6$F-RhB&Vc7+MCZ+mTX?Gt26-CX&T z4)*V1zuxaR_=9mB`=EvGsq9P`#6rsR z6rJs9tmd!ZZFIvVo~5HdN9TT?PW=Kc^%?%M|1#Up%EXeN%-^;s*(8n=$9!D{}V{#y*fFxn*S2TRG}L;4_1Osz5ANIXr;x6&gh z{!yAlJJ*prbnY44rE}~a!cq@tiwCsD1v0`k(Cd!h?-Ua#Nf%h==;Mq`^{iX*Bu63s z|2zB&;dc>dzn5ai_)h{x>*|>)F5_L{dj9)`PvX}&-$+G&n#yS7I(ym2Ue|wwAIiw? KsMHXi^FIc9+;mO= diff --git a/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/MediaType.class b/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/MediaType.class deleted file mode 100644 index 30a704d560b0b46a528befca3968a0982b7cecaf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3176 zcmbVOS##4?6#i}^S&k8#!={u3NLakYF?&k_q#*P!02=}<}>rcAd7^3WgE_FTz!Oze`GW+r#hJ?A^;erLJ<>+fHF1F#EU`>+KA zbx<(Khf{nQ;=?c>Mtm5>m=CA%HXp|8a0X|6IEVB6bb^1oz_%CqO7)_RZzd(gB~1BH zj{z?HR6VD8k!A3l8XXwvIqHSYAdid>_FNbqJ;G-O#f8Y(DLraw z3GI4xP_=E%G6<<|uxqHRuV0L?MzZOH(6N4ld6@~2;FlqWu)xG z3?~DXzWu*1!7;MfZBCKlm9dne_2<%)nl++M>h#4QGvlg0rdlb!FMJg2WQuORDHb== z(d?C+YH7Jl)V!Ru?M$?Uen zB)Ctt<4Mip1e1NjAi5dW1cH_PFl;P-Hd1D^Ky$R)rJE4;7d)?aTEMGzL}@UkO{+QG zO%jF%*LHPTuWh>7MVHiwPMvPNww$to$xB+??g*YCCd`-9vT(%UO{&?X8^+o|kofW* zjO&GDp$`;f->{jp;@Ytk5A2FkoZ5Jf%ZMT-Ba9Xqt$c{^p^Xm#1SRBTT*WmB*Ja$m zO&PavTf!X~ckzyddotd|don@@%6K0qWPHGf4{=|{NBEebd7+GYbzMuSdY6^Rr8UFu zxgOUtcFHsu)-MRTY#hm@^eG;?`aU8umC?1$g#cySH_P}0pUOCjPVV|=42`c$MlQ5d z!sjx+z?U+5a7;!oPB3%^&Z?1{U6C_8BL^Z|TDET6z9STFo49cC*6llY&xeE2CC+7h zg$E3$I?iQ7ONbr{bha-ca=STjcB1)wDA*iiShYZi8)YiFCG;ufO9(|qD_akPly+-m zQEBqLAEpe{jJVcONbfTBg~D=URe41Ab{J))vfYYv%OF^-ydX$r6Kvy6-414a+HLhm==MFX1A0*0-$tHCzfZ!g>L zpgnaFI&0uPf@VMOG|o)T#+j+#I5V{zntg;q1xtv#Xm^ixBFznpgU}y;x1;G}4uWc!Ov=K)ZJ8v>h14LHZ4L7?bFPjW_WPy6_{NJ;O1F+#%AQ zM2xgrAd&nX(rtGF@`83euwML17>9_;Mtsj-8nPb5xBR&w!dvl>zd1zsK0F{hhbUN# zzIM9QQ%cYSNGM|HDQXv7_c$N>9T#L*pb%e1z}1w6#mZwfEJ8E?TkUUphD|@iM!fhl(!g^wP2TE^Bby0RHv`| zJ`dMCtKH^wWp3C((`>)(SRwDU%wXS%qL#V2|F{!5+>cz_ih^+Fq@ToV4Ib4~cSEIe zzf6WKmAp(Xa)S1VXt>+r=FT3sqgwej0}Dnqjo}9iMbuZfC1Hr7K|sJV#Rt$(Bd`?= zQ)Vh@!wAOdL;x`ji+6%ZB7#epNNG%3#oa*VGo+8SNx+2`;86^yCj}`W!{sxZ<=*C} zXExI-5}Yt-6O}}(S^WX!0Ojg;D5OE?IKsdI#*&0g2{}%v%6lmChaQdVG0jKuyr&jma diff --git a/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/OkAuthenticator$Credential.class b/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/OkAuthenticator$Credential.class deleted file mode 100644 index 9e842a50ba77bc7b904f9b11e25f558df8f05812..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1748 zcmb7EU31$+6g}(6mLrR%xM`Xc2!*D_A9dW8w4_N1wL?M^@=+SdObI;5_7baABq7UC zeoB7K#jJYY%3{vIJZ>BK5DPl)WKlDiT-ULv<6{FODt{hJ>ancj6M+kBi#^+M?HD@yMF(%8l+`Lk6E) z4JU&0nwGO|1-6QlO)YHO9RXu8kS*zkw&e(zE3PYpMaSxNB+ss{HNCxR=i9Co$gW@Y z9<{^JuWml7b;GtQX?54o>0FDD#zxoAdx*Zv~)}E}nt$XD8y%)69 zwLgT4acZY7pi8$&CAclv{N?ys+pB)zcDlar1)*#$sSL`x^tdVg(DqzX&nn~%B6H~< zA)nfn;oV+uMhnH0jnExQnH*Ah$(_x{L)i@Hi(it9_p-0a5ie_7opx;9P@%ZOjnIot zr#o9-H)zUbTiH0;r~I@U5))&%Yhn~<1dMw;Wp?() zt;#hWpPE?1x{eJKo4BXrGlA(>vz^V?mFpK2mvaJB5sm*5Twwf|ZH@C5C>xf7z$4u< zu9&Fes=(>vq*yQkio{{hSiUb^dR!SWX(t^@l%UN$h%Z#m(&KtOKx2c@)KFa1f@ zY8ag=`j&cW8B3RP{DT2FG0Iu4GDsZ$%F|l&N{$rPuCAILWI+Q5*fII8ac(> z&a)4o!5*5txrIxRJpBfB>_$8ncs`CI-eJ!vX1vSKMfP(EZ(@pj8Z)zuE=T>W;=M>4 zaz=qGPB?2zNk7#n2GXTpkb25%V+t8=15R|E8LiWaEJBT4QhcA;O5n-zGvuCNy!;n( zgi%oYc>M`G6GJp1*#sl;Ze1HF)E2v4gFnN+wFgw};VKJPB^3=U2|op2H=+xsJY2>Xqh^N_=<}#rAkgK7LNa$Ti{;cSYsk$mxf!UT5k7S!|MEBa(|qcSZNszw_^q!dlx0FY z3~cIRd8ss+Zv9xdGf$9VKSweQwJdHe%#io*#xnK{og9NJkun_T8d#*j(9ATI<-Pv* zTa*|W3iOkJLXlwuWkMA~MLOR^b$*U5Vzz&0h~3G0YFMY*AiPGCMYK_(8le3NJ%h`c diff --git a/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/OkHttpClient$1.class b/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/OkHttpClient$1.class deleted file mode 100644 index 11638e9bf98965ed1de7501419d7fe288a240402..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1394 zcmah}TTc^F5dO}#v~*c}QwVqiu}WJiOT7UWNKC~*QiX_;;M-D;u(0f@+bw~AV0`dF zeepl=pou^tiN5=zjB~ad+OCOh(lckKGvCaaZ>GQh{P+o=i1`@$kd;SHg@(L}+ZdNe zp%-^lOhE6&WE4deG32AT8^t{aZQrmmHAlFjDlCR{Wyjbzbjz@}^i|g}?X40+#N9UQ znMsDxN>%LX^|uYf;fn5i!AAis2bLq;h0kQjbT|H1L!eJw#}WgWz_4OESawPGes&mE^6E^ z3kt2ermz{Z*=AWbclB2P{X0F#XB6xJRLx2{l4OegTwzJ_7E8dhYZPJ z45iuP?i2pTXjtxwa9qls%`GvgtD@ml`BPJNDAmr!gd~&txL{W;Q71B=ad%s6MsZ)m z13c7_KvKg6#5JTarC}N~@_0lHNM@rbX_&sSa-9{r* zWEk?|{l3zCabs`Mus1DE03+Q17zU~o;d0_65UczBZlBvu);a7R!GJ8$Ut#D=F;&?>&Hlrjrjq?zoC;1RLmmimD m*heJTCk(UCZG9N?Q-^TV^UmNF$uRwWj$x2)DkbbANuR&Ex=Tv{ diff --git a/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/OkHttpClient.class b/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/OkHttpClient.class deleted file mode 100644 index 8c5f7272b8b5b98b8ed422456adf74fb5147d28b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9240 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 LhDvB5)~oyg6)M~} diff --git a/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/Request$1.class b/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/Request$1.class deleted file mode 100644 index 9c4d7efa04b5df7dece7c9cb4ac0b80f8036e553..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 212 zcmaKmO$x$5429olwOR$c7r}*Vhn_(cT!^427{|~b>rC63dN>yzz(a{CxHgX@JjnaV z`}2GONH7f%hKK~BvuztqySyZU>51x=oL?8}p#)}Iqf6^@lOD)t_8MX$u+a7{UEQjN z+Dh76=6xl9xm6+n#_WxuW>YHX$O*(9O_s`}@^~podx7~MNW5f3kH74y&jPyu1Kt6K NJjdJ---yn|qc2-6Gynhq diff --git a/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/Request$Body$1.class b/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/Request$Body$1.class deleted file mode 100644 index 38271ef07d5781c0dbeac85a7533dc335608c4f0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1112 zcma)+&u-H|5XQfCoVZC`5<&@-0{ue(Cn+_76DmR?RgsEPD$%Hyo?K_u7!q%4uM2$u z?uY{icm^bpC`cUo06Y|8Hg$uGB8nyNtY_!9GxP1rKY#r=0?@$yEYi54hDr_@+|1z? zZX2)+)EEl;POst$Uvgiz4+flJw&jYx9qvU=z@vdJUUsD%*z3IGIVxb8A)jCvwCyHC z=Aq|%@)1MDIs@NsR<{`R715zwg_h^@XHkEL2W@AkN1jqkxK3}&2|V>3J9XLhLV}v2 zbHHG(`92R;dQKQ}@`93%&H0?~MLd)hMO7NA?o)lvTh*~xveU_!XmNj6b{SGu^(lk# zD)1z43x;W{^}^YAY){x5ksL&FQwH4WFRK<)B9aW{@c|6E)z>Z`NKg2ofjWI}iYRdT z6HlpN#z%CvangPvZ(< zs)fg7HL}^d;=e)vQ+#f?@PYdOINYRs92jpx2xf4Va$h4{CwrZ=m>s5{!~D>f!2(J& QD-oGN73X#J|4`4wZ>!7r`2YX_ diff --git a/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/Request$Body$2.class b/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/Request$Body$2.class deleted file mode 100644 index 250fd4af40464cd1a50f01a06b48f3fb54fb1dff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1669 zcmb7FT~ixX7=BLJ&8EvjCqQkIqkjwq<=zv&Nd{$$xO$c**)($`#k6Udd}`&e?NKx;B9<)0{wVb zJ>D~s#I%X`@qx+dMFTS?;+WNm<24Esm++y9IecW|V_Y^dj|Bst7+4ZW-m=|v+4lnJ z1?#t~Qs7*v?CFc% z?^kXMSOw3MwFTF%*CkgWknZaLy1W_6dXQGE^b`Z`J(m1fCfk+PnSNiBQIg(nuqV)y z$rc5SZ)#2;*L{Ihrj^=C7*xYxEvQL*e^#X^%Df9K({{MCBWnV&8}r=34+DXb?lgkk zrYAu^F~<`aZb1uP+kt?&_-$EM1IPF32Ci_v=7+ViRJ~z|nz>J?ma)u>UfK2Qj<>rk zgFU}u;ZqbW4B(`NL7cKMgrb4ZEaWg|QAJ|{r#qY7;aOoz29_;c#fpJz7FKcHz?y}1 zY#7+I@HxH^INwcJ#~Wf`OJMXxIDu0~krY;1DYH;z7CK<6tN&AcU3=ac8HK_&vw_x; z6v0t38fu+yLFT?Bd;jXjrlC~F?8gnQ$c(k ziHu?+tWZ$S#=6zY;c>2cwwvDw9G5YxKFih6k%7yjGSZHDLA_9CDiY_}ZhJMWfJuH@ zlKh;+1_qQy0FIOiS2W&380L{1p>+{4^l(h(#t$KK7Y-52-AB&>mtr{0XPiLbC%nX` z71>Fo@Cs)Fui{*Dn>ZFwKYj5dVC=mVJF{h652Q(8)Ipm%FJ z9{Ul=@s!>(9B;t7^Ut%C_5gi%&^Kd5R?2vKKqpClf{S!eL@64dCpUp!uKflbcUhSO zqW-|kxQ7f5F^vW}4{-&L$au(u^*Bmmj`f^kL(+JiRt9JA2HxZj48EC|vNFiBAUdw` tFpo$6mv8}ZG0h1gHNMNUX_K^L{IyI)Ye~F=v$O^y{36b1>Sv>_#J?hMeW(Bc diff --git a/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/Request$Body.class b/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/Request$Body.class deleted file mode 100644 index 9bff9ccecba5815df9a2455efb80a628b483dc35..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2314 zcmb7GOLH4V5dKDyyz*xKKyehmLS!S1EXP)y2MH(&L`DH8vYo^aFy@h!G?v$qca_yF z;2Q@Xr%?O>4p3BaqAFbE6s{sSsNzQfJ-aJeb}5n3VQ06e`|IzU>7LQw|NQ<3fLT;j zj35*G*Z--wfwvUAts;bseB2BpE5|wcct=j>RNTV5D&E7qiecPVa7RI2ML#kM7Q$Fm z5y4UzcNN@I5ygE4%PI!3qF_zI`wYRXRoZ3H=1r5^a}~W-<242_bX_-0L)>6Ek(gW~ zzd5VK8T#^u$rqiS0=HN6LWL}myj9dIYr1X7Z{HXcTL!_5=Zn@(s`kjyZSGW4*266! zs;T?@k;7{uE;FYYP8Kawa8s=8Rtat_G1)d~ftL(jx==)qACc!~S!}rsZ!;*L+lJsP z7Q;{?zpa0!rwl8#I!W5d9!tW#PB=|Pw~Puu-m(NY$(5n^a47B1vgO!CE`g{j{k5Et;xwE?Ou@Q_ z53#{;=BVJTV^m7q*6{E3E7@j!!)f`X!k5*{ev8a7eZ zFoUZM@kZUeXlob-4|3n6hOuQiTLtVD7Cf=VNzrI*3_IgOXc3BSF7ACF--gI>lU+@oNDTTkJo+vc2nRX|7L4G-#;uY z&x>K8LFsVggsQS~7%sIkX(GQ+F!AxKqm4*9MNNH&a9b9)!6aPfBI}(L(RNwo>2bQ< z1f6N|PW?%JPHq=ExgG9B88XsNtKXEtF}iR@=-vVpx-Y0X={ZJUDH`btK`6Ng_8Ywf zFiy`d*I2uBr`3r{j5nA6v7g>}@xQ^~R)TcOkXG*%%q1Dl|kUaks zy-ybQ(NCT)JtMGjT*77a`E;Um4Fg}2^(#vDHO+j3EBMx>mn0f9B>Do~>jAQcagkyJ zk_5@UOrw0eg4YREQoZU^El`~Fnn?bIo_$2tBd7K-@NBB_by|MyBf6fP+QXSALE4rO;EmBKi{?gmv7L`H*_@LkCg8x%J=hg^1XpKDNg`tm*;hy YrE!>;4r3Lg!EX8|B7b4}XX1|k0eBu-ZvX%Q diff --git a/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/Request$Builder.class b/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/Request$Builder.class deleted file mode 100644 index 210af7fd289a5c74b27771a41241e54b9ab3108a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4187 zcmbVQS#uOs7(I8E^rX`yVPHV^NeGb4giOMsvda=6lCWd}BQA7in#n+?XPD_>(J1b_ zrM~(ru*xJ=rb;ZW64wWp7xhse^+6we@PYFCx_f$tq%#Z@RrmJXzTY|Le%tNv&FxP< z1<->J>d}U$czBwJb3CX#jLF!5WC$q>c^SVG| z{{{83nlLmoF*4Y{OQ3E-Gsm+jfw28XSB-RH$joPqG`*F^H8rK>3j$sJ$?Qa;aH*)~ zwPG%jy*O@~xkSb=wY;I~3G3IOdgZ9SpG*T|+0-=&FVNEgdJ<6j3`5Hw)YU>kBfwTq zz(MU&Q7f2jY(gM@Q%&C~?ZnsxEorjw-5Dce?iGl%&sW}YnrIJZQ<^|if5y;`7bnKF z{IEKv(@MBMn^g7FYCglioyCATo*`Azfnr9d6ANspuFu{^Iu<+hC6_Yw4lhYH;t5h1 zEk|iU)z4@16IzPG)q6Fm<;+ahAlmJ7X={Y9vm+{S%tNDxBWr{W80rKG4_;RFBF*(` zDrKjFfSh;JLSUrb6L7&i>hRp|W{DdGe_AsIHnrEfKfrFF9LZ%1WY_1d%BA6CtQFax zD-z;aFYkI)(0y^-kzY_;V_Eey0kF1a3cC3(>;m~mybTbbl;sZo{0m11|ZlKO4;=?1s= z$wS#3f)3m6m+6nK@4#P?dVXj5t|fj#f#KXkMs@;bl!_c*nBq+ z`-rRZ_F%|u0&Cqh&t65H-r8UVvQO8ww5spVr;8JsVY&@XV0n3yefzkLxXFc$QcCTN zDtHMmD|iL3QWBS~9OxlaHMI)d2DY2X{zEjK zJTXMB@t+(SmhhH>xABg^M*DUw0YoP!qxMRdt{G`_yuE{8QJSps@~9ISCVNj{eU&Y3 z?rEFLC$hs$w?S1y>u&Y8^R-i_=5m@rwY}M+`#6xgDq9-3$l{Hg|Su@p}HB<4?yoBUYY0$Wxew~A#EP&Oq8PvtX z(i8%*S%gMsP(KBKEItkS%tw~>gETH99^e)N_#866Km=c56~4wp);kLa4`V0&B1F>D zK`hL+t7f)_d2HWSuzg2t-!I6v$zr2^;IK`SrJt0<=tRnBdU=tDLsFfDJfc#fjGr(vy!s4=oJ6avt=b z1pQZy&_FK^JE{+pYdK{at%RfStm2HDEBtSA{XZ3+Xmo`)5>}kBsM>JU!Q4WA;1Gr= zmBlnxm(l91^?xlS#opr}(KYI2zsAe{KTrEdam?Z0P5gW&;$KT?HIM&x#YsZ$NkV)j z5`sX#7t%TpB;mUY65Sq-rmT}4E%7fQ6IAp=&cUY9a0_QV=U^b#IR#&Z>#aH$b!ZS0 zBBCBEg^YEg!J_2M2lbs&owr#1hMnGG9fR|y2ge=qedG>yh{Qaig2GBmu@pfOsW^$` z!b<$DKp+AqaMA(WMj69I@+?|MV`2vD=fqd6u(0g-$~IPW2&XXUAS7sJgdkN)aE>uP zt1u2?i2E2B4`al`I8dAMX`Jye_Sa_o7)CveeYF`sjl=9Luh W&Gff=SAhSopcOl)+~1{{eDgo0v#~?~ diff --git a/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/Request.class b/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/Request.class deleted file mode 100644 index b6d32941ecbdc88dec7211f05587cf938baa650e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3633 zcmbVOTUQfT6#h;U5;C3wQnamTr4ld@Ye3X0Ahn<%HiZ_1R&8x3$ruL11d|D3@AsSi zAARXVyH*KZb*(=3p+Bmtd(WJNVN3${A?G&d`}RKH-e>3h^Y5R30T{+l8oIHh;V70h z9LC#Gn!dxMn>@M|!EK(rt098-c;yaH-{;W>JkoiT){sG#w;0^q>BM2+Inuc2lMGwBV)6F z)eP(cxl^ z_m^!mpG=u07BsqO<}BSV7YTAn zbDE2U#LGC%jV)2ehD0x75)ZH`(T9G4Q%@5oiHG=*$v%=eiMYha_(Wm=gA$+OGl>LF zMew=A7q}qtB}OH_!nnlOxGeDvu1b818Hw*OBhXvVZdCxKJ6rmm{ro{<5NmEsA4yr0#{ZnQoZr7>IP4BYv zPr8Q|wNld{=8a?1+;okXlG1;P_KJ_fVu+qYN9keJf=(_pH0tCss(^Ija zz8wLsQ1tpq((DmJGzVTC+(uw9@dtui2yx%Ch4A2GL~hc!bsNzwXuN!23zGY1{)Wcg z&$N3BZNCvkfSdtdq{kP?K!{98GSNk=z4Y!&;0z`(LL<;S%rQwTBQzu9IE!=S5EUt$ zSB@o}IUQ{9cZ7bWO)hJm`| zNOeI9UsjY}X|xJD{fyT=r>jci^1McDlbBMcJdYraCxOy3gRlA`FpU|7-z86X1zmmzmK(@(4YNccaJ?bbAwSivJ*Wooy7J1K zJkn2d$8)5ewN-G$ zPkz@!-sc9ZgD>*DBELcj6y(qhCbl7VF1#D6eh1y-?x^K-7;ickn*;h57KkB$MJLEN baGd%hwEq}YFm$w1QRqewqIik=6QSsTnPNwv diff --git a/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/Response$1.class b/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/Response$1.class deleted file mode 100644 index 09bdeef85e06f44f4d05b589a22cebf63e38a9e5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 215 zcmaKmO$x$54255`I$9Nb01+3i9eM^)a3O-8V634()|uLwdN>yzz(a}CgJW-bCF!aOlIY444y zxv8YNX3kae7hJ{!5XL*Lxn7sbTDF9!#mQ3XR36R+Cyp@tM~N1m(eaPA)%AjR0eXH1 P==(YJ9r_z;T{QRtL3A}W diff --git a/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/Response$Body.class b/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/Response$Body.class deleted file mode 100644 index 0911cc6129f775264dc36aec8d5f760b64f422ce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2397 zcmah~ZF3V<6n<`+bldHgm$tN&x1@lY6x#>_0!5@LR9izUP{2|JH_5hLNO!|#gVZ-r zzxV?fUq%II)bXR0(bTby_(^B{DgFrSb9Xmsz!fr+z4xAb&U4N^&pG%0_0KQA0oaQV zRqVpJik)~lMgeZFuC6M`DmbO08RIROkmIEMydpoRRm5;6MlJ6r4bQ5W!Z{V^aiImT zDwtN$DIuqDQO;&ssq>nG*QM?y6`OHc!5ea+tH>d*Vk-)AX|&R0R>d6V6e@tZ5k&m4%$)OzF8IB^_Bi zuNTkjjw#oHFzU{mWg2Dd!lHmSW?6SId zu0XuLn<3J$gt9@8 z+iD6HDGj9Q5r3D8@y8}iJ!@B-yfJD@irZ`449Wy)coI)(*pCAOo%M`O)(K)NJ!wO1 znTlET>TGaCw=COD>WIQozJBc8(iK0i-k%WdK7Uaj$VB>`JT+(n5 z&ndX3!9iJptD%DH0;v(dCI)^%h&`;X`XUgu@En*6@xW`nwwT;aLsu;iiIH()N7?AFzNQ z+YS$)Pv))|d2-yWmr90J5Ew}M_0^E@p`ex8R45ALR4rmP9BF$mIwN8%q@kQ9h2Zo&ubo&l=tRObMg68REC>cAqNkw?9KF{?V^36Es?XB-$Gt z_!%2|qg8B-+(o-I?&y%Z14}FDBuJO1NTp2|2CC>@qCfv!`*<4QV@B`^+VLqP`kbfv zf^mO|A>6?*?(+5gijVNuxP))`h<@wkU_UJmpbtl=)x`f+9L4iI|0S%$F}y$-PvmEa znsdB0k3W=wVPt{~oTi3MdA$Ee^!$nL{uOMVmIosRz02706ME#%TF~n}`0t@$30rWl zfs}aQvQ7q5J%ST~BN?D{)VYGK(!nVtO2W@+I=4OcMrVVH>)S9gJts~K_hsHa1o4QfTK#uPMCN) G+WIfj>rFKP diff --git a/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/Response$Builder.class b/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/Response$Builder.class deleted file mode 100644 index 69e1b412a3e6e883b115a5e576f23298deaefedc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3083 zcma);Yf~Fl7{~u77nUSTpeeLexugYJ2$Upky#`tff{jgEg^J>>ZjvKxT{d)gQ|ou| zD>&l^@P(ZbGb1zhr89mPXMExHjpOs|ZU~x9$Ykc6-E+?Kd#>l%{QS=kKLW_((-_WR zorgDgxWz+}hd1Lmi`xoHaVR|B>BrqTVz}3jw|MDo9yWN`RB*o^@5C|0n_CLrjbj+^ zDcDxnNqG*zfkZ2J+07_fLb(7X{{QXZA$`91p+suym zPN98eu2*iv)b?C!+n@r`$C^>6&6rlLdPxz8TSo~J*a{9%$Bg!D)$L&Le>2-NZM{3K z&@(7n=6ndGXS<6~zT#S?B5iv*m&*yPbvIzzFNcnXc=aX_dP1-!InU&|UdeP3n}SzZ zutVxv5%w!D*wKy|ZfUv7T29PkS1m1Lyo=m);2NV(Na~3(^==qvYO_|iDso-tTRYIy zxybiH#T2GhOyGiwF^sEt4$rF?#W@u-_)uUWs0nt8jlhN09V;4!+|i7i)=qs-n$Fsj zirjbfnkg{o_t^CEa@wpL2CMpr?jSeR^wM%Vr{ZHgQ1J;5GtdMk+pwFC=E!5r(WY1F zUCmCLwY0BeQDEf%TdarH$AVmIo@K>!4W_%DX(m8msAb>1@C(%N#=4ZlM1F z;rX91aERD;D&9ci+1OY9o62vQ`2$2VV+V*lb-A-NPS8IB;5S6@D+cj9Y5oKA_!Bw& zg%|KQ=4dzVX+j1I^hP>eiz#IE#5RY>rps9LExY4emdJcZ<}7@Vfy}pbGz3-`rOheL*<$ME!6wEey z5~>(<>1VvtM}{YfHBKzbJjKn+(G5DoOoamKq7VnbL>p|B zVCOo(xPI8Om+-O=dqCcDkS|k?qHe_uZKqB(ka|W7kR;w6d7w zf)L|4B_=Q>CSA2$o&@xK80yC>c-2>yrJ47ltgHp;a~FR(CLBe9D~yDfupA&9`GzQ7 z9d#4FjvE2O;odaAhMNJxq27d7uo@sNdJrbJUU!{aqs{=jRbfohzw&g1|Jx7Kjf|m8 HGsWg#b9&xx diff --git a/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/Response$Receiver.class b/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/Response$Receiver.class deleted file mode 100644 index 5f86ffa85395239c4506c4e47bf7683a8bf2bd5b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 362 zcmaKo&q~8U5XQf$G26set6n`QDAgST}VbZgv=*`)Yv9(({FN}P(Z zm*VN0`Q|r&n9r~G4*=IVQs^lh5VGJW#uZJ)gwxBJ4KF&rHm2gH)ZzK5u1oz}9}Vva zdGHI4W$;n>v+aBfjE48paPwxltetcy3?#n|O=WrF3K`IE(W|9d8HGc_#kLDt?0mtN z-HIzhcN6xe-g7lBOpF`}gY_(382_l}4@fC~2&>Bmb~lKD8iv&-LbE8U`NelP~o4OTBumS6}JX*BaxA7I~@%Qx8jeDCnW62W8-y zfn@_L0uYeXj-%WO+w?r;8L$M5@v>zXm22R+K>NHZC~HISUI-+{OT|}|aMgNQdA`7z z*+OYG@2!_jSC!ZDr57u{zm}g5ACFR@P%0_`F-@fvWfIjB7>HG}9ACMPY3D--^X1)8 zUZX4pX1inc=9RZray*sMzEN1Zs%W{Y;H%;|eLdS$iSo%Y%dz~M0@>cCqM0ZyquE7z zG!evgc-C^%TzPd#xev@Gn~`?TmI|i5Xu6i(M~4Z2#bVsXQkYnQi~F-AaIQDoKs2}j zy5HKHWpa~Ya*5nK``p|x^S0?M=NEj}a+XK4dyg1_W3C4N?hzNb9s{x$BNkQ`)ibkf z`-`SsCVbLW9(Mwn7{~~q>|1tz*7AHtlUlHr9n&wn)Q$6^US({rTQ>=FAWX*`LuB5M zFo{8wfu#kd4fWKYHAk8#l^sTruHp(D@12fKL7U|i)h31AT@DKjHn_+ptdD|-GN~Po zueCSn-}M$b#y-7IqBplU6cj?s=Ab~!=8!Auc6X)9;h z=R02V`IM#XqV9%#p>rFw6b$lH;UvF2+R&-1jjK*wYr)K_31-$zFtcJfA3}>RQ+_q{ zbN3?>+yle89kk^7enaaP5_)diLNfOUj7MCz?;y2>v_3wt1*zwQTR8L!^;$5%@hm?{ zz*PcyNcwb)UqaouLOWOa8|EqKXJCgx-EhcG&3BdocyUy`A)3zHH<{cqi7BMGje@m8;9#{&(wrq?1o_AJzOV%(0wQZ zdP0~4jUQzQ>Ar1r%=P~TqyIG$m#d)Zz}7vaa6bUfg(|ziM`2u_n6n2pey4WfQxW`)AW1g~`5|sakl~d8?HY0$o%M(hYZBQW zA%-{~5odh&HtKMW)?diu7#zVno{aMNMrfzDajf2vrwu~8P4;WLOyN!hH4%Wmqe}8DK8{g7RIj|TSGfZ$ z!kI{Ul6Tz7z>>MX9f)fAhFrN6Xm^DYyIe_PHYihS;SuDV*cnl}P;yq?`P# diff --git a/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/ResponseSource.class b/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/ResponseSource.class deleted file mode 100644 index 180535689dcb3b4cf9e3e4215be66cc7452bc37e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1201 zcma)4TTc^F5dKcP?QWOlwyh|LH!ji^rB($^N(fD@k=V2eix~95EOmv&?Jn$vf26+n zppb~sXn6KV8Rr}}Qq;umCTB8dX1?#6IrHP^m+t_|xR-&1f{G$$W#nYsP%(g;{FvjB z5B{^6)?=?3q6)d zHSeXxFxaqNs~L4REq~42bm&GFSgltK_w$V%bKfjErn^-#Lf>|`Duvzz=?$-KI_suy zbI=%Ba?K7A=zpU!q!(@14wo24{z1A@SZ9#JZJRpG81|NHhLKN5$vh9}zO@(Gz7^Cw z*R|TA?YScKj6qp!J2CD;7i-;(I*YwDvP5sCp1j&an-3>@_9^H1d^BYFzT`CA#XQ5r z|2IIxC>Ata#uW|27}B8gL%4$&Vi-6bJC{o9)pk6W=yUl(R~xO(9cq^(&UeqO=9ocH z=}PP0or|Oc@)G8kR>_7k|JPejJHM^DP(XCBVagB-UM0xsRv-6kT^#2 z19=P==uC@Pmhwk27U$0+A#VG!kcyv?I)=mx5@!l7(v5bKhH+dHaheEaamq51^aFBn zcKitGk0RX7cUmsvD%Xx{B8O|8#8j+gDOQpz9zcErm5lNhvh)s8^8Fu}lQ_l9#h41F zMfY5iMbqP7^(&+eJ(E0wdWb&ZXp(Sb;q<43qolu4Uh)8a#)d@f#zuVJ$VXK4J1xRLAR@tNg+0S$Wp1^@s6 diff --git a/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/Route.class b/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/Route.class deleted file mode 100644 index 0a58f62afa2843bde71aea03332e2b9759af0ed5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1915 zcmaJ?T~ixX7=BK^cC%U9kV>_rK%`pp0Yq)B)dXw>+J*+o2%_|=A*^I+$i~gaseiyf z;8ncx&YNE7jHEN|j2~Cd_@g>~&ThUMR)^Vh&ikJC<9VO=J>=h)&;J1M0Ul_$fSU?F zQSqsU017IKDwd;&VMQ*V$>o+@ZY%g)w-YIX;*0l%}V39bcvo=hlbtQtuwQDC=e-{4bxc>*i8Q~j$u?U`A|Na z&0Vm}N#ir@#d$wQ-t4H|*}?>3W@~duU@)B_g|TnyW|M@<3%2t=aP^Cb80@rUe=6-k zs#h9E`3DEbM%5|EaAC`-8MZ*sIyjbWxwuD-1k_rkRrB~I1Wr?gqtvcDY$*k8$7)V#ua149>N!4gNrqy7}dZU?IUQRV=A^q+POt^E{ zR|;HWV_)a5f2ZROOzF6YH+8&)OFE{Jq`lvmyXa(s83kn>i&#>ysbEXThq%U>A7b?w zA}wh-U9XY1t24|&Ql^17r$^% zvVwqnk~IX~ldK{{^j8?et0B)_+K02hL-~~l4@AUOX51vYXV6O`nEEO;l7LZXb=>)e zuk(9I`#49(oeRFs8DxE&wWnjSZ}~U_IV|*?H{g|*dV$!!tec<8FUn8*2}T+028SO=@QzYyD$@fY}YG10-2%tT4;;#>zQnUhkqi}M{M zWOhp0&piZBgTulSY#ReZ!3K2P=a0*_3ns;cItuK>yxZ*3U=&JtpFe4`xqM$efIrY$ zj>JlQvKXIB)+Dwr;*a_QVNDJMqDnj}CMBv4G-)nrp=O9`nnVJ-jQS;?%pQmKD|YB> a6tVB3yXa->VG0uGb$sMvxC$Dlc4rCkr}!Iu zF;NMcnE2|CGTzx;+8S-sz|C&oLHsL|S1ec$$;1$S>UlkGa(WJ4Ug zC*)c$%}{d7p&OX+toMQ*Sc={kK!z%N=sQ4J41?&QHTg;LGF3Jarxh@mI|IvoN9^?( z;$M*X6m(yqsNN?qg#@NCLMtQe$0)`qOXDiWBdi*A##Jr%8Ht5+^u+LL@h6fWFceh2 zLJNy6@L_@lW=ZT#l9a&=y>&%069Ppfisl+70^&5TW0Hu{BxyP#-lklMG$P_&B5rYn z2UsEwGr%4Vdz;t>u_^2{{cc2vk0ZoXgxD9uMV!Z diff --git a/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/TunnelRequest.class b/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/TunnelRequest.class deleted file mode 100644 index 05b42e5a7b77d6b999a642380143dee7dda1d37c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1654 zcmb7ETW=dh6#m9`?8$bMy4yRX#ciRry>YfqFF?|yByNgLjbjogG;Lot&NSJw-F5d; zN}mx=h~K~i60aZ;2N9`#1BoBOPeGj7HL;3aq`u6#%sFSy`R1GX^Y7nY04U>ug0q;; z;0ni81qoc^xIT(Acwa6b$mK)1%w#aDK#`F*6sVZyn3HmzXv* z+{VY!u5#2kKH<2-QP1Gh3>pln9oG*SwE83SscG1zvu&&fp5<)M(q6~)XphwxMnhkC z3){kxu^rES_SHfd?6{uw+zc$&VMyPw94nY-n8^>8stvjZJ%x2TvEptChQoEs5smQi zrtn(krcEBL?zT;P-SjMJ_nfI<$MP92)Z6Z3!+#Q*o(MaJ`^8QWbc|N$IKo~LPeS1b zG|Z805%jF8Ft>z9nV0j0p}Ce52+uKXBdWAwe%Z^QGHFlvp-m`Ey=kVh>V{rh+_s{5 zUTJSig0JE|EHj+#UqmCc?WP+wv-GSjIx*6!ys_NeT+X3wnbf4=4z8!a@eXn-&f&a@ z3sQR*Iflt$NWE@ahLinXVp1%ImQBzx@XB(du~cbM;m@!_9GQ{IDiI}DZMB+4d8(|U zg*6rHvcFU{V%dnq)6d{@6?d_r;vViZC~HKmQjc3lo040l|Bx#idn+zoX*)(ixg$iU zv|w9Li5=&Ljr9t`4B7rH%bSm=3_~(6Id^;rVWmH9b~?h@Vkiv@7~pRY8luQVzE=33 zZ63HWm<-2=fBm)&-rcx=Kvnq=UNhgpwXFq~%`i^VO zYOt5WI{i&&=xYK}$bu+ET2`_ul0>XX61PYuz=(|(X}v_&4@hE!I>kT{muW5I z8m3X8h^z5wOK;Oa6otHOVC{!}C9v4hfjUfvJr$kEp3jcc2|ej|Wu()3 z(zMJ##{v&JUO05)SBZ>NGIGQ7fiWXj2S!DK^xen3*hJDZM~N9F=Ga6^4)+8KZz63- zwwmp1b6*-sO>F`D;H{@dMu!36HE*E2^TW{WPgIw6JWZ*Y7VP6Ni9Gd8r#jdFwe9{( z`C3+R36%;QY*nxTTVOfux;k{*M}HOyR4JAM>*GgCFKr9#{_Px4(-mCP*WRL--?%4HOch1LbcMu!2>>*N8|} zS*)*cdJKPxe74wWeM0^{s$XH9I)w`qf6O-2I0J0a<2Hreos;WKw#?W9SFujw->%92 SK*YT3dvlnnYk_Oo)W&Zd!;=UA diff --git a/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/Base64.class b/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/Base64.class deleted file mode 100644 index e040df9cc735fd85b146ddf3d70da259aa34d28e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2649 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 diff --git a/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/DiskLruCache$Editor.class b/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/DiskLruCache$Editor.class deleted file mode 100644 index 5028a5b5b14ba56cd5f5fa4fe2962a7a0afbe6e2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4964 zcmcIoX;2(#8GgEZm<~;cb3+Iil1*4L43GgrvV_SJvjhxEz%?NW#5FcU3!MxzWTqz} z-uJoQXQJ!9;<0M7E{Dc)tK2GoSo+K3pITa_mOu5stIyj#N8_T!Y?Y~^-|u{%_kO?0 z&tLe_PXP4dhm~l@Rry?#PtxFLQAQ~PhmbbVg(U;mk&#hWhikw7#sbg7g z-I8N(l;t<+c(Z{9+?18K7=!BU&~dd|w&xusb8+JfsY#hjFDXHr%& zcG}5a8_(p1t;B-e=3R*^&~IiO*R@j$)XOspDi^HmNG6lc5L=NsIWEe9Im+lRIN7!y z1)bZ+Awu|slXBc41y>?v+}r-qyeb_R6oiJ;bGCw-aVKR@@n_rFM9c3UE3Q7_6sGuHuDX3D23T*n0^icJe!e*v}Y>ad1Tqa@rkz5z7fQKdG zOty$OcmzWxzJxEE_zIp>&=fo#%rFyQ#n*Iv-NaM) zhKUt?Q^A=snt)f%+Wt$A5m~>bpt%4Z1ojir#2Jj~__m4f;AuJjT^-*u@qOGiaSzX! z_yL|Zv5GYl>)0@HM2vkA4DE&j)3H(-D(ER!bk+uskykh-XRq1`7J*n9T>Qq_x&0eV zMkAkB$0We}%L;ITi%VQ~Y#XtZ3cUjYc(@F}c!xBTytogSUj=+|%P9hd{%Epk4JU0Y zmCw9j!;vMH@VZE`ta~d`@d{br>j~RYIuXbtR;7~9iycq^PnVijkc1Jd5ww_?2>Jg--Na+<2%opmrT!s*Z0$dbj6R$EH;y029|7WyKxlWR; zcw%^kD21jAhBR&*uP`LKBW#vN*>uPk!PZ-$99u^*EW_=hh;2AN@#YUeK(paS*MrZ}pXo<*uk1M?_rD^Oc2&5LuBJM3kA(+qGn z$C*aj7VTU`MRXnEXxA#VXx9ex+t8I2RCaD)$B#p+Q15x%j`LfO5CMLLO7+*MR)2$o z>TfZ~^+s|dFT`BC8YagO=|lWGjgh>LQ>0?mhA4%uJ=^s&7&K_z3PQ?VF8hKQq)`8ku=rC+?$Rx_ccD42D+l&|rnI z*ubteG+qquR1JnVu-o%R({yxCNLj}oae+=3=;DHYn)(!7Fo8?B?73o=KWKpjmOOeL zIgk39KZ;sv{!hB#1-js0Xx0?8X(~Fk5c)M8Ls}h9X*)2i8JN&aT+(WBS=))nwHhR} zdR*5UJc|t>jK}%+O1dXZ>+JU&CDJ^CS7Dqk7~;d?ETv+&V!3G9~yiC6pfe+n14Ckd724u7Md zm(Ejeqg8wuWlHV$23~eOxP}84DYLf{k}c-*!BRdq(|pj{p=*awt3_}?i_#fg=+U}8 zAx$43FJw>*KH2hO4CKX-5cBa%{Jl`u`cbJJ4e&Fz;CG4q{L1uNQmH1j^P)Y2tTv2}+@RMHjlaAN1oQmCbT=9yWj9w25TI~+ZGV*=qF;Y1tsil>Y zKgim*ZUq^#YVz_N>@6;<+q?V*%;zu1sg@W}kG9OLLV21)-(Ep%zha9re#I7L`p7`V if_L6Q2k8OYr=1BLK^^}~s~u79cX8g$PH>s~{P%D0WZ%&M diff --git a/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/DiskLruCache$Entry.class b/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/DiskLruCache$Entry.class deleted file mode 100644 index ba43e641460a07f314851218ce40dead6c9cc36f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4472 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 diff --git a/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/DiskLruCache.class b/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/DiskLruCache.class deleted file mode 100644 index c49820939a662b218e7170e833d9f10396e9d037..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16738 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 Q?HT$>_?vS@PkVCz542x2lmGw# diff --git a/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/Dns$1.class b/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/Dns$1.class deleted file mode 100644 index c992d9442225a4d771d8a3b16823c06ec2ca7b5f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 652 zcmaixOHWfl9L3M{!L8RqD1}Z z3qOD#%6R6MfQbth^Y}l0^FJr^`_Io`0JgCfqk^X~7O@oJS%l>XD*{t*w9)>pKzXBe zAyC=3T_w0wrx|HUC3OA_$FELeeDDwP(Lz8<@=d*PBF9IPVF#p z*JGKh@hGu_zW1X<8?SOBv*ev|>)Sh|ddlx++1{69IpmDZjrNuND3eT@UUKSlZF)Pc z%Sp~CpB!=9?RInJ9N|jeIv<4n#|Xp+pHnsR+8P&OmGP+^=c#(HgOwV`Zv}`x4@{a_ z$3Y*I@7r!2Q-~rwucLvcz>E7`2sH2JpLDKNN=<9`aRMs^6G`n7MQ!O z|Kl33Q06BJRQaPNE~;fz<1OLIpFs8HcZhFA`9aYTl1qrW*C!2lh#5vSk0u`p@M}il yx$5Q*l)my(!X3O^!1I%a8IJ^^^%+B=Sh{8~FTw%6nsa?A z+OtVtL|xtwh)H+CS>%bP9~U-BIgQ7X=0%c^%USFqmxYZK!@;8K4EcXQSN)OjG{gR! zitY5|ScZ@CGF1A{3PZ9wH<2X$Sfb@K6ykA|874_bCf+(#CgC!jtRP2Oo|q#T6oJeK g*v%V^S0rAjWLTw`Bm{{!utsQL9Ts8yr!f!MKfTX&Q2+n{ diff --git a/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/FaultRecoveringOutputStream.class b/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/FaultRecoveringOutputStream.class deleted file mode 100644 index 5da1b18f81de0fdde8da83f0a0300697650f13ce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2434 zcmbVNT~kw66kR8|$%SyKf`EL3S~c8&@qhRFX%=x%ypS{=Gd+n1y{{8g@ zfJ1O1Xh%ZFKm-9Ks?ml)9cLm4;jG*Y$>E$F&g)24;X(uvT#O)vOA!oXL>gX}16OUh zBEMag!>HVj$>Ewb9+#`@I&MVJjD)nG&~a18ErG^a>(NzvE^EyX_|wz2o3e8mZ$>~Q z1q`?1K%gu2vGu@;JNfv)yk{p|*P0*ky*b|-^<3MUJs}Xx`<_5k+3uC&@JT1fC#C~ePqPCiGH;YpP!fxxW+?();q1)Hox>Aaug94XrpR%klw7nsdpRC*1iv-yII z;}($!G)LbUq~|7&RPxjIteq<*c*t_HzRUY{uN?{0I)xIyVzL;KPHIb*#R>_uY{c7? z1BtG0Xbf8n9V@t6~cOM$)Lbrik*lpl8?g;Eyzf(bgNhm0NcB|}9$(tYPxNE?|q>i)! z6EOo*unoM6qXv$k-@rR^cn_xyoWv;u)5sV&4pzVGH3Fla<=GYJXK+g3*#DKIz@aU# zCML z22n2+z*RujSIsOj=PC#m?`@8IxtoVZTVTJr3eol>YMvu7v5MfD*|rSLe2&mW+bY7# z(9PauR4pk-`#82D%rVaE2eF-Ra3c;=Lr1U={n*cw?xI^n(Zd}BC^$l`B#;2=q-Hov z7=O}Fi1Tgp7gRq%?Q=vX>T6bEti@imcRWKazgNZDJ67-(SNd<*+ac!_Y`e=@`w2Cs zAjSn{s4K(mOUE^{MO#JPQ-oWzwS|{2$hjF8`IO852}$ArYB(Mxlw&+ONm!=|_kC(M z!QUC$o}=}7{ud;16BiV*egYkafnM|xG$EHM-lo4eW5{m@nfriR9pWm;u`1xge0xw4p)Aye~+_~vQ(m<{tOZ+*r_ z`JAos1*3nd@S2R@MV%jG3WL1WN?}Ol5>vV8(Nco>?}-y7{cgtNg$en6XX$ zS**#|?pBiJI6%m@Dg Dn$7+`K5PcKYjNp<_P@*veNt9hMYrI*pyjbN4W0j$}{?#E_*Xoq zN-^a@@BS#uo?S?w%pr%J>3-AQ@6DV2^Y`a30Q-2FLl*aQ*g`pro7m2wf(K@)nq?

yY>2-WkBA|0sS0mI_+Kn2kYhFb0a0;j?^vD86*s$F9vO)1CvicE9wU$hDOs5hu-KzEVPVIz3_cMicY;i zMN%s<@D530_ie0{=`_0Dg?cC=A``kt?dw-)VaVuM(ONUAcsS^qDHO?1(vKsGaz|mT zefcU#)Xj1188d9;QQ~lH6yVyp1)HO8qk+dZ_Tbrgf_)ozQDShfFP~xM(&^MUa{m&V zUURN4eG!Id*L;VWr@45{8QNA~OVMS>`?1ziMbo@cb7neIlA&av) diff --git a/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/Platform$1.class b/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/Platform$1.class deleted file mode 100644 index 620e8da2bc4706497f77435173d55c759d4b9fb3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 233 zcma)$O$x#=5QX1pwOSQ>1Q&`sL(d=zE=0i-#2Wi!n$#rqa4tN6hZ56;d*3i`crbjt z_viTnkYF4l3=t8clWt5ZwuKag$x(85)uvjN{J{y+jY_4qh06BA<@yq0L|CS}V)ou} zBbu7&Tkc%V3gv`RT(Tcwo)AD7@01c|ExEPA65^K2Bv%%vT zm%RFHRfJTm#HV~dBvpw?RZ^Aj%HK%k^vtk32vkTOwx{Rz?R(F;eQwWw_4h}g0O-Tr z4EEyH4EEtt181XhxGaaU490Oq#cL|ArculwjR`qilfIJ~T*vDwrZSkujSSwvn=0N? z@pcByct?eyVkU!DlvI>e2nEf~qOgmeRdh=8!XLH_&r`5_^p>$?=$2v6>VauMK||4; zwGF@Ga#PEb>t}L%kFiIWPnf^7>o03o>4H(GKQbnkY>a7ATNcjo7Oe^EDWU%0km z=~pbnzv;LOhpQ3DvTc2;yNhe-E^Xi`OSv_ntyd(~9VLfQOMZBmgc?P+g|COUD6}*b zIE2Qba@pmX4HRUIM$;KtE{R2-N2s7ROlUfKVZ3T4p@hc*cEr#WMXBPN{@u7!y%&h8 zs;3wX1*#EdRd6s2vpFUOJ0nsP=7Ml4z5=D7AXCl56WJr|-~=siWZ4(C6d$d}Lh{SH z4D5N9UM!BTD?%XeqVJma?0{shkWz1q(wfQ&_7a66>oH-tv%;^YW*xFI|AJ+SS;HDC zl~~NUQ+wdF84#9%Rg?Oca;!C7gi6It1yFE%gG&CFM7Am1zMvY3<>Nf&bIHY1ugNa)T4#aBlq_TM6 z!RmTZ^7^UPywkKhBh|<>^BOEHXm}B)RoEIFEGlTKWf-5i#imhlTZ0Qvg|DH4B?bAK z%fD)Y*Ido}YQ^@c)+!ze;*NsOn#bl^QLwM(GUR!}m8u(YUB{InmKEs#@$OM@WLrBF z9Nm`RVd^2-CA(!;fV9@qlyX#ZcJzjOXWbRk8kcjd0UPAyKWtRw-O>~HnV55(JF>+G zx?@dJv#z13eXyuM(<|7XZ`dV9TbD6B?t$)UUQD%epK}~b7`*b-CBv$Saduu?*K|Bz zG>HN@Huwk3+%y{I819U+>ayZ;u|AH`Q=PzP6RfYJBe=2HDU|B4pvd-ILo6a z!t_2p>*?*FH={jw7 zk*y~%+{50nhiIPaUB#Y9oVChX8yP0Bn^{kDl+R&SHDsDYhS`2()}OfYGm-zo^*`zP zEBf&pJ%7h}{DI5(D`0(!T>Dv*ehiSq`CxX2Ga|0C9wY0Q0@h;~#91VoK&_mM7*3O) z)IpjI2~Lsv2(i=$dmdHu(5D(RO(ar}(sn-5LmDH29;EF8USZq>E(XyGILc=;-=&_P MCC8VguA9>T0IOT%!~g&Q diff --git a/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/Platform$Android41.class b/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/Platform$Android41.class deleted file mode 100644 index a31ced9c4903dfc3408f3ba19af77e771515cfab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2635 zcmcguT~8cU7=F%v4Gcqp6)2#^rS=1Mp(~VC>mn793U;B`rLB~!VVS~|VP-osR7_0# z3Eq3H@wQEDNi>Sr{u8hKNHp=Q`ka|vb}2N{q?&Br^Uj&~<9XlrIcN5}M_+yeU>G-5 zv?8yf4P%Ye-jHHkii;}V#Ds!L6;pUi!L)))Dpb6!U`D~Lie|i{U`Rnh!JI&gXZZ7F zd%<;lr{q|kKu_Veepk<0y1kZlja!yc^0RY>zwWH&1v=LP^P(ZQjn%4~Kw`|aO@CbA z!~Qz|DNFafeBH)l0iW%gf$IXXDQDGSSq0NJ=C?Li40lmqvAB~gI3?Y>uDhmuu58Bq zb(1AGPS~riW3G-43uv>pZMXq&gRh1QC1*41-PzJzW2>BXHr9Q=oHcFVaBbbnE?ByM z%W*eP?L}adl1|yMi=I_v>kTSS*Bn z$uCdJfeFGqS%+xWvWzv|nkbdnmFex0QTEvz)-_aTRE0fj-{n-L!J_Vxn)UVxFKE9& zci?y!0#4iB$Nk9iq`-+MLmpV3RB%NA0-qgd?f=%-BT{lWFZ&zWepw1KJF-0@#d#@4 zrN{{k966SNT6DJDl5xqD$Emr>{B!cQ(9nTSDHb#&@tlTsDSGjuf_F7sMNy!&cB@=j zxy{={!J>w1AjDMd)#1|@=&G4ac%I?Pkx#p>r;w9Wh}*qn29BDi@k+db76Y>voBB=%|Mj z&Nn}BbKl&ma|ypC{9>3qyc_hraER}6-C?hWJGk|PyrfiDeayvm*Lh#w`avb9k5o2N z{Fb)yQyU?nNoi_H$!e}K?vd`4$NBUz;z)4qNM{Cz#110q?$`rF)7|k0h~4LlD7q+< zbOU}s1AfFY{KQZ{qnkV9p)-1Lf=>)1PYtgZsil}M5@>zYqJbu%$VeRlm^e;S*DChC zc!}C6?nH2!S`ud{CCD9SkzTp<7l>ybBJl~aQIBR~Uqe}n4i+Dx;l}4UKK~WerJ)@( z?NV!&+OggH45txZ3XQ>E6l%UI29Y>GJLnr8m6hF&PV&Le0NQ8bGLQbIwWXh2#tA|uoQdz#G) zu@BHI#NJPhSoW}whS*!>Xof3@UACRkp-FCZ$GYP?5RwvM=0s5G_d$l4&~7i9hLH*l zG@P%{Kx4L$1{!h|8fbWhT3qJ9t9Xt1BDfG_cpWcr?P14SaT(9^A7GX%S{umf%b17y E4-j~*s{jB1 diff --git a/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/Platform$JdkWithJettyNpnPlatform.class b/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/Platform$JdkWithJettyNpnPlatform.class deleted file mode 100644 index 9d1080e82bd75febffe981ca00f8322c54502414..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3757 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 Zw$NSTpAId|Lh(O~7PN6};Mk7H{{Vxa&KCdx diff --git a/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/StrictLineReader$1.class b/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/StrictLineReader$1.class deleted file mode 100644 index a87c31be4dbdc274e86886371f335ad03c27dfba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1242 zcmb7DTTc@~6#j-57M4XSf^sQ}Qm`$TrQ)4ifFNlsl8BNJp0?YuU2JFT?5u(RVT|}- zeDhTk6(fnh`=bnJ+8Pa-m^SH|GiT1_JLi1+a8+Eh$yCJ)yW1PTAg4 z(sNbL6Z|1}3S7=n=)5O9wa74=Y%(^R+GdEZ`UTF=t#dvID|s#-Ir%bKdUC$&l(!w} z>3hQ%)i@czU}c5ia<%LP0VhkQx!Q>gA#d5IhFO-OUHQ5(QDo>%rgD4EbH^?_qF8HJ z6v>qlpz->H=i84(5LTEP!`Jr_AJx}-3cY1cy zx(;B7Oo?1;S9Ph#BjsHO$=JNh1(3V)8H)J!CeD$7Up$K3=0g2 zn$v%PGW7q>wM|VLNMsm>e-&OiP<&ZR=U_8b)lgCE+^H~3HI9*8)4yhkm+I00uBfHijX@8_5nSLMK~K ze?;UB;&eo{8ZFGmy57R7>+fJ_W&RkgJK7^MM3Q|$+h-U@Xn((P40C7l2%X<4?HDm_ z0UcCG1L{GPFs-YLhRXnC4BJ+tT3=PegX+aKo4JJ-TF)Qk) zWUw@x#^WmNDCRV@iCPaF846;psNxBE$JNk*k_u15CX_Wii8C^s6`gY$p2GK3d|$=W z8n)ti6wk=~Y!uJQOr_I!Ud0bI+%AZIsNw|`FDifnJ?l88o3V{j$t)=dWsWFNMijJW z3Qoy09B`^T|Q$9&c)ASZD7U*2ba%DPs1&Flq~TifTop#VQx=`4$8v?abm@t*;hN=Qy72fZ&nu=a z$1`2Wu+u!8mGi{n5!1++#{&9{bzG#(X$wL z1yP1FFWwZa@97OJ+J-ah<8Wpr$ToNPOR&POWG>c7NwK(HC^HjVgKZ{ajb6w-y zc-gxqYvMBNP?va^35CA5)fo*UIa+Y%3~v=GfwVA25*=rjpiWx0JtApsCaAJaW15l6 znWfV9fq?-95BA(-l&eQ?TtK0-G^tG#%5KgawIsnE*QaTxRH%+`;BFm5$jC6N;8wqG z{dgWK+xFptpXSv=Dd?^#WNq7=HSB%vYP6O zui`ak@2FEM7mEegGxG`4$rbVpl#boFOUF0yEfufp*e{sYt#WC+4#@gi#U-p#!Y`P- zj&Ea+jzJlY%De3~xIrd#{0Lb=^acz2rs{h8E_v-u6+hPT6Z}-i&&1FHWL3PShrcQHBXvSww)3t)NE0!}tzo0X8RJmNwF(Ku)8@fB{SvI+PbmFmn6PYYI zv&lEzpjt@?ldZ)jQLk|oU>fXwq`m-Z&6K^&G3Hp!> zzIf#I%9Z#G`Ia+P%b!p?!o35@MTApdK<&SRHA{$0Euv{T{vKMF&^#4W7ZF|V{}Wm& z(B7@e)`%>bT7aJHUx1Q~e->RpYYo>lbKCDnulr z3T{bVo=5ax>T=)m$5d7k=cfqx@Al^qB$S)^VFb)^*TF3)U>%B-x!6tz_i{(~!?>dg z?|w=ml(g~BmJ~oyzM>6UQQGRDT#=BqO~u+5v38mA82{_uhsv0*m&d(v5nRADr`GuH zcI_e_5K-&`Hu$1Qes_E8MYO~t`FTX*!%OIxk`2-6k|EDQsbIq*HtvZeF% zmp^(Tq|9IaU$V?0v53xteSGjOtZr1WIT>1@Ru$K<*e0$a(d_bZrF?f6 z(6Rb<;9p+t^4<1Tutgk)>G<>ctMBb;N?q=3T4sLaD=*5RoyXVyd{xo?ISBp?s{?q3 zTF)~0&++LzZo^BsgICvGc#R2q9mjZ+JcT##Jl^E)tCYNj_i+&w{2EL60L%CgU*b3T zH|FsbevAL$cla-UkE{5Qp8n`3ahT~jMy@`TFX)E|ULk>2YB402a21qG zd!jF?*CmHx87@_@V`xk0qVW87g1cim8D_a8w=nZH`UYIMLQH?dM*N*D`6qesB^%wp zd`uex%T**XrfZTRt3%QrCGj7oL2N76g`ueIC0%JN?Z1&OA6Vjsl)?P5if;GNGV8diA3Kf&Zu#5#$`M%;uQhk z0}@aPBtC$TLfmmoa6tkdJjA9;b) zLP;KaPjnF0*D0Th6fgFMO7H2+td>sp#c-ut> zHyKv`qwZ4@kNbzhr#zQa)r3;<{7CwVQbKBPe8Cp?b);T0Ed5iRVQ#?1D3ZT1@8r$R z+99*{uXmE!#fE8&W?o=obk6*rqJ*u)Lf=obpoVJfH+#56ooiE@l)kA+NO9~Qj^VEzk=Pur~z zU?;G)JJu(h>Aa(O0Y+=aVAyL+vp1-*x2fjhn3rji0?y)Gs%qmrE)cVbi>bmTT&CH= P6l1B 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 K8G%dw-2VfwI$$pV diff --git a/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/http/AbstractHttpInputStream.class b/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/http/AbstractHttpInputStream.class deleted file mode 100644 index 2431e5db8ea024dedf70bbb1df5013ecba672d46..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1873 zcmb7FU31$+6g_K8RwI;@I!=>73MmC*J8=YUp&uzN%@=iX6R6X4Xom+`UOQ?X$(3bj ze+rL0@xlu;#ARRx-pUL=is7v6I+~1A;K93BtKDD^)x;Xs)sYPYn+84;NO``%ROONL zjbnR(UH04Es2YXR*_h_7eG*?r_FCcvH;%;{SA+U9fzv}N+ubOsCF8b&j;sra2LhRE zp6^B11-{M?_a~+QKdHwEE9?qrYeAj4pRBM1TiyMd40oJbi!0em;5w~cC-l_wU{QqMdBMyg^-T;;3l-e4@CM!# zm>f3U_Aq6Ean^<1H{Z8gVQv}Nw(tcC7QV!Sfx8x}*s*XA3j$aEy(y2;oD^`__52uO zSx4KHm2JwX-=j16!m#U(bm`ew%DESLE!wC&t$Kd5C0Cy*&t^t9v9f$>@T%qbO`G2( zPpv3(b1!R`&hR&fGf3erM&EPRIorkO5XHp4)iNS9u~EcKxM08L!g zX0<<|i>>0Ub^yItIzZ+p9!cSCj_>mt0~QIt#HfS`*n~fiv$%kByv_=^gk@aDJa=8} zQ}Nw9d?INqS;UbNor)tRJ57v9)t$sW$5joyi!DNd+4=9gimD}F_X6Da?Z0&0; BU9SKD diff --git a/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/http/HeaderParser.class b/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/http/HeaderParser.class deleted file mode 100644 index f8187eeb06b420b8657f9d8a2d87999623dd9c78..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2182 zcmb_dOHUhD6#lM_ZR`y1H#pcKp@2g%eI#iy&?F87QzxWxAW5658tf?^Ff;DVm}b!` zQk6*ERLUY!RjDdbtCkI$ZYXV~{(%09Zu&P$zdK{V72Y6KmS^rg=iKjn=XK}Le}4M| zz-#z0f+?gLF&#lWX5?m8KHia!t7p)OYf^E&5$Q(UkixkL=5aH?!+3IVaNw7Z5Edfn zKqiF65Z(!bG zO_o$+EtzvH-B?Ry^X6vK{-mN>TBV#cH;Rr^PU?oES%z9ly1NBUEojyqiDzA?MXdTx zjjaeYq|JgR(2~^+?RI5zRkQA?t0hX>vu0i`t*DkR_f=st*{Pcvz2qF#as)(1Abcd0 zr%o^xh&bkkW>imv3%aG{9es;F0$XaS!gr{6n2j6%M_dB_vdLVA?G3%WY&d#JV6;vS zGbhQ8F`j^Klq-xak}opaJcA`xv&6bz)E&((t9f$nt_LWOi#-2n7S^p~PRpA{fdE}~ z?4^0gKC}>vJV@koHMG2v%$wGx>dZaPYh_0_jg&xeS~qlOmXVISRdk9veN3J*djyK) z%!-xQ=5<-~w%V4Nkd+MKmV(<@qNADdl!8|;WEz@VqXk-zahF!t*;4}7Plr)&D*l7(4I9&4(u_5y z=%!nCyj@wf-8qzfkjaeIRIECmoGcn_3UrRv)dppAT_fd&(aadTCFqTSz(}1wISDU| z9@341_IT-I4}-Ltj}wwLjWusFZOvQP?Y~7#@+#|)Hx~j3qX)eZ=mW&(@FPU&j(;Ya z*n{{U+tJxXwB5JQPDq@M?xA51fvE;pxs9F#CBfG5Z8UkS)JwEK^@)pp4dPdX{Mb48 zo!dloAB~5A3D0uqCE`>?F9!)9cHz5%5`QW{@ecYuO{7L6JqHNg7pP)?^fRgY(9h>8 zLjVT2iz0%vP%y|VJI3ERq%ee8oX1UEz#>L)3!}*4RcM$%5lL(?9X7uJpW$^p!6kfw z%Xo$>_zG{~8=n3F)A$K9L(npXdg7gz(5}zH(6nu?1wSLN<(t8XIM2S@G zm|C)l5lODjlM!bJKVq0Ce8lFYd8L3s1V63f170Ee#uEcf_8!jowh`Px_^A*(2Y(Oj z(#Fd{H+cYaXykXPi_!LSJ;;b9@3@D>$UWb2*Q0PXW0XnX9OkO;Pq~-AhpWB^UDq?w z*7!D*XluBJz+W{4`k4;!ifCkdn|Vw0W0_&yWtb0+NHn7b<4nF!!XMEYuF?s!B*`j? z=S-X=F__qgay8b8rWfBK*xs@m3%~dl0sn67%iXMR*R^ROek*@H?z@+s<=#un5cvQq zle3B@H>*h(01I1 j5jQY{)J+#u@r>9}S7_{GN6F{gbOZJT?+FfKS1|l9kcsH1 diff --git a/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/http/HttpAuthenticator$1.class b/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/http/HttpAuthenticator$1.class deleted file mode 100644 index fef58308a039628333295755f35e3db5ae7e1284..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3578 zcmbVPS$ES$6#gc0tk{SxK)@+`(wr=S3lwM*3IP+qZ6K)~!di;rsIkD2f-FO58@g|F zgYJdyEr(aiLxA?29-esUf9PK+{YG*mg}7|TN79`;Gk5v!GULDh{o^kHYjHV_Wq5W5 zoQ&HJi|6C0K_-s5$i~r+eQ_+sfTZ@z*8w?uFor`o9LEv75XVuxsNk6V zYI4(H9PP-(F$7(~OL5d=SibhlEqTc{VmOWyl2?dh1f~K@!Ki|h0@2NeX*gR1s#{tI z1R^PGNEevhW0?Bh(#W80_iKX%a_V}loK_gnY(tLA%!rdWiUJT&)26B0se)E4>f~(d z$yp=G;>nU`>!s18bt3OLqe;VbblcPlNq4lHtZgMHubYmM(;UlgTH8rMTEL<=wm>{( z>qBypRuDMW(sNupr6o<>N%q;+*qP2?yf4#J9+e!UknAyvPG@UHLwZk4RUBxb1rce1 zz=}X{AH6zl*+ZdChGlYTESJ{`1>GDbK(SOnCm&4f8QY*kVUTR3|h%1D6@hIi2)(=?P4s-+X74k>Zb4(2%Vc>B8aw;50KYYvoSp zPI;CdFC5mLl*IzbIsKMg;BVY`AAeh?3JyfZvsTH@={pTsd-c;wWsNKXmT9+{D_BLt z9Nwcld22|4qhbYCDk!Nqh0_YgRGh)fDqg{>0;?+(<+NIu%t|KScCBdSRE*=Sir4VE zf;UvWDF-{yt>P`bt>PUyd>3aGyr<#=oKx_jijVNIf=^U@inGi=w_ppJIh@QoHf>dL z9v7sYpQ-p9Unuxe#aH-RpusQgX(+4sMk@Li=Tuz8cM85&@dJKT@e_Vl@QaFH@teSg zN)Fz)>r64RcknpFD9~6*)LmE!ta*S{O+j}NnCH4^Sjlv+UnT>0#5d^^{iR$_3?82qi+N)TR1CXYZmZ6u#Rk(iBPcS+-|XT4078 z+m>VHEcU!wjxxGd7!hdlC4?F@kCP0I(2MM${cLaoGw&Klv)!42?um4_3B3||^3=43@H^~WN+@=-z&oHXFQABDgYXaZfIX8p5WDT882+hc_oeT;c3B9BdH|6 zyvw1c?K;HoB&yKFchqGz<8jiew*bv(Y|C72`Ce&y@=?QJO8YjK&-8O)pf*4&ETWT`I+vbRo5`<24;6e6VcmP zl!#7X&YzfjP!e_5G4BTEU%hhYlDJB()vl#0X#;54Qrgwd-x~h1ymueKI$nC8#3(kn zUhJl&Su}7qN$-}Tm!PcU6}uLBtmirji(U3nQX8<*_1nfKJVjI_?`d>UYbR+B6Uo_3 z&NJjhxOxk=lBz-%>1{qr%cw)zI6e)f!o5&xpTL4!sFz4gV4;VXBo|EsEFl3?5{d+j zD0_gB2mm`D0<0M^8q+}tItkZi07v!Vhg1s9%Jl*Q+WSU#=bs94M?ct*i78PBG$7S9P?&&xQTLOTv7 zsr>~RFUojH0wkz8%hH`eQ*&M2m9Ttt|LESKolk8W+CH#vc&~&F!+E=yb!W?(qnArr zduGb>O4;2r17&YYw>%@SdA8FhA+go446k28G}AdIAvS1F>JplV4NKouE>7sqUTwl8 zrDfR8Yv!2d7-C%|#=I$m%D05-GAvJbEX~aNns-qBQr#;`j-A(CSI~Fp+NADCxR?nQ zw$$)kDA!_@Bihq}RJZSUa!+eVw5+9j**%VZbgpl>w%#`~+}C+P!ZJs9OSa|e+YQ~E z6w&cnOwB4}M?J@|3Jk64=(Aojo%`|nZAS$eStn3+PcGz$|f8Wt3 zMKNinj1%M^tgR*78EW~GJa*JiP~PgrH8xjTsI%nYf*}$H0xN5FY`s1`3j+H3h2cX- z^LoiMm_ZpQ8TXRrxOzoFaO=OD~%`e#{Oe^ce2G;g^ zN^-2?f@Tglg>sSgTFbtQVeFLgvWi#mcNwp$_yj3PIT8)a3ol)@_J}3T$om^b1*TlW!E)|{Vl5qDQILuVlgS&fT zTFGB| zqIH0@6ho|CA0}prxe``1fVS?JnS?``I#31(T3-v`Tzc_4uMeSW*h!>N8`Ux<^dY$Q zV*xCz%2eTHamR_eIs)v!-xLj22xsAQ6p zZh6A>`!TU6lMDAMMusATEL4n786Jy8%hQk5VR}UAu=^K?Mmsf+5KeebXAXqur#3nr z)h78qXl)b~To}G1_}tvU*QR*RrNw3BEQW}{LQ*zybvH-8_7Ly74C!l5BG}AtiX$*W z=22uhQv)X4Nr6BTf8oK15FpKxCq>$^H7leyKf&^rNN=Jg+AGhajg)rE!{ni=F9c1HW#x+++40arJ6wN=nk!OC+;%;S<+t?G?Md*ZF}bgY8b3pmpn z?@6R%t?`!CS8!tw$*qajcm+3AknWYm#ueNw$bw}}v}FxXRd917%^<~`3e!32?BEx>V5vQ1;*BJfR`8(+}%k~ZY6=#{%cbMDv8T)fM&OUhx=Slq# z@8Kg{WVgJ;X89#P#lP7l|4X?)vDb-WKg>AZPuaWpO;DQ6{D=xT&dlr~O`()-JWg7Y z`p=VN3-hs&nnt-B=jk7@mot&~pZ!|kgtL9*BSulz7$rq&nGGm8QpU*_!4u@!PYuBh zT~CVm@uV`!-ilOF3UhXP5eC()%c!Ak!(4vb8nYNQv01? zTD4@%00!qt5Qu2g<8dq~vQ(~zz8k+ucqEboH+cEwO5>dcC*LXV=+Tu#g6xRr^ zyO6qomr%9Ie4)J0-*Q)pcgodS+hOE$MVVIgs$MKEuP}`NDP{Bo?eU=LKHJ+Db&c$= z%4Wb-5>WxSjWr3iRwQ`CoNxVn$_+x>)i8G7^X|5(qgXB$WuaKj z2G__-k)8aC)QfD-C!~+jTVBZaeTH>}%)$rSYx516va?inj?j6-JKn~2cn7Jy2~2{G qY*B?voeJIdj?mww`&)Zcrs!o{F?JeP$)<6Qz8C4WiP$C!WPSoxNDHa} diff --git a/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/http/HttpDate.class b/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/http/HttpDate.class deleted file mode 100644 index 671b93be61da6f88df3f560563b4c0a062a6459a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2204 zcma)7Yf}?f7=AXl-NbO|3PJ!2tyH<1ioIAwY#>3R2~akIDQ)ADtgxC3-E17;bHDXp z^ow5+W@M(0wo^WI+8@>SIh#Nd$aLJ9ocEmfdGGIePyYVr*LMJJVB3!m5eZ-p^D?3V zxDk`FAei^WvM3|&$9+5qKtV#l$p8kiBx5;%HbGYue4}7hfu6jX?-YEm;0GBQ8IL7ELNHz|8rFPXFPDw7gf1-=S&BwhqnT(V70WCvuO=fY2|bCY z`g1*;*Na=>)V5{lxkM?e=Wk2!Yvxu_w=0$*A>3MOrpmUB7j`(R+r~o4D(Lp@S!!RM zTU}n)Vyl_?<>X2v6`xDQ8Xae})M|X`o+jbqMuTn5w#?!d)d&Ayoq9bry|d0Gcz1NG z%%F!y&RZU>vMRQjcOs@M&wMFI>5hb1G?prbO~Xp*n|X3nrxI(rWr}l+DYGag%g9OS zYe;@Yc#OTs8auXGD$=O$iBk#*ml~uRN+dxt`HM5!Y^hSTNuTTaisQB3kkfLUq*9N& zmWb20Q?btT+4*M7qG``caF2|xFDjhz?}W{wZCFJ; zA9hZQWQmBGjWUzX*USX8QpL&|3#O=0+lkC|5pxh99Q@E~J@-oxD-6pNw1(2A%{ljjbSO?3UOu(uw!aYxstQPRB(<5hV=7 z_)QGua+Aqqa&mWfXmN46P?#>4hxYdNc=PbO!)XoH^jd?pL>#d0vbV`>JsCz*gIWb6po!C9nzTfmb*M!swW6}7XF!pC zt)}O&vG;FiQ#+S8pBhC^4bL0LVap)eHPSdoRUO`<>a}o&&3OZO)m;zy=BN$x zRRt(~t;I8QUT$;^pYpLEw z?f}wjxPFIw>@__5i39l3i9g(TNZ-v4T>b^O4j>OqO?yI~KhggNN}9;P)B*fQ2uynf z81iT#kI)`J-koI5wAa`gHosb5TfwMwKe?tu2jDqYwory8fvK{dy3uqsI_ zUpY9Rj+&L5q{51K>MeWwooj&yvS6S`hs;IqO{c4D7K<(ptLG9-n wR0p`Wsh71w_(a#=!hHx?gef__Xm_e}1p%HOI~BQ0%!RMn5s=Flo0I|n2O10wT>t<8 diff --git a/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/http/HttpEngine$1.class b/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/http/HttpEngine$1.class deleted file mode 100644 index 333dcfd64ff4b43eccfcf51666407eed057ccfd4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1349 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 diff --git a/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/http/HttpTransport$ChunkedOutputStream.class b/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/http/HttpTransport$ChunkedOutputStream.class deleted file mode 100644 index 21277c1ef82cb4a82744cd074ab4bcd35668f4cf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3069 zcmb_eTT@%t75=t#q$9)uPPi2#DG8~QV3As2Y~l;X0SrNnj2$CiWT(Lg>0rqS2_GFL z*iD?olh-`-v6)Gx)0aH7FLn#|v>pF|{*=D=weGj}5f>+pJIw^HS0KXC0hjMFKs2g(N z$g&bg5jW&=NhnvSRatHdTNbJ!FK)@QW@6n$O~IJGn44D!U7t~iFU(zCKAU|vn_p6B zpU*B%=ay#|E-k*N5H7o$3T=&gan1G5H+_Zv+%4xLCsV0s$Zj(1tE zxmjDwxwV^qSwUqLI#!yitFGsk^ohbNyRT>N`0ljlId{INCOTQERs1Q1!QtJz&s@nK zx-9P3ORhp!u2ORso9ipCmv>gGlyv9nMW=e%@hZZ%goa+6}u?WW_o&5cZbt?c_7nM%!fy_!?aXl{X`yyw&!8+Fe=_#CZFN4(_t z&Q2kXP6)DLF%*DhaQ(jcIUM&+(+VnYE6=YFh8|92Y4PKgJh%~4s#WI3WR{u9(N z-pOLMg`)UUz3CO*`HBX|Gle@WK(;W9L$b_R7{bdIUc)afHtG=*w=H;RSU8B+6;eB> ze=crC!5Is0;7toYW=u3Ke1wlJ%wf~Q9nms@w=J9%GgCNY;;x01n47?FExaPsC-~ID zv|M;q*n9ZQ!snvv3x(OA0h0=2FVr%<((pZ}C|$nW*6f*`xU=VXLG`~hJ*P)l&rYqW z>eOy#&N(t4!WugbfxnM9ZwY#;()w&$Dw5{0O{tvv{uVy37k5{b4dN%8{Jp zp92$v0s>Nl0s+0V_T0M#i+U#<^-d7#oe<;RhLGTv{g)>9CqxkDUPwPeC~e385i5kl z`GUbO!Y|6tZUg3r5;VCm$j57||`5>AxdZAltTu_yZ~r zVT9`-qU`zuFjNmtszIDl3FK4~S5*pc@%+`m5&Vil%1=T1iEaudA%ytL=4v^C`zf!%(F2*vm64aC)(=-}R~4r!Zd>WHEfb9#pgl#>{3DL( zy(KO^M(2bf%t*4&*hW`NE?5765thLI4hMzftv=%sULtJ-ce{mrh@Nfq^6ib&sXn8` zP`}#C?+k2uc9{9ipk0ljOC80Kn!va^jwyA5xju;{HHCsYgJty&ZmDVb>MZW4Iown8 zoE7itoJ=tz@-6Oe;In3e2Bh;-F0s~pD;fuOn&|JUlOAnCS`e&EN!EEFTS9TiwLU=tl#@c zs*A{|rG3~L-Sux&SCsur$vfJ=J+FpjQntKWq@NN+FAetp9>xQyfq1cvUwq&4Wti#; zVyXa3T|**;n}Pq!0X=K-Cp5p*+s4$c8P1J z?Q-q1S81Rxwx^#~BeY8Wq)cspK*Cgd1a{J8C=0ggz-?tScZ)m=F)tbJ-J}wz;xI?$ JJa^c!{{sB+c&PvY diff --git a/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/http/HttpTransport$FixedLengthInputStream.class b/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/http/HttpTransport$FixedLengthInputStream.class deleted file mode 100644 index f8cfdc94d59c5ff05122c66e9561740203feff71..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2111 zcmb7F-%}e^6#j15WMR921(H?@nj*!J6av^{YicV*kYEZ3lnS)fWpe{-!*05}aj3s$ z{86prkMW^C(9yAPzVxLtN*SH0@BSbD8;M5c%7kX<+{(kS-x&qwq>s}ut|o{8Cv*f8Lq^#?-=hINy|xQ>|)8E^IdMNr^-&7 z`^mInuJKuZt;9V)l{KC9q<5`kxV%(MI#<_xznHXapS!kENXpd&xyI~O%jT)c-US9F z?c_K^bCx_)rS%o=&KoNQ^0Z_f(D?Keao>u6&DGaHY)-i)O zbj)H%#~h+6=5<`af{KeeV(8WJCWaW=rJjUzW?aX2Os7yK!*IA{^Nk`meV&VQI~R5G zQBNvPWLwm+gk>E`4CuIo%Q~Jzw~8w|-oo1qrmNyXk_mr!ahJd`v~o{cS7vp2z{QRx3He2@yUz$-cxn_7(jbeT_Nx4KA^7X`sKWA#Ya6n}{PJ$(uNiK1tq0KUsC; zKSfmg{zaayiwgM}SrDMBmbF^LNb>`qPY Yp8wM3MhIKzAHDWRl*b8cwO$3n`q&iyB_iFqJ|ACli=fc18^^CvZmDSv8zZLBqKe3Yb%; zUr}B$f%6&`G+Yo!dXBjv{e{36=r6u)Tr={PljpP+_)ESkjm=4cuF`wH^cLl&VcC|w zCLrbn;-@(APYVoW_dho`a#xPFW9zpXR3zhNp36@O=mOjy%QL&3~G62W8L>_dCT^tYa7*k zI6KGCvTN90&2jys_sPslcD(CaK7nc3)#*Y(VUL%BN=3Q?k=1F=oJz%$q)8OG*>nP% ze(KDYDQmvv*q(-qj903Gw=NLPsstTo)$yc;MF9w$zaLNk`Vte9DtlyWTn!UyI4*GF zKcwLWmYl#f<*XIH$sVr8lp1tAgh4fo={SVLIv&J;jwOs~Sk`d~#4!-6#+H8mg6sH> z=~SDf@F~N^s$s9?DJP0&Isn*O z6&E@zxd#tY@E!4Nq6KgmR3qHU(B5{nw9 zYNuxZ2pqiKR)vKYX4+@kN4k9IE^}R)8}p7oql8r!7;X#al5bU6K0LG#s&~pR&+IBU zo-H&~Zq#aIOyF2UpDm9yIkMZ@EuqHyv0(k9_p?4 zHl2G}j)%?0dx$Fn`L?{=OD@LwaqQlAG2iU+voUI^=7;SfM2a(+9 zHln%AHew%z2aa$|hs$4b{0d2YjV^qHhZ)cCAdk^LN~=6oh93rcs!)VJHBGC^++bN% zW-(Vs$LOuWp-&JWx}N(OvG+ej?k2RAn@FteAem0paX`iE(9@mthwA96qk9KEpD`RA z9c18v+zNLLU6*^19^pR&@Ga|nhXeSY1pI(g_z|=C2^aBmh&s26qKSGDkK>6D^&+wu zAzETYj$Ra_^kZCml0Wuj<0iA5say6CP5J{erBKyz@NUL_A(~(LhxHrz_&uzx@1ASa zZq1%=X1^L%1csa0W7|k`5=)Y(PDNC@S8;Kt+yLT)^9RfQ$#Q?Alj!<|Kt@Dc$`0RM zwg*(faY9nhv%s<)v|4U7vjcG_c|64YMGJRYBM~>_MB~LZJQcpUiam{Im@I;4nJ$9o T@Ca?1ULWQ$%w6NO=t=woIzaNr diff --git a/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/http/HttpTransport.class b/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/http/HttpTransport.class deleted file mode 100644 index 72a01136c72ee2d9fd213722e94ec972e5872944..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6941 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 diff --git a/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/http/HttpsEngine.class b/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/http/HttpsEngine.class deleted file mode 100644 index a3248280afeb63f277af253ca812246359683d07..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2567 zcma)8ZByJ-6n-x35(wd~l$MpY(qeVrAQfL~yR|I^D(F&h7f|YJ$X=F6NVa*Yte^Y~ z{tCbNq0T5&opJPw&iG6G6^`d7VK~tmcv&ihMrr7Wq7w4{?3+ldtY@Q`I^K1hHCHadR{|a z-CLrcdDGyQS4y-nERQ>uW~zbxnr#|-vlK*BP0gySRnIZ3`e}SC+LudQt8vFoww|{w zi|d|YTgmS`nN+yvG_`G$ulioY_lO49_Di`}1am`wDJb%minig?eiH5qOsI&`Lz+$M^= zc%bu!Xtpb%LV}K%a7uP6S*tN7qRrNUCKRV z7|`P$4CBu-X1Hiry6M;WoKIbF46nItRl<@BZ83Cb1)x&rUbQ`r6WLsVm^_d}WW4T^ z&`nBb$EY)0CHth&46UMgq_;lb<<4B429*N)j!FG*GvBC`$waQ&zN7Q|hEV%(Os+FR zJqpHfPC`||IyR_&&$u-djN+_> zQe?Q41kx5BbwM;cx_C#UP6sz{>&l%?>}DtNsH?}+Q%sBh}aN!+9R}cY^x=2sQ0fZbvy(uku1QrsRF4->WGqLlnbT&ML)H_Vp zi#t2w#(&J$Y=_)NVuLFpsex->^gW+am8&7vR9EkYQe@}9o^hq9} z?=Qg6CB#mv9$M3M(EdE_zJWx4z*N3aoX(^&=}gZNSU!{f1B03LA-aA;_qRx~ACdZ= z%(^g6&p~w4Gm8P_XfX1~&~7P&!3&t69RcD3E>bA5qER7Fv6{r?z;}xLrjQEGUcyzR zgVoD;h3I8zog&X1J!v#)C5WyNg1{Kb7eZFVC|@{2`XsGs^kW9YPy<>bPjYI}8i5E$ zUrrP;9YNoqUtyIl{EnXQXc1;93I)u@VA3s^G=)$Dm}^wxkYSO2g-2KSNsQ|Oh7!Jw zFc=}f7I_LJ;hE0=fYg%{1WGaIV*)9>jyEFbuc>6B9kb*t9iq2f_!H7o^p$BZ|Ac;q zm0zH26%R2`e2T$BXf||&;dZ2RK?Clf7kBAjuQ{sT0?}LyB2R|s5$#@T$(z(fM*DGG O$6Hh^`aA}lZ~hDM_o~JK diff --git a/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/http/HttpsURLConnectionImpl$1.class b/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/http/HttpsURLConnectionImpl$1.class deleted file mode 100644 index b308de57b1ae02a8e83101f60cb8c48a74e2f737..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 285 zcmbV{&kg}W4936uw=9XhyEr(TxQVL}5+WfUV64en#?0E8^>7Xzz(a|yvy(P$^Civi zYhUlj6Tk?a06~C|5bkV|$7-HxMd&TO&)j~ynp$I2>{Dx&*Gv!3@-7M8nTfS^sY%w# zpX@O}n=py(Rk&Lrb5&%*UQSF9sqrc|Qj4$p4IPXKAas`OluxyEPB}tUS_v&pA~uIJ ipFkM@>k##sU*UJlsB(f;4RxM1G`P38Lf)ZLMa>U>x=?%o diff --git a/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/http/HttpsURLConnectionImpl$HttpUrlConnectionDelegate.class b/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/http/HttpsURLConnectionImpl$HttpUrlConnectionDelegate.class deleted file mode 100644 index 3d8d0c33497f9f9dbff6c7cff11e3e9477ffa560..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1894 zcmcgs+fEZv6kTU%nNmims0fIPShbYPfS@2Hz7&lljV9&t;EN9RgpN#S>U3)QD}I6T zO%pGP4@O`8DC0WQN((K?L=#_T@3Uv`b@tkq^Yho&Zvd9CoR!yKCV~xrN3kCJG6`xyprYYS-!2#En`fP6&P0_yS~$=u_+ySUAKT1jVM(~pLz-F)mQf&fuZA!S;kVxOkld_wa3^Cj2*}zEXPqdcD%e*DwD;P%uE|Q zOr*1EOkk9;+p<*mWf)PEwW{aV7&+A$*~25J_)S2 z0t*q_-1O&W%tcH14}OY^bYg`jI#=k}Kfb&k+|E2E{&7v`r}+5zgW~rP3~7l>SP)h%x@< zTZxGlzDdc=M?Cux+IuQZ;C^KkG6Xc54lO|L1tw`x$>k|k@Hm5GKM;R|l+r$<|2y=z zh>4Scb_d{i6ObtzxY`1IO0IDNCbF}Nsc188CiEKH5TL1t6 diff --git a/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/http/HttpsURLConnectionImpl.class b/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/http/HttpsURLConnectionImpl.class deleted file mode 100644 index aa17ef97ae175f749f7788cb9d50fd3048528f07..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10545 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 E1~tXlF8}}l diff --git a/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/http/Policy.class b/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/http/Policy.class deleted file mode 100644 index 1c4d86e74069e28a220855e7b71f9e34817dbbef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 428 zcmYjN!A`6tP-v!6~|;cNTr*8{anoTPXisxhnFR%Rs;k}{I5W* m%*Ub(Fdn1gu!@?)6Vx3x_IeYiZf@=QGqibwz&XDqbbbIx*lc6~ diff --git a/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/http/RawHeaders$1.class b/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/http/RawHeaders$1.class deleted file mode 100644 index 6782fae1600b268022656757f31c945ccbeaaba1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1025 zcmb7@OK;Oa5Xb-PIB}9XG_<9>LxDo`uaK{Mtu~YP>hRXm3 zxno(n(=xg1>g1_*NA{WOzVo@G`!m&kJN3MoYFM7`Slm>@U7vq=t@E+&xVyDFgG4uG z6wa_$?4I)XTs65hQ8mvotV#W%r_^C!JSgl!FdYn6Fh|2vedH}-Vo!h(K311G@mX+E zW5{U6#NwVG)Ye$Yw#4*3!&Fm=l@YXb{k#MFfd=xlt&wTF zB>0W)P3^ISl8g+pGRmmP*uZs${Hol*zsazFxsES^A|(u4A$vs%gK`-(!*=UHYoBy_ zTDzxpjyr?)$x;7hyH5vE^H%tEROwAh^oY{*XcII@G40mKQfa04g=F~~*k>{X$TX)y z=M&_}mZJb%!ByJPcf=;m!DWwN0j^L{J|UTySAHWY%oUo&`48oy;^R92 diff --git a/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/http/RawHeaders.class b/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/http/RawHeaders.class deleted file mode 100644 index 49344dcdc9971417ca9984ac5c7e39a6a5927603..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11676 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 E0p;){BLDyZ diff --git a/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/http/RequestHeaders$1.class b/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/http/RequestHeaders$1.class deleted file mode 100644 index 976c564c33d1df12df606ccda0305b55ebc6d68c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1577 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 C;0>Mt diff --git a/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/http/SpdyTransport.class b/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/http/SpdyTransport.class deleted file mode 100644 index 7b6a45b6f9caa9970bb3f24fff91e74fca44039d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5184 zcmbtYiGLJl8Ga_&WH*x`z%~h#Xo-}zIoUuhwgM>-IYO5th7ctcb+S7oLpC$Z>?|Sm zs8?;(*0Ua1k9yVvYpJl%qOB*|df)f$-=RM5%FO`iSd zlTQKIihrmWz+4j&$jD{B2^Q>TWO1tDU&S98a#ZBts+7o!*l86DIHPi6Q6}yZk=Lkr zEnXMH>tncE6udzO-zYL~lFOUr^(`vy!CO__i~D5kZSwSX74N|PGW&pvcj8^5`rT2y zM@1**RJ<4OlaU8S^!>8v15tcX#f|t-3}@y3;V2#wiI1r0!AG0$F??KJACBS^QG7Cr zPbpAmT{pYWnlUXy!Iosoo=@aX<#or%XA}0EOeRdrH5^ONB)qqSf&2~yExBxZamcnT zBjuX5rC{6g8bmyCq+$)VH0E5#(C2H~4^|)XkU!D!e{H>uW=^Qy^^Zl#Qjk>)^%7bJ~>_F!!VhdjwLMTc4b+5*Y273SxNop(~k ze$y)!6}x?l>}d_RV!wuMxLLysaZ41R(ePP362<2&uWZ~$M7;+%#r;ZY6yM0Pt~ z6vdY{JcivG&dbQ-_=<)LxEMu2!zEl+5IZpdZ0{Z_h$G!p{$ zJN#b3U~M%=tvSnHu>ATcZ7h@{4S&ENMe(1a__Kz;;IA6~hQBLF)Ye;(PHxXKBBRqM z*%%e{)>aZ!f0mC@l^-4r;8W07TSvJy6P>J`F;i?CJu9dIW1cLxZdYw1zAUNEUA}*b zw!>z^##7@Q;5EHsy)5^Sf!fw9*AVQS;a2s%NY^2$?#tulaYqtYDp0E#PIz}SKxsJa zT-7F3N(M!JU}Z%;sLoQWQ=#)x=aSh89Xk|Uw-hR63Gzi8BApMLmhDWIS}^l4Od4>G zZI(clP7meA+cQ~U)YMw?sZ#gyne(X=0Lnb+>9l0BI#0)oafFro&i(%* zLNEf%?y<(TN2>aBycAZrLod(mfR5q3Hd)3(iJp6l!IV`_P1QI~1Uh{kOhscVWAcE= z6feoT(K%t!kS9aw&ZT%4mSM7)%yAwzCd_%mmQLBi?N~9;TB>E0d#fRpv2${6_7qed zl;S5Gd%haf-OmA_M)*}cVLszPjfUl%C#;sO#ywi2C#1f*riZ5#ezDxb~NzXg;nTA8$aVa(N9mdcz(1~hI)&Btind@!Cu-P;%J2T zm++5=Mc)sl4UPN-9uON>5jiiW3s_b3pupPgKdvrdP2^$3;%gs4Lp*-iAEn>dC>ZJW z-&*@GqpgpZcK>}{0qYC6R$dC&usssl-q6FB`rZOM+9GWY1w8K}nmHnWMB(`bTz5|a z8_QsCgGT4JAMu;&h8`}X@)(+x4Q`M{RCK&G3WV;F}R{4R{)4kVd`G(kL!5rQ+re~*mvsi6X_F}&0Vi<;~BOU7J5=dnw8!P9*9 z6VgcC;3~20Cm>d|E&LkC5zdDbFi}c?$2(c;!N4RJu&Err>X|zLmClQ5%`?+nR2^1$ z6qA${W$`-TM*8Dj1$6fdwdy@;ZSau0 zgI*^|ufwF*C<#7>UZNl_^!Un)F2p$ZGQ6B_ts)7J(ak!J#4yFo)Z-PD7ngmh<5d{E z60a({e2|C>uB}(lBi_;NUXN0j&{rnCkMYqE#;pOyt#~!`D*e+)aYP_lpmu?zqvI^r zi~g(J-n>1I{sOi{&eflboa3~gN*{nJF1QoT455vbS%+y{3nK(TM_{^x1R9|ss;9&W RFOUvWX_f#eFg?8|{|zoU%Pjx^ diff --git a/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/http/Transport.class b/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/http/Transport.class deleted file mode 100644 index fdd63f21d1d4488a23cff7f0ef8595b7970787cb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 671 zcma)4O;5r=5S>M&iijY7{e%(|HXc0TNu!a3ganKSZc7=UP_|`1RQ{R=e}F&AI0dOt zP4u$Oyw2=<^WMIHyuJaz1)Mr?xWKO`Gtv|4$H=0ORm z2dI|&GN`#rBP1GrBfQbdr~0=+4Y}@5VJarnWOb~c0e8EF59?m`iWi#3#8OyeCFlbEux?&1>O zbFpE<9zJvN5f)uEG3DYe$^xq=>wjDe0=G{tu)a0Wu^;IFX)18;U{E&?h&_6MPd;cw zt0M-$5Ilcup@%x`u`^zgU}rOxZ(VJBnRJCxi!!ssWV(DW(wVNAz(VYU(j^%h?lf;ILD{MH*gU)C*VA-O12M0yiJc8W=vSuSTneg?jFaxn8g_87`3=| zk$=w5@T}h%%X7u6zM7r;6}iej#wtI-`U4JM`RB;zUKqbRJGYO*l2x>FKVY(A{fs=f z+FY#87Oj1Z7p)g8leJmHDcbL|%@1fTu$2$l#3Fwsejv;I0#>kuDwgT3p_W3qnYD2M z#lt)+7$_dAETm98)>$BwMFP4+%lZ!}-hv^hCi6_@^uK8Sggy3SiioXF95$Nqd7XuB zq)oV4+OUaH#!75EQ|B??ruYnLah}6^X~;;)`W`k9Jas771r)gP7I|2vAa^KwgU75; RqScY(W?pk#g?Twt{{bDib1n@}+L-QxLNfqA3~}7Q7)$$-s!C+yUggN|f+ zIi5<+=ACTDiZ5u0ETx^L#YH=lwPy3nR>n!%X$|e}a6XyNFFBTmo>o7e;;PwPK9RB= zYnJ|#>8zDW$6xyIo=e%+@(DYg&AbY_h+_9 zN~ucll%-u%TN{)(m$}p9JT+S}-HqiDm?~CUI=n-Y@x^Ugt?K65)Q;*n%^MVQYMb?9 zX|61r)ba9ejmj2U;FF3P~=FoqEg zV?@kxF(<@~iiwFiDP~N}xR_I7PK%ikb4JWrM49xf(>K+51f|;0FvH$qqI{ty zv>)Ml0q-OBcpqu~YAnL}myl@9pMXcPZ4v0vXYjp%E(<)bEtn+}cBjF@oEqoea@Gvn z>+sSwus1r={}le{z!L7s-^6e0ejEHHf_ zsYFXlWP24S!rf7k?!y(b9(+I{DJ-;vd`U*U4?aUEHS+v|cY2`zTl9?#jGxzg^&epL zeFJ~5{^$#@_VAxSwO1m$mFpQqDER;d9b;`Iq0@91q3pCuO~)bFOqFjO_G6K0co@DP zS6fLABEuHQId7d(;LRz`GyG+yG|!Z-yi-cqw@xYe=9JP*$!1DvrgZfkQZlfFWq0GW zhpZ?+?b^@KbKPxTugCio;m2rK{SKX<>UXNX>C=54)$daMZoeLI`w`XO70^w?C3+OG z+tAIROYBj^UeoX6Pxn=LQ<6w_}ShR0nrposlu(Da*aE_Far2h9-Ixy&KO z95&lzo$`D{F-OfXgS*Tz#k^;>d(4o_44NIkQnRiB2cyYog1^`J0G1xj>Wu zSaL=adz_p}s+T}+AA#fmA=tzL0`K}ELR%9@2;nA<5!#y=bRI*K+vi^YX>_vP1Cw{| zAo}?94)C}i?Q1@4-|?OPg)j8)e4GE^tNa%?-qX5w*YF|zc#!)S D>~aJVcEKtL2~{n%6jX@_7Q@QTSgG5IJ=mV6{WTVR z03U_8 z4aM_M487g6iK>IP#%FlKkR2&mD(4yA9)x;}pZ^KW2S>(O@Oblv8)wOowm&tCI7J=@_7w*bTql2X#+ZhAD=E4u~ql~W; zF>F~hFYosDyx05v^Z5nf3PX-ljvhy!}t*eQXE5&d#y3g!N`1e{mRhPoPy;fBz3R5X(q!zx+ zH=^-AG|cnA4Q|KJ1b(!&%haUMMC$FhE|>B{GFlIt4ylW&>rhQdIYM_=A@_0c;sg=Zgzkd# HAc}thUEOyK diff --git a/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/spdy/FrameWriter.class b/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/spdy/FrameWriter.class deleted file mode 100644 index b7cf34917c26b629f4ef4f31592d30b6a29ddab0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 955 zcma)4U2oGc6g}SBrY#$EYy-ykx3UMY_B@0H(ZkuYnmw7g0*o=p@^4nGXQn_dxoH>S#xK=E#z?W)utn+8~ zcPK3}6Yjni!pb7&=F8aooGb06)gt3APiK7JT4VQ2DucB~D!gEbsQu%&;hw^&-!IQ? zC%va@piX)GAJT)r^trM&CTD2mB*4%j*`V1PnKx5GH@PxZIyKV|IdwoYX~y$-cVG&e z$ODxT*gLRdB0pJ0240p!rP=-4;e{lU2)htwdUSG1o5ipeAZ7SoW}Fl!Wu^5qtbcUA zXe|bYC3=@>O;;P_1x@;E(O-kU5h3jg(m|JU&N;Y3>?N!acNJG_BG)L=!&*(`Iz`s8 nu~2anH!8@@1>_dC7LePOKJVb}0_R?()_pv<$f5JY;O5aE%_P;y diff --git a/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/spdy/HeadersMode.class b/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/spdy/HeadersMode.class deleted file mode 100644 index 776cb06da122bd1e55661143b30d78cf7d3b76bc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1608 zcmb7EZBNrs6n^g3t=%XvwgG}DiYOZh1q9!Qgau|G884xeWcq=WQJ~m$*mWc({vGv; z9~2Wc8V#TQQO0vGbxa)})+P7syglc+=bZNEudhD*f$?(k!V zduI7@mml{ObVW(tSCCMURM5?>4`e)K=+rlsirac|ZCfvF=CZ2{TE0{%YtJ1 zTIKnH=N)O57Hvj`&iR4e{}0fz9Lhb59q~QGvRC$qt7(+8J5|&1gzG6oqS3YCnrA-W>d){` zM)EAyx7LG|xsvTu%Qg_tIkoa!i*1<~t5T`CCG)YxyB=#;qY2)16+L{BdsSpG$1vW~ zBB~g`BNf*%q#}X1iX=a}_#tfFh%20jE};(${iF?%=Oc~2)-wc;WC|J;fquJ0IvA)vj_-lTLRMP7lckB@r1x%30KLYo`qo$*My%sLs7is z6oT{vB9OrbkoG!Ax+%zoOh%f5j5Y<4FJhuK0Z}jp-XPxLSF{xT zDSU%ej7Ni?(e@D$p{SBjWTCW&grW$gBP^6o`8y>AsSkQlqR#5Y5H(gWhEM1V{t=9i h>uf!G5TgGHwA23gqnobKgBcoEz#rFbjFUfriQiciN7MiS diff --git a/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/spdy/Hpack$HeaderEntry.class b/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/spdy/Hpack$HeaderEntry.class deleted file mode 100644 index 9f8e820de07aa5a11d3482d20ce9e8c78fc86d7d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 929 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 diff --git a/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/spdy/Hpack$Writer.class b/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/spdy/Hpack$Writer.class deleted file mode 100644 index 6cf6c3ea63686adbc578ed256277b9cbb8276ce1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1681 zcmb7F-%}e^6#nieVMEx40EJ2t5S2=rP=d9sR06HRBC7#(sQ9BZ$|kH~OW35FU0NKc z#Tow*`_dWTI-@xCq2rq~zWFEkkBHyBfsish=wy<6&bjxV^L^hr7ykU`w-*53!Y47D z!_{sWxYmQ~cqfJ#+>qA0I%Z=G7owPpp$qfUxhc1A=_u-05D3)+Utp+o&)T)}PCdUG z_>I6{^F7XmJQM2p|aC8^3w@b?~EZh%T|*t!ez&&1U>3b z3yQ$tQLRpVGD~brNwz{IWUtf+be>_2@}4i7qTMa>_*y;iD)yoyTN_h7n38u4Byih6 z9KAXg4UFIe9ZLpGd}!b!lql`#%myZLnb|+Rvv_&Nz%o`0yom{UXI00?0#pBQ23{($ zTE1sjDAvI7NSmweK5*VMl6hS1wR^3?oQ?CxS2|w-aVj+_Zbpe8s@hCHNT)-xR#i4V z%H3j1wV|_gmr6!5cZ(9n#DAoTF}~Y#eCuqJ)R|V8-vs(p1XzT|4-m`#3X#qI0__<+ z4Fmj*BgBiJBP_l^xA+q085?Sy#vopy$9pO(9|(q#?5EozLg4n=CVc{D6 zSy54lvaF@y22x0K?Zy?(QCcELp^dVDQM^iwV~iSH<=!Y>qxCxNFxNLQPD{f@+8iia zlF1*;6X9y6(oYbV1V&Q(WbjOxX=$d?n}t*#_J71^D)IQy^|0I;3^Ss36Z&_Br-y&b zU`k$8MWnb_2n3>vh}c4}aF7r?ND3FD;yx*Q$cZLqgpWB9;Fj3Ml6au#UL~L$!DUEN zifpz?nz+Q6BxfS4#E@1_iE%^Z?z<*~u4uI1C+d8i;rD06iyo z`(-up2)cNTKCzEs@x8(`*2>UEk;D}8M4_{J)BG2sbx5p{wG{bnT;LkxDFg3uq@w=< DB3NU? diff --git a/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/spdy/Hpack.class b/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/spdy/Hpack.class deleted file mode 100644 index 803c1e8da1dc8ed0ec9e44c936e1c616ce088a94..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3116 zcmbW3X>%Jz5Qg8iWNR!-KI9zEMK}^-hbVFqauAyY+fi(RaDpwIm;hqDT1y*CyUOm$ zM-mA44dK4;8^Tc(A3{OFSE~3i`~;wPMk6VPqFj8@&ePjH+uiR@uYUjYr(Xf=!gpZ| zV>X05LxI5zqY0-O<`{|$B?gPZW+*e9VQ?5+29Ke_Fwd~Su*k5)aF*d5!+D1L86IG` z!0;f$LktfyJi_oO!($AOGd#iYB*Rk-Plxdgo^8bto@02P;UdEe3@Cnp&MhUz%3Pn@(oprlA=;@Na^d^9sg zZ3+INp%(L>d)H%{dq|%_(=xq78Unq2QyPLJc8==pNSl^1UMbBOPKM7E$r4N3IxkLf z$Mm^s40;9A)zG)nZczPfP%l=W7@o8%j&2+^{r$tDT|0dhBDfp(XxQ^VTC5>-(A5h@ ziFOS7n)rKN($MU$DbwbI1>5yBz+aZRSD-g9;RlrruVCk>3!}*lHHGWCQ6|53xrplp z?zjdSI;sZ4((RmS;atYeo*0zWP8=@by9rDa=&V*i#yg-}#CEi2aY^dlv{7@xJB z1@7dipWS80UR;VVPrkZEVBX{*d>z3z_%?z`WQ05(ohb?p?C$TUU(vCk;c;qZh!Qm& zgKkD?f_SywQ3=$vdB0C#Qh~Z5`x~6+{w&$xYvQ`9NpaD-I5jhGQYWKT#Y9ei%Bn{> z(=FSsDO=g8taV{)rn<6q6CDN_7*&DQnuGLq&ry$yHIG=mN2HZWfz(}Jd8(8oXmbpj zh;cqE2IxB1b4=Zfd$b*;=Xi0~&?_`usm?B8q!%XMkmSO`f@r_mI)W2^pSP{>@X+KF zgU_!qact(acu#h&FnEg^`zsDmAA@bZa-fRGPEyHMe&C-Le;~>9#9SV79KJ*fws6-U z(KJhYPc;O|><9Xmjp_mP)7NU4J{$}^Na0pG`?nD_Ax(UH1CJ9QYvAL=cQo(>F}=hT zf2W9_BBo|v!6zI1r|JG(4Sb58+2qeQiny0{*h5zuMQGlB8QS+^%Pjr+{|SI|2;w~M zqg6yYfn$bv3j zNKjiWB8Ul!Ry{kVYr8_}+o4c8cPeZZv0Vzo0%Ho>1a>Qo2wbHwDsZ*Jc7baYb_iUn zuv1`*I zh0-~$P|CPdp_DP9P|Db^P|8@XW4cqyxJ%uYGVWF=Wvr?CuQKjY&Qiu36-pWRDwHzr zQz&KJuTaW(K%tcJCWTVQg9@dL0}7>#g9@dLH!GAf9#SY}JSLjV8( diff --git a/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/spdy/Http20Draft06$Reader.class b/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/spdy/Http20Draft06$Reader.class deleted file mode 100644 index ec6810b267879515983058360e003a0034f41333..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7293 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 diff --git a/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/spdy/Http20Draft06$Writer.class b/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/spdy/Http20Draft06$Writer.class deleted file mode 100644 index 1f537dcdc99ef81e8a9084be5bc1ee81171d5ddf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4656 zcmb7I`F9i775<*Kk>mj!J7TjPAR$2*jEvhjG-e6LfZVv4VwPY+!dM#H141K4Bf!B0 zn$k7h(+#?$Nf+85b55~)nsbuh`&0W5m45e)Jd(FS;GlWSefNIvyWhPthkyU?U!MZl zi@&Gw0z3oNG$Qa*cpf$Rxo+S_8VPtZxoO~?G*ZF#Eis%;;~TgwqdNxfrm+rQnugz$ zBkzjow`6oL3Os%+R^N`^c`Ty@zLUgv#r}I@|9#o}K^pJjp8WhUN^@Ghhabttj}839 zz)ubQOd;yle1**;m#yno&T(@?mT!&L{7TIq^F7bgrGF`C>R|ad7 zleVX@B|JAc;UMR~33k3hvch^;*sH>{=z~ zUYYj&O3o?sP}wTws+HnQE-!(%2Mz?)ey8mC2Z=o!f>;!LeCJt(*b%pAE36xF%Jzxc z)d|}>ZB3N8(l+82tkPM_b7Wp$jQP_J(d>H~Gz8e!JLFlDes6yR)%umOD8wgAwdyqa z&I+vb(VGRk;yZ4+YT)Mztp%5S6l5W9TScKNRh=mZDNxvy9UmX&pTK#|cS^Ytr|J)g zs}?5k7^$dE+eJEd%8f~~s#7@3bv4W@lWe!(SiW5h9Lq+s;yEs}GefSbC6`%VTehy+ zXRT7r9xS>r5gF5A@frCt5YRs7`TYk-BCVE!B z+=?gV!buWy%C3}%IFlV;k&~Uv*H?9COl!iK_GhyzI?FCwUe(un#$C}z%qK&lTq+=wx;xp;IYA*W}A;;?G8n1E`c7KsWgjsgo z3Lh25BqU*1u*JPVFUg8EQ*y21UeSFp?4#L~d-#S$IkmDK`Nv(isXWXZPPypbI8)*M znZS59aJa5$mwfA--Wzk?k)1-xt@4>3b8B9~KIZ5qlW*=4d!)yj$YGzt#?|_*?7wf~ zMZ9EU2eJxX3zjQ(SQ9(ZZQvIQd!8(Z<_>CN7xtKV1^W#A(!{UuYZJf0eT5x5o-Wuk zDI_9yvExd)=7q}fB z4eur0HfUOW8!mdGh>~_ZIf7=HdVdPb=6g{(R-s^5tJ`~fdr4n*r&L({hP*jNctP1w z$-2l)y&k+PSX}LO$ctYMv8t9PUpeglNqu5isxp? zZA46MLaW-0jOxHv)rp+y!k4(eHSmuw<7LhmiTL^%T}Fa1f^AYSdaf!)K(a3oAzr4c6GmB;h7j$UZuBz(A!a-5pV7E7Jq=)$Kv&$STl#U4aaK*pxTb4 zdJ%2vr6%X?D>&be1GE>YA0mz{D9$6MVvMl&X z^1vP&1Xpq~N#d+Xdk$@Uv}~gA+GG9kVCmWZgwbzw+(#;7#P0SRU6Buv&KRvpjzvzH zL|f)|YwOKS{24sH-I~04H)F`??i|+3erMZ;+Z@WVwKDGt=HgtYbJ*BWN+0tFH9(E; zXDuB-yE=qU^%}OQ!`P_?@v=ICGinHz)KOH_G2Bweo76NL@-iEyXEsdFEJQg%^sG)) z4DE1mN~@_8moTQ)v;`M&nxkeliG7|tEluMYrtvJ!kxwZHNwj!RODVK%n#bnPI1742 zLUN>DZ^~gh#G2L!C5LIef%81kh@<$9yHNLkj#?MBwot7-(VkD|&>_SH0Rp{_BCSp~ z>9r*c(h?HV5)#rv=Wh~nBiuH5rPjm!r!I_qv_BDT&c7rr6R+ny@wqt{)1C~i=g`@} z`W(rHI*q70gM>QEM4v;idIJOMJdUgJriA80{P_@nKE$7|;}`1RV#4DHY`m!^;c)J%Y0Z%|xC3mk6Z)RKLC98xaxPGE5tKCx5lU-P3p|Q7+!2At z_#(Wdxr{GTKrwuI^zppNGP%&(L$w8RzM@gA{u;6wGbjydzLFi)xOCv+T9a5+2w!2U z{w`3MCe(-=Wvxo}HYf3NSbK+PA+@(Gz;zuUXq(LeuF#p>O)V?AZ7AVt9rvnkZ>{2X zp&Kg_FSr|Mm3)@g-7a~@Z)>m;l<{r$zdN5xZiLB}(!YitKHE4-VFtU|$)D$c^z6pQ F{{tB{sEhyr diff --git a/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/spdy/Http20Draft06.class b/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/spdy/Http20Draft06.class deleted file mode 100644 index 5b5e66e6760cf5602ab838a198c4357be72c2d92..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2075 zcmbVNTXWk)6#mwi*iq~>H8f2_fD}ToQyRG`ghE2VvE>VOEMv(rPGLNXEm9RnGO`Tx z7x7AAhRo0zc;`nkoL$+D%)Nct)pz!s?_78F+wVXB0^kllpGOiE35)nRhWir2sK#(4 zA&OcYY8-V5pP&(g7K1KffonBmIF6ykFxPS|&vY3Q727u5eBT%j%^}GfrqSc_t9i9n zQ}TL6t#!&uuAnp+LJtlZ=Jj@6=@fE$j)7Gel6l7-dWP*C8~u?PrpQ37Ldmz&xQvma zkkuO%wNcUATo_`wB7_Z1?`V2M$sKWVc%rK*x?ZW31VMyC@(G$+xl?bbM-@%s+R;f! zbyDSmIfezHSyFSYoNyFlNC{D^QY)yfPP0z&3+wp_Eu~AonmL{@XOSqjVl`LlD7C^k zHio6CWSkmBDn!Ao;uMfCRBI)MYg3zIm0WW_4Yf*@-nVSaJ75T>Gsg^(ywfwuXVtRJ z+UWe$bamsjPm)yC=^FiG!?idb3nSh`i@J5E+I7z5;a4NWHAe&4`SPLX4P?uv&e}#_ z9u9hs0cdr&l7;pL;-}I5jj|%Mli$2AQ|1RIUH_e zvstQjI>RS9zE5%aJz!Mm&8cnE9*zbB$MwvfVt1XMWuGbEcFlojIX1bHG-u>?&7vjR zGgIGfUd{wwz>5jGpgRn^&)A?1zoOjw)90}E%fYSN3@bF1>s#w(U9ZbK+u5X)l(Zwh zGDMqt@%FtKP7-*4&lol)WAJaO6QfY;8}^x;qxZt)1yNkrq4z?5#zg5dU6QG%kIXK$ zFZ16d;v(=_x^X!>v$IQ=Y4!4KW)4pHO$+#?d8gjeB%GPv;bV_KfXic3k)(gVN7I5V zy|s(=quqXVHfWbVz`I*XypWDMChMI7Ecjw-&(sstWm)__h;6_e_;IxxghIO9EZq{S=Yn~5cvU& z^RYmbHxWl+T9&qm2e_V!rQ$zf{ztIykhuR83+)Reetj}_krajEsV>tG8`N0|X_~Q3 knlj$i%(QrmM6aMoIw6$ATE9o){;*(uSVr4O3; z;1BRe8P9GBeKDc(Fnca@zVFPr?C(E6e*tKq9-xAiS=4YVz-`>|ao5K^ANLumuas8q zHAA_+-eK^zO;0k+x0RNAqd`~NL(xsiv(Pq)NISx++&*)9uCFo%FoZ3wrQJ?NmPzt7 z+ld+Q?9)hCIT~{FvG3fFEA6D!BIVhz_l37K#VCCoJ1fQDz0kc>+OXfoJ z>QfNK#5N{r<|S0Kf{ zM;WJ>c=BMl%$s>Tc{^`sKfm5S0MxLrV>=6moeVVW>L}~jV;~}LDJ6oY%fnEF4CTJr zy0*=s)ou1VR`+sf5Blas$7VQdJKoF)ALcv|bKmgp@1n>zq>4nKxNC&|_{p#o^++|b zqd@T46<1?d1a$^I5RQ-w!B9K;hm1{HKN9uh8-}d;=mLl}bkE49TOo zL2G(r(k`^665aW1B!U4Sxx{2`Zyq?JCF7#{=X57izTo6;MRSL>JgO+rj{+j1WM2e;~x|AK>8cc5t>~9 diff --git a/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/spdy/NameValueBlockReader$1.class b/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/spdy/NameValueBlockReader$1.class deleted file mode 100644 index 7f86c59108a2af3c909ba429c6806de8d9945eea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1495 zcmbVMTTc@~6#k~&URV}d!A4N3f~}TvS+13vsI8bZDQHCTfv4$qN>{eKbuUDo{X4#x z2sS?W1N>3OGo`^Mf)CwfXU;h@=R5cL_4~(90E^fefQlKp%&Hi~oQiqqDyFfZ(&>_v zElYMqQmZi(VtC9DJ>gcyv>8&B5B!AdrlXhbR^adZuHem0y5KiVFSEd~RxzBW?tKin zD}t8p95;NwrJJ@dT$@|E*Q%ZBd%P(QxD|+^2EW<&h-m&rFYW@ z3`)tV35G<)w8dV~tP1xnuUaG-sW=9=4!CPdzAIE@Gz?(S%C;@slEpnwkYuAz$1;l) zpF+8+F@$r|Wd?QUlObBZ>DXQjYYeg6VX<76C(&w9uM3wUbXX+LsnGcY3 zilNY-8HTakwY@RuN%;6@jT8B;`g)!o&8*!U%Nf@0tc`uT0L-|5P zud?2w9O)|Gp*sqxOmtw4CHj$y3iS#*Q1x1QeN*nR_sU9;U zouHPcu4voJVK6kg&yTRZV{ytu1Y(7e*jt%SbP8g diff --git a/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/spdy/NameValueBlockReader$2.class b/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/spdy/NameValueBlockReader$2.class deleted file mode 100644 index f1d39fe9462da1548636d8bc0f4e079c408fcc7b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1094 zcmbVL>rN9v6#k~&cA+dnK(2y_7TFeMxk-!|jcvhfQZb>ViSldMPGw}fTX$!T_z1p% zK7)TW5fXp+06vuQ%t8z%CMMlv&wS_1neW_Ye*XIY1HdXa`(ff%0evWHu}~oOc0U$j zYg95(HnGHzS4T1~t}xuMdtt|k-y}Q|N!JOFkCf^)`_#rJEF<`L{$9H zJKht#C890jcqjv@9x-g$y^@rg3`R9<35KD%48(5IITX=8KlI5mQV%`uH+dwreql6p z;tXK0+#nE9)#q_6$nv1a9ExjHiYbG(&lLqV?SqQzmRu_DFlo0%#E?0tkQTPvu}}<* zwsKyW1cdXEh!dYcVf&pYx=MyYY~l{-jWCHku_JXIQ~&DU@@xKoQr6Mq6s)2EBtmdMj*rST~tahW-Iqbf*Rh zZIG@lh4Ruju<{u)Us9hdB=h70JjM`7?N449#we{!kBQD{h7T~1qtz}i&CH%5yJ?IW zpDEhyf%SX32UzjWb6b(6)Kp#0a4R?V7aG_Z#CN2E+gW diff --git a/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/spdy/NameValueBlockReader$FillableInflaterInputStream.class b/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/spdy/NameValueBlockReader$FillableInflaterInputStream.class deleted file mode 100644 index ba46bab0e7938aee4481b1a19d2b295407c506eb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 816 zcmb_aO-~y!6dWgkrC}*8-xOLv;y?khR7hM>aVVlvq=-rhO3!BF2!rF@?s^gMuQ(y~ z&>z5$LW~1NZJ`{h?%}=X@$C4`v#)Qy{{Zj-3sqDwmj6l+-XUYaRh@X5Iapm=zk;~z6NVV8BmzwmTX@0B3y?;9gxOaw zF-j3%y~69hEN8~-Ww*HF_Xbw4Q2JA}%}&1dMZ-JNz32pgs1TW?$Q0`mrV%n%iIwpN H!x*{+C0^19 diff --git a/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/spdy/NameValueBlockReader.class b/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/spdy/NameValueBlockReader.class deleted file mode 100644 index 1e68a7850eb136492fa7be458c3a418ae99a61b6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3557 zcmbtW+jA3j6#h0%vSC?D3A9jJFqH~zp`;)n&{Cy9HP8!ECUXkfo6y2T%}n;U``dHA^PTJd{{H8;KLBjN-FaAp z;~E-pLWQBB38UjeFFg2(c6p0}f!x}VL@^Dh_PN}d}jA&Sh6CpUVrsR^A%V`be z$b^tp;c8floJO@X8dl-$5YEoWD9*{wJ1Wj=ScwZ_=iLx4YIqOttGE=xWf8t2hOVmk zK*fhDK2lKAY1y_hV4E>#&^BB%6LZozx6jR(#)twv<~U|%mu+OTW>x_dR5-?n*>Bi6 zv%^j$PQ@Gr)m)&mc{s3yGS}nB<)7vPLXdff7>?Y_lB8ZC9|YVTy1u*~Wea z{#~i0Nq{cPF?(_&17_x+#7055E0r+pej{Vab79l(4qJ@M);W4Xrap`DtDKdNf^v5_ zlX6|#oXkeZD&&Yhcse=PvZLp$baXO%#0)ca$huikYYiAy*Y`3qPrh&QxZ^aQB=| zm}%EaIby>$ogsHvK~-sZN7Iubt}nt7(rq)Twi8I3LM5eneb$g;xVa2@teNTeQy}Ii zQ;sR+MfVkyHAp#V5=t*33YIh!B3K%yz`&?0f$$yeP!LGisVvQEMk2xbt8Zy(QPA2j z*8*u|+4{~BVhV2~AKK=O7xMr&5U?+m%Op(p5!qIkR*TnT>!l`i&a;g=Uc~Dx^EvkF z2GPGZcm2Hm>k1Cc(f%`Lg)sYAM-+_e(x(hDk=dl98S8a?f=}5>lY+6{sj8b)FDi|W zoMm%VQNE;iB5jeD?GYWH;d8m%&~X!eV&e;TL8)YWWJAlwP1_@rCiBg{Gm|k!r4vNw zOC1M9d#~`yPv-SrM@4q*h_tBqO2^muM#p~1UtON})Wn#jBXxW$Xy1u+`9_P8DG5I)rnM>}G%nS;Nv9}ymT8h9#c#JLmfX_|liMvR*X0QE+DN2k9?M?ld2Ao*(M3Dmc!_VCJR8`GZG56NY)2~@ zlw&p8c;}LwhF%+8D$FN{W?H#O~KzV!u3*+Oc z2rn8#xONPS$FO7^m4DVQ^5cG~L{+K81eV5Y1HF2{U+J&Chi!DZdV3&$4OR!n zu>3X_h>>uOU^Z6=enqVhhnuT|-pv)i^3%V6QGP}91IDa8zHSW9i736$a1TH7=vkJJ z&|c;NILh6(cy|m{IL>?+jK~1`kmQbuAq--K*DQu{6&A;6DwqqQx)2#1l{kn))D{Xs zt}7W6MW%Xz#1=jY)sRPG^|X5$C4g(J zM12uV0C8z4Dj#8SdCJl}Vp8{-CV7NiGdo6=C+A^^2HwmUf{#TiHjiN~*X6`hIarz) MF3FVqB;Ne}2YQWx%m4rY diff --git a/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/spdy/Ping.class b/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/spdy/Ping.class deleted file mode 100644 index effab56afdc1228e26e7cd22fed453dcc72b0ebc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1433 zcma)6Yg5xe6g^uCX-hzgSfnTqD_Uwxz_+3(iq7EF#|-EUelnyh1kfl-ujo;$ zS!L!loJ}E#VhZPQUY)$4%td7`?H}LMa9P6@fo{hPtWANb@|O9^G{V4k49jz^(D$Vq z7`MI94VJvuZdo0h7l_yC77+IY627#g{Yq8@dal{79V`fR<)@$U&~2|G1rC*MS3U@< z>(XB}*ByEW%bsOAPfXud>&O`oHto7VzHE6_qy929eHqpa@5N>i)C}7Vr0<%JQLk0r z8joyuBT9m-T9g3!Ez`B6BhcqF;mWFS*H-N+37HQwP2G88$y#80Ze7Dwfn5IH-^*1& zk6FpQiqZnEypYw#L;3{9{}V)_6)*HHdDm9OCRMgGN>&|5F+$n{NUV;|>o|-d9Y>JS zF^mkE8_Qa2A+{FZMb|dsg&}lrLu(F+PdpOCC~XGa zw8t4Xf&oGd(>uoZ7`=KEio0W65wt~fKcX2ee1=Bkckj{r4av1#q<$2>pqET-ihgDf zOfvryB*=9@kG7yETF_PmT_SWsL4QF1KFfzcSrXid??7*p4Kf@!#f(p53V9SU-9cDt z5l*%UpHl%P+3bG^RT3$=jel_#$yp-f3=F<){bnOh!SZudUA5^(RAjoDf1jdO`0^t+ zn~hO_D&P|MkLmzRM_?zpr#d~w?*z+j!ak!zUs@ks?L_ diff --git a/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/spdy/Settings.class b/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/spdy/Settings.class deleted file mode 100644 index 4f5de3761f340356f2787343b6beeb6570b01228..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3491 zcmb7GU2_v<6h515nlz-4ex8YvnasQUoIUS(o^#Iokw5-^ z@|1{<({h;hQn{OYXqF9gY?x=mLKwqEHe3qRWxB%NR5rZN28|7iL8=6)%F$>#lTDQ* zMHO?RBBmsDR?MaIvuaUX$Z*7o9Q6o|dehSCR#~gHbU$%~-&j^kO{;>GNy%zK&XmP` zsVL2>g^XMji%KS~7Bh+>=BA5&NaYa3`J$FnQVD^(T~FrV<0x7xNcmJ+ol51>vtn8~ z&ru(A0Q=ip`|vR3V=eO0t~EDQZ!XGpQMyo#!aBX%=R4 zX*MIk(V!b$&M0y!S5)PcVu$PEsJ}xs*t{S|2LwrE3_?a$#H=V_l3LCPN?x{W#=Jrt z4P+%05rPysFRA&0BIa|pnr@B)0#Z1JK4C7Wy2o5`YXSw?-ic^Z^s zq9`&lp8+{RqnfR0%Lo&&g+a-pfeZph6LX+wOdMZ;ad{I!bYQ7Hqs!Ertr~M`8n+-4 zIpAv_TuW=UhE|=@>eY3lYOSCkReec=ue~NwZuq1d>-8O8QJCdMt6o)1V@)wu5pxKp z8SMtvbfsmQdfh5ormn3*?_PWn+BRXmj#Ofvpt5e6TD>W27Gf|q5oI>C+N@EpHr9)_ z+yg8?%|J{+H!WkysKC3dSFDEFb{I68*;->A+?Ls>rHv-5J&2GeO0vgj7TR5Aw!o@x zE`uvM_J6v;+Q1o@-LO`4lcR94(K0J~)?hvF*=*XxRqeVKp;zg6geE8%p`#Ry&@nc= z!iGFeGB_C|Jwi+LPK3@d%Q^OTmJLVg4UQ7KUnSVyj51l%>dVRe;#Jgyquwo(h_$uM z^oFoj1T@ToxE`EtMEx{O`zVSdrx(aaeZc)5JODhn1IIjg2;YZ2nE8)*F#GK64CJQ;fLhA4}*_h!x+YsP30*~C-D|(JJaiQ3W!)Ioj`xV zCjd)zH1U9ZPk$u-K0kWn6rY%XK>k7g&O`FY`P<)6FEjAAfxkyl2l+m_{gC*0VACOB zI|LjDAlo6pLXYmxZ|OS$MMTroP3NKY0$MGh9Wy9#4(S$ROwB-h|o`O;f-ZorML0sN6Zr9M3En{h3w>8f)6```;p}&bot}Z9z;sK{}-6O z<-3fjS8UpY?I|v8zeCG|gi$bB>=1{7^@dr3cG?qLVY}=uRP2zkwu>7w=w^cb<^)=T z57Qd=PbNk;s0%{lfjjnlkiGMFCgWStS+|K+Fvq|ax{7*U^N5eTOmT7J;_QD}g4`VOSu zdw^+}2NA5kB1IvU609yBUw;f;t6qjug=PsPr#6z856` diff --git a/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/spdy/Spdy3$Reader.class b/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/spdy/Spdy3$Reader.class deleted file mode 100644 index 82fa542c20f2418494eae083cae06eac907645a2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7039 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 Ou|^+2$`;~yukZh@Qi|;W diff --git a/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/spdy/Spdy3$Writer.class b/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/spdy/Spdy3$Writer.class deleted file mode 100644 index 2f4c0904641236991277734ae07332d05d91387f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6511 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 diff --git a/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/spdy/Spdy3.class b/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/spdy/Spdy3.class deleted file mode 100644 index 8b29f1c5b767215b350c76653dd89c45a08250d2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3656 zcmbVPZFAek5nf0XA<>j9%ZaPJv_@Jtv20QVNzj&KJ1r$q5^b4ONlJ?Brs@eek+8u7 zd_3qSpZah5wP|PKnP#T#=lrNl_iz9OrEco!NCfZM+k5uq_72PMfB5@90H6#`4z9wc z4qG{xfTj*la*%5GrgyN@I9#vy>KbTG4QAJTHWGx1J>rFQ68!)Tu0~4TgVtfU z*J;$BNwKEE+*sUc>}(%M=|rO3>Go2}lSr(T8@*n$wb_-rnZ$al-QJOcsYI}YDpHWu z;7YV?vt8e>M+S5ZB@%5l>g$b8L^Q3zLL}R7w$|JGhr2r%PeT&SB<`$r8taW#uUX%g z;&~0GH@54Wha1h72G^tEZmYT8>@?PT&33E4t%1IW>^RmSx879J&VdFKFIF*ok6h-8 zFEp6Ey|kx6X3cjfTH1CQZH2=l%6sI>yU67 z1||R1K!~8^GTbdjywWIe&P!ceFY4HAA*)T-gb14&86wj6Yq>#2Q?6*Vl|2UwS(1A%mL<2X*9$ezXEqa7L zs61re7e_aom%3S|a(_TpjSkAxadVk*@r>rjshs=$=s z#E!>VV#_Gi#GC>}dqDVz#=@(ykj80Is)^JitRIqo%r+bAa+K28waM}96!AR&RIQ&S zp&0nw{hG)O$14S_JvYjPGc1nkH{#tI-iIxyEqnK_Hi!J_9*L% zfiiQUi>K?t*p)8HXg<&QL-6N-;~%0*plg9f8Y}EM<BbOzcIE!-TGn&?wOH)2xM;NlVF2?&?jA@k% z)83^tFG z<658I>h*R?<>hj0Jmhh~XM^y_b8RKg;VH!P;Jnp ztnxjpe7|N^YNl0_R8^zpvtnJHSBwsA8%>7gfR%~yR7?vMj5T#Gs%F`E=ATf<*rBMv zFw@?-g=ttNj?tm7Lpl-`>g=-Q0-%nCCN_M2?c?p@(uZfFk^!r8P5ne>H){^bK^Is?Fj5Vl)%*BR?-~&)Jsx>#YjzFwxv3Dgj^O!v{@Q__KxpI z4dyRM+D9+(vc#_De=m;OA=z1caM4Lz?qsl~`tV}zQdjU?_FJF)q>)|WdKyga_BIYz zkVth64BMqRv!yll#>7rRW#KJz*wZm=l{9$o_L3rqQiZ)1UNyKd6}ggOw}RKo>ba23 z^^Ms1^qQp?t6*ZEeihs4d3-Lyd+R7Q;yWpP7jYqlrGLc~mi{fLu=Eeh5o62X2iq=; zw2GrDerxzWb>|Ie-{4>ZEPTq}Hvl*B7r{-a;V7?^;2zvZq`?Y2z^5eGLPFWW=e~o9 zgS#KUfyuuhQY_hM)r*M1P+BpAwD37RjOKIj2p;1K4ZeWi{3mNBVx9Ui>*0T4{Vmil zu};J4IM}ZuD*zuYWd92Kw=n%J%=`^0sKs0Y9!Mlj^^MxEdCo=PFo`Y diff --git a/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/spdy/SpdyConnection$1.class b/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/spdy/SpdyConnection$1.class deleted file mode 100644 index edb3899f4f48ff21dc4ecb256e511faf4eb3eb78..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1233 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 diff --git a/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/spdy/SpdyConnection$Reader$1.class b/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/spdy/SpdyConnection$Reader$1.class deleted file mode 100644 index 968e27f6b726770a739904990b440a77ec3e82f3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1703 zcmbVN+fEZv6kVq+3~dL&Rtn+`v}!4rY4L(sL=8b{QosNq5ub+X2_2kEotXl@`3HW6 z&m<7MB>L{Jn0WgD<362+VoJ#1Je;%7nZ4Iu`!@6S&&SUI@^~CY3^&D+i6M@mD7ui1 zVHhKEjABfJA|V$;2l5ieCEQ}@+)|CS#kZF|hpQ&TSV^-@#eG#%9bT&{_REUrRTbUx zxMQh?;#SMAm1SCd{Q^U~SJB-x;oT;AiK}JqFvvyA;?9hrx-NGaCIf=b*kq=8x^1O> zB!NGrTe>&R@HX?`D5XtxOH~Zj+E9qMZfz7^9JyLt-z2Anfas0DhgKOPGj^FXbd_|A zFVxI+?yRWm2Hhk|wx$}Zs-uf@<1!)=#Q=t&u3FNO&Qn4{J2~N@B_#1C&yYMOGzN+9 zaINMMw{S*KXC(Fb7`m+#7iV`gUKNQa2eDWS}099$)0Gtpqji)UM;_P6DKMk4nT_|N^+&%{#4|rnYFcIvFInb=IMq~ z(%nEUHs?dkQ)d-Kp)#4)N*_~Uq3TZ}HOF|sR&ItsRnMI^Y=*e1Y22mZpU9C{^Yrss z7z)6&Xc05&G=K2sRI6-ohX@C#)3K&hCx>fX-=gl$2jzTZ>idpXWToQR+oEr%SQw!1 zZk)cuq3&)m1pw_d65=8Nz6zJ&_&W2g{z1>?4#N89hLFx2~I_wViaq zzM+@o0n#UJ^r4@2Azi>l!W7aaT&A}SS4hi8H|Z?i4QBVi_7HiGHj+Xg&>q4&be2A$ z83qKXL|kurPb=q diff --git a/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/spdy/SpdyConnection$Reader.class b/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/spdy/SpdyConnection$Reader.class deleted file mode 100644 index 26970877e19d88f234653c8b0825d05c2374612a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8667 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 g>cLYG+AG+WzfJr%hM)75u-0Ne&r+5i9m diff --git a/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/spdy/SpdyConnection.class b/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/spdy/SpdyConnection.class deleted file mode 100644 index a29138f73d614cded41d887a3500d4d8beec8602..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14356 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 XG1%cg^!tHq1Lozg!RS!7P=9{~>+iWX diff --git a/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/spdy/SpdyStream$1.class b/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/spdy/SpdyStream$1.class deleted file mode 100644 index bafbff5cb93ea92034d88d2fa0b08165af809dc9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 249 zcmb7>B)M%}LEBoBz$|adM;;uh>*}oTiZ2^eXzOcJ?J1mW8Dk=_D(qGI zTdN$kjkK3j2#u^wAZL`8o*D87T4VwcnC^@rx7Nyg@&ajxms*)h9*$=!g23`0YC30T Zk6-Dk&jPy$1KtsaJjdJ#XGG`H(H92+LWBSS diff --git a/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/spdy/SpdyStream$SpdyDataInputStream.class b/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/spdy/SpdyStream$SpdyDataInputStream.class deleted file mode 100644 index 0d4a2a83ead342f5420a8e1292e7057b58e0513d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5723 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 aU|jlZ0()q#BG0wZzohP`)x$KSGVni7J+24< diff --git a/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/spdy/SpdyStream.class b/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/spdy/SpdyStream.class deleted file mode 100644 index 30005afbbd6a7e133f97f6b32fc121eb5fbb5dca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10328 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 SXg4R%*2u0?WSJs9tb7A3=&vdO diff --git a/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/tls/DistinguishedNameParser.class b/platforms/android/CordovaLib/ant-build/classes/com/squareup/okhttp/internal/tls/DistinguishedNameParser.class deleted file mode 100644 index 9ff1a94c706d67cc8423b3c4c19a71484d3d9ac0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5095 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 diff --git a/platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/App$1.class b/platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/App$1.class deleted file mode 100644 index dce73cfdf72e2d78e3f0dcabc5003d738dbee09d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 843 zcmZ`&Ymd@E6g>k-OScN5;=1c&ALs(BTS@$enrw(BngWR!O!nKfOrTh2nm%^dpJlRY z;s<|#KgxJZNl?>m(s`V@J?Gqer@wyx_z9qkqY5Ws6AmQ_0?1`RBca+ zVe-il;d}1*gw$>2a(}`@FWs-eQYy><2J?-SBJBG-iUc8BmuNJ*WThA;lEzl5XN*-6 zy5hB$YUpJ3Xu(f88F(dKUqzmr4MaRwQw@(y9H3>wz=jDE4HIp27_=zxQfaat#VXKn zXyP%RP%ZLH(d;tRQVq-Ja%PR3g>Yj^ZwUh27&ZbG#RCyVd`6BB@*J;o$O_VHPq0H*Pp8&az-qO$>~tdw^qROz=rvkBqkW1P zox`tSo$n}oS;kapEK>|%qei2-TpPHKo3vxNg~p2E1&YhFYUcv%0>yf%e&rj=YZ_xI jFeJIrUsTlA&p4t8Udj9~hhjauZm@^Q7+A!Tj%6JyI#wA%&8pK#?J^__ zo?o$eo!eDm*`8na+T1#+*AEGE(X4u99cw1m5jPP=#Dt-|6gG5hs`M5~AFe!=V~8qB%jL3SU6pFW zZjzdx)OAbBzQn|E3L4UO1^4r6s|R0Wm#oK8a<8IzKkD*mhmKfnjk zSAW#vOtN17o*^AKWK>vX z7%yv6_j!{C4dDmc)bus?cbm;E!fZ<=;~j>n8_a3bHh{V4(W`L|c2|Qzvtk;fR3}J*ah94O1GHjB! wxNPwb><-BXq&_IzHu(!ReEmd|?b0OilMW^@hF|1U^!z3;Op!~3edOtT2fZGYy#N3J diff --git a/platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/App$4.class b/platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/App$4.class deleted file mode 100644 index f0fd75ee2892ab0947507ad1f782a17ff41b7790..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 691 zcmZ`%T}vB56g`u#P1bFVskNH4)o8RaLf1l`+ES39w2-!-l7Mfsn;{upXTt7A>CYdhdbxqb7yY;{rL;v9qI*SQMQporGRC;wDAhBEv#BtvruKo z#RD1Db{Ur2I_$fA$o+wEeI54n1$Xy`!w*#RQ7RdKVyM&~E86ZbWLml>80OnjiEpEG zPlU(Z3kWH-waIDG{~;9z}wX@*_QJO&TQ~juhFt>1QA5QRs^U zX?o;o)VHVng3|!|$`5oTRsXAq2fAlr-N6PH9pq7PV4J9hO$%EFenZk{E3Y*fiiXk+ zxazy#y;I@Gq-F{oj+7cpT$)Y6Fz0dq?6Ztw9sXdjE``^T;*w!wmde(6?cH$^$*sezrY&TNc~J|o{%*sfg3y}>m;#_ zd6Xz)c!tFZ!+Y|k&S_kMT_OD&neLRsPS|g$-`zbPXTp=lb2^#A5?+wc&`Vsw0!214 IX35j{A7fCJ+W-In diff --git a/platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/App$5.class b/platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/App$5.class deleted file mode 100644 index 8a7b7d29bcda138075bba9ddd58c9feb04db67cf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1755 zcmah~-&Yz(6#hnuyKGiPq6W21jj<7lf!J#LgET23Dh+~FYSJ{R9hMO`CA)NYHOXt6 zeLatl=g;QSqsqeF&73?qe%iWL=E4Xen>{WTTqDmJ8lHW>!Iy6Mi|V2BlLr$w?Rbu9 z)hLGIdwb?FOq}u44nU%qzDp_GX%;~+25rYaa160#N)=QRGbzK7L^;c7*e-?J6kgq~ zDk$nGVN1sZCUs0O$DWQKK>Wg98$fDE zRp_grqQgK{hma1te3aJKHcF+t1hx0~>$d%)j(rIkIu4UxE##;{%&HV3*1OSWmyeU} z6m-S0dDY;q7gXJ081MZ$!y1+7u`s;!`~xa?ox3^NX{R7Tn@PwJMQ%+4;MHzlZD5!CPK(a8lW7;~ zd8(86CbxJ^kWd$L_siRvR*&ojh3+k1p|sAxOoq801kT2naw<8Lsp?uR*)r zYk}xcUG7n}lOTrkP22T0h3gXk|K-w_nz)=uw9}1|?(}5?Vw!H#7+tI^5|IautUmfp z;XS&9-Y08`=5j?#Tzd_cc!R#*e9R?!4iE-R!3SjP(uPL{~cj}XDX^i&%cG9cm?(fgVCYr@DU=vVwDgh z9Ypj5;)0KuA;hSUh>?%66Nqs_9CN>kL83W`2phr#8^$z?Ai+kk$f8(bqbRU3x@pEy zWieQ60tajozpzVwt_jL#n$G=I%u#NXS&+4~;+Xf9c!312k#hZ5AVeRoBS~Y3{)cX0 MhAfRx7ipx=e-9hHGynhq diff --git a/platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/App.class b/platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/App.class deleted file mode 100644 index f04b639f3cc019660a15865fb25e223d43219464..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6374 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 diff --git a/platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/AuthenticationToken.class b/platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/AuthenticationToken.class deleted file mode 100644 index e2d41e3f107c1e6f491fa2f28f89e80b355dc6ba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 776 zcma)($xZ@65QhI|8JCK?kDK7bEp ztR4v{j)|G1x~rzD{;#UvKVIJe9AG1jI7%tRu%gVWhBXcA3`yS=PJ<5xL$2QEcib3o zt7|kpM_Sz@`aj~Xdv7~842ffDNw3BbEmztMv2*)|sVCR&QYkU)zxGURWtR{P1|=&aUm6YDFkI-ZAC{4X&nh@I+D;Bw*NN=!@_i_mz};a zJ#5ncoe!ITc!40#5fOhv0NV2?qXPBsw)OPHg({*{1vWXU5jERy|M z{DjEEOz~D|aSlu4;#$B)Qq`SjM5fYdiUYgExfgUO27Y2Juh7&yiaH+(5}gG(3%{n;6x3gNO&|B6o3o5wS71j86R@&{1+7x1s}jiA=VZJ z70ukv-0Ym@zP>*`0i0qtf{X1ClMp)u|MF`3ctfBk!f0meWy^J&a@A>9+(Zb@O>No> zf_r$B61Ep6j0NLi_A$byF!=*P2jd?n!br6M diff --git a/platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/CallbackContext.class b/platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/CallbackContext.class deleted file mode 100644 index 41b4cfd37426c6cb8aff3dc25cf88c800ae78648..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3216 zcma)9+fx%~6#s1qB*f*G;=Q#I5knG9)p{u?w+Ir6pg^IB)-K5!7DG1fZbWC=$M&&4 zw-0^wr4OZ3p;KqtnL2&xAJysa+g(Bk8_WaeeBaq~e&_yW`1ij*{seFlFGKhclW8~LPCQnIURGOHUook%H%FFHyD3qH|` znz^ddRC*wxBfCmp^fSL|s7lVHG%ca!29>NK3D=|h18Trc|AGX6O3yLaj*M1Rr_1Xr zsxhyu6etO2bSAK%7@D}dLcg`D(Rr^YxSKA^V5u)GCK1xiiAowx(S9b#ab`tHn^nWm4HkP&FB@5PLKDsF-l?bCj0<93Wt_vPj0jH2IE@||XV5F- zEc)!(wFl8D9pkH=@3FF0$fEkGWt_^I59715GqYUyll=JvnsEXj;S{)L zy!p_=KfVa|nU8|a`7YR;PXl>7bblnIpzBR{wga2n9d=TI*wlHo3%8r5y zDB+We@io`DjmFJCA>e-ve^V_;vI?ZF0&)?TXe<(~j==XzO$3*#jGHUQe2HA+f0(Q& z!=u>J-M>W&Kj1>RC|JAqa(CBV{g&5^ee*gZG5nW?%mFZ?C+E8Y`O}y zvx3^m2nJl#!2?had!XJY>TF$9G0q~^8wa2s@j!h*)aAOUH(k`B15l58pk|4htBX49 zqK?!4`eU{GO<<>Y|Eb`jFzV`)~_7d5Drl K{zFh4IsQMgYOV1A diff --git a/platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/Config.class b/platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/Config.class deleted file mode 100644 index 19d9a6fda8d81dbd33db2c241fc28113cb33a3dc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2668 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 B10DbX diff --git a/platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/CordovaActivity$2.class b/platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/CordovaActivity$2.class deleted file mode 100644 index c92f1faf390368ffee7a6ea3c8be75a5d0919b9b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1049 zcma)5U2hUW6g|UIwrtlH5o4)e{a7n3P+Ih@rimdnHc~Z3F=^t%uuNc@?GD*pX#80w zr6xZ31N>3OJ3xYwXiLI9cP=OA-Z_`~`Rn@+0DE|z#v;~r*wA6qLK<5Z9>Gadcw%82 zPfZj|6iv7csUi2BbHU&=RM@TZKKFW}>Z!1!hP+yz;7c!-Lm7YBXRtM2grN#QhCV~K zamI<~^PpR8#-R+l#7V_H89BR@ypVy64;VfdZlZo8&RoA@iy>K89lFCxLk8mQ;Jhuu z54`PDCEHLQ_gg%a`aCTr^?VGV+Z+Xf2y;Wp(kER z-7oi-V>^0W8tgFed=-&B$0F{jj){_uGAcG!VB1*I;TD!{WUyvqM~5nQP3+mI;TbLG z`rSA+hRn>IckMIb#bm&&bTSBni7T7e%hAj#I1!$ZL(w_Z`(`K-7U<|ae6wb4Pxn6U-PJU z%=`Pr7S`!mq-psUj7&y*4-k_5W2A-9J4(|V9o@WVUS=6 krcuVKQTanSKNU7`pX3vGfQN)hdf<<7k1~r|EE3Y^H<)n*1^@s6 diff --git a/platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/CordovaActivity$3.class b/platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/CordovaActivity$3.class deleted file mode 100644 index cb27cec1ed431cae863b62e2f5f4b0d9d0c4bb7d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1416 zcma)6?M@Rx6g|^zyQMBr78Fs?f>pLfC?5jyp#r67p+Ev!BmcJB5r!6vOx676l$A zS%)n9XbPLccb-js`~y)*jFYn{9O1uYC>uBFxObDHRtBw^WPu@=aZB{7oq6H#t?E&c zdvDF6O&LA!TBcnvJt5;}GAJoCfI-VS4)-#)S*dW!Jh=g<#1u_I@v1Z+#gM(DyKdF9 z_?nRYdM*uiOpcISoB?jN`%70Vh{kkQbOyBcoej)q?8_2Hg|`w|8)tYH;d z6>Az^;|)XCa=B~^%ao@R&w8HgG4x(OqLr$!OWf0t!#YDCZjc(18a9xpXnRA$Cbmcu z*GnQX#SpvLeY<$bEs~agk=m&`&iRywuHTMk;5s|p;^LT>n&b^5*Ls|-898LtESC#{ ze`0v_pEG*Ti?WCgXz<^Rnneul748>AMHETQ{t1c5$jMe=YQ>!r!>DlumzGp>;M6nX zyXT(?$-qdq6jFs&5|y%To;2To{)z^z%UUyg$pYeZUv!g#dk~7nq<{djq@ji-88s{^ zsbNWFboB)2KY$0c>LGdS6o<*iQzJF7RDTVD)MyP#sxMeWFx3~TA(T2p_*-LToG?r) zp-f?rd`l3gc{GXsZ#{LVu_4$3N;p~BO-mh?FXVC&Txx@U>%y? zPC$N0`W*yybm}om1nTIzXs#nj&8ML%Gw4=kv8v4dMI_rKqQD>u0VI(k8>B1pDH7yG KiIPs1et!V{|6(Bk diff --git a/platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/CordovaActivity$4$1.class b/platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/CordovaActivity$4$1.class deleted file mode 100644 index b926c566e532ab9a461e2d12c7d6e727b08d7dbb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1063 zcma)5%Wl&^6g?BCb{;MXp}bn4X>dy(5EBTnC_+MkN)c%z1nPp_#2%6<&KTKFfKTBw zkO~MEd;lMXxRV4S!6LEbx%VEA&wZSkpTEBU0MNpNEG(3B$Y3Xr3a)37hohI>9QJU- zLe)aeLY=`(MlyC<7H%?t!R{(0qE5i$Si}r_y)YWO{4MuJ!u7()52xJi%!(cmbw$r3|a_ zJ1r{83RNeN-W!J9YL6>F3Z+k7s6?p5eIj`f4!aaYuem4oySgINpP>vpOZPLZy&Fky z#K5`?xfkIi^2CAEvna_aM`@`5myYIrD;QRv&ag{F-h&e$lRX~DH|TO%#p zv2hn|3-@f?N0W3|MFywEP}Hg1fUBX~ADjp;VQ`mp?)2wV>dBY}BO)sFKg3xjKZ6lX z6s=V~%Izg-NgiLuV;PgCnJEt(@m^B3>=mh?!!ZrgS>Y^^&XwiWG315v{~TGA>3U@7 zxM#tNMXdncniRbS6bU^`UYlZ#5DzC5Q`&=VOh;qoly n7B(qL(f2EqB!#QEMm9}%d>iZJZPJ%KS^ZdZL+w`3Ftfh_0f7Q| diff --git a/platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/CordovaActivity$4.class b/platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/CordovaActivity$4.class deleted file mode 100644 index b3dbdf622b4abec5b43a9b60d70a549744a00774..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1971 zcma)7ZByGu5Pl9B3mef8g4@!h385-Aa)OhF^aZD(Sb+o(fy4v{^3tB=i>*|Vs3cSJ zwST6cGgCX$W~M)&KdRF`*#Rbu2QkC$-g$5D*_Y?^?|*;)1K>Jp8I0qm6yHektrXu$ z@x2uDS>#Ys@k16vxGlwk6hBI_sG^+32u!)SBgK*w%PQ_>aRc{Mtf*L3vBm%fZN>9M zV7fdEMaYoe=dS)rFzA*aG>UwW+f7ll{h;pe^P<_+i+1GfJJIVB!*JI>40(eNjae@_ zxw+hH6f05ScnxyNNSDZoTyn@tyVi;#-(wh(3vu8?3~ZOKj+#!WUnAp|<2li7hTro^ zKqT@xf$JpFlRLXJ+YBkwuM_e!mg9;0tyeV>Z1I}RWz6zz?r!tIk?Y=ON+!WDodA?R zN5xTs7F9yY%bS$C+h9=3Eyt~kfZ?*my?Wp~b!x+2anTh)bjRVY-_Uz5be<8A+%e=! z2e#OY9N(kgvK7A-*kaj{XvaV3-K?w#rM2YQt{+mT)nbb_>$tDsGCtEVA;o!I z(D1nw7p1s_NexplRBSL@It8Ni+|=*@4>eSz*uo}q&|ry8E& zDZ{y=ULIzv;W-Q%+9YuqMvo$F)Lsgk25{_X>tW0Dx*eW6Jsc6J?u2_Tf4vk0J~eGV zf2>8K}G!95}qwe zGlxO?Pt*{F+Ul}(giMpuLAP5EJ-?eI!b}p{()3H9_L^*yJRQyb1x#5|v zWB+0~A>}H`;Py@GFsJv0>5^oHsuR56w$ML_m8c47I}kh~-ki_(O_?Z`3Y-3K^kTiB z7b|S4AVwA6_b?%xV;t&p0+aOO=jg5e80pbb$w`1T(K6P=%vcjSV@>>wH4&J;Bm?w6 zg)iu|PSz%^RnpT&p$%qSX=A{++J<6Gq}oUs6N7CG8o6{EY2z)_H}Ux|Nv7#M6cf{A zYtkm`E96Nt%)sbH{|kfheQWP9v}626efIhrmlTMNE96lv$itKUH V@^7T8=v#UVSCGMD{Dhr!=6~GB2HOAt diff --git a/platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/CordovaActivity$5$1.class b/platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/CordovaActivity$5$1.class deleted file mode 100644 index e1733918024565b0303b3ee6ff1b56b93776ff99..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 782 zcma)4(MlUZ6g`uT*=Dn9ni_4@YHGJuBXkYugR~SRCjO)Lgt{ zD5QOv1PvD}3}EmNloF;H^CS@o!)i;LUdYdQ)E8l-O;->aJjzZb>D+4Ng14{NSCKm`Y1WJU-?|+WnZ!+e#U-=?4ue$}s~) z>ze(S*VY3QiG6AHXZ~s7(+MAPDr8SZu}-Aw9g4KCyFO-6_3;9}k4YQ7N8sXvk5yF3 zn=IA@4TiE+4`Z%+;rGsoh*E0si8>l6HR?LZBKUY?n+!n)r^$tt|I1QAMx5%QXrIx| z_uG*XLZL>JQ=pk}!OCUp0u5A--bqXmJ5A9R?JeWgH?F|y*T`Kwd{d^?X2SW6mlXRp zhKCAX5t9F?jumzY?OCaQ33dtRC-P4co)vd);W>BDWJ+Th2eXuz!yH}{=4rU!phQuH LxFVr_CPr`%?C`hX diff --git a/platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/CordovaActivity$5.class b/platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/CordovaActivity$5.class deleted file mode 100644 index 5fbab5dcd02d2fdeaa4d9eb6054a9cdf1ee7326c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2770 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�RgfRS3( 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 WR0rEl)kGGzu}Jm7_F9Op=F)#7lUJDl diff --git a/platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/CordovaBridge.class b/platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/CordovaBridge.class deleted file mode 100644 index 786b6824fb3194c43f4557160141859fb63df370..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5124 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 diff --git a/platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/CordovaChromeClient$2.class b/platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/CordovaChromeClient$2.class deleted file mode 100644 index a29ebe2da58e6b6f2018ec88f4172199d289d812..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1089 zcma)5+invv5Is)PY!Vg{3iQIQEi5IM(k*>MK?szB)M`s5iUQ)z*_gy-V^`iy`dvsA zBp&zxJ_<2TH&lW~WF>n%$1}5MF8=xJ`wsw*;TJK7yLMYCA&=D()^N|keFvU{b%xT2 zN1hS!FiIGf1FpJ8%dUSSI-g|X@5OJ%S51a|(wDKf#ZV2j>G}MahkfCP+I01Z`>iwC z>Ki=}tw;)$Sf8g-$>bTs&dg3z8PwVgxt8t_V*)%F*AEJkq^gQp`slil$|m z?~Xx+wf~w^{SWofgyNO7X)Ik(#?2!>;*|4C6-GLis<$tazV14xx~QS3Mjg8 z(QvTg;t?9urrEmWZ8KEtFZ_tBo`29e5@F(ClVNKz3sZ9S4${H|GNxJxLxKK<)@P%^ zP}FKKeh~>nbNK$e(CHw)6P>mcC(YoT>S1E28W$lG;(rfu?E^!$YFo58#e|v{rp;cN zm`q6@tMsPwG+Yicm5OZuK$5ya?=C~j#bvs^LZ>IBXGxapjZ?7t#wjxOZ^(Wg8{kNW(lQX#*GPUy%8V+_`^gjBBEDJdUw&W|zhw4=iGdyt7y) c{|s*87RelL;|{LTX`Zk-lJ;}(01xxU-Pj~~{)zi7;rU7j zs>8i%cdxdzIuzAViYPHTYci6_3x@TflLj)F+hxdARUjBjbs32_?Zbx9?|365&sbgg zJly448oTGr8O97?uxn8ybT#C0EXd;ySwVS)Y8X+`mN;futMsY)DoUt8Z(Z_GHEU$( zJ?@LuT0f#A#gRv88yzFW+((ikNP`(>`ay$W7_0+v+%1*Wh=DLD4CDRG|KX{LJF2aH z@k$ykCNAm4(mwBS5^f{%Llw)Y`C23`6`o{Vfrj)K;?KqZ!%BA zX(8h{MtgvEY6QL84E=44(&;t&dQNth_L4h)3g#}HBIEu<_FEcQqSe3v8V;>?`dz|x z+$4+P7H;=o0)okr&zZ8m!gjwS^8>l;N$!Mv85o?g^t?^PjtJ*7UH&D-bh~*yOhUjo rCenKxOyW*T*TG#(5zQ>_rFi!-O?!^YoWYG0J43kLpM^Qh=L`P;k%>1t diff --git a/platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/CordovaChromeClient$4.class b/platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/CordovaChromeClient$4.class deleted file mode 100644 index f02667b97eff747caed598045294009305ed74ef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1112 zcma)5ZEq4m5Pp`o19}S9m$tr@Dy=|Y&L;h0Fn*z$K(I}$LF2dO*uu8QuGu@_e;EBC zCRP(a_yhb=#<>F|(Gt1jc6MfGW}jzf_UEtfKLG4wKZ7I+;j)oM3J+tv7?Fq-#rlW`4 zsf}f=XLMiGJSkKV#ypiu2G1A{7Y>?>pxk0e)O1HM_SHXQ6y%NFZc@qi&8Ug3CLb)Dn(nQ#LO)N^M#7juXgkHxu0c#QM}{4u2Hrfu(5DEX4Bpumb=|Y6m^S82vV`(CJm$Js~|#GFREY z0ITd=AXfQ?_~*zmM{Ae{_<%gEcC^po8g7ura1*yCX&NNMH0jD0#J(aii_b>-y{b`U9dcFo=af5qsp zFtM8W!5`p{GR_?!iI&JEx3e=lGy6O9L7Votd$ zs`U_MsuNimHva3+kR0`-+hbsL>cxp37+1WIA*IzzO1gK(hn)C7SFWdhsk$#k(9<0Y z6&u^wv601+jWjYgZ0uUtv*BQuTDDlniU$n&@CwJ{s_PuL&x9LTpq@L^xtK$|cswpr zQ~FdFVF=?tmaWA=Ff3`+@M~I~O4Da}JFEI+DBp;7ONvpoIfHr<7^=o)mMQSR2fF-@ zAzljGwKB(r8tHQ73XfrZ>N1Bu3iQ5GG-wuL`Fz*_fFyN;-e8P=8&~M`D(#+-9w(Wr zY+ry?b}kUBd_(+mn{B=Wq=-NMpE(Taz>ml3|*3iaMk0U! diff --git a/platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/CordovaChromeClient$6.class b/platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/CordovaChromeClient$6.class deleted file mode 100644 index 85510a0c57bfaecdf6da63dd5cb0a3aeb04d4ce7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1091 zcma)5+iuf95IviuagrJm3iQIQEtrx^smn_x6oimmkXi*QQ4|nw8+)5Ofc;Ey0D8x8*hy;y@rQO*%J2O6W*`L3@{{Zj+ZV_|1m29gettB8Mr5+^G?R@e)Mv5)nv%WJsCOM4Aqu4U6;S-eowf*Hh~^; z*E^G5&*;AJLMc?7_&kzI#*Z0xXLg#(pw?!{c{&gb<(5?9#h~92<`wURger<|WEKh%*_-RC0i>A*tOMh$fvCCu9> zplHKJ!@{PG`)E*`X6ur(!%#_n;f7pw-Gk1t@M8;G4BO*bn3Ah=kQSyTBdUck6zE@Q zV>TKL^IGjko>oWF^cmhvN}Z14Ytd;-anfu}$R5Uq>Tw=2rvCRB*WNN@t4WiVrkGIs z{IuPxW0NTbz#6@(JdKxyOr?^v03b>IpqH1SW#a4 diff --git a/platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/CordovaChromeClient$7.class b/platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/CordovaChromeClient$7.class deleted file mode 100644 index b8f243857ea5746b9815b78bc29ff65a583d45f7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1190 zcma)5T~8B16g|_Hu9U^D_yH)2XvMO8Eb0R>5MK%=#VUyyG`>xDhjw6@F}q6%|Hj0` zXu^w$XySuEz#nD2v;80vnzTu0_TIVo%(?g6`SbVJZvc<*WEexZXO{Z~bCw91fAnldgeGn8vOYIytu_nX4= zbrk3p_bTnZ(v0+hsDx6e#N@0=C6i|i>jNkCWiYqHkgMoGFcfQ2iC2dQbrHSc^^iPc zHSP0ohey)b9cRukW&nd-RZ2vakjJqgk2_!mr4_1SNUIm(m|?BlqvmUsP=VgMc4awqe7wux!)lc%=1U zQkPa39CL*ia@Fv*>U+XZEIejd><(0)VoO`5yEPe8Lq)_edd{95i~z%kR-17}t6do# zFuXext24=OMSX`vS*@MX+)g6u#6_Mi>GQ9^2$?OLNgVGJLPGmo`66VP?uPU!9e3$b z=4m=DWE{sdAE2F-pog2Gzl~8ky-Z(E$b&o2BA5;s%24sKzJXl8Lc#k+%P+H+Lq46dfw8NzMnZ81?@c@AS1%Aht>8&P?yUbMCq4_S^3-UjZ!RMG^_zmP<}9`4p1SQkcWM+%2TA z2wlOFf@KAF8Ip&FofS^K5ipFG4af3aVd+g_Re7MVTO!!zAAGfakFys|F> z{k8wra}VmlJMK4Z=^GDf!p|--^U99k z&BAF;`?~2?(#h6+sWUkF4-C^fMGOuI$mO&>}EKpEtsNzpCpY;3ej|0N(CTGYH3;0 z5B*(5=sS!N^14L3H9E)0X0*9uFm3)A5pCfZQSCEgpIY7-TI1vme8(uQYHOdtWsK8_ z;VQ0ma#_7xM~IwY-~{mv?Fi9@6DVP>i-=O(4?_2o5d3Q8)Y=$2ISCD}W1{oU4NOwr mL8@yC(-a%UO^T1;7P4exn87T@Xg5N439|B&!X4a;C;tGJ(u89G diff --git a/platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/CordovaChromeClient$9.class b/platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/CordovaChromeClient$9.class deleted file mode 100644 index 72e3fe65ce266a2d9622b86f34bb01c31b90d52c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1149 zcma)5+iuf95IvillVC_Fw{j^>AuWk}F@21JcnKgS3KUTkB;Gdm5^wA7Mz)iD7ZL@D z2R?ugK=3n&v6GMoS{h5<*_oZ0J!fY2`|q#c0PJJGfGjHUvQb114~lq*s)0=dTLx+j z#+dunK!gnIU9Q|fOV^%={;`bgPWU>|C&TEC2uFU@WXMIH46BbBYF!-+Y(C_UCu~Ot zt{!u{HI*%of<()gLM1Uzq>|B7hR)JK7vQM(7&0yG3WicwD)DM`(ig#7-uKC}($x<4 zdpwY_J~L)w+zena+e(R`dJ)^LDM|{kQ|8wQ|I+SYgQbeA1 z4Ok|&v16i$OD6Itm@u(xV9$h&U25ENeXBMY%JCJp&(**_=pP9uGC-ZT=QDB+@#?{} zNL?9HT|___|FLW>2ZG9=)qDmShKr)l=JTEC_oSFKy9=a;Q9#95&N63m_O#dEGo)*A z7uWvlNL_Zga)eJ0XzqAUZBU_Cn4>8)kSdqs?f@jIRrFF*^qaU$r&nm#AU#d8WNn{< zSv#jlSznO;m^hYbjne=>P^Q&P_9a}!b?rVKvE{$8Fq6;M}E5Dcr*v$qepe9oJ~LLbfc)_%rYb^<3c(dsZ@U diff --git a/platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/CordovaChromeClient.class b/platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/CordovaChromeClient.class deleted file mode 100644 index 5939de395d305b7621b2ea50d6a6cc8e5702bc18..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10293 zcmbta349dSdH+6i%xW2g5JGs3Yy=1pI#_Yr0u!W_5E4Sdx-j4bk9G%XVYMUg&I)ks z#5o;1iS3*uP1>eM>KB^h%Sq=@F+*uhi}xlK=N+c6N5P5=yGy zPxEHpeDAxj_hw(Z`Qqn@XcvDpNDt7T2I$W!=p6ld8Rn?`2$4K}RW5%am#=B`mn-S7 z=&yr#@eR5BO@RJZ#=n!x-Ui8l(n#rGj3g{|M55(tic%zv+K8`rjb! z5H@zu{|UD5YIHM5t@J&ODM(@F0I$%vB*>*)7UXi)R??4fpn@wn7~qvb)_E0#=E@+i z<|?_YkxRAAt(8m7N_v*p1?e@emCJf)fN#?{BoDU-DI%mJyg}nTg4Dxz%4MU>)N8yc zNXO|L8gCBL3BI!emo1p#dU@Rt;H^QR+9sFng0xZN9RY3%(ik@fxJAZRx$F#ZSjM&> z@8aDW@6mWK6EW$%$)uTzB#d<0Of%IU?d|W592*=Q?jAZf)IB`fKN1=2>Sp3zrd1Iu znYN9jJ!T{_W(iTvKBkh9jvl7!{tL#85l$G%iSV$UiYF%yGF6=DxbNJ(qk|(ISl`E_ zMXglKnlYHR_FJimurX~!C(W=s8;&?{dy}@AI&VZxV9<=|>9M$ZiD}CcD^8i?0tEQ# zsj+y>v`(h1iIka6J4@I08_8J8ipRn;fC{^yl~beB3CoC`0Gu&lGTrHcT{6cn#_h0@ zGGZhW<3{wNh%+3YNE&t~1>jvv0w40;CQUm$nu;GhjP>P*;>oyun5nUG31M>L?-*k$ zjaV^|TiqW|ngf}saWgeyj3+Qt-ET#W#F&wa%d5hb%vYGB{^z7l9HoL$llOs0*ufMhC* zC#N&{+K9&{5H8)ZxIJQC7Vj*#Qt^p+5?Lx{o;RR86_Su~5;jSgu^|%()?3N$%Td#e znXxXzHpY##d2a@etMPs;RJWtkF?cxCIn-Fhz6+%6>+36I9}Y8YTPY-p20zAw;C^6-xsD4)66PC-9}l8L58t8m87Az>`MGm_kO;ofp~1mcrFTW&&<7V>)0B zerO;o88;A=b%l$vEO#0y0Idd)e;rd(;Q~L8g)~-M(`NE$JYhyAEi0|Ecg}cj!p!d} zM2i&}rwvIX@7LxR^()ia!oGKDM8*0I!M$hcWd|2Y2}U$(PTM0O&vbNY6vZeP$BM`+ zD5UwiSh#B8jL4)#jcKO`6A{E)lw_#~HRBN-a>gN$$9_Ph*s1nbYM3jrudY`)& zwY69y7ZJrkigAPlJ*;xF_!Y!;dt`sK@03)pQ-)pyu=~E>n$T&2CUuI_1)VNZLZ>N8 zYTS;}oHfHD9figRbw0%R03{#R`E`5*X;*a~I(P69ojW;#9&_;q-p^daE~2|lUwy*va5LCtYmq2={NV0$Vs1Im7qVp(^X?#lO z`}nlRXLLTx_oKzhn#|3V*%nFX*Yg{6KF1F%pUhoi5NyGgtDL(9ew=A=kv6M7ud`{d z-x{m0_xC=|On$o~b0{pi9%XR+f*G|nj_Mp^Q{(eGPw=FU2*03lLgyq2{MK}Py(D0v z0TgMCErFlb>8I$YHGWX1$2p~Q8W;K`+cN!(PQOH-);Ys7I$xqWoiEdiI$4DM#fAc{ z`g6O^SNI{F-^dSZ{0Qnm0q7FNM%48to!`t4>-;FcmFf0^wZ57ID-^u+^N?3xbbcGf zbbdR(1I4T<+@#YD`fa(qtkZ*p+E$yzl%EK(g>YZ&jH}GJ(}+s9w6mvsdx!xwAaG>F`v3AEWV;K(-L3SR<_QQ%pMxU~kdMVH;ntpn!oQjg&7K3-Tw< zC>EF7+X!R3Ce18tFcY`0Afx+=fFZGJ_j zHK2adO2?&<>&)1;g_89?G-iWIoLEFJ_Q%sG?$TL}HuidmvdVEb#-64d3KlI(6KlZ$ z)+q&KscHOvB%i`r;bA!}@I6r-<6V|QgVQ-&RuXw4GBRcCy(P-`Arfw5skeHPBUV$p^Oxp)xhN6 zaBKWwv_wTBpeJQzrt|tCWi@RgWjJM2a5@20TV%OoVt_>4mWHXNh^}&BmK9ozr8bii zpw5PPRWxM+i?_!|L}Y!WV3p5!`2oM!0;ZZQDt{{g7s6MUl-D#IwNlv(RHQ|4Syq}3 zWzo3-ja2ORPWS{<@UD2Tr14dza27Nx;4LaG&cv3nBCjwqwcdJ(ubLtGXW_Gvsqsh9 zf@NpD$TC z8*ep_O$SDnb{*HWnzQkFld*T7p%S`;nX?#IU|iocN8D7s;u@O$8Y;a;P~HPHy_oBxE9#v>K@ZUz@dRXw6{d&P(<8W+gXo(u3h6iFDx{Mj zjc5uaq`9@cVtJ8%`3>>cz@SF*2zSK)Sio+?f^Jx|&T6l9vC zmF;DrvesGBPld{=SItr-#?o0@Ess_6wB~eEsC161XK5{F=BdVcUN=j%>Uq8MeA_IA z@H|VmpDO(nsH`Bd&o+ETCNij+#+9pVf}=FTP1>P_J~+S`=>GxeUhH+);m(t498x`| zbTv-zf>ViR#_4g~iG9ZD33@m5UQH+IJ@h1W!}OFV>#MG;_ENHLSRiYiBg-9*tkrkU z(?(~eewH>VX*WC1Te8wOIL}*)O5X&ZBziA+d=k<>g|K-V(!USVUxm;7DBX{(d4isW z9-i}Q!1gp?dm6Ak4cMLrY)=E@o(7%Z!Zs(-=I~Y zvQYUfH9kXELS^mR0wo1P0p$?$w8QTyP3;w-(i;>EVVI@nP#{z>OD(5DffD5|0dbdB zD5N5!&CyP!#DFLK3T+{qzBdy$>!WE)l@m9{M1l#0jr@ zYQ5^I^(uYXb*!tNTCW0f5{@M+o&dfwaP}B|1ap!uK1v^V6ih$nD!2^_E~(yC{#n|6 zx}>)3I_()gUAjpPWwn}&*J*F40#M~I(7qDNC67ww$lsJ-Vo;dAr6f59tVC@duWick zk}%rfFisG(f%XNpwvB!qcaj3z=o7ee*8T+jBqU}z4sv;Y6ugT>EuW$NRoW+Lo8tL^ z!*eV6t-DTl4WBM+7G9g0>ssgN?i`=hYVCKR&sV|gYt)Qij7Y#XIXFFDTa*rk*B1ID zs)7V;3;hhZE>YY(gBd5qmaBKWn`f#01~vMb!PG(UgW-_N5?~yz=IEYWVsUi$T}XTr zG`^?!sdcb={OqQmrJn=kp9dc+G5!MnKh;aWhykZzxC%345JK`vRa0}z935_HE-iV1 zURPRZCJs_LucXziD^gBgukuJ$DMu2~tLQWI%V31*dE{1yMn5PBjUXfqG`Gysk(_c> zZs#>r!PP#@K@W2f&N>Y|SPjhA73LS{MHlmajPfoZm}jY@5N|DMyk6ne9XJ;+(>(o( zi{snSfVj{F;OP7U8S@m8pa;6HIqL3jMyMa1r=HVQH>+;W(XkUPRVWg@B1Ydl9nXRG z56sgE7iyrrG*nu(<{AyEv~#i<>EvFi-JL?@IZ$)z!+u(Y^1BIKZlzk@MjLoLZRbX6 ztFCBzk$T!IN}gs#7P59&DBG*G%VUHQFY6)$^r0om!jpkR=~4L0EtQ3 zmoH&ORKOrKJjEPv6(e&F!*ch#DhE`-NWVwF4`t+p5cr(h{s2P! zA^njnL>N!v++|>LH0LvthVerzMc&bUnM>Z${a3L3kFjh8{Rs*NAsN;ny*hub?%3dt zo857vJJz}5dUvdG$2IO)L0?BbufWgV_R+`6EAVr+1N0omYbZIh7<;%5r3^n$!;jf8 h@=<=8d&(>Dv#+Q5IK}~tgBUCLB2VG{Tlhl)_kH$F4d?&> diff --git a/platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/CordovaInterface.class b/platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/CordovaInterface.class deleted file mode 100644 index 43ed4ed6f35469682063977993439c11d3b2795e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 501 zcma)(%}N6?6ot>N{jse-b)o25gqe+lJ7J(8#X_NCvEn|>#A#|sN+whE)m-=hK9rc5 z>QoTHO%B|9`R+M4?;o#k04{LQ!hQ=q!cpd!bywWUm2@vdWA8+kD@W)DV`I~ZEg7GS zh#Q-j6^jOIov1vOIvz8fSR)hP)=p>_jY^3};RE3$6BTz29WbS4j6V_1{sAu--E_ks z90y^wku8_ex9gbDHu^?n8A}D>G8iwI_o|pqqp7n}r}2-`HRs9dxE9w_FUR@)i!i?o`~vJ~A%O3ku=% v?~_)egx<#f+H8|RsQHfr8g;@J>VVe|M~TI0B7OF(S?Vt z=)ilj%*U`0M>LeYFOm=9Tt1ZLqZmGpBaTnx#g1Vyj(y0;OEv}_#}aZeJW{ZntU}l1 zvb|=f^0u2x%?7^X=0+6a6MEIx89UI_=(|^R17}6gIR$4iug6^13+%x0+=9Y^8tbYJ zJ;c`a;+&(`6^>7OelBIN+L=c>mGS(n$8h7}{xDP${nClTiCy&5ZlL`oJELjQMubb+ z*KS4=$jM!-W~z#`>mINR1?`&zCY*xJl$fMiP-q@?Tqn4y5E(o*rw|?YvRa{i(sA`v zab;2a_eEJK^D=gR&h{O7FA1Z;BZoMS?S>;?%sDP0bguf&8p%yFoMY#m&*;=2+{Ln* z_by6hGIvp_WkOPnOTuLYcm6j7;<{tiWLukJOh3_?V!&h>s;=uANE$VcozE}YnaATE zTj5DCa!TrEXQY~JBHvyg^K&diI}22+r!dfvmaSSWP1H8_Jw|)E;JK;Wv(r;!zHe{v zG=B3*Mz5OIiNR60+b9n~z0LB!#Fk9jN>dOf(cjQ4oE*_0p!uBuG@dtO)zIrUA_Pp# zb7$;gf#r%0E=WleE5&@^1a{#uZwZAK&%LJ$#T6>FdG3^6mo9Y!g+qgrwwv`mC(C&^ zvQ&69B3_!El3MRhS_-Y6JE04K?`@dpySh-YbBuGTQM%PmnqFMi8TLd?E0sjdA!`Tr z*6Xfv*5SEhY@szL*pQ6!%;E50I=vG<$)e5IpB4!*ydzYaz2O_vP|)MK(`(xIoveP~ z=O;ZoYbe{_0KZTjDf)R5>gyGI^?}dE8mLm}>L5iKvnrEXmKZxKcQ!a-@tBHcCM~0x zeCb|`&w52aqi;Fp7AxJsGiFZD2#X2y<7fg$@M;1tFw_jx?I*YCDVSV^O`V(7&^4h&P6O0xRIqcT_Qk1?5+1 z3y#XnDm3Ju)jSwpecPs1>fB!SKAz`?gU++M;P^UQA!L?c!y*s()mXq$er3D(!EOS- zH0Xha{d@xs@YhV)LGI)geP$=g+@r!H(9tW*^SzTAECknMd`odx+?$fmp?>6ph2vbs z8K^M8H4!S{1YYA?Cr)CJ5;6V~5xS?7pI|*jSMnD`{zTggMCYHQ>5t^lGenZZ&(NGa z{S2|>(C{W&lACC)hB<;5&Cf846kFnT;ycTbZy_!bm{OiI{q}XMrNu*HZ z&`lHf?iYy94?joSm1uIPFM4_tiSH;5*^YAuX8A|eedF$YXi~w}O)`2+{B9;KWv4^Z zb(T5A(MrP3G0b^Nqtv>|`J(ahI!< z=^}SIt8awO8ir~?P8pC2)0o-rqb||kcJT2o?$K6py7rvqzl@8mEVpnZ%Z75Z$iJ>` gbZnyYDPqxY5smx|OKvp&UxaJ<;#7FRHw$zB0=dz|{Qv*} diff --git a/platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/CordovaPreferences.class b/platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/CordovaPreferences.class deleted file mode 100644 index 970a574c8f7d59f7b5797d6af2b7921eca30aaae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5602 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 diff --git a/platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/CordovaResourceApi.class b/platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/CordovaResourceApi.class deleted file mode 100644 index d2e3da5ae1f1b8e21d16c3fed5db57adf6e99cc0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11534 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 diff --git a/platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/CordovaUriHelper.class b/platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/CordovaUriHelper.class deleted file mode 100644 index 1c1e7877ab2e55172e040baffb109fd5d632dff3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2841 zcma)8X?GJ<7=ETnnKT{R8p~RQuvFWUHj21F5o|*WfskNR8j50_CYNL&oe7gk3b=s# zF7Arh4}R|#JrGdN@dx;$JU%yDOB#C2Il0Sw-}Slg``-EI-@pC_@C<(SVmCq^*oC8V z2zOut$GkX>hzBRUIEknSr#y(sW!%fd(_XxSNx4d>nDXF^7hRb4B8jtdHRHiKIln50 z*E(<>ugleJC*FYW#T-&9(jEvE7rfYpkOvt#XXRjcaS@kPUlkt6~UBcr!5MHs&i7z zNhZpxwG##XYw$-*N7xtil%T}ALxyQMhZUS0_+JuhFxA}{oL1ltS!w#;9W_i5E6&de zdrF_nk>ZP5DLpr>+lJiNh;Aoq6xR0njBOkjxxBFHvn!P@G1i4@*a|imvQ{ydj+caO z8)oC&LFro&fKBJUWMNeOqUa)--0n|xtNMLVaUZ?b4Q#=MA_C8J;v zpE1+499?Q5Jlh*K^#(aOrP~?djO7iQX)npFaWVb76?hX?(N2j8L!!Q+mMIMsM`ZG8 z*b7s`Qy9=Nh#?i0hCD8-ur(Aw5Y!8lJ{SzDC~7E4N_$#&^n(gInV7STLI$Q`0ar9! z#WfXgYIqBdhPQD|!NxlD4@0P6Ywcj9iuQ<3>@0I+IucGwpWab%UBeB$tKmJouV7~r zdrEgi#Udd!}qwUV6fSx zM_!wPo@US#Y-+CA@uHDS3!8Zzwr$Jy=c875Mp6zN?vZq(_Fm?Pb6hFkHpw}{6 zRoI4s)|Ip(hH86bO0u=tP9bSHSp^=M6uKc3yKkk6P*%4S;&M@#>`$^JHRg9RYd9ij z6bOWWV6as{4Gspgtwk`6bE0b$*di)~C{>CyW224m6?R2auO3uwwTz9|&|S|WQ#e81 z8|xyk+XWU{|H@EmZGEs&w>5UUs1}5Cl%>Q@vfQES$IAi_7Y^k*^>jK^OMeA{HLa}@ z)@U?j&F3w%(&7#*TduPmXQ#V5JQ9Oot~Ek$8;JHC9^0 zG=&|?>4k#eO{oKd6fg|$XZ z51A@;mF!o+`U!FDZAEA8R5G;A$LD}z!eoN*9a*l)#=SO^YTbbPJ&sk+`d)g`%t(%n zEs``E=ZC?e7N%A!SV5V}+SY=6O-ChAJ@v@y*8)F3e|GaxaA7O-P%d2uB~>9QSbSM+cR5QC*M}e^m@m z^D|8Ty0MSymCEW_8f@cgKc3@EGs-BrrJlv1J7~KDcc6^+TWEJL1$^tuPy;>>#~Zic z4fs0B@GeQVGCIkokKX;UO*2HFzA;U{t<>XMoNg>6Nuv&&hnFU77++a%=25*#wlD!jGE$n-A>~+rYfNA zM>{F|@I0kmJlVnr<3I(-#RiazIEc{-kc&7((A#Je=p^MZ|3@NtnWQn2+AxmKIeSSy Kk5BL!I{pJNCKmkw diff --git a/platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/CordovaWebView$1.class b/platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/CordovaWebView$1.class deleted file mode 100644 index 1d927a883307df01867e2a7fe8e5f3a78f2d1e26..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 941 zcma)5O>fgc5Ph336URWH1=<3orD;i0go)H!5E4WnRSG>2NY5L4l`NQDwBDxuTS!nO z4*URq6fo;JRFFfkWY6r(+qZ9L#y@_3`wpOkhgFnu*GC1LK5pZlk1cF_xbI1#6%`9~g2L>Ork>nRU=GkYvXLn%(X1b-rxv`-oKn*V`s4H-&39Ser5eW}FJ z$%m0JZ}=#o$o0OCcrxThx^*5bIXMhq2o9AJrkC(E6%^TBeq5tN0;^iR7LkxsI^m$% z=PEW@#&jWNg|c)ZvS+rtkT}fpU8mT~z-N|WeE~M#PnD3_4u-V_P|n5R5A=zN#7pV! zyYhE2AHCyKPIY;qqC}@sjb8~n(Xod{fL-hb@Ng+W)p-xl^w0{>#y<6FX`31yhV6eZ z{@iFDM?AH8bqryaGLdN4?!5g2VJ+#TW)z#QPPMVH7qQJ|>rWw0#pu1XA?=&zsWTgM zNsCz;2I6{~3iE7CT^d+J=P;}irK?hya5WBR(Jl>dnMRpLq+WM5BCkMi6+R73jl2U| zyNKW3{{q(jio&N16VSIp7~mH!(>KU`A6IaVRwMx{Il~dzqC>PlgPo&zj?(c3hws=~ t0X0_4c(!KPoX7F5;zq_D;3jSnx`;JmD_|WPWJ~l9-a(x_r?^a(p5H0p?8*QD diff --git a/platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/CordovaWebView$2.class b/platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/CordovaWebView$2.class deleted file mode 100644 index 217cd092f0d7434c5c59497a27c98b9c07321dad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1282 zcma)6ZBG+H5Pp`HUMUCEf(TLTAw}8(J-~NRBx$N?QfyL6P4v_Cy3)hrmh9b?zhHcc zzr_U5_`#2U@F)4fI9E!rDM`8HW@cw6&oetSyTAYb_z7SIn?q2M3dCF>?!+*H`50~^ z9YrRJYzzxn9HRA76uB65EGt-1u&UrLL!@QcseR5cTM}|tHx3N5$#ql6hG-dj{#3u> z^_s;G*BO)`+?O^(qO@mFgl#yx`nD%6XP34kUej_@%Va#U9Lw8ac$2;a?qx!H*fKSS za9%Vh_py@Y@R$C6oy)3Gx5<+z3DdA^hO~lp#~BW?V*rC%bQ~`8w&A**JahdMNUhTG zLeh6grUUBOw(zCNpIZUlcz2<4L9&!q!7**&Qfaoh*Axu}_f*`+0~OGFoatG@(LAAf z6HqT`8RxELnWy(9HHDD|-GiGvb_Qza?v0`OA#1p}i-%wK@fi`wpAi%9df z#T`0DrvCt(hSCtsU%=npq%+hp;Z(TEtrl+-q!f~2GhH&Ah7?vqKjigymZzUxtzvJM zy`D@B8r|>_n&44{;_+aF0Max?ZB27UPr?BG6SzuIlVoksIvjYi3&&vD#bXR)myQw2 zena?cJNg>Q2t|Xv#}wIWU=zYLZjffUiDU=M!eDz(&mLjm1cQl4Livs;t=JKUeqp*} z1>5mIi5Th735L&UCJ6xS0~GcVqwEu=*k|O}m;Y$>4s8gxh1$y0e$sB{K_k%ZMxG2xQu}7SJ!u()0uZo^VW{+MAgfiynUSM0 zWTx0+Lf1mttSK#6WoQo*#V}S{*DA3p&wcBuO6*4=kEEBPn)cL9-=ON*&-=LPis;Os6l2O+TWh1oi5 zPJW5G6mHu13b#@y+L*`Jl*f_k$V>@z?N(V_Syx_6hIglSL?CeP$ZTwPTeE~48TASD zW%uy76l*dueZO(NkEPF2R(9TuIxAd>mtyHXTGrAdpB?+UZ6Z31npDxUFTf76e@6F8a8xiT#4$S?B+tQ2-un6CGrdA@2C*kX9c zUtZHnmidnFWoC!w>0Ajz{A6@e$X#ge>M{}m=&6#1r%)Q6T4{Ldh+m&3J_9(#Q-h4= zIZo0KIr%z-bGnWuXRMBdbHb{_at4~~Xm)-_@>S#HY1$-DLOjJ8#K6&O?J^AveZYb zjEWC_fFEVqvjm7Q1XH!sJ(Hf(-KWp)?>|3(0a(U^KBSN{%dAA)(`%36RZIr=JkcaIERh}_pGF3S6DX&I zLcivo(d-FrAB8dW*G0J1(1O>VDMfQ4-0$f565ko8wU_RIeZV>L9phsX z6SzQ@;UcEmh!sLK|7G2;U_a2i51WDf#6Hd>jFY6t`i8z^-~l8F<0D4dCrq=?9SO4S b1W8;X$OJW-C2P^gY6j=YOHry6S^E72RlP-i diff --git a/platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/CordovaWebView$ActivityResult.class b/platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/CordovaWebView$ActivityResult.class deleted file mode 100644 index 3570bc61b90f0238638a8e08e4b649684be85358..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 757 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 SlGaU}r!FAOqiQZ^S^fa>o%Un^ diff --git a/platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/CordovaWebViewClient$1.class b/platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/CordovaWebViewClient$1.class deleted file mode 100644 index 19b98db528cc0c6d94436f73aaa3a42c135adf33..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1260 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 Butxv@ diff --git a/platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/DirectoryManager.class b/platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/DirectoryManager.class deleted file mode 100644 index 84e634ffac3ec2e92d0db55a48d36cf41793bd82..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2643 zcma)8SyLQU6#g29+0rbTj6(=n2w5B;$(V!~60O?r9=iP1zO zYSb#L;)|rz@{Jc$r7wgsRsH~fl=_|SW(bf}IaS={+_QZ5JLlZy?|=UM3&2r)7sq~# z#jy_`L@^%61$-FC1TMzWh)W{AEUPObyBftc*?c5oEsDvSe}i8H`8XO-kU^K>dJUcP z7lL@4ieOp{3lSJ`G)cH7+>n708Zi@v8AlOT6t>K>BD@)a6G2HqBzI=;+E{i_K_YiU zo6|C;W=&;AUB|Gdx)jv*+E&TcEO%Tp%X$>9f^fHC8SXm@s?%-b3PQbhL03?pGc0|i zT%6RMF>TVMB$2c8nmMjHhU^1j$elJA^+3*crZU>BmY>!$dD|)2jNE59dfv62+ryfr zP3aE9*SUJh9WYG2f8Hp$G<+q!8D-l=qL|g(Y3lo@hMf^3I*3^Mt+U=ynAdR2bfJj4 zr4tIBL%WJz^eI3DWfgO{ z6~VlU+qk3RW876SfI$_Xpijl8xXYp{+6{8C*9IC$ga z4O6M%^_$;>?5rWS5{21~-56&hJ8tQMA+JqXo1N7ymK|GQjm%ZQn?ylc+41$_da`7j zWmor+HLg;&p@o=v4}E@yT#a~-))oqSr9ns?F%)MChEu{`el+&;lb~P+4&Wf?SGlV~ znl-IRiF53rB*U47j+*wTQ2y{#4si^7!d4vSTJ;rhgvvk+ukkzP8$Y7M5M}8VR4rm} zd!l+7p~u+1f|}t&%LuoxATn}z8PV<~)Kqsj|3=*^i2vP$0eY&ZuWdMnoj6X&orHXn zVBhrOcA|!7bv!*ztDW3+a#c;eYMj999;&pb586}(vKZc=y^rrw*j4dlrvr9YlVbslaSSl450<5$l(ZKp7Wr# z5R!2D7GcR}xPxGX^Dwo#&`lU|c@_d#C2EAJx91reCdm8NT*opJ3t5ia7EXpzp%x>F zWN{5f!ejXoxxY*ZSCGP0FKoLf-$RBD(p`-5ckv#B)boFWtQR&#X%AN+&V14W00jc7 zqD6|loNfThJM-jMBHOm?i0uZ zmcv4Yh^-7D1tJ$af%iQyvKsO-A#(pT#@w9_VEsZ^qJLh=k&1wbW6$C7DrJ{|+RcIJ z_Q<-W0xq|ND5ZNPgVD!`a%#Q6Vb>aFztq2HoJS<_2PWf3Cg&$2{29ae)x)3iQ6NW& Z-1RJL>o_r1<4mwW$C)_!C#^XO{0BcaR(${f diff --git a/platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/DroidGap.class b/platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/DroidGap.class deleted file mode 100644 index 4d5a42189e14d211c69998407a219d01ff63e2f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 389 zcmaJ-%Sr<=6g`x2m^u6C24Y30{+QqCJ>BGp#=IVX?0sKrpi9Z zY01hUHMuM^X{qJkV&LYq6gWtYoh7o8`CKKrv4v@5GO>n=8(9qn;(JruTwPOJsP|)> zKgve3IZ>5Wxpb-!*t@H>qlL<7N!(_nwQZ4;7G>RIxeGwdQjD6s#}2m;4{ zxZ|%uN4cYh+!K!A@yE1F@aCe79cIaj1L4^V#4`&XBE}BOz#-NcyQ_DIb;QhkY%qGP N_V@-i`Lxk};1eudTao|( diff --git a/platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/ExifHelper.class b/platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/ExifHelper.class deleted file mode 100644 index d93d0563c6cd6462bae47ed235b4ffac927ce0fa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3465 zcma)8TW}j^89l!xOKW*8*^=Wnb?!GiPExg{1=@s`G_e~ua%}97G-;u%rM0|?ysNHO zaavj$+NKv08d?IqLpoDtN->lSB`ufXg&COPi8r2j;|X{tPr&*9-)ku}li@+<(>eNY z`+w*AR)6~UuYU*NcKk4dJ5cW8w~Bx(FegwIm>2K_P6(V7s0l0x_yU1IUEnc+P@o|Y z2{Z*x2`mbnPUG!7U#Xlz2D)pmpLfq`D0#>)PTeWbyTx)4RsyC&wmjh0m?iFKmqVAgH@B%hTSvTx$J^NJ`+>;_ zFJqwX(OPqM+jtNMZF~lI+PF*LvjU$J_`JZ~0`~~)7T6>31%Z17?i2W;z+Qp-1@;N- z7Z?>76LeZ8!r%=IAZMAT3C2u@ZM=rpdHLdRQzG{0wG}hATrp$URLlcYGi?>q z#!L-RXs;O3xJFoCZER)qN{P^a@_SrBredgEr(&qek(bLdH$F2tQ+M6UH0#5!G8@SW zQ#}*Q)pLy}?4xbfW8)3HY2z&%Oyg}E@8Act%Iz$r8+w~oYBit9*%NL#QYdK23yR~D zD=wDmcB8!!`_pVQVnJ=YUJbN)XQh+bbZXnYq3g{1^falaY{NO_uFT|R^tFyE&7kUr z%zE7k8!Sv7`?^&*j*V>RckmUm3LRo!e(Mki>qrypNFVD+E9*!%>qtZENKflXTkA+? z>qv9!NPp`{i|a_2>qw*PNU!TiyX#2D>qyhocaIq}qrjvVZctiqRkW7-~fQ z5*-2wfuumEKuRDjUu@vH^VxL!`Oji9Q9S~ zLK#KO<2D@P%C>nrj+r7;_!6f1#PZ~$+_QtRXXH1y>DZ2saWhZXI#@>kcsCcgM=vyB z1}`tfX_(>lDsBuer0`{aj@)qZwx>3W@8jb8|L?_*#yL|y65I^9Ix_MRR^?Y;!7Y+E zO$Ied7_vr_q#`WCMiSKYmzo(gC>?C8#U=NWRoTtLpE#DZO9f)Y(utc(qqUr zO|pgzX_7N!Sd(5uwrkR7$cQF+Lw0CVFl47D{jDTTqo4QiAd_*B9xBlj6HLk>z6U0W zQ+Sy9o@Y{;Ox80@)di;MZKmnRIEpKH2*0Oi{!9=4l_UR-NANFvMd!n~=IV-T9^(4i zH66#z-K+Dw?SVfcd6}`}5A-`}ezlM**u{{DwLu|9OUBw7YDuGY#@bqHokmN=+B#|} zqoreQJ+-vatXSJX%`#e7tZk&$WwcDJZK9SjT6e5%rq*pVJJz;PvyIjhYg?)H7%dxX z+o)xYmW#C^YB{6z#@aBoUZeHJ+IDJvM$5;VWI1oNLagneRxnzBtnH-MZ?u6cxV7bn z57-HSIrg|JESx|NC)raL*gJgogF63FJjRM^Fq;vxe+rLc5j8wcq zd+rS0r(-_Ev-mB}(kIW;CokeJcnN>QIs60XaTPD)Ke(W5yrK$tRc*jUHN-#Pcj7g* zn|~P&;7v7&x6~teN0s@$tmBee#JlP_yr<6LM=hVJ^UFSKZzad*O4Fgw(s|OS#8rh) zP~0<^yoAog(qM1u5>ma#mj)TrefWrqCErwbDY3)}9V`a$LNdhnc^x0HOn$;ES>ns; zr);o4V}t#W?e*s@o6BsUztBfAeQwwCku0{`hgleW+p{#{m&RROTN+S$B!3&5d+Yv9 hU;6|p{HpbQ%!cW{33g{W)}#0uBjE6p;zF~)e*tOs@TmX* diff --git a/platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/ExposedJsApi.class b/platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/ExposedJsApi.class deleted file mode 100644 index 734c297b6b0b94ea2e1ad2c5201d8cd00dbe1f47..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1362 zcmbVLT~8B16g^YguB_DsM6iNdzO)!sO12TIh-YOO7aNm`r;m*HK}sWdq; z^|;@#t5GQZ#>)TQ%wA1n$R+kvg&T^9fjJC@5@A=mv4$(H$s+DXGVmEp(&yESYt2A&#NV#x1y{7AOMzEqOzSo8fL;xU3@y2AZ>7|6Q)Ueu0d zWS2>=azojU96u7_A$J8CGO9$hO*vh$7nD^pv8~wrOwn=lEHYj0bu?{~5=zk(Wwj-g z;tfHhMvBhCwGLQ^VbI#~JsRLfmjsXr2c)4IbV65bN=+6iZZxQ zahB?iVH^+QnBgJqG*1$r5US9wv(1>$_$ksok!CDtfdnqbd~}YM)f4!OkBJFlmWn%S h6EF9hB%6|cZ!h=DT-Lt)&tB7*`Ae_I#4&{@KLL>8Ch!0N diff --git a/platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/FileHelper.class b/platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/FileHelper.class deleted file mode 100644 index af896930380f5804e29fe80dde81afb8dc06df50..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4098 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 w%dnVh^c$?{*NjO@HsKOJ!#P4tFY}p7EUCj* z>RbYO6ii$)vCJ^ECOsLhGZ=QR!VtaZR|UgZNqSnF@@9nxQoZ}i zXjqqRhMAHd)EwU8Ze2L8A5{I9+<8>q-g+9!X1mB>g?>24zxS88y=bqM1qJHjzZdy}$iYFzSnix^i}hRHv9WJsUPdareudG;4qYrS`qdo`z* zYH^(sh(CDcidHCnuWe$5VWcc;9uGSKF>>d>s`#7Zvfl|@@lYymM~}E#Q4~qL^WLpyT8=mKfT&JY!)12wF2biLTI1&sK141>$id7Sih09pAa0OQ_ zT*Gw}H!R%5Er!g$+Q^U`#M<6z2$wpUR*0iM9+5@ka^gcrr&((XuNKzztWj5unjjY` zd$ZqpT}96`Q9pb*Gt^xBxJAD`MBAXe-dq{HN_?g4W2E%mxIi!^tjMCle8DI=adX3;T#$jmi8@Dm3$ B{KxtEscJ^Nd>i@%Iy#?0)=p5Ntj&Yti2?f&xjqaOhr z#f=pDakdM)@TQ4k5^tpt$5|88@;@WyoS5?|lrU>zcM5a3U}CR{eI^c=7&I|&;-XBy zE#{J#%VMsGxhm!zG4G0bPt5zmu#;FwqHG{JUnq^w%oYq7QwF*xy!uMht~clH+Nu*{ ziX8?zPZ!27Oo|gT5TBYpGb8tL-e1g@rsckqiwdREOi7%C0kb$WSuD&KiUtxRZryF3 zG7uXWoadGaui_Z!DY|uMdiDB()0ndtY8)FM5q?&R(|5 zi%zcWH7edsJI4?w4QyC(nnkZ#bZ$B|(g&s_h*=9qwhR=PY_6`^^=fXm*>LOCld{Cp zhYh6M6|$--Az@u+Rc;zM&;p|G7i_F)SGk8d8x>wIuUowMd?Rf!BGkFXhIdO+@$=o% za>l@LTi7d+-7^bIPPyqr<94IURC`-Yvxp<*S|D9&)?00qoinZoCE6a5nx=6GhtoKS zEGsvmRAKoHZ2Nb`$5-82#c3GWId_%O5>E6F)?{D!>G#`&8V0$F?lf_mKm{i=NQPWC#fpJR<)OxojP?p z+@h$1krJvt3Z9BhxRb5&AJb;jQ#%Z79?%yOkg@BPhUZptt4+6-^NZMK&+*Jgp5#fG zgmYunu2I^j+W(32?CSs1jSQK%<~6R{O#>%dRH{WcwRmXk;XAKiUKiMb-N?e=2wyjN zp8np5{{sDe5r04Z0}+3K{$Ru(LYMR;S)0jZi_#vUm*c;||IVQYFz)lFgF_Nt26y2_ z+O%50*YZpBy6`ey;fQQLhnPRt-}gN_tk`43FFin~l~_ZvZw=-ex*j5Rah%pCI z#t`;8y&tdo$qD_nfc_|;-?lakts(t6Qk@KQ4|%IQ@Dsj&)Y=&MN#EaN^#s1@`<~nnWmZwMN@-vwEkU1IDvnLaI_^lfBLl*9%2(%|GXir$sVT=bNooB~NhxaIv zQbPw1J;XK*`Z1xO_|U9cu0e_5+j@dIie4ICrL6GVHT|AP20 z+s2RSc%`Dk_i6aAi2u56d_KgNg4$;SK^6ZwjsGo6dq2X@gvHMUih}1{75@&;`sqO1 zxqxpeZM%JKceXl&kFg0qL?T#W1S^bSp#VA3cPOtGLCG6N(2wL#jPP^Y5k~b0O5req zen5X^gx}hZFs4UPB8L(5G+EphIt? zcP?GAbX+jQILvg$mCk_eIHTi=g&TKn+_`cie}d!hCMj*F1zfyy?m73Idw=(Qz2E-* z=@$Uwup@}$gE0DWQjrNoPAPI)kx307DuXj2Ooi}K1Q|?6a2Dr6IIm$Qf-Ej5<;4(k zAzTXKatO0ZaV3P0!_aUwgnR_oa6N>AhB*zN2>7o}ofnAa?idXtT`}xZI`6rbU78T+ z%s6({QGdX_d;JfXE7jD9>4@R~Fb+E4otJZAouQ>$ZNQS`|2)bKFwe zs2atxOcx#3ba-K=#ixp%)v&z#ytLz#Wn12)z+f_G*rw}PCarBx+8(XR?|Bp1>_|Z% zka0|+>dslVyj)*eknS~Op+ZeG=M;@f!Eh}lx0L~}Y}Evg?}S2~V7NKszEk(|&Z2iw z-d}JG*PND~EP4c`H4)t7yZc@WN+7u03Pwk{9i*^hUy??x?h;fm*+Q*(OV!&A!xh-w zG;bT^tFkE2)AHP+i{zcUTa@Q4^|V8;hB~IQsACxOIuaPtaZr&%iX2wt2;LMp`1(BP zcpJwV$nC*kUgl)NaAm@>69krc@x;WE^vaH@;f9WzxTWDU9R?PdpxKIH9s_uN|B}zAss=GLn6W% z(ajODmlL9o*9~&_5RUS?w{Q%jTq*nJh185vQh%#4qzOl@juEP_xf-w=%+@}hpz`J?qCc6#A!f~o T_h{k6`#c}43PGHo^1kqYS$rk{ diff --git a/platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/NativeToJsMessageQueue$1.class b/platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/NativeToJsMessageQueue$1.class deleted file mode 100644 index d34928329e3d1a20f2d8385b882c20092c61fd21..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 255 zcma)%OA5k35Jao}MWbN$Zd|w#!69c51qBt+3$$Ys6T*ySk{r&32k=nhWbeXix|)LK zLA^iE7l0U}06~C|5T0#SXxXH>5GDsM(^@We=l0?pCvvK!l4Zs<6UJ+!bL&!*?4`Wh zTYw>9VT(lZgY{jMw#CiXtbS8wF#&|p))*;PIXfqg5H)O-vq{wPnu#t6^S_bN)B{_- YP@}dV_|!qy-wt}-2Yy5ULrseMU;7S36#xJL diff --git a/platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/NativeToJsMessageQueue$BridgeMode.class b/platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/NativeToJsMessageQueue$BridgeMode.class deleted file mode 100644 index 02e11fc8f8e25d2ab4206176058a046d522b5ef6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1089 zcmb7CO>fgc5Pj=7c4}N=0u)5r5+Fbti<(G6OVu9{#1Crj7Ku(-XTweTpY>w$$>}`J`o=>k%?Uzdl5uI`jTP0v&7uiF@wG* zM}nc=4W@R-Me%4bDg(POY)$H8bK4vJCxT@;CUFXTxg=->0j z3AF#hkcM>`&FOoU^B^qwR62_8Y9!NO{ADoS53^)S^gAc2Tp!2sY!HPc;%zRXl!2Wv zRAZ5d)WjnOFnn6Znk7W^b`=BdoE}X(?=d`CYL?9WD6`lX`+;)3IcGuf#M`Gl=Qe6s zv0=beQNzSzhMk4C7Xo9!<+^R@w1~ kfPp6Yp;Q@I#|9y2*rZIuUDWArP^9AluId_Y(+#Kg8$!_hEC2ui diff --git a/platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/NativeToJsMessageQueue$JsMessage.class b/platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/NativeToJsMessageQueue$JsMessage.class deleted file mode 100644 index f9c28e6ecfb89fa0c0c4e0997c9533781605e229..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3122 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 HC!W4vzUQEX diff --git a/platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/NativeToJsMessageQueue$OnlineEventsBridgeMode$2.class b/platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/NativeToJsMessageQueue$OnlineEventsBridgeMode$2.class deleted file mode 100644 index e847f210570dfec352a1cbcbbd5299ee9b3b824b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1266 zcmb_cZEw<06n-w$b#zsb`8MYZXjKZj0!|Y%V{{DS7GS+Irp4G`mxrMU8FuS_ z(6{&}ZV!ZI`$5kiajVHAXC#jNgRmjOkoU#gp%@BdG2{*rKX*JQdcjc5Ee~h57?jFH zYqCx$G>0F%A~@n*m(-{0zRleh4;(q41r?b$0~q#}rZ>uzPdpfUWOGuA_TC=`wx~Ih zesl58Y#s9vXGm5(+x0`o>o-I+@OwJekkpaFhK@W6Ivz^%2wN&F9Ys*3$~qono64|k z6^t@NO3JWY?)9z1?y;~V+OK)&-O%%b9QsSr$wT9^AB03{hxn?D7Mj}dQ6M;SwzIHx!_#)|S4>Kr%?g)nMJ ru-8blePr0dA0*isNgUS+Hik{ypiv;cGGK@RU5F)_KoVp^d<6$tjvdEjG0-cGI%u+L5$;0SH8$j;Vmy7f4tQ+i_)89{cOfmUk#{)pr_=CN=&Kj{E&i z%eKwOO#)3;zB7-^LesPxg_qhg)volUf6hAUA6j0zD3Gr>Zlhp6HEV~mP;=b6Ly)TJ zTSs!&x$kXC&odixyCqwaXwgN>w*0#S^O+IWW%mTaE1m5oDvUz4_2jX1cLUy+D^AU9 z?wPKo#$9Dt(Gyr6-buQDfXO-1iGaXZM)8<+>~p(YIx?+hz-GdBeCy!Z)Y+Q0k>e_bb$v?};LZpISkCr4K`X&!w_*FzJuqwPdb{3-&8ucS2@UBl)p$c% z{xgA@Otxa$b=R@#yhfiEUe2hyx1U~M!fn}G_9JWe(3NIgU^>(9>dx+Aj;~9SFHr;` zRqvESs^r-xRdIHDmKKLebpSYy(SqlJugIGm?IFxDkj~}X2)TV<@Yr`s~F6te#ABM3O&b_ z9DDH`TKFe~$J!8QJcGUOa_^6j5?^(&r-JpTTxXGC4g?d!`=;wE5~Ki?lZe`Mf0!V-e>XC|7B?YB=IgpC!iI>I@rOa%j7OOJsl!l3?bBGb+VZkr!T%9OGCm7Ml1NVZ znthI9sv2*!p`+BcCq1FU!F0L3Qp3d#0fax}>^#O;)tVv5y5nnDcU8idv9JX1x9-MG z`CS=0*Hhc{Z@2$f^n{N|O!;u&8f($TE}@qB{Av0KhuP7iH}poGAbSlar<6Gx1^(+N z_!Uq-Z+2!Y2g^{vxAfRM>id9S4jy2Y1A0X6p5qp#Svs5r+JVouZ)}#IkY^3dVSZR6 zV9$J`kHF#xkOn};GV4R&Ik(9%&?yIxY4o6NVUY3O*1;05VcI!Z#tK)ku*#l=HO#VJ V<9r*NnBm9*Yvd=HfK6=M)*DK_1?K<& diff --git a/platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/NativeToJsMessageQueue$PrivateApiBridgeMode.class b/platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/NativeToJsMessageQueue$PrivateApiBridgeMode.class deleted file mode 100644 index 0745fb96dcb1b92e181024f8fd879829d48e98aa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3053 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 diff --git a/platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/PluginEntry.class b/platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/PluginEntry.class deleted file mode 100644 index 3f5f68af182c7a55b0cc107a17426ceb915add3d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1899 zcmcIk+fEZv6kVtE0z(l*1yP~JYZ=gbLAgqzc(*|XtqE^Knba}E44FiMcH2O;p&DAH)Xgb z!?X;yGq{t%j6$Yn2Rly1Rv0Y3w|1wUYs1xM z_!Y}7TY)3{=3z2?=a7BA6LzHfp%(_bq*my}sLkGWp)mV*p+_uPkkp~lA(Fe>zla(S z?Crp=SfNe#OaD}$qvuj|WVP;v&X!$vY7VWr=Xri;g^ushnW2{Na6o~6tp6p4KXz3o z8@&Gn{#y(Bs&@FMrJV;06GwR|Ty8t;h{r!;&94U)n?DEpZlI-)u1UjWF^jnj=CfG9 zViv==B*Wb-vgpg=m<-1;n8gX4%%UFy3S%8iY(Zs>gGPL@@!qb43f)xH{KrrH;;kP7 zeaH{ke~{CR%P?id+9KzZhce=)qpL7c#yH=aUOrDLC}GT%64H7mTRoFM=Y&Y$?J2z; z(iy`z&65$HtRjsr&I9J;)E?9x63HpGkFL);`V2>d2*4aYn8#VJ@=-j_VU#;&>iSBr zq;i7D!x(Ggmx-U`ok9Fj)d~4Nda$gK%_uTPHezH$YZD%Zd=)Z~8ac*`h7YWn;+!-0 zku)b8NSRX&q|MO=GUiCKfo@YZ&?Az%Ad<$A;rNK@k6HW)!JpEkX9RoByOJg|9YMxq zaxs})OeWVP!_wO1B+UWi#0)tZVuf+8(KP=&E^wXZ{YB0RX*!M~;UniX=X^&ADUl#T z+BB@N!V7A6Nlvd=ag}Imto>SRSc))X4f$9@KGu+rHRPquiANS%O{ztWoJi|LO>~(G ouAtE5UgS;`r_3+t{=`K>n=CScx0*;~NvcUC0-4~wsiP-<0+V8x)Bpeg diff --git a/platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/PluginManager.class b/platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/PluginManager.class deleted file mode 100644 index f6d3a47d041f4d366c029a0143a876c3a111d41c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9922 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 CL2Lp5 diff --git a/platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/PluginResult.class b/platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/PluginResult.class deleted file mode 100644 index 44dc171780335f5b776ae5650623e635d4b293bd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4933 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 diff --git a/platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/Whitelist$URLPattern.class b/platforms/android/CordovaLib/ant-build/classes/org/apache/cordova/Whitelist$URLPattern.class deleted file mode 100644 index 0ae6882279731ed919fbbb719aa27bb318aebaab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2995 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 E3;NR46951J diff --git a/platforms/android/CordovaLib/ant-build/proguard.txt b/platforms/android/CordovaLib/ant-build/proguard.txt deleted file mode 100644 index e69de29..0000000 diff --git a/platforms/android/CordovaLib/build.gradle b/platforms/android/CordovaLib/build.gradle deleted file mode 100644 index 47341b3..0000000 --- a/platforms/android/CordovaLib/build.gradle +++ /dev/null @@ -1,54 +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. -*/ - - - -buildscript { - repositories { - mavenCentral() - } - - dependencies { - classpath 'com.android.tools.build:gradle:0.10.+' - } -} - -apply plugin: 'android-library' - -android { - compileSdkVersion 19 - buildToolsVersion "19.0.0" - - compileOptions { - sourceCompatibility JavaVersion.VERSION_1_7 - targetCompatibility JavaVersion.VERSION_1_7 - } - - sourceSets { - main { - manifest.srcFile 'AndroidManifest.xml' - java.srcDirs = ['src'] - resources.srcDirs = ['src'] - aidl.srcDirs = ['src'] - renderscript.srcDirs = ['src'] - res.srcDirs = ['res'] - assets.srcDirs = ['assets'] - } - } -} diff --git a/platforms/android/CordovaLib/project.properties b/platforms/android/CordovaLib/project.properties deleted file mode 100644 index 9fe04f3..0000000 --- a/platforms/android/CordovaLib/project.properties +++ /dev/null @@ -1,16 +0,0 @@ -# This file is automatically generated by Android Tools. -# Do not modify this file -- YOUR CHANGES WILL BE ERASED! -# -# This file must be checked in Version Control Systems. -# -# To customize properties used by the Ant build system use, -# "ant.properties", and override values to adapt the script to your -# project structure. - -# Indicates whether an apk should be generated for each density. -split.density=false -# Project target. -target=android-19 -apk-configurations= -renderscript.opt.level=O0 -android.library=true diff --git a/platforms/android/CordovaLib/src/com/squareup/okhttp/Address.java b/platforms/android/CordovaLib/src/com/squareup/okhttp/Address.java deleted file mode 100755 index b34bd91..0000000 --- a/platforms/android/CordovaLib/src/com/squareup/okhttp/Address.java +++ /dev/null @@ -1,140 +0,0 @@ -/* - * Copyright (C) 2012 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.squareup.okhttp; - -import com.squareup.okhttp.internal.Util; -import java.net.Proxy; -import java.net.UnknownHostException; -import java.util.List; -import javax.net.ssl.HostnameVerifier; -import javax.net.ssl.SSLSocketFactory; - -import static com.squareup.okhttp.internal.Util.equal; - -/** - * A specification for a connection to an origin server. For simple connections, - * this is the server's hostname and port. If an explicit proxy is requested (or - * {@link Proxy#NO_PROXY no proxy} is explicitly requested), this also includes - * that proxy information. For secure connections the address also includes the - * SSL socket factory and hostname verifier. - * - *

HTTP requests that share the same {@code Address} may also share the same - * {@link Connection}. - */ -public final class Address { - final Proxy proxy; - final String uriHost; - final int uriPort; - final SSLSocketFactory sslSocketFactory; - final HostnameVerifier hostnameVerifier; - final OkAuthenticator authenticator; - final List transports; - - public Address(String uriHost, int uriPort, SSLSocketFactory sslSocketFactory, - HostnameVerifier hostnameVerifier, OkAuthenticator authenticator, Proxy proxy, - List transports) throws UnknownHostException { - if (uriHost == null) throw new NullPointerException("uriHost == null"); - if (uriPort <= 0) throw new IllegalArgumentException("uriPort <= 0: " + uriPort); - if (authenticator == null) throw new IllegalArgumentException("authenticator == null"); - if (transports == null) throw new IllegalArgumentException("transports == null"); - this.proxy = proxy; - this.uriHost = uriHost; - this.uriPort = uriPort; - this.sslSocketFactory = sslSocketFactory; - this.hostnameVerifier = hostnameVerifier; - this.authenticator = authenticator; - this.transports = Util.immutableList(transports); - } - - /** Returns the hostname of the origin server. */ - public String getUriHost() { - return uriHost; - } - - /** - * Returns the port of the origin server; typically 80 or 443. Unlike - * may {@code getPort()} accessors, this method never returns -1. - */ - public int getUriPort() { - return uriPort; - } - - /** - * Returns the SSL socket factory, or null if this is not an HTTPS - * address. - */ - public SSLSocketFactory getSslSocketFactory() { - return sslSocketFactory; - } - - /** - * Returns the hostname verifier, or null if this is not an HTTPS - * address. - */ - public HostnameVerifier getHostnameVerifier() { - return hostnameVerifier; - } - - - /** - * Returns the client's authenticator. This method never returns null. - */ - public OkAuthenticator getAuthenticator() { - return authenticator; - } - - /** - * Returns the client's transports. This method always returns a non-null list - * that contains "http/1.1", possibly among other transports. - */ - public List getTransports() { - return transports; - } - - /** - * Returns this address's explicitly-specified HTTP proxy, or null to - * delegate to the HTTP client's proxy selector. - */ - public Proxy getProxy() { - return proxy; - } - - @Override public boolean equals(Object other) { - if (other instanceof Address) { - Address that = (Address) other; - return equal(this.proxy, that.proxy) - && this.uriHost.equals(that.uriHost) - && this.uriPort == that.uriPort - && equal(this.sslSocketFactory, that.sslSocketFactory) - && equal(this.hostnameVerifier, that.hostnameVerifier) - && equal(this.authenticator, that.authenticator) - && equal(this.transports, that.transports); - } - return false; - } - - @Override public int hashCode() { - int result = 17; - result = 31 * result + uriHost.hashCode(); - result = 31 * result + uriPort; - result = 31 * result + (sslSocketFactory != null ? sslSocketFactory.hashCode() : 0); - result = 31 * result + (hostnameVerifier != null ? hostnameVerifier.hashCode() : 0); - result = 31 * result + (authenticator != null ? authenticator.hashCode() : 0); - result = 31 * result + (proxy != null ? proxy.hashCode() : 0); - result = 31 * result + transports.hashCode(); - return result; - } -} diff --git a/platforms/android/CordovaLib/src/com/squareup/okhttp/Connection.java b/platforms/android/CordovaLib/src/com/squareup/okhttp/Connection.java deleted file mode 100755 index 6bb9cb3..0000000 --- a/platforms/android/CordovaLib/src/com/squareup/okhttp/Connection.java +++ /dev/null @@ -1,335 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.squareup.okhttp; - -import com.squareup.okhttp.internal.Platform; -import com.squareup.okhttp.internal.http.HttpAuthenticator; -import com.squareup.okhttp.internal.http.HttpEngine; -import com.squareup.okhttp.internal.http.HttpTransport; -import com.squareup.okhttp.internal.http.RawHeaders; -import com.squareup.okhttp.internal.http.SpdyTransport; -import com.squareup.okhttp.internal.spdy.SpdyConnection; -import java.io.BufferedInputStream; -import java.io.BufferedOutputStream; -import java.io.Closeable; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.net.Proxy; -import java.net.Socket; -import java.net.SocketTimeoutException; -import java.net.URL; -import java.util.Arrays; -import javax.net.ssl.SSLSocket; - -import static java.net.HttpURLConnection.HTTP_OK; -import static java.net.HttpURLConnection.HTTP_PROXY_AUTH; - -/** - * Holds the sockets and streams of an HTTP, HTTPS, or HTTPS+SPDY connection, - * which may be used for multiple HTTP request/response exchanges. Connections - * may be direct to the origin server or via a proxy. - * - *

Typically instances of this class are created, connected and exercised - * automatically by the HTTP client. Applications may use this class to monitor - * HTTP connections as members of a {@link ConnectionPool connection pool}. - * - *

Do not confuse this class with the misnamed {@code HttpURLConnection}, - * which isn't so much a connection as a single request/response exchange. - * - *

Modern TLS

- * There are tradeoffs when selecting which options to include when negotiating - * a secure connection to a remote host. Newer TLS options are quite useful: - *
    - *
  • Server Name Indication (SNI) enables one IP address to negotiate secure - * connections for multiple domain names. - *
  • Next Protocol Negotiation (NPN) enables the HTTPS port (443) to be used - * for both HTTP and SPDY transports. - *
- * Unfortunately, older HTTPS servers refuse to connect when such options are - * presented. Rather than avoiding these options entirely, this class allows a - * connection to be attempted with modern options and then retried without them - * should the attempt fail. - */ -public final class Connection implements Closeable { - private static final byte[] NPN_PROTOCOLS = new byte[] { - 6, 's', 'p', 'd', 'y', '/', '3', - 8, 'h', 't', 't', 'p', '/', '1', '.', '1' - }; - private static final byte[] SPDY3 = new byte[] { - 's', 'p', 'd', 'y', '/', '3' - }; - private static final byte[] HTTP_11 = new byte[] { - 'h', 't', 't', 'p', '/', '1', '.', '1' - }; - - private final Route route; - - private Socket socket; - private InputStream in; - private OutputStream out; - private boolean connected = false; - private SpdyConnection spdyConnection; - private int httpMinorVersion = 1; // Assume HTTP/1.1 - private long idleStartTimeNs; - - public Connection(Route route) { - this.route = route; - } - - public void connect(int connectTimeout, int readTimeout, TunnelRequest tunnelRequest) - throws IOException { - if (connected) throw new IllegalStateException("already connected"); - - socket = (route.proxy.type() != Proxy.Type.HTTP) ? new Socket(route.proxy) : new Socket(); - Platform.get().connectSocket(socket, route.inetSocketAddress, connectTimeout); - socket.setSoTimeout(readTimeout); - in = socket.getInputStream(); - out = socket.getOutputStream(); - - if (route.address.sslSocketFactory != null) { - upgradeToTls(tunnelRequest); - } else { - streamWrapper(); - } - connected = true; - } - - /** - * Create an {@code SSLSocket} and perform the TLS handshake and certificate - * validation. - */ - private void upgradeToTls(TunnelRequest tunnelRequest) throws IOException { - Platform platform = Platform.get(); - - // Make an SSL Tunnel on the first message pair of each SSL + proxy connection. - if (requiresTunnel()) { - makeTunnel(tunnelRequest); - } - - // Create the wrapper over connected socket. - socket = route.address.sslSocketFactory - .createSocket(socket, route.address.uriHost, route.address.uriPort, true /* autoClose */); - SSLSocket sslSocket = (SSLSocket) socket; - if (route.modernTls) { - platform.enableTlsExtensions(sslSocket, route.address.uriHost); - } else { - platform.supportTlsIntolerantServer(sslSocket); - } - - boolean useNpn = route.modernTls && route.address.transports.contains("spdy/3"); - if (useNpn) { - platform.setNpnProtocols(sslSocket, NPN_PROTOCOLS); - } - - // Force handshake. This can throw! - sslSocket.startHandshake(); - - // Verify that the socket's certificates are acceptable for the target host. - if (!route.address.hostnameVerifier.verify(route.address.uriHost, sslSocket.getSession())) { - throw new IOException("Hostname '" + route.address.uriHost + "' was not verified"); - } - - out = sslSocket.getOutputStream(); - in = sslSocket.getInputStream(); - streamWrapper(); - - byte[] selectedProtocol; - if (useNpn && (selectedProtocol = platform.getNpnSelectedProtocol(sslSocket)) != null) { - if (Arrays.equals(selectedProtocol, SPDY3)) { - sslSocket.setSoTimeout(0); // SPDY timeouts are set per-stream. - spdyConnection = new SpdyConnection.Builder(route.address.getUriHost(), true, in, out) - .build(); - spdyConnection.sendConnectionHeader(); - } else if (!Arrays.equals(selectedProtocol, HTTP_11)) { - throw new IOException( - "Unexpected NPN transport " + new String(selectedProtocol, "ISO-8859-1")); - } - } - } - - /** Returns true if {@link #connect} has been attempted on this connection. */ - public boolean isConnected() { - return connected; - } - - @Override public void close() throws IOException { - socket.close(); - } - - /** Returns the route used by this connection. */ - public Route getRoute() { - return route; - } - - /** - * Returns the socket that this connection uses, or null if the connection - * is not currently connected. - */ - public Socket getSocket() { - return socket; - } - - /** Returns true if this connection is alive. */ - public boolean isAlive() { - return !socket.isClosed() && !socket.isInputShutdown() && !socket.isOutputShutdown(); - } - - /** - * Returns true if we are confident that we can read data from this - * connection. This is more expensive and more accurate than {@link - * #isAlive()}; callers should check {@link #isAlive()} first. - */ - public boolean isReadable() { - if (!(in instanceof BufferedInputStream)) { - return true; // Optimistic. - } - if (isSpdy()) { - return true; // Optimistic. We can't test SPDY because its streams are in use. - } - BufferedInputStream bufferedInputStream = (BufferedInputStream) in; - try { - int readTimeout = socket.getSoTimeout(); - try { - socket.setSoTimeout(1); - bufferedInputStream.mark(1); - if (bufferedInputStream.read() == -1) { - return false; // Stream is exhausted; socket is closed. - } - bufferedInputStream.reset(); - return true; - } finally { - socket.setSoTimeout(readTimeout); - } - } catch (SocketTimeoutException ignored) { - return true; // Read timed out; socket is good. - } catch (IOException e) { - return false; // Couldn't read; socket is closed. - } - } - - public void resetIdleStartTime() { - if (spdyConnection != null) { - throw new IllegalStateException("spdyConnection != null"); - } - this.idleStartTimeNs = System.nanoTime(); - } - - /** Returns true if this connection is idle. */ - public boolean isIdle() { - return spdyConnection == null || spdyConnection.isIdle(); - } - - /** - * Returns true if this connection has been idle for longer than - * {@code keepAliveDurationNs}. - */ - public boolean isExpired(long keepAliveDurationNs) { - return getIdleStartTimeNs() < System.nanoTime() - keepAliveDurationNs; - } - - /** - * Returns the time in ns when this connection became idle. Undefined if - * this connection is not idle. - */ - public long getIdleStartTimeNs() { - return spdyConnection == null ? idleStartTimeNs : spdyConnection.getIdleStartTimeNs(); - } - - /** Returns the transport appropriate for this connection. */ - public Object newTransport(HttpEngine httpEngine) throws IOException { - return (spdyConnection != null) - ? new SpdyTransport(httpEngine, spdyConnection) - : new HttpTransport(httpEngine, out, in); - } - - /** - * Returns true if this is a SPDY connection. Such connections can be used - * in multiple HTTP requests simultaneously. - */ - public boolean isSpdy() { - return spdyConnection != null; - } - - public SpdyConnection getSpdyConnection() { - return spdyConnection; - } - - /** - * Returns the minor HTTP version that should be used for future requests on - * this connection. Either 0 for HTTP/1.0, or 1 for HTTP/1.1. The default - * value is 1 for new connections. - */ - public int getHttpMinorVersion() { - return httpMinorVersion; - } - - public void setHttpMinorVersion(int httpMinorVersion) { - this.httpMinorVersion = httpMinorVersion; - } - - /** - * Returns true if the HTTP connection needs to tunnel one protocol over - * another, such as when using HTTPS through an HTTP proxy. When doing so, - * we must avoid buffering bytes intended for the higher-level protocol. - */ - public boolean requiresTunnel() { - return route.address.sslSocketFactory != null && route.proxy.type() == Proxy.Type.HTTP; - } - - public void updateReadTimeout(int newTimeout) throws IOException { - if (!connected) throw new IllegalStateException("updateReadTimeout - not connected"); - socket.setSoTimeout(newTimeout); - } - - /** - * To make an HTTPS connection over an HTTP proxy, send an unencrypted - * CONNECT request to create the proxy connection. This may need to be - * retried if the proxy requires authorization. - */ - private void makeTunnel(TunnelRequest tunnelRequest) throws IOException { - RawHeaders requestHeaders = tunnelRequest.getRequestHeaders(); - while (true) { - out.write(requestHeaders.toBytes()); - RawHeaders responseHeaders = RawHeaders.fromBytes(in); - - switch (responseHeaders.getResponseCode()) { - case HTTP_OK: - return; - case HTTP_PROXY_AUTH: - requestHeaders = new RawHeaders(requestHeaders); - URL url = new URL("https", tunnelRequest.host, tunnelRequest.port, "/"); - boolean credentialsFound = HttpAuthenticator.processAuthHeader( - route.address.authenticator, HTTP_PROXY_AUTH, responseHeaders, requestHeaders, - route.proxy, url); - if (credentialsFound) { - continue; - } else { - throw new IOException("Failed to authenticate with proxy"); - } - default: - throw new IOException( - "Unexpected response code for CONNECT: " + responseHeaders.getResponseCode()); - } - } - } - - private void streamWrapper() throws IOException { - in = new BufferedInputStream(in, 4096); - out = new BufferedOutputStream(out, 256); - } -} diff --git a/platforms/android/CordovaLib/src/com/squareup/okhttp/ConnectionPool.java b/platforms/android/CordovaLib/src/com/squareup/okhttp/ConnectionPool.java deleted file mode 100755 index 42b70b9..0000000 --- a/platforms/android/CordovaLib/src/com/squareup/okhttp/ConnectionPool.java +++ /dev/null @@ -1,274 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.squareup.okhttp; - -import com.squareup.okhttp.internal.Platform; -import com.squareup.okhttp.internal.Util; -import java.net.SocketException; -import java.util.ArrayList; -import java.util.LinkedList; -import java.util.List; -import java.util.ListIterator; -import java.util.concurrent.Callable; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.LinkedBlockingQueue; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; - -/** - * Manages reuse of HTTP and SPDY connections for reduced network latency. HTTP - * requests that share the same {@link com.squareup.okhttp.Address} may share a - * {@link com.squareup.okhttp.Connection}. This class implements the policy of - * which connections to keep open for future use. - * - *

The {@link #getDefault() system-wide default} uses system properties for - * tuning parameters: - *

    - *
  • {@code http.keepAlive} true if HTTP and SPDY connections should be - * pooled at all. Default is true. - *
  • {@code http.maxConnections} maximum number of idle connections to - * each to keep in the pool. Default is 5. - *
  • {@code http.keepAliveDuration} Time in milliseconds to keep the - * connection alive in the pool before closing it. Default is 5 minutes. - * This property isn't used by {@code HttpURLConnection}. - *
- * - *

The default instance doesn't adjust its configuration as system - * properties are changed. This assumes that the applications that set these - * parameters do so before making HTTP connections, and that this class is - * initialized lazily. - */ -public class ConnectionPool { - private static final int MAX_CONNECTIONS_TO_CLEANUP = 2; - private static final long DEFAULT_KEEP_ALIVE_DURATION_MS = 5 * 60 * 1000; // 5 min - - private static final ConnectionPool systemDefault; - - static { - String keepAlive = System.getProperty("http.keepAlive"); - String keepAliveDuration = System.getProperty("http.keepAliveDuration"); - String maxIdleConnections = System.getProperty("http.maxConnections"); - long keepAliveDurationMs = keepAliveDuration != null ? Long.parseLong(keepAliveDuration) - : DEFAULT_KEEP_ALIVE_DURATION_MS; - if (keepAlive != null && !Boolean.parseBoolean(keepAlive)) { - systemDefault = new ConnectionPool(0, keepAliveDurationMs); - } else if (maxIdleConnections != null) { - systemDefault = new ConnectionPool(Integer.parseInt(maxIdleConnections), keepAliveDurationMs); - } else { - systemDefault = new ConnectionPool(5, keepAliveDurationMs); - } - } - - /** The maximum number of idle connections for each address. */ - private final int maxIdleConnections; - private final long keepAliveDurationNs; - - private final LinkedList connections = new LinkedList(); - - /** We use a single background thread to cleanup expired connections. */ - private final ExecutorService executorService = new ThreadPoolExecutor(0, 1, - 60L, TimeUnit.SECONDS, new LinkedBlockingQueue(), - Util.daemonThreadFactory("OkHttp ConnectionPool")); - private final Callable connectionsCleanupCallable = new Callable() { - @Override public Void call() throws Exception { - List expiredConnections = new ArrayList(MAX_CONNECTIONS_TO_CLEANUP); - int idleConnectionCount = 0; - synchronized (ConnectionPool.this) { - for (ListIterator i = connections.listIterator(connections.size()); - i.hasPrevious(); ) { - Connection connection = i.previous(); - if (!connection.isAlive() || connection.isExpired(keepAliveDurationNs)) { - i.remove(); - expiredConnections.add(connection); - if (expiredConnections.size() == MAX_CONNECTIONS_TO_CLEANUP) break; - } else if (connection.isIdle()) { - idleConnectionCount++; - } - } - - for (ListIterator i = connections.listIterator(connections.size()); - i.hasPrevious() && idleConnectionCount > maxIdleConnections; ) { - Connection connection = i.previous(); - if (connection.isIdle()) { - expiredConnections.add(connection); - i.remove(); - --idleConnectionCount; - } - } - } - for (Connection expiredConnection : expiredConnections) { - Util.closeQuietly(expiredConnection); - } - return null; - } - }; - - public ConnectionPool(int maxIdleConnections, long keepAliveDurationMs) { - this.maxIdleConnections = maxIdleConnections; - this.keepAliveDurationNs = keepAliveDurationMs * 1000 * 1000; - } - - /** - * Returns a snapshot of the connections in this pool, ordered from newest to - * oldest. Waits for the cleanup callable to run if it is currently scheduled. - */ - List getConnections() { - waitForCleanupCallableToRun(); - synchronized (this) { - return new ArrayList(connections); - } - } - - /** - * Blocks until the executor service has processed all currently enqueued - * jobs. - */ - private void waitForCleanupCallableToRun() { - try { - executorService.submit(new Runnable() { - @Override public void run() { - } - }).get(); - } catch (Exception e) { - throw new AssertionError(); - } - } - - public static ConnectionPool getDefault() { - return systemDefault; - } - - /** Returns total number of connections in the pool. */ - public synchronized int getConnectionCount() { - return connections.size(); - } - - /** Returns total number of spdy connections in the pool. */ - public synchronized int getSpdyConnectionCount() { - int total = 0; - for (Connection connection : connections) { - if (connection.isSpdy()) total++; - } - return total; - } - - /** Returns total number of http connections in the pool. */ - public synchronized int getHttpConnectionCount() { - int total = 0; - for (Connection connection : connections) { - if (!connection.isSpdy()) total++; - } - return total; - } - - /** Returns a recycled connection to {@code address}, or null if no such connection exists. */ - public synchronized Connection get(Address address) { - Connection foundConnection = null; - for (ListIterator i = connections.listIterator(connections.size()); - i.hasPrevious(); ) { - Connection connection = i.previous(); - if (!connection.getRoute().getAddress().equals(address) - || !connection.isAlive() - || System.nanoTime() - connection.getIdleStartTimeNs() >= keepAliveDurationNs) { - continue; - } - i.remove(); - if (!connection.isSpdy()) { - try { - Platform.get().tagSocket(connection.getSocket()); - } catch (SocketException e) { - Util.closeQuietly(connection); - // When unable to tag, skip recycling and close - Platform.get().logW("Unable to tagSocket(): " + e); - continue; - } - } - foundConnection = connection; - break; - } - - if (foundConnection != null && foundConnection.isSpdy()) { - connections.addFirst(foundConnection); // Add it back after iteration. - } - - executorService.submit(connectionsCleanupCallable); - return foundConnection; - } - - /** - * Gives {@code connection} to the pool. The pool may store the connection, - * or close it, as its policy describes. - * - *

It is an error to use {@code connection} after calling this method. - */ - public void recycle(Connection connection) { - if (connection.isSpdy()) { - return; - } - - if (!connection.isAlive()) { - Util.closeQuietly(connection); - return; - } - - try { - Platform.get().untagSocket(connection.getSocket()); - } catch (SocketException e) { - // When unable to remove tagging, skip recycling and close. - Platform.get().logW("Unable to untagSocket(): " + e); - Util.closeQuietly(connection); - return; - } - - synchronized (this) { - connections.addFirst(connection); - connection.resetIdleStartTime(); - } - - executorService.submit(connectionsCleanupCallable); - } - - /** - * Shares the SPDY connection with the pool. Callers to this method may - * continue to use {@code connection}. - */ - public void maybeShare(Connection connection) { - executorService.submit(connectionsCleanupCallable); - if (!connection.isSpdy()) { - // Only SPDY connections are sharable. - return; - } - if (connection.isAlive()) { - synchronized (this) { - connections.addFirst(connection); - } - } - } - - /** Close and remove all connections in the pool. */ - public void evictAll() { - List connections; - synchronized (this) { - connections = new ArrayList(this.connections); - this.connections.clear(); - } - - for (Connection connection : connections) { - Util.closeQuietly(connection); - } - } -} diff --git a/platforms/android/CordovaLib/src/com/squareup/okhttp/Dispatcher.java b/platforms/android/CordovaLib/src/com/squareup/okhttp/Dispatcher.java deleted file mode 100755 index 1982a8a..0000000 --- a/platforms/android/CordovaLib/src/com/squareup/okhttp/Dispatcher.java +++ /dev/null @@ -1,86 +0,0 @@ -/* - * Copyright (C) 2013 Square, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.squareup.okhttp; - -import com.squareup.okhttp.internal.http.ResponseHeaders; -import java.io.IOException; -import java.io.InputStream; -import java.util.ArrayList; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; -import java.util.concurrent.LinkedBlockingQueue; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; - -final class Dispatcher { - // TODO: thread pool size should be configurable; possibly configurable per host. - private final ThreadPoolExecutor executorService = new ThreadPoolExecutor( - 8, 8, 60, TimeUnit.SECONDS, new LinkedBlockingQueue()); - private final Map> enqueuedJobs = new LinkedHashMap>(); - - public synchronized void enqueue( - OkHttpClient client, Request request, Response.Receiver responseReceiver) { - Job job = new Job(this, client, request, responseReceiver); - List jobsForTag = enqueuedJobs.get(request.tag()); - if (jobsForTag == null) { - jobsForTag = new ArrayList(2); - enqueuedJobs.put(request.tag(), jobsForTag); - } - jobsForTag.add(job); - executorService.execute(job); - } - - public synchronized void cancel(Object tag) { - List jobs = enqueuedJobs.remove(tag); - if (jobs == null) return; - for (Job job : jobs) { - executorService.remove(job); - } - } - - synchronized void finished(Job job) { - List jobs = enqueuedJobs.get(job.tag()); - if (jobs != null) jobs.remove(job); - } - - static class RealResponseBody extends Response.Body { - private final ResponseHeaders responseHeaders; - private final InputStream in; - - RealResponseBody(ResponseHeaders responseHeaders, InputStream in) { - this.responseHeaders = responseHeaders; - this.in = in; - } - - @Override public boolean ready() throws IOException { - return true; - } - - @Override public MediaType contentType() { - String contentType = responseHeaders.getContentType(); - return contentType != null ? MediaType.parse(contentType) : null; - } - - @Override public long contentLength() { - return responseHeaders.getContentLength(); - } - - @Override public InputStream byteStream() throws IOException { - return in; - } - } -} diff --git a/platforms/android/CordovaLib/src/com/squareup/okhttp/Failure.java b/platforms/android/CordovaLib/src/com/squareup/okhttp/Failure.java deleted file mode 100755 index a354700..0000000 --- a/platforms/android/CordovaLib/src/com/squareup/okhttp/Failure.java +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Copyright (C) 2013 Square, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.squareup.okhttp; - -/** - * A failure attempting to retrieve an HTTP response. - * - *

Warning: Experimental OkHttp 2.0 API

- * This class is in beta. APIs are subject to change! - */ -/* OkHttp 2.0: public */ class Failure { - private final Request request; - private final Throwable exception; - - private Failure(Builder builder) { - this.request = builder.request; - this.exception = builder.exception; - } - - public Request request() { - return request; - } - - public Throwable exception() { - return exception; - } - - public static class Builder { - private Request request; - private Throwable exception; - - public Builder request(Request request) { - this.request = request; - return this; - } - - public Builder exception(Throwable exception) { - this.exception = exception; - return this; - } - - public Failure build() { - return new Failure(this); - } - } -} diff --git a/platforms/android/CordovaLib/src/com/squareup/okhttp/HttpResponseCache.java b/platforms/android/CordovaLib/src/com/squareup/okhttp/HttpResponseCache.java deleted file mode 100755 index 8210318..0000000 --- a/platforms/android/CordovaLib/src/com/squareup/okhttp/HttpResponseCache.java +++ /dev/null @@ -1,722 +0,0 @@ -/* - * Copyright (C) 2010 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.squareup.okhttp; - -import com.squareup.okhttp.internal.Base64; -import com.squareup.okhttp.internal.DiskLruCache; -import com.squareup.okhttp.internal.StrictLineReader; -import com.squareup.okhttp.internal.Util; -import com.squareup.okhttp.internal.http.HttpEngine; -import com.squareup.okhttp.internal.http.HttpURLConnectionImpl; -import com.squareup.okhttp.internal.http.HttpsEngine; -import com.squareup.okhttp.internal.http.HttpsURLConnectionImpl; -import com.squareup.okhttp.internal.http.RawHeaders; -import com.squareup.okhttp.internal.http.ResponseHeaders; -import java.io.BufferedWriter; -import java.io.ByteArrayInputStream; -import java.io.File; -import java.io.FilterInputStream; -import java.io.FilterOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.io.OutputStreamWriter; -import java.io.Writer; -import java.net.CacheRequest; -import java.net.CacheResponse; -import java.net.HttpURLConnection; -import java.net.ResponseCache; -import java.net.SecureCacheResponse; -import java.net.URI; -import java.net.URLConnection; -import java.security.Principal; -import java.security.cert.Certificate; -import java.security.cert.CertificateEncodingException; -import java.security.cert.CertificateException; -import java.security.cert.CertificateFactory; -import java.security.cert.X509Certificate; -import java.util.Arrays; -import java.util.List; -import java.util.Map; -import javax.net.ssl.SSLPeerUnverifiedException; -import javax.net.ssl.SSLSocket; - -import static com.squareup.okhttp.internal.Util.US_ASCII; -import static com.squareup.okhttp.internal.Util.UTF_8; - -/** - * Caches HTTP and HTTPS responses to the filesystem so they may be reused, - * saving time and bandwidth. - * - *

Cache Optimization

- * To measure cache effectiveness, this class tracks three statistics: - *
    - *
  • {@link #getRequestCount() Request Count:} the number - * of HTTP requests issued since this cache was created. - *
  • {@link #getNetworkCount() Network Count:} the - * number of those requests that required network use. - *
  • {@link #getHitCount() Hit Count:} the number of - * those requests whose responses were served by the cache. - *
- * Sometimes a request will result in a conditional cache hit. If the cache - * contains a stale copy of the response, the client will issue a conditional - * {@code GET}. The server will then send either the updated response if it has - * changed, or a short 'not modified' response if the client's copy is still - * valid. Such responses increment both the network count and hit count. - * - *

The best way to improve the cache hit rate is by configuring the web - * server to return cacheable responses. Although this client honors all HTTP/1.1 (RFC 2068) cache - * headers, it doesn't cache partial responses. - * - *

Force a Network Response

- * In some situations, such as after a user clicks a 'refresh' button, it may be - * necessary to skip the cache, and fetch data directly from the server. To force - * a full refresh, add the {@code no-cache} directive:
   {@code
- *         connection.addRequestProperty("Cache-Control", "no-cache");
- * }
- * If it is only necessary to force a cached response to be validated by the - * server, use the more efficient {@code max-age=0} instead:
   {@code
- *         connection.addRequestProperty("Cache-Control", "max-age=0");
- * }
- * - *

Force a Cache Response

- * Sometimes you'll want to show resources if they are available immediately, - * but not otherwise. This can be used so your application can show - * something while waiting for the latest data to be downloaded. To - * restrict a request to locally-cached resources, add the {@code - * only-if-cached} directive:
   {@code
- *     try {
- *         connection.addRequestProperty("Cache-Control", "only-if-cached");
- *         InputStream cached = connection.getInputStream();
- *         // the resource was cached! show it
- *     } catch (FileNotFoundException e) {
- *         // the resource was not cached
- *     }
- * }
- * This technique works even better in situations where a stale response is - * better than no response. To permit stale cached responses, use the {@code - * max-stale} directive with the maximum staleness in seconds:
   {@code
- *         int maxStale = 60 * 60 * 24 * 28; // tolerate 4-weeks stale
- *         connection.addRequestProperty("Cache-Control", "max-stale=" + maxStale);
- * }
- */ -public final class HttpResponseCache extends ResponseCache { - // TODO: add APIs to iterate the cache? - private static final int VERSION = 201105; - private static final int ENTRY_METADATA = 0; - private static final int ENTRY_BODY = 1; - private static final int ENTRY_COUNT = 2; - - private final DiskLruCache cache; - - /* read and write statistics, all guarded by 'this' */ - private int writeSuccessCount; - private int writeAbortCount; - private int networkCount; - private int hitCount; - private int requestCount; - - /** - * Although this class only exposes the limited ResponseCache API, it - * implements the full OkResponseCache interface. This field is used as a - * package private handle to the complete implementation. It delegates to - * public and private members of this type. - */ - final OkResponseCache okResponseCache = new OkResponseCache() { - @Override public CacheResponse get(URI uri, String requestMethod, - Map> requestHeaders) throws IOException { - return HttpResponseCache.this.get(uri, requestMethod, requestHeaders); - } - - @Override public CacheRequest put(URI uri, URLConnection connection) throws IOException { - return HttpResponseCache.this.put(uri, connection); - } - - @Override public void maybeRemove(String requestMethod, URI uri) throws IOException { - HttpResponseCache.this.maybeRemove(requestMethod, uri); - } - - @Override public void update( - CacheResponse conditionalCacheHit, HttpURLConnection connection) throws IOException { - HttpResponseCache.this.update(conditionalCacheHit, connection); - } - - @Override public void trackConditionalCacheHit() { - HttpResponseCache.this.trackConditionalCacheHit(); - } - - @Override public void trackResponse(ResponseSource source) { - HttpResponseCache.this.trackResponse(source); - } - }; - - public HttpResponseCache(File directory, long maxSize) throws IOException { - cache = DiskLruCache.open(directory, VERSION, ENTRY_COUNT, maxSize); - } - - private String uriToKey(URI uri) { - return Util.hash(uri.toString()); - } - - @Override public CacheResponse get(URI uri, String requestMethod, - Map> requestHeaders) { - String key = uriToKey(uri); - DiskLruCache.Snapshot snapshot; - Entry entry; - try { - snapshot = cache.get(key); - if (snapshot == null) { - return null; - } - entry = new Entry(snapshot.getInputStream(ENTRY_METADATA)); - } catch (IOException e) { - // Give up because the cache cannot be read. - return null; - } - - if (!entry.matches(uri, requestMethod, requestHeaders)) { - snapshot.close(); - return null; - } - - return entry.isHttps() ? new EntrySecureCacheResponse(entry, snapshot) - : new EntryCacheResponse(entry, snapshot); - } - - @Override public CacheRequest put(URI uri, URLConnection urlConnection) throws IOException { - if (!(urlConnection instanceof HttpURLConnection)) { - return null; - } - - HttpURLConnection httpConnection = (HttpURLConnection) urlConnection; - String requestMethod = httpConnection.getRequestMethod(); - - if (maybeRemove(requestMethod, uri)) { - return null; - } - if (!requestMethod.equals("GET")) { - // Don't cache non-GET responses. We're technically allowed to cache - // HEAD requests and some POST requests, but the complexity of doing - // so is high and the benefit is low. - return null; - } - - HttpEngine httpEngine = getHttpEngine(httpConnection); - if (httpEngine == null) { - // Don't cache unless the HTTP implementation is ours. - return null; - } - - ResponseHeaders response = httpEngine.getResponseHeaders(); - if (response.hasVaryAll()) { - return null; - } - - RawHeaders varyHeaders = - httpEngine.getRequestHeaders().getHeaders().getAll(response.getVaryFields()); - Entry entry = new Entry(uri, varyHeaders, httpConnection); - DiskLruCache.Editor editor = null; - try { - editor = cache.edit(uriToKey(uri)); - if (editor == null) { - return null; - } - entry.writeTo(editor); - return new CacheRequestImpl(editor); - } catch (IOException e) { - abortQuietly(editor); - return null; - } - } - - /** - * Returns true if the supplied {@code requestMethod} potentially invalidates an entry in the - * cache. - */ - private boolean maybeRemove(String requestMethod, URI uri) { - if (requestMethod.equals("POST") || requestMethod.equals("PUT") || requestMethod.equals( - "DELETE")) { - try { - cache.remove(uriToKey(uri)); - } catch (IOException ignored) { - // The cache cannot be written. - } - return true; - } - return false; - } - - private void update(CacheResponse conditionalCacheHit, HttpURLConnection httpConnection) - throws IOException { - HttpEngine httpEngine = getHttpEngine(httpConnection); - URI uri = httpEngine.getUri(); - ResponseHeaders response = httpEngine.getResponseHeaders(); - RawHeaders varyHeaders = - httpEngine.getRequestHeaders().getHeaders().getAll(response.getVaryFields()); - Entry entry = new Entry(uri, varyHeaders, httpConnection); - DiskLruCache.Snapshot snapshot = (conditionalCacheHit instanceof EntryCacheResponse) - ? ((EntryCacheResponse) conditionalCacheHit).snapshot - : ((EntrySecureCacheResponse) conditionalCacheHit).snapshot; - DiskLruCache.Editor editor = null; - try { - editor = snapshot.edit(); // returns null if snapshot is not current - if (editor != null) { - entry.writeTo(editor); - editor.commit(); - } - } catch (IOException e) { - abortQuietly(editor); - } - } - - private void abortQuietly(DiskLruCache.Editor editor) { - // Give up because the cache cannot be written. - try { - if (editor != null) { - editor.abort(); - } - } catch (IOException ignored) { - } - } - - private HttpEngine getHttpEngine(URLConnection httpConnection) { - if (httpConnection instanceof HttpURLConnectionImpl) { - return ((HttpURLConnectionImpl) httpConnection).getHttpEngine(); - } else if (httpConnection instanceof HttpsURLConnectionImpl) { - return ((HttpsURLConnectionImpl) httpConnection).getHttpEngine(); - } else { - return null; - } - } - - /** - * Closes the cache and deletes all of its stored values. This will delete - * all files in the cache directory including files that weren't created by - * the cache. - */ - public void delete() throws IOException { - cache.delete(); - } - - public synchronized int getWriteAbortCount() { - return writeAbortCount; - } - - public synchronized int getWriteSuccessCount() { - return writeSuccessCount; - } - - public long getSize() { - return cache.size(); - } - - public long getMaxSize() { - return cache.getMaxSize(); - } - - public void flush() throws IOException { - cache.flush(); - } - - public void close() throws IOException { - cache.close(); - } - - public File getDirectory() { - return cache.getDirectory(); - } - - public boolean isClosed() { - return cache.isClosed(); - } - - private synchronized void trackResponse(ResponseSource source) { - requestCount++; - - switch (source) { - case CACHE: - hitCount++; - break; - case CONDITIONAL_CACHE: - case NETWORK: - networkCount++; - break; - } - } - - private synchronized void trackConditionalCacheHit() { - hitCount++; - } - - public synchronized int getNetworkCount() { - return networkCount; - } - - public synchronized int getHitCount() { - return hitCount; - } - - public synchronized int getRequestCount() { - return requestCount; - } - - private final class CacheRequestImpl extends CacheRequest { - private final DiskLruCache.Editor editor; - private OutputStream cacheOut; - private boolean done; - private OutputStream body; - - public CacheRequestImpl(final DiskLruCache.Editor editor) throws IOException { - this.editor = editor; - this.cacheOut = editor.newOutputStream(ENTRY_BODY); - this.body = new FilterOutputStream(cacheOut) { - @Override public void close() throws IOException { - synchronized (HttpResponseCache.this) { - if (done) { - return; - } - done = true; - writeSuccessCount++; - } - super.close(); - editor.commit(); - } - - @Override public void write(byte[] buffer, int offset, int length) throws IOException { - // Since we don't override "write(int oneByte)", we can write directly to "out" - // and avoid the inefficient implementation from the FilterOutputStream. - out.write(buffer, offset, length); - } - }; - } - - @Override public void abort() { - synchronized (HttpResponseCache.this) { - if (done) { - return; - } - done = true; - writeAbortCount++; - } - Util.closeQuietly(cacheOut); - try { - editor.abort(); - } catch (IOException ignored) { - } - } - - @Override public OutputStream getBody() throws IOException { - return body; - } - } - - private static final class Entry { - private final String uri; - private final RawHeaders varyHeaders; - private final String requestMethod; - private final RawHeaders responseHeaders; - private final String cipherSuite; - private final Certificate[] peerCertificates; - private final Certificate[] localCertificates; - - /** - * Reads an entry from an input stream. A typical entry looks like this: - *
{@code
-     *   http://google.com/foo
-     *   GET
-     *   2
-     *   Accept-Language: fr-CA
-     *   Accept-Charset: UTF-8
-     *   HTTP/1.1 200 OK
-     *   3
-     *   Content-Type: image/png
-     *   Content-Length: 100
-     *   Cache-Control: max-age=600
-     * }
- * - *

A typical HTTPS file looks like this: - *

{@code
-     *   https://google.com/foo
-     *   GET
-     *   2
-     *   Accept-Language: fr-CA
-     *   Accept-Charset: UTF-8
-     *   HTTP/1.1 200 OK
-     *   3
-     *   Content-Type: image/png
-     *   Content-Length: 100
-     *   Cache-Control: max-age=600
-     *
-     *   AES_256_WITH_MD5
-     *   2
-     *   base64-encoded peerCertificate[0]
-     *   base64-encoded peerCertificate[1]
-     *   -1
-     * }
- * The file is newline separated. The first two lines are the URL and - * the request method. Next is the number of HTTP Vary request header - * lines, followed by those lines. - * - *

Next is the response status line, followed by the number of HTTP - * response header lines, followed by those lines. - * - *

HTTPS responses also contain SSL session information. This begins - * with a blank line, and then a line containing the cipher suite. Next - * is the length of the peer certificate chain. These certificates are - * base64-encoded and appear each on their own line. The next line - * contains the length of the local certificate chain. These - * certificates are also base64-encoded and appear each on their own - * line. A length of -1 is used to encode a null array. - */ - public Entry(InputStream in) throws IOException { - try { - StrictLineReader reader = new StrictLineReader(in, US_ASCII); - uri = reader.readLine(); - requestMethod = reader.readLine(); - varyHeaders = new RawHeaders(); - int varyRequestHeaderLineCount = reader.readInt(); - for (int i = 0; i < varyRequestHeaderLineCount; i++) { - varyHeaders.addLine(reader.readLine()); - } - - responseHeaders = new RawHeaders(); - responseHeaders.setStatusLine(reader.readLine()); - int responseHeaderLineCount = reader.readInt(); - for (int i = 0; i < responseHeaderLineCount; i++) { - responseHeaders.addLine(reader.readLine()); - } - - if (isHttps()) { - String blank = reader.readLine(); - if (blank.length() > 0) { - throw new IOException("expected \"\" but was \"" + blank + "\""); - } - cipherSuite = reader.readLine(); - peerCertificates = readCertArray(reader); - localCertificates = readCertArray(reader); - } else { - cipherSuite = null; - peerCertificates = null; - localCertificates = null; - } - } finally { - in.close(); - } - } - - public Entry(URI uri, RawHeaders varyHeaders, HttpURLConnection httpConnection) - throws IOException { - this.uri = uri.toString(); - this.varyHeaders = varyHeaders; - this.requestMethod = httpConnection.getRequestMethod(); - this.responseHeaders = RawHeaders.fromMultimap(httpConnection.getHeaderFields(), true); - - SSLSocket sslSocket = getSslSocket(httpConnection); - if (sslSocket != null) { - cipherSuite = sslSocket.getSession().getCipherSuite(); - Certificate[] peerCertificatesNonFinal = null; - try { - peerCertificatesNonFinal = sslSocket.getSession().getPeerCertificates(); - } catch (SSLPeerUnverifiedException ignored) { - } - peerCertificates = peerCertificatesNonFinal; - localCertificates = sslSocket.getSession().getLocalCertificates(); - } else { - cipherSuite = null; - peerCertificates = null; - localCertificates = null; - } - } - - /** - * Returns the SSL socket used by {@code httpConnection} for HTTPS, nor null - * if the connection isn't using HTTPS. Since we permit redirects across - * protocols (HTTP to HTTPS or vice versa), the implementation type of the - * connection doesn't necessarily match the implementation type of its HTTP - * engine. - */ - private SSLSocket getSslSocket(HttpURLConnection httpConnection) { - HttpEngine engine = httpConnection instanceof HttpsURLConnectionImpl - ? ((HttpsURLConnectionImpl) httpConnection).getHttpEngine() - : ((HttpURLConnectionImpl) httpConnection).getHttpEngine(); - return engine instanceof HttpsEngine - ? ((HttpsEngine) engine).getSslSocket() - : null; - } - - public void writeTo(DiskLruCache.Editor editor) throws IOException { - OutputStream out = editor.newOutputStream(ENTRY_METADATA); - Writer writer = new BufferedWriter(new OutputStreamWriter(out, UTF_8)); - - writer.write(uri + '\n'); - writer.write(requestMethod + '\n'); - writer.write(Integer.toString(varyHeaders.length()) + '\n'); - for (int i = 0; i < varyHeaders.length(); i++) { - writer.write(varyHeaders.getFieldName(i) + ": " + varyHeaders.getValue(i) + '\n'); - } - - writer.write(responseHeaders.getStatusLine() + '\n'); - writer.write(Integer.toString(responseHeaders.length()) + '\n'); - for (int i = 0; i < responseHeaders.length(); i++) { - writer.write(responseHeaders.getFieldName(i) + ": " + responseHeaders.getValue(i) + '\n'); - } - - if (isHttps()) { - writer.write('\n'); - writer.write(cipherSuite + '\n'); - writeCertArray(writer, peerCertificates); - writeCertArray(writer, localCertificates); - } - writer.close(); - } - - private boolean isHttps() { - return uri.startsWith("https://"); - } - - private Certificate[] readCertArray(StrictLineReader reader) throws IOException { - int length = reader.readInt(); - if (length == -1) { - return null; - } - try { - CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509"); - Certificate[] result = new Certificate[length]; - for (int i = 0; i < result.length; i++) { - String line = reader.readLine(); - byte[] bytes = Base64.decode(line.getBytes("US-ASCII")); - result[i] = certificateFactory.generateCertificate(new ByteArrayInputStream(bytes)); - } - return result; - } catch (CertificateException e) { - throw new IOException(e.getMessage()); - } - } - - private void writeCertArray(Writer writer, Certificate[] certificates) throws IOException { - if (certificates == null) { - writer.write("-1\n"); - return; - } - try { - writer.write(Integer.toString(certificates.length) + '\n'); - for (Certificate certificate : certificates) { - byte[] bytes = certificate.getEncoded(); - String line = Base64.encode(bytes); - writer.write(line + '\n'); - } - } catch (CertificateEncodingException e) { - throw new IOException(e.getMessage()); - } - } - - public boolean matches(URI uri, String requestMethod, - Map> requestHeaders) { - return this.uri.equals(uri.toString()) - && this.requestMethod.equals(requestMethod) - && new ResponseHeaders(uri, responseHeaders).varyMatches(varyHeaders.toMultimap(false), - requestHeaders); - } - } - - /** - * Returns an input stream that reads the body of a snapshot, closing the - * snapshot when the stream is closed. - */ - private static InputStream newBodyInputStream(final DiskLruCache.Snapshot snapshot) { - return new FilterInputStream(snapshot.getInputStream(ENTRY_BODY)) { - @Override public void close() throws IOException { - snapshot.close(); - super.close(); - } - }; - } - - static class EntryCacheResponse extends CacheResponse { - private final Entry entry; - private final DiskLruCache.Snapshot snapshot; - private final InputStream in; - - public EntryCacheResponse(Entry entry, DiskLruCache.Snapshot snapshot) { - this.entry = entry; - this.snapshot = snapshot; - this.in = newBodyInputStream(snapshot); - } - - @Override public Map> getHeaders() { - return entry.responseHeaders.toMultimap(true); - } - - @Override public InputStream getBody() { - return in; - } - } - - static class EntrySecureCacheResponse extends SecureCacheResponse { - private final Entry entry; - private final DiskLruCache.Snapshot snapshot; - private final InputStream in; - - public EntrySecureCacheResponse(Entry entry, DiskLruCache.Snapshot snapshot) { - this.entry = entry; - this.snapshot = snapshot; - this.in = newBodyInputStream(snapshot); - } - - @Override public Map> getHeaders() { - return entry.responseHeaders.toMultimap(true); - } - - @Override public InputStream getBody() { - return in; - } - - @Override public String getCipherSuite() { - return entry.cipherSuite; - } - - @Override public List getServerCertificateChain() - throws SSLPeerUnverifiedException { - if (entry.peerCertificates == null || entry.peerCertificates.length == 0) { - throw new SSLPeerUnverifiedException(null); - } - return Arrays.asList(entry.peerCertificates.clone()); - } - - @Override public Principal getPeerPrincipal() throws SSLPeerUnverifiedException { - if (entry.peerCertificates == null || entry.peerCertificates.length == 0) { - throw new SSLPeerUnverifiedException(null); - } - return ((X509Certificate) entry.peerCertificates[0]).getSubjectX500Principal(); - } - - @Override public List getLocalCertificateChain() { - if (entry.localCertificates == null || entry.localCertificates.length == 0) { - return null; - } - return Arrays.asList(entry.localCertificates.clone()); - } - - @Override public Principal getLocalPrincipal() { - if (entry.localCertificates == null || entry.localCertificates.length == 0) { - return null; - } - return ((X509Certificate) entry.localCertificates[0]).getSubjectX500Principal(); - } - } -} diff --git a/platforms/android/CordovaLib/src/com/squareup/okhttp/Job.java b/platforms/android/CordovaLib/src/com/squareup/okhttp/Job.java deleted file mode 100755 index 1bfeb1d..0000000 --- a/platforms/android/CordovaLib/src/com/squareup/okhttp/Job.java +++ /dev/null @@ -1,232 +0,0 @@ -/* - * Copyright (C) 2013 Square, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.squareup.okhttp; - -import com.squareup.okhttp.internal.http.HttpAuthenticator; -import com.squareup.okhttp.internal.http.HttpEngine; -import com.squareup.okhttp.internal.http.HttpTransport; -import com.squareup.okhttp.internal.http.HttpsEngine; -import com.squareup.okhttp.internal.http.Policy; -import com.squareup.okhttp.internal.http.RawHeaders; -import java.io.IOException; -import java.net.HttpURLConnection; -import java.net.ProtocolException; -import java.net.Proxy; -import java.net.URL; - -import static com.squareup.okhttp.internal.Util.getEffectivePort; -import static com.squareup.okhttp.internal.http.HttpURLConnectionImpl.HTTP_MOVED_PERM; -import static com.squareup.okhttp.internal.http.HttpURLConnectionImpl.HTTP_MOVED_TEMP; -import static com.squareup.okhttp.internal.http.HttpURLConnectionImpl.HTTP_MULT_CHOICE; -import static com.squareup.okhttp.internal.http.HttpURLConnectionImpl.HTTP_PROXY_AUTH; -import static com.squareup.okhttp.internal.http.HttpURLConnectionImpl.HTTP_SEE_OTHER; -import static com.squareup.okhttp.internal.http.HttpURLConnectionImpl.HTTP_TEMP_REDIRECT; -import static com.squareup.okhttp.internal.http.HttpURLConnectionImpl.HTTP_UNAUTHORIZED; - -final class Job implements Runnable, Policy { - private final Dispatcher dispatcher; - private final OkHttpClient client; - private final Response.Receiver responseReceiver; - - /** The request; possibly a consequence of redirects or auth headers. */ - private Request request; - - public Job(Dispatcher dispatcher, OkHttpClient client, Request request, - Response.Receiver responseReceiver) { - this.dispatcher = dispatcher; - this.client = client; - this.request = request; - this.responseReceiver = responseReceiver; - } - - @Override public int getChunkLength() { - return request.body().contentLength() == -1 ? HttpTransport.DEFAULT_CHUNK_LENGTH : -1; - } - - @Override public long getFixedContentLength() { - return request.body().contentLength(); - } - - @Override public boolean getUseCaches() { - return false; // TODO. - } - - @Override public HttpURLConnection getHttpConnectionToCache() { - return null; - } - - @Override public URL getURL() { - return request.url(); - } - - @Override public long getIfModifiedSince() { - return 0; // For HttpURLConnection only. We let the cache drive this. - } - - @Override public boolean usingProxy() { - return false; // We let the connection decide this. - } - - @Override public void setSelectedProxy(Proxy proxy) { - // Do nothing. - } - - Object tag() { - return request.tag(); - } - - @Override public void run() { - try { - Response response = execute(); - responseReceiver.onResponse(response); - } catch (IOException e) { - responseReceiver.onFailure(new Failure.Builder() - .request(request) - .exception(e) - .build()); - } finally { - // TODO: close the response body - // TODO: release the HTTP engine (potentially multiple!) - dispatcher.finished(this); - } - } - - private Response execute() throws IOException { - Connection connection = null; - Response redirectedBy = null; - - while (true) { - HttpEngine engine = newEngine(connection); - - Request.Body body = request.body(); - if (body != null) { - MediaType contentType = body.contentType(); - if (contentType == null) throw new IllegalStateException("contentType == null"); - if (engine.getRequestHeaders().getContentType() == null) { - engine.getRequestHeaders().setContentType(contentType.toString()); - } - } - - engine.sendRequest(); - - if (body != null) { - body.writeTo(engine.getRequestBody()); - } - - engine.readResponse(); - - int responseCode = engine.getResponseCode(); - Dispatcher.RealResponseBody responseBody = new Dispatcher.RealResponseBody( - engine.getResponseHeaders(), engine.getResponseBody()); - - Response response = new Response.Builder(request, responseCode) - .rawHeaders(engine.getResponseHeaders().getHeaders()) - .body(responseBody) - .redirectedBy(redirectedBy) - .build(); - - Request redirect = processResponse(engine, response); - - if (redirect == null) { - engine.automaticallyReleaseConnectionToPool(); - return response; - } - - // TODO: fail if too many redirects - // TODO: fail if not following redirects - // TODO: release engine - - connection = sameConnection(request, redirect) ? engine.getConnection() : null; - redirectedBy = response; - request = redirect; - } - } - - HttpEngine newEngine(Connection connection) throws IOException { - String protocol = request.url().getProtocol(); - RawHeaders requestHeaders = request.rawHeaders(); - if (protocol.equals("http")) { - return new HttpEngine(client, this, request.method(), requestHeaders, connection, null); - } else if (protocol.equals("https")) { - return new HttpsEngine(client, this, request.method(), requestHeaders, connection, null); - } else { - throw new AssertionError(); - } - } - - /** - * Figures out the HTTP request to make in response to receiving {@code - * response}. This will either add authentication headers or follow - * redirects. If a follow-up is either unnecessary or not applicable, this - * returns null. - */ - private Request processResponse(HttpEngine engine, Response response) throws IOException { - Request request = response.request(); - Proxy selectedProxy = engine.getConnection() != null - ? engine.getConnection().getRoute().getProxy() - : client.getProxy(); - int responseCode = response.code(); - - switch (responseCode) { - case HTTP_PROXY_AUTH: - if (selectedProxy.type() != Proxy.Type.HTTP) { - throw new ProtocolException("Received HTTP_PROXY_AUTH (407) code while not using proxy"); - } - // fall-through - case HTTP_UNAUTHORIZED: - RawHeaders successorRequestHeaders = request.rawHeaders(); - boolean credentialsFound = HttpAuthenticator.processAuthHeader(client.getAuthenticator(), - response.code(), response.rawHeaders(), successorRequestHeaders, selectedProxy, - this.request.url()); - return credentialsFound - ? request.newBuilder().rawHeaders(successorRequestHeaders).build() - : null; - - case HTTP_MULT_CHOICE: - case HTTP_MOVED_PERM: - case HTTP_MOVED_TEMP: - case HTTP_SEE_OTHER: - case HTTP_TEMP_REDIRECT: - String method = request.method(); - if (responseCode == HTTP_TEMP_REDIRECT && !method.equals("GET") && !method.equals("HEAD")) { - // "If the 307 status code is received in response to a request other than GET or HEAD, - // the user agent MUST NOT automatically redirect the request" - return null; - } - - String location = response.header("Location"); - if (location == null) { - return null; - } - - URL url = new URL(request.url(), location); - if (!url.getProtocol().equals("https") && !url.getProtocol().equals("http")) { - return null; // Don't follow redirects to unsupported protocols. - } - - return this.request.newBuilder().url(url).build(); - - default: - return null; - } - } - - private boolean sameConnection(Request a, Request b) { - return a.url().getHost().equals(b.url().getHost()) - && getEffectivePort(a.url()) == getEffectivePort(b.url()) - && a.url().getProtocol().equals(b.url().getProtocol()); - } -} diff --git a/platforms/android/CordovaLib/src/com/squareup/okhttp/MediaType.java b/platforms/android/CordovaLib/src/com/squareup/okhttp/MediaType.java deleted file mode 100755 index 2c09596..0000000 --- a/platforms/android/CordovaLib/src/com/squareup/okhttp/MediaType.java +++ /dev/null @@ -1,120 +0,0 @@ -/* - * Copyright (C) 2013 Square, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.squareup.okhttp; - -import java.nio.charset.Charset; -import java.util.Locale; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -/** - * An RFC 2045 Media Type, - * appropriate to describe the content type of an HTTP request or response body. - */ -public final class MediaType { - private static final String TOKEN = "([a-zA-Z0-9-!#$%&'*+.^_`{|}~]+)"; - private static final String QUOTED = "\"([^\"]*)\""; - private static final Pattern TYPE_SUBTYPE = Pattern.compile(TOKEN + "/" + TOKEN); - private static final Pattern PARAMETER = Pattern.compile( - ";\\s*" + TOKEN + "=(?:" + TOKEN + "|" + QUOTED + ")"); - - private final String mediaType; - private final String type; - private final String subtype; - private final String charset; - - private MediaType(String mediaType, String type, String subtype, String charset) { - this.mediaType = mediaType; - this.type = type; - this.subtype = subtype; - this.charset = charset; - } - - /** - * Returns a media type for {@code string}, or null if {@code string} is not a - * well-formed media type. - */ - public static MediaType parse(String string) { - Matcher typeSubtype = TYPE_SUBTYPE.matcher(string); - if (!typeSubtype.lookingAt()) return null; - String type = typeSubtype.group(1).toLowerCase(Locale.US); - String subtype = typeSubtype.group(2).toLowerCase(Locale.US); - - String charset = null; - Matcher parameter = PARAMETER.matcher(string); - for (int s = typeSubtype.end(); s < string.length(); s = parameter.end()) { - parameter.region(s, string.length()); - if (!parameter.lookingAt()) return null; // This is not a well-formed media type. - - String name = parameter.group(1); - if (name == null || !name.equalsIgnoreCase("charset")) continue; - if (charset != null) throw new IllegalArgumentException("Multiple charsets: " + string); - charset = parameter.group(2) != null - ? parameter.group(2) // Value is a token. - : parameter.group(3); // Value is a quoted string. - } - - return new MediaType(string, type, subtype, charset); - } - - /** - * Returns the high-level media type, such as "text", "image", "audio", - * "video", or "application". - */ - public String type() { - return type; - } - - /** - * Returns a specific media subtype, such as "plain" or "png", "mpeg", - * "mp4" or "xml". - */ - public String subtype() { - return subtype; - } - - /** - * Returns the charset of this media type, or null if this media type doesn't - * specify a charset. - */ - public Charset charset() { - return charset != null ? Charset.forName(charset) : null; - } - - /** - * Returns the charset of this media type, or {@code defaultValue} if this - * media type doesn't specify a charset. - */ - public Charset charset(Charset defaultValue) { - return charset != null ? Charset.forName(charset) : defaultValue; - } - - /** - * Returns the encoded media type, like "text/plain; charset=utf-8", - * appropriate for use in a Content-Type header. - */ - @Override public String toString() { - return mediaType; - } - - @Override public boolean equals(Object o) { - return o instanceof MediaType && ((MediaType) o).mediaType.equals(mediaType); - } - - @Override public int hashCode() { - return mediaType.hashCode(); - } -} diff --git a/platforms/android/CordovaLib/src/com/squareup/okhttp/OkAuthenticator.java b/platforms/android/CordovaLib/src/com/squareup/okhttp/OkAuthenticator.java deleted file mode 100755 index a505419..0000000 --- a/platforms/android/CordovaLib/src/com/squareup/okhttp/OkAuthenticator.java +++ /dev/null @@ -1,123 +0,0 @@ -/* - * Copyright (C) 2013 Square, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.squareup.okhttp; - -import com.squareup.okhttp.internal.Base64; -import java.io.IOException; -import java.io.UnsupportedEncodingException; -import java.net.Proxy; -import java.net.URL; -import java.util.List; - -/** - * Responds to authentication challenges from the remote web or proxy server by - * returning credentials. - */ -public interface OkAuthenticator { - /** - * Returns a credential that satisfies the authentication challenge made by - * {@code url}. Returns null if the challenge cannot be satisfied. This method - * is called in response to an HTTP 401 unauthorized status code sent by the - * origin server. - * - * @param challenges parsed "WWW-Authenticate" challenge headers from the HTTP - * response. - */ - Credential authenticate(Proxy proxy, URL url, List challenges) throws IOException; - - /** - * Returns a credential that satisfies the authentication challenge made by - * {@code proxy}. Returns null if the challenge cannot be satisfied. This - * method is called in response to an HTTP 401 unauthorized status code sent - * by the proxy server. - * - * @param challenges parsed "Proxy-Authenticate" challenge headers from the - * HTTP response. - */ - Credential authenticateProxy(Proxy proxy, URL url, List challenges) throws IOException; - - /** An RFC 2617 challenge. */ - public final class Challenge { - private final String scheme; - private final String realm; - - public Challenge(String scheme, String realm) { - this.scheme = scheme; - this.realm = realm; - } - - /** Returns the authentication scheme, like {@code Basic}. */ - public String getScheme() { - return scheme; - } - - /** Returns the protection space. */ - public String getRealm() { - return realm; - } - - @Override public boolean equals(Object o) { - return o instanceof Challenge - && ((Challenge) o).scheme.equals(scheme) - && ((Challenge) o).realm.equals(realm); - } - - @Override public int hashCode() { - return scheme.hashCode() + 31 * realm.hashCode(); - } - - @Override public String toString() { - return scheme + " realm=\"" + realm + "\""; - } - } - - /** An RFC 2617 credential. */ - public final class Credential { - private final String headerValue; - - private Credential(String headerValue) { - this.headerValue = headerValue; - } - - /** Returns an auth credential for the Basic scheme. */ - public static Credential basic(String userName, String password) { - try { - String usernameAndPassword = userName + ":" + password; - byte[] bytes = usernameAndPassword.getBytes("ISO-8859-1"); - String encoded = Base64.encode(bytes); - return new Credential("Basic " + encoded); - } catch (UnsupportedEncodingException e) { - throw new AssertionError(); - } - } - - public String getHeaderValue() { - return headerValue; - } - - @Override public boolean equals(Object o) { - return o instanceof Credential && ((Credential) o).headerValue.equals(headerValue); - } - - @Override public int hashCode() { - return headerValue.hashCode(); - } - - @Override public String toString() { - return headerValue; - } - } -} diff --git a/platforms/android/CordovaLib/src/com/squareup/okhttp/OkHttpClient.java b/platforms/android/CordovaLib/src/com/squareup/okhttp/OkHttpClient.java deleted file mode 100755 index f78592f..0000000 --- a/platforms/android/CordovaLib/src/com/squareup/okhttp/OkHttpClient.java +++ /dev/null @@ -1,408 +0,0 @@ -/* - * Copyright (C) 2012 Square, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.squareup.okhttp; - -import com.squareup.okhttp.internal.Util; -import com.squareup.okhttp.internal.http.HttpAuthenticator; -import com.squareup.okhttp.internal.http.HttpURLConnectionImpl; -import com.squareup.okhttp.internal.http.HttpsURLConnectionImpl; -import com.squareup.okhttp.internal.http.OkResponseCacheAdapter; -import com.squareup.okhttp.internal.tls.OkHostnameVerifier; -import java.net.CookieHandler; -import java.net.HttpURLConnection; -import java.net.Proxy; -import java.net.ProxySelector; -import java.net.ResponseCache; -import java.net.URL; -import java.net.URLConnection; -import java.net.URLStreamHandler; -import java.net.URLStreamHandlerFactory; -import java.util.Arrays; -import java.util.List; -import java.util.concurrent.TimeUnit; -import javax.net.ssl.HostnameVerifier; -import javax.net.ssl.HttpsURLConnection; -import javax.net.ssl.SSLSocketFactory; - -/** Configures and creates HTTP connections. */ -public final class OkHttpClient implements URLStreamHandlerFactory { - private static final List DEFAULT_TRANSPORTS - = Util.immutableList(Arrays.asList("spdy/3", "http/1.1")); - - private final RouteDatabase routeDatabase; - private final Dispatcher dispatcher; - private Proxy proxy; - private List transports; - private ProxySelector proxySelector; - private CookieHandler cookieHandler; - private ResponseCache responseCache; - private SSLSocketFactory sslSocketFactory; - private HostnameVerifier hostnameVerifier; - private OkAuthenticator authenticator; - private ConnectionPool connectionPool; - private boolean followProtocolRedirects = true; - private int connectTimeout; - private int readTimeout; - - public OkHttpClient() { - routeDatabase = new RouteDatabase(); - dispatcher = new Dispatcher(); - } - - private OkHttpClient(OkHttpClient copyFrom) { - routeDatabase = copyFrom.routeDatabase; - dispatcher = copyFrom.dispatcher; - } - - /** - * Sets the default connect timeout for new connections. A value of 0 means no timeout. - * - * @see URLConnection#setConnectTimeout(int) - */ - public void setConnectTimeout(long timeout, TimeUnit unit) { - if (timeout < 0) { - throw new IllegalArgumentException("timeout < 0"); - } - if (unit == null) { - throw new IllegalArgumentException("unit == null"); - } - long millis = unit.toMillis(timeout); - if (millis > Integer.MAX_VALUE) { - throw new IllegalArgumentException("Timeout too large."); - } - connectTimeout = (int) millis; - } - - /** Default connect timeout (in milliseconds). */ - public int getConnectTimeout() { - return connectTimeout; - } - - /** - * Sets the default read timeout for new connections. A value of 0 means no timeout. - * - * @see URLConnection#setReadTimeout(int) - */ - public void setReadTimeout(long timeout, TimeUnit unit) { - if (timeout < 0) { - throw new IllegalArgumentException("timeout < 0"); - } - if (unit == null) { - throw new IllegalArgumentException("unit == null"); - } - long millis = unit.toMillis(timeout); - if (millis > Integer.MAX_VALUE) { - throw new IllegalArgumentException("Timeout too large."); - } - readTimeout = (int) millis; - } - - /** Default read timeout (in milliseconds). */ - public int getReadTimeout() { - return readTimeout; - } - - /** - * Sets the HTTP proxy that will be used by connections created by this - * client. This takes precedence over {@link #setProxySelector}, which is - * only honored when this proxy is null (which it is by default). To disable - * proxy use completely, call {@code setProxy(Proxy.NO_PROXY)}. - */ - public OkHttpClient setProxy(Proxy proxy) { - this.proxy = proxy; - return this; - } - - public Proxy getProxy() { - return proxy; - } - - /** - * Sets the proxy selection policy to be used if no {@link #setProxy proxy} - * is specified explicitly. The proxy selector may return multiple proxies; - * in that case they will be tried in sequence until a successful connection - * is established. - * - *

If unset, the {@link ProxySelector#getDefault() system-wide default} - * proxy selector will be used. - */ - public OkHttpClient setProxySelector(ProxySelector proxySelector) { - this.proxySelector = proxySelector; - return this; - } - - public ProxySelector getProxySelector() { - return proxySelector; - } - - /** - * Sets the cookie handler to be used to read outgoing cookies and write - * incoming cookies. - * - *

If unset, the {@link CookieHandler#getDefault() system-wide default} - * cookie handler will be used. - */ - public OkHttpClient setCookieHandler(CookieHandler cookieHandler) { - this.cookieHandler = cookieHandler; - return this; - } - - public CookieHandler getCookieHandler() { - return cookieHandler; - } - - /** - * Sets the response cache to be used to read and write cached responses. - * - *

If unset, the {@link ResponseCache#getDefault() system-wide default} - * response cache will be used. - */ - public OkHttpClient setResponseCache(ResponseCache responseCache) { - this.responseCache = responseCache; - return this; - } - - public ResponseCache getResponseCache() { - return responseCache; - } - - public OkResponseCache getOkResponseCache() { - if (responseCache instanceof HttpResponseCache) { - return ((HttpResponseCache) responseCache).okResponseCache; - } else if (responseCache != null) { - return new OkResponseCacheAdapter(responseCache); - } else { - return null; - } - } - - /** - * Sets the socket factory used to secure HTTPS connections. - * - *

If unset, the {@link HttpsURLConnection#getDefaultSSLSocketFactory() - * system-wide default} SSL socket factory will be used. - */ - public OkHttpClient setSslSocketFactory(SSLSocketFactory sslSocketFactory) { - this.sslSocketFactory = sslSocketFactory; - return this; - } - - public SSLSocketFactory getSslSocketFactory() { - return sslSocketFactory; - } - - /** - * Sets the verifier used to confirm that response certificates apply to - * requested hostnames for HTTPS connections. - * - *

If unset, the {@link HttpsURLConnection#getDefaultHostnameVerifier() - * system-wide default} hostname verifier will be used. - */ - public OkHttpClient setHostnameVerifier(HostnameVerifier hostnameVerifier) { - this.hostnameVerifier = hostnameVerifier; - return this; - } - - public HostnameVerifier getHostnameVerifier() { - return hostnameVerifier; - } - - /** - * Sets the authenticator used to respond to challenges from the remote web - * server or proxy server. - * - *

If unset, the {@link java.net.Authenticator#setDefault system-wide default} - * authenticator will be used. - */ - public OkHttpClient setAuthenticator(OkAuthenticator authenticator) { - this.authenticator = authenticator; - return this; - } - - public OkAuthenticator getAuthenticator() { - return authenticator; - } - - /** - * Sets the connection pool used to recycle HTTP and HTTPS connections. - * - *

If unset, the {@link ConnectionPool#getDefault() system-wide - * default} connection pool will be used. - */ - public OkHttpClient setConnectionPool(ConnectionPool connectionPool) { - this.connectionPool = connectionPool; - return this; - } - - public ConnectionPool getConnectionPool() { - return connectionPool; - } - - /** - * Configure this client to follow redirects from HTTPS to HTTP and from HTTP - * to HTTPS. - * - *

If unset, protocol redirects will be followed. This is different than - * the built-in {@code HttpURLConnection}'s default. - */ - public OkHttpClient setFollowProtocolRedirects(boolean followProtocolRedirects) { - this.followProtocolRedirects = followProtocolRedirects; - return this; - } - - public boolean getFollowProtocolRedirects() { - return followProtocolRedirects; - } - - public RouteDatabase getRoutesDatabase() { - return routeDatabase; - } - - /** - * Configure the transports used by this client to communicate with remote - * servers. By default this client will prefer the most efficient transport - * available, falling back to more ubiquitous transports. Applications should - * only call this method to avoid specific compatibility problems, such as web - * servers that behave incorrectly when SPDY is enabled. - * - *

The following transports are currently supported: - *

- * - *

This is an evolving set. Future releases may drop - * support for transitional transports (like spdy/3), in favor of their - * successors (spdy/4 or http/2.0). The http/1.1 transport will never be - * dropped. - * - *

If multiple protocols are specified, NPN will - * be used to negotiate a transport. Future releases may use another mechanism - * (such as ALPN) - * to negotiate a transport. - * - * @param transports the transports to use, in order of preference. The list - * must contain "http/1.1". It must not contain null. - */ - public OkHttpClient setTransports(List transports) { - transports = Util.immutableList(transports); - if (!transports.contains("http/1.1")) { - throw new IllegalArgumentException("transports doesn't contain http/1.1: " + transports); - } - if (transports.contains(null)) { - throw new IllegalArgumentException("transports must not contain null"); - } - if (transports.contains("")) { - throw new IllegalArgumentException("transports contains an empty string"); - } - this.transports = transports; - return this; - } - - public List getTransports() { - return transports; - } - - /** - * Schedules {@code request} to be executed. - */ - /* OkHttp 2.0: public */ void enqueue(Request request, Response.Receiver responseReceiver) { - // Create the HttpURLConnection immediately so the enqueued job gets the current settings of - // this client. Otherwise changes to this client (socket factory, redirect policy, etc.) may - // incorrectly be reflected in the request when it is dispatched later. - dispatcher.enqueue(copyWithDefaults(), request, responseReceiver); - } - - /** - * Cancels all scheduled tasks tagged with {@code tag}. Requests that are already - * in flight might not be canceled. - */ - /* OkHttp 2.0: public */ void cancel(Object tag) { - dispatcher.cancel(tag); - } - - public HttpURLConnection open(URL url) { - return open(url, proxy); - } - - HttpURLConnection open(URL url, Proxy proxy) { - String protocol = url.getProtocol(); - OkHttpClient copy = copyWithDefaults(); - copy.proxy = proxy; - - if (protocol.equals("http")) return new HttpURLConnectionImpl(url, copy); - if (protocol.equals("https")) return new HttpsURLConnectionImpl(url, copy); - throw new IllegalArgumentException("Unexpected protocol: " + protocol); - } - - /** - * Returns a shallow copy of this OkHttpClient that uses the system-wide default for - * each field that hasn't been explicitly configured. - */ - private OkHttpClient copyWithDefaults() { - OkHttpClient result = new OkHttpClient(this); - result.proxy = proxy; - result.proxySelector = proxySelector != null ? proxySelector : ProxySelector.getDefault(); - result.cookieHandler = cookieHandler != null ? cookieHandler : CookieHandler.getDefault(); - result.responseCache = responseCache != null ? responseCache : ResponseCache.getDefault(); - result.sslSocketFactory = sslSocketFactory != null - ? sslSocketFactory - : HttpsURLConnection.getDefaultSSLSocketFactory(); - result.hostnameVerifier = hostnameVerifier != null - ? hostnameVerifier - : OkHostnameVerifier.INSTANCE; - result.authenticator = authenticator != null - ? authenticator - : HttpAuthenticator.SYSTEM_DEFAULT; - result.connectionPool = connectionPool != null ? connectionPool : ConnectionPool.getDefault(); - result.followProtocolRedirects = followProtocolRedirects; - result.transports = transports != null ? transports : DEFAULT_TRANSPORTS; - result.connectTimeout = connectTimeout; - result.readTimeout = readTimeout; - return result; - } - - /** - * Creates a URLStreamHandler as a {@link URL#setURLStreamHandlerFactory}. - * - *

This code configures OkHttp to handle all HTTP and HTTPS connections - * created with {@link URL#openConnection()}:

   {@code
-   *
-   *   OkHttpClient okHttpClient = new OkHttpClient();
-   *   URL.setURLStreamHandlerFactory(okHttpClient);
-   * }
- */ - public URLStreamHandler createURLStreamHandler(final String protocol) { - if (!protocol.equals("http") && !protocol.equals("https")) return null; - - return new URLStreamHandler() { - @Override protected URLConnection openConnection(URL url) { - return open(url); - } - - @Override protected URLConnection openConnection(URL url, Proxy proxy) { - return open(url, proxy); - } - - @Override protected int getDefaultPort() { - if (protocol.equals("http")) return 80; - if (protocol.equals("https")) return 443; - throw new AssertionError(); - } - }; - } -} diff --git a/platforms/android/CordovaLib/src/com/squareup/okhttp/OkResponseCache.java b/platforms/android/CordovaLib/src/com/squareup/okhttp/OkResponseCache.java deleted file mode 100755 index ffe6f54..0000000 --- a/platforms/android/CordovaLib/src/com/squareup/okhttp/OkResponseCache.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright (C) 2013 Square, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.squareup.okhttp; - -import java.io.IOException; -import java.net.CacheRequest; -import java.net.CacheResponse; -import java.net.HttpURLConnection; -import java.net.URI; -import java.net.URLConnection; -import java.util.List; -import java.util.Map; - -/** - * An extended response cache API. Unlike {@link java.net.ResponseCache}, this - * interface supports conditional caching and statistics. - * - *

Warning: Experimental OkHttp 2.0 API

- * This class is in beta. APIs are subject to change! - */ -public interface OkResponseCache { - CacheResponse get(URI uri, String requestMethod, Map> requestHeaders) - throws IOException; - - CacheRequest put(URI uri, URLConnection urlConnection) throws IOException; - - /** Remove any cache entries for the supplied {@code uri} if the request method invalidates. */ - void maybeRemove(String requestMethod, URI uri) throws IOException; - - /** - * Handles a conditional request hit by updating the stored cache response - * with the headers from {@code httpConnection}. The cached response body is - * not updated. If the stored response has changed since {@code - * conditionalCacheHit} was returned, this does nothing. - */ - void update(CacheResponse conditionalCacheHit, HttpURLConnection connection) throws IOException; - - /** Track an conditional GET that was satisfied by this cache. */ - void trackConditionalCacheHit(); - - /** Track an HTTP response being satisfied by {@code source}. */ - void trackResponse(ResponseSource source); -} diff --git a/platforms/android/CordovaLib/src/com/squareup/okhttp/Request.java b/platforms/android/CordovaLib/src/com/squareup/okhttp/Request.java deleted file mode 100755 index f95303e..0000000 --- a/platforms/android/CordovaLib/src/com/squareup/okhttp/Request.java +++ /dev/null @@ -1,284 +0,0 @@ -/* - * Copyright (C) 2013 Square, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.squareup.okhttp; - -import com.squareup.okhttp.internal.Util; -import com.squareup.okhttp.internal.http.RawHeaders; -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.io.UnsupportedEncodingException; -import java.net.MalformedURLException; -import java.net.URL; -import java.util.List; -import java.util.Set; - -/** - * An HTTP request. Instances of this class are immutable if their {@link #body} - * is null or itself immutable. - * - *

Warning: Experimental OkHttp 2.0 API

- * This class is in beta. APIs are subject to change! - */ -/* OkHttp 2.0: public */ final class Request { - private final URL url; - private final String method; - private final RawHeaders headers; - private final Body body; - private final Object tag; - - private Request(Builder builder) { - this.url = builder.url; - this.method = builder.method; - this.headers = new RawHeaders(builder.headers); - this.body = builder.body; - this.tag = builder.tag != null ? builder.tag : this; - } - - public URL url() { - return url; - } - - public String urlString() { - return url.toString(); - } - - public String method() { - return method; - } - - public String header(String name) { - return headers.get(name); - } - - public List headers(String name) { - return headers.values(name); - } - - public Set headerNames() { - return headers.names(); - } - - RawHeaders rawHeaders() { - return new RawHeaders(headers); - } - - public int headerCount() { - return headers.length(); - } - - public String headerName(int index) { - return headers.getFieldName(index); - } - - public String headerValue(int index) { - return headers.getValue(index); - } - - public Body body() { - return body; - } - - public Object tag() { - return tag; - } - - Builder newBuilder() { - return new Builder(url) - .method(method, body) - .rawHeaders(headers) - .tag(tag); - } - - public abstract static class Body { - /** Returns the Content-Type header for this body. */ - public abstract MediaType contentType(); - - /** - * Returns the number of bytes that will be written to {@code out} in a call - * to {@link #writeTo}, or -1 if that count is unknown. - */ - public long contentLength() { - return -1; - } - - /** Writes the content of this request to {@code out}. */ - public abstract void writeTo(OutputStream out) throws IOException; - - /** - * Returns a new request body that transmits {@code content}. If {@code - * contentType} lacks a charset, this will use UTF-8. - */ - public static Body create(MediaType contentType, String content) { - contentType = contentType.charset() != null - ? contentType - : MediaType.parse(contentType + "; charset=utf-8"); - try { - byte[] bytes = content.getBytes(contentType.charset().name()); - return create(contentType, bytes); - } catch (UnsupportedEncodingException e) { - throw new AssertionError(); - } - } - - /** Returns a new request body that transmits {@code content}. */ - public static Body create(final MediaType contentType, final byte[] content) { - if (contentType == null) throw new NullPointerException("contentType == null"); - if (content == null) throw new NullPointerException("content == null"); - - return new Body() { - @Override public MediaType contentType() { - return contentType; - } - - @Override public long contentLength() { - return content.length; - } - - @Override public void writeTo(OutputStream out) throws IOException { - out.write(content); - } - }; - } - - /** Returns a new request body that transmits the content of {@code file}. */ - public static Body create(final MediaType contentType, final File file) { - if (contentType == null) throw new NullPointerException("contentType == null"); - if (file == null) throw new NullPointerException("content == null"); - - return new Body() { - @Override public MediaType contentType() { - return contentType; - } - - @Override public long contentLength() { - return file.length(); - } - - @Override public void writeTo(OutputStream out) throws IOException { - long length = contentLength(); - if (length == 0) return; - - InputStream in = null; - try { - in = new FileInputStream(file); - byte[] buffer = new byte[(int) Math.min(8192, length)]; - for (int c; (c = in.read(buffer)) != -1; ) { - out.write(buffer, 0, c); - } - } finally { - Util.closeQuietly(in); - } - } - }; - } - } - - public static class Builder { - private URL url; - private String method = "GET"; - private RawHeaders headers = new RawHeaders(); - private Body body; - private Object tag; - - public Builder(String url) { - url(url); - } - - public Builder(URL url) { - url(url); - } - - public Builder url(String url) { - try { - this.url = new URL(url); - return this; - } catch (MalformedURLException e) { - throw new IllegalArgumentException("Malformed URL: " + url); - } - } - - public Builder url(URL url) { - if (url == null) throw new IllegalStateException("url == null"); - this.url = url; - return this; - } - - /** - * Sets the header named {@code name} to {@code value}. If this request - * already has any headers with that name, they are all replaced. - */ - public Builder header(String name, String value) { - headers.set(name, value); - return this; - } - - /** - * Adds a header with {@code name} and {@code value}. Prefer this method for - * multiply-valued headers like "Cookie". - */ - public Builder addHeader(String name, String value) { - headers.add(name, value); - return this; - } - - Builder rawHeaders(RawHeaders rawHeaders) { - headers = new RawHeaders(rawHeaders); - return this; - } - - public Builder get() { - return method("GET", null); - } - - public Builder head() { - return method("HEAD", null); - } - - public Builder post(Body body) { - return method("POST", body); - } - - public Builder put(Body body) { - return method("PUT", body); - } - - public Builder method(String method, Body body) { - if (method == null || method.length() == 0) { - throw new IllegalArgumentException("method == null || method.length() == 0"); - } - this.method = method; - this.body = body; - return this; - } - - /** - * Attaches {@code tag} to the request. It can be used later to cancel the - * request. If the tag is unspecified or null, the request is canceled by - * using the request itself as the tag. - */ - public Builder tag(Object tag) { - this.tag = tag; - return this; - } - - public Request build() { - return new Request(this); - } - } -} diff --git a/platforms/android/CordovaLib/src/com/squareup/okhttp/Response.java b/platforms/android/CordovaLib/src/com/squareup/okhttp/Response.java deleted file mode 100755 index 1e67968..0000000 --- a/platforms/android/CordovaLib/src/com/squareup/okhttp/Response.java +++ /dev/null @@ -1,290 +0,0 @@ -/* - * Copyright (C) 2013 Square, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.squareup.okhttp; - -import com.squareup.okhttp.internal.Util; -import com.squareup.okhttp.internal.http.RawHeaders; -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.io.Reader; -import java.nio.charset.Charset; -import java.util.List; -import java.util.Set; - -import static com.squareup.okhttp.internal.Util.UTF_8; - -/** - * An HTTP response. Instances of this class are not immutable: the response - * body is a one-shot value that may be consumed only once. All other properties - * are immutable. - * - *

Warning: Experimental OkHttp 2.0 API

- * This class is in beta. APIs are subject to change! - */ -/* OkHttp 2.0: public */ final class Response { - private final Request request; - private final int code; - private final RawHeaders headers; - private final Body body; - private final Response redirectedBy; - - private Response(Builder builder) { - this.request = builder.request; - this.code = builder.code; - this.headers = new RawHeaders(builder.headers); - this.body = builder.body; - this.redirectedBy = builder.redirectedBy; - } - - /** - * The wire-level request that initiated this HTTP response. This is usually - * not the same request instance provided to the HTTP client: - *
    - *
  • It may be transformed by the HTTP client. For example, the client - * may have added its own {@code Content-Encoding} header to enable - * response compression. - *
  • It may be the request generated in response to an HTTP redirect. - * In this case the request URL may be different than the initial - * request URL. - *
- */ - public Request request() { - return request; - } - - public int code() { - return code; - } - - public String header(String name) { - return header(name, null); - } - - public String header(String name, String defaultValue) { - String result = headers.get(name); - return result != null ? result : defaultValue; - } - - public List headers(String name) { - return headers.values(name); - } - - public Set headerNames() { - return headers.names(); - } - - public int headerCount() { - return headers.length(); - } - - public String headerName(int index) { - return headers.getFieldName(index); - } - - RawHeaders rawHeaders() { - return new RawHeaders(headers); - } - - public String headerValue(int index) { - return headers.getValue(index); - } - - public Body body() { - return body; - } - - /** - * Returns the response for the HTTP redirect that triggered this response, or - * null if this response wasn't triggered by an automatic redirect. The body - * of the returned response should not be read because it has already been - * consumed by the redirecting client. - */ - public Response redirectedBy() { - return redirectedBy; - } - - public abstract static class Body { - /** Multiple calls to {@link #charStream()} must return the same instance. */ - private Reader reader; - - /** - * Returns true if further data from this response body should be read at - * this time. For asynchronous transports like SPDY and HTTP/2.0, this will - * return false once all locally-available body bytes have been read. - * - *

Clients with many concurrent downloads can use this method to reduce - * the number of idle threads blocking on reads. See {@link - * Receiver#onResponse} for details. - */ - //

Body.ready() vs. InputStream.available()

- // TODO: Can we fix response bodies to implement InputStream.available well? - // The deflater implementation is broken by default but we could do better. - public abstract boolean ready() throws IOException; - - public abstract MediaType contentType(); - - /** - * Returns the number of bytes in that will returned by {@link #bytes}, or - * {@link #byteStream}, or -1 if unknown. - */ - public abstract long contentLength(); - - public abstract InputStream byteStream() throws IOException; - - public final byte[] bytes() throws IOException { - long contentLength = contentLength(); - if (contentLength > Integer.MAX_VALUE) { - throw new IOException("Cannot buffer entire body for content length: " + contentLength); - } - - if (contentLength != -1) { - byte[] content = new byte[(int) contentLength]; - InputStream in = byteStream(); - Util.readFully(in, content); - if (in.read() != -1) throw new IOException("Content-Length and stream length disagree"); - return content; - - } else { - ByteArrayOutputStream out = new ByteArrayOutputStream(); - Util.copy(byteStream(), out); - return out.toByteArray(); - } - } - - /** - * Returns the response as a character stream decoded with the charset - * of the Content-Type header. If that header is either absent or lacks a - * charset, this will attempt to decode the response body as UTF-8. - */ - public final Reader charStream() throws IOException { - if (reader == null) { - reader = new InputStreamReader(byteStream(), charset()); - } - return reader; - } - - /** - * Returns the response as a string decoded with the charset of the - * Content-Type header. If that header is either absent or lacks a charset, - * this will attempt to decode the response body as UTF-8. - */ - public final String string() throws IOException { - return new String(bytes(), charset().name()); - } - - private Charset charset() { - MediaType contentType = contentType(); - return contentType != null ? contentType.charset(UTF_8) : UTF_8; - } - } - - public interface Receiver { - /** - * Called when the request could not be executed due to a connectivity - * problem or timeout. Because networks can fail during an exchange, it is - * possible that the remote server accepted the request before the failure. - */ - void onFailure(Failure failure); - - /** - * Called when the HTTP response was successfully returned by the remote - * server. The receiver may proceed to read the response body with the - * response's {@link #body} method. - * - *

Note that transport-layer success (receiving a HTTP response code, - * headers and body) does not necessarily indicate application-layer - * success: {@code response} may still indicate an unhappy HTTP response - * code like 404 or 500. - * - *

Non-blocking responses

- * - *

Receivers do not need to block while waiting for the response body to - * download. Instead, they can get called back as data arrives. Use {@link - * Body#ready} to check if bytes should be read immediately. While there is - * data ready, read it. If there isn't, return false: receivers will be - * called back with {@code onResponse()} as additional data is downloaded. - * - *

Return true to indicate that the receiver has finished handling the - * response body. If the response body has unread data, it will be - * discarded. - * - *

When the response body has been fully consumed the returned value is - * undefined. - * - *

The current implementation of {@link Body#ready} always returns true - * when the underlying transport is HTTP/1. This results in blocking on that - * transport. For effective non-blocking your server must support SPDY or - * HTTP/2. - */ - boolean onResponse(Response response) throws IOException; - } - - public static class Builder { - private final Request request; - private final int code; - private RawHeaders headers = new RawHeaders(); - private Body body; - private Response redirectedBy; - - public Builder(Request request, int code) { - if (request == null) throw new IllegalArgumentException("request == null"); - if (code <= 0) throw new IllegalArgumentException("code <= 0"); - this.request = request; - this.code = code; - } - - /** - * Sets the header named {@code name} to {@code value}. If this request - * already has any headers with that name, they are all replaced. - */ - public Builder header(String name, String value) { - headers.set(name, value); - return this; - } - - /** - * Adds a header with {@code name} and {@code value}. Prefer this method for - * multiply-valued headers like "Set-Cookie". - */ - public Builder addHeader(String name, String value) { - headers.add(name, value); - return this; - } - - Builder rawHeaders(RawHeaders rawHeaders) { - headers = new RawHeaders(rawHeaders); - return this; - } - - public Builder body(Body body) { - this.body = body; - return this; - } - - public Builder redirectedBy(Response redirectedBy) { - this.redirectedBy = redirectedBy; - return this; - } - - public Response build() { - if (request == null) throw new IllegalStateException("Response has no request."); - if (code == -1) throw new IllegalStateException("Response has no code."); - return new Response(this); - } - } -} diff --git a/platforms/android/CordovaLib/src/com/squareup/okhttp/ResponseSource.java b/platforms/android/CordovaLib/src/com/squareup/okhttp/ResponseSource.java deleted file mode 100755 index 4eca172..0000000 --- a/platforms/android/CordovaLib/src/com/squareup/okhttp/ResponseSource.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright (C) 2011 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.squareup.okhttp; - -/** The source of an HTTP response. */ -public enum ResponseSource { - - /** The response was returned from the local cache. */ - CACHE, - - /** - * The response is available in the cache but must be validated with the - * network. The cache result will be used if it is still valid; otherwise - * the network's response will be used. - */ - CONDITIONAL_CACHE, - - /** The response was returned from the network. */ - NETWORK; - - public boolean requiresConnection() { - return this == CONDITIONAL_CACHE || this == NETWORK; - } -} diff --git a/platforms/android/CordovaLib/src/com/squareup/okhttp/Route.java b/platforms/android/CordovaLib/src/com/squareup/okhttp/Route.java deleted file mode 100755 index 4b8786d..0000000 --- a/platforms/android/CordovaLib/src/com/squareup/okhttp/Route.java +++ /dev/null @@ -1,91 +0,0 @@ -/* - * Copyright (C) 2013 Square, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.squareup.okhttp; - -import java.net.InetSocketAddress; -import java.net.Proxy; - -/** Represents the route used by a connection to reach an endpoint. */ -public class Route { - final Address address; - final Proxy proxy; - final InetSocketAddress inetSocketAddress; - final boolean modernTls; - - public Route(Address address, Proxy proxy, InetSocketAddress inetSocketAddress, - boolean modernTls) { - if (address == null) throw new NullPointerException("address == null"); - if (proxy == null) throw new NullPointerException("proxy == null"); - if (inetSocketAddress == null) throw new NullPointerException("inetSocketAddress == null"); - this.address = address; - this.proxy = proxy; - this.inetSocketAddress = inetSocketAddress; - this.modernTls = modernTls; - } - - /** Returns the {@link Address} of this route. */ - public Address getAddress() { - return address; - } - - /** - * Returns the {@link Proxy} of this route. - * - * Warning: This may be different than the proxy returned - * by {@link #getAddress}! That is the proxy that the user asked to be - * connected to; this returns the proxy that they were actually connected - * to. The two may disagree when a proxy selector selects a different proxy - * for a connection. - */ - public Proxy getProxy() { - return proxy; - } - - /** Returns the {@link InetSocketAddress} of this route. */ - public InetSocketAddress getSocketAddress() { - return inetSocketAddress; - } - - /** Returns true if this route uses modern TLS. */ - public boolean isModernTls() { - return modernTls; - } - - /** Returns a copy of this route with flipped TLS mode. */ - Route flipTlsMode() { - return new Route(address, proxy, inetSocketAddress, !modernTls); - } - - @Override public boolean equals(Object obj) { - if (obj instanceof Route) { - Route other = (Route) obj; - return (address.equals(other.address) - && proxy.equals(other.proxy) - && inetSocketAddress.equals(other.inetSocketAddress) - && modernTls == other.modernTls); - } - return false; - } - - @Override public int hashCode() { - int result = 17; - result = 31 * result + address.hashCode(); - result = 31 * result + proxy.hashCode(); - result = 31 * result + inetSocketAddress.hashCode(); - result = result + (modernTls ? (31 * result) : 0); - return result; - } -} diff --git a/platforms/android/CordovaLib/src/com/squareup/okhttp/RouteDatabase.java b/platforms/android/CordovaLib/src/com/squareup/okhttp/RouteDatabase.java deleted file mode 100755 index 9cbeaa7..0000000 --- a/platforms/android/CordovaLib/src/com/squareup/okhttp/RouteDatabase.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright (C) 2013 Square, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.squareup.okhttp; - -import java.io.IOException; -import java.util.LinkedHashSet; -import java.util.Set; -import javax.net.ssl.SSLHandshakeException; - -/** - * A blacklist of failed routes to avoid when creating a new connection to a - * target address. This is used so that OkHttp can learn from its mistakes: if - * there was a failure attempting to connect to a specific IP address, proxy - * server or TLS mode, that failure is remembered and alternate routes are - * preferred. - */ -public final class RouteDatabase { - private final Set failedRoutes = new LinkedHashSet(); - - /** Records a failure connecting to {@code failedRoute}. */ - public synchronized void failed(Route failedRoute, IOException failure) { - failedRoutes.add(failedRoute); - - if (!(failure instanceof SSLHandshakeException)) { - // If the problem was not related to SSL then it will also fail with - // a different TLS mode therefore we can be proactive about it. - failedRoutes.add(failedRoute.flipTlsMode()); - } - } - - /** Records success connecting to {@code failedRoute}. */ - public synchronized void connected(Route route) { - failedRoutes.remove(route); - } - - /** Returns true if {@code route} has failed recently and should be avoided. */ - public synchronized boolean shouldPostpone(Route route) { - return failedRoutes.contains(route); - } - - public synchronized int failedRoutesCount() { - return failedRoutes.size(); - } -} diff --git a/platforms/android/CordovaLib/src/com/squareup/okhttp/TunnelRequest.java b/platforms/android/CordovaLib/src/com/squareup/okhttp/TunnelRequest.java deleted file mode 100755 index 5260b87..0000000 --- a/platforms/android/CordovaLib/src/com/squareup/okhttp/TunnelRequest.java +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Copyright (C) 2012 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.squareup.okhttp; - -import com.squareup.okhttp.internal.http.RawHeaders; - -import static com.squareup.okhttp.internal.Util.getDefaultPort; - -/** - * Routing and authentication information sent to an HTTP proxy to create a - * HTTPS to an origin server. Everything in the tunnel request is sent - * unencrypted to the proxy server. - * - *

See RFC 2817, Section - * 5.2. - */ -public final class TunnelRequest { - final String host; - final int port; - final String userAgent; - final String proxyAuthorization; - - /** - * @param host the origin server's hostname. Not null. - * @param port the origin server's port, like 80 or 443. - * @param userAgent the client's user-agent. Not null. - * @param proxyAuthorization proxy authorization, or null if the proxy is - * used without an authorization header. - */ - public TunnelRequest(String host, int port, String userAgent, String proxyAuthorization) { - if (host == null) throw new NullPointerException("host == null"); - if (userAgent == null) throw new NullPointerException("userAgent == null"); - this.host = host; - this.port = port; - this.userAgent = userAgent; - this.proxyAuthorization = proxyAuthorization; - } - - /** - * If we're creating a TLS tunnel, send only the minimum set of headers. - * This avoids sending potentially sensitive data like HTTP cookies to - * the proxy unencrypted. - */ - RawHeaders getRequestHeaders() { - RawHeaders result = new RawHeaders(); - result.setRequestLine("CONNECT " + host + ":" + port + " HTTP/1.1"); - - // Always set Host and User-Agent. - result.set("Host", port == getDefaultPort("https") ? host : (host + ":" + port)); - result.set("User-Agent", userAgent); - - // Copy over the Proxy-Authorization header if it exists. - if (proxyAuthorization != null) { - result.set("Proxy-Authorization", proxyAuthorization); - } - - // Always set the Proxy-Connection to Keep-Alive for the benefit of - // HTTP/1.0 proxies like Squid. - result.set("Proxy-Connection", "Keep-Alive"); - return result; - } -} diff --git a/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/AbstractOutputStream.java b/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/AbstractOutputStream.java deleted file mode 100755 index 78c9691..0000000 --- a/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/AbstractOutputStream.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright (C) 2010 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.squareup.okhttp.internal; - -import java.io.IOException; -import java.io.OutputStream; - -/** - * An output stream for an HTTP request body. - * - *

Since a single socket's output stream may be used to write multiple HTTP - * requests to the same server, subclasses should not close the socket stream. - */ -public abstract class AbstractOutputStream extends OutputStream { - protected boolean closed; - - @Override public final void write(int data) throws IOException { - write(new byte[] { (byte) data }); - } - - protected final void checkNotClosed() throws IOException { - if (closed) { - throw new IOException("stream closed"); - } - } - - /** Returns true if this stream was closed locally. */ - public boolean isClosed() { - return closed; - } -} diff --git a/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/Base64.java b/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/Base64.java deleted file mode 100755 index 79cd020..0000000 --- a/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/Base64.java +++ /dev/null @@ -1,164 +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. - */ - -/** - * @author Alexander Y. Kleymenov - */ - -package com.squareup.okhttp.internal; - -import java.io.UnsupportedEncodingException; - -import static com.squareup.okhttp.internal.Util.EMPTY_BYTE_ARRAY; - -/** - * Base64 encoder/decoder. - * In violation of the RFC, this encoder doesn't wrap lines at 76 columns. - */ -public final class Base64 { - private Base64() { - } - - public static byte[] decode(byte[] in) { - return decode(in, in.length); - } - - public static byte[] decode(byte[] in, int len) { - // approximate output length - int length = len / 4 * 3; - // return an empty array on empty or short input without padding - if (length == 0) { - return EMPTY_BYTE_ARRAY; - } - // temporary array - byte[] out = new byte[length]; - // number of padding characters ('=') - int pad = 0; - byte chr; - // compute the number of the padding characters - // and adjust the length of the input - for (; ; len--) { - chr = in[len - 1]; - // skip the neutral characters - if ((chr == '\n') || (chr == '\r') || (chr == ' ') || (chr == '\t')) { - continue; - } - if (chr == '=') { - pad++; - } else { - break; - } - } - // index in the output array - int outIndex = 0; - // index in the input array - int inIndex = 0; - // holds the value of the input character - int bits = 0; - // holds the value of the input quantum - int quantum = 0; - for (int i = 0; i < len; i++) { - chr = in[i]; - // skip the neutral characters - if ((chr == '\n') || (chr == '\r') || (chr == ' ') || (chr == '\t')) { - continue; - } - if ((chr >= 'A') && (chr <= 'Z')) { - // char ASCII value - // A 65 0 - // Z 90 25 (ASCII - 65) - bits = chr - 65; - } else if ((chr >= 'a') && (chr <= 'z')) { - // char ASCII value - // a 97 26 - // z 122 51 (ASCII - 71) - bits = chr - 71; - } else if ((chr >= '0') && (chr <= '9')) { - // char ASCII value - // 0 48 52 - // 9 57 61 (ASCII + 4) - bits = chr + 4; - } else if (chr == '+') { - bits = 62; - } else if (chr == '/') { - bits = 63; - } else { - return null; - } - // append the value to the quantum - quantum = (quantum << 6) | (byte) bits; - if (inIndex % 4 == 3) { - // 4 characters were read, so make the output: - out[outIndex++] = (byte) (quantum >> 16); - out[outIndex++] = (byte) (quantum >> 8); - out[outIndex++] = (byte) quantum; - } - inIndex++; - } - if (pad > 0) { - // adjust the quantum value according to the padding - quantum = quantum << (6 * pad); - // make output - out[outIndex++] = (byte) (quantum >> 16); - if (pad == 1) { - out[outIndex++] = (byte) (quantum >> 8); - } - } - // create the resulting array - byte[] result = new byte[outIndex]; - System.arraycopy(out, 0, result, 0, outIndex); - return result; - } - - private static final byte[] MAP = new byte[] { - 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', - 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', - 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', - '5', '6', '7', '8', '9', '+', '/' - }; - - public static String encode(byte[] in) { - int length = (in.length + 2) * 4 / 3; - byte[] out = new byte[length]; - int index = 0, end = in.length - in.length % 3; - for (int i = 0; i < end; i += 3) { - out[index++] = MAP[(in[i] & 0xff) >> 2]; - out[index++] = MAP[((in[i] & 0x03) << 4) | ((in[i + 1] & 0xff) >> 4)]; - out[index++] = MAP[((in[i + 1] & 0x0f) << 2) | ((in[i + 2] & 0xff) >> 6)]; - out[index++] = MAP[(in[i + 2] & 0x3f)]; - } - switch (in.length % 3) { - case 1: - out[index++] = MAP[(in[end] & 0xff) >> 2]; - out[index++] = MAP[(in[end] & 0x03) << 4]; - out[index++] = '='; - out[index++] = '='; - break; - case 2: - out[index++] = MAP[(in[end] & 0xff) >> 2]; - out[index++] = MAP[((in[end] & 0x03) << 4) | ((in[end + 1] & 0xff) >> 4)]; - out[index++] = MAP[((in[end + 1] & 0x0f) << 2)]; - out[index++] = '='; - break; - } - try { - return new String(out, 0, index, "US-ASCII"); - } catch (UnsupportedEncodingException e) { - throw new AssertionError(e); - } - } -} diff --git a/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/DiskLruCache.java b/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/DiskLruCache.java deleted file mode 100755 index f7fcb1e..0000000 --- a/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/DiskLruCache.java +++ /dev/null @@ -1,926 +0,0 @@ -/* - * Copyright (C) 2011 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.squareup.okhttp.internal; - -import java.io.BufferedWriter; -import java.io.Closeable; -import java.io.EOFException; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.FileOutputStream; -import java.io.FilterOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.io.OutputStream; -import java.io.OutputStreamWriter; -import java.io.Writer; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.LinkedHashMap; -import java.util.Map; -import java.util.concurrent.Callable; -import java.util.concurrent.LinkedBlockingQueue; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -/** - * A cache that uses a bounded amount of space on a filesystem. Each cache - * entry has a string key and a fixed number of values. Each key must match - * the regex [a-z0-9_-]{1,64}. Values are byte sequences, - * accessible as streams or files. Each value must be between {@code 0} and - * {@code Integer.MAX_VALUE} bytes in length. - * - *

The cache stores its data in a directory on the filesystem. This - * directory must be exclusive to the cache; the cache may delete or overwrite - * files from its directory. It is an error for multiple processes to use the - * same cache directory at the same time. - * - *

This cache limits the number of bytes that it will store on the - * filesystem. When the number of stored bytes exceeds the limit, the cache will - * remove entries in the background until the limit is satisfied. The limit is - * not strict: the cache may temporarily exceed it while waiting for files to be - * deleted. The limit does not include filesystem overhead or the cache - * journal so space-sensitive applications should set a conservative limit. - * - *

Clients call {@link #edit} to create or update the values of an entry. An - * entry may have only one editor at one time; if a value is not available to be - * edited then {@link #edit} will return null. - *

    - *
  • When an entry is being created it is necessary to - * supply a full set of values; the empty value should be used as a - * placeholder if necessary. - *
  • When an entry is being edited, it is not necessary - * to supply data for every value; values default to their previous - * value. - *
- * Every {@link #edit} call must be matched by a call to {@link Editor#commit} - * or {@link Editor#abort}. Committing is atomic: a read observes the full set - * of values as they were before or after the commit, but never a mix of values. - * - *

Clients call {@link #get} to read a snapshot of an entry. The read will - * observe the value at the time that {@link #get} was called. Updates and - * removals after the call do not impact ongoing reads. - * - *

This class is tolerant of some I/O errors. If files are missing from the - * filesystem, the corresponding entries will be dropped from the cache. If - * an error occurs while writing a cache value, the edit will fail silently. - * Callers should handle other problems by catching {@code IOException} and - * responding appropriately. - */ -public final class DiskLruCache implements Closeable { - static final String JOURNAL_FILE = "journal"; - static final String JOURNAL_FILE_TEMP = "journal.tmp"; - static final String JOURNAL_FILE_BACKUP = "journal.bkp"; - static final String MAGIC = "libcore.io.DiskLruCache"; - static final String VERSION_1 = "1"; - static final long ANY_SEQUENCE_NUMBER = -1; - static final Pattern LEGAL_KEY_PATTERN = Pattern.compile("[a-z0-9_-]{1,64}"); - private static final String CLEAN = "CLEAN"; - private static final String DIRTY = "DIRTY"; - private static final String REMOVE = "REMOVE"; - private static final String READ = "READ"; - - /* - * This cache uses a journal file named "journal". A typical journal file - * looks like this: - * libcore.io.DiskLruCache - * 1 - * 100 - * 2 - * - * CLEAN 3400330d1dfc7f3f7f4b8d4d803dfcf6 832 21054 - * DIRTY 335c4c6028171cfddfbaae1a9c313c52 - * CLEAN 335c4c6028171cfddfbaae1a9c313c52 3934 2342 - * REMOVE 335c4c6028171cfddfbaae1a9c313c52 - * DIRTY 1ab96a171faeeee38496d8b330771a7a - * CLEAN 1ab96a171faeeee38496d8b330771a7a 1600 234 - * READ 335c4c6028171cfddfbaae1a9c313c52 - * READ 3400330d1dfc7f3f7f4b8d4d803dfcf6 - * - * The first five lines of the journal form its header. They are the - * constant string "libcore.io.DiskLruCache", the disk cache's version, - * the application's version, the value count, and a blank line. - * - * Each of the subsequent lines in the file is a record of the state of a - * cache entry. Each line contains space-separated values: a state, a key, - * and optional state-specific values. - * o DIRTY lines track that an entry is actively being created or updated. - * Every successful DIRTY action should be followed by a CLEAN or REMOVE - * action. DIRTY lines without a matching CLEAN or REMOVE indicate that - * temporary files may need to be deleted. - * o CLEAN lines track a cache entry that has been successfully published - * and may be read. A publish line is followed by the lengths of each of - * its values. - * o READ lines track accesses for LRU. - * o REMOVE lines track entries that have been deleted. - * - * The journal file is appended to as cache operations occur. The journal may - * occasionally be compacted by dropping redundant lines. A temporary file named - * "journal.tmp" will be used during compaction; that file should be deleted if - * it exists when the cache is opened. - */ - - private final File directory; - private final File journalFile; - private final File journalFileTmp; - private final File journalFileBackup; - private final int appVersion; - private long maxSize; - private final int valueCount; - private long size = 0; - private Writer journalWriter; - private final LinkedHashMap lruEntries = - new LinkedHashMap(0, 0.75f, true); - private int redundantOpCount; - - /** - * To differentiate between old and current snapshots, each entry is given - * a sequence number each time an edit is committed. A snapshot is stale if - * its sequence number is not equal to its entry's sequence number. - */ - private long nextSequenceNumber = 0; - - /** This cache uses a single background thread to evict entries. */ - final ThreadPoolExecutor executorService = - new ThreadPoolExecutor(0, 1, 60L, TimeUnit.SECONDS, new LinkedBlockingQueue()); - private final Callable cleanupCallable = new Callable() { - public Void call() throws Exception { - synchronized (DiskLruCache.this) { - if (journalWriter == null) { - return null; // Closed. - } - trimToSize(); - if (journalRebuildRequired()) { - rebuildJournal(); - redundantOpCount = 0; - } - } - return null; - } - }; - - private DiskLruCache(File directory, int appVersion, int valueCount, long maxSize) { - this.directory = directory; - this.appVersion = appVersion; - this.journalFile = new File(directory, JOURNAL_FILE); - this.journalFileTmp = new File(directory, JOURNAL_FILE_TEMP); - this.journalFileBackup = new File(directory, JOURNAL_FILE_BACKUP); - this.valueCount = valueCount; - this.maxSize = maxSize; - } - - /** - * Opens the cache in {@code directory}, creating a cache if none exists - * there. - * - * @param directory a writable directory - * @param valueCount the number of values per cache entry. Must be positive. - * @param maxSize the maximum number of bytes this cache should use to store - * @throws IOException if reading or writing the cache directory fails - */ - public static DiskLruCache open(File directory, int appVersion, int valueCount, long maxSize) - throws IOException { - if (maxSize <= 0) { - throw new IllegalArgumentException("maxSize <= 0"); - } - if (valueCount <= 0) { - throw new IllegalArgumentException("valueCount <= 0"); - } - - // If a bkp file exists, use it instead. - File backupFile = new File(directory, JOURNAL_FILE_BACKUP); - if (backupFile.exists()) { - File journalFile = new File(directory, JOURNAL_FILE); - // If journal file also exists just delete backup file. - if (journalFile.exists()) { - backupFile.delete(); - } else { - renameTo(backupFile, journalFile, false); - } - } - - // Prefer to pick up where we left off. - DiskLruCache cache = new DiskLruCache(directory, appVersion, valueCount, maxSize); - if (cache.journalFile.exists()) { - try { - cache.readJournal(); - cache.processJournal(); - cache.journalWriter = new BufferedWriter( - new OutputStreamWriter(new FileOutputStream(cache.journalFile, true), Util.US_ASCII)); - return cache; - } catch (IOException journalIsCorrupt) { - Platform.get().logW("DiskLruCache " + directory + " is corrupt: " - + journalIsCorrupt.getMessage() + ", removing"); - cache.delete(); - } - } - - // Create a new empty cache. - directory.mkdirs(); - cache = new DiskLruCache(directory, appVersion, valueCount, maxSize); - cache.rebuildJournal(); - return cache; - } - - private void readJournal() throws IOException { - StrictLineReader reader = new StrictLineReader(new FileInputStream(journalFile), Util.US_ASCII); - try { - String magic = reader.readLine(); - String version = reader.readLine(); - String appVersionString = reader.readLine(); - String valueCountString = reader.readLine(); - String blank = reader.readLine(); - if (!MAGIC.equals(magic) - || !VERSION_1.equals(version) - || !Integer.toString(appVersion).equals(appVersionString) - || !Integer.toString(valueCount).equals(valueCountString) - || !"".equals(blank)) { - throw new IOException("unexpected journal header: [" + magic + ", " + version + ", " - + valueCountString + ", " + blank + "]"); - } - - int lineCount = 0; - while (true) { - try { - readJournalLine(reader.readLine()); - lineCount++; - } catch (EOFException endOfJournal) { - break; - } - } - redundantOpCount = lineCount - lruEntries.size(); - } finally { - Util.closeQuietly(reader); - } - } - - private void readJournalLine(String line) throws IOException { - int firstSpace = line.indexOf(' '); - if (firstSpace == -1) { - throw new IOException("unexpected journal line: " + line); - } - - int keyBegin = firstSpace + 1; - int secondSpace = line.indexOf(' ', keyBegin); - final String key; - if (secondSpace == -1) { - key = line.substring(keyBegin); - if (firstSpace == REMOVE.length() && line.startsWith(REMOVE)) { - lruEntries.remove(key); - return; - } - } else { - key = line.substring(keyBegin, secondSpace); - } - - Entry entry = lruEntries.get(key); - if (entry == null) { - entry = new Entry(key); - lruEntries.put(key, entry); - } - - if (secondSpace != -1 && firstSpace == CLEAN.length() && line.startsWith(CLEAN)) { - String[] parts = line.substring(secondSpace + 1).split(" "); - entry.readable = true; - entry.currentEditor = null; - entry.setLengths(parts); - } else if (secondSpace == -1 && firstSpace == DIRTY.length() && line.startsWith(DIRTY)) { - entry.currentEditor = new Editor(entry); - } else if (secondSpace == -1 && firstSpace == READ.length() && line.startsWith(READ)) { - // This work was already done by calling lruEntries.get(). - } else { - throw new IOException("unexpected journal line: " + line); - } - } - - /** - * Computes the initial size and collects garbage as a part of opening the - * cache. Dirty entries are assumed to be inconsistent and will be deleted. - */ - private void processJournal() throws IOException { - deleteIfExists(journalFileTmp); - for (Iterator i = lruEntries.values().iterator(); i.hasNext(); ) { - Entry entry = i.next(); - if (entry.currentEditor == null) { - for (int t = 0; t < valueCount; t++) { - size += entry.lengths[t]; - } - } else { - entry.currentEditor = null; - for (int t = 0; t < valueCount; t++) { - deleteIfExists(entry.getCleanFile(t)); - deleteIfExists(entry.getDirtyFile(t)); - } - i.remove(); - } - } - } - - /** - * Creates a new journal that omits redundant information. This replaces the - * current journal if it exists. - */ - private synchronized void rebuildJournal() throws IOException { - if (journalWriter != null) { - journalWriter.close(); - } - - Writer writer = new BufferedWriter( - new OutputStreamWriter(new FileOutputStream(journalFileTmp), Util.US_ASCII)); - try { - writer.write(MAGIC); - writer.write("\n"); - writer.write(VERSION_1); - writer.write("\n"); - writer.write(Integer.toString(appVersion)); - writer.write("\n"); - writer.write(Integer.toString(valueCount)); - writer.write("\n"); - writer.write("\n"); - - for (Entry entry : lruEntries.values()) { - if (entry.currentEditor != null) { - writer.write(DIRTY + ' ' + entry.key + '\n'); - } else { - writer.write(CLEAN + ' ' + entry.key + entry.getLengths() + '\n'); - } - } - } finally { - writer.close(); - } - - if (journalFile.exists()) { - renameTo(journalFile, journalFileBackup, true); - } - renameTo(journalFileTmp, journalFile, false); - journalFileBackup.delete(); - - journalWriter = new BufferedWriter( - new OutputStreamWriter(new FileOutputStream(journalFile, true), Util.US_ASCII)); - } - - private static void deleteIfExists(File file) throws IOException { - if (file.exists() && !file.delete()) { - throw new IOException(); - } - } - - private static void renameTo(File from, File to, boolean deleteDestination) throws IOException { - if (deleteDestination) { - deleteIfExists(to); - } - if (!from.renameTo(to)) { - throw new IOException(); - } - } - - /** - * Returns a snapshot of the entry named {@code key}, or null if it doesn't - * exist is not currently readable. If a value is returned, it is moved to - * the head of the LRU queue. - */ - public synchronized Snapshot get(String key) throws IOException { - checkNotClosed(); - validateKey(key); - Entry entry = lruEntries.get(key); - if (entry == null) { - return null; - } - - if (!entry.readable) { - return null; - } - - // Open all streams eagerly to guarantee that we see a single published - // snapshot. If we opened streams lazily then the streams could come - // from different edits. - InputStream[] ins = new InputStream[valueCount]; - try { - for (int i = 0; i < valueCount; i++) { - ins[i] = new FileInputStream(entry.getCleanFile(i)); - } - } catch (FileNotFoundException e) { - // A file must have been deleted manually! - for (int i = 0; i < valueCount; i++) { - if (ins[i] != null) { - Util.closeQuietly(ins[i]); - } else { - break; - } - } - return null; - } - - redundantOpCount++; - journalWriter.append(READ + ' ' + key + '\n'); - if (journalRebuildRequired()) { - executorService.submit(cleanupCallable); - } - - return new Snapshot(key, entry.sequenceNumber, ins, entry.lengths); - } - - /** - * Returns an editor for the entry named {@code key}, or null if another - * edit is in progress. - */ - public Editor edit(String key) throws IOException { - return edit(key, ANY_SEQUENCE_NUMBER); - } - - private synchronized Editor edit(String key, long expectedSequenceNumber) throws IOException { - checkNotClosed(); - validateKey(key); - Entry entry = lruEntries.get(key); - if (expectedSequenceNumber != ANY_SEQUENCE_NUMBER && (entry == null - || entry.sequenceNumber != expectedSequenceNumber)) { - return null; // Snapshot is stale. - } - if (entry == null) { - entry = new Entry(key); - lruEntries.put(key, entry); - } else if (entry.currentEditor != null) { - return null; // Another edit is in progress. - } - - Editor editor = new Editor(entry); - entry.currentEditor = editor; - - // Flush the journal before creating files to prevent file leaks. - journalWriter.write(DIRTY + ' ' + key + '\n'); - journalWriter.flush(); - return editor; - } - - /** Returns the directory where this cache stores its data. */ - public File getDirectory() { - return directory; - } - - /** - * Returns the maximum number of bytes that this cache should use to store - * its data. - */ - public long getMaxSize() { - return maxSize; - } - - /** - * Changes the maximum number of bytes the cache can store and queues a job - * to trim the existing store, if necessary. - */ - public synchronized void setMaxSize(long maxSize) { - this.maxSize = maxSize; - executorService.submit(cleanupCallable); - } - - /** - * Returns the number of bytes currently being used to store the values in - * this cache. This may be greater than the max size if a background - * deletion is pending. - */ - public synchronized long size() { - return size; - } - - private synchronized void completeEdit(Editor editor, boolean success) throws IOException { - Entry entry = editor.entry; - if (entry.currentEditor != editor) { - throw new IllegalStateException(); - } - - // If this edit is creating the entry for the first time, every index must have a value. - if (success && !entry.readable) { - for (int i = 0; i < valueCount; i++) { - if (!editor.written[i]) { - editor.abort(); - throw new IllegalStateException("Newly created entry didn't create value for index " + i); - } - if (!entry.getDirtyFile(i).exists()) { - editor.abort(); - return; - } - } - } - - for (int i = 0; i < valueCount; i++) { - File dirty = entry.getDirtyFile(i); - if (success) { - if (dirty.exists()) { - File clean = entry.getCleanFile(i); - dirty.renameTo(clean); - long oldLength = entry.lengths[i]; - long newLength = clean.length(); - entry.lengths[i] = newLength; - size = size - oldLength + newLength; - } - } else { - deleteIfExists(dirty); - } - } - - redundantOpCount++; - entry.currentEditor = null; - if (entry.readable | success) { - entry.readable = true; - journalWriter.write(CLEAN + ' ' + entry.key + entry.getLengths() + '\n'); - if (success) { - entry.sequenceNumber = nextSequenceNumber++; - } - } else { - lruEntries.remove(entry.key); - journalWriter.write(REMOVE + ' ' + entry.key + '\n'); - } - journalWriter.flush(); - - if (size > maxSize || journalRebuildRequired()) { - executorService.submit(cleanupCallable); - } - } - - /** - * We only rebuild the journal when it will halve the size of the journal - * and eliminate at least 2000 ops. - */ - private boolean journalRebuildRequired() { - final int redundantOpCompactThreshold = 2000; - return redundantOpCount >= redundantOpCompactThreshold // - && redundantOpCount >= lruEntries.size(); - } - - /** - * Drops the entry for {@code key} if it exists and can be removed. Entries - * actively being edited cannot be removed. - * - * @return true if an entry was removed. - */ - public synchronized boolean remove(String key) throws IOException { - checkNotClosed(); - validateKey(key); - Entry entry = lruEntries.get(key); - if (entry == null || entry.currentEditor != null) { - return false; - } - - for (int i = 0; i < valueCount; i++) { - File file = entry.getCleanFile(i); - if (!file.delete()) { - throw new IOException("failed to delete " + file); - } - size -= entry.lengths[i]; - entry.lengths[i] = 0; - } - - redundantOpCount++; - journalWriter.append(REMOVE + ' ' + key + '\n'); - lruEntries.remove(key); - - if (journalRebuildRequired()) { - executorService.submit(cleanupCallable); - } - - return true; - } - - /** Returns true if this cache has been closed. */ - public boolean isClosed() { - return journalWriter == null; - } - - private void checkNotClosed() { - if (journalWriter == null) { - throw new IllegalStateException("cache is closed"); - } - } - - /** Force buffered operations to the filesystem. */ - public synchronized void flush() throws IOException { - checkNotClosed(); - trimToSize(); - journalWriter.flush(); - } - - /** Closes this cache. Stored values will remain on the filesystem. */ - public synchronized void close() throws IOException { - if (journalWriter == null) { - return; // Already closed. - } - for (Entry entry : new ArrayList(lruEntries.values())) { - if (entry.currentEditor != null) { - entry.currentEditor.abort(); - } - } - trimToSize(); - journalWriter.close(); - journalWriter = null; - } - - private void trimToSize() throws IOException { - while (size > maxSize) { - Map.Entry toEvict = lruEntries.entrySet().iterator().next(); - remove(toEvict.getKey()); - } - } - - /** - * Closes the cache and deletes all of its stored values. This will delete - * all files in the cache directory including files that weren't created by - * the cache. - */ - public void delete() throws IOException { - close(); - Util.deleteContents(directory); - } - - private void validateKey(String key) { - Matcher matcher = LEGAL_KEY_PATTERN.matcher(key); - if (!matcher.matches()) { - throw new IllegalArgumentException("keys must match regex [a-z0-9_-]{1,64}: \"" + key + "\""); - } - } - - private static String inputStreamToString(InputStream in) throws IOException { - return Util.readFully(new InputStreamReader(in, Util.UTF_8)); - } - - /** A snapshot of the values for an entry. */ - public final class Snapshot implements Closeable { - private final String key; - private final long sequenceNumber; - private final InputStream[] ins; - private final long[] lengths; - - private Snapshot(String key, long sequenceNumber, InputStream[] ins, long[] lengths) { - this.key = key; - this.sequenceNumber = sequenceNumber; - this.ins = ins; - this.lengths = lengths; - } - - /** - * Returns an editor for this snapshot's entry, or null if either the - * entry has changed since this snapshot was created or if another edit - * is in progress. - */ - public Editor edit() throws IOException { - return DiskLruCache.this.edit(key, sequenceNumber); - } - - /** Returns the unbuffered stream with the value for {@code index}. */ - public InputStream getInputStream(int index) { - return ins[index]; - } - - /** Returns the string value for {@code index}. */ - public String getString(int index) throws IOException { - return inputStreamToString(getInputStream(index)); - } - - /** Returns the byte length of the value for {@code index}. */ - public long getLength(int index) { - return lengths[index]; - } - - public void close() { - for (InputStream in : ins) { - Util.closeQuietly(in); - } - } - } - - private static final OutputStream NULL_OUTPUT_STREAM = new OutputStream() { - @Override - public void write(int b) throws IOException { - // Eat all writes silently. Nom nom. - } - }; - - /** Edits the values for an entry. */ - public final class Editor { - private final Entry entry; - private final boolean[] written; - private boolean hasErrors; - private boolean committed; - - private Editor(Entry entry) { - this.entry = entry; - this.written = (entry.readable) ? null : new boolean[valueCount]; - } - - /** - * Returns an unbuffered input stream to read the last committed value, - * or null if no value has been committed. - */ - public InputStream newInputStream(int index) throws IOException { - synchronized (DiskLruCache.this) { - if (entry.currentEditor != this) { - throw new IllegalStateException(); - } - if (!entry.readable) { - return null; - } - try { - return new FileInputStream(entry.getCleanFile(index)); - } catch (FileNotFoundException e) { - return null; - } - } - } - - /** - * Returns the last committed value as a string, or null if no value - * has been committed. - */ - public String getString(int index) throws IOException { - InputStream in = newInputStream(index); - return in != null ? inputStreamToString(in) : null; - } - - /** - * Returns a new unbuffered output stream to write the value at - * {@code index}. If the underlying output stream encounters errors - * when writing to the filesystem, this edit will be aborted when - * {@link #commit} is called. The returned output stream does not throw - * IOExceptions. - */ - public OutputStream newOutputStream(int index) throws IOException { - synchronized (DiskLruCache.this) { - if (entry.currentEditor != this) { - throw new IllegalStateException(); - } - if (!entry.readable) { - written[index] = true; - } - File dirtyFile = entry.getDirtyFile(index); - FileOutputStream outputStream; - try { - outputStream = new FileOutputStream(dirtyFile); - } catch (FileNotFoundException e) { - // Attempt to recreate the cache directory. - directory.mkdirs(); - try { - outputStream = new FileOutputStream(dirtyFile); - } catch (FileNotFoundException e2) { - // We are unable to recover. Silently eat the writes. - return NULL_OUTPUT_STREAM; - } - } - return new FaultHidingOutputStream(outputStream); - } - } - - /** Sets the value at {@code index} to {@code value}. */ - public void set(int index, String value) throws IOException { - Writer writer = null; - try { - writer = new OutputStreamWriter(newOutputStream(index), Util.UTF_8); - writer.write(value); - } finally { - Util.closeQuietly(writer); - } - } - - /** - * Commits this edit so it is visible to readers. This releases the - * edit lock so another edit may be started on the same key. - */ - public void commit() throws IOException { - if (hasErrors) { - completeEdit(this, false); - remove(entry.key); // The previous entry is stale. - } else { - completeEdit(this, true); - } - committed = true; - } - - /** - * Aborts this edit. This releases the edit lock so another edit may be - * started on the same key. - */ - public void abort() throws IOException { - completeEdit(this, false); - } - - public void abortUnlessCommitted() { - if (!committed) { - try { - abort(); - } catch (IOException ignored) { - } - } - } - - private class FaultHidingOutputStream extends FilterOutputStream { - private FaultHidingOutputStream(OutputStream out) { - super(out); - } - - @Override public void write(int oneByte) { - try { - out.write(oneByte); - } catch (IOException e) { - hasErrors = true; - } - } - - @Override public void write(byte[] buffer, int offset, int length) { - try { - out.write(buffer, offset, length); - } catch (IOException e) { - hasErrors = true; - } - } - - @Override public void close() { - try { - out.close(); - } catch (IOException e) { - hasErrors = true; - } - } - - @Override public void flush() { - try { - out.flush(); - } catch (IOException e) { - hasErrors = true; - } - } - } - } - - private final class Entry { - private final String key; - - /** Lengths of this entry's files. */ - private final long[] lengths; - - /** True if this entry has ever been published. */ - private boolean readable; - - /** The ongoing edit or null if this entry is not being edited. */ - private Editor currentEditor; - - /** The sequence number of the most recently committed edit to this entry. */ - private long sequenceNumber; - - private Entry(String key) { - this.key = key; - this.lengths = new long[valueCount]; - } - - public String getLengths() throws IOException { - StringBuilder result = new StringBuilder(); - for (long size : lengths) { - result.append(' ').append(size); - } - return result.toString(); - } - - /** Set lengths using decimal numbers like "10123". */ - private void setLengths(String[] strings) throws IOException { - if (strings.length != valueCount) { - throw invalidLengths(strings); - } - - try { - for (int i = 0; i < strings.length; i++) { - lengths[i] = Long.parseLong(strings[i]); - } - } catch (NumberFormatException e) { - throw invalidLengths(strings); - } - } - - private IOException invalidLengths(String[] strings) throws IOException { - throw new IOException("unexpected journal line: " + java.util.Arrays.toString(strings)); - } - - public File getCleanFile(int i) { - return new File(directory, key + "." + i); - } - - public File getDirtyFile(int i) { - return new File(directory, key + "." + i + ".tmp"); - } - } -} diff --git a/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/Dns.java b/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/Dns.java deleted file mode 100755 index 69b2d37..0000000 --- a/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/Dns.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright (C) 2012 Square, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.squareup.okhttp.internal; - -import java.net.InetAddress; -import java.net.UnknownHostException; - -/** - * Domain name service. Prefer this over {@link InetAddress#getAllByName} to - * make code more testable. - */ -public interface Dns { - Dns DEFAULT = new Dns() { - @Override public InetAddress[] getAllByName(String host) throws UnknownHostException { - return InetAddress.getAllByName(host); - } - }; - - InetAddress[] getAllByName(String host) throws UnknownHostException; -} diff --git a/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/FaultRecoveringOutputStream.java b/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/FaultRecoveringOutputStream.java deleted file mode 100755 index c32b27a..0000000 --- a/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/FaultRecoveringOutputStream.java +++ /dev/null @@ -1,163 +0,0 @@ -/* - * Copyright (C) 2013 Square, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.squareup.okhttp.internal; - -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.OutputStream; - -import static com.squareup.okhttp.internal.Util.checkOffsetAndCount; - -/** - * An output stream wrapper that recovers from failures in the underlying stream - * by replacing it with another stream. This class buffers a fixed amount of - * data under the assumption that failures occur early in a stream's life. - * If a failure occurs after the buffer has been exhausted, no recovery is - * attempted. - * - *

Subclasses must override {@link #replacementStream} which will request a - * replacement stream each time an {@link IOException} is encountered on the - * current stream. - */ -public abstract class FaultRecoveringOutputStream extends AbstractOutputStream { - private final int maxReplayBufferLength; - - /** Bytes to transmit on the replacement stream, or null if no recovery is possible. */ - private ByteArrayOutputStream replayBuffer; - private OutputStream out; - - /** - * @param maxReplayBufferLength the maximum number of successfully written - * bytes to buffer so they can be replayed in the event of an error. - * Failure recoveries are not possible once this limit has been exceeded. - */ - public FaultRecoveringOutputStream(int maxReplayBufferLength, OutputStream out) { - if (maxReplayBufferLength < 0) throw new IllegalArgumentException(); - this.maxReplayBufferLength = maxReplayBufferLength; - this.replayBuffer = new ByteArrayOutputStream(maxReplayBufferLength); - this.out = out; - } - - @Override public final void write(byte[] buffer, int offset, int count) throws IOException { - if (closed) throw new IOException("stream closed"); - checkOffsetAndCount(buffer.length, offset, count); - - while (true) { - try { - out.write(buffer, offset, count); - - if (replayBuffer != null) { - if (count + replayBuffer.size() > maxReplayBufferLength) { - // Failure recovery is no longer possible once we overflow the replay buffer. - replayBuffer = null; - } else { - // Remember the written bytes to the replay buffer. - replayBuffer.write(buffer, offset, count); - } - } - return; - } catch (IOException e) { - if (!recover(e)) throw e; - } - } - } - - @Override public final void flush() throws IOException { - if (closed) { - return; // don't throw; this stream might have been closed on the caller's behalf - } - while (true) { - try { - out.flush(); - return; - } catch (IOException e) { - if (!recover(e)) throw e; - } - } - } - - @Override public final void close() throws IOException { - if (closed) { - return; - } - while (true) { - try { - out.close(); - closed = true; - return; - } catch (IOException e) { - if (!recover(e)) throw e; - } - } - } - - /** - * Attempt to replace {@code out} with another equivalent stream. Returns true - * if a suitable replacement stream was found. - */ - private boolean recover(IOException e) { - if (replayBuffer == null) { - return false; // Can't recover because we've dropped data that we would need to replay. - } - - while (true) { - OutputStream replacementStream = null; - try { - replacementStream = replacementStream(e); - if (replacementStream == null) { - return false; - } - replaceStream(replacementStream); - return true; - } catch (IOException replacementStreamFailure) { - // The replacement was also broken. Loop to ask for another replacement. - Util.closeQuietly(replacementStream); - e = replacementStreamFailure; - } - } - } - - /** - * Returns true if errors in the underlying stream can currently be recovered. - */ - public boolean isRecoverable() { - return replayBuffer != null; - } - - /** - * Replaces the current output stream with {@code replacementStream}, writing - * any replay bytes to it if they exist. The current output stream is closed. - */ - public final void replaceStream(OutputStream replacementStream) throws IOException { - if (!isRecoverable()) { - throw new IllegalStateException(); - } - if (this.out == replacementStream) { - return; // Don't replace a stream with itself. - } - replayBuffer.writeTo(replacementStream); - Util.closeQuietly(out); - out = replacementStream; - } - - /** - * Returns a replacement output stream to recover from {@code e} thrown by the - * previous stream. Returns a new OutputStream if recovery was successful, in - * which case all previously-written data will be replayed. Returns null if - * the failure cannot be recovered. - */ - protected abstract OutputStream replacementStream(IOException e) throws IOException; -} diff --git a/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/NamedRunnable.java b/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/NamedRunnable.java deleted file mode 100755 index 992b2ae..0000000 --- a/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/NamedRunnable.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright (C) 2013 Square, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.squareup.okhttp.internal; - -/** - * Runnable implementation which always sets its thread name. - */ -public abstract class NamedRunnable implements Runnable { - private final String name; - - public NamedRunnable(String format, Object... args) { - this.name = String.format(format, args); - } - - @Override public final void run() { - String oldName = Thread.currentThread().getName(); - Thread.currentThread().setName(name); - try { - execute(); - } finally { - Thread.currentThread().setName(oldName); - } - } - - protected abstract void execute(); -} diff --git a/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/Platform.java b/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/Platform.java deleted file mode 100755 index d5884b1..0000000 --- a/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/Platform.java +++ /dev/null @@ -1,370 +0,0 @@ -/* - * Copyright (C) 2012 Square, Inc. - * Copyright (C) 2012 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.squareup.okhttp.internal; - -import java.io.IOException; -import java.io.OutputStream; -import java.io.UnsupportedEncodingException; -import java.lang.reflect.Constructor; -import java.lang.reflect.InvocationHandler; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.lang.reflect.Proxy; -import java.net.InetSocketAddress; -import java.net.Socket; -import java.net.SocketException; -import java.net.URI; -import java.net.URISyntaxException; -import java.net.URL; -import java.util.ArrayList; -import java.util.List; -import java.util.logging.Level; -import java.util.logging.Logger; -import java.util.zip.Deflater; -import java.util.zip.DeflaterOutputStream; -import javax.net.ssl.SSLSocket; - -/** - * Access to Platform-specific features necessary for SPDY and advanced TLS. - * - *

SPDY

- * SPDY requires a TLS extension called NPN (Next Protocol Negotiation) that's - * available in Android 4.1+ and OpenJDK 7+ (with the npn-boot extension). It - * also requires a recent version of {@code DeflaterOutputStream} that is - * public API in Java 7 and callable via reflection in Android 4.1+. - */ -public class Platform { - private static final Platform PLATFORM = findPlatform(); - - private Constructor deflaterConstructor; - - public static Platform get() { - return PLATFORM; - } - - /** Prefix used on custom headers. */ - public String getPrefix() { - return "OkHttp"; - } - - public void logW(String warning) { - System.out.println(warning); - } - - public void tagSocket(Socket socket) throws SocketException { - } - - public void untagSocket(Socket socket) throws SocketException { - } - - public URI toUriLenient(URL url) throws URISyntaxException { - return url.toURI(); // this isn't as good as the built-in toUriLenient - } - - /** - * Attempt a TLS connection with useful extensions enabled. This mode - * supports more features, but is less likely to be compatible with older - * HTTPS servers. - */ - public void enableTlsExtensions(SSLSocket socket, String uriHost) { - } - - /** - * Attempt a secure connection with basic functionality to maximize - * compatibility. Currently this uses SSL 3.0. - */ - public void supportTlsIntolerantServer(SSLSocket socket) { - socket.setEnabledProtocols(new String[] {"SSLv3"}); - } - - /** Returns the negotiated protocol, or null if no protocol was negotiated. */ - public byte[] getNpnSelectedProtocol(SSLSocket socket) { - return null; - } - - /** - * Sets client-supported protocols on a socket to send to a server. The - * protocols are only sent if the socket implementation supports NPN. - */ - public void setNpnProtocols(SSLSocket socket, byte[] npnProtocols) { - } - - public void connectSocket(Socket socket, InetSocketAddress address, - int connectTimeout) throws IOException { - socket.connect(address, connectTimeout); - } - - /** - * Returns a deflater output stream that supports SYNC_FLUSH for SPDY name - * value blocks. This throws an {@link UnsupportedOperationException} on - * Java 6 and earlier where there is no built-in API to do SYNC_FLUSH. - */ - public OutputStream newDeflaterOutputStream(OutputStream out, Deflater deflater, - boolean syncFlush) { - try { - Constructor constructor = deflaterConstructor; - if (constructor == null) { - constructor = deflaterConstructor = DeflaterOutputStream.class.getConstructor( - OutputStream.class, Deflater.class, boolean.class); - } - return constructor.newInstance(out, deflater, syncFlush); - } catch (NoSuchMethodException e) { - throw new UnsupportedOperationException("Cannot SPDY; no SYNC_FLUSH available"); - } catch (InvocationTargetException e) { - throw e.getCause() instanceof RuntimeException ? (RuntimeException) e.getCause() - : new RuntimeException(e.getCause()); - } catch (InstantiationException e) { - throw new RuntimeException(e); - } catch (IllegalAccessException e) { - throw new AssertionError(); - } - } - - /** Attempt to match the host runtime to a capable Platform implementation. */ - private static Platform findPlatform() { - // Attempt to find Android 2.3+ APIs. - Class openSslSocketClass; - Method setUseSessionTickets; - Method setHostname; - try { - try { - openSslSocketClass = Class.forName("com.android.org.conscrypt.OpenSSLSocketImpl"); - } catch (ClassNotFoundException ignored) { - // Older platform before being unbundled. - openSslSocketClass = Class.forName( - "org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl"); - } - - setUseSessionTickets = openSslSocketClass.getMethod("setUseSessionTickets", boolean.class); - setHostname = openSslSocketClass.getMethod("setHostname", String.class); - - // Attempt to find Android 4.1+ APIs. - try { - Method setNpnProtocols = openSslSocketClass.getMethod("setNpnProtocols", byte[].class); - Method getNpnSelectedProtocol = openSslSocketClass.getMethod("getNpnSelectedProtocol"); - return new Android41(openSslSocketClass, setUseSessionTickets, setHostname, - setNpnProtocols, getNpnSelectedProtocol); - } catch (NoSuchMethodException ignored) { - return new Android23(openSslSocketClass, setUseSessionTickets, setHostname); - } - } catch (ClassNotFoundException ignored) { - // This isn't an Android runtime. - } catch (NoSuchMethodException ignored) { - // This isn't Android 2.3 or better. - } - - // Attempt to find the Jetty's NPN extension for OpenJDK. - try { - String npnClassName = "org.eclipse.jetty.npn.NextProtoNego"; - Class nextProtoNegoClass = Class.forName(npnClassName); - Class providerClass = Class.forName(npnClassName + "$Provider"); - Class clientProviderClass = Class.forName(npnClassName + "$ClientProvider"); - Class serverProviderClass = Class.forName(npnClassName + "$ServerProvider"); - Method putMethod = nextProtoNegoClass.getMethod("put", SSLSocket.class, providerClass); - Method getMethod = nextProtoNegoClass.getMethod("get", SSLSocket.class); - return new JdkWithJettyNpnPlatform( - putMethod, getMethod, clientProviderClass, serverProviderClass); - } catch (ClassNotFoundException ignored) { - // NPN isn't on the classpath. - } catch (NoSuchMethodException ignored) { - // The NPN version isn't what we expect. - } - - return new Platform(); - } - - /** Android version 2.3 and newer support TLS session tickets and server name indication (SNI). */ - private static class Android23 extends Platform { - protected final Class openSslSocketClass; - private final Method setUseSessionTickets; - private final Method setHostname; - - private Android23( - Class openSslSocketClass, Method setUseSessionTickets, Method setHostname) { - this.openSslSocketClass = openSslSocketClass; - this.setUseSessionTickets = setUseSessionTickets; - this.setHostname = setHostname; - } - - @Override public void connectSocket(Socket socket, InetSocketAddress address, - int connectTimeout) throws IOException { - try { - socket.connect(address, connectTimeout); - } catch (SecurityException se) { - // Before android 4.3, socket.connect could throw a SecurityException - // if opening a socket resulted in an EACCES error. - IOException ioException = new IOException("Exception in connect"); - ioException.initCause(se); - throw ioException; - } - } - - @Override public void enableTlsExtensions(SSLSocket socket, String uriHost) { - super.enableTlsExtensions(socket, uriHost); - if (openSslSocketClass.isInstance(socket)) { - // This is Android: use reflection on OpenSslSocketImpl. - try { - setUseSessionTickets.invoke(socket, true); - setHostname.invoke(socket, uriHost); - } catch (InvocationTargetException e) { - throw new RuntimeException(e); - } catch (IllegalAccessException e) { - throw new AssertionError(e); - } - } - } - } - - /** Android version 4.1 and newer support NPN. */ - private static class Android41 extends Android23 { - private final Method setNpnProtocols; - private final Method getNpnSelectedProtocol; - - private Android41(Class openSslSocketClass, Method setUseSessionTickets, Method setHostname, - Method setNpnProtocols, Method getNpnSelectedProtocol) { - super(openSslSocketClass, setUseSessionTickets, setHostname); - this.setNpnProtocols = setNpnProtocols; - this.getNpnSelectedProtocol = getNpnSelectedProtocol; - } - - @Override public void setNpnProtocols(SSLSocket socket, byte[] npnProtocols) { - if (!openSslSocketClass.isInstance(socket)) { - return; - } - try { - setNpnProtocols.invoke(socket, new Object[] {npnProtocols}); - } catch (IllegalAccessException e) { - throw new AssertionError(e); - } catch (InvocationTargetException e) { - throw new RuntimeException(e); - } - } - - @Override public byte[] getNpnSelectedProtocol(SSLSocket socket) { - if (!openSslSocketClass.isInstance(socket)) { - return null; - } - try { - return (byte[]) getNpnSelectedProtocol.invoke(socket); - } catch (InvocationTargetException e) { - throw new RuntimeException(e); - } catch (IllegalAccessException e) { - throw new AssertionError(e); - } - } - } - - /** OpenJDK 7 plus {@code org.mortbay.jetty.npn/npn-boot} on the boot class path. */ - private static class JdkWithJettyNpnPlatform extends Platform { - private final Method getMethod; - private final Method putMethod; - private final Class clientProviderClass; - private final Class serverProviderClass; - - public JdkWithJettyNpnPlatform(Method putMethod, Method getMethod, Class clientProviderClass, - Class serverProviderClass) { - this.putMethod = putMethod; - this.getMethod = getMethod; - this.clientProviderClass = clientProviderClass; - this.serverProviderClass = serverProviderClass; - } - - @Override public void setNpnProtocols(SSLSocket socket, byte[] npnProtocols) { - try { - List strings = new ArrayList(); - for (int i = 0; i < npnProtocols.length; ) { - int length = npnProtocols[i++]; - strings.add(new String(npnProtocols, i, length, "US-ASCII")); - i += length; - } - Object provider = Proxy.newProxyInstance(Platform.class.getClassLoader(), - new Class[] {clientProviderClass, serverProviderClass}, - new JettyNpnProvider(strings)); - putMethod.invoke(null, socket, provider); - } catch (UnsupportedEncodingException e) { - throw new AssertionError(e); - } catch (InvocationTargetException e) { - throw new AssertionError(e); - } catch (IllegalAccessException e) { - throw new AssertionError(e); - } - } - - @Override public byte[] getNpnSelectedProtocol(SSLSocket socket) { - try { - JettyNpnProvider provider = - (JettyNpnProvider) Proxy.getInvocationHandler(getMethod.invoke(null, socket)); - if (!provider.unsupported && provider.selected == null) { - Logger logger = Logger.getLogger("com.squareup.okhttp.OkHttpClient"); - logger.log(Level.INFO, - "NPN callback dropped so SPDY is disabled. " + "Is npn-boot on the boot class path?"); - return null; - } - return provider.unsupported ? null : provider.selected.getBytes("US-ASCII"); - } catch (UnsupportedEncodingException e) { - throw new AssertionError(); - } catch (InvocationTargetException e) { - throw new AssertionError(); - } catch (IllegalAccessException e) { - throw new AssertionError(); - } - } - } - - /** - * Handle the methods of NextProtoNego's ClientProvider and ServerProvider - * without a compile-time dependency on those interfaces. - */ - private static class JettyNpnProvider implements InvocationHandler { - private final List protocols; - private boolean unsupported; - private String selected; - - public JettyNpnProvider(List protocols) { - this.protocols = protocols; - } - - @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { - String methodName = method.getName(); - Class returnType = method.getReturnType(); - if (args == null) { - args = Util.EMPTY_STRING_ARRAY; - } - if (methodName.equals("supports") && boolean.class == returnType) { - return true; - } else if (methodName.equals("unsupported") && void.class == returnType) { - this.unsupported = true; - return null; - } else if (methodName.equals("protocols") && args.length == 0) { - return protocols; - } else if (methodName.equals("selectProtocol") - && String.class == returnType - && args.length == 1 - && (args[0] == null || args[0] instanceof List)) { - // TODO: use OpenSSL's algorithm which uses both lists - List serverProtocols = (List) args[0]; - this.selected = protocols.get(0); - return selected; - } else if (methodName.equals("protocolSelected") && args.length == 1) { - this.selected = (String) args[0]; - return null; - } else { - return method.invoke(this, args); - } - } - } -} diff --git a/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/StrictLineReader.java b/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/StrictLineReader.java deleted file mode 100755 index 74af6fd..0000000 --- a/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/StrictLineReader.java +++ /dev/null @@ -1,207 +0,0 @@ -/* - * Copyright (C) 2012 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.squareup.okhttp.internal; - -import java.io.ByteArrayOutputStream; -import java.io.Closeable; -import java.io.EOFException; -import java.io.IOException; -import java.io.InputStream; -import java.io.UnsupportedEncodingException; -import java.nio.charset.Charset; - -/** - * Buffers input from an {@link InputStream} for reading lines. - * - *

This class is used for buffered reading of lines. For purposes of this class, a line ends with - * "\n" or "\r\n". End of input is reported by throwing {@code EOFException}. Unterminated line at - * end of input is invalid and will be ignored, the caller may use {@code hasUnterminatedLine()} - * to detect it after catching the {@code EOFException}. - * - *

This class is intended for reading input that strictly consists of lines, such as line-based - * cache entries or cache journal. Unlike the {@link java.io.BufferedReader} which in conjunction - * with {@link java.io.InputStreamReader} provides similar functionality, this class uses different - * end-of-input reporting and a more restrictive definition of a line. - * - *

This class supports only charsets that encode '\r' and '\n' as a single byte with value 13 - * and 10, respectively, and the representation of no other character contains these values. - * We currently check in constructor that the charset is one of US-ASCII, UTF-8 and ISO-8859-1. - * The default charset is US_ASCII. - */ -public class StrictLineReader implements Closeable { - private static final byte CR = (byte) '\r'; - private static final byte LF = (byte) '\n'; - - private final InputStream in; - private final Charset charset; - - /* - * Buffered data is stored in {@code buf}. As long as no exception occurs, 0 <= pos <= end - * and the data in the range [pos, end) is buffered for reading. At end of input, if there is - * an unterminated line, we set end == -1, otherwise end == pos. If the underlying - * {@code InputStream} throws an {@code IOException}, end may remain as either pos or -1. - */ - private byte[] buf; - private int pos; - private int end; - - /** - * Constructs a new {@code LineReader} with the specified charset and the default capacity. - * - * @param in the {@code InputStream} to read data from. - * @param charset the charset used to decode data. Only US-ASCII, UTF-8 and ISO-8859-1 are - * supported. - * @throws NullPointerException if {@code in} or {@code charset} is null. - * @throws IllegalArgumentException if the specified charset is not supported. - */ - public StrictLineReader(InputStream in, Charset charset) { - this(in, 8192, charset); - } - - /** - * Constructs a new {@code LineReader} with the specified capacity and charset. - * - * @param in the {@code InputStream} to read data from. - * @param capacity the capacity of the buffer. - * @param charset the charset used to decode data. Only US-ASCII, UTF-8 and ISO-8859-1 are - * supported. - * @throws NullPointerException if {@code in} or {@code charset} is null. - * @throws IllegalArgumentException if {@code capacity} is negative or zero - * or the specified charset is not supported. - */ - public StrictLineReader(InputStream in, int capacity, Charset charset) { - if (in == null || charset == null) { - throw new NullPointerException(); - } - if (capacity < 0) { - throw new IllegalArgumentException("capacity <= 0"); - } - if (!(charset.equals(Util.US_ASCII))) { - throw new IllegalArgumentException("Unsupported encoding"); - } - - this.in = in; - this.charset = charset; - buf = new byte[capacity]; - } - - /** - * Closes the reader by closing the underlying {@code InputStream} and - * marking this reader as closed. - * - * @throws IOException for errors when closing the underlying {@code InputStream}. - */ - public void close() throws IOException { - synchronized (in) { - if (buf != null) { - buf = null; - in.close(); - } - } - } - - /** - * Reads the next line. A line ends with {@code "\n"} or {@code "\r\n"}, - * this end of line marker is not included in the result. - * - * @return the next line from the input. - * @throws IOException for underlying {@code InputStream} errors. - * @throws EOFException for the end of source stream. - */ - public String readLine() throws IOException { - synchronized (in) { - if (buf == null) { - throw new IOException("LineReader is closed"); - } - - // Read more data if we are at the end of the buffered data. - // Though it's an error to read after an exception, we will let {@code fillBuf()} - // throw again if that happens; thus we need to handle end == -1 as well as end == pos. - if (pos >= end) { - fillBuf(); - } - // Try to find LF in the buffered data and return the line if successful. - for (int i = pos; i != end; ++i) { - if (buf[i] == LF) { - int lineEnd = (i != pos && buf[i - 1] == CR) ? i - 1 : i; - String res = new String(buf, pos, lineEnd - pos, charset.name()); - pos = i + 1; - return res; - } - } - - // Let's anticipate up to 80 characters on top of those already read. - ByteArrayOutputStream out = new ByteArrayOutputStream(end - pos + 80) { - @Override public String toString() { - int length = (count > 0 && buf[count - 1] == CR) ? count - 1 : count; - try { - return new String(buf, 0, length, charset.name()); - } catch (UnsupportedEncodingException e) { - throw new AssertionError(e); // Since we control the charset this will never happen. - } - } - }; - - while (true) { - out.write(buf, pos, end - pos); - // Mark unterminated line in case fillBuf throws EOFException or IOException. - end = -1; - fillBuf(); - // Try to find LF in the buffered data and return the line if successful. - for (int i = pos; i != end; ++i) { - if (buf[i] == LF) { - if (i != pos) { - out.write(buf, pos, i - pos); - } - pos = i + 1; - return out.toString(); - } - } - } - } - } - - /** - * Read an {@code int} from a line containing its decimal representation. - * - * @return the value of the {@code int} from the next line. - * @throws IOException for underlying {@code InputStream} errors or conversion error. - * @throws EOFException for the end of source stream. - */ - public int readInt() throws IOException { - String intString = readLine(); - try { - return Integer.parseInt(intString); - } catch (NumberFormatException e) { - throw new IOException("expected an int but was \"" + intString + "\""); - } - } - - /** - * Reads new input data into the buffer. Call only with pos == end or end == -1, - * depending on the desired outcome if the function throws. - */ - private void fillBuf() throws IOException { - int result = in.read(buf, 0, buf.length); - if (result == -1) { - throw new EOFException(); - } - pos = 0; - end = result; - } -} - diff --git a/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/Util.java b/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/Util.java deleted file mode 100755 index 9c5b008..0000000 --- a/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/Util.java +++ /dev/null @@ -1,394 +0,0 @@ -/* - * Copyright (C) 2012 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.squareup.okhttp.internal; - -import java.io.Closeable; -import java.io.EOFException; -import java.io.File; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.io.Reader; -import java.io.StringWriter; -import java.io.UnsupportedEncodingException; -import java.net.Socket; -import java.net.ServerSocket; -import java.net.URI; -import java.net.URL; -import java.nio.ByteOrder; -import java.nio.charset.Charset; -import java.security.MessageDigest; -import java.security.NoSuchAlgorithmException; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.concurrent.ThreadFactory; -import java.util.concurrent.atomic.AtomicReference; - -/** Junk drawer of utility methods. */ -public final class Util { - public static final byte[] EMPTY_BYTE_ARRAY = new byte[0]; - public static final String[] EMPTY_STRING_ARRAY = new String[0]; - - /** A cheap and type-safe constant for the ISO-8859-1 Charset. */ - public static final Charset ISO_8859_1 = Charset.forName("ISO-8859-1"); - - /** A cheap and type-safe constant for the US-ASCII Charset. */ - public static final Charset US_ASCII = Charset.forName("US-ASCII"); - - /** A cheap and type-safe constant for the UTF-8 Charset. */ - public static final Charset UTF_8 = Charset.forName("UTF-8"); - private static AtomicReference skipBuffer = new AtomicReference(); - - private static final char[] DIGITS = - { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' }; - - private Util() { - } - - public static int getEffectivePort(URI uri) { - return getEffectivePort(uri.getScheme(), uri.getPort()); - } - - public static int getEffectivePort(URL url) { - return getEffectivePort(url.getProtocol(), url.getPort()); - } - - private static int getEffectivePort(String scheme, int specifiedPort) { - return specifiedPort != -1 ? specifiedPort : getDefaultPort(scheme); - } - - public static int getDefaultPort(String scheme) { - if ("http".equalsIgnoreCase(scheme)) { - return 80; - } else if ("https".equalsIgnoreCase(scheme)) { - return 443; - } else { - return -1; - } - } - - public static void checkOffsetAndCount(int arrayLength, int offset, int count) { - if ((offset | count) < 0 || offset > arrayLength || arrayLength - offset < count) { - throw new ArrayIndexOutOfBoundsException(); - } - } - - public static void pokeInt(byte[] dst, int offset, int value, ByteOrder order) { - if (order == ByteOrder.BIG_ENDIAN) { - dst[offset++] = (byte) ((value >> 24) & 0xff); - dst[offset++] = (byte) ((value >> 16) & 0xff); - dst[offset++] = (byte) ((value >> 8) & 0xff); - dst[offset] = (byte) ((value >> 0) & 0xff); - } else { - dst[offset++] = (byte) ((value >> 0) & 0xff); - dst[offset++] = (byte) ((value >> 8) & 0xff); - dst[offset++] = (byte) ((value >> 16) & 0xff); - dst[offset] = (byte) ((value >> 24) & 0xff); - } - } - - /** Returns true if two possibly-null objects are equal. */ - public static boolean equal(Object a, Object b) { - return a == b || (a != null && a.equals(b)); - } - - /** - * Closes {@code closeable}, ignoring any checked exceptions. Does nothing - * if {@code closeable} is null. - */ - public static void closeQuietly(Closeable closeable) { - if (closeable != null) { - try { - closeable.close(); - } catch (RuntimeException rethrown) { - throw rethrown; - } catch (Exception ignored) { - } - } - } - - /** - * Closes {@code socket}, ignoring any checked exceptions. Does nothing if - * {@code socket} is null. - */ - public static void closeQuietly(Socket socket) { - if (socket != null) { - try { - socket.close(); - } catch (RuntimeException rethrown) { - throw rethrown; - } catch (Exception ignored) { - } - } - } - - /** - * Closes {@code serverSocket}, ignoring any checked exceptions. Does nothing if - * {@code serverSocket} is null. - */ - public static void closeQuietly(ServerSocket serverSocket) { - if (serverSocket != null) { - try { - serverSocket.close(); - } catch (RuntimeException rethrown) { - throw rethrown; - } catch (Exception ignored) { - } - } - } - - /** - * Closes {@code a} and {@code b}. If either close fails, this completes - * the other close and rethrows the first encountered exception. - */ - public static void closeAll(Closeable a, Closeable b) throws IOException { - Throwable thrown = null; - try { - a.close(); - } catch (Throwable e) { - thrown = e; - } - try { - b.close(); - } catch (Throwable e) { - if (thrown == null) thrown = e; - } - if (thrown == null) return; - if (thrown instanceof IOException) throw (IOException) thrown; - if (thrown instanceof RuntimeException) throw (RuntimeException) thrown; - if (thrown instanceof Error) throw (Error) thrown; - throw new AssertionError(thrown); - } - - /** - * Deletes the contents of {@code dir}. Throws an IOException if any file - * could not be deleted, or if {@code dir} is not a readable directory. - */ - public static void deleteContents(File dir) throws IOException { - File[] files = dir.listFiles(); - if (files == null) { - throw new IOException("not a readable directory: " + dir); - } - for (File file : files) { - if (file.isDirectory()) { - deleteContents(file); - } - if (!file.delete()) { - throw new IOException("failed to delete file: " + file); - } - } - } - - /** - * Implements InputStream.read(int) in terms of InputStream.read(byte[], int, int). - * InputStream assumes that you implement InputStream.read(int) and provides default - * implementations of the others, but often the opposite is more efficient. - */ - public static int readSingleByte(InputStream in) throws IOException { - byte[] buffer = new byte[1]; - int result = in.read(buffer, 0, 1); - return (result != -1) ? buffer[0] & 0xff : -1; - } - - /** - * Implements OutputStream.write(int) in terms of OutputStream.write(byte[], int, int). - * OutputStream assumes that you implement OutputStream.write(int) and provides default - * implementations of the others, but often the opposite is more efficient. - */ - public static void writeSingleByte(OutputStream out, int b) throws IOException { - byte[] buffer = new byte[1]; - buffer[0] = (byte) (b & 0xff); - out.write(buffer); - } - - /** - * Fills 'dst' with bytes from 'in', throwing EOFException if insufficient bytes are available. - */ - public static void readFully(InputStream in, byte[] dst) throws IOException { - readFully(in, dst, 0, dst.length); - } - - /** - * Reads exactly 'byteCount' bytes from 'in' (into 'dst' at offset 'offset'), and throws - * EOFException if insufficient bytes are available. - * - * Used to implement {@link java.io.DataInputStream#readFully(byte[], int, int)}. - */ - public static void readFully(InputStream in, byte[] dst, int offset, int byteCount) - throws IOException { - if (byteCount == 0) { - return; - } - if (in == null) { - throw new NullPointerException("in == null"); - } - if (dst == null) { - throw new NullPointerException("dst == null"); - } - checkOffsetAndCount(dst.length, offset, byteCount); - while (byteCount > 0) { - int bytesRead = in.read(dst, offset, byteCount); - if (bytesRead < 0) { - throw new EOFException(); - } - offset += bytesRead; - byteCount -= bytesRead; - } - } - - /** Returns the remainder of 'reader' as a string, closing it when done. */ - public static String readFully(Reader reader) throws IOException { - try { - StringWriter writer = new StringWriter(); - char[] buffer = new char[1024]; - int count; - while ((count = reader.read(buffer)) != -1) { - writer.write(buffer, 0, count); - } - return writer.toString(); - } finally { - reader.close(); - } - } - - public static void skipAll(InputStream in) throws IOException { - do { - in.skip(Long.MAX_VALUE); - } while (in.read() != -1); - } - - /** - * Call {@code in.read()} repeatedly until either the stream is exhausted or - * {@code byteCount} bytes have been read. - * - *

This method reuses the skip buffer but is careful to never use it at - * the same time that another stream is using it. Otherwise streams that use - * the caller's buffer for consistency checks like CRC could be clobbered by - * other threads. A thread-local buffer is also insufficient because some - * streams may call other streams in their skip() method, also clobbering the - * buffer. - */ - public static long skipByReading(InputStream in, long byteCount) throws IOException { - if (byteCount == 0) return 0L; - - // acquire the shared skip buffer. - byte[] buffer = skipBuffer.getAndSet(null); - if (buffer == null) { - buffer = new byte[4096]; - } - - long skipped = 0; - while (skipped < byteCount) { - int toRead = (int) Math.min(byteCount - skipped, buffer.length); - int read = in.read(buffer, 0, toRead); - if (read == -1) { - break; - } - skipped += read; - if (read < toRead) { - break; - } - } - - // release the shared skip buffer. - skipBuffer.set(buffer); - - return skipped; - } - - /** - * Copies all of the bytes from {@code in} to {@code out}. Neither stream is closed. - * Returns the total number of bytes transferred. - */ - public static int copy(InputStream in, OutputStream out) throws IOException { - int total = 0; - byte[] buffer = new byte[8192]; - int c; - while ((c = in.read(buffer)) != -1) { - total += c; - out.write(buffer, 0, c); - } - return total; - } - - /** - * Returns the ASCII characters up to but not including the next "\r\n", or - * "\n". - * - * @throws java.io.EOFException if the stream is exhausted before the next newline - * character. - */ - public static String readAsciiLine(InputStream in) throws IOException { - // TODO: support UTF-8 here instead - StringBuilder result = new StringBuilder(80); - while (true) { - int c = in.read(); - if (c == -1) { - throw new EOFException(); - } else if (c == '\n') { - break; - } - - result.append((char) c); - } - int length = result.length(); - if (length > 0 && result.charAt(length - 1) == '\r') { - result.setLength(length - 1); - } - return result.toString(); - } - - /** Returns a 32 character string containing a hash of {@code s}. */ - public static String hash(String s) { - try { - MessageDigest messageDigest = MessageDigest.getInstance("MD5"); - byte[] md5bytes = messageDigest.digest(s.getBytes("UTF-8")); - return bytesToHexString(md5bytes); - } catch (NoSuchAlgorithmException e) { - throw new AssertionError(e); - } catch (UnsupportedEncodingException e) { - throw new AssertionError(e); - } - } - - private static String bytesToHexString(byte[] bytes) { - char[] digits = DIGITS; - char[] buf = new char[bytes.length * 2]; - int c = 0; - for (byte b : bytes) { - buf[c++] = digits[(b >> 4) & 0xf]; - buf[c++] = digits[b & 0xf]; - } - return new String(buf); - } - - /** Returns an immutable copy of {@code list}. */ - public static List immutableList(List list) { - return Collections.unmodifiableList(new ArrayList(list)); - } - - public static ThreadFactory daemonThreadFactory(final String name) { - return new ThreadFactory() { - @Override public Thread newThread(Runnable runnable) { - Thread result = new Thread(runnable, name); - result.setDaemon(true); - return result; - } - }; - } -} diff --git a/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/http/AbstractHttpInputStream.java b/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/http/AbstractHttpInputStream.java deleted file mode 100755 index a5d39b3..0000000 --- a/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/http/AbstractHttpInputStream.java +++ /dev/null @@ -1,107 +0,0 @@ -/* - * Copyright (C) 2010 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.squareup.okhttp.internal.http; - -import com.squareup.okhttp.internal.Util; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.net.CacheRequest; - -/** - * An input stream for the body of an HTTP response. - * - *

Since a single socket's input stream may be used to read multiple HTTP - * responses from the same server, subclasses shouldn't close the socket stream. - * - *

A side effect of reading an HTTP response is that the response cache - * is populated. If the stream is closed early, that cache entry will be - * invalidated. - */ -abstract class AbstractHttpInputStream extends InputStream { - protected final InputStream in; - protected final HttpEngine httpEngine; - private final CacheRequest cacheRequest; - private final OutputStream cacheBody; - protected boolean closed; - - AbstractHttpInputStream(InputStream in, HttpEngine httpEngine, CacheRequest cacheRequest) - throws IOException { - this.in = in; - this.httpEngine = httpEngine; - - OutputStream cacheBody = cacheRequest != null ? cacheRequest.getBody() : null; - - // some apps return a null body; for compatibility we treat that like a null cache request - if (cacheBody == null) { - cacheRequest = null; - } - - this.cacheBody = cacheBody; - this.cacheRequest = cacheRequest; - } - - /** - * read() is implemented using read(byte[], int, int) so subclasses only - * need to override the latter. - */ - @Override public final int read() throws IOException { - return Util.readSingleByte(this); - } - - protected final void checkNotClosed() throws IOException { - if (closed) { - throw new IOException("stream closed"); - } - } - - protected final void cacheWrite(byte[] buffer, int offset, int count) throws IOException { - if (cacheBody != null) { - cacheBody.write(buffer, offset, count); - } - } - - /** - * Closes the cache entry and makes the socket available for reuse. This - * should be invoked when the end of the body has been reached. - */ - protected final void endOfInput() throws IOException { - if (cacheRequest != null) { - cacheBody.close(); - } - httpEngine.release(false); - } - - /** - * Calls abort on the cache entry and disconnects the socket. This - * should be invoked when the connection is closed unexpectedly to - * invalidate the cache entry and to prevent the HTTP connection from - * being reused. HTTP messages are sent in serial so whenever a message - * cannot be read to completion, subsequent messages cannot be read - * either and the connection must be discarded. - * - *

An earlier implementation skipped the remaining bytes, but this - * requires that the entire transfer be completed. If the intention was - * to cancel the transfer, closing the connection is the only solution. - */ - protected final void unexpectedEndOfInput() { - if (cacheRequest != null) { - cacheRequest.abort(); - } - httpEngine.release(true); - } -} diff --git a/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/http/HeaderParser.java b/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/http/HeaderParser.java deleted file mode 100755 index d5f0f4f..0000000 --- a/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/http/HeaderParser.java +++ /dev/null @@ -1,112 +0,0 @@ -/* - * Copyright (C) 2011 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.squareup.okhttp.internal.http; - -final class HeaderParser { - - public interface CacheControlHandler { - void handle(String directive, String parameter); - } - - /** Parse a comma-separated list of cache control header values. */ - public static void parseCacheControl(String value, CacheControlHandler handler) { - int pos = 0; - while (pos < value.length()) { - int tokenStart = pos; - pos = skipUntil(value, pos, "=,;"); - String directive = value.substring(tokenStart, pos).trim(); - - if (pos == value.length() || value.charAt(pos) == ',' || value.charAt(pos) == ';') { - pos++; // consume ',' or ';' (if necessary) - handler.handle(directive, null); - continue; - } - - pos++; // consume '=' - pos = skipWhitespace(value, pos); - - String parameter; - - // quoted string - if (pos < value.length() && value.charAt(pos) == '\"') { - pos++; // consume '"' open quote - int parameterStart = pos; - pos = skipUntil(value, pos, "\""); - parameter = value.substring(parameterStart, pos); - pos++; // consume '"' close quote (if necessary) - - // unquoted string - } else { - int parameterStart = pos; - pos = skipUntil(value, pos, ",;"); - parameter = value.substring(parameterStart, pos).trim(); - } - - handler.handle(directive, parameter); - } - } - - /** - * Returns the next index in {@code input} at or after {@code pos} that - * contains a character from {@code characters}. Returns the input length if - * none of the requested characters can be found. - */ - public static int skipUntil(String input, int pos, String characters) { - for (; pos < input.length(); pos++) { - if (characters.indexOf(input.charAt(pos)) != -1) { - break; - } - } - return pos; - } - - /** - * Returns the next non-whitespace character in {@code input} that is white - * space. Result is undefined if input contains newline characters. - */ - public static int skipWhitespace(String input, int pos) { - for (; pos < input.length(); pos++) { - char c = input.charAt(pos); - if (c != ' ' && c != '\t') { - break; - } - } - return pos; - } - - /** - * Returns {@code value} as a positive integer, or 0 if it is negative, or - * -1 if it cannot be parsed. - */ - public static int parseSeconds(String value) { - try { - long seconds = Long.parseLong(value); - if (seconds > Integer.MAX_VALUE) { - return Integer.MAX_VALUE; - } else if (seconds < 0) { - return 0; - } else { - return (int) seconds; - } - } catch (NumberFormatException e) { - return -1; - } - } - - private HeaderParser() { - } -} diff --git a/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/http/HttpAuthenticator.java b/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/http/HttpAuthenticator.java deleted file mode 100755 index 1ad3689..0000000 --- a/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/http/HttpAuthenticator.java +++ /dev/null @@ -1,166 +0,0 @@ -/* - * Copyright (C) 2012 Square, Inc. - * Copyright (C) 2011 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.squareup.okhttp.internal.http; - -import com.squareup.okhttp.OkAuthenticator; -import com.squareup.okhttp.OkAuthenticator.Challenge; -import java.io.IOException; -import java.net.Authenticator; -import java.net.InetAddress; -import java.net.InetSocketAddress; -import java.net.PasswordAuthentication; -import java.net.Proxy; -import java.net.URL; -import java.util.ArrayList; -import java.util.List; - -import static com.squareup.okhttp.OkAuthenticator.Credential; -import static java.net.HttpURLConnection.HTTP_PROXY_AUTH; -import static java.net.HttpURLConnection.HTTP_UNAUTHORIZED; - -/** Handles HTTP authentication headers from origin and proxy servers. */ -public final class HttpAuthenticator { - /** Uses the global authenticator to get the password. */ - public static final OkAuthenticator SYSTEM_DEFAULT = new OkAuthenticator() { - @Override public Credential authenticate( - Proxy proxy, URL url, List challenges) throws IOException { - for (Challenge challenge : challenges) { - if (!"Basic".equalsIgnoreCase(challenge.getScheme())) { - continue; - } - - PasswordAuthentication auth = Authenticator.requestPasswordAuthentication(url.getHost(), - getConnectToInetAddress(proxy, url), url.getPort(), url.getProtocol(), - challenge.getRealm(), challenge.getScheme(), url, Authenticator.RequestorType.SERVER); - if (auth != null) { - return Credential.basic(auth.getUserName(), new String(auth.getPassword())); - } - } - return null; - } - - @Override public Credential authenticateProxy( - Proxy proxy, URL url, List challenges) throws IOException { - for (Challenge challenge : challenges) { - if (!"Basic".equalsIgnoreCase(challenge.getScheme())) { - continue; - } - - InetSocketAddress proxyAddress = (InetSocketAddress) proxy.address(); - PasswordAuthentication auth = Authenticator.requestPasswordAuthentication( - proxyAddress.getHostName(), getConnectToInetAddress(proxy, url), proxyAddress.getPort(), - url.getProtocol(), challenge.getRealm(), challenge.getScheme(), url, - Authenticator.RequestorType.PROXY); - if (auth != null) { - return Credential.basic(auth.getUserName(), new String(auth.getPassword())); - } - } - return null; - } - - private InetAddress getConnectToInetAddress(Proxy proxy, URL url) throws IOException { - return (proxy != null && proxy.type() != Proxy.Type.DIRECT) - ? ((InetSocketAddress) proxy.address()).getAddress() - : InetAddress.getByName(url.getHost()); - } - }; - - private HttpAuthenticator() { - } - - /** - * React to a failed authorization response by looking up new credentials. - * - * @return true if credentials have been added to successorRequestHeaders - * and another request should be attempted. - */ - public static boolean processAuthHeader(OkAuthenticator authenticator, int responseCode, - RawHeaders responseHeaders, RawHeaders successorRequestHeaders, Proxy proxy, URL url) - throws IOException { - String responseField; - String requestField; - if (responseCode == HTTP_UNAUTHORIZED) { - responseField = "WWW-Authenticate"; - requestField = "Authorization"; - } else if (responseCode == HTTP_PROXY_AUTH) { - responseField = "Proxy-Authenticate"; - requestField = "Proxy-Authorization"; - } else { - throw new IllegalArgumentException(); // TODO: ProtocolException? - } - List challenges = parseChallenges(responseHeaders, responseField); - if (challenges.isEmpty()) { - return false; // Could not find a challenge so end the request cycle. - } - Credential credential = responseHeaders.getResponseCode() == HTTP_PROXY_AUTH - ? authenticator.authenticateProxy(proxy, url, challenges) - : authenticator.authenticate(proxy, url, challenges); - if (credential == null) { - return false; // Could not satisfy the challenge so end the request cycle. - } - // Add authorization credentials, bypassing the already-connected check. - successorRequestHeaders.set(requestField, credential.getHeaderValue()); - return true; - } - - /** - * Parse RFC 2617 challenges. This API is only interested in the scheme - * name and realm. - */ - private static List parseChallenges(RawHeaders responseHeaders, - String challengeHeader) { - // auth-scheme = token - // auth-param = token "=" ( token | quoted-string ) - // challenge = auth-scheme 1*SP 1#auth-param - // realm = "realm" "=" realm-value - // realm-value = quoted-string - List result = new ArrayList(); - for (int h = 0; h < responseHeaders.length(); h++) { - if (!challengeHeader.equalsIgnoreCase(responseHeaders.getFieldName(h))) { - continue; - } - String value = responseHeaders.getValue(h); - int pos = 0; - while (pos < value.length()) { - int tokenStart = pos; - pos = HeaderParser.skipUntil(value, pos, " "); - - String scheme = value.substring(tokenStart, pos).trim(); - pos = HeaderParser.skipWhitespace(value, pos); - - // TODO: This currently only handles schemes with a 'realm' parameter; - // It needs to be fixed to handle any scheme and any parameters - // http://code.google.com/p/android/issues/detail?id=11140 - - if (!value.regionMatches(true, pos, "realm=\"", 0, "realm=\"".length())) { - break; // Unexpected challenge parameter; give up! - } - - pos += "realm=\"".length(); - int realmStart = pos; - pos = HeaderParser.skipUntil(value, pos, "\""); - String realm = value.substring(realmStart, pos); - pos++; // Consume '"' close quote. - pos = HeaderParser.skipUntil(value, pos, ","); - pos++; // Consume ',' comma. - pos = HeaderParser.skipWhitespace(value, pos); - result.add(new Challenge(scheme, realm)); - } - } - return result; - } -} diff --git a/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/http/HttpDate.java b/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/http/HttpDate.java deleted file mode 100755 index b4d2c7c..0000000 --- a/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/http/HttpDate.java +++ /dev/null @@ -1,88 +0,0 @@ -/* - * Copyright (C) 2011 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.squareup.okhttp.internal.http; - -import java.text.DateFormat; -import java.text.ParseException; -import java.text.SimpleDateFormat; -import java.util.Date; -import java.util.Locale; -import java.util.TimeZone; - -/** - * Best-effort parser for HTTP dates. - */ -final class HttpDate { - - /** - * Most websites serve cookies in the blessed format. Eagerly create the parser to ensure such - * cookies are on the fast path. - */ - private static final ThreadLocal STANDARD_DATE_FORMAT = - new ThreadLocal() { - @Override protected DateFormat initialValue() { - DateFormat rfc1123 = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss zzz", Locale.US); - rfc1123.setTimeZone(TimeZone.getTimeZone("GMT")); - return rfc1123; - } - }; - - /** If we fail to parse a date in a non-standard format, try each of these formats in sequence. */ - private static final String[] BROWSER_COMPATIBLE_DATE_FORMAT_STRINGS = new String[] { - "EEEE, dd-MMM-yy HH:mm:ss zzz", // RFC 1036 - "EEE MMM d HH:mm:ss yyyy", // ANSI C asctime() - "EEE, dd-MMM-yyyy HH:mm:ss z", "EEE, dd-MMM-yyyy HH-mm-ss z", "EEE, dd MMM yy HH:mm:ss z", - "EEE dd-MMM-yyyy HH:mm:ss z", "EEE dd MMM yyyy HH:mm:ss z", "EEE dd-MMM-yyyy HH-mm-ss z", - "EEE dd-MMM-yy HH:mm:ss z", "EEE dd MMM yy HH:mm:ss z", "EEE,dd-MMM-yy HH:mm:ss z", - "EEE,dd-MMM-yyyy HH:mm:ss z", "EEE, dd-MM-yyyy HH:mm:ss z", - - /* RI bug 6641315 claims a cookie of this format was once served by www.yahoo.com */ - "EEE MMM d yyyy HH:mm:ss z", }; - - private static final DateFormat[] BROWSER_COMPATIBLE_DATE_FORMATS = - new DateFormat[BROWSER_COMPATIBLE_DATE_FORMAT_STRINGS.length]; - - /** Returns the date for {@code value}. Returns null if the value couldn't be parsed. */ - public static Date parse(String value) { - try { - return STANDARD_DATE_FORMAT.get().parse(value); - } catch (ParseException ignored) { - } - synchronized (BROWSER_COMPATIBLE_DATE_FORMAT_STRINGS) { - for (int i = 0, count = BROWSER_COMPATIBLE_DATE_FORMAT_STRINGS.length; i < count; i++) { - DateFormat format = BROWSER_COMPATIBLE_DATE_FORMATS[i]; - if (format == null) { - format = new SimpleDateFormat(BROWSER_COMPATIBLE_DATE_FORMAT_STRINGS[i], Locale.US); - BROWSER_COMPATIBLE_DATE_FORMATS[i] = format; - } - try { - return format.parse(value); - } catch (ParseException ignored) { - } - } - } - return null; - } - - /** Returns the string for {@code value}. */ - public static String format(Date value) { - return STANDARD_DATE_FORMAT.get().format(value); - } - - private HttpDate() { - } -} diff --git a/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/http/HttpEngine.java b/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/http/HttpEngine.java deleted file mode 100755 index 4a2dad4..0000000 --- a/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/http/HttpEngine.java +++ /dev/null @@ -1,686 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.squareup.okhttp.internal.http; - -import com.squareup.okhttp.Address; -import com.squareup.okhttp.Connection; -import com.squareup.okhttp.OkHttpClient; -import com.squareup.okhttp.OkResponseCache; -import com.squareup.okhttp.ResponseSource; -import com.squareup.okhttp.TunnelRequest; -import com.squareup.okhttp.internal.Dns; -import com.squareup.okhttp.internal.Platform; -import com.squareup.okhttp.internal.Util; -import java.io.ByteArrayInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.net.CacheRequest; -import java.net.CacheResponse; -import java.net.CookieHandler; -import java.net.HttpURLConnection; -import java.net.Proxy; -import java.net.URI; -import java.net.URISyntaxException; -import java.net.URL; -import java.net.UnknownHostException; -import java.util.Collections; -import java.util.Date; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.zip.GZIPInputStream; -import javax.net.ssl.HostnameVerifier; -import javax.net.ssl.SSLSocketFactory; - -import static com.squareup.okhttp.internal.Util.EMPTY_BYTE_ARRAY; -import static com.squareup.okhttp.internal.Util.getDefaultPort; -import static com.squareup.okhttp.internal.Util.getEffectivePort; - -/** - * Handles a single HTTP request/response pair. Each HTTP engine follows this - * lifecycle: - *

    - *
  1. It is created. - *
  2. The HTTP request message is sent with sendRequest(). Once the request - * is sent it is an error to modify the request headers. After - * sendRequest() has been called the request body can be written to if - * it exists. - *
  3. The HTTP response message is read with readResponse(). After the - * response has been read the response headers and body can be read. - * All responses have a response body input stream, though in some - * instances this stream is empty. - *
- * - *

The request and response may be served by the HTTP response cache, by the - * network, or by both in the event of a conditional GET. - * - *

This class may hold a socket connection that needs to be released or - * recycled. By default, this socket connection is held when the last byte of - * the response is consumed. To release the connection when it is no longer - * required, use {@link #automaticallyReleaseConnectionToPool()}. - */ -public class HttpEngine { - private static final CacheResponse GATEWAY_TIMEOUT_RESPONSE = new CacheResponse() { - @Override public Map> getHeaders() throws IOException { - Map> result = new HashMap>(); - result.put(null, Collections.singletonList("HTTP/1.1 504 Gateway Timeout")); - return result; - } - @Override public InputStream getBody() throws IOException { - return new ByteArrayInputStream(EMPTY_BYTE_ARRAY); - } - }; - public static final int HTTP_CONTINUE = 100; - - protected final Policy policy; - protected final OkHttpClient client; - - protected final String method; - - private ResponseSource responseSource; - - protected Connection connection; - protected RouteSelector routeSelector; - private OutputStream requestBodyOut; - - private Transport transport; - - private InputStream responseTransferIn; - private InputStream responseBodyIn; - - private CacheResponse cacheResponse; - private CacheRequest cacheRequest; - - /** The time when the request headers were written, or -1 if they haven't been written yet. */ - long sentRequestMillis = -1; - - /** Whether the connection has been established. */ - boolean connected; - - /** - * True if this client added an "Accept-Encoding: gzip" header field and is - * therefore responsible for also decompressing the transfer stream. - */ - private boolean transparentGzip; - - final URI uri; - - final RequestHeaders requestHeaders; - - /** Null until a response is received from the network or the cache. */ - ResponseHeaders responseHeaders; - - // The cache response currently being validated on a conditional get. Null - // if the cached response doesn't exist or doesn't need validation. If the - // conditional get succeeds, these will be used for the response headers and - // body. If it fails, these be closed and set to null. - private ResponseHeaders cachedResponseHeaders; - private InputStream cachedResponseBody; - - /** - * True if the socket connection should be released to the connection pool - * when the response has been fully read. - */ - private boolean automaticallyReleaseConnectionToPool; - - /** True if the socket connection is no longer needed by this engine. */ - private boolean connectionReleased; - - /** - * @param requestHeaders the client's supplied request headers. This class - * creates a private copy that it can mutate. - * @param connection the connection used for an intermediate response - * immediately prior to this request/response pair, such as a same-host - * redirect. This engine assumes ownership of the connection and must - * release it when it is unneeded. - */ - public HttpEngine(OkHttpClient client, Policy policy, String method, RawHeaders requestHeaders, - Connection connection, RetryableOutputStream requestBodyOut) throws IOException { - this.client = client; - this.policy = policy; - this.method = method; - this.connection = connection; - this.requestBodyOut = requestBodyOut; - - try { - uri = Platform.get().toUriLenient(policy.getURL()); - } catch (URISyntaxException e) { - throw new IOException(e.getMessage()); - } - - this.requestHeaders = new RequestHeaders(uri, new RawHeaders(requestHeaders)); - } - - public URI getUri() { - return uri; - } - - /** - * Figures out what the response source will be, and opens a socket to that - * source if necessary. Prepares the request headers and gets ready to start - * writing the request body if it exists. - */ - public final void sendRequest() throws IOException { - if (responseSource != null) { - return; - } - - prepareRawRequestHeaders(); - initResponseSource(); - OkResponseCache responseCache = client.getOkResponseCache(); - if (responseCache != null) { - responseCache.trackResponse(responseSource); - } - - // The raw response source may require the network, but the request - // headers may forbid network use. In that case, dispose of the network - // response and use a GATEWAY_TIMEOUT response instead, as specified - // by http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9.4. - if (requestHeaders.isOnlyIfCached() && responseSource.requiresConnection()) { - if (responseSource == ResponseSource.CONDITIONAL_CACHE) { - Util.closeQuietly(cachedResponseBody); - } - this.responseSource = ResponseSource.CACHE; - this.cacheResponse = GATEWAY_TIMEOUT_RESPONSE; - RawHeaders rawResponseHeaders = RawHeaders.fromMultimap(cacheResponse.getHeaders(), true); - setResponse(new ResponseHeaders(uri, rawResponseHeaders), cacheResponse.getBody()); - } - - if (responseSource.requiresConnection()) { - sendSocketRequest(); - } else if (connection != null) { - client.getConnectionPool().recycle(connection); - connection = null; - } - } - - /** - * Initialize the source for this response. It may be corrected later if the - * request headers forbids network use. - */ - private void initResponseSource() throws IOException { - responseSource = ResponseSource.NETWORK; - if (!policy.getUseCaches()) return; - - OkResponseCache responseCache = client.getOkResponseCache(); - if (responseCache == null) return; - - CacheResponse candidate = responseCache.get( - uri, method, requestHeaders.getHeaders().toMultimap(false)); - if (candidate == null) return; - - Map> responseHeadersMap = candidate.getHeaders(); - cachedResponseBody = candidate.getBody(); - if (!acceptCacheResponseType(candidate) - || responseHeadersMap == null - || cachedResponseBody == null) { - Util.closeQuietly(cachedResponseBody); - return; - } - - RawHeaders rawResponseHeaders = RawHeaders.fromMultimap(responseHeadersMap, true); - cachedResponseHeaders = new ResponseHeaders(uri, rawResponseHeaders); - long now = System.currentTimeMillis(); - this.responseSource = cachedResponseHeaders.chooseResponseSource(now, requestHeaders); - if (responseSource == ResponseSource.CACHE) { - this.cacheResponse = candidate; - setResponse(cachedResponseHeaders, cachedResponseBody); - } else if (responseSource == ResponseSource.CONDITIONAL_CACHE) { - this.cacheResponse = candidate; - } else if (responseSource == ResponseSource.NETWORK) { - Util.closeQuietly(cachedResponseBody); - } else { - throw new AssertionError(); - } - } - - private void sendSocketRequest() throws IOException { - if (connection == null) { - connect(); - } - - if (transport != null) { - throw new IllegalStateException(); - } - - transport = (Transport) connection.newTransport(this); - - if (hasRequestBody() && requestBodyOut == null) { - // Create a request body if we don't have one already. We'll already - // have one if we're retrying a failed POST. - requestBodyOut = transport.createRequestBody(); - } - } - - /** Connect to the origin server either directly or via a proxy. */ - protected final void connect() throws IOException { - if (connection != null) { - return; - } - if (routeSelector == null) { - String uriHost = uri.getHost(); - if (uriHost == null) { - throw new UnknownHostException(uri.toString()); - } - SSLSocketFactory sslSocketFactory = null; - HostnameVerifier hostnameVerifier = null; - if (uri.getScheme().equalsIgnoreCase("https")) { - sslSocketFactory = client.getSslSocketFactory(); - hostnameVerifier = client.getHostnameVerifier(); - } - Address address = new Address(uriHost, getEffectivePort(uri), sslSocketFactory, - hostnameVerifier, client.getAuthenticator(), client.getProxy(), client.getTransports()); - routeSelector = new RouteSelector(address, uri, client.getProxySelector(), - client.getConnectionPool(), Dns.DEFAULT, client.getRoutesDatabase()); - } - connection = routeSelector.next(method); - if (!connection.isConnected()) { - connection.connect(client.getConnectTimeout(), client.getReadTimeout(), getTunnelConfig()); - client.getConnectionPool().maybeShare(connection); - client.getRoutesDatabase().connected(connection.getRoute()); - } else if (!connection.isSpdy()) { - connection.updateReadTimeout(client.getReadTimeout()); - } - connected(connection); - if (connection.getRoute().getProxy() != client.getProxy()) { - // Update the request line if the proxy changed; it may need a host name. - requestHeaders.getHeaders().setRequestLine(getRequestLine()); - } - } - - /** - * Called after a socket connection has been created or retrieved from the - * pool. Subclasses use this hook to get a reference to the TLS data. - */ - protected void connected(Connection connection) { - policy.setSelectedProxy(connection.getRoute().getProxy()); - connected = true; - } - - /** - * Called immediately before the transport transmits HTTP request headers. - * This is used to observe the sent time should the request be cached. - */ - public void writingRequestHeaders() { - if (sentRequestMillis != -1) { - throw new IllegalStateException(); - } - sentRequestMillis = System.currentTimeMillis(); - } - - /** - * @param body the response body, or null if it doesn't exist or isn't - * available. - */ - private void setResponse(ResponseHeaders headers, InputStream body) throws IOException { - if (this.responseBodyIn != null) { - throw new IllegalStateException(); - } - this.responseHeaders = headers; - if (body != null) { - initContentStream(body); - } - } - - boolean hasRequestBody() { - return method.equals("POST") || method.equals("PUT") || method.equals("PATCH"); - } - - /** Returns the request body or null if this request doesn't have a body. */ - public final OutputStream getRequestBody() { - if (responseSource == null) { - throw new IllegalStateException(); - } - return requestBodyOut; - } - - public final boolean hasResponse() { - return responseHeaders != null; - } - - public final RequestHeaders getRequestHeaders() { - return requestHeaders; - } - - public final ResponseHeaders getResponseHeaders() { - if (responseHeaders == null) { - throw new IllegalStateException(); - } - return responseHeaders; - } - - public final int getResponseCode() { - if (responseHeaders == null) { - throw new IllegalStateException(); - } - return responseHeaders.getHeaders().getResponseCode(); - } - - public final InputStream getResponseBody() { - if (responseHeaders == null) { - throw new IllegalStateException(); - } - return responseBodyIn; - } - - public final CacheResponse getCacheResponse() { - return cacheResponse; - } - - public final Connection getConnection() { - return connection; - } - - /** - * Returns true if {@code cacheResponse} is of the right type. This - * condition is necessary but not sufficient for the cached response to - * be used. - */ - protected boolean acceptCacheResponseType(CacheResponse cacheResponse) { - return true; - } - - private void maybeCache() throws IOException { - // Are we caching at all? - if (!policy.getUseCaches()) return; - OkResponseCache responseCache = client.getOkResponseCache(); - if (responseCache == null) return; - - HttpURLConnection connectionToCache = policy.getHttpConnectionToCache(); - - // Should we cache this response for this request? - if (!responseHeaders.isCacheable(requestHeaders)) { - responseCache.maybeRemove(connectionToCache.getRequestMethod(), uri); - return; - } - - // Offer this request to the cache. - cacheRequest = responseCache.put(uri, connectionToCache); - } - - /** - * Cause the socket connection to be released to the connection pool when - * it is no longer needed. If it is already unneeded, it will be pooled - * immediately. Otherwise the connection is held so that redirects can be - * handled by the same connection. - */ - public final void automaticallyReleaseConnectionToPool() { - automaticallyReleaseConnectionToPool = true; - if (connection != null && connectionReleased) { - client.getConnectionPool().recycle(connection); - connection = null; - } - } - - /** - * Releases this engine so that its resources may be either reused or - * closed. Also call {@link #automaticallyReleaseConnectionToPool} unless - * the connection will be used to follow a redirect. - */ - public final void release(boolean streamCanceled) { - // If the response body comes from the cache, close it. - if (responseBodyIn == cachedResponseBody) { - Util.closeQuietly(responseBodyIn); - } - - if (!connectionReleased && connection != null) { - connectionReleased = true; - - if (transport == null - || !transport.makeReusable(streamCanceled, requestBodyOut, responseTransferIn)) { - Util.closeQuietly(connection); - connection = null; - } else if (automaticallyReleaseConnectionToPool) { - client.getConnectionPool().recycle(connection); - connection = null; - } - } - } - - private void initContentStream(InputStream transferStream) throws IOException { - responseTransferIn = transferStream; - if (transparentGzip && responseHeaders.isContentEncodingGzip()) { - // If the response was transparently gzipped, remove the gzip header field - // so clients don't double decompress. http://b/3009828 - // - // Also remove the Content-Length in this case because it contains the - // length 528 of the gzipped response. This isn't terribly useful and is - // dangerous because 529 clients can query the content length, but not - // the content encoding. - responseHeaders.stripContentEncoding(); - responseHeaders.stripContentLength(); - responseBodyIn = new GZIPInputStream(transferStream); - } else { - responseBodyIn = transferStream; - } - } - - /** - * Returns true if the response must have a (possibly 0-length) body. - * See RFC 2616 section 4.3. - */ - public final boolean hasResponseBody() { - int responseCode = responseHeaders.getHeaders().getResponseCode(); - - // HEAD requests never yield a body regardless of the response headers. - if (method.equals("HEAD")) { - return false; - } - - if ((responseCode < HTTP_CONTINUE || responseCode >= 200) - && responseCode != HttpURLConnectionImpl.HTTP_NO_CONTENT - && responseCode != HttpURLConnectionImpl.HTTP_NOT_MODIFIED) { - return true; - } - - // If the Content-Length or Transfer-Encoding headers disagree with the - // response code, the response is malformed. For best compatibility, we - // honor the headers. - if (responseHeaders.getContentLength() != -1 || responseHeaders.isChunked()) { - return true; - } - - return false; - } - - /** - * Populates requestHeaders with defaults and cookies. - * - *

This client doesn't specify a default {@code Accept} header because it - * doesn't know what content types the application is interested in. - */ - private void prepareRawRequestHeaders() throws IOException { - requestHeaders.getHeaders().setRequestLine(getRequestLine()); - - if (requestHeaders.getUserAgent() == null) { - requestHeaders.setUserAgent(getDefaultUserAgent()); - } - - if (requestHeaders.getHost() == null) { - requestHeaders.setHost(getOriginAddress(policy.getURL())); - } - - if ((connection == null || connection.getHttpMinorVersion() != 0) - && requestHeaders.getConnection() == null) { - requestHeaders.setConnection("Keep-Alive"); - } - - if (requestHeaders.getAcceptEncoding() == null) { - transparentGzip = true; - requestHeaders.setAcceptEncoding("gzip"); - } - - if (hasRequestBody() && requestHeaders.getContentType() == null) { - requestHeaders.setContentType("application/x-www-form-urlencoded"); - } - - long ifModifiedSince = policy.getIfModifiedSince(); - if (ifModifiedSince != 0) { - requestHeaders.setIfModifiedSince(new Date(ifModifiedSince)); - } - - CookieHandler cookieHandler = client.getCookieHandler(); - if (cookieHandler != null) { - requestHeaders.addCookies( - cookieHandler.get(uri, requestHeaders.getHeaders().toMultimap(false))); - } - } - - /** - * Returns the request status line, like "GET / HTTP/1.1". This is exposed - * to the application by {@link HttpURLConnectionImpl#getHeaderFields}, so - * it needs to be set even if the transport is SPDY. - */ - String getRequestLine() { - String protocol = - (connection == null || connection.getHttpMinorVersion() != 0) ? "HTTP/1.1" : "HTTP/1.0"; - return method + " " + requestString() + " " + protocol; - } - - private String requestString() { - URL url = policy.getURL(); - if (includeAuthorityInRequestLine()) { - return url.toString(); - } else { - return requestPath(url); - } - } - - /** - * Returns the path to request, like the '/' in 'GET / HTTP/1.1'. Never - * empty, even if the request URL is. Includes the query component if it - * exists. - */ - public static String requestPath(URL url) { - String fileOnly = url.getFile(); - if (fileOnly == null) { - return "/"; - } else if (!fileOnly.startsWith("/")) { - return "/" + fileOnly; - } else { - return fileOnly; - } - } - - /** - * Returns true if the request line should contain the full URL with host - * and port (like "GET http://android.com/foo HTTP/1.1") or only the path - * (like "GET /foo HTTP/1.1"). - * - *

This is non-final because for HTTPS it's never necessary to supply the - * full URL, even if a proxy is in use. - */ - protected boolean includeAuthorityInRequestLine() { - return connection == null - ? policy.usingProxy() // A proxy was requested. - : connection.getRoute().getProxy().type() == Proxy.Type.HTTP; // A proxy was selected. - } - - public static String getDefaultUserAgent() { - String agent = System.getProperty("http.agent"); - return agent != null ? agent : ("Java" + System.getProperty("java.version")); - } - - public static String getOriginAddress(URL url) { - int port = url.getPort(); - String result = url.getHost(); - if (port > 0 && port != getDefaultPort(url.getProtocol())) { - result = result + ":" + port; - } - return result; - } - - /** - * Flushes the remaining request header and body, parses the HTTP response - * headers and starts reading the HTTP response body if it exists. - */ - public final void readResponse() throws IOException { - if (hasResponse()) { - responseHeaders.setResponseSource(responseSource); - return; - } - - if (responseSource == null) { - throw new IllegalStateException("readResponse() without sendRequest()"); - } - - if (!responseSource.requiresConnection()) { - return; - } - - if (sentRequestMillis == -1) { - if (requestBodyOut instanceof RetryableOutputStream) { - int contentLength = ((RetryableOutputStream) requestBodyOut).contentLength(); - requestHeaders.setContentLength(contentLength); - } - transport.writeRequestHeaders(); - } - - if (requestBodyOut != null) { - requestBodyOut.close(); - if (requestBodyOut instanceof RetryableOutputStream) { - transport.writeRequestBody((RetryableOutputStream) requestBodyOut); - } - } - - transport.flushRequest(); - - responseHeaders = transport.readResponseHeaders(); - responseHeaders.setLocalTimestamps(sentRequestMillis, System.currentTimeMillis()); - responseHeaders.setResponseSource(responseSource); - - if (responseSource == ResponseSource.CONDITIONAL_CACHE) { - if (cachedResponseHeaders.validate(responseHeaders)) { - release(false); - ResponseHeaders combinedHeaders = cachedResponseHeaders.combine(responseHeaders); - this.responseHeaders = combinedHeaders; - - // Update the cache after applying the combined headers but before initializing the content - // stream, otherwise the Content-Encoding header (if present) will be stripped from the - // combined headers and not end up in the cache file if transparent gzip compression is - // turned on. - OkResponseCache responseCache = client.getOkResponseCache(); - responseCache.trackConditionalCacheHit(); - responseCache.update(cacheResponse, policy.getHttpConnectionToCache()); - - initContentStream(cachedResponseBody); - return; - } else { - Util.closeQuietly(cachedResponseBody); - } - } - - if (hasResponseBody()) { - maybeCache(); // reentrant. this calls into user code which may call back into this! - } - - initContentStream(transport.getTransferStream(cacheRequest)); - } - - protected TunnelRequest getTunnelConfig() { - return null; - } - - public void receiveHeaders(RawHeaders headers) throws IOException { - CookieHandler cookieHandler = client.getCookieHandler(); - if (cookieHandler != null) { - cookieHandler.put(uri, headers.toMultimap(true)); - } - } -} diff --git a/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/http/HttpTransport.java b/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/http/HttpTransport.java deleted file mode 100755 index c967830..0000000 --- a/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/http/HttpTransport.java +++ /dev/null @@ -1,497 +0,0 @@ -/* - * Copyright (C) 2012 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.squareup.okhttp.internal.http; - -import com.squareup.okhttp.Connection; -import com.squareup.okhttp.internal.AbstractOutputStream; -import com.squareup.okhttp.internal.Util; -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.net.CacheRequest; -import java.net.ProtocolException; -import java.net.Socket; - -import static com.squareup.okhttp.internal.Util.checkOffsetAndCount; - -public final class HttpTransport implements Transport { - /** - * The timeout to use while discarding a stream of input data. Since this is - * used for connection reuse, this timeout should be significantly less than - * the time it takes to establish a new connection. - */ - private static final int DISCARD_STREAM_TIMEOUT_MILLIS = 100; - - public static final int DEFAULT_CHUNK_LENGTH = 1024; - - private final HttpEngine httpEngine; - private final InputStream socketIn; - private final OutputStream socketOut; - - /** - * This stream buffers the request headers and the request body when their - * combined size is less than MAX_REQUEST_BUFFER_LENGTH. By combining them - * we can save socket writes, which in turn saves a packet transmission. - * This is socketOut if the request size is large or unknown. - */ - private OutputStream requestOut; - - public HttpTransport(HttpEngine httpEngine, OutputStream outputStream, InputStream inputStream) { - this.httpEngine = httpEngine; - this.socketOut = outputStream; - this.requestOut = outputStream; - this.socketIn = inputStream; - } - - @Override public OutputStream createRequestBody() throws IOException { - boolean chunked = httpEngine.requestHeaders.isChunked(); - if (!chunked - && httpEngine.policy.getChunkLength() > 0 - && httpEngine.connection.getHttpMinorVersion() != 0) { - httpEngine.requestHeaders.setChunked(); - chunked = true; - } - - // Stream a request body of unknown length. - if (chunked) { - int chunkLength = httpEngine.policy.getChunkLength(); - if (chunkLength == -1) { - chunkLength = DEFAULT_CHUNK_LENGTH; - } - writeRequestHeaders(); - return new ChunkedOutputStream(requestOut, chunkLength); - } - - // Stream a request body of a known length. - long fixedContentLength = httpEngine.policy.getFixedContentLength(); - if (fixedContentLength != -1) { - httpEngine.requestHeaders.setContentLength(fixedContentLength); - writeRequestHeaders(); - return new FixedLengthOutputStream(requestOut, fixedContentLength); - } - - long contentLength = httpEngine.requestHeaders.getContentLength(); - if (contentLength > Integer.MAX_VALUE) { - throw new IllegalArgumentException("Use setFixedLengthStreamingMode() or " - + "setChunkedStreamingMode() for requests larger than 2 GiB."); - } - - // Buffer a request body of a known length. - if (contentLength != -1) { - writeRequestHeaders(); - return new RetryableOutputStream((int) contentLength); - } - - // Buffer a request body of an unknown length. Don't write request - // headers until the entire body is ready; otherwise we can't set the - // Content-Length header correctly. - return new RetryableOutputStream(); - } - - @Override public void flushRequest() throws IOException { - requestOut.flush(); - requestOut = socketOut; - } - - @Override public void writeRequestBody(RetryableOutputStream requestBody) throws IOException { - requestBody.writeToSocket(requestOut); - } - - /** - * Prepares the HTTP headers and sends them to the server. - * - *

For streaming requests with a body, headers must be prepared - * before the output stream has been written to. Otherwise - * the body would need to be buffered! - * - *

For non-streaming requests with a body, headers must be prepared - * after the output stream has been written to and closed. - * This ensures that the {@code Content-Length} header field receives the - * proper value. - */ - public void writeRequestHeaders() throws IOException { - httpEngine.writingRequestHeaders(); - RawHeaders headersToSend = httpEngine.requestHeaders.getHeaders(); - byte[] bytes = headersToSend.toBytes(); - requestOut.write(bytes); - } - - @Override public ResponseHeaders readResponseHeaders() throws IOException { - RawHeaders rawHeaders = RawHeaders.fromBytes(socketIn); - httpEngine.connection.setHttpMinorVersion(rawHeaders.getHttpMinorVersion()); - httpEngine.receiveHeaders(rawHeaders); - - ResponseHeaders headers = new ResponseHeaders(httpEngine.uri, rawHeaders); - headers.setTransport("http/1.1"); - return headers; - } - - public boolean makeReusable(boolean streamCanceled, OutputStream requestBodyOut, - InputStream responseBodyIn) { - if (streamCanceled) { - return false; - } - - // We cannot reuse sockets that have incomplete output. - if (requestBodyOut != null && !((AbstractOutputStream) requestBodyOut).isClosed()) { - return false; - } - - // If the request specified that the connection shouldn't be reused, don't reuse it. - if (httpEngine.requestHeaders.hasConnectionClose()) { - return false; - } - - // If the response specified that the connection shouldn't be reused, don't reuse it. - if (httpEngine.responseHeaders != null && httpEngine.responseHeaders.hasConnectionClose()) { - return false; - } - - if (responseBodyIn instanceof UnknownLengthHttpInputStream) { - return false; - } - - if (responseBodyIn != null) { - return discardStream(httpEngine, responseBodyIn); - } - - return true; - } - - /** - * Discards the response body so that the connection can be reused. This - * needs to be done judiciously, since it delays the current request in - * order to speed up a potential future request that may never occur. - * - *

A stream may be discarded to encourage response caching (a response - * cannot be cached unless it is consumed completely) or to enable connection - * reuse. - */ - private static boolean discardStream(HttpEngine httpEngine, InputStream responseBodyIn) { - Connection connection = httpEngine.connection; - if (connection == null) return false; - Socket socket = connection.getSocket(); - if (socket == null) return false; - try { - int socketTimeout = socket.getSoTimeout(); - socket.setSoTimeout(DISCARD_STREAM_TIMEOUT_MILLIS); - try { - Util.skipAll(responseBodyIn); - return true; - } finally { - socket.setSoTimeout(socketTimeout); - } - } catch (IOException e) { - return false; - } - } - - @Override public InputStream getTransferStream(CacheRequest cacheRequest) throws IOException { - if (!httpEngine.hasResponseBody()) { - return new FixedLengthInputStream(socketIn, cacheRequest, httpEngine, 0); - } - - if (httpEngine.responseHeaders.isChunked()) { - return new ChunkedInputStream(socketIn, cacheRequest, this); - } - - if (httpEngine.responseHeaders.getContentLength() != -1) { - return new FixedLengthInputStream(socketIn, cacheRequest, httpEngine, - httpEngine.responseHeaders.getContentLength()); - } - - // Wrap the input stream from the connection (rather than just returning - // "socketIn" directly here), so that we can control its use after the - // reference escapes. - return new UnknownLengthHttpInputStream(socketIn, cacheRequest, httpEngine); - } - - /** An HTTP body with a fixed length known in advance. */ - private static final class FixedLengthOutputStream extends AbstractOutputStream { - private final OutputStream socketOut; - private long bytesRemaining; - - private FixedLengthOutputStream(OutputStream socketOut, long bytesRemaining) { - this.socketOut = socketOut; - this.bytesRemaining = bytesRemaining; - } - - @Override public void write(byte[] buffer, int offset, int count) throws IOException { - checkNotClosed(); - checkOffsetAndCount(buffer.length, offset, count); - if (count > bytesRemaining) { - throw new ProtocolException("expected " + bytesRemaining + " bytes but received " + count); - } - socketOut.write(buffer, offset, count); - bytesRemaining -= count; - } - - @Override public void flush() throws IOException { - if (closed) { - return; // don't throw; this stream might have been closed on the caller's behalf - } - socketOut.flush(); - } - - @Override public void close() throws IOException { - if (closed) { - return; - } - closed = true; - if (bytesRemaining > 0) { - throw new ProtocolException("unexpected end of stream"); - } - } - } - - /** - * An HTTP body with alternating chunk sizes and chunk bodies. Chunks are - * buffered until {@code maxChunkLength} bytes are ready, at which point the - * chunk is written and the buffer is cleared. - */ - private static final class ChunkedOutputStream extends AbstractOutputStream { - private static final byte[] CRLF = { '\r', '\n' }; - private static final byte[] HEX_DIGITS = { - '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' - }; - private static final byte[] FINAL_CHUNK = new byte[] { '0', '\r', '\n', '\r', '\n' }; - - /** Scratch space for up to 8 hex digits, and then a constant CRLF. */ - private final byte[] hex = { 0, 0, 0, 0, 0, 0, 0, 0, '\r', '\n' }; - - private final OutputStream socketOut; - private final int maxChunkLength; - private final ByteArrayOutputStream bufferedChunk; - - private ChunkedOutputStream(OutputStream socketOut, int maxChunkLength) { - this.socketOut = socketOut; - this.maxChunkLength = Math.max(1, dataLength(maxChunkLength)); - this.bufferedChunk = new ByteArrayOutputStream(maxChunkLength); - } - - /** - * Returns the amount of data that can be transmitted in a chunk whose total - * length (data+headers) is {@code dataPlusHeaderLength}. This is presumably - * useful to match sizes with wire-protocol packets. - */ - private int dataLength(int dataPlusHeaderLength) { - int headerLength = 4; // "\r\n" after the size plus another "\r\n" after the data - for (int i = dataPlusHeaderLength - headerLength; i > 0; i >>= 4) { - headerLength++; - } - return dataPlusHeaderLength - headerLength; - } - - @Override public synchronized void write(byte[] buffer, int offset, int count) - throws IOException { - checkNotClosed(); - checkOffsetAndCount(buffer.length, offset, count); - - while (count > 0) { - int numBytesWritten; - - if (bufferedChunk.size() > 0 || count < maxChunkLength) { - // fill the buffered chunk and then maybe write that to the stream - numBytesWritten = Math.min(count, maxChunkLength - bufferedChunk.size()); - // TODO: skip unnecessary copies from buffer->bufferedChunk? - bufferedChunk.write(buffer, offset, numBytesWritten); - if (bufferedChunk.size() == maxChunkLength) { - writeBufferedChunkToSocket(); - } - } else { - // write a single chunk of size maxChunkLength to the stream - numBytesWritten = maxChunkLength; - writeHex(numBytesWritten); - socketOut.write(buffer, offset, numBytesWritten); - socketOut.write(CRLF); - } - - offset += numBytesWritten; - count -= numBytesWritten; - } - } - - /** - * Equivalent to, but cheaper than writing Integer.toHexString().getBytes() - * followed by CRLF. - */ - private void writeHex(int i) throws IOException { - int cursor = 8; - do { - hex[--cursor] = HEX_DIGITS[i & 0xf]; - } while ((i >>>= 4) != 0); - socketOut.write(hex, cursor, hex.length - cursor); - } - - @Override public synchronized void flush() throws IOException { - if (closed) { - return; // don't throw; this stream might have been closed on the caller's behalf - } - writeBufferedChunkToSocket(); - socketOut.flush(); - } - - @Override public synchronized void close() throws IOException { - if (closed) { - return; - } - closed = true; - writeBufferedChunkToSocket(); - socketOut.write(FINAL_CHUNK); - } - - private void writeBufferedChunkToSocket() throws IOException { - int size = bufferedChunk.size(); - if (size <= 0) { - return; - } - - writeHex(size); - bufferedChunk.writeTo(socketOut); - bufferedChunk.reset(); - socketOut.write(CRLF); - } - } - - /** An HTTP body with a fixed length specified in advance. */ - private static class FixedLengthInputStream extends AbstractHttpInputStream { - private long bytesRemaining; - - public FixedLengthInputStream(InputStream is, CacheRequest cacheRequest, HttpEngine httpEngine, - long length) throws IOException { - super(is, httpEngine, cacheRequest); - bytesRemaining = length; - if (bytesRemaining == 0) { - endOfInput(); - } - } - - @Override public int read(byte[] buffer, int offset, int count) throws IOException { - checkOffsetAndCount(buffer.length, offset, count); - checkNotClosed(); - if (bytesRemaining == 0) { - return -1; - } - int read = in.read(buffer, offset, (int) Math.min(count, bytesRemaining)); - if (read == -1) { - unexpectedEndOfInput(); // the server didn't supply the promised content length - throw new ProtocolException("unexpected end of stream"); - } - bytesRemaining -= read; - cacheWrite(buffer, offset, read); - if (bytesRemaining == 0) { - endOfInput(); - } - return read; - } - - @Override public int available() throws IOException { - checkNotClosed(); - return bytesRemaining == 0 ? 0 : (int) Math.min(in.available(), bytesRemaining); - } - - @Override public void close() throws IOException { - if (closed) { - return; - } - if (bytesRemaining != 0 && !discardStream(httpEngine, this)) { - unexpectedEndOfInput(); - } - closed = true; - } - } - - /** An HTTP body with alternating chunk sizes and chunk bodies. */ - private static class ChunkedInputStream extends AbstractHttpInputStream { - private static final int NO_CHUNK_YET = -1; - private final HttpTransport transport; - private int bytesRemainingInChunk = NO_CHUNK_YET; - private boolean hasMoreChunks = true; - - ChunkedInputStream(InputStream is, CacheRequest cacheRequest, HttpTransport transport) - throws IOException { - super(is, transport.httpEngine, cacheRequest); - this.transport = transport; - } - - @Override public int read(byte[] buffer, int offset, int count) throws IOException { - checkOffsetAndCount(buffer.length, offset, count); - checkNotClosed(); - - if (!hasMoreChunks) { - return -1; - } - if (bytesRemainingInChunk == 0 || bytesRemainingInChunk == NO_CHUNK_YET) { - readChunkSize(); - if (!hasMoreChunks) { - return -1; - } - } - int read = in.read(buffer, offset, Math.min(count, bytesRemainingInChunk)); - if (read == -1) { - unexpectedEndOfInput(); // the server didn't supply the promised chunk length - throw new IOException("unexpected end of stream"); - } - bytesRemainingInChunk -= read; - cacheWrite(buffer, offset, read); - return read; - } - - private void readChunkSize() throws IOException { - // read the suffix of the previous chunk - if (bytesRemainingInChunk != NO_CHUNK_YET) { - Util.readAsciiLine(in); - } - String chunkSizeString = Util.readAsciiLine(in); - int index = chunkSizeString.indexOf(";"); - if (index != -1) { - chunkSizeString = chunkSizeString.substring(0, index); - } - try { - bytesRemainingInChunk = Integer.parseInt(chunkSizeString.trim(), 16); - } catch (NumberFormatException e) { - throw new ProtocolException("Expected a hex chunk size but was " + chunkSizeString); - } - if (bytesRemainingInChunk == 0) { - hasMoreChunks = false; - RawHeaders rawResponseHeaders = httpEngine.responseHeaders.getHeaders(); - RawHeaders.readHeaders(transport.socketIn, rawResponseHeaders); - httpEngine.receiveHeaders(rawResponseHeaders); - endOfInput(); - } - } - - @Override public int available() throws IOException { - checkNotClosed(); - if (!hasMoreChunks || bytesRemainingInChunk == NO_CHUNK_YET) { - return 0; - } - return Math.min(in.available(), bytesRemainingInChunk); - } - - @Override public void close() throws IOException { - if (closed) { - return; - } - if (hasMoreChunks && !discardStream(httpEngine, this)) { - unexpectedEndOfInput(); - } - closed = true; - } - } -} diff --git a/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/http/HttpURLConnectionImpl.java b/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/http/HttpURLConnectionImpl.java deleted file mode 100755 index fb4a704..0000000 --- a/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/http/HttpURLConnectionImpl.java +++ /dev/null @@ -1,590 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.squareup.okhttp.internal.http; - -import com.squareup.okhttp.Connection; -import com.squareup.okhttp.OkHttpClient; -import com.squareup.okhttp.internal.Platform; -import com.squareup.okhttp.internal.Util; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.net.HttpRetryException; -import java.net.HttpURLConnection; -import java.net.InetSocketAddress; -import java.net.ProtocolException; -import java.net.Proxy; -import java.net.SocketPermission; -import java.net.URL; -import java.security.Permission; -import java.security.cert.CertificateException; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.Map; -import java.util.concurrent.TimeUnit; -import javax.net.ssl.SSLHandshakeException; - -import static com.squareup.okhttp.internal.Util.getEffectivePort; - -/** - * This implementation uses HttpEngine to send requests and receive responses. - * This class may use multiple HttpEngines to follow redirects, authentication - * retries, etc. to retrieve the final response body. - * - *

What does 'connected' mean?

- * This class inherits a {@code connected} field from the superclass. That field - * is not used to indicate not whether this URLConnection is - * currently connected. Instead, it indicates whether a connection has ever been - * attempted. Once a connection has been attempted, certain properties (request - * header fields, request method, etc.) are immutable. Test the {@code - * connection} field on this class for null/non-null to determine of an instance - * is currently connected to a server. - */ -public class HttpURLConnectionImpl extends HttpURLConnection implements Policy { - - /** Numeric status code, 307: Temporary Redirect. */ - public static final int HTTP_TEMP_REDIRECT = 307; - - /** - * How many redirects should we follow? Chrome follows 21; Firefox, curl, - * and wget follow 20; Safari follows 16; and HTTP/1.0 recommends 5. - */ - private static final int MAX_REDIRECTS = 20; - - final OkHttpClient client; - - private final RawHeaders rawRequestHeaders = new RawHeaders(); - /** Like the superclass field of the same name, but a long and available on all platforms. */ - private long fixedContentLength = -1; - private int redirectionCount; - protected IOException httpEngineFailure; - protected HttpEngine httpEngine; - private Proxy selectedProxy; - - public HttpURLConnectionImpl(URL url, OkHttpClient client) { - super(url); - this.client = client; - } - - @Override public final void connect() throws IOException { - initHttpEngine(); - boolean success; - do { - success = execute(false); - } while (!success); - } - - @Override public final void disconnect() { - // Calling disconnect() before a connection exists should have no effect. - if (httpEngine != null) { - // We close the response body here instead of in - // HttpEngine.release because that is called when input - // has been completely read from the underlying socket. - // However the response body can be a GZIPInputStream that - // still has unread data. - if (httpEngine.hasResponse()) { - Util.closeQuietly(httpEngine.getResponseBody()); - } - httpEngine.release(true); - } - } - - /** - * Returns an input stream from the server in the case of error such as the - * requested file (txt, htm, html) is not found on the remote server. - */ - @Override public final InputStream getErrorStream() { - try { - HttpEngine response = getResponse(); - if (response.hasResponseBody() && response.getResponseCode() >= HTTP_BAD_REQUEST) { - return response.getResponseBody(); - } - return null; - } catch (IOException e) { - return null; - } - } - - /** - * Returns the value of the field at {@code position}. Returns null if there - * are fewer than {@code position} headers. - */ - @Override public final String getHeaderField(int position) { - try { - return getResponse().getResponseHeaders().getHeaders().getValue(position); - } catch (IOException e) { - return null; - } - } - - /** - * Returns the value of the field corresponding to the {@code fieldName}, or - * null if there is no such field. If the field has multiple values, the - * last value is returned. - */ - @Override public final String getHeaderField(String fieldName) { - try { - RawHeaders rawHeaders = getResponse().getResponseHeaders().getHeaders(); - return fieldName == null ? rawHeaders.getStatusLine() : rawHeaders.get(fieldName); - } catch (IOException e) { - return null; - } - } - - @Override public final String getHeaderFieldKey(int position) { - try { - return getResponse().getResponseHeaders().getHeaders().getFieldName(position); - } catch (IOException e) { - return null; - } - } - - @Override public final Map> getHeaderFields() { - try { - return getResponse().getResponseHeaders().getHeaders().toMultimap(true); - } catch (IOException e) { - return Collections.emptyMap(); - } - } - - @Override public final Map> getRequestProperties() { - if (connected) { - throw new IllegalStateException( - "Cannot access request header fields after connection is set"); - } - return rawRequestHeaders.toMultimap(false); - } - - @Override public final InputStream getInputStream() throws IOException { - if (!doInput) { - throw new ProtocolException("This protocol does not support input"); - } - - HttpEngine response = getResponse(); - - // if the requested file does not exist, throw an exception formerly the - // Error page from the server was returned if the requested file was - // text/html this has changed to return FileNotFoundException for all - // file types - if (getResponseCode() >= HTTP_BAD_REQUEST) { - throw new FileNotFoundException(url.toString()); - } - - InputStream result = response.getResponseBody(); - if (result == null) { - throw new ProtocolException("No response body exists; responseCode=" + getResponseCode()); - } - return result; - } - - @Override public final OutputStream getOutputStream() throws IOException { - connect(); - - OutputStream out = httpEngine.getRequestBody(); - if (out == null) { - throw new ProtocolException("method does not support a request body: " + method); - } else if (httpEngine.hasResponse()) { - throw new ProtocolException("cannot write request body after response has been read"); - } - - return out; - } - - @Override public final Permission getPermission() throws IOException { - String hostName = getURL().getHost(); - int hostPort = Util.getEffectivePort(getURL()); - if (usingProxy()) { - InetSocketAddress proxyAddress = (InetSocketAddress) client.getProxy().address(); - hostName = proxyAddress.getHostName(); - hostPort = proxyAddress.getPort(); - } - return new SocketPermission(hostName + ":" + hostPort, "connect, resolve"); - } - - @Override public final String getRequestProperty(String field) { - if (field == null) { - return null; - } - return rawRequestHeaders.get(field); - } - - @Override public void setConnectTimeout(int timeoutMillis) { - client.setConnectTimeout(timeoutMillis, TimeUnit.MILLISECONDS); - } - - @Override public int getConnectTimeout() { - return client.getConnectTimeout(); - } - - @Override public void setReadTimeout(int timeoutMillis) { - client.setReadTimeout(timeoutMillis, TimeUnit.MILLISECONDS); - } - - @Override public int getReadTimeout() { - return client.getReadTimeout(); - } - - private void initHttpEngine() throws IOException { - if (httpEngineFailure != null) { - throw httpEngineFailure; - } else if (httpEngine != null) { - return; - } - - connected = true; - try { - if (doOutput) { - if (method.equals("GET")) { - // they are requesting a stream to write to. This implies a POST method - method = "POST"; - } else if (!method.equals("POST") && !method.equals("PUT") && !method.equals("PATCH")) { - // If the request method is neither POST nor PUT nor PATCH, then you're not writing - throw new ProtocolException(method + " does not support writing"); - } - } - httpEngine = newHttpEngine(method, rawRequestHeaders, null, null); - } catch (IOException e) { - httpEngineFailure = e; - throw e; - } - } - - @Override public HttpURLConnection getHttpConnectionToCache() { - return this; - } - - private HttpEngine newHttpEngine(String method, RawHeaders requestHeaders, - Connection connection, RetryableOutputStream requestBody) throws IOException { - if (url.getProtocol().equals("http")) { - return new HttpEngine(client, this, method, requestHeaders, connection, requestBody); - } else if (url.getProtocol().equals("https")) { - return new HttpsEngine(client, this, method, requestHeaders, connection, requestBody); - } else { - throw new AssertionError(); - } - } - - /** - * Aggressively tries to get the final HTTP response, potentially making - * many HTTP requests in the process in order to cope with redirects and - * authentication. - */ - private HttpEngine getResponse() throws IOException { - initHttpEngine(); - - if (httpEngine.hasResponse()) { - return httpEngine; - } - - while (true) { - if (!execute(true)) { - continue; - } - - Retry retry = processResponseHeaders(); - if (retry == Retry.NONE) { - httpEngine.automaticallyReleaseConnectionToPool(); - return httpEngine; - } - - // The first request was insufficient. Prepare for another... - String retryMethod = method; - OutputStream requestBody = httpEngine.getRequestBody(); - - // Although RFC 2616 10.3.2 specifies that a HTTP_MOVED_PERM - // redirect should keep the same method, Chrome, Firefox and the - // RI all issue GETs when following any redirect. - int responseCode = httpEngine.getResponseCode(); - if (responseCode == HTTP_MULT_CHOICE - || responseCode == HTTP_MOVED_PERM - || responseCode == HTTP_MOVED_TEMP - || responseCode == HTTP_SEE_OTHER) { - retryMethod = "GET"; - requestBody = null; - } - - if (requestBody != null && !(requestBody instanceof RetryableOutputStream)) { - throw new HttpRetryException("Cannot retry streamed HTTP body", responseCode); - } - - if (retry == Retry.DIFFERENT_CONNECTION) { - httpEngine.automaticallyReleaseConnectionToPool(); - } - - httpEngine.release(false); - - httpEngine = newHttpEngine(retryMethod, rawRequestHeaders, httpEngine.getConnection(), - (RetryableOutputStream) requestBody); - - if (requestBody == null) { - // Drop the Content-Length header when redirected from POST to GET. - httpEngine.getRequestHeaders().removeContentLength(); - } - } - } - - /** - * Sends a request and optionally reads a response. Returns true if the - * request was successfully executed, and false if the request can be - * retried. Throws an exception if the request failed permanently. - */ - private boolean execute(boolean readResponse) throws IOException { - try { - httpEngine.sendRequest(); - if (readResponse) { - httpEngine.readResponse(); - } - - return true; - } catch (IOException e) { - if (handleFailure(e)) { - return false; - } else { - throw e; - } - } - } - - /** - * Report and attempt to recover from {@code e}. Returns true if the HTTP - * engine was replaced and the request should be retried. Otherwise the - * failure is permanent. - */ - private boolean handleFailure(IOException e) throws IOException { - RouteSelector routeSelector = httpEngine.routeSelector; - if (routeSelector != null && httpEngine.connection != null) { - routeSelector.connectFailed(httpEngine.connection, e); - } - - OutputStream requestBody = httpEngine.getRequestBody(); - boolean canRetryRequestBody = requestBody == null - || requestBody instanceof RetryableOutputStream; - if (routeSelector == null && httpEngine.connection == null // No connection. - || routeSelector != null && !routeSelector.hasNext() // No more routes to attempt. - || !isRecoverable(e) - || !canRetryRequestBody) { - httpEngineFailure = e; - return false; - } - - httpEngine.release(true); - RetryableOutputStream retryableOutputStream = (RetryableOutputStream) requestBody; - httpEngine = newHttpEngine(method, rawRequestHeaders, null, retryableOutputStream); - httpEngine.routeSelector = routeSelector; // Keep the same routeSelector. - return true; - } - - private boolean isRecoverable(IOException e) { - // If the problem was a CertificateException from the X509TrustManager, - // do not retry, we didn't have an abrupt server initiated exception. - boolean sslFailure = - e instanceof SSLHandshakeException && e.getCause() instanceof CertificateException; - boolean protocolFailure = e instanceof ProtocolException; - return !sslFailure && !protocolFailure; - } - - public HttpEngine getHttpEngine() { - return httpEngine; - } - - enum Retry { - NONE, - SAME_CONNECTION, - DIFFERENT_CONNECTION - } - - /** - * Returns the retry action to take for the current response headers. The - * headers, proxy and target URL for this connection may be adjusted to - * prepare for a follow up request. - */ - private Retry processResponseHeaders() throws IOException { - Proxy selectedProxy = httpEngine.connection != null - ? httpEngine.connection.getRoute().getProxy() - : client.getProxy(); - final int responseCode = getResponseCode(); - switch (responseCode) { - case HTTP_PROXY_AUTH: - if (selectedProxy.type() != Proxy.Type.HTTP) { - throw new ProtocolException("Received HTTP_PROXY_AUTH (407) code while not using proxy"); - } - // fall-through - case HTTP_UNAUTHORIZED: - boolean credentialsFound = HttpAuthenticator.processAuthHeader(client.getAuthenticator(), - getResponseCode(), httpEngine.getResponseHeaders().getHeaders(), rawRequestHeaders, - selectedProxy, url); - return credentialsFound ? Retry.SAME_CONNECTION : Retry.NONE; - - case HTTP_MULT_CHOICE: - case HTTP_MOVED_PERM: - case HTTP_MOVED_TEMP: - case HTTP_SEE_OTHER: - case HTTP_TEMP_REDIRECT: - if (!getInstanceFollowRedirects()) { - return Retry.NONE; - } - if (++redirectionCount > MAX_REDIRECTS) { - throw new ProtocolException("Too many redirects: " + redirectionCount); - } - if (responseCode == HTTP_TEMP_REDIRECT && !method.equals("GET") && !method.equals("HEAD")) { - // "If the 307 status code is received in response to a request other than GET or HEAD, - // the user agent MUST NOT automatically redirect the request" - return Retry.NONE; - } - String location = getHeaderField("Location"); - if (location == null) { - return Retry.NONE; - } - URL previousUrl = url; - url = new URL(previousUrl, location); - if (!url.getProtocol().equals("https") && !url.getProtocol().equals("http")) { - return Retry.NONE; // Don't follow redirects to unsupported protocols. - } - boolean sameProtocol = previousUrl.getProtocol().equals(url.getProtocol()); - if (!sameProtocol && !client.getFollowProtocolRedirects()) { - return Retry.NONE; // This client doesn't follow redirects across protocols. - } - boolean sameHost = previousUrl.getHost().equals(url.getHost()); - boolean samePort = getEffectivePort(previousUrl) == getEffectivePort(url); - if (sameHost && samePort && sameProtocol) { - return Retry.SAME_CONNECTION; - } else { - return Retry.DIFFERENT_CONNECTION; - } - - default: - return Retry.NONE; - } - } - - /** @see java.net.HttpURLConnection#setFixedLengthStreamingMode(int) */ - @Override public final long getFixedContentLength() { - return fixedContentLength; - } - - @Override public final int getChunkLength() { - return chunkLength; - } - - @Override public final boolean usingProxy() { - if (selectedProxy != null) { - return isValidNonDirectProxy(selectedProxy); - } - - // This behavior is a bit odd (but is probably justified by the - // oddness of the APIs involved). Before a connection is established, - // this method will return true only if this connection was explicitly - // opened with a Proxy. We don't attempt to query the ProxySelector - // at all. - return isValidNonDirectProxy(client.getProxy()); - } - - private static boolean isValidNonDirectProxy(Proxy proxy) { - return proxy != null && proxy.type() != Proxy.Type.DIRECT; - } - - @Override public String getResponseMessage() throws IOException { - return getResponse().getResponseHeaders().getHeaders().getResponseMessage(); - } - - @Override public final int getResponseCode() throws IOException { - return getResponse().getResponseCode(); - } - - @Override public final void setRequestProperty(String field, String newValue) { - if (connected) { - throw new IllegalStateException("Cannot set request property after connection is made"); - } - if (field == null) { - throw new NullPointerException("field == null"); - } - if (newValue == null) { - // Silently ignore null header values for backwards compatibility with older - // android versions as well as with other URLConnection implementations. - // - // Some implementations send a malformed HTTP header when faced with - // such requests, we respect the spec and ignore the header. - Platform.get().logW("Ignoring header " + field + " because its value was null."); - return; - } - - if ("X-Android-Transports".equals(field)) { - setTransports(newValue, false /* append */); - } else { - rawRequestHeaders.set(field, newValue); - } - } - - @Override public final void addRequestProperty(String field, String value) { - if (connected) { - throw new IllegalStateException("Cannot add request property after connection is made"); - } - if (field == null) { - throw new NullPointerException("field == null"); - } - if (value == null) { - // Silently ignore null header values for backwards compatibility with older - // android versions as well as with other URLConnection implementations. - // - // Some implementations send a malformed HTTP header when faced with - // such requests, we respect the spec and ignore the header. - Platform.get().logW("Ignoring header " + field + " because its value was null."); - return; - } - - if ("X-Android-Transports".equals(field)) { - setTransports(value, true /* append */); - } else { - rawRequestHeaders.add(field, value); - } - } - - /* - * Splits and validates a comma-separated string of transports. - * When append == false, we require that the transport list contains "http/1.1". - */ - private void setTransports(String transportsString, boolean append) { - List transportsList = new ArrayList(); - if (append) { - transportsList.addAll(client.getTransports()); - } - for (String transport : transportsString.split(",", -1)) { - transportsList.add(transport); - } - client.setTransports(transportsList); - } - - @Override public void setFixedLengthStreamingMode(int contentLength) { - setFixedLengthStreamingMode((long) contentLength); - } - - // @Override Don't override: this overload method doesn't exist prior to Java 1.7. - public void setFixedLengthStreamingMode(long contentLength) { - if (super.connected) throw new IllegalStateException("Already connected"); - if (chunkLength > 0) throw new IllegalStateException("Already in chunked mode"); - if (contentLength < 0) throw new IllegalArgumentException("contentLength < 0"); - this.fixedContentLength = contentLength; - super.fixedContentLength = (int) Math.min(contentLength, Integer.MAX_VALUE); - } - - @Override public final void setSelectedProxy(Proxy proxy) { - this.selectedProxy = proxy; - } -} diff --git a/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/http/HttpsEngine.java b/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/http/HttpsEngine.java deleted file mode 100755 index 2bc1d68..0000000 --- a/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/http/HttpsEngine.java +++ /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. - */ -package com.squareup.okhttp.internal.http; - -import com.squareup.okhttp.Connection; -import com.squareup.okhttp.OkHttpClient; -import com.squareup.okhttp.TunnelRequest; -import java.io.IOException; -import java.net.CacheResponse; -import java.net.SecureCacheResponse; -import java.net.URL; -import javax.net.ssl.SSLSocket; - -import static com.squareup.okhttp.internal.Util.getEffectivePort; - -public final class HttpsEngine extends HttpEngine { - /** - * Stash of HttpsEngine.connection.socket to implement requests like {@code - * HttpsURLConnection#getCipherSuite} even after the connection has been - * recycled. - */ - private SSLSocket sslSocket; - - public HttpsEngine(OkHttpClient client, Policy policy, String method, RawHeaders requestHeaders, - Connection connection, RetryableOutputStream requestBody) throws IOException { - super(client, policy, method, requestHeaders, connection, requestBody); - this.sslSocket = connection != null ? (SSLSocket) connection.getSocket() : null; - } - - @Override protected void connected(Connection connection) { - this.sslSocket = (SSLSocket) connection.getSocket(); - super.connected(connection); - } - - @Override protected boolean acceptCacheResponseType(CacheResponse cacheResponse) { - return cacheResponse instanceof SecureCacheResponse; - } - - @Override protected boolean includeAuthorityInRequestLine() { - // Even if there is a proxy, it isn't involved. Always request just the path. - return false; - } - - public SSLSocket getSslSocket() { - return sslSocket; - } - - @Override protected TunnelRequest getTunnelConfig() { - String userAgent = requestHeaders.getUserAgent(); - if (userAgent == null) { - userAgent = getDefaultUserAgent(); - } - - URL url = policy.getURL(); - return new TunnelRequest(url.getHost(), getEffectivePort(url), userAgent, - requestHeaders.getProxyAuthorization()); - } -} diff --git a/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/http/HttpsURLConnectionImpl.java b/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/http/HttpsURLConnectionImpl.java deleted file mode 100755 index e64fb98..0000000 --- a/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/http/HttpsURLConnectionImpl.java +++ /dev/null @@ -1,366 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.squareup.okhttp.internal.http; - -import android.annotation.SuppressLint; -import com.squareup.okhttp.OkHttpClient; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.net.HttpURLConnection; -import java.net.ProtocolException; -import java.net.SecureCacheResponse; -import java.net.URL; -import java.security.Permission; -import java.security.Principal; -import java.security.cert.Certificate; -import java.util.List; -import java.util.Map; -import javax.net.ssl.HostnameVerifier; -import javax.net.ssl.HttpsURLConnection; -import javax.net.ssl.SSLPeerUnverifiedException; -import javax.net.ssl.SSLSocket; -import javax.net.ssl.SSLSocketFactory; - -public final class HttpsURLConnectionImpl extends HttpsURLConnection { - - /** HttpUrlConnectionDelegate allows reuse of HttpURLConnectionImpl. */ - private final HttpUrlConnectionDelegate delegate; - - public HttpsURLConnectionImpl(URL url, OkHttpClient client) { - super(url); - delegate = new HttpUrlConnectionDelegate(url, client); - } - - @Override public String getCipherSuite() { - SecureCacheResponse cacheResponse = delegate.getSecureCacheResponse(); - if (cacheResponse != null) { - return cacheResponse.getCipherSuite(); - } - SSLSocket sslSocket = getSslSocket(); - if (sslSocket != null) { - return sslSocket.getSession().getCipherSuite(); - } - return null; - } - - @Override public Certificate[] getLocalCertificates() { - SecureCacheResponse cacheResponse = delegate.getSecureCacheResponse(); - if (cacheResponse != null) { - List result = cacheResponse.getLocalCertificateChain(); - return result != null ? result.toArray(new Certificate[result.size()]) : null; - } - SSLSocket sslSocket = getSslSocket(); - if (sslSocket != null) { - return sslSocket.getSession().getLocalCertificates(); - } - return null; - } - - @Override public Certificate[] getServerCertificates() throws SSLPeerUnverifiedException { - SecureCacheResponse cacheResponse = delegate.getSecureCacheResponse(); - if (cacheResponse != null) { - List result = cacheResponse.getServerCertificateChain(); - return result != null ? result.toArray(new Certificate[result.size()]) : null; - } - SSLSocket sslSocket = getSslSocket(); - if (sslSocket != null) { - return sslSocket.getSession().getPeerCertificates(); - } - return null; - } - - @Override public Principal getPeerPrincipal() throws SSLPeerUnverifiedException { - SecureCacheResponse cacheResponse = delegate.getSecureCacheResponse(); - if (cacheResponse != null) { - return cacheResponse.getPeerPrincipal(); - } - SSLSocket sslSocket = getSslSocket(); - if (sslSocket != null) { - return sslSocket.getSession().getPeerPrincipal(); - } - return null; - } - - @Override public Principal getLocalPrincipal() { - SecureCacheResponse cacheResponse = delegate.getSecureCacheResponse(); - if (cacheResponse != null) { - return cacheResponse.getLocalPrincipal(); - } - SSLSocket sslSocket = getSslSocket(); - if (sslSocket != null) { - return sslSocket.getSession().getLocalPrincipal(); - } - return null; - } - - public HttpEngine getHttpEngine() { - return delegate.getHttpEngine(); - } - - private SSLSocket getSslSocket() { - if (delegate.httpEngine == null || !delegate.httpEngine.connected) { - throw new IllegalStateException("Connection has not yet been established"); - } - return delegate.httpEngine instanceof HttpsEngine - ? ((HttpsEngine) delegate.httpEngine).getSslSocket() - : null; // Not HTTPS! Probably an https:// to http:// redirect. - } - - @Override public void disconnect() { - delegate.disconnect(); - } - - @Override public InputStream getErrorStream() { - return delegate.getErrorStream(); - } - - @Override public String getRequestMethod() { - return delegate.getRequestMethod(); - } - - @Override public int getResponseCode() throws IOException { - return delegate.getResponseCode(); - } - - @Override public String getResponseMessage() throws IOException { - return delegate.getResponseMessage(); - } - - @Override public void setRequestMethod(String method) throws ProtocolException { - delegate.setRequestMethod(method); - } - - @Override public boolean usingProxy() { - return delegate.usingProxy(); - } - - @Override public boolean getInstanceFollowRedirects() { - return delegate.getInstanceFollowRedirects(); - } - - @Override public void setInstanceFollowRedirects(boolean followRedirects) { - delegate.setInstanceFollowRedirects(followRedirects); - } - - @Override public void connect() throws IOException { - connected = true; - delegate.connect(); - } - - @Override public boolean getAllowUserInteraction() { - return delegate.getAllowUserInteraction(); - } - - @Override public Object getContent() throws IOException { - return delegate.getContent(); - } - - @SuppressWarnings("unchecked") // Spec does not generify - @Override public Object getContent(Class[] types) throws IOException { - return delegate.getContent(types); - } - - @Override public String getContentEncoding() { - return delegate.getContentEncoding(); - } - - @Override public int getContentLength() { - return delegate.getContentLength(); - } - - @Override public String getContentType() { - return delegate.getContentType(); - } - - @Override public long getDate() { - return delegate.getDate(); - } - - @Override public boolean getDefaultUseCaches() { - return delegate.getDefaultUseCaches(); - } - - @Override public boolean getDoInput() { - return delegate.getDoInput(); - } - - @Override public boolean getDoOutput() { - return delegate.getDoOutput(); - } - - @Override public long getExpiration() { - return delegate.getExpiration(); - } - - @Override public String getHeaderField(int pos) { - return delegate.getHeaderField(pos); - } - - @Override public Map> getHeaderFields() { - return delegate.getHeaderFields(); - } - - @Override public Map> getRequestProperties() { - return delegate.getRequestProperties(); - } - - @Override public void addRequestProperty(String field, String newValue) { - delegate.addRequestProperty(field, newValue); - } - - @Override public String getHeaderField(String key) { - return delegate.getHeaderField(key); - } - - @Override public long getHeaderFieldDate(String field, long defaultValue) { - return delegate.getHeaderFieldDate(field, defaultValue); - } - - @Override public int getHeaderFieldInt(String field, int defaultValue) { - return delegate.getHeaderFieldInt(field, defaultValue); - } - - @Override public String getHeaderFieldKey(int position) { - return delegate.getHeaderFieldKey(position); - } - - @Override public long getIfModifiedSince() { - return delegate.getIfModifiedSince(); - } - - @Override public InputStream getInputStream() throws IOException { - return delegate.getInputStream(); - } - - @Override public long getLastModified() { - return delegate.getLastModified(); - } - - @Override public OutputStream getOutputStream() throws IOException { - return delegate.getOutputStream(); - } - - @Override public Permission getPermission() throws IOException { - return delegate.getPermission(); - } - - @Override public String getRequestProperty(String field) { - return delegate.getRequestProperty(field); - } - - @Override public URL getURL() { - return delegate.getURL(); - } - - @Override public boolean getUseCaches() { - return delegate.getUseCaches(); - } - - @Override public void setAllowUserInteraction(boolean newValue) { - delegate.setAllowUserInteraction(newValue); - } - - @Override public void setDefaultUseCaches(boolean newValue) { - delegate.setDefaultUseCaches(newValue); - } - - @Override public void setDoInput(boolean newValue) { - delegate.setDoInput(newValue); - } - - @Override public void setDoOutput(boolean newValue) { - delegate.setDoOutput(newValue); - } - - @Override public void setIfModifiedSince(long newValue) { - delegate.setIfModifiedSince(newValue); - } - - @Override public void setRequestProperty(String field, String newValue) { - delegate.setRequestProperty(field, newValue); - } - - @Override public void setUseCaches(boolean newValue) { - delegate.setUseCaches(newValue); - } - - @Override public void setConnectTimeout(int timeoutMillis) { - delegate.setConnectTimeout(timeoutMillis); - } - - @Override public int getConnectTimeout() { - return delegate.getConnectTimeout(); - } - - @Override public void setReadTimeout(int timeoutMillis) { - delegate.setReadTimeout(timeoutMillis); - } - - @Override public int getReadTimeout() { - return delegate.getReadTimeout(); - } - - @Override public String toString() { - return delegate.toString(); - } - - @Override public void setFixedLengthStreamingMode(int contentLength) { - delegate.setFixedLengthStreamingMode(contentLength); - } - - @Override public void setChunkedStreamingMode(int chunkLength) { - delegate.setChunkedStreamingMode(chunkLength); - } - - @Override public void setHostnameVerifier(HostnameVerifier hostnameVerifier) { - delegate.client.setHostnameVerifier(hostnameVerifier); - } - - @Override public HostnameVerifier getHostnameVerifier() { - return delegate.client.getHostnameVerifier(); - } - - @Override public void setSSLSocketFactory(SSLSocketFactory sslSocketFactory) { - delegate.client.setSslSocketFactory(sslSocketFactory); - } - - @Override public SSLSocketFactory getSSLSocketFactory() { - return delegate.client.getSslSocketFactory(); - } - - @SuppressLint("NewApi") - @Override public void setFixedLengthStreamingMode(long contentLength) { - delegate.setFixedLengthStreamingMode(contentLength); - } - - private final class HttpUrlConnectionDelegate extends HttpURLConnectionImpl { - private HttpUrlConnectionDelegate(URL url, OkHttpClient client) { - super(url, client); - } - - @Override public HttpURLConnection getHttpConnectionToCache() { - return HttpsURLConnectionImpl.this; - } - - public SecureCacheResponse getSecureCacheResponse() { - return httpEngine instanceof HttpsEngine - ? (SecureCacheResponse) httpEngine.getCacheResponse() - : null; - } - } -} diff --git a/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/http/OkResponseCacheAdapter.java b/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/http/OkResponseCacheAdapter.java deleted file mode 100755 index 5335c2b..0000000 --- a/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/http/OkResponseCacheAdapter.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright (C) 2013 Square, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.squareup.okhttp.internal.http; - -import com.squareup.okhttp.OkResponseCache; -import com.squareup.okhttp.ResponseSource; -import java.io.IOException; -import java.net.CacheRequest; -import java.net.CacheResponse; -import java.net.HttpURLConnection; -import java.net.ResponseCache; -import java.net.URI; -import java.net.URLConnection; -import java.util.List; -import java.util.Map; - -public final class OkResponseCacheAdapter implements OkResponseCache { - private final ResponseCache responseCache; - public OkResponseCacheAdapter(ResponseCache responseCache) { - this.responseCache = responseCache; - } - - @Override public CacheResponse get(URI uri, String requestMethod, - Map> requestHeaders) throws IOException { - return responseCache.get(uri, requestMethod, requestHeaders); - } - - @Override public CacheRequest put(URI uri, URLConnection urlConnection) throws IOException { - return responseCache.put(uri, urlConnection); - } - - @Override public void maybeRemove(String requestMethod, URI uri) throws IOException { - } - - @Override public void update(CacheResponse conditionalCacheHit, HttpURLConnection connection) - throws IOException { - } - - @Override public void trackConditionalCacheHit() { - } - - @Override public void trackResponse(ResponseSource source) { - } -} diff --git a/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/http/Policy.java b/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/http/Policy.java deleted file mode 100755 index 0a29d4b..0000000 --- a/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/http/Policy.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright (C) 2013 Square, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.squareup.okhttp.internal.http; - -import java.net.HttpURLConnection; -import java.net.Proxy; -import java.net.URL; - -public interface Policy { - /** Returns true if HTTP response caches should be used. */ - boolean getUseCaches(); - - /** Returns the HttpURLConnection instance to store in the cache. */ - HttpURLConnection getHttpConnectionToCache(); - - /** Returns the current destination URL, possibly a redirect. */ - URL getURL(); - - /** Returns the If-Modified-Since timestamp, or 0 if none is set. */ - long getIfModifiedSince(); - - /** Returns true if a non-direct proxy is specified. */ - boolean usingProxy(); - - /** @see java.net.HttpURLConnection#setChunkedStreamingMode(int) */ - int getChunkLength(); - - /** @see java.net.HttpURLConnection#setFixedLengthStreamingMode(int) */ - long getFixedContentLength(); - - /** - * Sets the current proxy that this connection is using. - * @see java.net.HttpURLConnection#usingProxy - */ - void setSelectedProxy(Proxy proxy); -} diff --git a/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/http/RawHeaders.java b/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/http/RawHeaders.java deleted file mode 100755 index 8b45320..0000000 --- a/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/http/RawHeaders.java +++ /dev/null @@ -1,447 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.squareup.okhttp.internal.http; - -import com.squareup.okhttp.internal.Util; -import java.io.IOException; -import java.io.InputStream; -import java.io.UnsupportedEncodingException; -import java.net.ProtocolException; -import java.util.ArrayList; -import java.util.Collections; -import java.util.Comparator; -import java.util.HashSet; -import java.util.List; -import java.util.Locale; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Set; -import java.util.TreeMap; -import java.util.TreeSet; - -/** - * The HTTP status and unparsed header fields of a single HTTP message. Values - * are represented as uninterpreted strings; use {@link RequestHeaders} and - * {@link ResponseHeaders} for interpreted headers. This class maintains the - * order of the header fields within the HTTP message. - * - *

This class tracks fields line-by-line. A field with multiple comma- - * separated values on the same line will be treated as a field with a single - * value by this class. It is the caller's responsibility to detect and split - * on commas if their field permits multiple values. This simplifies use of - * single-valued fields whose values routinely contain commas, such as cookies - * or dates. - * - *

This class trims whitespace from values. It never returns values with - * leading or trailing whitespace. - */ -public final class RawHeaders { - private static final Comparator FIELD_NAME_COMPARATOR = new Comparator() { - // @FindBugsSuppressWarnings("ES_COMPARING_PARAMETER_STRING_WITH_EQ") - @Override public int compare(String a, String b) { - if (a == b) { - return 0; - } else if (a == null) { - return -1; - } else if (b == null) { - return 1; - } else { - return String.CASE_INSENSITIVE_ORDER.compare(a, b); - } - } - }; - - private final List namesAndValues = new ArrayList(20); - private String requestLine; - private String statusLine; - private int httpMinorVersion = 1; - private int responseCode = -1; - private String responseMessage; - - public RawHeaders() { - } - - public RawHeaders(RawHeaders copyFrom) { - namesAndValues.addAll(copyFrom.namesAndValues); - requestLine = copyFrom.requestLine; - statusLine = copyFrom.statusLine; - httpMinorVersion = copyFrom.httpMinorVersion; - responseCode = copyFrom.responseCode; - responseMessage = copyFrom.responseMessage; - } - - /** Sets the request line (like "GET / HTTP/1.1"). */ - public void setRequestLine(String requestLine) { - requestLine = requestLine.trim(); - this.requestLine = requestLine; - } - - /** Sets the response status line (like "HTTP/1.0 200 OK"). */ - public void setStatusLine(String statusLine) throws IOException { - // H T T P / 1 . 1 2 0 0 T e m p o r a r y R e d i r e c t - // 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 - if (this.responseMessage != null) { - throw new IllegalStateException("statusLine is already set"); - } - // We allow empty message without leading white space since some servers - // do not send the white space when the message is empty. - boolean hasMessage = statusLine.length() > 13; - if (!statusLine.startsWith("HTTP/1.") - || statusLine.length() < 12 - || statusLine.charAt(8) != ' ' - || (hasMessage && statusLine.charAt(12) != ' ')) { - throw new ProtocolException("Unexpected status line: " + statusLine); - } - int httpMinorVersion = statusLine.charAt(7) - '0'; - if (httpMinorVersion < 0 || httpMinorVersion > 9) { - throw new ProtocolException("Unexpected status line: " + statusLine); - } - int responseCode; - try { - responseCode = Integer.parseInt(statusLine.substring(9, 12)); - } catch (NumberFormatException e) { - throw new ProtocolException("Unexpected status line: " + statusLine); - } - this.responseMessage = hasMessage ? statusLine.substring(13) : ""; - this.responseCode = responseCode; - this.statusLine = statusLine; - this.httpMinorVersion = httpMinorVersion; - } - - /** - * @param method like "GET", "POST", "HEAD", etc. - * @param path like "/foo/bar.html" - * @param version like "HTTP/1.1" - * @param host like "www.android.com:1234" - * @param scheme like "https" - */ - public void addSpdyRequestHeaders(String method, String path, String version, String host, - String scheme) { - // TODO: populate the statusLine for the client's benefit? - add(":method", method); - add(":scheme", scheme); - add(":path", path); - add(":version", version); - add(":host", host); - } - - public String getStatusLine() { - return statusLine; - } - - /** - * Returns the status line's HTTP minor version. This returns 0 for HTTP/1.0 - * and 1 for HTTP/1.1. This returns 1 if the HTTP version is unknown. - */ - public int getHttpMinorVersion() { - return httpMinorVersion != -1 ? httpMinorVersion : 1; - } - - /** Returns the HTTP status code or -1 if it is unknown. */ - public int getResponseCode() { - return responseCode; - } - - /** Returns the HTTP status message or null if it is unknown. */ - public String getResponseMessage() { - return responseMessage; - } - - /** - * Add an HTTP header line containing a field name, a literal colon, and a - * value. This works around empty header names and header names that start - * with a colon (created by old broken SPDY versions of the response cache). - */ - public void addLine(String line) { - int index = line.indexOf(":", 1); - if (index != -1) { - addLenient(line.substring(0, index), line.substring(index + 1)); - } else if (line.startsWith(":")) { - addLenient("", line.substring(1)); // Empty header name. - } else { - addLenient("", line); // No header name. - } - } - - /** Add a field with the specified value. */ - public void add(String fieldName, String value) { - if (fieldName == null) throw new IllegalArgumentException("fieldname == null"); - if (value == null) throw new IllegalArgumentException("value == null"); - if (fieldName.length() == 0 || fieldName.indexOf('\0') != -1 || value.indexOf('\0') != -1) { - throw new IllegalArgumentException("Unexpected header: " + fieldName + ": " + value); - } - addLenient(fieldName, value); - } - - /** - * Add a field with the specified value without any validation. Only - * appropriate for headers from the remote peer. - */ - private void addLenient(String fieldName, String value) { - namesAndValues.add(fieldName); - namesAndValues.add(value.trim()); - } - - public void removeAll(String fieldName) { - for (int i = 0; i < namesAndValues.size(); i += 2) { - if (fieldName.equalsIgnoreCase(namesAndValues.get(i))) { - namesAndValues.remove(i); // field name - namesAndValues.remove(i); // value - } - } - } - - public void addAll(String fieldName, List headerFields) { - for (String value : headerFields) { - add(fieldName, value); - } - } - - /** - * Set a field with the specified value. If the field is not found, it is - * added. If the field is found, the existing values are replaced. - */ - public void set(String fieldName, String value) { - removeAll(fieldName); - add(fieldName, value); - } - - /** Returns the number of field values. */ - public int length() { - return namesAndValues.size() / 2; - } - - /** Returns the field at {@code position} or null if that is out of range. */ - public String getFieldName(int index) { - int fieldNameIndex = index * 2; - if (fieldNameIndex < 0 || fieldNameIndex >= namesAndValues.size()) { - return null; - } - return namesAndValues.get(fieldNameIndex); - } - - /** Returns an immutable case-insensitive set of header names. */ - public Set names() { - TreeSet result = new TreeSet(String.CASE_INSENSITIVE_ORDER); - for (int i = 0; i < length(); i++) { - result.add(getFieldName(i)); - } - return Collections.unmodifiableSet(result); - } - - /** Returns the value at {@code index} or null if that is out of range. */ - public String getValue(int index) { - int valueIndex = index * 2 + 1; - if (valueIndex < 0 || valueIndex >= namesAndValues.size()) { - return null; - } - return namesAndValues.get(valueIndex); - } - - /** Returns the last value corresponding to the specified field, or null. */ - public String get(String fieldName) { - for (int i = namesAndValues.size() - 2; i >= 0; i -= 2) { - if (fieldName.equalsIgnoreCase(namesAndValues.get(i))) { - return namesAndValues.get(i + 1); - } - } - return null; - } - - /** Returns an immutable list of the header values for {@code name}. */ - public List values(String name) { - List result = null; - for (int i = 0; i < length(); i++) { - if (name.equalsIgnoreCase(getFieldName(i))) { - if (result == null) result = new ArrayList(2); - result.add(getValue(i)); - } - } - return result != null - ? Collections.unmodifiableList(result) - : Collections.emptyList(); - } - - /** @param fieldNames a case-insensitive set of HTTP header field names. */ - public RawHeaders getAll(Set fieldNames) { - RawHeaders result = new RawHeaders(); - for (int i = 0; i < namesAndValues.size(); i += 2) { - String fieldName = namesAndValues.get(i); - if (fieldNames.contains(fieldName)) { - result.add(fieldName, namesAndValues.get(i + 1)); - } - } - return result; - } - - /** Returns bytes of a request header for sending on an HTTP transport. */ - public byte[] toBytes() throws UnsupportedEncodingException { - StringBuilder result = new StringBuilder(256); - result.append(requestLine).append("\r\n"); - for (int i = 0; i < namesAndValues.size(); i += 2) { - result.append(namesAndValues.get(i)) - .append(": ") - .append(namesAndValues.get(i + 1)) - .append("\r\n"); - } - result.append("\r\n"); - return result.toString().getBytes("ISO-8859-1"); - } - - /** Parses bytes of a response header from an HTTP transport. */ - public static RawHeaders fromBytes(InputStream in) throws IOException { - RawHeaders headers; - do { - headers = new RawHeaders(); - headers.setStatusLine(Util.readAsciiLine(in)); - readHeaders(in, headers); - } while (headers.getResponseCode() == HttpEngine.HTTP_CONTINUE); - return headers; - } - - /** Reads headers or trailers into {@code out}. */ - public static void readHeaders(InputStream in, RawHeaders out) throws IOException { - // parse the result headers until the first blank line - String line; - while ((line = Util.readAsciiLine(in)).length() != 0) { - out.addLine(line); - } - } - - /** - * Returns an immutable map containing each field to its list of values. The - * status line is mapped to null. - */ - public Map> toMultimap(boolean response) { - Map> result = new TreeMap>(FIELD_NAME_COMPARATOR); - for (int i = 0; i < namesAndValues.size(); i += 2) { - String fieldName = namesAndValues.get(i); - String value = namesAndValues.get(i + 1); - - List allValues = new ArrayList(); - List otherValues = result.get(fieldName); - if (otherValues != null) { - allValues.addAll(otherValues); - } - allValues.add(value); - result.put(fieldName, Collections.unmodifiableList(allValues)); - } - if (response && statusLine != null) { - result.put(null, Collections.unmodifiableList(Collections.singletonList(statusLine))); - } else if (requestLine != null) { - result.put(null, Collections.unmodifiableList(Collections.singletonList(requestLine))); - } - return Collections.unmodifiableMap(result); - } - - /** - * Creates a new instance from the given map of fields to values. If - * present, the null field's last element will be used to set the status - * line. - */ - public static RawHeaders fromMultimap(Map> map, boolean response) - throws IOException { - if (!response) throw new UnsupportedOperationException(); - RawHeaders result = new RawHeaders(); - for (Entry> entry : map.entrySet()) { - String fieldName = entry.getKey(); - List values = entry.getValue(); - if (fieldName != null) { - for (String value : values) { - result.addLenient(fieldName, value); - } - } else if (!values.isEmpty()) { - result.setStatusLine(values.get(values.size() - 1)); - } - } - return result; - } - - /** - * Returns a list of alternating names and values. Names are all lower case. - * No names are repeated. If any name has multiple values, they are - * concatenated using "\0" as a delimiter. - */ - public List toNameValueBlock() { - Set names = new HashSet(); - List result = new ArrayList(); - for (int i = 0; i < namesAndValues.size(); i += 2) { - String name = namesAndValues.get(i).toLowerCase(Locale.US); - String value = namesAndValues.get(i + 1); - - // Drop headers that are forbidden when layering HTTP over SPDY. - if (name.equals("connection") - || name.equals("host") - || name.equals("keep-alive") - || name.equals("proxy-connection") - || name.equals("transfer-encoding")) { - continue; - } - - // If we haven't seen this name before, add the pair to the end of the list... - if (names.add(name)) { - result.add(name); - result.add(value); - continue; - } - - // ...otherwise concatenate the existing values and this value. - for (int j = 0; j < result.size(); j += 2) { - if (name.equals(result.get(j))) { - result.set(j + 1, result.get(j + 1) + "\0" + value); - break; - } - } - } - return result; - } - - /** Returns headers for a name value block containing a SPDY response. */ - public static RawHeaders fromNameValueBlock(List nameValueBlock) throws IOException { - if (nameValueBlock.size() % 2 != 0) { - throw new IllegalArgumentException("Unexpected name value block: " + nameValueBlock); - } - String status = null; - String version = null; - RawHeaders result = new RawHeaders(); - for (int i = 0; i < nameValueBlock.size(); i += 2) { - String name = nameValueBlock.get(i); - String values = nameValueBlock.get(i + 1); - for (int start = 0; start < values.length(); ) { - int end = values.indexOf('\0', start); - if (end == -1) { - end = values.length(); - } - String value = values.substring(start, end); - if (":status".equals(name)) { - status = value; - } else if (":version".equals(name)) { - version = value; - } else { - result.namesAndValues.add(name); - result.namesAndValues.add(value); - } - start = end + 1; - } - } - if (status == null) throw new ProtocolException("Expected ':status' header not present"); - if (version == null) throw new ProtocolException("Expected ':version' header not present"); - result.setStatusLine(version + " " + status); - return result; - } -} diff --git a/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/http/RequestHeaders.java b/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/http/RequestHeaders.java deleted file mode 100755 index 71c3cd0..0000000 --- a/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/http/RequestHeaders.java +++ /dev/null @@ -1,317 +0,0 @@ -/* - * Copyright (C) 2011 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.squareup.okhttp.internal.http; - -import java.net.URI; -import java.util.Date; -import java.util.List; -import java.util.Map; - -/** Parsed HTTP request headers. */ -public final class RequestHeaders { - private final URI uri; - private final RawHeaders headers; - - /** Don't use a cache to satisfy this request. */ - private boolean noCache; - private int maxAgeSeconds = -1; - private int maxStaleSeconds = -1; - private int minFreshSeconds = -1; - - /** - * This field's name "only-if-cached" is misleading. It actually means "do - * not use the network". It is set by a client who only wants to make a - * request if it can be fully satisfied by the cache. Cached responses that - * would require validation (ie. conditional gets) are not permitted if this - * header is set. - */ - private boolean onlyIfCached; - - /** - * True if the request contains an authorization field. Although this isn't - * necessarily a shared cache, it follows the spec's strict requirements for - * shared caches. - */ - private boolean hasAuthorization; - - private long contentLength = -1; - private String transferEncoding; - private String userAgent; - private String host; - private String connection; - private String acceptEncoding; - private String contentType; - private String ifModifiedSince; - private String ifNoneMatch; - private String proxyAuthorization; - - public RequestHeaders(URI uri, RawHeaders headers) { - this.uri = uri; - this.headers = headers; - - HeaderParser.CacheControlHandler handler = new HeaderParser.CacheControlHandler() { - @Override public void handle(String directive, String parameter) { - if ("no-cache".equalsIgnoreCase(directive)) { - noCache = true; - } else if ("max-age".equalsIgnoreCase(directive)) { - maxAgeSeconds = HeaderParser.parseSeconds(parameter); - } else if ("max-stale".equalsIgnoreCase(directive)) { - maxStaleSeconds = HeaderParser.parseSeconds(parameter); - } else if ("min-fresh".equalsIgnoreCase(directive)) { - minFreshSeconds = HeaderParser.parseSeconds(parameter); - } else if ("only-if-cached".equalsIgnoreCase(directive)) { - onlyIfCached = true; - } - } - }; - - for (int i = 0; i < headers.length(); i++) { - String fieldName = headers.getFieldName(i); - String value = headers.getValue(i); - if ("Cache-Control".equalsIgnoreCase(fieldName)) { - HeaderParser.parseCacheControl(value, handler); - } else if ("Pragma".equalsIgnoreCase(fieldName)) { - if ("no-cache".equalsIgnoreCase(value)) { - noCache = true; - } - } else if ("If-None-Match".equalsIgnoreCase(fieldName)) { - ifNoneMatch = value; - } else if ("If-Modified-Since".equalsIgnoreCase(fieldName)) { - ifModifiedSince = value; - } else if ("Authorization".equalsIgnoreCase(fieldName)) { - hasAuthorization = true; - } else if ("Content-Length".equalsIgnoreCase(fieldName)) { - try { - contentLength = Integer.parseInt(value); - } catch (NumberFormatException ignored) { - } - } else if ("Transfer-Encoding".equalsIgnoreCase(fieldName)) { - transferEncoding = value; - } else if ("User-Agent".equalsIgnoreCase(fieldName)) { - userAgent = value; - } else if ("Host".equalsIgnoreCase(fieldName)) { - host = value; - } else if ("Connection".equalsIgnoreCase(fieldName)) { - connection = value; - } else if ("Accept-Encoding".equalsIgnoreCase(fieldName)) { - acceptEncoding = value; - } else if ("Content-Type".equalsIgnoreCase(fieldName)) { - contentType = value; - } else if ("Proxy-Authorization".equalsIgnoreCase(fieldName)) { - proxyAuthorization = value; - } - } - } - - public boolean isChunked() { - return "chunked".equalsIgnoreCase(transferEncoding); - } - - public boolean hasConnectionClose() { - return "close".equalsIgnoreCase(connection); - } - - public URI getUri() { - return uri; - } - - public RawHeaders getHeaders() { - return headers; - } - - public boolean isNoCache() { - return noCache; - } - - public int getMaxAgeSeconds() { - return maxAgeSeconds; - } - - public int getMaxStaleSeconds() { - return maxStaleSeconds; - } - - public int getMinFreshSeconds() { - return minFreshSeconds; - } - - public boolean isOnlyIfCached() { - return onlyIfCached; - } - - public boolean hasAuthorization() { - return hasAuthorization; - } - - public long getContentLength() { - return contentLength; - } - - public String getTransferEncoding() { - return transferEncoding; - } - - public String getUserAgent() { - return userAgent; - } - - public String getHost() { - return host; - } - - public String getConnection() { - return connection; - } - - public String getAcceptEncoding() { - return acceptEncoding; - } - - public String getContentType() { - return contentType; - } - - public String getIfModifiedSince() { - return ifModifiedSince; - } - - public String getIfNoneMatch() { - return ifNoneMatch; - } - - public String getProxyAuthorization() { - return proxyAuthorization; - } - - public void setChunked() { - if (this.transferEncoding != null) { - headers.removeAll("Transfer-Encoding"); - } - headers.add("Transfer-Encoding", "chunked"); - this.transferEncoding = "chunked"; - } - - public void setContentLength(long contentLength) { - if (this.contentLength != -1) { - headers.removeAll("Content-Length"); - } - headers.add("Content-Length", Long.toString(contentLength)); - this.contentLength = contentLength; - } - - /** - * Remove the Content-Length headers. Call this when dropping the body on a - * request or response, such as when a redirect changes the method from POST - * to GET. - */ - public void removeContentLength() { - if (contentLength != -1) { - headers.removeAll("Content-Length"); - contentLength = -1; - } - } - - public void setUserAgent(String userAgent) { - if (this.userAgent != null) { - headers.removeAll("User-Agent"); - } - headers.add("User-Agent", userAgent); - this.userAgent = userAgent; - } - - public void setHost(String host) { - if (this.host != null) { - headers.removeAll("Host"); - } - headers.add("Host", host); - this.host = host; - } - - public void setConnection(String connection) { - if (this.connection != null) { - headers.removeAll("Connection"); - } - headers.add("Connection", connection); - this.connection = connection; - } - - public void setAcceptEncoding(String acceptEncoding) { - if (this.acceptEncoding != null) { - headers.removeAll("Accept-Encoding"); - } - headers.add("Accept-Encoding", acceptEncoding); - this.acceptEncoding = acceptEncoding; - } - - public void setContentType(String contentType) { - if (this.contentType != null) { - headers.removeAll("Content-Type"); - } - headers.add("Content-Type", contentType); - this.contentType = contentType; - } - - public void setIfModifiedSince(Date date) { - if (ifModifiedSince != null) { - headers.removeAll("If-Modified-Since"); - } - String formattedDate = HttpDate.format(date); - headers.add("If-Modified-Since", formattedDate); - ifModifiedSince = formattedDate; - } - - public void setIfNoneMatch(String ifNoneMatch) { - if (this.ifNoneMatch != null) { - headers.removeAll("If-None-Match"); - } - headers.add("If-None-Match", ifNoneMatch); - this.ifNoneMatch = ifNoneMatch; - } - - /** - * Returns true if the request contains conditions that save the server from - * sending a response that the client has locally. When the caller adds - * conditions, this cache won't participate in the request. - */ - public boolean hasConditions() { - return ifModifiedSince != null || ifNoneMatch != null; - } - - public void addCookies(Map> allCookieHeaders) { - for (Map.Entry> entry : allCookieHeaders.entrySet()) { - String key = entry.getKey(); - if (("Cookie".equalsIgnoreCase(key) || "Cookie2".equalsIgnoreCase(key)) - && !entry.getValue().isEmpty()) { - headers.add(key, buildCookieHeader(entry.getValue())); - } - } - } - - /** - * Send all cookies in one big header, as recommended by - * RFC 6265. - */ - private String buildCookieHeader(List cookies) { - if (cookies.size() == 1) return cookies.get(0); - StringBuilder sb = new StringBuilder(); - for (int i = 0; i < cookies.size(); i++) { - if (i > 0) sb.append("; "); - sb.append(cookies.get(i)); - } - return sb.toString(); - } -} diff --git a/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/http/ResponseHeaders.java b/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/http/ResponseHeaders.java deleted file mode 100755 index 69e8656..0000000 --- a/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/http/ResponseHeaders.java +++ /dev/null @@ -1,512 +0,0 @@ -/* - * Copyright (C) 2011 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.squareup.okhttp.internal.http; - -import com.squareup.okhttp.ResponseSource; -import com.squareup.okhttp.internal.Platform; -import java.io.IOException; -import java.net.HttpURLConnection; -import java.net.URI; -import java.util.Collections; -import java.util.Date; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.TreeSet; -import java.util.concurrent.TimeUnit; - -import static com.squareup.okhttp.internal.Util.equal; - -/** Parsed HTTP response headers. */ -public final class ResponseHeaders { - - /** HTTP header name for the local time when the request was sent. */ - private static final String SENT_MILLIS = Platform.get().getPrefix() + "-Sent-Millis"; - - /** HTTP header name for the local time when the response was received. */ - private static final String RECEIVED_MILLIS = Platform.get().getPrefix() + "-Received-Millis"; - - /** HTTP synthetic header with the response source. */ - static final String RESPONSE_SOURCE = Platform.get().getPrefix() + "-Response-Source"; - - /** HTTP synthetic header with the selected transport (spdy/3, http/1.1, etc). */ - static final String SELECTED_TRANSPORT = Platform.get().getPrefix() + "-Selected-Transport"; - - private final URI uri; - private final RawHeaders headers; - - /** The server's time when this response was served, if known. */ - private Date servedDate; - - /** The last modified date of the response, if known. */ - private Date lastModified; - - /** - * The expiration date of the response, if known. If both this field and the - * max age are set, the max age is preferred. - */ - private Date expires; - - /** - * Extension header set by HttpURLConnectionImpl specifying the timestamp - * when the HTTP request was first initiated. - */ - private long sentRequestMillis; - - /** - * Extension header set by HttpURLConnectionImpl specifying the timestamp - * when the HTTP response was first received. - */ - private long receivedResponseMillis; - - /** - * In the response, this field's name "no-cache" is misleading. It doesn't - * prevent us from caching the response; it only means we have to validate - * the response with the origin server before returning it. We can do this - * with a conditional get. - */ - private boolean noCache; - - /** If true, this response should not be cached. */ - private boolean noStore; - - /** - * The duration past the response's served date that it can be served - * without validation. - */ - private int maxAgeSeconds = -1; - - /** - * The "s-maxage" directive is the max age for shared caches. Not to be - * confused with "max-age" for non-shared caches, As in Firefox and Chrome, - * this directive is not honored by this cache. - */ - private int sMaxAgeSeconds = -1; - - /** - * This request header field's name "only-if-cached" is misleading. It - * actually means "do not use the network". It is set by a client who only - * wants to make a request if it can be fully satisfied by the cache. - * Cached responses that would require validation (ie. conditional gets) are - * not permitted if this header is set. - */ - private boolean isPublic; - private boolean mustRevalidate; - private String etag; - private int ageSeconds = -1; - - /** Case-insensitive set of field names. */ - private Set varyFields = Collections.emptySet(); - - private String contentEncoding; - private String transferEncoding; - private long contentLength = -1; - private String connection; - private String contentType; - - public ResponseHeaders(URI uri, RawHeaders headers) { - this.uri = uri; - this.headers = headers; - - HeaderParser.CacheControlHandler handler = new HeaderParser.CacheControlHandler() { - @Override public void handle(String directive, String parameter) { - if ("no-cache".equalsIgnoreCase(directive)) { - noCache = true; - } else if ("no-store".equalsIgnoreCase(directive)) { - noStore = true; - } else if ("max-age".equalsIgnoreCase(directive)) { - maxAgeSeconds = HeaderParser.parseSeconds(parameter); - } else if ("s-maxage".equalsIgnoreCase(directive)) { - sMaxAgeSeconds = HeaderParser.parseSeconds(parameter); - } else if ("public".equalsIgnoreCase(directive)) { - isPublic = true; - } else if ("must-revalidate".equalsIgnoreCase(directive)) { - mustRevalidate = true; - } - } - }; - - for (int i = 0; i < headers.length(); i++) { - String fieldName = headers.getFieldName(i); - String value = headers.getValue(i); - if ("Cache-Control".equalsIgnoreCase(fieldName)) { - HeaderParser.parseCacheControl(value, handler); - } else if ("Date".equalsIgnoreCase(fieldName)) { - servedDate = HttpDate.parse(value); - } else if ("Expires".equalsIgnoreCase(fieldName)) { - expires = HttpDate.parse(value); - } else if ("Last-Modified".equalsIgnoreCase(fieldName)) { - lastModified = HttpDate.parse(value); - } else if ("ETag".equalsIgnoreCase(fieldName)) { - etag = value; - } else if ("Pragma".equalsIgnoreCase(fieldName)) { - if ("no-cache".equalsIgnoreCase(value)) { - noCache = true; - } - } else if ("Age".equalsIgnoreCase(fieldName)) { - ageSeconds = HeaderParser.parseSeconds(value); - } else if ("Vary".equalsIgnoreCase(fieldName)) { - // Replace the immutable empty set with something we can mutate. - if (varyFields.isEmpty()) { - varyFields = new TreeSet(String.CASE_INSENSITIVE_ORDER); - } - for (String varyField : value.split(",")) { - varyFields.add(varyField.trim()); - } - } else if ("Content-Encoding".equalsIgnoreCase(fieldName)) { - contentEncoding = value; - } else if ("Transfer-Encoding".equalsIgnoreCase(fieldName)) { - transferEncoding = value; - } else if ("Content-Length".equalsIgnoreCase(fieldName)) { - try { - contentLength = Long.parseLong(value); - } catch (NumberFormatException ignored) { - } - } else if ("Content-Type".equalsIgnoreCase(fieldName)) { - contentType = value; - } else if ("Connection".equalsIgnoreCase(fieldName)) { - connection = value; - } else if (SENT_MILLIS.equalsIgnoreCase(fieldName)) { - sentRequestMillis = Long.parseLong(value); - } else if (RECEIVED_MILLIS.equalsIgnoreCase(fieldName)) { - receivedResponseMillis = Long.parseLong(value); - } - } - } - - public boolean isContentEncodingGzip() { - return "gzip".equalsIgnoreCase(contentEncoding); - } - - public void stripContentEncoding() { - contentEncoding = null; - headers.removeAll("Content-Encoding"); - } - - public void stripContentLength() { - contentLength = -1; - headers.removeAll("Content-Length"); - } - - public boolean isChunked() { - return "chunked".equalsIgnoreCase(transferEncoding); - } - - public boolean hasConnectionClose() { - return "close".equalsIgnoreCase(connection); - } - - public URI getUri() { - return uri; - } - - public RawHeaders getHeaders() { - return headers; - } - - public Date getServedDate() { - return servedDate; - } - - public Date getLastModified() { - return lastModified; - } - - public Date getExpires() { - return expires; - } - - public boolean isNoCache() { - return noCache; - } - - public boolean isNoStore() { - return noStore; - } - - public int getMaxAgeSeconds() { - return maxAgeSeconds; - } - - public int getSMaxAgeSeconds() { - return sMaxAgeSeconds; - } - - public boolean isPublic() { - return isPublic; - } - - public boolean isMustRevalidate() { - return mustRevalidate; - } - - public String getEtag() { - return etag; - } - - public Set getVaryFields() { - return varyFields; - } - - public String getContentEncoding() { - return contentEncoding; - } - - public long getContentLength() { - return contentLength; - } - - public String getContentType() { - return contentType; - } - - public String getConnection() { - return connection; - } - - public void setLocalTimestamps(long sentRequestMillis, long receivedResponseMillis) { - this.sentRequestMillis = sentRequestMillis; - headers.add(SENT_MILLIS, Long.toString(sentRequestMillis)); - this.receivedResponseMillis = receivedResponseMillis; - headers.add(RECEIVED_MILLIS, Long.toString(receivedResponseMillis)); - } - - public void setResponseSource(ResponseSource responseSource) { - headers.set(RESPONSE_SOURCE, responseSource.toString() + " " + headers.getResponseCode()); - } - - public void setTransport(String transport) { - headers.set(SELECTED_TRANSPORT, transport); - } - - /** - * Returns the current age of the response, in milliseconds. The calculation - * is specified by RFC 2616, 13.2.3 Age Calculations. - */ - private long computeAge(long nowMillis) { - long apparentReceivedAge = - servedDate != null ? Math.max(0, receivedResponseMillis - servedDate.getTime()) : 0; - long receivedAge = - ageSeconds != -1 ? Math.max(apparentReceivedAge, TimeUnit.SECONDS.toMillis(ageSeconds)) - : apparentReceivedAge; - long responseDuration = receivedResponseMillis - sentRequestMillis; - long residentDuration = nowMillis - receivedResponseMillis; - return receivedAge + responseDuration + residentDuration; - } - - /** - * Returns the number of milliseconds that the response was fresh for, - * starting from the served date. - */ - private long computeFreshnessLifetime() { - if (maxAgeSeconds != -1) { - return TimeUnit.SECONDS.toMillis(maxAgeSeconds); - } else if (expires != null) { - long servedMillis = servedDate != null ? servedDate.getTime() : receivedResponseMillis; - long delta = expires.getTime() - servedMillis; - return delta > 0 ? delta : 0; - } else if (lastModified != null && uri.getRawQuery() == null) { - // As recommended by the HTTP RFC and implemented in Firefox, the - // max age of a document should be defaulted to 10% of the - // document's age at the time it was served. Default expiration - // dates aren't used for URIs containing a query. - long servedMillis = servedDate != null ? servedDate.getTime() : sentRequestMillis; - long delta = servedMillis - lastModified.getTime(); - return delta > 0 ? (delta / 10) : 0; - } - return 0; - } - - /** - * Returns true if computeFreshnessLifetime used a heuristic. If we used a - * heuristic to serve a cached response older than 24 hours, we are required - * to attach a warning. - */ - private boolean isFreshnessLifetimeHeuristic() { - return maxAgeSeconds == -1 && expires == null; - } - - /** - * Returns true if this response can be stored to later serve another - * request. - */ - public boolean isCacheable(RequestHeaders request) { - // Always go to network for uncacheable response codes (RFC 2616, 13.4), - // This implementation doesn't support caching partial content. - int responseCode = headers.getResponseCode(); - if (responseCode != HttpURLConnection.HTTP_OK - && responseCode != HttpURLConnection.HTTP_NOT_AUTHORITATIVE - && responseCode != HttpURLConnection.HTTP_MULT_CHOICE - && responseCode != HttpURLConnection.HTTP_MOVED_PERM - && responseCode != HttpURLConnection.HTTP_GONE) { - return false; - } - - // Responses to authorized requests aren't cacheable unless they include - // a 'public', 'must-revalidate' or 's-maxage' directive. - if (request.hasAuthorization() && !isPublic && !mustRevalidate && sMaxAgeSeconds == -1) { - return false; - } - - if (noStore) { - return false; - } - - return true; - } - - /** - * Returns true if a Vary header contains an asterisk. Such responses cannot - * be cached. - */ - public boolean hasVaryAll() { - return varyFields.contains("*"); - } - - /** - * Returns true if none of the Vary headers on this response have changed - * between {@code cachedRequest} and {@code newRequest}. - */ - public boolean varyMatches(Map> cachedRequest, - Map> newRequest) { - for (String field : varyFields) { - if (!equal(cachedRequest.get(field), newRequest.get(field))) { - return false; - } - } - return true; - } - - /** Returns the source to satisfy {@code request} given this cached response. */ - public ResponseSource chooseResponseSource(long nowMillis, RequestHeaders request) { - // If this response shouldn't have been stored, it should never be used - // as a response source. This check should be redundant as long as the - // persistence store is well-behaved and the rules are constant. - if (!isCacheable(request)) { - return ResponseSource.NETWORK; - } - - if (request.isNoCache() || request.hasConditions()) { - return ResponseSource.NETWORK; - } - - long ageMillis = computeAge(nowMillis); - long freshMillis = computeFreshnessLifetime(); - - if (request.getMaxAgeSeconds() != -1) { - freshMillis = Math.min(freshMillis, TimeUnit.SECONDS.toMillis(request.getMaxAgeSeconds())); - } - - long minFreshMillis = 0; - if (request.getMinFreshSeconds() != -1) { - minFreshMillis = TimeUnit.SECONDS.toMillis(request.getMinFreshSeconds()); - } - - long maxStaleMillis = 0; - if (!mustRevalidate && request.getMaxStaleSeconds() != -1) { - maxStaleMillis = TimeUnit.SECONDS.toMillis(request.getMaxStaleSeconds()); - } - - if (!noCache && ageMillis + minFreshMillis < freshMillis + maxStaleMillis) { - if (ageMillis + minFreshMillis >= freshMillis) { - headers.add("Warning", "110 HttpURLConnection \"Response is stale\""); - } - long oneDayMillis = 24 * 60 * 60 * 1000L; - if (ageMillis > oneDayMillis && isFreshnessLifetimeHeuristic()) { - headers.add("Warning", "113 HttpURLConnection \"Heuristic expiration\""); - } - return ResponseSource.CACHE; - } - - if (lastModified != null) { - request.setIfModifiedSince(lastModified); - } else if (servedDate != null) { - request.setIfModifiedSince(servedDate); - } - - if (etag != null) { - request.setIfNoneMatch(etag); - } - - return request.hasConditions() ? ResponseSource.CONDITIONAL_CACHE : ResponseSource.NETWORK; - } - - /** - * Returns true if this cached response should be used; false if the - * network response should be used. - */ - public boolean validate(ResponseHeaders networkResponse) { - if (networkResponse.headers.getResponseCode() == HttpURLConnection.HTTP_NOT_MODIFIED) { - return true; - } - - // The HTTP spec says that if the network's response is older than our - // cached response, we may return the cache's response. Like Chrome (but - // unlike Firefox), this client prefers to return the newer response. - if (lastModified != null - && networkResponse.lastModified != null - && networkResponse.lastModified.getTime() < lastModified.getTime()) { - return true; - } - - return false; - } - - /** - * Combines this cached header with a network header as defined by RFC 2616, - * 13.5.3. - */ - public ResponseHeaders combine(ResponseHeaders network) throws IOException { - RawHeaders result = new RawHeaders(); - result.setStatusLine(headers.getStatusLine()); - - for (int i = 0; i < headers.length(); i++) { - String fieldName = headers.getFieldName(i); - String value = headers.getValue(i); - if ("Warning".equals(fieldName) && value.startsWith("1")) { - continue; // drop 100-level freshness warnings - } - if (!isEndToEnd(fieldName) || network.headers.get(fieldName) == null) { - result.add(fieldName, value); - } - } - - for (int i = 0; i < network.headers.length(); i++) { - String fieldName = network.headers.getFieldName(i); - if (isEndToEnd(fieldName)) { - result.add(fieldName, network.headers.getValue(i)); - } - } - - return new ResponseHeaders(uri, result); - } - - /** - * Returns true if {@code fieldName} is an end-to-end HTTP header, as - * defined by RFC 2616, 13.5.1. - */ - private static boolean isEndToEnd(String fieldName) { - return !"Connection".equalsIgnoreCase(fieldName) - && !"Keep-Alive".equalsIgnoreCase(fieldName) - && !"Proxy-Authenticate".equalsIgnoreCase(fieldName) - && !"Proxy-Authorization".equalsIgnoreCase(fieldName) - && !"TE".equalsIgnoreCase(fieldName) - && !"Trailers".equalsIgnoreCase(fieldName) - && !"Transfer-Encoding".equalsIgnoreCase(fieldName) - && !"Upgrade".equalsIgnoreCase(fieldName); - } -} diff --git a/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/http/RetryableOutputStream.java b/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/http/RetryableOutputStream.java deleted file mode 100755 index 5eb6b76..0000000 --- a/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/http/RetryableOutputStream.java +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Copyright (C) 2010 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.squareup.okhttp.internal.http; - -import com.squareup.okhttp.internal.AbstractOutputStream; -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.OutputStream; -import java.net.ProtocolException; - -import static com.squareup.okhttp.internal.Util.checkOffsetAndCount; - -/** - * An HTTP request body that's completely buffered in memory. This allows - * the post body to be transparently re-sent if the HTTP request must be - * sent multiple times. - */ -final class RetryableOutputStream extends AbstractOutputStream { - private final int limit; - private final ByteArrayOutputStream content; - - public RetryableOutputStream(int limit) { - this.limit = limit; - this.content = new ByteArrayOutputStream(limit); - } - - public RetryableOutputStream() { - this.limit = -1; - this.content = new ByteArrayOutputStream(); - } - - @Override public synchronized void close() throws IOException { - if (closed) { - return; - } - closed = true; - if (content.size() < limit) { - throw new ProtocolException( - "content-length promised " + limit + " bytes, but received " + content.size()); - } - } - - @Override public synchronized void write(byte[] buffer, int offset, int count) - throws IOException { - checkNotClosed(); - checkOffsetAndCount(buffer.length, offset, count); - if (limit != -1 && content.size() > limit - count) { - throw new ProtocolException("exceeded content-length limit of " + limit + " bytes"); - } - content.write(buffer, offset, count); - } - - public synchronized int contentLength() throws IOException { - close(); - return content.size(); - } - - public void writeToSocket(OutputStream socketOut) throws IOException { - content.writeTo(socketOut); - } -} diff --git a/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/http/RouteSelector.java b/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/http/RouteSelector.java deleted file mode 100755 index 1055e4f..0000000 --- a/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/http/RouteSelector.java +++ /dev/null @@ -1,269 +0,0 @@ -/* - * Copyright (C) 2012 Square, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.squareup.okhttp.internal.http; - -import com.squareup.okhttp.Address; -import com.squareup.okhttp.Connection; -import com.squareup.okhttp.ConnectionPool; -import com.squareup.okhttp.Route; -import com.squareup.okhttp.RouteDatabase; -import com.squareup.okhttp.internal.Dns; -import java.io.IOException; -import java.net.InetAddress; -import java.net.InetSocketAddress; -import java.net.Proxy; -import java.net.ProxySelector; -import java.net.SocketAddress; -import java.net.URI; -import java.net.UnknownHostException; -import java.util.Iterator; -import java.util.LinkedList; -import java.util.List; -import java.util.NoSuchElementException; - -import static com.squareup.okhttp.internal.Util.getEffectivePort; - -/** - * Selects routes to connect to an origin server. Each connection requires a - * choice of proxy server, IP address, and TLS mode. Connections may also be - * recycled. - */ -public final class RouteSelector { - /** Uses {@link com.squareup.okhttp.internal.Platform#enableTlsExtensions}. */ - private static final int TLS_MODE_MODERN = 1; - /** Uses {@link com.squareup.okhttp.internal.Platform#supportTlsIntolerantServer}. */ - private static final int TLS_MODE_COMPATIBLE = 0; - /** No TLS mode. */ - private static final int TLS_MODE_NULL = -1; - - private final Address address; - private final URI uri; - private final ProxySelector proxySelector; - private final ConnectionPool pool; - private final Dns dns; - private final RouteDatabase routeDatabase; - - /* The most recently attempted route. */ - private Proxy lastProxy; - private InetSocketAddress lastInetSocketAddress; - - /* State for negotiating the next proxy to use. */ - private boolean hasNextProxy; - private Proxy userSpecifiedProxy; - private Iterator proxySelectorProxies; - - /* State for negotiating the next InetSocketAddress to use. */ - private InetAddress[] socketAddresses; - private int nextSocketAddressIndex; - private int socketPort; - - /* State for negotiating the next TLS configuration */ - private int nextTlsMode = TLS_MODE_NULL; - - /* State for negotiating failed routes */ - private final List postponedRoutes; - - public RouteSelector(Address address, URI uri, ProxySelector proxySelector, ConnectionPool pool, - Dns dns, RouteDatabase routeDatabase) { - this.address = address; - this.uri = uri; - this.proxySelector = proxySelector; - this.pool = pool; - this.dns = dns; - this.routeDatabase = routeDatabase; - this.postponedRoutes = new LinkedList(); - - resetNextProxy(uri, address.getProxy()); - } - - /** - * Returns true if there's another route to attempt. Every address has at - * least one route. - */ - public boolean hasNext() { - return hasNextTlsMode() || hasNextInetSocketAddress() || hasNextProxy() || hasNextPostponed(); - } - - /** - * Returns the next route address to attempt. - * - * @throws NoSuchElementException if there are no more routes to attempt. - */ - public Connection next(String method) throws IOException { - // Always prefer pooled connections over new connections. - for (Connection pooled; (pooled = pool.get(address)) != null; ) { - if (method.equals("GET") || pooled.isReadable()) return pooled; - pooled.close(); - } - - // Compute the next route to attempt. - if (!hasNextTlsMode()) { - if (!hasNextInetSocketAddress()) { - if (!hasNextProxy()) { - if (!hasNextPostponed()) { - throw new NoSuchElementException(); - } - return new Connection(nextPostponed()); - } - lastProxy = nextProxy(); - resetNextInetSocketAddress(lastProxy); - } - lastInetSocketAddress = nextInetSocketAddress(); - resetNextTlsMode(); - } - - boolean modernTls = nextTlsMode() == TLS_MODE_MODERN; - Route route = new Route(address, lastProxy, lastInetSocketAddress, modernTls); - if (routeDatabase.shouldPostpone(route)) { - postponedRoutes.add(route); - // We will only recurse in order to skip previously failed routes. They will be - // tried last. - return next(method); - } - - return new Connection(route); - } - - /** - * Clients should invoke this method when they encounter a connectivity - * failure on a connection returned by this route selector. - */ - public void connectFailed(Connection connection, IOException failure) { - Route failedRoute = connection.getRoute(); - if (failedRoute.getProxy().type() != Proxy.Type.DIRECT && proxySelector != null) { - // Tell the proxy selector when we fail to connect on a fresh connection. - proxySelector.connectFailed(uri, failedRoute.getProxy().address(), failure); - } - - routeDatabase.failed(failedRoute, failure); - } - - /** Resets {@link #nextProxy} to the first option. */ - private void resetNextProxy(URI uri, Proxy proxy) { - this.hasNextProxy = true; // This includes NO_PROXY! - if (proxy != null) { - this.userSpecifiedProxy = proxy; - } else { - List proxyList = proxySelector.select(uri); - if (proxyList != null) { - this.proxySelectorProxies = proxyList.iterator(); - } - } - } - - /** Returns true if there's another proxy to try. */ - private boolean hasNextProxy() { - return hasNextProxy; - } - - /** Returns the next proxy to try. May be PROXY.NO_PROXY but never null. */ - private Proxy nextProxy() { - // If the user specifies a proxy, try that and only that. - if (userSpecifiedProxy != null) { - hasNextProxy = false; - return userSpecifiedProxy; - } - - // Try each of the ProxySelector choices until one connection succeeds. If none succeed - // then we'll try a direct connection below. - if (proxySelectorProxies != null) { - while (proxySelectorProxies.hasNext()) { - Proxy candidate = proxySelectorProxies.next(); - if (candidate.type() != Proxy.Type.DIRECT) { - return candidate; - } - } - } - - // Finally try a direct connection. - hasNextProxy = false; - return Proxy.NO_PROXY; - } - - /** Resets {@link #nextInetSocketAddress} to the first option. */ - private void resetNextInetSocketAddress(Proxy proxy) throws UnknownHostException { - socketAddresses = null; // Clear the addresses. Necessary if getAllByName() below throws! - - String socketHost; - if (proxy.type() == Proxy.Type.DIRECT) { - socketHost = uri.getHost(); - socketPort = getEffectivePort(uri); - } else { - SocketAddress proxyAddress = proxy.address(); - if (!(proxyAddress instanceof InetSocketAddress)) { - throw new IllegalArgumentException( - "Proxy.address() is not an " + "InetSocketAddress: " + proxyAddress.getClass()); - } - InetSocketAddress proxySocketAddress = (InetSocketAddress) proxyAddress; - socketHost = proxySocketAddress.getHostName(); - socketPort = proxySocketAddress.getPort(); - } - - // Try each address for best behavior in mixed IPv4/IPv6 environments. - socketAddresses = dns.getAllByName(socketHost); - nextSocketAddressIndex = 0; - } - - /** Returns true if there's another socket address to try. */ - private boolean hasNextInetSocketAddress() { - return socketAddresses != null; - } - - /** Returns the next socket address to try. */ - private InetSocketAddress nextInetSocketAddress() throws UnknownHostException { - InetSocketAddress result = - new InetSocketAddress(socketAddresses[nextSocketAddressIndex++], socketPort); - if (nextSocketAddressIndex == socketAddresses.length) { - socketAddresses = null; // So that hasNextInetSocketAddress() returns false. - nextSocketAddressIndex = 0; - } - - return result; - } - - /** Resets {@link #nextTlsMode} to the first option. */ - private void resetNextTlsMode() { - nextTlsMode = (address.getSslSocketFactory() != null) ? TLS_MODE_MODERN : TLS_MODE_COMPATIBLE; - } - - /** Returns true if there's another TLS mode to try. */ - private boolean hasNextTlsMode() { - return nextTlsMode != TLS_MODE_NULL; - } - - /** Returns the next TLS mode to try. */ - private int nextTlsMode() { - if (nextTlsMode == TLS_MODE_MODERN) { - nextTlsMode = TLS_MODE_COMPATIBLE; - return TLS_MODE_MODERN; - } else if (nextTlsMode == TLS_MODE_COMPATIBLE) { - nextTlsMode = TLS_MODE_NULL; // So that hasNextTlsMode() returns false. - return TLS_MODE_COMPATIBLE; - } else { - throw new AssertionError(); - } - } - - /** Returns true if there is another postponed route to try. */ - private boolean hasNextPostponed() { - return !postponedRoutes.isEmpty(); - } - - /** Returns the next postponed route to try. */ - private Route nextPostponed() { - return postponedRoutes.remove(0); - } -} diff --git a/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/http/SpdyTransport.java b/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/http/SpdyTransport.java deleted file mode 100755 index 471539a..0000000 --- a/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/http/SpdyTransport.java +++ /dev/null @@ -1,103 +0,0 @@ -/* - * Copyright (C) 2012 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.squareup.okhttp.internal.http; - -import com.squareup.okhttp.internal.spdy.ErrorCode; -import com.squareup.okhttp.internal.spdy.SpdyConnection; -import com.squareup.okhttp.internal.spdy.SpdyStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.net.CacheRequest; -import java.net.URL; -import java.util.List; - -public final class SpdyTransport implements Transport { - private final HttpEngine httpEngine; - private final SpdyConnection spdyConnection; - private SpdyStream stream; - - public SpdyTransport(HttpEngine httpEngine, SpdyConnection spdyConnection) { - this.httpEngine = httpEngine; - this.spdyConnection = spdyConnection; - } - - @Override public OutputStream createRequestBody() throws IOException { - long fixedContentLength = httpEngine.policy.getFixedContentLength(); - if (fixedContentLength != -1) { - httpEngine.requestHeaders.setContentLength(fixedContentLength); - } - // TODO: if we aren't streaming up to the server, we should buffer the whole request - writeRequestHeaders(); - return stream.getOutputStream(); - } - - @Override public void writeRequestHeaders() throws IOException { - if (stream != null) { - return; - } - httpEngine.writingRequestHeaders(); - RawHeaders requestHeaders = httpEngine.requestHeaders.getHeaders(); - String version = httpEngine.connection.getHttpMinorVersion() == 1 ? "HTTP/1.1" : "HTTP/1.0"; - URL url = httpEngine.policy.getURL(); - requestHeaders.addSpdyRequestHeaders(httpEngine.method, HttpEngine.requestPath(url), version, - HttpEngine.getOriginAddress(url), httpEngine.uri.getScheme()); - boolean hasRequestBody = httpEngine.hasRequestBody(); - boolean hasResponseBody = true; - stream = spdyConnection.newStream(requestHeaders.toNameValueBlock(), hasRequestBody, - hasResponseBody); - stream.setReadTimeout(httpEngine.client.getReadTimeout()); - } - - @Override public void writeRequestBody(RetryableOutputStream requestBody) throws IOException { - throw new UnsupportedOperationException(); - } - - @Override public void flushRequest() throws IOException { - stream.getOutputStream().close(); - } - - @Override public ResponseHeaders readResponseHeaders() throws IOException { - List nameValueBlock = stream.getResponseHeaders(); - RawHeaders rawHeaders = RawHeaders.fromNameValueBlock(nameValueBlock); - httpEngine.receiveHeaders(rawHeaders); - - ResponseHeaders headers = new ResponseHeaders(httpEngine.uri, rawHeaders); - headers.setTransport("spdy/3"); - return headers; - } - - @Override public InputStream getTransferStream(CacheRequest cacheRequest) throws IOException { - return new UnknownLengthHttpInputStream(stream.getInputStream(), cacheRequest, httpEngine); - } - - @Override public boolean makeReusable(boolean streamCanceled, OutputStream requestBodyOut, - InputStream responseBodyIn) { - if (streamCanceled) { - if (stream != null) { - stream.closeLater(ErrorCode.CANCEL); - return true; - } else { - // If stream is null, it either means that writeRequestHeaders wasn't called - // or that SpdyConnection#newStream threw an IOException. In both cases there's - // nothing to do here and this stream can't be reused. - return false; - } - } - return true; - } -} diff --git a/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/http/Transport.java b/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/http/Transport.java deleted file mode 100755 index d408bfe..0000000 --- a/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/http/Transport.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright (C) 2012 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.squareup.okhttp.internal.http; - -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.net.CacheRequest; - -interface Transport { - /** - * Returns an output stream where the request body can be written. The - * returned stream will of one of two types: - *

    - *
  • Direct. Bytes are written to the socket and - * forgotten. This is most efficient, particularly for large request - * bodies. The returned stream may be buffered; the caller must call - * {@link #flushRequest} before reading the response.
  • - *
  • Buffered. Bytes are written to an in memory - * buffer, and must be explicitly flushed with a call to {@link - * #writeRequestBody}. This allows HTTP authorization (401, 407) - * responses to be retransmitted transparently.
  • - *
- */ - // TODO: don't bother retransmitting the request body? It's quite a corner - // case and there's uncertainty whether Firefox or Chrome do this - OutputStream createRequestBody() throws IOException; - - /** This should update the HTTP engine's sentRequestMillis field. */ - void writeRequestHeaders() throws IOException; - - /** - * Sends the request body returned by {@link #createRequestBody} to the - * remote peer. - */ - void writeRequestBody(RetryableOutputStream requestBody) throws IOException; - - /** Flush the request body to the underlying socket. */ - void flushRequest() throws IOException; - - /** Read response headers and update the cookie manager. */ - ResponseHeaders readResponseHeaders() throws IOException; - - // TODO: make this the content stream? - InputStream getTransferStream(CacheRequest cacheRequest) throws IOException; - - /** Returns true if the underlying connection can be recycled. */ - boolean makeReusable(boolean streamCanceled, OutputStream requestBodyOut, - InputStream responseBodyIn); -} diff --git a/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/http/UnknownLengthHttpInputStream.java b/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/http/UnknownLengthHttpInputStream.java deleted file mode 100755 index ca6bb59..0000000 --- a/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/http/UnknownLengthHttpInputStream.java +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright (C) 2012 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.squareup.okhttp.internal.http; - -import java.io.IOException; -import java.io.InputStream; -import java.net.CacheRequest; - -import static com.squareup.okhttp.internal.Util.checkOffsetAndCount; - -/** An HTTP message body terminated by the end of the underlying stream. */ -final class UnknownLengthHttpInputStream extends AbstractHttpInputStream { - private boolean inputExhausted; - - UnknownLengthHttpInputStream(InputStream in, CacheRequest cacheRequest, HttpEngine httpEngine) - throws IOException { - super(in, httpEngine, cacheRequest); - } - - @Override public int read(byte[] buffer, int offset, int count) throws IOException { - checkOffsetAndCount(buffer.length, offset, count); - checkNotClosed(); - if (in == null || inputExhausted) { - return -1; - } - int read = in.read(buffer, offset, count); - if (read == -1) { - inputExhausted = true; - endOfInput(); - return -1; - } - cacheWrite(buffer, offset, read); - return read; - } - - @Override public int available() throws IOException { - checkNotClosed(); - return in == null ? 0 : in.available(); - } - - @Override public void close() throws IOException { - if (closed) { - return; - } - closed = true; - if (!inputExhausted) { - unexpectedEndOfInput(); - } - } -} diff --git a/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/spdy/ErrorCode.java b/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/spdy/ErrorCode.java deleted file mode 100755 index 9394b69..0000000 --- a/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/spdy/ErrorCode.java +++ /dev/null @@ -1,83 +0,0 @@ -/* - * Copyright (C) 2012 Square, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.squareup.okhttp.internal.spdy; - -public enum ErrorCode { - /** Not an error! For SPDY stream resets, prefer null over NO_ERROR. */ - NO_ERROR(0, -1, 0), - - PROTOCOL_ERROR(1, 1, 1), - - /** A subtype of PROTOCOL_ERROR used by SPDY. */ - INVALID_STREAM(1, 2, -1), - - /** A subtype of PROTOCOL_ERROR used by SPDY. */ - UNSUPPORTED_VERSION(1, 4, -1), - - /** A subtype of PROTOCOL_ERROR used by SPDY. */ - STREAM_IN_USE(1, 8, -1), - - /** A subtype of PROTOCOL_ERROR used by SPDY. */ - STREAM_ALREADY_CLOSED(1, 9, -1), - - INTERNAL_ERROR(2, 6, 2), - - FLOW_CONTROL_ERROR(3, 7, -1), - - STREAM_CLOSED(5, -1, -1), - - FRAME_TOO_LARGE(6, 11, -1), - - REFUSED_STREAM(7, 3, -1), - - CANCEL(8, 5, -1), - - COMPRESSION_ERROR(9, -1, -1), - - INVALID_CREDENTIALS(-1, 10, -1); - - public final int httpCode; - public final int spdyRstCode; - public final int spdyGoAwayCode; - - private ErrorCode(int httpCode, int spdyRstCode, int spdyGoAwayCode) { - this.httpCode = httpCode; - this.spdyRstCode = spdyRstCode; - this.spdyGoAwayCode = spdyGoAwayCode; - } - - public static ErrorCode fromSpdy3Rst(int code) { - for (ErrorCode errorCode : ErrorCode.values()) { - if (errorCode.spdyRstCode == code) return errorCode; - } - return null; - } - - public static ErrorCode fromHttp2(int code) { - for (ErrorCode errorCode : ErrorCode.values()) { - if (errorCode.httpCode == code) return errorCode; - } - return null; - } - - public static ErrorCode fromSpdyGoAway(int code) { - for (ErrorCode errorCode : ErrorCode.values()) { - if (errorCode.spdyGoAwayCode == code) return errorCode; - } - return null; - } -} diff --git a/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/spdy/FrameReader.java b/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/spdy/FrameReader.java deleted file mode 100755 index 1371262..0000000 --- a/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/spdy/FrameReader.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright (C) 2011 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.squareup.okhttp.internal.spdy; - -import java.io.Closeable; -import java.io.IOException; -import java.io.InputStream; -import java.util.List; - -/** Reads transport frames for SPDY/3 or HTTP/2.0. */ -public interface FrameReader extends Closeable { - void readConnectionHeader() throws IOException; - boolean nextFrame(Handler handler) throws IOException; - - public interface Handler { - void data(boolean inFinished, int streamId, InputStream in, int length) throws IOException; - /** - * Create or update incoming headers, creating the corresponding streams - * if necessary. Frames that trigger this are SPDY SYN_STREAM, HEADERS, and - * SYN_REPLY, and HTTP/2.0 HEADERS and PUSH_PROMISE. - * - * @param inFinished true if the sender will not send further frames. - * @param outFinished true if the receiver should not send further frames. - * @param streamId the stream owning these headers. - * @param associatedStreamId the stream that triggered the sender to create - * this stream. - * @param priority or -1 for no priority. For SPDY, priorities range from 0 - * (highest) thru 7 (lowest). For HTTP/2.0, priorities range from 0 - * (highest) thru 2**31-1 (lowest). - */ - void headers(boolean outFinished, boolean inFinished, int streamId, int associatedStreamId, - int priority, List nameValueBlock, HeadersMode headersMode); - void rstStream(int streamId, ErrorCode errorCode); - void settings(boolean clearPrevious, Settings settings); - void noop(); - void ping(boolean reply, int payload1, int payload2); - void goAway(int lastGoodStreamId, ErrorCode errorCode); - void windowUpdate(int streamId, int deltaWindowSize, boolean endFlowControl); - void priority(int streamId, int priority); - } -} diff --git a/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/spdy/FrameWriter.java b/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/spdy/FrameWriter.java deleted file mode 100755 index 354f43d..0000000 --- a/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/spdy/FrameWriter.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright (C) 2011 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.squareup.okhttp.internal.spdy; - -import java.io.Closeable; -import java.io.IOException; -import java.util.List; - -/** Writes transport frames for SPDY/3 or HTTP/2.0. */ -public interface FrameWriter extends Closeable { - /** HTTP/2.0 only. */ - void connectionHeader() throws IOException; - - /** SPDY/3 only. */ - void flush() throws IOException; - void synStream(boolean outFinished, boolean inFinished, int streamId, int associatedStreamId, - int priority, int slot, List nameValueBlock) throws IOException; - void synReply(boolean outFinished, int streamId, List nameValueBlock) throws IOException; - void headers(int streamId, List nameValueBlock) throws IOException; - void rstStream(int streamId, ErrorCode errorCode) throws IOException; - void data(boolean outFinished, int streamId, byte[] data) throws IOException; - void data(boolean outFinished, int streamId, byte[] data, int offset, int byteCount) - throws IOException; - void settings(Settings settings) throws IOException; - void noop() throws IOException; - void ping(boolean reply, int payload1, int payload2) throws IOException; - void goAway(int lastGoodStreamId, ErrorCode errorCode) throws IOException; - void windowUpdate(int streamId, int deltaWindowSize) throws IOException; -} diff --git a/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/spdy/HeadersMode.java b/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/spdy/HeadersMode.java deleted file mode 100755 index e16e176..0000000 --- a/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/spdy/HeadersMode.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright (C) 2013 Square, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.squareup.okhttp.internal.spdy; - -enum HeadersMode { - SPDY_SYN_STREAM, - SPDY_REPLY, - SPDY_HEADERS, - HTTP_20_HEADERS; - - /** Returns true if it is an error these headers to create a new stream. */ - public boolean failIfStreamAbsent() { - return this == SPDY_REPLY || this == SPDY_HEADERS; - } - - /** Returns true if it is an error these headers to update an existing stream. */ - public boolean failIfStreamPresent() { - return this == SPDY_SYN_STREAM; - } - - /** - * Returns true if it is an error these headers to be the initial headers of a - * response. - */ - public boolean failIfHeadersAbsent() { - return this == SPDY_HEADERS; - } - - /** - * Returns true if it is an error these headers to be update existing headers - * of a response. - */ - public boolean failIfHeadersPresent() { - return this == SPDY_REPLY; - } -} diff --git a/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/spdy/Hpack.java b/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/spdy/Hpack.java deleted file mode 100755 index 9eaeebd..0000000 --- a/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/spdy/Hpack.java +++ /dev/null @@ -1,387 +0,0 @@ -/* - * Copyright (C) 2012 Square, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.squareup.okhttp.internal.spdy; - -import java.io.DataInputStream; -import java.io.IOException; -import java.io.OutputStream; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.BitSet; -import java.util.List; - -/** - * Read and write HPACK v03. - * http://tools.ietf.org/html/draft-ietf-httpbis-header-compression-03 - */ -final class Hpack { - - static class HeaderEntry { - private final String name; - private final String value; - - HeaderEntry(String name, String value) { - this.name = name; - this.value = value; - } - - // TODO: This needs to be the length in UTF-8 bytes, not the length in chars. - int length() { - return 32 + name.length() + value.length(); - } - } - - static final int PREFIX_5_BITS = 0x1f; - static final int PREFIX_6_BITS = 0x3f; - static final int PREFIX_7_BITS = 0x7f; - static final int PREFIX_8_BITS = 0xff; - - static final List INITIAL_CLIENT_TO_SERVER_HEADER_TABLE = Arrays.asList( - new HeaderEntry(":scheme", "http"), - new HeaderEntry(":scheme", "https"), - new HeaderEntry(":host", ""), - new HeaderEntry(":path", "/"), - new HeaderEntry(":method", "GET"), - new HeaderEntry("accept", ""), - new HeaderEntry("accept-charset", ""), - new HeaderEntry("accept-encoding", ""), - new HeaderEntry("accept-language", ""), - new HeaderEntry("cookie", ""), - new HeaderEntry("if-modified-since", ""), - new HeaderEntry("user-agent", ""), - new HeaderEntry("referer", ""), - new HeaderEntry("authorization", ""), - new HeaderEntry("allow", ""), - new HeaderEntry("cache-control", ""), - new HeaderEntry("connection", ""), - new HeaderEntry("content-length", ""), - new HeaderEntry("content-type", ""), - new HeaderEntry("date", ""), - new HeaderEntry("expect", ""), - new HeaderEntry("from", ""), - new HeaderEntry("if-match", ""), - new HeaderEntry("if-none-match", ""), - new HeaderEntry("if-range", ""), - new HeaderEntry("if-unmodified-since", ""), - new HeaderEntry("max-forwards", ""), - new HeaderEntry("proxy-authorization", ""), - new HeaderEntry("range", ""), - new HeaderEntry("via", "") - ); - - static final List INITIAL_SERVER_TO_CLIENT_HEADER_TABLE = Arrays.asList( - new HeaderEntry(":status", "200"), - new HeaderEntry("age", ""), - new HeaderEntry("cache-control", ""), - new HeaderEntry("content-length", ""), - new HeaderEntry("content-type", ""), - new HeaderEntry("date", ""), - new HeaderEntry("etag", ""), - new HeaderEntry("expires", ""), - new HeaderEntry("last-modified", ""), - new HeaderEntry("server", ""), - new HeaderEntry("set-cookie", ""), - new HeaderEntry("vary", ""), - new HeaderEntry("via", ""), - new HeaderEntry("access-control-allow-origin", ""), - new HeaderEntry("accept-ranges", ""), - new HeaderEntry("allow", ""), - new HeaderEntry("connection", ""), - new HeaderEntry("content-disposition", ""), - new HeaderEntry("content-encoding", ""), - new HeaderEntry("content-language", ""), - new HeaderEntry("content-location", ""), - new HeaderEntry("content-range", ""), - new HeaderEntry("link", ""), - new HeaderEntry("location", ""), - new HeaderEntry("proxy-authenticate", ""), - new HeaderEntry("refresh", ""), - new HeaderEntry("retry-after", ""), - new HeaderEntry("strict-transport-security", ""), - new HeaderEntry("transfer-encoding", ""), - new HeaderEntry("www-authenticate", "") - ); - - // Update these when initial tables change to sum of each entry length. - static final int INITIAL_CLIENT_TO_SERVER_HEADER_TABLE_LENGTH = 1262; - static final int INITIAL_SERVER_TO_CLIENT_HEADER_TABLE_LENGTH = 1304; - - private Hpack() { - } - - static class Reader { - private final long maxBufferSize = 4096; // TODO: needs to come from settings. - private final DataInputStream in; - - private final BitSet referenceSet = new BitSet(); - private final List headerTable; - private final List emittedHeaders = new ArrayList(); - private long bufferSize = 0; - private long bytesLeft = 0; - - Reader(DataInputStream in, boolean client) { - this.in = in; - if (client) { // we are reading from the server - this.headerTable = new ArrayList(INITIAL_SERVER_TO_CLIENT_HEADER_TABLE); - this.bufferSize = INITIAL_SERVER_TO_CLIENT_HEADER_TABLE_LENGTH; - } else { - this.headerTable = new ArrayList(INITIAL_CLIENT_TO_SERVER_HEADER_TABLE); - this.bufferSize = INITIAL_CLIENT_TO_SERVER_HEADER_TABLE_LENGTH; - } - } - - /** - * Read {@code byteCount} bytes of headers from the source stream into the - * set of emitted headers. - */ - public void readHeaders(int byteCount) throws IOException { - bytesLeft += byteCount; - // TODO: limit to 'byteCount' bytes? - - while (bytesLeft > 0) { - int b = readByte(); - - if ((b & 0x80) != 0) { - int index = readInt(b, PREFIX_7_BITS); - readIndexedHeader(index); - } else if (b == 0x60) { - readLiteralHeaderWithoutIndexingNewName(); - } else if ((b & 0xe0) == 0x60) { - int index = readInt(b, PREFIX_5_BITS); - readLiteralHeaderWithoutIndexingIndexedName(index - 1); - } else if (b == 0x40) { - readLiteralHeaderWithIncrementalIndexingNewName(); - } else if ((b & 0xe0) == 0x40) { - int index = readInt(b, PREFIX_5_BITS); - readLiteralHeaderWithIncrementalIndexingIndexedName(index - 1); - } else if (b == 0) { - readLiteralHeaderWithSubstitutionIndexingNewName(); - } else if ((b & 0xc0) == 0) { - int index = readInt(b, PREFIX_6_BITS); - readLiteralHeaderWithSubstitutionIndexingIndexedName(index - 1); - } else { - throw new AssertionError(); - } - } - } - - public void emitReferenceSet() { - for (int i = referenceSet.nextSetBit(0); i != -1; i = referenceSet.nextSetBit(i + 1)) { - emittedHeaders.add(getName(i)); - emittedHeaders.add(getValue(i)); - } - } - - /** - * Returns all headers emitted since they were last cleared, then clears the - * emitted headers. - */ - public List getAndReset() { - List result = new ArrayList(emittedHeaders); - emittedHeaders.clear(); - return result; - } - - private void readIndexedHeader(int index) { - if (referenceSet.get(index)) { - referenceSet.clear(index); - } else { - referenceSet.set(index); - } - } - - private void readLiteralHeaderWithoutIndexingIndexedName(int index) - throws IOException { - String name = getName(index); - String value = readString(); - emittedHeaders.add(name); - emittedHeaders.add(value); - } - - private void readLiteralHeaderWithoutIndexingNewName() - throws IOException { - String name = readString(); - String value = readString(); - emittedHeaders.add(name); - emittedHeaders.add(value); - } - - private void readLiteralHeaderWithIncrementalIndexingIndexedName(int nameIndex) - throws IOException { - String name = getName(nameIndex); - String value = readString(); - int index = headerTable.size(); // append to tail - insertIntoHeaderTable(index, new HeaderEntry(name, value)); - } - - private void readLiteralHeaderWithIncrementalIndexingNewName() throws IOException { - String name = readString(); - String value = readString(); - int index = headerTable.size(); // append to tail - insertIntoHeaderTable(index, new HeaderEntry(name, value)); - } - - private void readLiteralHeaderWithSubstitutionIndexingIndexedName(int nameIndex) - throws IOException { - int index = readInt(readByte(), PREFIX_8_BITS); - String name = getName(nameIndex); - String value = readString(); - insertIntoHeaderTable(index, new HeaderEntry(name, value)); - } - - private void readLiteralHeaderWithSubstitutionIndexingNewName() throws IOException { - String name = readString(); - int index = readInt(readByte(), PREFIX_8_BITS); - String value = readString(); - insertIntoHeaderTable(index, new HeaderEntry(name, value)); - } - - private String getName(int index) { - return headerTable.get(index).name; - } - - private String getValue(int index) { - return headerTable.get(index).value; - } - - private void insertIntoHeaderTable(int index, HeaderEntry entry) { - int delta = entry.length(); - if (index != headerTable.size()) { - delta -= headerTable.get(index).length(); - } - - // if the new or replacement header is too big, drop all entries. - if (delta > maxBufferSize) { - headerTable.clear(); - bufferSize = 0; - // emit the large header to the callback. - emittedHeaders.add(entry.name); - emittedHeaders.add(entry.value); - return; - } - - // Prune headers to the required length. - while (bufferSize + delta > maxBufferSize) { - remove(0); - index--; - } - - if (index < 0) { // we pruned it, so insert at beginning - index = 0; - headerTable.add(index, entry); - } else if (index == headerTable.size()) { // append to the end - headerTable.add(index, entry); - } else { // replace value at same position - headerTable.set(index, entry); - } - - bufferSize += delta; - referenceSet.set(index); - } - - private void remove(int index) { - bufferSize -= headerTable.remove(index).length(); - } - - private int readByte() throws IOException { - bytesLeft--; - return in.readByte() & 0xff; - } - - int readInt(int firstByte, int prefixMask) throws IOException { - int prefix = firstByte & prefixMask; - if (prefix < prefixMask) { - return prefix; // This was a single byte value. - } - - // This is a multibyte value. Read 7 bits at a time. - int result = prefixMask; - int shift = 0; - while (true) { - int b = readByte(); - if ((b & 0x80) != 0) { // Equivalent to (b >= 128) since b is in [0..255]. - result += (b & 0x7f) << shift; - shift += 7; - } else { - result += b << shift; // Last byte. - break; - } - } - return result; - } - - /** - * Reads a UTF-8 encoded string. Since ASCII is a subset of UTF-8, this method - * may be used to read strings that are known to be ASCII-only. - */ - public String readString() throws IOException { - int firstByte = readByte(); - int length = readInt(firstByte, PREFIX_8_BITS); - byte[] encoded = new byte[length]; - bytesLeft -= length; - in.readFully(encoded); - return new String(encoded, "UTF-8"); - } - } - - static class Writer { - private final OutputStream out; - - Writer(OutputStream out) { - this.out = out; - } - - public void writeHeaders(List nameValueBlock) throws IOException { - // TODO: implement a compression strategy. - for (int i = 0, size = nameValueBlock.size(); i < size; i += 2) { - out.write(0x60); // Literal Header without Indexing - New Name. - writeString(nameValueBlock.get(i)); - writeString(nameValueBlock.get(i + 1)); - } - } - - public void writeInt(int value, int prefixMask, int bits) throws IOException { - // Write the raw value for a single byte value. - if (value < prefixMask) { - out.write(bits | value); - return; - } - - // Write the mask to start a multibyte value. - out.write(bits | prefixMask); - value -= prefixMask; - - // Write 7 bits at a time 'til we're done. - while (value >= 0x80) { - int b = value & 0x7f; - out.write(b | 0x80); - value >>>= 7; - } - out.write(value); - } - - /** - * Writes a UTF-8 encoded string. Since ASCII is a subset of UTF-8, this - * method can be used to write strings that are known to be ASCII-only. - */ - public void writeString(String headerName) throws IOException { - byte[] bytes = headerName.getBytes("UTF-8"); - writeInt(bytes.length, PREFIX_8_BITS, 0); - out.write(bytes); - } - } -} diff --git a/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/spdy/Http20Draft06.java b/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/spdy/Http20Draft06.java deleted file mode 100755 index 3d53f48..0000000 --- a/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/spdy/Http20Draft06.java +++ /dev/null @@ -1,385 +0,0 @@ -/* - * Copyright (C) 2013 Square, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.squareup.okhttp.internal.spdy; - -import com.squareup.okhttp.internal.Util; -import java.io.ByteArrayOutputStream; -import java.io.DataInputStream; -import java.io.DataOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.io.UnsupportedEncodingException; -import java.util.Arrays; -import java.util.List; - -/** - * Read and write http/2 v06 frames. - * http://tools.ietf.org/html/draft-ietf-httpbis-http2-06 - */ -final class Http20Draft06 implements Variant { - private static final byte[] CONNECTION_HEADER; - static { - try { - CONNECTION_HEADER = "PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n".getBytes("UTF-8"); - } catch (UnsupportedEncodingException e) { - throw new AssertionError(); - } - } - - static final int TYPE_DATA = 0x0; - static final int TYPE_HEADERS = 0x1; - static final int TYPE_PRIORITY = 0x2; - static final int TYPE_RST_STREAM = 0x3; - static final int TYPE_SETTINGS = 0x4; - static final int TYPE_PUSH_PROMISE = 0x5; - static final int TYPE_PING = 0x6; - static final int TYPE_GOAWAY = 0x7; - static final int TYPE_WINDOW_UPDATE = 0x9; - static final int TYPE_CONTINUATION = 0xa; - - static final int FLAG_END_STREAM = 0x1; - /** Used for headers, push-promise and continuation. */ - static final int FLAG_END_HEADERS = 0x4; - static final int FLAG_PRIORITY = 0x8; - static final int FLAG_PONG = 0x1; - static final int FLAG_END_FLOW_CONTROL = 0x1; - - @Override public FrameReader newReader(InputStream in, boolean client) { - return new Reader(in, client); - } - - @Override public FrameWriter newWriter(OutputStream out, boolean client) { - return new Writer(out, client); - } - - static final class Reader implements FrameReader { - private final DataInputStream in; - private final boolean client; - private final Hpack.Reader hpackReader; - - Reader(InputStream in, boolean client) { - this.in = new DataInputStream(in); - this.client = client; - this.hpackReader = new Hpack.Reader(this.in, client); - } - - @Override public void readConnectionHeader() throws IOException { - if (client) return; // Nothing to read; servers don't send connection headers! - byte[] connectionHeader = new byte[CONNECTION_HEADER.length]; - in.readFully(connectionHeader); - if (!Arrays.equals(connectionHeader, CONNECTION_HEADER)) { - throw ioException("Expected a connection header but was " - + Arrays.toString(connectionHeader)); - } - } - - @Override public boolean nextFrame(Handler handler) throws IOException { - int w1; - try { - w1 = in.readInt(); - } catch (IOException e) { - return false; // This might be a normal socket close. - } - int w2 = in.readInt(); - - int length = (w1 & 0xffff0000) >> 16; - int type = (w1 & 0xff00) >> 8; - int flags = w1 & 0xff; - // boolean r = (w2 & 0x80000000) != 0; // Reserved. - int streamId = (w2 & 0x7fffffff); - - switch (type) { - case TYPE_DATA: - readData(handler, flags, length, streamId); - return true; - - case TYPE_HEADERS: - readHeaders(handler, flags, length, streamId); - return true; - - case TYPE_PRIORITY: - readPriority(handler, flags, length, streamId); - return true; - - case TYPE_RST_STREAM: - readRstStream(handler, flags, length, streamId); - return true; - - case TYPE_SETTINGS: - readSettings(handler, flags, length, streamId); - return true; - - case TYPE_PUSH_PROMISE: - readPushPromise(handler, flags, length, streamId); - return true; - - case TYPE_PING: - readPing(handler, flags, length, streamId); - return true; - - case TYPE_GOAWAY: - readGoAway(handler, flags, length, streamId); - return true; - - case TYPE_WINDOW_UPDATE: - readWindowUpdate(handler, flags, length, streamId); - return true; - } - - throw new UnsupportedOperationException("TODO"); - } - - private void readHeaders(Handler handler, int flags, int length, int streamId) - throws IOException { - if (streamId == 0) throw ioException("TYPE_HEADERS streamId == 0"); - - boolean inFinished = (flags & FLAG_END_STREAM) != 0; - - while (true) { - hpackReader.readHeaders(length); - - if ((flags & FLAG_END_HEADERS) != 0) { - hpackReader.emitReferenceSet(); - List namesAndValues = hpackReader.getAndReset(); - int priority = -1; // TODO: priority - handler.headers(false, inFinished, streamId, -1, priority, namesAndValues, - HeadersMode.HTTP_20_HEADERS); - return; - } - - // Read another continuation frame. - int w1 = in.readInt(); - int w2 = in.readInt(); - - length = (w1 & 0xffff0000) >> 16; - int newType = (w1 & 0xff00) >> 8; - flags = w1 & 0xff; - - // TODO: remove in draft 8: CONTINUATION no longer sets END_STREAM - inFinished = (flags & FLAG_END_STREAM) != 0; - - // boolean u = (w2 & 0x80000000) != 0; // Unused. - int newStreamId = (w2 & 0x7fffffff); - - if (newType != TYPE_CONTINUATION) { - throw ioException("TYPE_CONTINUATION didn't have FLAG_END_HEADERS"); - } - if (newStreamId != streamId) throw ioException("TYPE_CONTINUATION streamId changed"); - } - } - - private void readData(Handler handler, int flags, int length, int streamId) throws IOException { - boolean inFinished = (flags & FLAG_END_STREAM) != 0; - handler.data(inFinished, streamId, in, length); - } - - private void readPriority(Handler handler, int flags, int length, int streamId) - throws IOException { - if (length != 4) throw ioException("TYPE_PRIORITY length: %d != 4", length); - if (streamId == 0) throw ioException("TYPE_PRIORITY streamId == 0"); - int w1 = in.readInt(); - // boolean r = (w1 & 0x80000000) != 0; // Reserved. - int priority = (w1 & 0x7fffffff); - handler.priority(streamId, priority); - } - - private void readRstStream(Handler handler, int flags, int length, int streamId) - throws IOException { - if (length != 4) throw ioException("TYPE_RST_STREAM length: %d != 4", length); - if (streamId == 0) throw ioException("TYPE_RST_STREAM streamId == 0"); - int errorCodeInt = in.readInt(); - ErrorCode errorCode = ErrorCode.fromHttp2(errorCodeInt); - if (errorCode == null) { - throw ioException("TYPE_RST_STREAM unexpected error code: %d", errorCodeInt); - } - handler.rstStream(streamId, errorCode); - } - - private void readSettings(Handler handler, int flags, int length, int streamId) - throws IOException { - if (length % 8 != 0) throw ioException("TYPE_SETTINGS length %% 8 != 0: %s", length); - if (streamId != 0) throw ioException("TYPE_SETTINGS streamId != 0"); - Settings settings = new Settings(); - for (int i = 0; i < length; i += 8) { - int w1 = in.readInt(); - int value = in.readInt(); - // int r = (w1 & 0xff000000) >>> 24; // Reserved. - int id = w1 & 0xffffff; - settings.set(id, 0, value); - } - handler.settings(false, settings); - } - - private void readPushPromise(Handler handler, int flags, int length, int streamId) { - // TODO: - } - - private void readPing(Handler handler, int flags, int length, int streamId) throws IOException { - if (length != 8) throw ioException("TYPE_PING length != 8: %s", length); - if (streamId != 0) throw ioException("TYPE_PING streamId != 0"); - int payload1 = in.readInt(); - int payload2 = in.readInt(); - boolean reply = (flags & FLAG_PONG) != 0; - handler.ping(reply, payload1, payload2); - } - - private void readGoAway(Handler handler, int flags, int length, int streamId) - throws IOException { - if (length < 8) throw ioException("TYPE_GOAWAY length < 8: %s", length); - int lastStreamId = in.readInt(); - int errorCodeInt = in.readInt(); - int opaqueDataLength = length - 8; - ErrorCode errorCode = ErrorCode.fromHttp2(errorCodeInt); - if (errorCode == null) { - throw ioException("TYPE_RST_STREAM unexpected error code: %d", errorCodeInt); - } - if (Util.skipByReading(in, opaqueDataLength) != opaqueDataLength) { - throw new IOException("TYPE_GOAWAY opaque data was truncated"); - } - handler.goAway(lastStreamId, errorCode); - } - - private void readWindowUpdate(Handler handler, int flags, int length, int streamId) - throws IOException { - int w1 = in.readInt(); - // boolean r = (w1 & 0x80000000) != 0; // Reserved. - int windowSizeIncrement = (w1 & 0x7fffffff); - boolean endFlowControl = (flags & FLAG_END_FLOW_CONTROL) != 0; - handler.windowUpdate(streamId, windowSizeIncrement, endFlowControl); - } - - private static IOException ioException(String message, Object... args) throws IOException { - throw new IOException(String.format(message, args)); - } - - @Override public void close() throws IOException { - in.close(); - } - } - - static final class Writer implements FrameWriter { - private final DataOutputStream out; - private final boolean client; - private final ByteArrayOutputStream hpackBuffer; - private final Hpack.Writer hpackWriter; - - Writer(OutputStream out, boolean client) { - this.out = new DataOutputStream(out); - this.client = client; - this.hpackBuffer = new ByteArrayOutputStream(); - this.hpackWriter = new Hpack.Writer(hpackBuffer); - } - - @Override public synchronized void flush() throws IOException { - out.flush(); - } - - @Override public synchronized void connectionHeader() throws IOException { - if (!client) return; // Nothing to write; servers don't send connection headers! - out.write(CONNECTION_HEADER); - } - - @Override public synchronized void synStream(boolean outFinished, boolean inFinished, - int streamId, int associatedStreamId, int priority, int slot, List nameValueBlock) - throws IOException { - if (inFinished) throw new UnsupportedOperationException(); - headers(outFinished, streamId, priority, nameValueBlock); - } - - @Override public synchronized void synReply(boolean outFinished, int streamId, - List nameValueBlock) throws IOException { - headers(outFinished, streamId, -1, nameValueBlock); - } - - @Override public synchronized void headers(int streamId, List nameValueBlock) - throws IOException { - headers(false, streamId, -1, nameValueBlock); - } - - private void headers(boolean outFinished, int streamId, int priority, - List nameValueBlock) throws IOException { - hpackBuffer.reset(); - hpackWriter.writeHeaders(nameValueBlock); - int type = TYPE_HEADERS; - // TODO: implement CONTINUATION - int length = hpackBuffer.size(); - int flags = FLAG_END_HEADERS; - if (outFinished) flags |= FLAG_END_STREAM; - if (priority != -1) flags |= FLAG_PRIORITY; - out.writeInt((length & 0xffff) << 16 | (type & 0xff) << 8 | (flags & 0xff)); - out.writeInt(streamId & 0x7fffffff); - if (priority != -1) out.writeInt(priority & 0x7fffffff); - hpackBuffer.writeTo(out); - } - - @Override public synchronized void rstStream(int streamId, ErrorCode errorCode) - throws IOException { - throw new UnsupportedOperationException("TODO"); - } - - @Override public void data(boolean outFinished, int streamId, byte[] data) throws IOException { - data(outFinished, streamId, data, 0, data.length); - } - - @Override public synchronized void data(boolean outFinished, int streamId, byte[] data, - int offset, int byteCount) throws IOException { - int type = TYPE_DATA; - int flags = 0; - if (outFinished) flags |= FLAG_END_STREAM; - out.writeInt((byteCount & 0xffff) << 16 | (type & 0xff) << 8 | (flags & 0xff)); - out.writeInt(streamId & 0x7fffffff); - out.write(data, offset, byteCount); - } - - @Override public synchronized void settings(Settings settings) throws IOException { - int type = TYPE_SETTINGS; - int length = settings.size() * 8; - int flags = 0; - int streamId = 0; - out.writeInt((length & 0xffff) << 16 | (type & 0xff) << 8 | (flags & 0xff)); - out.writeInt(streamId & 0x7fffffff); - for (int i = 0; i < Settings.COUNT; i++) { - if (!settings.isSet(i)) continue; - out.writeInt(i & 0xffffff); - out.writeInt(settings.get(i)); - } - } - - @Override public synchronized void noop() throws IOException { - throw new UnsupportedOperationException(); - } - - @Override public synchronized void ping(boolean reply, int payload1, int payload2) - throws IOException { - // TODO - } - - @Override public synchronized void goAway(int lastGoodStreamId, ErrorCode errorCode) - throws IOException { - // TODO - } - - @Override public synchronized void windowUpdate(int streamId, int deltaWindowSize) - throws IOException { - // TODO - } - - @Override public void close() throws IOException { - out.close(); - } - } -} diff --git a/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/spdy/IncomingStreamHandler.java b/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/spdy/IncomingStreamHandler.java deleted file mode 100755 index 44d4ea2..0000000 --- a/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/spdy/IncomingStreamHandler.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright (C) 2011 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.squareup.okhttp.internal.spdy; - -import java.io.IOException; - -/** Listener to be notified when a connected peer creates a new stream. */ -public interface IncomingStreamHandler { - IncomingStreamHandler REFUSE_INCOMING_STREAMS = new IncomingStreamHandler() { - @Override public void receive(SpdyStream stream) throws IOException { - stream.close(ErrorCode.REFUSED_STREAM); - } - }; - - /** - * Handle a new stream from this connection's peer. Implementations should - * respond by either {@link SpdyStream#reply replying to the stream} or - * {@link SpdyStream#close closing it}. This response does not need to be - * synchronous. - */ - void receive(SpdyStream stream) throws IOException; -} diff --git a/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/spdy/NameValueBlockReader.java b/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/spdy/NameValueBlockReader.java deleted file mode 100755 index b731a6d..0000000 --- a/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/spdy/NameValueBlockReader.java +++ /dev/null @@ -1,139 +0,0 @@ -/* - * Copyright (C) 2012 Square, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.squareup.okhttp.internal.spdy; - -import com.squareup.okhttp.internal.Util; -import java.io.Closeable; -import java.io.DataInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.util.ArrayList; -import java.util.List; -import java.util.zip.DataFormatException; -import java.util.zip.Inflater; -import java.util.zip.InflaterInputStream; - -/** - * Reads a SPDY/3 Name/Value header block. This class is made complicated by the - * requirement that we're strict with which bytes we put in the compressed bytes - * buffer. We need to put all compressed bytes into that buffer -- but no other - * bytes. - */ -class NameValueBlockReader implements Closeable { - private final DataInputStream nameValueBlockIn; - private final FillableInflaterInputStream fillableInflaterInputStream; - private int compressedLimit; - - NameValueBlockReader(final InputStream in) { - // Limit the inflater input stream to only those bytes in the Name/Value block. We cut the - // inflater off at its source because we can't predict the ratio of compressed bytes to - // uncompressed bytes. - InputStream throttleStream = new InputStream() { - @Override public int read() throws IOException { - return Util.readSingleByte(this); - } - - @Override public int read(byte[] buffer, int offset, int byteCount) throws IOException { - byteCount = Math.min(byteCount, compressedLimit); - int consumed = in.read(buffer, offset, byteCount); - compressedLimit -= consumed; - return consumed; - } - - @Override public void close() throws IOException { - in.close(); - } - }; - - // Subclass inflater to install a dictionary when it's needed. - Inflater inflater = new Inflater() { - @Override public int inflate(byte[] buffer, int offset, int count) - throws DataFormatException { - int result = super.inflate(buffer, offset, count); - if (result == 0 && needsDictionary()) { - setDictionary(Spdy3.DICTIONARY); - result = super.inflate(buffer, offset, count); - } - return result; - } - }; - - fillableInflaterInputStream = new FillableInflaterInputStream(throttleStream, inflater); - nameValueBlockIn = new DataInputStream(fillableInflaterInputStream); - } - - /** Extend the inflater stream so we can eagerly fill the compressed bytes buffer if necessary. */ - static class FillableInflaterInputStream extends InflaterInputStream { - public FillableInflaterInputStream(InputStream in, Inflater inf) { - super(in, inf); - } - - @Override public void fill() throws IOException { - super.fill(); // This method is protected in the superclass. - } - } - - public List readNameValueBlock(int length) throws IOException { - this.compressedLimit += length; - try { - int numberOfPairs = nameValueBlockIn.readInt(); - if (numberOfPairs < 0) { - throw new IOException("numberOfPairs < 0: " + numberOfPairs); - } - if (numberOfPairs > 1024) { - throw new IOException("numberOfPairs > 1024: " + numberOfPairs); - } - List entries = new ArrayList(numberOfPairs * 2); - for (int i = 0; i < numberOfPairs; i++) { - String name = readString(); - String values = readString(); - if (name.length() == 0) throw new IOException("name.length == 0"); - entries.add(name); - entries.add(values); - } - - doneReading(); - - return entries; - } catch (DataFormatException e) { - throw new IOException(e.getMessage()); - } - } - - private void doneReading() throws IOException { - if (compressedLimit == 0) return; - - // Read any outstanding unread bytes. One side-effect of deflate compression is that sometimes - // there are bytes remaining in the stream after we've consumed all of the content. - fillableInflaterInputStream.fill(); - - if (compressedLimit != 0) { - throw new IOException("compressedLimit > 0: " + compressedLimit); - } - } - - private String readString() throws DataFormatException, IOException { - int length = nameValueBlockIn.readInt(); - byte[] bytes = new byte[length]; - Util.readFully(nameValueBlockIn, bytes); - return new String(bytes, 0, length, "UTF-8"); - } - - @Override public void close() throws IOException { - nameValueBlockIn.close(); - } -} diff --git a/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/spdy/Ping.java b/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/spdy/Ping.java deleted file mode 100755 index c585255..0000000 --- a/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/spdy/Ping.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Copyright (C) 2012 Square, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.squareup.okhttp.internal.spdy; - -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.TimeUnit; - -/** - * A locally-originated ping. - */ -public final class Ping { - private final CountDownLatch latch = new CountDownLatch(1); - private long sent = -1; - private long received = -1; - - Ping() { - } - - void send() { - if (sent != -1) throw new IllegalStateException(); - sent = System.nanoTime(); - } - - void receive() { - if (received != -1 || sent == -1) throw new IllegalStateException(); - received = System.nanoTime(); - latch.countDown(); - } - - void cancel() { - if (received != -1 || sent == -1) throw new IllegalStateException(); - received = sent - 1; - latch.countDown(); - } - - /** - * Returns the round trip time for this ping in nanoseconds, waiting for the - * response to arrive if necessary. Returns -1 if the response was - * cancelled. - */ - public long roundTripTime() throws InterruptedException { - latch.await(); - return received - sent; - } - - /** - * Returns the round trip time for this ping in nanoseconds, or -1 if the - * response was cancelled, or -2 if the timeout elapsed before the round - * trip completed. - */ - public long roundTripTime(long timeout, TimeUnit unit) throws InterruptedException { - if (latch.await(timeout, unit)) { - return received - sent; - } else { - return -2; - } - } -} diff --git a/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/spdy/Settings.java b/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/spdy/Settings.java deleted file mode 100755 index 05380e2..0000000 --- a/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/spdy/Settings.java +++ /dev/null @@ -1,187 +0,0 @@ -/* - * Copyright (C) 2012 Square, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.squareup.okhttp.internal.spdy; - -final class Settings { - /** - * From the spdy/3 spec, the default initial window size for all streams is - * 64 KiB. (Chrome 25 uses 10 MiB). - */ - static final int DEFAULT_INITIAL_WINDOW_SIZE = 64 * 1024; - - /** Peer request to clear durable settings. */ - static final int FLAG_CLEAR_PREVIOUSLY_PERSISTED_SETTINGS = 0x1; - - /** Sent by servers only. The peer requests this setting persisted for future connections. */ - static final int PERSIST_VALUE = 0x1; - /** Sent by clients only. The client is reminding the server of a persisted value. */ - static final int PERSISTED = 0x2; - - /** Sender's estimate of max incoming kbps. */ - static final int UPLOAD_BANDWIDTH = 1; - /** Sender's estimate of max outgoing kbps. */ - static final int DOWNLOAD_BANDWIDTH = 2; - /** Sender's estimate of milliseconds between sending a request and receiving a response. */ - static final int ROUND_TRIP_TIME = 3; - /** Sender's maximum number of concurrent streams. */ - static final int MAX_CONCURRENT_STREAMS = 4; - /** Current CWND in Packets. */ - static final int CURRENT_CWND = 5; - /** Retransmission rate. Percentage */ - static final int DOWNLOAD_RETRANS_RATE = 6; - /** Window size in bytes. */ - static final int INITIAL_WINDOW_SIZE = 7; - /** Window size in bytes. */ - static final int CLIENT_CERTIFICATE_VECTOR_SIZE = 8; - /** Flow control options. */ - static final int FLOW_CONTROL_OPTIONS = 9; - - /** Total number of settings. */ - static final int COUNT = 10; - - /** If set, flow control is disabled for streams directed to the sender of these settings. */ - static final int FLOW_CONTROL_OPTIONS_DISABLED = 0x1; - - /** Bitfield of which flags that values. */ - private int set; - - /** Bitfield of flags that have {@link #PERSIST_VALUE}. */ - private int persistValue; - - /** Bitfield of flags that have {@link #PERSISTED}. */ - private int persisted; - - /** Flag values. */ - private final int[] values = new int[COUNT]; - - void set(int id, int idFlags, int value) { - if (id >= values.length) { - return; // Discard unknown settings. - } - - int bit = 1 << id; - set |= bit; - if ((idFlags & PERSIST_VALUE) != 0) { - persistValue |= bit; - } else { - persistValue &= ~bit; - } - if ((idFlags & PERSISTED) != 0) { - persisted |= bit; - } else { - persisted &= ~bit; - } - - values[id] = value; - } - - /** Returns true if a value has been assigned for the setting {@code id}. */ - boolean isSet(int id) { - int bit = 1 << id; - return (set & bit) != 0; - } - - /** Returns the value for the setting {@code id}, or 0 if unset. */ - int get(int id) { - return values[id]; - } - - /** Returns the flags for the setting {@code id}, or 0 if unset. */ - int flags(int id) { - int result = 0; - if (isPersisted(id)) result |= Settings.PERSISTED; - if (persistValue(id)) result |= Settings.PERSIST_VALUE; - return result; - } - - /** Returns the number of settings that have values assigned. */ - int size() { - return Integer.bitCount(set); - } - - int getUploadBandwidth(int defaultValue) { - int bit = 1 << UPLOAD_BANDWIDTH; - return (bit & set) != 0 ? values[UPLOAD_BANDWIDTH] : defaultValue; - } - - int getDownloadBandwidth(int defaultValue) { - int bit = 1 << DOWNLOAD_BANDWIDTH; - return (bit & set) != 0 ? values[DOWNLOAD_BANDWIDTH] : defaultValue; - } - - int getRoundTripTime(int defaultValue) { - int bit = 1 << ROUND_TRIP_TIME; - return (bit & set) != 0 ? values[ROUND_TRIP_TIME] : defaultValue; - } - - int getMaxConcurrentStreams(int defaultValue) { - int bit = 1 << MAX_CONCURRENT_STREAMS; - return (bit & set) != 0 ? values[MAX_CONCURRENT_STREAMS] : defaultValue; - } - - int getCurrentCwnd(int defaultValue) { - int bit = 1 << CURRENT_CWND; - return (bit & set) != 0 ? values[CURRENT_CWND] : defaultValue; - } - - int getDownloadRetransRate(int defaultValue) { - int bit = 1 << DOWNLOAD_RETRANS_RATE; - return (bit & set) != 0 ? values[DOWNLOAD_RETRANS_RATE] : defaultValue; - } - - int getInitialWindowSize(int defaultValue) { - int bit = 1 << INITIAL_WINDOW_SIZE; - return (bit & set) != 0 ? values[INITIAL_WINDOW_SIZE] : defaultValue; - } - - int getClientCertificateVectorSize(int defaultValue) { - int bit = 1 << CLIENT_CERTIFICATE_VECTOR_SIZE; - return (bit & set) != 0 ? values[CLIENT_CERTIFICATE_VECTOR_SIZE] : defaultValue; - } - - // TODO: honor this setting. - boolean isFlowControlDisabled() { - int bit = 1 << FLOW_CONTROL_OPTIONS; - int value = (bit & set) != 0 ? values[FLOW_CONTROL_OPTIONS] : 0; - return (value & FLOW_CONTROL_OPTIONS_DISABLED) != 0; - } - - /** - * Returns true if this user agent should use this setting in future SPDY - * connections to the same host. - */ - boolean persistValue(int id) { - int bit = 1 << id; - return (persistValue & bit) != 0; - } - - /** Returns true if this setting was persisted. */ - boolean isPersisted(int id) { - int bit = 1 << id; - return (persisted & bit) != 0; - } - - /** - * Writes {@code other} into this. If any setting is populated by this and - * {@code other}, the value and flags from {@code other} will be kept. - */ - void merge(Settings other) { - for (int i = 0; i < COUNT; i++) { - if (!other.isSet(i)) continue; - set(i, other.flags(i), other.get(i)); - } - } -} diff --git a/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/spdy/Spdy3.java b/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/spdy/Spdy3.java deleted file mode 100755 index 5d9a49b..0000000 --- a/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/spdy/Spdy3.java +++ /dev/null @@ -1,463 +0,0 @@ -/* - * Copyright (C) 2011 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.squareup.okhttp.internal.spdy; - -import com.squareup.okhttp.internal.Platform; -import com.squareup.okhttp.internal.Util; -import java.io.ByteArrayOutputStream; -import java.io.DataInputStream; -import java.io.DataOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.io.UnsupportedEncodingException; -import java.net.ProtocolException; -import java.util.List; -import java.util.zip.Deflater; - -final class Spdy3 implements Variant { - static final int TYPE_DATA = 0x0; - static final int TYPE_SYN_STREAM = 0x1; - static final int TYPE_SYN_REPLY = 0x2; - static final int TYPE_RST_STREAM = 0x3; - static final int TYPE_SETTINGS = 0x4; - static final int TYPE_NOOP = 0x5; - static final int TYPE_PING = 0x6; - static final int TYPE_GOAWAY = 0x7; - static final int TYPE_HEADERS = 0x8; - static final int TYPE_WINDOW_UPDATE = 0x9; - static final int TYPE_CREDENTIAL = 0x10; - - static final int FLAG_FIN = 0x1; - static final int FLAG_UNIDIRECTIONAL = 0x2; - - static final int VERSION = 3; - - static final byte[] DICTIONARY; - static { - try { - DICTIONARY = ("\u0000\u0000\u0000\u0007options\u0000\u0000\u0000\u0004hea" - + "d\u0000\u0000\u0000\u0004post\u0000\u0000\u0000\u0003put\u0000\u0000\u0000\u0006dele" - + "te\u0000\u0000\u0000\u0005trace\u0000\u0000\u0000\u0006accept\u0000\u0000\u0000" - + "\u000Eaccept-charset\u0000\u0000\u0000\u000Faccept-encoding\u0000\u0000\u0000\u000Fa" - + "ccept-language\u0000\u0000\u0000\raccept-ranges\u0000\u0000\u0000\u0003age\u0000" - + "\u0000\u0000\u0005allow\u0000\u0000\u0000\rauthorization\u0000\u0000\u0000\rcache-co" - + "ntrol\u0000\u0000\u0000\nconnection\u0000\u0000\u0000\fcontent-base\u0000\u0000" - + "\u0000\u0010content-encoding\u0000\u0000\u0000\u0010content-language\u0000\u0000" - + "\u0000\u000Econtent-length\u0000\u0000\u0000\u0010content-location\u0000\u0000\u0000" - + "\u000Bcontent-md5\u0000\u0000\u0000\rcontent-range\u0000\u0000\u0000\fcontent-type" - + "\u0000\u0000\u0000\u0004date\u0000\u0000\u0000\u0004etag\u0000\u0000\u0000\u0006expe" - + "ct\u0000\u0000\u0000\u0007expires\u0000\u0000\u0000\u0004from\u0000\u0000\u0000" - + "\u0004host\u0000\u0000\u0000\bif-match\u0000\u0000\u0000\u0011if-modified-since" - + "\u0000\u0000\u0000\rif-none-match\u0000\u0000\u0000\bif-range\u0000\u0000\u0000" - + "\u0013if-unmodified-since\u0000\u0000\u0000\rlast-modified\u0000\u0000\u0000\blocati" - + "on\u0000\u0000\u0000\fmax-forwards\u0000\u0000\u0000\u0006pragma\u0000\u0000\u0000" - + "\u0012proxy-authenticate\u0000\u0000\u0000\u0013proxy-authorization\u0000\u0000" - + "\u0000\u0005range\u0000\u0000\u0000\u0007referer\u0000\u0000\u0000\u000Bretry-after" - + "\u0000\u0000\u0000\u0006server\u0000\u0000\u0000\u0002te\u0000\u0000\u0000\u0007trai" - + "ler\u0000\u0000\u0000\u0011transfer-encoding\u0000\u0000\u0000\u0007upgrade\u0000" - + "\u0000\u0000\nuser-agent\u0000\u0000\u0000\u0004vary\u0000\u0000\u0000\u0003via" - + "\u0000\u0000\u0000\u0007warning\u0000\u0000\u0000\u0010www-authenticate\u0000\u0000" - + "\u0000\u0006method\u0000\u0000\u0000\u0003get\u0000\u0000\u0000\u0006status\u0000" - + "\u0000\u0000\u0006200 OK\u0000\u0000\u0000\u0007version\u0000\u0000\u0000\bHTTP/1.1" - + "\u0000\u0000\u0000\u0003url\u0000\u0000\u0000\u0006public\u0000\u0000\u0000\nset-coo" - + "kie\u0000\u0000\u0000\nkeep-alive\u0000\u0000\u0000\u0006origin100101201202205206300" - + "302303304305306307402405406407408409410411412413414415416417502504505203 Non-Authori" - + "tative Information204 No Content301 Moved Permanently400 Bad Request401 Unauthorized" - + "403 Forbidden404 Not Found500 Internal Server Error501 Not Implemented503 Service Un" - + "availableJan Feb Mar Apr May Jun Jul Aug Sept Oct Nov Dec 00:00:00 Mon, Tue, Wed, Th" - + "u, Fri, Sat, Sun, GMTchunked,text/html,image/png,image/jpg,image/gif,application/xml" - + ",application/xhtml+xml,text/plain,text/javascript,publicprivatemax-age=gzip,deflate," - + "sdchcharset=utf-8charset=iso-8859-1,utf-,*,enq=0.").getBytes(Util.UTF_8.name()); - } catch (UnsupportedEncodingException e) { - throw new AssertionError(); - } - } - - @Override public FrameReader newReader(InputStream in, boolean client) { - return new Reader(in, client); - } - - @Override public FrameWriter newWriter(OutputStream out, boolean client) { - return new Writer(out, client); - } - - /** Read spdy/3 frames. */ - static final class Reader implements FrameReader { - private final DataInputStream in; - private final boolean client; - private final NameValueBlockReader nameValueBlockReader; - - Reader(InputStream in, boolean client) { - this.in = new DataInputStream(in); - this.nameValueBlockReader = new NameValueBlockReader(in); - this.client = client; - } - - @Override public void readConnectionHeader() { - } - - /** - * Send the next frame to {@code handler}. Returns true unless there are no - * more frames on the stream. - */ - @Override public boolean nextFrame(Handler handler) throws IOException { - int w1; - try { - w1 = in.readInt(); - } catch (IOException e) { - return false; // This might be a normal socket close. - } - int w2 = in.readInt(); - - boolean control = (w1 & 0x80000000) != 0; - int flags = (w2 & 0xff000000) >>> 24; - int length = (w2 & 0xffffff); - - if (control) { - int version = (w1 & 0x7fff0000) >>> 16; - int type = (w1 & 0xffff); - - if (version != 3) { - throw new ProtocolException("version != 3: " + version); - } - - switch (type) { - case TYPE_SYN_STREAM: - readSynStream(handler, flags, length); - return true; - - case TYPE_SYN_REPLY: - readSynReply(handler, flags, length); - return true; - - case TYPE_RST_STREAM: - readRstStream(handler, flags, length); - return true; - - case TYPE_SETTINGS: - readSettings(handler, flags, length); - return true; - - case TYPE_NOOP: - if (length != 0) throw ioException("TYPE_NOOP length: %d != 0", length); - handler.noop(); - return true; - - case TYPE_PING: - readPing(handler, flags, length); - return true; - - case TYPE_GOAWAY: - readGoAway(handler, flags, length); - return true; - - case TYPE_HEADERS: - readHeaders(handler, flags, length); - return true; - - case TYPE_WINDOW_UPDATE: - readWindowUpdate(handler, flags, length); - return true; - - case TYPE_CREDENTIAL: - Util.skipByReading(in, length); - throw new UnsupportedOperationException("TODO"); // TODO: implement - - default: - throw new IOException("Unexpected frame"); - } - } else { - int streamId = w1 & 0x7fffffff; - boolean inFinished = (flags & FLAG_FIN) != 0; - handler.data(inFinished, streamId, in, length); - return true; - } - } - - private void readSynStream(Handler handler, int flags, int length) throws IOException { - int w1 = in.readInt(); - int w2 = in.readInt(); - int s3 = in.readShort(); - int streamId = w1 & 0x7fffffff; - int associatedStreamId = w2 & 0x7fffffff; - int priority = (s3 & 0xe000) >>> 13; - int slot = s3 & 0xff; - List nameValueBlock = nameValueBlockReader.readNameValueBlock(length - 10); - - boolean inFinished = (flags & FLAG_FIN) != 0; - boolean outFinished = (flags & FLAG_UNIDIRECTIONAL) != 0; - handler.headers(outFinished, inFinished, streamId, associatedStreamId, priority, - nameValueBlock, HeadersMode.SPDY_SYN_STREAM); - } - - private void readSynReply(Handler handler, int flags, int length) throws IOException { - int w1 = in.readInt(); - int streamId = w1 & 0x7fffffff; - List nameValueBlock = nameValueBlockReader.readNameValueBlock(length - 4); - boolean inFinished = (flags & FLAG_FIN) != 0; - handler.headers(false, inFinished, streamId, -1, -1, nameValueBlock, HeadersMode.SPDY_REPLY); - } - - private void readRstStream(Handler handler, int flags, int length) throws IOException { - if (length != 8) throw ioException("TYPE_RST_STREAM length: %d != 8", length); - int streamId = in.readInt() & 0x7fffffff; - int errorCodeInt = in.readInt(); - ErrorCode errorCode = ErrorCode.fromSpdy3Rst(errorCodeInt); - if (errorCode == null) { - throw ioException("TYPE_RST_STREAM unexpected error code: %d", errorCodeInt); - } - handler.rstStream(streamId, errorCode); - } - - private void readHeaders(Handler handler, int flags, int length) throws IOException { - int w1 = in.readInt(); - int streamId = w1 & 0x7fffffff; - List nameValueBlock = nameValueBlockReader.readNameValueBlock(length - 4); - handler.headers(false, false, streamId, -1, -1, nameValueBlock, HeadersMode.SPDY_HEADERS); - } - - private void readWindowUpdate(Handler handler, int flags, int length) throws IOException { - if (length != 8) throw ioException("TYPE_WINDOW_UPDATE length: %d != 8", length); - int w1 = in.readInt(); - int w2 = in.readInt(); - int streamId = w1 & 0x7fffffff; - int deltaWindowSize = w2 & 0x7fffffff; - handler.windowUpdate(streamId, deltaWindowSize, false); - } - - private void readPing(Handler handler, int flags, int length) throws IOException { - if (length != 4) throw ioException("TYPE_PING length: %d != 4", length); - int id = in.readInt(); - boolean reply = client == ((id % 2) == 1); - handler.ping(reply, id, 0); - } - - private void readGoAway(Handler handler, int flags, int length) throws IOException { - if (length != 8) throw ioException("TYPE_GOAWAY length: %d != 8", length); - int lastGoodStreamId = in.readInt() & 0x7fffffff; - int errorCodeInt = in.readInt(); - ErrorCode errorCode = ErrorCode.fromSpdyGoAway(errorCodeInt); - if (errorCode == null) { - throw ioException("TYPE_GOAWAY unexpected error code: %d", errorCodeInt); - } - handler.goAway(lastGoodStreamId, errorCode); - } - - private void readSettings(Handler handler, int flags, int length) throws IOException { - int numberOfEntries = in.readInt(); - if (length != 4 + 8 * numberOfEntries) { - throw ioException("TYPE_SETTINGS length: %d != 4 + 8 * %d", length, numberOfEntries); - } - Settings settings = new Settings(); - for (int i = 0; i < numberOfEntries; i++) { - int w1 = in.readInt(); - int value = in.readInt(); - int idFlags = (w1 & 0xff000000) >>> 24; - int id = w1 & 0xffffff; - settings.set(id, idFlags, value); - } - boolean clearPrevious = (flags & Settings.FLAG_CLEAR_PREVIOUSLY_PERSISTED_SETTINGS) != 0; - handler.settings(clearPrevious, settings); - } - - private static IOException ioException(String message, Object... args) throws IOException { - throw new IOException(String.format(message, args)); - } - - @Override public void close() throws IOException { - Util.closeAll(in, nameValueBlockReader); - } - } - - /** Write spdy/3 frames. */ - static final class Writer implements FrameWriter { - private final DataOutputStream out; - private final ByteArrayOutputStream nameValueBlockBuffer; - private final DataOutputStream nameValueBlockOut; - private final boolean client; - - Writer(OutputStream out, boolean client) { - this.out = new DataOutputStream(out); - this.client = client; - - Deflater deflater = new Deflater(); - deflater.setDictionary(DICTIONARY); - nameValueBlockBuffer = new ByteArrayOutputStream(); - nameValueBlockOut = new DataOutputStream( - Platform.get().newDeflaterOutputStream(nameValueBlockBuffer, deflater, true)); - } - - @Override public synchronized void connectionHeader() { - // Do nothing: no connection header for SPDY/3. - } - - @Override public synchronized void flush() throws IOException { - out.flush(); - } - - @Override public synchronized void synStream(boolean outFinished, boolean inFinished, - int streamId, int associatedStreamId, int priority, int slot, List nameValueBlock) - throws IOException { - writeNameValueBlockToBuffer(nameValueBlock); - int length = 10 + nameValueBlockBuffer.size(); - int type = TYPE_SYN_STREAM; - int flags = (outFinished ? FLAG_FIN : 0) | (inFinished ? FLAG_UNIDIRECTIONAL : 0); - - int unused = 0; - out.writeInt(0x80000000 | (VERSION & 0x7fff) << 16 | type & 0xffff); - out.writeInt((flags & 0xff) << 24 | length & 0xffffff); - out.writeInt(streamId & 0x7fffffff); - out.writeInt(associatedStreamId & 0x7fffffff); - out.writeShort((priority & 0x7) << 13 | (unused & 0x1f) << 8 | (slot & 0xff)); - nameValueBlockBuffer.writeTo(out); - out.flush(); - } - - @Override public synchronized void synReply( - boolean outFinished, int streamId, List nameValueBlock) throws IOException { - writeNameValueBlockToBuffer(nameValueBlock); - int type = TYPE_SYN_REPLY; - int flags = (outFinished ? FLAG_FIN : 0); - int length = nameValueBlockBuffer.size() + 4; - - out.writeInt(0x80000000 | (VERSION & 0x7fff) << 16 | type & 0xffff); - out.writeInt((flags & 0xff) << 24 | length & 0xffffff); - out.writeInt(streamId & 0x7fffffff); - nameValueBlockBuffer.writeTo(out); - out.flush(); - } - - @Override public synchronized void headers(int streamId, List nameValueBlock) - throws IOException { - writeNameValueBlockToBuffer(nameValueBlock); - int flags = 0; - int type = TYPE_HEADERS; - int length = nameValueBlockBuffer.size() + 4; - - out.writeInt(0x80000000 | (VERSION & 0x7fff) << 16 | type & 0xffff); - out.writeInt((flags & 0xff) << 24 | length & 0xffffff); - out.writeInt(streamId & 0x7fffffff); - nameValueBlockBuffer.writeTo(out); - out.flush(); - } - - @Override public synchronized void rstStream(int streamId, ErrorCode errorCode) - throws IOException { - if (errorCode.spdyRstCode == -1) throw new IllegalArgumentException(); - int flags = 0; - int type = TYPE_RST_STREAM; - int length = 8; - out.writeInt(0x80000000 | (VERSION & 0x7fff) << 16 | type & 0xffff); - out.writeInt((flags & 0xff) << 24 | length & 0xffffff); - out.writeInt(streamId & 0x7fffffff); - out.writeInt(errorCode.spdyRstCode); - out.flush(); - } - - @Override public synchronized void data(boolean outFinished, int streamId, byte[] data) - throws IOException { - data(outFinished, streamId, data, 0, data.length); - } - - @Override public synchronized void data(boolean outFinished, int streamId, byte[] data, - int offset, int byteCount) throws IOException { - int flags = (outFinished ? FLAG_FIN : 0); - out.writeInt(streamId & 0x7fffffff); - out.writeInt((flags & 0xff) << 24 | byteCount & 0xffffff); - out.write(data, offset, byteCount); - } - - private void writeNameValueBlockToBuffer(List nameValueBlock) throws IOException { - nameValueBlockBuffer.reset(); - int numberOfPairs = nameValueBlock.size() / 2; - nameValueBlockOut.writeInt(numberOfPairs); - for (String s : nameValueBlock) { - nameValueBlockOut.writeInt(s.length()); - nameValueBlockOut.write(s.getBytes("UTF-8")); - } - nameValueBlockOut.flush(); - } - - @Override public synchronized void settings(Settings settings) throws IOException { - int type = TYPE_SETTINGS; - int flags = 0; - int size = settings.size(); - int length = 4 + size * 8; - out.writeInt(0x80000000 | (VERSION & 0x7fff) << 16 | type & 0xffff); - out.writeInt((flags & 0xff) << 24 | length & 0xffffff); - out.writeInt(size); - for (int i = 0; i <= Settings.COUNT; i++) { - if (!settings.isSet(i)) continue; - int settingsFlags = settings.flags(i); - out.writeInt((settingsFlags & 0xff) << 24 | (i & 0xffffff)); - out.writeInt(settings.get(i)); - } - out.flush(); - } - - @Override public synchronized void noop() throws IOException { - int type = TYPE_NOOP; - int length = 0; - int flags = 0; - out.writeInt(0x80000000 | (VERSION & 0x7fff) << 16 | type & 0xffff); - out.writeInt((flags & 0xff) << 24 | length & 0xffffff); - out.flush(); - } - - @Override public synchronized void ping(boolean reply, int payload1, int payload2) - throws IOException { - boolean payloadIsReply = client != ((payload1 % 2) == 1); - if (reply != payloadIsReply) throw new IllegalArgumentException("payload != reply"); - int type = TYPE_PING; - int flags = 0; - int length = 4; - out.writeInt(0x80000000 | (VERSION & 0x7fff) << 16 | type & 0xffff); - out.writeInt((flags & 0xff) << 24 | length & 0xffffff); - out.writeInt(payload1); - out.flush(); - } - - @Override public synchronized void goAway(int lastGoodStreamId, ErrorCode errorCode) - throws IOException { - if (errorCode.spdyGoAwayCode == -1) throw new IllegalArgumentException(); - int type = TYPE_GOAWAY; - int flags = 0; - int length = 8; - out.writeInt(0x80000000 | (VERSION & 0x7fff) << 16 | type & 0xffff); - out.writeInt((flags & 0xff) << 24 | length & 0xffffff); - out.writeInt(lastGoodStreamId); - out.writeInt(errorCode.spdyGoAwayCode); - out.flush(); - } - - @Override public synchronized void windowUpdate(int streamId, int deltaWindowSize) - throws IOException { - int type = TYPE_WINDOW_UPDATE; - int flags = 0; - int length = 8; - out.writeInt(0x80000000 | (VERSION & 0x7fff) << 16 | type & 0xffff); - out.writeInt((flags & 0xff) << 24 | length & 0xffffff); - out.writeInt(streamId); - out.writeInt(deltaWindowSize); - out.flush(); - } - - @Override public void close() throws IOException { - Util.closeAll(out, nameValueBlockOut); - } - } -} diff --git a/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/spdy/SpdyConnection.java b/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/spdy/SpdyConnection.java deleted file mode 100755 index 41724f0..0000000 --- a/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/spdy/SpdyConnection.java +++ /dev/null @@ -1,599 +0,0 @@ -/* - * Copyright (C) 2011 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.squareup.okhttp.internal.spdy; - -import com.squareup.okhttp.internal.NamedRunnable; -import com.squareup.okhttp.internal.Util; -import java.io.Closeable; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.net.Socket; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.SynchronousQueue; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; - -/** - * A socket connection to a remote peer. A connection hosts streams which can - * send and receive data. - * - *

Many methods in this API are synchronous: the call is - * completed before the method returns. This is typical for Java but atypical - * for SPDY. This is motivated by exception transparency: an IOException that - * was triggered by a certain caller can be caught and handled by that caller. - */ -public final class SpdyConnection implements Closeable { - - // Internal state of this connection is guarded by 'this'. No blocking - // operations may be performed while holding this lock! - // - // Socket writes are guarded by frameWriter. - // - // Socket reads are unguarded but are only made by the reader thread. - // - // Certain operations (like SYN_STREAM) need to synchronize on both the - // frameWriter (to do blocking I/O) and this (to create streams). Such - // operations must synchronize on 'this' last. This ensures that we never - // wait for a blocking operation while holding 'this'. - - private static final ExecutorService executor = new ThreadPoolExecutor(0, - Integer.MAX_VALUE, 60, TimeUnit.SECONDS, new SynchronousQueue(), - Util.daemonThreadFactory("OkHttp SpdyConnection")); - - /** The protocol variant, like SPDY/3 or HTTP-draft-06/2.0. */ - final Variant variant; - - /** True if this peer initiated the connection. */ - final boolean client; - - /** - * User code to run in response to an incoming stream. Callbacks must not be - * run on the callback executor. - */ - private final IncomingStreamHandler handler; - private final FrameReader frameReader; - private final FrameWriter frameWriter; - - private final Map streams = new HashMap(); - private final String hostName; - private int lastGoodStreamId; - private int nextStreamId; - private boolean shutdown; - private long idleStartTimeNs = System.nanoTime(); - - /** Lazily-created map of in-flight pings awaiting a response. Guarded by this. */ - private Map pings; - private int nextPingId; - - /** Lazily-created settings for the peer. */ - Settings settings; - - private SpdyConnection(Builder builder) { - variant = builder.variant; - client = builder.client; - handler = builder.handler; - frameReader = variant.newReader(builder.in, client); - frameWriter = variant.newWriter(builder.out, client); - nextStreamId = builder.client ? 1 : 2; - nextPingId = builder.client ? 1 : 2; - - hostName = builder.hostName; - - new Thread(new Reader(), "Spdy Reader " + hostName).start(); - } - - /** - * Returns the number of {@link SpdyStream#isOpen() open streams} on this - * connection. - */ - public synchronized int openStreamCount() { - return streams.size(); - } - - private synchronized SpdyStream getStream(int id) { - return streams.get(id); - } - - synchronized SpdyStream removeStream(int streamId) { - SpdyStream stream = streams.remove(streamId); - if (stream != null && streams.isEmpty()) { - setIdle(true); - } - return stream; - } - - private synchronized void setIdle(boolean value) { - idleStartTimeNs = value ? System.nanoTime() : Long.MAX_VALUE; - } - - /** Returns true if this connection is idle. */ - public synchronized boolean isIdle() { - return idleStartTimeNs != Long.MAX_VALUE; - } - - /** - * Returns the time in ns when this connection became idle or Long.MAX_VALUE - * if connection is not idle. - */ - public synchronized long getIdleStartTimeNs() { - return idleStartTimeNs; - } - - /** - * Returns a new locally-initiated stream. - * - * @param out true to create an output stream that we can use to send data - * to the remote peer. Corresponds to {@code FLAG_FIN}. - * @param in true to create an input stream that the remote peer can use to - * send data to us. Corresponds to {@code FLAG_UNIDIRECTIONAL}. - */ - public SpdyStream newStream(List requestHeaders, boolean out, boolean in) - throws IOException { - boolean outFinished = !out; - boolean inFinished = !in; - int associatedStreamId = 0; // TODO: permit the caller to specify an associated stream? - int priority = 0; // TODO: permit the caller to specify a priority? - int slot = 0; // TODO: permit the caller to specify a slot? - SpdyStream stream; - int streamId; - - synchronized (frameWriter) { - synchronized (this) { - if (shutdown) { - throw new IOException("shutdown"); - } - streamId = nextStreamId; - nextStreamId += 2; - stream = new SpdyStream( - streamId, this, outFinished, inFinished, priority, requestHeaders, settings); - if (stream.isOpen()) { - streams.put(streamId, stream); - setIdle(false); - } - } - - frameWriter.synStream(outFinished, inFinished, streamId, associatedStreamId, priority, slot, - requestHeaders); - } - - return stream; - } - - void writeSynReply(int streamId, boolean outFinished, List alternating) - throws IOException { - frameWriter.synReply(outFinished, streamId, alternating); - } - - public void writeData(int streamId, boolean outFinished, byte[] buffer, int offset, int byteCount) - throws IOException { - frameWriter.data(outFinished, streamId, buffer, offset, byteCount); - } - - void writeSynResetLater(final int streamId, final ErrorCode errorCode) { - executor.submit(new NamedRunnable("OkHttp SPDY Writer %s stream %d", hostName, streamId) { - @Override public void execute() { - try { - writeSynReset(streamId, errorCode); - } catch (IOException ignored) { - } - } - }); - } - - void writeSynReset(int streamId, ErrorCode statusCode) throws IOException { - frameWriter.rstStream(streamId, statusCode); - } - - void writeWindowUpdateLater(final int streamId, final int deltaWindowSize) { - executor.submit(new NamedRunnable("OkHttp SPDY Writer %s stream %d", hostName, streamId) { - @Override public void execute() { - try { - writeWindowUpdate(streamId, deltaWindowSize); - } catch (IOException ignored) { - } - } - }); - } - - void writeWindowUpdate(int streamId, int deltaWindowSize) throws IOException { - frameWriter.windowUpdate(streamId, deltaWindowSize); - } - - /** - * Sends a ping frame to the peer. Use the returned object to await the - * ping's response and observe its round trip time. - */ - public Ping ping() throws IOException { - Ping ping = new Ping(); - int pingId; - synchronized (this) { - if (shutdown) { - throw new IOException("shutdown"); - } - pingId = nextPingId; - nextPingId += 2; - if (pings == null) pings = new HashMap(); - pings.put(pingId, ping); - } - writePing(false, pingId, 0x4f4b6f6b /* ASCII "OKok" */, ping); - return ping; - } - - private void writePingLater( - final boolean reply, final int payload1, final int payload2, final Ping ping) { - executor.submit(new NamedRunnable("OkHttp SPDY Writer %s ping %08x%08x", - hostName, payload1, payload2) { - @Override public void execute() { - try { - writePing(reply, payload1, payload2, ping); - } catch (IOException ignored) { - } - } - }); - } - - private void writePing(boolean reply, int payload1, int payload2, Ping ping) throws IOException { - synchronized (frameWriter) { - // Observe the sent time immediately before performing I/O. - if (ping != null) ping.send(); - frameWriter.ping(reply, payload1, payload2); - } - } - - private synchronized Ping removePing(int id) { - return pings != null ? pings.remove(id) : null; - } - - /** Sends a noop frame to the peer. */ - public void noop() throws IOException { - frameWriter.noop(); - } - - public void flush() throws IOException { - frameWriter.flush(); - } - - /** - * Degrades this connection such that new streams can neither be created - * locally, nor accepted from the remote peer. Existing streams are not - * impacted. This is intended to permit an endpoint to gracefully stop - * accepting new requests without harming previously established streams. - */ - public void shutdown(ErrorCode statusCode) throws IOException { - synchronized (frameWriter) { - int lastGoodStreamId; - synchronized (this) { - if (shutdown) { - return; - } - shutdown = true; - lastGoodStreamId = this.lastGoodStreamId; - } - frameWriter.goAway(lastGoodStreamId, statusCode); - } - } - - /** - * Closes this connection. This cancels all open streams and unanswered - * pings. It closes the underlying input and output streams and shuts down - * internal executor services. - */ - @Override public void close() throws IOException { - close(ErrorCode.NO_ERROR, ErrorCode.CANCEL); - } - - private void close(ErrorCode connectionCode, ErrorCode streamCode) throws IOException { - assert (!Thread.holdsLock(this)); - IOException thrown = null; - try { - shutdown(connectionCode); - } catch (IOException e) { - thrown = e; - } - - SpdyStream[] streamsToClose = null; - Ping[] pingsToCancel = null; - synchronized (this) { - if (!streams.isEmpty()) { - streamsToClose = streams.values().toArray(new SpdyStream[streams.size()]); - streams.clear(); - setIdle(false); - } - if (pings != null) { - pingsToCancel = pings.values().toArray(new Ping[pings.size()]); - pings = null; - } - } - - if (streamsToClose != null) { - for (SpdyStream stream : streamsToClose) { - try { - stream.close(streamCode); - } catch (IOException e) { - if (thrown != null) thrown = e; - } - } - } - - if (pingsToCancel != null) { - for (Ping ping : pingsToCancel) { - ping.cancel(); - } - } - - try { - frameReader.close(); - } catch (IOException e) { - thrown = e; - } - try { - frameWriter.close(); - } catch (IOException e) { - if (thrown == null) thrown = e; - } - - if (thrown != null) throw thrown; - } - - /** - * Sends a connection header if the current variant requires it. This should - * be called after {@link Builder#build} for all new connections. - */ - public void sendConnectionHeader() throws IOException { - frameWriter.connectionHeader(); - frameWriter.settings(new Settings()); - } - - /** - * Reads a connection header if the current variant requires it. This should - * be called after {@link Builder#build} for all new connections. - */ - public void readConnectionHeader() throws IOException { - frameReader.readConnectionHeader(); - } - - public static class Builder { - private String hostName; - private InputStream in; - private OutputStream out; - private IncomingStreamHandler handler = IncomingStreamHandler.REFUSE_INCOMING_STREAMS; - private Variant variant = Variant.SPDY3; - private boolean client; - - public Builder(boolean client, Socket socket) throws IOException { - this("", client, socket.getInputStream(), socket.getOutputStream()); - } - - public Builder(boolean client, InputStream in, OutputStream out) { - this("", client, in, out); - } - - /** - * @param client true if this peer initiated the connection; false if - * this peer accepted the connection. - */ - public Builder(String hostName, boolean client, Socket socket) throws IOException { - this(hostName, client, socket.getInputStream(), socket.getOutputStream()); - } - - /** - * @param client true if this peer initiated the connection; false if this - * peer accepted the connection. - */ - public Builder(String hostName, boolean client, InputStream in, OutputStream out) { - this.hostName = hostName; - this.client = client; - this.in = in; - this.out = out; - } - - public Builder handler(IncomingStreamHandler handler) { - this.handler = handler; - return this; - } - - public Builder spdy3() { - this.variant = Variant.SPDY3; - return this; - } - - public Builder http20Draft06() { - this.variant = Variant.HTTP_20_DRAFT_06; - return this; - } - - public SpdyConnection build() { - return new SpdyConnection(this); - } - } - - private class Reader implements Runnable, FrameReader.Handler { - @Override public void run() { - ErrorCode connectionErrorCode = ErrorCode.INTERNAL_ERROR; - ErrorCode streamErrorCode = ErrorCode.INTERNAL_ERROR; - try { - while (frameReader.nextFrame(this)) { - } - connectionErrorCode = ErrorCode.NO_ERROR; - streamErrorCode = ErrorCode.CANCEL; - } catch (IOException e) { - connectionErrorCode = ErrorCode.PROTOCOL_ERROR; - streamErrorCode = ErrorCode.PROTOCOL_ERROR; - } finally { - try { - close(connectionErrorCode, streamErrorCode); - } catch (IOException ignored) { - } - } - } - - @Override public void data(boolean inFinished, int streamId, InputStream in, int length) - throws IOException { - SpdyStream dataStream = getStream(streamId); - if (dataStream == null) { - writeSynResetLater(streamId, ErrorCode.INVALID_STREAM); - Util.skipByReading(in, length); - return; - } - dataStream.receiveData(in, length); - if (inFinished) { - dataStream.receiveFin(); - } - } - - @Override public void headers(boolean outFinished, boolean inFinished, int streamId, - int associatedStreamId, int priority, List nameValueBlock, - HeadersMode headersMode) { - SpdyStream stream; - synchronized (SpdyConnection.this) { - // If we're shutdown, don't bother with this stream. - if (shutdown) return; - - stream = getStream(streamId); - - if (stream == null) { - // The headers claim to be for an existing stream, but we don't have one. - if (headersMode.failIfStreamAbsent()) { - writeSynResetLater(streamId, ErrorCode.INVALID_STREAM); - return; - } - - // If the stream ID is less than the last created ID, assume it's already closed. - if (streamId <= lastGoodStreamId) return; - - // If the stream ID is in the client's namespace, assume it's already closed. - if (streamId % 2 == nextStreamId % 2) return; - - // Create a stream. - final SpdyStream newStream = new SpdyStream(streamId, SpdyConnection.this, outFinished, - inFinished, priority, nameValueBlock, settings); - lastGoodStreamId = streamId; - streams.put(streamId, newStream); - executor.submit(new NamedRunnable("OkHttp Callback %s stream %d", hostName, streamId) { - @Override public void execute() { - try { - handler.receive(newStream); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - }); - return; - } - } - - // The headers claim to be for a new stream, but we already have one. - if (headersMode.failIfStreamPresent()) { - stream.closeLater(ErrorCode.PROTOCOL_ERROR); - removeStream(streamId); - return; - } - - // Update an existing stream. - stream.receiveHeaders(nameValueBlock, headersMode); - if (inFinished) stream.receiveFin(); - } - - @Override public void rstStream(int streamId, ErrorCode errorCode) { - SpdyStream rstStream = removeStream(streamId); - if (rstStream != null) { - rstStream.receiveRstStream(errorCode); - } - } - - @Override public void settings(boolean clearPrevious, Settings newSettings) { - SpdyStream[] streamsToNotify = null; - synchronized (SpdyConnection.this) { - if (settings == null || clearPrevious) { - settings = newSettings; - } else { - settings.merge(newSettings); - } - if (!streams.isEmpty()) { - streamsToNotify = streams.values().toArray(new SpdyStream[streams.size()]); - } - } - if (streamsToNotify != null) { - for (SpdyStream stream : streamsToNotify) { - // The synchronization here is ugly. We need to synchronize on 'this' to guard - // reads to 'settings'. We synchronize on 'stream' to guard the state change. - // And we need to acquire the 'stream' lock first, since that may block. - // TODO: this can block the reader thread until a write completes. That's bad! - synchronized (stream) { - synchronized (SpdyConnection.this) { - stream.receiveSettings(settings); - } - } - } - } - } - - @Override public void noop() { - } - - @Override public void ping(boolean reply, int payload1, int payload2) { - if (reply) { - Ping ping = removePing(payload1); - if (ping != null) { - ping.receive(); - } - } else { - // Send a reply to a client ping if this is a server and vice versa. - writePingLater(true, payload1, payload2, null); - } - } - - @Override public void goAway(int lastGoodStreamId, ErrorCode errorCode) { - synchronized (SpdyConnection.this) { - shutdown = true; - - // Fail all streams created after the last good stream ID. - for (Iterator> i = streams.entrySet().iterator(); - i.hasNext(); ) { - Map.Entry entry = i.next(); - int streamId = entry.getKey(); - if (streamId > lastGoodStreamId && entry.getValue().isLocallyInitiated()) { - entry.getValue().receiveRstStream(ErrorCode.REFUSED_STREAM); - i.remove(); - } - } - } - } - - @Override public void windowUpdate(int streamId, int deltaWindowSize, boolean endFlowControl) { - if (streamId == 0) { - // TODO: honor whole-stream flow control - return; - } - - // TODO: honor endFlowControl - SpdyStream stream = getStream(streamId); - if (stream != null) { - stream.receiveWindowUpdate(deltaWindowSize); - } - } - - @Override public void priority(int streamId, int priority) { - // TODO: honor priority. - } - } -} diff --git a/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/spdy/SpdyStream.java b/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/spdy/SpdyStream.java deleted file mode 100755 index a3ab3a4..0000000 --- a/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/spdy/SpdyStream.java +++ /dev/null @@ -1,684 +0,0 @@ -/* - * Copyright (C) 2011 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.squareup.okhttp.internal.spdy; - -import com.squareup.okhttp.internal.Util; -import java.io.IOException; -import java.io.InputStream; -import java.io.InterruptedIOException; -import java.io.OutputStream; -import java.net.SocketTimeoutException; -import java.util.ArrayList; -import java.util.List; - -import static com.squareup.okhttp.internal.Util.checkOffsetAndCount; - -/** A logical bidirectional stream. */ -public final class SpdyStream { - - // Internal state is guarded by this. No long-running or potentially - // blocking operations are performed while the lock is held. - - /** - * The number of unacknowledged bytes at which the input stream will send - * the peer a {@code WINDOW_UPDATE} frame. Must be less than this client's - * window size, otherwise the remote peer will stop sending data on this - * stream. (Chrome 25 uses 5 MiB.) - */ - public static final int WINDOW_UPDATE_THRESHOLD = Settings.DEFAULT_INITIAL_WINDOW_SIZE / 2; - - private final int id; - private final SpdyConnection connection; - private final int priority; - private long readTimeoutMillis = 0; - private int writeWindowSize; - - /** Headers sent by the stream initiator. Immutable and non null. */ - private final List requestHeaders; - - /** Headers sent in the stream reply. Null if reply is either not sent or not sent yet. */ - private List responseHeaders; - - private final SpdyDataInputStream in = new SpdyDataInputStream(); - private final SpdyDataOutputStream out = new SpdyDataOutputStream(); - - /** - * The reason why this stream was abnormally closed. If there are multiple - * reasons to abnormally close this stream (such as both peers closing it - * near-simultaneously) then this is the first reason known to this peer. - */ - private ErrorCode errorCode = null; - - SpdyStream(int id, SpdyConnection connection, boolean outFinished, boolean inFinished, - int priority, List requestHeaders, Settings settings) { - if (connection == null) throw new NullPointerException("connection == null"); - if (requestHeaders == null) throw new NullPointerException("requestHeaders == null"); - this.id = id; - this.connection = connection; - this.in.finished = inFinished; - this.out.finished = outFinished; - this.priority = priority; - this.requestHeaders = requestHeaders; - - setSettings(settings); - } - - /** - * Returns true if this stream is open. A stream is open until either: - *

    - *
  • A {@code SYN_RESET} frame abnormally terminates the stream. - *
  • Both input and output streams have transmitted all data and - * headers. - *
- * Note that the input stream may continue to yield data even after a stream - * reports itself as not open. This is because input data is buffered. - */ - public synchronized boolean isOpen() { - if (errorCode != null) { - return false; - } - if ((in.finished || in.closed) && (out.finished || out.closed) && responseHeaders != null) { - return false; - } - return true; - } - - /** Returns true if this stream was created by this peer. */ - public boolean isLocallyInitiated() { - boolean streamIsClient = (id % 2 == 1); - return connection.client == streamIsClient; - } - - public SpdyConnection getConnection() { - return connection; - } - - public List getRequestHeaders() { - return requestHeaders; - } - - /** - * Returns the stream's response headers, blocking if necessary if they - * have not been received yet. - */ - public synchronized List getResponseHeaders() throws IOException { - long remaining = 0; - long start = 0; - if (readTimeoutMillis != 0) { - start = (System.nanoTime() / 1000000); - remaining = readTimeoutMillis; - } - try { - while (responseHeaders == null && errorCode == null) { - if (readTimeoutMillis == 0) { // No timeout configured. - wait(); - } else if (remaining > 0) { - wait(remaining); - remaining = start + readTimeoutMillis - (System.nanoTime() / 1000000); - } else { - throw new SocketTimeoutException("Read response header timeout. readTimeoutMillis: " - + readTimeoutMillis); - } - } - if (responseHeaders != null) { - return responseHeaders; - } - throw new IOException("stream was reset: " + errorCode); - } catch (InterruptedException e) { - InterruptedIOException rethrow = new InterruptedIOException(); - rethrow.initCause(e); - throw rethrow; - } - } - - /** - * Returns the reason why this stream was closed, or null if it closed - * normally or has not yet been closed. - */ - public synchronized ErrorCode getErrorCode() { - return errorCode; - } - - /** - * Sends a reply to an incoming stream. - * - * @param out true to create an output stream that we can use to send data - * to the remote peer. Corresponds to {@code FLAG_FIN}. - */ - public void reply(List responseHeaders, boolean out) throws IOException { - assert (!Thread.holdsLock(SpdyStream.this)); - boolean outFinished = false; - synchronized (this) { - if (responseHeaders == null) { - throw new NullPointerException("responseHeaders == null"); - } - if (isLocallyInitiated()) { - throw new IllegalStateException("cannot reply to a locally initiated stream"); - } - if (this.responseHeaders != null) { - throw new IllegalStateException("reply already sent"); - } - this.responseHeaders = responseHeaders; - if (!out) { - this.out.finished = true; - outFinished = true; - } - } - connection.writeSynReply(id, outFinished, responseHeaders); - } - - /** - * Sets the maximum time to wait on input stream reads before failing with a - * {@code SocketTimeoutException}, or {@code 0} to wait indefinitely. - */ - public void setReadTimeout(long readTimeoutMillis) { - this.readTimeoutMillis = readTimeoutMillis; - } - - public long getReadTimeoutMillis() { - return readTimeoutMillis; - } - - /** Returns an input stream that can be used to read data from the peer. */ - public InputStream getInputStream() { - return in; - } - - /** - * Returns an output stream that can be used to write data to the peer. - * - * @throws IllegalStateException if this stream was initiated by the peer - * and a {@link #reply} has not yet been sent. - */ - public OutputStream getOutputStream() { - synchronized (this) { - if (responseHeaders == null && !isLocallyInitiated()) { - throw new IllegalStateException("reply before requesting the output stream"); - } - } - return out; - } - - /** - * Abnormally terminate this stream. This blocks until the {@code RST_STREAM} - * frame has been transmitted. - */ - public void close(ErrorCode rstStatusCode) throws IOException { - if (!closeInternal(rstStatusCode)) { - return; // Already closed. - } - connection.writeSynReset(id, rstStatusCode); - } - - /** - * Abnormally terminate this stream. This enqueues a {@code RST_STREAM} - * frame and returns immediately. - */ - public void closeLater(ErrorCode errorCode) { - if (!closeInternal(errorCode)) { - return; // Already closed. - } - connection.writeSynResetLater(id, errorCode); - } - - /** Returns true if this stream was closed. */ - private boolean closeInternal(ErrorCode errorCode) { - assert (!Thread.holdsLock(this)); - synchronized (this) { - if (this.errorCode != null) { - return false; - } - if (in.finished && out.finished) { - return false; - } - this.errorCode = errorCode; - notifyAll(); - } - connection.removeStream(id); - return true; - } - - void receiveHeaders(List headers, HeadersMode headersMode) { - assert (!Thread.holdsLock(SpdyStream.this)); - ErrorCode errorCode = null; - boolean open = true; - synchronized (this) { - if (responseHeaders == null) { - if (headersMode.failIfHeadersAbsent()) { - errorCode = ErrorCode.PROTOCOL_ERROR; - } else { - responseHeaders = headers; - open = isOpen(); - notifyAll(); - } - } else { - if (headersMode.failIfHeadersPresent()) { - errorCode = ErrorCode.STREAM_IN_USE; - } else { - List newHeaders = new ArrayList(); - newHeaders.addAll(responseHeaders); - newHeaders.addAll(headers); - this.responseHeaders = newHeaders; - } - } - } - if (errorCode != null) { - closeLater(errorCode); - } else if (!open) { - connection.removeStream(id); - } - } - - void receiveData(InputStream in, int length) throws IOException { - assert (!Thread.holdsLock(SpdyStream.this)); - this.in.receive(in, length); - } - - void receiveFin() { - assert (!Thread.holdsLock(SpdyStream.this)); - boolean open; - synchronized (this) { - this.in.finished = true; - open = isOpen(); - notifyAll(); - } - if (!open) { - connection.removeStream(id); - } - } - - synchronized void receiveRstStream(ErrorCode errorCode) { - if (this.errorCode == null) { - this.errorCode = errorCode; - notifyAll(); - } - } - - private void setSettings(Settings settings) { - // TODO: For HTTP/2.0, also adjust the stream flow control window size - // by the difference between the new value and the old value. - assert (Thread.holdsLock(connection)); // Because 'settings' is guarded by 'connection'. - this.writeWindowSize = settings != null - ? settings.getInitialWindowSize(Settings.DEFAULT_INITIAL_WINDOW_SIZE) - : Settings.DEFAULT_INITIAL_WINDOW_SIZE; - } - - void receiveSettings(Settings settings) { - assert (Thread.holdsLock(this)); - setSettings(settings); - notifyAll(); - } - - synchronized void receiveWindowUpdate(int deltaWindowSize) { - out.unacknowledgedBytes -= deltaWindowSize; - notifyAll(); - } - - int getPriority() { - return priority; - } - - /** - * An input stream that reads the incoming data frames of a stream. Although - * this class uses synchronization to safely receive incoming data frames, - * it is not intended for use by multiple readers. - */ - private final class SpdyDataInputStream extends InputStream { - // Store incoming data bytes in a circular buffer. When the buffer is - // empty, pos == -1. Otherwise pos is the first byte to read and limit - // is the first byte to write. - // - // { - - - X X X X - - - } - // ^ ^ - // pos limit - // - // { X X X - - - - X X X } - // ^ ^ - // limit pos - - private final byte[] buffer = new byte[Settings.DEFAULT_INITIAL_WINDOW_SIZE]; - - /** the next byte to be read, or -1 if the buffer is empty. Never buffer.length */ - private int pos = -1; - - /** the last byte to be read. Never buffer.length */ - private int limit; - - /** True if the caller has closed this stream. */ - private boolean closed; - - /** - * True if either side has cleanly shut down this stream. We will - * receive no more bytes beyond those already in the buffer. - */ - private boolean finished; - - /** - * The total number of bytes consumed by the application (with {@link - * #read}), but not yet acknowledged by sending a {@code WINDOW_UPDATE} - * frame. - */ - private int unacknowledgedBytes = 0; - - @Override public int available() throws IOException { - synchronized (SpdyStream.this) { - checkNotClosed(); - if (pos == -1) { - return 0; - } else if (limit > pos) { - return limit - pos; - } else { - return limit + (buffer.length - pos); - } - } - } - - @Override public int read() throws IOException { - return Util.readSingleByte(this); - } - - @Override public int read(byte[] b, int offset, int count) throws IOException { - synchronized (SpdyStream.this) { - checkOffsetAndCount(b.length, offset, count); - waitUntilReadable(); - checkNotClosed(); - - if (pos == -1) { - return -1; - } - - int copied = 0; - - // drain from [pos..buffer.length) - if (limit <= pos) { - int bytesToCopy = Math.min(count, buffer.length - pos); - System.arraycopy(buffer, pos, b, offset, bytesToCopy); - pos += bytesToCopy; - copied += bytesToCopy; - if (pos == buffer.length) { - pos = 0; - } - } - - // drain from [pos..limit) - if (copied < count) { - int bytesToCopy = Math.min(limit - pos, count - copied); - System.arraycopy(buffer, pos, b, offset + copied, bytesToCopy); - pos += bytesToCopy; - copied += bytesToCopy; - } - - // Flow control: notify the peer that we're ready for more data! - unacknowledgedBytes += copied; - if (unacknowledgedBytes >= WINDOW_UPDATE_THRESHOLD) { - connection.writeWindowUpdateLater(id, unacknowledgedBytes); - unacknowledgedBytes = 0; - } - - if (pos == limit) { - pos = -1; - limit = 0; - } - - return copied; - } - } - - /** - * Returns once the input stream is either readable or finished. Throws - * a {@link SocketTimeoutException} if the read timeout elapses before - * that happens. - */ - private void waitUntilReadable() throws IOException { - long start = 0; - long remaining = 0; - if (readTimeoutMillis != 0) { - start = (System.nanoTime() / 1000000); - remaining = readTimeoutMillis; - } - try { - while (pos == -1 && !finished && !closed && errorCode == null) { - if (readTimeoutMillis == 0) { - SpdyStream.this.wait(); - } else if (remaining > 0) { - SpdyStream.this.wait(remaining); - remaining = start + readTimeoutMillis - (System.nanoTime() / 1000000); - } else { - throw new SocketTimeoutException(); - } - } - } catch (InterruptedException e) { - throw new InterruptedIOException(); - } - } - - void receive(InputStream in, int byteCount) throws IOException { - assert (!Thread.holdsLock(SpdyStream.this)); - - if (byteCount == 0) { - return; - } - - int pos; - int limit; - int firstNewByte; - boolean finished; - boolean flowControlError; - synchronized (SpdyStream.this) { - finished = this.finished; - pos = this.pos; - firstNewByte = this.limit; - limit = this.limit; - flowControlError = byteCount > buffer.length - available(); - } - - // If the peer sends more data than we can handle, discard it and close the connection. - if (flowControlError) { - Util.skipByReading(in, byteCount); - closeLater(ErrorCode.FLOW_CONTROL_ERROR); - return; - } - - // Discard data received after the stream is finished. It's probably a benign race. - if (finished) { - Util.skipByReading(in, byteCount); - return; - } - - // Fill the buffer without holding any locks. First fill [limit..buffer.length) if that - // won't overwrite unread data. Then fill [limit..pos). We can't hold a lock, otherwise - // writes will be blocked until reads complete. - if (pos < limit) { - int firstCopyCount = Math.min(byteCount, buffer.length - limit); - Util.readFully(in, buffer, limit, firstCopyCount); - limit += firstCopyCount; - byteCount -= firstCopyCount; - if (limit == buffer.length) { - limit = 0; - } - } - if (byteCount > 0) { - Util.readFully(in, buffer, limit, byteCount); - limit += byteCount; - } - - synchronized (SpdyStream.this) { - // Update the new limit, and mark the position as readable if necessary. - this.limit = limit; - if (this.pos == -1) { - this.pos = firstNewByte; - SpdyStream.this.notifyAll(); - } - } - } - - @Override public void close() throws IOException { - synchronized (SpdyStream.this) { - closed = true; - SpdyStream.this.notifyAll(); - } - cancelStreamIfNecessary(); - } - - private void checkNotClosed() throws IOException { - if (closed) { - throw new IOException("stream closed"); - } - if (errorCode != null) { - throw new IOException("stream was reset: " + errorCode); - } - } - } - - private void cancelStreamIfNecessary() throws IOException { - assert (!Thread.holdsLock(SpdyStream.this)); - boolean open; - boolean cancel; - synchronized (this) { - cancel = !in.finished && in.closed && (out.finished || out.closed); - open = isOpen(); - } - if (cancel) { - // RST this stream to prevent additional data from being sent. This - // is safe because the input stream is closed (we won't use any - // further bytes) and the output stream is either finished or closed - // (so RSTing both streams doesn't cause harm). - SpdyStream.this.close(ErrorCode.CANCEL); - } else if (!open) { - connection.removeStream(id); - } - } - - /** - * An output stream that writes outgoing data frames of a stream. This class - * is not thread safe. - */ - private final class SpdyDataOutputStream extends OutputStream { - private final byte[] buffer = new byte[8192]; - private int pos = 0; - - /** True if the caller has closed this stream. */ - private boolean closed; - - /** - * True if either side has cleanly shut down this stream. We shall send - * no more bytes. - */ - private boolean finished; - - /** - * The total number of bytes written out to the peer, but not yet - * acknowledged with an incoming {@code WINDOW_UPDATE} frame. Writes - * block if they cause this to exceed the {@code WINDOW_SIZE}. - */ - private int unacknowledgedBytes = 0; - - @Override public void write(int b) throws IOException { - Util.writeSingleByte(this, b); - } - - @Override public void write(byte[] bytes, int offset, int count) throws IOException { - assert (!Thread.holdsLock(SpdyStream.this)); - checkOffsetAndCount(bytes.length, offset, count); - checkNotClosed(); - - while (count > 0) { - if (pos == buffer.length) { - writeFrame(false); - } - int bytesToCopy = Math.min(count, buffer.length - pos); - System.arraycopy(bytes, offset, buffer, pos, bytesToCopy); - pos += bytesToCopy; - offset += bytesToCopy; - count -= bytesToCopy; - } - } - - @Override public void flush() throws IOException { - assert (!Thread.holdsLock(SpdyStream.this)); - checkNotClosed(); - if (pos > 0) { - writeFrame(false); - connection.flush(); - } - } - - @Override public void close() throws IOException { - assert (!Thread.holdsLock(SpdyStream.this)); - synchronized (SpdyStream.this) { - if (closed) { - return; - } - closed = true; - } - if (!out.finished) { - writeFrame(true); - } - connection.flush(); - cancelStreamIfNecessary(); - } - - private void writeFrame(boolean outFinished) throws IOException { - assert (!Thread.holdsLock(SpdyStream.this)); - - int length = pos; - synchronized (SpdyStream.this) { - waitUntilWritable(length, outFinished); - unacknowledgedBytes += length; - } - connection.writeData(id, outFinished, buffer, 0, pos); - pos = 0; - } - - /** - * Returns once the peer is ready to receive {@code count} bytes. - * - * @throws IOException if the stream was finished or closed, or the - * thread was interrupted. - */ - private void waitUntilWritable(int count, boolean last) throws IOException { - try { - while (unacknowledgedBytes + count >= writeWindowSize) { - SpdyStream.this.wait(); // Wait until we receive a WINDOW_UPDATE. - - // The stream may have been closed or reset while we were waiting! - if (!last && closed) { - throw new IOException("stream closed"); - } else if (finished) { - throw new IOException("stream finished"); - } else if (errorCode != null) { - throw new IOException("stream was reset: " + errorCode); - } - } - } catch (InterruptedException e) { - throw new InterruptedIOException(); - } - } - - private void checkNotClosed() throws IOException { - synchronized (SpdyStream.this) { - if (closed) { - throw new IOException("stream closed"); - } else if (finished) { - throw new IOException("stream finished"); - } else if (errorCode != null) { - throw new IOException("stream was reset: " + errorCode); - } - } - } - } -} diff --git a/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/spdy/Variant.java b/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/spdy/Variant.java deleted file mode 100755 index 8f48bcd..0000000 --- a/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/spdy/Variant.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright (C) 2013 Square, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.squareup.okhttp.internal.spdy; - -import java.io.InputStream; -import java.io.OutputStream; - -/** A version and dialect of the framed socket protocol. */ -interface Variant { - Variant SPDY3 = new Spdy3(); - Variant HTTP_20_DRAFT_06 = new Http20Draft06(); - - /** - * @param client true if this is the HTTP client's reader, reading frames from - * a peer SPDY or HTTP/2 server. - */ - FrameReader newReader(InputStream in, boolean client); - - /** - * @param client true if this is the HTTP client's writer, writing frames to a - * peer SPDY or HTTP/2 server. - */ - FrameWriter newWriter(OutputStream out, boolean client); -} diff --git a/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/tls/DistinguishedNameParser.java b/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/tls/DistinguishedNameParser.java deleted file mode 100755 index e0aef14..0000000 --- a/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/tls/DistinguishedNameParser.java +++ /dev/null @@ -1,407 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.squareup.okhttp.internal.tls; - -import javax.security.auth.x500.X500Principal; - -/** - * A distinguished name (DN) parser. This parser only supports extracting a - * string value from a DN. It doesn't support values in the hex-string style. - */ -final class DistinguishedNameParser { - private final String dn; - private final int length; - private int pos; - private int beg; - private int end; - - /** Temporary variable to store positions of the currently parsed item. */ - private int cur; - - /** Distinguished name characters. */ - private char[] chars; - - public DistinguishedNameParser(X500Principal principal) { - // RFC2253 is used to ensure we get attributes in the reverse - // order of the underlying ASN.1 encoding, so that the most - // significant values of repeated attributes occur first. - this.dn = principal.getName(X500Principal.RFC2253); - this.length = this.dn.length(); - } - - // gets next attribute type: (ALPHA 1*keychar) / oid - private String nextAT() { - // skip preceding space chars, they can present after - // comma or semicolon (compatibility with RFC 1779) - for (; pos < length && chars[pos] == ' '; pos++) { - } - if (pos == length) { - return null; // reached the end of DN - } - - // mark the beginning of attribute type - beg = pos; - - // attribute type chars - pos++; - for (; pos < length && chars[pos] != '=' && chars[pos] != ' '; pos++) { - // we don't follow exact BNF syntax here: - // accept any char except space and '=' - } - if (pos >= length) { - throw new IllegalStateException("Unexpected end of DN: " + dn); - } - - // mark the end of attribute type - end = pos; - - // skip trailing space chars between attribute type and '=' - // (compatibility with RFC 1779) - if (chars[pos] == ' ') { - for (; pos < length && chars[pos] != '=' && chars[pos] == ' '; pos++) { - } - - if (chars[pos] != '=' || pos == length) { - throw new IllegalStateException("Unexpected end of DN: " + dn); - } - } - - pos++; //skip '=' char - - // skip space chars between '=' and attribute value - // (compatibility with RFC 1779) - for (; pos < length && chars[pos] == ' '; pos++) { - } - - // in case of oid attribute type skip its prefix: "oid." or "OID." - // (compatibility with RFC 1779) - if ((end - beg > 4) && (chars[beg + 3] == '.') - && (chars[beg] == 'O' || chars[beg] == 'o') - && (chars[beg + 1] == 'I' || chars[beg + 1] == 'i') - && (chars[beg + 2] == 'D' || chars[beg + 2] == 'd')) { - beg += 4; - } - - return new String(chars, beg, end - beg); - } - - // gets quoted attribute value: QUOTATION *( quotechar / pair ) QUOTATION - private String quotedAV() { - pos++; - beg = pos; - end = beg; - while (true) { - - if (pos == length) { - throw new IllegalStateException("Unexpected end of DN: " + dn); - } - - if (chars[pos] == '"') { - // enclosing quotation was found - pos++; - break; - } else if (chars[pos] == '\\') { - chars[end] = getEscaped(); - } else { - // shift char: required for string with escaped chars - chars[end] = chars[pos]; - } - pos++; - end++; - } - - // skip trailing space chars before comma or semicolon. - // (compatibility with RFC 1779) - for (; pos < length && chars[pos] == ' '; pos++) { - } - - return new String(chars, beg, end - beg); - } - - // gets hex string attribute value: "#" hexstring - private String hexAV() { - if (pos + 4 >= length) { - // encoded byte array must be not less then 4 c - throw new IllegalStateException("Unexpected end of DN: " + dn); - } - - beg = pos; // store '#' position - pos++; - while (true) { - - // check for end of attribute value - // looks for space and component separators - if (pos == length || chars[pos] == '+' || chars[pos] == ',' - || chars[pos] == ';') { - end = pos; - break; - } - - if (chars[pos] == ' ') { - end = pos; - pos++; - // skip trailing space chars before comma or semicolon. - // (compatibility with RFC 1779) - for (; pos < length && chars[pos] == ' '; pos++) { - } - break; - } else if (chars[pos] >= 'A' && chars[pos] <= 'F') { - chars[pos] += 32; //to low case - } - - pos++; - } - - // verify length of hex string - // encoded byte array must be not less then 4 and must be even number - int hexLen = end - beg; // skip first '#' char - if (hexLen < 5 || (hexLen & 1) == 0) { - throw new IllegalStateException("Unexpected end of DN: " + dn); - } - - // get byte encoding from string representation - byte[] encoded = new byte[hexLen / 2]; - for (int i = 0, p = beg + 1; i < encoded.length; p += 2, i++) { - encoded[i] = (byte) getByte(p); - } - - return new String(chars, beg, hexLen); - } - - // gets string attribute value: *( stringchar / pair ) - private String escapedAV() { - beg = pos; - end = pos; - while (true) { - if (pos >= length) { - // the end of DN has been found - return new String(chars, beg, end - beg); - } - - switch (chars[pos]) { - case '+': - case ',': - case ';': - // separator char has been found - return new String(chars, beg, end - beg); - case '\\': - // escaped char - chars[end++] = getEscaped(); - pos++; - break; - case ' ': - // need to figure out whether space defines - // the end of attribute value or not - cur = end; - - pos++; - chars[end++] = ' '; - - for (; pos < length && chars[pos] == ' '; pos++) { - chars[end++] = ' '; - } - if (pos == length || chars[pos] == ',' || chars[pos] == '+' - || chars[pos] == ';') { - // separator char or the end of DN has been found - return new String(chars, beg, cur - beg); - } - break; - default: - chars[end++] = chars[pos]; - pos++; - } - } - } - - // returns escaped char - private char getEscaped() { - pos++; - if (pos == length) { - throw new IllegalStateException("Unexpected end of DN: " + dn); - } - - switch (chars[pos]) { - case '"': - case '\\': - case ',': - case '=': - case '+': - case '<': - case '>': - case '#': - case ';': - case ' ': - case '*': - case '%': - case '_': - //FIXME: escaping is allowed only for leading or trailing space char - return chars[pos]; - default: - // RFC doesn't explicitly say that escaped hex pair is - // interpreted as UTF-8 char. It only contains an example of such DN. - return getUTF8(); - } - } - - // decodes UTF-8 char - // see http://www.unicode.org for UTF-8 bit distribution table - private char getUTF8() { - int res = getByte(pos); - pos++; //FIXME tmp - - if (res < 128) { // one byte: 0-7F - return (char) res; - } else if (res >= 192 && res <= 247) { - - int count; - if (res <= 223) { // two bytes: C0-DF - count = 1; - res = res & 0x1F; - } else if (res <= 239) { // three bytes: E0-EF - count = 2; - res = res & 0x0F; - } else { // four bytes: F0-F7 - count = 3; - res = res & 0x07; - } - - int b; - for (int i = 0; i < count; i++) { - pos++; - if (pos == length || chars[pos] != '\\') { - return 0x3F; //FIXME failed to decode UTF-8 char - return '?' - } - pos++; - - b = getByte(pos); - pos++; //FIXME tmp - if ((b & 0xC0) != 0x80) { - return 0x3F; //FIXME failed to decode UTF-8 char - return '?' - } - - res = (res << 6) + (b & 0x3F); - } - return (char) res; - } else { - return 0x3F; //FIXME failed to decode UTF-8 char - return '?' - } - } - - // Returns byte representation of a char pair - // The char pair is composed of DN char in - // specified 'position' and the next char - // According to BNF syntax: - // hexchar = DIGIT / "A" / "B" / "C" / "D" / "E" / "F" - // / "a" / "b" / "c" / "d" / "e" / "f" - private int getByte(int position) { - if (position + 1 >= length) { - throw new IllegalStateException("Malformed DN: " + dn); - } - - int b1, b2; - - b1 = chars[position]; - if (b1 >= '0' && b1 <= '9') { - b1 = b1 - '0'; - } else if (b1 >= 'a' && b1 <= 'f') { - b1 = b1 - 87; // 87 = 'a' - 10 - } else if (b1 >= 'A' && b1 <= 'F') { - b1 = b1 - 55; // 55 = 'A' - 10 - } else { - throw new IllegalStateException("Malformed DN: " + dn); - } - - b2 = chars[position + 1]; - if (b2 >= '0' && b2 <= '9') { - b2 = b2 - '0'; - } else if (b2 >= 'a' && b2 <= 'f') { - b2 = b2 - 87; // 87 = 'a' - 10 - } else if (b2 >= 'A' && b2 <= 'F') { - b2 = b2 - 55; // 55 = 'A' - 10 - } else { - throw new IllegalStateException("Malformed DN: " + dn); - } - - return (b1 << 4) + b2; - } - - /** - * Parses the DN and returns the most significant attribute value - * for an attribute type, or null if none found. - * - * @param attributeType attribute type to look for (e.g. "ca") - */ - public String findMostSpecific(String attributeType) { - // Initialize internal state. - pos = 0; - beg = 0; - end = 0; - cur = 0; - chars = dn.toCharArray(); - - String attType = nextAT(); - if (attType == null) { - return null; - } - while (true) { - String attValue = ""; - - if (pos == length) { - return null; - } - - switch (chars[pos]) { - case '"': - attValue = quotedAV(); - break; - case '#': - attValue = hexAV(); - break; - case '+': - case ',': - case ';': // compatibility with RFC 1779: semicolon can separate RDNs - //empty attribute value - break; - default: - attValue = escapedAV(); - } - - // Values are ordered from most specific to least specific - // due to the RFC2253 formatting. So take the first match - // we see. - if (attributeType.equalsIgnoreCase(attType)) { - return attValue; - } - - if (pos >= length) { - return null; - } - - if (chars[pos] == ',' || chars[pos] == ';') { - } else if (chars[pos] != '+') { - throw new IllegalStateException("Malformed DN: " + dn); - } - - pos++; - attType = nextAT(); - if (attType == null) { - throw new IllegalStateException("Malformed DN: " + dn); - } - } - } -} diff --git a/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/tls/OkHostnameVerifier.java b/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/tls/OkHostnameVerifier.java deleted file mode 100755 index a08773f..0000000 --- a/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/tls/OkHostnameVerifier.java +++ /dev/null @@ -1,194 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.squareup.okhttp.internal.tls; - -import java.security.cert.Certificate; -import java.security.cert.CertificateParsingException; -import java.security.cert.X509Certificate; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.List; -import java.util.Locale; -import java.util.regex.Pattern; -import javax.net.ssl.HostnameVerifier; -import javax.net.ssl.SSLException; -import javax.net.ssl.SSLSession; -import javax.security.auth.x500.X500Principal; - -/** - * A HostnameVerifier consistent with RFC 2818. - */ -public final class OkHostnameVerifier implements HostnameVerifier { - public static final OkHostnameVerifier INSTANCE = new OkHostnameVerifier(); - - /** - * Quick and dirty pattern to differentiate IP addresses from hostnames. This - * is an approximation of Android's private InetAddress#isNumeric API. - * - *

This matches IPv6 addresses as a hex string containing at least one - * colon, and possibly including dots after the first colon. It matches IPv4 - * addresses as strings containing only decimal digits and dots. This pattern - * matches strings like "a:.23" and "54" that are neither IP addresses nor - * hostnames; they will be verified as IP addresses (which is a more strict - * verification). - */ - private static final Pattern VERIFY_AS_IP_ADDRESS = Pattern.compile( - "([0-9a-fA-F]*:[0-9a-fA-F:.]*)|([\\d.]+)"); - - private static final int ALT_DNS_NAME = 2; - private static final int ALT_IPA_NAME = 7; - - private OkHostnameVerifier() { - } - - public boolean verify(String host, SSLSession session) { - try { - Certificate[] certificates = session.getPeerCertificates(); - return verify(host, (X509Certificate) certificates[0]); - } catch (SSLException e) { - return false; - } - } - - public boolean verify(String host, X509Certificate certificate) { - return verifyAsIpAddress(host) - ? verifyIpAddress(host, certificate) - : verifyHostName(host, certificate); - } - - static boolean verifyAsIpAddress(String host) { - return VERIFY_AS_IP_ADDRESS.matcher(host).matches(); - } - - /** - * Returns true if {@code certificate} matches {@code ipAddress}. - */ - private boolean verifyIpAddress(String ipAddress, X509Certificate certificate) { - for (String altName : getSubjectAltNames(certificate, ALT_IPA_NAME)) { - if (ipAddress.equalsIgnoreCase(altName)) { - return true; - } - } - return false; - } - - /** - * Returns true if {@code certificate} matches {@code hostName}. - */ - private boolean verifyHostName(String hostName, X509Certificate certificate) { - hostName = hostName.toLowerCase(Locale.US); - boolean hasDns = false; - for (String altName : getSubjectAltNames(certificate, ALT_DNS_NAME)) { - hasDns = true; - if (verifyHostName(hostName, altName)) { - return true; - } - } - - if (!hasDns) { - X500Principal principal = certificate.getSubjectX500Principal(); - // RFC 2818 advises using the most specific name for matching. - String cn = new DistinguishedNameParser(principal).findMostSpecific("cn"); - if (cn != null) { - return verifyHostName(hostName, cn); - } - } - - return false; - } - - private List getSubjectAltNames(X509Certificate certificate, int type) { - List result = new ArrayList(); - try { - Collection subjectAltNames = certificate.getSubjectAlternativeNames(); - if (subjectAltNames == null) { - return Collections.emptyList(); - } - for (Object subjectAltName : subjectAltNames) { - List entry = (List) subjectAltName; - if (entry == null || entry.size() < 2) { - continue; - } - Integer altNameType = (Integer) entry.get(0); - if (altNameType == null) { - continue; - } - if (altNameType == type) { - String altName = (String) entry.get(1); - if (altName != null) { - result.add(altName); - } - } - } - return result; - } catch (CertificateParsingException e) { - return Collections.emptyList(); - } - } - - /** - * Returns true if {@code hostName} matches the name or pattern {@code cn}. - * - * @param hostName lowercase host name. - * @param cn certificate host name. May include wildcards like - * {@code *.android.com}. - */ - public boolean verifyHostName(String hostName, String cn) { - // Check length == 0 instead of .isEmpty() to support Java 5. - if (hostName == null || hostName.length() == 0 || cn == null || cn.length() == 0) { - return false; - } - - cn = cn.toLowerCase(Locale.US); - - if (!cn.contains("*")) { - return hostName.equals(cn); - } - - if (cn.startsWith("*.") && hostName.regionMatches(0, cn, 2, cn.length() - 2)) { - return true; // "*.foo.com" matches "foo.com" - } - - int asterisk = cn.indexOf('*'); - int dot = cn.indexOf('.'); - if (asterisk > dot) { - return false; // malformed; wildcard must be in the first part of the cn - } - - if (!hostName.regionMatches(0, cn, 0, asterisk)) { - return false; // prefix before '*' doesn't match - } - - int suffixLength = cn.length() - (asterisk + 1); - int suffixStart = hostName.length() - suffixLength; - if (hostName.indexOf('.', asterisk) < suffixStart) { - // TODO: remove workaround for *.clients.google.com http://b/5426333 - if (!hostName.endsWith(".clients.google.com")) { - return false; // wildcard '*' can't match a '.' - } - } - - if (!hostName.regionMatches(suffixStart, cn, asterisk + 1, suffixLength)) { - return false; // suffix after '*' doesn't match - } - - return true; - } -} diff --git a/platforms/android/CordovaLib/src/org/apache/cordova/App.java b/platforms/android/CordovaLib/src/org/apache/cordova/App.java deleted file mode 100755 index 160923c..0000000 --- a/platforms/android/CordovaLib/src/org/apache/cordova/App.java +++ /dev/null @@ -1,301 +0,0 @@ -/* - Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.0 (the - "License"); you may not use this file except in compliance - with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, - software distributed under the License is distributed on an - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - KIND, either express or implied. See the License for the - specific language governing permissions and limitations - under the License. -*/ - -package org.apache.cordova; - -import org.apache.cordova.CallbackContext; -import org.apache.cordova.CordovaPlugin; -import org.apache.cordova.LOG; -import org.apache.cordova.PluginResult; -import org.json.JSONArray; -import org.json.JSONException; -import org.json.JSONObject; - -import android.content.BroadcastReceiver; -import android.content.Context; -import android.content.Intent; -import android.content.IntentFilter; -import android.telephony.TelephonyManager; -import android.view.KeyEvent; - -import java.util.HashMap; - -/** - * This class exposes methods in Cordova that can be called from JavaScript. - */ -public class App extends CordovaPlugin { - - protected static final String TAG = "CordovaApp"; - private BroadcastReceiver telephonyReceiver; - - /** - * Sets the context of the Command. This can then be used to do things like - * get file paths associated with the Activity. - */ - @Override - public void pluginInitialize() { - this.initTelephonyReceiver(); - } - - /** - * Executes the request and returns PluginResult. - * - * @param action The action to execute. - * @param args JSONArry of arguments for the plugin. - * @param callbackContext The callback context from which we were invoked. - * @return A PluginResult object with a status and message. - */ - public boolean execute(String action, JSONArray args, CallbackContext callbackContext) throws JSONException { - PluginResult.Status status = PluginResult.Status.OK; - String result = ""; - - try { - if (action.equals("clearCache")) { - this.clearCache(); - } - else if (action.equals("show")) { - // This gets called from JavaScript onCordovaReady to show the webview. - // I recommend we change the name of the Message as spinner/stop is not - // indicative of what this actually does (shows the webview). - cordova.getActivity().runOnUiThread(new Runnable() { - public void run() { - webView.postMessage("spinner", "stop"); - } - }); - } - else if (action.equals("loadUrl")) { - this.loadUrl(args.getString(0), args.optJSONObject(1)); - } - else if (action.equals("cancelLoadUrl")) { - //this.cancelLoadUrl(); - } - else if (action.equals("clearHistory")) { - this.clearHistory(); - } - else if (action.equals("backHistory")) { - this.backHistory(); - } - else if (action.equals("overrideButton")) { - this.overrideButton(args.getString(0), args.getBoolean(1)); - } - else if (action.equals("overrideBackbutton")) { - this.overrideBackbutton(args.getBoolean(0)); - } - else if (action.equals("exitApp")) { - this.exitApp(); - } - callbackContext.sendPluginResult(new PluginResult(status, result)); - return true; - } catch (JSONException e) { - callbackContext.sendPluginResult(new PluginResult(PluginResult.Status.JSON_EXCEPTION)); - return false; - } - } - - //-------------------------------------------------------------------------- - // LOCAL METHODS - //-------------------------------------------------------------------------- - - /** - * Clear the resource cache. - */ - public void clearCache() { - cordova.getActivity().runOnUiThread(new Runnable() { - public void run() { - webView.clearCache(true); - } - }); - } - - /** - * Load the url into the webview. - * - * @param url - * @param props Properties that can be passed in to the Cordova activity (i.e. loadingDialog, wait, ...) - * @throws JSONException - */ - public void loadUrl(String url, JSONObject props) throws JSONException { - LOG.d("App", "App.loadUrl("+url+","+props+")"); - int wait = 0; - boolean openExternal = false; - boolean clearHistory = false; - - // If there are properties, then set them on the Activity - HashMap params = new HashMap(); - if (props != null) { - JSONArray keys = props.names(); - for (int i = 0; i < keys.length(); i++) { - String key = keys.getString(i); - if (key.equals("wait")) { - wait = props.getInt(key); - } - else if (key.equalsIgnoreCase("openexternal")) { - openExternal = props.getBoolean(key); - } - else if (key.equalsIgnoreCase("clearhistory")) { - clearHistory = props.getBoolean(key); - } - else { - Object value = props.get(key); - if (value == null) { - - } - else if (value.getClass().equals(String.class)) { - params.put(key, (String)value); - } - else if (value.getClass().equals(Boolean.class)) { - params.put(key, (Boolean)value); - } - else if (value.getClass().equals(Integer.class)) { - params.put(key, (Integer)value); - } - } - } - } - - // If wait property, then delay loading - - if (wait > 0) { - try { - synchronized(this) { - this.wait(wait); - } - } catch (InterruptedException e) { - e.printStackTrace(); - } - } - this.webView.showWebPage(url, openExternal, clearHistory, params); - } - - /** - * Clear page history for the app. - */ - public void clearHistory() { - cordova.getActivity().runOnUiThread(new Runnable() { - public void run() { - webView.clearHistory(); - } - }); - } - - /** - * Go to previous page displayed. - * This is the same as pressing the backbutton on Android device. - */ - public void backHistory() { - cordova.getActivity().runOnUiThread(new Runnable() { - public void run() { - webView.backHistory(); - } - }); - } - - /** - * Override the default behavior of the Android back button. - * If overridden, when the back button is pressed, the "backKeyDown" JavaScript event will be fired. - * - * @param override T=override, F=cancel override - */ - public void overrideBackbutton(boolean override) { - LOG.i("App", "WARNING: Back Button Default Behavior will be overridden. The backbutton event will be fired!"); - webView.setButtonPlumbedToJs(KeyEvent.KEYCODE_BACK, override); - } - - /** - * Override the default behavior of the Android volume buttons. - * If overridden, when the volume button is pressed, the "volume[up|down]button" JavaScript event will be fired. - * - * @param button volumeup, volumedown - * @param override T=override, F=cancel override - */ - public void overrideButton(String button, boolean override) { - LOG.i("App", "WARNING: Volume Button Default Behavior will be overridden. The volume event will be fired!"); - if (button.equals("volumeup")) { - webView.setButtonPlumbedToJs(KeyEvent.KEYCODE_VOLUME_UP, override); - } - else if (button.equals("volumedown")) { - webView.setButtonPlumbedToJs(KeyEvent.KEYCODE_VOLUME_DOWN, override); - } - } - - /** - * Return whether the Android back button is overridden by the user. - * - * @return boolean - */ - public boolean isBackbuttonOverridden() { - return webView.isButtonPlumbedToJs(KeyEvent.KEYCODE_BACK); - } - - /** - * Exit the Android application. - */ - public void exitApp() { - this.webView.postMessage("exit", null); - } - - - /** - * Listen for telephony events: RINGING, OFFHOOK and IDLE - * Send these events to all plugins using - * CordovaActivity.onMessage("telephone", "ringing" | "offhook" | "idle") - */ - private void initTelephonyReceiver() { - IntentFilter intentFilter = new IntentFilter(); - intentFilter.addAction(TelephonyManager.ACTION_PHONE_STATE_CHANGED); - //final CordovaInterface mycordova = this.cordova; - this.telephonyReceiver = new BroadcastReceiver() { - - @Override - public void onReceive(Context context, Intent intent) { - - // If state has changed - if ((intent != null) && intent.getAction().equals(TelephonyManager.ACTION_PHONE_STATE_CHANGED)) { - if (intent.hasExtra(TelephonyManager.EXTRA_STATE)) { - String extraData = intent.getStringExtra(TelephonyManager.EXTRA_STATE); - if (extraData.equals(TelephonyManager.EXTRA_STATE_RINGING)) { - LOG.i(TAG, "Telephone RINGING"); - webView.postMessage("telephone", "ringing"); - } - else if (extraData.equals(TelephonyManager.EXTRA_STATE_OFFHOOK)) { - LOG.i(TAG, "Telephone OFFHOOK"); - webView.postMessage("telephone", "offhook"); - } - else if (extraData.equals(TelephonyManager.EXTRA_STATE_IDLE)) { - LOG.i(TAG, "Telephone IDLE"); - webView.postMessage("telephone", "idle"); - } - } - } - } - }; - - // Register the receiver - this.cordova.getActivity().registerReceiver(this.telephonyReceiver, intentFilter); - } - - /* - * Unregister the receiver - * - */ - public void onDestroy() - { - this.cordova.getActivity().unregisterReceiver(this.telephonyReceiver); - } -} diff --git a/platforms/android/CordovaLib/src/org/apache/cordova/AuthenticationToken.java b/platforms/android/CordovaLib/src/org/apache/cordova/AuthenticationToken.java deleted file mode 100644 index d3a231a..0000000 --- a/platforms/android/CordovaLib/src/org/apache/cordova/AuthenticationToken.java +++ /dev/null @@ -1,69 +0,0 @@ -/* - Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.0 (the - "License"); you may not use this file except in compliance - with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, - software distributed under the License is distributed on an - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - KIND, either express or implied. See the License for the - specific language governing permissions and limitations - under the License. -*/ -package org.apache.cordova; - -/** - * The Class AuthenticationToken defines the userName and password to be used for authenticating a web resource - */ -public class AuthenticationToken { - private String userName; - private String password; - - /** - * Gets the user name. - * - * @return the user name - */ - public String getUserName() { - return userName; - } - - /** - * Sets the user name. - * - * @param userName - * the new user name - */ - public void setUserName(String userName) { - this.userName = userName; - } - - /** - * Gets the password. - * - * @return the password - */ - public String getPassword() { - return password; - } - - /** - * Sets the password. - * - * @param password - * the new password - */ - public void setPassword(String password) { - this.password = password; - } - - - - -} diff --git a/platforms/android/CordovaLib/src/org/apache/cordova/CallbackContext.java b/platforms/android/CordovaLib/src/org/apache/cordova/CallbackContext.java deleted file mode 100644 index 446c37d..0000000 --- a/platforms/android/CordovaLib/src/org/apache/cordova/CallbackContext.java +++ /dev/null @@ -1,144 +0,0 @@ -/* - Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.0 (the - "License"); you may not use this file except in compliance - with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, - software distributed under the License is distributed on an - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - KIND, either express or implied. See the License for the - specific language governing permissions and limitations - under the License. -*/ -package org.apache.cordova; - -import org.json.JSONArray; - -import android.util.Log; - -import org.apache.cordova.CordovaWebView; -import org.apache.cordova.PluginResult; -import org.json.JSONObject; - -public class CallbackContext { - private static final String LOG_TAG = "CordovaPlugin"; - - private String callbackId; - private CordovaWebView webView; - private boolean finished; - private int changingThreads; - - public CallbackContext(String callbackId, CordovaWebView webView) { - this.callbackId = callbackId; - this.webView = webView; - } - - public boolean isFinished() { - return finished; - } - - public boolean isChangingThreads() { - return changingThreads > 0; - } - - public String getCallbackId() { - return callbackId; - } - - public void sendPluginResult(PluginResult pluginResult) { - synchronized (this) { - if (finished) { - Log.w(LOG_TAG, "Attempted to send a second callback for ID: " + callbackId + "\nResult was: " + pluginResult.getMessage()); - return; - } else { - finished = !pluginResult.getKeepCallback(); - } - } - webView.sendPluginResult(pluginResult, callbackId); - } - - /** - * Helper for success callbacks that just returns the Status.OK by default - * - * @param message The message to add to the success result. - */ - public void success(JSONObject message) { - sendPluginResult(new PluginResult(PluginResult.Status.OK, message)); - } - - /** - * Helper for success callbacks that just returns the Status.OK by default - * - * @param message The message to add to the success result. - */ - public void success(String message) { - sendPluginResult(new PluginResult(PluginResult.Status.OK, message)); - } - - /** - * Helper for success callbacks that just returns the Status.OK by default - * - * @param message The message to add to the success result. - */ - public void success(JSONArray message) { - sendPluginResult(new PluginResult(PluginResult.Status.OK, message)); - } - - /** - * Helper for success callbacks that just returns the Status.OK by default - * - * @param message The message to add to the success result. - */ - public void success(byte[] message) { - sendPluginResult(new PluginResult(PluginResult.Status.OK, message)); - } - - /** - * Helper for success callbacks that just returns the Status.OK by default - * - * @param message The message to add to the success result. - */ - public void success(int message) { - sendPluginResult(new PluginResult(PluginResult.Status.OK, message)); - } - - /** - * Helper for success callbacks that just returns the Status.OK by default - */ - public void success() { - sendPluginResult(new PluginResult(PluginResult.Status.OK)); - } - - /** - * Helper for error callbacks that just returns the Status.ERROR by default - * - * @param message The message to add to the error result. - */ - public void error(JSONObject message) { - sendPluginResult(new PluginResult(PluginResult.Status.ERROR, message)); - } - - /** - * Helper for error callbacks that just returns the Status.ERROR by default - * - * @param message The message to add to the error result. - */ - public void error(String message) { - sendPluginResult(new PluginResult(PluginResult.Status.ERROR, message)); - } - - /** - * Helper for error callbacks that just returns the Status.ERROR by default - * - * @param message The message to add to the error result. - */ - public void error(int message) { - sendPluginResult(new PluginResult(PluginResult.Status.ERROR, message)); - } -} diff --git a/platforms/android/CordovaLib/src/org/apache/cordova/Config.java b/platforms/android/CordovaLib/src/org/apache/cordova/Config.java deleted file mode 100644 index f13292c..0000000 --- a/platforms/android/CordovaLib/src/org/apache/cordova/Config.java +++ /dev/null @@ -1,122 +0,0 @@ -/* - Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.0 (the - "License"); you may not use this file except in compliance - with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, - software distributed under the License is distributed on an - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - KIND, either express or implied. See the License for the - specific language governing permissions and limitations - under the License. -*/ - -package org.apache.cordova; - -import java.util.List; - -import android.app.Activity; -import android.util.Log; - -@Deprecated // Use Whitelist, CordovaPrefences, etc. directly. -public class Config { - private static final String TAG = "Config"; - - static ConfigXmlParser parser; - - private Config() { - } - - public static void init(Activity action) { - parser = new ConfigXmlParser(); - parser.parse(action); - parser.getPreferences().setPreferencesBundle(action.getIntent().getExtras()); - parser.getPreferences().copyIntoIntentExtras(action); - } - - // Intended to be used for testing only; creates an empty configuration. - public static void init() { - if (parser == null) { - parser = new ConfigXmlParser(); - } - } - - /** - * Add entry to approved list of URLs (whitelist) - * - * @param origin URL regular expression to allow - * @param subdomains T=include all subdomains under origin - */ - public static void addWhiteListEntry(String origin, boolean subdomains) { - if (parser == null) { - Log.e(TAG, "Config was not initialised. Did you forget to Config.init(this)?"); - return; - } - parser.getInternalWhitelist().addWhiteListEntry(origin, subdomains); - } - - /** - * Determine if URL is in approved list of URLs to load. - * - * @param url - * @return true if whitelisted - */ - public static boolean isUrlWhiteListed(String url) { - if (parser == null) { - Log.e(TAG, "Config was not initialised. Did you forget to Config.init(this)?"); - return false; - } - return parser.getInternalWhitelist().isUrlWhiteListed(url); - } - - /** - * Determine if URL is in approved list of URLs to launch external applications. - * - * @param url - * @return true if whitelisted - */ - public static boolean isUrlExternallyWhiteListed(String url) { - if (parser == null) { - Log.e(TAG, "Config was not initialised. Did you forget to Config.init(this)?"); - return false; - } - return parser.getExternalWhitelist().isUrlWhiteListed(url); - } - - public static String getStartUrl() { - if (parser == null) { - return "file:///android_asset/www/index.html"; - } - return parser.getLaunchUrl(); - } - - public static String getErrorUrl() { - return parser.getPreferences().getString("errorurl", null); - } - - public static Whitelist getWhitelist() { - return parser.getInternalWhitelist(); - } - - public static Whitelist getExternalWhitelist() { - return parser.getExternalWhitelist(); - } - - public static List getPluginEntries() { - return parser.getPluginEntries(); - } - - public static CordovaPreferences getPreferences() { - return parser.getPreferences(); - } - - public static boolean isInitialized() { - return parser != null; - } -} diff --git a/platforms/android/CordovaLib/src/org/apache/cordova/ConfigXmlParser.java b/platforms/android/CordovaLib/src/org/apache/cordova/ConfigXmlParser.java deleted file mode 100644 index 1ada1af..0000000 --- a/platforms/android/CordovaLib/src/org/apache/cordova/ConfigXmlParser.java +++ /dev/null @@ -1,181 +0,0 @@ -/* - Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.0 (the - "License"); you may not use this file except in compliance - with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, - software distributed under the License is distributed on an - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - KIND, either express or implied. See the License for the - specific language governing permissions and limitations - under the License. -*/ - -package org.apache.cordova; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.Locale; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import org.apache.cordova.LOG; -import org.xmlpull.v1.XmlPullParserException; - -import android.app.Activity; -import android.content.res.XmlResourceParser; -import android.util.Log; - -public class ConfigXmlParser { - private static String TAG = "ConfigXmlParser"; - - private String launchUrl = "file:///android_asset/www/index.html"; - private CordovaPreferences prefs = new CordovaPreferences(); - private Whitelist internalWhitelist = new Whitelist(); - private Whitelist externalWhitelist = new Whitelist(); - private ArrayList pluginEntries = new ArrayList(20); - - public Whitelist getInternalWhitelist() { - return internalWhitelist; - } - - public Whitelist getExternalWhitelist() { - return externalWhitelist; - } - - public CordovaPreferences getPreferences() { - return prefs; - } - - public ArrayList getPluginEntries() { - return pluginEntries; - } - - public String getLaunchUrl() { - return launchUrl; - } - - public void parse(Activity action) { - // First checking the class namespace for config.xml - int id = action.getResources().getIdentifier("config", "xml", action.getClass().getPackage().getName()); - if (id == 0) { - // If we couldn't find config.xml there, we'll look in the namespace from AndroidManifest.xml - id = action.getResources().getIdentifier("config", "xml", action.getPackageName()); - if (id == 0) { - LOG.e(TAG, "res/xml/config.xml is missing!"); - return; - } - } - parse(action.getResources().getXml(id)); - } - - public void parse(XmlResourceParser xml) { - int eventType = -1; - String service = "", pluginClass = "", paramType = ""; - boolean onload = false; - boolean insideFeature = false; - ArrayList urlMap = null; - - // Add implicitly allowed URLs - internalWhitelist.addWhiteListEntry("file:///*", false); - internalWhitelist.addWhiteListEntry("content:///*", false); - internalWhitelist.addWhiteListEntry("data:*", false); - - while (eventType != XmlResourceParser.END_DOCUMENT) { - if (eventType == XmlResourceParser.START_TAG) { - String strNode = xml.getName(); - if (strNode.equals("url-filter")) { - Log.w(TAG, "Plugin " + service + " is using deprecated tag "); - if (urlMap == null) { - urlMap = new ArrayList(2); - } - urlMap.add(xml.getAttributeValue(null, "value")); - } else if (strNode.equals("feature")) { - //Check for supported feature sets aka. plugins (Accelerometer, Geolocation, etc) - //Set the bit for reading params - insideFeature = true; - service = xml.getAttributeValue(null, "name"); - } - else if (insideFeature && strNode.equals("param")) { - paramType = xml.getAttributeValue(null, "name"); - if (paramType.equals("service")) // check if it is using the older service param - service = xml.getAttributeValue(null, "value"); - else if (paramType.equals("package") || paramType.equals("android-package")) - pluginClass = xml.getAttributeValue(null,"value"); - else if (paramType.equals("onload")) - onload = "true".equals(xml.getAttributeValue(null, "value")); - } - else if (strNode.equals("access")) { - String origin = xml.getAttributeValue(null, "origin"); - String subdomains = xml.getAttributeValue(null, "subdomains"); - boolean external = (xml.getAttributeValue(null, "launch-external") != null); - if (origin != null) { - if (external) { - externalWhitelist.addWhiteListEntry(origin, (subdomains != null) && (subdomains.compareToIgnoreCase("true") == 0)); - } else { - if ("*".equals(origin)) { - // Special-case * origin to mean http and https when used for internal - // whitelist. This prevents external urls like sms: and geo: from being - // handled internally. - internalWhitelist.addWhiteListEntry("http://*/*", false); - internalWhitelist.addWhiteListEntry("https://*/*", false); - } else { - internalWhitelist.addWhiteListEntry(origin, (subdomains != null) && (subdomains.compareToIgnoreCase("true") == 0)); - } - } - } - } - else if (strNode.equals("preference")) { - String name = xml.getAttributeValue(null, "name").toLowerCase(Locale.ENGLISH); - String value = xml.getAttributeValue(null, "value"); - prefs.set(name, value); - } - else if (strNode.equals("content")) { - String src = xml.getAttributeValue(null, "src"); - if (src != null) { - setStartUrl(src); - } - } - } - else if (eventType == XmlResourceParser.END_TAG) - { - String strNode = xml.getName(); - if (strNode.equals("feature")) { - pluginEntries.add(new PluginEntry(service, pluginClass, onload, urlMap)); - - service = ""; - pluginClass = ""; - insideFeature = false; - onload = false; - urlMap = null; - } - } - try { - eventType = xml.next(); - } catch (XmlPullParserException e) { - e.printStackTrace(); - } catch (IOException e) { - e.printStackTrace(); - } - } - } - - private void setStartUrl(String src) { - Pattern schemeRegex = Pattern.compile("^[a-z-]+://"); - Matcher matcher = schemeRegex.matcher(src); - if (matcher.find()) { - launchUrl = src; - } else { - if (src.charAt(0) == '/') { - src = src.substring(1); - } - launchUrl = "file:///android_asset/www/" + src; - } - } -} diff --git a/platforms/android/CordovaLib/src/org/apache/cordova/CordovaActivity.java b/platforms/android/CordovaLib/src/org/apache/cordova/CordovaActivity.java deleted file mode 100755 index 3c12a97..0000000 --- a/platforms/android/CordovaLib/src/org/apache/cordova/CordovaActivity.java +++ /dev/null @@ -1,1063 +0,0 @@ -/* - Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.0 (the - "License"); you may not use this file except in compliance - with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, - software distributed under the License is distributed on an - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - KIND, either express or implied. See the License for the - specific language governing permissions and limitations - under the License. -*/ -package org.apache.cordova; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; - -import org.apache.cordova.CordovaInterface; -import org.apache.cordova.CordovaPlugin; -import org.apache.cordova.LOG; -import org.json.JSONException; -import org.json.JSONObject; - -import android.annotation.SuppressLint; -import android.app.Activity; -import android.app.AlertDialog; -import android.app.Dialog; -import android.app.ProgressDialog; -import android.content.Context; -import android.content.DialogInterface; -import android.content.Intent; -import android.graphics.Color; -import android.media.AudioManager; -import android.net.Uri; -import android.os.Bundle; -import android.os.Handler; -import android.util.Log; -import android.view.Display; -import android.view.KeyEvent; -import android.view.Menu; -import android.view.MenuItem; -import android.view.View; -import android.view.ViewGroup; -import android.view.ViewParent; -import android.view.Window; -import android.view.WindowManager; -import android.webkit.ValueCallback; -import android.webkit.WebViewClient; -import android.widget.LinearLayout; - -/** - * This class is the main Android activity that represents the Cordova - * application. It should be extended by the user to load the specific - * html file that contains the application. - * - * As an example: - * - *

- *     package org.apache.cordova.examples;
- *
- *     import android.os.Bundle;
- *     import org.apache.cordova.*;
- *
- *     public class Example extends CordovaActivity {
- *       @Override
- *       public void onCreate(Bundle savedInstanceState) {
- *         super.onCreate(savedInstanceState);
- *         super.init();
- *         // Load your application
- *         loadUrl(launchUrl);
- *       }
- *     }
- * 
- * - * Cordova xml configuration: Cordova uses a configuration file at - * res/xml/config.xml to specify its settings. See "The config.xml File" - * guide in cordova-docs at http://cordova.apache.org/docs for the documentation - * for the configuration. The use of the set*Property() methods is - * deprecated in favor of the config.xml file. - * - */ -public class CordovaActivity extends Activity implements CordovaInterface { - public static String TAG = "CordovaActivity"; - - // The webview for our app - protected CordovaWebView appView; - - @Deprecated // unused. - protected CordovaWebViewClient webViewClient; - - @Deprecated // Will be removed. Use findViewById() to retrieve views. - protected LinearLayout root; - - protected ProgressDialog spinnerDialog = null; - private final ExecutorService threadPool = Executors.newCachedThreadPool(); - - private static int ACTIVITY_STARTING = 0; - private static int ACTIVITY_RUNNING = 1; - private static int ACTIVITY_EXITING = 2; - private int activityState = 0; // 0=starting, 1=running (after 1st resume), 2=shutting down - - // Plugin to call when activity result is received - protected CordovaPlugin activityResultCallback = null; - protected boolean activityResultKeepRunning; - - /* - * The variables below are used to cache some of the activity properties. - */ - - // Draw a splash screen using an image located in the drawable resource directory. - // This is not the same as calling super.loadSplashscreen(url) - protected int splashscreen = 0; - protected int splashscreenTime = 3000; - - // LoadUrl timeout value in msec (default of 20 sec) - protected int loadUrlTimeoutValue = 20000; - - // Keep app running when pause is received. (default = true) - // If true, then the JavaScript and native code continue to run in the background - // when another application (activity) is started. - protected boolean keepRunning = true; - - private String initCallbackClass; - - // Read from config.xml: - protected CordovaPreferences preferences; - protected Whitelist internalWhitelist; - protected Whitelist externalWhitelist; - protected String launchUrl; - protected ArrayList pluginEntries; - - /** - * Sets the authentication token. - * - * @param authenticationToken - * @param host - * @param realm - */ - public void setAuthenticationToken(AuthenticationToken authenticationToken, String host, String realm) { - if (this.appView != null && this.appView.viewClient != null) { - this.appView.viewClient.setAuthenticationToken(authenticationToken, host, realm); - } - } - - /** - * Removes the authentication token. - * - * @param host - * @param realm - * - * @return the authentication token or null if did not exist - */ - public AuthenticationToken removeAuthenticationToken(String host, String realm) { - if (this.appView != null && this.appView.viewClient != null) { - return this.appView.viewClient.removeAuthenticationToken(host, realm); - } - return null; - } - - /** - * Gets the authentication token. - * - * In order it tries: - * 1- host + realm - * 2- host - * 3- realm - * 4- no host, no realm - * - * @param host - * @param realm - * - * @return the authentication token - */ - public AuthenticationToken getAuthenticationToken(String host, String realm) { - if (this.appView != null && this.appView.viewClient != null) { - return this.appView.viewClient.getAuthenticationToken(host, realm); - } - return null; - } - - /** - * Clear all authentication tokens. - */ - public void clearAuthenticationTokens() { - if (this.appView != null && this.appView.viewClient != null) { - this.appView.viewClient.clearAuthenticationTokens(); - } - } - - /** - * Called when the activity is first created. - */ - @Override - public void onCreate(Bundle savedInstanceState) { - LOG.i(TAG, "Apache Cordova native platform version " + CordovaWebView.CORDOVA_VERSION + " is starting"); - LOG.d(TAG, "CordovaActivity.onCreate()"); - - // need to activate preferences before super.onCreate to avoid "requestFeature() must be called before adding content" exception - loadConfig(); - if(!preferences.getBoolean("ShowTitle", false)) - { - getWindow().requestFeature(Window.FEATURE_NO_TITLE); - } - - if(preferences.getBoolean("SetFullscreen", false)) - { - Log.d(TAG, "The SetFullscreen configuration is deprecated in favor of Fullscreen, and will be removed in a future version."); - getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, - WindowManager.LayoutParams.FLAG_FULLSCREEN); - } else if (preferences.getBoolean("Fullscreen", false)) { - getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, - WindowManager.LayoutParams.FLAG_FULLSCREEN); - } else { - getWindow().setFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN, - WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN); - } - - super.onCreate(savedInstanceState); - - if(savedInstanceState != null) - { - initCallbackClass = savedInstanceState.getString("callbackClass"); - } - } - - @SuppressWarnings("deprecation") - protected void loadConfig() { - ConfigXmlParser parser = new ConfigXmlParser(); - parser.parse(this); - preferences = parser.getPreferences(); - preferences.setPreferencesBundle(getIntent().getExtras()); - preferences.copyIntoIntentExtras(this); - internalWhitelist = parser.getInternalWhitelist(); - externalWhitelist = parser.getExternalWhitelist(); - launchUrl = parser.getLaunchUrl(); - pluginEntries = parser.getPluginEntries(); - Config.parser = parser; - } - - @SuppressWarnings("deprecation") - protected void createViews() { - // This builds the view. We could probably get away with NOT having a LinearLayout, but I like having a bucket! - - LOG.d(TAG, "CordovaActivity.createViews()"); - - Display display = getWindowManager().getDefaultDisplay(); - int width = display.getWidth(); - int height = display.getHeight(); - - root = new LinearLayoutSoftKeyboardDetect(this, width, height); - root.setOrientation(LinearLayout.VERTICAL); - root.setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, - ViewGroup.LayoutParams.MATCH_PARENT, 0.0F)); - - appView.setId(100); - appView.setLayoutParams(new LinearLayout.LayoutParams( - ViewGroup.LayoutParams.MATCH_PARENT, - ViewGroup.LayoutParams.MATCH_PARENT, - 1.0F)); - - // Add web view but make it invisible while loading URL - appView.setVisibility(View.INVISIBLE); - - // need to remove appView from any existing parent before invoking root.addView(appView) - ViewParent parent = appView.getParent(); - if ((parent != null) && (parent != root)) { - LOG.d(TAG, "removing appView from existing parent"); - ViewGroup parentGroup = (ViewGroup) parent; - parentGroup.removeView(appView); - } - root.addView((View) appView); - setContentView(root); - - int backgroundColor = preferences.getInteger("BackgroundColor", Color.BLACK); - root.setBackgroundColor(backgroundColor); - } - - /** - * Get the Android activity. - */ - @Override public Activity getActivity() { - return this; - } - - /** - * Construct the default web view object. - * - * This is intended to be overridable by subclasses of CordovaIntent which - * require a more specialized web view. - */ - protected CordovaWebView makeWebView() { - return new CordovaWebView(CordovaActivity.this); - } - - /** - * Construct the client for the default web view object. - * - * This is intended to be overridable by subclasses of CordovaIntent which - * require a more specialized web view. - * - * @param webView the default constructed web view object - */ - protected CordovaWebViewClient makeWebViewClient(CordovaWebView webView) { - return webView.makeWebViewClient(this); - } - - /** - * Construct the chrome client for the default web view object. - * - * This is intended to be overridable by subclasses of CordovaIntent which - * require a more specialized web view. - * - * @param webView the default constructed web view object - */ - protected CordovaChromeClient makeChromeClient(CordovaWebView webView) { - return webView.makeWebChromeClient(this); - } - - public void init() { - this.init(appView, null, null); - } - - @SuppressLint("NewApi") - @Deprecated // Call init() instead and override makeWebView() to customize. - public void init(CordovaWebView webView, CordovaWebViewClient webViewClient, CordovaChromeClient webChromeClient) { - LOG.d(TAG, "CordovaActivity.init()"); - - appView = webView != null ? webView : makeWebView(); - if (appView.pluginManager == null) { - appView.init(this, webViewClient != null ? webViewClient : makeWebViewClient(appView), - webChromeClient != null ? webChromeClient : makeChromeClient(appView), - pluginEntries, internalWhitelist, externalWhitelist, preferences); - } - - // TODO: Have the views set this themselves. - if (preferences.getBoolean("DisallowOverscroll", false)) { - appView.setOverScrollMode(View.OVER_SCROLL_NEVER); - } - createViews(); - - // TODO: Make this a preference (CB-6153) - // Setup the hardware volume controls to handle volume control - setVolumeControlStream(AudioManager.STREAM_MUSIC); - } - - /** - * Load the url into the webview. - */ - public void loadUrl(String url) { - if (appView == null) { - init(); - } - this.splashscreenTime = preferences.getInteger("SplashScreenDelay", this.splashscreenTime); - String splash = preferences.getString("SplashScreen", null); - if(this.splashscreenTime > 0 && splash != null) - { - this.splashscreen = getResources().getIdentifier(splash, "drawable", getClass().getPackage().getName());; - if(this.splashscreen != 0) - { - this.showSplashScreen(this.splashscreenTime); - } - } - - // If keepRunning - this.keepRunning = preferences.getBoolean("KeepRunning", true); - - //Check if the view is attached to anything - if(appView.getParent() != null) - { - // Then load the spinner - this.loadSpinner(); - } - //Load the correct splashscreen - - if(this.splashscreen != 0) - { - this.appView.loadUrl(url, this.splashscreenTime); - } - else - { - this.appView.loadUrl(url); - } - } - - /** - * Load the url into the webview after waiting for period of time. - * This is used to display the splashscreen for certain amount of time. - * - * @param url - * @param time The number of ms to wait before loading webview - */ - public void loadUrl(final String url, int time) { - - this.splashscreenTime = time; - this.loadUrl(url); - } - - /* - * Load the spinner - */ - void loadSpinner() { - - // If loadingDialog property, then show the App loading dialog for first page of app - String loading = null; - if ((this.appView == null) || !this.appView.canGoBack()) { - loading = preferences.getString("LoadingDialog", null); - } - else { - loading = preferences.getString("LoadingPageDialog", null); - } - if (loading != null) { - - String title = ""; - String message = "Loading Application..."; - - if (loading.length() > 0) { - int comma = loading.indexOf(','); - if (comma > 0) { - title = loading.substring(0, comma); - message = loading.substring(comma + 1); - } - else { - title = ""; - message = loading; - } - } - this.spinnerStart(title, message); - } - } - - @Deprecated - public void cancelLoadUrl() { - } - - /** - * Clear the resource cache. - */ - @Deprecated // Call method on appView directly. - public void clearCache() { - if (appView == null) { - init(); - } - this.appView.clearCache(true); - } - - /** - * Clear web history in this web view. - */ - @Deprecated // Call method on appView directly. - public void clearHistory() { - this.appView.clearHistory(); - } - - /** - * Go to previous page in history. (We manage our own history) - * - * @return true if we went back, false if we are already at top - */ - @Deprecated // Call method on appView directly. - public boolean backHistory() { - if (this.appView != null) { - return appView.backHistory(); - } - return false; - } - - /** - * Get boolean property for activity. - */ - @Deprecated // Call method on preferences directly. - public boolean getBooleanProperty(String name, boolean defaultValue) { - return preferences.getBoolean(name, defaultValue); - } - - /** - * Get int property for activity. - */ - @Deprecated // Call method on preferences directly. - public int getIntegerProperty(String name, int defaultValue) { - return preferences.getInteger(name, defaultValue); - } - - /** - * Get string property for activity. - */ - @Deprecated // Call method on preferences directly. - public String getStringProperty(String name, String defaultValue) { - return preferences.getString(name, defaultValue); - } - - /** - * Get double property for activity. - */ - @Deprecated // Call method on preferences directly. - public double getDoubleProperty(String name, double defaultValue) { - return preferences.getDouble(name, defaultValue); - } - - /** - * Set boolean property on activity. - * This method has been deprecated in 3.0 and will be removed at a future - * time. Please use config.xml instead. - * - * @param name - * @param value - * @deprecated - */ - @Deprecated - public void setBooleanProperty(String name, boolean value) { - Log.d(TAG, "Setting boolean properties in CordovaActivity will be deprecated in 3.0 on July 2013, please use config.xml"); - this.getIntent().putExtra(name.toLowerCase(), value); - } - - /** - * Set int property on activity. - * This method has been deprecated in 3.0 and will be removed at a future - * time. Please use config.xml instead. - * - * @param name - * @param value - * @deprecated - */ - @Deprecated - public void setIntegerProperty(String name, int value) { - Log.d(TAG, "Setting integer properties in CordovaActivity will be deprecated in 3.0 on July 2013, please use config.xml"); - this.getIntent().putExtra(name.toLowerCase(), value); - } - - /** - * Set string property on activity. - * This method has been deprecated in 3.0 and will be removed at a future - * time. Please use config.xml instead. - * - * @param name - * @param value - * @deprecated - */ - @Deprecated - public void setStringProperty(String name, String value) { - Log.d(TAG, "Setting string properties in CordovaActivity will be deprecated in 3.0 on July 2013, please use config.xml"); - this.getIntent().putExtra(name.toLowerCase(), value); - } - - /** - * Set double property on activity. - * This method has been deprecated in 3.0 and will be removed at a future - * time. Please use config.xml instead. - * - * @param name - * @param value - * @deprecated - */ - @Deprecated - public void setDoubleProperty(String name, double value) { - Log.d(TAG, "Setting double properties in CordovaActivity will be deprecated in 3.0 on July 2013, please use config.xml"); - this.getIntent().putExtra(name.toLowerCase(), value); - } - - /** - * Called when the system is about to start resuming a previous activity. - */ - @Override - protected void onPause() { - super.onPause(); - - LOG.d(TAG, "Paused the application!"); - - // Don't process pause if shutting down, since onDestroy() will be called - if (this.activityState == ACTIVITY_EXITING) { - return; - } - - if (this.appView == null) { - return; - } - else - { - this.appView.handlePause(this.keepRunning); - } - - // hide the splash screen to avoid leaking a window - this.removeSplashScreen(); - } - - /** - * Called when the activity receives a new intent - **/ - @Override - protected void onNewIntent(Intent intent) { - super.onNewIntent(intent); - //Forward to plugins - if (this.appView != null) - this.appView.onNewIntent(intent); - } - - /** - * Called when the activity will start interacting with the user. - */ - @Override - protected void onResume() { - super.onResume(); - LOG.d(TAG, "Resuming the App"); - - if (this.activityState == ACTIVITY_STARTING) { - this.activityState = ACTIVITY_RUNNING; - return; - } - - if (this.appView == null) { - return; - } - // Force window to have focus, so application always - // receive user input. Workaround for some devices (Samsung Galaxy Note 3 at least) - this.getWindow().getDecorView().requestFocus(); - - this.appView.handleResume(this.keepRunning, this.activityResultKeepRunning); - - // If app doesn't want to run in background - if (!this.keepRunning || this.activityResultKeepRunning) { - - // Restore multitasking state - if (this.activityResultKeepRunning) { - this.keepRunning = this.activityResultKeepRunning; - this.activityResultKeepRunning = false; - } - } - } - - /** - * The final call you receive before your activity is destroyed. - */ - @Override - public void onDestroy() { - LOG.d(TAG, "CordovaActivity.onDestroy()"); - super.onDestroy(); - - // hide the splash screen to avoid leaking a window - this.removeSplashScreen(); - - if (this.appView != null) { - appView.handleDestroy(); - } - else { - this.activityState = ACTIVITY_EXITING; - } - } - - /** - * Send a message to all plugins. - */ - public void postMessage(String id, Object data) { - if (this.appView != null) { - this.appView.postMessage(id, data); - } - } - - /** - * @deprecated - * Add services to res/xml/plugins.xml instead. - * - * Add a class that implements a service. - */ - @Deprecated - public void addService(String serviceType, String className) { - if (this.appView != null && this.appView.pluginManager != null) { - this.appView.pluginManager.addService(serviceType, className); - } - } - - /** - * Send JavaScript statement back to JavaScript. - * (This is a convenience method) - * - * @param statement - */ - @Deprecated // Call method on appView directly. - public void sendJavascript(String statement) { - if (this.appView != null) { - this.appView.bridge.getMessageQueue().addJavaScript(statement); - } - } - - /** - * Show the spinner. Must be called from the UI thread. - * - * @param title Title of the dialog - * @param message The message of the dialog - */ - public void spinnerStart(final String title, final String message) { - if (this.spinnerDialog != null) { - this.spinnerDialog.dismiss(); - this.spinnerDialog = null; - } - final CordovaActivity me = this; - this.spinnerDialog = ProgressDialog.show(CordovaActivity.this, title, message, true, true, - new DialogInterface.OnCancelListener() { - public void onCancel(DialogInterface dialog) { - me.spinnerDialog = null; - } - }); - } - - /** - * Stop spinner - Must be called from UI thread - */ - public void spinnerStop() { - if (this.spinnerDialog != null && this.spinnerDialog.isShowing()) { - this.spinnerDialog.dismiss(); - this.spinnerDialog = null; - } - } - - /** - * End this activity by calling finish for activity - */ - public void endActivity() { - this.activityState = ACTIVITY_EXITING; - super.finish(); - } - - - /** - * Launch an activity for which you would like a result when it finished. When this activity exits, - * your onActivityResult() method will be called. - * - * @param command The command object - * @param intent The intent to start - * @param requestCode The request code that is passed to callback to identify the activity - */ - public void startActivityForResult(CordovaPlugin command, Intent intent, int requestCode) { - this.activityResultCallback = command; - this.activityResultKeepRunning = this.keepRunning; - - // If multitasking turned on, then disable it for activities that return results - if (command != null) { - this.keepRunning = false; - } - - // Start activity - super.startActivityForResult(intent, requestCode); - } - - /** - * Called when an activity you launched exits, giving you the requestCode you started it with, - * the resultCode it returned, and any additional data from it. - * - * @param requestCode The request code originally supplied to startActivityForResult(), - * allowing you to identify who this result came from. - * @param resultCode The integer result code returned by the child activity through its setResult(). - * @param data An Intent, which can return result data to the caller (various data can be attached to Intent "extras"). - */ - @Override - protected void onActivityResult(int requestCode, int resultCode, Intent intent) { - LOG.d(TAG, "Incoming Result"); - super.onActivityResult(requestCode, resultCode, intent); - Log.d(TAG, "Request code = " + requestCode); - if (appView != null && requestCode == CordovaChromeClient.FILECHOOSER_RESULTCODE) { - ValueCallback mUploadMessage = this.appView.getWebChromeClient().getValueCallback(); - Log.d(TAG, "did we get here?"); - if (null == mUploadMessage) - return; - Uri result = intent == null || resultCode != Activity.RESULT_OK ? null : intent.getData(); - Log.d(TAG, "result = " + result); - mUploadMessage.onReceiveValue(result); - mUploadMessage = null; - } - CordovaPlugin callback = this.activityResultCallback; - if(callback == null && initCallbackClass != null) { - // The application was restarted, but had defined an initial callback - // before being shut down. - this.activityResultCallback = appView.pluginManager.getPlugin(initCallbackClass); - callback = this.activityResultCallback; - } - if(callback != null) { - LOG.d(TAG, "We have a callback to send this result to"); - callback.onActivityResult(requestCode, resultCode, intent); - } - } - - public void setActivityResultCallback(CordovaPlugin plugin) { - this.activityResultCallback = plugin; - } - - /** - * Report an error to the host application. These errors are unrecoverable (i.e. the main resource is unavailable). - * The errorCode parameter corresponds to one of the ERROR_* constants. - * - * @param errorCode The error code corresponding to an ERROR_* value. - * @param description A String describing the error. - * @param failingUrl The url that failed to load. - */ - public void onReceivedError(final int errorCode, final String description, final String failingUrl) { - final CordovaActivity me = this; - - // If errorUrl specified, then load it - final String errorUrl = preferences.getString("errorUrl", null); - if ((errorUrl != null) && (errorUrl.startsWith("file://") || internalWhitelist.isUrlWhiteListed(errorUrl)) && (!failingUrl.equals(errorUrl))) { - - // Load URL on UI thread - me.runOnUiThread(new Runnable() { - public void run() { - // Stop "app loading" spinner if showing - me.spinnerStop(); - me.appView.showWebPage(errorUrl, false, true, null); - } - }); - } - // If not, then display error dialog - else { - final boolean exit = !(errorCode == WebViewClient.ERROR_HOST_LOOKUP); - me.runOnUiThread(new Runnable() { - public void run() { - if (exit) { - me.appView.setVisibility(View.GONE); - me.displayError("Application Error", description + " (" + failingUrl + ")", "OK", exit); - } - } - }); - } - } - - /** - * Display an error dialog and optionally exit application. - */ - public void displayError(final String title, final String message, final String button, final boolean exit) { - final CordovaActivity me = this; - me.runOnUiThread(new Runnable() { - public void run() { - try { - AlertDialog.Builder dlg = new AlertDialog.Builder(me); - dlg.setMessage(message); - dlg.setTitle(title); - dlg.setCancelable(false); - dlg.setPositiveButton(button, - new AlertDialog.OnClickListener() { - public void onClick(DialogInterface dialog, int which) { - dialog.dismiss(); - if (exit) { - me.endActivity(); - } - } - }); - dlg.create(); - dlg.show(); - } catch (Exception e) { - finish(); - } - } - }); - } - - /** - * Determine if URL is in approved list of URLs to load. - */ - @Deprecated // Use whitelist object directly. - public boolean isUrlWhiteListed(String url) { - return internalWhitelist.isUrlWhiteListed(url); - } - - /* - * Hook in Cordova for menu plugins - */ - @Override - public boolean onCreateOptionsMenu(Menu menu) { - this.postMessage("onCreateOptionsMenu", menu); - return super.onCreateOptionsMenu(menu); - } - - @Override - public boolean onPrepareOptionsMenu(Menu menu) { - this.postMessage("onPrepareOptionsMenu", menu); - return true; - } - - @Override - public boolean onOptionsItemSelected(MenuItem item) { - this.postMessage("onOptionsItemSelected", item); - return true; - } - - /** - * Get Activity context. - */ - @Deprecated - public Context getContext() { - LOG.d(TAG, "This will be deprecated December 2012"); - return this; - } - - /** - * Load the specified URL in the Cordova webview or a new browser instance. - * - * NOTE: If openExternal is false, only URLs listed in whitelist can be loaded. - * - * @param url The url to load. - * @param openExternal Load url in browser instead of Cordova webview. - * @param clearHistory Clear the history stack, so new page becomes top of history - * @param params Parameters for new app - */ - @Deprecated // Call method on appView directly. - public void showWebPage(String url, boolean openExternal, boolean clearHistory, HashMap params) { - if (this.appView != null) { - appView.showWebPage(url, openExternal, clearHistory, params); - } - } - - protected Dialog splashDialog; - - /** - * Removes the Dialog that displays the splash screen - */ - public void removeSplashScreen() { - if (splashDialog != null && splashDialog.isShowing()) { - splashDialog.dismiss(); - splashDialog = null; - } - } - - /** - * Shows the splash screen over the full Activity - */ - @SuppressWarnings("deprecation") - protected void showSplashScreen(final int time) { - final CordovaActivity that = this; - - Runnable runnable = new Runnable() { - public void run() { - // Get reference to display - Display display = getWindowManager().getDefaultDisplay(); - - // Create the layout for the dialog - LinearLayout root = new LinearLayout(that.getActivity()); - root.setMinimumHeight(display.getHeight()); - root.setMinimumWidth(display.getWidth()); - root.setOrientation(LinearLayout.VERTICAL); - root.setBackgroundColor(preferences.getInteger("backgroundColor", Color.BLACK)); - root.setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, - ViewGroup.LayoutParams.MATCH_PARENT, 0.0F)); - root.setBackgroundResource(that.splashscreen); - - // Create and show the dialog - splashDialog = new Dialog(that, android.R.style.Theme_Translucent_NoTitleBar); - // check to see if the splash screen should be full screen - if ((getWindow().getAttributes().flags & WindowManager.LayoutParams.FLAG_FULLSCREEN) - == WindowManager.LayoutParams.FLAG_FULLSCREEN) { - splashDialog.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, - WindowManager.LayoutParams.FLAG_FULLSCREEN); - } - splashDialog.setContentView(root); - splashDialog.setCancelable(false); - splashDialog.show(); - - // Set Runnable to remove splash screen just in case - final Handler handler = new Handler(); - handler.postDelayed(new Runnable() { - public void run() { - removeSplashScreen(); - } - }, time); - } - }; - this.runOnUiThread(runnable); - } - - @Override - public boolean onKeyUp(int keyCode, KeyEvent event) - { - if (appView != null && (appView.isCustomViewShowing() || appView.getFocusedChild() != null ) && - (keyCode == KeyEvent.KEYCODE_BACK || keyCode == KeyEvent.KEYCODE_MENU)) { - return appView.onKeyUp(keyCode, event); - } else { - return super.onKeyUp(keyCode, event); - } - } - - /* - * Android 2.x needs to be able to check where the cursor is. Android 4.x does not - * - * (non-Javadoc) - * @see android.app.Activity#onKeyDown(int, android.view.KeyEvent) - */ - - @Override - public boolean onKeyDown(int keyCode, KeyEvent event) - { - //Determine if the focus is on the current view or not - if (appView != null && appView.getFocusedChild() != null && (keyCode == KeyEvent.KEYCODE_BACK || keyCode == KeyEvent.KEYCODE_MENU)) { - return appView.onKeyDown(keyCode, event); - } - else - return super.onKeyDown(keyCode, event); - } - - - /** - * Called when a message is sent to plugin. - * - * @param id The message id - * @param data The message data - * @return Object or null - */ - public Object onMessage(String id, Object data) { - if (!"onScrollChanged".equals(id)) { - LOG.d(TAG, "onMessage(" + id + "," + data + ")"); - } - - if ("splashscreen".equals(id)) { - if ("hide".equals(data.toString())) { - this.removeSplashScreen(); - } - else { - // If the splash dialog is showing don't try to show it again - if (this.splashDialog == null || !this.splashDialog.isShowing()) { - String splashResource = preferences.getString("SplashScreen", null); - if (splashResource != null) { - splashscreen = getResources().getIdentifier(splashResource, "drawable", getClass().getPackage().getName()); - } - this.showSplashScreen(this.splashscreenTime); - } - } - } - else if ("spinner".equals(id)) { - if ("stop".equals(data.toString())) { - this.spinnerStop(); - this.appView.setVisibility(View.VISIBLE); - } - } - else if ("onReceivedError".equals(id)) { - JSONObject d = (JSONObject) data; - try { - this.onReceivedError(d.getInt("errorCode"), d.getString("description"), d.getString("url")); - } catch (JSONException e) { - e.printStackTrace(); - } - } - else if ("exit".equals(id)) { - this.endActivity(); - } - return null; - } - - public ExecutorService getThreadPool() { - return threadPool; - } - - protected void onSaveInstanceState(Bundle outState) - { - super.onSaveInstanceState(outState); - if(this.activityResultCallback != null) - { - String cClass = this.activityResultCallback.getClass().getName(); - outState.putString("callbackClass", cClass); - } - } -} diff --git a/platforms/android/CordovaLib/src/org/apache/cordova/CordovaArgs.java b/platforms/android/CordovaLib/src/org/apache/cordova/CordovaArgs.java deleted file mode 100644 index d40d26e..0000000 --- a/platforms/android/CordovaLib/src/org/apache/cordova/CordovaArgs.java +++ /dev/null @@ -1,113 +0,0 @@ -/* - Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.0 (the - "License"); you may not use this file except in compliance - with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, - software distributed under the License is distributed on an - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - KIND, either express or implied. See the License for the - specific language governing permissions and limitations - under the License. -*/ -package org.apache.cordova; - -import org.json.JSONArray; -import org.json.JSONException; -import org.json.JSONObject; - -import android.util.Base64; - -public class CordovaArgs { - private JSONArray baseArgs; - - public CordovaArgs(JSONArray args) { - this.baseArgs = args; - } - - - // Pass through the basics to the base args. - public Object get(int index) throws JSONException { - return baseArgs.get(index); - } - - public boolean getBoolean(int index) throws JSONException { - return baseArgs.getBoolean(index); - } - - public double getDouble(int index) throws JSONException { - return baseArgs.getDouble(index); - } - - public int getInt(int index) throws JSONException { - return baseArgs.getInt(index); - } - - public JSONArray getJSONArray(int index) throws JSONException { - return baseArgs.getJSONArray(index); - } - - public JSONObject getJSONObject(int index) throws JSONException { - return baseArgs.getJSONObject(index); - } - - public long getLong(int index) throws JSONException { - return baseArgs.getLong(index); - } - - public String getString(int index) throws JSONException { - return baseArgs.getString(index); - } - - - public Object opt(int index) { - return baseArgs.opt(index); - } - - public boolean optBoolean(int index) { - return baseArgs.optBoolean(index); - } - - public double optDouble(int index) { - return baseArgs.optDouble(index); - } - - public int optInt(int index) { - return baseArgs.optInt(index); - } - - public JSONArray optJSONArray(int index) { - return baseArgs.optJSONArray(index); - } - - public JSONObject optJSONObject(int index) { - return baseArgs.optJSONObject(index); - } - - public long optLong(int index) { - return baseArgs.optLong(index); - } - - public String optString(int index) { - return baseArgs.optString(index); - } - - public boolean isNull(int index) { - return baseArgs.isNull(index); - } - - - // The interesting custom helpers. - public byte[] getArrayBuffer(int index) throws JSONException { - String encoded = baseArgs.getString(index); - return Base64.decode(encoded, Base64.DEFAULT); - } -} - - diff --git a/platforms/android/CordovaLib/src/org/apache/cordova/CordovaBridge.java b/platforms/android/CordovaLib/src/org/apache/cordova/CordovaBridge.java deleted file mode 100644 index 081127d..0000000 --- a/platforms/android/CordovaLib/src/org/apache/cordova/CordovaBridge.java +++ /dev/null @@ -1,183 +0,0 @@ -/* - Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.0 (the - "License"); you may not use this file except in compliance - with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, - software distributed under the License is distributed on an - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - KIND, either express or implied. See the License for the - specific language governing permissions and limitations - under the License. -*/ -package org.apache.cordova; - -import org.apache.cordova.PluginManager; -import org.json.JSONArray; -import org.json.JSONException; - -import android.util.Log; - -/** - * Contains APIs that the JS can call. All functions in here should also have - * an equivalent entry in CordovaChromeClient.java, and be added to - * cordova-js/lib/android/plugin/android/promptbasednativeapi.js - */ -public class CordovaBridge { - private static final String LOG_TAG = "CordovaBridge"; - private PluginManager pluginManager; - private NativeToJsMessageQueue jsMessageQueue; - private volatile int expectedBridgeSecret = -1; // written by UI thread, read by JS thread. - private String loadedUrl; - - public CordovaBridge(PluginManager pluginManager, NativeToJsMessageQueue jsMessageQueue) { - this.pluginManager = pluginManager; - this.jsMessageQueue = jsMessageQueue; - } - - public String jsExec(int bridgeSecret, String service, String action, String callbackId, String arguments) throws JSONException, IllegalAccessException { - if (!verifySecret("exec()", bridgeSecret)) { - return null; - } - // If the arguments weren't received, send a message back to JS. It will switch bridge modes and try again. See CB-2666. - // We send a message meant specifically for this case. It starts with "@" so no other message can be encoded into the same string. - if (arguments == null) { - return "@Null arguments."; - } - - jsMessageQueue.setPaused(true); - try { - // Tell the resourceApi what thread the JS is running on. - CordovaResourceApi.jsThread = Thread.currentThread(); - - pluginManager.exec(service, action, callbackId, arguments); - String ret = null; - if (!NativeToJsMessageQueue.DISABLE_EXEC_CHAINING) { - ret = jsMessageQueue.popAndEncode(false); - } - return ret; - } catch (Throwable e) { - e.printStackTrace(); - return ""; - } finally { - jsMessageQueue.setPaused(false); - } - } - - public void jsSetNativeToJsBridgeMode(int bridgeSecret, int value) throws IllegalAccessException { - if (!verifySecret("setNativeToJsBridgeMode()", bridgeSecret)) { - return; - } - jsMessageQueue.setBridgeMode(value); - } - - public String jsRetrieveJsMessages(int bridgeSecret, boolean fromOnlineEvent) throws IllegalAccessException { - if (!verifySecret("retrieveJsMessages()", bridgeSecret)) { - return null; - } - return jsMessageQueue.popAndEncode(fromOnlineEvent); - } - - private boolean verifySecret(String action, int bridgeSecret) throws IllegalAccessException { - if (!jsMessageQueue.isBridgeEnabled()) { - if (bridgeSecret == -1) { - Log.d(LOG_TAG, action + " call made before bridge was enabled."); - } else { - Log.d(LOG_TAG, "Ignoring " + action + " from previous page load."); - } - return false; - } - // Bridge secret wrong and bridge not due to it being from the previous page. - if (expectedBridgeSecret < 0 || bridgeSecret != expectedBridgeSecret) { - throw new IllegalAccessException(); - } - return true; - } - - /** Called on page transitions */ - void clearBridgeSecret() { - expectedBridgeSecret = -1; - } - - /** Called by cordova.js to initialize the bridge. */ - int generateBridgeSecret() { - expectedBridgeSecret = (int)(Math.random() * Integer.MAX_VALUE); - return expectedBridgeSecret; - } - - public void reset(String loadedUrl) { - jsMessageQueue.reset(); - clearBridgeSecret(); - this.loadedUrl = loadedUrl; - } - - public String promptOnJsPrompt(String origin, String message, String defaultValue) { - if (defaultValue != null && defaultValue.length() > 3 && defaultValue.startsWith("gap:")) { - JSONArray array; - try { - array = new JSONArray(defaultValue.substring(4)); - int bridgeSecret = array.getInt(0); - String service = array.getString(1); - String action = array.getString(2); - String callbackId = array.getString(3); - String r = jsExec(bridgeSecret, service, action, callbackId, message); - return r == null ? "" : r; - } catch (JSONException e) { - e.printStackTrace(); - } catch (IllegalAccessException e) { - e.printStackTrace(); - } - return ""; - } - // Sets the native->JS bridge mode. - else if (defaultValue != null && defaultValue.startsWith("gap_bridge_mode:")) { - try { - int bridgeSecret = Integer.parseInt(defaultValue.substring(16)); - jsSetNativeToJsBridgeMode(bridgeSecret, Integer.parseInt(message)); - } catch (NumberFormatException e){ - e.printStackTrace(); - } catch (IllegalAccessException e) { - e.printStackTrace(); - } - return ""; - } - // Polling for JavaScript messages - else if (defaultValue != null && defaultValue.startsWith("gap_poll:")) { - int bridgeSecret = Integer.parseInt(defaultValue.substring(9)); - try { - String r = jsRetrieveJsMessages(bridgeSecret, "1".equals(message)); - return r == null ? "" : r; - } catch (IllegalAccessException e) { - e.printStackTrace(); - } - return ""; - } - else if (defaultValue != null && defaultValue.startsWith("gap_init:")) { - // Protect against random iframes being able to talk through the bridge. - // Trust only file URLs and the start URL's domain. - // The extra origin.startsWith("http") is to protect against iframes with data: having "" as origin. - if (origin.startsWith("file:") || (origin.startsWith("http") && loadedUrl.startsWith(origin))) { - // Enable the bridge - int bridgeMode = Integer.parseInt(defaultValue.substring(9)); - jsMessageQueue.setBridgeMode(bridgeMode); - // Tell JS the bridge secret. - int secret = generateBridgeSecret(); - return ""+secret; - } else { - Log.e(LOG_TAG, "gap_init called from restricted origin: " + origin); - } - return ""; - } - return null; - } - - public NativeToJsMessageQueue getMessageQueue() { - return jsMessageQueue; - } -} diff --git a/platforms/android/CordovaLib/src/org/apache/cordova/CordovaChromeClient.java b/platforms/android/CordovaLib/src/org/apache/cordova/CordovaChromeClient.java deleted file mode 100755 index 737d0b8..0000000 --- a/platforms/android/CordovaLib/src/org/apache/cordova/CordovaChromeClient.java +++ /dev/null @@ -1,331 +0,0 @@ -/* - Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.0 (the - "License"); you may not use this file except in compliance - with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, - software distributed under the License is distributed on an - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - KIND, either express or implied. See the License for the - specific language governing permissions and limitations - under the License. -*/ -package org.apache.cordova; - -import org.apache.cordova.CordovaInterface; -import org.apache.cordova.LOG; - -import android.annotation.TargetApi; -import android.app.AlertDialog; -import android.content.DialogInterface; -import android.content.Intent; -import android.net.Uri; -import android.view.Gravity; -import android.view.KeyEvent; -import android.view.View; -import android.view.ViewGroup.LayoutParams; -import android.webkit.ConsoleMessage; -import android.webkit.JsPromptResult; -import android.webkit.JsResult; -import android.webkit.ValueCallback; -import android.webkit.WebChromeClient; -import android.webkit.WebStorage; -import android.webkit.WebView; -import android.webkit.GeolocationPermissions.Callback; -import android.widget.EditText; -import android.widget.LinearLayout; -import android.widget.ProgressBar; -import android.widget.RelativeLayout; - -/** - * This class is the WebChromeClient that implements callbacks for our web view. - * The kind of callbacks that happen here are on the chrome outside the document, - * such as onCreateWindow(), onConsoleMessage(), onProgressChanged(), etc. Related - * to but different than CordovaWebViewClient. - * - * @see WebChromeClient - * @see WebView guide - * @see CordovaWebViewClient - * @see CordovaWebView - */ -public class CordovaChromeClient extends WebChromeClient { - - public static final int FILECHOOSER_RESULTCODE = 5173; - private String TAG = "CordovaLog"; - private long MAX_QUOTA = 100 * 1024 * 1024; - protected CordovaInterface cordova; - protected CordovaWebView appView; - - // the video progress view - private View mVideoProgressView; - - // File Chooser - public ValueCallback mUploadMessage; - - @Deprecated - public CordovaChromeClient(CordovaInterface cordova) { - this.cordova = cordova; - } - - public CordovaChromeClient(CordovaInterface ctx, CordovaWebView app) { - this.cordova = ctx; - this.appView = app; - } - - @Deprecated - public void setWebView(CordovaWebView view) { - this.appView = view; - } - - /** - * Tell the client to display a javascript alert dialog. - * - * @param view - * @param url - * @param message - * @param result - * @see Other implementation in the Dialogs plugin. - */ - @Override - public boolean onJsAlert(WebView view, String url, String message, final JsResult result) { - AlertDialog.Builder dlg = new AlertDialog.Builder(this.cordova.getActivity()); - dlg.setMessage(message); - dlg.setTitle("Alert"); - //Don't let alerts break the back button - dlg.setCancelable(true); - dlg.setPositiveButton(android.R.string.ok, - new AlertDialog.OnClickListener() { - public void onClick(DialogInterface dialog, int which) { - result.confirm(); - } - }); - dlg.setOnCancelListener( - new DialogInterface.OnCancelListener() { - public void onCancel(DialogInterface dialog) { - result.cancel(); - } - }); - dlg.setOnKeyListener(new DialogInterface.OnKeyListener() { - //DO NOTHING - public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) { - if (keyCode == KeyEvent.KEYCODE_BACK) - { - result.confirm(); - return false; - } - else - return true; - } - }); - dlg.show(); - return true; - } - - /** - * Tell the client to display a confirm dialog to the user. - * - * @param view - * @param url - * @param message - * @param result - * @see Other implementation in the Dialogs plugin. - */ - @Override - public boolean onJsConfirm(WebView view, String url, String message, final JsResult result) { - AlertDialog.Builder dlg = new AlertDialog.Builder(this.cordova.getActivity()); - dlg.setMessage(message); - dlg.setTitle("Confirm"); - dlg.setCancelable(true); - dlg.setPositiveButton(android.R.string.ok, - new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int which) { - result.confirm(); - } - }); - dlg.setNegativeButton(android.R.string.cancel, - new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int which) { - result.cancel(); - } - }); - dlg.setOnCancelListener( - new DialogInterface.OnCancelListener() { - public void onCancel(DialogInterface dialog) { - result.cancel(); - } - }); - dlg.setOnKeyListener(new DialogInterface.OnKeyListener() { - //DO NOTHING - public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) { - if (keyCode == KeyEvent.KEYCODE_BACK) - { - result.cancel(); - return false; - } - else - return true; - } - }); - dlg.show(); - return true; - } - - /** - * Tell the client to display a prompt dialog to the user. - * If the client returns true, WebView will assume that the client will - * handle the prompt dialog and call the appropriate JsPromptResult method. - * - * Since we are hacking prompts for our own purposes, we should not be using them for - * this purpose, perhaps we should hack console.log to do this instead! - * - * @see Other implementation in the Dialogs plugin. - */ - @Override - public boolean onJsPrompt(WebView view, String origin, String message, String defaultValue, JsPromptResult result) { - // Unlike the @JavascriptInterface bridge, this method is always called on the UI thread. - String handledRet = appView.bridge.promptOnJsPrompt(origin, message, defaultValue); - if (handledRet != null) { - result.confirm(handledRet); - } else { - // Returning false would also show a dialog, but the default one shows the origin (ugly). - final JsPromptResult res = result; - AlertDialog.Builder dlg = new AlertDialog.Builder(this.cordova.getActivity()); - dlg.setMessage(message); - final EditText input = new EditText(this.cordova.getActivity()); - if (defaultValue != null) { - input.setText(defaultValue); - } - dlg.setView(input); - dlg.setCancelable(false); - dlg.setPositiveButton(android.R.string.ok, - new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int which) { - String usertext = input.getText().toString(); - res.confirm(usertext); - } - }); - dlg.setNegativeButton(android.R.string.cancel, - new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int which) { - res.cancel(); - } - }); - dlg.show(); - } - return true; - } - - /** - * Handle database quota exceeded notification. - */ - @Override - public void onExceededDatabaseQuota(String url, String databaseIdentifier, long currentQuota, long estimatedSize, - long totalUsedQuota, WebStorage.QuotaUpdater quotaUpdater) - { - LOG.d(TAG, "onExceededDatabaseQuota estimatedSize: %d currentQuota: %d totalUsedQuota: %d", estimatedSize, currentQuota, totalUsedQuota); - quotaUpdater.updateQuota(MAX_QUOTA); - } - - // console.log in api level 7: http://developer.android.com/guide/developing/debug-tasks.html - // Expect this to not compile in a future Android release! - @SuppressWarnings("deprecation") - @Override - public void onConsoleMessage(String message, int lineNumber, String sourceID) - { - //This is only for Android 2.1 - if(android.os.Build.VERSION.SDK_INT == android.os.Build.VERSION_CODES.ECLAIR_MR1) - { - LOG.d(TAG, "%s: Line %d : %s", sourceID, lineNumber, message); - super.onConsoleMessage(message, lineNumber, sourceID); - } - } - - @TargetApi(8) - @Override - public boolean onConsoleMessage(ConsoleMessage consoleMessage) - { - if (consoleMessage.message() != null) - LOG.d(TAG, "%s: Line %d : %s" , consoleMessage.sourceId() , consoleMessage.lineNumber(), consoleMessage.message()); - return super.onConsoleMessage(consoleMessage); - } - - @Override - /** - * Instructs the client to show a prompt to ask the user to set the Geolocation permission state for the specified origin. - * - * @param origin - * @param callback - */ - public void onGeolocationPermissionsShowPrompt(String origin, Callback callback) { - super.onGeolocationPermissionsShowPrompt(origin, callback); - callback.invoke(origin, true, false); - } - - // API level 7 is required for this, see if we could lower this using something else - @Override - public void onShowCustomView(View view, WebChromeClient.CustomViewCallback callback) { - this.appView.showCustomView(view, callback); - } - - @Override - public void onHideCustomView() { - this.appView.hideCustomView(); - } - - @Override - /** - * Ask the host application for a custom progress view to show while - * a